[
  {
    "path": ".gitignore",
    "content": "dist/\npackage-lock.json\nnode_modules/\n.DS_Store"
  },
  {
    "path": "LICENSE",
    "content": "                     木兰宽松许可证, 第2版\r\n\r\n   木兰宽松许可证， 第2版 \r\n   2020年1月 http://license.coscl.org.cn/MulanPSL2\r\n\r\n\r\n   您对“软件”的复制、使用、修改及分发受木兰宽松许可证，第2版（“本许可证”）的如下条款的约束：\r\n\r\n   0. 定义\r\n\r\n      “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。\r\n\r\n      “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。\r\n\r\n      “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。\r\n\r\n      “法人实体”是指提交贡献的机构及其“关联实体”。\r\n\r\n      “关联实体”是指，对“本许可证”下的行为方而言，控制、受控制或与其共同受控制的机构，此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。\r\n\r\n   1. 授予版权许可\r\n\r\n      每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可，您可以复制、使用、修改、分发其“贡献”，不论修改与否。\r\n\r\n   2. 授予专利许可\r\n\r\n      每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的（根据本条规定撤销除外）专利许可，供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求，不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地，就“软件”或其中的“贡献”对任何人发起专利侵权诉讼（包括反诉或交叉诉讼）或其他专利维权行动，指控其侵犯专利权，则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。\r\n\r\n   3. 无商标许可\r\n\r\n      “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可，但您为满足第4条规定的声明义务而必须使用除外。\r\n\r\n   4. 分发限制\r\n\r\n      您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发，不论修改与否，但您必须向接收者提供“本许可证”的副本，并保留“软件”中的版权、商标、专利及免责声明。\r\n\r\n   5. 免责声明与责任限制\r\n\r\n      “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下，“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任，不论因何种原因导致或者基于何种法律理论，即使其曾被建议有此种损失的可能性。 \r\n\r\n   6. 语言\r\n      “本许可证”以中英文双语表述，中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致，以中文版为准。\r\n\r\n   条款结束 \r\n\r\n   如何将木兰宽松许可证，第2版，应用到您的软件\r\n   \r\n   如果您希望将木兰宽松许可证，第2版，应用到您的新软件，为了方便接收者查阅，建议您完成如下三步：\r\n\r\n      1， 请您补充如下声明中的空白，包括软件名、软件的首次发表年份以及您作为版权人的名字；\r\n\r\n      2， 请您在软件包的一级目录下创建以“LICENSE”为名的文件，将整个许可证文本放入该文件中；\r\n\r\n      3， 请将如下声明文本放入每个源文件的头部注释中。\r\n\r\n   Copyright (c) [Year] [name of copyright holder]\r\n   [Software Name] is licensed under Mulan PSL v2.\r\n   You can use this software according to the terms and conditions of the Mulan PSL v2. \r\n   You may obtain a copy of Mulan PSL v2 at:\r\n            http://license.coscl.org.cn/MulanPSL2 \r\n   THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.  \r\n   See the Mulan PSL v2 for more details.  \r\n\r\n\r\n                     Mulan Permissive Software License，Version 2\r\n\r\n   Mulan Permissive Software License，Version 2 (Mulan PSL v2)\r\n   January 2020 http://license.coscl.org.cn/MulanPSL2\r\n\r\n   Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: \r\n   \r\n   0. Definition\r\n   \r\n      Software means the program and related documents which are licensed under this License and comprise all Contribution(s). \r\n   \r\n      Contribution means the copyrightable work licensed by a particular Contributor under this License.\r\n   \r\n      Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.\r\n   \r\n      Legal Entity means the entity making a Contribution and all its Affiliates.\r\n   \r\n      Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.\r\n\r\n   1. Grant of Copyright License\r\n\r\n      Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.\r\n\r\n   2. Grant of Patent License \r\n\r\n      Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.\r\n\r\n   3. No Trademark License\r\n\r\n      No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4.\r\n\r\n   4. Distribution Restriction\r\n\r\n      You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.\r\n\r\n   5. Disclaimer of Warranty and Limitation of Liability\r\n\r\n      THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\r\n\r\n   6. Language\r\n\r\n      THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.\r\n\r\n   END OF THE TERMS AND CONDITIONS\r\n\r\n   How to Apply the Mulan Permissive Software License，Version 2 (Mulan PSL v2) to Your Software\r\n\r\n      To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:\r\n\r\n      i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; \r\n\r\n      ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package;\r\n\r\n      iii Attach the statement to the appropriate annotated syntax at the beginning of each source file.\r\n\r\n\r\n   Copyright (c) [Year] [name of copyright holder]\r\n   [Software Name] is licensed under Mulan PSL v2.\r\n   You can use this software according to the terms and conditions of the Mulan PSL v2. \r\n   You may obtain a copy of Mulan PSL v2 at:\r\n               http://license.coscl.org.cn/MulanPSL2 \r\n   THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.  \r\n   See the Mulan PSL v2 for more details.  \r\n"
  },
  {
    "path": "README.md",
    "content": "# 微信小程序——餐饮点餐商城\n\n微信小程序——餐饮点餐商城，是针对餐饮行业推出的一套完整的餐饮解决方案，实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能，完美的使餐饮行业更高效便捷！\n\n大家如果在使用过程有什么问题，欢迎通过lssues与我们交流！\n\n如果本项目对您有所帮助或者启发，请给我们 Star 吧，您的鼓励是我们最大对动力～\n\n# 加微信联系我\n\n<img src=\"https://dcdn.it120.cc/2022/09/19/7b884d58-541a-404b-a805-457540d7f87f.jpeg\" width=\"200px\">\n\n\n# 自提/外卖 扫码体验\n\n<img src=\"https://dcdn.it120.cc/2021/01/19/b388b014-7ae0-4b3a-9d6f-30c8b3082fe6.jpg\" width=\"200px\">\n\n\n# 扫码点餐演示\n\n| 座号A1 | 座号A2 | 座号A3 | 座号A4 | 座号A5 |\n| :------: | :------: | :------: | :------: | :------: |\n| <img src=\"https://dcdn.it120.cc/cuser/27/2021/09/26/cbb91217-47b1-4af1-a0e5-55df0efd3566.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/cbb30b43-15df-4564-87ef-3416f58ab0c8.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/150cd47b-e769-49fc-bca6-be8c5fe84f49.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/b5a44d1f-cea4-437f-802d-a36c728ff459.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/99c47ba3-50ba-4431-93c6-e10f527a5e28.png\" width=\"200px\"> |\n\n\n| 座号A6 | 座号A7 | 座号A8 | 座号A9 | 座号A10 |\n| :------: | :------: | :------: | :------: | :------: |\n| <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/aca7a7fd-72c9-4d89-a903-d82e6b8b8f83.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/77f16752-656f-4218-99df-c82c5db1921a.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/e3be04c4-9c0f-41c8-9482-b645699d1df4.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/352c7e84-56ec-4961-9e7d-cc4e752cf154.png\" width=\"200px\"> | <img src=\"https://dcdn.it120.cc/cuser/27/2023/01/04/78adb196-231d-41b7-be8d-51febc022bac.png\" width=\"200px\"> |\n\n# 本项目使用了下面的组件，在此鸣谢\n\n- [vant-UI库](https://youzan.github.io/vant-weapp/)\n\n- [小程序在线接口-SDK](https://github.com/gooking/apifm-wxapi)\n\n- [api工厂](https://admin.s2m.cc)\n\n- [FMUI-轻松活泼-icon](https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=17041)\n\n- [小程序HTML解析组件](https://github.com/jin-yufeng/Parser)\n\n- [生成条码和二维码](https://github.com/alsey/wxbarcode)\n\n# 其他优秀开源模板推荐\n- [天使童装](https://github.com/EastWorld/wechat-app-mall)   /  [码云镜像](https://gitee.com/javazj/wechat-app-mall)  /  [GitCode镜像](https://gitcode.com/gooking2/wechat-app-mall)\n- [天使童装（uni-app版本）](https://github.com/gooking/uni-app-mall)  /   [码云镜像](https://gitee.com/javazj/uni-app-mall)  /  [GitCode镜像](https://gitcode.com/gooking2/uni-app-mall)\n- [简约精品商城（uni-app版本）](https://github.com/gooking/uni-app--mini-mall)  /   [码云镜像](https://gitee.com/javazj/uni-app--mini-mall)  /   [GitCode镜像](https://gitcode.com/gooking2/uni-app--mini-mall)\n- [舔果果小铺（升级版）](https://github.com/gooking/TianguoguoXiaopu)\n- [面馆风格小程序](https://gitee.com/javazj/noodle_shop_procedures)\n- [AI名片](https://github.com/gooking/visitingCard)  /   [码云镜像](https://gitee.com/javazj/visitingCard)  /   [GitCode镜像](https://gitcode.com/gooking2/visitingCard)\n- [仿海底捞订座排队 (uni-app)](https://github.com/gooking/dingzuopaidui)  /   [码云镜像](https://gitee.com/javazj/dingzuopaidui)  /   [GitCode镜像](https://gitcode.com/gooking2/dingzuopaidui)\n- [H5版本商城/餐饮](https://github.com/gooking/vueMinishop)  /  [码云镜像](https://gitee.com/javazj/vueMinishop) /  [GitCode镜像](https://gitcode.com/gooking2/vueMinishop)\n- [餐饮点餐](https://github.com/woniudiancang/bee)  / [码云镜像](https://gitee.com/woniudiancang/bee) / [GitCode镜像](https://gitcode.com/gooking2/bee)\n- [企业微展](https://github.com/gooking/qiyeweizan)  / [码云镜像](https://gitee.com/javazj/qiyeweizan) / [GitCode镜像](https://gitcode.com/gooking2/qiyeweizan)\n- [无人棋牌室](https://github.com/gooking/wurenqipai)  / [码云镜像](https://gitee.com/javazj/wurenqipai) / [GitCode镜像](https://gitcode.com/gooking2/wurenqipai)\n- [酒店客房服务小程序](https://github.com/gooking/hotelRoomService)  / [码云镜像](https://gitee.com/javazj/hotelRoomService) / [GitCode镜像](https://gitcode.com/gooking2/hotelRoomService)\n- [面包店风格小程序](https://github.com/gooking/bread)  / [码云镜像](https://gitee.com/javazj/bread) / [GitCode镜像](https://gitcode.com/gooking2/bread)\n- [朋友圈发圈素材小程序](https://github.com/gooking/moments)  / [码云镜像](https://gitee.com/javazj/moments) / [GitCode镜像](https://gitcode.com/gooking2/moments)\n- [小红书企业微展](https://github.com/gooking/xhs-qiyeweizan)  / [码云镜像](https://gitee.com/javazj/xhs-qiyeweizan) / [GitCode镜像](https://gitcode.com/gooking2/xhs-qiyeweizan)\n- [旧物回收、废品回收](https://github.com/gooking/recycle)  / [码云镜像](https://gitee.com/javazj/recycle) / [GitCode镜像](https://gitcode.com/gooking2/recycle)\n- [会员卡（饭卡）储值消费系统](https://github.com/gooking/mealcard)  / [码云镜像](https://gitee.com/javazj/mealcard) / [GitCode镜像](https://gitcode.com/gooking2/mealcard)\n\n# 使用教程\n\n## 注册开通小程序账号\nhttps://mp.weixin.qq.com/\n根据自己的实际情况选择 “企业”、“个体工商户”身份，注册小程序账号，商城类小程序不支持个人用户上线，所以一定要选择企业或者个体户，获得你自己小程序的 appid 和 secret 信息，保存好，下面会用到：\n- [如何查看小程序的AppID和AppSecret](https://jingyan.baidu.com/article/642c9d340305e3644a46f795.html)\n你需要设置小程序的合法域名，否则开发工具上运行正常，手机访问的时候将看不到数据\n- [设置合法服务器域名](https://www.yuque.com/apifm/doc/tvpou9)\n## 注册开通后台账号\nhttps://admin.s2m.cc/\n免费注册开通新后台后登录，登录后的首页，请记下你的专属域名，后面会用到\n左侧菜单 “工厂设置” --> “数据克隆” --> “将别人的数据克隆给我”\n对方商户ID填写 27\n点击 “立即克隆”，克隆成功后，F5 刷新一下后台\n## 配置小程序APPID/SECRET\n左侧菜单，微信设置，填写配置上一步获得的 appid 和 secret\n这一步很重要！！！\n如果没有正确配置，下面步骤中打开小程序将无法连接你的后台\n## 配置微信支付\n左侧菜单，系统设置 -->  在线支付配置，填写您自己的微信支付的信息\n## 下载安装开发工具\nhttps://developers.weixin.qq.com/miniprogram/dev/devtools/download.html\n## 运行小程序看效果\n双击运行第一步安装的小程序开发工具，打开看效果：\n\n<img src=\"https://dcdn.it120.cc/yuque/0/2019/png/572726/1575349127431-00ff2059-dd5e-4e4b-99a7-e1d605db02c7.png?x-oss-process=image%2Fresize%2Cw_1500 \" width=\"200px\">\n\n导入项目这里，目录选择你 “第二步” 中下载并加压的小程序代码所在目录\n\nAPPID 务必要改成你自己的小程序的 APPID\nAPPID 务必要改成你自己的小程序的 APPID\nAPPID 务必要改成你自己的小程序的 APPID\n\n然后点击导入按钮\n\n- [如何查看小程序的AppID和AppSecret](https://jingyan.baidu.com/article/642c9d340305e3644a46f795.html)\n\n## 配置对接你自己的后台\n在开发工具中 config.js 中的subDomain 改成你自己专属域名， ctrl + s 保存\n\n<img src=\"https://dcdn.it120.cc/yuque/0/2020/png/572726/1581236703094-ce5c7f32-c60d-4e1b-bacb-21439e1d2721.png?x-oss-process=image%2Fresize%2Cw_1500 \" width=\"200px\">\n\n- [如何查看自己的subDomain](https://www.yuque.com/apifm/doc/qr6l4m)\n\n## 用户自提的订单如何扫码核销\n\n用户选择自提的订单，会在底部取餐菜单界面显示订单信息以及取餐码，商家可通过 “我的” --> “扫码核销” 菜单，点击以后调起手机相机，扫用户出示的取餐码完成核销\n\n但是默认情况下，是看不见  “我的” --> “扫码核销” 菜单的，需要在后台 “系统设置” --> “系统参数” ，添加文本类型的参数：\n\n- 参数名 order_hx_uids\n- 参数值，具有核销权限的用户的用户编号，多个用户编号，使用英文的逗号分隔\n\n重新进入小程序以后，就可以看见 “扫码核销” 的菜单了\n\n## 桌号管理\n\n    登录后台，左侧菜单 “桌号管理”，添加并管理你的桌号信息，添加以后在列表你将可以看到 ID 和 密钥，这两个数据用来生成桌子的二维码\n\n<img src=\"https://dcdn.it120.cc/2022/12/30/e76a0320-992a-4932-9d58-dec3fd6630b8.png\">\n\n## 生成桌子二维码\n\n    例如上面的ID为 308，密钥为 d3PiIY，那么现在去左侧菜单微信设置 -> 小程序设置 -> 获取小程序二维码（圆形码），即可获取小程序码：\n    填写信息如下：\n- 页面路径: pages/index/index\n- scene参数: 12879,308,d3PiIY\n- 其中 12879 为门店ID，逗号一定是英文的逗号，而且不要有空格，注意检查下\n\n其中 shopId 为你对应的门店ID，其他参数默认就可以了\n\n<img src=\"https://dcdn.it120.cc/2022/12/30/6c807326-8db9-465a-912e-58847b28658c.png\">\n\n## 如何修改小程序首页标题\n\n登录后台，左侧菜单 “系统设置” --> “系统参数” ，添加一个文本类型的参数： mallName （注意大小写），小程序即可显示你后台填的名称\n\n## 根据选择的不同门店，区分显示商品（只显示当前门店的商品）\n\n登录后台，左侧菜单 “系统设置” --> “系统参数” ，添加一个开关类型的参数： shop_goods_split，开启为区分，关闭为不区分\n\n## 如何设置服务范围（多少公里）\n\n后台 “商场管理” --> “门店管理” ，编辑门店，服务距离处，填写你希望配送的距离即可\n\n## 如何显示销量\n\n商品列表接口、商品详情接口，都会返回商品的销量数据，分别是 numberOrders 和 numberSells 两个字段，你可以在界面上任何希望显示销量的地方，进行展示即可\n\n- numberOrders 订单数量\n- numberSells 商品数量\n\n假如说用户下了一个订单一次性购买10份这个商品，那么 numberOrders = 1 ，numberSells = 10\n\n## 如何区分门店显示商品\n\n后台左侧菜单“系统设置” -> “系统参数”，增加一个开关类型的参数: shop_goods_split\n\n开启则只会显示当前门店的商品，关闭则显示所有门店的商品\n\n## 在线订座如何配置\n\n1. 左侧菜单 “预约报名” --> “项目设置” ，添加一个项目，添加完以后会得到一个编号\n2. 左侧菜单 “系统设置” --> “系统参数”， 修改编号为 `zxdz` 的参数，将你的编号填进去即可\n\n## 配置达达配送\n\n1. [如何对接达达配送，先按这个教程完成配置](https://www.yuque.com/apifm/doc/gxk08t)\n2. 后台 “商城管理” --> “门店管理”， 编辑，门店编号填写你达达对应的门店编号，生鲜配送输入框填写 `dada`\n\n## 二次开发如何使用国际化实现多语言\n\n1. `js` 文件中，onload 方法中，加入： `getApp().initLanguage(this)` ;注意这里的路径要填正确，否则提示文件找不到;\n2. 页面中可以直接显示语言包中的内容: `{{ $t.test.name }}`;\n3. 语言内容，直接修改 `i18n` 文件夹中对应的语言的文件即可；\n\n## 打印机配置自动出票\n\n1. [打印机配置教程](https://www.it120.cc/help/ggrun8.html)\n2. [打印机模板变量详细说明](https://www.it120.cc/help/wtviya.html)\n3. 小票机模板： [小票机模版①](https://www.it120.cc/help/xc2hk2q4yrop12ll.html) [小票机模版②](https://www.it120.cc/help/taan6w2wvt6d00mg.html) [小票机模版③](https://www.it120.cc/help/vn7l4p2m28x7x30h.html)\n3. 杯贴机模板： [杯贴机模版①](https://www.it120.cc/help/nl0frezogy8uunet.html) [杯贴机模版②](https://www.it120.cc/help/mlcqigcmz1ggydw2.html) \n\n# 常见问题\n\n## 无法登陆 / 无法获取 openid\n\n1. 请检查 config.js 文件中的 subDomain 是否已经修改成你自己的专属域名了\n    \n    [如何查看自己的subDomain](https://www.yuque.com/apifm/doc/qr6l4m)\n\n2. 确保下面3个地方的 appID 你填的是一样的\n\n    - 登录你的小程序商户后台（https://mp.weixin.qq.com）左侧菜单 “开发” --> “开发设置” 中的 appid\n    - 点击你的小程序开发工具 右上角 的“详情” --> “基本信息” 中的 appid\n    - 登录你的 api工厂 后台（https://admin.s2m.cc），左侧菜单平台设置，微信小程序中的 appid\n\n## 获取手机号码失败，提示没权限\n\nhttps://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html\n\n官方文档有说明，获取手机号码的前提条件是：非个人开发者，且完成了认证的小程序开放（不包含海外主体）\n\n## wx.getLocation 改为 wx.getFuzzyLocation (getLocation的接口权限太难申请了)\n\n微信申请 getLocation 接口的审核比较严格，可能比较难申请到这个接口，可以用 wx.getFuzzyLocation 来代替： https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.getFuzzyLocation.html\n\n\n开发工具，全局替换以下代码：\n\n需要替换3次\n\n`scope.userLocation` 替换为 `scope.userFuzzyLocation`\n\n如图：\n\n\n<img src=\"https://dcdn.it120.cc/yuque/0/2023/png/572726/1680937230066-f31f9661-7c15-4ffe-86b1-9d70ce5a6062.png\">\n\n\n再全局替换代码：\n\n`wx.getLocation` 替换为 `wx.getFuzzyLocation`\n\n再全局替换代码：\n\n`\"getLocation\"` 替换为 `\"getFuzzyLocation\"`\n\n## 小程序订单中心path 怎么填\n\n请填写 `pages/all-orders/index`\n\n## 小程序订单发货的地址怎么填\n\n小程序订单管理 -> 订单信息录入 -> 小程序商品订单详情path\n\n`pages/order-details/index?payOrderNo=${商品订单号}`\n\n直接一模一样复制上面的这个填进去就行\n\n## 微信支付MA授权(appid和mch_id不匹配)\n\n[微信支付MA授权(appid和mch_id不匹配)](https://www.yuque.com/apifm/doc/zrui8q)\n\n## 使用国际化多语言，切换语言后底部菜单显示不对\n\n`/i18n/index.js` 文件里面的菜单内容估计忘记修改了\n\n## 商家入驻申请页面\n\n1. app.json 中，添加一个页面路径： `pages/shop/join-apply`\n2. pages/shop/select 页面最下面的入口代码放开\n"
  },
  {
    "path": "app.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst CONFIG = require('config.js')\nconst AUTH = require('utils/auth')\nconst i18n = require(\"i18n/index\")\nApp({\n  onLaunch: function() {\n    i18n.getLanguage()\n    this.setTabBarLanguage()\n    const $t = i18n.$t()\n    WXAPI.init(CONFIG.subDomain)\n    WXAPI.setMerchantId(CONFIG.merchantId)\n    const that = this;\n    // 检测新版本\n    const updateManager = wx.getUpdateManager()\n    updateManager.onUpdateReady(function () {\n      wx.showModal({\n        confirmText: $t.common.confirm,\n        cancelText: $t.common.cancel,\n        content: $t.common.upgrade,\n        success(res) {\n          if (res.confirm) {\n            // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启\n            updateManager.applyUpdate()\n          }\n        }\n      })\n    })\n    /**\n     * 初次加载判断网络情况\n     * 无网络状态下根据实际情况进行调整\n     */\n    wx.getNetworkType({\n      success(res) {\n        const networkType = res.networkType\n        if (networkType === 'none') {\n          that.globalData.isConnected = false\n          wx.showToast({\n            title: $t.common.noNetwork,\n            icon: 'loading'\n          })\n        }\n      }\n    });\n    /**\n     * 监听网络状态变化\n     * 可根据业务需求进行调整\n     */\n    wx.onNetworkStatusChange(function(res) {\n      if (!res.isConnected) {\n        that.globalData.isConnected = false\n        wx.showToast({\n          title: $t.common.networkDown,\n          icon: 'loading'\n        })\n      } else {\n        that.globalData.isConnected = true\n        wx.hideToast()\n      }\n    })\n    WXAPI.queryConfigBatch('mallName,myBg,mapPos,order_hx_uids,subscribe_ids,share_profile,zxdz,admin_uids,shop_goods_split,QQ_MAP_KEY,shop_join_open,create_order_select_time,packaging_fee,customerServiceChatCorpId,customerServiceChatUrl,alipay,share_pic,tihuodianOpen').then(res => {\n      if (res.code == 0) {\n        res.data.forEach(config => {\n          wx.setStorageSync(config.key, config.value);\n        })\n        if (this.configLoadOK) {\n          this.configLoadOK()\n        }\n      }\n    })\n  },\n  onShow (e) {\n    if (e && e.query && e.query.scene) {\n      const scene = decodeURIComponent(e.query.scene) // 处理扫码进商品详情页面的逻辑\n      if (scene && scene.split(',').length == 3) {\n        // 扫码点餐\n      } else {\n        AUTH.checkHasLogined().then(isLogined => {\n          if (!isLogined) {\n            AUTH.authorize().then(() => {\n              this.getUserApiInfo()\n            })\n          } else {\n            this.getUserApiInfo()\n          }\n        })\n      }\n    } else {\n      AUTH.checkHasLogined().then(isLogined => {\n        if (!isLogined) {\n          AUTH.authorize().then(() => {\n            this.getUserApiInfo()\n          })\n        } else {\n          this.getUserApiInfo()\n        }\n      })\n    }\n    // 保存邀请人\n    if (e && e.query && e.query.inviter_id) {\n      wx.setStorageSync('referrer', e.query.inviter_id)\n      if (e.shareTicket) {\n        wx.getShareInfo({\n          shareTicket: e.shareTicket,\n          success: res => {\n            console.log(res)\n            console.log({\n              referrer: e.query.inviter_id,\n              encryptedData: res.encryptedData,\n              iv: res.iv\n            })\n            wx.login({\n              success(loginRes) {\n                if (loginRes.code) {\n                  WXAPI.shareGroupGetScore(\n                    loginRes.code,\n                    e.query.inviter_id,\n                    res.encryptedData,\n                    res.iv\n                  ).then(_res => {\n                    console.log(_res)\n                  }).catch(err => {\n                    console.error(err)\n                  })\n                } else {\n                  console.error(loginRes.errMsg)\n                }\n              }\n            })\n          }\n        })\n      }\n    }\n    this.refreshStorageShopInfo()\n  },\n  async refreshStorageShopInfo() {\n    // 刷新本地缓存的门店信息 https://www.yuque.com/apifm/nu0f75/cu4cfi\n    let shopInfo = wx.getStorageSync('shopInfo')\n    if (!shopInfo) {\n      return\n    }\n    const res = await WXAPI.shopSubdetail(shopInfo.id)\n    if (res.code == 0) {\n      const distance = shopInfo.distance\n      shopInfo = res.data.info\n      shopInfo.distance = distance\n      wx.setStorageSync('shopInfo',  shopInfo)\n    }\n  },\n  initLanguage(_this) {\n    _this.setData({\n      language: i18n.getLanguage(),\n      $t: i18n.$t(),\n    })\n  },\n  changeLang(_this) {\n    const langs = i18n.langs\n    const nameArray = []\n    langs.forEach(ele => nameArray.push(ele.name))\n    wx.showActionSheet({\n      itemList: nameArray,\n      success: (e) => {\n        const lang = langs[e.tapIndex]\n        wx.setStorageSync('Language', lang.code)\n        _this.setData({\n          language: i18n.getLanguage(),\n          $t: i18n.$t(),\n        })\n        this.setTabBarLanguage()\n      }\n    })\n  },\n  setTabBarLanguage() {\n    i18n.setTabBarLanguage()\n  },\n  async getUserApiInfo() {\n    const token = wx.getStorageSync('token')\n    if (!token) {\n      return null\n    }\n    // https://www.yuque.com/apifm/nu0f75/zgf8pu\n    const res = await WXAPI.userDetail(token)\n    if (res.code == 0) {\n      this.globalData.apiUserInfoMap = res.data\n      if (this.getUserDetailOK) {\n        this.getUserDetailOK(res.data)\n      }\n      return res.data\n    }\n  },\n  globalData: {\n    isConnected: true\n  }\n})"
  },
  {
    "path": "app.json",
    "content": "{\r\n  \"pages\": [\r\n    \"pages/home/index\",\r\n    \"pages/index/index\",\r\n    \"pages/all-orders/index\",\r\n    \"pages/my/index\",\r\n    \"pages/my/feedback\",\r\n    \"pages/my/user-code\",\r\n    \"pages/ad/index\",\r\n    \"pages/pay/index\",\r\n    \"pages/shop/select\",\r\n    \"pages/shop/detail\",\r\n    \"pages/shop/join-apply\",\r\n    \"pages/youhui-pay/index\",\r\n    \"pages/member-center/index\",\r\n    \"pages/order-details/index\",\r\n    \"pages/order-details/scan-result\",\r\n    \"pages/order-details/doing\",\r\n    \"pages/about/index\",\r\n    \"pages/coupons/index\",\r\n    \"pages/booking/index\",\r\n    \"pages/asset/index\",\r\n    \"pages/asset/recharge-log\",\r\n    \"pages/asset/cash-log\",\r\n    \"pages/sign/index\",\r\n    \"pages/score/logs\",\r\n    \"pages/notice/detail\",\r\n    \"pages/queue/index\",\r\n    \"pages/cart/index\",\r\n    \"pages/cart/order\",\r\n    \"pages/goods-details/index\",\r\n    \"pages/goods/list\",\r\n    \"pages/card/index\",\r\n    \"pages/card/logs\",\r\n    \"pages/card/exchange\",\r\n    \"pages/card/send\",\r\n    \"pages/card/receive\"\r\n  ],\r\n  \"requiredPrivateInfos\": [\r\n    \"getLocation\",\r\n    \"chooseLocation\",\r\n    \"chooseAddress\"\r\n  ],\r\n  \"window\": {\r\n    \"backgroundTextStyle\": \"light\",\r\n    \"navigationBarBackgroundColor\": \"#fff\",\r\n    \"navigationBarTitleText\": \"WeChat\",\r\n    \"navigationBarTextStyle\": \"black\"\r\n  },\r\n  \"tabBar\": {\r\n    \"color\": \"#6e6d6b\",\r\n    \"selectedColor\": \"#e64340\",\r\n    \"backgroundColor\": \"#fff\",\r\n    \"list\": [\r\n      {\r\n        \"pagePath\": \"pages/home/index\",\r\n        \"iconPath\": \"images/nav/home-off.png\",\r\n        \"selectedIconPath\": \"images/nav/home-on.png\",\r\n        \"text\": \"首页\"\r\n      },\r\n      {\r\n        \"pagePath\": \"pages/index/index\",\r\n        \"iconPath\": \"images/nav/index-off.png\",\r\n        \"selectedIconPath\": \"images/nav/index-on.png\",\r\n        \"text\": \"点餐\"\r\n      },\r\n      {\r\n        \"pagePath\": \"pages/queue/index\",\r\n        \"iconPath\": \"images/nav/qh-off.png\",\r\n        \"selectedIconPath\": \"images/nav/qh-on.png\",\r\n        \"text\": \"取号\"\r\n      },\r\n      {\r\n        \"pagePath\": \"pages/order-details/doing\",\r\n        \"iconPath\": \"images/nav/qc-off.png\",\r\n        \"selectedIconPath\": \"images/nav/qc-on.png\",\r\n        \"text\": \"取餐\"\r\n      },\r\n      {\r\n        \"pagePath\": \"pages/my/index\",\r\n        \"iconPath\": \"images/nav/my-off.png\",\r\n        \"selectedIconPath\": \"images/nav/my-on.png\",\r\n        \"text\": \"我的\"\r\n      }\r\n    ]\r\n  },\r\n  \"permission\": {\r\n    \"scope.userLocation\": {\r\n      \"desc\": \"获取离你最近的门店\"\r\n    }\r\n  },\r\n  \"usingComponents\": {\r\n    \"parser\":\"/components/parser.20200731.min/parser\",\r\n    \"payment\": \"/components/payment/index\",\r\n    \"van-button\": \"@vant/weapp/button/index\",\r\n    \"van-sidebar\": \"@vant/weapp/sidebar/index\",\r\n    \"van-sidebar-item\": \"@vant/weapp/sidebar-item/index\",\r\n    \"van-swipe-cell\": \"@vant/weapp/swipe-cell/index\",\r\n    \"van-card\": \"@vant/weapp/card/index\",\r\n    \"van-submit-bar\": \"@vant/weapp/submit-bar/index\",\r\n    \"van-popup\": \"@vant/weapp/popup/index\",\r\n    \"van-stepper\": \"@vant/weapp/stepper/index\",\r\n    \"van-row\": \"@vant/weapp/row/index\",\r\n    \"van-col\": \"@vant/weapp/col/index\",\r\n    \"van-divider\": \"@vant/weapp/divider/index\",\r\n    \"van-icon\": \"@vant/weapp/icon/index\",\r\n    \"van-empty\": \"@vant/weapp/empty/index\",\r\n    \"van-field\": \"@vant/weapp/field/index\",\r\n    \"van-cell\": \"@vant/weapp/cell/index\",\r\n    \"van-cell-group\": \"@vant/weapp/cell-group/index\",\r\n    \"van-dialog\": \"@vant/weapp/dialog/index\",\r\n    \"van-overlay\": \"@vant/weapp/overlay/index\",\r\n    \"van-tab\": \"@vant/weapp/tab/index\",\r\n    \"van-tabs\": \"@vant/weapp/tabs/index\",\r\n    \"van-datetime-picker\": \"@vant/weapp/datetime-picker/index\",\r\n    \"van-calendar\": \"@vant/weapp/calendar/index\",\r\n    \"van-notice-bar\": \"@vant/weapp/notice-bar/index\",\r\n    \"van-tabbar\": \"@vant/weapp/tabbar/index\",\r\n    \"van-tabbar-item\": \"@vant/weapp/tabbar-item/index\",\r\n    \"van-tag\": \"@vant/weapp/tag/index\",\r\n    \"van-goods-action\": \"@vant/weapp/goods-action/index\",\r\n    \"van-goods-action-icon\": \"@vant/weapp/goods-action-icon/index\",\r\n    \"van-goods-action-button\": \"@vant/weapp/goods-action-button/index\",\r\n    \"van-uploader\": \"@vant/weapp/uploader/index\",\r\n    \"van-grid\": \"@vant/weapp/grid/index\",\r\n    \"van-grid-item\": \"@vant/weapp/grid-item/index\",\r\n    \"van-count-down\": \"@vant/weapp/count-down/index\",\r\n    \"van-progress\": \"@vant/weapp/progress/index\",\r\n    \"van-radio\": \"@vant/weapp/radio/index\",\r\n    \"van-radio-group\": \"@vant/weapp/radio-group/index\",\r\n    \"van-sticky\": \"@vant/weapp/sticky/index\"\r\n  },\r\n  \"sitemapLocation\": \"sitemap.json\"\r\n}"
  },
  {
    "path": "app.wxss",
    "content": "page {\n  font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica,\n    Segoe UI, Arial, Roboto, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei',\n    sans-serif;\n}\npage,view,image,input {\n  display: block;\n  box-sizing: border-box;\n}\n.badge {\n  position: absolute;\n  top: 0;\n  right: 0;\n  box-sizing: border-box;\n  width: 38rpx;\n  height: 38rpx;\n  line-height: 38rpx;\n  color: #fff;\n  font-size: 20rpx;\n  text-align: center;\n  background-color: #e64340;\n  border: 1rpx solid #fff;\n  border-radius: 50%;\n}\n.block-btn {\n  padding: 0 32rpx;\n}"
  },
  {
    "path": "components/parser.20200731.min/libs/CssHandler.js",
    "content": "function t(t){var s=Object.assign(Object.create(null),i.userAgentStyles);for(var h in t)s[h]=(s[h]?s[h]+\";\":\"\")+t[h];this.styles=s}function s(t,s){this.data=t,this.floor=0,this.i=0,this.list=[],this.res=s,this.state=this.Space}var i=require(\"./config.js\"),h=function(t){return t>=\"a\"&&t<=\"z\"||t>=\"A\"&&t<=\"Z\"};t.prototype.getStyle=function(t){this.styles=new s(t,this.styles).parse()},t.prototype.match=function(t,s){var i,h=(i=this.styles[t])?i+\";\":\"\";if(s.class)for(var e,a=s.class.split(\" \"),o=0;e=a[o];o++)(i=this.styles[\".\"+e])&&(h+=i+\";\");return(i=this.styles[\"#\"+s.id])&&(h+=i+\";\"),h},module.exports=t,s.prototype.parse=function(){for(var t;t=this.data[this.i];this.i++)this.state(t);return this.res},s.prototype.section=function(){return this.data.substring(this.start,this.i)},s.prototype.Space=function(t){\".\"==t||\"#\"==t||h(t)?(this.start=this.i,this.state=this.Name):\"/\"==t&&\"*\"==this.data[this.i+1]?this.Comment():i.blankChar[t]||\";\"==t||(this.state=this.Ignore)},s.prototype.Comment=function(){this.i=this.data.indexOf(\"*/\",this.i)+1,this.i||(this.i=this.data.length),this.state=this.Space},s.prototype.Ignore=function(t){\"{\"==t?this.floor++:\"}\"!=t||--this.floor||(this.state=this.Space)},s.prototype.Name=function(t){i.blankChar[t]?(this.list.push(this.section()),this.state=this.NameSpace):\"{\"==t?(this.list.push(this.section()),this.Content()):\",\"==t?(this.list.push(this.section()),this.Comma()):!h(t)&&(t<\"0\"||t>\"9\")&&\"-\"!=t&&\"_\"!=t&&(this.state=this.Ignore)},s.prototype.NameSpace=function(t){\"{\"==t?this.Content():\",\"==t?this.Comma():i.blankChar[t]||(this.state=this.Ignore)},s.prototype.Comma=function(){for(;i.blankChar[this.data[++this.i]];);\"{\"==this.data[this.i]?this.Content():(this.start=this.i--,this.state=this.Name)},s.prototype.Content=function(){this.start=++this.i,-1==(this.i=this.data.indexOf(\"}\",this.i))&&(this.i=this.data.length);for(var t,s=this.section(),i=0;t=this.list[i++];)this.res[t]?this.res[t]+=\";\"+s:this.res[t]=s;this.list=[],this.state=this.Space}"
  },
  {
    "path": "components/parser.20200731.min/libs/MpHtmlParser.js",
    "content": "// 小程序富文本插件 https://github.com/jin-yufeng/Parser\r\nvar emoji;function t(t){var s=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.attrs={},this.CssHandler=new e(r.tagStyle,a),this.data=t,this.domain=r.domain,this.DOM=[],this.i=this.start=this.audioNum=this.imgNum=this.videoNum=0,r.prot=(this.domain||\"\").includes(\"://\")?this.domain.split(\"://\")[0]:\"http\",this.options=r,this.state=this.Text,this.STACK=[],this.bubble=function(){for(var t,e=s.STACK.length;t=s.STACK[--e];){if(i.richOnlyTags[t.name])return\"table\"!=t.name||Object.hasOwnProperty.call(t,\"c\")||(t.c=1),!1;t.c=1}return!0},this.decode=function(t,s){for(var e,a,r=-1;;){if(-1==(r=t.indexOf(\"&\",r+1)))break;if(-1==(e=t.indexOf(\";\",r+2)))break;\"#\"==t[r+1]?(a=parseInt((\"x\"==t[r+2]?\"0\":\"\")+t.substring(r+2,e)),isNaN(a)||(t=t.substr(0,r)+String.fromCharCode(a)+t.substr(e+1))):(a=t.substring(r+1,e),(i.entities[a]||a==s)&&(t=t.substr(0,r)+(i.entities[a]||\"&\")+t.substr(e+1)))}return t},this.getUrl=function(t){return\"/\"==t[0]?\"/\"==t[1]?t=s.options.prot+\":\"+t:s.domain&&(t=s.domain+t):s.domain&&0!=t.indexOf(\"data:\")&&!t.includes(\"://\")&&(t=s.domain+\"/\"+t),t},this.isClose=function(){return\">\"==s.data[s.i]||\"/\"==s.data[s.i]&&\">\"==s.data[s.i+1]},this.section=function(){return s.data.substring(s.start,s.i)},this.parent=function(){return s.STACK[s.STACK.length-1]},this.siblings=function(){return s.STACK.length?s.parent().children:s.DOM}}var i=require(\"./config.js\"),s=i.blankChar,e=require(\"./CssHandler.js\"),a=wx.getSystemInfoSync().windowWidth;t.prototype.parse=function(){emoji&&(this.data=emoji.parseEmoji(this.data));for(var t;t=this.data[this.i];this.i++)this.state(t);for(this.state==this.Text&&this.setText();this.STACK.length;)this.popNode(this.STACK.pop());return this.DOM},t.prototype.setAttr=function(){var t=this.attrName.toLowerCase(),e=this.attrVal;for(i.boolAttrs[t]?this.attrs[t]=\"T\":e&&(\"src\"==t||\"data-src\"==t&&!this.attrs.src?this.attrs.src=this.getUrl(this.decode(e,\"amp\")):\"href\"==t||\"style\"==t?this.attrs[t]=this.decode(e,\"amp\"):\"data-\"!=t.substr(0,5)&&(this.attrs[t]=e)),this.attrVal=\"\";s[this.data[this.i]];)this.i++;this.isClose()?this.setNode():(this.start=this.i,this.state=this.AttrName)},t.prototype.setText=function(){var t,e=this.section();if(e)if(e=i.onText&&i.onText(e,function(){return t=!0})||e,t){this.data=this.data.substr(0,this.start)+e+this.data.substr(this.i);var a=this.start+e.length;for(this.i=this.start;this.i<a;this.i++)this.state(this.data[this.i])}else{if(!this.pre){for(var r,h,n=[],o=e.length;h=e[--o];)s[h]?(\" \"!=n[0]&&n.unshift(\" \"),\"\\n\"==h&&void 0==r&&(r=0)):(n.unshift(h),r||(r=1));if(0==r)return;e=n.join(\"\")}this.siblings().push({type:\"text\",text:this.decode(e)})}},t.prototype.setNode=function(){var t={name:this.tagName.toLowerCase(),attrs:this.attrs},e=i.selfClosingTags[t.name];if(this.attrs={},i.ignoreTags[t.name])if(e)if(\"source\"==t.name){var r=this.parent();r&&(\"video\"==r.name||\"audio\"==r.name)&&t.attrs.src&&r.attrs.source.push(t.attrs.src)}else\"base\"!=t.name||this.domain||(this.domain=t.attrs.href);else this.remove(t);else{var h=t.attrs,n=this.CssHandler.match(t.name,h,t)+(h.style||\"\"),o={};switch(h.id&&(1&this.options.compress?h.id=void 0:this.options.useAnchor&&this.bubble()),2&this.options.compress&&h.class&&(h.class=void 0),t.name){case\"a\":case\"ad\":this.bubble();break;case\"font\":if(h.color&&(o.color=h.color,h.color=void 0),h.face&&(o[\"font-family\"]=h.face,h.face=void 0),h.size){var l=parseInt(h.size);l<1?l=1:l>7&&(l=7);var d=[\"xx-small\",\"x-small\",\"small\",\"medium\",\"large\",\"x-large\",\"xx-large\"];o[\"font-size\"]=d[l-1],h.size=void 0}break;case\"embed\":var u=t.attrs.src||\"\",c=t.attrs.type||\"\";if(c.includes(\"video\")||u.includes(\".mp4\")||u.includes(\".3gp\")||u.includes(\".m3u8\"))t.name=\"video\";else{if(!(c.includes(\"audio\")||u.includes(\".m4a\")||u.includes(\".wav\")||u.includes(\".mp3\")||u.includes(\".aac\")))break;t.name=\"audio\"}t.attrs.autostart&&(t.attrs.autoplay=\"T\"),t.attrs.controls=\"T\";/*fallsthrough*/case\"video\":case\"audio\":h.id?this[t.name+\"Num\"]++:h.id=t.name+ ++this[t.name+\"Num\"],\"video\"==t.name&&(this.videoNum>3&&(t.lazyLoad=1),h.width&&(o.width=parseFloat(h.width)+(h.width.includes(\"%\")?\"%\":\"px\"),h.width=void 0),h.height&&(o.height=parseFloat(h.height)+(h.height.includes(\"%\")?\"%\":\"px\"),h.height=void 0)),h.controls||h.autoplay||(h.controls=\"T\"),h.source=[],h.src&&(h.source.push(h.src),h.src=void 0),this.bubble();break;case\"td\":case\"th\":if(h.colspan||h.rowspan)for(var f,p=this.STACK.length;f=this.STACK[--p];)if(\"table\"==f.name){f.c=void 0;break}}h.align&&(o[\"text-align\"]=h.align,h.align=void 0);var m=n.split(\";\");n=\"\";for(var g=0,v=m.length;g<v;g++){var b=m[g].split(\":\");if(!(b.length<2)){var x=b[0].trim().toLowerCase(),y=b.slice(1).join(\":\").trim();\"-\"==y[0]||y.includes(\"safe\")?n+=\";\"+x+\":\"+y:o[x]&&!y.includes(\"import\")&&o[x].includes(\"import\")||(o[x]=y)}}if(\"img\"==t.name){h.src&&!h.ignore&&(this.bubble()?h.i=(this.imgNum++).toString():h.ignore=\"T\"),h.ignore&&(n+=\";-webkit-touch-callout:none\",o[\"max-width\"]=\"100%\");var C;o.width?C=o.width:h.width&&(C=h.width.includes(\"%\")?h.width:h.width+\"px\"),C&&(o.width=C,h.width=\"100%\",parseInt(C)>a&&(o.height=\"\",h.height&&(h.height=void 0))),o.height?(h.height=o.height,o.height=\"\"):h.height&&!h.height.includes(\"%\")&&(h.height+=\"px\")}for(var T in o){var w=o[T];if(w){if((T.includes(\"flex\")||\"order\"==T||\"self-align\"==T)&&(t.c=1),w.includes(\"url\")){var A=w.indexOf(\"(\");if(-1!=A++){for(;'\"'==w[A]||\"'\"==w[A]||s[w[A]];)A++;w=w.substr(0,A)+this.getUrl(w.substr(A))}}else w.includes(\"rpx\")?w=w.replace(/[0-9.]+\\s*rpx/g,function(t){return parseFloat(t)*a/750+\"px\"}):\"white-space\"==T&&w.includes(\"pre\")&&!e&&(this.pre=t.pre=!0);n+=\";\"+T+\":\"+w}}n=n.substr(1),n&&(h.style=n),e?i.filter&&0==i.filter(t,this)||this.siblings().push(t):(t.children=[],\"pre\"==t.name&&i.highlight&&(this.remove(t),this.pre=t.pre=!0),this.siblings().push(t),this.STACK.push(t))}\"/\"==this.data[this.i]&&this.i++,this.start=this.i+1,this.state=this.Text},t.prototype.remove=function(t){var e=this,a=t.name,r=this.i,h=function(){var i=e.data.substring(r,e.i+1);t.attrs.xmlns||(i=' xmlns=\"http://www.w3.org/2000/svg\"'+i);for(var s=r;\"<\"!=e.data[r];)r--;i=e.data.substring(r,s).replace(\"viewbox\",\"viewBox\")+i;var a=e.parent();\"100%\"==t.attrs.width&&a&&(a.attrs.style||\"\").includes(\"inline\")&&(a.attrs.style=\"width:300px;max-width:100%;\"+a.attrs.style),e.siblings().push({name:\"img\",attrs:{src:\"data:image/svg+xml;utf8,\"+i.replace(/#/g,\"%23\"),style:(/vertical[^;]+/.exec(t.attrs.style)||[]).shift(),ignore:\"T\"}})};if(\"svg\"==t.name&&\"/\"==this.data[r])return h(this.i++);for(;;){if(-1==(this.i=this.data.indexOf(\"</\",this.i+1)))return void(this.i=\"pre\"==a||\"svg\"==a?r:this.data.length);for(this.start=this.i+=2;!s[this.data[this.i]]&&!this.isClose();)this.i++;if(this.section().toLowerCase()==a)return\"pre\"==a?(this.data=this.data.substr(0,r+1)+i.highlight(this.data.substring(r+1,this.i-5),t.attrs)+this.data.substr(this.i-5),this.i=r):(\"style\"==a?this.CssHandler.getStyle(this.data.substring(r+1,this.i-7)):\"title\"==a&&(this.DOM.title=this.data.substring(r+1,this.i-7)),-1==(this.i=this.data.indexOf(\">\",this.i))&&(this.i=this.data.length),void(\"svg\"==a&&h()))}},t.prototype.popNode=function(t){if(t.pre){t.pre=this.pre=void 0;for(var s=this.STACK.length;s--;)this.STACK[s].pre&&(this.pre=!0)}var e=this.siblings(),a=e.length,r=t.children;if(\"head\"==t.name||i.filter&&0==i.filter(t,this))return e.pop();var h=t.attrs;if(i.blockTags[t.name]?t.name=\"div\":i.trustTags[t.name]||(t.name=\"span\"),t.c&&(\"ul\"==t.name||\"ol\"==t.name))if((t.attrs.style||\"\").includes(\"list-style:none\"))for(var n,o=0;n=r[o++];)\"li\"==n.name&&(n.name=\"div\");else if(\"ul\"==t.name){for(var l=1,d=this.STACK.length;d--;)\"ul\"==this.STACK[d].name&&l++;if(1!=l)for(var u=r.length;u--;)r[u].floor=l}else for(var c,f=0,p=1;c=r[f++];)\"li\"==c.name&&(c.type=\"ol\",c.num=function(t,i){if(\"a\"==i)return String.fromCharCode(97+(t-1)%26);if(\"A\"==i)return String.fromCharCode(65+(t-1)%26);if(\"i\"==i||\"I\"==i){t=(t-1)%99+1;var s=[\"I\",\"II\",\"III\",\"IV\",\"V\",\"VI\",\"VII\",\"VIII\",\"IX\"],e=[\"X\",\"XX\",\"XXX\",\"XL\",\"L\",\"LX\",\"LXX\",\"LXXX\",\"XC\"],a=(e[Math.floor(t/10)-1]||\"\")+(s[t%10-1]||\"\");return\"i\"==i?a.toLowerCase():a}return t}(p++,h.type)+\".\");if(\"table\"==t.name){var m=h.cellpadding,g=h.cellspacing,v=h.border;if(t.c&&(this.bubble(),h.style=(h.style||\"\")+\";display:table\",m||(m=2),g||(g=2)),v&&(h.style=\"border:\"+v+\"px solid gray;\"+(h.style||\"\")),g&&(h.style=\"border-spacing:\"+g+\"px;\"+(h.style||\"\")),(v||m||t.c)&&function i(s){for(var e,a=0;e=s[a];a++)if(\"text\"!=e.type){var r=e.attrs.style||\"\";t.c&&\"t\"==e.name[0]&&(e.c=1,r+=\";display:table-\"+(\"th\"==e.name||\"td\"==e.name?\"cell\":\"tr\"==e.name?\"row\":\"row-group\")),\"th\"==e.name||\"td\"==e.name?(v&&(r=\"border:\"+v+\"px solid gray;\"+r),m&&(r=\"padding:\"+m+\"px;\"+r)):i(e.children||[]),r&&(e.attrs.style=r)}}(r),this.options.autoscroll){var b=Object.assign({},t);t.name=\"div\",t.attrs={style:\"overflow:scroll\"},t.children=[b]}}this.CssHandler.pop&&this.CssHandler.pop(t),\"div\"!=t.name||Object.keys(h).length||1!=r.length||\"div\"!=r[0].name||(e[a-1]=r[0])},t.prototype.Text=function(t){if(\"<\"==t){var i=this.data[this.i+1],s=function(t){return t>=\"a\"&&t<=\"z\"||t>=\"A\"&&t<=\"Z\"};s(i)?(this.setText(),this.start=this.i+1,this.state=this.TagName):\"/\"==i?(this.setText(),s(this.data[++this.i+1])?(this.start=this.i+1,this.state=this.EndTag):this.Comment()):\"!\"!=i&&\"?\"!=i||(this.setText(),this.Comment())}},t.prototype.Comment=function(){var t;t=\"--\"==this.data.substring(this.i+2,this.i+4)?\"--\\x3e\":\"[CDATA[\"==this.data.substring(this.i+2,this.i+9)?\"]]>\":\">\",-1==(this.i=this.data.indexOf(t,this.i+2))?this.i=this.data.length:this.i+=t.length-1,this.start=this.i+1,this.state=this.Text},t.prototype.TagName=function(t){if(s[t]){for(this.tagName=this.section();s[this.data[this.i]];)this.i++;this.isClose()?this.setNode():(this.start=this.i,this.state=this.AttrName)}else this.isClose()&&(this.tagName=this.section(),this.setNode())},t.prototype.AttrName=function(t){if(\"=\"==t||s[t]||this.isClose()){if(this.attrName=this.section(),s[t])for(;s[this.data[++this.i]];);if(\"=\"==this.data[this.i]){for(;s[this.data[++this.i]];);this.start=this.i--,this.state=this.AttrValue}else this.setAttr()}},t.prototype.AttrValue=function(t){if('\"'==t||\"'\"==t){if(this.start++,-1==(this.i=this.data.indexOf(t,this.i+1)))return this.i=this.data.length;this.attrVal=this.section(),this.i++}else{for(;!s[this.data[this.i]]&&!this.isClose();this.i++);this.attrVal=this.section()}this.setAttr()},t.prototype.EndTag=function(t){if(s[t]||\">\"==t||\"/\"==t){for(var i=this.section().toLowerCase(),e=this.STACK.length;e--&&this.STACK[e].name!=i;);if(-1!=e){for(var a;(a=this.STACK.pop()).name!=i;)this.popNode(a);this.popNode(a)}else\"p\"!=i&&\"br\"!=i||this.siblings().push({name:i,attrs:{}});this.i=this.data.indexOf(\">\",this.i),this.start=this.i+1,-1==this.i?this.i=this.data.length:this.state=this.Text}},module.exports=t"
  },
  {
    "path": "components/parser.20200731.min/libs/config.js",
    "content": "function e(e){for(var t=Object.create(null),a=e.split(\",\"),o=a.length;o--;)t[a[o]]=!0;return t}var t=wx.canIUse(\"editor\");\r\nmodule.exports={\r\n  errorImg:null,\r\n  filter:null,\r\n  highlight:null,\r\n  onText:null,\r\n  entities:{quot:'\"',apos:\"'\",semi:\";\",nbsp:\" \",ndash:\"–\",mdash:\"—\",middot:\"·\",lsquo:\"‘\",rsquo:\"’\",ldquo:\"“\",rdquo:\"”\",bull:\"•\",hellip:\"…\"},\r\n  blankChar:e(' ,\\xA0,\\t,\\r,\\n,\\f'),\r\n  boolAttrs:e('autoplay,autostart,controls,ignore,loop,muted'),\r\n  blockTags:e('address,article,aside,body,caption,center,cite,footer,header,html,nav,section'+(t?'':',pre')),\r\n  ignoreTags:e('area,base,canvas,frame,iframe,input,link,map,meta,param,script,source,style,svg,textarea,title,track,wbr'+(t?',rp':'')),\r\n  richOnlyTags:e('a,colgroup,fieldset,legend,table'+(t?',bdi,bdo,rt,ruby':'')),\r\n  selfClosingTags:e('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),\r\n  trustTags:e('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,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'+(t?',bdi,bdo,caption,pre,rt,ruby':'')),\r\n  userAgentStyles:{address:\"font-style:italic\",big:\"display:inline;font-size:1.2em\",blockquote:\"background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px\",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;overflow:scroll\",s:\"text-decoration:line-through\",small:\"display:inline;font-size:0.8em\",u:\"text-decoration:underline\"}\r\n}"
  },
  {
    "path": "components/parser.20200731.min/parser.js",
    "content": "// 小程序富文本插件 https://github.com/jin-yufeng/Parser\nvar dom;var search;function t(t){for(var e=t.length,i=5381;e--;)i+=(i<<5)+t.charCodeAt(e);return i}var e={},i=require(\"./libs/MpHtmlParser.js\"),n=wx.getFileSystemManager&&wx.getFileSystemManager();Component({options:{pureDataPattern:/^[acdgtu]|W/},data:{nodes:[]},properties:{html:{type:String,observer:function(t){this.setContent(t)}},autopause:{type:Boolean,value:!0},autoscroll:Boolean,autosetTitle:{type:Boolean,value:!0},compress:Number,domain:String,lazyLoad:Boolean,loadingImg:String,selectable:Boolean,tagStyle:Object,showWithAnimation:Boolean,useAnchor:Boolean,useCache:Boolean},relations:{\"../parser-group/parser-group\":{type:\"ancestor\"}},created:function(){var t=this;this.imgList=[],this.imgList.setItem=function(t,e){var i=this;if(t&&e){if(0==e.indexOf(\"http\")&&this.includes(e)){for(var s,a=\"\",o=0;(s=e[o])&&(\"/\"!=s||\"/\"==e[o-1]||\"/\"==e[o+1]);o++)a+=Math.random()>.5?s.toUpperCase():s;return a+=e.substr(o),this[t]=a}if(this[t]=e,e.includes(\"data:image\")){var r=e.match(/data:image\\/(\\S+?);(\\S+?),(.+)/);if(!r)return;var l=wx.env.USER_DATA_PATH+\"/\"+Date.now()+\".\"+r[1];n&&n.writeFile({filePath:l,data:r[3],encoding:r[2],success:function(){return i[t]=l}})}}},this.imgList.each=function(t){for(var e=0,i=this.length;e<i;e++)this.setItem(e,t(this[e],e,this))},dom&&(this.document=new dom(this)),search&&(this.search=function(e){return search(t,e)})},detached:function(){this.imgList.each(function(t){t&&t.includes(wx.env.USER_DATA_PATH)&&n&&n.unlink({filePath:t})}),clearInterval(this._timer)},methods:{in:function(t){t.page&&t.selector&&t.scrollTop&&(this._in=t)},navigateTo:function(t){var e=this;if(!this.data.useAnchor)return t.fail&&t.fail(\"Anchor is disabled\");var i=(this._in?this._in.page:this).createSelectorQuery().select((this._in?this._in.selector:\".top\")+(t.id?\">>>#\"+t.id:\"\")).boundingClientRect();this._in?i.select(this._in.selector).fields({rect:!0,scrollOffset:!0}):i.selectViewport().scrollOffset(),i.exec(function(i){if(!i[0])return e.group?e.group.navigateTo(e.i,t):t.fail&&t.fail(\"Label not found\");var n=i[1].scrollTop+i[0].top-(i[1].top||0)+(t.offset||0);if(e._in){var s={};s[e._in.scrollTop]=n,e._in.page.setData(s)}else wx.pageScrollTo({scrollTop:n});t.success&&t.success()})},getText:function(){for(var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data.nodes,i=\"\",n=0;t=e[n++];)if(\"text\"==t.type)i+=t.text.replace(/&nbsp;/g,\" \").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&amp;/g,\"&\");else if(\"br\"==t.type)i+=\"\\n\";else{var s=\"p\"==t.name||\"div\"==t.name||\"tr\"==t.name||\"li\"==t.name||\"h\"==t.name[0]&&t.name[1]>\"0\"&&t.name[1]<\"7\";s&&i&&\"\\n\"!=i[i.length-1]&&(i+=\"\\n\"),t.children&&(i+=this.getText(t.children)),s&&\"\\n\"!=i[i.length-1]?i+=\"\\n\":\"td\"!=t.name&&\"th\"!=t.name||(i+=\"\\t\")}return i},getVideoContext:function(t){if(!t)return this.videoContexts;for(var e=this.videoContexts.length;e--;)if(this.videoContexts[e].id==t)return this.videoContexts[e]},setContent:function(n,s){var a,o=this,r=new i(n,this.data);if(this.data.useCache){var l=t(n);e[l]?a=e[l]:e[l]=a=r.parse()}else a=r.parse();this.triggerEvent(\"parse\",a);var h={};if(s)for(var c=this.data.nodes.length,d=a.length;d--;)h[\"nodes[\"+(c+d)+\"]\"]=a[d];else h.nodes=a;this.showWithAnimation&&(h.showAm=\"animation: show .5s\"),this.setData(h,function(){o.triggerEvent(\"load\")}),a.title&&this.data.autosetTitle&&wx.setNavigationBarTitle({title:a.title}),this.imgList.length=0,this.videoContexts=[];for(var u,g=this.selectAllComponents(\".top,.top>>>._node\"),f=0;u=g[f++];){u.top=this;for(var m,p=0;m=u.data.nodes[p++];)if(!m.c)if(\"img\"==m.name)this.imgList.setItem(m.attrs.i,m.attrs.src);else if(\"video\"==m.name||\"audio\"==m.name){var v;v=\"video\"==m.name?wx.createVideoContext(m.attrs.id,u):u.selectComponent(\"#\"+m.attrs.id),v&&(v.id=m.attrs.id,this.videoContexts.push(v))}}var x;clearInterval(this._timer),this._timer=setInterval(function(){o.createSelectorQuery().select(\".top\").boundingClientRect(function(t){t&&(o.rect=t,t.height==x&&(o.triggerEvent(\"ready\",t),clearInterval(o._timer)),x=t.height)}).exec()},350)}}})"
  },
  {
    "path": "components/parser.20200731.min/parser.json",
    "content": "{\"component\":true,\"usingComponents\":{\"trees\":\"./trees/trees\"}}"
  },
  {
    "path": "components/parser.20200731.min/parser.wxml",
    "content": "<slot wx:if=\"{{!nodes.length}}\"/><trees class=\"top\"style=\"{{selectable?'user-select:text;-webkit-user-select:text;':''}}{{showAm}}\"lazy-load=\"{{lazyLoad}}\"loading=\"{{loadingImg}}\"nodes=\"{{nodes}}\"/>"
  },
  {
    "path": "components/parser.20200731.min/parser.wxss",
    "content": ":host{display:block;overflow:scroll;webkit-overflow-scrolling:touch}.top{display:inherit}@keyframes show{0%{opacity:0}100%{opacity:1}}"
  },
  {
    "path": "components/parser.20200731.min/trees/trees.js",
    "content": "function _defineProperty(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var t=require(\"../libs/config.js\").errorImg;Component({data:{canIUse:!!wx.chooseMessageFile,placeholder:\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='225'/>\",ctrl:[]},properties:{nodes:Array,lazyLoad:Boolean,loading:String},methods:{play:function(t){if(this.top.group&&this.top.group.pause(this.top.i),this.top.videoContexts.length>1&&this.top.data.autopause)for(var e=this.top.videoContexts.length;e--;)this.top.videoContexts[e].id!=t.currentTarget.id&&this.top.videoContexts[e].pause()},imgtap:function(t){var e=t.currentTarget.dataset.attrs;if(!e.ignore){var r=!0;if(this.top.triggerEvent(\"imgtap\",{id:t.currentTarget.id,src:e.src,ignore:function(){return r=!1}}),r){if(this.top.group)return this.top.group.preview(this.top.i,e.i);var i=this.top.imgList,a=i[e.i]?i[e.i]:(i=[e.src],e.src);wx.previewImage({current:a,urls:i})}}},loadImg:function(t){var e=t.target.dataset.i;this.data.lazyLoad&&!this.data.ctrl[e]?this.setData(_defineProperty({},\"ctrl[\"+e+\"]\",1)):this.data.loading&&2!=this.data.ctrl[e]&&this.setData(_defineProperty({},\"ctrl[\"+e+\"]\",2))},linkpress:function(t){var e=!0,r=t.currentTarget.dataset.attrs;r.ignore=function(){return e=!1},this.top.triggerEvent(\"linkpress\",r),e&&(r[\"app-id\"]?wx.navigateToMiniProgram({appId:r[\"app-id\"],path:r.path}):r.href&&(\"#\"==r.href[0]?this.top.navigateTo({id:r.href.substring(1)}):0==r.href.indexOf(\"http\")||0==r.href.indexOf(\"//\")?wx.setClipboardData({data:r.href,success:function(){return wx.showToast({title:\"链接已复制\"})}}):wx.navigateTo({url:r.href,fail:function(){wx.switchTab({url:r.href})}})))},error:function(e){var r=e.target.dataset.source,i=e.target.dataset.i,a=this.data.nodes[i];if(\"video\"==r||\"audio\"==r){var s=(a.i||0)+1;if(s<a.attrs.source.length)return this.setData(_defineProperty({},\"nodes[\"+i+\"].i\",s))}else\"img\"==r&&t&&(this.top.imgList.setItem(e.target.dataset.index,t),this.setData(_defineProperty({},\"nodes[\"+i+\"].attrs.src\",t)));this.top&&this.top.triggerEvent(\"error\",{source:r,target:e.target,errMsg:e.detail.errMsg})},loadVideo:function(t){this.setData(_defineProperty({},\"nodes[\"+t.target.dataset.i+\"].attrs.autoplay\",!0))}}})"
  },
  {
    "path": "components/parser.20200731.min/trees/trees.json",
    "content": "{\"component\":true,\"usingComponents\":{\"trees\":\"./trees\"}}"
  },
  {
    "path": "components/parser.20200731.min/trees/trees.wxml",
    "content": "<wxs module=\"handler\">var s={abbr:1,b:1,big:1,code:1,del:1,em:1,i:1,ins:1,label:1,q:1,small:1,span:1,strong:1,sub:1,sup:1};module.exports={visited:function(s,e){s.instance.hasClass(\"_visited\")||s.instance.addClass(\"_visited\"),e.callMethod(\"linkpress\",s)},use:function(e){return!e.c&&!s[e.name]&&-1==(e.attrs.style||\"\").indexOf(\"display:inline\")}}</wxs><block wx:for=\"{{nodes}}\" wx:for-item=\"n\" wx:for-index=\"i\" wx:key=\"i\"><view wx:if=\"{{n.name=='img'}}\" id=\"{{n.attrs.id}}\" class=\"_img {{n.attrs.class}}\" style=\"{{n.attrs.style}}\" data-attrs=\"{{n.attrs}}\" bindtap=\"imgtap\"><rich-text nodes=\"{{[{attrs:{src:loading&&ctrl[i]!=2?loading:(lazyLoad&&!ctrl[i]?placeholder:n.attrs.src||''),alt:n.attrs.alt||'',width:n.attrs.width||'',style:'-webkit-touch-callout:none;max-width:100%;display:block'+(n.attrs.height?';height:'+n.attrs.height:'')},name:'img'}]}}\"/><image class=\"_image\" src=\"{{lazyLoad&&!ctrl[i]?placeholder:n.attrs.src}}\" lazy-load=\"{{lazyLoad}}\" show-menu-by-longpress=\"{{!n.attrs.ignore}}\" data-i=\"{{i}}\" data-index=\"{{n.attrs.i}}\" data-source=\"img\" bindload=\"loadImg\" binderror=\"error\"/></view><text wx:elif=\"{{n.type=='text'}}\" decode>{{n.text}}</text><text wx:elif=\"{{n.name=='br'}}\">\\n</text><view wx:elif=\"{{n.name=='a'}}\" id=\"{{n.attrs.id}}\" class=\"_a {{n.attrs.class}}\" hover-class=\"_hover\" style=\"{{n.attrs.style}}\" data-attrs=\"{{n.attrs}}\" bindtap=\"{{canIUse?handler.visited:'linkpress'}}\"><trees class=\"_node\" nodes=\"{{n.children}}\"/></view><block wx:elif=\"{{n.name=='video'}}\"><view wx:if=\"{{n.lazyLoad&&!n.attrs.autoplay}}\" id=\"{{n.attrs.id}}\" class=\"_video {{n.attrs.class}}\" style=\"{{n.attrs.style}}\" data-i=\"{{i}}\" bindtap=\"loadVideo\"/><video wx:else id=\"{{n.attrs.id}}\" class=\"{{n.attrs.class}}\" style=\"{{n.attrs.style}}\" autoplay=\"{{n.attrs.autoplay}}\" controls=\"{{n.attrs.controls}}\" loop=\"{{n.attrs.loop}}\" muted=\"{{n.attrs.muted}}\" poster=\"{{n.attrs.poster}}\" src=\"{{n.attrs.source[n.i||0]}}\" unit-id=\"{{n.attrs['unit-id']}}\" data-i=\"{{i}}\" data-source=\"video\" binderror=\"error\" bindplay=\"play\"/></block><audio wx:elif=\"{{n.name=='audio'}}\" id=\"{{n.attrs.id}}\" class=\"{{n.attrs.class}}\" style=\"{{n.attrs.style}}\" author=\"{{n.attrs.author}}\" autoplay=\"{{n.attrs.autoplay}}\" controls=\"{{n.attrs.controls}}\" loop=\"{{n.attrs.loop}}\" name=\"{{n.attrs.name}}\" poster=\"{{n.attrs.poster}}\" src=\"{{n.attrs.source[n.i||0]}}\" data-i=\"{{i}}\" data-source=\"audio\" binderror=\"error\" bindplay=\"play\"/><ad wx:elif=\"{{n.name=='ad'}}\" class=\"{{n.attrs.class}}\" style=\"{{n.attrs.style}}\" unit-id=\"{{n.attrs['unit-id']}}\" data-source=\"ad\" binderror=\"error\"/><view wx:elif=\"{{n.name=='li'}}\" id=\"{{n.attrs.id}}\" class=\"{{n.attrs.class}}\" style=\"{{n.attrs.style}};display:flex\"><view wx:if=\"{{n.type=='ol'}}\" class=\"_ol-bef\">{{n.num}}</view><view wx:else class=\"_ul-bef\"><view wx:if=\"{{n.floor%3==0}}\" class=\"_ul-p1\">█</view><view wx:elif=\"{{n.floor%3==2}}\" class=\"_ul-p2\"/><view wx:else class=\"_ul-p1\" style=\"border-radius:50%\">█</view></view><trees class=\"_node _li\" lazyLoad=\"{{lazyLoad}}\" loading=\"{{loading}}\" nodes=\"{{n.children}}\"/></view><rich-text wx:elif=\"{{handler.use(n)}}\" id=\"{{n.attrs.id}}\" class=\"_p __{{n.name}}\" nodes=\"{{[n]}}\"/><trees wx:else id=\"{{n.attrs.id}}\" class=\"_node _{{n.name}} {{n.attrs.class}}\" style=\"{{n.attrs.style}}\" lazyLoad=\"{{lazyLoad}}\" loading=\"{{loading}}\" nodes=\"{{n.children}}\"/></block>"
  },
  {
    "path": "components/parser.20200731.min/trees/trees.wxss",
    "content": "._a{display:inline;padding:1.5px 0 1.5px 0;color:#366092;word-break:break-all}._hover{text-decoration:underline;opacity:.7}._visited{color:#551a8b}._img{display:inline-block;max-width:100%;overflow:hidden}:host{display:inline}._blockquote,._div,._p,._ul,._ol,._li{display:block}._b,._strong{font-weight:bold}._code{font-family:monospace}._del{text-decoration:line-through}._em,._i{font-style:italic}._h1{font-size:2em}._h2{font-size:1.5em}._h3{font-size:1.17em}._h5{font-size:.83em}._h6{font-size:.67em}._h1,._h2,._h3,._h4,._h5,._h6{display:block;font-weight:bold}._image{display:block;width:100%;height:360px;margin-top:-360px;opacity:0}._ins{text-decoration:underline}._li{flex:1;width:0}._ol-bef{width:36px;margin-right:5px;text-align:right}._ul-bef{margin:0 12px 0 23px;line-height:normal}._ol-bef,._ul-bef{flex:none;user-select:none}._ul-p1{display:inline-block;width:.3em;height:.3em;overflow:hidden;line-height:.3em}._ul-p2{display:inline-block;width:.23em;height:.23em;border:.05em solid black;border-radius:50%}._q::before{content:'\"'}._q::after{content:'\"'}._sub{font-size:smaller;vertical-align:sub}._sup{font-size:smaller;vertical-align:super}.__bdi,.__bdo,.__ruby,.__rt{display:inline-block}._video{position:relative;display:inline-block;width:300px;height:225px;background-color:black}._video::after{position:absolute;top:50%;left:50%;margin:-15px 0 0 -15px;content:'';border-color:transparent transparent transparent white;border-style:solid;border-width:15px 0 15px 30px}"
  },
  {
    "path": "components/payment/index.js",
    "content": "const WXAPI = require('apifm-wxapi');\nconst { wxaCode } = require('../../utils/auth');\nComponent({\n  options: {\n    addGlobalClass: true,\n  },\n  /**\n   * 组件的对外属性，是属性名到属性设置的映射表\n   */\n  properties: {\n    money: Number,\n    remark: String,\n    nextAction: Object,\n    extData: Object,\n    show: Boolean,\n    useCard: {\n      type: Boolean,\n      value: true\n    }\n  },\n\n  /**\n   * 组件的内部数据，和 properties 一同用于组件的模板渲染\n   */\n  data: {\n    payType: 'wx',\n    alipayOpenMod: '0'\n  },\n  // 组件数据字段监听器，用于监听 properties 和 data 的变化\n  observers: {\n    'show': function(show) {\n      this.setData({\n        alipayQrcode: null,\n        alipayOpenMod: wx.getStorageSync('alipay')\n      })\n    }\n  },\n  lifetimes: {\n    attached() {\n      getApp().initLanguage(this)\n    },\n    detached() {\n      // 在组件实例被从页面节点树移除时执行\n    },\n  },\n  /**\n   * 组件的方法列表\n   */\n  methods: {\n    close() {\n      this.triggerEvent('cancel')\n    },\n    payTypeChange(event) {\n      this.setData({\n        payType: event.detail,\n        alipayQrcode: null,\n      });\n    },\n    payTypeClick(event) {\n      const { name } = event.currentTarget.dataset;\n      this.setData({\n        payType: name,\n        alipayQrcode: null,\n      });\n    },\n    async submit() {\n      let token = wx.getStorageSync('payToken')\n      if (!token) {\n        token = wx.getStorageSync('token')\n      }\n      const postData = {\n        token,\n        money: this.data.money,\n        remark: this.data.remark,\n      }\n      if (this.data.extData) {\n        postData = {\n          ...postData,\n          ...this.data.extData\n        }\n      }\n      if (this.data.nextAction) {\n        postData.nextAction = JSON.stringify(this.data.nextAction)\n      }\n      postData.payName = postData.remark\n      const url = wx.getStorageSync('wxpay_api_url')\n      let res\n      if (this.data.payType == 'wx') {\n        // https://www.yuque.com/apifm/nu0f75/ppadt8\n        res = await WXAPI.payVariableUrl(url ? url : '/pay/wx/wxapp', postData)\n      } else if (this.data.payType == 'alipay') {\n        // https://www.yuque.com/apifm/nu0f75/hguh83ekxsh71cn7\n        res = await WXAPI.alipayQrcode(postData)\n      } else {\n        wx.showModal({\n          content: this.data.$t.payment.notSupport,\n          showCancel: false\n        })\n        this.close()\n        return\n      }\n      if (res.code != 0) {\n        wx.showModal({\n          content: JSON.stringify(res),\n          showCancel: false\n        })\n        this.close()\n        return\n      }\n      if (this.data.payType == 'wx') {\n        wx.requestPayment({\n          timeStamp: res.data.timeStamp,\n          nonceStr: res.data.nonceStr,\n          package: res.data.package,\n          signType: res.data.signType,\n          paySign: res.data.paySign,\n          fail: aaa => {\n            console.error(aaa)\n            wx.showToast({\n              title: '' + aaa,\n              icon: 'none'\n            })\n          },\n          success: () => {\n            wx.showToast({\n              title: this.data.$t.asset.success\n            })\n            this.triggerEvent('ok', this.data)\n          }\n        })\n      }\n      if (this.data.payType == 'alipay') {\n        const qrcodeRes = JSON.parse(res.data.qrcode)\n        const alipayQrcode = qrcodeRes.alipay_trade_precreate_response.qr_code\n        console.log(alipayQrcode);\n        // 生成二维码 https://www.yuque.com/apifm/nu0f75/xrnyo9\n        const resQrcode = await WXAPI.commonQrcode({\n          content: alipayQrcode,\n          width: 650\n        })\n        if (resQrcode.code != 0) {\n          wx.showToast({\n            title: resQrcode.msg,\n            icon: 'none'\n          })\n          return\n        }\n        console.log(resQrcode.data);\n        this.setData({\n          alipayQrcode: resQrcode.data\n        })\n      }\n    },\n  }\n})"
  },
  {
    "path": "components/payment/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \n  }\n}"
  },
  {
    "path": "components/payment/index.wxml",
    "content": "<van-popup\n  show=\"{{ show }}\"\n  position=\"bottom\"\n  round\n  closeable\n  bind:close=\"close\"\n>\n  <view class=\"pop-main\">\n    <view class=\"title\">{{ remark }}</view>\n    <view class=\"amount\"><text>￥</text>{{ money }}</view>\n    <van-divider contentPosition=\"center\">{{ $t.payment.select }}</van-divider>\n    <van-radio-group value=\"{{ payType }}\" bind:change=\"payTypeChange\">\n      <van-cell-group>\n        <van-cell icon=\"https://dcdn.it120.cc/2024/08/29/b327bac1-bfe6-4083-8c56-e2628a7273df.png\" title=\"{{ $t.payment.wx }}\" clickable data-name=\"wx\" bind:click=\"payTypeClick\">\n          <van-radio slot=\"right-icon\" name=\"wx\" />\n        </van-cell>\n        <van-cell wx:if=\"{{ alipayOpenMod == '1' }}\" icon=\"https://dcdn.it120.cc/2024/08/29/b6fdcdd9-bb24-46fd-b066-1a41c0ea8047.png\" title=\"{{ $t.payment.alipay }}\" clickable data-name=\"alipay\" bind:click=\"payTypeClick\">\n          <van-radio slot=\"right-icon\" name=\"alipay\" />\n        </van-cell>\n        <!-- <van-cell wx:if=\"{{ useCard }}\" icon=\"https://dcdn.it120.cc/2024/08/29/b6fdcdd9-bb24-46fd-b066-1a41c0ea8047.png\" title=\"{{ $t.payment.alipay }}\" clickable data-name=\"alipay\" bind:click=\"payTypeClick\">\n          <van-radio slot=\"right-icon\" name=\"alipay\" />\n        </van-cell> -->\n      </van-cell-group>\n    </van-radio-group>\n    <block wx:if=\"{{ alipayQrcode }}\">\n      <image src=\"{{ alipayQrcode }}\" mode=\"widthFix\" class=\"alipayQrcode\" show-menu-by-longpress></image>\n      <view class=\"alipayQrcodeText\">{{ $t.payment.alipayQrcodeText }}</view>\n    </block>\n    \n    <view wx:if=\"{{ !alipayQrcode }}\" class=\"btn-box\">\n      <van-button type=\"primary\" block round bind:click=\"submit\">{{ $t.order.toPayTap }}</van-button>\n    </view>\n  </view>\n</van-popup>"
  },
  {
    "path": "components/payment/index.wxss",
    "content": ".pop-main {\n  display: flex;\n  flex-direction: column;\n}\n.title {\n  padding: 32rpx;\n  text-align: center;\n}\n.btn-box {\n  padding: 32rpx;\n}\n.alipayQrcode {\n  margin-left: 50rpx;\n}\n.alipayQrcodeText {\n  text-align: center;\n  color: rgb(201, 25, 48);\n  font-size: 24rpx;\n}\n.amount {\n  padding: 16rpx;\n  text-align: center;\n  color: #e64340;\n  font-weight: bold;\n  font-size: 52rpx;\n}\n.amount text {\n  font-weight: normal;\n  font-size: 28rpx;\n}"
  },
  {
    "path": "components/payment/sn.txt",
    "content": "app.json usingComponents 加上\n\"payment\": \"/components/payment/index\",\n\n\n在需要的页面上加这句代码即可\n<payment\n  money=\"100\"\n  remark=\"支付备注信息\"\n  nextAction=\"\"\n  extData=\"需要同时提交给接口的参数对象\"\n  show=\"{{ paymentShow }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>\n\npaymentOk(e) {\n  console.log(e.detail); // 这里是组件里data的数据\n  this.setData({\n    paymentShow: false\n  })\n},\npaymentCancel() {\n  this.setData({\n    paymentShow: false\n  })\n},"
  },
  {
    "path": "config.js",
    "content": "module.exports = {\n  version: \"26.3.18\",\n  note: '商品存在多SKU的情况下，选择不同的规格，显示不同的规格图片',\n  subDomain: \"beeorder\", // 根据教程 https://www.it120.cc/help/qr6l4m.html 查看并设置你自己的 subDomain\n  merchantId: 27, // 商户ID，可在后台工厂设置-->商户信息查看\n  customerServiceType: 'QW' // 客服类型，QW为企业微信，需要在后台系统参数配置企业ID和客服URL，否则为小程序的默认客服\n}"
  },
  {
    "path": "i18n/en.js",
    "content": "module.exports = {\n  common: {\n    select: 'Select',\n    save: 'Submit',\n    cancel: 'Cancel',\n    confirm: 'Confirm',\n    doubleClick: 'Take a break~',\n    empty: 'No Data',\n    submitSuccess: 'Submitted',\n    gotIt: 'Got it',\n    search: 'Search',\n    searchPlaceholder: 'Enter search keywords',\n    getCodeError: 'Fetch code Fail',\n    loginFail: 'Can\\'t Login',\n    authorizeRequired: 'Need Authorization',\n    authorize: 'Auth',\n    upgrade: 'The new version is ready. Do you want to restart the application?',\n    noNetwork: 'Currently no network available',\n    networkDown: 'Network disconnected',\n    privacyPermission: 'Not agreeing to the user privacy agreement',\n  },\n  auth: {\n    needLogin: 'Please Login First',\n    goAdmin: 'Manager',\n  },\n  date: {\n    year: 'Y',\n    month: 'M',\n    day: 'D',\n    hour: 'H',\n    minutes: 'm',\n  },\n  ad_index: {\n    title: 'Shipping Address',\n    add: 'New Address',\n    empty: 'Address is Empty',\n    pleaseAdd: 'Click to Add Address',\n    linkMan: 'Name',\n    linkManPlaceholder: 'Input Recipient Name',\n    mobile: 'Mobile',\n    mobilePlaceholder: 'Input Mobile',\n    region: 'Region',\n    regionPlaceholder: 'Select Region',\n    location: 'Positioning',\n    address: 'Address',\n    addressPlaceholder: 'Streets, buildings, house signs, etc',\n    apiError: 'Unable to Obtain Data',\n    deleteProfile: 'Are you sure you want to delete this Shipping Address?',\n  },\n  order: {\n    title: 'Orders',\n    cancelProfile: 'Are you sure you want to cancel this order?',\n    scoreNotEnough: 'Your Score are is Not enough!',\n    amountReal: 'Order Amount',\n    balance: 'Balance',\n    payAmount: 'Still need Pay',\n    payScore: 'Score need to be deducted:',\n    noCashAccount: 'Unable to obtain user funding information',\n    status: {\n      st01: 'Canceled',\n      st10: 'To be picked',\n      st11: 'In delivery',\n      st3: 'Completed',\n    },\n    deleteProfile: 'Are you sure you want to delete this order?',\n    empty: {\n      t1: 'You haven\\'t ordered your meal yet',\n      t2: 'Hurry up and reward yourself!',\n      btn: 'Go and order a meal',\n    },\n    dateAdd: 'Order Time',\n    orderNumber: 'Order No',\n    callShop: 'Contact',\n    deleteOrder: 'Delete',\n    cancelOrder: 'Cancel',\n    toPayTap: 'Pay Now',\n    detail: 'Order Detail',\n    askConfirm: 'Are you sure you have received the product?',\n    VerificationCompleted: 'Verification Completed',\n    stausClosed: 'Order has been closed',\n    stausNoPay: 'Waiting to Pay',\n    stausSuccess: 'Transaction completed',\n  },\n  cashLog: {\n    title: 'Fund details',\n  },\n  asset: {\n    title: 'Wallet',\n    recharge: 'Recharge',\n    amount: 'Amount',\n    amountPlaceholder: 'Please enter the recharge amount',\n    confirmBtn: 'Confirm Recharge',\n    success: 'Payment successful',\n    confine: 'Pay',\n    send: 'Send',\n    other: 'Other',\n    rechargeLogs: 'Recharge Records',\n  },\n  booking: {\n    title: 'Booking',\n    name: 'Name',\n    namePlaceholder: 'Enter contact person',\n    mobile: 'Mobile',\n    mobilePlaceholder: 'Convenient for us to contact you',\n    time: 'Arrival',\n    timePlaceholder: 'Select estimated time of arrival',\n    person: 'Person',\n    tip: 'Seat reserved for half an hour, invalid if overdue',\n  },\n  cart: {\n    title: 'Cart',\n    empty: 'No Data',\n    clear: 'Clear All',\n    num: 'Num',\n    btn: 'Submit',\n    ordered: 'Ordered Dishes',\n    tableNum: 'TableNum',\n    Tobeconfirmed: 'To be confirmed',\n    Cooked:'Cooked',\n    Served:'Served',\n    Numofdishes:'Num of dishes',\n    Consumptionamount:'Consumption amount',\n    Payableamount:'Payable amount',\n    Check:'Check',\n  },\n  coupons: {\n    title: 'Coupons',\n    inputpassword:'Input password',\n    Cominglate:'Cominglate',\n    receivedgreedy:'You have received it, you cannot receive it anymore',\n    pointsinsufficient:'Your points are insufficient',\n    Expired :'Expired',\n    Successfullyclaimed :'Success',\n    enternum:'Enter the coupon number',\n    password:'password',\n    Redemption:'Redemption successful',\n    Invitingcoupons:'Inviting you to collect coupons',\n    Vouchers: 'Vouchers',\n    over: 'Over',\n    btn: 'Fetch',\n    expire: 'exp',\n    toUse: 'Use',\n    number: 'Code',\n    numberPlaceholder: 'Please enter the coupon Code',\n    pwd: 'Password',\n    pwdPlaceholder: 'Please enter password',\n    change: 'Exchange',\n  },\n  goodsDetail: {\n    title: 'Product Details',\n    noStores: 'sold out',\n    noSelectSku: 'Please select sku',\n    noSelectAddtion: 'Please select an accessory',\n    buyNumber: 'Purchase quantity',\n    noSelectNumber: 'Please select the purchase quantity',\n    addCartSuccess: 'Add Success',\n    addCartBtn: 'Add to Cart',\n    inviteKanJia: 'Inviting you to help TA negotiate',\n    inviteKanJiaFriend: 'Invite friends to help',\n    kanJiaAmount: 'Successfully helped TA cut it down',\n    kanJiaSetting: 'Bargaining Settings',\n    longTapQrcode: 'Long press to recognize mini program code',\n    qrcodeSaved: 'saved to phone album',\n    commission1: 'Sharing rewards, friends can receive rewards after placing an order',\n    commission2: 'Points reward',\n    commission3: 'Cash rewards',\n    limit: 'Limited',\n    saledNum: 'Sold',\n    originalPrice: 'Original Price',\n    minPrice: 'Min Price',\n    end: 'End',\n    ended: 'Bargaining has ended',\n    help: 'Help',\n    kanjia: 'Bargaining',\n    help2: 'Help',\n    helpPerson: 'Help Person',\n    status: 'Status',\n    joinTime: 'Registration Time',\n    buy: 'Purchase',\n    kanjiaLogs: 'Bargaining Records',\n    helped: 'You have already Helped',\n    helphe: 'Help',\n    buyUseCurPrice: 'Purchase at current price',\n    storeing: 'Replenishing',\n    kanjiaBtn: 'Initiate bargaining | Invite friends to help',\n    saveImage: 'Save to album',\n  },\n  index: {\n    pingtuanNoOpen: 'Grouping function is not enabled',\n    pickup: 'Pickup',\n    Delivery: 'Delivery',\n    shopDetail: 'Merchant Info',\n    minPrice: 'On hand price',\n    noStart: 'Start Later',\n    miaoshaEnd: 'Finished',\n    pingtuan: 'Join',\n    selectSku: 'SKU',\n    submit: 'Selected',\n    selectShop: ' Select Shop',\n    noBusiness: 'no Business',\n    p_persion: 'People Join',\n    p_numsuc: 'Joined',\n    remain: 'Remain',\n    remainToSuccess: ' People, can be successfully',\n    pingSuccess: 'Successfully',\n    originalPriceBuy: 'Original Buy',\n    openNewPingtuan: 'Reopen Group',\n    pingtuanProcess: 'Collaborating process',\n    step1: 'Payment Opening',\n    step2: 'Friend participation',\n    step3: 'Successfully picked up the meal',\n    step4: 'Refund failed',\n    order: 'Ordering',\n    PickingUp: 'Picking Up',\n    ordered: 'Ordered',\n    home: 'Home',\n  },\n  queue: {\n    t: 'Queue',\n    success: 'Successfully',\n    myNumber: 'My Number',\n    ExpectedWaiting: 'Expected Waiting',\n    minutes: 'Minutes',\n  },\n  my: {\n    title: 'My',\n    nickEdit: 'Edit Nick',\n    nickSet: 'Edit Nick',\n    nickRequired: 'Please fill in your Nick',\n    uid: 'UID',\n    userCode: 'Code',\n    score: 'Score',\n    signDaily: 'Daily check-in',\n    scanHx: 'Scan code for verification',\n    youhuimaidan: 'Discount purchase',\n    aboutUs: 'About Us',\n    Contact: 'Contact US',\n    clearStorage: 'Clear Cache',\n  },\n  vip: {\n    title: 'VIP',\n    consumption: 'Total Consumption',\n    notVIP: 'Not VIP',\n    tip: 'Consumption Reaches, Upgrade Automatically',\n    growth: 'Member Growth System',\n    growthName: 'Level',\n    growthDiscount: 'Discount',\n    growthConsumption: 'Consumption',\n    profile: 'Note: When the shopping consumption reaches the specified standard, it will automatically become a member of that level',\n  },\n  feedback: {\n    title: 'Feedback',\n    name: 'Name',\n    namePlaceholder: 'Your Name',\n    nameRequired: 'Please fill in your name',\n    mobile: 'Mobile',\n    mobilePlaceholder: 'Convenient for us to contact you',\n    contentRequired: 'Please fill in feedback information',\n    imageOrVideo: 'Image/Video',\n    contentPlaceholder: 'Please leave your valuable suggestions or feedback~',\n    btn: 'Submit',\n  },\n  notice: {\n    title: 'Notice',\n  },\n  PickingUp: {\n    qudanhao: 'Pickup No',\n    Deliverying: 'Delivering For You',\n    total: 'Total',\n    goodsInfo: 'Goods Info',\n    DeliveryMethod: 'Delivery Method',\n    sf: 'SF Express',\n    remark: 'Remark',\n    remarkPlaceholder: 'If you need to Remark, please enter',\n    goodsAmount: 'goods Amount',\n    freight: 'Freight',\n    realAmount: 'Total payable amount',\n    ConfirmVerification: 'Confirm Verification',\n  },\n  pay: {\n    title: '确认订单',\n    choose: 'Choose coupons',\n    chooseCard: 'Choose Card',\n    inputphoneNO: 'Input phone NO.',\n    select: 'select self pickup/delivery time',\n    address: 'The current address is beyond the delivery range',\n    servicesclosed: 'The dine in and takeout services have been closed',\n    setaddress: 'set delivery address',\n    Receivingaddress: 'Please set the Receiving address',\n    information: 'Unable to obtain user funding information',\n    login: 'Please login first',\n    fetchsuccessful: 'Fetch successful',\n    memberinformation: 'Used to improve member information',\n    Loginsuccessful: 'Login successful',\n    Fullconsumption: 'Full consumption',\n    RMBreduced: 'Yuan can be reduced',\n    reduce: 'Reduce',\n    Mealtime: 'Meal pickup time',\n    Deliverytime: 'Delivery time',\n    Addaddress: 'Add delivery address',\n    Productdetails: 'Product details',\n    Total: 'Total',\n    piecegoods: 'Piece goods',\n    Subtotal: 'Subtotal',\n    Insulationbag: 'Insulation bag',\n    Needbag: 'Need',\n    UNneedbag: 'Unneed',\n    reBind: 'ReBind',\n    DeliveryFee: 'Delivery Fee',\n    remark: 'Remark',\n    remarkPlaceholder: 'If you need a note, please enter it',\n    qisong: ' At least',\n    login: 'Login',\n  },\n  scoreLogs: {\n    title: 'Score Logs',\n  },\n  shop: {\n    characteristic: 'Characteristic',\n    openingHours: 'Business Time',\n    contactUs: 'Contact US',\n    viewMap: 'Open Map',\n    Navigation: 'Navigation',\n    join: 'Merchant Join',\n    name: 'Name',\n    namePlaceholder: 'Your Name',\n    nameRequired: 'Please fill in your name',\n    mobile: 'Mobile',\n    mobilePlaceholder: 'Convenient for us to contact you',\n    mobileRequired: 'Please provide your contact phone number',\n    joinBtn: 'Apply',\n    contentPlaceholder: 'If there is more information, please fill in~',\n    contentRequired: 'Please fill in More information',\n    select: 'Select Shop',\n  },\n  sign: {\n    signed: 'Signed',\n    signSuccess: 'Sign Success',\n    signBtn: 'Sign',\n  },\n  youhuipay: {\n    amountRequired: 'Please fill in the correct consumption amount',\n    curAmount: 'Your current consumption',\n    youhui: 'Discount',\n    askAmount: 'Please ask the waiter and enter',\n    btn: 'Confirm payment',\n    youhuiList: 'Discount information',\n  },\n  goodsList: {\n    t: 'Goods List',\n    sort: {\n      zh: 'Default',\n      xp: 'News',\n      xl: 'Sales',\n      jg: 'Price',\n    }\n  },\n  payment: {\n    order: 'Pay Order',\n    maidan: 'Check',\n    recharge: 'Recharge',\n    select: 'Select Payment',\n    wx: 'WxPay',\n    alipay: 'Alipay',\n    alipayQrcodeText: 'Long press the picture to save, and then use Alipay to scan',\n    notSupport: 'This payment method is not currently supported',\n  },\n  home: {\n    huiyuan: 'VIP0',\n    zq: 'PICK UP',\n    ps: 'Delivery',\n    sc: 'Food',\n    lpk: 'Gift Card',\n    tg: 'Group Buy',\n    bh: 'Stores',\n  },\n  card: {\n    title: 'Gift Card',\n    buy: 'Buy Card',\n    my: 'My Card',\n    empty: 'No Card Sale',\n    buy2: 'BUY',\n    excharge: 'Exchange Card',\n    times: 'CUP',\n    logs: 'Consumption Details',\n    pleaseInputNumber: 'Please enter the redemption code',\n    xieyi: 'Agree to the Gift Card Usage Agreement',\n    xieyi0: 'Please Read And Agree to the Gift Card Usage Agreement',\n    cardShareOpen: 'Send Friend',\n    cardShareClose: 'Cancel Send',\n    shareplaceholder: 'Please have a cup of milk tea~',\n    sending: 'Sending',\n    receiveEmpty: 'The current gift card does not exist or has been claimed',\n    friend: 'Friend',\n    cardShareFetch: 'Accept Your Heart',\n    fetchSuccess: 'The gift card has been deposited into the card bag',\n  }\n}"
  },
  {
    "path": "i18n/index.js",
    "content": "/**\n * 获取当前使用的语言\n */\nfunction getLanguage() {\n  const Language = wx.getStorageSync('Language')\n  if (Language) {\n    return Language\n  }\n  const allowLanguage = ['zh_CN', 'en'] // 目前支持的语言包\n  const appBaseInfo = wx.getAppBaseInfo()\n  let _language = appBaseInfo.language || 'zh_CN'\n  if (!allowLanguage.includes(_language)) {\n    _language = 'zh_CN'\n  }\n  wx.setStorageSync('Language', _language)\n  return _language\n}\nfunction $t(){\n  return require(getLanguage() + '.js');\n}\n\nfunction setTabBarLanguage(){\n  const $t = this.$t()\n  wx.setTabBarItem({\n    index: 0,\n    pagePath: \"pages/home/index\",\n    iconPath: \"images/nav/home-off.png\",\n    selectedIconPath: \"images/nav/home-on.png\",\n    text: $t.index.home\n  })\n  wx.setTabBarItem({\n    index: 1,\n    pagePath: \"pages/index/index\",\n    iconPath: \"images/nav/index-off.png\",\n    selectedIconPath: \"images/nav/index-on.png\",\n    text: $t.index.order\n  })\n\n  wx.setTabBarItem({\n    index: 2,\n    pagePath: \"pages/queue/index\",\n    iconPath: \"images/nav/qh-off.png\",\n    selectedIconPath: \"images/nav/qh-on.png\",\n    text: $t.queue.t\n  })\n\n  wx.setTabBarItem({\n    index: 3,\n    pagePath: \"pages/order-details/doing\",\n    iconPath: \"images/nav/qc-off.png\",\n    selectedIconPath: \"images/nav/qc-on.png\",\n    text: $t.index.PickingUp\n  })\n\n  wx.setTabBarItem({\n    index: 4,\n    pagePath: \"pages/my/index\",\n    iconPath: \"images/nav/my-off.png\",\n    selectedIconPath: \"images/nav/my-on.png\",\n    text: $t.my.title\n  })\n}\nmodule.exports = {\n  setTabBarLanguage: setTabBarLanguage,\n  getLanguage: getLanguage,\n  $t: $t,\n  langs: [\n    {\n      name: '简体中文',\n      code: 'zh_CN'\n    },\n    {\n      name: 'English',\n      code: 'en'\n    }\n  ]\n}"
  },
  {
    "path": "i18n/zh_CN.js",
    "content": "module.exports = {\n  common: {\n    select: '请选择',\n    save: '保存',\n    cancel: '取消',\n    confirm: '确定',\n    doubleClick: '休息一下~',\n    empty: '暂无数据',\n    submitSuccess: '提交成功',\n    gotIt: '知道了',\n    search: '搜索',\n    searchPlaceholder: '输入搜索关键词',\n    getCodeError: '获取code失败',\n    loginFail: '无法登录',\n    authorizeRequired: '需要获得您的授权',\n    authorize: '立即授权',\n    upgrade: '新版本已经准备好，是否重启应用？',\n    noNetwork: '当前无网络',\n    networkDown: '网络已断开',\n    privacyPermission: '未同意用户隐私协议保护协议，暂时无法使用',\n  },\n  auth: {\n    needLogin: '登陆后才能访问',\n    goAdmin: '管理后台',\n  },\n  date: {\n    year: '年',\n    month: '月',\n    day: '日',\n    hour: '点',\n    minutes: '分',\n  },\n  ad_index: {\n    title: '地址管理',\n    add: '新增收货地址',\n    empty: '暂无地址信息',\n    pleaseAdd: '请点击按钮添加地址信息',\n    linkMan: '收件人姓名',\n    linkManPlaceholder: '填写收件人姓名',\n    mobile: '手机号码',\n    mobilePlaceholder: '填写手机号码',\n    region: '选择地区',\n    regionPlaceholder: '选择行政地址（省、市、区县）',\n    location: '选择定位',\n    address: '详细地址',\n    addressPlaceholder: '街道、楼栋、门牌等',\n    apiError: '无法获取快递地址数据',\n    deleteProfile: '确定要删除该收货地址吗？',\n  },\n  order: {\n    title: '全部订单',\n    cancelProfile: '确定要取消该订单吗？',\n    scoreNotEnough: '您的积分不足，无法支付',\n    amountReal: '订单金额',\n    balance: '可用余额',\n    payAmount: '仍需支付',\n    payScore: '需要扣除积分:',\n    noCashAccount: '无法获取用户资金信息',\n    status: {\n      st01: '已取消',\n      st10: '待取餐',\n      st11: '配送中',\n      st3: '已完成',\n    },\n    deleteProfile: '确定要删除该订单吗？',\n    empty: {\n      t1: '您还没有点餐',\n      t2: '快去犒劳一下自己吧！',\n      btn: '去点餐',\n    },\n    dateAdd: '下单时间',\n    orderNumber: '订单编号',\n    callShop: '联系商家',\n    deleteOrder: '删除订单',\n    cancelOrder: '关闭订单',\n    toPayTap: '立即支付',\n    detail: '订单详情',\n    askConfirm: '确认您已收到商品？',\n    VerificationCompleted: '核销完成',\n    stausClosed: '当前订单已关闭',\n    stausNoPay: '等待付款',\n    stausSuccess: '交易完成',\n  },\n  cashLog: {\n    title: '资金明细',\n  },\n  asset: {\n    title: '我的钱包',\n    recharge: '余额充值',\n    amount: '充值金额',\n    amountPlaceholder: '请输入充值金额',\n    confirmBtn: '确认充值',\n    success: '支付成功',\n    confine: '充',\n    send: '送',\n    other: '其他',\n    rechargeLogs: '充值记录',\n  },\n  booking: {\n    title: '在线订位',\n    name: '联系人',\n    namePlaceholder: '请输入联系人',\n    mobile: '联系电话',\n    mobilePlaceholder: '方便我们联系您',\n    time: '到店时间',\n    timePlaceholder: '选择预计到店时间',\n    person: '用餐人数',\n    tip: '座位预留半小时，逾期作废',\n  },\n  cart: {\n    title: '购物车',\n    empty: '暂无菜品',\n    clear: '清空购物车',\n    num: '个商品',\n    btn: '立即下单',\n    ordered: '已点菜品',\n    tableNum: '桌号',\n    Tobeconfirmed: '待确认',\n    Cooked:'已下厨',\n    Served:'已上菜',\n    Numofdishes:'菜品数量',\n    Consumptionamount:'消费金额',\n    Payableamount:'应付金额',\n    Check:'结账买单',\n  },\n  coupons: {\n    title: '优惠券',\n    inputpassword:'请输入口令',\n    Cominglate:'来晚了',\n    receivedgreedy:'你领过了，别贪心哦~',\n    pointsinsufficient:'您的积分不足~',\n    Expired :'已过期~',\n    Successfullyclaimed :'领取成功~',\n    enternum:'请输入券号',\n    password:'请输入密码',\n    Redemption:'兑换成功',\n    Invitingcoupons:'邀您领取优惠券',\n    Vouchers: '代金券',\n    over: '满',\n    btn: '立即领取',\n    expire: '到期',\n    toUse: '立即使用',\n    number: '券号',\n    numberPlaceholder: '请输入券号',\n    pwd: '密码',\n    pwdPlaceholder: '请输入密码',\n    change: '立即兑换',\n  },\n  goodsDetail: {\n    title: '商品详情',\n    noStores: '已售罄',\n    noSelectSku: '请选择规格',\n    noSelectAddtion: '请选择配件',\n    buyNumber: '购买数量',\n    noSelectNumber: '请选择购买数量',\n    addCartSuccess: '加入购物车',\n    addCartBtn: '加入购物车',\n    inviteKanJia: '邀请您帮TA砍价',\n    inviteKanJiaFriend: '邀请朋友帮忙',\n    kanJiaAmount: '成功帮TA砍掉',\n    kanJiaSetting: '砍价设置',\n    longTapQrcode: '长按识别小程序码',\n    qrcodeSaved: '已保存到手机相册',\n    commission1: '分享有赏，好友下单后可得',\n    commission2: '积分奖励',\n    commission3: '现金奖励',\n    limit: '限量',\n    saledNum: '已售',\n    originalPrice: '原价',\n    minPrice: '底价',\n    end: '截止',\n    ended: '砍价已结束',\n    help: '帮',\n    kanjia: '砍价',\n    help2: '帮砍',\n    helpPerson: '帮砍人数',\n    status: '状态',\n    joinTime: '报名时间',\n    buy: '购买',\n    kanjiaLogs: '砍价记录',\n    helped: '您已砍过',\n    helphe: '帮TA砍',\n    buyUseCurPrice: '用当前价购买',\n    storeing: '补货中',\n    kanjiaBtn: '发起砍价｜邀请好友助力',\n    saveImage: '保存到相册',\n  },\n  index: {\n    pingtuanNoOpen: '拼团功能未开启',\n    pickup: '自取',\n    Delivery: '外卖',\n    shopDetail: '查看门店信息',\n    minPrice: '到手价',\n    noStart: '即将开抢',\n    miaoshaEnd: '秒杀结束',\n    pingtuan: '一起拼',\n    selectSku: '选规格',\n    submit: '选好了',\n    selectShop: '获取门店',\n    noBusiness: '未营业',\n    p_persion: '人成单',\n    p_numsuc: '已拼',\n    remain: '差',\n    remainToSuccess: '人，即可拼单成功',\n    pingSuccess: '已拼单成功',\n    originalPriceBuy: '原价购买',\n    openNewPingtuan: '重新开团',\n    pingtuanProcess: '拼单流程',\n    step1: '支付开拼',\n    step2: '好友参与',\n    step3: '成功取餐',\n    step4: '失败退款',\n    order: '点餐',\n    PickingUp: '取餐',\n    ordered: '已点',\n    home: '首页',\n  },\n  queue: {\n    t: '取号',\n    success: '取号成功',\n    myNumber: '我的号子',\n    ExpectedWaiting: '预计等待',\n    minutes: '分钟',\n  },\n  my: {\n    title: '我的',\n    nickEdit: '修改昵称',\n    nickSet: '点击设置昵称',\n    nickRequired: '请填写昵称',\n    uid: '用户ID',\n    userCode: '会员码',\n    score: '积分',\n    signDaily: '每日签到',\n    scanHx: '扫码核销',\n    youhuimaidan: '优惠买单',\n    aboutUs: '关于我们',\n    Contact: '联系客服',\n    clearStorage: '清除缓存',\n  },\n  vip: {\n    title: '会员',\n    consumption: '累计消费',\n    notVIP: '非会员',\n    tip: '消费达到金额可自动成为会员',\n    growth: '会员成长体系',\n    growthName: '级别名称',\n    growthDiscount: '购物折扣',\n    growthConsumption: '消费标准(元)',\n    profile: '注：当购物消费达指定标准自动成为该级别会员',\n  },\n  feedback: {\n    title: '意见反馈',\n    name: '姓名',\n    namePlaceholder: '如何称呼您',\n    nameRequired: '请填写您的姓名',\n    mobile: '联系电话',\n    mobilePlaceholder: '方便我们与您联系',\n    contentRequired: '请填写反馈信息',\n    imageOrVideo: '图片/视频',\n    contentPlaceholder: '请留下您的宝贵建议或意见～',\n    btn: '提交反馈',\n  },\n  notice: {\n    title: '公告',\n  },\n  PickingUp: {\n    qudanhao: '取餐号',\n    Deliverying: '正在为您配送',\n    total: '合计',\n    goodsInfo: '商品信息',\n    DeliveryMethod: '配送方式',\n    sf: '顺丰快递',\n    remark: '留言',\n    remarkPlaceholder: '如需留言请输入',\n    goodsAmount: '商品金额',\n    freight: '运费',\n    realAmount: '应付总额',\n    ConfirmVerification: '确认核销',\n  },\n  pay: {\n    title: '确认订单',\n    choose: '请选择使用优惠券',\n    chooseCard: '选择会员卡',\n    inputphoneNO: '请输入手机号码',\n    select: '请选择自取/配送时间',\n    address: '当前地址超出配送范围',\n    servicesclosed: '堂食和外卖服务已关闭',\n    setaddress: '请设置配送地址',\n    Receivingaddress: '请设置收货地址',\n    information: '无法获取用户资金信息',\n    login: '请先登陆',\n    fetchsuccessful: '读取成功',\n    memberinformation: '用于完善会员资料',\n    Loginsuccessful: '登陆成功',\n    Fullconsumption: '消费满',\n    RMBreduced: '元可减',\n    reduce: '减',\n    Mealtime: '取餐时间',\n    Deliverytime: '送达时间',\n    Addaddress: '新增配送地址',\n    Productdetails: '商品明细',\n    Total: '共计',\n    piecegoods: '件商品',\n    Subtotal: '小计',\n    Insulationbag: '保温袋',\n    Needbag: '需要',\n    UNneedbag: '不需要',\n    reBind: '重新获取',\n    DeliveryFee: '配送费',\n    remark: '备注',\n    remarkPlaceholder: '如需备注请输入',\n    qisong: '起送',\n    login: '授权登陆',\n  },\n  scoreLogs: {\n    title: '积分明细',\n  },\n  shop: {\n    characteristic: '本店特色',\n    openingHours: '营业时间',\n    contactUs: '联系我们',\n    viewMap: '查看地图',\n    Navigation: '导航到店',\n    join: '商家入驻',\n    name: '姓名',\n    namePlaceholder: '如何称呼您',\n    nameRequired: '请填写您的姓名',\n    mobile: '联系电话',\n    mobilePlaceholder: '方便我们与您联系',\n    mobileRequired: '请填写您的联系电话',\n    joinBtn: '申请入驻',\n    contentPlaceholder: '如有更多信息请填写～',\n    contentRequired: '请填写反馈信息',\n    select: '选择门店',\n  },\n  sign: {\n    signed: '已签到',\n    signSuccess: '签到成功',\n    signBtn: '点击签到',\n  },\n  youhuipay: {\n    amountRequired: '请填写正确的消费金额',\n    curAmount: '您本次消费',\n    youhui: '优惠',\n    askAmount: '请询问服务员后输入',\n    btn: '确认付款',\n    youhuiList: '优惠信息',\n  },\n  goodsList: {\n    t: '商品列表',\n    sort: {\n      zh: '综合',\n      xp: '新品',\n      xl: '销量',\n      jg: '价格',\n    }\n  },\n  payment: {\n    order: '支付订单',\n    maidan: '优惠买单',\n    recharge: '在线充值',\n    select: '选择支付方式',\n    wx: '微信支付',\n    alipay: '支付宝支付',\n    alipayQrcodeText: '长按图片保存，然后使用支付宝扫一扫付款',\n    notSupport: '暂不支持该支付方式',\n  },\n  home: {\n    huiyuan: '普通会员',\n    zq: '到店自取',\n    ps: '骑手配送',\n    sc: '食材透明',\n    lpk: '礼品好卡',\n    tg: '超值团购',\n    bh: '精选百货',\n  },\n  card: {\n    title: '礼品卡',\n    buy: '购买礼品卡',\n    my: '我的礼品卡',\n    empty: '暂无礼品卡',\n    buy2: '立即购买',\n    excharge: '兑换礼品卡',\n    times: '杯',\n    logs: '消费明细',\n    pleaseInputNumber: '请输入兑换码',\n    xieyi: '同意《礼品卡使用协议》',\n    xieyi0: '请先阅读并同意《礼品卡使用协议》',\n    cardShareOpen: '送给好友',\n    cardShareClose: '取消赠送',\n    shareplaceholder: '请你喝杯奶茶~',\n    sending: '赠送中',\n    receiveEmpty: '当前礼品卡不存在或已被领取',\n    friend: '好友',\n    cardShareFetch: '收下心意',\n    fetchSuccess: '礼品卡已存入卡包',\n  }\n}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/action-sheet/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/action-sheet/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar button_1 = require(\"../mixins/button\");\n(0, component_1.VantComponent)({\n    classes: ['list-class'],\n    mixins: [button_1.button],\n    props: {\n        show: Boolean,\n        title: String,\n        cancelText: String,\n        description: String,\n        round: {\n            type: Boolean,\n            value: true,\n        },\n        zIndex: {\n            type: Number,\n            value: 100,\n        },\n        actions: {\n            type: Array,\n            value: [],\n        },\n        overlay: {\n            type: Boolean,\n            value: true,\n        },\n        closeOnClickOverlay: {\n            type: Boolean,\n            value: true,\n        },\n        closeOnClickAction: {\n            type: Boolean,\n            value: true,\n        },\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    methods: {\n        onSelect: function (event) {\n            var _this = this;\n            var index = event.currentTarget.dataset.index;\n            var _a = this.data, actions = _a.actions, closeOnClickAction = _a.closeOnClickAction, canIUseGetUserProfile = _a.canIUseGetUserProfile;\n            var item = actions[index];\n            if (item) {\n                this.$emit('select', item);\n                if (closeOnClickAction) {\n                    this.onClose();\n                }\n                if (item.openType === 'getUserInfo' && canIUseGetUserProfile) {\n                    wx.getUserProfile({\n                        desc: item.getUserProfileDesc || '  ',\n                        complete: function (userProfile) {\n                            _this.$emit('getuserinfo', userProfile);\n                        },\n                    });\n                }\n            }\n        },\n        onCancel: function () {\n            this.$emit('cancel');\n        },\n        onClose: function () {\n            this.$emit('close');\n        },\n        onClickOverlay: function () {\n            this.$emit('click-overlay');\n            this.onClose();\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/action-sheet/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-popup\": \"../popup/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/action-sheet/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<van-popup\n  show=\"{{ show }}\"\n  position=\"bottom\"\n  round=\"{{ round }}\"\n  z-index=\"{{ zIndex }}\"\n  overlay=\"{{ overlay }}\"\n  custom-class=\"van-action-sheet custom-class\"\n  safe-area-inset-bottom=\"{{ safeAreaInsetBottom }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  root-portal=\"{{ rootPortal }}\"\n  bind:close=\"onClickOverlay\"\n>\n  <view wx:if=\"{{ title }}\" class=\"van-action-sheet__header\">\n    {{ title }}\n    <van-icon\n      name=\"cross\"\n      custom-class=\"van-action-sheet__close\"\n      bind:click=\"onClose\"\n    />\n  </view>\n  <view wx:if=\"{{ description }}\" class=\"van-action-sheet__description van-hairline--bottom\">\n    {{ description }}\n  </view>\n  <view wx:if=\"{{ actions && actions.length }}\" class=\"list-class\">\n    <!-- button外包一层view，防止actions动态变化，导致渲染时button被打散 -->\n    <button\n      wx:for=\"{{ actions }}\"\n      wx:key=\"index\"\n      open-type=\"{{ item.disabled || item.loading || (canIUseGetUserProfile && item.openType === 'getUserInfo') ? '' : item.openType }}\"\n      style=\"{{ item.color ? 'color: ' + item.color : '' }}\"\n      class=\"{{ utils.bem('action-sheet__item', { disabled: item.disabled || item.loading }) }} {{ item.className || '' }}\"\n      hover-class=\"van-action-sheet__item--hover\"\n      data-index=\"{{ index }}\"\n      bindtap=\"{{ item.disabled || item.loading ? '' : 'onSelect' }}\"\n      bindgetuserinfo=\"onGetUserInfo\"\n      bindcontact=\"onContact\"\n      bindgetphonenumber=\"onGetPhoneNumber\"\n      binderror=\"onError\"\n      bindlaunchapp=\"onLaunchApp\"\n      bindopensetting=\"onOpenSetting\"\n      lang=\"{{ lang }}\"\n      session-from=\"{{ sessionFrom }}\"\n      send-message-title=\"{{ sendMessageTitle }}\"\n      send-message-path=\"{{ sendMessagePath }}\"\n      send-message-img=\"{{ sendMessageImg }}\"\n      show-message-card=\"{{ showMessageCard }}\"\n      app-parameter=\"{{ appParameter }}\"\n    >\n      <block wx:if=\"{{ !item.loading }}\">\n        {{ item.name }}\n        <view wx:if=\"{{ item.subname }}\" class=\"van-action-sheet__subname\" >{{ item.subname }}</view>\n      </block>\n      <van-loading wx:else custom-class=\"van-action-sheet__loading\" size=\"22px\" />\n    </button>\n  </view>\n  <slot />\n  <block wx:if=\"{{ cancelText }}\">\n    <view class=\"van-action-sheet__gap\" />\n    <view\n      class=\"van-action-sheet__cancel\"\n      hover-class=\"van-action-sheet__cancel--hover\"\n      hover-stay-time=\"70\"\n      bind:tap=\"onCancel\"\n    >\n      {{ cancelText }}\n    </view>\n  </block>\n</van-popup>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/action-sheet/index.wxss",
    "content": "@import '../common/index.wxss';.van-action-sheet{color:var(--action-sheet-item-text-color,#323233);max-height:var(--action-sheet-max-height,90%)!important}.van-action-sheet__cancel,.van-action-sheet__item{background-color:var(--action-sheet-item-background,#fff);font-size:var(--action-sheet-item-font-size,16px);line-height:var(--action-sheet-item-line-height,22px);padding:14px 16px;text-align:center}.van-action-sheet__cancel--hover,.van-action-sheet__item--hover{background-color:#f2f3f5}.van-action-sheet__cancel:after,.van-action-sheet__item:after{border-width:0}.van-action-sheet__cancel{color:var(--action-sheet-cancel-text-color,#646566)}.van-action-sheet__gap{background-color:var(--action-sheet-cancel-padding-color,#f7f8fa);display:block;height:var(--action-sheet-cancel-padding-top,8px)}.van-action-sheet__item--disabled{color:var(--action-sheet-item-disabled-text-color,#c8c9cc)}.van-action-sheet__item--disabled.van-action-sheet__item--hover{background-color:var(--action-sheet-item-background,#fff)}.van-action-sheet__subname{color:var(--action-sheet-subname-color,#969799);font-size:var(--action-sheet-subname-font-size,12px);line-height:var(--action-sheet-subname-line-height,20px);margin-top:var(--padding-xs,8px)}.van-action-sheet__header{font-size:var(--action-sheet-header-font-size,16px);font-weight:var(--font-weight-bold,500);line-height:var(--action-sheet-header-height,48px);text-align:center}.van-action-sheet__description{color:var(--action-sheet-description-color,#969799);font-size:var(--action-sheet-description-font-size,14px);line-height:var(--action-sheet-description-line-height,20px);padding:20px var(--padding-md,16px);text-align:center}.van-action-sheet__close{color:var(--action-sheet-close-icon-color,#c8c9cc);font-size:var(--action-sheet-close-icon-size,22px)!important;line-height:inherit!important;padding:var(--action-sheet-close-icon-padding,0 16px);position:absolute!important;right:0;top:0}.van-action-sheet__loading{display:flex!important}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/area/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/area/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar shared_1 = require(\"../picker/shared\");\nvar utils_1 = require(\"../common/utils\");\nvar EMPTY_CODE = '000000';\n(0, component_1.VantComponent)({\n    classes: ['active-class', 'toolbar-class', 'column-class'],\n    props: __assign(__assign({}, shared_1.pickerProps), { showToolbar: {\n            type: Boolean,\n            value: true,\n        }, value: {\n            type: String,\n            observer: function (value) {\n                this.code = value;\n                this.setValues();\n            },\n        }, areaList: {\n            type: Object,\n            value: {},\n            observer: 'setValues',\n        }, columnsNum: {\n            type: null,\n            value: 3,\n        }, columnsPlaceholder: {\n            type: Array,\n            observer: function (val) {\n                this.setData({\n                    typeToColumnsPlaceholder: {\n                        province: val[0] || '',\n                        city: val[1] || '',\n                        county: val[2] || '',\n                    },\n                });\n            },\n        } }),\n    data: {\n        columns: [{ values: [] }, { values: [] }, { values: [] }],\n        typeToColumnsPlaceholder: {},\n    },\n    mounted: function () {\n        var _this = this;\n        (0, utils_1.requestAnimationFrame)(function () {\n            _this.setValues();\n        });\n    },\n    methods: {\n        getPicker: function () {\n            if (this.picker == null) {\n                this.picker = this.selectComponent('.van-area__picker');\n            }\n            return this.picker;\n        },\n        onCancel: function (event) {\n            this.emit('cancel', event.detail);\n        },\n        onConfirm: function (event) {\n            var index = event.detail.index;\n            var value = event.detail.value;\n            value = this.parseValues(value);\n            this.emit('confirm', { value: value, index: index });\n        },\n        emit: function (type, detail) {\n            detail.values = detail.value;\n            delete detail.value;\n            this.$emit(type, detail);\n        },\n        parseValues: function (values) {\n            var columnsPlaceholder = this.data.columnsPlaceholder;\n            return values.map(function (value, index) {\n                if (value &&\n                    (!value.code || value.name === columnsPlaceholder[index])) {\n                    return __assign(__assign({}, value), { code: '', name: '' });\n                }\n                return value;\n            });\n        },\n        onChange: function (event) {\n            var _this = this;\n            var _a;\n            var _b = event.detail, index = _b.index, picker = _b.picker, value = _b.value;\n            this.code = value[index].code;\n            (_a = this.setValues()) === null || _a === void 0 ? void 0 : _a.then(function () {\n                _this.$emit('change', {\n                    picker: picker,\n                    values: _this.parseValues(picker.getValues()),\n                    index: index,\n                });\n            });\n        },\n        getConfig: function (type) {\n            var areaList = this.data.areaList;\n            return (areaList && areaList[\"\".concat(type, \"_list\")]) || {};\n        },\n        getList: function (type, code) {\n            if (type !== 'province' && !code) {\n                return [];\n            }\n            var typeToColumnsPlaceholder = this.data.typeToColumnsPlaceholder;\n            var list = this.getConfig(type);\n            var result = Object.keys(list).map(function (code) { return ({\n                code: code,\n                name: list[code],\n            }); });\n            if (code != null) {\n                // oversea code\n                if (code[0] === '9' && type === 'city') {\n                    code = '9';\n                }\n                result = result.filter(function (item) { return item.code.indexOf(code) === 0; });\n            }\n            if (typeToColumnsPlaceholder[type] && result.length) {\n                // set columns placeholder\n                var codeFill = type === 'province'\n                    ? ''\n                    : type === 'city'\n                        ? EMPTY_CODE.slice(2, 4)\n                        : EMPTY_CODE.slice(4, 6);\n                result.unshift({\n                    code: \"\".concat(code).concat(codeFill),\n                    name: typeToColumnsPlaceholder[type],\n                });\n            }\n            return result;\n        },\n        getIndex: function (type, code) {\n            var compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6;\n            var list = this.getList(type, code.slice(0, compareNum - 2));\n            // oversea code\n            if (code[0] === '9' && type === 'province') {\n                compareNum = 1;\n            }\n            code = code.slice(0, compareNum);\n            for (var i = 0; i < list.length; i++) {\n                if (list[i].code.slice(0, compareNum) === code) {\n                    return i;\n                }\n            }\n            return 0;\n        },\n        setValues: function () {\n            var picker = this.getPicker();\n            if (!picker) {\n                return;\n            }\n            var code = this.code || this.getDefaultCode();\n            var provinceList = this.getList('province');\n            var cityList = this.getList('city', code.slice(0, 2));\n            var stack = [];\n            var indexes = [];\n            var columnsNum = this.data.columnsNum;\n            if (columnsNum >= 1) {\n                stack.push(picker.setColumnValues(0, provinceList, false));\n                indexes.push(this.getIndex('province', code));\n            }\n            if (columnsNum >= 2) {\n                stack.push(picker.setColumnValues(1, cityList, false));\n                indexes.push(this.getIndex('city', code));\n                if (cityList.length && code.slice(2, 4) === '00') {\n                    code = cityList[0].code;\n                }\n            }\n            if (columnsNum === 3) {\n                stack.push(picker.setColumnValues(2, this.getList('county', code.slice(0, 4)), false));\n                indexes.push(this.getIndex('county', code));\n            }\n            return Promise.all(stack)\n                .catch(function () { })\n                .then(function () { return picker.setIndexes(indexes); })\n                .catch(function () { });\n        },\n        getDefaultCode: function () {\n            var columnsPlaceholder = this.data.columnsPlaceholder;\n            if (columnsPlaceholder.length) {\n                return EMPTY_CODE;\n            }\n            var countyCodes = Object.keys(this.getConfig('county'));\n            if (countyCodes[0]) {\n                return countyCodes[0];\n            }\n            var cityCodes = Object.keys(this.getConfig('city'));\n            if (cityCodes[0]) {\n                return cityCodes[0];\n            }\n            return '';\n        },\n        getValues: function () {\n            var picker = this.getPicker();\n            if (!picker) {\n                return [];\n            }\n            return this.parseValues(picker.getValues().filter(function (value) { return !!value; }));\n        },\n        getDetail: function () {\n            var values = this.getValues();\n            var area = {\n                code: '',\n                country: '',\n                province: '',\n                city: '',\n                county: '',\n            };\n            if (!values.length) {\n                return area;\n            }\n            var names = values.map(function (item) { return item.name; });\n            area.code = values[values.length - 1].code;\n            if (area.code[0] === '9') {\n                area.country = names[1] || '';\n                area.province = names[2] || '';\n            }\n            else {\n                area.province = names[0] || '';\n                area.city = names[1] || '';\n                area.county = names[2] || '';\n            }\n            return area;\n        },\n        reset: function (code) {\n            this.code = code || '';\n            return this.setValues();\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/area/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-picker\": \"../picker/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/area/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<van-picker\n  class=\"van-area__picker\"\n  active-class=\"active-class\"\n  toolbar-class=\"toolbar-class\"\n  column-class=\"column-class\"\n  show-toolbar=\"{{ showToolbar }}\"\n  value-key=\"name\"\n  title=\"{{ title }}\"\n  loading=\"{{ loading }}\"\n  columns=\"{{ computed.displayColumns(columns, columnsNum) }}\"\n  item-height=\"{{ itemHeight }}\"\n  visible-item-count=\"{{ visibleItemCount }}\"\n  cancel-button-text=\"{{ cancelButtonText }}\"\n  confirm-button-text=\"{{ confirmButtonText }}\"\n  bind:change=\"onChange\"\n  bind:confirm=\"onConfirm\"\n  bind:cancel=\"onCancel\"\n/>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/area/index.wxs",
    "content": "/* eslint-disable */\nfunction displayColumns(columns, columnsNum) {\n  return columns.slice(0, +columnsNum);\n}\n\nmodule.exports = {\n  displayColumns: displayColumns,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/area/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/button/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/button/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar button_1 = require(\"../mixins/button\");\nvar version_1 = require(\"../common/version\");\nvar mixins = [button_1.button];\nif ((0, version_1.canIUseFormFieldButton)()) {\n    mixins.push('wx://form-field-button');\n}\n(0, component_1.VantComponent)({\n    mixins: mixins,\n    classes: ['hover-class', 'loading-class'],\n    data: {\n        baseStyle: '',\n    },\n    props: {\n        formType: String,\n        icon: String,\n        classPrefix: {\n            type: String,\n            value: 'van-icon',\n        },\n        plain: Boolean,\n        block: Boolean,\n        round: Boolean,\n        square: Boolean,\n        loading: Boolean,\n        hairline: Boolean,\n        disabled: Boolean,\n        loadingText: String,\n        customStyle: String,\n        loadingType: {\n            type: String,\n            value: 'circular',\n        },\n        type: {\n            type: String,\n            value: 'default',\n        },\n        dataset: null,\n        size: {\n            type: String,\n            value: 'normal',\n        },\n        loadingSize: {\n            type: String,\n            value: '20px',\n        },\n        color: String,\n    },\n    methods: {\n        onClick: function (event) {\n            var _this = this;\n            this.$emit('click', event);\n            var _a = this.data, canIUseGetUserProfile = _a.canIUseGetUserProfile, openType = _a.openType, getUserProfileDesc = _a.getUserProfileDesc, lang = _a.lang;\n            if (openType === 'getUserInfo' && canIUseGetUserProfile) {\n                wx.getUserProfile({\n                    desc: getUserProfileDesc || '  ',\n                    lang: lang || 'en',\n                    complete: function (userProfile) {\n                        _this.$emit('getuserinfo', userProfile);\n                    },\n                });\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/button/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/button/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<button\n  id=\"{{ id || buttonId }}\"\n  data-detail=\"{{ dataset }}\"\n  class=\"custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}\"\n  hover-class=\"{{ disabled || loading ? '' : 'van-button--active hover-class'}}\"\n  lang=\"{{ lang }}\"\n  form-type=\"{{ formType }}\"\n  style=\"{{ computed.rootStyle({ plain, color, customStyle }) }}\"\n  open-type=\"{{ disabled || loading || (canIUseGetUserProfile && openType === 'getUserInfo') ? '' : openType }}\"\n  business-id=\"{{ businessId }}\"\n  session-from=\"{{ sessionFrom }}\"\n  send-message-title=\"{{ sendMessageTitle }}\"\n  send-message-path=\"{{ sendMessagePath }}\"\n  send-message-img=\"{{ sendMessageImg }}\"\n  show-message-card=\"{{ showMessageCard }}\"\n  app-parameter=\"{{ appParameter }}\"\n  aria-label=\"{{ ariaLabel }}\"\n  bindtap=\"{{ disabled || loading ? '' : 'onClick' }}\"\n  bindgetuserinfo=\"onGetUserInfo\"\n  bindcontact=\"onContact\"\n  bindgetphonenumber=\"onGetPhoneNumber\"\n  bindgetrealtimephonenumber=\"onGetRealTimePhoneNumber\"\n  bindagreeprivacyauthorization=\"onAgreePrivacyAuthorization\"\n  binderror=\"onError\"\n  bindlaunchapp=\"onLaunchApp\"\n  bindopensetting=\"onOpenSetting\"\n  bindchooseavatar=\"onChooseAvatar\"\n>\n  <block wx:if=\"{{ loading }}\">\n    <van-loading\n      custom-class=\"loading-class\"\n      size=\"{{ loadingSize }}\"\n      type=\"{{ loadingType }}\"\n      color=\"{{ computed.loadingColor({ type, color, plain }) }}\"\n    />\n    <view wx:if=\"{{ loadingText }}\" class=\"van-button__loading-text\">\n      {{ loadingText }}\n    </view>\n  </block>\n  <block wx:else>\n    <van-icon\n      wx:if=\"{{ icon }}\"\n      size=\"1.2em\"\n      name=\"{{ icon }}\"\n      class-prefix=\"{{ classPrefix }}\"\n      class=\"van-button__icon\"\n      custom-style=\"line-height: inherit;\"\n    />\n    <view class=\"van-button__text\">\n      <slot />\n    </view>\n  </block>\n</button>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/button/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\n\nfunction rootStyle(data) {\n  if (!data.color) {\n    return data.customStyle;\n  }\n\n  var properties = {\n    color: data.plain ? data.color : '#fff',\n    background: data.plain ? null : data.color,\n  };\n\n  // hide border when color is linear-gradient\n  if (data.color.indexOf('gradient') !== -1) {\n    properties.border = 0;\n  } else {\n    properties['border-color'] = data.color;\n  }\n\n  return style([properties, data.customStyle]);\n}\n\nfunction loadingColor(data) {\n  if (data.plain) {\n    return data.color ? data.color : '#c9c9c9';\n  }\n\n  if (data.type === 'default') {\n    return '#c9c9c9';\n  }\n\n  return '#fff';\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n  loadingColor: loadingColor,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/button/index.wxss",
    "content": "@import '../common/index.wxss';.van-button{-webkit-text-size-adjust:100%;align-items:center;-webkit-appearance:none;border-radius:var(--button-border-radius,2px);box-sizing:border-box;display:inline-flex;font-size:var(--button-default-font-size,16px);height:var(--button-default-height,44px);justify-content:center;line-height:var(--button-line-height,20px);padding:0;position:relative;text-align:center;transition:opacity .2s;vertical-align:middle}.van-button:before{background-color:#000;border:inherit;border-color:#000;border-radius:inherit;content:\" \";height:100%;left:50%;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{background:var(--button-default-background-color,#fff);border:var(--button-border-width,1px) solid var(--button-default-border-color,#ebedf0);color:var(--button-default-color,#323233)}.van-button--primary{background:var(--button-primary-background-color,#07c160);border:var(--button-border-width,1px) solid var(--button-primary-border-color,#07c160);color:var(--button-primary-color,#fff)}.van-button--info{background:var(--button-info-background-color,#1989fa);border:var(--button-border-width,1px) solid var(--button-info-border-color,#1989fa);color:var(--button-info-color,#fff)}.van-button--danger{background:var(--button-danger-background-color,#ee0a24);border:var(--button-border-width,1px) solid var(--button-danger-border-color,#ee0a24);color:var(--button-danger-color,#fff)}.van-button--warning{background:var(--button-warning-background-color,#ff976a);border:var(--button-border-width,1px) solid var(--button-warning-border-color,#ff976a);color:var(--button-warning-color,#fff)}.van-button--plain{background:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:var(--button-warning-background-color,#ff976a)}.van-button--large{height:var(--button-large-height,50px);width:100%}.van-button--normal{font-size:var(--button-normal-font-size,14px);padding:0 15px}.van-button--small{font-size:var(--button-small-font-size,12px);height:var(--button-small-height,30px);min-width:var(--button-small-min-width,60px);padding:0 var(--padding-xs,8px)}.van-button--mini{display:inline-block;font-size:var(--button-mini-font-size,10px);height:var(--button-mini-height,22px);min-width:var(--button-mini-min-width,50px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:flex;width:100%}.van-button--round{border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{line-height:inherit!important;min-width:1em;vertical-align:top}.van-button--hairline{border-width:0;padding-top:1px}.van-button--hairline:after{border-color:inherit;border-radius:calc(var(--button-border-radius, 2px)*2);border-width:1px}.van-button--hairline.van-button--round:after{border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/calendar.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<view class=\"van-calendar\">\n  <header\n    title=\"{{ title }}\"\n    showTitle=\"{{ showTitle }}\"\n    subtitle=\"{{ subtitle }}\"\n    showSubtitle=\"{{ showSubtitle }}\"\n    firstDayOfWeek=\"{{ firstDayOfWeek }}\"\n    bind:click-subtitle=\"onClickSubtitle\"\n  >\n    <slot name=\"title\" slot=\"title\"></slot>\n  </header>\n\n  <scroll-view\n    class=\"van-calendar__body\"\n    scroll-y\n    scroll-into-view=\"{{ scrollIntoView }}\"\n  >\n    <month\n      wx:for=\"{{ computed.getMonths(minDate, maxDate) }}\"\n      wx:key=\"index\"\n      id=\"month{{ index }}\"\n      class=\"month\"\n      data-date=\"{{ item }}\"\n      date=\"{{ item }}\"\n      type=\"{{ type }}\"\n      color=\"{{ color }}\"\n      minDate=\"{{ minDate }}\"\n      maxDate=\"{{ maxDate }}\"\n      showMark=\"{{ showMark }}\"\n      formatter=\"{{ formatter }}\"\n      rowHeight=\"{{ rowHeight }}\"\n      currentDate=\"{{ currentDate }}\"\n      showSubtitle=\"{{ showSubtitle }}\"\n      allowSameDay=\"{{ allowSameDay }}\"\n      showMonthTitle=\"{{ index !== 0 || !showSubtitle }}\"\n      firstDayOfWeek=\"{{ firstDayOfWeek }}\"\n      bind:click=\"onClickDay\"\n    />\n  </scroll-view>\n\n  <view\n    class=\"{{ utils.bem('calendar__footer', { safeAreaInsetBottom }) }}\"\n  >\n    <slot name=\"footer\"></slot>\n  </view>\n\n  <view\n    class=\"{{ utils.bem('calendar__footer', { safeAreaInsetBottom }) }}\"\n  >\n    <van-button\n      wx:if=\"{{ showConfirm }}\"\n      round\n      block\n      type=\"danger\"\n      color=\"{{ color }}\"\n      custom-class=\"van-calendar__confirm\"\n      disabled=\"{{ computed.getButtonDisabled(type, currentDate, minRange) }}\"\n      nativeType=\"text\"\n      bind:click=\"onConfirm\"\n    >\n      {{\n        computed.getButtonDisabled(type, currentDate, minRange)\n          ? confirmDisabledText\n          : confirmText\n      }}\n    </van-button>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/header/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/header/index.js",
    "content": "\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../../../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        title: {\n            type: String,\n            value: '日期选择',\n        },\n        subtitle: String,\n        showTitle: Boolean,\n        showSubtitle: Boolean,\n        firstDayOfWeek: {\n            type: Number,\n            observer: 'initWeekDay',\n        },\n    },\n    data: {\n        weekdays: [],\n    },\n    created: function () {\n        this.initWeekDay();\n    },\n    methods: {\n        initWeekDay: function () {\n            var defaultWeeks = ['日', '一', '二', '三', '四', '五', '六'];\n            var firstDayOfWeek = this.data.firstDayOfWeek || 0;\n            this.setData({\n                weekdays: __spreadArray(__spreadArray([], defaultWeeks.slice(firstDayOfWeek, 7), true), defaultWeeks.slice(0, firstDayOfWeek), true),\n            });\n        },\n        onClickSubtitle: function (event) {\n            this.$emit('click-subtitle', event);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/header/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/header/index.wxml",
    "content": "<view class=\"van-calendar__header\">\n  <block wx:if=\"{{ showTitle }}\">\n    <view class=\"van-calendar__header-title\"><slot name=\"title\"></slot></view>\n    <view class=\"van-calendar__header-title\">{{ title }}</view>\n  </block>\n\n  <view wx:if=\"{{ showSubtitle }}\" class=\"van-calendar__header-subtitle\" bind:tap=\"onClickSubtitle\">\n    {{ subtitle }}\n  </view>\n\n  <view class=\"van-calendar__weekdays\">\n    <view wx:for=\"{{ weekdays }}\" wx:key=\"index\" class=\"van-calendar__weekday\">\n      {{ item }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/header/index.wxss",
    "content": "@import '../../../common/index.wxss';.van-calendar__header{box-shadow:var(--calendar-header-box-shadow,0 2px 10px hsla(220,1%,50%,.16));flex-shrink:0}.van-calendar__header-subtitle,.van-calendar__header-title{font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:flex}.van-calendar__weekday{flex:1;font-size:var(--calendar-weekdays-font-size,12px);line-height:var(--calendar-weekdays-height,30px);text-align:center}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/month/index.d.ts",
    "content": "export interface Day {\n    date: Date;\n    type: string;\n    text: number;\n    bottomInfo?: string;\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/month/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../../../common/component\");\nvar utils_1 = require(\"../../utils\");\n(0, component_1.VantComponent)({\n    props: {\n        date: {\n            type: null,\n            observer: 'setDays',\n        },\n        type: {\n            type: String,\n            observer: 'setDays',\n        },\n        color: String,\n        minDate: {\n            type: null,\n            observer: 'setDays',\n        },\n        maxDate: {\n            type: null,\n            observer: 'setDays',\n        },\n        showMark: Boolean,\n        rowHeight: null,\n        formatter: {\n            type: null,\n            observer: 'setDays',\n        },\n        currentDate: {\n            type: null,\n            observer: 'setDays',\n        },\n        firstDayOfWeek: {\n            type: Number,\n            observer: 'setDays',\n        },\n        allowSameDay: Boolean,\n        showSubtitle: Boolean,\n        showMonthTitle: Boolean,\n    },\n    data: {\n        visible: true,\n        days: [],\n    },\n    methods: {\n        onClick: function (event) {\n            var index = event.currentTarget.dataset.index;\n            var item = this.data.days[index];\n            if (item.type !== 'disabled') {\n                this.$emit('click', item);\n            }\n        },\n        setDays: function () {\n            var days = [];\n            var startDate = new Date(this.data.date);\n            var year = startDate.getFullYear();\n            var month = startDate.getMonth();\n            var totalDay = (0, utils_1.getMonthEndDay)(startDate.getFullYear(), startDate.getMonth() + 1);\n            for (var day = 1; day <= totalDay; day++) {\n                var date = new Date(year, month, day);\n                var type = this.getDayType(date);\n                var config = {\n                    date: date,\n                    type: type,\n                    text: day,\n                    bottomInfo: this.getBottomInfo(type),\n                };\n                if (this.data.formatter) {\n                    config = this.data.formatter(config);\n                }\n                days.push(config);\n            }\n            this.setData({ days: days });\n        },\n        getMultipleDayType: function (day) {\n            var currentDate = this.data.currentDate;\n            if (!Array.isArray(currentDate)) {\n                return '';\n            }\n            var isSelected = function (date) {\n                return currentDate.some(function (item) { return (0, utils_1.compareDay)(item, date) === 0; });\n            };\n            if (isSelected(day)) {\n                var prevDay = (0, utils_1.getPrevDay)(day);\n                var nextDay = (0, utils_1.getNextDay)(day);\n                var prevSelected = isSelected(prevDay);\n                var nextSelected = isSelected(nextDay);\n                if (prevSelected && nextSelected) {\n                    return 'multiple-middle';\n                }\n                if (prevSelected) {\n                    return 'end';\n                }\n                return nextSelected ? 'start' : 'multiple-selected';\n            }\n            return '';\n        },\n        getRangeDayType: function (day) {\n            var _a = this.data, currentDate = _a.currentDate, allowSameDay = _a.allowSameDay;\n            if (!Array.isArray(currentDate)) {\n                return '';\n            }\n            var startDay = currentDate[0], endDay = currentDate[1];\n            if (!startDay) {\n                return '';\n            }\n            var compareToStart = (0, utils_1.compareDay)(day, startDay);\n            if (!endDay) {\n                return compareToStart === 0 ? 'start' : '';\n            }\n            var compareToEnd = (0, utils_1.compareDay)(day, endDay);\n            if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) {\n                return 'start-end';\n            }\n            if (compareToStart === 0) {\n                return 'start';\n            }\n            if (compareToEnd === 0) {\n                return 'end';\n            }\n            if (compareToStart > 0 && compareToEnd < 0) {\n                return 'middle';\n            }\n            return '';\n        },\n        getDayType: function (day) {\n            var _a = this.data, type = _a.type, minDate = _a.minDate, maxDate = _a.maxDate, currentDate = _a.currentDate;\n            if ((0, utils_1.compareDay)(day, minDate) < 0 || (0, utils_1.compareDay)(day, maxDate) > 0) {\n                return 'disabled';\n            }\n            if (type === 'single') {\n                return (0, utils_1.compareDay)(day, currentDate) === 0 ? 'selected' : '';\n            }\n            if (type === 'multiple') {\n                return this.getMultipleDayType(day);\n            }\n            /* istanbul ignore else */\n            if (type === 'range') {\n                return this.getRangeDayType(day);\n            }\n            return '';\n        },\n        getBottomInfo: function (type) {\n            if (this.data.type === 'range') {\n                if (type === 'start') {\n                    return '开始';\n                }\n                if (type === 'end') {\n                    return '结束';\n                }\n                if (type === 'start-end') {\n                    return '开始/结束';\n                }\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/month/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/month/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\"></wxs>\n<wxs src=\"../../../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-calendar__month\" style=\"{{ computed.getMonthStyle(visible, date, rowHeight) }}\">\n  <view wx:if=\"{{ showMonthTitle }}\" class=\"van-calendar__month-title\">\n    {{ computed.formatMonthTitle(date) }}\n  </view>\n\n  <view wx:if=\"{{ visible }}\" class=\"van-calendar__days\">\n    <view wx:if=\"{{ showMark }}\" class=\"van-calendar__month-mark\">\n      {{ computed.getMark(date) }}\n    </view>\n\n    <view\n      wx:for=\"{{ days }}\"\n      wx:key=\"index\"\n      style=\"{{ computed.getDayStyle(item.type, index, date, rowHeight, color, firstDayOfWeek) }}\"\n      class=\"{{ utils.bem('calendar__day', [item.type]) }} {{ item.className }}\"\n      data-index=\"{{ index }}\"\n      bindtap=\"onClick\"\n    >\n      <view wx:if=\"{{ item.type === 'selected' }}\" class=\"van-calendar__selected-day\" style=\"width: {{ rowHeight }}px; height: {{ rowHeight }}px; background: {{ color }}\">\n        <view wx:if=\"{{ item.topInfo }}\" class=\"van-calendar__top-info\">{{ item.topInfo }}</view>\n        {{ item.text }}\n        <view wx:if=\"{{ item.bottomInfo }}\" class=\"van-calendar__bottom-info\">\n          {{ item.bottomInfo }}\n        </view>\n      </view>\n\n      <view wx:else>\n        <view wx:if=\"{{ item.topInfo }}\" class=\"van-calendar__top-info\">{{ item.topInfo }}</view>\n        {{ item.text }}\n        <view wx:if=\"{{ item.bottomInfo }}\" class=\"van-calendar__bottom-info\">\n          {{ item.bottomInfo }}\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/month/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../../utils.wxs');\n\nfunction getMark(date) {\n  return getDate(date).getMonth() + 1;\n}\n\nvar ROW_HEIGHT = 64;\n\nfunction getDayStyle(type, index, date, rowHeight, color, firstDayOfWeek) {\n  var style = [];\n  var current = getDate(date).getDay() || 7;\n  var offset = current < firstDayOfWeek ? (7 - firstDayOfWeek + current) :\n               current === 7 && firstDayOfWeek === 0 ? 0 :\n               (current - firstDayOfWeek);\n\n  if (index === 0) {\n    style.push(['margin-left', (100 * offset) / 7 + '%']);\n  }\n\n  if (rowHeight !== ROW_HEIGHT) {\n    style.push(['height', rowHeight + 'px']);\n  }\n\n  if (color) {\n    if (\n      type === 'start' ||\n      type === 'end' ||\n      type === 'start-end' ||\n      type === 'multiple-selected' ||\n      type === 'multiple-middle'\n    ) {\n      style.push(['background', color]);\n    } else if (type === 'middle') {\n      style.push(['color', color]);\n    }\n  }\n\n  return style\n    .map(function(item) {\n      return item.join(':');\n    })\n    .join(';');\n}\n\nfunction formatMonthTitle(date) {\n  date = getDate(date);\n  return date.getFullYear() + '年' + (date.getMonth() + 1) + '月';\n}\n\nfunction getMonthStyle(visible, date, rowHeight) {\n  if (!visible) {\n    date = getDate(date);\n\n    var totalDay = utils.getMonthEndDay(\n      date.getFullYear(),\n      date.getMonth() + 1\n    );\n    var offset = getDate(date).getDay();\n    var padding = Math.ceil((totalDay + offset) / 7) * rowHeight;\n\n    return 'padding-bottom:' + padding + 'px';\n  }\n}\n\nmodule.exports = {\n  getMark: getMark,\n  getDayStyle: getDayStyle,\n  formatMonthTitle: formatMonthTitle,\n  getMonthStyle: getMonthStyle\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/components/month/index.wxss",
    "content": "@import '../../../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:100%}.van-calendar__month-title{font-size:var(--calendar-month-title-font-size,14px);font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__days{display:flex;flex-wrap:wrap;position:relative;-webkit-user-select:none;user-select:none}.van-calendar__month-mark{color:var(--calendar-month-mark-color,rgba(242,243,245,.8));font-size:var(--calendar-month-mark-font-size,160px);left:50%;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:0}.van-calendar__day,.van-calendar__selected-day{align-items:center;display:flex;justify-content:center;text-align:center}.van-calendar__day{font-size:var(--calendar-day-font-size,16px);height:var(--calendar-day-height,64px);position:relative;width:14.285%}.van-calendar__day--end,.van-calendar__day--multiple-middle,.van-calendar__day--multiple-selected,.van-calendar__day--start,.van-calendar__day--start-end{background-color:var(--calendar-range-edge-background-color,#ee0a24);color:var(--calendar-range-edge-color,#fff)}.van-calendar__day--start{border-radius:4px 0 0 4px}.van-calendar__day--end{border-radius:0 4px 4px 0}.van-calendar__day--multiple-selected,.van-calendar__day--start-end{border-radius:4px}.van-calendar__day--middle{color:var(--calendar-range-middle-color,#ee0a24)}.van-calendar__day--middle:after{background-color:currentColor;bottom:0;content:\"\";left:0;opacity:var(--calendar-range-middle-background-opacity,.1);position:absolute;right:0;top:0}.van-calendar__day--disabled{color:var(--calendar-day-disabled-color,#c8c9cc);cursor:default}.van-calendar__bottom-info,.van-calendar__top-info{font-size:var(--calendar-info-font-size,10px);left:0;line-height:var(--calendar-info-line-height,14px);position:absolute;right:0}@media (max-width:350px){.van-calendar__bottom-info,.van-calendar__top-info{font-size:9px}}.van-calendar__top-info{top:6px}.van-calendar__bottom-info{bottom:6px}.van-calendar__selected-day{background-color:var(--calendar-selected-day-background-color,#ee0a24);border-radius:4px;color:var(--calendar-selected-day-color,#fff);height:var(--calendar-selected-day-size,54px);width:var(--calendar-selected-day-size,54px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/index.js",
    "content": "\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar utils_1 = require(\"./utils\");\nvar toast_1 = __importDefault(require(\"../toast/toast\"));\nvar utils_2 = require(\"../common/utils\");\nvar initialMinDate = (0, utils_1.getToday)().getTime();\nvar initialMaxDate = (function () {\n    var now = (0, utils_1.getToday)();\n    return new Date(now.getFullYear(), now.getMonth() + 6, now.getDate()).getTime();\n})();\nvar getTime = function (date) {\n    return date instanceof Date ? date.getTime() : date;\n};\n(0, component_1.VantComponent)({\n    props: {\n        title: {\n            type: String,\n            value: '日期选择',\n        },\n        color: String,\n        show: {\n            type: Boolean,\n            observer: function (val) {\n                if (val) {\n                    this.initRect();\n                    this.scrollIntoView();\n                }\n            },\n        },\n        formatter: null,\n        confirmText: {\n            type: String,\n            value: '确定',\n        },\n        confirmDisabledText: {\n            type: String,\n            value: '确定',\n        },\n        rangePrompt: String,\n        showRangePrompt: {\n            type: Boolean,\n            value: true,\n        },\n        defaultDate: {\n            type: null,\n            value: (0, utils_1.getToday)().getTime(),\n            observer: function (val) {\n                this.setData({ currentDate: val });\n                this.scrollIntoView();\n            },\n        },\n        allowSameDay: Boolean,\n        type: {\n            type: String,\n            value: 'single',\n            observer: 'reset',\n        },\n        minDate: {\n            type: Number,\n            value: initialMinDate,\n        },\n        maxDate: {\n            type: Number,\n            value: initialMaxDate,\n        },\n        position: {\n            type: String,\n            value: 'bottom',\n        },\n        rowHeight: {\n            type: null,\n            value: utils_1.ROW_HEIGHT,\n        },\n        round: {\n            type: Boolean,\n            value: true,\n        },\n        poppable: {\n            type: Boolean,\n            value: true,\n        },\n        showMark: {\n            type: Boolean,\n            value: true,\n        },\n        showTitle: {\n            type: Boolean,\n            value: true,\n        },\n        showConfirm: {\n            type: Boolean,\n            value: true,\n        },\n        showSubtitle: {\n            type: Boolean,\n            value: true,\n        },\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n        closeOnClickOverlay: {\n            type: Boolean,\n            value: true,\n        },\n        maxRange: {\n            type: null,\n            value: null,\n        },\n        minRange: {\n            type: Number,\n            value: 1,\n        },\n        firstDayOfWeek: {\n            type: Number,\n            value: 0,\n        },\n        readonly: Boolean,\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    data: {\n        subtitle: '',\n        currentDate: null,\n        scrollIntoView: '',\n    },\n    watch: {\n        minDate: function () {\n            this.initRect();\n        },\n        maxDate: function () {\n            this.initRect();\n        },\n    },\n    created: function () {\n        this.setData({\n            currentDate: this.getInitialDate(this.data.defaultDate),\n        });\n    },\n    mounted: function () {\n        if (this.data.show || !this.data.poppable) {\n            this.initRect();\n            this.scrollIntoView();\n        }\n    },\n    methods: {\n        reset: function () {\n            this.setData({ currentDate: this.getInitialDate(this.data.defaultDate) });\n            this.scrollIntoView();\n        },\n        initRect: function () {\n            var _this = this;\n            if (this.contentObserver != null) {\n                this.contentObserver.disconnect();\n            }\n            var contentObserver = this.createIntersectionObserver({\n                thresholds: [0, 0.1, 0.9, 1],\n                observeAll: true,\n            });\n            this.contentObserver = contentObserver;\n            contentObserver.relativeTo('.van-calendar__body');\n            contentObserver.observe('.month', function (res) {\n                if (res.boundingClientRect.top <= res.relativeRect.top) {\n                    // @ts-ignore\n                    _this.setData({ subtitle: (0, utils_1.formatMonthTitle)(res.dataset.date) });\n                }\n            });\n        },\n        limitDateRange: function (date, minDate, maxDate) {\n            if (minDate === void 0) { minDate = null; }\n            if (maxDate === void 0) { maxDate = null; }\n            minDate = minDate || this.data.minDate;\n            maxDate = maxDate || this.data.maxDate;\n            if ((0, utils_1.compareDay)(date, minDate) === -1) {\n                return minDate;\n            }\n            if ((0, utils_1.compareDay)(date, maxDate) === 1) {\n                return maxDate;\n            }\n            return date;\n        },\n        getInitialDate: function (defaultDate) {\n            var _this = this;\n            if (defaultDate === void 0) { defaultDate = null; }\n            var _a = this.data, type = _a.type, minDate = _a.minDate, maxDate = _a.maxDate, allowSameDay = _a.allowSameDay;\n            if (!defaultDate)\n                return [];\n            var now = (0, utils_1.getToday)().getTime();\n            if (type === 'range') {\n                if (!Array.isArray(defaultDate)) {\n                    defaultDate = [];\n                }\n                var _b = defaultDate || [], startDay = _b[0], endDay = _b[1];\n                var startDate = getTime(startDay || now);\n                var start = this.limitDateRange(startDate, minDate, allowSameDay ? startDate : (0, utils_1.getPrevDay)(new Date(maxDate)).getTime());\n                var date = getTime(endDay || now);\n                var end = this.limitDateRange(date, allowSameDay ? date : (0, utils_1.getNextDay)(new Date(minDate)).getTime());\n                return [start, end];\n            }\n            if (type === 'multiple') {\n                if (Array.isArray(defaultDate)) {\n                    return defaultDate.map(function (date) { return _this.limitDateRange(date); });\n                }\n                return [this.limitDateRange(now)];\n            }\n            if (!defaultDate || Array.isArray(defaultDate)) {\n                defaultDate = now;\n            }\n            return this.limitDateRange(defaultDate);\n        },\n        scrollIntoView: function () {\n            var _this = this;\n            (0, utils_2.requestAnimationFrame)(function () {\n                var _a = _this.data, currentDate = _a.currentDate, type = _a.type, show = _a.show, poppable = _a.poppable, minDate = _a.minDate, maxDate = _a.maxDate;\n                if (!currentDate)\n                    return;\n                // @ts-ignore\n                var targetDate = type === 'single' ? currentDate : currentDate[0];\n                var displayed = show || !poppable;\n                if (!targetDate || !displayed) {\n                    return;\n                }\n                var months = (0, utils_1.getMonths)(minDate, maxDate);\n                months.some(function (month, index) {\n                    if ((0, utils_1.compareMonth)(month, targetDate) === 0) {\n                        _this.setData({ scrollIntoView: \"month\".concat(index) });\n                        return true;\n                    }\n                    return false;\n                });\n            });\n        },\n        onOpen: function () {\n            this.$emit('open');\n        },\n        onOpened: function () {\n            this.$emit('opened');\n        },\n        onClose: function () {\n            this.$emit('close');\n        },\n        onClosed: function () {\n            this.$emit('closed');\n        },\n        onClickDay: function (event) {\n            if (this.data.readonly) {\n                return;\n            }\n            var date = event.detail.date;\n            var _a = this.data, type = _a.type, currentDate = _a.currentDate, allowSameDay = _a.allowSameDay;\n            if (type === 'range') {\n                // @ts-ignore\n                var startDay_1 = currentDate[0], endDay = currentDate[1];\n                if (startDay_1 && !endDay) {\n                    var compareToStart = (0, utils_1.compareDay)(date, startDay_1);\n                    if (compareToStart === 1) {\n                        var days_1 = this.selectComponent('.month').data.days;\n                        days_1.some(function (day, index) {\n                            var isDisabled = day.type === 'disabled' &&\n                                getTime(startDay_1) < getTime(day.date) &&\n                                getTime(day.date) < getTime(date);\n                            if (isDisabled) {\n                                (date = days_1[index - 1].date);\n                            }\n                            return isDisabled;\n                        });\n                        this.select([startDay_1, date], true);\n                    }\n                    else if (compareToStart === -1) {\n                        this.select([date, null]);\n                    }\n                    else if (allowSameDay) {\n                        this.select([date, date], true);\n                    }\n                }\n                else {\n                    this.select([date, null]);\n                }\n            }\n            else if (type === 'multiple') {\n                var selectedIndex_1;\n                // @ts-ignore\n                var selected = currentDate.some(function (dateItem, index) {\n                    var equal = (0, utils_1.compareDay)(dateItem, date) === 0;\n                    if (equal) {\n                        selectedIndex_1 = index;\n                    }\n                    return equal;\n                });\n                if (selected) {\n                    // @ts-ignore\n                    var cancelDate = currentDate.splice(selectedIndex_1, 1);\n                    this.setData({ currentDate: currentDate });\n                    this.unselect(cancelDate);\n                }\n                else {\n                    // @ts-ignore\n                    this.select(__spreadArray(__spreadArray([], currentDate, true), [date], false));\n                }\n            }\n            else {\n                this.select(date, true);\n            }\n        },\n        unselect: function (dateArray) {\n            var date = dateArray[0];\n            if (date) {\n                this.$emit('unselect', (0, utils_1.copyDates)(date));\n            }\n        },\n        select: function (date, complete) {\n            if (complete && this.data.type === 'range') {\n                var valid = this.checkRange(date);\n                if (!valid) {\n                    // auto selected to max range if showConfirm\n                    if (this.data.showConfirm) {\n                        this.emit([\n                            date[0],\n                            (0, utils_1.getDayByOffset)(date[0], this.data.maxRange - 1),\n                        ]);\n                    }\n                    else {\n                        this.emit(date);\n                    }\n                    return;\n                }\n            }\n            this.emit(date);\n            if (complete && !this.data.showConfirm) {\n                this.onConfirm();\n            }\n        },\n        emit: function (date) {\n            this.setData({\n                currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date),\n            });\n            this.$emit('select', (0, utils_1.copyDates)(date));\n        },\n        checkRange: function (date) {\n            var _a = this.data, maxRange = _a.maxRange, rangePrompt = _a.rangePrompt, showRangePrompt = _a.showRangePrompt;\n            if (maxRange && (0, utils_1.calcDateNum)(date) > maxRange) {\n                if (showRangePrompt) {\n                    (0, toast_1.default)({\n                        context: this,\n                        message: rangePrompt || \"\\u9009\\u62E9\\u5929\\u6570\\u4E0D\\u80FD\\u8D85\\u8FC7 \".concat(maxRange, \" \\u5929\"),\n                    });\n                }\n                this.$emit('over-range');\n                return false;\n            }\n            return true;\n        },\n        onConfirm: function () {\n            var _this = this;\n            if (this.data.type === 'range' &&\n                !this.checkRange(this.data.currentDate)) {\n                return;\n            }\n            wx.nextTick(function () {\n                // @ts-ignore\n                _this.$emit('confirm', (0, utils_1.copyDates)(_this.data.currentDate));\n            });\n        },\n        onClickSubtitle: function (event) {\n            this.$emit('click-subtitle', event);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"header\": \"./components/header/index\",\n    \"month\": \"./components/month/index\",\n    \"van-button\": \"../button/index\",\n    \"van-popup\": \"../popup/index\",\n    \"van-toast\": \"../toast/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<import src=\"./calendar.wxml\" />\n\n<van-popup\n  wx:if=\"{{ poppable }}\"\n  custom-class=\"van-calendar__popup--{{ position }}\"\n  close-icon-class=\"van-calendar__close-icon\"\n  show=\"{{ show }}\"\n  round=\"{{ round }}\"\n  position=\"{{ position }}\"\n  closeable=\"{{ showTitle || showSubtitle }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  safe-area-inset-bottom=\"{{ safeAreaInsetBottom }}\"\n  root-portal=\"{{ rootPortal }}\"\n  bind:enter=\"onOpen\"\n  bind:close=\"onClose\"\n  bind:after-enter=\"onOpened\"\n  bind:after-leave=\"onClosed\"\n>\n  <include src=\"./calendar.wxml\" />\n</van-popup>\n\n<include wx:else src=\"./calendar.wxml\" />\n\n<van-toast id=\"van-toast\" />\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('./utils.wxs');\n\nfunction getMonths(minDate, maxDate) {\n  var months = [];\n  var cursor = getDate(minDate);\n\n  cursor.setDate(1);\n\n  do {\n    months.push(cursor.getTime());\n    cursor.setMonth(cursor.getMonth() + 1);\n  } while (utils.compareMonth(cursor, getDate(maxDate)) !== 1);\n\n  return months;\n}\n\nfunction getButtonDisabled(type, currentDate, minRange) {\n  if (currentDate == null) {\n    return true;\n  }\n\n  if (type === 'range') {\n    return !currentDate[0] || !currentDate[1];\n  }\n\n  if (type === 'multiple') {\n    return currentDate.length < minRange;\n  }\n\n  return !currentDate;\n}\n\nmodule.exports = {\n  getMonths: getMonths,\n  getButtonDisabled: getButtonDisabled\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/index.wxss",
    "content": "@import '../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:var(--calendar-height,100%)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:var(--calendar-popup-height,90%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-overflow-scrolling:touch;flex:1;overflow:auto}.van-calendar__footer{flex-shrink:0;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:var(--calendar-confirm-button-height,36px)!important;line-height:var(--calendar-confirm-button-line-height,34px)!important;margin:var(--calendar-confirm-button-margin,7px 0)!important}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/utils.d.ts",
    "content": "export declare const ROW_HEIGHT = 64;\nexport declare function formatMonthTitle(date: Date): string;\nexport declare function compareMonth(date1: Date | number, date2: Date | number): 0 | 1 | -1;\nexport declare function compareDay(day1: Date | number, day2: Date | number): 0 | 1 | -1;\nexport declare function getDayByOffset(date: Date, offset: number): Date;\nexport declare function getPrevDay(date: Date): Date;\nexport declare function getNextDay(date: Date): Date;\nexport declare function getToday(): Date;\nexport declare function calcDateNum(date: [Date, Date]): number;\nexport declare function copyDates(dates: Date | Date[]): Date | Date[];\nexport declare function getMonthEndDay(year: number, month: number): number;\nexport declare function getMonths(minDate: number, maxDate: number): number[];\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/utils.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getMonths = exports.getMonthEndDay = exports.copyDates = exports.calcDateNum = exports.getToday = exports.getNextDay = exports.getPrevDay = exports.getDayByOffset = exports.compareDay = exports.compareMonth = exports.formatMonthTitle = exports.ROW_HEIGHT = void 0;\nexports.ROW_HEIGHT = 64;\nfunction formatMonthTitle(date) {\n    if (!(date instanceof Date)) {\n        date = new Date(date);\n    }\n    return \"\".concat(date.getFullYear(), \"\\u5E74\").concat(date.getMonth() + 1, \"\\u6708\");\n}\nexports.formatMonthTitle = formatMonthTitle;\nfunction compareMonth(date1, date2) {\n    if (!(date1 instanceof Date)) {\n        date1 = new Date(date1);\n    }\n    if (!(date2 instanceof Date)) {\n        date2 = new Date(date2);\n    }\n    var year1 = date1.getFullYear();\n    var year2 = date2.getFullYear();\n    var month1 = date1.getMonth();\n    var month2 = date2.getMonth();\n    if (year1 === year2) {\n        return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;\n    }\n    return year1 > year2 ? 1 : -1;\n}\nexports.compareMonth = compareMonth;\nfunction compareDay(day1, day2) {\n    if (!(day1 instanceof Date)) {\n        day1 = new Date(day1);\n    }\n    if (!(day2 instanceof Date)) {\n        day2 = new Date(day2);\n    }\n    var compareMonthResult = compareMonth(day1, day2);\n    if (compareMonthResult === 0) {\n        var date1 = day1.getDate();\n        var date2 = day2.getDate();\n        return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;\n    }\n    return compareMonthResult;\n}\nexports.compareDay = compareDay;\nfunction getDayByOffset(date, offset) {\n    date = new Date(date);\n    date.setDate(date.getDate() + offset);\n    return date;\n}\nexports.getDayByOffset = getDayByOffset;\nfunction getPrevDay(date) {\n    return getDayByOffset(date, -1);\n}\nexports.getPrevDay = getPrevDay;\nfunction getNextDay(date) {\n    return getDayByOffset(date, 1);\n}\nexports.getNextDay = getNextDay;\nfunction getToday() {\n    var today = new Date();\n    today.setHours(0, 0, 0, 0);\n    return today;\n}\nexports.getToday = getToday;\nfunction calcDateNum(date) {\n    var day1 = new Date(date[0]).getTime();\n    var day2 = new Date(date[1]).getTime();\n    return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;\n}\nexports.calcDateNum = calcDateNum;\nfunction copyDates(dates) {\n    if (Array.isArray(dates)) {\n        return dates.map(function (date) {\n            if (date === null) {\n                return date;\n            }\n            return new Date(date);\n        });\n    }\n    return new Date(dates);\n}\nexports.copyDates = copyDates;\nfunction getMonthEndDay(year, month) {\n    return 32 - new Date(year, month - 1, 32).getDate();\n}\nexports.getMonthEndDay = getMonthEndDay;\nfunction getMonths(minDate, maxDate) {\n    var months = [];\n    var cursor = new Date(minDate);\n    cursor.setDate(1);\n    do {\n        months.push(cursor.getTime());\n        cursor.setMonth(cursor.getMonth() + 1);\n    } while (compareMonth(cursor, maxDate) !== 1);\n    return months;\n}\nexports.getMonths = getMonths;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/calendar/utils.wxs",
    "content": "/* eslint-disable */\nfunction getMonthEndDay(year, month) {\n  return 32 -  getDate(year, month - 1, 32).getDate();\n}\n\nfunction compareMonth(date1, date2) {\n  date1 = getDate(date1);\n  date2 = getDate(date2);\n\n  var year1 = date1.getFullYear();\n  var year2 = date2.getFullYear();\n  var month1 = date1.getMonth();\n  var month2 = date2.getMonth();\n\n  if (year1 === year2) {\n    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;\n  }\n\n  return year1 > year2 ? 1 : -1;\n}\n\nmodule.exports = {\n  getMonthEndDay: getMonthEndDay,\n  compareMonth: compareMonth\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/card/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/card/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar link_1 = require(\"../mixins/link\");\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: [\n        'num-class',\n        'desc-class',\n        'thumb-class',\n        'title-class',\n        'price-class',\n        'origin-price-class',\n    ],\n    mixins: [link_1.link],\n    props: {\n        tag: String,\n        num: String,\n        desc: String,\n        thumb: String,\n        title: String,\n        price: {\n            type: String,\n            observer: 'updatePrice',\n        },\n        centered: Boolean,\n        lazyLoad: Boolean,\n        thumbLink: String,\n        originPrice: String,\n        thumbMode: {\n            type: String,\n            value: 'aspectFit',\n        },\n        currency: {\n            type: String,\n            value: '¥',\n        },\n    },\n    methods: {\n        updatePrice: function () {\n            var price = this.data.price;\n            var priceArr = price.toString().split('.');\n            this.setData({\n                integerStr: priceArr[0],\n                decimalStr: priceArr[1] ? \".\".concat(priceArr[1]) : '',\n            });\n        },\n        onClickThumb: function () {\n            this.jumpLink('thumbLink');\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/card/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-tag\": \"../tag/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/card/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class van-card\">\n  <view class=\"{{ utils.bem('card__header', { center: centered }) }}\">\n    <view class=\"van-card__thumb\" bind:tap=\"onClickThumb\">\n      <image\n        wx:if=\"{{ thumb }}\"\n        src=\"{{ thumb }}\"\n        mode=\"{{ thumbMode }}\"\n        lazy-load=\"{{ lazyLoad }}\"\n        class=\"van-card__img thumb-class\"\n      />\n      <slot wx:else name=\"thumb\" />\n      <van-tag\n        wx:if=\"{{ tag }}\"\n        mark\n        type=\"danger\"\n        custom-class=\"van-card__tag\"\n      >\n        {{ tag }}\n      </van-tag>\n      <slot wx:else name=\"tag\" />\n    </view>\n\n    <view class=\"van-card__content {{ utils.bem('card__content', { center: centered }) }}\">\n      <view>\n        <view wx:if=\"{{ title }}\" class=\"van-card__title title-class\">{{ title }}</view>\n        <slot wx:else name=\"title\" />\n\n        <view wx:if=\"{{ desc }}\" class=\"van-card__desc desc-class\">{{ desc }}</view>\n        <slot wx:else name=\"desc\" />\n\n        <slot name=\"tags\" />\n      </view>\n\n      <view class=\"van-card__bottom\">\n        <slot name=\"price-top\" />\n        <view wx:if=\"{{ price || price === 0 }}\" class=\"van-card__price price-class\">\n          <text>{{ currency }}</text>\n          <text class=\"van-card__price-integer\">{{ integerStr }}</text>\n          <text class=\"van-card__price-decimal\">{{ decimalStr }}</text>\n        </view>\n        <slot wx:else name=\"price\" />\n        <view wx:if=\"{{ originPrice || originPrice === 0 }}\" class=\"van-card__origin-price origin-price-class\">{{ currency }} {{ originPrice }}</view>\n        <slot wx:else name=\"origin-price\" />\n        <view wx:if=\"{{ num }}\" class=\"van-card__num num-class\">x {{ num }}</view>\n        <slot wx:else  name=\"num\" />\n        <slot name=\"bottom\" />\n      </view>\n    </view>\n  </view>\n\n  <view class=\"van-card__footer\">\n    <slot name=\"footer\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/card/index.wxss",
    "content": "@import '../common/index.wxss';.van-card{background-color:var(--card-background-color,#fafafa);box-sizing:border-box;color:var(--card-text-color,#323233);font-size:var(--card-font-size,12px);padding:var(--card-padding,8px 16px);position:relative}.van-card__header{display:flex}.van-card__header--center{align-items:center;justify-content:center}.van-card__thumb{flex:none;height:var(--card-thumb-size,88px);margin-right:var(--padding-xs,8px);position:relative;width:var(--card-thumb-size,88px)}.van-card__thumb:empty{display:none}.van-card__img{border-radius:8px;height:100%;width:100%}.van-card__content{display:flex;flex:1;flex-direction:column;justify-content:space-between;min-height:var(--card-thumb-size,88px);min-width:0;position:relative}.van-card__content--center{justify-content:center}.van-card__desc,.van-card__title{word-wrap:break-word}.van-card__title{font-weight:700;line-height:var(--card-title-line-height,16px)}.van-card__desc{color:var(--card-desc-color,#646566);line-height:var(--card-desc-line-height,20px)}.van-card__bottom{line-height:20px}.van-card__price{color:var(--card-price-color,#ee0a24);display:inline-block;font-size:var(--card-price-font-size,12px);font-weight:700}.van-card__price-integer{font-size:var(--card-price-integer-font-size,16px)}.van-card__price-decimal,.van-card__price-integer{font-family:var(--card-price-font-family,Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif)}.van-card__origin-price{color:var(--card-origin-price-color,#646566);display:inline-block;font-size:var(--card-origin-price-font-size,10px);margin-left:5px;text-decoration:line-through}.van-card__num{float:right}.van-card__tag{left:0;position:absolute!important;top:2px}.van-card__footer{flex:none;text-align:right;width:100%}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cascader/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cascader/index.js",
    "content": "\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar FieldName;\n(function (FieldName) {\n    FieldName[\"TEXT\"] = \"text\";\n    FieldName[\"VALUE\"] = \"value\";\n    FieldName[\"CHILDREN\"] = \"children\";\n})(FieldName || (FieldName = {}));\nvar defaultFieldNames = {\n    text: FieldName.TEXT,\n    value: FieldName.VALUE,\n    children: FieldName.CHILDREN,\n};\n(0, component_1.VantComponent)({\n    props: {\n        title: String,\n        value: {\n            type: String,\n        },\n        placeholder: {\n            type: String,\n            value: '请选择',\n        },\n        activeColor: {\n            type: String,\n            value: '#1989fa',\n        },\n        options: {\n            type: Array,\n            value: [],\n        },\n        swipeable: {\n            type: Boolean,\n            value: false,\n        },\n        closeable: {\n            type: Boolean,\n            value: true,\n        },\n        ellipsis: {\n            type: Boolean,\n            value: true,\n        },\n        showHeader: {\n            type: Boolean,\n            value: true,\n        },\n        closeIcon: {\n            type: String,\n            value: 'cross',\n        },\n        fieldNames: {\n            type: Object,\n            value: defaultFieldNames,\n            observer: 'updateFieldNames',\n        },\n        useTitleSlot: Boolean,\n    },\n    data: {\n        tabs: [],\n        activeTab: 0,\n        textKey: FieldName.TEXT,\n        valueKey: FieldName.VALUE,\n        childrenKey: FieldName.CHILDREN,\n        innerValue: '',\n    },\n    watch: {\n        options: function () {\n            this.updateTabs();\n        },\n        value: function (newVal) {\n            this.updateValue(newVal);\n        },\n    },\n    created: function () {\n        this.updateTabs();\n    },\n    methods: {\n        updateValue: function (val) {\n            var _this = this;\n            if (val !== undefined) {\n                var values = this.data.tabs.map(function (tab) { return tab.selected && tab.selected[_this.data.valueKey]; });\n                if (values.indexOf(val) > -1) {\n                    return;\n                }\n            }\n            this.innerValue = val;\n            this.updateTabs();\n        },\n        updateFieldNames: function () {\n            var _a = this.data.fieldNames || defaultFieldNames, _b = _a.text, text = _b === void 0 ? 'text' : _b, _c = _a.value, value = _c === void 0 ? 'value' : _c, _d = _a.children, children = _d === void 0 ? 'children' : _d;\n            this.setData({\n                textKey: text,\n                valueKey: value,\n                childrenKey: children,\n            });\n        },\n        getSelectedOptionsByValue: function (options, value) {\n            for (var i = 0; i < options.length; i++) {\n                var option = options[i];\n                if (option[this.data.valueKey] === value) {\n                    return [option];\n                }\n                if (option[this.data.childrenKey]) {\n                    var selectedOptions = this.getSelectedOptionsByValue(option[this.data.childrenKey], value);\n                    if (selectedOptions) {\n                        return __spreadArray([option], selectedOptions, true);\n                    }\n                }\n            }\n        },\n        updateTabs: function () {\n            var _this = this;\n            var options = this.data.options;\n            var innerValue = this.innerValue;\n            if (!options.length) {\n                return;\n            }\n            if (innerValue !== undefined) {\n                var selectedOptions = this.getSelectedOptionsByValue(options, innerValue);\n                if (selectedOptions) {\n                    var optionsCursor_1 = options;\n                    var tabs_1 = selectedOptions.map(function (option) {\n                        var tab = {\n                            options: optionsCursor_1,\n                            selected: option,\n                        };\n                        var next = optionsCursor_1.find(function (item) { return item[_this.data.valueKey] === option[_this.data.valueKey]; });\n                        if (next) {\n                            optionsCursor_1 = next[_this.data.childrenKey];\n                        }\n                        return tab;\n                    });\n                    if (optionsCursor_1) {\n                        tabs_1.push({\n                            options: optionsCursor_1,\n                            selected: null,\n                        });\n                    }\n                    this.setData({\n                        tabs: tabs_1,\n                    });\n                    wx.nextTick(function () {\n                        _this.setData({\n                            activeTab: tabs_1.length - 1,\n                        });\n                    });\n                    return;\n                }\n            }\n            this.setData({\n                tabs: [\n                    {\n                        options: options,\n                        selected: null,\n                    },\n                ],\n                activeTab: 0,\n            });\n        },\n        onClose: function () {\n            this.$emit('close');\n        },\n        onClickTab: function (e) {\n            var _a = e.detail, tabIndex = _a.index, title = _a.title;\n            this.$emit('click-tab', { title: title, tabIndex: tabIndex });\n            this.setData({\n                activeTab: tabIndex,\n            });\n        },\n        // 选中\n        onSelect: function (e) {\n            var _this = this;\n            var _a = e.currentTarget.dataset, option = _a.option, tabIndex = _a.tabIndex;\n            if (option && option.disabled) {\n                return;\n            }\n            var _b = this.data, valueKey = _b.valueKey, childrenKey = _b.childrenKey;\n            var tabs = this.data.tabs;\n            tabs[tabIndex].selected = option;\n            if (tabs.length > tabIndex + 1) {\n                tabs = tabs.slice(0, tabIndex + 1);\n            }\n            if (option[childrenKey]) {\n                var nextTab = {\n                    options: option[childrenKey],\n                    selected: null,\n                };\n                if (tabs[tabIndex + 1]) {\n                    tabs[tabIndex + 1] = nextTab;\n                }\n                else {\n                    tabs.push(nextTab);\n                }\n                wx.nextTick(function () {\n                    _this.setData({\n                        activeTab: tabIndex + 1,\n                    });\n                });\n            }\n            this.setData({\n                tabs: tabs,\n            });\n            var selectedOptions = tabs.map(function (tab) { return tab.selected; }).filter(Boolean);\n            var value = option[valueKey];\n            var params = {\n                value: value,\n                tabIndex: tabIndex,\n                selectedOptions: selectedOptions,\n            };\n            this.innerValue = value;\n            this.$emit('change', params);\n            if (!option[childrenKey]) {\n                this.$emit('finish', params);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cascader/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-tab\":  \"../tab/index\",\n    \"van-tabs\": \"../tabs/index\"\n  }\n}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cascader/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"utils\" />\n\n<view wx:if=\"{{ showHeader }}\" class=\"van-cascader__header\">\n  <slot name=\"title\" wx:if=\"{{ useTitleSlot }}\"></slot>\n  <text class=\"van-cascader__title\" wx:else>{{ title }}</text>\n  <van-icon\n    wx:if=\"{{ closeable }}\"\n    name=\"{{ closeIcon }}\"\n    class=\"van-cascader__close-icon\"\n    bind:tap=\"onClose\"\n  />\n</view>\n\n<van-tabs\n  active=\"{{ activeTab }}\"\n  custom-class=\"van-cascader__tabs\"\n  wrap-class=\"van-cascader__tabs-wrap\"\n  tab-class=\"van-cascader__tab\"\n  color=\"{{ activeColor }}\"\n  border=\"{{ false }}\"\n  swipeable=\"{{ swipeable }}\"\n  ellipsis=\"{{ ellipsis }}\"\n  bind:click=\"onClickTab\"\n>\n  <van-tab\n    wx:for=\"{{ tabs }}\"\n    wx:for-item=\"tab\"\n    wx:for-index=\"tabIndex\"\n    wx:key=\"tabIndex\"\n    title=\"{{ tab.selected ? tab.selected[textKey] : placeholder }}\"\n    style=\"width: 100%;\"\n    title-style=\"{{ !tab.selected ? 'color: #969799;font-weight:normal;' : '' }}\"\n  >\n    <!-- 暂不支持 -->\n    <!-- <slot name=\"options-top\"></slot> -->\n\n    <view class=\"van-cascader__options\">\n      <view\n        wx:for=\"{{ tab.options }}\"\n        wx:for-item=\"option\"\n        wx:key=\"index\"\n        class=\"{{ option.className }} {{ utils.optionClass(tab, valueKey, option) }}\"\n        style=\"{{ utils.optionStyle({ tab, valueKey, option, activeColor }) }}\"\n        data-option=\"{{ option }}\"\n        data-tab-index=\"{{ tabIndex }}\"\n        bind:tap=\"onSelect\"\n      >\n        <text>{{ option[textKey] }}</text>\n        <van-icon wx:if=\"{{ utils.isSelected(tab, valueKey, option) }}\" name=\"success\" size=\"18\" />\n      </view>\n    </view>\n    <!-- 暂不支持 -->\n    <!-- <slot name=\"options-bottom\"></slot> -->\n  </van-tab>\n</van-tabs>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cascader/index.wxs",
    "content": "var utils = require('../wxs/utils.wxs');\nvar style = require('../wxs/style.wxs');\n\nfunction isSelected(tab, valueKey, option) {\n  return tab.selected && tab.selected[valueKey] === option[valueKey]\n}\n\nfunction optionClass(tab, valueKey, option) {\n  return utils.bem('cascader__option', { selected: isSelected(tab, valueKey, option), disabled: option.disabled })\n}\n\nfunction optionStyle(data) {\n  var color = data.option.color || (isSelected(data.tab, data.valueKey, data.option) ? data.activeColor : undefined);\n  return style({\n    color\n  });\n}\n\n\nmodule.exports = {\n  isSelected: isSelected,\n  optionClass: optionClass,\n  optionStyle: optionStyle,\n};"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cascader/index.wxss",
    "content": "@import '../common/index.wxss';.van-cascader__header{align-items:center;display:flex;height:48px;justify-content:space-between;padding:0 16px}.van-cascader__title{font-size:16px;font-weight:600;line-height:20px}.van-cascader__close-icon{color:#c8c9cc;font-size:22px;height:22px}.van-cascader__tabs-wrap{height:48px!important;padding:0 8px}.van-cascader__tab{color:#323233!important;flex:none!important;font-weight:600!important;padding:0 8px!important}.van-cascader__tab--unselected{color:#969799!important;font-weight:400!important}.van-cascader__option{align-items:center;cursor:pointer;display:flex;font-size:14px;justify-content:space-between;line-height:20px;padding:10px 16px}.van-cascader__option:active{background-color:#f2f3f5}.van-cascader__option--selected{color:#1989fa;font-weight:600}.van-cascader__option--disabled{color:#c8c9cc;cursor:not-allowed}.van-cascader__option--disabled:active{background-color:initial}.van-cascader__options{-webkit-overflow-scrolling:touch;box-sizing:border-box;height:384px;overflow-y:auto;padding-top:6px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar link_1 = require(\"../mixins/link\");\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: [\n        'title-class',\n        'label-class',\n        'value-class',\n        'right-icon-class',\n        'hover-class',\n    ],\n    mixins: [link_1.link],\n    props: {\n        title: null,\n        value: null,\n        icon: String,\n        size: String,\n        label: String,\n        center: Boolean,\n        isLink: Boolean,\n        required: Boolean,\n        clickable: Boolean,\n        titleWidth: String,\n        customStyle: String,\n        arrowDirection: String,\n        useLabelSlot: Boolean,\n        border: {\n            type: Boolean,\n            value: true,\n        },\n        titleStyle: String,\n    },\n    methods: {\n        onClick: function (event) {\n            this.$emit('click', event.detail);\n            this.jumpLink();\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"custom-class {{ utils.bem('cell', [size, { center, required, borderless: !border, clickable: isLink || clickable }]) }}\"\n  hover-class=\"van-cell--hover hover-class\"\n  hover-stay-time=\"70\"\n  style=\"{{ customStyle }}\"\n  bind:tap=\"onClick\"\n>\n  <van-icon\n    wx:if=\"{{ icon }}\"\n    name=\"{{ icon }}\"\n    class=\"van-cell__left-icon-wrap\"\n    custom-class=\"van-cell__left-icon\"\n  />\n  <slot wx:else name=\"icon\" />\n\n  <view\n    style=\"{{ computed.titleStyle({ titleWidth, titleStyle }) }}\"\n    class=\"van-cell__title title-class\"\n  >\n\n    <block wx:if=\"{{ title }}\">{{ title }}</block>\n    <slot wx:else name=\"title\" />\n\n    <view wx:if=\"{{ label || useLabelSlot }}\" class=\"van-cell__label label-class\">\n      <slot wx:if=\"{{ useLabelSlot }}\" name=\"label\" />\n      <block wx:elif=\"{{ label }}\">{{ label }}</block>\n    </view>\n  </view>\n\n  <view class=\"van-cell__value value-class\">\n    <block wx:if=\"{{ value || value === 0 }}\">{{ value }}</block>\n    <slot wx:else />\n  </view>\n\n  <van-icon\n    wx:if=\"{{ isLink }}\"\n    name=\"{{ arrowDirection ? 'arrow' + '-' + arrowDirection : 'arrow' }}\"\n    class=\"van-cell__right-icon-wrap right-icon-class\"\n    custom-class=\"van-cell__right-icon\"\n  />\n  <slot wx:else name=\"right-icon\" />\n\n  <slot name=\"extra\" />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction titleStyle(data) {\n  return style([\n    {\n      'max-width': addUnit(data.titleWidth),\n      'min-width': addUnit(data.titleWidth),\n    },\n    data.titleStyle,\n  ]);\n}\n\nmodule.exports = {\n  titleStyle: titleStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell/index.wxss",
    "content": "@import '../common/index.wxss';.van-cell{background-color:var(--cell-background-color,#fff);box-sizing:border-box;color:var(--cell-text-color,#323233);display:flex;font-size:var(--cell-font-size,14px);line-height:var(--cell-line-height,24px);padding:var(--cell-vertical-padding,10px) var(--cell-horizontal-padding,16px);position:relative;width:100%}.van-cell:after{border-bottom:1px solid #ebedf0;bottom:0;box-sizing:border-box;content:\" \";left:16px;pointer-events:none;position:absolute;right:16px;transform:scaleY(.5);transform-origin:center}.van-cell--borderless:after{display:none}.van-cell-group{background-color:var(--cell-background-color,#fff)}.van-cell__label{color:var(--cell-label-color,#969799);font-size:var(--cell-label-font-size,12px);line-height:var(--cell-label-line-height,18px);margin-top:var(--cell-label-margin-top,3px)}.van-cell__value{color:var(--cell-value-color,#969799);overflow:hidden;text-align:right;vertical-align:middle}.van-cell__title,.van-cell__value{flex:1}.van-cell__title:empty,.van-cell__value:empty{display:none}.van-cell__left-icon-wrap,.van-cell__right-icon-wrap{align-items:center;display:flex;font-size:var(--cell-icon-size,16px);height:var(--cell-line-height,24px)}.van-cell__left-icon-wrap{margin-right:var(--padding-base,4px)}.van-cell__right-icon-wrap{color:var(--cell-right-icon-color,#969799);margin-left:var(--padding-base,4px)}.van-cell__left-icon{vertical-align:middle}.van-cell__left-icon,.van-cell__right-icon{line-height:var(--cell-line-height,24px)}.van-cell--clickable.van-cell--hover{background-color:var(--cell-active-color,#f2f3f5)}.van-cell--required{overflow:visible}.van-cell--required:before{color:var(--cell-required-color,#ee0a24);content:\"*\";font-size:var(--cell-font-size,14px);left:var(--padding-xs,8px);position:absolute}.van-cell--center{align-items:center}.van-cell--large{padding-bottom:var(--cell-large-vertical-padding,12px);padding-top:var(--cell-large-vertical-padding,12px)}.van-cell--large .van-cell__title{font-size:var(--cell-large-title-font-size,16px)}.van-cell--large .van-cell__value{font-size:var(--cell-large-value-font-size,16px)}.van-cell--large .van-cell__label{font-size:var(--cell-large-label-font-size,14px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell-group/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell-group/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        title: String,\n        border: {\n            type: Boolean,\n            value: true,\n        },\n        inset: Boolean,\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell-group/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell-group/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ title }}\"\n  class=\"{{ utils.bem('cell-group__title', { inset }) }}\"\n>\n  {{ title }}\n</view>\n<view class=\"custom-class {{ utils.bem('cell-group', { inset }) }} {{ border ? 'van-hairline--top-bottom' : '' }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/cell-group/index.wxss",
    "content": "@import '../common/index.wxss';.van-cell-group--inset{border-radius:var(--cell-group-inset-border-radius,8px);margin:var(--cell-group-inset-padding,0 16px);overflow:hidden}.van-cell-group__title{color:var(--cell-group-title-color,#969799);font-size:var(--cell-group-title-font-size,14px);line-height:var(--cell-group-title-line-height,16px);padding:var(--cell-group-title-padding,16px 16px 8px)}.van-cell-group__title--inset{padding:var(--cell-group-inset-title-padding,16px 16px 8px 32px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar relation_1 = require(\"../common/relation\");\nvar component_1 = require(\"../common/component\");\nfunction emit(target, value) {\n    target.$emit('input', value);\n    target.$emit('change', value);\n}\n(0, component_1.VantComponent)({\n    field: true,\n    relation: (0, relation_1.useParent)('checkbox-group'),\n    classes: ['icon-class', 'label-class'],\n    props: {\n        value: Boolean,\n        disabled: Boolean,\n        useIconSlot: Boolean,\n        checkedColor: String,\n        labelPosition: {\n            type: String,\n            value: 'right',\n        },\n        labelDisabled: Boolean,\n        shape: {\n            type: String,\n            value: 'round',\n        },\n        iconSize: {\n            type: null,\n            value: 20,\n        },\n    },\n    data: {\n        parentDisabled: false,\n        direction: 'vertical',\n    },\n    methods: {\n        emitChange: function (value) {\n            if (this.parent) {\n                this.setParentValue(this.parent, value);\n            }\n            else {\n                emit(this, value);\n            }\n        },\n        toggle: function () {\n            var _a = this.data, parentDisabled = _a.parentDisabled, disabled = _a.disabled, value = _a.value;\n            if (!disabled && !parentDisabled) {\n                this.emitChange(!value);\n            }\n        },\n        onClickLabel: function () {\n            var _a = this.data, labelDisabled = _a.labelDisabled, parentDisabled = _a.parentDisabled, disabled = _a.disabled, value = _a.value;\n            if (!disabled && !labelDisabled && !parentDisabled) {\n                this.emitChange(!value);\n            }\n        },\n        setParentValue: function (parent, value) {\n            var parentValue = parent.data.value.slice();\n            var name = this.data.name;\n            var max = parent.data.max;\n            if (value) {\n                if (max && parentValue.length >= max) {\n                    return;\n                }\n                if (parentValue.indexOf(name) === -1) {\n                    parentValue.push(name);\n                    emit(parent, parentValue);\n                }\n            }\n            else {\n                var index = parentValue.indexOf(name);\n                if (index !== -1) {\n                    parentValue.splice(index, 1);\n                    emit(parent, parentValue);\n                }\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"{{ utils.bem('checkbox', [{ horizontal: direction === 'horizontal' }]) }} custom-class\">\n  <view\n    wx:if=\"{{ labelPosition === 'left' }}\"\n    class=\"label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}\"\n    bindtap=\"onClickLabel\"\n  >\n    <slot />\n  </view>\n  <view class=\"van-checkbox__icon-wrap\" bindtap=\"toggle\">\n    <slot wx:if=\"{{ useIconSlot }}\" name=\"icon\" />\n    <van-icon\n      wx:else\n      name=\"success\"\n      size=\"0.8em\"\n      class=\"{{ utils.bem('checkbox__icon', [shape, { disabled: disabled || parentDisabled, checked: value }]) }}\"\n      style=\"{{ computed.iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) }}\"\n      custom-class=\"icon-class\"\n      custom-style=\"line-height: 1.25em;\"\n    />\n  </view>\n  <view\n    wx:if=\"{{ labelPosition === 'right' }}\"\n    class=\"label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}\"\n    bindtap=\"onClickLabel\"\n  >\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) {\n  var styles = {\n    'font-size': addUnit(iconSize),\n  };\n\n  if (checkedColor && value && !disabled && !parentDisabled) {\n    styles['border-color'] = checkedColor;\n    styles['background-color'] = checkedColor;\n  }\n\n  return style(styles);\n}\n\nmodule.exports = {\n  iconStyle: iconStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox/index.wxss",
    "content": "@import '../common/index.wxss';.van-checkbox{align-items:center;display:flex;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox--horizontal{margin-right:12px}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{flex:none}.van-checkbox__icon{align-items:center;border:1px solid var(--checkbox-border-color,#c8c9cc);box-sizing:border-box;color:transparent;display:flex;font-size:var(--checkbox-size,20px);height:1em;justify-content:center;text-align:center;transition-duration:var(--checkbox-transition-duration,.2s);transition-property:color,border-color,background-color;width:1em}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:var(--checkbox-checked-icon-color,#1989fa);color:#fff}.van-checkbox__icon--disabled{background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;color:var(--checkbox-label-color,#323233);padding-left:var(--checkbox-label-margin,10px)}.van-checkbox__label--left{float:left;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox-group/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox-group/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar relation_1 = require(\"../common/relation\");\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    field: true,\n    relation: (0, relation_1.useChildren)('checkbox', function (target) {\n        this.updateChild(target);\n    }),\n    props: {\n        max: Number,\n        value: {\n            type: Array,\n            observer: 'updateChildren',\n        },\n        disabled: {\n            type: Boolean,\n            observer: 'updateChildren',\n        },\n        direction: {\n            type: String,\n            value: 'vertical',\n        },\n    },\n    methods: {\n        updateChildren: function () {\n            var _this = this;\n            this.children.forEach(function (child) { return _this.updateChild(child); });\n        },\n        updateChild: function (child) {\n            var _a = this.data, value = _a.value, disabled = _a.disabled, direction = _a.direction;\n            child.setData({\n                value: value.indexOf(child.data.name) !== -1,\n                parentDisabled: disabled,\n                direction: direction,\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox-group/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox-group/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"{{ utils.bem('checkbox-group', [{ horizontal: direction === 'horizontal' }]) }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/checkbox-group/index.wxss",
    "content": "@import '../common/index.wxss';.van-checkbox-group--horizontal{display:flex;flex-wrap:wrap}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/canvas.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ntype CanvasContext = WechatMiniprogram.CanvasContext;\nexport declare function adaptor(ctx: CanvasContext & Record<string, unknown>): CanvasContext;\nexport {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/canvas.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.adaptor = void 0;\nfunction adaptor(ctx) {\n    // @ts-ignore\n    return Object.assign(ctx, {\n        setStrokeStyle: function (val) {\n            ctx.strokeStyle = val;\n        },\n        setLineWidth: function (val) {\n            ctx.lineWidth = val;\n        },\n        setLineCap: function (val) {\n            ctx.lineCap = val;\n        },\n        setFillStyle: function (val) {\n            ctx.fillStyle = val;\n        },\n        setFontSize: function (val) {\n            ctx.font = String(val);\n        },\n        setGlobalAlpha: function (val) {\n            ctx.globalAlpha = val;\n        },\n        setLineJoin: function (val) {\n            ctx.lineJoin = val;\n        },\n        setTextAlign: function (val) {\n            ctx.textAlign = val;\n        },\n        setMiterLimit: function (val) {\n            ctx.miterLimit = val;\n        },\n        setShadow: function (offsetX, offsetY, blur, color) {\n            ctx.shadowOffsetX = offsetX;\n            ctx.shadowOffsetY = offsetY;\n            ctx.shadowBlur = blur;\n            ctx.shadowColor = color;\n        },\n        setTextBaseline: function (val) {\n            ctx.textBaseline = val;\n        },\n        createCircularGradient: function () { },\n        draw: function () { },\n    });\n}\nexports.adaptor = adaptor;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../common/color\");\nvar component_1 = require(\"../common/component\");\nvar utils_1 = require(\"../common/utils\");\nvar validator_1 = require(\"../common/validator\");\nvar version_1 = require(\"../common/version\");\nvar canvas_1 = require(\"./canvas\");\nfunction format(rate) {\n    return Math.min(Math.max(rate, 0), 100);\n}\nvar PERIMETER = 2 * Math.PI;\nvar BEGIN_ANGLE = -Math.PI / 2;\nvar STEP = 1;\n(0, component_1.VantComponent)({\n    props: {\n        text: String,\n        lineCap: {\n            type: String,\n            value: 'round',\n        },\n        value: {\n            type: Number,\n            value: 0,\n            observer: 'reRender',\n        },\n        speed: {\n            type: Number,\n            value: 50,\n        },\n        size: {\n            type: Number,\n            value: 100,\n            observer: function () {\n                this.drawCircle(this.currentValue);\n            },\n        },\n        fill: String,\n        layerColor: {\n            type: String,\n            value: color_1.WHITE,\n        },\n        color: {\n            type: null,\n            value: color_1.BLUE,\n            observer: function () {\n                var _this = this;\n                this.setHoverColor().then(function () {\n                    _this.drawCircle(_this.currentValue);\n                });\n            },\n        },\n        type: {\n            type: String,\n            value: '',\n        },\n        strokeWidth: {\n            type: Number,\n            value: 4,\n        },\n        clockwise: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        hoverColor: color_1.BLUE,\n    },\n    methods: {\n        getContext: function () {\n            var _this = this;\n            var _a = this.data, type = _a.type, size = _a.size;\n            if (type === '' || !(0, version_1.canIUseCanvas2d)()) {\n                var ctx = wx.createCanvasContext('van-circle', this);\n                return Promise.resolve(ctx);\n            }\n            var dpr = (0, utils_1.getSystemInfoSync)().pixelRatio;\n            return new Promise(function (resolve) {\n                wx.createSelectorQuery()\n                    .in(_this)\n                    .select('#van-circle')\n                    .node()\n                    .exec(function (res) {\n                    var canvas = res[0].node;\n                    var ctx = canvas.getContext(type);\n                    if (!_this.inited) {\n                        _this.inited = true;\n                        canvas.width = size * dpr;\n                        canvas.height = size * dpr;\n                        ctx.scale(dpr, dpr);\n                    }\n                    resolve((0, canvas_1.adaptor)(ctx));\n                });\n            });\n        },\n        setHoverColor: function () {\n            var _this = this;\n            var _a = this.data, color = _a.color, size = _a.size;\n            if ((0, validator_1.isObj)(color)) {\n                return this.getContext().then(function (context) {\n                    if (!context)\n                        return;\n                    var LinearColor = context.createLinearGradient(size, 0, 0, 0);\n                    Object.keys(color)\n                        .sort(function (a, b) { return parseFloat(a) - parseFloat(b); })\n                        .map(function (key) {\n                        return LinearColor.addColorStop(parseFloat(key) / 100, color[key]);\n                    });\n                    _this.hoverColor = LinearColor;\n                });\n            }\n            this.hoverColor = color;\n            return Promise.resolve();\n        },\n        presetCanvas: function (context, strokeStyle, beginAngle, endAngle, fill) {\n            var _a = this.data, strokeWidth = _a.strokeWidth, lineCap = _a.lineCap, clockwise = _a.clockwise, size = _a.size;\n            var position = size / 2;\n            var radius = position - strokeWidth / 2;\n            context.setStrokeStyle(strokeStyle);\n            context.setLineWidth(strokeWidth);\n            context.setLineCap(lineCap);\n            context.beginPath();\n            context.arc(position, position, radius, beginAngle, endAngle, !clockwise);\n            context.stroke();\n            if (fill) {\n                context.setFillStyle(fill);\n                context.fill();\n            }\n        },\n        renderLayerCircle: function (context) {\n            var _a = this.data, layerColor = _a.layerColor, fill = _a.fill;\n            this.presetCanvas(context, layerColor, 0, PERIMETER, fill);\n        },\n        renderHoverCircle: function (context, formatValue) {\n            var clockwise = this.data.clockwise;\n            // 结束角度\n            var progress = PERIMETER * (formatValue / 100);\n            var endAngle = clockwise\n                ? BEGIN_ANGLE + progress\n                : 3 * Math.PI - (BEGIN_ANGLE + progress);\n            this.presetCanvas(context, this.hoverColor, BEGIN_ANGLE, endAngle);\n        },\n        drawCircle: function (currentValue) {\n            var _this = this;\n            var size = this.data.size;\n            this.getContext().then(function (context) {\n                if (!context)\n                    return;\n                context.clearRect(0, 0, size, size);\n                _this.renderLayerCircle(context);\n                var formatValue = format(currentValue);\n                if (formatValue !== 0) {\n                    _this.renderHoverCircle(context, formatValue);\n                }\n                context.draw();\n            });\n        },\n        reRender: function () {\n            var _this = this;\n            // tofector 动画暂时没有想到好的解决方案\n            var _a = this.data, value = _a.value, speed = _a.speed;\n            if (speed <= 0 || speed > 1000) {\n                this.drawCircle(value);\n                return;\n            }\n            this.clearMockInterval();\n            this.currentValue = this.currentValue || 0;\n            var run = function () {\n                _this.interval = setTimeout(function () {\n                    if (_this.currentValue !== value) {\n                        if (Math.abs(_this.currentValue - value) < STEP) {\n                            _this.currentValue = value;\n                        }\n                        else if (_this.currentValue < value) {\n                            _this.currentValue += STEP;\n                        }\n                        else {\n                            _this.currentValue -= STEP;\n                        }\n                        _this.drawCircle(_this.currentValue);\n                        run();\n                    }\n                    else {\n                        _this.clearMockInterval();\n                    }\n                }, 1000 / speed);\n            };\n            run();\n        },\n        clearMockInterval: function () {\n            if (this.interval) {\n                clearTimeout(this.interval);\n                this.interval = null;\n            }\n        },\n    },\n    mounted: function () {\n        var _this = this;\n        this.currentValue = this.data.value;\n        this.setHoverColor().then(function () {\n            _this.drawCircle(_this.currentValue);\n        });\n    },\n    destroyed: function () {\n        this.clearMockInterval();\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-circle\">\n  <canvas class=\"van-circle__canvas\" type=\"{{ type }}\" style=\"width: {{ utils.addUnit(size) }};height:{{ utils.addUnit(size) }}\" id=\"van-circle\" canvas-id=\"van-circle\"></canvas>\n  <view wx:if=\"{{ !text }}\" class=\"van-circle__text\">\n    <slot></slot>\n  </view>\n  <cover-view wx:else class=\"van-circle__text\">{{ text }}</cover-view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/circle/index.wxss",
    "content": "@import '../common/index.wxss';.van-circle{display:inline-block;position:relative;text-align:center}.van-circle__text{color:var(--circle-text-color,#323233);left:0;position:absolute;top:50%;transform:translateY(-50%);width:100%}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/col/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/col/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar relation_1 = require(\"../common/relation\");\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useParent)('row'),\n    props: {\n        span: Number,\n        offset: Number,\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/col/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/col/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"custom-class {{ utils.bem('col', [span]) }} {{ offset ? 'van-col--offset-' + offset : '' }}\"\n  style=\"{{ computed.rootStyle({ gutter }) }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/col/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  if (!data.gutter) {\n    return '';\n  }\n\n  return style({\n    'padding-right': addUnit(data.gutter / 2),\n    'padding-left': addUnit(data.gutter / 2),\n  });\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/col/index.wxss",
    "content": "@import '../common/index.wxss';.van-col{box-sizing:border-box;float:left}.van-col--1{width:4.16666667%}.van-col--offset-1{margin-left:4.16666667%}.van-col--2{width:8.33333333%}.van-col--offset-2{margin-left:8.33333333%}.van-col--3{width:12.5%}.van-col--offset-3{margin-left:12.5%}.van-col--4{width:16.66666667%}.van-col--offset-4{margin-left:16.66666667%}.van-col--5{width:20.83333333%}.van-col--offset-5{margin-left:20.83333333%}.van-col--6{width:25%}.van-col--offset-6{margin-left:25%}.van-col--7{width:29.16666667%}.van-col--offset-7{margin-left:29.16666667%}.van-col--8{width:33.33333333%}.van-col--offset-8{margin-left:33.33333333%}.van-col--9{width:37.5%}.van-col--offset-9{margin-left:37.5%}.van-col--10{width:41.66666667%}.van-col--offset-10{margin-left:41.66666667%}.van-col--11{width:45.83333333%}.van-col--offset-11{margin-left:45.83333333%}.van-col--12{width:50%}.van-col--offset-12{margin-left:50%}.van-col--13{width:54.16666667%}.van-col--offset-13{margin-left:54.16666667%}.van-col--14{width:58.33333333%}.van-col--offset-14{margin-left:58.33333333%}.van-col--15{width:62.5%}.van-col--offset-15{margin-left:62.5%}.van-col--16{width:66.66666667%}.van-col--offset-16{margin-left:66.66666667%}.van-col--17{width:70.83333333%}.van-col--offset-17{margin-left:70.83333333%}.van-col--18{width:75%}.van-col--offset-18{margin-left:75%}.van-col--19{width:79.16666667%}.van-col--offset-19{margin-left:79.16666667%}.van-col--20{width:83.33333333%}.van-col--offset-20{margin-left:83.33333333%}.van-col--21{width:87.5%}.van-col--offset-21{margin-left:87.5%}.van-col--22{width:91.66666667%}.van-col--offset-22{margin-left:91.66666667%}.van-col--23{width:95.83333333%}.van-col--offset-23{margin-left:95.83333333%}.van-col--24{width:100%}.van-col--offset-24{margin-left:100%}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('collapse-item'),\n    props: {\n        value: {\n            type: null,\n            observer: 'updateExpanded',\n        },\n        accordion: {\n            type: Boolean,\n            observer: 'updateExpanded',\n        },\n        border: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    methods: {\n        updateExpanded: function () {\n            this.children.forEach(function (child) {\n                child.updateExpanded();\n            });\n        },\n        switch: function (name, expanded) {\n            var _a = this.data, accordion = _a.accordion, value = _a.value;\n            var changeItem = name;\n            if (!accordion) {\n                name = expanded\n                    ? (value || []).concat(name)\n                    : (value || []).filter(function (activeName) { return activeName !== name; });\n            }\n            else {\n                name = expanded ? name : '';\n            }\n            if (expanded) {\n                this.$emit('open', changeItem);\n            }\n            else {\n                this.$emit('close', changeItem);\n            }\n            this.$emit('change', name);\n            this.$emit('input', name);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse/index.wxml",
    "content": "<view class=\"custom-class van-collapse {{ border ? 'van-hairline--top-bottom' : '' }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/animate.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nexport declare function setContentAnimate(context: WechatMiniprogram.Component.TrivialInstance, expanded: boolean, mounted: boolean): void;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/animate.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setContentAnimate = void 0;\nvar utils_1 = require(\"../common/utils\");\nfunction useAnimation(context, expanded, mounted, height) {\n    var animation = wx.createAnimation({\n        duration: 0,\n        timingFunction: 'ease-in-out',\n    });\n    if (expanded) {\n        if (height === 0) {\n            animation.height('auto').top(1).step();\n        }\n        else {\n            animation\n                .height(height)\n                .top(1)\n                .step({\n                duration: mounted ? 300 : 1,\n            })\n                .height('auto')\n                .step();\n        }\n        context.setData({\n            animation: animation.export(),\n        });\n        return;\n    }\n    animation.height(height).top(0).step({ duration: 1 }).height(0).step({\n        duration: 300,\n    });\n    context.setData({\n        animation: animation.export(),\n    });\n}\nfunction setContentAnimate(context, expanded, mounted) {\n    (0, utils_1.getRect)(context, '.van-collapse-item__content')\n        .then(function (rect) { return rect.height; })\n        .then(function (height) {\n        useAnimation(context, expanded, mounted, height);\n    });\n}\nexports.setContentAnimate = setContentAnimate;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\nvar animate_1 = require(\"./animate\");\n(0, component_1.VantComponent)({\n    classes: ['title-class', 'content-class'],\n    relation: (0, relation_1.useParent)('collapse'),\n    props: {\n        size: String,\n        name: null,\n        title: null,\n        value: null,\n        icon: String,\n        label: String,\n        disabled: Boolean,\n        clickable: Boolean,\n        border: {\n            type: Boolean,\n            value: true,\n        },\n        isLink: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        expanded: false,\n        parentBorder: true,\n    },\n    mounted: function () {\n        this.updateExpanded();\n        this.mounted = true;\n    },\n    methods: {\n        updateExpanded: function () {\n            if (!this.parent) {\n                return;\n            }\n            var _a = this.parent.data, value = _a.value, accordion = _a.accordion, border = _a.border;\n            var _b = this.parent.children, children = _b === void 0 ? [] : _b;\n            var name = this.data.name;\n            var index = children.indexOf(this);\n            var currentName = name == null ? index : name;\n            var expanded = accordion\n                ? value === currentName\n                : (value || []).some(function (name) { return name === currentName; });\n            if (expanded !== this.data.expanded) {\n                (0, animate_1.setContentAnimate)(this, expanded, this.mounted);\n            }\n            this.setData({ index: index, expanded: expanded, parentBorder: border });\n        },\n        onClick: function () {\n            if (this.data.disabled) {\n                return;\n            }\n            var _a = this.data, name = _a.name, expanded = _a.expanded;\n            var index = this.parent.children.indexOf(this);\n            var currentName = name == null ? index : name;\n            this.parent.switch(currentName, !expanded);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-cell\": \"../cell/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-collapse-item custom-class {{ index !== 0 && parentBorder ? 'van-hairline--top' : '' }}\">\n  <van-cell\n    size=\"{{ size }}\"\n    title=\"{{ title }}\"\n    title-class=\"title-class\"\n    icon=\"{{ icon }}\"\n    value=\"{{ value }}\"\n    label=\"{{ label }}\"\n    is-link=\"{{ isLink }}\"\n    clickable=\"{{ clickable }}\"\n    border=\"{{ border && expanded }}\"\n    class=\"{{ utils.bem('collapse-item__title', { disabled, expanded }) }}\"\n    right-icon-class=\"van-cell__right-icon\"\n    custom-class=\"van-cell\"\n    hover-class=\"van-cell--hover\"\n    bind:click=\"onClick\"\n  >\n    <slot\n      name=\"title\"\n      slot=\"title\"\n    />\n    <slot\n      name=\"icon\"\n      slot=\"icon\"\n    />\n    <slot name=\"value\" />\n    <slot\n      name=\"right-icon\"\n      slot=\"right-icon\"\n    />\n  </van-cell>\n  <view\n    class=\"{{ utils.bem('collapse-item__wrapper') }}\"\n    style=\"height: 0;\"\n    animation=\"{{ animation }}\"\n  >\n    <view\n      class=\"van-collapse-item__content content-class\"\n    >\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/collapse-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-collapse-item__title .van-cell__right-icon{transform:rotate(90deg);transition:transform var(--collapse-item-transition-duration,.3s)}.van-collapse-item__title--expanded .van-cell__right-icon{transform:rotate(-90deg)}.van-collapse-item__title--disabled .van-cell,.van-collapse-item__title--disabled .van-cell__right-icon{color:var(--collapse-item-title-disabled-color,#c8c9cc)!important}.van-collapse-item__title--disabled .van-cell--hover{background-color:#fff!important}.van-collapse-item__wrapper{overflow:hidden}.van-collapse-item__content{background-color:var(--collapse-item-content-background-color,#fff);color:var(--collapse-item-content-text-color,#969799);font-size:var(--collapse-item-content-font-size,13px);line-height:var(--collapse-item-content-line-height,1.5);padding:var(--collapse-item-content-padding,15px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/color.d.ts",
    "content": "export declare const RED = \"#ee0a24\";\nexport declare const BLUE = \"#1989fa\";\nexport declare const WHITE = \"#fff\";\nexport declare const GREEN = \"#07c160\";\nexport declare const ORANGE = \"#ff976a\";\nexport declare const GRAY = \"#323233\";\nexport declare const GRAY_DARK = \"#969799\";\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/color.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GRAY_DARK = exports.GRAY = exports.ORANGE = exports.GREEN = exports.WHITE = exports.BLUE = exports.RED = void 0;\nexports.RED = '#ee0a24';\nexports.BLUE = '#1989fa';\nexports.WHITE = '#fff';\nexports.GREEN = '#07c160';\nexports.ORANGE = '#ff976a';\nexports.GRAY = '#323233';\nexports.GRAY_DARK = '#969799';\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/component.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nimport { VantComponentOptions } from 'definitions/index';\ndeclare function VantComponent<Data extends WechatMiniprogram.Component.DataOption, Props extends WechatMiniprogram.Component.PropertyOption, Methods extends WechatMiniprogram.Component.MethodOption>(vantOptions: VantComponentOptions<Data, Props, Methods>): void;\nexport { VantComponent };\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/component.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VantComponent = void 0;\nvar basic_1 = require(\"../mixins/basic\");\nfunction mapKeys(source, target, map) {\n    Object.keys(map).forEach(function (key) {\n        if (source[key]) {\n            target[map[key]] = source[key];\n        }\n    });\n}\nfunction VantComponent(vantOptions) {\n    var options = {};\n    mapKeys(vantOptions, options, {\n        data: 'data',\n        props: 'properties',\n        watch: 'observers',\n        mixins: 'behaviors',\n        methods: 'methods',\n        beforeCreate: 'created',\n        created: 'attached',\n        mounted: 'ready',\n        destroyed: 'detached',\n        classes: 'externalClasses',\n    });\n    // add default externalClasses\n    options.externalClasses = options.externalClasses || [];\n    options.externalClasses.push('custom-class');\n    // add default behaviors\n    options.behaviors = options.behaviors || [];\n    options.behaviors.push(basic_1.basic);\n    // add relations\n    var relation = vantOptions.relation;\n    if (relation) {\n        options.relations = relation.relations;\n        options.behaviors.push(relation.mixin);\n    }\n    // map field to form-field behavior\n    if (vantOptions.field) {\n        options.behaviors.push('wx://form-field');\n    }\n    // add default options\n    options.options = {\n        multipleSlots: true,\n        addGlobalClass: true,\n    };\n    Component(options);\n}\nexports.VantComponent = VantComponent;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/index.wxss",
    "content": ".van-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{clear:both;content:\"\";display:table}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{border:0 solid #ebedf0;bottom:-50%;box-sizing:border-box;content:\" \";left:-50%;pointer-events:none;position:absolute;right:-50%;top:-50%;transform:scale(.5);transform-origin:center}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/relation.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ntype TrivialInstance = WechatMiniprogram.Component.TrivialInstance;\nexport declare function useParent(name: string, onEffect?: (this: TrivialInstance) => void): {\n    relations: {\n        [x: string]: WechatMiniprogram.Component.RelationOption;\n    };\n    mixin: string;\n};\nexport declare function useChildren(name: string, onEffect?: (this: TrivialInstance, target: TrivialInstance) => void): {\n    relations: {\n        [x: string]: WechatMiniprogram.Component.RelationOption;\n    };\n    mixin: string;\n};\nexport {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/relation.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useChildren = exports.useParent = void 0;\nfunction useParent(name, onEffect) {\n    var _a;\n    var path = \"../\".concat(name, \"/index\");\n    return {\n        relations: (_a = {},\n            _a[path] = {\n                type: 'ancestor',\n                linked: function () {\n                    onEffect && onEffect.call(this);\n                },\n                linkChanged: function () {\n                    onEffect && onEffect.call(this);\n                },\n                unlinked: function () {\n                    onEffect && onEffect.call(this);\n                },\n            },\n            _a),\n        mixin: Behavior({\n            created: function () {\n                var _this = this;\n                Object.defineProperty(this, 'parent', {\n                    get: function () { return _this.getRelationNodes(path)[0]; },\n                });\n                Object.defineProperty(this, 'index', {\n                    // @ts-ignore\n                    get: function () { var _a, _b; return (_b = (_a = _this.parent) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.indexOf(_this); },\n                });\n            },\n        }),\n    };\n}\nexports.useParent = useParent;\nfunction useChildren(name, onEffect) {\n    var _a;\n    var path = \"../\".concat(name, \"/index\");\n    return {\n        relations: (_a = {},\n            _a[path] = {\n                type: 'descendant',\n                linked: function (target) {\n                    onEffect && onEffect.call(this, target);\n                },\n                linkChanged: function (target) {\n                    onEffect && onEffect.call(this, target);\n                },\n                unlinked: function (target) {\n                    onEffect && onEffect.call(this, target);\n                },\n            },\n            _a),\n        mixin: Behavior({\n            created: function () {\n                var _this = this;\n                Object.defineProperty(this, 'children', {\n                    get: function () { return _this.getRelationNodes(path) || []; },\n                });\n            },\n        }),\n    };\n}\nexports.useChildren = useChildren;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/clearfix.wxss",
    "content": ".van-clearfix:after{clear:both;content:\"\";display:table}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/ellipsis.wxss",
    "content": ".van-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}.van-multi-ellipsis--l3{-webkit-line-clamp:3}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/hairline.wxss",
    "content": ".van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{border:0 solid #ebedf0;bottom:-50%;box-sizing:border-box;content:\" \";left:-50%;pointer-events:none;position:absolute;right:-50%;top:-50%;transform:scale(.5);transform-origin:center}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/mixins/clearfix.wxss",
    "content": ""
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/mixins/ellipsis.wxss",
    "content": ""
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/mixins/hairline.wxss",
    "content": ""
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/style/var.wxss",
    "content": ""
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/utils.d.ts",
    "content": "/// <reference types=\"node\" />\n/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\nexport { isDef } from './validator';\nexport { getSystemInfoSync } from './version';\nexport declare function range(num: number, min: number, max: number): number;\nexport declare function nextTick(cb: (...args: any[]) => void): void;\nexport declare function addUnit(value?: string | number): string | undefined;\nexport declare function requestAnimationFrame(cb: () => void): NodeJS.Timeout;\nexport declare function pickExclude(obj: unknown, keys: string[]): {};\nexport declare function getRect(context: WechatMiniprogram.Component.TrivialInstance, selector: string): Promise<WechatMiniprogram.BoundingClientRectCallbackResult>;\nexport declare function getAllRect(context: WechatMiniprogram.Component.TrivialInstance, selector: string): Promise<WechatMiniprogram.BoundingClientRectCallbackResult[]>;\nexport declare function groupSetData(context: WechatMiniprogram.Component.TrivialInstance, cb: () => void): void;\nexport declare function toPromise(promiseLike: Promise<unknown> | unknown): Promise<unknown>;\nexport declare function addNumber(num1: any, num2: any): number;\nexport declare const clamp: (num: any, min: any, max: any) => number;\nexport declare function getCurrentPage<T>(): T & WechatMiniprogram.OptionalInterface<WechatMiniprogram.Page.ILifetime> & WechatMiniprogram.Page.InstanceProperties & WechatMiniprogram.Page.InstanceMethods<WechatMiniprogram.IAnyObject> & WechatMiniprogram.Page.Data<WechatMiniprogram.IAnyObject> & WechatMiniprogram.IAnyObject;\nexport declare const isPC: boolean;\nexport declare const isWxWork: boolean;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/utils.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isWxWork = exports.isPC = exports.getCurrentPage = exports.clamp = exports.addNumber = exports.toPromise = exports.groupSetData = exports.getAllRect = exports.getRect = exports.pickExclude = exports.requestAnimationFrame = exports.addUnit = exports.nextTick = exports.range = exports.getSystemInfoSync = exports.isDef = void 0;\nvar validator_1 = require(\"./validator\");\nvar version_1 = require(\"./version\");\nvar validator_2 = require(\"./validator\");\nObject.defineProperty(exports, \"isDef\", { enumerable: true, get: function () { return validator_2.isDef; } });\nvar version_2 = require(\"./version\");\nObject.defineProperty(exports, \"getSystemInfoSync\", { enumerable: true, get: function () { return version_2.getSystemInfoSync; } });\nfunction range(num, min, max) {\n    return Math.min(Math.max(num, min), max);\n}\nexports.range = range;\nfunction nextTick(cb) {\n    if ((0, version_1.canIUseNextTick)()) {\n        wx.nextTick(cb);\n    }\n    else {\n        setTimeout(function () {\n            cb();\n        }, 1000 / 30);\n    }\n}\nexports.nextTick = nextTick;\nfunction addUnit(value) {\n    if (!(0, validator_1.isDef)(value)) {\n        return undefined;\n    }\n    value = String(value);\n    return (0, validator_1.isNumber)(value) ? \"\".concat(value, \"px\") : value;\n}\nexports.addUnit = addUnit;\nfunction requestAnimationFrame(cb) {\n    return setTimeout(function () {\n        cb();\n    }, 1000 / 30);\n}\nexports.requestAnimationFrame = requestAnimationFrame;\nfunction pickExclude(obj, keys) {\n    if (!(0, validator_1.isPlainObject)(obj)) {\n        return {};\n    }\n    return Object.keys(obj).reduce(function (prev, key) {\n        if (!keys.includes(key)) {\n            prev[key] = obj[key];\n        }\n        return prev;\n    }, {});\n}\nexports.pickExclude = pickExclude;\nfunction getRect(context, selector) {\n    return new Promise(function (resolve) {\n        wx.createSelectorQuery()\n            .in(context)\n            .select(selector)\n            .boundingClientRect()\n            .exec(function (rect) {\n            if (rect === void 0) { rect = []; }\n            return resolve(rect[0]);\n        });\n    });\n}\nexports.getRect = getRect;\nfunction getAllRect(context, selector) {\n    return new Promise(function (resolve) {\n        wx.createSelectorQuery()\n            .in(context)\n            .selectAll(selector)\n            .boundingClientRect()\n            .exec(function (rect) {\n            if (rect === void 0) { rect = []; }\n            return resolve(rect[0]);\n        });\n    });\n}\nexports.getAllRect = getAllRect;\nfunction groupSetData(context, cb) {\n    if ((0, version_1.canIUseGroupSetData)()) {\n        context.groupSetData(cb);\n    }\n    else {\n        cb();\n    }\n}\nexports.groupSetData = groupSetData;\nfunction toPromise(promiseLike) {\n    if ((0, validator_1.isPromise)(promiseLike)) {\n        return promiseLike;\n    }\n    return Promise.resolve(promiseLike);\n}\nexports.toPromise = toPromise;\n// 浮点数精度处理\nfunction addNumber(num1, num2) {\n    var cardinal = Math.pow(10, 10);\n    return Math.round((num1 + num2) * cardinal) / cardinal;\n}\nexports.addNumber = addNumber;\n// 限制value在[min, max]之间\nvar clamp = function (num, min, max) { return Math.min(Math.max(num, min), max); };\nexports.clamp = clamp;\nfunction getCurrentPage() {\n    var pages = getCurrentPages();\n    return pages[pages.length - 1];\n}\nexports.getCurrentPage = getCurrentPage;\nexports.isPC = ['mac', 'windows'].includes((0, version_1.getSystemInfoSync)().platform);\n// 是否企业微信\nexports.isWxWork = (0, version_1.getSystemInfoSync)().environment === 'wxwork';\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/validator.d.ts",
    "content": "export declare function isFunction(val: unknown): val is Function;\nexport declare function isPlainObject(val: unknown): val is Record<string, unknown>;\nexport declare function isPromise<T = unknown>(val: unknown): val is Promise<T>;\nexport declare function isDef(value: unknown): boolean;\nexport declare function isObj(x: unknown): x is Record<string, unknown>;\nexport declare function isNumber(value: string): boolean;\nexport declare function isBoolean(value: unknown): value is boolean;\nexport declare function isImageUrl(url: string): boolean;\nexport declare function isVideoUrl(url: string): boolean;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/validator.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isVideoUrl = exports.isImageUrl = exports.isBoolean = exports.isNumber = exports.isObj = exports.isDef = exports.isPromise = exports.isPlainObject = exports.isFunction = void 0;\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isFunction(val) {\n    return typeof val === 'function';\n}\nexports.isFunction = isFunction;\nfunction isPlainObject(val) {\n    return val !== null && typeof val === 'object' && !Array.isArray(val);\n}\nexports.isPlainObject = isPlainObject;\nfunction isPromise(val) {\n    return isPlainObject(val) && isFunction(val.then) && isFunction(val.catch);\n}\nexports.isPromise = isPromise;\nfunction isDef(value) {\n    return value !== undefined && value !== null;\n}\nexports.isDef = isDef;\nfunction isObj(x) {\n    var type = typeof x;\n    return x !== null && (type === 'object' || type === 'function');\n}\nexports.isObj = isObj;\nfunction isNumber(value) {\n    return /^\\d+(\\.\\d+)?$/.test(value);\n}\nexports.isNumber = isNumber;\nfunction isBoolean(value) {\n    return typeof value === 'boolean';\n}\nexports.isBoolean = isBoolean;\nvar IMAGE_REGEXP = /\\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;\nvar VIDEO_REGEXP = /\\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv)/i;\nfunction isImageUrl(url) {\n    return IMAGE_REGEXP.test(url);\n}\nexports.isImageUrl = isImageUrl;\nfunction isVideoUrl(url) {\n    return VIDEO_REGEXP.test(url);\n}\nexports.isVideoUrl = isVideoUrl;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/version.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ninterface WxWorkSystemInfo extends WechatMiniprogram.SystemInfo {\n    environment?: 'wxwork';\n}\ninterface SystemInfo extends WxWorkSystemInfo, WechatMiniprogram.SystemInfo {\n}\nexport declare function getSystemInfoSync(): SystemInfo;\nexport declare function canIUseModel(): boolean;\nexport declare function canIUseFormFieldButton(): boolean;\nexport declare function canIUseAnimate(): boolean;\nexport declare function canIUseGroupSetData(): boolean;\nexport declare function canIUseNextTick(): boolean;\nexport declare function canIUseCanvas2d(): boolean;\nexport declare function canIUseGetUserProfile(): boolean;\nexport {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/common/version.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.canIUseGetUserProfile = exports.canIUseCanvas2d = exports.canIUseNextTick = exports.canIUseGroupSetData = exports.canIUseAnimate = exports.canIUseFormFieldButton = exports.canIUseModel = exports.getSystemInfoSync = void 0;\nvar systemInfo;\nfunction getSystemInfoSync() {\n    if (systemInfo == null) {\n        systemInfo = wx.getSystemInfoSync();\n    }\n    return systemInfo;\n}\nexports.getSystemInfoSync = getSystemInfoSync;\nfunction compareVersion(v1, v2) {\n    v1 = v1.split('.');\n    v2 = v2.split('.');\n    var len = Math.max(v1.length, v2.length);\n    while (v1.length < len) {\n        v1.push('0');\n    }\n    while (v2.length < len) {\n        v2.push('0');\n    }\n    for (var i = 0; i < len; i++) {\n        var num1 = parseInt(v1[i], 10);\n        var num2 = parseInt(v2[i], 10);\n        if (num1 > num2) {\n            return 1;\n        }\n        if (num1 < num2) {\n            return -1;\n        }\n    }\n    return 0;\n}\nfunction gte(version) {\n    var system = getSystemInfoSync();\n    return compareVersion(system.SDKVersion, version) >= 0;\n}\nfunction canIUseModel() {\n    return gte('2.9.3');\n}\nexports.canIUseModel = canIUseModel;\nfunction canIUseFormFieldButton() {\n    return gte('2.10.3');\n}\nexports.canIUseFormFieldButton = canIUseFormFieldButton;\nfunction canIUseAnimate() {\n    return gte('2.9.0');\n}\nexports.canIUseAnimate = canIUseAnimate;\nfunction canIUseGroupSetData() {\n    return gte('2.4.0');\n}\nexports.canIUseGroupSetData = canIUseGroupSetData;\nfunction canIUseNextTick() {\n    try {\n        return wx.canIUse('nextTick');\n    }\n    catch (e) {\n        return gte('2.7.1');\n    }\n}\nexports.canIUseNextTick = canIUseNextTick;\nfunction canIUseCanvas2d() {\n    return gte('2.9.0');\n}\nexports.canIUseCanvas2d = canIUseCanvas2d;\nfunction canIUseGetUserProfile() {\n    return !!wx.getUserProfile;\n}\nexports.canIUseGetUserProfile = canIUseGetUserProfile;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/config-provider/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/config-provider/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        themeVars: {\n            type: Object,\n            value: {},\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/config-provider/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/config-provider/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-config-provider\" style=\"{{ computed.mapThemeVarsToCSSVars(themeVars) }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/config-provider/index.wxs",
    "content": "/* eslint-disable */\nvar object = require('../wxs/object.wxs');\nvar style = require('../wxs/style.wxs');\n\nfunction kebabCase(word) {\n  var newWord = word\n    .replace(getRegExp(\"[A-Z]\", 'g'), function (i) {\n      return '-' + i;\n    })\n    .toLowerCase()\n    .replace(getRegExp(\"^-\"), '');\n\n  return newWord;\n}\n\nfunction mapThemeVarsToCSSVars(themeVars) {\n  var cssVars = {};\n  object.keys(themeVars).forEach(function (key) {\n    var cssVarsKey = '--' + kebabCase(key);\n    cssVars[cssVarsKey] = themeVars[key];\n  });\n\n  return style(cssVars);\n}\n\nmodule.exports = {\n  kebabCase: kebabCase,\n  mapThemeVarsToCSSVars: mapThemeVarsToCSSVars,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar utils_1 = require(\"./utils\");\nfunction simpleTick(fn) {\n    return setTimeout(fn, 30);\n}\n(0, component_1.VantComponent)({\n    props: {\n        useSlot: Boolean,\n        millisecond: Boolean,\n        time: {\n            type: Number,\n            observer: 'reset',\n        },\n        format: {\n            type: String,\n            value: 'HH:mm:ss',\n        },\n        autoStart: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        timeData: (0, utils_1.parseTimeData)(0),\n        formattedTime: '0',\n    },\n    destroyed: function () {\n        clearTimeout(this.tid);\n        this.tid = null;\n    },\n    methods: {\n        // 开始\n        start: function () {\n            if (this.counting) {\n                return;\n            }\n            this.counting = true;\n            this.endTime = Date.now() + this.remain;\n            this.tick();\n        },\n        // 暂停\n        pause: function () {\n            this.counting = false;\n            clearTimeout(this.tid);\n        },\n        // 重置\n        reset: function () {\n            this.pause();\n            this.remain = this.data.time;\n            this.setRemain(this.remain);\n            if (this.data.autoStart) {\n                this.start();\n            }\n        },\n        tick: function () {\n            if (this.data.millisecond) {\n                this.microTick();\n            }\n            else {\n                this.macroTick();\n            }\n        },\n        microTick: function () {\n            var _this = this;\n            this.tid = simpleTick(function () {\n                _this.setRemain(_this.getRemain());\n                if (_this.remain !== 0) {\n                    _this.microTick();\n                }\n            });\n        },\n        macroTick: function () {\n            var _this = this;\n            this.tid = simpleTick(function () {\n                var remain = _this.getRemain();\n                if (!(0, utils_1.isSameSecond)(remain, _this.remain) || remain === 0) {\n                    _this.setRemain(remain);\n                }\n                if (_this.remain !== 0) {\n                    _this.macroTick();\n                }\n            });\n        },\n        getRemain: function () {\n            return Math.max(this.endTime - Date.now(), 0);\n        },\n        setRemain: function (remain) {\n            this.remain = remain;\n            var timeData = (0, utils_1.parseTimeData)(remain);\n            if (this.data.useSlot) {\n                this.$emit('change', timeData);\n            }\n            this.setData({\n                formattedTime: (0, utils_1.parseFormat)(this.data.format, timeData),\n            });\n            if (remain === 0) {\n                this.pause();\n                this.$emit('finish');\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/index.wxml",
    "content": "<view class=\"van-count-down\">\n  <slot wx:if=\"{{ useSlot }}\"/>\n  <block wx:else>{{ formattedTime }}</block>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/index.wxss",
    "content": "@import '../common/index.wxss';.van-count-down{color:var(--count-down-text-color,#323233);font-size:var(--count-down-font-size,14px);line-height:var(--count-down-line-height,20px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/utils.d.ts",
    "content": "export type TimeData = {\n    days: number;\n    hours: number;\n    minutes: number;\n    seconds: number;\n    milliseconds: number;\n};\nexport declare function parseTimeData(time: number): TimeData;\nexport declare function parseFormat(format: string, timeData: TimeData): string;\nexport declare function isSameSecond(time1: number, time2: number): boolean;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/count-down/utils.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSameSecond = exports.parseFormat = exports.parseTimeData = void 0;\nfunction padZero(num, targetLength) {\n    if (targetLength === void 0) { targetLength = 2; }\n    var str = num + '';\n    while (str.length < targetLength) {\n        str = '0' + str;\n    }\n    return str;\n}\nvar SECOND = 1000;\nvar MINUTE = 60 * SECOND;\nvar HOUR = 60 * MINUTE;\nvar DAY = 24 * HOUR;\nfunction parseTimeData(time) {\n    var days = Math.floor(time / DAY);\n    var hours = Math.floor((time % DAY) / HOUR);\n    var minutes = Math.floor((time % HOUR) / MINUTE);\n    var seconds = Math.floor((time % MINUTE) / SECOND);\n    var milliseconds = Math.floor(time % SECOND);\n    return {\n        days: days,\n        hours: hours,\n        minutes: minutes,\n        seconds: seconds,\n        milliseconds: milliseconds,\n    };\n}\nexports.parseTimeData = parseTimeData;\nfunction parseFormat(format, timeData) {\n    var days = timeData.days;\n    var hours = timeData.hours, minutes = timeData.minutes, seconds = timeData.seconds, milliseconds = timeData.milliseconds;\n    if (format.indexOf('DD') === -1) {\n        hours += days * 24;\n    }\n    else {\n        format = format.replace('DD', padZero(days));\n    }\n    if (format.indexOf('HH') === -1) {\n        minutes += hours * 60;\n    }\n    else {\n        format = format.replace('HH', padZero(hours));\n    }\n    if (format.indexOf('mm') === -1) {\n        seconds += minutes * 60;\n    }\n    else {\n        format = format.replace('mm', padZero(minutes));\n    }\n    if (format.indexOf('ss') === -1) {\n        milliseconds += seconds * 1000;\n    }\n    else {\n        format = format.replace('ss', padZero(seconds));\n    }\n    return format.replace('SSS', padZero(milliseconds, 3));\n}\nexports.parseFormat = parseFormat;\nfunction isSameSecond(time1, time2) {\n    return Math.floor(time1 / 1000) === Math.floor(time2 / 1000);\n}\nexports.isSameSecond = isSameSecond;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/datetime-picker/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/datetime-picker/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar validator_1 = require(\"../common/validator\");\nvar shared_1 = require(\"../picker/shared\");\nvar currentYear = new Date().getFullYear();\nfunction isValidDate(date) {\n    return (0, validator_1.isDef)(date) && !isNaN(new Date(date).getTime());\n}\nfunction range(num, min, max) {\n    return Math.min(Math.max(num, min), max);\n}\nfunction padZero(val) {\n    return \"00\".concat(val).slice(-2);\n}\nfunction times(n, iteratee) {\n    var index = -1;\n    var result = Array(n < 0 ? 0 : n);\n    while (++index < n) {\n        result[index] = iteratee(index);\n    }\n    return result;\n}\nfunction getTrueValue(formattedValue) {\n    if (formattedValue === undefined) {\n        formattedValue = '1';\n    }\n    while (isNaN(parseInt(formattedValue, 10))) {\n        formattedValue = formattedValue.slice(1);\n    }\n    return parseInt(formattedValue, 10);\n}\nfunction getMonthEndDay(year, month) {\n    return 32 - new Date(year, month - 1, 32).getDate();\n}\nvar defaultFormatter = function (type, value) { return value; };\n(0, component_1.VantComponent)({\n    classes: ['active-class', 'toolbar-class', 'column-class'],\n    props: __assign(__assign({}, shared_1.pickerProps), { value: {\n            type: null,\n            observer: 'updateValue',\n        }, filter: null, type: {\n            type: String,\n            value: 'datetime',\n            observer: 'updateValue',\n        }, showToolbar: {\n            type: Boolean,\n            value: true,\n        }, formatter: {\n            type: null,\n            value: defaultFormatter,\n        }, minDate: {\n            type: Number,\n            value: new Date(currentYear - 10, 0, 1).getTime(),\n            observer: 'updateValue',\n        }, maxDate: {\n            type: Number,\n            value: new Date(currentYear + 10, 11, 31).getTime(),\n            observer: 'updateValue',\n        }, minHour: {\n            type: Number,\n            value: 0,\n            observer: 'updateValue',\n        }, maxHour: {\n            type: Number,\n            value: 23,\n            observer: 'updateValue',\n        }, minMinute: {\n            type: Number,\n            value: 0,\n            observer: 'updateValue',\n        }, maxMinute: {\n            type: Number,\n            value: 59,\n            observer: 'updateValue',\n        } }),\n    data: {\n        innerValue: Date.now(),\n        columns: [],\n    },\n    methods: {\n        updateValue: function () {\n            var _this = this;\n            var data = this.data;\n            var val = this.correctValue(data.value);\n            var isEqual = val === data.innerValue;\n            this.updateColumnValue(val).then(function () {\n                if (!isEqual) {\n                    _this.$emit('input', val);\n                }\n            });\n        },\n        getPicker: function () {\n            if (this.picker == null) {\n                this.picker = this.selectComponent('.van-datetime-picker');\n                var picker_1 = this.picker;\n                var setColumnValues_1 = picker_1.setColumnValues;\n                picker_1.setColumnValues = function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    return setColumnValues_1.apply(picker_1, __spreadArray(__spreadArray([], args, true), [false], false));\n                };\n            }\n            return this.picker;\n        },\n        updateColumns: function () {\n            var _a = this.data.formatter, formatter = _a === void 0 ? defaultFormatter : _a;\n            var results = this.getOriginColumns().map(function (column) { return ({\n                values: column.values.map(function (value) { return formatter(column.type, value); }),\n            }); });\n            return this.set({ columns: results });\n        },\n        getOriginColumns: function () {\n            var filter = this.data.filter;\n            var results = this.getRanges().map(function (_a) {\n                var type = _a.type, range = _a.range;\n                var values = times(range[1] - range[0] + 1, function (index) {\n                    var value = range[0] + index;\n                    return type === 'year' ? \"\".concat(value) : padZero(value);\n                });\n                if (filter) {\n                    values = filter(type, values);\n                }\n                return { type: type, values: values };\n            });\n            return results;\n        },\n        getRanges: function () {\n            var data = this.data;\n            if (data.type === 'time') {\n                return [\n                    {\n                        type: 'hour',\n                        range: [data.minHour, data.maxHour],\n                    },\n                    {\n                        type: 'minute',\n                        range: [data.minMinute, data.maxMinute],\n                    },\n                ];\n            }\n            var _a = this.getBoundary('max', data.innerValue), maxYear = _a.maxYear, maxDate = _a.maxDate, maxMonth = _a.maxMonth, maxHour = _a.maxHour, maxMinute = _a.maxMinute;\n            var _b = this.getBoundary('min', data.innerValue), minYear = _b.minYear, minDate = _b.minDate, minMonth = _b.minMonth, minHour = _b.minHour, minMinute = _b.minMinute;\n            var result = [\n                {\n                    type: 'year',\n                    range: [minYear, maxYear],\n                },\n                {\n                    type: 'month',\n                    range: [minMonth, maxMonth],\n                },\n                {\n                    type: 'day',\n                    range: [minDate, maxDate],\n                },\n                {\n                    type: 'hour',\n                    range: [minHour, maxHour],\n                },\n                {\n                    type: 'minute',\n                    range: [minMinute, maxMinute],\n                },\n            ];\n            if (data.type === 'date')\n                result.splice(3, 2);\n            if (data.type === 'year-month')\n                result.splice(2, 3);\n            return result;\n        },\n        correctValue: function (value) {\n            var data = this.data;\n            // validate value\n            var isDateType = data.type !== 'time';\n            if (isDateType && !isValidDate(value)) {\n                value = data.minDate;\n            }\n            else if (!isDateType && !value) {\n                var minHour = data.minHour;\n                value = \"\".concat(padZero(minHour), \":00\");\n            }\n            // time type\n            if (!isDateType) {\n                var _a = value.split(':'), hour = _a[0], minute = _a[1];\n                hour = padZero(range(hour, data.minHour, data.maxHour));\n                minute = padZero(range(minute, data.minMinute, data.maxMinute));\n                return \"\".concat(hour, \":\").concat(minute);\n            }\n            // date type\n            value = Math.max(value, data.minDate);\n            value = Math.min(value, data.maxDate);\n            return value;\n        },\n        getBoundary: function (type, innerValue) {\n            var _a;\n            var value = new Date(innerValue);\n            var boundary = new Date(this.data[\"\".concat(type, \"Date\")]);\n            var year = boundary.getFullYear();\n            var month = 1;\n            var date = 1;\n            var hour = 0;\n            var minute = 0;\n            if (type === 'max') {\n                month = 12;\n                date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);\n                hour = 23;\n                minute = 59;\n            }\n            if (value.getFullYear() === year) {\n                month = boundary.getMonth() + 1;\n                if (value.getMonth() + 1 === month) {\n                    date = boundary.getDate();\n                    if (value.getDate() === date) {\n                        hour = boundary.getHours();\n                        if (value.getHours() === hour) {\n                            minute = boundary.getMinutes();\n                        }\n                    }\n                }\n            }\n            return _a = {},\n                _a[\"\".concat(type, \"Year\")] = year,\n                _a[\"\".concat(type, \"Month\")] = month,\n                _a[\"\".concat(type, \"Date\")] = date,\n                _a[\"\".concat(type, \"Hour\")] = hour,\n                _a[\"\".concat(type, \"Minute\")] = minute,\n                _a;\n        },\n        onCancel: function () {\n            this.$emit('cancel');\n        },\n        onConfirm: function () {\n            this.$emit('confirm', this.data.innerValue);\n        },\n        onChange: function () {\n            var _this = this;\n            var data = this.data;\n            var value;\n            var picker = this.getPicker();\n            var originColumns = this.getOriginColumns();\n            if (data.type === 'time') {\n                var indexes = picker.getIndexes();\n                value = \"\".concat(+originColumns[0].values[indexes[0]], \":\").concat(+originColumns[1]\n                    .values[indexes[1]]);\n            }\n            else {\n                var indexes = picker.getIndexes();\n                var values = indexes.map(function (value, index) { return originColumns[index].values[value]; });\n                var year = getTrueValue(values[0]);\n                var month = getTrueValue(values[1]);\n                var maxDate = getMonthEndDay(year, month);\n                var date = getTrueValue(values[2]);\n                if (data.type === 'year-month') {\n                    date = 1;\n                }\n                date = date > maxDate ? maxDate : date;\n                var hour = 0;\n                var minute = 0;\n                if (data.type === 'datetime') {\n                    hour = getTrueValue(values[3]);\n                    minute = getTrueValue(values[4]);\n                }\n                value = new Date(year, month - 1, date, hour, minute);\n            }\n            value = this.correctValue(value);\n            this.updateColumnValue(value).then(function () {\n                _this.$emit('input', value);\n                _this.$emit('change', picker);\n            });\n        },\n        updateColumnValue: function (value) {\n            var _this = this;\n            var values = [];\n            var type = this.data.type;\n            var formatter = this.data.formatter || defaultFormatter;\n            var picker = this.getPicker();\n            if (type === 'time') {\n                var pair = value.split(':');\n                values = [formatter('hour', pair[0]), formatter('minute', pair[1])];\n            }\n            else {\n                var date = new Date(value);\n                values = [\n                    formatter('year', \"\".concat(date.getFullYear())),\n                    formatter('month', padZero(date.getMonth() + 1)),\n                ];\n                if (type === 'date') {\n                    values.push(formatter('day', padZero(date.getDate())));\n                }\n                if (type === 'datetime') {\n                    values.push(formatter('day', padZero(date.getDate())), formatter('hour', padZero(date.getHours())), formatter('minute', padZero(date.getMinutes())));\n                }\n            }\n            return this.set({ innerValue: value })\n                .then(function () { return _this.updateColumns(); })\n                .then(function () { return picker.setValues(values); });\n        },\n    },\n    created: function () {\n        var _this = this;\n        var innerValue = this.correctValue(this.data.value);\n        this.updateColumnValue(innerValue).then(function () {\n            _this.$emit('input', innerValue);\n        });\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/datetime-picker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-picker\": \"../picker/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/datetime-picker/index.wxml",
    "content": "<van-picker\n  class=\"van-datetime-picker\"\n  active-class=\"active-class\"\n  toolbar-class=\"toolbar-class\"\n  column-class=\"column-class\"\n  title=\"{{ title }}\"\n  columns=\"{{ columns }}\"\n  item-height=\"{{ itemHeight }}\"\n  show-toolbar=\"{{ showToolbar }}\"\n  visible-item-count=\"{{ visibleItemCount }}\"\n  confirm-button-text=\"{{ confirmButtonText }}\"\n  cancel-button-text=\"{{ cancelButtonText }}\"\n  bind:change=\"onChange\"\n  bind:confirm=\"onConfirm\"\n  bind:cancel=\"onCancel\"\n/>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/datetime-picker/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/definitions/index.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ninterface VantComponentInstance {\n    parent: WechatMiniprogram.Component.TrivialInstance;\n    children: WechatMiniprogram.Component.TrivialInstance[];\n    index: number;\n    $emit: (name: string, detail?: unknown, options?: WechatMiniprogram.Component.TriggerEventOption) => void;\n    setView: (value: Record<string, any>, callback?: () => void) => void;\n}\nexport type VantComponentOptions<Data extends WechatMiniprogram.Component.DataOption, Props extends WechatMiniprogram.Component.PropertyOption, Methods extends WechatMiniprogram.Component.MethodOption> = {\n    data?: Data;\n    field?: boolean;\n    classes?: string[];\n    mixins?: string[];\n    props?: Props;\n    relation?: {\n        relations: Record<string, WechatMiniprogram.Component.RelationOption>;\n        mixin: string;\n    };\n    watch?: Record<string, (...args: any[]) => any>;\n    methods?: Methods;\n    beforeCreate?: () => void;\n    created?: () => void;\n    mounted?: () => void;\n    destroyed?: () => void;\n} & ThisType<VantComponentInstance & WechatMiniprogram.Component.Instance<Data & {\n    name: string;\n    value: any;\n} & Record<string, any>, Props, Methods> & Record<string, any>>;\nexport {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/definitions/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/dialog.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\nexport type Action = 'confirm' | 'cancel' | 'overlay';\ntype DialogContext = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;\ninterface DialogOptions {\n    lang?: string;\n    show?: boolean;\n    title?: string;\n    width?: string | number | null;\n    zIndex?: number;\n    theme?: string;\n    context?: (() => DialogContext) | DialogContext;\n    message?: string;\n    overlay?: boolean;\n    selector?: string;\n    ariaLabel?: string;\n    /**\n     * @deprecated use custom-class instead\n     */\n    className?: string;\n    customStyle?: string;\n    transition?: string;\n    /**\n     * @deprecated use beforeClose instead\n     */\n    asyncClose?: boolean;\n    beforeClose?: null | ((action: Action) => Promise<void | boolean> | void);\n    businessId?: number;\n    sessionFrom?: string;\n    overlayStyle?: string;\n    appParameter?: string;\n    messageAlign?: string;\n    sendMessageImg?: string;\n    showMessageCard?: boolean;\n    sendMessagePath?: string;\n    sendMessageTitle?: string;\n    confirmButtonText?: string;\n    cancelButtonText?: string;\n    showConfirmButton?: boolean;\n    showCancelButton?: boolean;\n    closeOnClickOverlay?: boolean;\n    confirmButtonOpenType?: string;\n}\ndeclare const Dialog: {\n    (options: DialogOptions): Promise<WechatMiniprogram.Component.TrivialInstance>;\n    alert(options: DialogOptions): Promise<WechatMiniprogram.Component.TrivialInstance>;\n    confirm(options: DialogOptions): Promise<WechatMiniprogram.Component.TrivialInstance>;\n    close(): void;\n    stopLoading(): void;\n    currentOptions: DialogOptions;\n    defaultOptions: DialogOptions;\n    setDefaultOptions(options: DialogOptions): void;\n    resetDefaultOptions(): void;\n};\nexport default Dialog;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/dialog.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar queue = [];\nvar defaultOptions = {\n    show: false,\n    title: '',\n    width: null,\n    theme: 'default',\n    message: '',\n    zIndex: 100,\n    overlay: true,\n    selector: '#van-dialog',\n    className: '',\n    asyncClose: false,\n    beforeClose: null,\n    transition: 'scale',\n    customStyle: '',\n    messageAlign: '',\n    overlayStyle: '',\n    confirmButtonText: '确认',\n    cancelButtonText: '取消',\n    showConfirmButton: true,\n    showCancelButton: false,\n    closeOnClickOverlay: false,\n    confirmButtonOpenType: '',\n};\nvar currentOptions = __assign({}, defaultOptions);\nfunction getContext() {\n    var pages = getCurrentPages();\n    return pages[pages.length - 1];\n}\nvar Dialog = function (options) {\n    options = __assign(__assign({}, currentOptions), options);\n    return new Promise(function (resolve, reject) {\n        var context = (typeof options.context === 'function'\n            ? options.context()\n            : options.context) || getContext();\n        var dialog = context.selectComponent(options.selector);\n        delete options.context;\n        delete options.selector;\n        if (dialog) {\n            dialog.setData(__assign({ callback: function (action, instance) {\n                    action === 'confirm' ? resolve(instance) : reject(instance);\n                } }, options));\n            wx.nextTick(function () {\n                dialog.setData({ show: true });\n            });\n            queue.push(dialog);\n        }\n        else {\n            console.warn('未找到 van-dialog 节点，请确认 selector 及 context 是否正确');\n        }\n    });\n};\nDialog.alert = function (options) { return Dialog(options); };\nDialog.confirm = function (options) {\n    return Dialog(__assign({ showCancelButton: true }, options));\n};\nDialog.close = function () {\n    queue.forEach(function (dialog) {\n        dialog.close();\n    });\n    queue = [];\n};\nDialog.stopLoading = function () {\n    queue.forEach(function (dialog) {\n        dialog.stopLoading();\n    });\n};\nDialog.currentOptions = currentOptions;\nDialog.defaultOptions = defaultOptions;\nDialog.setDefaultOptions = function (options) {\n    currentOptions = __assign(__assign({}, currentOptions), options);\n    Dialog.currentOptions = currentOptions;\n};\nDialog.resetDefaultOptions = function () {\n    currentOptions = __assign({}, defaultOptions);\n    Dialog.currentOptions = currentOptions;\n};\nDialog.resetDefaultOptions();\nexports.default = Dialog;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar button_1 = require(\"../mixins/button\");\nvar color_1 = require(\"../common/color\");\nvar utils_1 = require(\"../common/utils\");\n(0, component_1.VantComponent)({\n    mixins: [button_1.button],\n    classes: ['cancle-button-class', 'confirm-button-class'],\n    props: {\n        show: {\n            type: Boolean,\n            observer: function (show) {\n                !show && this.stopLoading();\n            },\n        },\n        title: String,\n        message: String,\n        theme: {\n            type: String,\n            value: 'default',\n        },\n        confirmButtonId: String,\n        className: String,\n        customStyle: String,\n        asyncClose: Boolean,\n        messageAlign: String,\n        beforeClose: null,\n        overlayStyle: String,\n        useSlot: Boolean,\n        useTitleSlot: Boolean,\n        useConfirmButtonSlot: Boolean,\n        useCancelButtonSlot: Boolean,\n        showCancelButton: Boolean,\n        closeOnClickOverlay: Boolean,\n        confirmButtonOpenType: String,\n        width: null,\n        zIndex: {\n            type: Number,\n            value: 2000,\n        },\n        confirmButtonText: {\n            type: String,\n            value: '确认',\n        },\n        cancelButtonText: {\n            type: String,\n            value: '取消',\n        },\n        confirmButtonColor: {\n            type: String,\n            value: color_1.RED,\n        },\n        cancelButtonColor: {\n            type: String,\n            value: color_1.GRAY,\n        },\n        showConfirmButton: {\n            type: Boolean,\n            value: true,\n        },\n        overlay: {\n            type: Boolean,\n            value: true,\n        },\n        transition: {\n            type: String,\n            value: 'scale',\n        },\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    data: {\n        loading: {\n            confirm: false,\n            cancel: false,\n        },\n        callback: (function () { }),\n    },\n    methods: {\n        onConfirm: function () {\n            this.handleAction('confirm');\n        },\n        onCancel: function () {\n            this.handleAction('cancel');\n        },\n        onClickOverlay: function () {\n            this.close('overlay');\n        },\n        close: function (action) {\n            this.setData({ show: false });\n            this.closeAction = action;\n        },\n        onAfterLeave: function () {\n            var action = this.closeAction;\n            this.$emit('close', action);\n            var callback = this.data.callback;\n            if (callback) {\n                callback(action, this);\n            }\n        },\n        stopLoading: function () {\n            this.setData({\n                loading: {\n                    confirm: false,\n                    cancel: false,\n                },\n            });\n        },\n        handleAction: function (action) {\n            var _a;\n            var _this = this;\n            this.$emit(action, { dialog: this });\n            var _b = this.data, asyncClose = _b.asyncClose, beforeClose = _b.beforeClose;\n            if (!asyncClose && !beforeClose) {\n                this.close(action);\n                return;\n            }\n            this.setData((_a = {},\n                _a[\"loading.\".concat(action)] = true,\n                _a));\n            if (beforeClose) {\n                (0, utils_1.toPromise)(beforeClose(action)).then(function (value) {\n                    if (value) {\n                        _this.close(action);\n                    }\n                    else {\n                        _this.stopLoading();\n                    }\n                });\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-popup\": \"../popup/index\",\n    \"van-button\": \"../button/index\",\n    \"van-goods-action\": \"../goods-action/index\",\n    \"van-goods-action-button\": \"../goods-action-button/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<van-popup\n  show=\"{{ show }}\"\n  z-index=\"{{ zIndex }}\"\n  overlay=\"{{ overlay }}\"\n  transition=\"{{ transition }}\"\n  custom-class=\"van-dialog van-dialog--{{ theme }}{{ className }} custom-class\"\n  custom-style=\"width: {{ utils.addUnit(width) }};{{ customStyle }}\"\n  overlay-style=\"{{ overlayStyle }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  root-portal=\"{{ rootPortal }}\"\n  bind:close=\"onClickOverlay\"\n  bind:after-leave=\"onAfterLeave\"\n>\n  <view\n    wx:if=\"{{ title || useTitleSlot  }}\"\n    class=\"{{ utils.bem('dialog__header', { isolated: !(message || useSlot) }) }}\"\n  >\n    <slot wx:if=\"{{ useTitleSlot }}\" name=\"title\" />\n    <block wx:elif=\"{{ title }}\">{{ title }}</block>\n  </view>\n\n  <slot wx:if=\"{{ useSlot }}\" />\n  <view\n    wx:elif=\"{{ message }}\"\n    class=\"{{ utils.bem('dialog__message', [theme, messageAlign, { hasTitle: title }]) }}\"\n  >\n    <text class=\"van-dialog__message-text\">{{ message }}</text>\n  </view>\n\n  <van-goods-action wx:if=\"{{ theme === 'round-button' }}\" custom-class=\"van-dialog__footer--round-button\">\n    <van-goods-action-button\n      wx:if=\"{{ showCancelButton }}\"\n      size=\"large\"\n      loading=\"{{ loading.cancel }}\"\n      class=\"van-dialog__button van-hairline--right\"\n      custom-class=\"van-dialog__cancel cancle-button-class\"\n      custom-style=\"color: {{ cancelButtonColor }}\"\n      bind:click=\"onCancel\"\n    >\n      {{ cancelButtonText }}\n    </van-goods-action-button>\n    <van-goods-action-button\n      wx:if=\"{{ showConfirmButton }}\"\n      size=\"large\"\n      class=\"van-dialog__button\"\n      loading=\"{{ loading.confirm }}\"\n      custom-class=\"van-dialog__confirm confirm-button-class\"\n      custom-style=\"color: {{ confirmButtonColor }}\"\n      button-id=\"{{ confirmButtonId }}\"\n      open-type=\"{{ confirmButtonOpenType }}\"\n      lang=\"{{ lang }}\"\n      business-id=\"{{ businessId }}\"\n      session-from=\"{{ sessionFrom }}\"\n      send-message-title=\"{{ sendMessageTitle }}\"\n      send-message-path=\"{{ sendMessagePath }}\"\n      send-message-img=\"{{ sendMessageImg }}\"\n      show-message-card=\"{{ showMessageCard }}\"\n      app-parameter=\"{{ appParameter }}\"\n      bindagreeprivacyauthorization=\"onAgreePrivacyAuthorization\"\n      bindgetRealTimePhoneNumber=\"onGetRealTimePhoneNumber\"\n      bind:click=\"onConfirm\"\n      bindgetuserinfo=\"onGetUserInfo\"\n      bindcontact=\"onContact\"\n      bindgetphonenumber=\"onGetPhoneNumber\"\n      binderror=\"onError\"\n      bindlaunchapp=\"onLaunchApp\"\n      bindopensetting=\"onOpenSetting\"\n    >\n      {{ confirmButtonText }}\n    </van-goods-action-button>\n  </van-goods-action>\n\n  <view wx:elif=\"{{ showCancelButton || showConfirmButton }}\" class=\"van-hairline--top van-dialog__footer\">\n    <block wx:if=\"{{ showCancelButton }}\">\n      <slot wx:if=\"{{ useCancelButtonSlot }}\" name=\"cancel-button\" />\n\n      <van-button\n        wx:else\n        size=\"large\"\n        loading=\"{{ loading.cancel }}\"\n        class=\"van-dialog__button van-hairline--right\"\n        custom-class=\"van-dialog__cancel cancle-button-class\"\n        custom-style=\"color: {{ cancelButtonColor }}\"\n        bind:click=\"onCancel\"\n      >\n        {{ cancelButtonText }}\n      </van-button>\n    </block>\n\n    <block wx:if=\"{{ showConfirmButton }}\">\n      <slot wx:if=\"{{ useConfirmButtonSlot }}\" name=\"confirm-button\" />\n\n      <van-button\n        wx:else\n        size=\"large\"\n        class=\"van-dialog__button\"\n        loading=\"{{ loading.confirm }}\"\n        custom-class=\"van-dialog__confirm confirm-button-class\"\n        custom-style=\"color: {{ confirmButtonColor }}\"\n        button-id=\"{{ confirmButtonId }}\"\n        open-type=\"{{ confirmButtonOpenType }}\"\n        lang=\"{{ lang }}\"\n        business-id=\"{{ businessId }}\"\n        session-from=\"{{ sessionFrom }}\"\n        send-message-title=\"{{ sendMessageTitle }}\"\n        send-message-path=\"{{ sendMessagePath }}\"\n        send-message-img=\"{{ sendMessageImg }}\"\n        show-message-card=\"{{ showMessageCard }}\"\n        app-parameter=\"{{ appParameter }}\"\n        bindagreeprivacyauthorization=\"onAgreePrivacyAuthorization\"\n        bindgetRealTimePhoneNumber=\"onGetRealTimePhoneNumber\"\n        bind:click=\"onConfirm\"\n        bindgetuserinfo=\"onGetUserInfo\"\n        bindcontact=\"onContact\"\n        bindgetphonenumber=\"onGetPhoneNumber\"\n        binderror=\"onError\"\n        bindlaunchapp=\"onLaunchApp\"\n        bindopensetting=\"onOpenSetting\"\n      >\n        {{ confirmButtonText }}\n      </van-button>\n    </block>\n  </view>\n</van-popup>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dialog/index.wxss",
    "content": "@import '../common/index.wxss';.van-dialog{background-color:var(--dialog-background-color,#fff);border-radius:var(--dialog-border-radius,16px);font-size:var(--dialog-font-size,16px);overflow:hidden;top:45%!important;width:var(--dialog-width,320px)}@media (max-width:321px){.van-dialog{width:var(--dialog-small-screen-width,90%)}}.van-dialog__header{font-weight:var(--dialog-header-font-weight,500);line-height:var(--dialog-header-line-height,24px);padding-top:var(--dialog-header-padding-top,24px);text-align:center}.van-dialog__header--isolated{padding:var(--dialog-header-isolated-padding,24px 0)}.van-dialog__message{-webkit-overflow-scrolling:touch;font-size:var(--dialog-message-font-size,14px);line-height:var(--dialog-message-line-height,20px);max-height:var(--dialog-message-max-height,60vh);overflow-y:auto;padding:var(--dialog-message-padding,24px);text-align:center}.van-dialog__message-text{word-wrap:break-word}.van-dialog__message--hasTitle{color:var(--dialog-has-title-message-text-color,#646566);padding-top:var(--dialog-has-title-message-padding-top,8px)}.van-dialog__message--round-button{color:#323233;padding-bottom:16px}.van-dialog__message--left{text-align:left}.van-dialog__message--right{text-align:right}.van-dialog__message--justify{text-align:justify}.van-dialog__footer{display:flex}.van-dialog__footer--round-button{padding:8px 24px 16px!important;position:relative!important}.van-dialog__button{flex:1}.van-dialog__cancel,.van-dialog__confirm{border:0!important}.van-dialog-bounce-enter{opacity:0;transform:translate3d(-50%,-50%,0) scale(.7)}.van-dialog-bounce-leave-active{opacity:0;transform:translate3d(-50%,-50%,0) scale(.9)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/divider/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/divider/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        dashed: Boolean,\n        hairline: Boolean,\n        contentPosition: String,\n        fontSize: String,\n        borderColor: String,\n        textColor: String,\n        customStyle: String,\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/divider/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/divider/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"custom-class {{ utils.bem('divider', [{ dashed, hairline }, contentPosition]) }}\"\n  style=\"{{ computed.rootStyle({ borderColor, textColor, fontSize, customStyle }) }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/divider/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  return style([\n    {\n      'border-color': data.borderColor,\n      color: data.textColor,\n      'font-size': addUnit(data.fontSize),\n    },\n    data.customStyle,\n  ]);\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/divider/index.wxss",
    "content": "@import '../common/index.wxss';.van-divider{align-items:center;border:0 solid var(--divider-border-color,#ebedf0);color:var(--divider-text-color,#969799);display:flex;font-size:var(--divider-font-size,14px);line-height:var(--divider-line-height,24px);margin:var(--divider-margin,16px 0)}.van-divider:after,.van-divider:before{border-color:inherit;border-style:inherit;border-width:1px 0 0;box-sizing:border-box;display:block;flex:1;height:1px}.van-divider:before{content:\"\"}.van-divider--hairline:after,.van-divider--hairline:before{transform:scaleY(.5)}.van-divider--dashed{border-style:dashed}.van-divider--center:before,.van-divider--left:before,.van-divider--right:before{margin-right:var(--divider-content-padding,16px)}.van-divider--center:after,.van-divider--left:after,.van-divider--right:after{content:\"\";margin-left:var(--divider-content-padding,16px)}.van-divider--left:before{max-width:var(--divider-content-left-width,10%)}.van-divider--right:after{max-width:var(--divider-content-right-width,10%)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar relation_1 = require(\"../common/relation\");\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: ['item-title-class'],\n    field: true,\n    relation: (0, relation_1.useParent)('dropdown-menu', function () {\n        this.updateDataFromParent();\n    }),\n    props: {\n        value: {\n            type: null,\n            observer: 'rerender',\n        },\n        title: {\n            type: String,\n            observer: 'rerender',\n        },\n        disabled: Boolean,\n        titleClass: {\n            type: String,\n            observer: 'rerender',\n        },\n        options: {\n            type: Array,\n            value: [],\n            observer: 'rerender',\n        },\n        popupStyle: String,\n        useBeforeToggle: {\n            type: Boolean,\n            value: false,\n        },\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    data: {\n        transition: true,\n        showPopup: false,\n        showWrapper: false,\n        displayTitle: '',\n        safeAreaTabBar: false,\n    },\n    methods: {\n        rerender: function () {\n            var _this = this;\n            wx.nextTick(function () {\n                var _a;\n                (_a = _this.parent) === null || _a === void 0 ? void 0 : _a.updateItemListData();\n            });\n        },\n        updateDataFromParent: function () {\n            if (this.parent) {\n                var _a = this.parent.data, overlay = _a.overlay, duration = _a.duration, activeColor = _a.activeColor, closeOnClickOverlay = _a.closeOnClickOverlay, direction = _a.direction, safeAreaTabBar = _a.safeAreaTabBar;\n                this.setData({\n                    overlay: overlay,\n                    duration: duration,\n                    activeColor: activeColor,\n                    closeOnClickOverlay: closeOnClickOverlay,\n                    direction: direction,\n                    safeAreaTabBar: safeAreaTabBar,\n                });\n            }\n        },\n        onOpen: function () {\n            this.$emit('open');\n        },\n        onOpened: function () {\n            this.$emit('opened');\n        },\n        onClose: function () {\n            this.$emit('close');\n        },\n        onClosed: function () {\n            this.$emit('closed');\n            this.setData({ showWrapper: false });\n        },\n        onOptionTap: function (event) {\n            var option = event.currentTarget.dataset.option;\n            var value = option.value;\n            var shouldEmitChange = this.data.value !== value;\n            this.setData({ showPopup: false, value: value });\n            this.$emit('close');\n            this.rerender();\n            if (shouldEmitChange) {\n                this.$emit('change', value);\n            }\n        },\n        toggle: function (show, options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            var showPopup = this.data.showPopup;\n            if (typeof show !== 'boolean') {\n                show = !showPopup;\n            }\n            if (show === showPopup) {\n                return;\n            }\n            this.onBeforeToggle(show).then(function (status) {\n                var _a;\n                if (!status) {\n                    return;\n                }\n                _this.setData({\n                    transition: !options.immediate,\n                    showPopup: show,\n                });\n                if (show) {\n                    (_a = _this.parent) === null || _a === void 0 ? void 0 : _a.getChildWrapperStyle().then(function (wrapperStyle) {\n                        _this.setData({ wrapperStyle: wrapperStyle, showWrapper: true });\n                        _this.rerender();\n                    });\n                }\n                else {\n                    _this.rerender();\n                }\n            });\n        },\n        onBeforeToggle: function (status) {\n            var _this = this;\n            var useBeforeToggle = this.data.useBeforeToggle;\n            if (!useBeforeToggle) {\n                return Promise.resolve(true);\n            }\n            return new Promise(function (resolve) {\n                _this.$emit('before-toggle', {\n                    status: status,\n                    callback: function (value) { return resolve(value); },\n                });\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-popup\": \"../popup/index\",\n    \"van-cell\": \"../cell/index\",\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ showWrapper }}\"\n  class=\"{{ utils.bem('dropdown-item', direction) }} custom-class\"\n  style=\"{{ wrapperStyle }}\"\n>\n  <van-popup\n    show=\"{{ showPopup }}\"\n    custom-style=\"position: absolute;{{ popupStyle }}\"\n    overlay-style=\"position: absolute;\"\n    overlay=\"{{ overlay }}\"\n    position=\"{{ direction === 'down' ? 'top' : 'bottom' }}\"\n    duration=\"{{ transition ? duration : 0 }}\"\n    safe-area-tab-bar=\"{{ safeAreaTabBar }}\"\n    close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n    rootPortal=\"{{ rootPortal }}\"\n    bind:enter=\"onOpen\"\n    bind:leave=\"onClose\"\n    bind:close=\"toggle\"\n    bind:after-enter=\"onOpened\"\n    bind:after-leave=\"onClosed\"\n  >\n    <van-cell\n      wx:for=\"{{ options }}\"\n      wx:key=\"value\"\n      data-option=\"{{ item }}\"\n      class=\"{{ utils.bem('dropdown-item__option', { active: item.value === value } ) }}\"\n      clickable\n      icon=\"{{ item.icon }}\"\n      bind:tap=\"onOptionTap\"\n    >\n      <view\n        slot=\"title\"\n        class=\"van-dropdown-item__title item-title-class\"\n        style=\"{{ item.value === value  ? 'color:' + activeColor : '' }}\"\n      >\n        {{ item.text }}\n      </view>\n      <van-icon\n        wx:if=\"{{ item.value === value }}\"\n        name=\"success\"\n        class=\"van-dropdown-item__icon\"\n        color=\"{{ activeColor }}\"\n      />\n    </van-cell>\n\n    <slot />\n  </van-popup>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-dropdown-item{left:0;overflow:hidden;position:fixed;right:0}.van-dropdown-item__option{text-align:left}.van-dropdown-item__option--active .van-dropdown-item__icon,.van-dropdown-item__option--active .van-dropdown-item__title{color:var(--dropdown-menu-option-active-color,#ee0a24)}.van-dropdown-item--up{top:0}.van-dropdown-item--down{bottom:0}.van-dropdown-item__icon{display:block;line-height:inherit}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/shared.d.ts",
    "content": "export interface Option {\n    text: string;\n    value: string | number;\n    icon: string;\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-item/shared.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-menu/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-menu/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\nvar utils_1 = require(\"../common/utils\");\nvar ARRAY = [];\n(0, component_1.VantComponent)({\n    field: true,\n    classes: ['title-class'],\n    relation: (0, relation_1.useChildren)('dropdown-item', function () {\n        this.updateItemListData();\n    }),\n    props: {\n        activeColor: {\n            type: String,\n            observer: 'updateChildrenData',\n        },\n        overlay: {\n            type: Boolean,\n            value: true,\n            observer: 'updateChildrenData',\n        },\n        zIndex: {\n            type: Number,\n            value: 10,\n        },\n        duration: {\n            type: Number,\n            value: 200,\n            observer: 'updateChildrenData',\n        },\n        direction: {\n            type: String,\n            value: 'down',\n            observer: 'updateChildrenData',\n        },\n        safeAreaTabBar: {\n            type: Boolean,\n            value: false,\n        },\n        closeOnClickOverlay: {\n            type: Boolean,\n            value: true,\n            observer: 'updateChildrenData',\n        },\n        closeOnClickOutside: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        itemListData: [],\n    },\n    beforeCreate: function () {\n        var windowHeight = (0, utils_1.getSystemInfoSync)().windowHeight;\n        this.windowHeight = windowHeight;\n        ARRAY.push(this);\n    },\n    destroyed: function () {\n        var _this = this;\n        ARRAY = ARRAY.filter(function (item) { return item !== _this; });\n    },\n    methods: {\n        updateItemListData: function () {\n            this.setData({\n                itemListData: this.children.map(function (child) { return child.data; }),\n            });\n        },\n        updateChildrenData: function () {\n            this.children.forEach(function (child) {\n                child.updateDataFromParent();\n            });\n        },\n        toggleItem: function (active) {\n            this.children.forEach(function (item, index) {\n                var showPopup = item.data.showPopup;\n                if (index === active) {\n                    item.toggle();\n                }\n                else if (showPopup) {\n                    item.toggle(false, { immediate: true });\n                }\n            });\n        },\n        close: function () {\n            this.children.forEach(function (child) {\n                child.toggle(false, { immediate: true });\n            });\n        },\n        getChildWrapperStyle: function () {\n            var _this = this;\n            var _a = this.data, zIndex = _a.zIndex, direction = _a.direction;\n            return (0, utils_1.getRect)(this, '.van-dropdown-menu').then(function (rect) {\n                var _a = rect.top, top = _a === void 0 ? 0 : _a, _b = rect.bottom, bottom = _b === void 0 ? 0 : _b;\n                var offset = direction === 'down' ? bottom : _this.windowHeight - top;\n                var wrapperStyle = \"z-index: \".concat(zIndex, \";\");\n                if (direction === 'down') {\n                    wrapperStyle += \"top: \".concat((0, utils_1.addUnit)(offset), \";\");\n                }\n                else {\n                    wrapperStyle += \"bottom: \".concat((0, utils_1.addUnit)(offset), \";\");\n                }\n                return wrapperStyle;\n            });\n        },\n        onTitleTap: function (event) {\n            var _this = this;\n            var index = event.currentTarget.dataset.index;\n            var child = this.children[index];\n            if (!child.data.disabled) {\n                ARRAY.forEach(function (menuItem) {\n                    if (menuItem &&\n                        menuItem.data.closeOnClickOutside &&\n                        menuItem !== _this) {\n                        menuItem.close();\n                    }\n                });\n                this.toggleItem(index);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-menu/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-menu/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-dropdown-menu van-dropdown-menu--top-bottom custom-class\">\n  <view\n    wx:for=\"{{ itemListData }}\"\n    wx:key=\"index\"\n    data-index=\"{{ index }}\"\n    class=\"{{ utils.bem('dropdown-menu__item', { disabled: item.disabled }) }}\"\n    bind:tap=\"onTitleTap\"\n  >\n    <view\n      class=\"{{ item.titleClass }} {{ utils.bem('dropdown-menu__title', { active: item.showPopup, down: item.showPopup === (direction === 'down') }) }} title-class\"\n      style=\"{{ item.showPopup ? 'color:' + activeColor : '' }}\"\n    >\n      <view class=\"van-ellipsis\">\n        {{ computed.displayTitle(item) }}\n      </view>\n    </view>\n  </view>\n\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-menu/index.wxs",
    "content": "/* eslint-disable */\nfunction displayTitle(item) {\n  if (item.title) {\n    return item.title;\n  }\n\n  var match = item.options.filter(function(option) {\n    return option.value === item.value;\n  });\n  var displayTitle = match.length ? match[0].text : '';\n  return displayTitle;\n}\n\nmodule.exports = {\n  displayTitle: displayTitle\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/dropdown-menu/index.wxss",
    "content": "@import '../common/index.wxss';.van-dropdown-menu{background-color:var(--dropdown-menu-background-color,#fff);box-shadow:var(--dropdown-menu-box-shadow,0 2px 12px hsla(210,1%,40%,.12));display:flex;height:var(--dropdown-menu-height,50px);-webkit-user-select:none;user-select:none}.van-dropdown-menu__item{align-items:center;display:flex;flex:1;justify-content:center;min-width:0}.van-dropdown-menu__item:active{opacity:.7}.van-dropdown-menu__item--disabled:active{opacity:1}.van-dropdown-menu__item--disabled .van-dropdown-menu__title{color:var(--dropdown-menu-title-disabled-text-color,#969799)}.van-dropdown-menu__title{box-sizing:border-box;color:var(--dropdown-menu-title-text-color,#323233);font-size:var(--dropdown-menu-title-font-size,15px);line-height:var(--dropdown-menu-title-line-height,18px);max-width:100%;padding:var(--dropdown-menu-title-padding,0 24px 0 8px);position:relative}.van-dropdown-menu__title:after{border-color:transparent transparent currentcolor currentcolor;border-style:solid;border-width:3px;content:\"\";margin-top:-5px;opacity:.8;position:absolute;right:11px;top:50%;transform:rotate(-45deg)}.van-dropdown-menu__title--active{color:var(--dropdown-menu-title-active-text-color,#ee0a24)}.van-dropdown-menu__title--down:after{margin-top:-1px;transform:rotate(135deg)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/empty/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/empty/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        description: String,\n        image: {\n            type: String,\n            value: 'default',\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/empty/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/empty/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"custom-class van-empty\">\n  <view class=\"van-empty__image\">\n    <slot name=\"image\"></slot>\n  </view>\n  <view class=\"van-empty__image\">\n    <image wx:if=\"{{ image }}\" class=\"van-empty__image__img\" src=\"{{ computed.imageUrl(image) }}\" />\n  </view>\n\n  <view class=\"van-empty__description\">\n    <slot name=\"description\"></slot>\n  </view>\n  <view class=\"van-empty__description\">\n    {{ description }}\n  </view>\n\n  <view class=\"van-empty__bottom\">\n    <slot></slot>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/empty/index.wxs",
    "content": "/* eslint-disable */\nvar PRESETS = ['error', 'search', 'default', 'network'];\n\nfunction imageUrl(image) {\n  if (PRESETS.indexOf(image) !== -1) {\n    return 'https://img.yzcdn.cn/vant/empty-image-' + image + '.png';\n  }\n\n  return image;\n}\n\nmodule.exports = {\n  imageUrl: imageUrl,\n};\n\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/empty/index.wxss",
    "content": "@import '../common/index.wxss';.van-empty{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;padding:32px 0}.van-empty__image{height:160px;width:160px}.van-empty__image:empty{display:none}.van-empty__image__img{height:100%;width:100%}.van-empty__image:not(:empty)+.van-empty__image{display:none}.van-empty__description{color:#969799;font-size:14px;line-height:20px;margin-top:16px;padding:0 60px}.van-empty__description:empty,.van-empty__description:not(:empty)+.van-empty__description{display:none}.van-empty__bottom{margin-top:24px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../common/utils\");\nvar component_1 = require(\"../common/component\");\nvar props_1 = require(\"./props\");\n(0, component_1.VantComponent)({\n    field: true,\n    classes: ['input-class', 'right-icon-class', 'label-class'],\n    props: __assign(__assign(__assign(__assign({}, props_1.commonProps), props_1.inputProps), props_1.textareaProps), { size: String, icon: String, label: String, error: Boolean, center: Boolean, isLink: Boolean, leftIcon: String, rightIcon: String, autosize: null, required: Boolean, iconClass: String, clickable: Boolean, inputAlign: String, customStyle: String, errorMessage: String, arrowDirection: String, showWordLimit: Boolean, errorMessageAlign: String, readonly: {\n            type: Boolean,\n            observer: 'setShowClear',\n        }, clearable: {\n            type: Boolean,\n            observer: 'setShowClear',\n        }, clearTrigger: {\n            type: String,\n            value: 'focus',\n        }, border: {\n            type: Boolean,\n            value: true,\n        }, titleWidth: {\n            type: String,\n            value: '6.2em',\n        }, clearIcon: {\n            type: String,\n            value: 'clear',\n        }, extraEventParams: {\n            type: Boolean,\n            value: false,\n        } }),\n    data: {\n        focused: false,\n        innerValue: '',\n        showClear: false,\n    },\n    watch: {\n        value: function (value) {\n            if (value !== this.value) {\n                this.setData({ innerValue: value });\n                this.value = value;\n                this.setShowClear();\n            }\n        },\n        clearTrigger: function () {\n            this.setShowClear();\n        },\n    },\n    created: function () {\n        this.value = this.data.value;\n        this.setData({ innerValue: this.value });\n    },\n    methods: {\n        formatValue: function (value) {\n            var maxlength = this.data.maxlength;\n            if (maxlength !== -1 && value.length > maxlength) {\n                return value.slice(0, maxlength);\n            }\n            return value;\n        },\n        onInput: function (event) {\n            var _a = (event.detail || {}).value, value = _a === void 0 ? '' : _a;\n            var formatValue = this.formatValue(value);\n            this.value = formatValue;\n            this.setShowClear();\n            return this.emitChange(__assign(__assign({}, event.detail), { value: formatValue }));\n        },\n        onFocus: function (event) {\n            this.focused = true;\n            this.setShowClear();\n            this.$emit('focus', event.detail);\n        },\n        onBlur: function (event) {\n            this.focused = false;\n            this.setShowClear();\n            this.$emit('blur', event.detail);\n        },\n        onClickIcon: function () {\n            this.$emit('click-icon');\n        },\n        onClickInput: function (event) {\n            this.$emit('click-input', event.detail);\n        },\n        onClear: function () {\n            var _this = this;\n            this.setData({ innerValue: '' });\n            this.value = '';\n            this.setShowClear();\n            (0, utils_1.nextTick)(function () {\n                _this.emitChange({ value: '' });\n                _this.$emit('clear', '');\n            });\n        },\n        onConfirm: function (event) {\n            var _a = (event.detail || {}).value, value = _a === void 0 ? '' : _a;\n            this.value = value;\n            this.setShowClear();\n            this.$emit('confirm', value);\n        },\n        setValue: function (value) {\n            this.value = value;\n            this.setShowClear();\n            if (value === '') {\n                this.setData({ innerValue: '' });\n            }\n            this.emitChange({ value: value });\n        },\n        onLineChange: function (event) {\n            this.$emit('linechange', event.detail);\n        },\n        onKeyboardHeightChange: function (event) {\n            this.$emit('keyboardheightchange', event.detail);\n        },\n        onBindNicknameReview: function (event) {\n            this.$emit('nicknamereview', event.detail);\n        },\n        emitChange: function (detail) {\n            var extraEventParams = this.data.extraEventParams;\n            this.setData({ value: detail.value });\n            var result;\n            var data = extraEventParams\n                ? __assign(__assign({}, detail), { callback: function (data) {\n                        result = data;\n                    } }) : detail.value;\n            this.$emit('input', data);\n            this.$emit('change', data);\n            return result;\n        },\n        setShowClear: function () {\n            var _a = this.data, clearable = _a.clearable, readonly = _a.readonly, clearTrigger = _a.clearTrigger;\n            var _b = this, focused = _b.focused, value = _b.value;\n            var showClear = false;\n            if (clearable && !readonly) {\n                var hasValue = !!value;\n                var trigger = clearTrigger === 'always' || (clearTrigger === 'focus' && focused);\n                showClear = hasValue && trigger;\n            }\n            this.setView({ showClear: showClear });\n        },\n        noop: function () { },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-cell\": \"../cell/index\",\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<van-cell\n  size=\"{{ size }}\"\n  icon=\"{{ leftIcon }}\"\n  center=\"{{ center }}\"\n  border=\"{{ border }}\"\n  is-link=\"{{ isLink }}\"\n  required=\"{{ required }}\"\n  clickable=\"{{ clickable }}\"\n  title-width=\"{{ titleWidth }}\"\n  title-style=\"margin-right: 12px;\"\n  custom-style=\"{{ customStyle }}\"\n  arrow-direction=\"{{ arrowDirection }}\"\n  custom-class=\"custom-class van-field\"\n>\n  <slot name=\"left-icon\" slot=\"icon\" />\n  <label for=\"{{ name }}\" wx:if=\"{{ label }}\" class=\"label-class {{ utils.bem('field__label', { disabled }) }}\" slot=\"title\">\n    {{ label }}\n  </label>\n  <slot wx:else name=\"label\" slot=\"title\" />\n  <view class=\"{{ utils.bem('field__body', [type]) }}\">\n    <view class=\"{{ utils.bem('field__control', [inputAlign, 'custom']) }}\" bindtap=\"onClickInput\">\n      <slot name=\"input\" />\n    </view>\n    <include wx:if=\"{{ type === 'textarea' }}\" src=\"./textarea.wxml\" />\n    <include wx:else src=\"./input.wxml\" />\n\n    <van-icon\n      wx:if=\"{{ showClear }}\"\n      name=\"{{ clearIcon }}\"\n      class=\"van-field__clear-root van-field__icon-root\"\n      catch:touchstart=\"onClear\"\n    />\n    <view class=\"van-field__icon-container\" bind:tap=\"onClickIcon\">\n      <van-icon\n        wx:if=\"{{ rightIcon || icon }}\"\n        name=\"{{ rightIcon || icon }}\"\n        class=\"van-field__icon-root {{ iconClass }}\"\n        custom-class=\"right-icon-class\"\n      />\n      <slot name=\"right-icon\" />\n      <slot name=\"icon\" />\n    </view>\n    <view class=\"van-field__button\">\n      <slot name=\"button\" />\n    </view>\n  </view>\n  <label for=\"{{ name }}\" wx:if=\"{{ showWordLimit && maxlength }}\" class=\"van-field__word-limit\">\n    <view class=\"{{ utils.bem('field__word-num', { full: value.length >= maxlength }) }}\">{{ value.length >= maxlength ? maxlength : value.length }}</view>/{{ maxlength }}\n  </label>\n  <label for=\"{{ name }}\"  wx:if=\"{{ errorMessage }}\" class=\"{{ utils.bem('field__error-message', [errorMessageAlign, { disabled, error }]) }}\">\n    {{ errorMessage }}\n  </label>\n</van-cell>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction inputStyle(autosize) {\n  if (autosize && autosize.constructor === 'Object') {\n    return style({\n      'min-height': addUnit(autosize.minHeight),\n      'max-height': addUnit(autosize.maxHeight),\n    });\n  }\n\n  return '';\n}\n\nmodule.exports = {\n  inputStyle: inputStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/index.wxss",
    "content": "@import '../common/index.wxss';.van-field{--cell-icon-size:var(--field-icon-size,16px)}.van-field__label{color:var(--field-label-color,#646566)}.van-field__label--disabled{color:var(--field-disabled-text-color,#c8c9cc)}.van-field__body{align-items:center;display:flex}.van-field__body--textarea{box-sizing:border-box;line-height:1.2em;min-height:var(--cell-line-height,24px);padding:3.6px 0}.van-field__control:empty+.van-field__control{display:block}.van-field__control{background-color:initial;border:0;box-sizing:border-box;color:var(--field-input-text-color,#323233);display:none;height:var(--cell-line-height,24px);line-height:inherit;margin:0;min-height:var(--cell-line-height,24px);padding:0;position:relative;resize:none;text-align:left;width:100%}.van-field__control:empty{display:none}.van-field__control--textarea{height:var(--field-text-area-min-height,18px);min-height:var(--field-text-area-min-height,18px)}.van-field__control--error{color:var(--field-input-error-text-color,#ee0a24)}.van-field__control--disabled{background-color:initial;color:var(--field-input-disabled-text-color,#c8c9cc);opacity:1}.van-field__control--center{text-align:center}.van-field__control--right{text-align:right}.van-field__control--custom{align-items:center;display:flex;min-height:var(--cell-line-height,24px)}.van-field__placeholder{color:var(--field-placeholder-text-color,#c8c9cc);left:0;pointer-events:none;position:absolute;right:0;top:0}.van-field__placeholder--error{color:var(--field-error-message-color,#ee0a24)}.van-field__icon-root{align-items:center;display:flex;min-height:var(--cell-line-height,24px)}.van-field__clear-root,.van-field__icon-container{line-height:inherit;margin-right:calc(var(--padding-xs, 8px)*-1);padding:0 var(--padding-xs,8px);vertical-align:middle}.van-field__button,.van-field__clear-root,.van-field__icon-container{flex-shrink:0}.van-field__clear-root{color:var(--field-clear-icon-color,#c8c9cc);font-size:var(--field-clear-icon-size,16px)}.van-field__icon-container{color:var(--field-icon-container-color,#969799);font-size:var(--field-icon-size,16px)}.van-field__icon-container:empty{display:none}.van-field__button{padding-left:var(--padding-xs,8px)}.van-field__button:empty{display:none}.van-field__error-message{color:var(--field-error-message-color,#ee0a24);display:block;font-size:var(--field-error-message-text-font-size,12px);text-align:left}.van-field__error-message--center{text-align:center}.van-field__error-message--right{text-align:right}.van-field__word-limit{color:var(--field-word-limit-color,#646566);font-size:var(--field-word-limit-font-size,12px);line-height:var(--field-word-limit-line-height,16px);margin-top:var(--padding-base,4px);text-align:right}.van-field__word-num{display:inline}.van-field__word-num--full{color:var(--field-word-num-full-color,#ee0a24)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/input.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<input\n  id=\"{{ name }}\"\n  class=\"{{ utils.bem('field__control', [inputAlign, { disabled, error }]) }} input-class\"\n  type=\"{{ type }}\"\n  focus=\"{{ focus }}\"\n  cursor=\"{{ cursor }}\"\n  value=\"{{ innerValue }}\"\n  auto-focus=\"{{ autoFocus }}\"\n  disabled=\"{{ disabled || readonly }}\"\n  maxlength=\"{{ maxlength }}\"\n  placeholder=\"{{ placeholder }}\"\n  placeholder-style=\"{{ placeholderStyle }}\"\n  placeholder-class=\"{{ utils.bem('field__placeholder', { error }) }}\"\n  confirm-type=\"{{ confirmType }}\"\n  confirm-hold=\"{{ confirmHold }}\"\n  hold-keyboard=\"{{ holdKeyboard }}\"\n  cursor-spacing=\"{{ cursorSpacing }}\"\n  adjust-position=\"{{ adjustPosition }}\"\n  selection-end=\"{{ selectionEnd }}\"\n  selection-start=\"{{ selectionStart }}\"\n  always-embed=\"{{ alwaysEmbed }}\"\n  password=\"{{ password || type === 'password' }}\"\n  bindinput=\"onInput\"\n  bindtap=\"onClickInput\"\n  bindblur=\"onBlur\"\n  bindfocus=\"onFocus\"\n  bindconfirm=\"onConfirm\"\n  bindkeyboardheightchange=\"onKeyboardHeightChange\"\n  bindnicknamereview=\"onBindNicknameReview\"\n/>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/props.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nexport declare const commonProps: WechatMiniprogram.Component.PropertyOption;\nexport declare const inputProps: WechatMiniprogram.Component.PropertyOption;\nexport declare const textareaProps: WechatMiniprogram.Component.PropertyOption;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/props.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.textareaProps = exports.inputProps = exports.commonProps = void 0;\nexports.commonProps = {\n    value: String,\n    placeholder: String,\n    placeholderStyle: String,\n    placeholderClass: String,\n    disabled: Boolean,\n    maxlength: {\n        type: Number,\n        value: -1,\n    },\n    cursorSpacing: {\n        type: Number,\n        value: 50,\n    },\n    autoFocus: Boolean,\n    focus: Boolean,\n    cursor: {\n        type: Number,\n        value: -1,\n    },\n    selectionStart: {\n        type: Number,\n        value: -1,\n    },\n    selectionEnd: {\n        type: Number,\n        value: -1,\n    },\n    adjustPosition: {\n        type: Boolean,\n        value: true,\n    },\n    holdKeyboard: Boolean,\n};\nexports.inputProps = {\n    type: {\n        type: String,\n        value: 'text',\n    },\n    password: Boolean,\n    confirmType: String,\n    confirmHold: Boolean,\n    alwaysEmbed: Boolean,\n};\nexports.textareaProps = {\n    autoHeight: Boolean,\n    fixed: Boolean,\n    showConfirmBar: {\n        type: Boolean,\n        value: true,\n    },\n    disableDefaultPadding: {\n        type: Boolean,\n        value: true,\n    },\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/textarea.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n<textarea\n  id=\"{{ name }}\"\n  class=\"{{ utils.bem('field__control', [inputAlign, type, { disabled, error }]) }} input-class\"\n  fixed=\"{{ fixed }}\"\n  focus=\"{{ focus }}\"\n  cursor=\"{{ cursor }}\"\n  value=\"{{ innerValue }}\"\n  auto-focus=\"{{ autoFocus }}\"\n  disabled=\"{{ disabled || readonly }}\"\n  maxlength=\"{{ maxlength }}\"\n  placeholder=\"{{ placeholder }}\"\n  placeholder-style=\"{{ placeholderStyle }}\"\n  placeholder-class=\"{{ utils.bem('field__placeholder', { error, disabled }) }}\"\n  auto-height=\"{{ !!autosize }}\"\n  style=\"{{ computed.inputStyle(autosize) }}\"\n  cursor-spacing=\"{{ cursorSpacing }}\"\n  adjust-position=\"{{ adjustPosition }}\"\n  show-confirm-bar=\"{{ showConfirmBar }}\"\n  hold-keyboard=\"{{ holdKeyboard }}\"\n  selection-end=\"{{ selectionEnd }}\"\n  selection-start=\"{{ selectionStart }}\"\n  disable-default-padding=\"{{ disableDefaultPadding }}\"\n  bindinput=\"onInput\"\n  bindtap=\"onClickInput\"\n  bindblur=\"onBlur\"\n  bindfocus=\"onFocus\"\n  bindconfirm=\"onConfirm\"\n  bindlinechange=\"onLineChange\"\n  bindkeyboardheightchange=\"onKeyboardHeightChange\"\n/>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/types.d.ts",
    "content": "export interface InputDetails {\n    /** 输入框内容 */\n    value: string;\n    /** 光标位置 */\n    cursor?: number;\n    /** keyCode 为键值 (目前工具还不支持返回keyCode参数) `2.1.0` 起支持 */\n    keyCode?: number;\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/field/types.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('goods-action-button', function () {\n        this.children.forEach(function (item) {\n            item.updateStyle();\n        });\n    }),\n    props: {\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class {{ utils.bem('goods-action', { safe: safeAreaInsetBottom }) }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action/index.wxss",
    "content": "@import '../common/index.wxss';.van-goods-action{align-items:center;background-color:var(--goods-action-background-color,#fff);bottom:0;box-sizing:initial;display:flex;height:var(--goods-action-height,50px);left:0;position:fixed;right:0}.van-goods-action--safe{padding-bottom:env(safe-area-inset-bottom)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-button/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-button/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\nvar button_1 = require(\"../mixins/button\");\nvar link_1 = require(\"../mixins/link\");\n(0, component_1.VantComponent)({\n    mixins: [link_1.link, button_1.button],\n    relation: (0, relation_1.useParent)('goods-action'),\n    props: {\n        text: String,\n        color: String,\n        size: {\n            type: String,\n            value: 'normal',\n        },\n        loading: Boolean,\n        disabled: Boolean,\n        plain: Boolean,\n        type: {\n            type: String,\n            value: 'danger',\n        },\n        customStyle: {\n            type: String,\n            value: '',\n        },\n    },\n    methods: {\n        onClick: function (event) {\n            this.$emit('click', event.detail);\n            this.jumpLink();\n        },\n        updateStyle: function () {\n            if (this.parent == null) {\n                return;\n            }\n            var index = this.index;\n            var _a = this.parent.children, children = _a === void 0 ? [] : _a;\n            this.setData({\n                isFirst: index === 0,\n                isLast: index === children.length - 1,\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-button/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-button\": \"../button/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-button/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<van-button\n  id=\"{{ id }}\"\n  button-id=\"{{ buttonId }}\"\n  lang=\"{{ lang }}\"\n  type=\"{{ type }}\"\n  size=\"{{ size }}\"\n  color=\"{{ color }}\"\n  plain=\"{{ plain }}\"\n  loading=\"{{ loading }}\"\n  disabled=\"{{ disabled }}\"\n  open-type=\"{{ openType }}\"\n  class=\"{{ utils.bem('goods-action-button', [type, { first: isFirst, last: isLast, plain: plain }])}}\"\n  custom-class=\"van-goods-action-button__inner custom-class\"\n  custom-style=\"{{customStyle}}\"\n  business-id=\"{{ businessId }}\"\n  session-from=\"{{ sessionFrom }}\"\n  app-parameter=\"{{ appParameter }}\"\n  send-message-img=\"{{ sendMessageImg }}\"\n  send-message-path=\"{{ sendMessagePath }}\"\n  show-message-card=\"{{ showMessageCard }}\"\n  send-message-title=\"{{ sendMessageTitle }}\"\n  bind:click=\"onClick\"\n  binderror=\"onError\"\n  bindcontact=\"onContact\"\n  bindopensetting=\"onOpenSetting\"\n  bindgetuserinfo=\"onGetUserInfo\"\n  bindagreeprivacyauthorization=\"onAgreePrivacyAuthorization\"\n  bindgetRealTimePhoneNumber=\"onGetRealTimePhoneNumber\"\n  bindgetphonenumber=\"onGetPhoneNumber\"\n  bindlaunchapp=\"onLaunchApp\"\n>\n  {{ text }}\n  <slot></slot>\n</van-button>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-button/index.wxss",
    "content": "@import '../common/index.wxss';:host{flex:1}.van-goods-action-button{--button-warning-background-color:var(--goods-action-button-warning-color,linear-gradient(to right,#ffd01e,#ff8917));--button-danger-background-color:var(--goods-action-button-danger-color,linear-gradient(to right,#ff6034,#ee0a24));--button-default-height:var(--goods-action-button-height,40px);--button-line-height:var(--goods-action-button-line-height,20px);--button-plain-background-color:var(--goods-action-button-plain-color,#fff);--button-border-width:0;display:block}.van-goods-action-button--first{--button-border-radius:999px 0 0 var(--goods-action-button-border-radius,999px);margin-left:5px}.van-goods-action-button--last{--button-border-radius:0 999px var(--goods-action-button-border-radius,999px) 0;margin-right:5px}.van-goods-action-button--first.van-goods-action-button--last{--button-border-radius:var(--goods-action-button-border-radius,999px)}.van-goods-action-button--plain{--button-border-width:1px}.van-goods-action-button__inner{font-weight:var(--font-weight-bold,500)!important;width:100%}@media (max-width:321px){.van-goods-action-button{font-size:13px}}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-icon/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-icon/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar button_1 = require(\"../mixins/button\");\nvar link_1 = require(\"../mixins/link\");\n(0, component_1.VantComponent)({\n    classes: ['icon-class', 'text-class', 'info-class'],\n    mixins: [link_1.link, button_1.button],\n    props: {\n        text: String,\n        dot: Boolean,\n        info: String,\n        icon: String,\n        size: String,\n        color: String,\n        classPrefix: {\n            type: String,\n            value: 'van-icon',\n        },\n        disabled: Boolean,\n        loading: Boolean,\n    },\n    methods: {\n        onClick: function (event) {\n            this.$emit('click', event.detail);\n            this.jumpLink();\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-icon/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-button\": \"../button/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-icon/index.wxml",
    "content": "<van-button\n  square\n  id=\"{{ id }}\"\n  size=\"large\"\n  lang=\"{{ lang }}\"\n  loading=\"{{ loading }}\"\n  disabled=\"{{ disabled }}\"\n  open-type=\"{{ openType }}\"\n  business-id=\"{{ businessId }}\"\n  custom-class=\"van-goods-action-icon\"\n  session-from=\"{{ sessionFrom }}\"\n  app-parameter=\"{{ appParameter }}\"\n  send-message-img=\"{{ sendMessageImg }}\"\n  send-message-path=\"{{ sendMessagePath }}\"\n  show-message-card=\"{{ showMessageCard }}\"\n  send-message-title=\"{{ sendMessageTitle }}\"\n  bind:click=\"onClick\"\n  binderror=\"onError\"\n  bindcontact=\"onContact\"\n  bindopensetting=\"onOpenSetting\"\n  bindgetuserinfo=\"onGetUserInfo\"\n  bindgetphonenumber=\"onGetPhoneNumber\"\n  bindlaunchapp=\"onLaunchApp\"\n>\n  <van-icon\n    wx:if=\"{{ icon }}\"\n    name=\"{{ icon }}\"\n    dot=\"{{ dot }}\"\n    info=\"{{ info }}\"\n    size=\"{{ size }}\"\n    color=\"{{ color }}\"\n    class-prefix=\"{{ classPrefix }}\"\n    class=\"van-goods-action-icon__icon\"\n    custom-class=\"icon-class\"\n    info-class=\"info-class\"\n  />\n  <view wx:else>\n    <slot name=\"icon\" />\n  </view>\n  <text class=\"text-class\">{{ text }}</text>\n</van-button>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/goods-action-icon/index.wxss",
    "content": "@import '../common/index.wxss';.van-goods-action-icon{border:none!important;color:var(--goods-action-icon-text-color,#646566)!important;display:flex!important;flex-direction:column;font-size:var(--goods-action-icon-font-size,10px)!important;height:var(--goods-action-icon-height,50px)!important;justify-content:center!important;line-height:1!important;min-width:var(--goods-action-icon-width,48px)}.van-goods-action-icon__icon{color:var(--goods-action-icon-color,#323233);display:flex;font-size:var(--goods-action-icon-size,18px);margin:0 auto 5px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('grid-item'),\n    props: {\n        square: {\n            type: Boolean,\n            observer: 'updateChildren',\n        },\n        gutter: {\n            type: null,\n            value: 0,\n            observer: 'updateChildren',\n        },\n        clickable: {\n            type: Boolean,\n            observer: 'updateChildren',\n        },\n        columnNum: {\n            type: Number,\n            value: 4,\n            observer: 'updateChildren',\n        },\n        center: {\n            type: Boolean,\n            value: true,\n            observer: 'updateChildren',\n        },\n        border: {\n            type: Boolean,\n            value: true,\n            observer: 'updateChildren',\n        },\n        direction: {\n            type: String,\n            observer: 'updateChildren',\n        },\n        iconSize: {\n            type: String,\n            observer: 'updateChildren',\n        },\n        reverse: {\n            type: Boolean,\n            value: false,\n            observer: 'updateChildren',\n        },\n    },\n    methods: {\n        updateChildren: function () {\n            this.children.forEach(function (child) {\n                child.updateStyle();\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"van-grid custom-class {{ border && !gutter ? 'van-hairline--top' : '' }}\"\n  style=\"{{ computed.rootStyle({ gutter }) }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  return style({\n    'padding-left': addUnit(data.gutter),\n  });\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid/index.wxss",
    "content": "@import '../common/index.wxss';.van-grid{box-sizing:border-box;overflow:hidden;position:relative}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid-item/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\nvar link_1 = require(\"../mixins/link\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useParent)('grid'),\n    classes: ['content-class', 'icon-class', 'text-class'],\n    mixins: [link_1.link],\n    props: {\n        icon: String,\n        iconColor: String,\n        iconPrefix: {\n            type: String,\n            value: 'van-icon',\n        },\n        dot: Boolean,\n        info: null,\n        badge: null,\n        text: String,\n        useSlot: Boolean,\n    },\n    data: {\n        viewStyle: '',\n    },\n    mounted: function () {\n        this.updateStyle();\n    },\n    methods: {\n        updateStyle: function () {\n            if (!this.parent) {\n                return;\n            }\n            var _a = this.parent, data = _a.data, children = _a.children;\n            var columnNum = data.columnNum, border = data.border, square = data.square, gutter = data.gutter, clickable = data.clickable, center = data.center, direction = data.direction, reverse = data.reverse, iconSize = data.iconSize;\n            this.setData({\n                center: center,\n                border: border,\n                square: square,\n                gutter: gutter,\n                clickable: clickable,\n                direction: direction,\n                reverse: reverse,\n                iconSize: iconSize,\n                index: children.indexOf(this),\n                columnNum: columnNum,\n            });\n        },\n        onClick: function () {\n            this.$emit('click');\n            this.jumpLink();\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"custom-class {{ utils.bem('grid-item', { square }) }}\"\n  style=\"{{ computed.wrapperStyle({ square, gutter, columnNum, index }) }}\"\n  bindtap=\"onClick\"\n>\n  <view\n    class=\"content-class {{ utils.bem('grid-item__content', [direction, { center, square, reverse, clickable, surround: border && gutter }]) }} {{ border ? 'van-hairline--surround' : '' }}\"\n    style=\"{{ computed.contentStyle({ square, gutter }) }}\"\n  >\n    <block wx:if=\"{{ useSlot }}\">\n      <slot />\n    </block>\n    <block wx:else>\n      <view class=\"van-grid-item__icon icon-class\">\n        <van-icon wx:if=\"{{ icon }}\" name=\"{{ icon }}\" color=\"{{ iconColor }}\" class-prefix=\"{{ iconPrefix }}\" dot=\"{{ dot }}\" info=\"{{ badge || info }}\" size=\"{{ iconSize }}\" />\n        <slot wx:else name=\"icon\"></slot>\n      </view>\n      <view class=\"van-grid-item__text text-class\">\n        <text wx:if=\"{{ text }}\">{{ text }}</text>\n        <slot wx:else name=\"text\"></slot>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid-item/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction wrapperStyle(data) {\n  var width = 100 / data.columnNum + '%';\n\n  return style({\n    width: width,\n    'padding-top': data.square ? width : null,\n    'padding-right': addUnit(data.gutter),\n    'margin-top':\n      data.index >= data.columnNum && !data.square\n        ? addUnit(data.gutter)\n        : null,\n  });\n}\n\nfunction contentStyle(data) {\n  return data.square\n    ? style({\n        right: addUnit(data.gutter),\n        bottom: addUnit(data.gutter),\n        height: 'auto',\n      })\n    : '';\n}\n\nmodule.exports = {\n  wrapperStyle: wrapperStyle,\n  contentStyle: contentStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/grid-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-grid-item{box-sizing:border-box;float:left;position:relative}.van-grid-item--square{height:0}.van-grid-item__content{background-color:var(--grid-item-content-background-color,#fff);box-sizing:border-box;display:flex;flex-direction:column;height:100%;padding:var(--grid-item-content-padding,16px 8px)}.van-grid-item__content:after{border-width:0 1px 1px 0;z-index:1}.van-grid-item__content--surround:after{border-width:1px}.van-grid-item__content--center{align-items:center;justify-content:center}.van-grid-item__content--square{left:0;position:absolute;right:0;top:0}.van-grid-item__content--horizontal{flex-direction:row}.van-grid-item__content--horizontal .van-grid-item__text{margin:0 0 0 8px}.van-grid-item__content--reverse{flex-direction:column-reverse}.van-grid-item__content--reverse .van-grid-item__text{margin:0 0 8px}.van-grid-item__content--horizontal.van-grid-item__content--reverse{flex-direction:row-reverse}.van-grid-item__content--horizontal.van-grid-item__content--reverse .van-grid-item__text{margin:0 8px 0 0}.van-grid-item__content--clickable:active{background-color:var(--grid-item-content-active-color,#f2f3f5)}.van-grid-item__icon{align-items:center;display:flex;font-size:var(--grid-item-icon-size,26px);height:var(--grid-item-icon-size,26px)}.van-grid-item__text{word-wrap:break-word;color:var(--grid-item-text-color,#646566);font-size:var(--grid-item-text-font-size,12px)}.van-grid-item__icon+.van-grid-item__text{margin-top:8px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/icon/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/icon/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: ['info-class'],\n    props: {\n        dot: Boolean,\n        info: null,\n        size: null,\n        color: String,\n        customStyle: String,\n        classPrefix: {\n            type: String,\n            value: 'van-icon',\n        },\n        name: String,\n    },\n    methods: {\n        onClick: function () {\n            this.$emit('click');\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/icon/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-info\": \"../info/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/icon/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"{{ computed.rootClass({ classPrefix, name }) }}\"\n  style=\"{{ computed.rootStyle({ customStyle, color, size }) }}\"\n  bindtap=\"onClick\"\n>\n  <van-info\n    wx:if=\"{{ info !== null || dot }}\"\n    dot=\"{{ dot }}\"\n    info=\"{{ info }}\"\n    custom-class=\"van-icon__info info-class\"\n  />\n  <image\n    wx:if=\"{{ computed.isImage(name) }}\"\n    src=\"{{ name }}\"\n    mode=\"aspectFit\"\n    class=\"van-icon__image\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/icon/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction isImage(name) {\n  return name.indexOf('/') !== -1;\n}\n\nfunction rootClass(data) {\n  var classes = ['custom-class'];\n\n  if (data.classPrefix !== 'van-icon') {\n    classes.push('van-icon--custom')\n  }\n\n  if (data.classPrefix != null) {\n    classes.push(data.classPrefix);\n  }\n\n  if (isImage(data.name)) {\n    classes.push('van-icon--image');\n  } else if (data.classPrefix != null) {\n    classes.push(data.classPrefix + '-' + data.name);\n  }\n\n  return classes.join(' ');\n}\n\nfunction rootStyle(data) {\n  return style([\n    {\n      color: data.color,\n      'font-size': addUnit(data.size),\n    },\n    data.customStyle,\n  ]);\n}\n\nmodule.exports = {\n  isImage: isImage,\n  rootClass: rootClass,\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/icon/index.wxss",
    "content": "@import '../common/index.wxss';.van-icon{text-rendering:auto;-webkit-font-smoothing:antialiased;font:normal normal normal 14px/1 vant-icon;font:normal normal normal 14px/1 var(--van-icon-font-family,\"vant-icon\");font-size:inherit;position:relative}.van-icon,.van-icon:before{display:inline-block}.van-icon-contact:before{content:\"\\e753\"}.van-icon-notes:before{content:\"\\e63c\"}.van-icon-records:before{content:\"\\e63d\"}.van-icon-cash-back-record:before{content:\"\\e63e\"}.van-icon-newspaper:before{content:\"\\e63f\"}.van-icon-discount:before{content:\"\\e640\"}.van-icon-completed:before{content:\"\\e641\"}.van-icon-user:before{content:\"\\e642\"}.van-icon-description:before{content:\"\\e643\"}.van-icon-list-switch:before{content:\"\\e6ad\"}.van-icon-list-switching:before{content:\"\\e65a\"}.van-icon-link-o:before{content:\"\\e751\"}.van-icon-miniprogram-o:before{content:\"\\e752\"}.van-icon-qq:before{content:\"\\e74e\"}.van-icon-wechat-moments:before{content:\"\\e74f\"}.van-icon-weibo:before{content:\"\\e750\"}.van-icon-cash-o:before{content:\"\\e74d\"}.van-icon-guide-o:before{content:\"\\e74c\"}.van-icon-invitation:before{content:\"\\e6d6\"}.van-icon-shield-o:before{content:\"\\e74b\"}.van-icon-exchange:before{content:\"\\e6af\"}.van-icon-eye:before{content:\"\\e6b0\"}.van-icon-enlarge:before{content:\"\\e6b1\"}.van-icon-expand-o:before{content:\"\\e6b2\"}.van-icon-eye-o:before{content:\"\\e6b3\"}.van-icon-expand:before{content:\"\\e6b4\"}.van-icon-filter-o:before{content:\"\\e6b5\"}.van-icon-fire:before{content:\"\\e6b6\"}.van-icon-fail:before{content:\"\\e6b7\"}.van-icon-failure:before{content:\"\\e6b8\"}.van-icon-fire-o:before{content:\"\\e6b9\"}.van-icon-flag-o:before{content:\"\\e6ba\"}.van-icon-font:before{content:\"\\e6bb\"}.van-icon-font-o:before{content:\"\\e6bc\"}.van-icon-gem-o:before{content:\"\\e6bd\"}.van-icon-flower-o:before{content:\"\\e6be\"}.van-icon-gem:before{content:\"\\e6bf\"}.van-icon-gift-card:before{content:\"\\e6c0\"}.van-icon-friends:before{content:\"\\e6c1\"}.van-icon-friends-o:before{content:\"\\e6c2\"}.van-icon-gold-coin:before{content:\"\\e6c3\"}.van-icon-gold-coin-o:before{content:\"\\e6c4\"}.van-icon-good-job-o:before{content:\"\\e6c5\"}.van-icon-gift:before{content:\"\\e6c6\"}.van-icon-gift-o:before{content:\"\\e6c7\"}.van-icon-gift-card-o:before{content:\"\\e6c8\"}.van-icon-good-job:before{content:\"\\e6c9\"}.van-icon-home-o:before{content:\"\\e6ca\"}.van-icon-goods-collect:before{content:\"\\e6cb\"}.van-icon-graphic:before{content:\"\\e6cc\"}.van-icon-goods-collect-o:before{content:\"\\e6cd\"}.van-icon-hot-o:before{content:\"\\e6ce\"}.van-icon-info:before{content:\"\\e6cf\"}.van-icon-hotel-o:before{content:\"\\e6d0\"}.van-icon-info-o:before{content:\"\\e6d1\"}.van-icon-hot-sale-o:before{content:\"\\e6d2\"}.van-icon-hot:before{content:\"\\e6d3\"}.van-icon-like:before{content:\"\\e6d4\"}.van-icon-idcard:before{content:\"\\e6d5\"}.van-icon-like-o:before{content:\"\\e6d7\"}.van-icon-hot-sale:before{content:\"\\e6d8\"}.van-icon-location-o:before{content:\"\\e6d9\"}.van-icon-location:before{content:\"\\e6da\"}.van-icon-label:before{content:\"\\e6db\"}.van-icon-lock:before{content:\"\\e6dc\"}.van-icon-label-o:before{content:\"\\e6dd\"}.van-icon-map-marked:before{content:\"\\e6de\"}.van-icon-logistics:before{content:\"\\e6df\"}.van-icon-manager:before{content:\"\\e6e0\"}.van-icon-more:before{content:\"\\e6e1\"}.van-icon-live:before{content:\"\\e6e2\"}.van-icon-manager-o:before{content:\"\\e6e3\"}.van-icon-medal:before{content:\"\\e6e4\"}.van-icon-more-o:before{content:\"\\e6e5\"}.van-icon-music-o:before{content:\"\\e6e6\"}.van-icon-music:before{content:\"\\e6e7\"}.van-icon-new-arrival-o:before{content:\"\\e6e8\"}.van-icon-medal-o:before{content:\"\\e6e9\"}.van-icon-new-o:before{content:\"\\e6ea\"}.van-icon-free-postage:before{content:\"\\e6eb\"}.van-icon-newspaper-o:before{content:\"\\e6ec\"}.van-icon-new-arrival:before{content:\"\\e6ed\"}.van-icon-minus:before{content:\"\\e6ee\"}.van-icon-orders-o:before{content:\"\\e6ef\"}.van-icon-new:before{content:\"\\e6f0\"}.van-icon-paid:before{content:\"\\e6f1\"}.van-icon-notes-o:before{content:\"\\e6f2\"}.van-icon-other-pay:before{content:\"\\e6f3\"}.van-icon-pause-circle:before{content:\"\\e6f4\"}.van-icon-pause:before{content:\"\\e6f5\"}.van-icon-pause-circle-o:before{content:\"\\e6f6\"}.van-icon-peer-pay:before{content:\"\\e6f7\"}.van-icon-pending-payment:before{content:\"\\e6f8\"}.van-icon-passed:before{content:\"\\e6f9\"}.van-icon-plus:before{content:\"\\e6fa\"}.van-icon-phone-circle-o:before{content:\"\\e6fb\"}.van-icon-phone-o:before{content:\"\\e6fc\"}.van-icon-printer:before{content:\"\\e6fd\"}.van-icon-photo-fail:before{content:\"\\e6fe\"}.van-icon-phone:before{content:\"\\e6ff\"}.van-icon-photo-o:before{content:\"\\e700\"}.van-icon-play-circle:before{content:\"\\e701\"}.van-icon-play:before{content:\"\\e702\"}.van-icon-phone-circle:before{content:\"\\e703\"}.van-icon-point-gift-o:before{content:\"\\e704\"}.van-icon-point-gift:before{content:\"\\e705\"}.van-icon-play-circle-o:before{content:\"\\e706\"}.van-icon-shrink:before{content:\"\\e707\"}.van-icon-photo:before{content:\"\\e708\"}.van-icon-qr:before{content:\"\\e709\"}.van-icon-qr-invalid:before{content:\"\\e70a\"}.van-icon-question-o:before{content:\"\\e70b\"}.van-icon-revoke:before{content:\"\\e70c\"}.van-icon-replay:before{content:\"\\e70d\"}.van-icon-service:before{content:\"\\e70e\"}.van-icon-question:before{content:\"\\e70f\"}.van-icon-search:before{content:\"\\e710\"}.van-icon-refund-o:before{content:\"\\e711\"}.van-icon-service-o:before{content:\"\\e712\"}.van-icon-scan:before{content:\"\\e713\"}.van-icon-share:before{content:\"\\e714\"}.van-icon-send-gift-o:before{content:\"\\e715\"}.van-icon-share-o:before{content:\"\\e716\"}.van-icon-setting:before{content:\"\\e717\"}.van-icon-points:before{content:\"\\e718\"}.van-icon-photograph:before{content:\"\\e719\"}.van-icon-shop:before{content:\"\\e71a\"}.van-icon-shop-o:before{content:\"\\e71b\"}.van-icon-shop-collect-o:before{content:\"\\e71c\"}.van-icon-shop-collect:before{content:\"\\e71d\"}.van-icon-smile:before{content:\"\\e71e\"}.van-icon-shopping-cart-o:before{content:\"\\e71f\"}.van-icon-sign:before{content:\"\\e720\"}.van-icon-sort:before{content:\"\\e721\"}.van-icon-star-o:before{content:\"\\e722\"}.van-icon-smile-comment-o:before{content:\"\\e723\"}.van-icon-stop:before{content:\"\\e724\"}.van-icon-stop-circle-o:before{content:\"\\e725\"}.van-icon-smile-o:before{content:\"\\e726\"}.van-icon-star:before{content:\"\\e727\"}.van-icon-success:before{content:\"\\e728\"}.van-icon-stop-circle:before{content:\"\\e729\"}.van-icon-records-o:before{content:\"\\e72a\"}.van-icon-shopping-cart:before{content:\"\\e72b\"}.van-icon-tosend:before{content:\"\\e72c\"}.van-icon-todo-list:before{content:\"\\e72d\"}.van-icon-thumb-circle-o:before{content:\"\\e72e\"}.van-icon-thumb-circle:before{content:\"\\e72f\"}.van-icon-umbrella-circle:before{content:\"\\e730\"}.van-icon-underway:before{content:\"\\e731\"}.van-icon-upgrade:before{content:\"\\e732\"}.van-icon-todo-list-o:before{content:\"\\e733\"}.van-icon-tv-o:before{content:\"\\e734\"}.van-icon-underway-o:before{content:\"\\e735\"}.van-icon-user-o:before{content:\"\\e736\"}.van-icon-vip-card-o:before{content:\"\\e737\"}.van-icon-vip-card:before{content:\"\\e738\"}.van-icon-send-gift:before{content:\"\\e739\"}.van-icon-wap-home:before{content:\"\\e73a\"}.van-icon-wap-nav:before{content:\"\\e73b\"}.van-icon-volume-o:before{content:\"\\e73c\"}.van-icon-video:before{content:\"\\e73d\"}.van-icon-wap-home-o:before{content:\"\\e73e\"}.van-icon-volume:before{content:\"\\e73f\"}.van-icon-warning:before{content:\"\\e740\"}.van-icon-weapp-nav:before{content:\"\\e741\"}.van-icon-wechat-pay:before{content:\"\\e742\"}.van-icon-warning-o:before{content:\"\\e743\"}.van-icon-wechat:before{content:\"\\e744\"}.van-icon-setting-o:before{content:\"\\e745\"}.van-icon-youzan-shield:before{content:\"\\e746\"}.van-icon-warn-o:before{content:\"\\e747\"}.van-icon-smile-comment:before{content:\"\\e748\"}.van-icon-user-circle-o:before{content:\"\\e749\"}.van-icon-video-o:before{content:\"\\e74a\"}.van-icon-add-square:before{content:\"\\e65c\"}.van-icon-add:before{content:\"\\e65d\"}.van-icon-arrow-down:before{content:\"\\e65e\"}.van-icon-arrow-up:before{content:\"\\e65f\"}.van-icon-arrow:before{content:\"\\e660\"}.van-icon-after-sale:before{content:\"\\e661\"}.van-icon-add-o:before{content:\"\\e662\"}.van-icon-alipay:before{content:\"\\e663\"}.van-icon-ascending:before{content:\"\\e664\"}.van-icon-apps-o:before{content:\"\\e665\"}.van-icon-aim:before{content:\"\\e666\"}.van-icon-award:before{content:\"\\e667\"}.van-icon-arrow-left:before{content:\"\\e668\"}.van-icon-award-o:before{content:\"\\e669\"}.van-icon-audio:before{content:\"\\e66a\"}.van-icon-bag-o:before{content:\"\\e66b\"}.van-icon-balance-list:before{content:\"\\e66c\"}.van-icon-back-top:before{content:\"\\e66d\"}.van-icon-bag:before{content:\"\\e66e\"}.van-icon-balance-pay:before{content:\"\\e66f\"}.van-icon-balance-o:before{content:\"\\e670\"}.van-icon-bar-chart-o:before{content:\"\\e671\"}.van-icon-bars:before{content:\"\\e672\"}.van-icon-balance-list-o:before{content:\"\\e673\"}.van-icon-birthday-cake-o:before{content:\"\\e674\"}.van-icon-bookmark:before{content:\"\\e675\"}.van-icon-bill:before{content:\"\\e676\"}.van-icon-bell:before{content:\"\\e677\"}.van-icon-browsing-history-o:before{content:\"\\e678\"}.van-icon-browsing-history:before{content:\"\\e679\"}.van-icon-bookmark-o:before{content:\"\\e67a\"}.van-icon-bulb-o:before{content:\"\\e67b\"}.van-icon-bullhorn-o:before{content:\"\\e67c\"}.van-icon-bill-o:before{content:\"\\e67d\"}.van-icon-calendar-o:before{content:\"\\e67e\"}.van-icon-brush-o:before{content:\"\\e67f\"}.van-icon-card:before{content:\"\\e680\"}.van-icon-cart-o:before{content:\"\\e681\"}.van-icon-cart-circle:before{content:\"\\e682\"}.van-icon-cart-circle-o:before{content:\"\\e683\"}.van-icon-cart:before{content:\"\\e684\"}.van-icon-cash-on-deliver:before{content:\"\\e685\"}.van-icon-cash-back-record-o:before{content:\"\\e686\"}.van-icon-cashier-o:before{content:\"\\e687\"}.van-icon-chart-trending-o:before{content:\"\\e688\"}.van-icon-certificate:before{content:\"\\e689\"}.van-icon-chat:before{content:\"\\e68a\"}.van-icon-clear:before{content:\"\\e68b\"}.van-icon-chat-o:before{content:\"\\e68c\"}.van-icon-checked:before{content:\"\\e68d\"}.van-icon-clock:before{content:\"\\e68e\"}.van-icon-clock-o:before{content:\"\\e68f\"}.van-icon-close:before{content:\"\\e690\"}.van-icon-closed-eye:before{content:\"\\e691\"}.van-icon-circle:before{content:\"\\e692\"}.van-icon-cluster-o:before{content:\"\\e693\"}.van-icon-column:before{content:\"\\e694\"}.van-icon-comment-circle-o:before{content:\"\\e695\"}.van-icon-cluster:before{content:\"\\e696\"}.van-icon-comment:before{content:\"\\e697\"}.van-icon-comment-o:before{content:\"\\e698\"}.van-icon-comment-circle:before{content:\"\\e699\"}.van-icon-completed-o:before{content:\"\\e69a\"}.van-icon-credit-pay:before{content:\"\\e69b\"}.van-icon-coupon:before{content:\"\\e69c\"}.van-icon-debit-pay:before{content:\"\\e69d\"}.van-icon-coupon-o:before{content:\"\\e69e\"}.van-icon-contact-o:before{content:\"\\e69f\"}.van-icon-descending:before{content:\"\\e6a0\"}.van-icon-desktop-o:before{content:\"\\e6a1\"}.van-icon-diamond-o:before{content:\"\\e6a2\"}.van-icon-description-o:before{content:\"\\e6a3\"}.van-icon-delete:before{content:\"\\e6a4\"}.van-icon-diamond:before{content:\"\\e6a5\"}.van-icon-delete-o:before{content:\"\\e6a6\"}.van-icon-cross:before{content:\"\\e6a7\"}.van-icon-edit:before{content:\"\\e6a8\"}.van-icon-ellipsis:before{content:\"\\e6a9\"}.van-icon-down:before{content:\"\\e6aa\"}.van-icon-discount-o:before{content:\"\\e6ab\"}.van-icon-ecard-pay:before{content:\"\\e6ac\"}.van-icon-envelop-o:before{content:\"\\e6ae\"}@font-face{font-display:auto;font-family:vant-icon;font-style:normal;font-weight:400;src:url(//at.alicdn.com/t/c/font_2553510_kfwma2yq1rs.woff2?t=1694918397022) format(\"woff2\"),url(//at.alicdn.com/t/c/font_2553510_kfwma2yq1rs.woff?t=1694918397022) format(\"woff\")}:host{align-items:center;display:inline-flex;justify-content:center}.van-icon--custom{position:relative}.van-icon--image{height:1em;width:1em}.van-icon__image{height:100%;width:100%}.van-icon__info{z-index:1}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/image/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/image/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar button_1 = require(\"../mixins/button\");\n(0, component_1.VantComponent)({\n    mixins: [button_1.button],\n    classes: ['custom-class', 'loading-class', 'error-class', 'image-class'],\n    props: {\n        src: {\n            type: String,\n            observer: function () {\n                this.setData({\n                    error: false,\n                    loading: true,\n                });\n            },\n        },\n        round: Boolean,\n        width: null,\n        height: null,\n        radius: null,\n        lazyLoad: Boolean,\n        useErrorSlot: Boolean,\n        useLoadingSlot: Boolean,\n        showMenuByLongpress: Boolean,\n        fit: {\n            type: String,\n            value: 'fill',\n        },\n        webp: {\n            type: Boolean,\n            value: false,\n        },\n        showError: {\n            type: Boolean,\n            value: true,\n        },\n        showLoading: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        error: false,\n        loading: true,\n        viewStyle: '',\n    },\n    methods: {\n        onLoad: function (event) {\n            this.setData({\n                loading: false,\n            });\n            this.$emit('load', event.detail);\n        },\n        onError: function (event) {\n            this.setData({\n                loading: false,\n                error: true,\n            });\n            this.$emit('error', event.detail);\n        },\n        onClick: function (event) {\n            this.$emit('click', event.detail);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/image/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/image/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  style=\"{{ computed.rootStyle({ width, height, radius }) }}\"\n  class=\"custom-class {{ utils.bem('image', { round })}}\"\n  bind:tap=\"onClick\"\n>\n  <image\n    wx:if=\"{{ !error }}\"\n    src=\"{{ src }}\"\n    mode=\"{{ computed.mode(fit) }}\"\n    lazy-load=\"{{ lazyLoad }}\"\n    webp=\"{{ webp }}\"\n    class=\"image-class van-image__img\"\n    show-menu-by-longpress=\"{{ showMenuByLongpress }}\"\n    bind:load=\"onLoad\"\n    bind:error=\"onError\"\n  />\n\n  <view\n    wx:if=\"{{ loading && showLoading }}\"\n    class=\"loading-class van-image__loading\"\n  >\n    <slot wx:if=\"{{ useLoadingSlot }}\" name=\"loading\" />\n    <van-icon wx:else name=\"photo\" custom-class=\"van-image__loading-icon\" />\n  </view>\n  <view\n    wx:if=\"{{ error && showError }}\"\n    class=\"error-class van-image__error\"\n  >\n    <slot wx:if=\"{{ useErrorSlot }}\" name=\"error\" />\n    <van-icon wx:else name=\"photo-fail\" custom-class=\"van-image__error-icon\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/image/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  return style([\n    {\n      width: addUnit(data.width),\n      height: addUnit(data.height),\n      'border-radius': addUnit(data.radius),\n    },\n    data.radius ? 'overflow: hidden' : null,\n  ]);\n}\n\nvar FIT_MODE_MAP = {\n  none: 'center',\n  fill: 'scaleToFill',\n  cover: 'aspectFill',\n  contain: 'aspectFit',\n  widthFix: 'widthFix',\n  heightFix: 'heightFix',\n};\n\nfunction mode(fit) {\n  return FIT_MODE_MAP[fit];\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n  mode: mode,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/image/index.wxss",
    "content": "@import '../common/index.wxss';.van-image{display:inline-block;position:relative;vertical-align:top}.van-image--round{border-radius:50%;overflow:hidden}.van-image--round .van-image__img{border-radius:inherit}.van-image__error,.van-image__img,.van-image__loading{display:block;height:100%;width:100%}.van-image__error,.van-image__loading{align-items:center;background-color:var(--image-placeholder-background-color,#f7f8fa);color:var(--image-placeholder-text-color,#969799);display:flex;flex-direction:column;font-size:var(--image-placeholder-font-size,14px);justify-content:center;left:0;position:absolute;top:0}.van-image__loading-icon{color:var(--image-loading-icon-color,#dcdee0);font-size:var(--image-loading-icon-size,32px)!important}.van-image__error-icon{color:var(--image-error-icon-color,#dcdee0);font-size:var(--image-error-icon-size,32px)!important}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-anchor/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-anchor/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../common/utils\");\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useParent)('index-bar'),\n    props: {\n        useSlot: Boolean,\n        index: null,\n    },\n    data: {\n        active: false,\n        wrapperStyle: '',\n        anchorStyle: '',\n    },\n    methods: {\n        scrollIntoView: function (scrollTop) {\n            var _this = this;\n            (0, utils_1.getRect)(this, '.van-index-anchor-wrapper').then(function (rect) {\n                wx.pageScrollTo({\n                    duration: 0,\n                    scrollTop: scrollTop + rect.top - _this.parent.data.stickyOffsetTop,\n                });\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-anchor/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-anchor/index.wxml",
    "content": "<view\n  class=\"van-index-anchor-wrapper\"\n  style=\"{{ wrapperStyle }}\"\n>\n  <view\n    class=\"van-index-anchor {{ active ? 'van-index-anchor--active van-hairline--bottom' : '' }}\"\n    style=\"{{ anchorStyle }}\"\n  >\n    <slot wx:if=\"{{ useSlot }}\"/>\n    <block wx:else>\n      <text>{{ index }}</text>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-anchor/index.wxss",
    "content": "@import '../common/index.wxss';.van-index-anchor{background-color:var(--index-anchor-background-color,transparent);color:var(--index-anchor-text-color,#323233);font-size:var(--index-anchor-font-size,14px);font-weight:var(--index-anchor-font-weight,500);line-height:var(--index-anchor-line-height,32px);padding:var(--index-anchor-padding,0 16px)}.van-index-anchor--active{background-color:var(--index-anchor-active-background-color,#fff);color:var(--index-anchor-active-text-color,#07c160);left:0;right:0}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-bar/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../common/color\");\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\nvar utils_1 = require(\"../common/utils\");\nvar page_scroll_1 = require(\"../mixins/page-scroll\");\nvar indexList = function () {\n    var indexList = [];\n    var charCodeOfA = 'A'.charCodeAt(0);\n    for (var i = 0; i < 26; i++) {\n        indexList.push(String.fromCharCode(charCodeOfA + i));\n    }\n    return indexList;\n};\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('index-anchor', function () {\n        this.updateData();\n    }),\n    props: {\n        sticky: {\n            type: Boolean,\n            value: true,\n        },\n        zIndex: {\n            type: Number,\n            value: 1,\n        },\n        highlightColor: {\n            type: String,\n            value: color_1.GREEN,\n        },\n        stickyOffsetTop: {\n            type: Number,\n            value: 0,\n        },\n        indexList: {\n            type: Array,\n            value: indexList(),\n        },\n    },\n    mixins: [\n        (0, page_scroll_1.pageScrollMixin)(function (event) {\n            this.scrollTop = (event === null || event === void 0 ? void 0 : event.scrollTop) || 0;\n            this.onScroll();\n        }),\n    ],\n    data: {\n        activeAnchorIndex: null,\n        showSidebar: false,\n    },\n    created: function () {\n        this.scrollTop = 0;\n    },\n    methods: {\n        updateData: function () {\n            var _this = this;\n            wx.nextTick(function () {\n                if (_this.timer != null) {\n                    clearTimeout(_this.timer);\n                }\n                _this.timer = setTimeout(function () {\n                    _this.setData({\n                        showSidebar: !!_this.children.length,\n                    });\n                    _this.setRect().then(function () {\n                        _this.onScroll();\n                    });\n                }, 0);\n            });\n        },\n        setRect: function () {\n            return Promise.all([\n                this.setAnchorsRect(),\n                this.setListRect(),\n                this.setSiderbarRect(),\n            ]);\n        },\n        setAnchorsRect: function () {\n            var _this = this;\n            return Promise.all(this.children.map(function (anchor) {\n                return (0, utils_1.getRect)(anchor, '.van-index-anchor-wrapper').then(function (rect) {\n                    Object.assign(anchor, {\n                        height: rect.height,\n                        top: rect.top + _this.scrollTop,\n                    });\n                });\n            }));\n        },\n        setListRect: function () {\n            var _this = this;\n            return (0, utils_1.getRect)(this, '.van-index-bar').then(function (rect) {\n                if (!(0, utils_1.isDef)(rect)) {\n                    return;\n                }\n                Object.assign(_this, {\n                    height: rect.height,\n                    top: rect.top + _this.scrollTop,\n                });\n            });\n        },\n        setSiderbarRect: function () {\n            var _this = this;\n            return (0, utils_1.getRect)(this, '.van-index-bar__sidebar').then(function (res) {\n                if (!(0, utils_1.isDef)(res)) {\n                    return;\n                }\n                _this.sidebar = {\n                    height: res.height,\n                    top: res.top,\n                };\n            });\n        },\n        setDiffData: function (_a) {\n            var target = _a.target, data = _a.data;\n            var diffData = {};\n            Object.keys(data).forEach(function (key) {\n                if (target.data[key] !== data[key]) {\n                    diffData[key] = data[key];\n                }\n            });\n            if (Object.keys(diffData).length) {\n                target.setData(diffData);\n            }\n        },\n        getAnchorRect: function (anchor) {\n            return (0, utils_1.getRect)(anchor, '.van-index-anchor-wrapper').then(function (rect) { return ({\n                height: rect.height,\n                top: rect.top,\n            }); });\n        },\n        getActiveAnchorIndex: function () {\n            var _a = this, children = _a.children, scrollTop = _a.scrollTop;\n            var _b = this.data, sticky = _b.sticky, stickyOffsetTop = _b.stickyOffsetTop;\n            for (var i = this.children.length - 1; i >= 0; i--) {\n                var preAnchorHeight = i > 0 ? children[i - 1].height : 0;\n                var reachTop = sticky ? preAnchorHeight + stickyOffsetTop : 0;\n                if (reachTop + scrollTop >= children[i].top) {\n                    return i;\n                }\n            }\n            return -1;\n        },\n        onScroll: function () {\n            var _this = this;\n            var _a = this, _b = _a.children, children = _b === void 0 ? [] : _b, scrollTop = _a.scrollTop;\n            if (!children.length) {\n                return;\n            }\n            var _c = this.data, sticky = _c.sticky, stickyOffsetTop = _c.stickyOffsetTop, zIndex = _c.zIndex, highlightColor = _c.highlightColor;\n            var active = this.getActiveAnchorIndex();\n            this.setDiffData({\n                target: this,\n                data: {\n                    activeAnchorIndex: active,\n                },\n            });\n            if (sticky) {\n                var isActiveAnchorSticky_1 = false;\n                if (active !== -1) {\n                    isActiveAnchorSticky_1 =\n                        children[active].top <= stickyOffsetTop + scrollTop;\n                }\n                children.forEach(function (item, index) {\n                    if (index === active) {\n                        var wrapperStyle = '';\n                        var anchorStyle = \"\\n              color: \".concat(highlightColor, \";\\n            \");\n                        if (isActiveAnchorSticky_1) {\n                            wrapperStyle = \"\\n                height: \".concat(children[index].height, \"px;\\n              \");\n                            anchorStyle = \"\\n                position: fixed;\\n                top: \".concat(stickyOffsetTop, \"px;\\n                z-index: \").concat(zIndex, \";\\n                color: \").concat(highlightColor, \";\\n              \");\n                        }\n                        _this.setDiffData({\n                            target: item,\n                            data: {\n                                active: true,\n                                anchorStyle: anchorStyle,\n                                wrapperStyle: wrapperStyle,\n                            },\n                        });\n                    }\n                    else if (index === active - 1) {\n                        var currentAnchor = children[index];\n                        var currentOffsetTop = currentAnchor.top;\n                        var targetOffsetTop = index === children.length - 1\n                            ? _this.top\n                            : children[index + 1].top;\n                        var parentOffsetHeight = targetOffsetTop - currentOffsetTop;\n                        var translateY = parentOffsetHeight - currentAnchor.height;\n                        var anchorStyle = \"\\n              position: relative;\\n              transform: translate3d(0, \".concat(translateY, \"px, 0);\\n              z-index: \").concat(zIndex, \";\\n              color: \").concat(highlightColor, \";\\n            \");\n                        _this.setDiffData({\n                            target: item,\n                            data: {\n                                active: true,\n                                anchorStyle: anchorStyle,\n                            },\n                        });\n                    }\n                    else {\n                        _this.setDiffData({\n                            target: item,\n                            data: {\n                                active: false,\n                                anchorStyle: '',\n                                wrapperStyle: '',\n                            },\n                        });\n                    }\n                });\n            }\n        },\n        onClick: function (event) {\n            this.scrollToAnchor(event.target.dataset.index);\n        },\n        onTouchMove: function (event) {\n            var sidebarLength = this.children.length;\n            var touch = event.touches[0];\n            var itemHeight = this.sidebar.height / sidebarLength;\n            var index = Math.floor((touch.clientY - this.sidebar.top) / itemHeight);\n            if (index < 0) {\n                index = 0;\n            }\n            else if (index > sidebarLength - 1) {\n                index = sidebarLength - 1;\n            }\n            this.scrollToAnchor(index);\n        },\n        onTouchStop: function () {\n            this.scrollToAnchorIndex = null;\n        },\n        scrollToAnchor: function (index) {\n            var _this = this;\n            if (typeof index !== 'number' || this.scrollToAnchorIndex === index) {\n                return;\n            }\n            this.scrollToAnchorIndex = index;\n            var anchor = this.children.find(function (item) { return item.data.index === _this.data.indexList[index]; });\n            if (anchor) {\n                anchor.scrollIntoView(this.scrollTop);\n                this.$emit('select', anchor.data.index);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-bar/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-bar/index.wxml",
    "content": "<view class=\"van-index-bar\">\n  <slot />\n\n  <view\n    wx:if=\"{{ showSidebar }}\"\n    class=\"van-index-bar__sidebar\"\n    catch:tap=\"onClick\"\n    catch:touchmove=\"onTouchMove\"\n    catch:touchend=\"onTouchStop\"\n    catch:touchcancel=\"onTouchStop\"\n  >\n    <view\n      wx:for=\"{{ indexList }}\"\n      wx:key=\"index\"\n      class=\"van-index-bar__index\"\n      style=\"z-index: {{ zIndex + 1 }}; color: {{ activeAnchorIndex === index ? highlightColor : '' }}\"\n      data-index=\"{{ index }}\"\n    >\n      {{ item }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/index-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-index-bar{position:relative}.van-index-bar__sidebar{display:flex;flex-direction:column;position:fixed;right:0;text-align:center;top:50%;transform:translateY(-50%);-webkit-user-select:none;user-select:none}.van-index-bar__index{font-size:var(--index-bar-index-font-size,10px);font-weight:500;line-height:var(--index-bar-index-line-height,14px);padding:0 var(--padding-base,4px) 0 var(--padding-md,16px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/info/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/info/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        dot: Boolean,\n        info: null,\n        customStyle: String,\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/info/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/info/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ info !== null && info !== '' || dot }}\"\n  class=\"van-info {{ utils.bem('info', { dot }) }} custom-class\"\n  style=\"{{ customStyle }}\"\n>{{ dot ? '' : info }}</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/info/index.wxss",
    "content": "@import '../common/index.wxss';.van-info{align-items:center;background-color:var(--info-background-color,#ee0a24);border:var(--info-border-width,1px) solid #fff;border-radius:var(--info-size,16px);box-sizing:border-box;color:var(--info-color,#fff);display:inline-flex;font-family:var(--info-font-family,-apple-system-font,Helvetica Neue,Arial,sans-serif);font-size:var(--info-font-size,12px);font-weight:var(--info-font-weight,500);height:var(--info-size,16px);justify-content:center;min-width:var(--info-size,16px);padding:var(--info-padding,0 3px);position:absolute;right:0;top:0;transform:translate(50%,-50%);transform-origin:100%;white-space:nowrap}.van-info--dot{background-color:var(--info-dot-color,#ee0a24);border-radius:100%;height:var(--info-dot-size,8px);min-width:0;width:var(--info-dot-size,8px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/loading/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/loading/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        color: String,\n        vertical: Boolean,\n        type: {\n            type: String,\n            value: 'circular',\n        },\n        size: String,\n        textSize: String,\n    },\n    data: {\n        array12: Array.from({ length: 12 }),\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/loading/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/loading/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"custom-class {{ utils.bem('loading', { vertical }) }}\">\n  <view\n    class=\"van-loading__spinner van-loading__spinner--{{ type }}\"\n    style=\"{{ computed.spinnerStyle({ color, size }) }}\"\n  >\n    <view\n      wx:if=\"{{ type === 'spinner' }}\"\n      wx:for=\"{{ array12 }}\"\n      wx:key=\"index\"\n      class=\"van-loading__dot\"\n    />\n  </view>\n  <view class=\"van-loading__text\" style=\"{{ computed.textStyle({ textSize }) }}\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/loading/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction spinnerStyle(data) {\n  return style({\n    color: data.color,\n    width: addUnit(data.size),\n    height: addUnit(data.size),\n  });\n}\n\nfunction textStyle(data) {\n  return style({\n    'font-size': addUnit(data.textSize),\n  });\n}\n\nmodule.exports = {\n  spinnerStyle: spinnerStyle,\n  textStyle: textStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/loading/index.wxss",
    "content": "@import '../common/index.wxss';:host{font-size:0;line-height:1}.van-loading{align-items:center;color:var(--loading-spinner-color,#c8c9cc);display:inline-flex;justify-content:center}.van-loading__spinner{animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite;box-sizing:border-box;height:var(--loading-spinner-size,30px);max-height:100%;max-width:100%;position:relative;width:var(--loading-spinner-size,30px)}.van-loading__spinner--spinner{animation-timing-function:steps(12)}.van-loading__spinner--circular{border:1px solid transparent;border-radius:100%;border-top-color:initial}.van-loading__text{color:var(--loading-text-color,#969799);font-size:var(--loading-text-font-size,14px);line-height:var(--loading-text-line-height,20px);margin-left:var(--padding-xs,8px)}.van-loading__text:empty{display:none}.van-loading--vertical{flex-direction:column}.van-loading--vertical .van-loading__text{margin:var(--padding-xs,8px) 0 0}.van-loading__dot{height:100%;left:0;position:absolute;top:0;width:100%}.van-loading__dot:before{background-color:currentColor;border-radius:40%;content:\" \";display:block;height:25%;margin:0 auto;width:2px}.van-loading__dot:first-of-type{opacity:1;transform:rotate(30deg)}.van-loading__dot:nth-of-type(2){opacity:.9375;transform:rotate(60deg)}.van-loading__dot:nth-of-type(3){opacity:.875;transform:rotate(90deg)}.van-loading__dot:nth-of-type(4){opacity:.8125;transform:rotate(120deg)}.van-loading__dot:nth-of-type(5){opacity:.75;transform:rotate(150deg)}.van-loading__dot:nth-of-type(6){opacity:.6875;transform:rotate(180deg)}.van-loading__dot:nth-of-type(7){opacity:.625;transform:rotate(210deg)}.van-loading__dot:nth-of-type(8){opacity:.5625;transform:rotate(240deg)}.van-loading__dot:nth-of-type(9){opacity:.5;transform:rotate(270deg)}.van-loading__dot:nth-of-type(10){opacity:.4375;transform:rotate(300deg)}.van-loading__dot:nth-of-type(11){opacity:.375;transform:rotate(330deg)}.van-loading__dot:nth-of-type(12){opacity:.3125;transform:rotate(1turn)}@keyframes van-rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/basic.d.ts",
    "content": "export declare const basic: string;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/basic.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.basic = void 0;\nexports.basic = Behavior({\n    methods: {\n        $emit: function (name, detail, options) {\n            this.triggerEvent(name, detail, options);\n        },\n        set: function (data) {\n            this.setData(data);\n            return new Promise(function (resolve) { return wx.nextTick(resolve); });\n        },\n        // high performance setData\n        setView: function (data, callback) {\n            var _this = this;\n            var target = {};\n            var hasChange = false;\n            Object.keys(data).forEach(function (key) {\n                if (data[key] !== _this.data[key]) {\n                    target[key] = data[key];\n                    hasChange = true;\n                }\n            });\n            if (hasChange) {\n                return this.setData(target, callback);\n            }\n            return callback && callback();\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/button.d.ts",
    "content": "export declare const button: string;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/button.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.button = void 0;\nvar version_1 = require(\"../common/version\");\nexports.button = Behavior({\n    externalClasses: ['hover-class'],\n    properties: {\n        id: String,\n        buttonId: String,\n        lang: String,\n        businessId: Number,\n        sessionFrom: String,\n        sendMessageTitle: String,\n        sendMessagePath: String,\n        sendMessageImg: String,\n        showMessageCard: Boolean,\n        appParameter: String,\n        ariaLabel: String,\n        openType: String,\n        getUserProfileDesc: String,\n    },\n    data: {\n        canIUseGetUserProfile: (0, version_1.canIUseGetUserProfile)(),\n    },\n    methods: {\n        onGetUserInfo: function (event) {\n            this.triggerEvent('getuserinfo', event.detail);\n        },\n        onContact: function (event) {\n            this.triggerEvent('contact', event.detail);\n        },\n        onGetPhoneNumber: function (event) {\n            this.triggerEvent('getphonenumber', event.detail);\n        },\n        onGetRealTimePhoneNumber: function (event) {\n            this.triggerEvent('getrealtimephonenumber', event.detail);\n        },\n        onError: function (event) {\n            this.triggerEvent('error', event.detail);\n        },\n        onLaunchApp: function (event) {\n            this.triggerEvent('launchapp', event.detail);\n        },\n        onOpenSetting: function (event) {\n            this.triggerEvent('opensetting', event.detail);\n        },\n        onAgreePrivacyAuthorization: function (event) {\n            this.triggerEvent('agreeprivacyauthorization', event.detail);\n        },\n        onChooseAvatar: function (event) {\n            this.triggerEvent('chooseavatar', event.detail);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/link.d.ts",
    "content": "export declare const link: string;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/link.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.link = void 0;\nexports.link = Behavior({\n    properties: {\n        url: String,\n        linkType: {\n            type: String,\n            value: 'navigateTo',\n        },\n    },\n    methods: {\n        jumpLink: function (urlKey) {\n            if (urlKey === void 0) { urlKey = 'url'; }\n            var url = this.data[urlKey];\n            if (url) {\n                if (this.data.linkType === 'navigateTo' &&\n                    getCurrentPages().length > 9) {\n                    wx.redirectTo({ url: url });\n                }\n                else {\n                    wx[this.data.linkType]({ url: url });\n                }\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/page-scroll.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\ntype IPageScrollOption = WechatMiniprogram.Page.IPageScrollOption;\ntype Scroller = (this: WechatMiniprogram.Component.TrivialInstance, event?: IPageScrollOption) => void;\nexport declare function pageScrollMixin(scroller: Scroller): string;\nexport {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/page-scroll.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.pageScrollMixin = void 0;\nvar validator_1 = require(\"../common/validator\");\nvar utils_1 = require(\"../common/utils\");\nfunction onPageScroll(event) {\n    var _a = (0, utils_1.getCurrentPage)().vanPageScroller, vanPageScroller = _a === void 0 ? [] : _a;\n    vanPageScroller.forEach(function (scroller) {\n        if (typeof scroller === 'function') {\n            // @ts-ignore\n            scroller(event);\n        }\n    });\n}\nfunction pageScrollMixin(scroller) {\n    return Behavior({\n        attached: function () {\n            var page = (0, utils_1.getCurrentPage)();\n            if (!(0, utils_1.isDef)(page)) {\n                return;\n            }\n            var _scroller = scroller.bind(this);\n            var _a = page.vanPageScroller, vanPageScroller = _a === void 0 ? [] : _a;\n            if ((0, validator_1.isFunction)(page.onPageScroll) && page.onPageScroll !== onPageScroll) {\n                vanPageScroller.push(page.onPageScroll.bind(page));\n            }\n            vanPageScroller.push(_scroller);\n            page.vanPageScroller = vanPageScroller;\n            page.onPageScroll = onPageScroll;\n            this._scroller = _scroller;\n        },\n        detached: function () {\n            var _this = this;\n            var page = (0, utils_1.getCurrentPage)();\n            if (!(0, utils_1.isDef)(page) || !(0, utils_1.isDef)(page.vanPageScroller)) {\n                return;\n            }\n            var vanPageScroller = page.vanPageScroller;\n            var index = vanPageScroller.findIndex(function (v) { return v === _this._scroller; });\n            if (index > -1) {\n                page.vanPageScroller.splice(index, 1);\n            }\n            this._scroller = undefined;\n        },\n    });\n}\nexports.pageScrollMixin = pageScrollMixin;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/touch.d.ts",
    "content": "export declare const touch: string;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/touch.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.touch = void 0;\n// @ts-nocheck\nvar MIN_DISTANCE = 10;\nfunction getDirection(x, y) {\n    if (x > y && x > MIN_DISTANCE) {\n        return 'horizontal';\n    }\n    if (y > x && y > MIN_DISTANCE) {\n        return 'vertical';\n    }\n    return '';\n}\nexports.touch = Behavior({\n    methods: {\n        resetTouchStatus: function () {\n            this.direction = '';\n            this.deltaX = 0;\n            this.deltaY = 0;\n            this.offsetX = 0;\n            this.offsetY = 0;\n        },\n        touchStart: function (event) {\n            this.resetTouchStatus();\n            var touch = event.touches[0];\n            this.startX = touch.clientX;\n            this.startY = touch.clientY;\n        },\n        touchMove: function (event) {\n            var touch = event.touches[0];\n            this.deltaX = touch.clientX - this.startX;\n            this.deltaY = touch.clientY - this.startY;\n            this.offsetX = Math.abs(this.deltaX);\n            this.offsetY = Math.abs(this.deltaY);\n            this.direction =\n                this.direction || getDirection(this.offsetX, this.offsetY);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/transition.d.ts",
    "content": "export declare function transition(showDefaultValue: boolean): string;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/mixins/transition.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.transition = void 0;\n// @ts-nocheck\nvar utils_1 = require(\"../common/utils\");\nvar validator_1 = require(\"../common/validator\");\nvar getClassNames = function (name) { return ({\n    enter: \"van-\".concat(name, \"-enter van-\").concat(name, \"-enter-active enter-class enter-active-class\"),\n    'enter-to': \"van-\".concat(name, \"-enter-to van-\").concat(name, \"-enter-active enter-to-class enter-active-class\"),\n    leave: \"van-\".concat(name, \"-leave van-\").concat(name, \"-leave-active leave-class leave-active-class\"),\n    'leave-to': \"van-\".concat(name, \"-leave-to van-\").concat(name, \"-leave-active leave-to-class leave-active-class\"),\n}); };\nfunction transition(showDefaultValue) {\n    return Behavior({\n        properties: {\n            customStyle: String,\n            // @ts-ignore\n            show: {\n                type: Boolean,\n                value: showDefaultValue,\n                observer: 'observeShow',\n            },\n            // @ts-ignore\n            duration: {\n                type: null,\n                value: 300,\n            },\n            name: {\n                type: String,\n                value: 'fade',\n            },\n        },\n        data: {\n            type: '',\n            inited: false,\n            display: false,\n        },\n        ready: function () {\n            if (this.data.show === true) {\n                this.observeShow(true, false);\n            }\n        },\n        methods: {\n            observeShow: function (value, old) {\n                if (value === old) {\n                    return;\n                }\n                value ? this.enureEnter() : this.enureLeave();\n            },\n            enureEnter: function () {\n                var _this = this;\n                if (this.enterPromise)\n                    return;\n                this.enterPromise = new Promise(function (resolve) { return _this.enter(resolve); });\n            },\n            enureLeave: function () {\n                var _this = this;\n                var enterPromise = this.enterPromise;\n                if (!enterPromise)\n                    return;\n                enterPromise\n                    .then(function () { return new Promise(function (resolve) { return _this.leave(resolve); }); })\n                    .then(function () {\n                    _this.enterPromise = null;\n                });\n            },\n            enter: function (resolve) {\n                var _this = this;\n                var _a = this.data, duration = _a.duration, name = _a.name;\n                var classNames = getClassNames(name);\n                var currentDuration = (0, validator_1.isObj)(duration) ? duration.enter : duration;\n                if (this.status === 'enter') {\n                    return;\n                }\n                this.status = 'enter';\n                this.$emit('before-enter');\n                (0, utils_1.requestAnimationFrame)(function () {\n                    if (_this.status !== 'enter') {\n                        return;\n                    }\n                    _this.$emit('enter');\n                    _this.setData({\n                        inited: true,\n                        display: true,\n                        classes: classNames.enter,\n                        currentDuration: currentDuration,\n                    });\n                    (0, utils_1.requestAnimationFrame)(function () {\n                        if (_this.status !== 'enter') {\n                            return;\n                        }\n                        _this.transitionEnded = false;\n                        _this.setData({ classes: classNames['enter-to'] });\n                        resolve();\n                    });\n                });\n            },\n            leave: function (resolve) {\n                var _this = this;\n                if (!this.data.display) {\n                    return;\n                }\n                var _a = this.data, duration = _a.duration, name = _a.name;\n                var classNames = getClassNames(name);\n                var currentDuration = (0, validator_1.isObj)(duration) ? duration.leave : duration;\n                this.status = 'leave';\n                this.$emit('before-leave');\n                (0, utils_1.requestAnimationFrame)(function () {\n                    if (_this.status !== 'leave') {\n                        return;\n                    }\n                    _this.$emit('leave');\n                    _this.setData({\n                        classes: classNames.leave,\n                        currentDuration: currentDuration,\n                    });\n                    (0, utils_1.requestAnimationFrame)(function () {\n                        if (_this.status !== 'leave') {\n                            return;\n                        }\n                        _this.transitionEnded = false;\n                        setTimeout(function () {\n                            _this.onTransitionEnd();\n                            resolve();\n                        }, currentDuration);\n                        _this.setData({ classes: classNames['leave-to'] });\n                    });\n                });\n            },\n            onTransitionEnd: function () {\n                if (this.transitionEnded) {\n                    return;\n                }\n                this.transitionEnded = true;\n                this.$emit(\"after-\".concat(this.status));\n                var _a = this.data, show = _a.show, display = _a.display;\n                if (!show && display) {\n                    this.setData({ display: false });\n                }\n            },\n        },\n    });\n}\nexports.transition = transition;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/nav-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/nav-bar/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar utils_1 = require(\"../common/utils\");\n(0, component_1.VantComponent)({\n    classes: ['title-class'],\n    props: {\n        title: String,\n        fixed: {\n            type: Boolean,\n            observer: 'setHeight',\n        },\n        placeholder: {\n            type: Boolean,\n            observer: 'setHeight',\n        },\n        leftText: String,\n        rightText: String,\n        customStyle: String,\n        leftArrow: Boolean,\n        border: {\n            type: Boolean,\n            value: true,\n        },\n        zIndex: {\n            type: Number,\n            value: 1,\n        },\n        safeAreaInsetTop: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        height: 46,\n    },\n    created: function () {\n        var statusBarHeight = (0, utils_1.getSystemInfoSync)().statusBarHeight;\n        this.setData({\n            statusBarHeight: statusBarHeight,\n            height: 46 + statusBarHeight,\n        });\n    },\n    mounted: function () {\n        this.setHeight();\n    },\n    methods: {\n        onClickLeft: function () {\n            this.$emit('click-left');\n        },\n        onClickRight: function () {\n            this.$emit('click-right');\n        },\n        setHeight: function () {\n            var _this = this;\n            if (!this.data.fixed || !this.data.placeholder) {\n                return;\n            }\n            wx.nextTick(function () {\n                (0, utils_1.getRect)(_this, '.van-nav-bar').then(function (res) {\n                    if (res && 'height' in res) {\n                        _this.setData({ height: res.height });\n                    }\n                });\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/nav-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/nav-bar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view wx:if=\"{{ fixed && placeholder }}\" style=\"height: {{ height }}px;\" />\n\n<view\n  class=\"{{ utils.bem('nav-bar', { fixed }) }} custom-class {{ border ? 'van-hairline--bottom' : '' }}\"\n  style=\"{{ computed.barStyle({ zIndex, statusBarHeight, safeAreaInsetTop }) }}; {{ customStyle }}\"\n>\n  <view class=\"van-nav-bar__content\">\n    <view class=\"van-nav-bar__left\" bind:tap=\"onClickLeft\">\n      <block wx:if=\"{{ leftArrow || leftText }}\">\n        <van-icon\n          wx:if=\"{{ leftArrow }}\"\n          size=\"16px\"\n          name=\"arrow-left\"\n          custom-class=\"van-nav-bar__arrow\"\n        />\n        <view\n          wx:if=\"{{ leftText }}\"\n          class=\"van-nav-bar__text\"\n          hover-class=\"van-nav-bar__text--hover\"\n          hover-stay-time=\"70\"\n        >{{ leftText }}</view>\n      </block>\n      <slot wx:else name=\"left\" />\n    </view>\n    <view class=\"van-nav-bar__title title-class van-ellipsis\">\n      <block wx:if=\"{{ title }}\">{{ title }}</block>\n      <slot wx:else name=\"title\" />\n    </view>\n    <view class=\"van-nav-bar__right\" bind:tap=\"onClickRight\">\n      <view\n        wx:if=\"{{ rightText }}\"\n        class=\"van-nav-bar__text\"\n        hover-class=\"van-nav-bar__text--hover\"\n        hover-stay-time=\"70\"\n      >{{ rightText }}</view>\n      <slot wx:else name=\"right\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/nav-bar/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\n\nfunction barStyle(data) {\n  return style({\n    'z-index': data.zIndex,\n    'padding-top': data.safeAreaInsetTop ? data.statusBarHeight + 'px' : 0,\n  });\n}\n\nmodule.exports = {\n  barStyle: barStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/nav-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-nav-bar{background-color:var(--nav-bar-background-color,#fff);box-sizing:initial;height:var(--nav-bar-height,46px);line-height:var(--nav-bar-height,46px);position:relative;text-align:center;-webkit-user-select:none;user-select:none}.van-nav-bar__content{height:100%;position:relative}.van-nav-bar__text{color:var(--nav-bar-text-color,#1989fa);display:inline-block;margin:0 calc(var(--padding-md, 16px)*-1);padding:0 var(--padding-md,16px);vertical-align:middle}.van-nav-bar__text--hover{background-color:#f2f3f5}.van-nav-bar__arrow{color:var(--nav-bar-icon-color,#1989fa)!important;font-size:var(--nav-bar-arrow-size,16px)!important;vertical-align:middle}.van-nav-bar__arrow+.van-nav-bar__text{margin-left:-20px;padding-left:25px}.van-nav-bar--fixed{left:0;position:fixed;top:0;width:100%}.van-nav-bar__title{color:var(--nav-bar-title-text-color,#323233);font-size:var(--nav-bar-title-font-size,16px);font-weight:var(--font-weight-bold,500);margin:0 auto;max-width:60%}.van-nav-bar__left,.van-nav-bar__right{align-items:center;bottom:0;display:flex;font-size:var(--font-size-md,14px);position:absolute;top:0}.van-nav-bar__left{left:var(--padding-md,16px)}.van-nav-bar__right{right:var(--padding-md,16px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notice-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notice-bar/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar utils_1 = require(\"../common/utils\");\n(0, component_1.VantComponent)({\n    props: {\n        text: {\n            type: String,\n            value: '',\n            observer: 'init',\n        },\n        mode: {\n            type: String,\n            value: '',\n        },\n        url: {\n            type: String,\n            value: '',\n        },\n        openType: {\n            type: String,\n            value: 'navigate',\n        },\n        delay: {\n            type: Number,\n            value: 1,\n        },\n        speed: {\n            type: Number,\n            value: 60,\n            observer: 'init',\n        },\n        scrollable: null,\n        leftIcon: {\n            type: String,\n            value: '',\n        },\n        color: String,\n        backgroundColor: String,\n        background: String,\n        wrapable: Boolean,\n    },\n    data: {\n        show: true,\n    },\n    created: function () {\n        this.resetAnimation = wx.createAnimation({\n            duration: 0,\n            timingFunction: 'linear',\n        });\n    },\n    destroyed: function () {\n        this.timer && clearTimeout(this.timer);\n    },\n    mounted: function () {\n        this.init();\n    },\n    methods: {\n        init: function () {\n            var _this = this;\n            (0, utils_1.requestAnimationFrame)(function () {\n                Promise.all([\n                    (0, utils_1.getRect)(_this, '.van-notice-bar__content'),\n                    (0, utils_1.getRect)(_this, '.van-notice-bar__wrap'),\n                ]).then(function (rects) {\n                    var contentRect = rects[0], wrapRect = rects[1];\n                    var scrollable = _this.data.scrollable;\n                    if (contentRect == null ||\n                        wrapRect == null ||\n                        !contentRect.width ||\n                        !wrapRect.width ||\n                        scrollable === false) {\n                        return;\n                    }\n                    if (scrollable || wrapRect.width < contentRect.width) {\n                        _this.initAnimation(wrapRect.width, contentRect.width);\n                        _this.scroll(true);\n                    }\n                });\n            });\n        },\n        initAnimation: function (warpWidth, contentWidth) {\n            var _a = this.data, speed = _a.speed, delay = _a.delay;\n            this.wrapWidth = warpWidth;\n            this.contentWidth = contentWidth;\n            // begin 0\n            this.contentDuration = (contentWidth / speed) * 1000;\n            // begin -wrapWidth\n            this.duration = ((warpWidth + contentWidth) / speed) * 1000;\n            this.animation = wx.createAnimation({\n                duration: this.contentDuration,\n                timingFunction: 'linear',\n                delay: delay,\n            });\n        },\n        scroll: function (isInit) {\n            var _this = this;\n            if (isInit === void 0) { isInit = false; }\n            this.timer && clearTimeout(this.timer);\n            this.timer = null;\n            this.setData({\n                animationData: this.resetAnimation\n                    .translateX(isInit ? 0 : this.wrapWidth)\n                    .step()\n                    .export(),\n            });\n            var duration = isInit ? this.contentDuration : this.duration;\n            (0, utils_1.requestAnimationFrame)(function () {\n                _this.setData({\n                    animationData: _this.animation\n                        .translateX(-_this.contentWidth)\n                        .step({ duration: duration })\n                        .export(),\n                });\n            });\n            this.timer = setTimeout(function () {\n                _this.scroll();\n            }, duration + this.data.delay);\n        },\n        onClickIcon: function (event) {\n            if (this.data.mode === 'closeable') {\n                this.timer && clearTimeout(this.timer);\n                this.timer = null;\n                this.setData({ show: false });\n                this.$emit('close', event.detail);\n            }\n        },\n        onClick: function (event) {\n            this.$emit('click', event);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notice-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notice-bar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  wx:if=\"{{ show }}\"\n  class=\"custom-class {{ utils.bem('notice-bar', { withicon: mode, wrapable }) }}\"\n  style=\"{{ computed.rootStyle({ color, backgroundColor, background }) }}\"\n  bind:tap=\"onClick\"\n>\n  <van-icon\n    wx:if=\"{{ leftIcon }}\"\n    name=\"{{ leftIcon }}\"\n    class=\"van-notice-bar__left-icon\"\n  />\n  <slot wx:else name=\"left-icon\" />\n\n  <view class=\"van-notice-bar__wrap\">\n    <view class=\"van-notice-bar__content {{ scrollable === false && !wrapable ? 'van-ellipsis' : '' }}\" animation=\"{{ animationData }}\">\n      {{ text }}\n      <slot wx:if=\"{{ !text }}\"></slot>\n    </view>\n  </view>\n\n  <van-icon\n    wx:if=\"{{ mode === 'closeable' }}\"\n    class=\"van-notice-bar__right-icon\"\n    name=\"cross\"\n    catch:tap=\"onClickIcon\"\n  />\n  <navigator\n    wx:elif=\"{{ mode === 'link' }}\"\n    url=\"{{ url }}\"\n    open-type=\"{{ openType }}\"\n  >\n    <van-icon class=\"van-notice-bar__right-icon\" name=\"arrow\" />\n  </navigator>\n  <slot wx:else name=\"right-icon\" />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notice-bar/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  return style({\n    color: data.color,\n    'background-color': data.backgroundColor,\n    background: data.background,\n  });\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notice-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-notice-bar{align-items:center;background-color:var(--notice-bar-background-color,#fffbe8);color:var(--notice-bar-text-color,#ed6a0c);display:flex;font-size:var(--notice-bar-font-size,14px);height:var(--notice-bar-height,40px);line-height:var(--notice-bar-line-height,24px);padding:var(--notice-bar-padding,0 16px)}.van-notice-bar--withicon{padding-right:40px;position:relative}.van-notice-bar--wrapable{height:auto;padding:var(--notice-bar-wrapable-padding,8px 16px)}.van-notice-bar--wrapable .van-notice-bar__wrap{height:auto}.van-notice-bar--wrapable .van-notice-bar__content{position:relative;white-space:normal}.van-notice-bar__left-icon{align-items:center;display:flex;margin-right:4px;vertical-align:middle}.van-notice-bar__left-icon,.van-notice-bar__right-icon{font-size:var(--notice-bar-icon-size,16px);min-width:var(--notice-bar-icon-min-width,22px)}.van-notice-bar__right-icon{position:absolute;right:15px;top:10px}.van-notice-bar__wrap{flex:1;height:var(--notice-bar-line-height,24px);overflow:hidden;position:relative}.van-notice-bar__content{position:absolute;white-space:nowrap}.van-notice-bar__content.van-ellipsis{max-width:100%}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar color_1 = require(\"../common/color\");\nvar utils_1 = require(\"../common/utils\");\n(0, component_1.VantComponent)({\n    props: {\n        message: String,\n        background: String,\n        type: {\n            type: String,\n            value: 'danger',\n        },\n        color: {\n            type: String,\n            value: color_1.WHITE,\n        },\n        duration: {\n            type: Number,\n            value: 3000,\n        },\n        zIndex: {\n            type: Number,\n            value: 110,\n        },\n        safeAreaInsetTop: {\n            type: Boolean,\n            value: false,\n        },\n        top: null,\n    },\n    data: {\n        show: false,\n        onOpened: null,\n        onClose: null,\n        onClick: null,\n    },\n    created: function () {\n        var statusBarHeight = (0, utils_1.getSystemInfoSync)().statusBarHeight;\n        this.setData({ statusBarHeight: statusBarHeight });\n    },\n    methods: {\n        show: function () {\n            var _this = this;\n            var _a = this.data, duration = _a.duration, onOpened = _a.onOpened;\n            clearTimeout(this.timer);\n            this.setData({ show: true });\n            wx.nextTick(onOpened);\n            if (duration > 0 && duration !== Infinity) {\n                this.timer = setTimeout(function () {\n                    _this.hide();\n                }, duration);\n            }\n        },\n        hide: function () {\n            var onClose = this.data.onClose;\n            clearTimeout(this.timer);\n            this.setData({ show: false });\n            wx.nextTick(onClose);\n        },\n        onTap: function (event) {\n            var onClick = this.data.onClick;\n            if (onClick) {\n                onClick(event.detail);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-transition\": \"../transition/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<van-transition\n  name=\"slide-down\"\n  show=\"{{ show }}\"\n  custom-class=\"van-notify__container\"\n  custom-style=\"{{ computed.rootStyle({ zIndex, top }) }}\"\n  bind:tap=\"onTap\"\n>\n  <view\n    class=\"van-notify van-notify--{{ type }}\"\n    style=\"{{ computed.notifyStyle({ background, color }) }}\"\n  >\n    <view\n      wx:if=\"{{ safeAreaInsetTop }}\"\n      style=\"height: {{ statusBarHeight }}px\"\n    />\n    <text>{{ message }}</text>\n  </view>\n</van-transition>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  return style({\n    'z-index': data.zIndex,\n    top: addUnit(data.top),\n  });\n}\n\nfunction notifyStyle(data) {\n  return style({\n    background: data.background,\n    color: data.color,\n  });\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n  notifyStyle: notifyStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/index.wxss",
    "content": "@import '../common/index.wxss';.van-notify{word-wrap:break-word;font-size:var(--notify-font-size,14px);line-height:var(--notify-line-height,20px);padding:var(--notify-padding,6px 15px);text-align:center}.van-notify__container{box-sizing:border-box;left:0;position:fixed;top:0;width:100%}.van-notify--primary{background-color:var(--notify-primary-background-color,#1989fa)}.van-notify--success{background-color:var(--notify-success-background-color,#07c160)}.van-notify--danger{background-color:var(--notify-danger-background-color,#ee0a24)}.van-notify--warning{background-color:var(--notify-warning-background-color,#ff976a)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/notify.d.ts",
    "content": "interface NotifyOptions {\n    type?: 'primary' | 'success' | 'danger' | 'warning';\n    color?: string;\n    zIndex?: number;\n    top?: number;\n    message: string;\n    context?: any;\n    duration?: number;\n    selector?: string;\n    background?: string;\n    safeAreaInsetTop?: boolean;\n    onClick?: () => void;\n    onOpened?: () => void;\n    onClose?: () => void;\n}\ndeclare function Notify(options: NotifyOptions | string): any;\ndeclare namespace Notify {\n    var clear: (options?: NotifyOptions | undefined) => void;\n    var setDefaultOptions: (options: NotifyOptions) => void;\n    var resetDefaultOptions: () => void;\n}\nexport default Notify;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/notify/notify.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar color_1 = require(\"../common/color\");\nvar defaultOptions = {\n    selector: '#van-notify',\n    type: 'danger',\n    message: '',\n    background: '',\n    duration: 3000,\n    zIndex: 110,\n    top: 0,\n    color: color_1.WHITE,\n    safeAreaInsetTop: false,\n    onClick: function () { },\n    onOpened: function () { },\n    onClose: function () { },\n};\nvar currentOptions = __assign({}, defaultOptions);\nfunction parseOptions(message) {\n    if (message == null) {\n        return {};\n    }\n    return typeof message === 'string' ? { message: message } : message;\n}\nfunction getContext() {\n    var pages = getCurrentPages();\n    return pages[pages.length - 1];\n}\nfunction Notify(options) {\n    options = __assign(__assign({}, currentOptions), parseOptions(options));\n    var context = options.context || getContext();\n    var notify = context.selectComponent(options.selector);\n    delete options.context;\n    delete options.selector;\n    if (notify) {\n        notify.setData(options);\n        notify.show();\n        return notify;\n    }\n    console.warn('未找到 van-notify 节点，请确认 selector 及 context 是否正确');\n}\nexports.default = Notify;\nNotify.clear = function (options) {\n    options = __assign(__assign({}, defaultOptions), parseOptions(options));\n    var context = options.context || getContext();\n    var notify = context.selectComponent(options.selector);\n    if (notify) {\n        notify.hide();\n    }\n};\nNotify.setDefaultOptions = function (options) {\n    Object.assign(currentOptions, options);\n};\nNotify.resetDefaultOptions = function () {\n    currentOptions = __assign({}, defaultOptions);\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/overlay/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/overlay/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        show: Boolean,\n        customStyle: String,\n        duration: {\n            type: null,\n            value: 300,\n        },\n        zIndex: {\n            type: Number,\n            value: 1,\n        },\n        lockScroll: {\n            type: Boolean,\n            value: true,\n        },\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    methods: {\n        onClick: function () {\n            this.$emit('click');\n        },\n        // for prevent touchmove\n        noop: function () { },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/overlay/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-transition\": \"../transition/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/overlay/index.wxml",
    "content": "<import src=\"./overlay.wxml\" />\n\n<root-portal wx:if=\"{{ rootPortal }}\">\n  <include src=\"./overlay.wxml\" />\n</root-portal>\n\n<include wx:else src=\"./overlay.wxml\" />\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/overlay/index.wxss",
    "content": "@import '../common/index.wxss';.van-overlay{background-color:var(--overlay-background-color,rgba(0,0,0,.7));height:100%;left:0;position:fixed;top:0;width:100%}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/overlay/overlay.wxml",
    "content": "<van-transition\n  show=\"{{ show }}\"\n  custom-class=\"van-overlay custom-class\"\n  custom-style=\"z-index: {{ zIndex }}; {{ customStyle }}\"\n  duration=\"{{ duration }}\"\n  bind:tap=\"onClick\"\n  catch:touchmove=\"{{ lockScroll ? 'noop' : ''}}\"\n>\n  <slot></slot>\n</van-transition>"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/panel/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/panel/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: ['header-class', 'footer-class'],\n    props: {\n        desc: String,\n        title: String,\n        status: String,\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/panel/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-cell\": \"../cell/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/panel/index.wxml",
    "content": "<view class=\"van-panel van-hairline--top-bottom custom-class\">\n  <van-cell\n    wx:if=\"{{ title || desc || status }}\"\n    title=\"{{ title }}\"\n    label=\"{{ desc }}\"\n    value=\"{{ status }}\"\n    custom-class=\"header-class\"\n    value-class=\"van-panel__header-value\"\n  />\n  <slot wx:else name=\"header\" />\n\n  <view class=\"van-panel__content\">\n    <slot />\n  </view>\n\n  <view class=\"van-panel__footer van-hairline--top footer-class\">\n    <slot name=\"footer\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/panel/index.wxss",
    "content": "@import '../common/index.wxss';.van-panel{background:var(--panel-background-color,#fff)}.van-panel__header-value{color:var(--panel-header-value-color,#ee0a24)}.van-panel__footer{padding:var(--panel-footer-padding,8px 16px)}.van-panel__footer:empty{display:none}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar shared_1 = require(\"./shared\");\n(0, component_1.VantComponent)({\n    classes: ['active-class', 'toolbar-class', 'column-class'],\n    props: __assign(__assign({}, shared_1.pickerProps), { valueKey: {\n            type: String,\n            value: 'text',\n        }, toolbarPosition: {\n            type: String,\n            value: 'top',\n        }, defaultIndex: {\n            type: Number,\n            value: 0,\n        }, columns: {\n            type: Array,\n            value: [],\n            observer: function (columns) {\n                if (columns === void 0) { columns = []; }\n                this.simple = columns.length && !columns[0].values;\n                if (Array.isArray(this.children) && this.children.length) {\n                    this.setColumns().catch(function () { });\n                }\n            },\n        } }),\n    beforeCreate: function () {\n        var _this = this;\n        Object.defineProperty(this, 'children', {\n            get: function () { return _this.selectAllComponents('.van-picker__column') || []; },\n        });\n    },\n    methods: {\n        noop: function () { },\n        setColumns: function () {\n            var _this = this;\n            var data = this.data;\n            var columns = this.simple ? [{ values: data.columns }] : data.columns;\n            var stack = columns.map(function (column, index) {\n                return _this.setColumnValues(index, column.values);\n            });\n            return Promise.all(stack);\n        },\n        emit: function (event) {\n            var type = event.currentTarget.dataset.type;\n            if (this.simple) {\n                this.$emit(type, {\n                    value: this.getColumnValue(0),\n                    index: this.getColumnIndex(0),\n                });\n            }\n            else {\n                this.$emit(type, {\n                    value: this.getValues(),\n                    index: this.getIndexes(),\n                });\n            }\n        },\n        onChange: function (event) {\n            if (this.simple) {\n                this.$emit('change', {\n                    picker: this,\n                    value: this.getColumnValue(0),\n                    index: this.getColumnIndex(0),\n                });\n            }\n            else {\n                this.$emit('change', {\n                    picker: this,\n                    value: this.getValues(),\n                    index: event.currentTarget.dataset.index,\n                });\n            }\n        },\n        // get column instance by index\n        getColumn: function (index) {\n            return this.children[index];\n        },\n        // get column value by index\n        getColumnValue: function (index) {\n            var column = this.getColumn(index);\n            return column && column.getValue();\n        },\n        // set column value by index\n        setColumnValue: function (index, value) {\n            var column = this.getColumn(index);\n            if (column == null) {\n                return Promise.reject(new Error('setColumnValue: 对应列不存在'));\n            }\n            return column.setValue(value);\n        },\n        // get column option index by column index\n        getColumnIndex: function (columnIndex) {\n            return (this.getColumn(columnIndex) || {}).data.currentIndex;\n        },\n        // set column option index by column index\n        setColumnIndex: function (columnIndex, optionIndex) {\n            var column = this.getColumn(columnIndex);\n            if (column == null) {\n                return Promise.reject(new Error('setColumnIndex: 对应列不存在'));\n            }\n            return column.setIndex(optionIndex);\n        },\n        // get options of column by index\n        getColumnValues: function (index) {\n            return (this.children[index] || {}).data.options;\n        },\n        // set options of column by index\n        setColumnValues: function (index, options, needReset) {\n            if (needReset === void 0) { needReset = true; }\n            var column = this.children[index];\n            if (column == null) {\n                return Promise.reject(new Error('setColumnValues: 对应列不存在'));\n            }\n            var isSame = JSON.stringify(column.data.options) === JSON.stringify(options);\n            if (isSame) {\n                return Promise.resolve();\n            }\n            return column.set({ options: options }).then(function () {\n                if (needReset) {\n                    column.setIndex(0);\n                }\n            });\n        },\n        // get values of all columns\n        getValues: function () {\n            return this.children.map(function (child) { return child.getValue(); });\n        },\n        // set values of all columns\n        setValues: function (values) {\n            var _this = this;\n            var stack = values.map(function (value, index) {\n                return _this.setColumnValue(index, value);\n            });\n            return Promise.all(stack);\n        },\n        // get indexes of all columns\n        getIndexes: function () {\n            return this.children.map(function (child) { return child.data.currentIndex; });\n        },\n        // set indexes of all columns\n        setIndexes: function (indexes) {\n            var _this = this;\n            var stack = indexes.map(function (optionIndex, columnIndex) {\n                return _this.setColumnIndex(columnIndex, optionIndex);\n            });\n            return Promise.all(stack);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"picker-column\": \"../picker-column/index\",\n    \"loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-picker custom-class\">\n  <include wx:if=\"{{ toolbarPosition === 'top' }}\" src=\"./toolbar.wxml\" />\n\n  <view wx:if=\"{{ loading }}\" class=\"van-picker__loading\">\n    <loading color=\"#1989fa\"/>\n  </view>\n\n  <view\n    class=\"van-picker__columns\"\n    style=\"{{ computed.columnsStyle({ itemHeight, visibleItemCount }) }}\"\n    catch:touchmove=\"noop\"\n  >\n    <picker-column\n      class=\"van-picker__column\"\n      wx:for=\"{{ computed.columns(columns) }}\"\n      wx:key=\"index\"\n      data-index=\"{{ index }}\"\n      custom-class=\"column-class\"\n      value-key=\"{{ valueKey }}\"\n      initial-options=\"{{ item.values }}\"\n      default-index=\"{{ item.defaultIndex || defaultIndex }}\"\n      item-height=\"{{ itemHeight }}\"\n      visible-item-count=\"{{ visibleItemCount }}\"\n      active-class=\"active-class\"\n      bind:change=\"onChange\"\n    />\n    <view class=\"van-picker__mask\" style=\"{{ computed.maskStyle({ itemHeight, visibleItemCount }) }}\" />\n    <view\n      class=\"van-picker__frame van-hairline--top-bottom\"\n      style=\"{{ computed.frameStyle({ itemHeight }) }}\"\n    />\n  </view>\n\n  <include wx:if=\"{{ toolbarPosition === 'bottom' }}\" src=\"./toolbar.wxml\" />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\nvar array = require('../wxs/array.wxs');\n\nfunction columnsStyle(data) {\n  return style({\n    height: addUnit(data.itemHeight * data.visibleItemCount),\n  });\n}\n\nfunction maskStyle(data) {\n  return style({\n    'background-size':\n      '100% ' + addUnit((data.itemHeight * (data.visibleItemCount - 1)) / 2),\n  });\n}\n\nfunction frameStyle(data) {\n  return style({\n    height: addUnit(data.itemHeight),\n  });\n}\n\nfunction columns(columns) {\n  if (!array.isArray(columns)) {\n    return [];\n  }\n\n  if (columns.length && !columns[0].values) {\n    return [{ values: columns }];\n  }\n\n  return columns;\n}\n\nmodule.exports = {\n  columnsStyle: columnsStyle,\n  frameStyle: frameStyle,\n  maskStyle: maskStyle,\n  columns: columns,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/index.wxss",
    "content": "@import '../common/index.wxss';.van-picker{-webkit-text-size-adjust:100%;background-color:var(--picker-background-color,#fff);overflow:hidden;position:relative;-webkit-user-select:none;user-select:none}.van-picker__toolbar{display:flex;height:var(--picker-toolbar-height,44px);justify-content:space-between;line-height:var(--picker-toolbar-height,44px)}.van-picker__cancel,.van-picker__confirm{font-size:var(--picker-action-font-size,14px);padding:var(--picker-action-padding,0 16px)}.van-picker__cancel--hover,.van-picker__confirm--hover{opacity:.7}.van-picker__confirm{color:var(--picker-confirm-action-color,#576b95)}.van-picker__cancel{color:var(--picker-cancel-action-color,#969799)}.van-picker__title{font-size:var(--picker-option-font-size,16px);font-weight:var(--font-weight-bold,500);max-width:50%;text-align:center}.van-picker__columns{display:flex;position:relative}.van-picker__column{flex:1 1;width:0}.van-picker__loading{align-items:center;background-color:var(--picker-loading-mask-color,hsla(0,0%,100%,.9));bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:4}.van-picker__mask{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-image:linear-gradient(180deg,hsla(0,0%,100%,.9),hsla(0,0%,100%,.4)),linear-gradient(0deg,hsla(0,0%,100%,.9),hsla(0,0%,100%,.4));background-position:top,bottom;background-repeat:no-repeat;height:100%;left:0;top:0;width:100%;z-index:2}.van-picker__frame,.van-picker__mask{pointer-events:none;position:absolute}.van-picker__frame{left:16px;right:16px;top:50%;transform:translateY(-50%);z-index:1}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/shared.d.ts",
    "content": "export declare const pickerProps: {\n    title: StringConstructor;\n    loading: BooleanConstructor;\n    showToolbar: BooleanConstructor;\n    cancelButtonText: {\n        type: StringConstructor;\n        value: string;\n    };\n    confirmButtonText: {\n        type: StringConstructor;\n        value: string;\n    };\n    visibleItemCount: {\n        type: NumberConstructor;\n        value: number;\n    };\n    itemHeight: {\n        type: NumberConstructor;\n        value: number;\n    };\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/shared.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.pickerProps = void 0;\nexports.pickerProps = {\n    title: String,\n    loading: Boolean,\n    showToolbar: Boolean,\n    cancelButtonText: {\n        type: String,\n        value: '取消',\n    },\n    confirmButtonText: {\n        type: String,\n        value: '确认',\n    },\n    visibleItemCount: {\n        type: Number,\n        value: 6,\n    },\n    itemHeight: {\n        type: Number,\n        value: 44,\n    },\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker/toolbar.wxml",
    "content": "<view wx:if=\"{{ showToolbar }}\" class=\"van-picker__toolbar toolbar-class\">\n  <view\n    class=\"van-picker__cancel\"\n    hover-class=\"van-picker__cancel--hover\"\n    hover-stay-time=\"70\"\n    data-type=\"cancel\"\n    bindtap=\"emit\"\n  >\n    {{ cancelButtonText }}\n  </view>\n  <view wx:if=\"{{ title }}\" class=\"van-picker__title van-ellipsis\">{{\n    title\n  }}</view>\n  <view\n    class=\"van-picker__confirm\"\n    hover-class=\"van-picker__confirm--hover\"\n    hover-stay-time=\"70\"\n    data-type=\"confirm\"\n    bindtap=\"emit\"\n  >\n    {{ confirmButtonText }}\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker-column/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker-column/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar utils_1 = require(\"../common/utils\");\nvar validator_1 = require(\"../common/validator\");\nvar DEFAULT_DURATION = 200;\n(0, component_1.VantComponent)({\n    classes: ['active-class'],\n    props: {\n        valueKey: String,\n        className: String,\n        itemHeight: Number,\n        visibleItemCount: Number,\n        initialOptions: {\n            type: Array,\n            value: [],\n        },\n        defaultIndex: {\n            type: Number,\n            value: 0,\n            observer: function (value) {\n                this.setIndex(value);\n            },\n        },\n    },\n    data: {\n        startY: 0,\n        offset: 0,\n        duration: 0,\n        startOffset: 0,\n        options: [],\n        currentIndex: 0,\n    },\n    created: function () {\n        var _this = this;\n        var _a = this.data, defaultIndex = _a.defaultIndex, initialOptions = _a.initialOptions;\n        this.set({\n            currentIndex: defaultIndex,\n            options: initialOptions,\n        }).then(function () {\n            _this.setIndex(defaultIndex);\n        });\n    },\n    methods: {\n        getCount: function () {\n            return this.data.options.length;\n        },\n        onTouchStart: function (event) {\n            this.setData({\n                startY: event.touches[0].clientY,\n                startOffset: this.data.offset,\n                duration: 0,\n            });\n        },\n        onTouchMove: function (event) {\n            var data = this.data;\n            var deltaY = event.touches[0].clientY - data.startY;\n            this.setData({\n                offset: (0, utils_1.range)(data.startOffset + deltaY, -(this.getCount() * data.itemHeight), data.itemHeight),\n            });\n        },\n        onTouchEnd: function () {\n            var data = this.data;\n            if (data.offset !== data.startOffset) {\n                this.setData({ duration: DEFAULT_DURATION });\n                var index = (0, utils_1.range)(Math.round(-data.offset / data.itemHeight), 0, this.getCount() - 1);\n                this.setIndex(index, true);\n            }\n        },\n        onClickItem: function (event) {\n            var index = event.currentTarget.dataset.index;\n            this.setIndex(index, true);\n        },\n        adjustIndex: function (index) {\n            var data = this.data;\n            var count = this.getCount();\n            index = (0, utils_1.range)(index, 0, count);\n            for (var i = index; i < count; i++) {\n                if (!this.isDisabled(data.options[i]))\n                    return i;\n            }\n            for (var i = index - 1; i >= 0; i--) {\n                if (!this.isDisabled(data.options[i]))\n                    return i;\n            }\n        },\n        isDisabled: function (option) {\n            return (0, validator_1.isObj)(option) && option.disabled;\n        },\n        getOptionText: function (option) {\n            var data = this.data;\n            return (0, validator_1.isObj)(option) && data.valueKey in option\n                ? option[data.valueKey]\n                : option;\n        },\n        setIndex: function (index, userAction) {\n            var _this = this;\n            var data = this.data;\n            index = this.adjustIndex(index) || 0;\n            var offset = -index * data.itemHeight;\n            if (index !== data.currentIndex) {\n                return this.set({ offset: offset, currentIndex: index }).then(function () {\n                    userAction && _this.$emit('change', index);\n                });\n            }\n            return this.set({ offset: offset });\n        },\n        setValue: function (value) {\n            var options = this.data.options;\n            for (var i = 0; i < options.length; i++) {\n                if (this.getOptionText(options[i]) === value) {\n                    return this.setIndex(i);\n                }\n            }\n            return Promise.resolve();\n        },\n        getValue: function () {\n            var data = this.data;\n            return data.options[data.currentIndex];\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker-column/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker-column/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"van-picker-column custom-class\"\n  style=\"{{ computed.rootStyle({ itemHeight, visibleItemCount }) }}\"\n  bind:touchstart=\"onTouchStart\"\n  catch:touchmove=\"onTouchMove\"\n  bind:touchend=\"onTouchEnd\"\n  bind:touchcancel=\"onTouchEnd\"\n>\n  <view style=\"{{ computed.wrapperStyle({ offset, itemHeight, visibleItemCount, duration }) }}\">\n    <view\n      wx:for=\"{{ options }}\"\n      wx:for-item=\"option\"\n      wx:key=\"index\"\n      data-index=\"{{ index }}\"\n      style=\"height: {{ itemHeight }}px\"\n      class=\"van-ellipsis {{ utils.bem('picker-column__item', { disabled: option && option.disabled, selected: index === currentIndex }) }} {{ index === currentIndex ? 'active-class' : '' }}\"\n      bindtap=\"onClickItem\"\n    >{{ computed.optionText(option, valueKey) }}</view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker-column/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction isObj(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction optionText(option, valueKey) {\n  return isObj(option) && option[valueKey] != null ? option[valueKey] : option;\n}\n\nfunction rootStyle(data) {\n  return style({\n    height: addUnit(data.itemHeight * data.visibleItemCount),\n  });\n}\n\nfunction wrapperStyle(data) {\n  var offset = addUnit(\n    data.offset + (data.itemHeight * (data.visibleItemCount - 1)) / 2\n  );\n\n  return style({\n    transition: 'transform ' + data.duration + 'ms',\n    'line-height': addUnit(data.itemHeight),\n    transform: 'translate3d(0, ' + offset + ', 0)',\n  });\n}\n\nmodule.exports = {\n  optionText: optionText,\n  rootStyle: rootStyle,\n  wrapperStyle: wrapperStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/picker-column/index.wxss",
    "content": "@import '../common/index.wxss';.van-picker-column{color:var(--picker-option-text-color,#000);font-size:var(--picker-option-font-size,16px);overflow:hidden;text-align:center}.van-picker-column__item{padding:0 5px}.van-picker-column__item--selected{color:var(--picker-option-selected-text-color,#323233);font-weight:var(--font-weight-bold,500)}.van-picker-column__item--disabled{opacity:var(--picker-option-disabled-opacity,.3)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar transition_1 = require(\"../mixins/transition\");\n(0, component_1.VantComponent)({\n    classes: [\n        'enter-class',\n        'enter-active-class',\n        'enter-to-class',\n        'leave-class',\n        'leave-active-class',\n        'leave-to-class',\n        'close-icon-class',\n    ],\n    mixins: [(0, transition_1.transition)(false)],\n    props: {\n        round: Boolean,\n        closeable: Boolean,\n        customStyle: String,\n        overlayStyle: String,\n        transition: {\n            type: String,\n            observer: 'observeClass',\n        },\n        zIndex: {\n            type: Number,\n            value: 100,\n        },\n        overlay: {\n            type: Boolean,\n            value: true,\n        },\n        closeIcon: {\n            type: String,\n            value: 'cross',\n        },\n        closeIconPosition: {\n            type: String,\n            value: 'top-right',\n        },\n        closeOnClickOverlay: {\n            type: Boolean,\n            value: true,\n        },\n        position: {\n            type: String,\n            value: 'center',\n            observer: 'observeClass',\n        },\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n        safeAreaInsetTop: {\n            type: Boolean,\n            value: false,\n        },\n        safeAreaTabBar: {\n            type: Boolean,\n            value: false,\n        },\n        lockScroll: {\n            type: Boolean,\n            value: true,\n        },\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    created: function () {\n        this.observeClass();\n    },\n    methods: {\n        onClickCloseIcon: function () {\n            this.$emit('close');\n        },\n        onClickOverlay: function () {\n            this.$emit('click-overlay');\n            if (this.data.closeOnClickOverlay) {\n                this.$emit('close');\n            }\n        },\n        observeClass: function () {\n            var _a = this.data, transition = _a.transition, position = _a.position, duration = _a.duration;\n            var updateData = {\n                name: transition || position,\n            };\n            if (transition === 'none') {\n                updateData.duration = 0;\n                this.originDuration = duration;\n            }\n            else if (this.originDuration != null) {\n                updateData.duration = this.originDuration;\n            }\n            this.setData(updateData);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-overlay\": \"../overlay/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<import src=\"./popup.wxml\" />\n\n<van-overlay\n  wx:if=\"{{ overlay }}\"\n  show=\"{{ show }}\"\n  z-index=\"{{ zIndex }}\"\n  custom-style=\"{{ overlayStyle }}\"\n  duration=\"{{ duration }}\"\n  bind:click=\"onClickOverlay\"\n  lock-scroll=\"{{ lockScroll }}\"\n  root-portal=\"{{ rootPortal }}\"\n/>\n\n<root-portal wx:if=\"{{ rootPortal }}\">\n  <include src=\"./popup.wxml\" />\n</root-portal>\n\n <include wx:else src=\"./popup.wxml\" />\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\n\nfunction popupStyle(data) {\n  return style([\n    {\n      'z-index': data.zIndex,\n      '-webkit-transition-duration': data.currentDuration + 'ms',\n      'transition-duration': data.currentDuration + 'ms',\n    },\n    data.display ? null : 'display: none',\n    data.customStyle,\n  ]);\n}\n\nmodule.exports = {\n  popupStyle: popupStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/index.wxss",
    "content": "@import '../common/index.wxss';.van-popup{-webkit-overflow-scrolling:touch;animation:ease both;background-color:var(--popup-background-color,#fff);box-sizing:border-box;max-height:100%;overflow-y:auto;position:fixed;transition-timing-function:ease}.van-popup--center{left:50%;top:50%;transform:translate3d(-50%,-50%,0)}.van-popup--center.van-popup--round{border-radius:var(--popup-round-border-radius,16px)}.van-popup--top{left:0;top:0;width:100%}.van-popup--top.van-popup--round{border-radius:0 0 var(--popup-round-border-radius,var(--popup-round-border-radius,16px)) var(--popup-round-border-radius,var(--popup-round-border-radius,16px))}.van-popup--right{right:0;top:50%;transform:translate3d(0,-50%,0)}.van-popup--right.van-popup--round{border-radius:var(--popup-round-border-radius,var(--popup-round-border-radius,16px)) 0 0 var(--popup-round-border-radius,var(--popup-round-border-radius,16px))}.van-popup--bottom{bottom:0;left:0;width:100%}.van-popup--bottom.van-popup--round{border-radius:var(--popup-round-border-radius,var(--popup-round-border-radius,16px)) var(--popup-round-border-radius,var(--popup-round-border-radius,16px)) 0 0}.van-popup--left{left:0;top:50%;transform:translate3d(0,-50%,0)}.van-popup--left.van-popup--round{border-radius:0 var(--popup-round-border-radius,var(--popup-round-border-radius,16px)) var(--popup-round-border-radius,var(--popup-round-border-radius,16px)) 0}.van-popup--bottom.van-popup--safe{padding-bottom:env(safe-area-inset-bottom)}.van-popup--bottom.van-popup--safeTabBar,.van-popup--top.van-popup--safeTabBar{bottom:var(--tabbar-height,50px)}.van-popup--safeTop{padding-top:env(safe-area-inset-top)}.van-popup__close-icon{color:var(--popup-close-icon-color,#969799);font-size:var(--popup-close-icon-size,18px);position:absolute;z-index:var(--popup-close-icon-z-index,1)}.van-popup__close-icon--top-left{left:var(--popup-close-icon-margin,16px);top:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--top-right{right:var(--popup-close-icon-margin,16px);top:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--bottom-left{bottom:var(--popup-close-icon-margin,16px);left:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--bottom-right{bottom:var(--popup-close-icon-margin,16px);right:var(--popup-close-icon-margin,16px)}.van-popup__close-icon:active{opacity:.6}.van-scale-enter-active,.van-scale-leave-active{transition-property:opacity,transform}.van-scale-enter,.van-scale-leave-to{opacity:0;transform:translate3d(-50%,-50%,0) scale(.7)}.van-fade-enter-active,.van-fade-leave-active{transition-property:opacity}.van-fade-enter,.van-fade-leave-to{opacity:0}.van-center-enter-active,.van-center-leave-active{transition-property:opacity}.van-center-enter,.van-center-leave-to{opacity:0}.van-bottom-enter-active,.van-bottom-leave-active,.van-left-enter-active,.van-left-leave-active,.van-right-enter-active,.van-right-leave-active,.van-top-enter-active,.van-top-leave-active{transition-property:transform}.van-bottom-enter,.van-bottom-leave-to{transform:translate3d(0,100%,0)}.van-top-enter,.van-top-leave-to{transform:translate3d(0,-100%,0)}.van-left-enter,.van-left-leave-to{transform:translate3d(-100%,-50%,0)}.van-right-enter,.van-right-leave-to{transform:translate3d(100%,-50%,0)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/popup/popup.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n<view\n  wx:if=\"{{ inited }}\"\n  class=\"custom-class {{ classes }} {{ utils.bem('popup', [position, { round, safe: safeAreaInsetBottom, safeTop: safeAreaInsetTop, safeTabBar: safeAreaTabBar }]) }}\"\n  style=\"{{ computed.popupStyle({ zIndex, currentDuration, display, customStyle }) }}\"\n  bind:transitionend=\"onTransitionEnd\"\n>\n  <slot />\n  <van-icon\n    wx:if=\"{{ closeable }}\"\n    name=\"{{ closeIcon }}\"\n    class=\"close-icon-class van-popup__close-icon van-popup__close-icon--{{ closeIconPosition }}\"\n    bind:tap=\"onClickCloseIcon\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/progress/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/progress/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar color_1 = require(\"../common/color\");\nvar utils_1 = require(\"../common/utils\");\n(0, component_1.VantComponent)({\n    props: {\n        inactive: Boolean,\n        percentage: {\n            type: Number,\n            observer: 'setLeft',\n        },\n        pivotText: String,\n        pivotColor: String,\n        trackColor: String,\n        showPivot: {\n            type: Boolean,\n            value: true,\n        },\n        color: {\n            type: String,\n            value: color_1.BLUE,\n        },\n        textColor: {\n            type: String,\n            value: '#fff',\n        },\n        strokeWidth: {\n            type: null,\n            value: 4,\n        },\n    },\n    data: {\n        right: 0,\n    },\n    mounted: function () {\n        this.setLeft();\n    },\n    methods: {\n        setLeft: function () {\n            var _this = this;\n            Promise.all([\n                (0, utils_1.getRect)(this, '.van-progress'),\n                (0, utils_1.getRect)(this, '.van-progress__pivot'),\n            ]).then(function (_a) {\n                var portion = _a[0], pivot = _a[1];\n                if (portion && pivot) {\n                    _this.setData({\n                        right: (pivot.width * (_this.data.percentage - 100)) / 100,\n                    });\n                }\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/progress/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/progress/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"van-progress custom-class\"\n  style=\"{{ computed.rootStyle({ strokeWidth, trackColor }) }}\"\n>\n  <view\n    class=\"van-progress__portion\"\n    style=\"{{ computed.portionStyle({ percentage, inactive, color }) }}\"\n  >\n    <view\n      wx:if=\"{{ showPivot && computed.pivotText(pivotText, percentage) }}\"\n      style=\"{{ computed.pivotStyle({ textColor, pivotColor, inactive, color, right }) }}\"\n      class=\"van-progress__pivot\"\n    >\n      {{ computed.pivotText(pivotText, percentage) }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/progress/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../wxs/utils.wxs');\nvar style = require('../wxs/style.wxs');\n\nfunction pivotText(pivotText, percentage) {\n  return pivotText || percentage + '%';\n}\n\nfunction rootStyle(data) {\n  return style({\n    'height': data.strokeWidth ? utils.addUnit(data.strokeWidth) : '',\n    'background': data.trackColor,\n  });\n}\n\nfunction portionStyle(data) {\n  return style({\n    background: data.inactive ? '#cacaca' : data.color,\n    width: data.percentage ? data.percentage + '%' : '',\n  });\n}\n\nfunction pivotStyle(data) {\n  return style({\n    color: data.textColor,\n    right: data.right + 'px',\n    background: data.pivotColor ? data.pivotColor : data.inactive ? '#cacaca' : data.color,\n  });\n}\n\nmodule.exports = {\n  pivotText: pivotText,\n  rootStyle: rootStyle,\n  portionStyle: portionStyle,\n  pivotStyle: pivotStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/progress/index.wxss",
    "content": "@import '../common/index.wxss';.van-progress{background:var(--progress-background-color,#ebedf0);border-radius:var(--progress-height,4px);height:var(--progress-height,4px);position:relative}.van-progress__portion{background:var(--progress-color,#1989fa);border-radius:inherit;height:100%;left:0;position:absolute}.van-progress__pivot{background-color:var(--progress-pivot-background-color,#1989fa);border-radius:1em;box-sizing:border-box;color:var(--progress-pivot-text-color,#fff);font-size:var(--progress-pivot-font-size,10px);line-height:var(--progress-pivot-line-height,1.6);min-width:3.6em;padding:var(--progress-pivot-padding,0 5px);position:absolute;text-align:center;top:50%;transform:translateY(-50%);word-break:keep-all}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar version_1 = require(\"../common/version\");\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    field: true,\n    relation: (0, relation_1.useParent)('radio-group', function () {\n        this.updateFromParent();\n    }),\n    classes: ['icon-class', 'label-class'],\n    props: {\n        name: null,\n        value: null,\n        disabled: Boolean,\n        useIconSlot: Boolean,\n        checkedColor: String,\n        labelPosition: {\n            type: String,\n            value: 'right',\n        },\n        labelDisabled: Boolean,\n        shape: {\n            type: String,\n            value: 'round',\n        },\n        iconSize: {\n            type: null,\n            value: 20,\n        },\n    },\n    data: {\n        direction: '',\n        parentDisabled: false,\n    },\n    methods: {\n        updateFromParent: function () {\n            if (!this.parent) {\n                return;\n            }\n            var _a = this.parent.data, value = _a.value, parentDisabled = _a.disabled, direction = _a.direction;\n            this.setData({\n                value: value,\n                direction: direction,\n                parentDisabled: parentDisabled,\n            });\n        },\n        emitChange: function (value) {\n            var instance = this.parent || this;\n            instance.$emit('input', value);\n            instance.$emit('change', value);\n            if ((0, version_1.canIUseModel)()) {\n                instance.setData({ value: value });\n            }\n        },\n        onChange: function () {\n            if (!this.data.disabled && !this.data.parentDisabled) {\n                this.emitChange(this.data.name);\n            }\n        },\n        onClickLabel: function () {\n            var _a = this.data, disabled = _a.disabled, parentDisabled = _a.parentDisabled, labelDisabled = _a.labelDisabled, name = _a.name;\n            if (!(disabled || parentDisabled) && !labelDisabled) {\n                this.emitChange(name);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"{{ utils.bem('radio', [direction]) }} custom-class\">\n  <view\n    wx:if=\"{{ labelPosition === 'left' }}\"\n    class=\"{{ utils.bem('radio__label', [labelPosition, { disabled: disabled || parentDisabled }]) }} label-class\"\n    bindtap=\"onClickLabel\"\n  >\n    <slot />\n  </view>\n  <view class=\"van-radio__icon-wrap\" style=\"font-size: {{ utils.addUnit(iconSize) }}\" bindtap=\"onChange\">\n    <slot wx:if=\"{{ useIconSlot }}\" name=\"icon\" />\n    <van-icon\n      wx:else\n      name=\"success\"\n      class=\"{{ utils.bem('radio__icon', [shape, { disabled: disabled || parentDisabled, checked: value === name }]) }}\"\n      style=\"{{ computed.iconStyle({ iconSize, checkedColor, disabled, parentDisabled, value, name }) }}\"\n      custom-class=\"icon-class\"\n      custom-style=\"{{ computed.iconCustomStyle({ iconSize }) }}\"\n    />\n  </view>\n  <view\n    wx:if=\"{{ labelPosition === 'right' }}\"\n    class=\"label-class {{ utils.bem('radio__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}\"\n    bindtap=\"onClickLabel\"\n  >\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction iconStyle(data) {\n  var styles = {\n    'font-size': addUnit(data.iconSize),\n  };\n\n  if (\n    data.checkedColor &&\n    !(data.disabled || data.parentDisabled) &&\n    data.value === data.name\n  ) {\n    styles['border-color'] = data.checkedColor;\n    styles['background-color'] = data.checkedColor;\n  }\n\n  return style(styles);\n}\n\nfunction iconCustomStyle(data) {\n  return style({\n    'line-height': addUnit(data.iconSize),\n    'font-size': '.8em',\n    display: 'block',\n  });\n}\n\nmodule.exports = {\n  iconStyle: iconStyle,\n  iconCustomStyle: iconCustomStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio/index.wxss",
    "content": "@import '../common/index.wxss';.van-radio{align-items:center;display:flex;overflow:hidden;-webkit-user-select:none;user-select:none}.van-radio__icon-wrap{flex:none}.van-radio--horizontal{margin-right:var(--padding-sm,12px)}.van-radio__icon{align-items:center;border:1px solid var(--radio-border-color,#c8c9cc);box-sizing:border-box;color:transparent;display:flex;font-size:var(--radio-size,20px);height:1em;justify-content:center;text-align:center;transition-duration:var(--radio-transition-duration,.2s);transition-property:color,border-color,background-color;width:1em}.van-radio__icon--round{border-radius:100%}.van-radio__icon--checked{background-color:var(--radio-checked-icon-color,#1989fa);border-color:var(--radio-checked-icon-color,#1989fa);color:#fff}.van-radio__icon--disabled{background-color:var(--radio-disabled-background-color,#ebedf0);border-color:var(--radio-disabled-icon-color,#c8c9cc)}.van-radio__icon--disabled.van-radio__icon--checked{color:var(--radio-disabled-icon-color,#c8c9cc)}.van-radio__label{word-wrap:break-word;color:var(--radio-label-color,#323233);line-height:var(--radio-size,20px);padding-left:var(--radio-label-margin,10px)}.van-radio__label--left{float:left;margin:0 var(--radio-label-margin,10px) 0 0}.van-radio__label--disabled{color:var(--radio-disabled-label-color,#c8c9cc)}.van-radio__label:empty{margin:0}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio-group/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio-group/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    field: true,\n    relation: (0, relation_1.useChildren)('radio'),\n    props: {\n        value: {\n            type: null,\n            observer: 'updateChildren',\n        },\n        direction: String,\n        disabled: {\n            type: Boolean,\n            observer: 'updateChildren',\n        },\n    },\n    methods: {\n        updateChildren: function () {\n            this.children.forEach(function (child) { return child.updateFromParent(); });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio-group/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio-group/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"{{ utils.bem('radio-group', [direction]) }}\">\n  <slot></slot>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/radio-group/index.wxss",
    "content": "@import '../common/index.wxss';.van-radio-group--horizontal{display:flex;flex-wrap:wrap}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/rate/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/rate/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../common/utils\");\nvar component_1 = require(\"../common/component\");\nvar version_1 = require(\"../common/version\");\n(0, component_1.VantComponent)({\n    field: true,\n    classes: ['icon-class'],\n    props: {\n        value: {\n            type: Number,\n            observer: function (value) {\n                if (value !== this.data.innerValue) {\n                    this.setData({ innerValue: value });\n                }\n            },\n        },\n        readonly: Boolean,\n        disabled: Boolean,\n        allowHalf: Boolean,\n        size: null,\n        icon: {\n            type: String,\n            value: 'star',\n        },\n        voidIcon: {\n            type: String,\n            value: 'star-o',\n        },\n        color: String,\n        voidColor: String,\n        disabledColor: String,\n        count: {\n            type: Number,\n            value: 5,\n            observer: function (value) {\n                this.setData({ innerCountArray: Array.from({ length: value }) });\n            },\n        },\n        gutter: null,\n        touchable: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        innerValue: 0,\n        innerCountArray: Array.from({ length: 5 }),\n    },\n    methods: {\n        onSelect: function (event) {\n            var _this = this;\n            var data = this.data;\n            var score = event.currentTarget.dataset.score;\n            if (!data.disabled && !data.readonly) {\n                this.setData({ innerValue: score + 1 });\n                if ((0, version_1.canIUseModel)()) {\n                    this.setData({ value: score + 1 });\n                }\n                wx.nextTick(function () {\n                    _this.$emit('input', score + 1);\n                    _this.$emit('change', score + 1);\n                });\n            }\n        },\n        onTouchMove: function (event) {\n            var _this = this;\n            var touchable = this.data.touchable;\n            if (!touchable)\n                return;\n            var clientX = event.touches[0].clientX;\n            (0, utils_1.getAllRect)(this, '.van-rate__icon').then(function (list) {\n                var target = list\n                    .sort(function (cur, next) { return cur.dataset.score - next.dataset.score; })\n                    .find(function (item) { return clientX >= item.left && clientX <= item.right; });\n                if (target != null) {\n                    _this.onSelect(__assign(__assign({}, event), { currentTarget: target }));\n                }\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/rate/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/rate/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"../wxs/style.wxs\" module=\"style\" />\n\n<view\n  class=\"{{ utils.bem('rate') }} custom-class\"\n  bind:touchmove=\"onTouchMove\"\n>\n  <view\n    class=\"{{ utils.bem('rate__item') }}\"\n    wx:for=\"{{ innerCountArray }}\"\n    wx:key=\"index\"\n    style=\"{{ style({ paddingRight: index !== count - 1 ? utils.addUnit(gutter) : null }) }}\"\n  >\n    <van-icon\n      name=\"{{ index + 1 <= innerValue ? icon : voidIcon }}\"\n      class=\"{{ utils.bem('rate__icon', [{ disabled, full: index + 1 <= innerValue }])}}\"\n      style=\"{{ style({ fontSize: utils.addUnit(size) }) }}\"\n      custom-class=\"icon-class\"\n      data-score=\"{{ index }}\"\n      color=\"{{ disabled ? disabledColor : index + 1 <= innerValue ? color : voidColor }}\"\n      bind:click=\"onSelect\"\n    />\n\n    <van-icon\n      wx:if=\"{{ allowHalf }}\"\n      name=\"{{ index + 0.5 <= innerValue ? icon : voidIcon }}\"\n      class=\"{{ utils.bem('rate__icon', ['half', { disabled, full: index + 0.5 <= innerValue }]) }}\"\n      style=\"{{ style({ fontSize: utils.addUnit(size) }) }}\"\n      custom-class=\"icon-class\"\n      data-score=\"{{ index - 0.5 }}\"\n      color=\"{{ disabled ? disabledColor : index + 0.5 <= innerValue ? color : voidColor }}\"\n      bind:click=\"onSelect\"\n    />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/rate/index.wxss",
    "content": "@import '../common/index.wxss';.van-rate{display:inline-flex;-webkit-user-select:none;user-select:none}.van-rate__item{padding:0 var(--rate-horizontal-padding,2px);position:relative}.van-rate__item:not(:last-child){padding-right:var(--rate-icon-gutter,4px)}.van-rate__icon{color:var(--rate-icon-void-color,#c8c9cc);display:block;font-size:var(--rate-icon-size,20px);height:100%}.van-rate__icon--half{left:var(--rate-horizontal-padding,2px);overflow:hidden;position:absolute;top:0;width:.5em}.van-rate__icon--full,.van-rate__icon--half{color:var(--rate-icon-full-color,#ee0a24)}.van-rate__icon--disabled{color:var(--rate-icon-disabled-color,#c8c9cc)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/row/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/row/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('col', function (target) {\n        var gutter = this.data.gutter;\n        if (gutter) {\n            target.setData({ gutter: gutter });\n        }\n    }),\n    props: {\n        gutter: {\n            type: Number,\n            observer: 'setGutter',\n        },\n    },\n    methods: {\n        setGutter: function () {\n            var _this = this;\n            this.children.forEach(function (col) {\n                col.setData(_this.data);\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/row/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/row/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-row custom-class\" style=\"{{ computed.rootStyle({ gutter }) }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/row/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  if (!data.gutter) {\n    return '';\n  }\n\n  return style({\n    'margin-right': addUnit(-data.gutter / 2),\n    'margin-left': addUnit(-data.gutter / 2),\n  });\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/row/index.wxss",
    "content": "@import '../common/index.wxss';.van-row:after{clear:both;content:\"\";display:table}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/search/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/search/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar version_1 = require(\"../common/version\");\n(0, component_1.VantComponent)({\n    field: true,\n    classes: ['field-class', 'input-class', 'cancel-class'],\n    props: {\n        value: {\n            type: String,\n            value: '',\n        },\n        label: String,\n        focus: Boolean,\n        error: Boolean,\n        disabled: Boolean,\n        readonly: Boolean,\n        inputAlign: String,\n        showAction: Boolean,\n        useActionSlot: Boolean,\n        useLeftIconSlot: Boolean,\n        useRightIconSlot: Boolean,\n        leftIcon: {\n            type: String,\n            value: 'search',\n        },\n        rightIcon: String,\n        placeholder: String,\n        placeholderStyle: String,\n        actionText: {\n            type: String,\n            value: '取消',\n        },\n        background: {\n            type: String,\n            value: '#ffffff',\n        },\n        maxlength: {\n            type: Number,\n            value: -1,\n        },\n        shape: {\n            type: String,\n            value: 'square',\n        },\n        clearable: {\n            type: Boolean,\n            value: true,\n        },\n        clearTrigger: {\n            type: String,\n            value: 'focus',\n        },\n        clearIcon: {\n            type: String,\n            value: 'clear',\n        },\n        cursorSpacing: {\n            type: Number,\n            value: 0,\n        },\n    },\n    methods: {\n        onChange: function (event) {\n            if ((0, version_1.canIUseModel)()) {\n                this.setData({ value: event.detail });\n            }\n            this.$emit('change', event.detail);\n        },\n        onCancel: function () {\n            var _this = this;\n            /**\n             * 修复修改输入框值时，输入框失焦和赋值同时触发，赋值失效\n             * https://github.com/youzan/vant-weapp/issues/1768\n             */\n            setTimeout(function () {\n                if ((0, version_1.canIUseModel)()) {\n                    _this.setData({ value: '' });\n                }\n                _this.$emit('cancel');\n                _this.$emit('change', '');\n            }, 200);\n        },\n        onSearch: function (event) {\n            this.$emit('search', event.detail);\n        },\n        onFocus: function (event) {\n            this.$emit('focus', event.detail);\n        },\n        onBlur: function (event) {\n            this.$emit('blur', event.detail);\n        },\n        onClear: function (event) {\n            this.$emit('clear', event.detail);\n        },\n        onClickInput: function (event) {\n            this.$emit('click-input', event.detail);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/search/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-field\": \"../field/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/search/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ utils.bem('search', { withaction: showAction || useActionSlot }) }} custom-class\"\n  style=\"background: {{ background }}\"\n>\n  <view class=\"{{ utils.bem('search__content', [shape]) }}\">\n    <view class=\"van-search__label\" wx:if=\"{{ label }}\">{{ label }}</view>\n    <slot wx:else name=\"label\" />\n\n    <van-field\n      type=\"search\"\n      left-icon=\"{{ !useLeftIconSlot ? leftIcon : '' }}\"\n      right-icon=\"{{ !useRightIconSlot ? rightIcon : '' }}\"\n      focus=\"{{ focus }}\"\n      error=\"{{ error }}\"\n      border=\"{{ false }}\"\n      confirm-type=\"search\"\n      class=\"van-search__field field-class\"\n      value=\"{{ value }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      clearable=\"{{ clearable }}\"\n      clear-trigger=\"{{ clearTrigger }}\"\n      clear-icon=\"{{ clearIcon }}\"\n      maxlength=\"{{ maxlength }}\"\n      input-align=\"{{ inputAlign }}\"\n      input-class=\"input-class\"\n      placeholder=\"{{ placeholder }}\"\n      placeholder-style=\"{{ placeholderStyle }}\"\n      cursor-spacing=\"{{ cursorSpacing }}\"\n      custom-style=\"padding: 5px 10px 5px 0; background-color: transparent;\"\n      bind:blur=\"onBlur\"\n      bind:focus=\"onFocus\"\n      bind:change=\"onChange\"\n      bind:confirm=\"onSearch\"\n      bind:clear=\"onClear\"\n      bind:click-input=\"onClickInput\"\n    >\n      <slot wx:if=\"{{ useLeftIconSlot }}\" name=\"left-icon\" slot=\"left-icon\" />\n      <slot wx:if=\"{{ useRightIconSlot }}\" name=\"right-icon\" slot=\"right-icon\" />\n    </van-field>\n  </view>\n\n  <view\n    wx:if=\"{{ showAction || useActionSlot }}\"\n    class=\"van-search__action\"\n    hover-class=\"van-search__action--hover\"\n    hover-stay-time=\"70\"\n  >\n    <slot wx:if=\"{{ useActionSlot }}\" name=\"action\" />\n    <view wx:else bind:tap=\"onCancel\" class=\"van-search__action-button cancel-class\">{{ actionText }}</view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/search/index.wxss",
    "content": "@import '../common/index.wxss';.van-search{align-items:center;box-sizing:border-box;display:flex;padding:var(--search-padding,10px 12px)}.van-search__content{background-color:var(--search-background-color,#f7f8fa);border-radius:2px;display:flex;flex:1;padding-left:var(--padding-sm,12px)}.van-search__content--round{border-radius:999px}.van-search__label{color:var(--search-label-color,#323233);font-size:var(--search-label-font-size,14px);line-height:var(--search-input-height,34px);padding:var(--search-label-padding,0 5px)}.van-search__field{flex:1}.van-search__field__left-icon{color:var(--search-left-icon-color,#969799)}.van-search--withaction{padding-right:0}.van-search__action{color:var(--search-action-text-color,#323233);font-size:var(--search-action-font-size,14px);line-height:var(--search-input-height,34px)}.van-search__action--hover{background-color:#f2f3f5}.van-search__action-button{padding:var(--search-action-padding,0 8px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        // whether to show popup\n        show: Boolean,\n        // overlay custom style\n        overlayStyle: String,\n        // z-index\n        zIndex: {\n            type: Number,\n            value: 100,\n        },\n        title: String,\n        cancelText: {\n            type: String,\n            value: '取消',\n        },\n        description: String,\n        options: {\n            type: Array,\n            value: [],\n        },\n        overlay: {\n            type: Boolean,\n            value: true,\n        },\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n        closeOnClickOverlay: {\n            type: Boolean,\n            value: true,\n        },\n        duration: {\n            type: null,\n            value: 300,\n        },\n        rootPortal: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    methods: {\n        onClickOverlay: function () {\n            this.$emit('click-overlay');\n        },\n        onCancel: function () {\n            this.onClose();\n            this.$emit('cancel');\n        },\n        onSelect: function (event) {\n            this.$emit('select', event.detail);\n        },\n        onClose: function () {\n            this.$emit('close');\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-popup\": \"../popup/index\",\n    \"options\": \"./options\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<van-popup\n  round\n  class=\"van-share-sheet\"\n  show=\"{{ show }}\"\n  position=\"bottom\"\n  overlay=\"{{ overlay }}\"\n  duration=\"{{ duration }}\"\n  z-index=\"{{ zIndex }}\"\n  overlay-style=\"{{ overlayStyle }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  safe-area-inset-bottom=\"{{ safeAreaInsetBottom }}\"\n  root-portal=\"{{ rootPortal }}\"\n  bind:close=\"onClose\"\n  bind:click-overlay=\"onClickOverlay\"\n>\n  <view class=\"van-share-sheet__header\">\n    <view class=\"van-share-sheet__title\">\n      <slot name=\"title\" />\n    </view>\n    <view wx:if=\"{{ title }}\" class=\"van-share-sheet__title\">{{ title }}</view>\n\n    <view class=\"van-share-sheet__description\">\n      <slot name=\"description\" />\n    </view>\n    <view wx:if=\"{{ description }}\" class=\"van-share-sheet__description\">\n      {{ description }}\n    </view>\n  </view>\n\n  <block wx:if=\"{{ computed.isMulti(options) }}\">\n    <options\n      wx:for=\"{{ options }}\"\n      show-border=\"{{ index !== 0 }}\"\n      wx:key=\"index\"\n      options=\"{{ item }}\"\n      bind:select=\"onSelect\"\n    />\n  </block>\n\n  <options wx:else options=\"{{ options }}\" bind:select=\"onSelect\" />\n\n  <button type=\"button\" class=\"van-share-sheet__cancel\" bindtap=\"onCancel\">\n    {{ cancelText }}\n  </button>\n</van-popup>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/index.wxs",
    "content": "/* eslint-disable */\nfunction isMulti(options) {\n  if (options == null || options[0] == null) {\n    return false;\n  }\n\n  return \"Array\" === options.constructor && \"Array\" === options[0].constructor;\n}\n\nmodule.exports = {\n  isMulti: isMulti\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/index.wxss",
    "content": "@import '../common/index.wxss';.van-share-sheet__header{padding:12px 16px 4px;text-align:center}.van-share-sheet__title{color:#323233;font-size:14px;font-weight:400;line-height:20px;margin-top:8px}.van-share-sheet__title:empty,.van-share-sheet__title:not(:empty)+.van-share-sheet__title{display:none}.van-share-sheet__description{color:#969799;display:block;font-size:12px;line-height:16px;margin-top:8px}.van-share-sheet__description:empty,.van-share-sheet__description:not(:empty)+.van-share-sheet__description{display:none}.van-share-sheet__cancel{background:#fff;border:none;box-sizing:initial;display:block;font-size:16px;height:auto;line-height:48px;padding:0;text-align:center;width:100%}.van-share-sheet__cancel:before{background-color:#f7f8fa;content:\" \";display:block;height:8px}.van-share-sheet__cancel:after{display:none}.van-share-sheet__cancel:active{background-color:#f2f3f5}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/options.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/options.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        options: Array,\n        showBorder: Boolean,\n    },\n    methods: {\n        onSelect: function (event) {\n            var index = event.currentTarget.dataset.index;\n            var option = this.data.options[index];\n            this.$emit('select', __assign(__assign({}, option), { index: index }));\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/options.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/options.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./options.wxs\" module=\"computed\" />\n\n<view class=\"{{ utils.bem('share-sheet__options', { border: showBorder }) }}\">\n  <view\n    wx:for=\"{{ options }}\"\n    wx:key=\"index\"\n    class=\"van-share-sheet__option\"\n    data-index=\"{{ index }}\"\n    bindtap=\"onSelect\"\n  >\n    <button class=\"van-share-sheet__button\" open-type=\"{{ item.openType }}\">\n      <image src=\"{{ computed.getIconURL(item.icon) }}\" class=\"van-share-sheet__icon\" /> \n      <view wx:if=\"{{ item.name }}\" class=\"van-share-sheet__name\">{{ item.name }}</view>\n      <view wx:if=\"{{ item.description }}\" class=\"van-share-sheet__option-description\">\n        {{ item.description }}\n      </view>\n    </button>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/options.wxs",
    "content": "/* eslint-disable */\nvar PRESET_ICONS = ['qq', 'link', 'weibo', 'wechat', 'poster', 'qrcode', 'weapp-qrcode', 'wechat-moments'];\n\nfunction getIconURL(icon) {\n  if (PRESET_ICONS.indexOf(icon) !== -1) {\n    return 'https://img.yzcdn.cn/vant/share-sheet-' + icon + '.png';\n  }\n\n  return icon;\n}\n\nmodule.exports = {\n  getIconURL: getIconURL,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/share-sheet/options.wxss",
    "content": "@import '../common/index.wxss';.van-share-sheet__options{-webkit-overflow-scrolling:touch;display:flex;overflow-x:auto;overflow-y:visible;padding:16px 0 16px 8px;position:relative}.van-share-sheet__options--border:before{border-top:1px solid #ebedf0;box-sizing:border-box;content:\" \";left:16px;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(.5);transform-origin:center}.van-share-sheet__options::-webkit-scrollbar{height:0}.van-share-sheet__option{align-items:center;display:flex;flex-direction:column;-webkit-user-select:none;user-select:none}.van-share-sheet__option:active{opacity:.7}.van-share-sheet__button{background-color:initial;border:0;height:auto;line-height:inherit;padding:0}.van-share-sheet__button:after{border:0}.van-share-sheet__icon{height:48px;margin:0 16px;width:48px}.van-share-sheet__name{color:#646566;font-size:12px;margin-top:8px;padding:0 4px}.van-share-sheet__option-description{color:#c8c9cc;font-size:12px;padding:0 4px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('sidebar-item', function () {\n        this.setActive(this.data.activeKey);\n    }),\n    props: {\n        activeKey: {\n            type: Number,\n            value: 0,\n            observer: 'setActive',\n        },\n    },\n    beforeCreate: function () {\n        this.currentActive = -1;\n    },\n    methods: {\n        setActive: function (activeKey) {\n            var _a = this, children = _a.children, currentActive = _a.currentActive;\n            if (!children.length) {\n                return Promise.resolve();\n            }\n            this.currentActive = activeKey;\n            var stack = [];\n            if (currentActive !== activeKey && children[currentActive]) {\n                stack.push(children[currentActive].setActive(false));\n            }\n            if (children[activeKey]) {\n                stack.push(children[activeKey].setActive(true));\n            }\n            return Promise.all(stack);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar/index.wxml",
    "content": "<view class=\"van-sidebar custom-class\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar/index.wxss",
    "content": "@import '../common/index.wxss';.van-sidebar{width:var(--sidebar-width,80px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar-item/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    classes: ['active-class', 'disabled-class'],\n    relation: (0, relation_1.useParent)('sidebar'),\n    props: {\n        dot: Boolean,\n        badge: null,\n        info: null,\n        title: String,\n        disabled: Boolean,\n    },\n    methods: {\n        onClick: function () {\n            var _this = this;\n            var parent = this.parent;\n            if (!parent || this.data.disabled) {\n                return;\n            }\n            var index = parent.children.indexOf(this);\n            parent.setActive(index).then(function () {\n                _this.$emit('click', index);\n                parent.$emit('change', index);\n            });\n        },\n        setActive: function (selected) {\n            return this.setData({ selected: selected });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-info\": \"../info/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ utils.bem('sidebar-item', { selected, disabled }) }} {{ selected ? 'active-class' : '' }} {{ disabled ? 'disabled-class' : '' }} custom-class\"\n  hover-class=\"van-sidebar-item--hover\"\n  hover-stay-time=\"70\"\n  bind:tap=\"onClick\"\n>\n  <view class=\"van-sidebar-item__text\">\n    <van-info\n      wx:if=\"{{ badge != null || info !== null || dot }}\"\n      dot=\"{{ dot }}\"\n      info=\"{{ badge != null ? badge : info }}\"\n    />\n    <view wx:if=\"{{ title }}\">{{ title }}</view>\n    <slot wx:else name=\"title\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sidebar-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-sidebar-item{background-color:var(--sidebar-background-color,#f7f8fa);border-left:3px solid transparent;box-sizing:border-box;color:var(--sidebar-text-color,#323233);display:block;font-size:var(--sidebar-font-size,14px);line-height:var(--sidebar-line-height,20px);overflow:hidden;padding:var(--sidebar-padding,20px 12px 20px 8px);-webkit-user-select:none;user-select:none}.van-sidebar-item__text{display:inline-block;position:relative;word-break:break-all}.van-sidebar-item--hover:not(.van-sidebar-item--disabled){background-color:var(--sidebar-active-color,#f2f3f5)}.van-sidebar-item:after{border-bottom-width:1px}.van-sidebar-item--selected{border-color:var(--sidebar-selected-border-color,#ee0a24);color:var(--sidebar-selected-text-color,#323233);font-weight:var(--sidebar-selected-font-weight,500)}.van-sidebar-item--selected:after{border-right-width:1px}.van-sidebar-item--selected,.van-sidebar-item--selected.van-sidebar-item--hover{background-color:var(--sidebar-selected-background-color,#fff)}.van-sidebar-item--disabled{color:var(--sidebar-disabled-text-color,#c8c9cc)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/skeleton/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/skeleton/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: ['avatar-class', 'title-class', 'row-class'],\n    props: {\n        row: {\n            type: Number,\n            value: 0,\n            observer: function (value) {\n                this.setData({ rowArray: Array.from({ length: value }) });\n            },\n        },\n        title: Boolean,\n        avatar: Boolean,\n        loading: {\n            type: Boolean,\n            value: true,\n        },\n        animate: {\n            type: Boolean,\n            value: true,\n        },\n        avatarSize: {\n            type: String,\n            value: '32px',\n        },\n        avatarShape: {\n            type: String,\n            value: 'round',\n        },\n        titleWidth: {\n            type: String,\n            value: '40%',\n        },\n        rowWidth: {\n            type: null,\n            value: '100%',\n            observer: function (val) {\n                this.setData({ isArray: val instanceof Array });\n            },\n        },\n    },\n    data: {\n        isArray: false,\n        rowArray: [],\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/skeleton/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/skeleton/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ loading }}\"\n  class=\"custom-class {{ utils.bem('skeleton', [{animate}]) }}\"\n>\n  <view\n    wx:if=\"{{ avatar }}\"\n    class=\"avatar-class {{ utils.bem('skeleton__avatar', [avatarShape])}}\"\n    style=\"{{ 'width:' + avatarSize + ';height:' + avatarSize }}\"\n  />\n  <view class=\"{{ utils.bem('skeleton__content')}}\">\n    <view\n      wx:if=\"{{ title }}\"\n      class=\"title-class {{ utils.bem('skeleton__title') }}\"\n      style=\"{{ 'width:' + titleWidth }}\"\n    />\n    <view\n      wx:for=\"{{ rowArray }}\"\n      wx:key=\"index\"\n      wx:for-index=\"index\"\n      class=\"row-class {{ utils.bem('skeleton__row') }}\"\n      style=\"{{ 'width:' + (isArray ? rowWidth[index] : rowWidth) }}\"\n    />\n  </view>\n</view>\n<view wx:else class=\"{{ utils.bem('skeleton__content')}}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/skeleton/index.wxss",
    "content": "@import '../common/index.wxss';.van-skeleton{box-sizing:border-box;display:flex;padding:var(--skeleton-padding,0 16px);width:100%}.van-skeleton__avatar{background-color:var(--skeleton-avatar-background-color,#f2f3f5);flex-shrink:0;margin-right:var(--padding-md,16px)}.van-skeleton__avatar--round{border-radius:100%}.van-skeleton__content{flex:1}.van-skeleton__avatar+.van-skeleton__content{padding-top:var(--padding-xs,8px)}.van-skeleton__row,.van-skeleton__title{background-color:var(--skeleton-row-background-color,#f2f3f5);height:var(--skeleton-row-height,16px)}.van-skeleton__title{margin:0}.van-skeleton__row:not(:first-child){margin-top:var(--skeleton-row-margin-top,12px)}.van-skeleton__title+.van-skeleton__row{margin-top:20px}.van-skeleton--animate{animation:van-skeleton-blink 1.2s ease-in-out infinite}@keyframes van-skeleton-blink{50%{opacity:.6}}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/slider/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/slider/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar touch_1 = require(\"../mixins/touch\");\nvar version_1 = require(\"../common/version\");\nvar utils_1 = require(\"../common/utils\");\nvar DRAG_STATUS = {\n    START: 'start',\n    MOVING: 'moving',\n    END: 'end',\n};\n(0, component_1.VantComponent)({\n    mixins: [touch_1.touch],\n    props: {\n        range: Boolean,\n        disabled: Boolean,\n        useButtonSlot: Boolean,\n        activeColor: String,\n        inactiveColor: String,\n        max: {\n            type: Number,\n            value: 100,\n        },\n        min: {\n            type: Number,\n            value: 0,\n        },\n        step: {\n            type: Number,\n            value: 1,\n        },\n        value: {\n            type: null,\n            value: 0,\n            observer: function (val) {\n                if (val !== this.value) {\n                    this.updateValue(val);\n                }\n            },\n        },\n        vertical: Boolean,\n        barHeight: null,\n    },\n    created: function () {\n        this.updateValue(this.data.value);\n    },\n    methods: {\n        onTouchStart: function (event) {\n            var _this = this;\n            if (this.data.disabled)\n                return;\n            var index = event.currentTarget.dataset.index;\n            if (typeof index === 'number') {\n                this.buttonIndex = index;\n            }\n            this.touchStart(event);\n            this.startValue = this.format(this.value);\n            this.newValue = this.value;\n            if (this.isRange(this.newValue)) {\n                this.startValue = this.newValue.map(function (val) { return _this.format(val); });\n            }\n            else {\n                this.startValue = this.format(this.newValue);\n            }\n            this.dragStatus = DRAG_STATUS.START;\n        },\n        onTouchMove: function (event) {\n            var _this = this;\n            if (this.data.disabled)\n                return;\n            if (this.dragStatus === DRAG_STATUS.START) {\n                this.$emit('drag-start');\n            }\n            this.touchMove(event);\n            this.dragStatus = DRAG_STATUS.MOVING;\n            (0, utils_1.getRect)(this, '.van-slider').then(function (rect) {\n                var vertical = _this.data.vertical;\n                var delta = vertical ? _this.deltaY : _this.deltaX;\n                var total = vertical ? rect.height : rect.width;\n                var diff = (delta / total) * _this.getRange();\n                if (_this.isRange(_this.startValue)) {\n                    _this.newValue[_this.buttonIndex] =\n                        _this.startValue[_this.buttonIndex] + diff;\n                }\n                else {\n                    _this.newValue = _this.startValue + diff;\n                }\n                _this.updateValue(_this.newValue, false, true);\n            });\n        },\n        onTouchEnd: function () {\n            var _this = this;\n            if (this.data.disabled)\n                return;\n            if (this.dragStatus === DRAG_STATUS.MOVING) {\n                this.dragStatus = DRAG_STATUS.END;\n                (0, utils_1.nextTick)(function () {\n                    _this.updateValue(_this.newValue, true);\n                    _this.$emit('drag-end');\n                });\n            }\n        },\n        onClick: function (event) {\n            var _this = this;\n            if (this.data.disabled)\n                return;\n            var min = this.data.min;\n            (0, utils_1.getRect)(this, '.van-slider').then(function (rect) {\n                var vertical = _this.data.vertical;\n                var touch = event.touches[0];\n                var delta = vertical\n                    ? touch.clientY - rect.top\n                    : touch.clientX - rect.left;\n                var total = vertical ? rect.height : rect.width;\n                var value = Number(min) + (delta / total) * _this.getRange();\n                if (_this.isRange(_this.value)) {\n                    var _a = _this.value, left = _a[0], right = _a[1];\n                    var middle = (left + right) / 2;\n                    if (value <= middle) {\n                        _this.updateValue([value, right], true);\n                    }\n                    else {\n                        _this.updateValue([left, value], true);\n                    }\n                }\n                else {\n                    _this.updateValue(value, true);\n                }\n            });\n        },\n        isRange: function (val) {\n            var range = this.data.range;\n            return range && Array.isArray(val);\n        },\n        handleOverlap: function (value) {\n            if (value[0] > value[1]) {\n                return value.slice(0).reverse();\n            }\n            return value;\n        },\n        updateValue: function (value, end, drag) {\n            var _this = this;\n            if (this.isRange(value)) {\n                value = this.handleOverlap(value).map(function (val) { return _this.format(val); });\n            }\n            else {\n                value = this.format(value);\n            }\n            this.value = value;\n            var vertical = this.data.vertical;\n            var mainAxis = vertical ? 'height' : 'width';\n            this.setData({\n                wrapperStyle: \"\\n          background: \".concat(this.data.inactiveColor || '', \";\\n          \").concat(vertical ? 'width' : 'height', \": \").concat((0, utils_1.addUnit)(this.data.barHeight) || '', \";\\n        \"),\n                barStyle: \"\\n          \".concat(mainAxis, \": \").concat(this.calcMainAxis(), \";\\n          left: \").concat(vertical ? 0 : this.calcOffset(), \";\\n          top: \").concat(vertical ? this.calcOffset() : 0, \";\\n          \").concat(drag ? 'transition: none;' : '', \"\\n        \"),\n            });\n            if (drag) {\n                this.$emit('drag', { value: value });\n            }\n            if (end) {\n                this.$emit('change', value);\n            }\n            if ((drag || end) && (0, version_1.canIUseModel)()) {\n                this.setData({ value: value });\n            }\n        },\n        getScope: function () {\n            return Number(this.data.max) - Number(this.data.min);\n        },\n        getRange: function () {\n            var _a = this.data, max = _a.max, min = _a.min;\n            return max - min;\n        },\n        getOffsetWidth: function (current, min) {\n            var scope = this.getScope();\n            // 避免最小值小于最小step时出现负数情况\n            return \"\".concat(Math.max(((current - min) * 100) / scope, 0), \"%\");\n        },\n        // 计算选中条的长度百分比\n        calcMainAxis: function () {\n            var value = this.value;\n            var min = this.data.min;\n            if (this.isRange(value)) {\n                return this.getOffsetWidth(value[1], value[0]);\n            }\n            return this.getOffsetWidth(value, Number(min));\n        },\n        // 计算选中条的开始位置的偏移量\n        calcOffset: function () {\n            var value = this.value;\n            var min = this.data.min;\n            var scope = this.getScope();\n            if (this.isRange(value)) {\n                return \"\".concat(((value[0] - Number(min)) * 100) / scope, \"%\");\n            }\n            return '0%';\n        },\n        format: function (value) {\n            var min = +this.data.min;\n            var max = +this.data.max;\n            var step = +this.data.step;\n            value = (0, utils_1.clamp)(value, min, max);\n            var diff = Math.round((value - min) / step) * step;\n            return (0, utils_1.addNumber)(min, diff);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/slider/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/slider/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"../wxs/style.wxs\" module=\"style\" />\n\n<view\n  class=\"custom-class {{ utils.bem('slider', { disabled, vertical }) }}\"\n  style=\"{{ wrapperStyle }}\"\n  bind:tap=\"onClick\"\n>\n  <view\n    class=\"{{ utils.bem('slider__bar') }}\"\n    style=\"{{ barStyle }}; {{ style({ backgroundColor: activeColor }) }}\"\n  >\n    <view\n      wx:if=\"{{ range }}\"\n      class=\"{{ utils.bem('slider__button-wrapper-left') }}\"\n      data-index=\"{{ 0 }}\"\n      bind:touchstart=\"onTouchStart\"\n      catch:touchmove=\"onTouchMove\"\n      bind:touchend=\"onTouchEnd\"\n      bind:touchcancel=\"onTouchEnd\"\n    >\n      <slot\n        wx:if=\"{{ useButtonSlot }}\"\n        name=\"left-button\"\n      />\n      <view\n        wx:else\n        class=\"{{ utils.bem('slider__button') }}\"\n      />\n    </view>\n    <view\n      wx:if=\"{{ range }}\"\n      class=\"{{ utils.bem('slider__button-wrapper-right') }}\"\n      data-index=\"{{ 1 }}\"\n      bind:touchstart=\"onTouchStart\"\n      catch:touchmove=\"onTouchMove\"\n      bind:touchend=\"onTouchEnd\"\n      bind:touchcancel=\"onTouchEnd\"\n    >\n      <slot\n        wx:if=\"{{ useButtonSlot }}\"\n        name=\"right-button\"\n      />\n      <view\n        wx:else\n        class=\"{{ utils.bem('slider__button') }}\"\n      />\n    </view>\n\n    <view\n      wx:if=\"{{ !range }}\"\n      class=\"{{ utils.bem('slider__button-wrapper') }}\"\n      bind:touchstart=\"onTouchStart\"\n      catch:touchmove=\"onTouchMove\"\n      bind:touchend=\"onTouchEnd\"\n      bind:touchcancel=\"onTouchEnd\"\n    >\n      <slot\n        wx:if=\"{{ useButtonSlot }}\"\n        name=\"button\"\n      />\n      <view\n        wx:else\n        class=\"{{ utils.bem('slider__button') }}\"\n      />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/slider/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction barStyle(barHeight, activeColor) {\n  return style({\n    height: addUnit(barHeight),\n    background: activeColor,\n  });\n}\n\nmodule.exports = {\n  barStyle: barStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/slider/index.wxss",
    "content": "@import '../common/index.wxss';.van-slider{background-color:var(--slider-inactive-background-color,#ebedf0);border-radius:999px;height:var(--slider-bar-height,2px);position:relative}.van-slider:before{bottom:calc(var(--padding-xs, 8px)*-1);content:\"\";left:0;position:absolute;right:0;top:calc(var(--padding-xs, 8px)*-1)}.van-slider__bar{background-color:var(--slider-active-background-color,#1989fa);border-radius:inherit;height:100%;position:relative;transition:all .2s;width:100%}.van-slider__button{background-color:var(--slider-button-background-color,#fff);border-radius:var(--slider-button-border-radius,50%);box-shadow:var(--slider-button-box-shadow,0 1px 2px rgba(0,0,0,.5));height:var(--slider-button-height,24px);width:var(--slider-button-width,24px)}.van-slider__button-wrapper,.van-slider__button-wrapper-right{position:absolute;right:0;top:50%;transform:translate3d(50%,-50%,0)}.van-slider__button-wrapper-left{left:0;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.van-slider--disabled{opacity:var(--slider-disabled-opacity,.5)}.van-slider--vertical{display:inline-block;height:100%;width:var(--slider-bar-height,2px)}.van-slider--vertical .van-slider__button-wrapper,.van-slider--vertical .van-slider__button-wrapper-right{bottom:0;right:50%;top:auto;transform:translate3d(50%,50%,0)}.van-slider--vertical .van-slider__button-wrapper-left{left:auto;right:50%;top:0;transform:translate3d(50%,-50%,0)}.van-slider--vertical:before{bottom:0;left:-8px;right:-8px;top:0}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/stepper/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/stepper/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar validator_1 = require(\"../common/validator\");\nvar LONG_PRESS_START_TIME = 600;\nvar LONG_PRESS_INTERVAL = 200;\n// add num and avoid float number\nfunction add(num1, num2) {\n    var cardinal = Math.pow(10, 10);\n    return Math.round((num1 + num2) * cardinal) / cardinal;\n}\nfunction equal(value1, value2) {\n    return String(value1) === String(value2);\n}\n(0, component_1.VantComponent)({\n    field: true,\n    classes: ['input-class', 'plus-class', 'minus-class'],\n    props: {\n        value: {\n            type: null,\n        },\n        integer: {\n            type: Boolean,\n            observer: 'check',\n        },\n        disabled: Boolean,\n        inputWidth: String,\n        buttonSize: String,\n        asyncChange: Boolean,\n        disableInput: Boolean,\n        decimalLength: {\n            type: Number,\n            value: null,\n            observer: 'check',\n        },\n        min: {\n            type: null,\n            value: 1,\n            observer: 'check',\n        },\n        max: {\n            type: null,\n            value: Number.MAX_SAFE_INTEGER,\n            observer: 'check',\n        },\n        step: {\n            type: null,\n            value: 1,\n        },\n        showPlus: {\n            type: Boolean,\n            value: true,\n        },\n        showMinus: {\n            type: Boolean,\n            value: true,\n        },\n        disablePlus: Boolean,\n        disableMinus: Boolean,\n        longPress: {\n            type: Boolean,\n            value: true,\n        },\n        theme: String,\n        alwaysEmbed: Boolean,\n    },\n    data: {\n        currentValue: '',\n    },\n    watch: {\n        value: function () {\n            this.observeValue();\n        },\n    },\n    created: function () {\n        this.setData({\n            currentValue: this.format(this.data.value).newValue,\n        });\n    },\n    methods: {\n        observeValue: function () {\n            var value = this.data.value;\n            this.setData({ currentValue: this.format(value).newValue });\n        },\n        check: function () {\n            var newValue = this.format(this.data.currentValue).newValue;\n            if (!equal(newValue, this.data.currentValue)) {\n                this.setData({ currentValue: newValue });\n            }\n        },\n        isDisabled: function (type) {\n            var _a = this.data, disabled = _a.disabled, disablePlus = _a.disablePlus, disableMinus = _a.disableMinus, currentValue = _a.currentValue, max = _a.max, min = _a.min;\n            if (type === 'plus') {\n                return disabled || disablePlus || +currentValue >= +max;\n            }\n            return disabled || disableMinus || +currentValue <= +min;\n        },\n        onFocus: function (event) {\n            this.$emit('focus', event.detail);\n        },\n        onBlur: function (event) {\n            var data = this.format(event.detail.value);\n            this.setData({ currentValue: data.newValue });\n            this.emitChange(data);\n            this.$emit('blur', __assign(__assign({}, event.detail), { value: +data.newValue }));\n        },\n        // filter illegal characters\n        filter: function (value) {\n            value = String(value).replace(/[^0-9.-]/g, '');\n            if (this.data.integer && value.indexOf('.') !== -1) {\n                value = value.split('.')[0];\n            }\n            return value;\n        },\n        format: function (value) {\n            // filter illegal characters and format integer\n            var safeValue = this.filter(value);\n            // format range\n            var rangeValue = Math.max(Math.min(this.data.max, +safeValue), this.data.min);\n            // format decimal\n            var newValue = (0, validator_1.isDef)(this.data.decimalLength)\n                ? rangeValue.toFixed(this.data.decimalLength)\n                : String(rangeValue);\n            return { value: value, newValue: newValue };\n        },\n        onInput: function (event) {\n            var _a = (event.detail || {}).value, value = _a === void 0 ? '' : _a;\n            // allow input to be empty\n            if (value === '') {\n                return;\n            }\n            var formatted = this.format(value);\n            this.emitChange(formatted);\n        },\n        emitChange: function (data) {\n            var value = data.value, newValue = data.newValue;\n            if (!this.data.asyncChange) {\n                // fix when input 11. parsed to 11, unable to enter decimal\n                this.setData({ currentValue: +value === +newValue ? value : newValue });\n            }\n            this.$emit('change', +newValue);\n        },\n        onChange: function () {\n            var type = this.type;\n            if (this.isDisabled(type)) {\n                this.$emit('overlimit', type);\n                return;\n            }\n            var diff = type === 'minus' ? -this.data.step : +this.data.step;\n            var value = this.format(String(add(+this.data.currentValue, diff)));\n            this.emitChange(value);\n            this.$emit(type);\n        },\n        longPressStep: function () {\n            var _this = this;\n            this.longPressTimer = setTimeout(function () {\n                _this.onChange();\n                _this.longPressStep();\n            }, LONG_PRESS_INTERVAL);\n        },\n        onTap: function (event) {\n            var type = event.currentTarget.dataset.type;\n            this.type = type;\n            this.onChange();\n        },\n        onTouchStart: function (event) {\n            var _this = this;\n            if (!this.data.longPress) {\n                return;\n            }\n            clearTimeout(this.longPressTimer);\n            var type = event.currentTarget.dataset.type;\n            this.type = type;\n            this.isLongPress = false;\n            this.longPressTimer = setTimeout(function () {\n                _this.isLongPress = true;\n                _this.onChange();\n                _this.longPressStep();\n            }, LONG_PRESS_START_TIME);\n        },\n        onTouchEnd: function () {\n            if (!this.data.longPress) {\n                return;\n            }\n            clearTimeout(this.longPressTimer);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/stepper/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/stepper/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"{{ utils.bem('stepper', [theme]) }} custom-class\">\n  <view\n    wx:if=\"{{ showMinus }}\"\n    data-type=\"minus\"\n    style=\"{{ computed.buttonStyle({ buttonSize }) }}\"\n    class=\"minus-class {{ utils.bem('stepper__minus', { disabled: disabled || disableMinus || currentValue <= min }) }}\"\n    hover-class=\"van-stepper__minus--hover\"\n    hover-stay-time=\"70\"\n    bind:tap=\"onTap\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchend=\"onTouchEnd\"\n  >\n    <slot name=\"minus\" />\n  </view>\n  <input\n    type=\"{{ integer ? 'number' : 'digit' }}\"\n    class=\"input-class {{ utils.bem('stepper__input', { disabled: disabled || disableInput }) }}\"\n    style=\"{{ computed.inputStyle({ buttonSize, inputWidth }) }}\"\n    value=\"{{ currentValue }}\"\n    focus=\"{{ focus }}\"\n    disabled=\"{{ disabled || disableInput }}\"\n    always-embed=\"{{ alwaysEmbed }}\"\n    bindinput=\"onInput\"\n    bind:focus=\"onFocus\"\n    bind:blur=\"onBlur\"\n  />\n  <view\n    wx:if=\"{{ showPlus }}\"\n    data-type=\"plus\"\n    style=\"{{ computed.buttonStyle({ buttonSize }) }}\"\n    class=\"plus-class {{ utils.bem('stepper__plus', { disabled: disabled || disablePlus || currentValue >= max }) }}\"\n    hover-class=\"van-stepper__plus--hover\"\n    hover-stay-time=\"70\"\n    bind:tap=\"onTap\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchend=\"onTouchEnd\"\n  >\n    <slot name=\"plus\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/stepper/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction buttonStyle(data) {\n  return style({\n    width: addUnit(data.buttonSize),\n    height: addUnit(data.buttonSize),\n  });\n}\n\nfunction inputStyle(data) {\n  return style({\n    width: addUnit(data.inputWidth),\n    height: addUnit(data.buttonSize),\n  });\n}\n\nmodule.exports = {\n  buttonStyle: buttonStyle,\n  inputStyle: inputStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/stepper/index.wxss",
    "content": "@import '../common/index.wxss';.van-stepper{font-size:0}.van-stepper__minus,.van-stepper__plus{background-color:var(--stepper-background-color,#f2f3f5);border:0;box-sizing:border-box;color:var(--stepper-button-icon-color,#323233);display:inline-block;height:var(--stepper-input-height,28px);margin:1px;padding:var(--padding-base,4px);position:relative;vertical-align:middle;width:var(--stepper-input-height,28px)}.van-stepper__minus:before,.van-stepper__plus:before{height:1px;width:9px}.van-stepper__minus:after,.van-stepper__plus:after{height:9px;width:1px}.van-stepper__minus:empty.van-stepper__minus:after,.van-stepper__minus:empty.van-stepper__minus:before,.van-stepper__minus:empty.van-stepper__plus:after,.van-stepper__minus:empty.van-stepper__plus:before,.van-stepper__plus:empty.van-stepper__minus:after,.van-stepper__plus:empty.van-stepper__minus:before,.van-stepper__plus:empty.van-stepper__plus:after,.van-stepper__plus:empty.van-stepper__plus:before{background-color:currentColor;bottom:0;content:\"\";left:0;margin:auto;position:absolute;right:0;top:0}.van-stepper__minus--hover,.van-stepper__plus--hover{background-color:var(--stepper-active-color,#e8e8e8)}.van-stepper__minus--disabled,.van-stepper__plus--disabled{color:var(--stepper-button-disabled-icon-color,#c8c9cc)}.van-stepper__minus--disabled,.van-stepper__minus--disabled.van-stepper__minus--hover,.van-stepper__minus--disabled.van-stepper__plus--hover,.van-stepper__plus--disabled,.van-stepper__plus--disabled.van-stepper__minus--hover,.van-stepper__plus--disabled.van-stepper__plus--hover{background-color:var(--stepper-button-disabled-color,#f7f8fa)}.van-stepper__minus{border-radius:var(--stepper-border-radius,var(--stepper-border-radius,4px)) 0 0 var(--stepper-border-radius,var(--stepper-border-radius,4px))}.van-stepper__minus:after{display:none}.van-stepper__plus{border-radius:0 var(--stepper-border-radius,var(--stepper-border-radius,4px)) var(--stepper-border-radius,var(--stepper-border-radius,4px)) 0}.van-stepper--round .van-stepper__input{background-color:initial!important}.van-stepper--round .van-stepper__minus,.van-stepper--round .van-stepper__plus{border-radius:100%}.van-stepper--round .van-stepper__minus:active,.van-stepper--round .van-stepper__plus:active{opacity:.7}.van-stepper--round .van-stepper__minus--disabled,.van-stepper--round .van-stepper__minus--disabled:active,.van-stepper--round .van-stepper__plus--disabled,.van-stepper--round .van-stepper__plus--disabled:active{opacity:.3}.van-stepper--round .van-stepper__plus{background-color:#ee0a24;color:#fff}.van-stepper--round .van-stepper__minus{background-color:#fff;border:1px solid #ee0a24;color:#ee0a24}.van-stepper__input{-webkit-appearance:none;background-color:var(--stepper-background-color,#f2f3f5);border:0;border-radius:0;border-width:1px 0;box-sizing:border-box;color:var(--stepper-input-text-color,#323233);display:inline-block;font-size:var(--stepper-input-font-size,14px);height:var(--stepper-input-height,28px);margin:1px;min-height:0;padding:1px;text-align:center;vertical-align:middle;width:var(--stepper-input-width,32px)}.van-stepper__input--disabled{background-color:var(--stepper-input-disabled-background-color,#f2f3f5);color:var(--stepper-input-disabled-text-color,#c8c9cc)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/steps/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/steps/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar color_1 = require(\"../common/color\");\n(0, component_1.VantComponent)({\n    classes: ['desc-class'],\n    props: {\n        icon: String,\n        steps: Array,\n        active: Number,\n        direction: {\n            type: String,\n            value: 'horizontal',\n        },\n        activeColor: {\n            type: String,\n            value: color_1.GREEN,\n        },\n        inactiveColor: {\n            type: String,\n            value: color_1.GRAY_DARK,\n        },\n        activeIcon: {\n            type: String,\n            value: 'checked',\n        },\n        inactiveIcon: String,\n    },\n    methods: {\n        onClick: function (event) {\n            var index = event.currentTarget.dataset.index;\n            this.$emit('click-step', index);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/steps/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/steps/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class {{ utils.bem('steps', [direction]) }}\">\n  <view class=\"van-step__wrapper\">\n    <view\n      wx:for=\"{{ steps }}\"\n      wx:key=\"index\"\n      bindtap=\"onClick\"\n      data-index=\"{{ index }}\"\n      class=\"{{ utils.bem('step', [direction, status(index, active)]) }} van-hairline\"\n      style=\"{{ status(index, active) === 'inactive' ? 'color: ' + inactiveColor: '' }}\"\n    >\n      <view class=\"van-step__title\" style=\"{{ index === active ? 'color: ' + activeColor : '' }}\">\n        <view>{{ item.text }}</view>\n        <view class=\"desc-class\">{{ item.desc }}</view>\n      </view>\n      <view class=\"van-step__circle-container\">\n        <block wx:if=\"{{ index !== active }}\">\n          <van-icon\n            wx:if=\"{{ item.inactiveIcon || inactiveIcon }}\"\n            color=\"{{ status(index, active) === 'inactive' ? inactiveColor: activeColor }}\"\n            name=\"{{ item.inactiveIcon || inactiveIcon }}\"\n            class=\"van-step__icon\"\n          />\n          <view\n            wx:else\n            class=\"van-step__circle\"\n            style=\"{{ 'background-color: ' + (index < active ? activeColor : inactiveColor) }}\"\n          />\n        </block>\n\n        <van-icon wx:else name=\"{{ item.activeIcon || activeIcon }}\" color=\"{{ activeColor }}\" class=\"van-step__icon\" />\n      </view>\n      <view\n        wx:if=\"{{ index !== steps.length - 1 }}\"\n        class=\"van-step__line\" style=\"{{ 'background-color: ' + (index < active ? activeColor : inactiveColor) }}\"\n      />\n    </view>\n  </view>\n</view>\n\n<wxs module=\"status\">\nfunction get(index, active) {\n  if (index < active) {\n    return 'finish';\n  } else if (index === active) {\n    return 'process';\n  }\n\n  return 'inactive';\n}\n\nmodule.exports = get;\n</wxs>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/steps/index.wxss",
    "content": "@import '../common/index.wxss';.van-steps{background-color:var(--steps-background-color,#fff);overflow:hidden}.van-steps--horizontal{padding:10px}.van-steps--horizontal .van-step__wrapper{display:flex;overflow:hidden;position:relative}.van-steps--vertical{padding-left:10px}.van-steps--vertical .van-step__wrapper{padding:0 0 0 20px}.van-step{color:var(--step-text-color,#969799);flex:1;font-size:var(--step-font-size,14px);position:relative}.van-step--finish{color:var(--step-finish-text-color,#323233)}.van-step__circle{background-color:var(--step-circle-color,#969799);border-radius:50%;height:var(--step-circle-size,5px);width:var(--step-circle-size,5px)}.van-step--horizontal{padding-bottom:14px}.van-step--horizontal:first-child .van-step__title{transform:none}.van-step--horizontal:first-child .van-step__circle-container{padding:0 8px 0 0;transform:translate3d(0,50%,0)}.van-step--horizontal:last-child{bottom:0;position:absolute;right:0;top:0;width:auto}.van-step--horizontal:last-child .van-step__title{text-align:right;transform:none}.van-step--horizontal:last-child .van-step__circle-container{padding:0 0 0 8px;right:0;transform:translate3d(0,50%,0)}.van-step--horizontal .van-step__circle-container{background-color:#fff;bottom:6px;padding:0 var(--padding-xs,8px);position:absolute;transform:translate3d(-50%,50%,0);z-index:1}.van-step--horizontal .van-step__title{display:inline-block;font-size:var(--step-horizontal-title-font-size,12px);transform:translate3d(-50%,0,0)}.van-step--horizontal .van-step__line{background-color:var(--step-line-color,#ebedf0);bottom:6px;height:1px;left:0;position:absolute;right:0;transform:translate3d(0,50%,0)}.van-step--horizontal.van-step--process{color:var(--step-process-text-color,#323233)}.van-step--horizontal.van-step--process .van-step__icon{display:block;font-size:var(--step-icon-size,12px);line-height:1}.van-step--vertical{line-height:18px;padding:10px 10px 10px 0}.van-step--vertical:after{border-bottom-width:1px}.van-step--vertical:last-child:after{border-bottom-width:none}.van-step--vertical:first-child:before{background-color:#fff;content:\"\";height:20px;left:-15px;position:absolute;top:0;width:1px;z-index:1}.van-step--vertical .van-step__circle,.van-step--vertical .van-step__icon,.van-step--vertical .van-step__line{left:-14px;position:absolute;top:19px;transform:translate3d(-50%,-50%,0);z-index:2}.van-step--vertical .van-step__icon{background-color:var(--steps-background-color,#fff);font-size:var(--step-icon-size,12px);line-height:1}.van-step--vertical .van-step__line{background-color:var(--step-line-color,#ebedf0);height:100%;transform:translate3d(-50%,0,0);width:1px;z-index:1}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sticky/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sticky/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"../common/utils\");\nvar component_1 = require(\"../common/component\");\nvar validator_1 = require(\"../common/validator\");\nvar page_scroll_1 = require(\"../mixins/page-scroll\");\nvar ROOT_ELEMENT = '.van-sticky';\n(0, component_1.VantComponent)({\n    props: {\n        zIndex: {\n            type: Number,\n            value: 99,\n        },\n        offsetTop: {\n            type: Number,\n            value: 0,\n            observer: 'onScroll',\n        },\n        disabled: {\n            type: Boolean,\n            observer: 'onScroll',\n        },\n        container: {\n            type: null,\n            observer: 'onScroll',\n        },\n        scrollTop: {\n            type: null,\n            observer: function (val) {\n                this.onScroll({ scrollTop: val });\n            },\n        },\n    },\n    mixins: [\n        (0, page_scroll_1.pageScrollMixin)(function (event) {\n            if (this.data.scrollTop != null) {\n                return;\n            }\n            this.onScroll(event);\n        }),\n    ],\n    data: {\n        height: 0,\n        fixed: false,\n        transform: 0,\n    },\n    mounted: function () {\n        this.onScroll();\n    },\n    methods: {\n        onScroll: function (_a) {\n            var _this = this;\n            var _b = _a === void 0 ? {} : _a, scrollTop = _b.scrollTop;\n            var _c = this.data, container = _c.container, offsetTop = _c.offsetTop, disabled = _c.disabled;\n            if (disabled) {\n                this.setDataAfterDiff({\n                    fixed: false,\n                    transform: 0,\n                });\n                return;\n            }\n            this.scrollTop = scrollTop || this.scrollTop;\n            if (typeof container === 'function') {\n                Promise.all([(0, utils_1.getRect)(this, ROOT_ELEMENT), this.getContainerRect()])\n                    .then(function (_a) {\n                    var root = _a[0], container = _a[1];\n                    if (offsetTop + root.height > container.height + container.top) {\n                        _this.setDataAfterDiff({\n                            fixed: false,\n                            transform: container.height - root.height,\n                        });\n                    }\n                    else if (offsetTop >= root.top) {\n                        _this.setDataAfterDiff({\n                            fixed: true,\n                            height: root.height,\n                            transform: 0,\n                        });\n                    }\n                    else {\n                        _this.setDataAfterDiff({ fixed: false, transform: 0 });\n                    }\n                })\n                    .catch(function () { });\n                return;\n            }\n            (0, utils_1.getRect)(this, ROOT_ELEMENT).then(function (root) {\n                if (!(0, validator_1.isDef)(root) || (!root.width && !root.height)) {\n                    return;\n                }\n                if (offsetTop >= root.top) {\n                    _this.setDataAfterDiff({ fixed: true, height: root.height });\n                    _this.transform = 0;\n                }\n                else {\n                    _this.setDataAfterDiff({ fixed: false });\n                }\n            });\n        },\n        setDataAfterDiff: function (data) {\n            var _this = this;\n            wx.nextTick(function () {\n                var diff = Object.keys(data).reduce(function (prev, key) {\n                    if (data[key] !== _this.data[key]) {\n                        prev[key] = data[key];\n                    }\n                    return prev;\n                }, {});\n                if (Object.keys(diff).length > 0) {\n                    _this.setData(diff);\n                }\n                _this.$emit('scroll', {\n                    scrollTop: _this.scrollTop,\n                    isFixed: data.fixed || _this.data.fixed,\n                });\n            });\n        },\n        getContainerRect: function () {\n            var nodesRef = this.data.container();\n            if (!nodesRef) {\n                return Promise.reject(new Error('not found container'));\n            }\n            return new Promise(function (resolve) { return nodesRef.boundingClientRect(resolve).exec(); });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sticky/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sticky/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"custom-class van-sticky\" style=\"{{ computed.containerStyle({ fixed, height, zIndex }) }}\">\n  <view class=\"{{ utils.bem('sticky-wrap', { fixed }) }}\" style=\"{{ computed.wrapStyle({ fixed, offsetTop, transform, zIndex }) }}\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sticky/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction wrapStyle(data) {\n  return style({\n    transform: data.transform\n      ? 'translate3d(0, ' + data.transform + 'px, 0)'\n      : '',\n    top: data.fixed ? addUnit(data.offsetTop) : '',\n    'z-index': data.zIndex,\n  });\n}\n\nfunction containerStyle(data) {\n  return style({\n    height: data.fixed ? addUnit(data.height) : '',\n    'z-index': data.zIndex,\n  });\n}\n\nmodule.exports = {\n  wrapStyle: wrapStyle,\n  containerStyle: containerStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/sticky/index.wxss",
    "content": "@import '../common/index.wxss';.van-sticky{position:relative}.van-sticky-wrap--fixed{left:0;position:fixed;right:0}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/submit-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/submit-bar/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: ['bar-class', 'price-class', 'button-class'],\n    props: {\n        tip: {\n            type: null,\n            observer: 'updateTip',\n        },\n        tipIcon: String,\n        type: Number,\n        price: {\n            type: null,\n            observer: 'updatePrice',\n        },\n        label: String,\n        loading: Boolean,\n        disabled: Boolean,\n        buttonText: String,\n        currency: {\n            type: String,\n            value: '¥',\n        },\n        buttonType: {\n            type: String,\n            value: 'danger',\n        },\n        decimalLength: {\n            type: Number,\n            value: 2,\n            observer: 'updatePrice',\n        },\n        suffixLabel: String,\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    methods: {\n        updatePrice: function () {\n            var _a = this.data, price = _a.price, decimalLength = _a.decimalLength;\n            var priceStrArr = typeof price === 'number' &&\n                (price / 100).toFixed(decimalLength).split('.');\n            this.setData({\n                hasPrice: typeof price === 'number',\n                integerStr: priceStrArr && priceStrArr[0],\n                decimalStr: decimalLength && priceStrArr ? \".\".concat(priceStrArr[1]) : '',\n            });\n        },\n        updateTip: function () {\n            this.setData({ hasTip: typeof this.data.tip === 'string' });\n        },\n        onSubmit: function (event) {\n            this.$emit('submit', event.detail);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/submit-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-button\": \"../button/index\",\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/submit-bar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-submit-bar custom-class\">\n  <slot name=\"top\" />\n\n  <view class=\"van-submit-bar__tip\">\n    <van-icon\n      wx:if=\"{{ tipIcon }}\"\n      size=\"12px\"\n      name=\"{{ tipIcon }}\"\n      custom-class=\"van-submit-bar__tip-icon\"\n    />\n    <view wx:if=\"{{ hasTip }}\" class=\"van-submit-bar__tip-text\">\n      {{ tip }}\n    </view>\n    <slot name=\"tip\" />\n  </view>\n\n  <view class=\"bar-class van-submit-bar__bar\">\n    <slot />\n    <view wx:if=\"{{ hasPrice }}\" class=\"van-submit-bar__text\">\n      <text>{{ label || '合计：' }}</text>\n      <text class=\"van-submit-bar__price price-class\">\n        <text class=\"van-submit-bar__currency\">{{ currency }} </text>\n        <text class=\"van-submit-bar__price-integer\">{{ integerStr }}</text><text>{{decimalStr}}</text>\n      </text>\n      <text class=\"van-submit-bar__suffix-label\">{{ suffixLabel }}</text>\n    </view>\n    <van-button\n      round\n      type=\"{{ buttonType }}\"\n      loading=\"{{ loading }}\"\n      disabled=\"{{ disabled }}\"\n      class=\"van-submit-bar__button\"\n      custom-class=\"button-class\"\n      custom-style=\"width: 100%;\"\n      bind:click=\"onSubmit\"\n    >\n      {{ loading ? '' : buttonText }}\n    </van-button>\n  </view>\n\n  <view wx:if=\"{{ safeAreaInsetBottom }}\" class=\"van-submit-bar__safe\" />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/submit-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-submit-bar{background-color:var(--submit-bar-background-color,#fff);bottom:0;left:0;position:fixed;-webkit-user-select:none;user-select:none;width:100%;z-index:var(--submit-bar-z-index,100)}.van-submit-bar__tip{background-color:var(--submit-bar-tip-background-color,#fff7cc);color:var(--submit-bar-tip-color,#f56723);font-size:var(--submit-bar-tip-font-size,12px);line-height:var(--submit-bar-tip-line-height,1.5);padding:var(--submit-bar-tip-padding,10px)}.van-submit-bar__tip:empty{display:none}.van-submit-bar__tip-icon{margin-right:4px;vertical-align:middle}.van-submit-bar__tip-text{display:inline;vertical-align:middle}.van-submit-bar__bar{align-items:center;background-color:var(--submit-bar-background-color,#fff);display:flex;font-size:var(--submit-bar-text-font-size,14px);height:var(--submit-bar-height,50px);justify-content:flex-end;padding:var(--submit-bar-padding,0 16px)}.van-submit-bar__safe{height:constant(safe-area-inset-bottom);height:env(safe-area-inset-bottom)}.van-submit-bar__text{color:var(--submit-bar-text-color,#323233);flex:1;font-weight:var(--font-weight-bold,500);padding-right:var(--padding-sm,12px);text-align:right}.van-submit-bar__price{color:var(--submit-bar-price-color,#ee0a24);font-size:var(--submit-bar-price-font-size,12px);font-weight:var(--font-weight-bold,500)}.van-submit-bar__price-integer{font-family:Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif;font-size:20px}.van-submit-bar__currency{font-size:var(--submit-bar-currency-font-size,12px)}.van-submit-bar__suffix-label{margin-left:5px}.van-submit-bar__button{--button-default-height:var(--submit-bar-button-height,40px)!important;--button-line-height:var(--submit-bar-button-height,40px)!important;font-weight:var(--font-weight-bold,500);width:var(--submit-bar-button-width,110px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/swipe-cell/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/swipe-cell/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar touch_1 = require(\"../mixins/touch\");\nvar utils_1 = require(\"../common/utils\");\nvar THRESHOLD = 0.3;\nvar ARRAY = [];\n(0, component_1.VantComponent)({\n    props: {\n        disabled: Boolean,\n        leftWidth: {\n            type: Number,\n            value: 0,\n            observer: function (leftWidth) {\n                if (leftWidth === void 0) { leftWidth = 0; }\n                if (this.offset > 0) {\n                    this.swipeMove(leftWidth);\n                }\n            },\n        },\n        rightWidth: {\n            type: Number,\n            value: 0,\n            observer: function (rightWidth) {\n                if (rightWidth === void 0) { rightWidth = 0; }\n                if (this.offset < 0) {\n                    this.swipeMove(-rightWidth);\n                }\n            },\n        },\n        asyncClose: Boolean,\n        name: {\n            type: null,\n            value: '',\n        },\n    },\n    mixins: [touch_1.touch],\n    data: {\n        catchMove: false,\n        wrapperStyle: '',\n    },\n    created: function () {\n        this.offset = 0;\n        ARRAY.push(this);\n    },\n    destroyed: function () {\n        var _this = this;\n        ARRAY = ARRAY.filter(function (item) { return item !== _this; });\n    },\n    methods: {\n        open: function (position) {\n            var _a = this.data, leftWidth = _a.leftWidth, rightWidth = _a.rightWidth;\n            var offset = position === 'left' ? leftWidth : -rightWidth;\n            this.swipeMove(offset);\n            this.$emit('open', {\n                position: position,\n                name: this.data.name,\n            });\n        },\n        close: function () {\n            this.swipeMove(0);\n        },\n        swipeMove: function (offset) {\n            if (offset === void 0) { offset = 0; }\n            this.offset = (0, utils_1.range)(offset, -this.data.rightWidth, this.data.leftWidth);\n            var transform = \"translate3d(\".concat(this.offset, \"px, 0, 0)\");\n            var transition = this.dragging\n                ? 'none'\n                : 'transform .6s cubic-bezier(0.18, 0.89, 0.32, 1)';\n            this.setData({\n                wrapperStyle: \"\\n        -webkit-transform: \".concat(transform, \";\\n        -webkit-transition: \").concat(transition, \";\\n        transform: \").concat(transform, \";\\n        transition: \").concat(transition, \";\\n      \"),\n            });\n        },\n        swipeLeaveTransition: function () {\n            var _a = this.data, leftWidth = _a.leftWidth, rightWidth = _a.rightWidth;\n            var offset = this.offset;\n            if (rightWidth > 0 && -offset > rightWidth * THRESHOLD) {\n                this.open('right');\n            }\n            else if (leftWidth > 0 && offset > leftWidth * THRESHOLD) {\n                this.open('left');\n            }\n            else {\n                this.swipeMove(0);\n            }\n            this.setData({ catchMove: false });\n        },\n        startDrag: function (event) {\n            if (this.data.disabled) {\n                return;\n            }\n            this.startOffset = this.offset;\n            this.touchStart(event);\n        },\n        noop: function () { },\n        onDrag: function (event) {\n            var _this = this;\n            if (this.data.disabled) {\n                return;\n            }\n            this.touchMove(event);\n            if (this.direction !== 'horizontal') {\n                return;\n            }\n            this.dragging = true;\n            ARRAY.filter(function (item) { return item !== _this && item.offset !== 0; }).forEach(function (item) { return item.close(); });\n            this.setData({ catchMove: true });\n            this.swipeMove(this.startOffset + this.deltaX);\n        },\n        endDrag: function () {\n            if (this.data.disabled) {\n                return;\n            }\n            this.dragging = false;\n            this.swipeLeaveTransition();\n        },\n        onClick: function (event) {\n            var _a = event.currentTarget.dataset.key, position = _a === void 0 ? 'outside' : _a;\n            this.$emit('click', position);\n            if (!this.offset) {\n                return;\n            }\n            if (this.data.asyncClose) {\n                this.$emit('close', {\n                    position: position,\n                    instance: this,\n                    name: this.data.name,\n                });\n            }\n            else {\n                this.swipeMove(0);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/swipe-cell/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/swipe-cell/index.wxml",
    "content": "<view\n  class=\"van-swipe-cell custom-class\"\n  data-key=\"cell\"\n  catchtap=\"onClick\"\n  bindtouchstart=\"startDrag\"\n  catchtouchmove=\"{{ catchMove ? 'noop' : '' }}\"\n  capture-bind:touchmove=\"onDrag\"\n  bindtouchend=\"endDrag\"\n  bindtouchcancel=\"endDrag\"\n>\n  <view style=\"{{ wrapperStyle }}\">\n    <view wx:if=\"{{ leftWidth }}\" class=\"van-swipe-cell__left\" data-key=\"left\" catch:tap=\"onClick\">\n      <slot name=\"left\" />\n    </view>\n    <slot />\n    <view wx:if=\"{{ rightWidth }}\" class=\"van-swipe-cell__right\" data-key=\"right\" catch:tap=\"onClick\">\n      <slot name=\"right\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/swipe-cell/index.wxss",
    "content": "@import '../common/index.wxss';.van-swipe-cell{overflow:hidden;position:relative}.van-swipe-cell__left,.van-swipe-cell__right{height:100%;position:absolute;top:0}.van-swipe-cell__left{left:0;transform:translate3d(-100%,0,0)}.van-swipe-cell__right{right:0;transform:translate3d(100%,0,0)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/switch/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/switch/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    field: true,\n    classes: ['node-class'],\n    props: {\n        checked: null,\n        loading: Boolean,\n        disabled: Boolean,\n        activeColor: String,\n        inactiveColor: String,\n        size: {\n            type: String,\n            value: '30',\n        },\n        activeValue: {\n            type: null,\n            value: true,\n        },\n        inactiveValue: {\n            type: null,\n            value: false,\n        },\n    },\n    methods: {\n        onClick: function () {\n            var _a = this.data, activeValue = _a.activeValue, inactiveValue = _a.inactiveValue, disabled = _a.disabled, loading = _a.loading;\n            if (disabled || loading) {\n                return;\n            }\n            var checked = this.data.checked === activeValue;\n            var value = checked ? inactiveValue : activeValue;\n            this.$emit('input', value);\n            this.$emit('change', value);\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/switch/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/switch/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"{{ utils.bem('switch', { on: checked === activeValue, disabled }) }} custom-class\"\n  style=\"{{ computed.rootStyle({ size, checked, activeColor, inactiveColor, activeValue }) }}\"\n  bind:tap=\"onClick\"\n>\n  <view class=\"van-switch__node node-class\">\n    <van-loading\n      wx:if=\"{{ loading }}\"\n      color=\"{{ computed.loadingColor({ checked, activeColor, inactiveColor, activeValue }) }}\"\n      custom-class=\"van-switch__loading\"\n    />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/switch/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction rootStyle(data) {\n  var currentColor = data.checked === data.activeValue ? data.activeColor : data.inactiveColor;\n\n  return style({\n    'font-size': addUnit(data.size),\n    'background-color': currentColor,\n  });\n}\n\nvar BLUE = '#1989fa';\nvar GRAY_DARK = '#969799';\n\nfunction loadingColor(data) {\n  return data.checked === data.activeValue\n    ? data.activeColor || BLUE\n    : data.inactiveColor || GRAY_DARK;\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n  loadingColor: loadingColor,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/switch/index.wxss",
    "content": "@import '../common/index.wxss';.van-switch{background-color:var(--switch-background-color,#fff);border:var(--switch-border,1px solid rgba(0,0,0,.1));border-radius:var(--switch-node-size,1em);box-sizing:initial;display:inline-block;height:var(--switch-height,1em);position:relative;transition:background-color var(--switch-transition-duration,.3s);width:var(--switch-width,2em)}.van-switch__node{background-color:var(--switch-node-background-color,#fff);border-radius:100%;box-shadow:var(--switch-node-box-shadow,0 3px 1px 0 rgba(0,0,0,.05),0 2px 2px 0 rgba(0,0,0,.1),0 3px 3px 0 rgba(0,0,0,.05));height:var(--switch-node-size,1em);left:0;position:absolute;top:0;transition:var(--switch-transition-duration,.3s) cubic-bezier(.3,1.05,.4,1.05);width:var(--switch-node-size,1em);z-index:var(--switch-node-z-index,1)}.van-switch__loading{height:50%;left:25%;position:absolute!important;top:25%;width:50%}.van-switch--on{background-color:var(--switch-on-background-color,#1989fa)}.van-switch--on .van-switch__node{transform:translateX(calc(var(--switch-width, 2em) - var(--switch-node-size, 1em)))}.van-switch--disabled{opacity:var(--switch-disabled-opacity,.4)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tab/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tab/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar relation_1 = require(\"../common/relation\");\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useParent)('tabs'),\n    props: {\n        dot: {\n            type: Boolean,\n            observer: 'update',\n        },\n        info: {\n            type: null,\n            observer: 'update',\n        },\n        title: {\n            type: String,\n            observer: 'update',\n        },\n        disabled: {\n            type: Boolean,\n            observer: 'update',\n        },\n        titleStyle: {\n            type: String,\n            observer: 'update',\n        },\n        name: {\n            type: null,\n            value: '',\n        },\n    },\n    data: {\n        active: false,\n    },\n    methods: {\n        getComputedName: function () {\n            if (this.data.name !== '') {\n                return this.data.name;\n            }\n            return this.index;\n        },\n        updateRender: function (active, parent) {\n            var parentData = parent.data;\n            this.inited = this.inited || active;\n            this.setData({\n                active: active,\n                shouldRender: this.inited || !parentData.lazyRender,\n                shouldShow: active || parentData.animated,\n            });\n        },\n        update: function () {\n            if (this.parent) {\n                this.parent.updateTabs();\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tab/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tab/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('tab__pane', { active, inactive: !active }) }}\"\n  style=\"{{ shouldShow ? '' : 'display: none;' }}\"\n>\n  <slot wx:if=\"{{ shouldRender }}\" />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tab/index.wxss",
    "content": "@import '../common/index.wxss';:host{box-sizing:border-box;flex-shrink:0;width:100%}.van-tab__pane{-webkit-overflow-scrolling:touch;box-sizing:border-box;overflow-y:auto}.van-tab__pane--active{height:auto}.van-tab__pane--inactive{height:0;overflow:visible}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\nvar utils_1 = require(\"../common/utils\");\n(0, component_1.VantComponent)({\n    relation: (0, relation_1.useChildren)('tabbar-item', function () {\n        this.updateChildren();\n    }),\n    props: {\n        active: {\n            type: null,\n            observer: 'updateChildren',\n        },\n        activeColor: {\n            type: String,\n            observer: 'updateChildren',\n        },\n        inactiveColor: {\n            type: String,\n            observer: 'updateChildren',\n        },\n        fixed: {\n            type: Boolean,\n            value: true,\n            observer: 'setHeight',\n        },\n        placeholder: {\n            type: Boolean,\n            observer: 'setHeight',\n        },\n        border: {\n            type: Boolean,\n            value: true,\n        },\n        zIndex: {\n            type: Number,\n            value: 1,\n        },\n        safeAreaInsetBottom: {\n            type: Boolean,\n            value: true,\n        },\n    },\n    data: {\n        height: 50,\n    },\n    methods: {\n        updateChildren: function () {\n            var children = this.children;\n            if (!Array.isArray(children) || !children.length) {\n                return;\n            }\n            children.forEach(function (child) { return child.updateFromParent(); });\n        },\n        setHeight: function () {\n            var _this = this;\n            if (!this.data.fixed || !this.data.placeholder) {\n                return;\n            }\n            wx.nextTick(function () {\n                (0, utils_1.getRect)(_this, '.van-tabbar').then(function (res) {\n                    _this.setData({ height: res.height });\n                });\n            });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ border ? 'van-hairline--top-bottom' : '' }} {{ utils.bem('tabbar', { fixed, safe: safeAreaInsetBottom }) }} custom-class\"\n  style=\"{{ zIndex ? 'z-index: ' + zIndex : '' }}\"\n>\n  <slot />\n</view>\n\n<view wx:if=\"{{ fixed && placeholder }}\" style=\"height: {{ height }}px;\"></view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar/index.wxss",
    "content": "@import '../common/index.wxss';.van-tabbar{background-color:var(--tabbar-background-color,#fff);box-sizing:initial;display:flex;height:var(--tabbar-height,50px);width:100%}.van-tabbar--fixed{bottom:0;left:0;position:fixed}.van-tabbar--safe{padding-bottom:env(safe-area-inset-bottom)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar-item/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    props: {\n        info: null,\n        name: null,\n        icon: String,\n        dot: Boolean,\n        url: {\n            type: String,\n            value: '',\n        },\n        linkType: {\n            type: String,\n            value: 'redirectTo',\n        },\n        iconPrefix: {\n            type: String,\n            value: 'van-icon',\n        },\n    },\n    relation: (0, relation_1.useParent)('tabbar'),\n    data: {\n        active: false,\n        activeColor: '',\n        inactiveColor: '',\n    },\n    methods: {\n        onClick: function () {\n            var parent = this.parent;\n            if (parent) {\n                var index = parent.children.indexOf(this);\n                var active = this.data.name || index;\n                if (active !== this.data.active) {\n                    parent.$emit('change', active);\n                }\n            }\n            var _a = this.data, url = _a.url, linkType = _a.linkType;\n            if (url && wx[linkType]) {\n                return wx[linkType]({ url: url });\n            }\n            this.$emit('click');\n        },\n        updateFromParent: function () {\n            var parent = this.parent;\n            if (!parent) {\n                return;\n            }\n            var index = parent.children.indexOf(this);\n            var parentData = parent.data;\n            var data = this.data;\n            var active = (data.name || index) === parentData.active;\n            var patch = {};\n            if (active !== data.active) {\n                patch.active = active;\n            }\n            if (parentData.activeColor !== data.activeColor) {\n                patch.activeColor = parentData.activeColor;\n            }\n            if (parentData.inactiveColor !== data.inactiveColor) {\n                patch.inactiveColor = parentData.inactiveColor;\n            }\n            if (Object.keys(patch).length > 0) {\n                this.setData(patch);\n            }\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-info\": \"../info/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ utils.bem('tabbar-item', { active }) }} custom-class\"\n  style=\"color: {{ active ? activeColor : inactiveColor }}\"\n  bindtap=\"onClick\"\n>\n  <view class=\"van-tabbar-item__icon\">\n    <van-icon\n      wx:if=\"{{ icon }}\"\n      name=\"{{ icon }}\"\n      class-prefix=\"{{ iconPrefix }}\"\n      custom-class=\"van-tabbar-item__icon__inner\"\n    />\n    <block wx:else>\n      <slot wx:if=\"{{ active }}\" name=\"icon-active\" />\n      <slot wx:else name=\"icon\" />\n    </block>\n    <van-info\n      dot=\"{{ dot }}\"\n      info=\"{{ info }}\"\n      custom-class=\"van-tabbar-item__info\"\n    />\n  </view>\n  <view class=\"van-tabbar-item__text\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabbar-item/index.wxss",
    "content": "@import '../common/index.wxss';:host{flex:1}.van-tabbar-item{align-items:center;color:var(--tabbar-item-text-color,#646566);display:flex;flex-direction:column;font-size:var(--tabbar-item-font-size,12px);height:100%;justify-content:center;line-height:var(--tabbar-item-line-height,1)}.van-tabbar-item__icon{font-size:var(--tabbar-item-icon-size,22px);margin-bottom:var(--tabbar-item-margin-bottom,4px);position:relative}.van-tabbar-item__icon__inner{display:block;min-width:1em}.van-tabbar-item--active{color:var(--tabbar-item-active-color,#1989fa)}.van-tabbar-item__info{margin-top:2px}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabs/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabs/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar touch_1 = require(\"../mixins/touch\");\nvar utils_1 = require(\"../common/utils\");\nvar validator_1 = require(\"../common/validator\");\nvar relation_1 = require(\"../common/relation\");\n(0, component_1.VantComponent)({\n    mixins: [touch_1.touch],\n    classes: [\n        'nav-class',\n        'tab-class',\n        'tab-active-class',\n        'line-class',\n        'wrap-class',\n    ],\n    relation: (0, relation_1.useChildren)('tab', function () {\n        this.updateTabs();\n    }),\n    props: {\n        sticky: Boolean,\n        border: Boolean,\n        swipeable: Boolean,\n        titleActiveColor: String,\n        titleInactiveColor: String,\n        color: String,\n        animated: {\n            type: Boolean,\n            observer: function () {\n                var _this = this;\n                this.children.forEach(function (child, index) {\n                    return child.updateRender(index === _this.data.currentIndex, _this);\n                });\n            },\n        },\n        lineWidth: {\n            type: null,\n            value: 40,\n            observer: 'resize',\n        },\n        lineHeight: {\n            type: null,\n            value: -1,\n        },\n        active: {\n            type: null,\n            value: 0,\n            observer: function (name) {\n                if (name !== this.getCurrentName()) {\n                    this.setCurrentIndexByName(name);\n                }\n            },\n        },\n        type: {\n            type: String,\n            value: 'line',\n        },\n        ellipsis: {\n            type: Boolean,\n            value: true,\n        },\n        duration: {\n            type: Number,\n            value: 0.3,\n        },\n        zIndex: {\n            type: Number,\n            value: 1,\n        },\n        swipeThreshold: {\n            type: Number,\n            value: 5,\n            observer: function (value) {\n                this.setData({\n                    scrollable: this.children.length > value || !this.data.ellipsis,\n                });\n            },\n        },\n        offsetTop: {\n            type: Number,\n            value: 0,\n        },\n        lazyRender: {\n            type: Boolean,\n            value: true,\n        },\n        useBeforeChange: {\n            type: Boolean,\n            value: false,\n        },\n    },\n    data: {\n        tabs: [],\n        scrollLeft: 0,\n        scrollable: false,\n        currentIndex: 0,\n        container: null,\n        skipTransition: true,\n        scrollWithAnimation: false,\n        lineOffsetLeft: 0,\n        inited: false,\n    },\n    mounted: function () {\n        var _this = this;\n        (0, utils_1.requestAnimationFrame)(function () {\n            _this.swiping = true;\n            _this.setData({\n                container: function () { return _this.createSelectorQuery().select('.van-tabs'); },\n            });\n            _this.resize();\n            _this.scrollIntoView();\n        });\n    },\n    methods: {\n        updateTabs: function () {\n            var _a = this, _b = _a.children, children = _b === void 0 ? [] : _b, data = _a.data;\n            this.setData({\n                tabs: children.map(function (child) { return child.data; }),\n                scrollable: this.children.length > data.swipeThreshold || !data.ellipsis,\n            });\n            this.setCurrentIndexByName(data.active || this.getCurrentName());\n        },\n        trigger: function (eventName, child) {\n            var currentIndex = this.data.currentIndex;\n            var data = this.getChildData(currentIndex, child);\n            if (!(0, validator_1.isDef)(data)) {\n                return;\n            }\n            this.$emit(eventName, data);\n        },\n        onTap: function (event) {\n            var _this = this;\n            var index = event.currentTarget.dataset.index;\n            var child = this.children[index];\n            if (child.data.disabled) {\n                this.trigger('disabled', child);\n                return;\n            }\n            this.onBeforeChange(index).then(function () {\n                _this.setCurrentIndex(index);\n                (0, utils_1.nextTick)(function () {\n                    _this.trigger('click');\n                });\n            });\n        },\n        // correct the index of active tab\n        setCurrentIndexByName: function (name) {\n            var _a = this.children, children = _a === void 0 ? [] : _a;\n            var matched = children.filter(function (child) { return child.getComputedName() === name; });\n            if (matched.length) {\n                this.setCurrentIndex(matched[0].index);\n            }\n        },\n        setCurrentIndex: function (currentIndex) {\n            var _this = this;\n            var _a = this, data = _a.data, _b = _a.children, children = _b === void 0 ? [] : _b;\n            if (!(0, validator_1.isDef)(currentIndex) ||\n                currentIndex >= children.length ||\n                currentIndex < 0) {\n                return;\n            }\n            (0, utils_1.groupSetData)(this, function () {\n                children.forEach(function (item, index) {\n                    var active = index === currentIndex;\n                    if (active !== item.data.active || !item.inited) {\n                        item.updateRender(active, _this);\n                    }\n                });\n            });\n            if (currentIndex === data.currentIndex) {\n                if (!data.inited) {\n                    this.resize();\n                }\n                return;\n            }\n            var shouldEmitChange = data.currentIndex !== null;\n            this.setData({ currentIndex: currentIndex });\n            (0, utils_1.requestAnimationFrame)(function () {\n                _this.resize();\n                _this.scrollIntoView();\n            });\n            (0, utils_1.nextTick)(function () {\n                _this.trigger('input');\n                if (shouldEmitChange) {\n                    _this.trigger('change');\n                }\n            });\n        },\n        getCurrentName: function () {\n            var activeTab = this.children[this.data.currentIndex];\n            if (activeTab) {\n                return activeTab.getComputedName();\n            }\n        },\n        resize: function () {\n            var _this = this;\n            if (this.data.type !== 'line') {\n                return;\n            }\n            var _a = this.data, currentIndex = _a.currentIndex, ellipsis = _a.ellipsis, skipTransition = _a.skipTransition;\n            Promise.all([\n                (0, utils_1.getAllRect)(this, '.van-tab'),\n                (0, utils_1.getRect)(this, '.van-tabs__line'),\n            ]).then(function (_a) {\n                var _b = _a[0], rects = _b === void 0 ? [] : _b, lineRect = _a[1];\n                var rect = rects[currentIndex];\n                if (rect == null) {\n                    return;\n                }\n                var lineOffsetLeft = rects\n                    .slice(0, currentIndex)\n                    .reduce(function (prev, curr) { return prev + curr.width; }, 0);\n                lineOffsetLeft +=\n                    (rect.width - lineRect.width) / 2 + (ellipsis ? 0 : 8);\n                _this.setData({ lineOffsetLeft: lineOffsetLeft, inited: true });\n                _this.swiping = true;\n                if (skipTransition) {\n                    // waiting transition end\n                    setTimeout(function () {\n                        _this.setData({ skipTransition: false });\n                    }, _this.data.duration);\n                }\n            });\n        },\n        // scroll active tab into view\n        scrollIntoView: function () {\n            var _this = this;\n            var _a = this.data, currentIndex = _a.currentIndex, scrollable = _a.scrollable, scrollWithAnimation = _a.scrollWithAnimation;\n            if (!scrollable) {\n                return;\n            }\n            Promise.all([\n                (0, utils_1.getAllRect)(this, '.van-tab'),\n                (0, utils_1.getRect)(this, '.van-tabs__nav'),\n            ]).then(function (_a) {\n                var tabRects = _a[0], navRect = _a[1];\n                var tabRect = tabRects[currentIndex];\n                var offsetLeft = tabRects\n                    .slice(0, currentIndex)\n                    .reduce(function (prev, curr) { return prev + curr.width; }, 0);\n                _this.setData({\n                    scrollLeft: offsetLeft - (navRect.width - tabRect.width) / 2,\n                });\n                if (!scrollWithAnimation) {\n                    (0, utils_1.nextTick)(function () {\n                        _this.setData({ scrollWithAnimation: true });\n                    });\n                }\n            });\n        },\n        onTouchScroll: function (event) {\n            this.$emit('scroll', event.detail);\n        },\n        onTouchStart: function (event) {\n            if (!this.data.swipeable)\n                return;\n            this.swiping = true;\n            this.touchStart(event);\n        },\n        onTouchMove: function (event) {\n            if (!this.data.swipeable || !this.swiping)\n                return;\n            this.touchMove(event);\n        },\n        // watch swipe touch end\n        onTouchEnd: function () {\n            var _this = this;\n            if (!this.data.swipeable || !this.swiping)\n                return;\n            var _a = this, direction = _a.direction, deltaX = _a.deltaX, offsetX = _a.offsetX;\n            var minSwipeDistance = 50;\n            if (direction === 'horizontal' && offsetX >= minSwipeDistance) {\n                var index_1 = this.getAvaiableTab(deltaX);\n                if (index_1 !== -1) {\n                    this.onBeforeChange(index_1).then(function () { return _this.setCurrentIndex(index_1); });\n                }\n            }\n            this.swiping = false;\n        },\n        getAvaiableTab: function (direction) {\n            var _a = this.data, tabs = _a.tabs, currentIndex = _a.currentIndex;\n            var step = direction > 0 ? -1 : 1;\n            for (var i = step; currentIndex + i < tabs.length && currentIndex + i >= 0; i += step) {\n                var index = currentIndex + i;\n                if (index >= 0 &&\n                    index < tabs.length &&\n                    tabs[index] &&\n                    !tabs[index].disabled) {\n                    return index;\n                }\n            }\n            return -1;\n        },\n        onBeforeChange: function (index) {\n            var _this = this;\n            var useBeforeChange = this.data.useBeforeChange;\n            if (!useBeforeChange) {\n                return Promise.resolve();\n            }\n            return new Promise(function (resolve, reject) {\n                _this.$emit('before-change', __assign(__assign({}, _this.getChildData(index)), { callback: function (status) { return (status ? resolve() : reject()); } }));\n            });\n        },\n        getChildData: function (index, child) {\n            var currentChild = child || this.children[index];\n            if (!(0, validator_1.isDef)(currentChild)) {\n                return;\n            }\n            return {\n                index: currentChild.index,\n                name: currentChild.getComputedName(),\n                title: currentChild.data.title,\n            };\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabs/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-info\": \"../info/index\",\n    \"van-sticky\": \"../sticky/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabs/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"custom-class {{ utils.bem('tabs') }}\">\n  <van-sticky\n    disabled=\"{{ !sticky }}\"\n    z-index=\"{{ zIndex }}\"\n    offset-top=\"{{ offsetTop }}\"\n    container=\"{{ container }}\"\n    bind:scroll=\"onTouchScroll\"\n  >\n    <view class=\"{{ utils.bem('tabs--') + type }} {{ utils.bem('tabs__wrap', { scrollable }) }} {{ type === 'line' && border ? 'van-hairline--top-bottom' : '' }} wrap-class\">\n      <slot name=\"nav-left\" />\n\n      <scroll-view\n        scroll-x=\"{{ scrollable }}\"\n        scroll-with-animation=\"{{ scrollWithAnimation }}\"\n        scroll-left=\"{{ scrollLeft }}\"\n        class=\"{{ utils.bem('tabs__scroll', [type]) }}\"\n        style=\"{{ color ? 'border-color: ' + color : '' }}\"\n      >\n        <view class=\"{{ utils.bem('tabs__nav', [type, { complete: !ellipsis }]) }} nav-class\" style=\"{{ computed.navStyle(color, type) }}\">\n          <view wx:if=\"{{ type === 'line' }}\" class=\"van-tabs__line\" style=\"{{ computed.lineStyle({ color, lineOffsetLeft, lineHeight, skipTransition, duration, lineWidth, inited }) }}\" />\n          <view\n            wx:for=\"{{ tabs }}\"\n            wx:key=\"index\"\n            data-index=\"{{ index }}\"\n            class=\"{{ computed.tabClass(index === currentIndex, ellipsis) }} {{ utils.bem('tab', { active: index === currentIndex, disabled: item.disabled, complete: !ellipsis }) }}\"\n            style=\"{{ computed.tabStyle({ active: index === currentIndex, ellipsis, color, type, disabled: item.disabled, titleActiveColor, titleInactiveColor, swipeThreshold, scrollable }) }}\"\n            bind:tap=\"onTap\"\n          >\n            <view class=\"{{ ellipsis ? 'van-ellipsis' : '' }}\" style=\"{{ item.titleStyle }}\">\n              {{ item.title }}\n              <van-info\n                wx:if=\"{{ item.info !== null || item.dot }}\"\n                info=\"{{ item.info }}\"\n                dot=\"{{ item.dot }}\"\n                custom-class=\"van-tab__title__info\"\n              />\n            </view>\n          </view>\n        </view>\n      </scroll-view>\n\n      <slot name=\"nav-right\" />\n    </view>\n  </van-sticky>\n\n  <view\n    class=\"van-tabs__content\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchmove=\"onTouchMove\"\n    bind:touchend=\"onTouchEnd\"\n    bind:touchcancel=\"onTouchEnd\"\n  >\n    <view\n      class=\"{{ utils.bem('tabs__track', [{ animated }]) }} van-tabs__track\"\n      style=\"{{ computed.trackStyle({ duration, currentIndex, animated }) }}\"\n    >\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabs/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../wxs/utils.wxs');\nvar style = require('../wxs/style.wxs');\n\nfunction tabClass(active, ellipsis) {\n  var classes = ['tab-class'];\n\n  if (active) {\n    classes.push('tab-active-class');\n  }\n\n  if (ellipsis) {\n    classes.push('van-ellipsis');\n  }\n\n  return classes.join(' ');\n}\n\nfunction tabStyle(data) {\n  var titleColor = data.active\n    ? data.titleActiveColor\n    : data.titleInactiveColor;\n\n  var ellipsis = data.scrollable && data.ellipsis;\n\n  // card theme color\n  if (data.type === 'card') {\n    return style({\n      'border-color': data.color,\n      'background-color': !data.disabled && data.active ? data.color : null,\n      color: titleColor || (!data.disabled && !data.active ? data.color : null),\n      'flex-basis': ellipsis ? 88 / data.swipeThreshold + '%' : null,\n    });\n  }\n\n  return style({\n    color: titleColor,\n    'flex-basis': ellipsis ? 88 / data.swipeThreshold + '%' : null,\n  });\n}\n\nfunction navStyle(color, type) {\n  return style({\n    'border-color': type === 'card' && color ? color : null,\n  });\n}\n\nfunction trackStyle(data) {\n  if (!data.animated) {\n    return '';\n  }\n\n  return style({\n    left: -100 * data.currentIndex + '%',\n    'transition-duration': data.duration + 's',\n    '-webkit-transition-duration': data.duration + 's',\n  });\n}\n\nfunction lineStyle(data) {\n  return style({\n    width: utils.addUnit(data.lineWidth),\n    opacity: data.inited ? 1 : 0,\n    transform: 'translateX(' + data.lineOffsetLeft + 'px)',\n    '-webkit-transform': 'translateX(' + data.lineOffsetLeft + 'px)',\n    'background-color': data.color,\n    height: data.lineHeight !== -1 ? utils.addUnit(data.lineHeight) : null,\n    'border-radius':\n      data.lineHeight !== -1 ? utils.addUnit(data.lineHeight) : null,\n    'transition-duration': !data.skipTransition ? data.duration + 's' : null,\n    '-webkit-transition-duration': !data.skipTransition\n      ? data.duration + 's'\n      : null,\n  });\n}\n\nmodule.exports = {\n  tabClass: tabClass,\n  tabStyle: tabStyle,\n  trackStyle: trackStyle,\n  lineStyle: lineStyle,\n  navStyle: navStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tabs/index.wxss",
    "content": "@import '../common/index.wxss';.van-tabs{-webkit-tap-highlight-color:transparent;position:relative}.van-tabs__wrap{display:flex;overflow:hidden}.van-tabs__wrap--scrollable .van-tab{flex:0 0 22%}.van-tabs__wrap--scrollable .van-tab--complete{flex:1 0 auto!important;padding:0 12px}.van-tabs__wrap--scrollable .van-tabs__nav--complete{padding-left:8px;padding-right:8px}.van-tabs__scroll{background-color:var(--tabs-nav-background-color,#fff);overflow:auto}.van-tabs__scroll--line{box-sizing:initial;height:calc(100% + 15px)}.van-tabs__scroll--card{border:1px solid var(--tabs-default-color,#ee0a24);border-radius:2px;box-sizing:border-box;margin:0 var(--padding-md,16px);width:calc(100% - var(--padding-md, 16px)*2)}.van-tabs__scroll::-webkit-scrollbar{display:none}.van-tabs__nav{display:flex;position:relative;-webkit-user-select:none;user-select:none}.van-tabs__nav--card{box-sizing:border-box;height:var(--tabs-card-height,30px)}.van-tabs__nav--card .van-tab{border-right:1px solid var(--tabs-default-color,#ee0a24);color:var(--tabs-default-color,#ee0a24);line-height:calc(var(--tabs-card-height, 30px) - 2px)}.van-tabs__nav--card .van-tab:last-child{border-right:none}.van-tabs__nav--card .van-tab.van-tab--active{background-color:var(--tabs-default-color,#ee0a24);color:#fff}.van-tabs__nav--card .van-tab--disabled{color:var(--tab-disabled-text-color,#c8c9cc)}.van-tabs__line{background-color:var(--tabs-bottom-bar-color,#ee0a24);border-radius:var(--tabs-bottom-bar-height,3px);bottom:0;height:var(--tabs-bottom-bar-height,3px);left:0;opacity:0;position:absolute;z-index:1}.van-tabs__track{height:100%;position:relative;width:100%}.van-tabs__track--animated{display:flex;transition-property:left}.van-tabs__content{overflow:hidden}.van-tabs--line{height:var(--tabs-line-height,44px)}.van-tabs--card{height:var(--tabs-card-height,30px)}.van-tab{box-sizing:border-box;color:var(--tab-text-color,#646566);cursor:pointer;flex:1;font-size:var(--tab-font-size,14px);line-height:var(--tabs-line-height,44px);min-width:0;padding:0 5px;position:relative;text-align:center}.van-tab--active{color:var(--tab-active-text-color,#323233);font-weight:var(--font-weight-bold,500)}.van-tab--disabled{color:var(--tab-disabled-text-color,#c8c9cc)}.van-tab__title__info{position:relative!important;top:-1px!important;transform:translateX(0)!important}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tag/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tag/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        size: String,\n        mark: Boolean,\n        color: String,\n        plain: Boolean,\n        round: Boolean,\n        textColor: String,\n        type: {\n            type: String,\n            value: 'default',\n        },\n        closeable: Boolean,\n    },\n    methods: {\n        onClose: function () {\n            this.$emit('close');\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tag/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tag/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"custom-class {{ utils.bem('tag', [type, size, { mark, plain, round }]) }}\"\n  style=\"{{ computed.rootStyle({ plain, color, textColor }) }}\"\n>\n  <slot />\n  <van-icon\n    wx:if=\"{{ closeable }}\"\n    name=\"cross\"\n    custom-class=\"van-tag__close\"\n    bind:click=\"onClose\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tag/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\n\nfunction rootStyle(data) {\n  return style({\n    'background-color': data.plain ? '' : data.color,\n    color: data.textColor || data.plain ? data.textColor || data.color : '',\n  });\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tag/index.wxss",
    "content": "@import '../common/index.wxss';.van-tag{align-items:center;border-radius:var(--tag-border-radius,2px);color:var(--tag-text-color,#fff);display:inline-flex;font-size:var(--tag-font-size,12px);line-height:var(--tag-line-height,16px);padding:var(--tag-padding,0 4px);position:relative}.van-tag--default{background-color:var(--tag-default-color,#969799)}.van-tag--default.van-tag--plain{color:var(--tag-default-color,#969799)}.van-tag--danger{background-color:var(--tag-danger-color,#ee0a24)}.van-tag--danger.van-tag--plain{color:var(--tag-danger-color,#ee0a24)}.van-tag--primary{background-color:var(--tag-primary-color,#1989fa)}.van-tag--primary.van-tag--plain{color:var(--tag-primary-color,#1989fa)}.van-tag--success{background-color:var(--tag-success-color,#07c160)}.van-tag--success.van-tag--plain{color:var(--tag-success-color,#07c160)}.van-tag--warning{background-color:var(--tag-warning-color,#ff976a)}.van-tag--warning.van-tag--plain{color:var(--tag-warning-color,#ff976a)}.van-tag--plain{background-color:var(--tag-plain-background-color,#fff)}.van-tag--plain:before{border:1px solid;border-radius:inherit;bottom:0;content:\"\";left:0;pointer-events:none;position:absolute;right:0;top:0}.van-tag--medium{padding:var(--tag-medium-padding,2px 6px)}.van-tag--large{border-radius:var(--tag-large-border-radius,4px);font-size:var(--tag-large-font-size,14px);padding:var(--tag-large-padding,4px 8px)}.van-tag--mark{border-radius:0 var(--tag-round-border-radius,var(--tag-round-border-radius,999px)) var(--tag-round-border-radius,var(--tag-round-border-radius,999px)) 0}.van-tag--mark:after{content:\"\";display:block;width:2px}.van-tag--round{border-radius:var(--tag-round-border-radius,999px)}.van-tag__close{margin-left:2px;min-width:1em}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    props: {\n        show: Boolean,\n        mask: Boolean,\n        message: String,\n        forbidClick: Boolean,\n        zIndex: {\n            type: Number,\n            value: 1000,\n        },\n        type: {\n            type: String,\n            value: 'text',\n        },\n        loadingType: {\n            type: String,\n            value: 'circular',\n        },\n        position: {\n            type: String,\n            value: 'middle',\n        },\n    },\n    methods: {\n        // for prevent touchmove\n        noop: function () { },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\",\n    \"van-overlay\": \"../overlay/index\",\n    \"van-transition\": \"../transition/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/index.wxml",
    "content": "<van-overlay\n  wx:if=\"{{ mask || forbidClick }}\"\n  show=\"{{ show }}\"\n  z-index=\"{{ zIndex }}\"\n  custom-style=\"{{ mask ? '' : 'background-color: transparent;' }}\"\n/>\n<van-transition\n  show=\"{{ show }}\"\n  custom-style=\"z-index: {{ zIndex }}\"\n  custom-class=\"van-toast__container\"\n>\n  <view\n    class=\"van-toast van-toast--{{ (type === 'text' || type === 'html') ? 'text' : 'icon' }} van-toast--{{ position }}\"\n    catch:touchmove=\"noop\"\n  >\n    <!-- text only -->\n    <text wx:if=\"{{ type === 'text' }}\">{{ message }}</text>\n\n    <!-- html only -->\n    <rich-text wx:elif=\"{{ type === 'html' }}\" nodes=\"{{ message }}\"></rich-text>\n\n    <!-- with icon -->\n    <block wx:else>\n      <van-loading\n        wx:if=\"{{ type === 'loading' }}\"\n        color=\"white\"\n        type=\"{{ loadingType }}\"\n        custom-class=\"van-toast__loading\"\n      />\n      <van-icon wx:else class=\"van-toast__icon\" name=\"{{ type }}\" />\n      <text wx:if=\"{{ message }}\" class=\"van-toast__text\">{{ message }}</text>\n    </block>\n\n    <slot />\n  </view>\n</van-transition>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/index.wxss",
    "content": "@import '../common/index.wxss';.van-toast{word-wrap:break-word;align-items:center;background-color:var(--toast-background-color,rgba(0,0,0,.7));border-radius:var(--toast-border-radius,8px);box-sizing:initial;color:var(--toast-text-color,#fff);display:flex;flex-direction:column;font-size:var(--toast-font-size,14px);justify-content:center;line-height:var(--toast-line-height,20px);white-space:pre-wrap}.van-toast__container{left:50%;max-width:var(--toast-max-width,70%);position:fixed;top:50%;transform:translate(-50%,-50%);width:-webkit-fit-content;width:fit-content}.van-toast--text{min-width:var(--toast-text-min-width,96px);padding:var(--toast-text-padding,8px 12px)}.van-toast--icon{min-height:var(--toast-default-min-height,88px);padding:var(--toast-default-padding,16px);width:var(--toast-default-width,88px)}.van-toast--icon .van-toast__icon{font-size:var(--toast-icon-size,36px)}.van-toast--icon .van-toast__text{padding-top:8px}.van-toast__loading{margin:10px 0}.van-toast--top{transform:translateY(-30vh)}.van-toast--bottom{transform:translateY(30vh)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/toast.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\n/// <reference types=\"miniprogram-api-typings\" />\ntype ToastMessage = string | number;\ntype ToastContext = WechatMiniprogram.Component.TrivialInstance | WechatMiniprogram.Page.TrivialInstance;\ninterface ToastOptions {\n    show?: boolean;\n    type?: string;\n    mask?: boolean;\n    zIndex?: number;\n    context?: (() => ToastContext) | ToastContext;\n    position?: string;\n    duration?: number;\n    selector?: string;\n    forbidClick?: boolean;\n    loadingType?: string;\n    message?: ToastMessage;\n    onClose?: () => void;\n}\ndeclare function Toast(toastOptions: ToastOptions | ToastMessage): WechatMiniprogram.Component.TrivialInstance | undefined;\ndeclare namespace Toast {\n    var loading: (options: ToastMessage | ToastOptions) => WechatMiniprogram.Component.TrivialInstance | undefined;\n    var success: (options: ToastMessage | ToastOptions) => WechatMiniprogram.Component.TrivialInstance | undefined;\n    var fail: (options: ToastMessage | ToastOptions) => WechatMiniprogram.Component.TrivialInstance | undefined;\n    var clear: () => void;\n    var setDefaultOptions: (options: ToastOptions) => void;\n    var resetDefaultOptions: () => void;\n}\nexport default Toast;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/toast/toast.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar validator_1 = require(\"../common/validator\");\nvar defaultOptions = {\n    type: 'text',\n    mask: false,\n    message: '',\n    show: true,\n    zIndex: 1000,\n    duration: 2000,\n    position: 'middle',\n    forbidClick: false,\n    loadingType: 'circular',\n    selector: '#van-toast',\n};\nvar queue = [];\nvar currentOptions = __assign({}, defaultOptions);\nfunction parseOptions(message) {\n    return (0, validator_1.isObj)(message) ? message : { message: message };\n}\nfunction getContext() {\n    var pages = getCurrentPages();\n    return pages[pages.length - 1];\n}\nfunction Toast(toastOptions) {\n    var options = __assign(__assign({}, currentOptions), parseOptions(toastOptions));\n    var context = (typeof options.context === 'function'\n        ? options.context()\n        : options.context) || getContext();\n    var toast = context.selectComponent(options.selector);\n    if (!toast) {\n        console.warn('未找到 van-toast 节点，请确认 selector 及 context 是否正确');\n        return;\n    }\n    delete options.context;\n    delete options.selector;\n    toast.clear = function () {\n        toast.setData({ show: false });\n        if (options.onClose) {\n            options.onClose();\n        }\n    };\n    queue.push(toast);\n    toast.setData(options);\n    clearTimeout(toast.timer);\n    if (options.duration != null && options.duration > 0) {\n        toast.timer = setTimeout(function () {\n            toast.clear();\n            queue = queue.filter(function (item) { return item !== toast; });\n        }, options.duration);\n    }\n    return toast;\n}\nvar createMethod = function (type) { return function (options) {\n    return Toast(__assign({ type: type }, parseOptions(options)));\n}; };\nToast.loading = createMethod('loading');\nToast.success = createMethod('success');\nToast.fail = createMethod('fail');\nToast.clear = function () {\n    queue.forEach(function (toast) {\n        toast.clear();\n    });\n    queue = [];\n};\nToast.setDefaultOptions = function (options) {\n    Object.assign(currentOptions, options);\n};\nToast.resetDefaultOptions = function () {\n    currentOptions = __assign({}, defaultOptions);\n};\nexports.default = Toast;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/transition/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/transition/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar transition_1 = require(\"../mixins/transition\");\n(0, component_1.VantComponent)({\n    classes: [\n        'enter-class',\n        'enter-active-class',\n        'enter-to-class',\n        'leave-class',\n        'leave-active-class',\n        'leave-to-class',\n    ],\n    mixins: [(0, transition_1.transition)(true)],\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/transition/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/transition/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  wx:if=\"{{ inited }}\"\n  class=\"van-transition custom-class {{ classes }}\"\n  style=\"{{ computed.rootStyle({ currentDuration, display, customStyle }) }}\"\n  bind:transitionend=\"onTransitionEnd\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/transition/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\n\nfunction rootStyle(data) {\n  return style([\n    {\n      '-webkit-transition-duration': data.currentDuration + 'ms',\n      'transition-duration': data.currentDuration + 'ms',\n    },\n    data.display ? null : 'display: none',\n    data.customStyle,\n  ]);\n}\n\nmodule.exports = {\n  rootStyle: rootStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/transition/index.wxss",
    "content": "@import '../common/index.wxss';.van-transition{transition-timing-function:ease}.van-fade-enter-active,.van-fade-leave-active{transition-property:opacity}.van-fade-enter,.van-fade-leave-to{opacity:0}.van-fade-down-enter-active,.van-fade-down-leave-active,.van-fade-left-enter-active,.van-fade-left-leave-active,.van-fade-right-enter-active,.van-fade-right-leave-active,.van-fade-up-enter-active,.van-fade-up-leave-active{transition-property:opacity,transform}.van-fade-up-enter,.van-fade-up-leave-to{opacity:0;transform:translate3d(0,100%,0)}.van-fade-down-enter,.van-fade-down-leave-to{opacity:0;transform:translate3d(0,-100%,0)}.van-fade-left-enter,.van-fade-left-leave-to{opacity:0;transform:translate3d(-100%,0,0)}.van-fade-right-enter,.van-fade-right-leave-to{opacity:0;transform:translate3d(100%,0,0)}.van-slide-down-enter-active,.van-slide-down-leave-active,.van-slide-left-enter-active,.van-slide-left-leave-active,.van-slide-right-enter-active,.van-slide-right-leave-active,.van-slide-up-enter-active,.van-slide-up-leave-active{transition-property:transform}.van-slide-up-enter,.van-slide-up-leave-to{transform:translate3d(0,100%,0)}.van-slide-down-enter,.van-slide-down-leave-to{transform:translate3d(0,-100%,0)}.van-slide-left-enter,.van-slide-left-leave-to{transform:translate3d(-100%,0,0)}.van-slide-right-enter,.van-slide-right-leave-to{transform:translate3d(100%,0,0)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tree-select/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tree-select/index.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\n(0, component_1.VantComponent)({\n    classes: [\n        'main-item-class',\n        'content-item-class',\n        'main-active-class',\n        'content-active-class',\n        'main-disabled-class',\n        'content-disabled-class',\n    ],\n    props: {\n        items: {\n            type: Array,\n            observer: 'updateSubItems',\n        },\n        activeId: null,\n        mainActiveIndex: {\n            type: Number,\n            value: 0,\n            observer: 'updateSubItems',\n        },\n        height: {\n            type: null,\n            value: 300,\n        },\n        max: {\n            type: Number,\n            value: Infinity,\n        },\n        selectedIcon: {\n            type: String,\n            value: 'success',\n        },\n    },\n    data: {\n        subItems: [],\n    },\n    methods: {\n        // 当一个子项被选择时\n        onSelectItem: function (event) {\n            var item = event.currentTarget.dataset.item;\n            var isArray = Array.isArray(this.data.activeId);\n            // 判断有没有超出右侧选择的最大数\n            var isOverMax = isArray && this.data.activeId.length >= this.data.max;\n            // 判断该项有没有被选中, 如果有被选中，则忽视是否超出的条件\n            var isSelected = isArray\n                ? this.data.activeId.indexOf(item.id) > -1\n                : this.data.activeId === item.id;\n            if (!item.disabled && (!isOverMax || isSelected)) {\n                this.$emit('click-item', item);\n            }\n        },\n        // 当一个导航被点击时\n        onClickNav: function (event) {\n            var index = event.detail;\n            var item = this.data.items[index];\n            if (!item.disabled) {\n                this.$emit('click-nav', { index: index });\n            }\n        },\n        // 更新子项列表\n        updateSubItems: function () {\n            var _a = this.data, items = _a.items, mainActiveIndex = _a.mainActiveIndex;\n            var _b = (items[mainActiveIndex] || {}).children, children = _b === void 0 ? [] : _b;\n            this.setData({ subItems: children });\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tree-select/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-sidebar\": \"../sidebar/index\",\n    \"van-sidebar-item\": \"../sidebar-item/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tree-select/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"wxs\" />\n\n<view\n  class=\"van-tree-select\"\n  style=\"height: {{ utils.addUnit(height) }}\"\n>\n  <scroll-view scroll-y class=\"van-tree-select__nav\">\n    <van-sidebar active-key=\"{{ mainActiveIndex }}\" bind:change=\"onClickNav\" custom-class=\"van-tree-select__nav__inner\">\n      <van-sidebar-item\n        wx:for=\"{{ items }}\"\n        wx:key=\"index\"\n        custom-class=\"main-item-class\"\n        active-class=\"main-active-class\"\n        disabled-class=\"main-disabled-class\"\n        badge=\"{{ item.badge }}\"\n        dot=\"{{ item.dot }}\"\n        title=\"{{ item.text }}\"\n        disabled=\"{{ item.disabled }}\"\n      />\n    </van-sidebar>\n  </scroll-view>\n  <scroll-view scroll-y class=\"van-tree-select__content\">\n    <slot name=\"content\" />\n    <view\n      wx:for=\"{{ subItems }}\"\n      wx:key=\"id\"\n      class=\"van-ellipsis content-item-class {{ utils.bem('tree-select__item', { active: wxs.isActive(activeId, item.id), disabled: item.disabled }) }} {{ wxs.isActive(activeId, item.id) ? 'content-active-class' : '' }} {{ item.disabled ? 'content-disabled-class' : '' }}\"\n      data-item=\"{{ item }}\"\n      bind:tap=\"onSelectItem\"\n    >\n      {{ item.text }}\n      <van-icon\n        wx:if=\"{{ wxs.isActive(activeId, item.id) }}\"\n        name=\"{{ selectedIcon }}\"\n        size=\"16px\"\n        class=\"van-tree-select__selected\"\n      />\n    </view>\n  </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tree-select/index.wxs",
    "content": "/* eslint-disable */\nvar array = require('../wxs/array.wxs');\n\nfunction isActive (activeList, itemId) {\n  if (array.isArray(activeList)) {\n    return activeList.indexOf(itemId) > -1;\n  }\n\n  return activeList === itemId;\n}\n\nmodule.exports.isActive = isActive;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/tree-select/index.wxss",
    "content": "@import '../common/index.wxss';.van-tree-select{display:flex;font-size:var(--tree-select-font-size,14px);position:relative;-webkit-user-select:none;user-select:none}.van-tree-select__nav{--sidebar-padding:12px 8px 12px 12px;background-color:var(--tree-select-nav-background-color,#f7f8fa);flex:1}.van-tree-select__nav__inner{height:100%;width:100%!important}.van-tree-select__content{background-color:var(--tree-select-content-background-color,#fff);flex:2}.van-tree-select__item{font-weight:700;line-height:var(--tree-select-item-height,44px);padding:0 32px 0 var(--padding-md,16px);position:relative}.van-tree-select__item--active{color:var(--tree-select-item-active-color,#ee0a24)}.van-tree-select__item--disabled{color:var(--tree-select-item-disabled-color,#c8c9cc)}.van-tree-select__selected{position:absolute;right:var(--padding-md,16px);top:50%;transform:translateY(-50%)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/index.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar component_1 = require(\"../common/component\");\nvar validator_1 = require(\"../common/validator\");\nvar shared_1 = require(\"./shared\");\nvar utils_1 = require(\"./utils\");\n(0, component_1.VantComponent)({\n    props: __assign(__assign(__assign(__assign({ disabled: Boolean, multiple: Boolean, uploadText: String, useBeforeRead: Boolean, afterRead: null, beforeRead: null, previewSize: {\n            type: null,\n            value: 80,\n        }, name: {\n            type: null,\n            value: '',\n        }, accept: {\n            type: String,\n            value: 'image',\n        }, fileList: {\n            type: Array,\n            value: [],\n            observer: 'formatFileList',\n        }, maxSize: {\n            type: Number,\n            value: Number.MAX_VALUE,\n        }, maxCount: {\n            type: Number,\n            value: 100,\n        }, deletable: {\n            type: Boolean,\n            value: true,\n        }, showUpload: {\n            type: Boolean,\n            value: true,\n        }, previewImage: {\n            type: Boolean,\n            value: true,\n        }, previewFullImage: {\n            type: Boolean,\n            value: true,\n        }, videoFit: {\n            type: String,\n            value: 'contain',\n        }, imageFit: {\n            type: String,\n            value: 'scaleToFill',\n        }, uploadIcon: {\n            type: String,\n            value: 'photograph',\n        } }, shared_1.imageProps), shared_1.videoProps), shared_1.mediaProps), shared_1.messageFileProps),\n    data: {\n        lists: [],\n        isInCount: true,\n    },\n    methods: {\n        formatFileList: function () {\n            var _a = this.data, _b = _a.fileList, fileList = _b === void 0 ? [] : _b, maxCount = _a.maxCount;\n            var lists = fileList.map(function (item) { return (__assign(__assign({}, item), { isImage: (0, utils_1.isImageFile)(item), isVideo: (0, utils_1.isVideoFile)(item), deletable: (0, validator_1.isBoolean)(item.deletable) ? item.deletable : true })); });\n            this.setData({ lists: lists, isInCount: lists.length < maxCount });\n        },\n        getDetail: function (index) {\n            return {\n                name: this.data.name,\n                index: index == null ? this.data.fileList.length : index,\n            };\n        },\n        startUpload: function () {\n            var _this = this;\n            var _a = this.data, maxCount = _a.maxCount, multiple = _a.multiple, lists = _a.lists, disabled = _a.disabled;\n            if (disabled)\n                return;\n            (0, utils_1.chooseFile)(__assign(__assign({}, this.data), { maxCount: maxCount - lists.length }))\n                .then(function (res) {\n                _this.onBeforeRead(multiple ? res : res[0]);\n            })\n                .catch(function (error) {\n                _this.$emit('error', error);\n            });\n        },\n        onBeforeRead: function (file) {\n            var _this = this;\n            var _a = this.data, beforeRead = _a.beforeRead, useBeforeRead = _a.useBeforeRead;\n            var res = true;\n            if (typeof beforeRead === 'function') {\n                res = beforeRead(file, this.getDetail());\n            }\n            if (useBeforeRead) {\n                res = new Promise(function (resolve, reject) {\n                    _this.$emit('before-read', __assign(__assign({ file: file }, _this.getDetail()), { callback: function (ok) {\n                            ok ? resolve() : reject();\n                        } }));\n                });\n            }\n            if (!res) {\n                return;\n            }\n            if ((0, validator_1.isPromise)(res)) {\n                res.then(function (data) { return _this.onAfterRead(data || file); });\n            }\n            else {\n                this.onAfterRead(file);\n            }\n        },\n        onAfterRead: function (file) {\n            var _a = this.data, maxSize = _a.maxSize, afterRead = _a.afterRead;\n            var oversize = Array.isArray(file)\n                ? file.some(function (item) { return item.size > maxSize; })\n                : file.size > maxSize;\n            if (oversize) {\n                this.$emit('oversize', __assign({ file: file }, this.getDetail()));\n                return;\n            }\n            if (typeof afterRead === 'function') {\n                afterRead(file, this.getDetail());\n            }\n            this.$emit('after-read', __assign({ file: file }, this.getDetail()));\n        },\n        deleteItem: function (event) {\n            var index = event.currentTarget.dataset.index;\n            this.$emit('delete', __assign(__assign({}, this.getDetail(index)), { file: this.data.fileList[index] }));\n        },\n        onPreviewImage: function (event) {\n            if (!this.data.previewFullImage)\n                return;\n            var index = event.currentTarget.dataset.index;\n            var _a = this.data, lists = _a.lists, showmenu = _a.showmenu;\n            var item = lists[index];\n            wx.previewImage({\n                urls: lists.filter(function (item) { return (0, utils_1.isImageFile)(item); }).map(function (item) { return item.url; }),\n                current: item.url,\n                showmenu: showmenu,\n                fail: function () {\n                    wx.showToast({ title: '预览图片失败', icon: 'none' });\n                },\n            });\n        },\n        onPreviewVideo: function (event) {\n            if (!this.data.previewFullImage)\n                return;\n            var index = event.currentTarget.dataset.index;\n            var lists = this.data.lists;\n            var sources = [];\n            var current = lists.reduce(function (sum, cur, curIndex) {\n                if (!(0, utils_1.isVideoFile)(cur)) {\n                    return sum;\n                }\n                sources.push(__assign(__assign({}, cur), { type: 'video' }));\n                if (curIndex < index) {\n                    sum++;\n                }\n                return sum;\n            }, 0);\n            wx.previewMedia({\n                sources: sources,\n                current: current,\n                fail: function () {\n                    wx.showToast({ title: '预览视频失败', icon: 'none' });\n                },\n            });\n        },\n        onPreviewFile: function (event) {\n            if (!this.data.previewFile)\n                return;\n            var index = event.currentTarget.dataset.index;\n            wx.openDocument({\n                filePath: this.data.lists[index].url,\n                showMenu: true,\n            });\n        },\n        onClickPreview: function (event) {\n            var index = event.currentTarget.dataset.index;\n            var item = this.data.lists[index];\n            this.$emit('click-preview', __assign(__assign({}, item), this.getDetail(index)));\n        },\n    },\n});\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-uploader\">\n  <view class=\"van-uploader__wrapper\">\n    <!-- 预览样式 -->\n    <view\n      wx:if=\"{{ previewImage }}\"\n      wx:for=\"{{ lists }}\"\n      wx:key=\"index\"\n      class=\"van-uploader__preview\"\n      data-index=\"{{ index }}\"\n      bindtap=\"onClickPreview\"\n    >\n      <image\n        wx:if=\"{{ item.isImage }}\"\n        mode=\"{{ imageFit }}\"\n        src=\"{{ item.thumb || item.url }}\"\n        alt=\"{{ item.name || ('图片' + index) }}\"\n        class=\"van-uploader__preview-image\"\n        style=\"{{ computed.sizeStyle({ previewSize }) }}\"\n        data-index=\"{{ index }}\"\n        bindtap=\"onPreviewImage\"\n      />\n      <video\n        wx:elif=\"{{ item.isVideo }}\"\n        src=\"{{ item.url }}\"\n        title=\"{{ item.name || ('视频' + index) }}\"\n        poster=\"{{ item.thumb }}\"\n        autoplay=\"{{ item.autoplay }}\"\n        object-fit=\"{{videoFit}}\"\n        referrer-policy=\"{{ referrerPolicy }}\"\n        class=\"van-uploader__preview-image\"\n        style=\"{{ computed.sizeStyle({ previewSize }) }}\"\n        data-index=\"{{ index }}\"\n        bindtap=\"onPreviewVideo\"\n      >\n      </video>\n      <view\n        wx:else\n        class=\"van-uploader__file\"\n        style=\"{{ computed.sizeStyle({ previewSize }) }}\"\n        data-index=\"{{ index }}\"\n        bindtap=\"onPreviewFile\"\n      >\n        <van-icon name=\"description\" class=\"van-uploader__file-icon\" />\n        <view class=\"van-uploader__file-name van-ellipsis\">{{ item.name || item.url }}</view>\n      </view>\n      <view\n        wx:if=\"{{ item.status === 'uploading' || item.status === 'failed' }}\"\n        class=\"van-uploader__mask\"\n      >\n       <van-icon wx:if=\"{{ item.status === 'failed' }}\" name=\"close\" class=\"van-uploader__mask-icon\" />\n       <van-loading wx:else custom-class=\"van-uploader__loading\" />\n       <text wx:if=\"{{ item.message }}\" class=\"van-uploader__mask-message\">{{ item.message }}</text>\n      </view>\n      <view\n        wx:if=\"{{ deletable && item.deletable }}\"\n        data-index=\"{{ index }}\"\n        class=\"van-uploader__preview-delete\"\n        catch:tap=\"deleteItem\"\n      >\n        <van-icon name=\"cross\" class=\"van-uploader__preview-delete-icon\" />\n      </view>\n    </view>\n\n    <!-- 上传样式 -->\n    <block wx:if=\"{{ isInCount }}\">\n      <view class=\"van-uploader__slot\" bindtap=\"startUpload\">\n        <slot />\n      </view>\n\n      <!-- 默认上传样式 -->\n      <view\n        wx:if=\"{{ showUpload }}\"\n        class=\"van-uploader__upload {{ disabled ? 'van-uploader__upload--disabled': ''}}\"\n        style=\"{{ computed.sizeStyle({ previewSize }) }}\"\n        bindtap=\"startUpload\"\n      >\n        <van-icon name=\"{{ uploadIcon }}\" class=\"van-uploader__upload-icon\" />\n        <text wx:if=\"{{ uploadText }}\" class=\"van-uploader__upload-text\">{{ uploadText }}</text>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/index.wxs",
    "content": "/* eslint-disable */\nvar style = require('../wxs/style.wxs');\nvar addUnit = require('../wxs/add-unit.wxs');\n\nfunction sizeStyle(data) {\n  return \"Array\" === data.previewSize.constructor ? style({\n    width: addUnit(data.previewSize[0]),\n    height: addUnit(data.previewSize[1]),\n  }) : style({\n    width: addUnit(data.previewSize),\n    height: addUnit(data.previewSize),\n  });\n}\n\nmodule.exports = {\n  sizeStyle: sizeStyle,\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/index.wxss",
    "content": "@import '../common/index.wxss';.van-uploader{display:inline-block;position:relative}.van-uploader__wrapper{display:flex;flex-wrap:wrap}.van-uploader__slot:empty{display:none}.van-uploader__slot:not(:empty)+.van-uploader__upload{display:none!important}.van-uploader__upload{align-items:center;background-color:var(--uploader-upload-background-color,#f7f8fa);box-sizing:border-box;display:flex;flex-direction:column;height:var(--uploader-size,80px);justify-content:center;margin:0 8px 8px 0;position:relative;width:var(--uploader-size,80px)}.van-uploader__upload:active{background-color:var(--uploader-upload-active-color,#f2f3f5)}.van-uploader__upload-icon{color:var(--uploader-icon-color,#dcdee0);font-size:var(--uploader-icon-size,24px)}.van-uploader__upload-text{color:var(--uploader-text-color,#969799);font-size:var(--uploader-text-font-size,12px);margin-top:var(--padding-xs,8px)}.van-uploader__upload--disabled{opacity:var(--uploader-disabled-opacity,.5)}.van-uploader__preview{cursor:pointer;margin:0 8px 8px 0;position:relative}.van-uploader__preview-image{display:block;height:var(--uploader-size,80px);overflow:hidden;width:var(--uploader-size,80px)}.van-uploader__preview-delete,.van-uploader__preview-delete:after{height:var(--uploader-delete-icon-size,14px);position:absolute;right:0;top:0;width:var(--uploader-delete-icon-size,14px)}.van-uploader__preview-delete:after{background-color:var(--uploader-delete-background-color,rgba(0,0,0,.7));border-radius:0 0 0 12px;content:\"\"}.van-uploader__preview-delete-icon{color:var(--uploader-delete-color,#fff);font-size:var(--uploader-delete-icon-size,14px);position:absolute;right:0;top:0;transform:scale(.7) translate(10%,-10%);z-index:1}.van-uploader__file{align-items:center;background-color:var(--uploader-file-background-color,#f7f8fa);display:flex;flex-direction:column;height:var(--uploader-size,80px);justify-content:center;width:var(--uploader-size,80px)}.van-uploader__file-icon{color:var(--uploader-file-icon-color,#646566);font-size:var(--uploader-file-icon-size,20px)}.van-uploader__file-name{box-sizing:border-box;color:var(--uploader-file-name-text-color,#646566);font-size:var(--uploader-file-name-font-size,12px);margin-top:var(--uploader-file-name-margin-top,8px);padding:var(--uploader-file-name-padding,0 4px);text-align:center;width:100%}.van-uploader__mask{align-items:center;background-color:var(--uploader-mask-background-color,rgba(50,50,51,.88));bottom:0;color:#fff;display:flex;flex-direction:column;justify-content:center;left:0;position:absolute;right:0;top:0}.van-uploader__mask-icon{font-size:var(--uploader-mask-icon-size,22px)}.van-uploader__mask-message{font-size:var(--uploader-mask-message-font-size,12px);line-height:var(--uploader-mask-message-line-height,14px);margin-top:6px;padding:0 var(--padding-base,4px)}.van-uploader__loading{color:var(--uploader-loading-icon-color,#fff)!important;height:var(--uploader-loading-icon-size,22px);width:var(--uploader-loading-icon-size,22px)}"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/shared.d.ts",
    "content": "export declare const imageProps: {\n    sizeType: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    capture: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    showmenu: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n};\nexport declare const videoProps: {\n    capture: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    compressed: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n    maxDuration: {\n        type: NumberConstructor;\n        value: number;\n    };\n    camera: {\n        type: StringConstructor;\n        value: string;\n    };\n    referrerPolicy: {\n        type: StringConstructor;\n        value: string;\n    };\n};\nexport declare const mediaProps: {\n    capture: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    mediaType: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    maxDuration: {\n        type: NumberConstructor;\n        value: number;\n    };\n    camera: {\n        type: StringConstructor;\n        value: string;\n    };\n};\nexport declare const messageFileProps: {\n    extension: null;\n    previewFile: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/shared.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.messageFileProps = exports.mediaProps = exports.videoProps = exports.imageProps = void 0;\n// props for image\nexports.imageProps = {\n    sizeType: {\n        type: Array,\n        value: ['original', 'compressed'],\n    },\n    capture: {\n        type: Array,\n        value: ['album', 'camera'],\n    },\n    showmenu: {\n        type: Boolean,\n        value: true,\n    },\n};\n// props for video\nexports.videoProps = {\n    capture: {\n        type: Array,\n        value: ['album', 'camera'],\n    },\n    compressed: {\n        type: Boolean,\n        value: true,\n    },\n    maxDuration: {\n        type: Number,\n        value: 60,\n    },\n    camera: {\n        type: String,\n        value: 'back',\n    },\n    referrerPolicy: {\n        type: String,\n        value: 'no-referrer',\n    },\n};\n// props for media\nexports.mediaProps = {\n    capture: {\n        type: Array,\n        value: ['album', 'camera'],\n    },\n    mediaType: {\n        type: Array,\n        value: ['image', 'video', 'mix'],\n    },\n    maxDuration: {\n        type: Number,\n        value: 60,\n    },\n    camera: {\n        type: String,\n        value: 'back',\n    },\n};\n// props for file\nexports.messageFileProps = {\n    extension: null,\n    previewFile: {\n        type: Boolean,\n        value: true,\n    },\n};\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/utils.d.ts",
    "content": "export interface File {\n    url: string;\n    size?: number;\n    name?: string;\n    type: string;\n    duration?: number;\n    time?: number;\n    isImage?: boolean;\n    isVideo?: boolean;\n}\nexport declare function isImageFile(item: File): boolean;\nexport declare function isVideoFile(item: File): boolean;\nexport declare function chooseFile({ accept, multiple, capture, compressed, maxDuration, sizeType, camera, maxCount, mediaType, extension, }: {\n    accept: any;\n    multiple: any;\n    capture: any;\n    compressed: any;\n    maxDuration: any;\n    sizeType: any;\n    camera: any;\n    maxCount: any;\n    mediaType: any;\n    extension: any;\n}): Promise<File | File[]>;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/uploader/utils.js",
    "content": "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.chooseFile = exports.isVideoFile = exports.isImageFile = void 0;\nvar utils_1 = require(\"../common/utils\");\nvar validator_1 = require(\"../common/validator\");\nfunction isImageFile(item) {\n    if (item.isImage != null) {\n        return item.isImage;\n    }\n    if (item.type) {\n        return item.type === 'image';\n    }\n    if (item.url) {\n        return (0, validator_1.isImageUrl)(item.url);\n    }\n    return false;\n}\nexports.isImageFile = isImageFile;\nfunction isVideoFile(item) {\n    if (item.isVideo != null) {\n        return item.isVideo;\n    }\n    if (item.type) {\n        return item.type === 'video';\n    }\n    if (item.url) {\n        return (0, validator_1.isVideoUrl)(item.url);\n    }\n    return false;\n}\nexports.isVideoFile = isVideoFile;\nfunction formatImage(res) {\n    return res.tempFiles.map(function (item) { return (__assign(__assign({}, (0, utils_1.pickExclude)(item, ['path'])), { type: 'image', url: item.tempFilePath || item.path, thumb: item.tempFilePath || item.path })); });\n}\nfunction formatVideo(res) {\n    return [\n        __assign(__assign({}, (0, utils_1.pickExclude)(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg'])), { type: 'video', url: res.tempFilePath, thumb: res.thumbTempFilePath }),\n    ];\n}\nfunction formatMedia(res) {\n    return res.tempFiles.map(function (item) { return (__assign(__assign({}, (0, utils_1.pickExclude)(item, ['fileType', 'thumbTempFilePath', 'tempFilePath'])), { type: item.fileType, url: item.tempFilePath, thumb: item.fileType === 'video' ? item.thumbTempFilePath : item.tempFilePath })); });\n}\nfunction formatFile(res) {\n    return res.tempFiles.map(function (item) { return (__assign(__assign({}, (0, utils_1.pickExclude)(item, ['path'])), { url: item.path })); });\n}\nfunction chooseFile(_a) {\n    var accept = _a.accept, multiple = _a.multiple, capture = _a.capture, compressed = _a.compressed, maxDuration = _a.maxDuration, sizeType = _a.sizeType, camera = _a.camera, maxCount = _a.maxCount, mediaType = _a.mediaType, extension = _a.extension;\n    return new Promise(function (resolve, reject) {\n        switch (accept) {\n            case 'image':\n                if (utils_1.isPC || utils_1.isWxWork) {\n                    wx.chooseImage({\n                        count: multiple ? Math.min(maxCount, 9) : 1,\n                        sourceType: capture,\n                        sizeType: sizeType,\n                        success: function (res) { return resolve(formatImage(res)); },\n                        fail: reject,\n                    });\n                }\n                else {\n                    wx.chooseMedia({\n                        count: multiple ? Math.min(maxCount, 9) : 1,\n                        mediaType: ['image'],\n                        sourceType: capture,\n                        maxDuration: maxDuration,\n                        sizeType: sizeType,\n                        camera: camera,\n                        success: function (res) { return resolve(formatImage(res)); },\n                        fail: reject,\n                    });\n                }\n                break;\n            case 'media':\n                wx.chooseMedia({\n                    count: multiple ? Math.min(maxCount, 9) : 1,\n                    mediaType: mediaType,\n                    sourceType: capture,\n                    maxDuration: maxDuration,\n                    sizeType: sizeType,\n                    camera: camera,\n                    success: function (res) { return resolve(formatMedia(res)); },\n                    fail: reject,\n                });\n                break;\n            case 'video':\n                wx.chooseVideo({\n                    sourceType: capture,\n                    compressed: compressed,\n                    maxDuration: maxDuration,\n                    camera: camera,\n                    success: function (res) { return resolve(formatVideo(res)); },\n                    fail: reject,\n                });\n                break;\n            default:\n                wx.chooseMessageFile(__assign(__assign({ count: multiple ? maxCount : 1, type: accept }, (extension ? { extension: extension } : {})), { success: function (res) { return resolve(formatFile(res)); }, fail: reject }));\n                break;\n        }\n    });\n}\nexports.chooseFile = chooseFile;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/add-unit.wxs",
    "content": "/* eslint-disable */\nvar REGEXP = getRegExp('^-?\\d+(\\.\\d+)?$');\n\nfunction addUnit(value) {\n  if (value == null) {\n    return undefined;\n  }\n\n  return REGEXP.test('' + value) ? value + 'px' : value;\n}\n\nmodule.exports = addUnit;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/array.wxs",
    "content": "function isArray(array) {\n  return array && array.constructor === 'Array';\n}\n\nmodule.exports.isArray = isArray;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/bem.wxs",
    "content": "/* eslint-disable */\nvar array = require('./array.wxs');\nvar object = require('./object.wxs');\nvar PREFIX = 'van-';\n\nfunction join(name, mods) {\n  name = PREFIX + name;\n  mods = mods.map(function(mod) {\n    return name + '--' + mod;\n  });\n  mods.unshift(name);\n  return mods.join(' ');\n}\n\nfunction traversing(mods, conf) {\n  if (!conf) {\n    return;\n  }\n\n  if (typeof conf === 'string' || typeof conf === 'number') {\n    mods.push(conf);\n  } else if (array.isArray(conf)) {\n    conf.forEach(function(item) {\n      traversing(mods, item);\n    });\n  } else if (typeof conf === 'object') {\n    object.keys(conf).forEach(function(key) {\n      conf[key] && mods.push(key);\n    });\n  }\n}\n\nfunction bem(name, conf) {\n  var mods = [];\n  traversing(mods, conf);\n  return join(name, mods);\n}\n\nmodule.exports = bem;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/memoize.wxs",
    "content": "/**\n * Simple memoize\n * wxs doesn't support fn.apply, so this memoize only support up to 2 args\n */\n/* eslint-disable */\n\nfunction isPrimitive(value) {\n  var type = typeof value;\n  return (\n    type === 'boolean' ||\n    type === 'number' ||\n    type === 'string' ||\n    type === 'undefined' ||\n    value === null\n  );\n}\n\n// mock simple fn.call in wxs\nfunction call(fn, args) {\n  if (args.length === 2) {\n    return fn(args[0], args[1]);\n  }\n\n  if (args.length === 1) {\n    return fn(args[0]);\n  }\n\n  return fn();\n}\n\nfunction serializer(args) {\n  if (args.length === 1 && isPrimitive(args[0])) {\n    return args[0];\n  }\n  var obj = {};\n  for (var i = 0; i < args.length; i++) {\n    obj['key' + i] = args[i];\n  }\n  return JSON.stringify(obj);\n}\n\nfunction memoize(fn) {\n  var cache = {};\n\n  return function() {\n    var key = serializer(arguments);\n    if (cache[key] === undefined) {\n      cache[key] = call(fn, arguments);\n    }\n\n    return cache[key];\n  };\n}\n\nmodule.exports = memoize;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/object.wxs",
    "content": "/* eslint-disable */\nvar REGEXP = getRegExp('{|}|\"', 'g');\n\nfunction keys(obj) {\n  return JSON.stringify(obj)\n    .replace(REGEXP, '')\n    .split(',')\n    .map(function(item) {\n      return item.split(':')[0];\n    });\n}\n\nmodule.exports.keys = keys;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/style.wxs",
    "content": "/* eslint-disable */\nvar object = require('./object.wxs');\nvar array = require('./array.wxs');\n\nfunction kebabCase(word) {\n  var newWord = word\n    .replace(getRegExp(\"[A-Z]\", 'g'), function (i) {\n      return '-' + i;\n    })\n    .toLowerCase()\n\n  return newWord;\n}\n\nfunction style(styles) {\n  if (array.isArray(styles)) {\n    return styles\n      .filter(function (item) {\n        return item != null && item !== '';\n      })\n      .map(function (item) {\n        return style(item);\n      })\n      .join(';');\n  }\n\n  if ('Object' === styles.constructor) {\n    return object\n      .keys(styles)\n      .filter(function (key) {\n        return styles[key] != null && styles[key] !== '';\n      })\n      .map(function (key) {\n        return [kebabCase(key), [styles[key]]].join(':');\n      })\n      .join(';');\n  }\n\n  return styles;\n}\n\nmodule.exports = style;\n"
  },
  {
    "path": "miniprogram_npm/@vant/weapp/wxs/utils.wxs",
    "content": "/* eslint-disable */\nvar bem = require('./bem.wxs');\nvar memoize = require('./memoize.wxs');\nvar addUnit = require('./add-unit.wxs');\n\nmodule.exports = {\n  bem: memoize(bem),\n  memoize: memoize,\n  addUnit: addUnit\n};\n"
  },
  {
    "path": "miniprogram_npm/apifm-wxapi/index.js",
    "content": "module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/* eslint-disable */\n// 小程序开发api接口工具包，https://github.com/gooking/wxapi\nvar API_BASE_URL = 'https://api.it120.cc';\nvar COMMON_BASE_URL = 'https://common.apifm.com/';\nvar CMS_BASE_URL = 'https://cms.apifm.com/';\nvar subDomain = '-';\nvar merchantId = '0';\n\nvar request = function request(url, needSubDomain, method, data) {\n  var _url = API_BASE_URL + (needSubDomain ? '/' + subDomain : '') + url;\n  if (url.indexOf(\"http\") == 0) {\n    _url = url;\n  }\n  var header = {\n    'Content-Type': 'application/x-www-form-urlencoded'\n  };\n  return new Promise(function (resolve, reject) {\n    wx.request({\n      url: _url,\n      method: method,\n      data: data,\n      header: header,\n      success: function success(request) {\n        resolve(request.data);\n      },\n      fail: function fail(error) {\n        reject(error);\n      },\n      complete: function complete(aaa) {\n        // 加载完成\n      }\n    });\n  });\n};\n\n/**\n * 小程序的promise没有finally方法，自己扩展下\n */\n// Promise.prototype.finally = function (callback) {\n//   var Promise = this.constructor;\n//   return this.then(\n//     function (value) {\n//       Promise.resolve(callback()).then(\n//         function () {\n//           return value;\n//         }\n//       );\n//     },\n//     function (reason) {\n//       Promise.resolve(callback()).then(\n//         function () {\n//           throw reason;\n//         }\n//       );\n//     }\n//   );\n// }\n\nmodule.exports = {\n  init2: function init2(a, b) {\n    API_BASE_URL = a;\n    subDomain = b;\n  },\n  init: function init(b) {\n    subDomain = b;\n  },\n  setMerchantId: function setMerchantId(mchid) {\n    merchantId = mchid;\n  },\n  init3: function init3(_ref) {\n    var _ref$apiBaseUrl = _ref.apiBaseUrl,\n        apiBaseUrl = _ref$apiBaseUrl === undefined ? API_BASE_URL : _ref$apiBaseUrl,\n        subD = _ref.subDomain,\n        req = _ref.request;\n\n    // 某些需求需要定制化 request，需要保证传入自定义 reuqest 与默认 request 参数一致\n    if (req) {\n      request = req;\n    }\n    API_BASE_URL = apiBaseUrl;\n    subDomain = subD;\n  },\n  request: request,\n  queryMobileLocation: function queryMobileLocation() {\n    var mobile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/common/mobile-segment/location', false, 'get', { mobile: mobile });\n  },\n  nextMobileSegment: function nextMobileSegment(data) {\n    return request('/common/mobile-segment/next', false, 'post', data);\n  },\n  queryMobileLocationV2: function queryMobileLocationV2() {\n    var mobile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/common/mobile-segment/location', false, 'get', { mobile: mobile });\n  },\n  nextMobileSegmentV2: function nextMobileSegmentV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/common/mobile-segment/next', false, 'post', data);\n  },\n  gpsDistance: function gpsDistance(data) {\n    return request('/common/map/qq/distance', false, 'post', data);\n  },\n  commonIP: function commonIP(ip) {\n    return request('/common/ip', false, 'get', { ip: ip });\n  },\n  commonIPV2: function commonIPV2() {\n    var ip = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/common/ip', false, 'get', { ip: ip });\n  },\n  commonIPV3: function commonIPV3() {\n    var ip = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/common/ip/v2', false, 'get', { ip: ip });\n  },\n  forexRate: function forexRate(fromCode, toCode) {\n    return request('/forex/rate', true, 'get', { fromCode: fromCode, toCode: toCode });\n  },\n  queryConfigValue: function queryConfigValue(key) {\n    return request(COMMON_BASE_URL + subDomain + '/config/value', true, 'get', { key: key });\n  },\n  queryConfigBatch: function queryConfigBatch(keys) {\n    return request(COMMON_BASE_URL + subDomain + '/config/values', true, 'get', { keys: keys });\n  },\n  scoreRules: function scoreRules(data) {\n    return request('/score/send/rule', true, 'post', data);\n  },\n  scoreSignRules: function scoreSignRules() {\n    return request('/score/sign/rules', true, 'get', {});\n  },\n  scoreSign: function scoreSign(token) {\n    return request('/score/sign', true, 'post', {\n      token: token\n    });\n  },\n  scoreSignLogs: function scoreSignLogs(data) {\n    return request('/score/sign/logs', true, 'post', data);\n  },\n  scoreTodaySignedInfo: function scoreTodaySignedInfo(token) {\n    return request('/score/today-signed', true, 'get', {\n      token: token\n    });\n  },\n  scoreExchange: function scoreExchange(token, number) {\n    return request('/score/exchange', true, 'post', {\n      number: number,\n      token: token\n    });\n  },\n  scoreExchangeCash: function scoreExchangeCash(token, deductionScore) {\n    return request(COMMON_BASE_URL + subDomain + '/score/exchange/cash', false, 'post', {\n      deductionScore: deductionScore,\n      token: token\n    });\n  },\n  scoreLogs: function scoreLogs(data) {\n    return request('/score/logs', true, 'post', data);\n  },\n  scoreDynamics: function scoreDynamics() {\n    return request('/score/dynamics', true, 'get');\n  },\n  shareGroupGetScore: function shareGroupGetScore(code, referrer, encryptedData, iv) {\n    return request('/score/share/wxa/group', true, 'post', {\n      code: code,\n      referrer: referrer,\n      encryptedData: encryptedData,\n      iv: iv\n    });\n  },\n  scoreDeductionRules: function scoreDeductionRules() {\n    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/score/deduction/rules', false, 'get', { type: type });\n  },\n  scoreDailyFixedNum: function scoreDailyFixedNum(token) {\n    return request('/score/dailyFixedNum', true, 'post', { token: token });\n  },\n  scoreRank: function scoreRank(data) {\n    return request('/score/rank', true, 'get', data);\n  },\n  scoreRankBydate: function scoreRankBydate(data) {\n    return request('/score/rankBydate', true, 'get', data);\n  },\n  scoreMyStatistics: function scoreMyStatistics(data) {\n    return request('/score/myStatistics', true, 'get', data);\n  },\n  expireScorestatistics: function expireScorestatistics(data) {\n    return request('/score/expireScorestatistics', true, 'post', data);\n  },\n  scoreTaskList: function scoreTaskList(token) {\n    return request(COMMON_BASE_URL + subDomain + '/score/taskList', false, 'get', { token: token });\n  },\n  scoreTaskSuccess: function scoreTaskSuccess(token, type) {\n    return request(COMMON_BASE_URL + subDomain + '/score/taskSuccess', false, 'post', { token: token, type: type });\n  },\n  kanjiaSet: function kanjiaSet(goodsId) {\n    return request('/shop/goods/kanjia/set/v2', true, 'get', { goodsId: goodsId });\n  },\n  kanjiaJoin: function kanjiaJoin(token, kjid) {\n    return request('/shop/goods/kanjia/join', true, 'post', {\n      kjid: kjid,\n      token: token\n    });\n  },\n  kanjiaDetail: function kanjiaDetail(kjid, joiner) {\n    return request('/shop/goods/kanjia/info', true, 'get', {\n      kjid: kjid,\n      joiner: joiner\n    });\n  },\n  kanjiaHelp: function kanjiaHelp(token, kjid, joiner) {\n    var remark = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/shop/goods/kanjia/help', true, 'post', {\n      kjid: kjid,\n      joinerUser: joiner,\n      token: token,\n      remark: remark\n    });\n  },\n  kanjiaClear: function kanjiaClear(token, kjid) {\n    return request('/shop/goods/kanjia/clear', true, 'post', {\n      kjid: kjid,\n      token: token\n    });\n  },\n  kanjiaMyJoinInfo: function kanjiaMyJoinInfo(token, kjid) {\n    return request('/shop/goods/kanjia/my', true, 'get', {\n      kjid: kjid,\n      token: token\n    });\n  },\n  kanjiaHelpDetail: function kanjiaHelpDetail(token, kjid, joiner) {\n    return request('/shop/goods/kanjia/myHelp', true, 'get', {\n      kjid: kjid,\n      joinerUser: joiner,\n      token: token\n    });\n  },\n  checkToken: function checkToken(token) {\n    return request('/user/check-token', true, 'get', {\n      token: token\n    });\n  },\n  checkReferrer: function checkReferrer(referrer) {\n    return request('/user/check-referrer', true, 'get', {\n      referrer: referrer\n    });\n  },\n  addTempleMsgFormid: function addTempleMsgFormid(token, type, formId) {\n    return request('/template-msg/wxa/formId', true, 'post', {\n      token: token, type: type, formId: formId\n    });\n  },\n  sendTempleMsg: function sendTempleMsg(data) {\n    return request('/template-msg/put', true, 'post', data);\n  },\n  payVariableUrl: function payVariableUrl(url, data) {\n    return request(url, true, 'post', data);\n  },\n  wxpay: function wxpay(data) {\n    return request('/pay/wx/wxapp', true, 'post', data);\n  },\n  wxpayH5: function wxpayH5(data) {\n    return request('/pay/wx/h5', true, 'post', data);\n  },\n  wxpayJsapi: function wxpayJsapi(data) {\n    return request('/pay/wx/jsapi', true, 'post', data);\n  },\n  wxpayQrcode: function wxpayQrcode(data) {\n    return request('/pay/wx/qrcode', true, 'post', data);\n  },\n  wxpayCode: function wxpayCode(data) {\n    return request('/pay/wx/paymentCode', true, 'post', data);\n  },\n  wxpayApp: function wxpayApp(data) {\n    return request('/pay/wx/app', true, 'post', data);\n  },\n  wxpayRequestMerchantTransfer: function wxpayRequestMerchantTransfer(data) {\n    return request('/pay/wx/requestMerchantTransfer', true, 'get', data);\n  },\n  wxpayFOMO: function wxpayFOMO(data) {\n    return request('/pay/fomo/wxapp', true, 'post', data);\n  },\n  payNow: function payNow(data) {\n    return request('/pay/fomo/payNow', true, 'post', data);\n  },\n  fomoCheckout: function fomoCheckout(data) {\n    return request('/pay/fomo/checkout', true, 'post', data);\n  },\n  wxpayFWS: function wxpayFWS(data) {\n    return request('/pay/wxfws/wxapp', true, 'post', data);\n  },\n  ttpay: function ttpay(data) {\n    return request('/pay/tt/microapp', true, 'post', data);\n  },\n  ttEcpay: function ttEcpay(data) {\n    return request('/pay/tt/ecpay', true, 'post', data);\n  },\n  payQuery: function payQuery(token, outTradeId) {\n    return request('/pay/query', true, 'get', { token: token, outTradeId: outTradeId });\n  },\n  wxpaySaobei: function wxpaySaobei(data) {\n    return request('/pay/lcsw/wxapp', true, 'post', data);\n  },\n  wxpayWepayez: function wxpayWepayez(data) {\n    return request('/pay/wepayez/wxapp', true, 'post', data);\n  },\n  wxpayxpert: function wxpayxpert(data) {\n    return request('/pay/payxpert/wxapp', true, 'post', data);\n  },\n  wxpayIPaynow: function wxpayIPaynow(data) {\n    return request('/pay/ipaynow/wxapp', true, 'post', data);\n  },\n  ccvvPayWxapp: function ccvvPayWxapp(data) {\n    return request('/pay/ccvv/wxapp', true, 'post', data);\n  },\n  wxpayAirwallex: function wxpayAirwallex(data) {\n    return request('/pay/airwallex/wxapp', true, 'post', data);\n  },\n  wxSphGetpaymentparams: function wxSphGetpaymentparams(token, orderId) {\n    return request('/pay/wxsph/getpaymentparams', true, 'post', { token: token, orderId: orderId });\n  },\n  paypalCheckout: function paypalCheckout(data) {\n    return request('/pay/paypal/checkout', true, 'post', data);\n  },\n  alipay: function alipay(data) {\n    return request('/pay/alipay/semiAutomatic/payurl', true, 'post', data);\n  },\n  alipayMP: function alipayMP(data) {\n    return request('/pay/alipay/gate/mp', true, 'post', data);\n  },\n  alipayAPP: function alipayAPP(data) {\n    return request('/pay/alipay/gate/app', true, 'post', data);\n  },\n  alipayQrcode: function alipayQrcode(data) {\n    return request('/pay/alipay/gate/qrcode', true, 'post', data);\n  },\n  alipayQrcode2: function alipayQrcode2(data) {\n    return request('/pay/alipay/gate/paymentCode', true, 'post', data);\n  },\n  alipayH5: function alipayH5(data) {\n    return request('/pay/alipay/gate/h5', true, 'post', data);\n  },\n  alipayPC: function alipayPC(data) {\n    return request('/pay/alipay/gate/pc', true, 'post', data);\n  },\n  kasipayH5: function kasipayH5(data) {\n    return request('/pay/kasipay/h5', true, 'post', data);\n  },\n  hmpayJsapi: function hmpayJsapi(data) {\n    return request('/pay/sandpay/hmpay/jsapi', true, 'post', data);\n  },\n  login_wx: function login_wx(code) {\n    return request('/user/wxapp/login', true, 'post', {\n      code: code,\n      type: 2\n    });\n  },\n  loginWxV2: function loginWxV2(code, appid) {\n    return request('/user/wxapp/login/v2', true, 'post', {\n      code: code,\n      appid: appid\n    });\n  },\n  login_tt: function login_tt(code) {\n    return request(COMMON_BASE_URL + subDomain + '/user/tt/miniapp/login', false, 'post', {\n      code: code\n    });\n  },\n  login_q: function login_q(code) {\n    return request(COMMON_BASE_URL + subDomain + '/user/q/login', false, 'post', {\n      code: code,\n      type: 2\n    });\n  },\n  loginWxaMobile: function loginWxaMobile(code, encryptedData, iv) {\n    return request('/user/wxapp/login/mobile', true, 'post', {\n      code: code,\n      encryptedData: encryptedData,\n      iv: iv\n    });\n  },\n  loginWxaMobileV2: function loginWxaMobileV2(data) {\n    return request('/user/wxapp/login/mobile', true, 'post', data);\n  },\n  loginWxaMobileV3: function loginWxaMobileV3(data) {\n    return request('/user/wxapp/login/mobile/v2', true, 'post', data);\n  },\n  fetchWxaMobile: function fetchWxaMobile(code) {\n    return request('/user/wxapp/getMobile', true, 'get', { code: code });\n  },\n  login_username: function login_username(data) {\n    return request('/user/username/login', true, 'post', data);\n  },\n  bindUsername: function bindUsername(token, username) {\n    var pwd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/user/username/bindUsername', true, 'post', {\n      token: token, username: username, pwd: pwd\n    });\n  },\n  login_mobile: function login_mobile(mobile, pwd) {\n    var deviceId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n    var deviceName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/user/m/login', true, 'post', {\n      mobile: mobile, pwd: pwd, deviceId: deviceId, deviceName: deviceName\n    });\n  },\n  loginMobileV2: function loginMobileV2(data) {\n    return request('/user/m/login', true, 'post', data);\n  },\n  loginMobileSmsCode: function loginMobileSmsCode(data) {\n    return request('/user/m/loginMobile', true, 'post', data);\n  },\n  resetPwdUseMobileCode: function resetPwdUseMobileCode(mobile, pwd, code) {\n    return request('/user/m/reset-pwd', true, 'post', {\n      mobile: mobile, pwd: pwd, code: code\n    });\n  },\n  resetPwdUseEmailCode: function resetPwdUseEmailCode(email, pwd, code) {\n    return request('/user/email/reset-pwd', true, 'post', {\n      email: email, pwd: pwd, code: code\n    });\n  },\n  wxmpAuth: function wxmpAuth(data) {\n    return request('/user/wxmp/auth', true, 'post', data);\n  },\n  register_complex: function register_complex(data) {\n    return request('/user/wxapp/register/complex', true, 'post', data);\n  },\n  register_tt: function register_tt(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/tt/miniapp/register', false, 'post', data);\n  },\n  registerQ: function registerQ(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/q/register', false, 'post', data);\n  },\n  qqAuthorize: function qqAuthorize(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/q/authorize', false, 'post', data);\n  },\n  qqQrcode: function qqQrcode(content) {\n    return request(COMMON_BASE_URL + subDomain + '/user/q/qrcode', false, 'post', { content: content });\n  },\n  register_simple: function register_simple(data) {\n    return request('/user/wxapp/register/simple', true, 'post', data);\n  },\n  authorize: function authorize(data) {\n    return request('/user/wxapp/authorize', true, 'post', data);\n  },\n  ttAuthorize: function ttAuthorize(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/tt/miniapp/authorize', false, 'post', data);\n  },\n  register_username: function register_username(data) {\n    return request('/user/username/register', true, 'post', data);\n  },\n  register_mobile: function register_mobile(data) {\n    return request('/user/m/register', true, 'post', data);\n  },\n  bannerTypes: function bannerTypes() {\n    return request('/banner/types', true, 'get');\n  },\n  banners: function banners(data) {\n    return request('/banner/list', true, 'get', data);\n  },\n  goodsCategory: function goodsCategory() {\n    return request('/shop/goods/category/all', true, 'get');\n  },\n  goodsCategoryV2: function goodsCategoryV2() {\n    var shopId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/shop/goods/category/all', true, 'get', { shopId: shopId });\n  },\n  goodsCategoryDetail: function goodsCategoryDetail(id) {\n    return request('/shop/goods/category/info', true, 'get', { id: id });\n  },\n  goodsCategoryDetailV2: function goodsCategoryDetailV2(data) {\n    return request('/shop/goods/category/info', true, 'get', data);\n  },\n  goods: function goods(data) {\n    if (!data) {\n      data = {};\n    }\n    var shopIds = wx.getStorageSync('shopIds');\n    if (shopIds) {\n      data.shopId = shopIds;\n    }\n    return request('/shop/goods/list', true, 'post', data);\n  },\n  goodsv2: function goodsv2(data) {\n    if (!data) {\n      data = {};\n    }\n    var shopIds = wx.getStorageSync('shopIds');\n    if (shopIds) {\n      data.shopId = shopIds;\n    }\n    return request('/shop/goods/list/v2', true, 'post', data);\n  },\n  goodsDetail: function goodsDetail(id) {\n    var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shop/goods/detail', true, 'get', {\n      id: id, token: token\n    });\n  },\n  goodsDetailV2: function goodsDetailV2(data) {\n    return request('/shop/goods/detail', true, 'get', data);\n  },\n  goodsLimitations: function goodsLimitations(goodsId) {\n    var priceId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shop/goods/limitation', true, 'get', {\n      goodsId: goodsId, priceId: priceId\n    });\n  },\n  goodsLimitationsV2: function goodsLimitationsV2(goodsId) {\n    var propertyChildIds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shop/goods/limitation', true, 'get', {\n      goodsId: goodsId, propertyChildIds: propertyChildIds\n    });\n  },\n  goodsAddition: function goodsAddition(goodsId) {\n    return request('/shop/goods/goodsAddition', true, 'get', {\n      goodsId: goodsId\n    });\n  },\n  goodsShopStores: function goodsShopStores(goodsId) {\n    return request('/shop/goods/goodsShopStores', true, 'get', {\n      goodsId: goodsId\n    });\n  },\n  goodsVideoEpisodesList: function goodsVideoEpisodesList(goodsId) {\n    var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/goodsVideoEpisodes/list', true, 'get', {\n      goodsId: goodsId, token: token\n    });\n  },\n  goodsVideoEpisodesBuy: function goodsVideoEpisodesBuy(goodsId, number, token) {\n    return request('/goodsVideoEpisodes/buy', true, 'post', {\n      goodsId: goodsId, number: number, token: token\n    });\n  },\n  goodsStatistics: function goodsStatistics(data) {\n    return request('/shop/goods/statistics/days', true, 'post', data);\n  },\n  goodsUseless: function goodsUseless(data) {\n    return request('/shop/goods/useful', true, 'post', data);\n  },\n  pushNewGoods: function pushNewGoods(data) {\n    return request('/shop/goods/putOrUpdate', true, 'post', data);\n  },\n  mygoods: function mygoods(data) {\n    return request('/shop/goods/mygoods', true, 'post', data);\n  },\n  deleteMyGoods: function deleteMyGoods(token, id) {\n    return request('/shop/goods/del', true, 'post', { token: token, id: id });\n  },\n  goodsPrice: function goodsPrice(goodsId, propertyChildIds) {\n    return request('/shop/goods/price', true, 'post', {\n      goodsId: goodsId, propertyChildIds: propertyChildIds\n    });\n  },\n  goodsPriceV2: function goodsPriceV2(data) {\n    return request('/shop/goods/price', true, 'post', data);\n  },\n  goodsPriceDaily: function goodsPriceDaily(goodsId) {\n    var priceId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shop/goods/price/day', true, 'get', {\n      goodsId: goodsId, priceId: priceId\n    });\n  },\n  goodsPriceFreight: function goodsPriceFreight(data) {\n    return request('/shop/goods/price/freight', true, 'get', data);\n  },\n  goodsPriceMultilevels: function goodsPriceMultilevels(data) {\n    return request('/shop/goods/priceMultilevels', true, 'get', data);\n  },\n  goodsRebate: function goodsRebate(token, goodsId) {\n    return request(COMMON_BASE_URL + subDomain + '/shop/goods/rebate/v2', false, 'get', {\n      token: token, goodsId: goodsId\n    });\n  },\n  goodsReputation: function goodsReputation(data) {\n    return request('/shop/goods/reputation', true, 'post', data);\n  },\n  goodsReputationV2: function goodsReputationV2(data) {\n    return request('/shop/goods/reputation/v2', true, 'post', data);\n  },\n  myBuyGoodsHis: function myBuyGoodsHis(data) {\n    return request('/shop/goods/his/list', true, 'post', data);\n  },\n  myBuyGoodsHisDelete: function myBuyGoodsHisDelete(token) {\n    var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var goodsId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/shop/goods/his/delete', true, 'post', {\n      token: token, id: id, goodsId: goodsId\n    });\n  },\n  myBuyGoodsHisV2: function myBuyGoodsHisV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/shop/goods/his/list', false, 'post', data);\n  },\n  myBuyGoodsHisDeleteV2: function myBuyGoodsHisDeleteV2(token) {\n    var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var goodsId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/shop/goods/his/delete', false, 'post', {\n      token: token, id: id, goodsId: goodsId\n    });\n  },\n  goodsFavList: function goodsFavList(data) {\n    return request('/shop/goods/fav/list', true, 'post', data);\n  },\n  goodsFavListV2: function goodsFavListV2(data) {\n    return request('/shop/goods/fav/list/v2', true, 'post', data);\n  },\n  goodsFavPut: function goodsFavPut(token, goodsId) {\n    return request('/shop/goods/fav/add', true, 'post', {\n      token: token, goodsId: goodsId\n    });\n  },\n  goodsFavAdd: function goodsFavAdd(data) {\n    return request('/shop/goods/fav/add', true, 'post', data);\n  },\n  goodsFavCheck: function goodsFavCheck(token, goodsId) {\n    return request('/shop/goods/fav/check', true, 'get', {\n      token: token, goodsId: goodsId\n    });\n  },\n  goodsFavCheckV2: function goodsFavCheckV2(data) {\n    return request('/shop/goods/fav/check', true, 'get', data);\n  },\n  goodsFavDelete: function goodsFavDelete(token) {\n    var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var goodsId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/shop/goods/fav/delete', true, 'post', {\n      token: token, id: id, goodsId: goodsId\n    });\n  },\n  goodsFavDeleteV2: function goodsFavDeleteV2(data) {\n    return request('/shop/goods/fav/delete', true, 'post', data);\n  },\n  goodsSeckillGrab: function goodsSeckillGrab(token, goodsId, seconds) {\n    return request('/goods/seckill/grab', true, 'post', { token: token, goodsId: goodsId, seconds: seconds });\n  },\n  coupons: function coupons(data) {\n    return request('/discounts/coupons', true, 'get', data);\n  },\n  couponDetail: function couponDetail(id) {\n    return request('/discounts/detail', true, 'get', {\n      id: id\n    });\n  },\n  couponStatistics: function couponStatistics(token) {\n    return request('/discounts/statistics', true, 'get', { token: token });\n  },\n  myCoupons: function myCoupons(data) {\n    return request('/discounts/my', true, 'get', data);\n  },\n  mergeCouponsRules: function mergeCouponsRules() {\n    return request('/discounts/merge/list', true, 'get');\n  },\n  mergeCoupons: function mergeCoupons(data) {\n    return request('/discounts/merge', true, 'post', data);\n  },\n  fetchCoupons: function fetchCoupons(data) {\n    return request('/discounts/fetch', true, 'post', data);\n  },\n  sendCoupons: function sendCoupons(data) {\n    return request('/discounts/send', true, 'post', data);\n  },\n  exchangeCoupons: function exchangeCoupons(token, number, pwd) {\n    var extJsonStr = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/discounts/exchange', true, 'post', {\n      token: token, number: number, pwd: pwd, extJsonStr: extJsonStr\n    });\n  },\n  couponsShareOpen: function couponsShareOpen(token, id) {\n    return request('/discounts/share/open', true, 'post', { token: token, id: id });\n  },\n  couponsShareClose: function couponsShareClose(token, id) {\n    return request('/discounts/share/close', true, 'post', { token: token, id: id });\n  },\n  couponsShareFetch: function couponsShareFetch(token, id, shareToken) {\n    return request('/discounts/share/fetch', true, 'post', { token: token, id: id, shareToken: shareToken });\n  },\n  couponsHX: function couponsHX(data) {\n    return request('/discounts/hx', true, 'post', data);\n  },\n  noticeList: function noticeList(data) {\n    return request('/notice/list', true, 'post', data);\n  },\n  noticeLastOne: function noticeLastOne() {\n    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/notice/last-one', true, 'get', {\n      type: type\n    });\n  },\n  noticeDetail: function noticeDetail(id) {\n    return request('/notice/detail', true, 'get', {\n      id: id\n    });\n  },\n  addAddress: function addAddress(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/shipping-address/add', false, 'post', data);\n  },\n  updateAddress: function updateAddress(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/shipping-address/update', false, 'post', data);\n  },\n  deleteAddress: function deleteAddress(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/user/shipping-address/delete', false, 'post', {\n      id: id,\n      token: token\n    });\n  },\n  queryAddress: function queryAddress(token) {\n    return request('/user/shipping-address/list', true, 'get', {\n      token: token\n    });\n  },\n  queryAddressV2: function queryAddressV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/shipping-address/list/v2', false, 'post', data);\n  },\n  defaultAddress: function defaultAddress(token) {\n    return request(COMMON_BASE_URL + subDomain + '/user/shipping-address/default/v2', false, 'get', {\n      token: token\n    });\n  },\n  addressDetail: function addressDetail(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/user/shipping-address/detail/v2', false, 'get', {\n      id: id,\n      token: token\n    });\n  },\n  pingtuanSet: function pingtuanSet(goodsId) {\n    return request('/shop/goods/pingtuan/set', true, 'get', {\n      goodsId: goodsId\n    });\n  },\n  pingtuanSets: function pingtuanSets(goodsIdArray) {\n    return request('/shop/goods/pingtuan/sets', true, 'get', {\n      goodsId: goodsIdArray.join()\n    });\n  },\n  goodsDefaultPingtuan: function goodsDefaultPingtuan(goodsId) {\n    return request('/shop/goods/pingtuan/default', true, 'get', {\n      goodsId: goodsId\n    });\n  },\n  pingtuanMultilevel: function pingtuanMultilevel(goodsId) {\n    return request('/shop/goods/pingtuanMultilevel', true, 'get', {\n      goodsId: goodsId\n    });\n  },\n  pingtuanOpen: function pingtuanOpen(token, goodsId) {\n    var extJsonStr = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/shop/goods/pingtuan/open', true, 'post', {\n      goodsId: goodsId,\n      token: token,\n      extJsonStr: extJsonStr\n    });\n  },\n  pingtuanTuanInfo: function pingtuanTuanInfo(tuanId) {\n    return request('/shop/goods/pingtuan/tuanInfo', true, 'get', {\n      tuanId: tuanId\n    });\n  },\n  pingtuanList: function pingtuanList(data) {\n    return request('/shop/goods/pingtuan/list/v2', true, 'post', data);\n  },\n  pingtuanJoinUsers: function pingtuanJoinUsers(tuanId) {\n    return request('/shop/goods/pingtuan/joiner', true, 'get', { tuanId: tuanId });\n  },\n  pingtuanMyJoined: function pingtuanMyJoined(data) {\n    return request('/shop/goods/pingtuan/my-join-list', true, 'post', data);\n  },\n  friendlyPartnerList: function friendlyPartnerList() {\n    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/friendly-partner/list', true, 'post', {\n      type: type\n    });\n  },\n  friendList: function friendList(data) {\n    return request('/user/friend/list', true, 'post', data);\n  },\n  addFriend: function addFriend(token, uid) {\n    return request('/user/friend/add', true, 'post', { token: token, uid: uid });\n  },\n  deleteFriend: function deleteFriend(token, uid) {\n    return request('/user/friend/delete', true, 'post', { token: token, uid: uid });\n  },\n  friendUserDetail: function friendUserDetail(token, uid) {\n    return request('/user/friend/detail', true, 'get', { token: token, uid: uid });\n  },\n  userImList: function userImList(data) {\n    return request('/userIm/list', true, 'post', data);\n  },\n  userImSendmessage: function userImSendmessage(token, uid, content) {\n    return request('/userIm/sendmessage', true, 'post', { token: token, uid: uid, content: content });\n  },\n  userImEmpty: function userImEmpty(token, uid) {\n    return request('/userIm/empty', true, 'post', { token: token, uid: uid });\n  },\n  videoDetail: function videoDetail(videoId) {\n    return request(COMMON_BASE_URL + subDomain + '/media/video/detail', false, 'get', {\n      videoId: videoId\n    });\n  },\n  bindMobileWxa: function bindMobileWxa(token, encryptedData, iv) {\n    var pwd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/user/wxapp/bindMobile', true, 'post', {\n      token: token, encryptedData: encryptedData, iv: iv, pwd: pwd\n    });\n  },\n  bindMobileWxapp: function bindMobileWxapp(token, code, encryptedData, iv) {\n    var pwd = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';\n\n    return request('/user/wxapp/bindMobile', true, 'post', {\n      token: token, code: code, encryptedData: encryptedData, iv: iv, pwd: pwd\n    });\n  },\n  bindMobileWxappV2: function bindMobileWxappV2(token, code) {\n    var pwd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/user/wxapp/bindMobile/v2', true, 'post', {\n      token: token, code: code, pwd: pwd\n    });\n  },\n  bindMobileTta: function bindMobileTta(token, encryptedData, iv) {\n    var pwd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/user/tt/miniapp/bindMobile', false, 'post', {\n      token: token, encryptedData: encryptedData, iv: iv, pwd: pwd\n    });\n  },\n  bindMobileSms: function bindMobileSms(token, mobile, code) {\n    var pwd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/user/m/bind-mobile', true, 'post', {\n      token: token, mobile: mobile, code: code, pwd: pwd\n    });\n  },\n  userDetail: function userDetail(token) {\n    return request('/user/detail', true, 'get', {\n      token: token\n    });\n  },\n  randomNick: function randomNick() {\n    var len = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/user/randomNick', true, 'get', {\n      len: len\n    });\n  },\n  userDetailSpreadUser: function userDetailSpreadUser(token, uid) {\n    return request('/user/detail/spreadUser', true, 'get', {\n      token: token, uid: uid\n    });\n  },\n  userWxinfo: function userWxinfo(token) {\n    return request('/user/wxinfo', true, 'get', {\n      token: token\n    });\n  },\n  userAliappInfo: function userAliappInfo(token) {\n    return request('/user/aliappInfo', true, 'get', {\n      token: token\n    });\n  },\n  userAmount: function userAmount(token) {\n    return request('/user/amount', true, 'get', {\n      token: token\n    });\n  },\n  userAmountV2: function userAmountV2(token) {\n    return request(COMMON_BASE_URL + subDomain + '/user/amount', false, 'get', {\n      token: token\n    });\n  },\n  orderCreate: function orderCreate(data) {\n    return request('/order/create', true, 'post', data);\n  },\n  orderList: function orderList(data) {\n    return request('/order/list', true, 'post', data);\n  },\n  orderDetail: function orderDetail(token, id) {\n    var hxNumber = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n    var peisongOrderId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/order/detail', true, 'get', {\n      id: id,\n      token: token,\n      hxNumber: hxNumber,\n      peisongOrderId: peisongOrderId\n    });\n  },\n  orderMtLocation: function orderMtLocation(id) {\n    return request('/order/mtlocation', true, 'get', {\n      id: id\n    });\n  },\n  orderDelivery: function orderDelivery(token, orderId) {\n    return request('/order/delivery', true, 'post', {\n      orderId: orderId,\n      token: token\n    });\n  },\n  orderReputation: function orderReputation(data) {\n    return request('/order/reputation', true, 'post', data);\n  },\n  orderReputationList: function orderReputationList(data) {\n    return request('/order/listReputation', true, 'post', data);\n  },\n  orderReputationDelete: function orderReputationDelete(data) {\n    return request('/order/reputation/delete', true, 'post', data);\n  },\n  orderReputationModify: function orderReputationModify(data) {\n    return request('/order/reputation/modify', true, 'post', data);\n  },\n  orderClose: function orderClose(token, orderId) {\n    return request('/order/close', true, 'post', {\n      orderId: orderId,\n      token: token\n    });\n  },\n  orderCloseV2: function orderCloseV2(data) {\n    return request('/order/close', true, 'post', data);\n  },\n  orderDelete: function orderDelete(token, orderId) {\n    return request('/order/delete', true, 'post', {\n      orderId: orderId,\n      token: token\n    });\n  },\n  orderPay: function orderPay(token, orderId) {\n    return request('/order/pay', true, 'post', {\n      orderId: orderId,\n      token: token\n    });\n  },\n  orderPayV2: function orderPayV2(data) {\n    return request('/order/pay', true, 'post', data);\n  },\n  jdjlOrderPay: function jdjlOrderPay(token, _token) {\n    var couponId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/jdjl/payOrder', true, 'post', {\n      _token: _token,\n      token: token,\n      couponId: couponId\n    });\n  },\n  orderHX: function orderHX(hxNumber) {\n    return request('/order/hx', true, 'post', {\n      hxNumber: hxNumber\n    });\n  },\n  orderHXV2: function orderHXV2(data) {\n    return request('/order/hx', true, 'post', data);\n  },\n  orderSet: function orderSet() {\n    return request('/order/set', true, 'get');\n  },\n  orderRefunds: function orderRefunds(token, orderId) {\n    return request('/order/refund', true, 'get', {\n      token: token,\n      orderId: orderId\n    });\n  },\n  withDrawApply: function withDrawApply(token, money) {\n    return request('/user/withDraw/apply', true, 'post', {\n      money: money,\n      token: token\n    });\n  },\n  withDrawApplyV2: function withDrawApplyV2(data) {\n    return request('/user/withDraw/apply', true, 'post', data);\n  },\n  withDrawDetail: function withDrawDetail(token, id) {\n    return request('/user/withDraw/detail', true, 'get', {\n      token: token,\n      id: id\n    });\n  },\n  withDrawLogs: function withDrawLogs(data) {\n    return request('/user/withDraw/list', true, 'post', data);\n  },\n  withDrawSetting: function withDrawSetting() {\n    return request('/user/withDraw/setting', true, 'get');\n  },\n  withDrawApplyV3: function withDrawApplyV3(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/withdrawal/apply', true, 'post', data);\n  },\n  withDrawDetailV2: function withDrawDetailV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/withdrawal/detail', true, 'get', data);\n  },\n  withDrawLogsV2: function withDrawLogsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/withdrawal/list', true, 'post', data);\n  },\n  withDrawSettingV2: function withDrawSettingV2() {\n    return request(COMMON_BASE_URL + subDomain + '/user/withdrawal/setting', true, 'get');\n  },\n  wxpayRequestMerchantTransferV2: function wxpayRequestMerchantTransferV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/withdrawal/requestMerchantTransfer', true, 'get', data);\n  },\n  province: function province() {\n    return request('/common/region/v2/province', false, 'get');\n  },\n  city: function city() {\n    return request('/common/region/v2/city', false, 'get');\n  },\n  districts: function districts() {\n    return request('/common/region/v2/districts', false, 'get');\n  },\n  streets: function streets() {\n    return request('/common/region/v2/streets', false, 'get');\n  },\n  nextRegion: function nextRegion(pid) {\n    return request('/common/region/v2/child', false, 'get', {\n      pid: pid\n    });\n  },\n  regionInfo: function regionInfo(id) {\n    return request('/common/region/v2/info', false, 'get', {\n      id: id\n    });\n  },\n  regionInfoBatch: function regionInfoBatch(ids) {\n    return request('/common/region/v2/infoBatch', false, 'get', {\n      ids: ids\n    });\n  },\n  regionSearch: function regionSearch(data) {\n    return request('/common/region/v2/search', false, 'post', data);\n  },\n  provinceV2: function provinceV2() {\n    return request(COMMON_BASE_URL + subDomain + '/region/province', false, 'get');\n  },\n  cityV2: function cityV2() {\n    return request(COMMON_BASE_URL + subDomain + '/region/city', false, 'get');\n  },\n  districtsV2: function districtsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/region/districts', false, 'post', data);\n  },\n  streetsV2: function streetsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/region/streets', false, 'post', data);\n  },\n  nextRegionV2: function nextRegionV2(pid) {\n    return request(COMMON_BASE_URL + subDomain + '/region/child', false, 'get', { pid: pid });\n  },\n  regionInfoV2: function regionInfoV2(id) {\n    return request(COMMON_BASE_URL + subDomain + '/region/info', false, 'get', { id: id });\n  },\n  regionInfoBatchV2: function regionInfoBatchV2(ids) {\n    return request(COMMON_BASE_URL + subDomain + '/region/infoBatch', false, 'get', { ids: ids });\n  },\n  regionSearchV2: function regionSearchV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/region/search', false, 'post', data);\n  },\n  regionAnalysis: function regionAnalysis(address) {\n    return request(COMMON_BASE_URL + subDomain + '/region/analysis', false, 'post', { address: address });\n  },\n  cashLogs: function cashLogs(data) {\n    return request('/user/cashLog', true, 'post', data);\n  },\n  cashLogsV2: function cashLogsV2(data) {\n    return request('/user/cashLog/v2', true, 'post', data);\n  },\n  cashLogsV3: function cashLogsV3(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/cashLog/v2', false, 'post', data);\n  },\n  statisticsComingOut: function statisticsComingOut(data) {\n    return request('/user/statisticsComingOut', true, 'post', data);\n  },\n  statisticsComingOutV2: function statisticsComingOutV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/statisticsComingOut', false, 'post', data);\n  },\n  payLogs: function payLogs(data) {\n    return request('/user/payLogs', true, 'post', data);\n  },\n  rechargeSendRules: function rechargeSendRules() {\n    return request('/user/recharge/send/rule', true, 'get');\n  },\n  payBillDiscounts: function payBillDiscounts() {\n    return request('/payBill/discounts', true, 'get');\n  },\n  payBill: function payBill(token, money) {\n    var pwd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/payBill/pay', true, 'post', { token: token, money: money, pwd: pwd });\n  },\n  payBillV2: function payBillV2(data) {\n    return request('/payBill/pay', true, 'post', data);\n  },\n  vipLevel: function vipLevel() {\n    return request('/config/vipLevel', true, 'get');\n  },\n  fxApply: function fxApply(token, name, mobile) {\n    return request('/saleDistribution/apply', true, 'post', { token: token, name: name, mobile: mobile });\n  },\n  fxApplyV2: function fxApplyV2(data) {\n    return request('/saleDistribution/apply/v2', true, 'post', data);\n  },\n  fxSetting: function fxSetting() {\n    return request(COMMON_BASE_URL + subDomain + '/saleDistribution/setting', true, 'get');\n  },\n  fxBuy: function fxBuy(token) {\n    return request('/saleDistribution/buy', true, 'post', { token: token });\n  },\n  fxApplyProgress: function fxApplyProgress(token) {\n    return request('/saleDistribution/apply/progress', true, 'get', { token: token });\n  },\n  fxApplyProgressV2: function fxApplyProgressV2(token) {\n    return request('/saleDistribution/apply/progress/v2', true, 'get', { token: token });\n  },\n  fxMembers: function fxMembers(data) {\n    return request('/saleDistribution/members', true, 'post', data);\n  },\n  fxCommisionLog: function fxCommisionLog(data) {\n    return request('/saleDistribution/commision/log', true, 'post', data);\n  },\n  fxCommisionFreezeAmount: function fxCommisionFreezeAmount(token) {\n    return request('/saleDistribution/commission/freeze', true, 'get', { token: token });\n  },\n  fxSaleroomRankTotal: function fxSaleroomRankTotal(page, pageSize) {\n    return request('/saleDistribution/sale-room-rank/total', true, 'get', {\n      page: page, pageSize: pageSize\n    });\n  },\n  fxSaleroomRankTotalTeam: function fxSaleroomRankTotalTeam(page, pageSize) {\n    return request('/saleDistribution/sale-room-rank/team/total', true, 'get', {\n      page: page, pageSize: pageSize\n    });\n  },\n  fxSaleroomRankDaily: function fxSaleroomRankDaily(page, pageSize, day) {\n    return request(COMMON_BASE_URL + subDomain + '/saleDistribution/sale-room-rank/daily', false, 'get', {\n      page: page, pageSize: pageSize, day: day\n    });\n  },\n  fxStatisticsDays: function fxStatisticsDays(data) {\n    return request(COMMON_BASE_URL + subDomain + '/saleDistribution/statistics/days', false, 'get', data);\n  },\n  fxUpgrade: function fxUpgrade(token) {\n    return request(COMMON_BASE_URL + subDomain + '/saleDistribution/upgrade', false, 'post', { token: token });\n  },\n  fxMembersStatistics: function fxMembersStatistics(token) {\n    return request('/saleDistribution/members/statistics', true, 'get', { token: token });\n  },\n  fxMyCommisionStatistics: function fxMyCommisionStatistics(token, days) {\n    return request(COMMON_BASE_URL + subDomain + '/saleDistribution/my/commision', false, 'get', { token: token, days: days });\n  },\n  fxGoods: function fxGoods(data) {\n    return request('/saleDistribution/goods', true, 'post', data);\n  },\n  fxTeamReport: function fxTeamReport(data) {\n    return request('/saleDistribution/team/report', true, 'post', data);\n  },\n  fxCities: function fxCities(token) {\n    return request('/saleDistribution/city/list', true, 'get', { token: token });\n  },\n  fxCityReport: function fxCityReport(data) {\n    return request('/saleDistribution/city/report', true, 'post', data);\n  },\n  goodsSellNumberStatistics: function goodsSellNumberStatistics(page, pageSize) {\n    var goodsId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/site/goods/statistics', false, 'get', {\n      page: page, pageSize: pageSize, goodsId: goodsId\n    });\n  },\n  wxaQrcode: function wxaQrcode(data) {\n    return request('https://oss.apifm.com/' + subDomain + '/qrcode/wxa/unlimit', true, 'post', data);\n  },\n  ttaQrcode: function ttaQrcode(paramsJson, expireHours) {\n    return request(COMMON_BASE_URL + subDomain + '/user/tt/miniapp/qrcode', false, 'post', {\n      content: JSON.stringify(paramsJson),\n      expireHours: expireHours\n    });\n  },\n  commonQrcode: function commonQrcode(data) {\n    return request('https://oss.apifm.com/' + subDomain + '/qrcode/content', true, 'post', data);\n  },\n  uploadFile: function uploadFile(token, tempFilePath) {\n    var expireHours = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    var uploadUrl = API_BASE_URL + '/' + subDomain + '/dfs/upload/file';\n    return new Promise(function (resolve, reject) {\n      wx.uploadFile({\n        url: uploadUrl,\n        filePath: tempFilePath,\n        name: 'upfile',\n        formData: {\n          'token': token,\n          expireHours: expireHours\n        },\n        success: function success(res) {\n          resolve(JSON.parse(res.data));\n        },\n        fail: function fail(error) {\n          reject(error);\n        },\n        complete: function complete(aaa) {\n          // 加载完成\n        }\n      });\n    });\n  },\n  uploadFileV2: function uploadFileV2(token, tempFilePath) {\n    var expireHours = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return new Promise(function (resolve, reject) {\n      wx.uploadFile({\n        url: 'https://oss.apifm.com/upload2',\n        filePath: tempFilePath,\n        name: 'upfile',\n        formData: {\n          token: token,\n          subDomain: subDomain,\n          expireHours: expireHours\n        },\n        success: function success(res) {\n          resolve(JSON.parse(res.data));\n        },\n        fail: function fail(error) {\n          reject(error);\n        },\n        complete: function complete(aaa) {\n          // 加载完成\n        }\n      });\n    });\n  },\n  uploadFileV22: function uploadFileV22(token, tempFilePath) {\n    var expireHours = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return new Promise(function (resolve, reject) {\n      tt.uploadFile({\n        url: 'https://dfs.apifm.com/upload2',\n        filePath: tempFilePath,\n        name: 'upfile',\n        formData: {\n          token: token,\n          subDomain: subDomain,\n          expireHours: expireHours\n        },\n        success: function success(res) {\n          resolve(JSON.parse(res.data));\n        },\n        fail: function fail(error) {\n          reject(error);\n        },\n        complete: function complete(aaa) {\n          // 加载完成\n        }\n      });\n    });\n  },\n  uploadFileFromUrl: function uploadFileFromUrl() {\n    var remoteFileUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/dfs/upload/url', true, 'post', { remoteFileUrl: remoteFileUrl, ext: ext });\n  },\n  uploadFileFromUrlV2: function uploadFileFromUrlV2(data) {\n    var _data = Object.assign(data, { subDomain: subDomain });\n    return request('https://oss.apifm.com/uploadByUrl', false, 'post', _data);\n  },\n  uploadFileFromUrlV22: function uploadFileFromUrlV22(data) {\n    var _data = Object.assign(data, { subDomain: subDomain });\n    return request('https://dfs.apifm.com/uploadByUrl', false, 'post', _data);\n  },\n  uploadFileList: function uploadFileList() {\n    var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/dfs/upload/list', true, 'post', { path: path });\n  },\n  uploadFileListV2: function uploadFileListV2(data) {\n    return request('/dfs/upload/list/v2', true, 'post', data);\n  },\n  galleryList: function galleryList(data) {\n    return request('/dfs/gallery', true, 'post', data);\n  },\n  refundApply: function refundApply(data) {\n    return request('/order/refundApply/apply', true, 'post', data);\n  },\n  refundApplyDetail: function refundApplyDetail(token, orderId) {\n    var orderGoodsId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/order/refundApply/info', true, 'get', {\n      token: token,\n      orderId: orderId,\n      orderGoodsId: orderGoodsId\n    });\n  },\n  refundApplyCancel: function refundApplyCancel(token, orderId) {\n    var orderGoodsId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/order/refundApply/cancel', true, 'post', {\n      token: token,\n      orderId: orderId,\n      orderGoodsId: orderGoodsId\n    });\n  },\n  refundApplySetBackLogistics: function refundApplySetBackLogistics(data) {\n    return request('/order/refundApply/setBackLogistics', true, 'post', data);\n  },\n  cmsCategories: function cmsCategories() {\n    return request(COMMON_BASE_URL + subDomain + '/cms/category/list', false, 'get', {});\n  },\n  cmsCategoryDetail: function cmsCategoryDetail(id) {\n    return request(COMMON_BASE_URL + subDomain + '/cms/category/info', false, 'get', { id: id });\n  },\n  cmsArticles: function cmsArticles(data) {\n    return request('/cms/news/list', true, 'post', data);\n  },\n  cmsArticlesV2: function cmsArticlesV2(data) {\n    return request('/cms/news/list/v2', true, 'post', data);\n  },\n  cmsArticlesV3: function cmsArticlesV3(data) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/list/v2', true, 'post', data);\n  },\n  cmsArticleUsefulLogs: function cmsArticleUsefulLogs(data) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/useful/logs', false, 'post', data);\n  },\n  cmsArticleDetail: function cmsArticleDetail(id) {\n    return request('/cms/news/detail', true, 'get', { id: id });\n  },\n  cmsArticleDetailV2: function cmsArticleDetailV2(id) {\n    var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/cms/news/detail/v2', true, 'get', { id: id, token: token });\n  },\n  cmsArticleDetailV3: function cmsArticleDetailV3(data) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/detail/v2', true, 'get', data);\n  },\n  cmsArticlePreNext: function cmsArticlePreNext(id) {\n    return request('/cms/news/preNext', true, 'get', { id: id });\n  },\n  cmsArticlePreNextV2: function cmsArticlePreNextV2(id) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/preNext', true, 'get', { id: id });\n  },\n  cmsArticleCreate: function cmsArticleCreate(data) {\n    return request('/cms/news/put', true, 'post', data);\n  },\n  cmsArticleCreateV2: function cmsArticleCreateV2(data) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/put', true, 'post', data);\n  },\n  cmsArticleDelete: function cmsArticleDelete(token, id) {\n    return request('/cms/news/del', true, 'post', { token: token, id: id });\n  },\n  cmsArticleDeleteV2: function cmsArticleDeleteV2(token, id) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/del', true, 'post', { token: token, id: id });\n  },\n  cmsArticleUseless: function cmsArticleUseless(data) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/useful', false, 'post', data);\n  },\n  cmsArticleModifyExtNumber: function cmsArticleModifyExtNumber(data) {\n    return request('/cms/news/modifyExtNumber', true, 'post', data);\n  },\n  cmsArticleModifyExtNumberV2: function cmsArticleModifyExtNumberV2(data) {\n    return request(CMS_BASE_URL + merchantId + '/cms/news/modifyExtNumber', true, 'post', data);\n  },\n  newsOwnerUserViewStatistics: function newsOwnerUserViewStatistics(data) {\n    return request('/newsOwnerUserViewStatistics/list', true, 'post', data);\n  },\n  cmsPage: function cmsPage(key) {\n    return request(COMMON_BASE_URL + subDomain + '/cms/page/info/v2', true, 'get', { key: key });\n  },\n  cmsTags: function cmsTags() {\n    return request('/cms/tags/list', true, 'get', {});\n  },\n  cmsTagsV2: function cmsTagsV2(data) {\n    return request(CMS_BASE_URL + merchantId + '/newsTag/list', true, 'post', data);\n  },\n  cmsNewsSignUsers: function cmsNewsSignUsers(data) {\n    return request('/newsSign/signUsers', true, 'post', data);\n  },\n  cmsNewsSignOnline: function cmsNewsSignOnline(data) {\n    return request('/newsSign/signOnline', true, 'post', data);\n  },\n  cmsNewsSignOffline: function cmsNewsSignOffline(data) {\n    return request('/newsSign/signOffline', true, 'post', data);\n  },\n  cmsNewsSignCheck: function cmsNewsSignCheck(token, newsId) {\n    return request('/newsSign/check', true, 'get', { token: token, newsId: newsId });\n  },\n  invoiceList: function invoiceList(data) {\n    return request('/invoice/list', true, 'post', data);\n  },\n  invoiceApply: function invoiceApply(data) {\n    return request('/invoice/apply', true, 'post', data);\n  },\n  invoiceDetail: function invoiceDetail(token, id) {\n    return request('/invoice/info', true, 'get', { token: token, id: id });\n  },\n  depositList: function depositList(data) {\n    return request('/deposit/list', true, 'post', data);\n  },\n  payDeposit: function payDeposit(data) {\n    return request('/deposit/pay', true, 'post', data);\n  },\n  depositInfo: function depositInfo(token, id) {\n    return request('/deposit/info', true, 'get', { token: token, id: id });\n  },\n  depositBackApply: function depositBackApply(token, id) {\n    return request('/deposit/back/apply', true, 'post', { token: token, id: id });\n  },\n  depositListV2: function depositListV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/deposit/list', false, 'post', data);\n  },\n  payDepositV2: function payDepositV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/deposit/pay', false, 'post', data);\n  },\n  payStatusDepositV2: function payStatusDepositV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/deposit/payStatus', false, 'post', data);\n  },\n  depositInfoV2: function depositInfoV2(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/deposit/info', false, 'get', { token: token, id: id });\n  },\n  depositBackApplyV2: function depositBackApplyV2(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/deposit/back/apply', false, 'post', { token: token, id: id });\n  },\n  shopAreaCities: function shopAreaCities() {\n    return request('/shopArea/cities', true, 'get');\n  },\n  shopAreaList: function shopAreaList(data) {\n    return request('/shopArea/list', true, 'post', data);\n  },\n  shopAreaDetail: function shopAreaDetail(id) {\n    return request('/shopArea/detail', true, 'get', { id: id });\n  },\n  fetchShopsCities: function fetchShopsCities() {\n    return request('/shop/subshop/cities', true, 'get');\n  },\n  fetchShops: function fetchShops(data) {\n    return request('/shop/subshop/list', true, 'post', data);\n  },\n  fetchShopsV2: function fetchShopsV2(data) {\n    return request('/shop/subshop/list/v2', true, 'post', data);\n  },\n  fetchMyShops: function fetchMyShops(token) {\n    return request('/shop/subshop/my', true, 'get', { token: token });\n  },\n  shopSubdetail: function shopSubdetail(id) {\n    return request('/shop/subshop/detail/v2', true, 'get', { id: id });\n  },\n  shopSubApply: function shopSubApply(data) {\n    return request('/shop/subshop/apply', true, 'post', data);\n  },\n  pickPoints: function pickPoints(data) {\n    return request('/shop/subshop/pickPoints', true, 'post', data);\n  },\n  shopReputationList: function shopReputationList(data) {\n    return request('/shop/subshop/listReputation', true, 'post', data);\n  },\n  shopPicList: function shopPicList(data) {\n    return request('/shop/subshop/shopPics', true, 'post', data);\n  },\n  shopFavPut: function shopFavPut(token, shopId) {\n    return request('/shop/fav/add', true, 'post', { token: token, shopId: shopId });\n  },\n  shopFavCheck: function shopFavCheck(token, shopId) {\n    return request('/shop/fav/check', true, 'get', { token: token, shopId: shopId });\n  },\n  shopFavList: function shopFavList(data) {\n    return request('/shop/fav/list', true, 'post', data);\n  },\n  shopFavDelete: function shopFavDelete(token, shopId) {\n    return request('/shop/fav/delete', true, 'post', { token: token, shopId: shopId });\n  },\n  userAttendantFavPut: function userAttendantFavPut(token, attendantId) {\n    return request('/userAttendantFav/add', true, 'post', { token: token, attendantId: attendantId });\n  },\n  userAttendantFavCheck: function userAttendantFavCheck(token, attendantId) {\n    return request('/userAttendantFav/check', true, 'get', { token: token, attendantId: attendantId });\n  },\n  userAttendantFavList: function userAttendantFavList(data) {\n    return request('/userAttendantFav/list', true, 'post', data);\n  },\n  userAttendantFavDelete: function userAttendantFavDelete(token, attendantId) {\n    return request('/userAttendantFav/delete', true, 'post', { token: token, attendantId: attendantId });\n  },\n  addComment: function addComment(data) {\n    return request('/comment/add', true, 'post', data);\n  },\n  commentList: function commentList(data) {\n    return request('/comment/list', true, 'post', data);\n  },\n  commentListV2: function commentListV2(data) {\n    return request('/comment/list/v2', true, 'post', data);\n  },\n  delComment: function delComment(data) {\n    return request('/comment/del', true, 'post', data);\n  },\n  modifyUserInfo: function modifyUserInfo(data) {\n    return request('/user/modify', true, 'post', data);\n  },\n  modifyUserInfoV2: function modifyUserInfoV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/modify', false, 'post', data);\n  },\n  bindSaleman: function bindSaleman(data) {\n    return request('/user/bindSaleman', true, 'post', data);\n  },\n  modifyUserPassword: function modifyUserPassword(token, pwdOld, pwdNew) {\n    return request('/user/modify/password', true, 'post', { token: token, pwdOld: pwdOld, pwdNew: pwdNew });\n  },\n  modifyUserPasswordByUserName: function modifyUserPasswordByUserName(data) {\n    return request('/user/username/modifyPassword', true, 'post', data);\n  },\n  anonymousUserInfo: function anonymousUserInfo(id) {\n    return request('/user/anonymous/info', true, 'get', { id: id });\n  },\n  uniqueId: function uniqueId() {\n    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/uniqueId/get', true, 'get', { type: type });\n  },\n  sequence: function sequence() {\n    var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var defValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/uniqueId/sequence', false, 'get', { type: type, defValue: defValue });\n  },\n  queryBarcode: function queryBarcode() {\n    var barcode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/barcode/info', true, 'get', { barcode: barcode });\n  },\n  luckyInfo: function luckyInfo(id) {\n    return request('/luckyInfo/info/v2', true, 'get', { id: id });\n  },\n  luckyInfoJoin: function luckyInfoJoin(id, token) {\n    return request('/luckyInfo/join', true, 'post', { id: id, token: token });\n  },\n  luckyInfoJoinMy: function luckyInfoJoinMy(id, token) {\n    return request('/luckyInfo/join/my', true, 'get', { id: id, token: token });\n  },\n  luckyInfoJoinLogs: function luckyInfoJoinLogs(data) {\n    return request('/luckyInfo/join/logs', true, 'post', data);\n  },\n  jsonList: function jsonList(data) {\n    return request('/json/list', true, 'post', data);\n  },\n  jsonListV2: function jsonListV2(data) {\n    return request('/json/list/v2', true, 'post', data);\n  },\n  jsonSet: function jsonSet(data) {\n    return request('/json/set', true, 'post', data);\n  },\n  jsonDelete: function jsonDelete(token, id) {\n    return request('/json/delete', true, 'post', { token: token, id: id });\n  },\n  jsonTop: function jsonTop(token, id, isTop) {\n    return request('/json/top', true, 'post', { token: token, id: id, isTop: isTop });\n  },\n  jsonHighlight: function jsonHighlight(token, id, isHighlight) {\n    return request('/json/highlight', true, 'post', { token: token, id: id, isHighlight: isHighlight });\n  },\n  jsonListV3: function jsonListV3(data) {\n    return request(COMMON_BASE_URL + subDomain + '/json/list', true, 'post', data);\n  },\n  jsonSetV2: function jsonSetV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/json/set', true, 'post', data);\n  },\n  jsonDeleteV2: function jsonDeleteV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/json/delete', true, 'post', data);\n  },\n  jsonTopv2: function jsonTopv2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/json/top', true, 'post', data);\n  },\n  jsonHighlightv2: function jsonHighlightv2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/json/highlight', true, 'post', data);\n  },\n  graphValidateCodeUrl: function graphValidateCodeUrl() {\n    var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Math.random();\n\n    var _url = API_BASE_URL + '/' + subDomain + '/verification/pic/get?key=' + key;\n    return _url;\n  },\n  graphValidateCodeCheck: function graphValidateCodeCheck() {\n    var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Math.random();\n    var code = arguments[1];\n\n    return request('/verification/pic/check', true, 'post', { key: key, code: code });\n  },\n  shortUrl: function shortUrl() {\n    var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/common/short-url/shorten', false, 'post', { url: url });\n  },\n  shortUrlV2: function shortUrlV2(content) {\n    return request('/common/short-url/shorten/v2', false, 'post', { content: content });\n  },\n  shortUrlExpand: function shortUrlExpand(suffix) {\n    return request('/common/short-url/expand', false, 'post', { suffix: suffix });\n  },\n  smsValidateCode: function smsValidateCode(mobile) {\n    var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var picCode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/verification/sms/get', true, 'get', { mobile: mobile, key: key, picCode: picCode });\n  },\n  smsValidateCodeByToken: function smsValidateCodeByToken(token) {\n    return request('/verification/sms/get-by-token', true, 'get', { token: token });\n  },\n  smsValidateCodeCheck: function smsValidateCodeCheck(mobile, code) {\n    return request('/verification/sms/check', true, 'post', { mobile: mobile, code: code });\n  },\n  mailValidateCode: function mailValidateCode(mail) {\n    return request('/verification/mail/get', true, 'get', { mail: mail });\n  },\n  mailValidateCodeCheck: function mailValidateCodeCheck(mail, code) {\n    return request('/verification/mail/check', true, 'post', { mail: mail, code: code });\n  },\n  mapDistance: function mapDistance(lat1, lng1, lat2, lng2) {\n    return request('/common/map/distance', false, 'get', { lat1: lat1, lng1: lng1, lat2: lat2, lng2: lng2 });\n  },\n  mapDistanceNavigation: function mapDistanceNavigation(key, mode, from, to) {\n    return request('/common/map/qq/distance', false, 'post', { key: key, mode: mode, from: from, to: to });\n  },\n  mapQQAddress: function mapQQAddress() {\n    var location = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var coord_type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '5';\n\n    return request('/common/map/qq/address', false, 'get', { location: location, coord_type: coord_type });\n  },\n  mapQQAddressV2: function mapQQAddressV2(key, location) {\n    var coord_type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '5';\n\n    return request('/common/map/qq/address', false, 'get', { key: key, location: location, coord_type: coord_type });\n  },\n  mapQQSearch: function mapQQSearch(data) {\n    return request('/common/map/qq/search', false, 'post', data);\n  },\n  mapQQSearchV2: function mapQQSearchV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/map/qq/search', false, 'post', data);\n  },\n  mapDistanceNavigationV2: function mapDistanceNavigationV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/map/qq/distance', false, 'post', data);\n  },\n  mapQQAddressV3: function mapQQAddressV3(data) {\n    return request(COMMON_BASE_URL + subDomain + '/map/qq/address', false, 'post', data);\n  },\n  mapGeocoder: function mapGeocoder(data) {\n    return request(COMMON_BASE_URL + subDomain + '/map/geocoder', false, 'post', data);\n  },\n  mapDrive: function mapDrive(data) {\n    return request(COMMON_BASE_URL + subDomain + '/map/drive', false, 'post', data);\n  },\n  mapAddressToGps: function mapAddressToGps(data) {\n    return request(COMMON_BASE_URL + subDomain + '/map/addressToGps', false, 'post', data);\n  },\n  virtualTraderList: function virtualTraderList(data) {\n    return request('/virtualTrader/list', true, 'post', data);\n  },\n  virtualTraderDetail: function virtualTraderDetail(token, id) {\n    return request('/virtualTrader/info', true, 'get', { token: token, id: id });\n  },\n  virtualTraderBuy: function virtualTraderBuy(token, id) {\n    return request('/virtualTrader/buy', true, 'post', { token: token, id: id });\n  },\n  virtualTraderMyBuyLogs: function virtualTraderMyBuyLogs(data) {\n    return request('/virtualTrader/buy/logs', true, 'post', data);\n  },\n  virtualTraderListV2: function virtualTraderListV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/virtualTrader/list', false, 'post', data);\n  },\n  virtualTraderDetailV2: function virtualTraderDetailV2(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/virtualTrader/info', false, 'get', { token: token, id: id });\n  },\n  virtualTraderBuyV2: function virtualTraderBuyV2(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/virtualTrader/buy', false, 'post', { token: token, id: id });\n  },\n  virtualTraderMyBuyLogsV2: function virtualTraderMyBuyLogsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/virtualTrader/buy/logs', false, 'post', data);\n  },\n  queuingTypes: function queuingTypes() {\n    var status = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request('/queuing/types', true, 'get', { status: status });\n  },\n  queuingGet: function queuingGet(token, typeId) {\n    var mobile = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/queuing/get', true, 'post', { token: token, typeId: typeId, mobile: mobile });\n  },\n  queuingMy: function queuingMy(token) {\n    var typeId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var status = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/queuing/my', true, 'get', { token: token, typeId: typeId, status: status });\n  },\n  idcardCheck: function idcardCheck(token, name, idCardNo) {\n    return request('/user/idcard', true, 'post', { token: token, name: name, idCardNo: idCardNo });\n  },\n  idcardCheckManualReview: function idcardCheckManualReview(data) {\n    return request('/user/idcard/manualReview', true, 'post', data);\n  },\n  idcardCheckManualReviewInfo: function idcardCheckManualReviewInfo(token) {\n    return request('/user/idcard/manualReview/info', true, 'get', { token: token });\n  },\n  userTagList: function userTagList(data) {\n    return request('/userTag/list', true, 'post', data);\n  },\n  userTagCertificateQuery: function userTagCertificateQuery(token) {\n    return request('/userTag/certificate/query', true, 'get', { token: token });\n  },\n  userTagCertificate: function userTagCertificate(data) {\n    return request('/userTag/certificate', true, 'post', data);\n  },\n  bindSeller: function bindSeller(data) {\n    return request('/user/bindSeller', true, 'post', data);\n  },\n  loginout: function loginout(token) {\n    return request('/user/loginout', true, 'get', { token: token });\n  },\n  userLogedList: function userLogedList(token) {\n    return request('/user/logedUserList', true, 'get', { token: token });\n  },\n  userDelete: function userDelete(token) {\n    return request('/user/delete', true, 'post', { token: token });\n  },\n  dynamicUserCode: function dynamicUserCode(token) {\n    return request(COMMON_BASE_URL + subDomain + '/user/dynamicUserCode', false, 'get', { token: token });\n  },\n  userLevelList: function userLevelList(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/level/list', false, 'post', data);\n  },\n  userLevelDetail: function userLevelDetail(levelId) {\n    return request(COMMON_BASE_URL + subDomain + '/user/level/info', false, 'get', { id: levelId });\n  },\n  userLevelPrices: function userLevelPrices(levelId) {\n    return request(COMMON_BASE_URL + subDomain + '/user/level/prices', false, 'get', { levelId: levelId });\n  },\n  userLevelBuy: function userLevelBuy(token, priceId) {\n    var isAutoRenew = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var remark = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/user/level/buy', false, 'post', {\n      token: token,\n      userLevelPriceId: priceId,\n      isAutoRenew: isAutoRenew,\n      remark: remark\n    });\n  },\n  userLevelBuyLogs: function userLevelBuyLogs(data) {\n    return request(COMMON_BASE_URL + subDomain + '/user/level/buyLogs', false, 'post', data);\n  },\n  messageList: function messageList(data) {\n    return request('/user/message/list', true, 'post', data);\n  },\n  messageRead: function messageRead(token, id) {\n    return request('/user/message/read', true, 'post', { token: token, id: id });\n  },\n  messageDelete: function messageDelete(token, id) {\n    return request('/user/message/del', true, 'post', { token: token, id: id });\n  },\n  bindOpenid: function bindOpenid(token, code) {\n    // SDK文档到这里\n    return request('/user/wxapp/bindOpenid', true, 'post', {\n      token: token, code: code,\n      type: 2\n    });\n  },\n  bindOpenidV2: function bindOpenidV2(token, code, appid) {\n    return request('/user/wxapp/bindOpenid/v2', true, 'post', {\n      token: token, code: code, appid: appid\n    });\n  },\n  bindOpenidV11: function bindOpenidV11(data) {\n    return request('/user/wxapp/bindOpenid', true, 'post', data);\n  },\n  encryptedData: function encryptedData(code, _encryptedData, iv) {\n    return request('/user/wxapp/decode/encryptedData', true, 'post', {\n      code: code, encryptedData: _encryptedData, iv: iv\n    });\n  },\n  voteItems: function voteItems(data) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/items', false, 'post', data);\n  },\n  voteItemDetail: function voteItemDetail(id) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/info', false, 'get', { id: id });\n  },\n  vote: function vote(token, voteId, items, remark) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote', false, 'post', {\n      token: token, voteId: voteId,\n      items: items.join(),\n      remark: remark\n    });\n  },\n  voteCategory: function voteCategory(data) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote/category', false, 'post', data);\n  },\n  myVote: function myVote(token, voteId) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote/info', false, 'get', {\n      token: token, voteId: voteId\n    });\n  },\n  myVoteV2: function myVoteV2(token, voteId) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote/info/v2', false, 'get', {\n      token: token, voteId: voteId\n    });\n  },\n  voteLogs: function voteLogs(data) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote/list', false, 'post', data);\n  },\n  voteGroups: function voteGroups(data) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote/groups', false, 'post', data);\n  },\n  voteGroupsDetail: function voteGroupsDetail(data) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/vote/groups/detail', false, 'get', data);\n  },\n  myInviteVoteJoinList: function myInviteVoteJoinList(data) {\n    return request(COMMON_BASE_URL + subDomain + '/vote/myInviteLoinList', false, 'post', data);\n  },\n  yuyueItemPublish: function yuyueItemPublish(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/publish', false, 'post', data);\n  },\n  yuyueItems: function yuyueItems(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/items', false, 'post', data);\n  },\n  yuyueItemDetail: function yuyueItemDetail(id) {\n    var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/info', false, 'get', { id: id, token: token });\n  },\n  yuyueItemDelete: function yuyueItemDelete(token, id) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/del', false, 'post', { token: token, id: id });\n  },\n  yuyueJoin: function yuyueJoin(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/join', false, 'post', data);\n  },\n  yuyueJoinPay: function yuyueJoinPay(token, joinId) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/pay', false, 'post', {\n      token: token, joinId: joinId\n    });\n  },\n  yuyueJoinUpdate: function yuyueJoinUpdate(token, joinId, extJsonStr) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/join/update', false, 'post', {\n      token: token, joinId: joinId, extJsonStr: extJsonStr\n    });\n  },\n  yuyueLike: function yuyueLike(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/like', false, 'post', data);\n  },\n  yuyueJoinDelete: function yuyueJoinDelete(token, joinId) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/delJoin', false, 'post', {\n      token: token, id: joinId\n    });\n  },\n  yuyueServered: function yuyueServered(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/servered', false, 'post', data);\n  },\n  yuyueMyJoinInfo: function yuyueMyJoinInfo(token, joinId) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/join/info', false, 'post', {\n      token: token, joinId: joinId\n    });\n  },\n  yuyueMyJoinLogs: function yuyueMyJoinLogs(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/join/list', false, 'post', data);\n  },\n  yuyueTeams: function yuyueTeams(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/info/teams', false, 'post', data);\n  },\n  yuyueTeamDetail: function yuyueTeamDetail(teamId) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/info/team', false, 'get', { teamId: teamId });\n  },\n  yuyueTeamMembers: function yuyueTeamMembers(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/info/team/members', false, 'post', data);\n  },\n  yuyueTeamDeleteMember: function yuyueTeamDeleteMember(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/info/team/members/del', false, 'post', data);\n  },\n  yuyueFavList: function yuyueFavList(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/fav/list', false, 'post', data);\n  },\n  yuyueFavAdd: function yuyueFavAdd(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/fav/add', false, 'post', data);\n  },\n  yuyueFavDelete: function yuyueFavDelete(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/fav/delete', false, 'post', data);\n  },\n  yuyueFavCheck: function yuyueFavCheck(data) {\n    return request(COMMON_BASE_URL + subDomain + '/yuyue/fav/check', false, 'get', data);\n  },\n  register_email: function register_email(data) {\n    return request('/user/email/register', true, 'post', data);\n  },\n  login_email: function login_email(data) {\n    return request('/user/email/login', true, 'post', data);\n  },\n  bindEmail: function bindEmail(token, email, code) {\n    var pwd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/user/email/bindEmail', true, 'post', {\n      token: token, email: email, code: code, pwd: pwd\n    });\n  },\n  goodsDynamic: function goodsDynamic(type) {\n    return request('/site/goods/dynamic', true, 'get', { type: type });\n  },\n  goodsDynamicV2: function goodsDynamicV2(data) {\n    return request('/site/goods/dynamic', true, 'get', data);\n  },\n  usersDynamic: function usersDynamic(type) {\n    return request(COMMON_BASE_URL + subDomain + '/site/user/dynamic', false, 'get', { type: type });\n  },\n  fetchSubDomainByWxappAppid: function fetchSubDomainByWxappAppid(appid) {\n    return request('/subdomain/appid/wxapp', false, 'get', { appid: appid });\n  },\n  cmsArticleFavPut: function cmsArticleFavPut(token, newsId) {\n    return request('/cms/news/fav/add', true, 'post', { token: token, newsId: newsId });\n  },\n  cmsArticleFavCheck: function cmsArticleFavCheck(token, newsId) {\n    return request('/cms/news/fav/check', true, 'get', { token: token, newsId: newsId });\n  },\n  cmsArticleFavList: function cmsArticleFavList(data) {\n    return request('/cms/news/fav/list', true, 'post', data);\n  },\n  cmsArticleFavListV2: function cmsArticleFavListV2(data) {\n    return request('/cms/news/fav/list/v2', true, 'post', data);\n  },\n  cmsArticleFavDeleteById: function cmsArticleFavDeleteById(token, id) {\n    return request('/cms/news/fav/delete', true, 'post', { token: token, id: id });\n  },\n  cmsArticleFavDeleteByNewsId: function cmsArticleFavDeleteByNewsId(token, newsId) {\n    return request('/cms/news/fav/delete', true, 'post', { token: token, newsId: newsId });\n  },\n  shippingCarInfo: function shippingCarInfo(token) {\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shopping-cart/info', true, 'get', {\n      token: token, type: type\n    });\n  },\n  shippingCarInfoAddItem: function shippingCarInfoAddItem(token, goodsId, number, sku, addition) {\n    var type = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '';\n\n    return request('/shopping-cart/add', true, 'post', {\n      token: token,\n      goodsId: goodsId,\n      number: number,\n      sku: sku && sku.length > 0 ? JSON.stringify(sku) : '',\n      addition: addition && addition.length > 0 ? JSON.stringify(addition) : '',\n      type: type\n    });\n  },\n  shippingCarInfoAddItemV2: function shippingCarInfoAddItemV2(data) {\n    return request('/shopping-cart/add', true, 'post', data);\n  },\n  shippingCarInfoModifyNumber: function shippingCarInfoModifyNumber(token, key, number) {\n    var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/shopping-cart/modifyNumber', true, 'post', {\n      token: token, key: key, number: number, type: type\n    });\n  },\n  shippingCarInfoRemoveItem: function shippingCarInfoRemoveItem(token, key) {\n    var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/shopping-cart/remove', true, 'post', {\n      token: token, key: key, type: type\n    });\n  },\n  shippingCartSelected: function shippingCartSelected(token, key, selected) {\n    var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/shopping-cart/select', true, 'post', {\n      token: token, key: key, selected: selected, type: type\n    });\n  },\n  shippingCarInfoRemoveAll: function shippingCarInfoRemoveAll(token) {\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shopping-cart/empty', true, 'post', {\n      token: token, type: type\n    });\n  },\n  growthLogs: function growthLogs(data) {\n    return request('/growth/logs', true, 'post', data);\n  },\n  exchangeScoreToGrowth: function exchangeScoreToGrowth(token, deductionScore) {\n    return request('/growth/exchange', true, 'post', {\n      token: token, deductionScore: deductionScore\n    });\n  },\n  growthLogsV2: function growthLogsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/growthLog/logs', true, 'post', data);\n  },\n  exchangeScoreToGrowthV2: function exchangeScoreToGrowthV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/growthLog/exchange', true, 'post', data);\n  },\n  wxaMpLiveRooms: function wxaMpLiveRooms() {\n    return request('/wx/live/rooms', true, 'get');\n  },\n  wxaMpLiveRoomHisVedios: function wxaMpLiveRoomHisVedios(roomId) {\n    return request('/wx/live/his', true, 'get', {\n      roomId: roomId\n    });\n  },\n  peisonFeeList: function peisonFeeList() {\n    return request('/fee/peisong/list', true, 'get');\n  },\n  peisongMembers: function peisongMembers(data) {\n    return request('/peisong/member/list', true, 'post', data);\n  },\n  peisongMemberInfo: function peisongMemberInfo(token) {\n    return request('/peisong/member/info', true, 'get', {\n      token: token\n    });\n  },\n  peisongMemberChangeWorkStatus: function peisongMemberChangeWorkStatus(token) {\n    return request('/peisong/member/change-work-status', true, 'post', {\n      token: token\n    });\n  },\n  peisongOrdersGrabbing: function peisongOrdersGrabbing(token) {\n    return request('/peisong/order/grabbing', true, 'get', { token: token });\n  },\n  peisongOrders: function peisongOrders(data) {\n    return request('/peisong/order/list', true, 'post', data);\n  },\n  peisongOrderGrab: function peisongOrderGrab(data) {\n    return request('/peisong/order/grab', true, 'post', data);\n  },\n  peisongOrderDetail: function peisongOrderDetail(token, id) {\n    return request('/peisong/order/detail', true, 'get', { token: token, id: id });\n  },\n  peisongOrderEstimatedCompletionTime: function peisongOrderEstimatedCompletionTime(data) {\n    return request('/peisong/order/estimatedCompletionTime', true, 'post', data);\n  },\n  peisongStartService: function peisongStartService(data) {\n    return request('/peisong/order/start-service', true, 'post', data);\n  },\n  peisongEndService: function peisongEndService(data) {\n    return request('/peisong/order/end-service', true, 'post', data);\n  },\n  peisongEndServiceRemark: function peisongEndServiceRemark(token, id, remarkEnd) {\n    return request('/peisong/order/end-service/remarkEnd', true, 'post', { token: token, id: id, remarkEnd: remarkEnd });\n  },\n  peisongOrderAllocation: function peisongOrderAllocation(token, id, uid) {\n    return request('/peisong/order/allocation', true, 'post', {\n      token: token, id: id, uid: uid\n    });\n  },\n  siteStatistics: function siteStatistics() {\n    return request(COMMON_BASE_URL + subDomain + '/site/statistics', false, 'get');\n  },\n  orderStatistics: function orderStatistics(token) {\n    return request('/order/statistics', true, 'get', {\n      token: token\n    });\n  },\n  orderStatisticsv2: function orderStatisticsv2(data) {\n    return request('/order/statistics', true, 'get', data);\n  },\n  siteStatisticsSaleroom: function siteStatisticsSaleroom(data) {\n    return request(COMMON_BASE_URL + subDomain + '/site/statistics/saleroom', false, 'get', data);\n  },\n  siteStatisticsSaleroomYear: function siteStatisticsSaleroomYear() {\n    var year = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/site/statistics/saleroom/year', false, 'get', { year: year });\n  },\n  bonusLog: function bonusLog(data) {\n    return request('/bonusLog/list', true, 'post', data);\n  },\n  bonusLogV2: function bonusLogV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/bonusLog/list', false, 'post', data);\n  },\n  mtjAsset: function mtjAsset(token) {\n    return request('/mtj/asset', true, 'get', { token: token });\n  },\n  mtjSetting: function mtjSetting() {\n    return request('/mtj/setting', true, 'get');\n  },\n  mtjLogs: function mtjLogs(data) {\n    return request('/mtj/logs', true, 'post', data);\n  },\n  mtjStatistics: function mtjStatistics() {\n    return request('/site/statistics/mjt', true, 'get');\n  },\n  mtjTransfer: function mtjTransfer(data) {\n    return request('/mtj/transfer', true, 'post', data);\n  },\n  mtjTransferLogs: function mtjTransferLogs(data) {\n    return request('/mtj/transfer/logs', true, 'post', data);\n  },\n  mtjAssetV2: function mtjAssetV2(token) {\n    return request(COMMON_BASE_URL + subDomain + '/mtj/asset', true, 'get', { token: token });\n  },\n  mtjSettingV2: function mtjSettingV2() {\n    return request(COMMON_BASE_URL + subDomain + '/mtj/setting', true, 'get');\n  },\n  mtjLogsV2: function mtjLogsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/mtj/logs', true, 'post', data);\n  },\n  mtjStatisticsV2: function mtjStatisticsV2() {\n    return request(COMMON_BASE_URL + subDomain + '/site/statistics/mjt', true, 'get');\n  },\n  mtjTransferV2: function mtjTransferV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/mtj/transfer', true, 'post', data);\n  },\n  mtjTransferLogsV2: function mtjTransferLogsV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/mtj/transfer/logs', true, 'post', data);\n  },\n  wxOpenAuthorization: function wxOpenAuthorization(data) {\n    return request('/user/wxsns/authorization', true, 'post', data);\n  },\n  wxOpenRegister: function wxOpenRegister(data) {\n    return request('/user/wxsns/register', true, 'post', data);\n  },\n  wxOpenBindOpenid: function wxOpenBindOpenid(data) {\n    return request('/user/wxsns/bindOpenid/v2', true, 'post', data);\n  },\n  wxOpenLogin: function wxOpenLogin(data) {\n    return request('/user/wxsns/login', true, 'post', data);\n  },\n  userAttentioncheck: function userAttentioncheck(token, uid) {\n    return request('/user/attention/check', true, 'get', {\n      token: token, uid: uid\n    });\n  },\n  userAttentionAdd: function userAttentionAdd(token, uid) {\n    return request('/user/attention/add', true, 'post', {\n      token: token, uid: uid\n    });\n  },\n  userAttentionRemove: function userAttentionRemove(token, uid) {\n    return request('/user/attention/remove', true, 'post', {\n      token: token, uid: uid\n    });\n  },\n  userAttentionMeList: function userAttentionMeList(data) {\n    return request('/user/attention/attention-me', true, 'post', data);\n  },\n  userMyAttentionList: function userMyAttentionList(data) {\n    return request('/user/attention/my-attention', true, 'post', data);\n  },\n  userAttentionDetail: function userAttentionDetail(token, uid) {\n    return request('/user/attention/detail', true, 'get', {\n      token: token, uid: uid\n    });\n  },\n  userAttentionStatistics: function userAttentionStatistics(token) {\n    return request('/user/attention/statistics', true, 'get', {\n      token: token\n    });\n  },\n  cyTableToken: function cyTableToken(tableId, key) {\n    return request('/cyTable/token', true, 'post', {\n      id: tableId,\n      k: key\n    });\n  },\n  cyTableAddOrder: function cyTableAddOrder(data) {\n    return request('/cyTable/add-order', true, 'post', data);\n  },\n  cyTablePayOrder: function cyTablePayOrder(data) {\n    return request('/cyTable/pay-order', true, 'post', data);\n  },\n  cyTableInfo: function cyTableInfo(id) {\n    return request('/cyTable/info', true, 'get', { id: id });\n  },\n  cyTableList: function cyTableList(data) {\n    return request('/cyTable/list', true, 'post', data);\n  },\n  goodsTimesSchedule: function goodsTimesSchedule() {\n    var goodsId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var propertyChildIds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var brandId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n    var categoryId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n\n    return request('/shop/goods/times/schedule', true, 'post', { goodsId: goodsId, propertyChildIds: propertyChildIds, brandId: brandId, categoryId: categoryId });\n  },\n  goodsTimesDays: function goodsTimesDays(goodsId) {\n    var propertyChildIds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/shop/goods/times/days', true, 'post', { goodsId: goodsId, propertyChildIds: propertyChildIds });\n  },\n  goodsTimesDayItems: function goodsTimesDayItems(day, goodsId) {\n    var propertyChildIds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/shop/goods/times/items', true, 'post', { day: day, goodsId: goodsId, propertyChildIds: propertyChildIds });\n  },\n  goodsBrandList: function goodsBrandList(data) {\n    return request('/shop/goods/brand/list', true, 'post', data);\n  },\n  goodsBrandDetail: function goodsBrandDetail(id) {\n    return request('/shop/goods/brand/detail', true, 'get', { id: id });\n  },\n  wxappServiceLogin: function wxappServiceLogin(data) {\n    return request('/user/wxappService/login', true, 'post', data);\n  },\n  wxappServiceLoginWxaMobile: function wxappServiceLoginWxaMobile(data) {\n    return request('/user/wxappService/login/mobile', true, 'post', data);\n  },\n  wxappServiceRegisterComplex: function wxappServiceRegisterComplex(data) {\n    return request('/user/wxappService/register/complex', true, 'post', data);\n  },\n  wxappServiceRegisterSimple: function wxappServiceRegisterSimple(data) {\n    return request('/user/wxappService/register/simple', true, 'post', data);\n  },\n  wxappServiceAuthorize: function wxappServiceAuthorize(data) {\n    return request('/user/wxappService/authorize', true, 'post', data);\n  },\n  wxappServiceBindMobile: function wxappServiceBindMobile(data) {\n    return request('/user/wxappService/bindMobile', true, 'post', data);\n  },\n  wxappServiceBindMobileV2: function wxappServiceBindMobileV2(data) {\n    return request('/user/wxappService/bindMobile/v2', true, 'post', data);\n  },\n  wxappServiceBindOpenid: function wxappServiceBindOpenid(data) {\n    return request('/user/wxappService/bindOpenid', true, 'post', data);\n  },\n  wxappServiceEncryptedData: function wxappServiceEncryptedData(data) {\n    return request('/user/wxappService/decode/encryptedData', true, 'post', data);\n  },\n  trtcUserSig: function trtcUserSig(token) {\n    return request('/trtc/userSig', true, 'get', { token: token });\n  },\n  setPayPassword: function setPayPassword(token, pwd) {\n    return request('/user/paypwd/set', true, 'post', { token: token, pwd: pwd });\n  },\n  modifyPayPassword: function modifyPayPassword(token, pwdOld, pwdNew) {\n    return request('/user/paypwd/modify', true, 'post', { token: token, pwdOld: pwdOld, pwdNew: pwdNew });\n  },\n  resetPayPassword: function resetPayPassword(mobile, code, pwd) {\n    return request('/user/paypwd/reset', true, 'post', { mobile: mobile, code: code, pwd: pwd });\n  },\n  adPosition: function adPosition(key) {\n    return request('/site/adPosition/info', true, 'get', { key: key });\n  },\n  adPositionBatch: function adPositionBatch(keys) {\n    return request('/site/adPosition/batch', true, 'get', { keys: keys });\n  },\n  momentsCategory: function momentsCategory() {\n    return request('/momentsCategory/list', true, 'get');\n  },\n  momentsList: function momentsList(data) {\n    return request('/moments/list', true, 'post', data);\n  },\n  momentsdetail: function momentsdetail(id) {\n    return request('/moments/detail', true, 'get', { id: id });\n  },\n  goodsVisitLog: function goodsVisitLog(data) {\n    return request('/goods/visitLog', true, 'post', data);\n  },\n  goodsVisitLogAdd: function goodsVisitLogAdd(data) {\n    return request('/goods/visitLog/add', true, 'post', data);\n  },\n  goodsVisitLogDelete: function goodsVisitLogDelete(data) {\n    return request('/goods/visitLog/delete', true, 'post', data);\n  },\n  goodsVisitLogClear: function goodsVisitLogClear(token) {\n    return request('/goods/visitLog/clear', true, 'post', { token: token });\n  },\n  goodsVisitLogV2: function goodsVisitLogV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/goods/visitLog', false, 'post', data);\n  },\n  goodsVisitLogAddV2: function goodsVisitLogAddV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/goods/visitLog/add', false, 'post', data);\n  },\n  goodsVisitLogDeleteV2: function goodsVisitLogDeleteV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/goods/visitLog/delete', false, 'post', data);\n  },\n  goodsVisitLogClearV2: function goodsVisitLogClearV2(token) {\n    return request(COMMON_BASE_URL + subDomain + '/goods/visitLog/clear', false, 'post', { token: token });\n  },\n  channelDataPush: function channelDataPush(key, content) {\n    return request('/channelData/push', true, 'post', { key: key, content: content });\n  },\n  channelDataPull: function channelDataPull(key) {\n    return request('/channelData/pull', true, 'get', { key: key });\n  },\n  bindPartner: function bindPartner(token, partnerId) {\n    return request('/user/bindPartner', true, 'post', { token: token, uid: partnerId });\n  },\n  partnerSetting: function partnerSetting() {\n    return request('/partner/setting', true, 'get');\n  },\n  partnerBindTeamLeader: function partnerBindTeamLeader(token, uid) {\n    return request('/partner/bindTeamLeader', true, 'post', { token: token, uid: uid });\n  },\n  partnerBuyTeamLeader: function partnerBuyTeamLeader(token) {\n    return request('/partner/buy', true, 'post', { token: token });\n  },\n  partnerMembersStatistics: function partnerMembersStatistics(token) {\n    return request(COMMON_BASE_URL + subDomain + '/partner/members/statistics', false, 'get', { token: token });\n  },\n  partnerMembers: function partnerMembers(data) {\n    return request(COMMON_BASE_URL + subDomain + '/partner/members', false, 'post', data);\n  },\n  myLiveRooms: function myLiveRooms(data) {\n    return request('/liveRooms/my', true, 'post', data);\n  },\n  liveRooms: function liveRooms(data) {\n    return request('/liveRooms/list', true, 'post', data);\n  },\n  myLiveRoomsInfo: function myLiveRoomsInfo(token, id) {\n    return request('/liveRooms/my/info', true, 'get', { token: token, id: id });\n  },\n  liveRoomsInfo: function liveRoomsInfo(token, id) {\n    return request('/liveRooms/info', true, 'get', { token: token, id: id });\n  },\n  liveRoomGoodsMainly: function liveRoomGoodsMainly(data) {\n    return request('/liveRooms/goods/mainly', true, 'post', data);\n  },\n  stopLiveRoom: function stopLiveRoom(token, id) {\n    return request('/liveRooms/my/stop', true, 'post', { token: token, id: id });\n  },\n  likeLiveRoom: function likeLiveRoom(token, id) {\n    return request('/liveRooms/like', true, 'post', { token: token, id: id });\n  },\n  liveRoomOnlineUsers: function liveRoomOnlineUsers(token, roomId) {\n    return request('/websocket/rest/liveRoom/onlines', false, 'get', { token: token, roomId: roomId });\n  },\n  liveRoomKickOutUser: function liveRoomKickOutUser(token, roomId, uid) {\n    return request('/websocket/rest/liveRoom/kickOut', false, 'post', { token: token, roomId: roomId, uid: uid });\n  },\n  mockApi: function mockApi(groupName, apiName, method) {\n    return request('/mock/' + groupName + '/' + apiName, true, method);\n  },\n  tourJourneyList: function tourJourneyList(type, refId) {\n    return request('/tourJourney/list', true, 'get', { type: type, refId: refId });\n  },\n  userBankSelectBanks: function userBankSelectBanks() {\n    return request('/userBank/banks', true, 'get');\n  },\n  userBankInfo: function userBankInfo(token) {\n    return request('/userBank/info', true, 'get', { token: token });\n  },\n  userBankBind: function userBankBind(data) {\n    return request('/userBank/bind', true, 'post', data);\n  },\n  userBankUnBind: function userBankUnBind(token) {\n    return request('/userBank/unbind', true, 'post', { token: token });\n  },\n  // 京东VOP相关接口\n  jdvopGoodsList: function jdvopGoodsList(data) {\n    return request('/jdvop/' + merchantId + '/goods/list', false, 'post', data);\n  },\n  jdvopGoodsListV2: function jdvopGoodsListV2(data) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/list', false, 'post', data);\n  },\n  jdvopGoodsListV3: function jdvopGoodsListV3(data) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/v2/list', false, 'post', data);\n  },\n  jdvopGoodsCheckCanBuy: function jdvopGoodsCheckCanBuy(data) {\n    return request('/jdvop/' + merchantId + '/goods/checkCanBuy', false, 'post', data);\n  },\n  jdvopGoodsCheckCanBuyV2: function jdvopGoodsCheckCanBuyV2(data) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/checkCanBuy', false, 'post', data);\n  },\n  jdvopGoodsCheckCanBuyV3: function jdvopGoodsCheckCanBuyV3(data) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/v2/getSkusAllSaleState', false, 'post', data);\n  },\n  jdvopGoodsDetail: function jdvopGoodsDetail(goodsId) {\n    return request('/jdvop/' + merchantId + '/goods/detail', false, 'get', {\n      skuId: goodsId,\n      queryExts: 'wxintroduction'\n    });\n  },\n  jdvopGoodsDetailV2: function jdvopGoodsDetailV2(goodsId) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/detail', false, 'get', {\n      skuId: goodsId,\n      queryExts: 'wxintroduction'\n    });\n  },\n  jdvopGoodsDetailV3: function jdvopGoodsDetailV3(data) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/v2/detail', false, 'get', data);\n  },\n  jdvopGoodsSkuImages: function jdvopGoodsSkuImages(goodsId) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/skuImages', false, 'get', {\n      skuId: goodsId\n    });\n  },\n  jdvopGoodsSkuImagesV2: function jdvopGoodsSkuImagesV2(goodsId) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/v2/skuImages', false, 'get', {\n      skuId: goodsId\n    });\n  },\n  jdVopSkuGoodsSaleRule: function jdVopSkuGoodsSaleRule(skuId) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/goods/v2/checkSkuSaleList', false, 'get', { skuId: skuId });\n  },\n  jdvopCartInfo: function jdvopCartInfo(token) {\n    return request('/jdvop/' + merchantId + '/shopping-cart/info', false, 'get', {\n      token: token\n    });\n  },\n  jdvopCartAdd: function jdvopCartAdd(data) {\n    return request('/jdvop/' + merchantId + '/shopping-cart/add', false, 'post', data);\n  },\n  jdvopCartModifyNumber: function jdvopCartModifyNumber(token, key, number) {\n    return request('/jdvop/' + merchantId + '/shopping-cart/modifyNumber', false, 'post', {\n      token: token, key: key, number: number\n    });\n  },\n  jdvopCartSelect: function jdvopCartSelect(token, key, selected) {\n    return request('/jdvop/' + merchantId + '/shopping-cart/select', false, 'post', {\n      token: token, key: key, selected: selected\n    });\n  },\n  jdvopCartRemove: function jdvopCartRemove(token, key) {\n    return request('/jdvop/' + merchantId + '/shopping-cart/remove', false, 'post', {\n      token: token, key: key\n    });\n  },\n  jdvopCartEmpty: function jdvopCartEmpty(token) {\n    return request('/jdvop/' + merchantId + '/shopping-cart/empty', false, 'post', {\n      token: token\n    });\n  },\n  jdvopCartInfoV2: function jdvopCartInfoV2(token) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/shopping-cart/info', false, 'get', {\n      token: token\n    });\n  },\n  jdvopCartAddV2: function jdvopCartAddV2(data) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/shopping-cart/add', false, 'post', data);\n  },\n  jdvopCartModifyNumberV2: function jdvopCartModifyNumberV2(token, key, number) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/shopping-cart/modifyNumber', false, 'post', {\n      token: token, key: key, number: number\n    });\n  },\n  jdvopCartSelectV2: function jdvopCartSelectV2(token, key, selected) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/shopping-cart/select', false, 'post', {\n      token: token, key: key, selected: selected\n    });\n  },\n  jdvopCartRemoveV2: function jdvopCartRemoveV2(token, key) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/shopping-cart/remove', false, 'post', {\n      token: token, key: key\n    });\n  },\n  jdvopCartEmptyV2: function jdvopCartEmptyV2(token) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/shopping-cart/empty', false, 'post', {\n      token: token\n    });\n  },\n  jdvopCategory: function jdvopCategory(pid) {\n    return request('https://jdvop.apifm.com/jdvop/' + merchantId + '/category/list', false, 'get', {\n      pid: pid\n    });\n  },\n  jdvopCategory46: function jdvopCategory46(pid) {\n    return request('https://jdvop.apifm.com/jdvop/46/category/list', false, 'get', {\n      pid: pid\n    });\n  },\n  // 商家从区管进货\n  jdvopJinhuoGoods: function jdvopJinhuoGoods(data) {\n    return request('/vop/goods/list', true, 'post', data);\n  },\n  jdvopJinhuoGoodsDetail: function jdvopJinhuoGoodsDetail(token, skuId) {\n    return request('/vop/goods/detail', true, 'get', { token: token, skuId: skuId });\n  },\n  // cps\n  cpsJdGoodsCategory: function cpsJdGoodsCategory(parentId, grade) {\n    return request('/cpsJdGoods/category', true, 'get', { parentId: parentId, grade: grade });\n  },\n  cpsJdGoodsSearch: function cpsJdGoodsSearch(data) {\n    return request('/cpsJdGoods/search', true, 'post', data);\n  },\n  cpsJdGoodsDetail: function cpsJdGoodsDetail(data) {\n    return request('/cpsJdGoods/detail', true, 'get', data);\n  },\n  cpsJdGoodsSetExt: function cpsJdGoodsSetExt(data) {\n    return request('/cpsJdGoods/ext/set', true, 'post', data);\n  },\n  cpsJdGoodsQueryExt: function cpsJdGoodsQueryExt(skuId) {\n    return request('/cpsJdGoods/ext/query', true, 'get', { skuId: skuId });\n  },\n  cpsJdGoodsShotUrl: function cpsJdGoodsShotUrl(token, skuId) {\n    return request('/cpsJdGoods/shotUrl', true, 'get', { token: token, skuId: skuId });\n  },\n  cpsJdGoodsShotUrlSite: function cpsJdGoodsShotUrlSite(token, materialUrl, couponUrl) {\n    return request('/cpsJdGoods/shotUrl/site', true, 'post', { token: token, materialUrl: materialUrl, couponUrl: couponUrl });\n  },\n  cpsJdOrders: function cpsJdOrders(data) {\n    return request('/cpsJdOrder/list', true, 'post', data);\n  },\n  cpsJdOrderDetail: function cpsJdOrderDetail(token, id) {\n    return request('/cpsJdOrder/detail', true, 'get', { token: token, id: id });\n  },\n  cpsPddBeian: function cpsPddBeian(token) {\n    return request('/cpsPddGoods/beian', true, 'get', { token: token });\n  },\n  cpsPddGoodsDetail: function cpsPddGoodsDetail(data) {\n    return request('/cpsPddGoods/detail', true, 'get', data);\n  },\n  cpsPddGoodsShotUrl: function cpsPddGoodsShotUrl(token, goodsSign) {\n    return request('/cpsPddGoods/shotUrl', true, 'get', { token: token, goodsSign: goodsSign });\n  },\n  cpsPddOrders: function cpsPddOrders(data) {\n    return request('/cpsPddOrder/list', true, 'post', data);\n  },\n  cpsPddOrderDetail: function cpsPddOrderDetail(token, id) {\n    return request('/cpsPddOrder/detail', true, 'get', { token: token, id: id });\n  },\n  cpsTaobaoGoodsDetail: function cpsTaobaoGoodsDetail(data) {\n    return request('/cpsTaobaoGoods/detail', true, 'get', data);\n  },\n  cpsTaobaoGoodsShotUrl: function cpsTaobaoGoodsShotUrl(token, content) {\n    return request('/cpsTaobaoGoods/shotUrl', true, 'post', { token: token, content: content });\n  },\n  cpsTaobaoGoodsKouling: function cpsTaobaoGoodsKouling(token, content) {\n    return request('/cpsTaobaoGoods/kouling', true, 'post', { token: token, content: content });\n  },\n  // 回收\n  recycleOrders: function recycleOrders(data) {\n    return request('/recycleOrder/list', true, 'post', data);\n  },\n  recycleOrderApply: function recycleOrderApply(data) {\n    return request('/recycleOrder/apply', true, 'post', data);\n  },\n  recycleOrderDetail: function recycleOrderDetail(token, id) {\n    return request('/recycleOrder/detail', true, 'get', { token: token, id: id });\n  },\n  recycleOrderFahuo: function recycleOrderFahuo(data) {\n    return request('/recycleOrder/fahuo', true, 'post', data);\n  },\n  recycleOrderClose: function recycleOrderClose(token, id) {\n    return request('/recycleOrder/close', true, 'post', { token: token, id: id });\n  },\n  recycleOrderDelete: function recycleOrderDelete(token, id) {\n    return request('/recycleOrder/del', true, 'post', { token: token, id: id });\n  },\n  // 会员卡\n  cardList: function cardList(data) {\n    return request('/card/list', true, 'get', data);\n  },\n  cardInfo: function cardInfo(id) {\n    return request('/card/info', true, 'get', { id: id });\n  },\n  cardBuy: function cardBuy(token, id) {\n    return request('/card/buy', true, 'post', { token: token, id: id });\n  },\n  cardMyList: function cardMyList(token) {\n    return request('/card/my', true, 'get', { token: token });\n  },\n  cardMyLogs: function cardMyLogs(data) {\n    return request('/card/logs', true, 'post', data);\n  },\n  cardExchangeFromPwd: function cardExchangeFromPwd(data) {\n    return request('/card/exchange', true, 'post', data);\n  },\n  cardShareOpen: function cardShareOpen(data) {\n    return request('/card/share/open', true, 'post', data);\n  },\n  cardShareClose: function cardShareClose(data) {\n    return request('/card/share/close', true, 'post', data);\n  },\n  cardShareFetch: function cardShareFetch(data) {\n    return request('/card/share/fetch', true, 'post', data);\n  },\n  // 收藏卡片\n  collectCardHis: function collectCardHis(data) {\n    return request('/collectCard/del', true, 'post', data);\n  },\n  collectCardInfo: function collectCardInfo(number) {\n    return request('/collectCard/cardInfo', true, 'get', { number: number });\n  },\n  collectCardHisInfo: function collectCardHisInfo(token, id) {\n    return request('/collectCard/hisInfo', true, 'get', { token: token, id: id });\n  },\n  collectCardBind: function collectCardBind(data) {\n    return request('/collectCard/bind', true, 'post', data);\n  },\n  collectCardUnBind: function collectCardUnBind(token, id, smsCode) {\n    return request('/collectCard/bind', true, 'post', { token: token, id: id, smsCode: smsCode });\n  },\n  // 其他\n  bengenSaleTongjiList: function bengenSaleTongjiList(data) {\n    return request('/bengenSaleTongji/list', true, 'post', data);\n  },\n  bengenSaleTongjiRank: function bengenSaleTongjiRank(data) {\n    return request('/bengenSaleTongji/rank', true, 'get', data);\n  },\n  // 购买课程\n  courseInfoList: function courseInfoList(data) {\n    return request('/courseInfo/list', true, 'post', data);\n  },\n  courseInfo: function courseInfo(id) {\n    return request('/courseInfo/info', true, 'get', { id: id });\n  },\n  courseBuyLogPublic: function courseBuyLogPublic(data) {\n    return request('/courseBuyLog/public', true, 'post', data);\n  },\n  courseBuyLogMy: function courseBuyLogMy(data) {\n    return request('/courseBuyLog/my', true, 'post', data);\n  },\n  courseInfoBuy: function courseInfoBuy(data) {\n    return request('/courseBuyLog/buy', true, 'post', data);\n  },\n  courseInfoBuyLogPay: function courseInfoBuyLogPay(token, orderId) {\n    return request('/courseBuyLog/pay', true, 'post', { token: token, orderId: orderId });\n  },\n  courseInfoBuyLogDetail: function courseInfoBuyLogDetail(token, id) {\n    var hxNumber = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request('/courseBuyLog/detail', true, 'get', { token: token, id: id, hxNumber: hxNumber });\n  },\n  courseInfoBuyLogClose: function courseInfoBuyLogClose(token, orderId) {\n    return request('/courseBuyLog/close', true, 'post', { token: token, orderId: orderId });\n  },\n  courseInfoBuyLogDelete: function courseInfoBuyLogDelete(token, orderId) {\n    return request('/courseBuyLog/del', true, 'post', { token: token, orderId: orderId });\n  },\n  courseInfoListV2: function courseInfoListV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/courseInfo/list', false, 'post', data);\n  },\n  courseInfoV2: function courseInfoV2(id) {\n    return request(COMMON_BASE_URL + subDomain + '/courseInfo/info', false, 'get', { id: id });\n  },\n  courseBuyLogPublicV2: function courseBuyLogPublicV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/public', false, 'post', data);\n  },\n  courseBuyLogMyV2: function courseBuyLogMyV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/my', false, 'post', data);\n  },\n  courseInfoBuyV2: function courseInfoBuyV2(data) {\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/buy', false, 'post', data);\n  },\n  courseInfoBuyLogPayV2: function courseInfoBuyLogPayV2(token, orderId) {\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/pay', false, 'post', { token: token, orderId: orderId });\n  },\n  courseInfoBuyLogDetailV2: function courseInfoBuyLogDetailV2(token, id) {\n    var hxNumber = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/detail', false, 'get', { token: token, id: id, hxNumber: hxNumber });\n  },\n  courseInfoBuyLogCloseV2: function courseInfoBuyLogCloseV2(token, orderId) {\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/close', false, 'post', { token: token, orderId: orderId });\n  },\n  courseInfoBuyLogDeleteV2: function courseInfoBuyLogDeleteV2(token, orderId) {\n    return request(COMMON_BASE_URL + subDomain + '/courseBuyLog/del', false, 'post', { token: token, orderId: orderId });\n  },\n  // 橱窗\n  chuchuanSettingInfo: function chuchuanSettingInfo(uid) {\n    return request('/chuchuan/info', true, 'get', { uid: uid });\n  },\n  chuchuanSettingModify: function chuchuanSettingModify(data) {\n    return request('/chuchuan/modify', true, 'post', data);\n  },\n  chuchuanGoodsList: function chuchuanGoodsList(data) {\n    return request('/chuchuanGoods/list', true, 'post', data);\n  },\n  chuchuanGoodsAdd: function chuchuanGoodsAdd(data) {\n    return request('/chuchuanGoods/add', true, 'post', data);\n  },\n  chuchuanGoodsRemove: function chuchuanGoodsRemove(token, goodsId) {\n    return request('/chuchuanGoods/remove', true, 'post', { token: token, goodsId: goodsId });\n  },\n  chuchuanGoodsCheck: function chuchuanGoodsCheck(token, goodsId) {\n    return request('/chuchuanGoods/check', true, 'get', { token: token, goodsId: goodsId });\n  },\n  // 寄存\n  jicunGoodsList: function jicunGoodsList(data) {\n    return request('/jicunGoods/list', true, 'post', data);\n  },\n  jicunGoodsDetail: function jicunGoodsDetail(data) {\n    return request('/jicunGoods/detail', true, 'get', data);\n  },\n  // stripe\n  stripeAddCard: function stripeAddCard(data) {\n    return request('/pay/stripe/addCard', true, 'post', data);\n  },\n  stripeCardList: function stripeCardList(token) {\n    return request('/pay/stripe/cardList', true, 'get', { token: token });\n  },\n  stripeDelCard: function stripeDelCard(token, cardId) {\n    return request('/pay/stripe/deleteCard', true, 'post', { token: token, cardId: cardId });\n  },\n  stripeCharge: function stripeCharge(data) {\n    return request('/pay/stripe/charge', true, 'post', data);\n  },\n  // ocr\n  ocrBusinessLicense: function ocrBusinessLicense(imageUrl) {\n    return request(COMMON_BASE_URL + subDomain + '/ocr/businessLicense', false, 'post', { imageUrl: imageUrl });\n  },\n  ocrIdcard: function ocrIdcard(imageUrl) {\n    return request(COMMON_BASE_URL + subDomain + '/ocr/idcard', false, 'post', { imageUrl: imageUrl });\n  },\n  ocrBankcard: function ocrBankcard(imageUrl) {\n    return request(COMMON_BASE_URL + subDomain + '/ocr/bankcard', false, 'post', { imageUrl: imageUrl });\n  },\n  ocrDriverLicense: function ocrDriverLicense(imageUrl) {\n    return request(COMMON_BASE_URL + subDomain + '/ocr/driverLicense', false, 'post', { imageUrl: imageUrl });\n  },\n  // 朋友圈\n  momentsPublish: function momentsPublish(data) {\n    return request('/user/moments/publish', true, 'post', data);\n  },\n  userMomentsList: function userMomentsList(data) {\n    return request('/user/moments/list', true, 'get', data);\n  },\n  momentsDetail: function momentsDetail(token, momentsId) {\n    return request('/user/moments/detail', true, 'get', { token: token, momentsId: momentsId });\n  },\n  momentsDelete: function momentsDelete(token, momentsId) {\n    return request('/user/moments/del', true, 'post', { token: token, momentsId: momentsId });\n  },\n  momentsDeleteComment: function momentsDeleteComment(token, commentId) {\n    return request('/user/moments/delCommon', true, 'post', { token: token, commentId: commentId });\n  },\n  momentsLike: function momentsLike(token, momentsId) {\n    return request('/user/moments/like', true, 'post', { token: token, momentsId: momentsId });\n  },\n  momentsComment: function momentsComment(token, momentsId) {\n    var uid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n    var content = arguments[3];\n\n    return request('/user/moments/comment', true, 'post', { token: token, momentsId: momentsId, uid: uid, content: content });\n  },\n  momentsCommentLogs: function momentsCommentLogs(data) {\n    return request('/user/moments/logs', true, 'get', data);\n  },\n  momentsLogsRead: function momentsLogsRead(token, logsIds) {\n    return request('/user/moments/logRead', true, 'post', { token: token, logsIds: logsIds });\n  },\n  bottleMsgPublish: function bottleMsgPublish(data) {\n    return request('/bottleMsg/publish', true, 'post', data);\n  },\n  bottleMsgSalvage: function bottleMsgSalvage(token) {\n    return request('/bottleMsg/salvage', true, 'get', { token: token });\n  },\n  userInvoiceInfo: function userInvoiceInfo(token) {\n    return request('/userInvoice/info', true, 'get', { token: token });\n  },\n  userInvoiceUnbind: function userInvoiceUnbind(token) {\n    return request('/userInvoice/unbind', true, 'post', { token: token });\n  },\n  userInvoiceBind: function userInvoiceBind(data) {\n    return request('/userInvoice/bind', true, 'post', data);\n  },\n  goodsLendsList: function goodsLendsList(data) {\n    return request('/goodsLends/list', true, 'post', data);\n  },\n  goodsLendsLogs: function goodsLendsLogs(data) {\n    return request('/goodsLends/logs', true, 'post', data);\n  },\n  // 支付宝小程序\n  aliappUserRegister: function aliappUserRegister(data) {\n    return request('/user/aliapp/register', true, 'post', data);\n  },\n  aliappUserLogin: function aliappUserLogin(data) {\n    return request('/user/aliapp/login', true, 'post', data);\n  },\n  aliappUserAuthorize: function aliappUserAuthorize(data) {\n    return request('/user/aliapp/authorize', true, 'post', data);\n  },\n  aliappWebUserAuthorize: function aliappWebUserAuthorize(data) {\n    return request('/user/aliappweb/authorize', true, 'post', data);\n  },\n  aliappQrcode: function aliappQrcode(content) {\n    return request('/user/aliapp/qrcode', true, 'post', { content: content });\n  },\n  aliappMiniappBindMobile: function aliappMiniappBindMobile(data) {\n    return request('/user/aliapp/bindMobile', true, 'post', data);\n  },\n  aliappBindMobile: function aliappBindMobile(data) {\n    return request('/user/aliapp/bindMobile', true, 'post', data);\n  },\n  aliappGetMobile: function aliappGetMobile(encryptedData) {\n    return request('/user/aliapp/getMobile', true, 'post', { encryptedData: encryptedData });\n  },\n  tempDataSet: function tempDataSet(key, content) {\n    return request('/tempData/set', true, 'post', { key: key, content: content });\n  },\n  tempDataGet: function tempDataGet(key) {\n    return request('/tempData/get', true, 'get', { key: key });\n  },\n  tempDataSetV2: function tempDataSetV2(key, content) {\n    return request(COMMON_BASE_URL + merchantId + '/tempData/set', true, 'post', { key: key, content: content });\n  },\n  tempDataGetV2: function tempDataGetV2(key) {\n    return request(COMMON_BASE_URL + merchantId + '/tempData/get', true, 'get', { key: key });\n  },\n  commonDatetime: function commonDatetime() {\n    return request('/common/datetime', true, 'get');\n  },\n  commonDays: function commonDays() {\n    var startDay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var days = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/common/days', false, 'get', { startDay: startDay, days: days });\n  },\n  commonDiffMillis: function commonDiffMillis() {\n    var d1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var d2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/common/diffMillis', false, 'get', { d1: d1, d2: d2 });\n  },\n  // 企业应用 组织/成员/网盘\n  organizePrices: function organizePrices() {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/prices', true, 'get');\n  },\n  organizeCreate: function organizeCreate(data) {\n    return request(COMMON_BASE_URL + subDomain + '/organizeInfo/create', true, 'post', data);\n  },\n  organizeUpgrade: function organizeUpgrade(data) {\n    return request(COMMON_BASE_URL + subDomain + '/organizeInfo/upgrade', true, 'post', data);\n  },\n  organizeModify: function organizeModify(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/modify', true, 'post', data);\n  },\n  organizeJoinKey: function organizeJoinKey(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/joinKey', true, 'get', data);\n  },\n  organizeJoin: function organizeJoin(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/join', true, 'post', data);\n  },\n  organizeGrantAdmin: function organizeGrantAdmin(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/grantAdmin', true, 'post', data);\n  },\n  organizeKick: function organizeKick(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/kick', true, 'post', data);\n  },\n  organizeKickAllMembers: function organizeKickAllMembers(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/kickAllMembers', true, 'post', data);\n  },\n  organizeKickSelf: function organizeKickSelf(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/kickSelf', true, 'post', data);\n  },\n  organizeNick: function organizeNick(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/nick', true, 'post', data);\n  },\n  organizeDelete: function organizeDelete(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/deleteOrganize', true, 'post', data);\n  },\n  organizeMyOrganizeInfo: function organizeMyOrganizeInfo(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/myOrganizeInfo', true, 'post', data);\n  },\n  organizeDetail: function organizeDetail(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/organizeDetail', true, 'get', data);\n  },\n  organizeMembers: function organizeMembers(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeInfo/members', true, 'post', data);\n  },\n  organizeNoticeList: function organizeNoticeList(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeNotice/list', true, 'post', data);\n  },\n  organizeNoticeDetail: function organizeNoticeDetail(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeNotice/detail', true, 'get', data);\n  },\n  organizeNoticeSave: function organizeNoticeSave(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeNotice/save', true, 'post', data);\n  },\n  organizeNoticeDelete: function organizeNoticeDelete(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizeNotice/del', true, 'post', data);\n  },\n  organizePanUploadGetSignature: function organizePanUploadGetSignature(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizePan/uploadGetSignature', true, 'post', data);\n  },\n  organizePanUploadV2: function organizePanUploadV2(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizePan/upload', true, 'post', data);\n  },\n  organizePanDownloadV2: function organizePanDownloadV2(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizePan/download', true, 'get', data);\n  },\n  organizePanFiles: function organizePanFiles(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizePan/files', true, 'post', data);\n  },\n  organizePanModify: function organizePanModify(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizePan/modify', true, 'post', data);\n  },\n  organizePanDelete: function organizePanDelete(data) {\n    return request(CMS_BASE_URL + subDomain + '/organizePan/del', true, 'post', data);\n  },\n  newsExtFieldList: function newsExtFieldList(token, organizeId, newsId) {\n    return request('/newsExtField/extFields', true, 'get', { token: token, organizeId: organizeId, newsId: newsId });\n  },\n  newsExtFieldDynamic: function newsExtFieldDynamic(token, newsId) {\n    return request('/newsExtField/dynamic', true, 'get', { token: token, newsId: newsId });\n  },\n  newsExtFieldSet: function newsExtFieldSet(data) {\n    return request('/newsExtField/setField', true, 'post', data);\n  },\n  newsExtFieldInit: function newsExtFieldInit(data) {\n    return request(CMS_BASE_URL + subDomain + '/newsExtField/initFields', true, 'post', data);\n  },\n  newsExtFieldListV2: function newsExtFieldListV2(data) {\n    return request(CMS_BASE_URL + subDomain + '/newsExtField/extFields', true, 'get', data);\n  },\n  newsExtFieldDynamicV2: function newsExtFieldDynamicV2(data) {\n    return request(CMS_BASE_URL + subDomain + '/newsExtField/dynamic', true, 'get', data);\n  },\n  newsExtFieldSetV2: function newsExtFieldSetV2(data) {\n    return request(CMS_BASE_URL + subDomain + '/newsExtField/setField', true, 'post', data);\n  },\n  userAttendantList: function userAttendantList(data) {\n    return request('/user/attendant/list', true, 'post', data);\n  },\n  userAttendantDetail: function userAttendantDetail(id) {\n    var token = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/user/attendant/detail', true, 'get', { id: id, token: token });\n  },\n  userAttendantGoods: function userAttendantGoods(id) {\n    return request('/user/attendant/goods', true, 'get', { id: id });\n  },\n  userAttendantGoodsSet: function userAttendantGoodsSet(token, ids) {\n    return request('/user/attendant/goodsSet', true, 'post', { token: token, ids: ids });\n  },\n  userAttendantBindShop: function userAttendantBindShop(token, shopId) {\n    return request('/user/attendant/bindShop', true, 'post', { shopId: shopId, token: token });\n  },\n  userAttendantUnBindShop: function userAttendantUnBindShop(token) {\n    return request('/user/attendant/unbindShop', true, 'post', { token: token });\n  },\n  userAttendantChangeStatus: function userAttendantChangeStatus(data) {\n    return request('/user/attendant/changeStatus', true, 'post', data);\n  },\n  userAttendantDaysTimesAttendant: function userAttendantDaysTimesAttendant(goodsId, day) {\n    return request('/user/attendant/daysTimesAttendant', true, 'get', { goodsId: goodsId, day: day });\n  },\n  userAttendantDaysTimesAttendantSetQuery: function userAttendantDaysTimesAttendantSetQuery(token, day) {\n    return request('/user/attendant/daysTimesAttendant/set/query', true, 'get', { token: token, day: day });\n  },\n  userAttendantDaysTimesAttendantSet: function userAttendantDaysTimesAttendantSet(data) {\n    return request('/user/attendant/daysTimesAttendant/set', true, 'post', data);\n  },\n  userAttendantListReputation: function userAttendantListReputation(data) {\n    return request('/user/attendant/listReputation', true, 'post', data);\n  },\n  userAttendantShowPics: function userAttendantShowPics(id) {\n    return request('/user/attendant/showPics', true, 'get', { id: id });\n  },\n  userAttendantShowPicsAdd: function userAttendantShowPicsAdd(token, url) {\n    return request('/user/attendant/showPicsAdd', true, 'post', { token: token, url: url });\n  },\n  userAttendantShowPicsDel: function userAttendantShowPicsDel(token, id) {\n    return request('/user/attendant/showPicsDel', true, 'post', { token: token, id: id });\n  },\n  userAttendantUpdate: function userAttendantUpdate(data) {\n    return request('/user/attendant/update', true, 'post', data);\n  },\n  userAttendantOrderServing: function userAttendantOrderServing(token, orderId) {\n    return request('/order/serving', true, 'post', { token: token, orderId: orderId });\n  },\n  userAttendantOrderRejectOrder: function userAttendantOrderRejectOrder(token, orderId) {\n    return request('/order/rejectOrder', true, 'post', { token: token, orderId: orderId });\n  },\n  userAttendantOrderSuccess: function userAttendantOrderSuccess(token, orderId) {\n    return request('/order/success', true, 'post', { token: token, orderId: orderId });\n  },\n  shopCategory: function shopCategory() {\n    return request('/shopCategory/all', true, 'get');\n  },\n  shopCategoryDetail: function shopCategoryDetail(id) {\n    return request('/shopCategory/info', true, 'get', { id: id });\n  },\n  yudingStatistics: function yudingStatistics(day) {\n    return request('/shop/goods/yudingStatistics', true, 'get', { day: day });\n  },\n  contactList: function contactList() {\n    return request('/contact/list', true, 'get');\n  },\n  distributedLock: function distributedLock(key, seconds) {\n    return request('/distributedLock/lock', true, 'get', { key: key, seconds: seconds });\n  },\n  distributedLockRelease: function distributedLockRelease(key) {\n    return request('/distributedLock/lock', true, 'get', { key: key });\n  },\n  communitySetting: function communitySetting() {\n    return request('/community/setting', true, 'get');\n  },\n  communityLeaderApply: function communityLeaderApply(data) {\n    return request('/communityLeader/apply', true, 'post', data);\n  },\n  communityLeaderApplyInfo: function communityLeaderApplyInfo(token) {\n    return request('/communityLeader/apply/info', true, 'get', { token: token });\n  },\n  communityLeaderBuy: function communityLeaderBuy(token) {\n    return request('/communityLeader/buy', true, 'post', { token: token });\n  },\n  communityOrderFahuo: function communityOrderFahuo(data) {\n    return request('/communityOrder/fahuo', true, 'post', data);\n  },\n  wxmpOpenid: function wxmpOpenid(code) {\n    return request('/user/wxmp/openid', true, 'get', { code: code });\n  },\n  listingSet: function listingSet() {\n    return request('/listingSet/info', true, 'get');\n  },\n  listingMyListing: function listingMyListing(token) {\n    return request('/listingInfo/myListing', true, 'get', { token: token });\n  },\n  listingSave: function listingSave(data) {\n    return request('/listingInfo/save', true, 'post', data);\n  },\n  listingDetail: function listingDetail(id) {\n    return request('/listingInfo/detail', true, 'get', { id: id });\n  },\n  listingCancel: function listingCancel(token, id) {\n    return request('/listingInfo/cancel', true, 'post', { token: token, id: id });\n  },\n  listingSuccess: function listingSuccess(token, id) {\n    return request('/listingInfo/success', true, 'post', { token: token, id: id });\n  },\n  listingDelete: function listingDelete(token, id) {\n    return request('/listingInfo/delete', true, 'post', { token: token, id: id });\n  },\n  listingAddGoods: function listingAddGoods(data) {\n    return request('/listingInfo/addGoods', true, 'post', data);\n  },\n  listingRemoveGoods: function listingRemoveGoods(data) {\n    return request('/listingInfo/removeGoods', true, 'post', data);\n  },\n  listingJoinList: function listingJoinList(data) {\n    return request('/listingInfo/joinList', true, 'post', data);\n  },\n  attendantAcceptOrder: function attendantAcceptOrder(data) {\n    return request('/order/acceptOrder', true, 'post', data);\n  },\n  orderCancelOrderPeriod: function orderCancelOrderPeriod(data) {\n    return request('/order/cancelOrderPeriod', true, 'post', data);\n  },\n  orderStartOrderPeriod: function orderStartOrderPeriod(data) {\n    return request('/order/startOrderPeriod', true, 'post', data);\n  },\n  shansongCourierInfo: function shansongCourierInfo(data) {\n    return request('/order/shansongCourierInfo', true, 'get', data);\n  },\n  shansongOrderInfo: function shansongOrderInfo(data) {\n    return request('/order/shansongOrderInfo', true, 'get', data);\n  },\n  userAttendantOrderStatistics: function userAttendantOrderStatistics(data) {\n    return request('/order/statisticsJishi', true, 'get', data);\n  },\n  keloopOrderLogs: function keloopOrderLogs(data) {\n    return request('/order/keloop/orderLogs', true, 'get', data);\n  },\n  keloopCourierTag: function keloopCourierTag(data) {\n    return request('/order/keloop/courierTag', true, 'get', data);\n  },\n  workingHoursMySubmitLogs: function workingHoursMySubmitLogs(data) {\n    return request('/workingHours/mySubmitLogs', true, 'post', data);\n  },\n  workingHoursSubmit: function workingHoursSubmit(data) {\n    return request('/workingHours/submit', true, 'post', data);\n  },\n  workingHoursBossReport: function workingHoursBossReport(data) {\n    return request('/workingHours/bossReport', true, 'post', data);\n  },\n  workingHoursMyProject: function workingHoursMyProject(data) {\n    return request('/workingHours/myProject', true, 'post', data);\n  },\n  workingHoursProjectInfo: function workingHoursProjectInfo(code) {\n    return request('/workingHours/project', true, 'get', { code: code });\n  },\n  bestpayProCreateOrder: function bestpayProCreateOrder(data) {\n    return request('/pay/bestpay/proCreateOrder', true, 'post', data);\n  },\n  bestpayH5: function bestpayH5(data) {\n    return request('/pay/bestpay/h5', true, 'get', data);\n  },\n  shopIotDevices: function shopIotDevices(data) {\n    return request('/shopIot/devices', true, 'get', data);\n  },\n  shopIotCmds: function shopIotCmds(data) {\n    return request('/shopIot/cmds', true, 'get', data);\n  },\n  shopIotExecute: function shopIotExecute(data) {\n    return request('/shopIot/execute', true, 'post', data);\n  },\n  wxTemplateNumberList: function wxTemplateNumberList(token) {\n    return request('/wxTemplateNumber/list', true, 'get', { token: token });\n  },\n  wxTemplateNumberSubscribe: function wxTemplateNumberSubscribe(data) {\n    return request('/wxTemplateNumber/subscribe', true, 'post', data);\n  },\n  errandsTaskPublish: function errandsTaskPublish(data) {\n    return request('/errandsTask/publish', true, 'post', data);\n  },\n  errandsTaskPay: function errandsTaskPay(data) {\n    return request('/errandsTask/pay', true, 'post', data);\n  },\n  errandsTaskAccept: function errandsTaskAccept(data) {\n    return request('/errandsTask/accept', true, 'post', data);\n  },\n  errandsTaskFinish: function errandsTaskFinish(data) {\n    return request('/errandsTask/finish', true, 'post', data);\n  },\n  errandsTaskSuccess: function errandsTaskSuccess(data) {\n    return request('/errandsTask/success', true, 'post', data);\n  },\n  activityVoteInfoList: function activityVoteInfoList(data) {\n    return request('/activityVoteInfo/list', true, 'post', data);\n  },\n  activityVoteInfoJoinList: function activityVoteInfoJoinList(data) {\n    return request('/activityVoteInfo/joinList', true, 'post', data);\n  },\n  activityVoteInfoDetail: function activityVoteInfoDetail(id) {\n    return request('/activityVoteInfo/detail', true, 'get', { id: id });\n  },\n  activityVoteInfoJoinDetail: function activityVoteInfoJoinDetail(joinId) {\n    return request('/activityVoteInfo/joinDetail', true, 'get', { joinId: joinId });\n  },\n  activityVoteInfoScoreToVotes: function activityVoteInfoScoreToVotes(activityId) {\n    return request('/activityVoteInfo/scoreToVotes', true, 'get', { activityId: activityId });\n  },\n  activityVoteInfoFetchVoteNumber: function activityVoteInfoFetchVoteNumber(data) {\n    return request('/activityVoteInfo/fetchVoteNumber', true, 'post', data);\n  },\n  activityVoteInfoJoin: function activityVoteInfoJoin(data) {\n    return request('/activityVoteInfo/join', true, 'post', data);\n  },\n  activityVoteInfoVote: function activityVoteInfoVote(data) {\n    return request('/activityVoteInfo/vote', true, 'post', data);\n  },\n  activityVoteBlance: function activityVoteBlance(token, activityId) {\n    return request('/activityVoteInfo/balance', true, 'get', { token: token, activityId: activityId });\n  },\n  stringsToPlainText: function stringsToPlainText(content) {\n    var len = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n    return request('/common/strings/plainText', true, 'post', { content: content, len: len });\n  },\n  blindBoxFriendsMatch: function blindBoxFriendsMatch(data) {\n    return request('/blindBoxFriends/match', true, 'post', data);\n  },\n  blindBoxFriendsPush: function blindBoxFriendsPush(data) {\n    return request('/blindBoxFriends/push', true, 'post', data);\n  },\n  blindBoxFriendsPay: function blindBoxFriendsPay(data) {\n    return request('/blindBoxFriends/pay', true, 'post', data);\n  },\n  blindBoxFriendsChangeStatus: function blindBoxFriendsChangeStatus(data) {\n    return request('/blindBoxFriends/changeStatus', true, 'post', data);\n  },\n  blindBoxFriendsDelete: function blindBoxFriendsDelete(data) {\n    return request('/blindBoxFriends/delete', true, 'post', data);\n  },\n  blindBoxFriendsPullLogs: function blindBoxFriendsPullLogs(data) {\n    return request('/blindBoxFriends/pullLogs', true, 'post', data);\n  },\n  blindBoxFriendsPushLogs: function blindBoxFriendsPushLogs(data) {\n    return request('/blindBoxFriends/pushLogs', true, 'post', data);\n  },\n  blindBoxFriendsRechargeRule: function blindBoxFriendsRechargeRule() {\n    return request('/blindBoxFriends/rechargeRule', true, 'get');\n  },\n  blindBoxFriendsBuyPullTimes: function blindBoxFriendsBuyPullTimes(data) {\n    return request('/blindBoxFriends/buyPullTimes', true, 'post', data);\n  },\n  blindBoxFriendsUnlock: function blindBoxFriendsUnlock(data) {\n    return request('/blindBoxFriends/unlock', true, 'post', data);\n  },\n  blindBoxFriendsBalance: function blindBoxFriendsBalance(token) {\n    return request('/blindBoxFriends/balance', true, 'get', { token: token });\n  },\n  cpactivityInfoDetail: function cpactivityInfoDetail(id) {\n    return request('/cpactivityInfo/detail', true, 'get', { id: id });\n  },\n  cpactivityUpdateUserInfo: function cpactivityUpdateUserInfo(data) {\n    return request('/cpactivityInfo/updateUserInfo', true, 'post', data);\n  },\n  cpactivityJoinDetail: function cpactivityJoinDetail(data) {\n    return request('/cpactivityInfo/join', true, 'get', data);\n  },\n  cpactivityJoin: function cpactivityJoin(data) {\n    return request('/cpactivityInfo/join', true, 'post', data);\n  },\n  cpactivityJoinDynamics: function cpactivityJoinDynamics(cpactivityId) {\n    return request('/cpactivityInfo/joinDynamics', true, 'get', { cpactivityId: cpactivityId });\n  },\n  cpactivityPay: function cpactivityPay(data) {\n    return request('/cpactivityInfo/pay', true, 'post', data);\n  },\n  volcesArkCreateChatCompletion: function volcesArkCreateChatCompletion(message) {\n    return request(COMMON_BASE_URL + subDomain + '/volcesArk/createChatCompletion', false, 'post', { message: message });\n  },\n  volcesArkChatCompletionResult: function volcesArkChatCompletionResult(key) {\n    return request(COMMON_BASE_URL + subDomain + '/volcesArk/result', false, 'get', { key: key });\n  }\n};\n\n/***/ })\n/******/ ]);"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/index/index.js",
    "content": "const main = {\n    /**\n     * 渲染块\n     * @param {Object} params\n     */\n    drawBlock({ text, width = 0, height, x, y, paddingLeft = 0, paddingRight = 0, borderWidth, backgroundColor, borderColor, borderRadius = 0, opacity = 1 }) {\n        // 判断是否块内有文字\n        let blockWidth = 0; // 块的宽度\n        let textX = 0;\n        let textY = 0;\n        if (typeof text !== 'undefined') {\n            // 如果有文字并且块的宽度小于文字宽度，块的宽度为 文字的宽度 + 内边距\n            const textWidth = this._getTextWidth(typeof text.text === 'string' ? text : text.text);\n            blockWidth = textWidth > width ? textWidth : width;\n            blockWidth += paddingLeft + paddingLeft;\n\n            const { textAlign = 'left', text: textCon } = text;\n            textY = height / 2 + y; // 文字的y轴坐标在块中线\n            if (textAlign === 'left') {\n                // 如果是右对齐，那x轴在块的最左边\n                textX = x + paddingLeft;\n            } else if (textAlign === 'center') {\n                textX = blockWidth / 2 + x;\n            } else {\n                textX = x + blockWidth - paddingRight;\n            }\n        } else {\n            blockWidth = width;\n        }\n\n        if (backgroundColor) {\n            // 画面\n            this.ctx.save();\n            this.ctx.setGlobalAlpha(opacity);\n            this.ctx.setFillStyle(backgroundColor);\n            if (borderRadius > 0) {\n                // 画圆角矩形\n                this._drawRadiusRect(x, y, blockWidth, height, borderRadius);\n                this.ctx.fill();\n            } else {\n                this.ctx.fillRect(this.toPx(x), this.toPx(y), this.toPx(blockWidth), this.toPx(height));\n            }\n            this.ctx.restore();\n        }\n        if (borderWidth) {\n            // 画线\n            this.ctx.save();\n            this.ctx.setGlobalAlpha(opacity);\n            this.ctx.setStrokeStyle(borderColor);\n            this.ctx.setLineWidth(this.toPx(borderWidth));\n            if (borderRadius > 0) {\n                // 画圆角矩形边框\n                this._drawRadiusRect(x, y, blockWidth, height, borderRadius);\n                this.ctx.stroke();\n            } else {\n                this.ctx.strokeRect(this.toPx(x), this.toPx(y), this.toPx(blockWidth), this.toPx(height));\n            }\n            this.ctx.restore();\n        }\n\n        if (text) {\n            this.drawText(Object.assign(text, { x: textX, y: textY }))\n        }\n    },\n\n    /**\n     * 渲染文字\n     * @param {Object} params\n     */\n    drawText(params) {\n        const { x, y, fontSize, color, baseLine, textAlign, text, opacity = 1, width, lineNum, lineHeight } = params;\n        if (Object.prototype.toString.call(text) === '[object Array]') {\n            let preText = { x, y, baseLine };\n            text.forEach(item => {\n                preText.x += item.marginLeft || 0;\n                const textWidth = this._drawSingleText(Object.assign(item, {\n                    ...preText,\n                }));\n                preText.x += textWidth + (item.marginRight || 0); // 下一段字的x轴为上一段字x + 上一段字宽度\n            })\n        } else {\n            this._drawSingleText(params);\n        }\n    },\n\n    /**\n     * 渲染图片\n     */\n    drawImage(data) {\n        const { imgPath, x, y, w, h, sx, sy, sw, sh, borderRadius = 0, borderWidth = 0, borderColor } = data;\n        this.ctx.save();\n        if (borderRadius > 0) {\n            this._drawRadiusRect(x, y, w, h, borderRadius);\n            this.ctx.strokeStyle = 'rgba(255,255,255,0)';\n            this.ctx.stroke();\n            this.ctx.clip();\n            this.ctx.drawImage(imgPath, this.toPx(sx), this.toPx(sy), this.toPx(sw), this.toPx(sh), this.toPx(x), this.toPx(y), this.toPx(w), this.toPx(h));\n            if (borderWidth > 0) {\n                this.ctx.setStrokeStyle(borderColor);\n                this.ctx.setLineWidth(this.toPx(borderWidth));\n                this.ctx.stroke();\n            }\n        } else {\n            this.ctx.drawImage(imgPath, this.toPx(sx), this.toPx(sy), this.toPx(sw), this.toPx(sh), this.toPx(x), this.toPx(y), this.toPx(w), this.toPx(h));\n        }\n        this.ctx.restore();\n    },\n    /**\n     * 渲染线\n     * @param {*} param0\n     */\n    drawLine({ startX, startY, endX, endY, color, width }) {\n        this.ctx.save();\n        this.ctx.beginPath();\n        this.ctx.setStrokeStyle(color);\n        this.ctx.setLineWidth(this.toPx(width));\n        this.ctx.moveTo(this.toPx(startX), this.toPx(startY));\n        this.ctx.lineTo(this.toPx(endX), this.toPx(endY));\n        this.ctx.stroke();\n        this.ctx.closePath();\n        this.ctx.restore();\n    },\n    downloadResource({ images = [], pixelRatio = 1 }) {\n        const drawList = [];\n        this.drawArr = [];\n        images.forEach((image, index) => drawList.push(this._downloadImageAndInfo(image, index, pixelRatio)));\n        return Promise.all(drawList);\n    },\n    initCanvas(w, h, debug) {\n        return new Promise((resolve) => {\n            this.setData({\n                pxWidth: this.toPx(w),\n                pxHeight: this.toPx(h),\n                debug,\n            }, resolve);\n        });\n    }\n}\nconst handle = {\n    /**\n     * 画圆角矩形\n     */\n    _drawRadiusRect(x, y, w, h, r) {\n        const br = r / 2;\n        this.ctx.beginPath();\n        this.ctx.moveTo(this.toPx(x + br), this.toPx(y));    // 移动到左上角的点\n        this.ctx.lineTo(this.toPx(x + w - br), this.toPx(y));\n        this.ctx.arc(this.toPx(x + w - br), this.toPx(y + br), this.toPx(br), 2 * Math.PI * (3 / 4), 2 * Math.PI * (4 / 4))\n        this.ctx.lineTo(this.toPx(x + w), this.toPx(y + h - br));\n        this.ctx.arc(this.toPx(x + w - br), this.toPx(y + h - br), this.toPx(br), 0, 2 * Math.PI * (1 / 4))\n        this.ctx.lineTo(this.toPx(x + br), this.toPx(y + h));\n        this.ctx.arc(this.toPx(x + br), this.toPx(y + h - br), this.toPx(br), 2 * Math.PI * (1 / 4), 2 * Math.PI * (2 / 4))\n        this.ctx.lineTo(this.toPx(x), this.toPx(y + br));\n        this.ctx.arc(this.toPx(x + br), this.toPx(y + br), this.toPx(br), 2 * Math.PI * (2 / 4), 2 * Math.PI * (3 / 4))\n    },\n    /**\n     * 计算文本长度\n     * @param {Array|Object}} text 数组 或者 对象\n     */\n    _getTextWidth(text) {\n        let texts = [];\n        if (Object.prototype.toString.call(text) === '[object Object]') {\n            texts.push(text);\n        } else {\n            texts = text;\n        }\n        let width = 0;\n        texts.forEach(({ fontSize, text, marginLeft = 0, marginRight = 0 }) => {\n            this.ctx.setFontSize(this.toPx(fontSize));\n            width += this.ctx.measureText(text).width + marginLeft + marginRight;\n        })\n\n        return this.toRpx(width);\n    },\n    /**\n     * 渲染一段文字\n     */\n    _drawSingleText({ x, y, fontSize, color, baseLine, textAlign = 'left', text, opacity = 1, textDecoration = 'none',\n      width, lineNum = 1, lineHeight = 0, fontWeight = 'normal', fontStyle = 'normal', fontFamily = \"sans-serif\"}) {\n        this.ctx.save();\n        this.ctx.beginPath();\n        this.ctx.font = fontStyle + \" \" + fontWeight + \" \" + this.toPx(fontSize, true) + \"px \" + fontFamily\n        this.ctx.setGlobalAlpha(opacity);\n        // this.ctx.setFontSize(this.toPx(fontSize));\n        this.ctx.setFillStyle(color);\n        this.ctx.setTextBaseline(baseLine);\n        this.ctx.setTextAlign(textAlign);\n        let textWidth = this.toRpx(this.ctx.measureText(text).width);\n        const textArr = [];\n         if (textWidth > width) {\n          // 文本宽度 大于 渲染宽度\n          let fillText = '';\n          let line = 1;\n          for (let i = 0; i <= text.length - 1 ; i++) {  // 将文字转为数组，一行文字一个元素\n            fillText = fillText + text[i];\n            if (this.toRpx(this.ctx.measureText(fillText).width) >= width) {\n              if (line === lineNum) {\n                if (i !== text.length - 1) {\n                  fillText = fillText.substring(0, fillText.length - 1) + '...';\n                }\n              }\n              if(line <= lineNum) {\n                textArr.push(fillText);\n              }\n              fillText = '';\n              line++;\n            } else {\n              if(line <= lineNum) {\n                if(i === text.length -1){\n                   textArr.push(fillText);\n                }\n              }\n            }\n          }\n          textWidth = width;\n        } else {\n          textArr.push(text);\n        }\n\n        textArr.forEach((item, index) => {\n            this.ctx.fillText(item, this.toPx(x), this.toPx(y + (lineHeight || fontSize) * index));\n        })\n\n        this.ctx.restore();\n\n        // textDecoration\n        if (textDecoration !== 'none') {\n            let lineY = y;\n            if (textDecoration === 'line-through') {\n                // 目前只支持贯穿线\n                lineY = y;\n\n                // 小程序画布baseLine偏移阈值\n                let threshold = 5;\n\n                // 根据baseLine的不同对贯穿线的Y坐标做相应调整\n                switch (baseLine) {\n                  case 'top':\n                    lineY += fontSize / 2 + threshold;\n                    break;\n                  case 'middle':\n                    break;\n                  case 'bottom':\n                    lineY -= fontSize / 2 + threshold;\n                    break;\n                  default:\n                    lineY -= fontSize / 2 - threshold;\n                    break;\n                }\n            }\n            this.ctx.save();\n            this.ctx.moveTo(this.toPx(x), this.toPx(lineY));\n            this.ctx.lineTo(this.toPx(x) + this.toPx(textWidth), this.toPx(lineY));\n            this.ctx.setStrokeStyle(color);\n            this.ctx.stroke();\n            this.ctx.restore();\n        }\n\n        return textWidth;\n    },\n}\nconst helper = {\n    /**\n      * 下载图片并获取图片信息\n      */\n    _downloadImageAndInfo(image, index, pixelRatio) {\n        return new Promise((resolve, reject) => {\n            const { x, y, url, zIndex } = image;\n            const imageUrl = url;\n            // 下载图片\n            this._downImage(imageUrl, index)\n                // 获取图片信息\n                .then(imgPath => this._getImageInfo(imgPath, index))\n                .then(({ imgPath, imgInfo }) => {\n                    // 根据画布的宽高计算出图片绘制的大小，这里会保证图片绘制不变形\n                    let sx;\n                    let sy;\n                    const borderRadius = image.borderRadius || 0;\n                    const setWidth = image.width;\n                    const setHeight = image.height;\n                    const width = this.toRpx(imgInfo.width / pixelRatio);\n                    const height = this.toRpx(imgInfo.height / pixelRatio);\n\n                    if (width / height <= setWidth / setHeight) {\n                        sx = 0;\n                        sy = (height - ((width / setWidth) * setHeight)) / 2;\n                    } else {\n                        sy = 0;\n                        sx = (width - ((height / setHeight) * setWidth)) / 2;\n                    }\n                    this.drawArr.push({\n                        type: 'image',\n                        borderRadius,\n                        borderWidth: image.borderWidth,\n                        borderColor: image.borderColor,\n                        zIndex: typeof zIndex !== 'undefined' ? zIndex : index,\n                        imgPath,\n                        sx,\n                        sy,\n                        sw: (width - (sx * 2)),\n                        sh: (height - (sy * 2)),\n                        x,\n                        y,\n                        w: setWidth,\n                        h: setHeight,\n                    });\n                    resolve();\n                })\n                .catch(err => reject(err));\n        });\n    },\n    /**\n     * 下载图片资源\n     * @param {*} imageUrl\n     */\n    _downImage(imageUrl) {\n        return new Promise((resolve, reject) => {\n            if (/^http/.test(imageUrl) && !new RegExp(wx.env.USER_DATA_PATH).test(imageUrl)) {\n                wx.downloadFile({\n                    url: this._mapHttpToHttps(imageUrl),\n                    success: (res) => {\n                        if (res.statusCode === 200) {\n                            resolve(res.tempFilePath);\n                        } else {\n                            reject(res.errMsg);\n                        }\n                    },\n                    fail(err) {\n                        reject(err);\n                    },\n                });\n            } else {\n                // 支持本地地址\n                resolve(imageUrl);\n            }\n        });\n    },\n    /**\n     * 获取图片信息\n     * @param {*} imgPath\n     * @param {*} index\n     */\n    _getImageInfo(imgPath, index) {\n        return new Promise((resolve, reject) => {\n            wx.getImageInfo({\n                src: imgPath,\n                success(res) {\n                    resolve({ imgPath, imgInfo: res, index });\n                },\n                fail(err) {\n                    reject(err);\n                },\n            });\n        });\n    },\n    toPx(rpx, int) {\n      if (int) {\n        return parseInt(rpx * this.factor * this.pixelRatio);\n      }\n      return rpx * this.factor * this.pixelRatio;\n\n    },\n    toRpx(px, int) {\n      if (int) {\n        return parseInt(px / this.factor);\n      }\n      return px / this.factor;\n    },\n    /**\n     * 将http转为https\n     * @param {String}} rawUrl 图片资源url\n     */\n    _mapHttpToHttps(rawUrl) {\n        if (rawUrl.indexOf(':') < 0) {\n            return rawUrl;\n        }\n        const urlComponent = rawUrl.split(':');\n        if (urlComponent.length === 2) {\n            if (urlComponent[0] === 'http') {\n                urlComponent[0] = 'https';\n                return `${urlComponent[0]}:${urlComponent[1]}`;\n            }\n        }\n        return rawUrl;\n    },\n}\nComponent({\n    properties: {\n    },\n    created() {\n        const sysInfo = wx.getSystemInfoSync();\n        const screenWidth = sysInfo.screenWidth;\n        this.factor = screenWidth / 750;\n    },\n    methods: Object.assign({\n        /**\n         * 计算画布的高度\n         * @param {*} config\n         */\n        getHeight(config) {\n            const getTextHeight = (text) => {\n                let fontHeight = text.lineHeight || text.fontSize;\n                let height = 0;\n                if (text.baseLine === 'top') {\n                    height = fontHeight;\n                } else if (text.baseLine === 'middle') {\n                    height = fontHeight / 2;\n                } else {\n                    height = 0;\n                }\n                return height;\n            }\n            const heightArr = [];\n            (config.blocks || []).forEach((item) => {\n                heightArr.push(item.y + item.height);\n            });\n            (config.texts  || []).forEach((item) => {\n                let height;\n                if (Object.prototype.toString.call(item.text) === '[object Array]') {\n                    item.text.forEach((i) => {\n                        height = getTextHeight({...i, baseLine: item.baseLine});\n                        heightArr.push(item.y + height);\n                    });\n                } else {\n                    height = getTextHeight(item);\n                    heightArr.push(item.y + height);\n                }\n            });\n            (config.images || []).forEach((item) => {\n                heightArr.push(item.y + item.height);\n            });\n            (config.lines || []).forEach((item) => {\n                heightArr.push(item.startY);\n                heightArr.push(item.endY);\n            });\n            const sortRes = heightArr.sort((a, b) => b - a);\n            let canvasHeight = 0;\n            if (sortRes.length > 0) {\n                canvasHeight = sortRes[0];\n            }\n            if (config.height < canvasHeight || !config.height) {\n                return canvasHeight;\n            } else {\n                return config.height;\n            }\n        },\n        create(config) {\n            this.ctx = wx.createCanvasContext('canvasid', this);\n\n            this.pixelRatio = config.pixelRatio || 1;\n            const height = this.getHeight(config);\n            this.initCanvas(config.width, height, config.debug)\n                .then(() => {\n                    // 设置画布底色\n                    if (config.backgroundColor) {\n                        this.ctx.save();\n                        this.ctx.setFillStyle(config.backgroundColor);\n                        this.ctx.fillRect(0, 0, this.toPx(config.width), this.toPx(height));\n                        this.ctx.restore();\n                    }\n                    const { texts = [], images = [], blocks = [], lines = [] } = config;\n                    const queue = this.drawArr\n                        .concat(texts.map((item) => {\n                            item.type = 'text';\n                            item.zIndex = item.zIndex || 0;\n                            return item;\n                        }))\n                        .concat(blocks.map((item) => {\n                            item.type = 'block';\n                            item.zIndex = item.zIndex || 0;\n                            return item;\n                        }))\n                        .concat(lines.map((item) => {\n                            item.type = 'line';\n                            item.zIndex = item.zIndex || 0;\n                            return item;\n                        }));\n                    // 按照顺序排序\n                    queue.sort((a, b) => a.zIndex - b.zIndex);\n\n                    queue.forEach((item) => {\n                        if (item.type === 'image') {\n                            this.drawImage(item)\n                        } else if (item.type === 'text') {\n                            this.drawText(item)\n                        } else if (item.type === 'block') {\n                            this.drawBlock(item)\n                        } else if (item.type === 'line') {\n                            this.drawLine(item)\n                        }\n                    });\n\n                    const res = wx.getSystemInfoSync();\n                    const platform = res.platform;\n                    let time = 0;\n                    if (platform === 'android') {\n                        // 在安卓平台，经测试发现如果海报过于复杂在转换时需要做延时，要不然样式会错乱\n                        time = 300;\n                    }\n                    this.ctx.draw(false, () => {\n                        setTimeout(() => {\n                            wx.canvasToTempFilePath({\n                                canvasId: 'canvasid',\n                                success: (res) => {\n                                    this.triggerEvent('success', res.tempFilePath);\n                                },\n                                fail: (err) => {\n                                    this.triggerEvent('fail', err);\n                                },\n                            }, this);\n                        }, time);\n                    });\n                })\n                .catch((err) => {\n                    wx.showToast({ icon: 'none', title: err.errMsg || '生成失败' });\n                    console.error(err);\n                });\n        },\n    }, main, handle, helper),\n});\n\n"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/index/index.json",
    "content": "{\n    \"component\": true\n}"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/index/index.wxml",
    "content": "<!--index.wxml-->\n<view class=\"container\">\n  <canvas canvas-id='canvasid' class=\"canvas {{debug ? 'debug' : 'pro'}}\" style='width: {{pxWidth}}px; height: {{pxHeight}}px;'></canvas>\n</view>\n"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/index/index.wxss",
    "content": ".canvas {\n    width: 750rpx;\n    height: 750rpx;\n}\n.canvas.pro {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    transform: translate3d(-9999rpx, 0, 0);\n}\n.canvas.debug {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    border: 1rpx solid #ccc;\n}"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/poster/index.js",
    "content": "Component({\n    properties: {\n        config: {\n            type: Object,\n            value: {},\n        },\n        preload: {  // 是否预下载图片资源\n            type: Boolean,\n            value: false,\n        },\n        hideLoading: {  // 是否隐藏loading\n            type: Boolean,\n            value: false,\n        }\n    },\n    ready() {\n        if (this.data.preload) {\n            const poster = this.selectComponent('#poster');\n            this.downloadStatus = 'doing';\n            poster.downloadResource(this.data.config).then(() => {\n                this.downloadStatus = 'success';\n                this.trigger('downloadSuccess');\n            }).catch((e) => {\n                this.downloadStatus = 'fail';\n                this.trigger('downloadFail', e);\n            });\n        }\n    },\n    methods: {\n        trigger(event, data) {\n            if (this.listener && typeof this.listener[event] === 'function') {\n                this.listener[event](data);\n            }\n        },\n        once(event, fun) {\n            if (typeof this.listener === 'undefined') {\n                this.listener = {};\n            }\n            this.listener[event] = fun;\n        },\n        downloadResource(reset) {\n            return new Promise((resolve, reject) => {\n                if (reset) {\n                    this.downloadStatus = null;\n                }\n                const poster = this.selectComponent('#poster');\n                if (this.downloadStatus && this.downloadStatus !== 'fail') {\n                    if (this.downloadStatus === 'success') {\n                        resolve();\n                    } else {\n                        this.once('downloadSuccess', () => resolve());\n                        this.once('downloadFail', (e) => reject(e));\n                    }\n                } else {\n                    poster.downloadResource(this.data.config)\n                        .then(() => {\n                            this.downloadStatus = 'success';\n                            resolve();\n                        })\n                        .catch((e) => reject(e));\n                }  \n            })\n        },\n        onCreate(reset = false) {\n            !this.data.hideLoading && wx.showLoading({ mask: true, title: '生成中' });\n            return this.downloadResource(typeof reset === 'boolean' && reset).then(() => {\n                !this.data.hideLoading && wx.hideLoading();\n                const poster = this.selectComponent('#poster');\n                poster.create(this.data.config);\n            })\n            .catch((err) => {\n                !this.data.hideLoading && wx.hideLoading();\n                wx.showToast({ icon: 'none', title: err.errMsg || '生成失败' });\n                console.error(err);\n                this.triggerEvent('fail', err);\n            })\n        },\n        onCreateSuccess(e) {\n            const { detail } = e;\n            this.triggerEvent('success', detail);\n        },\n        onCreateFail(err) {\n            console.error(err);\n            this.triggerEvent('fail', err);\n        }\n    }\n})"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/poster/index.json",
    "content": "{\n    \"component\": true,\n    \"usingComponents\": {\n        \"we-canvas\": \"../index/index\"\n    }\n}"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/poster/index.wxml",
    "content": "<view bindtap='onCreate'>\n    <slot/>\n</view>\n<we-canvas id=\"poster\" bind:success=\"onCreateSuccess\" bind:fail=\"onCreateFail\"/>"
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/poster/index.wxss",
    "content": ""
  },
  {
    "path": "miniprogram_npm/wxa-plugin-canvas/poster/poster.js",
    "content": "const defaultOptions = {\n    selector: '#poster'\n};\n\nfunction Poster(options = {}, that) {\n    options = {\n        ...defaultOptions,\n        ...options,\n    };\n\n    const pages = getCurrentPages();\n    let ctx = pages[pages.length - 1];\n    if (that) ctx = that\n    const poster = ctx.selectComponent(options.selector);\n    delete options.selector;\n\n    return poster;\n};\n\nPoster.create = (reset = false, that) => {\n    const poster  = Poster({}, that);\n    if (!poster) {\n        console.error('请设置组件的id=\"poster\"!!!');\n    } else {\n        return Poster({}, that).onCreate(reset);\n    }\n}\n\nexport default Poster;\n"
  },
  {
    "path": "miniprogram_npm/wxbarcode/index.js",
    "content": "module.exports = (function() {\nvar __MODS__ = {};\nvar __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; };\nvar __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, \"exports\"); if (desp && desp.configurable) Object.defineProperty(m, \"exports\", { set: function (val) { if(typeof val === \"object\" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; };\nvar __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };\nvar __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };\n__DEFINE__(1768619533625, function(require, module, exports) {\nmodule.exports = require('./demo/utils')\n}, function(modId) {var map = {\"./demo/utils\":1768619533626}; return __REQUIRE__(map[modId], modId); })\n__DEFINE__(1768619533626, function(require, module, exports) {\nvar barcode = require('./barcode');\r\nvar qrcode = require('./qrcode');\r\n\r\nfunction convert_length(length) {\r\n\treturn Math.round(wx.getSystemInfoSync().windowWidth * length / 750);\r\n}\r\n\r\nfunction barc(id, code, width, height) {\r\n\tbarcode.code128(wx.createCanvasContext(id), code, convert_length(width), convert_length(height))\r\n}\r\n\r\nfunction qrc(id, code, width, height) {\r\n\tqrcode.api.draw(code, {\r\n\t\tctx: wx.createCanvasContext(id),\r\n\t\twidth: convert_length(width),\r\n\t\theight: convert_length(height)\r\n\t})\r\n}\r\n\r\nmodule.exports = {\r\n\tbarcode: barc,\r\n\tqrcode: qrc\r\n}\n}, function(modId) { var map = {\"./barcode\":1768619533627,\"./qrcode\":1768619533628}; return __REQUIRE__(map[modId], modId); })\n__DEFINE__(1768619533627, function(require, module, exports) {\nvar CHAR_TILDE = 126;\nvar CODE_FNC1 = 102;\n\nvar SET_STARTA = 103;\nvar SET_STARTB = 104;\nvar SET_STARTC = 105;\nvar SET_SHIFT = 98;\nvar SET_CODEA = 101;\nvar SET_CODEB = 100;\nvar SET_STOP = 106;\n\n\nvar REPLACE_CODES = {\n    CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard\n}\n\nvar CODESET = {\n    ANY: 1,\n    AB: 2,\n    A: 3,\n    B: 4,\n    C: 5\n};\n\nfunction getBytes(str) {\n    var bytes = [];\n    for (var i = 0; i < str.length; i++) {\n        bytes.push(str.charCodeAt(i));\n    }\n    return bytes;\n}\n\nexports.code128 = function (ctx, text, width, height) {\n\n    width = parseInt(width);\n\n    height = parseInt(height);\n\n    var codes = stringToCode128(text);\n\n    var g = new Graphics(ctx, width, height);\n\n    var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);\n\n    var x = g.area.left;\n    var y = g.area.top;\n    for (var i = 0; i < codes.length; i++) {\n        var c = codes[i];\n        //two bars at a time: 1 black and 1 white\n        for (var bar = 0; bar < 8; bar += 2) {\n            var barW = PATTERNS[c][bar] * barWeight;\n            // var barH = height - y - this.border;\n            var barH = height - y;\n            var spcW = PATTERNS[c][bar + 1] * barWeight;\n\n            //no need to draw if 0 width\n            if (barW > 0) {\n                g.fillFgRect(x, y, barW, barH);\n            }\n\n            x += barW + spcW;\n        }\n    }\n\n    ctx.draw();\n}\n\n\nfunction stringToCode128(text) {\n\n    var barc = {\n        currcs: CODESET.C\n    };\n\n    var bytes = getBytes(text);\n    //decide starting codeset\n    var index = bytes[0] == CHAR_TILDE ? 1 : 0;\n\n    var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;\n    var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;\n    barc.currcs = getBestStartSet(csa1, csa2);\n    barc.currcs = perhapsCodeC(bytes, barc.currcs);\n\n    //if no codeset changes this will end up with bytes.length+3\n    //start, checksum and stop\n    var codes = new Array();\n\n    switch (barc.currcs) {\n        case CODESET.A:\n            codes.push(SET_STARTA);\n            break;\n        case CODESET.B:\n            codes.push(SET_STARTB);\n            break;\n        default:\n            codes.push(SET_STARTC);\n            break;\n    }\n\n\n    for (var i = 0; i < bytes.length; i++) {\n        var b1 = bytes[i]; //get the first of a pair\n        //should we translate/replace\n        if (b1 in REPLACE_CODES) {\n            codes.push(REPLACE_CODES[b1]);\n            i++ //jump to next\n            b1 = bytes[i];\n        }\n\n        //get the next in the pair if possible\n        var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;\n\n        codes = codes.concat(codesForChar(b1, b2, barc.currcs));\n        //code C takes 2 chars each time\n        if (barc.currcs == CODESET.C) i++;\n    }\n\n    //calculate checksum according to Code 128 standards\n    var checksum = codes[0];\n    for (var weight = 1; weight < codes.length; weight++) {\n        checksum += (weight * codes[weight]);\n    }\n    codes.push(checksum % 103);\n\n    codes.push(SET_STOP);\n\n    //encoding should now be complete\n    return codes;\n\n    function getBestStartSet(csa1, csa2) {\n        //tries to figure out the best codeset\n        //to start with to get the most compact code\n        var vote = 0;\n        vote += csa1 == CODESET.A ? 1 : 0;\n        vote += csa1 == CODESET.B ? -1 : 0;\n        vote += csa2 == CODESET.A ? 1 : 0;\n        vote += csa2 == CODESET.B ? -1 : 0;\n        //tie goes to B due to my own predudices\n        return vote > 0 ? CODESET.A : CODESET.B;\n    }\n\n    function perhapsCodeC(bytes, codeset) {\n        for (var i = 0; i < bytes.length; i++) {\n            var b = bytes[i]\n            if ((b < 48 || b > 57) && b != CHAR_TILDE)\n                return codeset;\n        }\n        return CODESET.C;\n    }\n\n    //chr1 is current byte\n    //chr2 is the next byte to process. looks ahead.\n    function codesForChar(chr1, chr2, currcs) {\n        var result = [];\n        var shifter = -1;\n\n        if (charCompatible(chr1, currcs)) {\n            if (currcs == CODESET.C) {\n                if (chr2 == -1) {\n                    shifter = SET_CODEB;\n                    currcs = CODESET.B;\n                }\n                else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {\n                    //need to check ahead as well\n                    if (charCompatible(chr2, CODESET.A)) {\n                        shifter = SET_CODEA;\n                        currcs = CODESET.A;\n                    }\n                    else {\n                        shifter = SET_CODEB;\n                        currcs = CODESET.B;\n                    }\n                }\n            }\n        }\n        else {\n            //if there is a next char AND that next char is also not compatible\n            if ((chr2 != -1) && !charCompatible(chr2, currcs)) {\n                //need to switch code sets\n                switch (currcs) {\n                    case CODESET.A:\n                        shifter = SET_CODEB;\n                        currcs = CODESET.B;\n                        break;\n                    case CODESET.B:\n                        shifter = SET_CODEA;\n                        currcs = CODESET.A;\n                        break;\n                }\n            }\n            else {\n                //no need to shift code sets, a temporary SHIFT will suffice\n                shifter = SET_SHIFT;\n            }\n        }\n\n        //ok some type of shift is nessecary\n        if (shifter != -1) {\n            result.push(shifter);\n            result.push(codeValue(chr2));\n        }\n        else {\n            if (currcs == CODESET.C) {\n                //include next as well\n                result.push(codeValue(chr1, chr2));\n            }\n            else {\n                result.push(codeValue(chr1));\n            }\n        }\n        barc.currcs = currcs;\n\n        return result;\n    }\n}\n\n//reduce the ascii code to fit into the Code128 char table\nfunction codeValue(chr1, chr2) {\n    if (typeof chr2 == \"undefined\") {\n        return chr1 >= 32 ? chr1 - 32 : chr1 + 64;\n    }\n    else {\n        return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));\n    }\n}\n\nfunction charCompatible(chr, codeset) {\n    var csa = codeSetAllowedFor(chr);\n    if (csa == CODESET.ANY) return true;\n    //if we need to change from current\n    if (csa == CODESET.AB) return true;\n    if (csa == CODESET.A && codeset == CODESET.A) return true;\n    if (csa == CODESET.B && codeset == CODESET.B) return true;\n    return false;\n}\n\nfunction codeSetAllowedFor(chr) {\n    if (chr >= 48 && chr <= 57) {\n        //0-9\n        return CODESET.ANY;\n    }\n    else if (chr >= 32 && chr <= 95) {\n        //0-9 A-Z\n        return CODESET.AB;\n    }\n    else {\n        //if non printable\n        return chr < 32 ? CODESET.A : CODESET.B;\n    }\n}\n\nvar Graphics = function(ctx, width, height) {\n\n    this.width = width;\n    this.height = height;\n    this.quiet = Math.round(this.width / 40);\n    \n    this.border_size   = 0;\n    this.padding_width = 0;\n\n    this.area = {\n        width : width - this.padding_width * 2 - this.quiet * 2,\n        height: height - this.border_size * 2,\n        top   : this.border_size - 4,\n        left  : this.padding_width + this.quiet\n    };\n\n    this.ctx = ctx;\n    this.fg = \"#000000\";\n    this.bg = \"#ffffff\";\n\n    // fill background\n    this.fillBgRect(0,0, width, height);\n\n    // fill center to create border\n    this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);\n}\n\n//use native color\nGraphics.prototype._fillRect = function(x, y, width, height, color) {\n    this.ctx.setFillStyle(color)\n    this.ctx.fillRect(x, y, width, height)\n}\n\nGraphics.prototype.fillFgRect = function(x,y, width, height) {\n    this._fillRect(x, y, width, height, this.fg);\n}\n\nGraphics.prototype.fillBgRect = function(x,y, width, height) {\n    this._fillRect(x, y, width, height, this.bg);\n}\n\nvar PATTERNS = [\n    [2, 1, 2, 2, 2, 2, 0, 0],  // 0\n    [2, 2, 2, 1, 2, 2, 0, 0],  // 1\n    [2, 2, 2, 2, 2, 1, 0, 0],  // 2\n    [1, 2, 1, 2, 2, 3, 0, 0],  // 3\n    [1, 2, 1, 3, 2, 2, 0, 0],  // 4\n    [1, 3, 1, 2, 2, 2, 0, 0],  // 5\n    [1, 2, 2, 2, 1, 3, 0, 0],  // 6\n    [1, 2, 2, 3, 1, 2, 0, 0],  // 7\n    [1, 3, 2, 2, 1, 2, 0, 0],  // 8\n    [2, 2, 1, 2, 1, 3, 0, 0],  // 9\n    [2, 2, 1, 3, 1, 2, 0, 0],  // 10\n    [2, 3, 1, 2, 1, 2, 0, 0],  // 11\n    [1, 1, 2, 2, 3, 2, 0, 0],  // 12\n    [1, 2, 2, 1, 3, 2, 0, 0],  // 13\n    [1, 2, 2, 2, 3, 1, 0, 0],  // 14\n    [1, 1, 3, 2, 2, 2, 0, 0],  // 15\n    [1, 2, 3, 1, 2, 2, 0, 0],  // 16\n    [1, 2, 3, 2, 2, 1, 0, 0],  // 17\n    [2, 2, 3, 2, 1, 1, 0, 0],  // 18\n    [2, 2, 1, 1, 3, 2, 0, 0],  // 19\n    [2, 2, 1, 2, 3, 1, 0, 0],  // 20\n    [2, 1, 3, 2, 1, 2, 0, 0],  // 21\n    [2, 2, 3, 1, 1, 2, 0, 0],  // 22\n    [3, 1, 2, 1, 3, 1, 0, 0],  // 23\n    [3, 1, 1, 2, 2, 2, 0, 0],  // 24\n    [3, 2, 1, 1, 2, 2, 0, 0],  // 25\n    [3, 2, 1, 2, 2, 1, 0, 0],  // 26\n    [3, 1, 2, 2, 1, 2, 0, 0],  // 27\n    [3, 2, 2, 1, 1, 2, 0, 0],  // 28\n    [3, 2, 2, 2, 1, 1, 0, 0],  // 29\n    [2, 1, 2, 1, 2, 3, 0, 0],  // 30\n    [2, 1, 2, 3, 2, 1, 0, 0],  // 31\n    [2, 3, 2, 1, 2, 1, 0, 0],  // 32\n    [1, 1, 1, 3, 2, 3, 0, 0],  // 33\n    [1, 3, 1, 1, 2, 3, 0, 0],  // 34\n    [1, 3, 1, 3, 2, 1, 0, 0],  // 35\n    [1, 1, 2, 3, 1, 3, 0, 0],  // 36\n    [1, 3, 2, 1, 1, 3, 0, 0],  // 37\n    [1, 3, 2, 3, 1, 1, 0, 0],  // 38\n    [2, 1, 1, 3, 1, 3, 0, 0],  // 39\n    [2, 3, 1, 1, 1, 3, 0, 0],  // 40\n    [2, 3, 1, 3, 1, 1, 0, 0],  // 41\n    [1, 1, 2, 1, 3, 3, 0, 0],  // 42\n    [1, 1, 2, 3, 3, 1, 0, 0],  // 43\n    [1, 3, 2, 1, 3, 1, 0, 0],  // 44\n    [1, 1, 3, 1, 2, 3, 0, 0],  // 45\n    [1, 1, 3, 3, 2, 1, 0, 0],  // 46\n    [1, 3, 3, 1, 2, 1, 0, 0],  // 47\n    [3, 1, 3, 1, 2, 1, 0, 0],  // 48\n    [2, 1, 1, 3, 3, 1, 0, 0],  // 49\n    [2, 3, 1, 1, 3, 1, 0, 0],  // 50\n    [2, 1, 3, 1, 1, 3, 0, 0],  // 51\n    [2, 1, 3, 3, 1, 1, 0, 0],  // 52\n    [2, 1, 3, 1, 3, 1, 0, 0],  // 53\n    [3, 1, 1, 1, 2, 3, 0, 0],  // 54\n    [3, 1, 1, 3, 2, 1, 0, 0],  // 55\n    [3, 3, 1, 1, 2, 1, 0, 0],  // 56\n    [3, 1, 2, 1, 1, 3, 0, 0],  // 57\n    [3, 1, 2, 3, 1, 1, 0, 0],  // 58\n    [3, 3, 2, 1, 1, 1, 0, 0],  // 59\n    [3, 1, 4, 1, 1, 1, 0, 0],  // 60\n    [2, 2, 1, 4, 1, 1, 0, 0],  // 61\n    [4, 3, 1, 1, 1, 1, 0, 0],  // 62\n    [1, 1, 1, 2, 2, 4, 0, 0],  // 63\n    [1, 1, 1, 4, 2, 2, 0, 0],  // 64\n    [1, 2, 1, 1, 2, 4, 0, 0],  // 65\n    [1, 2, 1, 4, 2, 1, 0, 0],  // 66\n    [1, 4, 1, 1, 2, 2, 0, 0],  // 67\n    [1, 4, 1, 2, 2, 1, 0, 0],  // 68\n    [1, 1, 2, 2, 1, 4, 0, 0],  // 69\n    [1, 1, 2, 4, 1, 2, 0, 0],  // 70\n    [1, 2, 2, 1, 1, 4, 0, 0],  // 71\n    [1, 2, 2, 4, 1, 1, 0, 0],  // 72\n    [1, 4, 2, 1, 1, 2, 0, 0],  // 73\n    [1, 4, 2, 2, 1, 1, 0, 0],  // 74\n    [2, 4, 1, 2, 1, 1, 0, 0],  // 75\n    [2, 2, 1, 1, 1, 4, 0, 0],  // 76\n    [4, 1, 3, 1, 1, 1, 0, 0],  // 77\n    [2, 4, 1, 1, 1, 2, 0, 0],  // 78\n    [1, 3, 4, 1, 1, 1, 0, 0],  // 79\n    [1, 1, 1, 2, 4, 2, 0, 0],  // 80\n    [1, 2, 1, 1, 4, 2, 0, 0],  // 81\n    [1, 2, 1, 2, 4, 1, 0, 0],  // 82\n    [1, 1, 4, 2, 1, 2, 0, 0],  // 83\n    [1, 2, 4, 1, 1, 2, 0, 0],  // 84\n    [1, 2, 4, 2, 1, 1, 0, 0],  // 85\n    [4, 1, 1, 2, 1, 2, 0, 0],  // 86\n    [4, 2, 1, 1, 1, 2, 0, 0],  // 87\n    [4, 2, 1, 2, 1, 1, 0, 0],  // 88\n    [2, 1, 2, 1, 4, 1, 0, 0],  // 89\n    [2, 1, 4, 1, 2, 1, 0, 0],  // 90\n    [4, 1, 2, 1, 2, 1, 0, 0],  // 91\n    [1, 1, 1, 1, 4, 3, 0, 0],  // 92\n    [1, 1, 1, 3, 4, 1, 0, 0],  // 93\n    [1, 3, 1, 1, 4, 1, 0, 0],  // 94\n    [1, 1, 4, 1, 1, 3, 0, 0],  // 95\n    [1, 1, 4, 3, 1, 1, 0, 0],  // 96\n    [4, 1, 1, 1, 1, 3, 0, 0],  // 97\n    [4, 1, 1, 3, 1, 1, 0, 0],  // 98\n    [1, 1, 3, 1, 4, 1, 0, 0],  // 99\n    [1, 1, 4, 1, 3, 1, 0, 0],  // 100\n    [3, 1, 1, 1, 4, 1, 0, 0],  // 101\n    [4, 1, 1, 1, 3, 1, 0, 0],  // 102\n    [2, 1, 1, 4, 1, 2, 0, 0],  // 103\n    [2, 1, 1, 2, 1, 4, 0, 0],  // 104\n    [2, 1, 1, 2, 3, 2, 0, 0],  // 105\n    [2, 3, 3, 1, 1, 1, 2, 0]   // 106\n]\n\n\n}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); })\n__DEFINE__(1768619533628, function(require, module, exports) {\nvar QR = (function () {\n\n    // alignment pattern\n    var adelta = [\n      0, 11, 15, 19, 23, 27, 31, // force 1 pat\n      16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,\n      26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28\n      ];\n\n    // version block\n    var vpat = [\n        0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,\n        0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,\n        0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,\n        0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,\n        0x541, 0xc69\n    ];\n\n    // final format bits with mask: level << 3 | mask\n    var fmtword = [\n        0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976,    //L\n        0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0,    //M\n        0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed,    //Q\n        0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b    //H\n    ];\n\n    // 4 per version: number of blocks 1,2; data width; ecc width\n    var eccblocks = [\n        1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,\n        1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,\n        1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,\n        1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,\n        1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,\n        2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,\n        2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,\n        2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,\n        2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,\n        2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,\n        4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,\n        2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,\n        4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,\n        3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,\n        5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,\n        5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,\n        1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,\n        5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,\n        3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,\n        3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,\n        4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,\n        2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,\n        4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,\n        6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,\n        8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,\n        10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,\n        8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,\n        3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,\n        7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,\n        5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,\n        13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,\n        17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,\n        17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,\n        13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,\n        12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,\n        6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,\n        17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,\n        4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,\n        20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,\n        19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30\n    ];\n\n    // Galois field log table\n    var glog = [\n        0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,\n        0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,\n        0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,\n        0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,\n        0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,\n        0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,\n        0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,\n        0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,\n        0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,\n        0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,\n        0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,\n        0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,\n        0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,\n        0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,\n        0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,\n        0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf\n    ];\n\n    // Galios field exponent table\n    var gexp = [\n        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,\n        0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,\n        0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,\n        0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,\n        0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,\n        0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,\n        0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,\n        0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,\n        0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,\n        0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,\n        0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,\n        0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,\n        0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,\n        0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,\n        0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,\n        0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00\n    ];\n\n    // Working buffers:\n    // data input and ecc append, image working buffer, fixed part of image, run lengths for badness\n    var strinbuf=[], eccbuf=[], qrframe=[], framask=[], rlens=[]; \n    // Control values - width is based on version, last 4 are from table.\n    var version, width, neccblk1, neccblk2, datablkw, eccblkwid;\n    var ecclevel = 2;\n    // set bit to indicate cell in qrframe is immutable.  symmetric around diagonal\n    function setmask(x, y)\n    {\n        var bt;\n        if (x > y) {\n            bt = x;\n            x = y;\n            y = bt;\n        }\n        // y*y = 1+3+5...\n        bt = y;\n        bt *= y;\n        bt += y;\n        bt >>= 1;\n        bt += x;\n        framask[bt] = 1;\n    }\n\n    // enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)\n    function putalign(x, y)\n    {\n        var j;\n\n        qrframe[x + width * y] = 1;\n        for (j = -2; j < 2; j++) {\n            qrframe[(x + j) + width * (y - 2)] = 1;\n            qrframe[(x - 2) + width * (y + j + 1)] = 1;\n            qrframe[(x + 2) + width * (y + j)] = 1;\n            qrframe[(x + j + 1) + width * (y + 2)] = 1;\n        }\n        for (j = 0; j < 2; j++) {\n            setmask(x - 1, y + j);\n            setmask(x + 1, y - j);\n            setmask(x - j, y - 1);\n            setmask(x + j, y + 1);\n        }\n    }\n\n    //========================================================================\n    // Reed Solomon error correction\n    // exponentiation mod N\n    function modnn(x)\n    {\n        while (x >= 255) {\n            x -= 255;\n            x = (x >> 8) + (x & 255);\n        }\n        return x;\n    }\n\n    var genpoly = [];\n\n    // Calculate and append ECC data to data block.  Block is in strinbuf, indexes to buffers given.\n    function appendrs(data, dlen, ecbuf, eclen)\n    {\n        var i, j, fb;\n\n        for (i = 0; i < eclen; i++)\n            strinbuf[ecbuf + i] = 0;\n        for (i = 0; i < dlen; i++) {\n            fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];\n            if (fb != 255)     /* fb term is non-zero */\n                for (j = 1; j < eclen; j++)\n                    strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];\n            else\n                for( j = ecbuf ; j < ecbuf + eclen; j++ )\n                    strinbuf[j] = strinbuf[j + 1];\n            strinbuf[ ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];\n        }\n    }\n\n    //========================================================================\n    // Frame data insert following the path rules\n\n    // check mask - since symmetrical use half.\n    function ismasked(x, y)\n    {\n        var bt;\n        if (x > y) {\n            bt = x;\n            x = y;\n            y = bt;\n        }\n        bt = y;\n        bt += y * y;\n        bt >>= 1;\n        bt += x;\n        return framask[bt];\n    }\n\n    //========================================================================\n    //  Apply the selected mask out of the 8.\n    function  applymask(m)\n    {\n        var x, y, r3x, r3y;\n\n        switch (m) {\n        case 0:\n            for (y = 0; y < width; y++)\n                for (x = 0; x < width; x++)\n                    if (!((x + y) & 1) && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n            break;\n        case 1:\n            for (y = 0; y < width; y++)\n                for (x = 0; x < width; x++)\n                    if (!(y & 1) && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n            break;\n        case 2:\n            for (y = 0; y < width; y++)\n                for (r3x = 0, x = 0; x < width; x++, r3x++) {\n                    if (r3x == 3)\n                        r3x = 0;\n                    if (!r3x && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n                }\n            break;\n        case 3:\n            for (r3y = 0, y = 0; y < width; y++, r3y++) {\n                if (r3y == 3)\n                    r3y = 0;\n                for (r3x = r3y, x = 0; x < width; x++, r3x++) {\n                    if (r3x == 3)\n                        r3x = 0;\n                    if (!r3x && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n                }\n            }\n            break;\n        case 4:\n            for (y = 0; y < width; y++)\n                for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++, r3x++) {\n                    if (r3x == 3) {\n                        r3x = 0;\n                        r3y = !r3y;\n                    }\n                    if (!r3y && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n                }\n            break;\n        case 5:\n            for (r3y = 0, y = 0; y < width; y++, r3y++) {\n                if (r3y == 3)\n                    r3y = 0;\n                for (r3x = 0, x = 0; x < width; x++, r3x++) {\n                    if (r3x == 3)\n                        r3x = 0;\n                    if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n                }\n            }\n            break;\n        case 6:\n            for (r3y = 0, y = 0; y < width; y++, r3y++) {\n                if (r3y == 3)\n                    r3y = 0;\n                for (r3x = 0, x = 0; x < width; x++, r3x++) {\n                    if (r3x == 3)\n                        r3x = 0;\n                    if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n                }\n            }\n            break;\n        case 7:\n            for (r3y = 0, y = 0; y < width; y++, r3y++) {\n                if (r3y == 3)\n                    r3y = 0;\n                for (r3x = 0, x = 0; x < width; x++, r3x++) {\n                    if (r3x == 3)\n                        r3x = 0;\n                    if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))\n                        qrframe[x + y * width] ^= 1;\n                }\n            }\n            break;\n        }\n        return;\n    }\n\n    // Badness coefficients.\n    var N1 = 3, N2 = 3, N3 = 40, N4 = 10;\n\n    // Using the table of the length of each run, calculate the amount of bad image \n    // - long runs or those that look like finders; called twice, once each for X and Y\n    function badruns(length)\n    {\n        var i;\n        var runsbad = 0;\n        for (i = 0; i <= length; i++)\n            if (rlens[i] >= 5)\n                runsbad += N1 + rlens[i] - 5;\n        // BwBBBwB as in finder\n        for (i = 3; i < length - 1; i += 2)\n            if (rlens[i - 2] == rlens[i + 2]\n                && rlens[i + 2] == rlens[i - 1]\n                && rlens[i - 1] == rlens[i + 1]\n                && rlens[i - 1] * 3 == rlens[i]\n                // white around the black pattern? Not part of spec\n                && (rlens[i - 3] == 0 // beginning\n                    || i + 3 > length  // end\n                    || rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)\n               )\n                runsbad += N3;\n        return runsbad;\n    }\n\n    // Calculate how bad the masked image is - blocks, imbalance, runs, or finders.\n    function badcheck()\n    {\n        var x, y, h, b, b1;\n        var thisbad = 0;\n        var bw = 0;\n\n        // blocks of same color.\n        for (y = 0; y < width - 1; y++)\n            for (x = 0; x < width - 1; x++)\n                if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]\n                     && qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black\n                    || !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]\n                         || qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white\n                    thisbad += N2;\n\n        // X runs\n        for (y = 0; y < width; y++) {\n            rlens[0] = 0;\n            for (h = b = x = 0; x < width; x++) {\n                if ((b1 = qrframe[x + width * y]) == b)\n                    rlens[h]++;\n                else\n                    rlens[++h] = 1;\n                b = b1;\n                bw += b ? 1 : -1;\n            }\n            thisbad += badruns(h);\n        }\n\n        // black/white imbalance\n        if (bw < 0)\n            bw = -bw;\n\n        var big = bw;\n        var count = 0;\n        big += big << 2;\n        big <<= 1;\n        while (big > width * width)\n            big -= width * width, count++;\n        thisbad += count * N4;\n\n        // Y runs\n        for (x = 0; x < width; x++) {\n            rlens[0] = 0;\n            for (h = b = y = 0; y < width; y++) {\n                if ((b1 = qrframe[x + width * y]) == b)\n                    rlens[h]++;\n                else\n                    rlens[++h] = 1;\n                b = b1;\n            }\n            thisbad += badruns(h);\n        }\n        return thisbad;\n    }\n\n    function genframe(instring)\n    {\n        var x, y, k, t, v, i, j, m;\n\n    // find the smallest version that fits the string\n        t = instring.length;\n        version = 0;\n        do {\n            version++;\n            k = (ecclevel - 1) * 4 + (version - 1) * 16;\n            neccblk1 = eccblocks[k++];\n            neccblk2 = eccblocks[k++];\n            datablkw = eccblocks[k++];\n            eccblkwid = eccblocks[k];\n            k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);\n            if (t <= k)\n                break;\n        } while (version < 40);\n\n    // FIXME - insure that it fits insted of being truncated\n        width = 17 + 4 * version;\n\n    // allocate, clear and setup data structures\n        v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;\n        for( t = 0; t < v; t++ )\n            eccbuf[t] = 0;\n        strinbuf = instring.slice(0);\n\n        for( t = 0; t < width * width; t++ )\n            qrframe[t] = 0;\n\n        for( t = 0 ; t < (width * (width + 1) + 1) / 2; t++)\n            framask[t] = 0;\n\n    // insert finders - black to frame, white to mask\n        for (t = 0; t < 3; t++) {\n            k = 0;\n            y = 0;\n            if (t == 1)\n                k = (width - 7);\n            if (t == 2)\n                y = (width - 7);\n            qrframe[(y + 3) + width * (k + 3)] = 1;\n            for (x = 0; x < 6; x++) {\n                qrframe[(y + x) + width * k] = 1;\n                qrframe[y + width * (k + x + 1)] = 1;\n                qrframe[(y + 6) + width * (k + x)] = 1;\n                qrframe[(y + x + 1) + width * (k + 6)] = 1;\n            }\n            for (x = 1; x < 5; x++) {\n                setmask(y + x, k + 1);\n                setmask(y + 1, k + x + 1);\n                setmask(y + 5, k + x);\n                setmask(y + x + 1, k + 5);\n            }\n            for (x = 2; x < 4; x++) {\n                qrframe[(y + x) + width * (k + 2)] = 1;\n                qrframe[(y + 2) + width * (k + x + 1)] = 1;\n                qrframe[(y + 4) + width * (k + x)] = 1;\n                qrframe[(y + x + 1) + width * (k + 4)] = 1;\n            }\n        }\n\n    // alignment blocks\n        if (version > 1) {\n            t = adelta[version];\n            y = width - 7;\n            for (;;) {\n                x = width - 7;\n                while (x > t - 3) {\n                    putalign(x, y);\n                    if (x < t)\n                        break;\n                    x -= t;\n                }\n                if (y <= t + 9)\n                    break;\n                y -= t;\n                putalign(6, y);\n                putalign(y, 6);\n            }\n        }\n\n    // single black\n        qrframe[8 + width * (width - 8)] = 1;\n\n    // timing gap - mask only\n        for (y = 0; y < 7; y++) {\n            setmask(7, y);\n            setmask(width - 8, y);\n            setmask(7, y + width - 7);\n        }\n        for (x = 0; x < 8; x++) {\n            setmask(x, 7);\n            setmask(x + width - 8, 7);\n            setmask(x, width - 8);\n        }\n\n    // reserve mask-format area\n        for (x = 0; x < 9; x++)\n            setmask(x, 8);\n        for (x = 0; x < 8; x++) {\n            setmask(x + width - 8, 8);\n            setmask(8, x);\n        }\n        for (y = 0; y < 7; y++)\n            setmask(8, y + width - 7);\n\n    // timing row/col\n        for (x = 0; x < width - 14; x++)\n            if (x & 1) {\n                setmask(8 + x, 6);\n                setmask(6, 8 + x);\n            }\n            else {\n                qrframe[(8 + x) + width * 6] = 1;\n                qrframe[6 + width * (8 + x)] = 1;\n            }\n\n    // version block\n        if (version > 6) {\n            t = vpat[version - 7];\n            k = 17;\n            for (x = 0; x < 6; x++)\n                for (y = 0; y < 3; y++, k--)\n                    if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {\n                        qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;\n                        qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;\n                    }\n            else {\n                setmask(5 - x, 2 - y + width - 11);\n                setmask(2 - y + width - 11, 5 - x);\n            }\n        }\n\n    // sync mask bits - only set above for white spaces, so add in black bits\n        for (y = 0; y < width; y++)\n            for (x = 0; x <= y; x++)\n                if (qrframe[x + width * y])\n                    setmask(x, y);\n\n    // convert string to bitstream\n    // 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)\n        v = strinbuf.length;\n\n    // string to array\n        for( i = 0 ; i < v; i++ )\n            eccbuf[i] = strinbuf.charCodeAt(i);\n        strinbuf = eccbuf.slice(0);\n\n    // calculate max string length\n        x = datablkw * (neccblk1 + neccblk2) + neccblk2;\n        if (v >= x - 2) {\n            v = x - 2;\n            if (version > 9)\n                v--;\n        }\n\n    // shift and repack to insert length prefix\n        i = v;\n        if (version > 9) {\n            strinbuf[i + 2] = 0;\n            strinbuf[i + 3] = 0;\n            while (i--) {\n                t = strinbuf[i];\n                strinbuf[i + 3] |= 255 & (t << 4);\n                strinbuf[i + 2] = t >> 4;\n            }\n            strinbuf[2] |= 255 & (v << 4);\n            strinbuf[1] = v >> 4;\n            strinbuf[0] = 0x40 | (v >> 12);\n        }\n        else {\n            strinbuf[i + 1] = 0;\n            strinbuf[i + 2] = 0;\n            while (i--) {\n                t = strinbuf[i];\n                strinbuf[i + 2] |= 255 & (t << 4);\n                strinbuf[i + 1] = t >> 4;\n            }\n            strinbuf[1] |= 255 & (v << 4);\n            strinbuf[0] = 0x40 | (v >> 4);\n        }\n    // fill to end with pad pattern\n        i = v + 3 - (version < 10);\n        while (i < x) {\n            strinbuf[i++] = 0xec;\n            // buffer has room    if (i == x)      break;\n            strinbuf[i++] = 0x11;\n        }\n\n    // calculate and append ECC\n\n    // calculate generator polynomial\n        genpoly[0] = 1;\n        for (i = 0; i < eccblkwid; i++) {\n            genpoly[i + 1] = 1;\n            for (j = i; j > 0; j--)\n                genpoly[j] = genpoly[j]\n                ? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];\n            genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];\n        }\n        for (i = 0; i <= eccblkwid; i++)\n            genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step\n\n    // append ecc to data buffer\n        k = x;\n        y = 0;\n        for (i = 0; i < neccblk1; i++) {\n            appendrs(y, datablkw, k, eccblkwid);\n            y += datablkw;\n            k += eccblkwid;\n        }\n        for (i = 0; i < neccblk2; i++) {\n            appendrs(y, datablkw + 1, k, eccblkwid);\n            y += datablkw + 1;\n            k += eccblkwid;\n        }\n    // interleave blocks\n        y = 0;\n        for (i = 0; i < datablkw; i++) {\n            for (j = 0; j < neccblk1; j++)\n                eccbuf[y++] = strinbuf[i + j * datablkw];\n            for (j = 0; j < neccblk2; j++)\n                eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];\n        }\n        for (j = 0; j < neccblk2; j++)\n            eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];\n        for (i = 0; i < eccblkwid; i++)\n            for (j = 0; j < neccblk1 + neccblk2; j++)\n                eccbuf[y++] = strinbuf[x + i + j * eccblkwid];\n        strinbuf = eccbuf;\n\n    // pack bits into frame avoiding masked area.\n        x = y = width - 1;\n        k = v = 1;         // up, minus\n        /* inteleaved data and ecc codes */\n        m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;\n        for (i = 0; i < m; i++) {\n            t = strinbuf[i];\n            for (j = 0; j < 8; j++, t <<= 1) {\n                if (0x80 & t)\n                    qrframe[x + width * y] = 1;\n                do {        // find next fill position\n                    if (v)\n                        x--;\n                    else {\n                        x++;\n                        if (k) {\n                            if (y != 0)\n                                y--;\n                            else {\n                                x -= 2;\n                                k = !k;\n                                if (x == 6) {\n                                    x--;\n                                    y = 9;\n                                }\n                            }\n                        }\n                        else {\n                            if (y != width - 1)\n                                y++;\n                            else {\n                                x -= 2;\n                                k = !k;\n                                if (x == 6) {\n                                    x--;\n                                    y -= 8;\n                                }\n                            }\n                        }\n                    }\n                    v = !v;\n                } while (ismasked(x, y));\n            }\n        }\n\n    // save pre-mask copy of frame\n        strinbuf = qrframe.slice(0);\n        t = 0;           // best\n        y = 30000;         // demerit\n    // for instead of while since in original arduino code\n    // if an early mask was \"good enough\" it wouldn't try for a better one\n    // since they get more complex and take longer.\n        for (k = 0; k < 8; k++) {\n            applymask(k);      // returns black-white imbalance\n            x = badcheck();\n            if (x < y) { // current mask better than previous best?\n                y = x;\n                t = k;\n            }\n            if (t == 7)\n                break;       // don't increment i to a void redoing mask\n            qrframe = strinbuf.slice(0); // reset for next pass\n        }\n        if (t != k)         // redo best mask - none good enough, last wasn't t\n            applymask(t);\n\n    // add in final mask/ecclevel bytes\n        y = fmtword[t + ((ecclevel - 1) << 3)];\n        // low byte\n        for (k = 0; k < 8; k++, y >>= 1)\n            if (y & 1) {\n                qrframe[(width - 1 - k) + width * 8] = 1;\n                if (k < 6)\n                    qrframe[8 + width * k] = 1;\n                else\n                    qrframe[8 + width * (k + 1)] = 1;\n            }\n        // high byte\n        for (k = 0; k < 7; k++, y >>= 1)\n            if (y & 1) {\n                qrframe[8 + width * (width - 7 + k)] = 1;\n                if (k)\n                    qrframe[(6 - k) + width * 8] = 1;\n                else\n                    qrframe[7 + width * 8] = 1;\n            }\n\n    // return image\n        return qrframe;\n    }\n\n    var _canvas = null,\n        _size = null;\n\n    var api = {\n\n        get ecclevel () {\n            return ecclevel;\n        },\n\n        set ecclevel (val) {\n            ecclevel = val;\n        },\n\n        get size () {\n            return _size;\n        },\n\n        set size (val) {\n            _size = val\n        },\n\n        get canvas () {\n            return _canvas;\n        },\n\n        set canvas (el) {\n            _canvas = el;\n        },\n\n        getFrame: function (string) {\n            return genframe(string);\n        },\n\n        draw: function (string, canvas, size, ecc) {\n            \n            ecclevel = ecc || ecclevel;\n            canvas = canvas || _canvas;\n\n            if (!canvas) {\n                console.warn('No canvas provided to draw QR code in!')\n                return;\n            }\n\n            size = size || _size || Math.min(canvas.width, canvas.height);\n\n            var frame = genframe(string),\n                ctx = canvas.ctx,\n                px = Math.round(size / (width + 8));\n\n            var roundedSize = px * (width + 8),\n                offset = Math.floor((size - roundedSize) / 2);\n\n            size = roundedSize;\n\n            ctx.clearRect(0, 0, canvas.width, canvas.height);\n            ctx.setFillStyle('#000000');\n\n            for (var i = 0; i < width; i++) {\n                for (var j = 0; j < width; j++) {\n                    if (frame[j * width + i]) {\n                        ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);\n                    }\n                }\n            }\n            ctx.draw();\n        }\n    }\n\n    module.exports = {\n        api: api\n    }\n\n})()\n}, function(modId) { var map = {}; return __REQUIRE__(map[modId], modId); })\nreturn __REQUIRE__(1768619533625);\n})()\n//miniprogram-npm-outsideDeps=[]\n//# sourceMappingURL=index.js.map"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"beeorder\",\n  \"version\": \"1.0.0\",\n  \"description\": \"微信小程序——餐饮点餐商城，是针对餐饮行业推出的一套完整的餐饮解决方案，实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能，完美的使餐饮行业更高效便捷！\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/woniudiancang/bee.git\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"bugs\": {\n    \"url\": \"https://github.com/woniudiancang/bee/issues\"\n  },\n  \"homepage\": \"https://github.com/woniudiancang/bee#readme\",\n  \"dependencies\": {\n    \"@vant/weapp\": \"^1.11.7\",\n    \"apifm-wxapi\": \"^26.2.12\",\n    \"wxbarcode\": \"^1.0.2\"\n  },\n  \"devDependencies\": {\n    \"sharp\": \"^0.34.4\"\n  }\n}\n"
  },
  {
    "path": "pages/about/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\nPage({\n  data: {\n\n  },\n  onLoad (e) {\n    this.data.key = e.key || 'about'\n    this.cmsPage()\n  },\n  async cmsPage() {\n    const res = await WXAPI.cmsPage(this.data.key)\n    if (res.code == 0) {\n      this.setData({\n        cmsPage: res.data\n      })\n      wx.setNavigationBarTitle({\n        title: res.data.info.title,\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/about/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/about/index.wxml",
    "content": "<view class=\"content\">\n  <parser html=\"{{cmsPage.info.content}}\" />\n</view>"
  },
  {
    "path": "pages/about/index.wxss",
    "content": ".content {\n  padding: 32rpx;\n  line-height: 64rpx;\n}\n.content image {\n  max-width: 100%;\n}"
  },
  {
    "path": "pages/ad/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n  \n}\n\nPage({\n  data: {\n    addressList: [],\n    addressEdit: false,\n    cancelBtn: false,\n    pickerRegionRange: [],\n    pickerSelect:[0, 0, 0],\n    addressData: {}\n  },\n  // 添加地址\n  addAddress: function() {\n    this.setData({\n      addressEdit: true,\n      cancelBtn: true,\n      id: null,\n      addressData: {}\n    })\n  },\n  // 取消编辑\n  editCancel: function(){\n    this.setData({\n      addressEdit: false,         \n    })\n  },\n  // 编辑地址\n  async editAddress(e) {\n    // wx.navigateTo({\n    //   url: \"/pages/address-add/index?id=\" + e.currentTarget.dataset.id\n    // })\n    var id = e.currentTarget.dataset.id    \n    this.setData({ \n      addressEdit: true,\n      cancelBtn: false,\n      id:id,\n    })\n    if (id) { // 修改初始化数据库数据\n      const res = await WXAPI.addressDetail(wx.getStorageSync('token'), id)\n      if (res.code == 0) {\n        var addressData = res.data.info\n        console.log(addressData)\n        var address = addressData.address        \n        var pname = addressData.provinceStr\n        var cname = addressData.cityStr\n        var dname = addressData.areaStr\n        // \n        var provinceId = addressData.provinceId\n        var cityId = addressData.cityId\n        var districtId = addressData.districtId\n\n        this.setData({\n          id: id,\n          addressData: res.data.info,  \n          address: res.data.info.address,        \n          pname: pname,\n          cname: cname,\n          dname: dname,\n          provinceId: provinceId,\n          cityId: cityId,\n          districtId: districtId,\n        })\n        // console.log(addressData)        \n        this.initRegionDB(pname,cname,dname)\n        this.provinces(provinceId,cityId,districtId) \n               \n      } else {\n        wx.showModal({\n          confirmText: this.data.$t.common.confirm,\n          cancelText: this.data.$t.common.cancel,\n          content: this.data.$t.ad_index.apiError,\n          showCancel: false\n        })\n      }\n    } else {\n      this.initRegionPicker()\n    }  \n    \n  }, \n  // 选中地址\n  selectTap: function(e) {\n    var id = e.currentTarget.dataset.id;\n    WXAPI.updateAddress({\n      token: wx.getStorageSync('token'),\n      id: id,\n      isDefault: 'true'\n    }).then(function(res) {\n      wx.navigateBack({})\n    })\n  },\n  // 删除地址按钮\n  deleteAddress: function (e) {\n    const _this = this\n    const id = e.currentTarget.dataset.id;\n    console.log(id)\n    wx.showModal({\n      confirmText: this.data.$t.common.confirm,\n      cancelText: this.data.$t.common.cancel,\n      content: this.data.$t.ad_index.deleteProfile,\n      success: function (res) {\n        if (res.confirm) {\n          WXAPI.deleteAddress(wx.getStorageSync('token'), id).then(function () {\n            _this.setData({\n              addressEdit: false,\n              cancelBtn: false,\n            })\n            _this.initShippingAddress()\n          })\n        }\n      }\n    })\n  },\n  // 微信读取\n  readFromWx : function () {\n    const _this = this\n    wx.chooseAddress({\n      success: function (res) {\n        console.log(res)\n        _this.initRegionDB(res.provinceName, res.cityName, res.countyName)\n        _this.setData({\n          wxaddress: res\n        });\n      }\n    })\n  },  \n  // 获取地址列表\n  async initShippingAddress() {\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/mmte1o\n    const res = await WXAPI.queryAddressV2({\n      token: wx.getStorageSync('token'),\n      pageSize: 100\n    })\n    wx.hideLoading({\n      success: (res) => {},\n    })\n    if (res.code == 0) {\n      this.setData({\n        addressList: res.data.result\n      });\n    } else {\n      this.setData({\n        addressList: null\n      });\n    }\n  },   \n  // 省市选择器 三栏\n  initRegionPicker () {\n    // https://www.yuque.com/apifm/nu0f75/anab2a\n    WXAPI.provinceV2().then(res => {\n      if (res.code === 0) {\n        let _pickerRegionRange = []\n        _pickerRegionRange.push(res.data)\n        _pickerRegionRange.push([{ name: this.data.$t.common.select }])\n        _pickerRegionRange.push([{ name: this.data.$t.common.select }])\n        this.data.pickerRegionRange = _pickerRegionRange\n        this.bindcolumnchange({ detail: { column: 0, value: 0 } })\n      }\n    })\n  },\n  async initRegionDB (pname, cname, dname) {\n    this.data.showRegionStr = pname + cname + dname\n    let pObject = undefined\n    let cObject = undefined\n    let dObject = undefined\n    if (pname) {\n      const index = this.data.pickerRegionRange[0].findIndex(ele=>{\n        return ele.name == pname\n      })      \n      if (index >= 0) {\n        this.data.pickerSelect[0] = index\n        pObject = this.data.pickerRegionRange[0][index]\n      }\n    }    \n    if (!pObject) {\n      return\n    }\n    // https://www.yuque.com/apifm/nu0f75/kfukig\n    const _cRes = await WXAPI.nextRegionV2(pObject.id)\n    if (_cRes.code === 0) {\n      this.data.pickerRegionRange[1] = _cRes.data\n      if (cname) {\n        const index = this.data.pickerRegionRange[1].findIndex(ele => {\n          return ele.name == cname\n        })        \n        if (index >= 0) {\n          this.data.pickerSelect[1] = index\n          cObject = this.data.pickerRegionRange[1][index]\n        }\n      }\n    }    \n    if (!cObject) {\n      return\n    }\n    // https://www.yuque.com/apifm/nu0f75/kfukig\n    const _dRes = await WXAPI.nextRegionV2(cObject.id)\n    if (_dRes.code === 0) {\n      this.data.pickerRegionRange[2] = _dRes.data\n      if (dname) {\n        const index = this.data.pickerRegionRange[2].findIndex(ele => {\n          return ele.name == dname\n        })        \n        if (index >= 0) {\n          this.data.pickerSelect[2] = index\n          dObject = this.data.pickerRegionRange[2][index]\n        }\n      }\n    }\n    this.setData({\n      pickerRegionRange: this.data.pickerRegionRange,\n      pickerSelect: this.data.pickerSelect,\n      showRegionStr: this.data.showRegionStr,\n      pObject: pObject,\n      cObject: cObject,\n      dObject: dObject\n    })\n    \n  },  \n  bindchange: function(e) {    \n    const pObject = this.data.pickerRegionRange[0][e.detail.value[0]]\n    const cObject = this.data.pickerRegionRange[1][e.detail.value[1]]\n    const dObject = this.data.pickerRegionRange[2][e.detail.value[2]]\n    const showRegionStr = pObject.name + cObject.name + dObject.name\n    this.setData({\n      pObject: pObject,\n      cObject: cObject,\n      dObject: dObject,\n      showRegionStr: showRegionStr\n    })\n  },\n  bindcolumnchange: function(e) {\n    const column = e.detail.column\n    const index = e.detail.value    \n    const regionObject = this.data.pickerRegionRange[column][index]    \n    if (column === 2) {\n      this.setData({\n        pickerRegionRange: this.data.pickerRegionRange\n      })\n      return\n    }\n    if (column === 1) {\n      this.data.pickerRegionRange[2] = [{ name: this.data.$t.common.select }]\n    }\n    if (column === 0) {\n      this.data.pickerRegionRange[1] = [{ name: this.data.$t.common.select }]\n      this.data.pickerRegionRange[2] = [{ name: this.data.$t.common.select }]\n    }\n    // // 后面的数组全部清空\n    // this.data.pickerRegionRange.splice(column+1)\n    // 追加后面的一级数组\n    // https://www.yuque.com/apifm/nu0f75/kfukig\n    WXAPI.nextRegionV2(regionObject.id).then(res => {\n      if (res.code === 0) {\n        this.data.pickerRegionRange[column + 1] = res.data     \n      }\n      this.bindcolumnchange({ detail: { column: column + 1, value: 0 } })\n    })\n  },  \n  // \n  async provinces(provinceId, cityId, districtId) {\n    // https://www.yuque.com/apifm/nu0f75/anab2a\n    const res1 = await WXAPI.provinceV2()    \n    const provinces = res1.data  \n    this.setData({\n      provinces,\n    })     \n    var pIndex = provinces.findIndex(ele => {\n      return ele.id == provinceId\n    })  \n     \n    const pid = this.data.provinces[pIndex].id    \n    // https://www.yuque.com/apifm/nu0f75/kfukig\n    const res2 = await WXAPI.nextRegionV2(pid)\n    const cities = res2.data  \n    this.setData({\n      cities,\n    })  \n    var  cIndex = cities.findIndex(ele => {\n      return ele.id == cityId\n    })\n    \n    const cid = this.data.cities[cIndex].id\n    // https://www.yuque.com/apifm/nu0f75/kfukig\n    const res3 = await WXAPI.nextRegionV2(cid);\n    const areas = res3.data\n    this.setData({\n      areas,\n    })\n    var aIndex = areas.findIndex(ele => {\n      return ele.id == districtId\n    })\n    // var pIndex = pIndex + 1\n    // var cIndex = cIndex + 1\n    // var aIndex = aIndex + 1\n    this.setData({\n      pIndex: pIndex,\n      cIndex: cIndex,\n      aIndex: aIndex,\n    })  \n    \n  },\n  linkManChange(e) {\n    const addressData = this.data.addressData\n    addressData.linkMan = e.detail\n    this.setData({\n      addressData\n    })\n  },\n  mobileChange(e) {\n    const addressData = this.data.addressData\n    addressData.mobile = e.detail\n    this.setData({\n      addressData\n    })\n  },\n  addressChange(e) {\n    const addressData = this.data.addressData\n    addressData.address = e.detail\n    this.setData({\n      addressData\n    })\n  },\n  // 保存按钮\n  async bindSave() {    \n    const pObject = this.data.pObject\n    const cObject = this.data.cObject\n    const dObject = this.data.dObject\n    const linkMan = this.data.addressData.linkMan\n    const address = this.data.addressData.address\n    const mobile = this.data.addressData.mobile\n    const latitude = this.data.addressData.latitude\n    const longitude = this.data.addressData.longitude\n\n    if (!linkMan){\n      wx.showToast({\n        title: this.data.$t.ad_index.linkManPlaceholder,\n        icon: 'none',        \n      })\n      return\n    }\n    if (!mobile){\n      wx.showToast({\n        title: this.data.$t.ad_index.mobilePlaceholder,\n        icon: 'none',        \n      })\n      return\n    }\n    if (!this.data.pObject || !this.data.cObject || !this.data.dObject){\n      wx.showToast({\n        title: this.data.$t.ad_index.region,\n        icon: 'none',        \n      })\n      return\n    }\n    if (!latitude){\n      wx.showToast({\n        title: this.data.$t.ad_index.location,\n        icon: 'none',       \n      })\n      return\n    }\n    if (!address){\n      wx.showToast({\n        title: this.data.$t.ad_index.address,\n        icon: 'none',       \n      })\n      return\n    }\n    \n    const postData = {\n      token: wx.getStorageSync('token'),\n      linkMan: linkMan,\n      address: address,\n      mobile: mobile,\n      isDefault: 'true',\n      latitude,\n      longitude\n    }     \n\n    // console.log(this.data.pIndex)\n    // console.log(this.data.cIndex)\n    // console.log(this.data.aIndex)\n\n    postData.provinceId = pObject.id\n    postData.cityId = cObject.id  \n    postData.districtId = dObject.id\n\n    // if (this.data.pIndex >= 0) {\n    //   postData.provinceId = pObject.id    \n    // }\n    // if (this.data.cIndex >= 0) {\n    //   postData.cityId = cObject.id  \n    // }\n    // if (this.data.aIndex >= 0) {\n    //   postData.districtId = dObject.id  \n    // }    \n    let apiResult\n    console.log(this.data.id)\n    if (this.data.id) {\n      postData.id = this.data.id\n      apiResult = await WXAPI.updateAddress(postData)\n    } else {\n      apiResult = await WXAPI.addAddress(postData)\n    }\n    if (apiResult.code != 0) {\n      // 登录错误 \n      wx.hideLoading();\n      wx.showToast({\n        title: apiResult.msg,\n        icon: 'none'\n      })\n      return;\n    } else {\n      this.setData({\n        addressEdit: false,\n        cancelBtn: false,\n      })\n      this.initShippingAddress()\n    }    \n    \n  },\n  onLoad(e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.ad_index.title,\n    })\n    this.setData({\n      showRegionStr: this.data.$t.ad_index.regionPlaceholder\n    })\n    const _this = this\n    this.initRegionPicker() // 初始化省市区选择器\n    if (e.id) { // 修改初始化数据库数据\n      WXAPI.addressDetail(e.id, wx.getStorageSync('token')).then(function (res) {\n        if (res.code === 0) {\n          _this.setData({\n            id: e.id,\n            addressData: res.data,\n            showRegionStr: res.data.provinceStr + res.data.cityStr + res.data.areaStr\n          });\n          _this.initRegionDB(res.data.provinceStr, res.data.cityStr, res.data.areaStr)\n          return;\n        } else {\n          wx.showModal({\n            confirmText: this.data.$t.common.confirm,\n            cancelText: this.data.$t.common.cancel,\n            content: this.data.$t.ad_index.apiError,\n            showCancel: false\n          })\n        }\n      })\n    }\n  },\n  onShow: function() {\n    AUTH.checkHasLogined().then(isLogined => {\n      if (isLogined) {\n        this.initShippingAddress();\n      } else {\n        wx.showModal({\n          confirmText: this.data.$t.common.confirm,\n          cancelText: this.data.$t.common.cancel,\n          content: this.data.$t.auth.needLogin,\n          showCancel: false,\n          success: () => {\n            wx.navigateBack()\n          }\n        })\n      }\n    })\n  },\n  chooseLocation() {\n    wx.chooseLocation({\n      success: (res) => {\n        const addressData = this.data.addressData\n        addressData.address = res.address + res.name\n        addressData.latitude = res.latitude\n        addressData.longitude = res.longitude\n        this.setData({\n          addressData\n        })\n      },\n      fail: (e) => {\n        console.error(e)\n      },\n    })\n  },\n})\n\n"
  },
  {
    "path": "pages/ad/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/ad/index.wxml",
    "content": "<view class=\"container\" wx:if=\"{{addressList.length > 0 && addressEdit == false}}\">\n  <view class=\"address-list\">\n    <view class=\"a-address\" wx:for=\"{{addressList}}\" wx:key=\"id\">\n      <view class=\"left-text\" bindtap=\"selectTap\" data-id=\"{{item.id}}\">\n        <view class=\"name-tel\">\n          {{item.linkMan}} {{item.mobile}}\n        </view>\n        <view class=\"address-box\">\n          {{item.address}}\n        </view>\n      </view>\n\t\t\t<van-icon name=\"edit\" custom-class=\"right-edit\" size=\"36rpx\" bind:click=\"editAddress\" data-id=\"{{item.id}}\" />\n\t\t\t<van-icon name=\"delete\" custom-class=\"right-edit\" size=\"36rpx\" bind:click=\"deleteAddress\" data-id=\"{{item.id}}\" />\n    </view>\n  </view>\n  <view class=\"bottom-box\" bindtap=\"addAddress\" wx:if=\"{{addressList.length > 0 && addressEdit == false}}\">\n    <view class=\"add-btn\">\n      <van-icon name=\"add\" color=\"#e64340\" size=\"36rpx\" />\n      <view>{{ $t.ad_index.add }}</view>\n    </view>\n    <van-icon name=\"arrow\" size=\"36rpx\" />\n  </view>\n</view>\n\n<view class=\"empty-box\" wx:if=\"{{addressList == null && addressEdit == false}}\">\n\t<view class=\"content-1\">{{ $t.ad_index.empty }}</view>\n\t<view class=\"content-2\">{{ $t.ad_index.pleaseAdd }}</view>\n\t<van-button color=\"#e64340\" custom-class=\"button\" bindtap=\"addAddress\">{{ $t.ad_index.add }}</van-button>\n</view>\n\n<view class=\"addressEdit\" wx:if=\"{{addressEdit}}\">\n\t<van-field\n    value=\"{{ addressData.linkMan }}\"\n    label=\"{{ $t.ad_index.linkMan }}\"\n    placeholder=\"{{ $t.ad_index.linkManPlaceholder }}\"\n\t\tclearable\n    bind:change=\"linkManChange\"\n  />\n\t<van-field\n    value=\"{{ addressData.mobile }}\"\n    label=\"{{ $t.ad_index.mobile }}\"\n    placeholder=\"{{ $t.ad_index.mobilePlaceholder }}\"\n\t\ttype=\"number\"\n\t\tclearable\n    bind:change=\"mobileChange\"\n  />\n\t<picker mode=\"multiSelector\" range=\"{{pickerRegionRange}}\" range-key=\"name\" value=\"{{pickerSelect}}\" bindchange=\"bindchange\" bindcolumnchange=\"bindcolumnchange\">\n\t\t<van-field\n\t\t\tvalue=\"{{ showRegionStr }}\"\n\t\t\tlabel=\"{{ $t.ad_index.region }}\"\n\t\t\treadonly\n\t\t\tis-link\n\t\t/>\n\t</picker>\n  <van-cell title=\"{{ $t.ad_index.location }}\" value=\"{{ addressData.latitude ? (addressData.latitude + ',' + addressData.longitude) : $t.common.select }}\" is-link bind:click=\"chooseLocation\" />\n\t<van-field\n    value=\"{{ addressData.address }}\"\n    label=\"{{ $t.ad_index.address }}\"\n    placeholder=\"{{ $t.ad_index.addressPlaceholder }}\"\n\t\ttype=\"textarea\"\n\t\tautosize\n\t\tclearable\n    bind:change=\"addressChange\"\n  />\n\t<button class=\"save-btn\" bindtap=\"bindSave\">{{ $t.common.save }}</button>\n\t<button class=\"cancel-btn\" bindtap=\"editCancel\">{{ $t.common.cancel }}</button>\n</view>"
  },
  {
    "path": "pages/ad/index.wxss",
    "content": "/* 页面整体背景 - 温馨的奶茶色调 */\r\npage {\r\n  background: linear-gradient(135deg, #FFF5E4 0%, #FFE8CC 100%);\r\n  min-height: 100vh;\r\n} \r\n\r\n/* ========== 空地址状态 ========== */\r\n.content-1 {\r\n  font-size: 32rpx;\r\n  text-align: center;\r\n  margin-top: 240rpx;\r\n  color: #A0826D;\r\n  font-weight: 500;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n.content-2 {\r\n  font-size: 28rpx;\r\n  text-align: center;\r\n  margin-top: 24rpx;\r\n  color: #C9A88E;\r\n  letter-spacing: 1rpx;\r\n} \r\n\r\n.button {\r\n  width: 400rpx !important;\r\n  height: 100rpx !important;\r\n  margin-top: 180rpx;\r\n  margin-left: auto;\r\n  margin-right: auto;\r\n  font-size: 32rpx !important;\r\n  font-weight: 500;\r\n  border-radius: 50rpx !important;\r\n  box-shadow: 0 8rpx 24rpx rgba(230, 144, 115, 0.25);\r\n  background: linear-gradient(135deg, #FF9F7F 0%, #E68873 100%) !important;\r\n  display: block;\r\n}\r\n\r\n/* ========== 地址列表容器 ========== */\r\n.container {\r\n  background: transparent;\r\n  padding-bottom: 140rpx;\r\n  min-height: 100vh;\r\n}\r\n\r\n.address-list {\r\n  width: 100%;\r\n  background-color: transparent;\r\n  margin-top: 20rpx;\r\n  padding: 0 30rpx;\r\n  box-sizing: border-box;\r\n}\r\n\r\n/* 地址卡片 - 高级卡片设计 */\r\n.address-list .a-address {\r\n  width: 100%;\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  padding: 36rpx 32rpx;\r\n  margin-bottom: 24rpx;\r\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\r\n  border-radius: 24rpx;\r\n  box-shadow: 0 8rpx 32rpx rgba(160, 130, 109, 0.08);\r\n  border: 2rpx solid rgba(255, 255, 255, 0.8);\r\n  position: relative;\r\n  overflow: hidden;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n/* 卡片左侧装饰条 */\r\n.address-list .a-address::before {\r\n  content: '';\r\n  position: absolute;\r\n  left: 0;\r\n  top: 50%;\r\n  transform: translateY(-50%);\r\n  width: 6rpx;\r\n  height: 60%;\r\n  background: linear-gradient(180deg, #FF9F7F 0%, #E68873 100%);\r\n  border-radius: 0 6rpx 6rpx 0;\r\n}\r\n\r\n.a-address .left-text {\r\n  flex: 1;\r\n  padding-left: 24rpx;\r\n  box-sizing: border-box;\r\n}\r\n\r\n.a-address .left-text .name-tel {\r\n  margin-bottom: 20rpx;\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #5C4A42;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.a-address .left-text .address-box {\r\n  font-size: 26rpx;\r\n  color: #A0826D;\r\n  line-height: 40rpx;\r\n  letter-spacing: 0.5rpx;\r\n}\r\n\r\n/* 编辑和删除图标样式 */\r\n.right-edit {\r\n  margin-left: 24rpx;\r\n  padding: 12rpx;\r\n  border-radius: 50%;\r\n  background: rgba(255, 159, 127, 0.1);\r\n  color: #E68873 !important;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n/* ========== 底部添加按钮 ========== */\r\n.bottom-box {\r\n  position: fixed;\r\n  width: 100vw;\r\n  bottom: 0;\r\n  left: 0;\r\n  font-size: 30rpx;\r\n  color: #5C4A42;\r\n  height: 112rpx;\r\n  background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 251, 247, 0.98) 100%);\r\n  backdrop-filter: blur(20rpx);\r\n  line-height: 112rpx;\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  padding: 0 40rpx;\r\n  box-sizing: border-box;\r\n  border-top: 2rpx solid rgba(255, 159, 127, 0.15);\r\n  box-shadow: 0 -4rpx 24rpx rgba(160, 130, 109, 0.08);\r\n  z-index: 100;\r\n}\r\n\r\n.bottom-box .add-btn {\r\n  display: flex;\r\n  align-items: center;\r\n  font-weight: 500;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.bottom-box .add-btn view {\r\n  margin-left: 16rpx;\r\n  color: #E68873;\r\n}\r\n\r\n/* ========== 地址编辑表单 ========== */\r\n.addressEdit {\r\n  width: 100%;\r\n  min-height: 100vh;\r\n  padding: 32rpx 30rpx;\r\n  padding-bottom: 160rpx;\r\n  box-sizing: border-box;\r\n}\r\n\r\n/* 优化 van-field 和 van-cell 的背景 */\r\n.addressEdit ::deep .van-cell {\r\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%) !important;\r\n  border-radius: 16rpx !important;\r\n  margin-bottom: 20rpx !important;\r\n  box-shadow: 0 4rpx 16rpx rgba(160, 130, 109, 0.06) !important;\r\n  border: 2rpx solid rgba(255, 255, 255, 0.8) !important;\r\n  overflow: hidden;\r\n}\r\n\r\n.addressEdit ::deep .van-field__label {\r\n  color: #7D6A5E !important;\r\n  font-weight: 500;\r\n}\r\n\r\n.addressEdit ::deep .van-field__input,\r\n.addressEdit ::deep .van-field__value {\r\n  color: #5C4A42 !important;\r\n}\r\n\r\n.addressEdit ::deep .van-cell__value {\r\n  color: #A0826D !important;\r\n}\r\n\r\n/* 保存按钮 - 奶茶店主题渐变 */\r\n.save-btn {\r\n  margin-top: 80rpx;\r\n  height: 96rpx;\r\n  width: 100%;\r\n  font-size: 32rpx;\r\n  line-height: 96rpx;\r\n  color: white;\r\n  background: linear-gradient(135deg, #FF9F7F 0%, #E68873 100%);\r\n  border-radius: 48rpx;\r\n  border: none;\r\n  box-shadow: 0 8rpx 24rpx rgba(230, 136, 115, 0.3);\r\n  font-weight: 600;\r\n  letter-spacing: 4rpx;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n.save-btn::after {\r\n  border: none;\r\n}\r\n\r\n/* 取消按钮 */\r\n.cancel-btn {\r\n  margin-top: 24rpx;\r\n  height: 96rpx;\r\n  width: 100%;\r\n  font-size: 30rpx;\r\n  line-height: 96rpx;\r\n  color: #7D6A5E;\r\n  background: #FFFFFF;\r\n  border-radius: 48rpx;\r\n  border: 2rpx solid rgba(125, 106, 94, 0.2);\r\n  box-shadow: 0 4rpx 16rpx rgba(160, 130, 109, 0.08);\r\n  font-weight: 500;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n.cancel-btn::after {\r\n  border: none;\r\n}\r\n\r\n/* ========== 其他样式 ========== */\r\n.label {\r\n  padding-right: 30rpx;\r\n  color: #7D6A5E;\r\n  font-weight: 500;\r\n}\r\n\r\n.region-box {\r\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\r\n  padding: 0 32rpx;\r\n  height: 100rpx;\r\n  width: 100%;\r\n  display: flex;\r\n  flex-direction: row;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  font-size: 30rpx;\r\n  border-radius: 16rpx;\r\n  margin-bottom: 20rpx;\r\n  box-shadow: 0 4rpx 16rpx rgba(160, 130, 109, 0.06);\r\n}\r\n\r\n.row-wrap {\r\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\r\n  padding: 0 32rpx;\r\n  height: 100rpx;\r\n  width: 100%;\r\n  display: flex;\r\n  flex-direction: row;\r\n  align-items: center;\r\n  font-size: 30rpx;\r\n  border-radius: 16rpx;\r\n  margin-bottom: 20rpx;\r\n  box-shadow: 0 4rpx 16rpx rgba(160, 130, 109, 0.06);\r\n}\r\n\r\n.baocun {\r\n  width: 550rpx;\r\n  margin-left: 100rpx;\r\n  margin-right: 100rpx;\r\n  margin-top: 80rpx;\r\n  font-size: 50rpx;\r\n}\r\n\r\n.quxiao {\r\n  width: 550rpx;\r\n  margin-left: 100rpx;\r\n  margin-top: 50rpx;\r\n  font-size: 45rpx;\r\n  color: #7D6A5E !important;\r\n}\r\n.empty-box {\r\n  text-align: center;\r\n}"
  },
  {
    "path": "pages/all-orders/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\nPage({\n  data: {\n    apiOk: false\n  },\n  cancelOrderTap: function(e) {\n    const that = this;\n    const orderId = e.currentTarget.dataset.id;\n    wx.showModal({\n      confirmText: this.data.$t.common.confirm,\n      cancelText: this.data.$t.common.cancel,\n      content: this.data.$t.order.cancelProfile,\n      success: function(res) {\n        if (res.confirm) {\n          WXAPI.orderClose(wx.getStorageSync('token'), orderId).then(function(res) {\n            if (res.code == 0) {\n              that.onShow();\n            }\n          })\n        }\n      }\n    })\n  },\n  toPayTap: function(e) {\n    // 防止连续点击--开始\n    if (this.data.payButtonClicked) {\n      wx.showToast({\n        title: this.data.$t.common.doubleClick,\n        icon: 'none'\n      })\n      return\n    }\n    this.data.payButtonClicked = true\n    setTimeout(() => {\n      this.data.payButtonClicked = false\n    }, 3000)  // 可自行修改时间间隔（目前是3秒内只能点击一次支付按钮）\n    // 防止连续点击--结束\n    const that = this;\n    const orderId = e.currentTarget.dataset.id;\n    let money = e.currentTarget.dataset.money;\n    const needScore = e.currentTarget.dataset.score;\n    WXAPI.userAmount(wx.getStorageSync('token')).then(function(res) {\n      if (res.code == 0) {\n        // 增加提示框\n        if (res.data.score < needScore) {\n          wx.showToast({\n            title: that.data.$t.order.scoreNotEnough,\n            icon: 'none'\n          })\n          return;\n        }\n        let _msg = that.data.$t.order.amountReal + ' ' + money\n        if (res.data.balance > 0) {\n          _msg += ' ' + that.data.$t.order.balance + ' ' + res.data.balance\n          if (money - res.data.balance > 0) {\n            _msg += ' ' + that.data.$t.order.payAmount + ' ' + (money - res.data.balance)\n          }          \n        }\n        if (needScore > 0) {\n          _msg += ' ' + that.data.$t.order.payScore + ' ' + needScore\n        }\n        money = money - res.data.balance\n        wx.showModal({\n          content: _msg,\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          success: function (res) {\n            console.log(res);\n            if (res.confirm) {\n              that._toPayTap(orderId, money)\n            }\n          }\n        });\n      } else {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: that.data.$t.order.noCashAccount,\n          showCancel: false\n        })\n      }\n    })\n  },\n  _toPayTap: function (orderId, money){\n    const _this = this\n    if (money <= 0) {\n      // 直接使用余额支付\n      WXAPI.orderPay(wx.getStorageSync('token'), orderId).then(function (res) {\n        _this.onShow();\n      })\n    } else {\n      this.setData({\n        paymentShow: true,\n        orderId,\n        money,\n        nextAction: {\n          type: 0,\n          id: orderId\n        }\n      })\n    }\n  },\n  paymentOk(e) {\n    console.log(e.detail); // 这里是组件里data的数据\n    this.setData({\n      paymentShow: false\n    })\n    wx.redirectTo({\n      url: '/pages/all-orders/index',\n    })\n  },\n  paymentCancel() {\n    this.setData({\n      paymentShow: false\n    })\n  },\n  onLoad: function(options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.order.title,\n    })\n  },\n  onShow: function() {\n    AUTH.checkHasLogined().then(isLogined => {\n      if (isLogined) {\n        this.doneShow();\n      } else {\n        wx.showModal({\n          confirmText: this.data.$t.common.confirm,\n          cancelText: this.data.$t.common.cancel,\n          content: this.data.$t.auth.needLogin,\n          showCancel: false,\n          success: () => {\n            wx.navigateBack()\n          }\n        })\n      }\n    })\n  },\n  async doneShow() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.orderList({\n      token: wx.getStorageSync('token')\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      const orderList = res.data.orderList\n      orderList.forEach(ele => {\n        if (ele.status == -1) {\n          ele.statusStr = this.data.$t.order.status.st01\n        }\n        if (ele.status == 1 && ele.isNeedLogistics) {\n          ele.statusStr = this.data.$t.order.status.st11\n        }\n        if (ele.status == 1 && !ele.isNeedLogistics) {\n          ele.statusStr = this.data.$t.order.status.st10\n        }\n        if (ele.status == 3) {\n          ele.statusStr = this.data.$t.order.status.st3\n        }\n      })\n      this.setData({\n        orderList: res.data.orderList,\n        logisticsMap: res.data.logisticsMap,\n        goodsMap: res.data.goodsMap,\n        apiOk: true\n      });\n      \n    } else {\n      this.setData({\n        orderList: null,\n        logisticsMap: {},\n        goodsMap: {},\n        apiOk: true\n      });\n    }\n  },\n  toIndexPage: function() {\n    wx.switchTab({\n      url: \"/pages/index/index\"\n    });\n  },\n  // 删除订单\n  deleteOrder: function(e){\n    const that = this\n    const id = e.currentTarget.dataset.id;\n    \n    wx.showModal({\n      confirmText: this.data.$t.common.confirm,\n      cancelText: this.data.$t.common.cancel,\n      content: this.data.$t.order.deleteProfile,\n      success: function (res) {\n        if (res.confirm) {\n          WXAPI.orderDelete(wx.getStorageSync('token'), id).then(function (res) {  \n            if (res.code == 0) {\n              that.onShow(); //重新获取订单列表\n            }              \n            \n          })\n        }\n      }\n    })\n  },\n  async callShop(e) {\n    const shopId = e.currentTarget.dataset.shopid\n    const res = await WXAPI.shopSubdetail(shopId)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    wx.makePhoneCall({\n      phoneNumber: res.data.info.linkPhone,\n    })\n  },\n})"
  },
  {
    "path": "pages/all-orders/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/all-orders/index.wxml",
    "content": "<view class=\"container\">\n\t<!-- 空状态设计 -->\n\t<view wx:if=\"{{apiOk && !orderList}}\" class=\"no-order\">\n\t\t<view class=\"empty-icon\">☕</view>\n\t\t<view class=\"content-1\">{{ $t.order.empty.t1 }}</view>\n\t\t<view class=\"content-2\">{{ $t.order.empty.t2 }}</view>\n\t\t<view class=\"to-index-btn\" bindtap=\"toIndexPage\">\n\t\t\t<text class=\"btn-text\">{{ $t.order.empty.btn }}</text>\n\t\t</view>\n\t</view>\n\n\t<!-- 订单列表 -->\n\t<view wx:if=\"{{orderList}}\" class=\"order-list\">\n\t\t<view class=\"a-order\" wx:for=\"{{orderList}}\" wx:key=\"index\">\n\t\t\t<!-- 订单头部：店铺名称 + 订单状态 -->\n\t\t\t<navigator url=\"/pages/order-details/index?id={{item.id}}\" hover-class=\"order-hover\">\n\t\t\t\t<view class=\"order-header\">\n\t\t\t\t\t<view class=\"shop-info\">\n\t\t\t\t\t\t<text class=\"shop-icon\">🏪</text>\n\t\t\t\t\t\t<text class=\"shop-name\">{{item.shopNameZt}}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"order-status {{item.status == 0 ? 'status-pending' : item.status == -1 ? 'status-cancel' : 'status-success'}}\">\n\t\t\t\t\t\t<text class=\"status-text\">{{item.statusStr}}</text>\n\t\t\t\t\t\t<text class=\"arrow\">›</text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</navigator>\n\n\t\t\t<!-- 商品图片横向滚动 -->\n\t\t\t<scroll-view class=\"goods-scroll\" scroll-x=\"true\" show-scrollbar=\"{{false}}\">\n\t\t\t\t<view class=\"goods-container\">\n\t\t\t\t\t<view class=\"goods-item\" wx:for=\"{{goodsMap[item.id]}}\" wx:key=\"index\" wx:for-item=\"goods\">\n\t\t\t\t\t\t<image mode=\"aspectFill\" src=\"{{goods.pic}}\" class=\"goods-img\"></image>\n\t\t\t\t\t\t<view class=\"goods-badge\">{{index + 1}}</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</scroll-view>\n\n\t\t\t<!-- 订单信息区域 -->\n\t\t\t<view class=\"order-detail\">\n\t\t\t\t<view class=\"detail-row\">\n\t\t\t\t\t<view class=\"detail-label\">\n\t\t\t\t\t\t<text class=\"label-icon\">📅</text>\n\t\t\t\t\t\t<text>{{ $t.order.dateAdd }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"detail-value\">{{item.dateAdd}}</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"detail-row\">\n\t\t\t\t\t<view class=\"detail-label\">\n\t\t\t\t\t\t<text class=\"label-icon\">🔖</text>\n\t\t\t\t\t\t<text>{{ $t.order.orderNumber }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"detail-value\">{{item.orderNumber}}</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\n\t\t\t<!-- 价格和操作区域 -->\n\t\t\t<view class=\"order-footer\">\n\t\t\t\t<view class=\"price-area\">\n\t\t\t\t\t<text class=\"price-label\">实付金额</text>\n\t\t\t\t\t<view class=\"price-value\">\n\t\t\t\t\t\t<text class=\"currency\">¥</text>\n\t\t\t\t\t\t<text class=\"amount\">{{item.amountReal}}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"action-btns\">\n\t\t\t\t\t<view wx:if=\"{{item.status > 0}}\" class=\"order-btn btn-secondary\" bindtap=\"callShop\" data-shopid=\"{{item.shopIdZt}}\">\n\t\t\t\t\t\t<text class=\"btn-icon\">📞</text>\n\t\t\t\t\t\t<text>{{ $t.order.callShop }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view wx:if=\"{{item.status== -1}}\" class=\"order-btn btn-danger\" bindtap=\"deleteOrder\" data-id=\"{{item.id}}\">\n\t\t\t\t\t\t<text class=\"btn-icon\">🗑</text>\n\t\t\t\t\t\t<text>{{ $t.order.deleteOrder }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view wx:if=\"{{item.status== 0}}\" class=\"order-btn btn-cancel\" bindtap=\"cancelOrderTap\" data-id=\"{{item.id}}\">\n\t\t\t\t\t\t<text>{{ $t.order.cancelOrder }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view wx:if=\"{{item.status== 0}}\" class=\"order-btn btn-primary\" bindtap=\"toPayTap\" data-id=\"{{item.id}}\" data-money=\"{{item.amountReal}}\" data-score=\"{{item.score}}\">\n\t\t\t\t\t\t<text class=\"btn-icon\">💳</text>\n\t\t\t\t\t\t<text>{{ $t.order.toPayTap }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n\t\n\t<!-- 底部安全区域 -->\n\t<view class=\"safeAreaOldMarginBttom safeAreaNewMarginBttom\"></view>\n</view>\n\n<!-- 支付组件 -->\n<payment\n  money=\"{{ money }}\"\n  remark=\"{{ $t.payment.order }} ：{{ orderId }}\"\n  nextAction=\"{{ nextAction }}\"\n  show=\"{{ paymentShow }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>"
  },
  {
    "path": "pages/all-orders/index.wxss",
    "content": "/* ===========================================\r\n   奶茶店订单管理页面 - 高端设计风格\r\n   =========================================== */\r\n\r\n/* 页面容器 - 奶茶店温暖渐变背景 */\r\n.container {\r\n  width: 100%;\r\n  min-height: 100vh;\r\n  background: linear-gradient(180deg, #FFF9F5 0%, #FFF3EC 50%, #FFEEE5 100%);\r\n  padding: 24rpx 0;\r\n  box-sizing: border-box;\r\n}\r\n\r\n/* ===========================================\r\n   空状态设计 - 精致优雅\r\n   =========================================== */\r\n.no-order {\r\n  margin: 160rpx auto 0;\r\n  padding: 100rpx 60rpx;\r\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFAF7 100%);\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: center;\r\n  align-items: center;\r\n  border-radius: 40rpx;\r\n  width: 660rpx;\r\n  box-shadow: 0 16rpx 48rpx rgba(207, 142, 99, 0.12),\r\n              0 4rpx 16rpx rgba(207, 142, 99, 0.08);\r\n  position: relative;\r\n  overflow: hidden;\r\n}\r\n\r\n.no-order::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  height: 6rpx;\r\n  background: linear-gradient(90deg, #E8B899 0%, #CF8E63 50%, #E8B899 100%);\r\n}\r\n\r\n.empty-icon {\r\n  font-size: 120rpx;\r\n  margin-bottom: 32rpx;\r\n  opacity: 0.85;\r\n  animation: float 3s ease-in-out infinite;\r\n}\r\n\r\n@keyframes float {\r\n  0%, 100% { transform: translateY(0rpx); }\r\n  50% { transform: translateY(-12rpx); }\r\n}\r\n\r\n.content-1 {\r\n  font-size: 36rpx;\r\n  font-weight: 600;\r\n  text-align: center;\r\n  color: #8B6F47;\r\n  margin-bottom: 20rpx;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n.content-2 {\r\n  font-size: 28rpx;\r\n  text-align: center;\r\n  color: #B8977D;\r\n  line-height: 1.8;\r\n  margin-bottom: 12rpx;\r\n}\r\n\r\n.to-index-btn {\r\n  margin-top: 56rpx;\r\n  background: linear-gradient(135deg, #E8B899 0%, #CF8E63 100%);\r\n  border-radius: 56rpx;\r\n  width: 360rpx;\r\n  height: 96rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  box-shadow: 0 12rpx 32rpx rgba(207, 142, 99, 0.3);\r\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.to-index-btn:active {\r\n  transform: scale(0.96);\r\n  box-shadow: 0 8rpx 24rpx rgba(207, 142, 99, 0.25);\r\n}\r\n\r\n.btn-text {\r\n  color: #FFFFFF;\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  letter-spacing: 3rpx;\r\n}\r\n\r\n/* ===========================================\r\n   订单列表容器\r\n   =========================================== */\r\n.order-list {\r\n  width: 100%;\r\n  padding: 0 24rpx;\r\n  box-sizing: border-box;\r\n}\r\n\r\n/* ===========================================\r\n   订单卡片 - 高端精致设计\r\n   =========================================== */\r\n.a-order {\r\n  width: 100%;\r\n  background: #FFFFFF;\r\n  margin-bottom: 32rpx;\r\n  border-radius: 32rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 8rpx 32rpx rgba(139, 111, 71, 0.1),\r\n              0 2rpx 8rpx rgba(139, 111, 71, 0.06);\r\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n  position: relative;\r\n}\r\n\r\n.a-order::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  height: 6rpx;\r\n  background: linear-gradient(90deg, #E8B899 0%, #CF8E63 30%, #E8B899 70%, #CF8E63 100%);\r\n  z-index: 10;\r\n}\r\n\r\n.order-hover {\r\n  opacity: 0.95;\r\n}\r\n\r\n/* 订单头部 */\r\n.order-header {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  padding: 32rpx 32rpx 24rpx;\r\n  background: linear-gradient(180deg, #FFFBF8 0%, #FFFFFF 100%);\r\n  border-bottom: 2rpx solid #F8F1EB;\r\n}\r\n\r\n.shop-info {\r\n  display: flex;\r\n  align-items: center;\r\n  flex: 1;\r\n}\r\n\r\n.shop-icon {\r\n  font-size: 36rpx;\r\n  margin-right: 12rpx;\r\n}\r\n\r\n.shop-name {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #5A4A3A;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.order-status {\r\n  display: flex;\r\n  align-items: center;\r\n  padding: 8rpx 20rpx;\r\n  border-radius: 28rpx;\r\n  font-size: 26rpx;\r\n  font-weight: 500;\r\n}\r\n\r\n.status-pending {\r\n  background: linear-gradient(135deg, #FFF3E0 0%, #FFE8CC 100%);\r\n  color: #FF9800;\r\n}\r\n\r\n.status-cancel {\r\n  background: linear-gradient(135deg, #FFEBEE 0%, #FFCDD2 100%);\r\n  color: #E53935;\r\n}\r\n\r\n.status-success {\r\n  background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);\r\n  color: #43A047;\r\n}\r\n\r\n.status-text {\r\n  margin-right: 6rpx;\r\n}\r\n\r\n.arrow {\r\n  font-size: 32rpx;\r\n  font-weight: 300;\r\n}\r\n\r\n/* ===========================================\r\n   商品图片滚动区域\r\n   =========================================== */\r\n.goods-scroll {\r\n  width: 100%;\r\n  padding: 32rpx 0;\r\n  box-sizing: border-box;\r\n  white-space: nowrap;\r\n}\r\n\r\n.goods-container {\r\n  padding: 0 24rpx;\r\n  display: inline-flex;\r\n  gap: 20rpx;\r\n}\r\n\r\n.goods-item {\r\n  width: 160rpx;\r\n  height: 160rpx;\r\n  position: relative;\r\n  flex-shrink: 0;\r\n}\r\n\r\n.goods-img {\r\n  width: 100%;\r\n  height: 100%;\r\n  border-radius: 24rpx;\r\n  background: linear-gradient(135deg, #FFF5F0 0%, #FFEBE0 100%);\r\n  box-shadow: 0 4rpx 16rpx rgba(207, 142, 99, 0.15);\r\n  border: 3rpx solid #FFFFFF;\r\n}\r\n\r\n.goods-badge {\r\n  position: absolute;\r\n  top: -8rpx;\r\n  right: -8rpx;\r\n  width: 40rpx;\r\n  height: 40rpx;\r\n  background: linear-gradient(135deg, #E8B899 0%, #CF8E63 100%);\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  font-size: 22rpx;\r\n  font-weight: 600;\r\n  color: #FFFFFF;\r\n  box-shadow: 0 4rpx 12rpx rgba(207, 142, 99, 0.4);\r\n  border: 3rpx solid #FFFFFF;\r\n}\r\n\r\n/* ===========================================\r\n   订单详情信息\r\n   =========================================== */\r\n.order-detail {\r\n  padding: 24rpx 32rpx;\r\n  background: linear-gradient(180deg, #FFFBF8 0%, #FFFFFF 100%);\r\n  border-top: 2rpx solid #F8F1EB;\r\n  border-bottom: 2rpx solid #F8F1EB;\r\n}\r\n\r\n.detail-row {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  margin-bottom: 16rpx;\r\n}\r\n\r\n.detail-row:last-child {\r\n  margin-bottom: 0;\r\n}\r\n\r\n.detail-label {\r\n  display: flex;\r\n  align-items: center;\r\n  font-size: 26rpx;\r\n  color: #8B7355;\r\n  font-weight: 400;\r\n}\r\n\r\n.label-icon {\r\n  font-size: 28rpx;\r\n  margin-right: 8rpx;\r\n}\r\n\r\n.detail-value {\r\n  font-size: 24rpx;\r\n  color: #A08875;\r\n  font-family: 'SF Mono', 'Menlo', 'Monaco', monospace;\r\n}\r\n\r\n/* ===========================================\r\n   价格和操作区域\r\n   =========================================== */\r\n.order-footer {\r\n  padding: 28rpx 32rpx;\r\n  background: #FFFFFF;\r\n}\r\n\r\n.price-area {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: baseline;\r\n  margin-bottom: 24rpx;\r\n  padding-bottom: 24rpx;\r\n  border-bottom: 2rpx dashed #F0E6DB;\r\n}\r\n\r\n.price-label {\r\n  font-size: 28rpx;\r\n  color: #8B7355;\r\n  font-weight: 500;\r\n}\r\n\r\n.price-value {\r\n  display: flex;\r\n  align-items: baseline;\r\n}\r\n\r\n.currency {\r\n  font-size: 32rpx;\r\n  color: #CF8E63;\r\n  font-weight: 600;\r\n  margin-right: 4rpx;\r\n}\r\n\r\n.amount {\r\n  font-size: 48rpx;\r\n  font-weight: 700;\r\n  color: #CF8E63;\r\n  font-family: -apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"Helvetica Neue\", sans-serif;\r\n  letter-spacing: -1rpx;\r\n}\r\n\r\n/* 操作按钮组 */\r\n.action-btns {\r\n  display: flex;\r\n  justify-content: flex-end;\r\n  gap: 16rpx;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n.order-btn {\r\n  padding: 16rpx 32rpx;\r\n  border-radius: 48rpx;\r\n  font-size: 26rpx;\r\n  font-weight: 500;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n  border: 2rpx solid transparent;\r\n  letter-spacing: 1rpx;\r\n  min-width: 140rpx;\r\n}\r\n\r\n.order-btn:active {\r\n  transform: scale(0.95);\r\n}\r\n\r\n.btn-icon {\r\n  margin-right: 6rpx;\r\n  font-size: 28rpx;\r\n}\r\n\r\n/* 主要按钮 - 渐变奶茶色 */\r\n.btn-primary {\r\n  background: linear-gradient(135deg, #E8B899 0%, #CF8E63 100%);\r\n  color: #FFFFFF;\r\n  box-shadow: 0 6rpx 20rpx rgba(207, 142, 99, 0.35);\r\n}\r\n\r\n.btn-primary:active {\r\n  box-shadow: 0 4rpx 12rpx rgba(207, 142, 99, 0.3);\r\n}\r\n\r\n/* 次要按钮 */\r\n.btn-secondary {\r\n  background: #FFFFFF;\r\n  color: #8B7355;\r\n  border-color: #E0D3C5;\r\n}\r\n\r\n.btn-secondary:active {\r\n  background: #FFF9F5;\r\n}\r\n\r\n/* 取消按钮 */\r\n.btn-cancel {\r\n  background: #FFFFFF;\r\n  color: #999;\r\n  border-color: #E5E5E5;\r\n}\r\n\r\n.btn-cancel:active {\r\n  background: #F8F8F8;\r\n}\r\n\r\n/* 危险按钮 */\r\n.btn-danger {\r\n  background: linear-gradient(135deg, #FFE5E5 0%, #FFD5D5 100%);\r\n  color: #E53935;\r\n  border-color: #FFB8B8;\r\n}\r\n\r\n.btn-danger:active {\r\n  background: linear-gradient(135deg, #FFD5D5 0%, #FFC5C5 100%);\r\n}\r\n\r\n/* ===========================================\r\n   底部安全区域\r\n   =========================================== */\r\n.safeAreaOldMarginBttom,\r\n.safeAreaNewMarginBttom {\r\n  height: 40rpx;\r\n}"
  },
  {
    "path": "pages/asset/cash-log.js",
    "content": "const APP = getApp()\nconst WXAPI = require('apifm-wxapi')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.cashLog.title,\n    })\n    this.cashLogsV2()\n  },\n  onShow: function () {\n\n  },\n  async cashLogsV2() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.cashLogsV2({\n      token: wx.getStorageSync('token'),\n      page:1,\n      pageSize:500\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        cashLogsV2: res.data.result\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/asset/cash-log.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/asset/cash-log.wxml",
    "content": "<view class=\"cash-log-container\">\n  <!-- 顶部装饰区域 -->\n  <view class=\"header-decoration\">\n    <view class=\"circle-decoration circle-1\"></view>\n    <view class=\"circle-decoration circle-2\"></view>\n    <view class=\"circle-decoration circle-3\"></view>\n  </view>\n\n  <!-- 资金明细列表 -->\n  <view class=\"cash-log-list\" wx:if=\"{{cashLogsV2 && cashLogsV2.length > 0}}\">\n    <view class=\"log-item\" wx:for=\"{{cashLogsV2}}\" wx:key=\"id\">\n      <view class=\"log-card\">\n        <view class=\"log-content\">\n          <!-- 左侧图标和信息 -->\n          <view class=\"log-left\">\n            <view class=\"icon-wrapper {{item.amount >= 0 ? 'income' : 'expense'}}\">\n              <text class=\"icon\">{{item.amount >= 0 ? '+' : '-'}}</text>\n            </view>\n            <view class=\"log-info\">\n              <text class=\"log-type\">{{item.typeStr}}</text>\n              <text class=\"log-date\">{{item.dateAdd}}</text>\n            </view>\n          </view>\n          \n          <!-- 右侧金额 -->\n          <view class=\"log-right\">\n            <text class=\"amount {{item.amount >= 0 ? 'income' : 'expense'}}\">\n              {{item.amount >= 0 ? '+' : ''}}¥{{item.amount}}\n            </text>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 空状态 -->\n  <view class=\"empty-state\" wx:if=\"{{!cashLogsV2 || cashLogsV2.length == 0}}\">\n    <view class=\"empty-icon\">💰</view>\n    <text class=\"empty-text\">{{ $t.common.empty || '暂无资金明细' }}</text>\n    <text class=\"empty-tips\">您的每一笔收支都会记录在这里哦~</text>\n  </view>\n</view>"
  },
  {
    "path": "pages/asset/cash-log.wxss",
    "content": "/* pages/asset/cash-log.wxss */\n\npage {\n  background: linear-gradient(180deg, #FFF5E6 0%, #FFFBF5 100%);\n  min-height: 100vh;\n}\n\n.cash-log-container {\n  min-height: 100vh;\n  padding-bottom: 40rpx;\n  position: relative;\n}\n\n/* 顶部装饰 */\n.header-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 300rpx;\n  overflow: hidden;\n  pointer-events: none;\n}\n\n.circle-decoration {\n  position: absolute;\n  border-radius: 50%;\n  opacity: 0.15;\n}\n\n.circle-1 {\n  width: 400rpx;\n  height: 400rpx;\n  background: linear-gradient(135deg, #FFD4A3 0%, #FFA87D 100%);\n  top: -200rpx;\n  right: -100rpx;\n}\n\n.circle-2 {\n  width: 200rpx;\n  height: 200rpx;\n  background: linear-gradient(135deg, #FFC4A3 0%, #FF9A7D 100%);\n  top: 50rpx;\n  left: -50rpx;\n}\n\n.circle-3 {\n  width: 150rpx;\n  height: 150rpx;\n  background: linear-gradient(135deg, #FFE4C4 0%, #FFDAB9 100%);\n  top: 180rpx;\n  right: 80rpx;\n}\n\n/* 明细列表 */\n.cash-log-list {\n  padding: 32rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.log-item {\n  margin-bottom: 24rpx;\n  animation: slideIn 0.4s ease-out;\n}\n\n@keyframes slideIn {\n  from {\n    opacity: 0;\n    transform: translateY(20rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.log-card {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  box-shadow: 0 4rpx 20rpx rgba(255, 164, 125, 0.08);\n  overflow: hidden;\n  transition: all 0.3s ease;\n}\n\n.log-card:active {\n  transform: scale(0.98);\n  box-shadow: 0 2rpx 12rpx rgba(255, 164, 125, 0.12);\n}\n\n.log-content {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 32rpx;\n}\n\n/* 左侧内容 */\n.log-left {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  overflow: hidden;\n}\n\n.icon-wrapper {\n  width: 88rpx;\n  height: 88rpx;\n  border-radius: 20rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 24rpx;\n  flex-shrink: 0;\n}\n\n.icon-wrapper.income {\n  background: linear-gradient(135deg, #FFE8D6 0%, #FFD4BB 100%);\n}\n\n.icon-wrapper.expense {\n  background: linear-gradient(135deg, #E8E8E8 0%, #D4D4D4 100%);\n}\n\n.icon-wrapper .icon {\n  font-size: 40rpx;\n  font-weight: 600;\n}\n\n.icon-wrapper.income .icon {\n  color: #FF8A50;\n}\n\n.icon-wrapper.expense .icon {\n  color: #999999;\n}\n\n.log-info {\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n}\n\n.log-type {\n  font-size: 32rpx;\n  font-weight: 500;\n  color: #333333;\n  margin-bottom: 8rpx;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.log-date {\n  font-size: 24rpx;\n  color: #999999;\n  line-height: 1.5;\n}\n\n/* 右侧金额 */\n.log-right {\n  margin-left: 24rpx;\n  flex-shrink: 0;\n}\n\n.amount {\n  font-size: 36rpx;\n  font-weight: 600;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n}\n\n.amount.income {\n  color: #FF8A50;\n}\n\n.amount.expense {\n  color: #666666;\n}\n\n/* 空状态 */\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 200rpx 60rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.empty-icon {\n  font-size: 120rpx;\n  margin-bottom: 32rpx;\n  opacity: 0.6;\n}\n\n.empty-text {\n  font-size: 32rpx;\n  color: #999999;\n  margin-bottom: 16rpx;\n  font-weight: 500;\n}\n\n.empty-tips {\n  font-size: 26rpx;\n  color: #CCCCCC;\n  text-align: center;\n  line-height: 1.6;\n}"
  },
  {
    "path": "pages/asset/index.js",
    "content": "const APP = getApp()\nconst WXAPI = require('apifm-wxapi')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    balance: 0.00,\n    ruleSelIndex: 0,\n    showRechargePop: false\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.asset.title,\n    })\n    this.rechargeRule()\n  },\n  onShow: function () {\n    this.getUserAmount()\n  },\n  async getUserAmount() {\n    const res = await WXAPI.userAmount(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        balance: res.data.balance.toFixed(2),\n        freeze: res.data.freeze.toFixed(2),\n        score: res.data.score,\n        growth: res.data.growth\n      })\n    }\n  },\n  async rechargeRule() {\n    const res = await WXAPI.rechargeSendRules()\n    if (res.code == 0) {\n      this.setData({\n        rechargeSendRules: res.data\n      })\n    }\n  },\n  changePersionNum(e) {\n    if (e.currentTarget.dataset.idx == -1) {\n      this.data.showRechargePop = true\n    }\n    this.setData({\n      ruleSelIndex: e.currentTarget.dataset.idx,\n      showRechargePop: this.data.showRechargePop,\n      amount2: null\n    })\n  },\n  submit1() {\n    if (this.data.ruleSelIndex == -1) {\n      this.setData({\n        showRechargePop: true,\n        amount2: null\n      })\n      return\n    }\n    const amount = this.data.rechargeSendRules[this.data.ruleSelIndex].confine\n    this.wxpay(amount);\n  },\n  onClose() {\n    this.setData({\n      showRechargePop: false\n    })\n  },\n  submit2() {\n    if (!this.data.amount2) {\n      wx.showToast({\n        title: this.data.$t.asset.amountPlaceholder,\n        icon: 'none'\n      })\n      return\n    }\n    this.wxpay(this.data.amount2);\n  },\n  wxpay(money) {\n    this.setData({\n      paymentShow: true,\n      money\n    })\n  },\n  paymentOk(e) {\n    console.log(e.detail); // 这里是组件里data的数据\n    this.setData({\n      paymentShow: false,\n      showRechargePop: false\n    })\n    this.getUserAmount()\n  },\n  paymentCancel() {\n    this.setData({\n      paymentShow: false\n    })\n  },\n})"
  },
  {
    "path": "pages/asset/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/asset/index.wxml",
    "content": "<!-- 页面容器 -->\n<view class=\"wallet-container\">\n  \n  <!-- 余额卡片 -->\n  <view class=\"balance-card\">\n    <view class=\"balance-header\">\n      <view class=\"balance-icon\">💰</view>\n      <view class=\"balance-label\">{{ $t.order.balance }}</view>\n    </view>\n    <view class=\"balance-amount\">\n      <text class=\"currency\">¥</text>\n      <text class=\"amount-num\">{{balance}}</text>\n    </view>\n    <view class=\"balance-decoration\">\n      <view class=\"circle circle-1\"></view>\n      <view class=\"circle circle-2\"></view>\n      <view class=\"circle circle-3\"></view>\n    </view>\n  </view>\n\n  <!-- 充值区域 -->\n  <view class=\"recharge-section\">\n    <view class=\"section-title\">\n      <view class=\"title-icon\">🎁</view>\n      <view class=\"title-text\">{{ $t.asset.recharge }}</view>\n      <view class=\"title-line\"></view>\n    </view>\n\n    <!-- 充值套餐 -->\n    <view class=\"recharge-plans\">\n      <view \n        wx:for=\"{{rechargeSendRules}}\" \n        wx:key=\"id\" \n        class=\"plan-card {{ruleSelIndex == index ? 'plan-active' : ''}}\" \n        data-idx=\"{{index}}\" \n        bindtap=\"changePersionNum\">\n        <view class=\"plan-badge\" wx:if=\"{{item.send > 0}}\">送¥{{item.send}}</view>\n        <view class=\"plan-amount\">\n          <text class=\"plan-currency\">¥</text>\n          <text class=\"plan-number\">{{item.confine}}</text>\n        </view>\n        <view class=\"plan-label\">{{ $t.asset.confine }}</view>\n        <view class=\"plan-check\" wx:if=\"{{ruleSelIndex == index}}\">\n          <van-icon name=\"success\" color=\"#fff\" size=\"16px\" />\n        </view>\n        <view class=\"plan-shine\" wx:if=\"{{ruleSelIndex == index}}\"></view>\n      </view>\n\n      <!-- 自定义金额 -->\n      <view \n        class=\"plan-card plan-custom {{ruleSelIndex == -1 ? 'plan-active' : ''}}\" \n        data-idx=\"-1\" \n        bindtap=\"changePersionNum\">\n        <view class=\"custom-icon\">✏️</view>\n        <view class=\"custom-text\">{{ $t.asset.other }}</view>\n        <view class=\"plan-check\" wx:if=\"{{ruleSelIndex == -1}}\">\n          <van-icon name=\"success\" color=\"#fff\" size=\"16px\" />\n        </view>\n        <view class=\"plan-shine\" wx:if=\"{{ruleSelIndex == -1}}\"></view>\n      </view>\n    </view>\n\n    <!-- 确认按钮 -->\n    <view class=\"action-btn\">\n      <view class=\"submit-btn\" bind:tap=\"submit1\">\n        <text>{{ $t.asset.confirmBtn }}</text>\n      </view>\n    </view>\n  </view>\n\n  <!-- 功能入口 -->\n  <view class=\"function-section\">\n    <view class=\"section-title\">\n      <view class=\"title-icon\">📋</view>\n      <view class=\"title-text\">账户记录</view>\n      <view class=\"title-line\"></view>\n    </view>\n\n    <view class=\"function-list\">\n      <navigator url=\"/pages/asset/recharge-log\" class=\"function-item\" hover-class=\"function-item-hover\">\n        <view class=\"function-icon-box recharge-icon\">\n          <text class=\"function-emoji\">💳</text>\n        </view>\n        <view class=\"function-content\">\n          <view class=\"function-title\">{{ $t.asset.rechargeLogs }}</view>\n          <view class=\"function-desc\">查看充值明细</view>\n        </view>\n        <van-icon name=\"arrow\" color=\"#bbb\" />\n      </navigator>\n\n      <navigator url=\"/pages/asset/cash-log\" class=\"function-item\" hover-class=\"function-item-hover\">\n        <view class=\"function-icon-box cash-icon\">\n          <text class=\"function-emoji\">💸</text>\n        </view>\n        <view class=\"function-content\">\n          <view class=\"function-title\">{{ $t.cashLog.title }}</view>\n          <view class=\"function-desc\">查看提现记录</view>\n        </view>\n        <van-icon name=\"arrow\" color=\"#bbb\" />\n      </navigator>\n    </view>\n  </view>\n\n</view>\n\n<!-- 自定义金额弹窗 -->\n<van-popup\n  show=\"{{ showRechargePop }}\"\n  position=\"bottom\"\n  round\n  closeable\n  bind:close=\"onClose\"\n  custom-class=\"custom-popup\">\n  <view class=\"popup-content\">\n    <view class=\"popup-title\">自定义充值金额</view>\n    <van-field\n      label=\"{{ $t.asset.amount }}\"\n      size=\"large\"\n      type=\"digit\"\n      clearable\n      model:value=\"{{ amount2 }}\"\n      placeholder=\"{{ $t.asset.amountPlaceholder }}\"\n      bind:change=\"onChange\"\n      input-align=\"right\"\n    />\n    <view class=\"popup-btn\">\n      <view class=\"submit-btn\" bind:tap=\"submit2\">\n        <text>{{ $t.asset.confirmBtn }}</text>\n      </view>\n    </view>\n  </view>\n</van-popup>\n<view class=\"bottom-blank\"></view>\n\n<payment\n  money=\"{{ money }}\"\n  remark=\"{{ $t.payment.recharge }}\"\n  show=\"{{ paymentShow }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>"
  },
  {
    "path": "pages/asset/index.wxss",
    "content": "/* ========== 页面容器 ========== */\npage {\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE4C4 100%);\n  min-height: 100vh;\n}\n\n.wallet-container {\n  padding: 32rpx;\n  padding-bottom: 40rpx;\n}\n\n/* ========== 余额卡片 ========== */\n.balance-card {\n  position: relative;\n  background: linear-gradient(135deg, #8B6F47 0%, #A0826D 50%, #8B6F47 100%);\n  border-radius: 32rpx;\n  padding: 48rpx 40rpx;\n  margin-bottom: 40rpx;\n  overflow: hidden;\n  box-shadow: 0 16rpx 48rpx rgba(139, 111, 71, 0.3);\n}\n\n.balance-header {\n  display: flex;\n  align-items: center;\n  margin-bottom: 24rpx;\n}\n\n.balance-icon {\n  font-size: 40rpx;\n  margin-right: 16rpx;\n}\n\n.balance-label {\n  font-size: 28rpx;\n  color: rgba(255, 255, 255, 0.9);\n  letter-spacing: 2rpx;\n}\n\n.balance-amount {\n  display: flex;\n  align-items: baseline;\n  margin-bottom: 16rpx;\n}\n\n.currency {\n  font-size: 40rpx;\n  color: #fff;\n  font-weight: bold;\n  margin-right: 8rpx;\n}\n\n.amount-num {\n  font-size: 88rpx;\n  color: #fff;\n  font-weight: bold;\n  letter-spacing: 2rpx;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n/* 装饰圆圈 */\n.balance-decoration {\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  pointer-events: none;\n}\n\n.circle {\n  position: absolute;\n  border-radius: 50%;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.circle-1 {\n  width: 200rpx;\n  height: 200rpx;\n  right: -60rpx;\n  top: -60rpx;\n}\n\n.circle-2 {\n  width: 120rpx;\n  height: 120rpx;\n  right: 60rpx;\n  bottom: -40rpx;\n}\n\n.circle-3 {\n  width: 80rpx;\n  height: 80rpx;\n  right: -20rpx;\n  top: 50%;\n  background: rgba(255, 255, 255, 0.08);\n}\n\n/* ========== 充值区域 ========== */\n.recharge-section {\n  margin-bottom: 40rpx;\n}\n\n.section-title {\n  display: flex;\n  align-items: center;\n  margin-bottom: 32rpx;\n  position: relative;\n}\n\n.title-icon {\n  font-size: 36rpx;\n  margin-right: 12rpx;\n}\n\n.title-text {\n  font-size: 32rpx;\n  font-weight: bold;\n  color: #5D4037;\n  letter-spacing: 1rpx;\n}\n\n.title-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(to right, rgba(139, 111, 71, 0.2), transparent);\n  margin-left: 20rpx;\n}\n\n/* ========== 充值套餐 ========== */\n.recharge-plans {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  margin-bottom: 32rpx;\n}\n\n.plan-card {\n  width: 215rpx;\n  height: 200rpx;\n  background: #fff;\n  border-radius: 24rpx;\n  margin-bottom: 24rpx;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n  overflow: hidden;\n  box-shadow: 0 8rpx 24rpx rgba(139, 111, 71, 0.1);\n  transition: all 0.3s ease;\n  border: 3rpx solid transparent;\n}\n\n.plan-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF 100%);\n  z-index: 0;\n}\n\n.plan-card > view {\n  position: relative;\n  z-index: 1;\n}\n\n/* 选中状态 */\n.plan-active {\n  border-color: #8B6F47;\n  box-shadow: 0 12rpx 32rpx rgba(139, 111, 71, 0.25);\n  transform: translateY(-4rpx);\n}\n\n.plan-active::before {\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFE4C4 100%);\n}\n\n/* 赠送标签 */\n.plan-badge {\n  position: absolute;\n  top: 12rpx;\n  right: -40rpx;\n  background: linear-gradient(135deg, #FF6B6B, #FF8E53);\n  color: #fff;\n  font-size: 20rpx;\n  padding: 4rpx 48rpx;\n  transform: rotate(45deg);\n  box-shadow: 0 4rpx 8rpx rgba(255, 107, 107, 0.3);\n  z-index: 2;\n  font-weight: bold;\n}\n\n/* 金额显示 */\n.plan-amount {\n  display: flex;\n  align-items: baseline;\n  margin-bottom: 8rpx;\n}\n\n.plan-currency {\n  font-size: 28rpx;\n  color: #8B6F47;\n  font-weight: bold;\n  margin-right: 4rpx;\n}\n\n.plan-number {\n  font-size: 56rpx;\n  color: #5D4037;\n  font-weight: bold;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n.plan-label {\n  font-size: 24rpx;\n  color: #999;\n}\n\n/* 选中图标 */\n.plan-check {\n  position: absolute;\n  top: 12rpx;\n  left: 12rpx;\n  width: 32rpx;\n  height: 32rpx;\n  background: linear-gradient(135deg, #8B6F47, #A0826D);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 4rpx 12rpx rgba(139, 111, 71, 0.4);\n}\n\n/* 选中光效 */\n.plan-shine {\n  position: absolute;\n  top: -50%;\n  left: -50%;\n  width: 200%;\n  height: 200%;\n  background: radial-gradient(circle, rgba(139, 111, 71, 0.1) 0%, transparent 70%);\n  animation: shine 2s ease-in-out infinite;\n}\n\n@keyframes shine {\n  0%, 100% { opacity: 0.5; }\n  50% { opacity: 1; }\n}\n\n/* 自定义金额卡片 */\n.plan-custom {\n  background: linear-gradient(135deg, #F5F5F5, #FFF);\n}\n\n.custom-icon {\n  font-size: 56rpx;\n  margin-bottom: 12rpx;\n}\n\n.custom-text {\n  font-size: 28rpx;\n  color: #666;\n  font-weight: bold;\n}\n\n/* ========== 确认按钮 ========== */\n.action-btn {\n  padding: 0 8rpx;\n}\n\n.submit-btn {\n  background: linear-gradient(135deg, #8B6F47 0%, #A0826D 100%);\n  border-radius: 48rpx;\n  height: 96rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 12rpx 32rpx rgba(139, 111, 71, 0.3);\n  transition: all 0.3s ease;\n}\n\n.submit-btn:active {\n  transform: scale(0.98);\n  box-shadow: 0 8rpx 24rpx rgba(139, 111, 71, 0.25);\n}\n\n.submit-btn text {\n  font-size: 32rpx;\n  color: #fff;\n  font-weight: bold;\n  letter-spacing: 4rpx;\n}\n\n/* ========== 功能入口 ========== */\n.function-section {\n  margin-bottom: 32rpx;\n}\n\n.function-list {\n  background: #fff;\n  border-radius: 24rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 24rpx rgba(139, 111, 71, 0.08);\n}\n\n.function-item {\n  display: flex;\n  align-items: center;\n  padding: 32rpx 28rpx;\n  position: relative;\n  transition: background 0.2s;\n}\n\n.function-item::after {\n  content: '';\n  position: absolute;\n  left: 28rpx;\n  right: 28rpx;\n  bottom: 0;\n  height: 1rpx;\n  background: #f5f5f5;\n}\n\n.function-item:last-child::after {\n  display: none;\n}\n\n.function-item-hover {\n  background: #fafafa;\n}\n\n.function-icon-box {\n  width: 88rpx;\n  height: 88rpx;\n  border-radius: 20rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 24rpx;\n}\n\n.recharge-icon {\n  background: linear-gradient(135deg, #E3F2FD, #BBDEFB);\n}\n\n.cash-icon {\n  background: linear-gradient(135deg, #FFF3E0, #FFE0B2);\n}\n\n.function-emoji {\n  font-size: 40rpx;\n}\n\n.function-content {\n  flex: 1;\n}\n\n.function-title {\n  font-size: 30rpx;\n  color: #333;\n  font-weight: 600;\n  margin-bottom: 8rpx;\n}\n\n.function-desc {\n  font-size: 24rpx;\n  color: #999;\n}\n\n/* ========== 弹窗样式 ========== */\n.popup-content {\n  padding: 48rpx 32rpx 32rpx;\n}\n\n.popup-title {\n  font-size: 36rpx;\n  font-weight: bold;\n  color: #333;\n  text-align: center;\n  margin-bottom: 40rpx;\n  position: relative;\n}\n\n.popup-title::after {\n  content: '';\n  position: absolute;\n  bottom: -16rpx;\n  left: 50%;\n  transform: translateX(-50%);\n  width: 80rpx;\n  height: 6rpx;\n  background: linear-gradient(to right, transparent, #8B6F47, transparent);\n  border-radius: 3rpx;\n}\n\n.popup-btn {\n  margin-top: 48rpx;\n  padding: 0 8rpx;\n}\n\n/* ========== 底部留白 ========== */\n.bottom-blank {\n  height: 40rpx;\n}"
  },
  {
    "path": "pages/asset/recharge-log.js",
    "content": "const APP = getApp()\nconst WXAPI = require('apifm-wxapi')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.asset.rechargeLogs,\n    })\n    this.payLogs()\n  },\n  onShow: function () {\n\n  },\n  async payLogs() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.payLogs({\n      token: wx.getStorageSync('token'),\n      page:1,\n      pageSize:500,\n      status: 1\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        payLogs: res.data\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/asset/recharge-log.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/asset/recharge-log.wxml",
    "content": "<view class=\"recharge-log-container\">\n  <!-- 顶部装饰区域 -->\n  <view class=\"header-decoration\">\n    <view class=\"bubble-decoration bubble-1\"></view>\n    <view class=\"bubble-decoration bubble-2\"></view>\n    <view class=\"bubble-decoration bubble-3\"></view>\n    <view class=\"bubble-decoration bubble-4\"></view>\n  </view>\n\n  <!-- 顶部统计卡片 -->\n  <view class=\"summary-card\" wx:if=\"{{payLogs && payLogs.length > 0}}\">\n    <view class=\"summary-icon\">🎉</view>\n    <view class=\"summary-text\">\n      <text class=\"summary-title\">累计充值</text>\n      <text class=\"summary-count\">{{payLogs.length}} 次</text>\n    </view>\n  </view>\n\n  <!-- 充值记录列表 -->\n  <view class=\"recharge-list\" wx:if=\"{{payLogs && payLogs.length > 0}}\">\n    <view class=\"list-title\">\n      <text class=\"title-text\">充值记录</text>\n      <view class=\"title-line\"></view>\n    </view>\n\n    <view class=\"recharge-item\" wx:for=\"{{payLogs}}\" wx:key=\"id\">\n      <view class=\"recharge-card\">\n        <!-- 充值图标背景 -->\n        <view class=\"card-bg-icon\">💳</view>\n        \n        <view class=\"card-content\">\n          <!-- 左侧信息 -->\n          <view class=\"recharge-left\">\n            <view class=\"icon-circle\">\n              <text class=\"recharge-icon\">💰</text>\n            </view>\n            <view class=\"recharge-info\">\n              <text class=\"payment-method\">{{item.payGateStr}}</text>\n              <text class=\"recharge-time\">{{item.dateUpdate}}</text>\n            </view>\n          </view>\n          \n          <!-- 右侧金额 -->\n          <view class=\"recharge-right\">\n            <view class=\"amount-wrapper\">\n              <text class=\"amount-symbol\">¥</text>\n              <text class=\"amount-value\">{{item.money}}</text>\n            </view>\n            <view class=\"success-badge\">\n              <text class=\"badge-text\">成功</text>\n            </view>\n          </view>\n        </view>\n\n        <!-- 底部装饰线 -->\n        <view class=\"card-bottom-line\"></view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 空状态 -->\n  <view class=\"empty-state\" wx:if=\"{{!payLogs || payLogs.length == 0}}\">\n    <view class=\"empty-animation\">\n      <view class=\"empty-cup\">🧋</view>\n      <view class=\"empty-shine\"></view>\n    </view>\n    <text class=\"empty-title\">{{ $t.common.empty || '暂无充值记录' }}</text>\n    <text class=\"empty-desc\">快去充值享受更多优惠吧~</text>\n  </view>\n</view>"
  },
  {
    "path": "pages/asset/recharge-log.wxss",
    "content": "/* pages/asset/recharge-log.wxss */\n\npage {\n  background: linear-gradient(180deg, #FFF9F0 0%, #FFFBF7 50%, #FFF5EB 100%);\n  min-height: 100vh;\n}\n\n.recharge-log-container {\n  min-height: 100vh;\n  padding-bottom: 40rpx;\n  position: relative;\n  overflow: hidden;\n}\n\n/* 顶部装饰气泡 */\n.header-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 400rpx;\n  overflow: hidden;\n  pointer-events: none;\n  z-index: 0;\n}\n\n.bubble-decoration {\n  position: absolute;\n  border-radius: 50%;\n  opacity: 0.12;\n  animation: float 6s ease-in-out infinite;\n}\n\n.bubble-1 {\n  width: 320rpx;\n  height: 320rpx;\n  background: linear-gradient(135deg, #FFD4A3 0%, #FFA87D 100%);\n  top: -100rpx;\n  right: -80rpx;\n  animation-delay: 0s;\n}\n\n.bubble-2 {\n  width: 240rpx;\n  height: 240rpx;\n  background: linear-gradient(135deg, #FFDAB9 0%, #FFB499 100%);\n  top: 80rpx;\n  left: -60rpx;\n  animation-delay: 1s;\n}\n\n.bubble-3 {\n  width: 160rpx;\n  height: 160rpx;\n  background: linear-gradient(135deg, #FFE4C4 0%, #FFDAB9 100%);\n  top: 200rpx;\n  right: 60rpx;\n  animation-delay: 2s;\n}\n\n.bubble-4 {\n  width: 120rpx;\n  height: 120rpx;\n  background: linear-gradient(135deg, #FFC4A3 0%, #FF9A7D 100%);\n  top: 260rpx;\n  left: 120rpx;\n  animation-delay: 1.5s;\n}\n\n@keyframes float {\n  0%, 100% {\n    transform: translateY(0) rotate(0deg);\n  }\n  50% {\n    transform: translateY(-20rpx) rotate(5deg);\n  }\n}\n\n/* 顶部统计卡片 */\n.summary-card {\n  margin: 32rpx 32rpx 24rpx;\n  padding: 40rpx;\n  background: linear-gradient(135deg, #FF9A76 0%, #FF7B51 100%);\n  border-radius: 28rpx;\n  box-shadow: 0 8rpx 32rpx rgba(255, 123, 81, 0.25);\n  display: flex;\n  align-items: center;\n  position: relative;\n  z-index: 1;\n  overflow: hidden;\n  animation: slideDown 0.5s ease-out;\n}\n\n.summary-card::before {\n  content: '';\n  position: absolute;\n  top: -50%;\n  right: -20%;\n  width: 200rpx;\n  height: 200rpx;\n  background: rgba(255, 255, 255, 0.15);\n  border-radius: 50%;\n}\n\n.summary-card::after {\n  content: '';\n  position: absolute;\n  bottom: -30%;\n  left: -10%;\n  width: 150rpx;\n  height: 150rpx;\n  background: rgba(255, 255, 255, 0.1);\n  border-radius: 50%;\n}\n\n@keyframes slideDown {\n  from {\n    opacity: 0;\n    transform: translateY(-30rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.summary-icon {\n  font-size: 64rpx;\n  margin-right: 24rpx;\n  filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.1));\n  z-index: 1;\n}\n\n.summary-text {\n  display: flex;\n  flex-direction: column;\n  z-index: 1;\n}\n\n.summary-title {\n  font-size: 28rpx;\n  color: rgba(255, 255, 255, 0.9);\n  margin-bottom: 8rpx;\n  font-weight: 400;\n}\n\n.summary-count {\n  font-size: 40rpx;\n  color: #FFFFFF;\n  font-weight: 700;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", sans-serif;\n}\n\n/* 列表标题 */\n.recharge-list {\n  padding: 0 32rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.list-title {\n  margin-bottom: 24rpx;\n  display: flex;\n  align-items: center;\n  animation: fadeIn 0.6s ease-out;\n}\n\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n\n.title-text {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  margin-right: 16rpx;\n  position: relative;\n}\n\n.title-text::before {\n  content: '';\n  position: absolute;\n  left: -12rpx;\n  top: 50%;\n  transform: translateY(-50%);\n  width: 6rpx;\n  height: 28rpx;\n  background: linear-gradient(180deg, #FF9A76 0%, #FF7B51 100%);\n  border-radius: 3rpx;\n}\n\n.title-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(90deg, rgba(255, 154, 118, 0.2) 0%, rgba(255, 154, 118, 0) 100%);\n}\n\n/* 充值记录项 */\n.recharge-item {\n  margin-bottom: 24rpx;\n  animation: slideUp 0.5s ease-out backwards;\n}\n\n.recharge-item:nth-child(2) { animation-delay: 0.1s; }\n.recharge-item:nth-child(3) { animation-delay: 0.15s; }\n.recharge-item:nth-child(4) { animation-delay: 0.2s; }\n.recharge-item:nth-child(5) { animation-delay: 0.25s; }\n\n@keyframes slideUp {\n  from {\n    opacity: 0;\n    transform: translateY(30rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.recharge-card {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  box-shadow: 0 4rpx 24rpx rgba(255, 154, 118, 0.08);\n  position: relative;\n  overflow: hidden;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.recharge-card:active {\n  transform: scale(0.98);\n  box-shadow: 0 2rpx 16rpx rgba(255, 154, 118, 0.12);\n}\n\n/* 卡片背景图标 */\n.card-bg-icon {\n  position: absolute;\n  right: -20rpx;\n  bottom: -20rpx;\n  font-size: 160rpx;\n  opacity: 0.04;\n  transform: rotate(-15deg);\n  pointer-events: none;\n}\n\n/* 卡片内容 */\n.card-content {\n  padding: 36rpx 32rpx;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: relative;\n  z-index: 1;\n}\n\n/* 左侧内容 */\n.recharge-left {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  overflow: hidden;\n}\n\n.icon-circle {\n  width: 96rpx;\n  height: 96rpx;\n  border-radius: 24rpx;\n  background: linear-gradient(135deg, #FFF4ED 0%, #FFE8DB 100%);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 24rpx;\n  flex-shrink: 0;\n  box-shadow: 0 4rpx 16rpx rgba(255, 154, 118, 0.12);\n  position: relative;\n}\n\n.icon-circle::before {\n  content: '';\n  position: absolute;\n  inset: 0;\n  border-radius: 24rpx;\n  padding: 2rpx;\n  background: linear-gradient(135deg, #FFD4A3, #FFA87D);\n  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n  mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n  -webkit-mask-composite: xor;\n  mask-composite: exclude;\n  opacity: 0.3;\n}\n\n.recharge-icon {\n  font-size: 48rpx;\n  filter: drop-shadow(0 2rpx 4rpx rgba(255, 123, 81, 0.2));\n}\n\n.recharge-info {\n  display: flex;\n  flex-direction: column;\n  overflow: hidden;\n}\n\n.payment-method {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  margin-bottom: 10rpx;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.recharge-time {\n  font-size: 24rpx;\n  color: #999999;\n  line-height: 1.5;\n}\n\n/* 右侧金额 */\n.recharge-right {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n  margin-left: 24rpx;\n  flex-shrink: 0;\n}\n\n.amount-wrapper {\n  display: flex;\n  align-items: baseline;\n  margin-bottom: 8rpx;\n}\n\n.amount-symbol {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #FF7B51;\n  margin-right: 4rpx;\n}\n\n.amount-value {\n  font-size: 40rpx;\n  font-weight: 700;\n  color: #FF7B51;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"DIN Alternate\", sans-serif;\n}\n\n.success-badge {\n  padding: 6rpx 16rpx;\n  background: linear-gradient(135deg, #E8F8F0 0%, #D4F4E6 100%);\n  border-radius: 20rpx;\n  border: 1rpx solid rgba(76, 217, 100, 0.15);\n}\n\n.badge-text {\n  font-size: 22rpx;\n  color: #52C41A;\n  font-weight: 500;\n}\n\n/* 底部装饰线 */\n.card-bottom-line {\n  height: 6rpx;\n  background: linear-gradient(90deg, #FF9A76 0%, #FF7B51 50%, #FF9A76 100%);\n  opacity: 0.6;\n}\n\n/* 空状态 */\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 180rpx 60rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.empty-animation {\n  position: relative;\n  margin-bottom: 40rpx;\n  animation: bounce 2s ease-in-out infinite;\n}\n\n@keyframes bounce {\n  0%, 100% {\n    transform: translateY(0);\n  }\n  50% {\n    transform: translateY(-20rpx);\n  }\n}\n\n.empty-cup {\n  font-size: 140rpx;\n  filter: drop-shadow(0 8rpx 16rpx rgba(0, 0, 0, 0.08));\n}\n\n.empty-shine {\n  position: absolute;\n  top: 20rpx;\n  right: 20rpx;\n  width: 40rpx;\n  height: 40rpx;\n  background: radial-gradient(circle, rgba(255, 255, 255, 0.8) 0%, transparent 70%);\n  border-radius: 50%;\n  animation: shine 2s ease-in-out infinite;\n}\n\n@keyframes shine {\n  0%, 100% {\n    opacity: 0.3;\n    transform: scale(0.8);\n  }\n  50% {\n    opacity: 1;\n    transform: scale(1.2);\n  }\n}\n\n.empty-title {\n  font-size: 32rpx;\n  color: #999999;\n  margin-bottom: 16rpx;\n  font-weight: 500;\n}\n\n.empty-desc {\n  font-size: 26rpx;\n  color: #CCCCCC;\n  text-align: center;\n  line-height: 1.6;\n}"
  },
  {
    "path": "pages/booking/index.js",
    "content": "const APP = getApp()\nconst AUTH = require('../../utils/auth')\nconst WXAPI = require('apifm-wxapi')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\nPage({\n  data: {\n    persionNum: { // 每种语言列举\n      zh_CN: ['1-2人', '3-4人', '5-8人', '8人以上'],\n      en: ['1-2 Person', '3-4 Person', '5-8 Person', 'More than 8'],\n    },\n    persionNumIndex: 0,\n    showDatetimePop: false,\n    filter(type, options) {\n      if (type === 'minute') {\n        return options.filter((option) => option % 10 === 0);\n      }\n      return options;\n    },\n    currentDate: new Date().getTime(),\n    minDate: new Date().getTime(),\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.booking.title,\n    })\n    this.setData({\n      formatter: (type, value) => {\n        if (type === 'year') {\n          return `${value}` + this.data.$t.date.year;\n        } else if (type === 'month') {\n          return `${value}` + this.data.$t.date.month;\n        } else if (type === 'day') {\n          return `${value}` + this.data.$t.date.day;\n        } else if (type === 'hour') {\n          return `${value}` + this.data.$t.date.hour;\n        } else if (type === 'minute') {\n          return `${value}` + this.data.$t.date.minutes;\n        }\n        return value;\n      }\n    })\n  },\n  onShow: function () {\n    AUTH.checkHasLogined().then(isLogined => {\n      if (!isLogined) {\n        wx.showModal({\n          confirmText: this.data.$t.common.confirm,\n          cancelText: this.data.$t.common.cancel,\n          content: this.data.$t.auth.needLogin,\n          showCancel: false,\n          success: () => {\n            wx.navigateBack()\n          }\n        })\n      }\n    })\n  },\n  changePersionNum(e) {\n    this.setData({\n      persionNumIndex: e.currentTarget.dataset.idx\n    })\n  },\n  async submit() {\n    if (!this.data.name) {\n      wx.showToast({\n        title: this.data.$t.booking.namePlaceholder,\n        icon: 'none'\n      })\n      return\n    }\n    if (!this.data.mobile) {\n      wx.showToast({\n        title: this.data.$t.booking.mobilePlaceholder,\n        icon: 'none'\n      })\n      return\n    }\n    if (!this.data.time) {\n      wx.showToast({\n        title: this.data.$t.booking.timePlaceholder,\n        icon: 'none'\n      })\n      return\n    }\n    const extJsonStr = {}\n    extJsonStr['姓名'] = this.data.name\n    extJsonStr['联系电话'] = this.data.mobile\n    extJsonStr['到店时间'] = this.data.time\n    extJsonStr['用餐人数'] = this.data.persionNum['zh_CN'][this.data.persionNumIndex]\n    const res = await WXAPI.yuyueJoin({\n      token: wx.getStorageSync('token'),\n      yuyueId: wx.getStorageSync('zxdz'),\n      extJsonStr: JSON.stringify(extJsonStr)\n    })\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    } else {\n      wx.showToast({\n        title: this.data.$t.common.submitSuccess,\n        icon: 'success'\n      })\n      setTimeout(() => {\n        wx.navigateBack()\n      }, 1000);\n    }\n  },\n  showDatetimePop() {\n    this.setData({\n      showDatetimePop: true\n    })\n  },\n  hideDatetimePop() {\n    this.setData({\n      showDatetimePop: false\n    })\n  },\n  confirm(e) {\n    const newDate = new Date(e.detail)\n    this.setData({\n      time: newDate.toLocaleString()\n    })\n    this.hideDatetimePop()\n  },\n})"
  },
  {
    "path": "pages/booking/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/booking/index.wxml",
    "content": "<view class=\"booking-container\">\n  <!-- 顶部装饰区域 -->\n  <view class=\"header-banner\">\n    <view class=\"banner-bg\"></view>\n    <view class=\"banner-content\">\n      <view class=\"banner-icon\">🥤</view>\n      <view class=\"banner-title\">在线订座</view>\n      <view class=\"banner-subtitle\">为您预留美好时光</view>\n    </view>\n  </view>\n\n  <!-- 表单卡片区域 -->\n  <view class=\"form-card\">\n    <view class=\"section-title\">\n      <view class=\"title-icon\">👤</view>\n      <text class=\"title-text\">预订信息</text>\n    </view>\n    \n    <!-- 姓名输入 -->\n    <view class=\"input-group\">\n      <view class=\"input-label\">\n        <text class=\"label-text\">{{ $t.booking.name }}</text>\n        <text class=\"label-required\">*</text>\n      </view>\n      <van-field\n        placeholder=\"{{ $t.booking.namePlaceholder }}\"\n        clearable\n        focus\n        custom-class=\"custom-field\"\n        model:value=\"{{ name }}\"\n      />\n    </view>\n\n    <!-- 手机号输入 -->\n    <view class=\"input-group\">\n      <view class=\"input-label\">\n        <text class=\"label-text\">{{ $t.booking.mobile }}</text>\n        <text class=\"label-required\">*</text>\n      </view>\n      <van-field\n        type=\"number\"\n        placeholder=\"{{ $t.booking.mobilePlaceholder }}\"\n        clearable\n        custom-class=\"custom-field\"\n        model:value=\"{{ mobile }}\"\n      />\n    </view>\n\n    <!-- 时间选择 -->\n    <view class=\"input-group\">\n      <view class=\"input-label\">\n        <text class=\"label-text\">{{ $t.booking.time }}</text>\n        <text class=\"label-required\">*</text>\n      </view>\n      <van-field\n        placeholder=\"{{ $t.booking.timePlaceholder }}\"\n        readonly\n        value=\"{{ time }}\"\n        is-link\n        custom-class=\"custom-field\"\n        bindtap=\"showDatetimePop\"\n      />\n    </view>\n  </view>\n\n  <!-- 人数选择卡片 -->\n  <view class=\"form-card person-card\">\n    <view class=\"section-title\">\n      <view class=\"title-icon\">👥</view>\n      <text class=\"title-text\">{{ $t.booking.person }}</text>\n    </view>\n    \n    <view class=\"persion-num\">\n      <view wx:for=\"{{persionNum[language]}}\" wx:key=\"item\" \n            class=\"person-item {{persionNumIndex == index ? 'active' : ''}}\" \n            data-idx=\"{{index}}\" \n            bindtap=\"changePersionNum\">\n        <view class=\"person-icon\">{{persionNumIndex == index ? '✓' : '👥'}}</view>\n        <view class=\"person-text\">{{ item }}</view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 提交按钮 -->\n  <view class=\"submit-container\">\n    <view class=\"btn\">\n      <van-button type=\"primary\" block bind:click=\"submit\" custom-class=\"submit-btn\">\n        <text class=\"btn-text\">{{ $t.booking.title }}</text>\n      </van-button>\n    </view>\n    <view class=\"profile\">{{ $t.booking.tip }}</view>\n  </view>\n</view>\n\n<!-- 时间选择弹窗 -->\n\n\n<van-popup\n  show=\"{{ showDatetimePop }}\"\n  position=\"bottom\"\n  bind:close=\"onClose\">\n  <van-datetime-picker\n    type=\"datetime\"\n    value=\"{{ currentDate }}\"\n    min-date=\"{{ minDate }}\"\n    formatter=\"{{ formatter }}\"\n    filter=\"{{ filter }}\"\n    confirm-button-text=\"{{ $t.common.confirm }}\"\n    cancel-button-text=\"{{ $t.common.cancel }}\"\n    bind:confirm=\"confirm\"\n    bind:cancel=\"hideDatetimePop\"\n  />\n</van-popup>"
  },
  {
    "path": "pages/booking/index.wxss",
    "content": "/* 页面容器 */\npage {\n  background: linear-gradient(180deg, #FFF5E6 0%, #FFFFFF 100%);\n  min-height: 100vh;\n}\n\n.booking-container {\n  padding-bottom: 40rpx;\n}\n\n/* 顶部横幅区域 */\n.header-banner {\n  position: relative;\n  height: 420rpx;\n  overflow: hidden;\n  margin-bottom: -40rpx;\n}\n\n.banner-bg {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(135deg, #D4A574 0%, #C89968 50%, #B8855A 100%);\n  opacity: 0.95;\n}\n\n.banner-bg::after {\n  content: '';\n  position: absolute;\n  bottom: -2rpx;\n  left: 0;\n  width: 100%;\n  height: 100rpx;\n  background: #FFFFFF;\n  border-radius: 50% 50% 0 0 / 100% 100% 0 0;\n}\n\n.banner-content {\n  position: relative;\n  z-index: 2;\n  padding-top: 50rpx;\n  padding-bottom: 40rpx;\n  text-align: center;\n  color: #FFFFFF;\n}\n\n.banner-icon {\n  font-size: 88rpx;\n  margin-bottom: 16rpx;\n  animation: float 3s ease-in-out infinite;\n}\n\n@keyframes float {\n  0%, 100% { transform: translateY(0); }\n  50% { transform: translateY(-10rpx); }\n}\n\n.banner-title {\n  font-size: 48rpx;\n  font-weight: 600;\n  margin-bottom: 8rpx;\n  letter-spacing: 4rpx;\n}\n\n.banner-subtitle {\n  font-size: 26rpx;\n  opacity: 0.9;\n  letter-spacing: 2rpx;\n}\n\n/* 表单卡片 */\n.form-card {\n  margin: 30rpx 30rpx 24rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 40rpx 32rpx;\n  box-shadow: 0 8rpx 32rpx rgba(196, 153, 104, 0.12);\n}\n\n.person-card {\n  padding-bottom: 32rpx;\n}\n\n/* 区块标题 */\n.section-title {\n  display: flex;\n  align-items: center;\n  margin-bottom: 32rpx;\n  padding-bottom: 20rpx;\n  border-bottom: 2rpx solid #F5F5F5;\n}\n\n.title-icon {\n  font-size: 40rpx;\n  margin-right: 12rpx;\n}\n\n.title-text {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  letter-spacing: 1rpx;\n}\n\n/* 输入组 */\n.input-group {\n  margin-bottom: 28rpx;\n}\n\n.input-group:last-child {\n  margin-bottom: 0;\n}\n\n.input-label {\n  display: flex;\n  align-items: center;\n  margin-bottom: 12rpx;\n  padding-left: 4rpx;\n}\n\n.label-text {\n  font-size: 28rpx;\n  color: #666666;\n  font-weight: 500;\n}\n\n.label-required {\n  color: #FF6B6B;\n  margin-left: 4rpx;\n  font-size: 28rpx;\n}\n\n/* 自定义输入框样式 */\n.custom-field {\n  background: #F8F8F8 !important;\n  border-radius: 16rpx !important;\n  padding: 24rpx 20rpx !important;\n  border: 2rpx solid transparent !important;\n  transition: all 0.3s ease;\n}\n\n.custom-field:focus {\n  background: #FFFFFF !important;\n  border-color: #D4A574 !important;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.15);\n}\n\n/* 人数选择 */\n.persion-num {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 20rpx;\n  margin-top: 24rpx;\n}\n\n.person-item {\n  flex: 0 0 calc(50% - 10rpx);\n  background: linear-gradient(135deg, #FAFAFA 0%, #F5F5F5 100%);\n  border-radius: 20rpx;\n  padding: 32rpx 20rpx;\n  text-align: center;\n  border: 3rpx solid transparent;\n  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n  position: relative;\n  overflow: hidden;\n}\n\n.person-item::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: linear-gradient(135deg, #D4A574 0%, #C89968 100%);\n  opacity: 0;\n  transition: opacity 0.3s ease;\n  z-index: 0;\n}\n\n.person-item.active::before {\n  opacity: 1;\n}\n\n.person-item.active {\n  border-color: #D4A574;\n  transform: translateY(-4rpx);\n  box-shadow: 0 12rpx 28rpx rgba(212, 165, 116, 0.3);\n}\n\n.person-icon {\n  position: relative;\n  z-index: 1;\n  font-size: 48rpx;\n  margin-bottom: 12rpx;\n  transition: transform 0.3s ease;\n}\n\n.person-item.active .person-icon {\n  transform: scale(1.2);\n}\n\n.person-text {\n  position: relative;\n  z-index: 1;\n  font-size: 28rpx;\n  color: #666666;\n  font-weight: 500;\n  transition: color 0.3s ease;\n}\n\n.person-item.active .person-text {\n  color: #FFFFFF;\n  font-weight: 600;\n}\n\n/* 提交区域 */\n.submit-container {\n  padding: 20rpx 30rpx 0;\n}\n\n.btn {\n  margin-bottom: 20rpx;\n}\n\n.submit-btn {\n  background: linear-gradient(135deg, #D4A574 0%, #C89968 100%) !important;\n  border: none !important;\n  border-radius: 48rpx !important;\n  height: 96rpx !important;\n  box-shadow: 0 12rpx 32rpx rgba(212, 165, 116, 0.35) !important;\n  transition: all 0.3s ease !important;\n}\n\n.submit-btn:active {\n  transform: translateY(2rpx);\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.3) !important;\n}\n\n.btn-text {\n  font-size: 32rpx;\n  font-weight: 600;\n  letter-spacing: 4rpx;\n}\n\n.profile {\n  text-align: center;\n  color: #999999;\n  font-size: 24rpx;\n  line-height: 1.6;\n  padding: 0 20rpx;\n}\n\n/* 为Vant组件添加全局样式覆盖 */\n.van-field__control {\n  font-size: 28rpx !important;\n  color: #333333 !important;\n}\n\n.van-field__placeholder {\n  color: #BBBBBB !important;\n}\n\n/* 优化动画性能 */\n.person-item,\n.submit-btn,\n.banner-icon {\n  will-change: transform;\n}"
  },
  {
    "path": "pages/card/exchange.js",
    "content": "const WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n    agree: false,\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.card.excharge,\n    })\n  },\n  _agree() {\n    this.setData({\n      agree: !this.data.agree\n    })\n  },\n  xieyi() {\n    wx.navigateTo({\n      url: '/pages/about/index?key=lipinkaxieyi',\n    })\n  },\n  async submit(){\n    if (!this.data.number) {\n      wx.showToast({\n        title: this.data.$t.card.pleaseInputNumber,\n        icon: 'none'\n      })\n      return\n    }\n    if (!this.data.agree) {\n      wx.showToast({\n        title: this.data.$t.card.xieyi0,\n        icon: 'none'\n      })\n      return\n    }\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/twoctygmpqlhnfkm\n    const res = await WXAPI.cardExchangeFromPwd({\n      token: wx.getStorageSync('token'),\n      number: this.data.number\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      wx.showModal({\n        content: this.data.$t.coupons.Redemption,\n        showCancel: false,\n        success: (res) => {\n          wx.setStorageSync('cardmyrefresh', true)\n          wx.navigateBack()\n        }\n      })\n    } else {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/card/exchange.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "pages/card/exchange.wxml",
    "content": "<view class=\"exchange-container\">\n  <!-- 顶部装饰区域 -->\n  <view class=\"header-section\">\n    <view class=\"decoration-circle circle-1\"></view>\n    <view class=\"decoration-circle circle-2\"></view>\n    <view class=\"card-icon\">\n      <view class=\"icon-wrapper\">🎁</view>\n    </view>\n    <view class=\"title\">{{ $t.card.excharge }}</view>\n    <view class=\"subtitle\">请输入您的礼品卡兑换码</view>\n  </view>\n\n  <!-- 主内容卡片 -->\n  <view class=\"content-card\">\n    <!-- 输入区域 -->\n    <view class=\"input-section\">\n      <view class=\"input-label\">\n        <view class=\"label-icon\">🔖</view>\n        <text>兑换码</text>\n      </view>\n      <view class=\"input-wrapper\">\n        <van-field\n          model:value=\"{{ number }}\"\n          placeholder=\"{{ $t.card.pleaseInputNumber }}\"\n          placeholder-style=\"color: #C8B8A8\"\n          border=\"{{ false }}\"\n          custom-style=\"background: #F9F6F2; border-radius: 16rpx; padding: 28rpx 32rpx; font-size: 32rpx;\"\n        />\n      </view>\n      <view class=\"input-tips\">请输入完整的礼品卡兑换码</view>\n    </view>\n\n    <!-- 协议勾选 -->\n    <view class=\"agreement-section\">\n      <view class=\"agreement-checkbox\" bind:tap=\"_agree\">\n        <view class=\"checkbox {{ agree ? 'checked' : '' }}\">\n          <van-icon wx:if=\"{{ agree }}\" name=\"success\" size=\"28rpx\" color=\"#fff\" />\n        </view>\n        <text class=\"agreement-text\">我已阅读并同意</text>\n        <text class=\"agreement-link\" bind:tap=\"xieyi\">{{ $t.card.xieyi }}</text>\n      </view>\n    </view>\n\n    <!-- 提交按钮 -->\n    <view class=\"submit-section\">\n      <view class=\"submit-btn\" bind:tap=\"submit\">\n        <text>立即兑换</text>\n        <view class=\"btn-shine\"></view>\n      </view>\n    </view>\n\n    <!-- 温馨提示 -->\n    <view class=\"tips-section\">\n      <view class=\"tips-title\">💡 温馨提示</view>\n      <view class=\"tips-item\">• 每个兑换码仅可使用一次</view>\n      <view class=\"tips-item\">• 兑换成功后将自动存入您的账户</view>\n      <view class=\"tips-item\">• 如有疑问请联系客服咨询</view>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "pages/card/exchange.wxss",
    "content": "page {\n  background: linear-gradient(180deg, #F5EDE4 0%, #FDFBF7 100%);\n  min-height: 100vh;\n}\n\n/* 容器 */\n.exchange-container {\n  padding: 40rpx 32rpx;\n  min-height: 100vh;\n}\n\n/* 顶部装饰区域 */\n.header-section {\n  position: relative;\n  text-align: center;\n  padding: 60rpx 0 80rpx;\n  overflow: hidden;\n}\n\n/* 装饰圆圈 */\n.decoration-circle {\n  position: absolute;\n  border-radius: 50%;\n  opacity: 0.1;\n}\n\n.circle-1 {\n  width: 300rpx;\n  height: 300rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C89666 100%);\n  top: -100rpx;\n  left: -80rpx;\n}\n\n.circle-2 {\n  width: 200rpx;\n  height: 200rpx;\n  background: linear-gradient(135deg, #E8C4A0 0%, #D4A574 100%);\n  top: 20rpx;\n  right: -50rpx;\n}\n\n/* 卡片图标 */\n.card-icon {\n  position: relative;\n  z-index: 1;\n  margin-bottom: 32rpx;\n}\n\n.icon-wrapper {\n  display: inline-block;\n  width: 120rpx;\n  height: 120rpx;\n  line-height: 120rpx;\n  font-size: 64rpx;\n  background: linear-gradient(135deg, #FFF5EB 0%, #FFE8D6 100%);\n  border-radius: 50%;\n  box-shadow: 0 8rpx 32rpx rgba(212, 165, 116, 0.2);\n}\n\n/* 标题 */\n.title {\n  position: relative;\n  z-index: 1;\n  font-size: 48rpx;\n  font-weight: 700;\n  color: #5D4E3C;\n  margin-bottom: 16rpx;\n  letter-spacing: 2rpx;\n}\n\n.subtitle {\n  position: relative;\n  z-index: 1;\n  font-size: 28rpx;\n  color: #9B8B7A;\n  font-weight: 400;\n}\n\n/* 内容卡片 */\n.content-card {\n  background: #FFFFFF;\n  border-radius: 32rpx;\n  padding: 48rpx 40rpx;\n  box-shadow: 0 8rpx 40rpx rgba(93, 78, 60, 0.08);\n  position: relative;\n  overflow: hidden;\n}\n\n.content-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 6rpx;\n  background: linear-gradient(90deg, #D4A574 0%, #C89666 50%, #D4A574 100%);\n}\n\n/* 输入区域 */\n.input-section {\n  margin-bottom: 40rpx;\n}\n\n.input-label {\n  display: flex;\n  align-items: center;\n  margin-bottom: 20rpx;\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #5D4E3C;\n}\n\n.label-icon {\n  font-size: 32rpx;\n  margin-right: 12rpx;\n}\n\n.input-wrapper {\n  margin-bottom: 16rpx;\n  border-radius: 16rpx;\n  overflow: hidden;\n  box-shadow: 0 4rpx 16rpx rgba(93, 78, 60, 0.05);\n}\n\n.input-tips {\n  font-size: 24rpx;\n  color: #B5A393;\n  padding-left: 8rpx;\n  margin-top: 12rpx;\n}\n\n/* 协议勾选区域 */\n.agreement-section {\n  margin: 40rpx 0;\n  padding: 24rpx 0;\n}\n\n.agreement-checkbox {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-wrap: wrap;\n}\n\n.checkbox {\n  width: 36rpx;\n  height: 36rpx;\n  border: 2rpx solid #D4A574;\n  border-radius: 8rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 12rpx;\n  transition: all 0.3s ease;\n  background: #FFFFFF;\n}\n\n.checkbox.checked {\n  background: linear-gradient(135deg, #D4A574 0%, #C89666 100%);\n  border-color: #C89666;\n}\n\n.agreement-text {\n  font-size: 26rpx;\n  color: #7A6B5A;\n  margin-right: 8rpx;\n}\n\n.agreement-link {\n  font-size: 26rpx;\n  color: #D4A574;\n  font-weight: 500;\n  text-decoration: underline;\n}\n\n/* 提交按钮 */\n.submit-section {\n  margin: 48rpx 0 40rpx;\n}\n\n.submit-btn {\n  position: relative;\n  height: 96rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C89666 100%);\n  border-radius: 48rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 34rpx;\n  font-weight: 600;\n  color: #FFFFFF;\n  letter-spacing: 4rpx;\n  box-shadow: 0 12rpx 32rpx rgba(212, 165, 116, 0.35);\n  overflow: hidden;\n  transition: all 0.3s ease;\n}\n\n.submit-btn::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: linear-gradient(135deg, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0) 100%);\n}\n\n.submit-btn:active {\n  transform: scale(0.98);\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.3);\n}\n\n.btn-shine {\n  position: absolute;\n  top: 0;\n  left: -100%;\n  width: 50%;\n  height: 100%;\n  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);\n  animation: shine 3s infinite;\n}\n\n@keyframes shine {\n  0% {\n    left: -100%;\n  }\n  50%, 100% {\n    left: 150%;\n  }\n}\n\n/* 温馨提示 */\n.tips-section {\n  background: linear-gradient(135deg, #FFF9F3 0%, #FFF5EB 100%);\n  border-radius: 20rpx;\n  padding: 32rpx;\n  border: 2rpx solid #F5E8DB;\n}\n\n.tips-title {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #5D4E3C;\n  margin-bottom: 20rpx;\n  display: flex;\n  align-items: center;\n}\n\n.tips-item {\n  font-size: 26rpx;\n  color: #8A7866;\n  line-height: 44rpx;\n  padding-left: 8rpx;\n}"
  },
  {
    "path": "pages/card/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n    active: 0\n  },\n  onLoad(e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.card.title,\n    })\n    this.banners()\n    this.cardList()\n  },\n  onShow() {\n    const cardmyrefresh = wx.getStorageSync('cardmyrefresh')\n    if (cardmyrefresh) {\n      wx.removeStorageSync('cardmyrefresh')\n      this.setData({\n        active: 1\n      })\n      this.cardMyList()\n    }\n  },\n  tabChange(e) {\n    this.setData({\n      active: e.detail.index\n    })\n    if (e.detail.index == 1) {\n      // 我的礼品卡\n      this.cardMyList()\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: this.data.$t.card.title,\n      path: '/pages/card/index?inviter_id=' + (wx.getStorageSync('uid') || ''),\n      imageUrl: wx.getStorageSync('share_pic')\n    }\n  },\n  onShareTimeline() {\n    return {\n      title: this.data.$t.card.title,\n      query: 'inviter_id=' + (wx.getStorageSync('uid') || ''),\n      imageUrl: wx.getStorageSync('share_pic')\n    }\n  },\n  async banners() {\n    // https://www.yuque.com/apifm/nu0f75/ms21ki\n    const res = await WXAPI.banners({\n      type: 'card'\n    })\n    if (res.code == 0) {\n      this.setData({\n        banners: res.data\n      })\n    }\n  },\n  tapBanner(e) {\n    const url = e.currentTarget.dataset.url\n    if (url) {\n      wx.navigateTo({\n        url\n      })\n    }\n  },\n  async cardList() {\n    // https://www.yuque.com/apifm/nu0f75/lx3wdf\n    const res = await WXAPI.cardList({\n      status: 0\n    })\n    if (res.code == 0) {\n      this.setData({\n        cardList: res.data\n      })\n    }\n  },\n  async cardMyList() {\n    // https://www.yuque.com/apifm/nu0f75/dcm1fi\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.cardMyList(wx.getStorageSync('token'))\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        cardMyList: res.data\n      })\n    } else {\n      this.setData({\n        cardMyList: null\n      })\n    }\n  },\n  buy(e) {\n    const item = e.currentTarget.dataset.item\n    this.setData({\n      paymentShow: true,\n      money: item.price,\n      remark: this.data.$t.card.buy + ': ' + item.name,\n      nextAction: { // https://www.yuque.com/apifm/doc/aetmlb\n        type: 10,\n        id: item.id\n      }\n    })\n  },\n  paymentOk(e) {\n    console.log(e.detail); // 这里是组件里data的数据\n    this.setData({\n      paymentShow: false,\n      active: 1\n    })\n    this.cardMyList()\n  },\n  paymentCancel() {\n    this.setData({\n      paymentShow: false\n    })\n  },\n  sendUser(e) {\n    const item = e.currentTarget.dataset.item\n    wx.setStorageSync('sendCard', item)\n    wx.navigateTo({\n      url: '/pages/card/send',\n    })\n  },\n  async cardShareClose(e) {\n    const item = e.currentTarget.dataset.item\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/cz1urg3208qiu5um\n    const res = await WXAPI.cardShareClose({\n      token: wx.getStorageSync('token'),\n      id: item.id\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        active: 1\n      })\n      this.cardMyList()\n    } else {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/card/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/card/index.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 顶部装饰背景 -->\n  <view class=\"page-header-bg\"></view>\n  \n  <van-sticky>\n    <view class=\"custom-tabs-wrapper\">\n      <van-tabs active=\"{{ active }}\" bind:change=\"tabChange\" color=\"#A0826D\" title-active-color=\"#A0826D\" title-inactive-color=\"#999\">\n        <van-tab title=\"{{ $t.card.buy }}\"></van-tab>\n        <van-tab title=\"{{ $t.card.my }}\"></van-tab>\n      </van-tabs>\n    </view>\n  </van-sticky>\n\n  <view wx:if=\"{{ active == 0 }}\" class=\"tab-content\">\n    <!-- 轮播图 -->\n    <view wx:if=\"{{ banners }}\" class=\"banner-section\">\n      <swiper class=\"swiper-banner\" indicator-dots indicator-color=\"rgba(255,255,255,0.5)\" indicator-active-color=\"#fff\" autoplay circular>\n        <swiper-item wx:for=\"{{ banners }}\" wx:key=\"id\">\n          <view class=\"banner-wrapper\">\n            <image class=\"banner-image\" mode=\"aspectFill\" bindtap=\"tapBanner\" data-url=\"{{item.linkUrl}}\" src=\"{{item.picUrl}}\" />\n          </view>\n        </swiper-item>\n      </swiper>\n    </view>\n\n    <!-- 礼品卡列表 -->\n    <view class=\"card-list\">\n      <van-empty wx:if=\"{{ !cardList }}\" description=\"{{ $t.card.empty }}\" />\n      <view class=\"gift-card-item\" wx:for=\"{{ cardList }}\" wx:key=\"id\">\n        <view class=\"card-container\">\n          <view class=\"card-image-wrapper\">\n            <image class=\"card-image\" src=\"{{ item.pic }}\" mode=\"aspectFill\"></image>\n            <view class=\"card-shine\"></view>\n          </view>\n          <view class=\"card-content\">\n            <view class=\"card-title\">{{ item.name }}</view>\n            <view class=\"card-footer\">\n              <view class=\"price-area\">\n                <text class=\"price-symbol\">¥</text>\n                <text class=\"price-value\">{{ item.price }}</text>\n              </view>\n              <view class=\"buy-btn\" data-item=\"{{ item }}\" bindtap=\"buy\">\n                <text>{{ $t.card.buy2 }}</text>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n  <view wx:if=\"{{ active == 1 }}\" class=\"tab-content\">\n    <view class=\"my-card-list\">\n      <!-- 兑换卡券入口 -->\n      <navigator url=\"/pages/card/exchange\" hover-class=\"none\">\n        <view class=\"exchange-entry\">\n          <view class=\"exchange-icon\">🎁</view>\n          <view class=\"exchange-info\">\n            <view class=\"exchange-title\">{{ $t.card.excharge }}</view>\n            <view class=\"exchange-desc\">输入兑换码领取礼品卡</view>\n          </view>\n          <view class=\"exchange-arrow\">→</view>\n        </view>\n      </navigator>\n\n      <van-empty wx:if=\"{{ !cardMyList }}\" description=\"{{ $t.card.empty }}\" />\n      \n      <view class=\"my-gift-card\" wx:for=\"{{ cardMyList }}\" wx:key=\"id\">\n        <view class=\"my-card-wrapper\">\n          <view class=\"my-card-image-box\">\n            <image class=\"my-card-image\" src=\"{{ item.cardInfo.pic }}\" mode=\"aspectFill\"></image>\n            <view class=\"card-overlay\">\n              <view class=\"card-amount-box\">\n                <view class=\"expire-date\">{{ $t.coupons.expire }}: {{ item.dateEnd }}</view>\n                <view class=\"card-amount\">\n                  <text wx:if=\"{{ item.type == 0 }}\">{{ item.amount }}</text>\n                  <text wx:if=\"{{ item.type == 1 }}\">¥{{ item.amount }}</text>\n                  <text class=\"unit\" wx:if=\"{{ item.type == 0 }}\">{{ $t.card.times }}</text>\n                </view>\n              </view>\n            </view>\n            <view wx:if=\"{{ !item.isActive && !item.fromUid && item.shareToken }}\" class=\"card-status-tag\">\n              {{ $t.card.sending }}\n            </view>\n          </view>\n          \n          <view class=\"my-card-info\">\n            <view class=\"card-name\">{{ item.cardInfo.name }}</view>\n            \n            <!-- 未激活且未分享 - 显示分享按钮 -->\n            <view wx:if=\"{{ !item.isActive && !item.fromUid && !item.shareToken }}\" class=\"card-actions\">\n              <view class=\"action-btn primary\" data-item=\"{{ item }}\" bindtap=\"sendUser\">\n                <text>{{ $t.card.cardShareOpen }}</text>\n              </view>\n            </view>\n            \n            <!-- 未激活且已分享 - 显示取消分享按钮 -->\n            <view wx:elif=\"{{ !item.isActive && !item.fromUid && item.shareToken }}\" class=\"card-actions\">\n              <view class=\"action-btn danger\" data-item=\"{{ item }}\" bindtap=\"cardShareClose\">\n                <text>{{ $t.card.cardShareClose }}</text>\n              </view>\n            </view>\n            \n            <!-- 已激活 - 显示使用记录入口 -->\n            <view wx:else class=\"card-actions\">\n              <navigator url=\"/pages/card/logs?cardId={{ item.id }}\" hover-class=\"none\">\n                <view class=\"action-btn outline\">\n                  <text>{{ $t.card.logs }}</text>\n                </view>\n              </navigator>\n              <view wx:if=\"{{ item.fromUser }}\" class=\"gift-from\">\n                <image class=\"from-avatar\" src=\"{{ item.fromUser.avatarUrl || '/images/who.png' }}\" mode=\"aspectFill\"></image>\n                <text class=\"from-name\">{{ item.fromUser.nick || '微信用户' }}送出</text>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n\n<payment\n  money=\"{{ money }}\"\n  remark=\"{{ remark }}\"\n  nextAction=\"{{ nextAction }}\"\n  show=\"{{ paymentShow }}\"\n  useCard=\"{{ false }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>"
  },
  {
    "path": "pages/card/index.wxss",
    "content": "/* ==================== 页面容器 ==================== */\npage {\n  background: linear-gradient(180deg, #FFF8F0 0%, #F5EDE4 100%);\n  min-height: 100vh;\n}\n\n.page-container {\n  position: relative;\n  min-height: 100vh;\n  padding-bottom: 40rpx;\n}\n\n/* 顶部装饰背景 */\n.page-header-bg {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 400rpx;\n  background: linear-gradient(135deg, #FFE4E1 0%, #FFF0F5 50%, #F5F0E8 100%);\n  z-index: 0;\n  opacity: 0.6;\n}\n\n/* ==================== 自定义Tab样式 ==================== */\n.custom-tabs-wrapper {\n  background: rgba(255, 255, 255, 0.95);\n  backdrop-filter: blur(10rpx);\n  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);\n  position: relative;\n  z-index: 10;\n  padding-bottom: 32rpx;\n}\n\n/* 覆盖van-tabs样式 */\n.custom-tabs-wrapper .van-tabs__wrap {\n  padding: 8rpx 0;\n}\n\n.custom-tabs-wrapper .van-tab {\n  font-size: 32rpx;\n  font-weight: 500;\n  padding: 16rpx 32rpx;\n}\n\n.custom-tabs-wrapper .van-tab--active {\n  font-weight: 600;\n  font-size: 34rpx;\n}\n\n.custom-tabs-wrapper .van-tabs__line {\n  width: 60rpx !important;\n  height: 6rpx;\n  border-radius: 3rpx;\n  background: linear-gradient(90deg, #A0826D 0%, #8B6F47 100%);\n  bottom: 12rpx;\n}\n\n/* ==================== Tab内容区 ==================== */\n.tab-content {\n  position: relative;\n  z-index: 1;\n}\n\n/* ==================== 轮播图样式 ==================== */\n.banner-section {\n  margin: 32rpx 32rpx 40rpx 32rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.swiper-banner {\n  width: 100%;\n  height: 340rpx;\n  border-radius: 24rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 30rpx rgba(160, 130, 109, 0.15);\n}\n\n.banner-wrapper {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n\n.banner-image {\n  width: 100%;\n  height: 100%;\n  border-radius: 24rpx;\n}\n\n/* ==================== 礼品卡列表（购买） ==================== */\n.card-list {\n  padding: 0 32rpx 40rpx 32rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.gift-card-item {\n  margin-bottom: 32rpx;\n  animation: fadeInUp 0.5s ease forwards;\n}\n\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    transform: translateY(30rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.card-container {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 32rpx rgba(160, 130, 109, 0.12);\n  transition: all 0.3s ease;\n  position: relative;\n}\n\n.card-container::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: linear-gradient(135deg, rgba(255, 182, 193, 0.05) 0%, rgba(255, 240, 245, 0.05) 100%);\n  pointer-events: none;\n  z-index: 1;\n}\n\n.card-image-wrapper {\n  position: relative;\n  width: 100%;\n  height: 420rpx;\n  overflow: hidden;\n  background: linear-gradient(135deg, #FFF0F5 0%, #FFE4E1 100%);\n}\n\n.card-image {\n  width: 100%;\n  height: 100%;\n  transition: transform 0.6s ease;\n}\n\n.card-container:active .card-image {\n  transform: scale(1.05);\n}\n\n/* 光泽效果 */\n.card-shine {\n  position: absolute;\n  top: -50%;\n  left: -50%;\n  width: 200%;\n  height: 200%;\n  background: linear-gradient(\n    45deg,\n    transparent 30%,\n    rgba(255, 255, 255, 0.3) 50%,\n    transparent 70%\n  );\n  transform: rotate(45deg);\n  animation: shine 3s infinite;\n}\n\n@keyframes shine {\n  0% {\n    transform: translateX(-100%) translateY(-100%) rotate(45deg);\n  }\n  100% {\n    transform: translateX(100%) translateY(100%) rotate(45deg);\n  }\n}\n\n.card-content {\n  padding: 32rpx;\n  position: relative;\n  z-index: 2;\n}\n\n.card-title {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333;\n  margin-bottom: 24rpx;\n  line-height: 1.4;\n}\n\n.card-footer {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.price-area {\n  display: flex;\n  align-items: baseline;\n}\n\n.price-symbol {\n  font-size: 28rpx;\n  color: #A0826D;\n  font-weight: 600;\n  margin-right: 4rpx;\n}\n\n.price-value {\n  font-size: 48rpx;\n  font-weight: 700;\n  color: #A0826D;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial;\n}\n\n.buy-btn {\n  background: linear-gradient(135deg, #A0826D 0%, #8B6F47 100%);\n  color: #FFFFFF;\n  padding: 16rpx 48rpx;\n  border-radius: 48rpx;\n  font-size: 28rpx;\n  font-weight: 500;\n  box-shadow: 0 6rpx 20rpx rgba(160, 130, 109, 0.3);\n  transition: all 0.3s ease;\n}\n\n.buy-btn:active {\n  transform: scale(0.95);\n  box-shadow: 0 4rpx 12rpx rgba(160, 130, 109, 0.4);\n}\n\n/* ==================== 我的礼品卡 ==================== */\n.my-card-list {\n  padding: 32rpx;\n  position: relative;\n  z-index: 1;\n}\n\n/* 兑换入口 */\n.exchange-entry {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF8F0 100%);\n  border-radius: 20rpx;\n  padding: 32rpx;\n  margin-bottom: 32rpx;\n  display: flex;\n  align-items: center;\n  box-shadow: 0 6rpx 24rpx rgba(160, 130, 109, 0.1);\n  border: 2rpx solid rgba(160, 130, 109, 0.15);\n  transition: all 0.3s ease;\n}\n\n.exchange-entry:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 16rpx rgba(160, 130, 109, 0.15);\n}\n\n.exchange-icon {\n  font-size: 56rpx;\n  margin-right: 24rpx;\n  animation: bounce 2s infinite;\n}\n\n@keyframes bounce {\n  0%, 100% {\n    transform: translateY(0);\n  }\n  50% {\n    transform: translateY(-8rpx);\n  }\n}\n\n.exchange-info {\n  flex: 1;\n}\n\n.exchange-title {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333;\n  margin-bottom: 8rpx;\n}\n\n.exchange-desc {\n  font-size: 24rpx;\n  color: #999;\n}\n\n.exchange-arrow {\n  font-size: 40rpx;\n  color: #A0826D;\n  font-weight: 300;\n}\n\n/* 我的礼品卡卡片 */\n.my-gift-card {\n  margin-bottom: 32rpx;\n  animation: fadeInUp 0.5s ease forwards;\n}\n\n.my-card-wrapper {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 32rpx rgba(160, 130, 109, 0.12);\n  position: relative;\n}\n\n.my-card-wrapper::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 200rpx;\n  height: 200rpx;\n  background: radial-gradient(circle, rgba(255, 182, 193, 0.1) 0%, transparent 70%);\n  pointer-events: none;\n}\n\n.my-card-image-box {\n  position: relative;\n  width: 100%;\n  height: 380rpx;\n  overflow: hidden;\n}\n\n.my-card-image {\n  width: 100%;\n  height: 100%;\n}\n\n.card-overlay {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0.4) 50%, transparent 100%);\n  padding: 40rpx 32rpx 24rpx 32rpx;\n}\n\n.card-amount-box {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n}\n\n.expire-date {\n  font-size: 22rpx;\n  color: rgba(255, 255, 255, 0.9);\n  line-height: 1.5;\n}\n\n.card-amount {\n  font-size: 56rpx;\n  font-weight: 700;\n  color: #FFFFFF;\n  text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial;\n  line-height: 1;\n}\n\n.card-amount .unit {\n  font-size: 28rpx;\n  font-weight: 500;\n  margin-left: 8rpx;\n}\n\n.card-status-tag {\n  position: absolute;\n  top: 32rpx;\n  right: 0;\n  background: linear-gradient(135deg, rgba(255, 107, 107, 0.95) 0%, rgba(255, 66, 66, 0.95) 100%);\n  color: #FFFFFF;\n  padding: 12rpx 28rpx;\n  border-radius: 32rpx 0 0 32rpx;\n  font-size: 24rpx;\n  font-weight: 500;\n  box-shadow: 0 4rpx 12rpx rgba(255, 66, 66, 0.4);\n}\n\n.my-card-info {\n  padding: 32rpx;\n}\n\n.card-name {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333;\n  margin-bottom: 24rpx;\n}\n\n/* 操作按钮 */\n.card-actions {\n  display: flex;\n  flex-direction: column;\n  gap: 16rpx;\n}\n\n.action-btn {\n  padding: 20rpx 0;\n  border-radius: 48rpx;\n  font-size: 28rpx;\n  font-weight: 500;\n  text-align: center;\n  transition: all 0.3s ease;\n}\n\n.action-btn.primary {\n  background: linear-gradient(135deg, #A0826D 0%, #8B6F47 100%);\n  color: #FFFFFF;\n  box-shadow: 0 6rpx 20rpx rgba(160, 130, 109, 0.3);\n}\n\n.action-btn.primary:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 12rpx rgba(160, 130, 109, 0.4);\n}\n\n.action-btn.danger {\n  background: linear-gradient(135deg, #FF9AA2 0%, #FF6B6B 100%);\n  color: #FFFFFF;\n  box-shadow: 0 6rpx 20rpx rgba(255, 107, 107, 0.3);\n}\n\n.action-btn.danger:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 12rpx rgba(255, 107, 107, 0.4);\n}\n\n.action-btn.outline {\n  background: #FFFFFF;\n  color: #A0826D;\n  border: 2rpx solid #A0826D;\n  box-shadow: 0 4rpx 12rpx rgba(160, 130, 109, 0.15);\n}\n\n.action-btn.outline:active {\n  background: rgba(160, 130, 109, 0.05);\n  transform: scale(0.98);\n}\n\n/* 送礼人信息 */\n.gift-from {\n  display: flex;\n  align-items: center;\n  margin-top: 16rpx;\n  padding: 20rpx;\n  background: linear-gradient(135deg, #FFF8F0 0%, #FFF0F5 100%);\n  border-radius: 16rpx;\n  border: 1rpx solid rgba(160, 130, 109, 0.1);\n}\n\n.from-avatar {\n  width: 48rpx;\n  height: 48rpx;\n  border-radius: 50%;\n  margin-right: 16rpx;\n  border: 2rpx solid #FFFFFF;\n  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);\n}\n\n.from-name {\n  font-size: 26rpx;\n  color: #666;\n}\n\n/* ==================== 空状态优化 ==================== */\nvan-empty {\n  padding: 120rpx 0;\n  background: transparent;\n}\n"
  },
  {
    "path": "pages/card/logs.js",
    "content": "const WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n    page: 1 // 读取第几页\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.card.logs,\n    })\n    this.data.cardId = options.cardId\n    this.cardMyLogs()\n  },\n  async cardMyLogs(){\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/gp7sey\n    const res = await WXAPI.cardMyLogs({\n      token: wx.getStorageSync('token'),\n      cardId: this.data.cardId,\n      page: this.data.page\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      if (this.data.page == 1) {\n        this.setData({\n          list: res.data.result,\n        })\n      } else {\n        this.setData({\n          list: this.data.list.concat(res.data.result),\n        })\n      }\n    } else {\n      if (this.data.page == 1) {\n        this.setData({\n          list: null,\n        })\n      }\n    }\n  },\n  onPullDownRefresh: function () {\n    this.data.page = 1\n    this.cardMyLogs()\n    wx.stopPullDownRefresh()\n  },\n  onReachBottom() {\n    this.data.page++\n    this.cardMyLogs()\n  },\n})"
  },
  {
    "path": "pages/card/logs.json",
    "content": "{\n  \"navigationBarTitleText\": \"\",\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "pages/card/logs.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 顶部装饰背景 -->\n  <view class=\"header-decoration\">\n    <view class=\"decoration-circle circle-1\"></view>\n    <view class=\"decoration-circle circle-2\"></view>\n    <view class=\"decoration-wave\"></view>\n  </view>\n\n  <!-- 卡片概览区域 -->\n  <view class=\"card-overview\">\n    <view class=\"overview-content\">\n      <view class=\"overview-icon\">☕</view>\n      <view class=\"overview-text\">\n        <text class=\"overview-title\">消费记录</text>\n        <text class=\"overview-subtitle\">Card Consumption Record</text>\n      </view>\n    </view>\n  </view>\n\n  <!-- 空状态 -->\n  <view wx:if=\"{{ !list }}\" class=\"empty-container\">\n    <view class=\"empty-icon\">📋</view>\n    <view class=\"empty-text\">暂无消费记录</view>\n    <view class=\"empty-tips\">使用礼品卡消费后，记录会显示在这里哦～</view>\n  </view>\n\n  <!-- 消费记录列表 -->\n  <view wx:else class=\"records-container\">\n    <view class=\"timeline-item\" wx:for=\"{{ list }}\" wx:key=\"id\">\n      <!-- 时间轴点 -->\n      <view class=\"timeline-dot\">\n        <view class=\"dot-inner\"></view>\n      </view>\n      \n      <!-- 记录卡片 -->\n      <view class=\"record-card\">\n        <view class=\"card-header\">\n          <view class=\"type-badge\">\n            <text class=\"badge-icon\">💳</text>\n            <text class=\"badge-text\">{{ item.typeStr }}</text>\n          </view>\n          <view class=\"date-text\">{{ item.dateAdd }}</view>\n        </view>\n        \n        <view class=\"card-body\">\n          <view class=\"amount-section\">\n            <view class=\"amount-label\">消费金额</view>\n            <view class=\"amount-value\">\n              <text class=\"amount-symbol\">-</text>\n              <text class=\"amount-number\">{{ item.amount }}</text>\n            </view>\n          </view>\n          \n          <view class=\"divider\"></view>\n          \n          <view class=\"balance-section\">\n            <view class=\"balance-item\">\n              <text class=\"balance-label\">剩余余额</text>\n              <text class=\"balance-value\">{{ item.balance }}</text>\n            </view>\n          </view>\n        </view>\n        \n        <view class=\"card-decoration\">\n          <view class=\"deco-line\"></view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 底部装饰 -->\n  <view class=\"footer-space\"></view>\n</view>"
  },
  {
    "path": "pages/card/logs.wxss",
    "content": "/* pages/card/logs.wxss */\npage {\n  background: linear-gradient(180deg, #F5F0EB 0%, #FDFBF9 100%);\n  min-height: 100vh;\n}\n\n.page-container {\n  position: relative;\n  min-height: 100vh;\n  padding-bottom: 40rpx;\n}\n\n/* ========== 顶部装饰 ========== */\n.header-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 280rpx;\n  background: linear-gradient(135deg, #D4B5A0 0%, #A0826D 100%);\n  overflow: hidden;\n  z-index: 0;\n}\n\n.decoration-circle {\n  position: absolute;\n  border-radius: 50%;\n  background: rgba(255, 255, 255, 0.1);\n}\n\n.circle-1 {\n  width: 300rpx;\n  height: 300rpx;\n  top: -100rpx;\n  right: -50rpx;\n  animation: float 6s ease-in-out infinite;\n}\n\n.circle-2 {\n  width: 200rpx;\n  height: 200rpx;\n  bottom: -80rpx;\n  left: -40rpx;\n  animation: float 8s ease-in-out infinite reverse;\n}\n\n.decoration-wave {\n  position: absolute;\n  bottom: -2rpx;\n  left: 0;\n  right: 0;\n  height: 60rpx;\n  background: #F5F0EB;\n  border-radius: 50% 50% 0 0 / 100% 100% 0 0;\n}\n\n@keyframes float {\n  0%, 100% {\n    transform: translateY(0) scale(1);\n  }\n  50% {\n    transform: translateY(-20rpx) scale(1.05);\n  }\n}\n\n/* ========== 卡片概览区域 ========== */\n.card-overview {\n  position: relative;\n  z-index: 1;\n  padding: 40rpx 32rpx 32rpx;\n}\n\n.overview-content {\n  display: flex;\n  align-items: center;\n  background: rgba(255, 255, 255, 0.95);\n  backdrop-filter: blur(10rpx);\n  border-radius: 24rpx;\n  padding: 32rpx 28rpx;\n  box-shadow: 0 8rpx 32rpx rgba(160, 130, 109, 0.12);\n}\n\n.overview-icon {\n  font-size: 68rpx;\n  margin-right: 24rpx;\n  animation: bounce 2s ease-in-out infinite;\n}\n\n@keyframes bounce {\n  0%, 100% {\n    transform: translateY(0);\n  }\n  50% {\n    transform: translateY(-8rpx);\n  }\n}\n\n.overview-text {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n}\n\n.overview-title {\n  font-size: 36rpx;\n  font-weight: 600;\n  color: #3D2F26;\n  line-height: 1.3;\n  margin-bottom: 8rpx;\n}\n\n.overview-subtitle {\n  font-size: 22rpx;\n  color: #A0826D;\n  letter-spacing: 1rpx;\n  text-transform: uppercase;\n}\n\n/* ========== 空状态 ========== */\n.empty-container {\n  position: relative;\n  z-index: 1;\n  margin: 120rpx 32rpx;\n  padding: 100rpx 40rpx 80rpx;\n  background: #fff;\n  border-radius: 32rpx;\n  text-align: center;\n  box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.04);\n}\n\n.empty-icon {\n  font-size: 120rpx;\n  margin-bottom: 32rpx;\n  opacity: 0.8;\n  animation: swing 3s ease-in-out infinite;\n}\n\n@keyframes swing {\n  0%, 100% {\n    transform: rotate(-5deg);\n  }\n  50% {\n    transform: rotate(5deg);\n  }\n}\n\n.empty-text {\n  font-size: 32rpx;\n  font-weight: 500;\n  color: #666;\n  margin-bottom: 16rpx;\n}\n\n.empty-tips {\n  font-size: 26rpx;\n  color: #999;\n  line-height: 1.6;\n  padding: 0 20rpx;\n}\n\n/* ========== 消费记录列表 ========== */\n.records-container {\n  position: relative;\n  z-index: 1;\n  padding: 0 32rpx;\n}\n\n.timeline-item {\n  position: relative;\n  padding-left: 60rpx;\n  margin-bottom: 32rpx;\n}\n\n.timeline-item:not(:last-child)::before {\n  content: '';\n  position: absolute;\n  left: 22rpx;\n  top: 60rpx;\n  bottom: -32rpx;\n  width: 2rpx;\n  background: linear-gradient(180deg, #D4B5A0 0%, rgba(212, 181, 160, 0.3) 100%);\n}\n\n/* ========== 时间轴点 ========== */\n.timeline-dot {\n  position: absolute;\n  left: 0;\n  top: 24rpx;\n  width: 46rpx;\n  height: 46rpx;\n  background: linear-gradient(135deg, #D4B5A0, #A0826D);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 4rpx 12rpx rgba(160, 130, 109, 0.3);\n  animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n  0%, 100% {\n    box-shadow: 0 4rpx 12rpx rgba(160, 130, 109, 0.3);\n  }\n  50% {\n    box-shadow: 0 4rpx 20rpx rgba(160, 130, 109, 0.5);\n  }\n}\n\n.dot-inner {\n  width: 16rpx;\n  height: 16rpx;\n  background: #fff;\n  border-radius: 50%;\n}\n\n/* ========== 记录卡片 ========== */\n.record-card {\n  position: relative;\n  background: #fff;\n  border-radius: 24rpx;\n  padding: 32rpx;\n  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);\n  transition: all 0.3s ease;\n  overflow: hidden;\n}\n\n.record-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 4rpx;\n  background: linear-gradient(90deg, #D4B5A0, #A0826D);\n}\n\n/* ========== 卡片头部 ========== */\n.card-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 24rpx;\n}\n\n.type-badge {\n  display: flex;\n  align-items: center;\n  background: linear-gradient(135deg, #FFF5EE, #F5EBE0);\n  padding: 12rpx 20rpx;\n  border-radius: 40rpx;\n  border: 1rpx solid rgba(160, 130, 109, 0.15);\n}\n\n.badge-icon {\n  font-size: 28rpx;\n  margin-right: 8rpx;\n}\n\n.badge-text {\n  font-size: 28rpx;\n  font-weight: 500;\n  color: #A0826D;\n}\n\n.date-text {\n  font-size: 24rpx;\n  color: #999;\n}\n\n/* ========== 卡片主体 ========== */\n.card-body {\n  background: linear-gradient(135deg, #FDFBF9 0%, #F9F6F3 100%);\n  border-radius: 16rpx;\n  padding: 28rpx 24rpx;\n}\n\n.amount-section {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 24rpx;\n}\n\n.amount-label {\n  font-size: 26rpx;\n  color: #666;\n}\n\n.amount-value {\n  display: flex;\n  align-items: baseline;\n}\n\n.amount-symbol {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #FF6B6B;\n  margin-right: 4rpx;\n}\n\n.amount-number {\n  font-size: 44rpx;\n  font-weight: 700;\n  color: #FF6B6B;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;\n}\n\n.divider {\n  height: 1rpx;\n  background: linear-gradient(90deg, \n    rgba(160, 130, 109, 0) 0%, \n    rgba(160, 130, 109, 0.2) 50%, \n    rgba(160, 130, 109, 0) 100%\n  );\n  margin: 24rpx 0;\n}\n\n.balance-section {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.balance-item {\n  display: flex;\n  flex-direction: column;\n  gap: 8rpx;\n}\n\n.balance-label {\n  font-size: 24rpx;\n  color: #999;\n}\n\n.balance-value {\n  font-size: 36rpx;\n  font-weight: 600;\n  color: #52C41A;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;\n}\n\n/* ========== 卡片装饰 ========== */\n.card-decoration {\n  margin-top: 24rpx;\n  padding-top: 20rpx;\n  border-top: 1rpx dashed rgba(160, 130, 109, 0.2);\n}\n\n.deco-line {\n  height: 6rpx;\n  background: linear-gradient(90deg, \n    #D4B5A0 0%, \n    #A0826D 50%, \n    #D4B5A0 100%\n  );\n  border-radius: 3rpx;\n  opacity: 0.3;\n}\n\n/* ========== 底部空间 ========== */\n.footer-space {\n  height: 60rpx;\n}"
  },
  {
    "path": "pages/card/receive.js",
    "content": "const WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n  },\n  onLoad (e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.card.shareplaceholder,\n    })\n    this.setData({\n      id: e.id,\n      shareToken: e.shareToken\n    })\n    this.cardShareFetch(true)\n  },\n  submit() {\n    this.cardShareFetch(false)\n  },\n  async cardShareFetch(calculate) {\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/gmfdsdag0gxv8tp0\n    const res = await WXAPI.cardShareFetch({\n      token: wx.getStorageSync('token'),\n      id: this.data.id,\n      shareToken: this.data.shareToken,\n      calculate\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      if (calculate) {\n        this.setData({\n          user: res.data.user,\n          cardUser: res.data.cardUser,\n          cardInfo: res.data.cardInfo,\n        })\n      } else {\n        wx.showModal({\n          content: this.data.$t.card.fetchSuccess,\n          showCancel: false,\n          confirmText: this.data.$t.common.gotIt,\n          success: (res) => {\n            wx.reLaunch({\n              url: '/pages/home/index',\n            })\n          }\n        })\n      }\n    } else {\n      wx.showModal({\n        content: this.data.$t.card.receiveEmpty,\n        showCancel: false,\n        confirmText: this.data.$t.common.gotIt,\n        success: (res) => {\n          wx.reLaunch({\n            url: '/pages/home/index',\n          })\n        }\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/card/receive.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "pages/card/receive.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 顶部装饰波浪 -->\n  <view class=\"wave-decoration\"></view>\n  \n  <!-- 主卡片容器 -->\n  <view class=\"main-card\">\n    <!-- 礼物图标装饰 -->\n    <view class=\"gift-icon\">🎁</view>\n    \n    <!-- 赠送人信息 -->\n    <view class=\"sender-section\">\n      <view class=\"sender-avatar-wrapper\">\n        <image class=\"sender-avatar\" src=\"{{ user.avatarUrl || '/images/who.png' }}\" mode=\"aspectFill\"></image>\n        <view class=\"avatar-border\"></view>\n      </view>\n      <view class=\"sender-info\">\n        <view class=\"sender-name\">{{ user.nick || $t.card.friend }}</view>\n        <view class=\"sender-label\">{{ $t.card.shareplaceholder }}</view>\n      </view>\n    </view>\n\n    <!-- 祝福留言 -->\n    <view class=\"blessing-card\" wx:if=\"{{ cardInfo.shareContent }}\">\n      <view class=\"blessing-icon\">💌</view>\n      <view class=\"blessing-text\">{{ cardInfo.shareContent }}</view>\n      <view class=\"blessing-quote-left\">\"</view>\n      <view class=\"blessing-quote-right\">\"</view>\n    </view>\n\n    <!-- 礼品卡展示区 -->\n    <view class=\"gift-card-display\">\n      <view class=\"card-glow\"></view>\n      <view class=\"card-wrapper\">\n        <image class=\"card-image\" src=\"{{ cardInfo.pic }}\" mode=\"aspectFill\"></image>\n        <view class=\"card-shine\"></view>\n      </view>\n      \n      <!-- 卡片信息 -->\n      <view class=\"card-info-section\">\n        <view class=\"card-title\">{{ cardInfo.name }}</view>\n        <view class=\"card-divider\"></view>\n        <view class=\"card-amount-wrapper\">\n          <view wx:if=\"{{ cardUser.type == 0 }}\" class=\"card-amount\">\n            <text class=\"amount-number\">{{ cardUser.amount }}</text>\n            <text class=\"amount-unit\">{{ $t.card.times }}</text>\n          </view>\n          <view wx:if=\"{{ cardUser.type == 1 }}\" class=\"card-amount\">\n            <text class=\"amount-symbol\">¥</text>\n            <text class=\"amount-number\">{{ cardUser.amount }}</text>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 装饰元素 -->\n    <view class=\"sparkle sparkle-1\">✨</view>\n    <view class=\"sparkle sparkle-2\">✨</view>\n    <view class=\"sparkle sparkle-3\">✨</view>\n\n    <!-- 领取按钮 -->\n    <view class=\"receive-button-wrapper\">\n      <view class=\"button-glow\"></view>\n      <van-button \n        type=\"primary\" \n        size=\"large\" \n        block \n        round \n        bind:click=\"submit\" \n        class=\"receive-button\">\n        {{ $t.card.cardShareFetch }}\n      </van-button>\n    </view>\n\n    <!-- 温馨提示 -->\n    <view class=\"warm-tips\">\n      <text class=\"tips-icon\">☕</text>\n      <text class=\"tips-text\">领取后可在\"我的\"-\"礼品卡\"中查看</text>\n    </view>\n  </view>\n\n  <!-- 底部装饰 -->\n  <view class=\"bottom-decoration\"></view>\n</view>"
  },
  {
    "path": "pages/card/receive.wxss",
    "content": "/* 页面整体样式 - 奶茶店温馨渐变背景 */\npage {\n  background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 50%, #f8d7da 100%);\n  min-height: 100vh;\n  padding-bottom: 40rpx;\n}\n\n/* 页面容器 */\n.page-container {\n  position: relative;\n  min-height: 100vh;\n  overflow: hidden;\n}\n\n/* 顶部波浪装饰 */\n.wave-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 200rpx;\n  background: linear-gradient(180deg, rgba(255, 255, 255, 0.3) 0%, transparent 100%);\n  border-radius: 0 0 50% 50%;\n  z-index: 0;\n}\n\n/* 主卡片容器 */\n.main-card {\n  position: relative;\n  margin: 40rpx 32rpx;\n  background: linear-gradient(135deg, #ffffff 0%, #fffbf7 100%);\n  padding: 48rpx 32rpx 56rpx;\n  border-radius: 40rpx;\n  box-shadow: 0 20rpx 60rpx rgba(252, 182, 159, 0.3),\n              0 8rpx 20rpx rgba(255, 236, 210, 0.2);\n  z-index: 1;\n  overflow: hidden;\n}\n\n/* 礼物图标装饰 */\n.gift-icon {\n  position: absolute;\n  top: -20rpx;\n  right: 40rpx;\n  font-size: 80rpx;\n  animation: float 3s ease-in-out infinite;\n  z-index: 2;\n}\n\n@keyframes float {\n  0%, 100% { transform: translateY(0) rotate(0deg); }\n  50% { transform: translateY(-10rpx) rotate(5deg); }\n}\n\n/* 赠送人信息区域 */\n.sender-section {\n  display: flex;\n  align-items: center;\n  padding: 20rpx 0;\n  margin-bottom: 32rpx;\n}\n\n.sender-avatar-wrapper {\n  position: relative;\n  margin-right: 24rpx;\n}\n\n.sender-avatar {\n  width: 120rpx;\n  height: 120rpx;\n  border-radius: 50%;\n  border: 4rpx solid #fff;\n  box-shadow: 0 8rpx 20rpx rgba(252, 182, 159, 0.3);\n}\n\n.avatar-border {\n  position: absolute;\n  top: -6rpx;\n  left: -6rpx;\n  right: -6rpx;\n  bottom: -6rpx;\n  border-radius: 50%;\n  border: 2rpx solid transparent;\n  background: linear-gradient(135deg, #fcb69f, #ffecd2);\n  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\n  -webkit-mask-composite: xor;\n  mask-composite: exclude;\n  padding: 2rpx;\n}\n\n.sender-info {\n  flex: 1;\n}\n\n.sender-name {\n  font-size: 36rpx;\n  font-weight: bold;\n  color: #5c3317;\n  margin-bottom: 8rpx;\n  letter-spacing: 1rpx;\n}\n\n.sender-label {\n  font-size: 26rpx;\n  color: #a67c52;\n  opacity: 0.8;\n}\n\n/* 祝福留言卡片 */\n.blessing-card {\n  position: relative;\n  background: linear-gradient(135deg, #fff9f3 0%, #ffe8d6 100%);\n  border-radius: 24rpx;\n  padding: 32rpx 40rpx;\n  margin: 32rpx 0 40rpx;\n  border: 2rpx dashed rgba(166, 124, 82, 0.3);\n  box-shadow: 0 4rpx 12rpx rgba(252, 182, 159, 0.15);\n}\n\n.blessing-icon {\n  position: absolute;\n  top: -16rpx;\n  left: 24rpx;\n  font-size: 48rpx;\n  background: #fff;\n  padding: 0 8rpx;\n}\n\n.blessing-text {\n  font-size: 28rpx;\n  line-height: 48rpx;\n  color: #5c3317;\n  font-style: italic;\n  text-align: center;\n  position: relative;\n  z-index: 1;\n}\n\n.blessing-quote-left,\n.blessing-quote-right {\n  position: absolute;\n  font-size: 80rpx;\n  color: rgba(252, 182, 159, 0.2);\n  font-family: Georgia, serif;\n  font-weight: bold;\n}\n\n.blessing-quote-left {\n  top: 10rpx;\n  left: 10rpx;\n}\n\n.blessing-quote-right {\n  bottom: -20rpx;\n  right: 10rpx;\n}\n\n/* 礼品卡展示区 */\n.gift-card-display {\n  position: relative;\n  margin: 48rpx 0;\n}\n\n.card-glow {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 400rpx;\n  height: 400rpx;\n  background: radial-gradient(circle, rgba(252, 182, 159, 0.3) 0%, transparent 70%);\n  border-radius: 50%;\n  animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n  0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.5; }\n  50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.8; }\n}\n\n.card-wrapper {\n  position: relative;\n  width: 100%;\n  height: 380rpx;\n  border-radius: 28rpx;\n  overflow: hidden;\n  box-shadow: 0 16rpx 40rpx rgba(92, 51, 23, 0.15);\n  background: #fff;\n}\n\n.card-image {\n  width: 100%;\n  height: 100%;\n}\n\n.card-shine {\n  position: absolute;\n  top: -50%;\n  left: -50%;\n  width: 200%;\n  height: 200%;\n  background: linear-gradient(45deg, \n    transparent 30%, \n    rgba(255, 255, 255, 0.3) 50%, \n    transparent 70%);\n  animation: shine 3s ease-in-out infinite;\n}\n\n@keyframes shine {\n  0% { transform: translateX(-100%) translateY(-100%) rotate(45deg); }\n  100% { transform: translateX(100%) translateY(100%) rotate(45deg); }\n}\n\n/* 卡片信息区 */\n.card-info-section {\n  margin-top: 36rpx;\n  text-align: center;\n}\n\n.card-title {\n  font-size: 38rpx;\n  font-weight: bold;\n  color: #5c3317;\n  margin-bottom: 20rpx;\n  letter-spacing: 2rpx;\n}\n\n.card-divider {\n  width: 100rpx;\n  height: 4rpx;\n  background: linear-gradient(90deg, transparent, #fcb69f, transparent);\n  margin: 20rpx auto;\n  border-radius: 2rpx;\n}\n\n.card-amount-wrapper {\n  margin-top: 24rpx;\n}\n\n.card-amount {\n  display: inline-flex;\n  align-items: baseline;\n  padding: 16rpx 40rpx;\n  background: linear-gradient(135deg, #fff3e6 0%, #ffe8cc 100%);\n  border-radius: 60rpx;\n  box-shadow: 0 4rpx 16rpx rgba(252, 182, 159, 0.2);\n}\n\n.amount-symbol {\n  font-size: 32rpx;\n  color: #d4744f;\n  font-weight: bold;\n  margin-right: 4rpx;\n}\n\n.amount-number {\n  font-size: 64rpx;\n  font-weight: bold;\n  color: #d4744f;\n  line-height: 1;\n}\n\n.amount-unit {\n  font-size: 28rpx;\n  color: #a67c52;\n  margin-left: 8rpx;\n  font-weight: 500;\n}\n\n/* 闪光装饰元素 */\n.sparkle {\n  position: absolute;\n  font-size: 48rpx;\n  opacity: 0.6;\n  animation: sparkle 2s ease-in-out infinite;\n}\n\n.sparkle-1 {\n  top: 15%;\n  left: 10%;\n  animation-delay: 0s;\n}\n\n.sparkle-2 {\n  top: 25%;\n  right: 15%;\n  animation-delay: 0.7s;\n}\n\n.sparkle-3 {\n  bottom: 35%;\n  left: 15%;\n  animation-delay: 1.4s;\n}\n\n@keyframes sparkle {\n  0%, 100% { opacity: 0.3; transform: scale(0.8) rotate(0deg); }\n  50% { opacity: 1; transform: scale(1.2) rotate(180deg); }\n}\n\n/* 领取按钮区域 */\n.receive-button-wrapper {\n  position: relative;\n  margin-top: 56rpx;\n  margin-bottom: 32rpx;\n}\n\n.button-glow {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 100%;\n  height: 100rpx;\n  background: radial-gradient(ellipse, rgba(252, 182, 159, 0.4) 0%, transparent 70%);\n  filter: blur(20rpx);\n}\n\n.receive-button {\n  position: relative;\n  z-index: 1;\n  background: linear-gradient(135deg, #fcb69f 0%, #f8997f 100%) !important;\n  border: none !important;\n  box-shadow: 0 8rpx 24rpx rgba(248, 153, 127, 0.4),\n              0 4rpx 8rpx rgba(252, 182, 159, 0.3) !important;\n  font-size: 32rpx !important;\n  font-weight: bold !important;\n  letter-spacing: 4rpx !important;\n  transition: all 0.3s ease;\n}\n\n.receive-button:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 12rpx rgba(248, 153, 127, 0.3) !important;\n}\n\n/* 温馨提示 */\n.warm-tips {\n  text-align: center;\n  font-size: 24rpx;\n  color: #a67c52;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  opacity: 0.8;\n  margin-top: 16rpx;\n}\n\n.tips-icon {\n  font-size: 32rpx;\n  margin-right: 8rpx;\n}\n\n.tips-text {\n  line-height: 1.6;\n}\n\n/* 底部装饰 */\n.bottom-decoration {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  height: 120rpx;\n  background: linear-gradient(0deg, rgba(255, 255, 255, 0.3) 0%, transparent 100%);\n  border-radius: 50% 50% 0 0;\n  pointer-events: none;\n  z-index: 0;\n}"
  },
  {
    "path": "pages/card/send.js",
    "content": "const WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n    autosize: {\n      minHeight: 100\n    },\n  },\n  onLoad (e) {\n    wx.hideShareMenu({\n      menus: ['shareAppMessage', 'shareTimeline']\n    })\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.card.cardShareOpen,\n    })\n    this.setData({\n      cardUser: wx.getStorageSync('sendCard'),\n      remark: this.data.$t.card.shareplaceholder\n    })\n    this.cardShareOpen()\n    wx.setStorageSync('cardmyrefresh', true)\n  },\n  async cardShareOpen() {\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/xevcthfroio6xnc0\n    const res = await WXAPI.cardShareOpen({\n      token: wx.getStorageSync('token'),\n      id: this.data.cardUser.id,\n      remark: this.data.remark,\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        shareToken: res.data\n      })\n    }\n  },\n  onShareAppMessage(e) {\n    const promise = new Promise(resolve => {\n      WXAPI.cardShareOpen({\n        token: wx.getStorageSync('token'),\n        id: this.data.cardUser.id,\n        remark: this.data.remark,\n      }).then( res => {\n        if (res.code == 0) {\n          this.setData({\n            shareToken: res.data\n          })\n          resolve({\n            title: this.data.remark,\n            path: '/pages/card/receive?inviter_id=' + (wx.getStorageSync('uid') || '') + '&id='+ this.data.cardUser.id +'&shareToken=' + this.data.shareToken,\n            imageUrl: this.data.cardUser.cardInfo.pic,\n          })\n        }\n      })\n    })\n    return {\n      title: this.data.remark,\n      path: '/pages/card/receive?inviter_id=' + (wx.getStorageSync('uid') || '') + '&id='+ this.data.cardUser.id +'&shareToken=' + this.data.shareToken,\n      imageUrl: this.data.cardUser.cardInfo.pic,\n      promise\n    }\n  },\n})"
  },
  {
    "path": "pages/card/send.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "pages/card/send.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 顶部装饰 -->\n  <view class=\"top-decoration\">\n    <view class=\"deco-circle deco-circle-1\"></view>\n    <view class=\"deco-circle deco-circle-2\"></view>\n  </view>\n\n  <!-- 礼品卡容器 -->\n  <view class=\"gift-card-wrapper\">\n    <!-- 标题区域 -->\n    <view class=\"header-section\">\n      <view class=\"header-icon\">🎁</view>\n      <view class=\"header-title\">赠送礼品卡</view>\n      <view class=\"header-subtitle\">传递心意，分享美好时光</view>\n    </view>\n\n    <!-- 礼品卡主体 -->\n    <view class=\"gift-card\">\n      <view class=\"card-shine\"></view>\n      <view class=\"card-bg-pattern\"></view>\n      \n      <view class=\"card-content\">\n        <!-- 卡片图片 -->\n        <view class=\"card-image-wrapper\">\n          <image class=\"card-image\" src=\"{{ cardUser.cardInfo.pic }}\" mode=\"aspectFill\"></image>\n          <view class=\"card-image-overlay\"></view>\n        </view>\n\n        <!-- 卡片信息 -->\n        <view class=\"card-info\">\n          <view class=\"card-name\">{{ cardUser.cardInfo.name }}</view>\n          \n          <!-- 金额/次数展示 -->\n          <view class=\"card-value\">\n            <view wx:if=\"{{ cardUser.type == 0 }}\" class=\"value-container\">\n              <text class=\"value-number\">{{ cardUser.amount }}</text>\n              <text class=\"value-unit\">{{ $t.card.times }}</text>\n            </view>\n            <view wx:if=\"{{ cardUser.type == 1 }}\" class=\"value-container\">\n              <text class=\"value-symbol\">¥</text>\n              <text class=\"value-number\">{{ cardUser.amount }}</text>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 留言区域 -->\n    <view class=\"message-section\">\n      <view class=\"message-label\">\n        <view class=\"label-icon\">💌</view>\n        <view class=\"label-text\">赠送留言</view>\n      </view>\n      <view class=\"message-input-wrapper\">\n        <van-field\n          model:value=\"{{ remark }}\"\n          type=\"textarea\"\n          autosize=\"{{ autosize }}\"\n          input-class=\"message-input\"\n          placeholder=\"{{ $t.card.shareplaceholder }}\"\n          border=\"{{ false }}\"\n        />\n      </view>\n    </view>\n\n    <!-- 分享按钮 -->\n    <view class=\"share-button-wrapper\">\n      <van-button \n        type=\"primary\" \n        size=\"large\" \n        block \n        round \n        open-type=\"share\"\n        custom-class=\"share-button\"\n      >\n        <view class=\"button-content\">\n          <text class=\"button-icon\">✨</text>\n          <text class=\"button-text\">{{ $t.card.cardShareOpen }}</text>\n        </view>\n      </van-button>\n    </view>\n  </view>\n\n  <!-- 底部装饰 -->\n  <view class=\"bottom-decoration\">\n    <view class=\"wave wave-1\"></view>\n    <view class=\"wave wave-2\"></view>\n  </view>\n</view>"
  },
  {
    "path": "pages/card/send.wxss",
    "content": "/* 页面整体背景 - 奶茶渐变 */\npage {\n  background: linear-gradient(180deg, \n    #F5E6D3 0%, \n    #E8D4C0 50%, \n    #DCC5B0 100%);\n  min-height: 100vh;\n}\n\n/* 页面容器 */\n.page-container {\n  position: relative;\n  min-height: 100vh;\n  overflow: hidden;\n  padding: 40rpx 32rpx 60rpx;\n}\n\n/* ========== 顶部装饰 ========== */\n.top-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 400rpx;\n  overflow: hidden;\n  pointer-events: none;\n  z-index: 0;\n}\n\n.deco-circle {\n  position: absolute;\n  border-radius: 50%;\n  opacity: 0.1;\n  background: linear-gradient(135deg, #8B6F47 0%, #A0826D 100%);\n}\n\n.deco-circle-1 {\n  width: 400rpx;\n  height: 400rpx;\n  top: -200rpx;\n  right: -100rpx;\n}\n\n.deco-circle-2 {\n  width: 300rpx;\n  height: 300rpx;\n  top: 100rpx;\n  left: -150rpx;\n}\n\n/* ========== 礼品卡容器 ========== */\n.gift-card-wrapper {\n  position: relative;\n  z-index: 1;\n}\n\n/* ========== 标题区域 ========== */\n.header-section {\n  text-align: center;\n  margin-bottom: 48rpx;\n  animation: fadeInDown 0.6s ease-out;\n}\n\n.header-icon {\n  font-size: 80rpx;\n  margin-bottom: 16rpx;\n  animation: bounce 2s infinite;\n}\n\n.header-title {\n  font-size: 48rpx;\n  font-weight: 700;\n  color: #5D4037;\n  margin-bottom: 12rpx;\n  letter-spacing: 2rpx;\n}\n\n.header-subtitle {\n  font-size: 26rpx;\n  color: #8D6E63;\n  letter-spacing: 1rpx;\n}\n\n/* ========== 礼品卡主体 ========== */\n.gift-card {\n  position: relative;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF8F0 100%);\n  border-radius: 32rpx;\n  overflow: hidden;\n  box-shadow: \n    0 20rpx 60rpx rgba(141, 110, 99, 0.15),\n    0 8rpx 20rpx rgba(141, 110, 99, 0.1);\n  margin-bottom: 40rpx;\n  animation: fadeInUp 0.6s ease-out 0.2s both;\n}\n\n/* 卡片光泽效果 */\n.card-shine {\n  position: absolute;\n  top: -50%;\n  left: -50%;\n  width: 200%;\n  height: 200%;\n  background: linear-gradient(\n    45deg,\n    transparent 30%,\n    rgba(255, 255, 255, 0.3) 50%,\n    transparent 70%\n  );\n  animation: shine 3s infinite;\n  pointer-events: none;\n  z-index: 2;\n}\n\n/* 卡片背景图案 */\n.card-bg-pattern {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-image: \n    radial-gradient(circle at 20% 80%, rgba(139, 111, 71, 0.03) 0%, transparent 50%),\n    radial-gradient(circle at 80% 20%, rgba(160, 130, 109, 0.03) 0%, transparent 50%);\n  pointer-events: none;\n  z-index: 1;\n}\n\n.card-content {\n  position: relative;\n  z-index: 3;\n  padding: 40rpx;\n}\n\n/* 卡片图片区域 */\n.card-image-wrapper {\n  position: relative;\n  width: 100%;\n  height: 380rpx;\n  border-radius: 24rpx;\n  overflow: hidden;\n  margin-bottom: 32rpx;\n  box-shadow: 0 8rpx 24rpx rgba(141, 110, 99, 0.12);\n}\n\n.card-image {\n  width: 100%;\n  height: 100%;\n  display: block;\n}\n\n.card-image-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: linear-gradient(\n    180deg,\n    transparent 0%,\n    rgba(93, 64, 55, 0.05) 100%\n  );\n}\n\n/* 卡片信息 */\n.card-info {\n  text-align: center;\n}\n\n.card-name {\n  font-size: 40rpx;\n  font-weight: 700;\n  color: #4E342E;\n  margin-bottom: 24rpx;\n  letter-spacing: 1rpx;\n  line-height: 1.5;\n}\n\n.card-value {\n  display: flex;\n  justify-content: center;\n  align-items: baseline;\n}\n\n.value-container {\n  display: inline-flex;\n  align-items: baseline;\n  justify-content: center;\n  background: linear-gradient(135deg, #8B6F47 0%, #A0826D 100%);\n  -webkit-background-clip: text;\n  -webkit-text-fill-color: transparent;\n  background-clip: text;\n  padding: 16rpx 40rpx;\n  border-radius: 60rpx;\n  background-color: rgba(139, 111, 71, 0.08);\n  background-image: none;\n}\n\n.value-symbol {\n  font-size: 40rpx;\n  font-weight: 600;\n  color: #8B6F47;\n  margin-right: 8rpx;\n}\n\n.value-number {\n  font-size: 72rpx;\n  font-weight: 700;\n  color: #8B6F47;\n  line-height: 1;\n}\n\n.value-unit {\n  font-size: 32rpx;\n  font-weight: 500;\n  color: #A0826D;\n  margin-left: 8rpx;\n}\n\n/* ========== 留言区域 ========== */\n.message-section {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 32rpx;\n  margin-bottom: 40rpx;\n  box-shadow: 0 8rpx 32rpx rgba(141, 110, 99, 0.08);\n  animation: fadeInUp 0.6s ease-out 0.4s both;\n}\n\n.message-label {\n  display: flex;\n  align-items: center;\n  margin-bottom: 20rpx;\n}\n\n.label-icon {\n  font-size: 36rpx;\n  margin-right: 12rpx;\n}\n\n.label-text {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #5D4037;\n  letter-spacing: 1rpx;\n}\n\n.message-input-wrapper {\n  background: #FFF8F0;\n  border-radius: 16rpx;\n  padding: 8rpx;\n  border: 2rpx solid #F5E6D3;\n  transition: all 0.3s ease;\n}\n\n.message-input-wrapper:focus-within {\n  border-color: #A0826D;\n  box-shadow: 0 0 0 4rpx rgba(160, 130, 109, 0.1);\n}\n\n.message-input {\n  background: transparent !important;\n  padding: 20rpx !important;\n  font-size: 28rpx !important;\n  color: #4E342E !important;\n  line-height: 1.6 !important;\n  min-height: 160rpx !important;\n}\n\n/* ========== 分享按钮 ========== */\n.share-button-wrapper {\n  animation: fadeInUp 0.6s ease-out 0.6s both;\n}\n\n.share-button {\n  background: linear-gradient(135deg, #8B6F47 0%, #A0826D 100%) !important;\n  border: none !important;\n  box-shadow: \n    0 12rpx 40rpx rgba(139, 111, 71, 0.3),\n    0 4rpx 12rpx rgba(139, 111, 71, 0.2) !important;\n  height: 96rpx !important;\n  transition: all 0.3s ease;\n}\n\n.share-button:active {\n  transform: translateY(4rpx);\n  box-shadow: \n    0 8rpx 24rpx rgba(139, 111, 71, 0.2),\n    0 2rpx 8rpx rgba(139, 111, 71, 0.15) !important;\n}\n\n.button-content {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #FFFFFF;\n  letter-spacing: 2rpx;\n}\n\n.button-icon {\n  font-size: 36rpx;\n  margin-right: 12rpx;\n}\n\n.button-text {\n  color: #FFFFFF;\n}\n\n/* ========== 底部装饰 ========== */\n.bottom-decoration {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  height: 200rpx;\n  overflow: hidden;\n  pointer-events: none;\n  z-index: 0;\n}\n\n.wave {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 200%;\n  height: 100%;\n  background-repeat: repeat-x;\n  animation: wave 12s linear infinite;\n}\n\n.wave-1 {\n  background-image: linear-gradient(to right, transparent 50%, rgba(139, 111, 71, 0.05) 50%);\n  background-size: 400rpx 100%;\n  animation-duration: 15s;\n}\n\n.wave-2 {\n  background-image: linear-gradient(to right, transparent 50%, rgba(160, 130, 109, 0.03) 50%);\n  background-size: 600rpx 100%;\n  animation-duration: 20s;\n  animation-direction: reverse;\n}\n\n/* ========== 动画定义 ========== */\n@keyframes fadeInDown {\n  from {\n    opacity: 0;\n    transform: translateY(-40rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    transform: translateY(40rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes bounce {\n  0%, 20%, 50%, 80%, 100% {\n    transform: translateY(0);\n  }\n  40% {\n    transform: translateY(-20rpx);\n  }\n  60% {\n    transform: translateY(-10rpx);\n  }\n}\n\n@keyframes shine {\n  0% {\n    transform: translateX(-100%) translateY(-100%) rotate(45deg);\n  }\n  100% {\n    transform: translateX(100%) translateY(100%) rotate(45deg);\n  }\n}\n\n@keyframes wave {\n  0% {\n    transform: translateX(0);\n  }\n  100% {\n    transform: translateX(-50%);\n  }\n}"
  },
  {
    "path": "pages/cart/index.js",
    "content": "const APP = getApp()\nconst WXAPI = require('apifm-wxapi')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\n\nPage({\n  data: {\n\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n        title: this.data.$t.cart.title,\n    })\n  },\n  onShow: function () {\n    this.shippingCarInfo()\n  },\n  onPullDownRefresh() {\n    this.shippingCarInfo()\n    wx.stopPullDownRefresh()\n  },\n  async shippingCarInfo() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.shippingCarInfo(wx.getStorageSync('token'))\n    wx.hideLoading({\n      success: (res) => {},\n    })\n    if (res.code == 0) {\n      this.setData({\n        shippingCarInfo: res.data\n      })\n    } else {\n      this.setData({\n        shippingCarInfo: null,\n        showCartPop: false\n      })\n    }\n  },\n  async cartStepChange(e) {\n    const token = wx.getStorageSync('token')\n    const index = e.currentTarget.dataset.idx\n    const item = this.data.shippingCarInfo.items[index]\n    if (e.detail < item.minBuyNumber) {\n      // 删除商品\n      wx.showLoading({\n        title: '',\n      })\n      const res = await WXAPI.shippingCarInfoRemoveItem(token, item.key)\n      wx.hideLoading()\n      if (res.code != 0 && res.code != 700) {\n        wx.showToast({\n          title: res.msg,\n          icon: 'none'\n        })\n        return\n      }\n      this.shippingCarInfo()\n    } else {\n      // 修改数量\n      wx.showLoading({\n        title: '',\n      })\n      const res = await WXAPI.shippingCarInfoModifyNumber(token, item.key, e.detail)\n      wx.hideLoading()\n      if (res.code != 0) {\n        wx.showToast({\n          title: res.msg,\n          icon: 'none'\n        })\n        return\n      }\n      this.shippingCarInfo()\n    }\n  },\n  async clearCart() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.shippingCarInfoRemoveAll(wx.getStorageSync('token'))\n    wx.hideLoading()\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    this.shippingCarInfo()\n  },\n  async goCreateOrder() {\n    const goodsJsonStr = []\n    this.data.shippingCarInfo.items.forEach(ele => {\n      let propertyChildIds = ''\n      if (ele.sku) {\n        ele.sku.forEach(_sku => {\n          propertyChildIds += `,${_sku.optionId}:${_sku.optionValueId}`\n        })\n      }\n      goodsJsonStr.push({\n        goodsId: ele.goodsId,\n        number: ele.number,\n        propertyChildIds,\n      })\n    })\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.cyTableAddOrder({\n      token: wx.getStorageSync('token'),\n      goodsJsonStr: JSON.stringify(goodsJsonStr)\n    })\n    wx.hideLoading()\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    await this.clearCart()\n    wx.redirectTo({\n      url: '/pages/cart/order',\n    })\n  },\n})"
  },
  {
    "path": "pages/cart/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\",\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "pages/cart/index.wxml",
    "content": "<view class=\"cart-container\">\n  <!-- 空状态 -->\n  <view wx:if=\"{{ !shippingCarInfo }}\" class=\"empty-state\">\n    <view class=\"empty-icon\">🛒</view>\n    <view class=\"empty-text\">{{ $t.cart.empty }}</view>\n    <view class=\"empty-tip\">去添加您喜欢的饮品吧</view>\n  </view>\n\n  <!-- 购物车内容 -->\n  <block wx:else>\n    <!-- 顶部操作栏 -->\n    <view class=\"cart-header\">\n      <view class=\"cart-title\">\n        <view class=\"title-icon\">☕</view>\n        <view class=\"title-text\">购物袋</view>\n        <view class=\"item-count\">{{shippingCarInfo.number}}件</view>\n      </view>\n      <view class=\"clear-btn\" bindtap=\"clearCart\">\n        <van-icon name=\"delete-o\" size=\"16px\" color=\"#999\" />\n        <text>{{ $t.cart.clear }}</text>\n      </view>\n    </view>\n\n    <!-- 商品列表 -->\n    <view class=\"goods-list\">\n      <view class=\"goods-item\" wx:for=\"{{shippingCarInfo.items}}\" wx:key=\"key\">\n        <view class=\"item-card\">\n          <!-- 商品图片 -->\n          <view class=\"item-image\">\n            <image src=\"{{ item.pic }}\" mode=\"aspectFill\" class=\"goods-img\" />\n          </view>\n          \n          <!-- 商品信息 -->\n          <view class=\"item-info\">\n            <view class=\"goods-name\">{{ item.name }}</view>\n            \n            <!-- 规格信息 -->\n            <view class=\"goods-specs\">\n              <block wx:for=\"{{item.sku}}\" wx:for-item=\"option\" wx:key=\"index\">\n                <view class=\"spec-tag\">{{option.optionValueName}}</view>\n              </block>\n              <block wx:for=\"{{item.additions}}\" wx:for-item=\"option\" wx:key=\"index\">\n                <view class=\"spec-tag addition-tag\">+{{option.name}}</view>\n              </block>\n            </view>\n            \n            <!-- 价格和数量 -->\n            <view class=\"item-bottom\">\n              <view class=\"goods-price\">\n                <text class=\"price-symbol\">¥</text>\n                <text class=\"price-num\">{{ item.price }}</text>\n              </view>\n              <view class=\"goods-stepper\">\n                <van-stepper \n                  value=\"{{ item.number }}\" \n                  min=\"0\" \n                  async-change \n                  disable-input \n                  data-idx=\"{{index}}\" \n                  bind:change=\"cartStepChange\"\n                  button-size=\"28px\"\n                  theme=\"round\"\n                />\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 底部占位 -->\n    <view class=\"bottom-placeholder\"></view>\n\n    <!-- 底部结算栏 -->\n    <view class=\"submit-bar\">\n      <view class=\"bar-content\">\n        <view class=\"total-info\">\n          <view class=\"total-label\">合计</view>\n          <view class=\"total-price\">\n            <text class=\"currency\">¥</text>\n            <text class=\"amount\">{{ shippingCarInfo.price }}</text>\n          </view>\n          <view class=\"total-tip\">共{{shippingCarInfo.number}}{{ $t.cart.num }}</view>\n        </view>\n        <view class=\"submit-btn\" bindtap=\"goCreateOrder\">\n          <text>{{ $t.cart.btn }}</text>\n          <van-icon name=\"arrow\" color=\"#fff\" size=\"16px\" />\n        </view>\n      </view>\n    </view>\n  </block>\n</view>\n"
  },
  {
    "path": "pages/cart/index.wxss",
    "content": "/* 页面容器 */\n.cart-container {\n  min-height: 100vh;\n  background: linear-gradient(180deg, #faf8f5 0%, #f5f1eb 100%);\n  padding-bottom: 20rpx;\n}\n\n/* ==================== 空状态样式 ==================== */\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 200rpx 0;\n  text-align: center;\n}\n\n.empty-icon {\n  font-size: 120rpx;\n  margin-bottom: 30rpx;\n  opacity: 0.6;\n}\n\n.empty-text {\n  font-size: 32rpx;\n  color: #999;\n  margin-bottom: 16rpx;\n  font-weight: 500;\n}\n\n.empty-tip {\n  font-size: 26rpx;\n  color: #bbb;\n}\n\n/* ==================== 顶部操作栏 ==================== */\n.cart-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 24rpx 32rpx;\n  background: #fff;\n  margin-bottom: 20rpx;\n  border-bottom: 1rpx solid #f0ebe5;\n}\n\n.cart-title {\n  display: flex;\n  align-items: center;\n  gap: 12rpx;\n}\n\n.title-icon {\n  font-size: 36rpx;\n}\n\n.title-text {\n  font-size: 34rpx;\n  font-weight: 600;\n  color: #333;\n}\n\n.item-count {\n  background: linear-gradient(135deg, #d4a574 0%, #c89860 100%);\n  color: #fff;\n  font-size: 22rpx;\n  padding: 4rpx 16rpx;\n  border-radius: 20rpx;\n  font-weight: 500;\n}\n\n.clear-btn {\n  display: flex;\n  align-items: center;\n  gap: 8rpx;\n  padding: 8rpx 20rpx;\n  border-radius: 30rpx;\n  background: #f8f6f3;\n  font-size: 26rpx;\n  color: #999;\n  transition: all 0.3s;\n}\n\n/* ==================== 商品列表 ==================== */\n.goods-list {\n  padding: 0 24rpx;\n}\n\n.goods-item {\n  margin-bottom: 24rpx;\n  animation: slideIn 0.4s ease-out;\n}\n\n@keyframes slideIn {\n  from {\n    opacity: 0;\n    transform: translateY(20rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.item-card {\n  background: #fff;\n  border-radius: 24rpx;\n  padding: 24rpx;\n  display: flex;\n  gap: 24rpx;\n  box-shadow: 0 4rpx 20rpx rgba(212, 165, 116, 0.08);\n  transition: all 0.3s;\n}\n\n/* 商品图片 */\n.item-image {\n  width: 180rpx;\n  height: 180rpx;\n  border-radius: 20rpx;\n  overflow: hidden;\n  flex-shrink: 0;\n  background: linear-gradient(135deg, #f8f6f3 0%, #f0ebe5 100%);\n}\n\n.goods-img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n/* 商品信息 */\n.item-info {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n\n.goods-name {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #333;\n  line-height: 1.4;\n  margin-bottom: 12rpx;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n}\n\n/* 规格标签 */\n.goods-specs {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12rpx;\n  margin-bottom: 16rpx;\n}\n\n.spec-tag {\n  background: linear-gradient(135deg, #f8f6f3 0%, #f0ebe5 100%);\n  color: #8b7355;\n  font-size: 22rpx;\n  padding: 6rpx 16rpx;\n  border-radius: 8rpx;\n  border: 1rpx solid #e8dfd5;\n  font-weight: 500;\n}\n\n.addition-tag {\n  background: linear-gradient(135deg, #fef5e7 0%, #fdecd0 100%);\n  color: #d4a574;\n  border-color: #f9e5c8;\n}\n\n/* 价格和数量 */\n.item-bottom {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.goods-price {\n  display: flex;\n  align-items: baseline;\n}\n\n.price-symbol {\n  font-size: 24rpx;\n  color: #d4a574;\n  font-weight: 600;\n  margin-right: 4rpx;\n}\n\n.price-num {\n  font-size: 36rpx;\n  font-weight: 700;\n  color: #d4a574;\n  font-family: 'DIN Alternate', 'Arial', sans-serif;\n}\n\n.goods-stepper {\n  transform: scale(0.95);\n}\n\n/* ==================== 底部占位 ==================== */\n.bottom-placeholder {\n  height: 180rpx;\n}\n\n/* ==================== 底部结算栏 ==================== */\n.submit-bar {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  background: #fff;\n  box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.08);\n  z-index: 999;\n  padding: env(safe-area-inset-bottom);\n}\n\n.bar-content {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 24rpx 32rpx;\n}\n\n.total-info {\n  flex: 1;\n}\n\n.total-label {\n  font-size: 24rpx;\n  color: #999;\n  margin-bottom: 8rpx;\n}\n\n.total-price {\n  display: flex;\n  align-items: baseline;\n  margin-bottom: 4rpx;\n}\n\n.currency {\n  font-size: 28rpx;\n  color: #333;\n  font-weight: 600;\n  margin-right: 4rpx;\n}\n\n.amount {\n  font-size: 48rpx;\n  font-weight: 700;\n  color: #333;\n  font-family: 'DIN Alternate', 'Arial', sans-serif;\n}\n\n.total-tip {\n  font-size: 22rpx;\n  color: #999;\n}\n\n.submit-btn {\n  background: linear-gradient(135deg, #d4a574 0%, #c89860 100%);\n  color: #fff;\n  font-size: 32rpx;\n  font-weight: 600;\n  padding: 24rpx 60rpx;\n  border-radius: 50rpx;\n  display: flex;\n  align-items: center;\n  gap: 8rpx;\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.3);\n  transition: all 0.3s;\n}\n\n.submit-btn:active {\n  transform: scale(0.96);\n  box-shadow: 0 4rpx 12rpx rgba(212, 165, 116, 0.3);\n}\n\n/* ==================== Vant组件自定义样式 ==================== */\n.van-stepper {\n  --stepper-background-color: #f8f6f3;\n  --stepper-button-icon-color: #d4a574;\n  --stepper-button-disabled-color: #e8dfd5;\n  --stepper-button-disabled-icon-color: #ccc;\n  --stepper-input-text-color: #333;\n  --stepper-input-font-size: 28rpx;\n}"
  },
  {
    "path": "pages/cart/order.js",
    "content": "const APP = getApp()\nconst WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\n\nPage({\n  data: {\n    \n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n        title: this.data.$t.cart.ordered,\n    })\n  },\n  onShow: function () {\n    this.fetchOrder()\n  },\n  onPullDownRefresh() {\n    this.fetchOrder()\n    wx.stopPullDownRefresh()\n  },\n  async fetchOrder() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.orderList({\n      token: wx.getStorageSync('token'),\n      status: 0\n    })\n    wx.hideLoading({\n      success: (res) => {},\n    })\n    if (res.code == 0) {\n      this.setData({\n        orderInfo: res.data.orderList[0],\n        goodsList: res.data.goodsMap[res.data.orderList[0].id],\n      })\n    }\n  },\n  async goPayOrder() {\n    // token 需要使用买单这个用户的token，而不是当前餐桌的token\n    const code = await AUTH.wxaCode()\n    let res = await WXAPI.authorize({\n      code\n    })\n    if (res.code != 0) {\n      wx.showModal({\n        confirmText: this.data.$t.common.confirm,\n        cancelText: this.data.$t.common.cancel,\n        content: res.msg,\n        showCancel: false\n      })\n      return\n    }\n    wx.setStorageSync('payToken', res.data.token) // 支付用户的token\n    this.setData({\n      paymentShow: true,\n      money: this.data.orderInfo.amountReal,\n      nextAction: {\n        // https://www.yuque.com/apifm/doc/aetmlb#8tiFW\n        type: 9,\n        orderId: this.data.orderInfo.id\n      }\n    })\n  },\n  paymentOk(e) {\n    console.log(e.detail); // 这里是组件里data的数据\n    this.setData({\n      paymentShow: false,\n      paySuccess: true\n    })\n  },\n  paymentCancel() {\n    this.setData({\n      paymentShow: false\n    })\n  },\n})"
  },
  {
    "path": "pages/cart/order.json",
    "content": "{\n  \"navigationBarTitleText\": \"\",\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "pages/cart/order.wxml",
    "content": "<van-empty wx:if=\"{{ !paySuccess && !orderInfo }}\" description=\"{{ $t.cart.empty }}\" />\n\n<block wx:if=\"{{ !paySuccess && orderInfo }}\">\n  <!-- 顶部桌号区域 -->\n  <view class=\"header-section\">\n    <view class=\"table-card\">\n      <view class=\"table-icon\">🪑</view>\n      <view class=\"table-info\">\n        <view class=\"table-label\">{{$t.cart.tableNum }}</view>\n        <view class=\"table-number\">{{ orderInfo.tableCode }}</view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 已点菜品标题 -->\n  <view class=\"section-title\">\n    <view class=\"title-line\"></view>\n    <view class=\"title-text\">{{$t.cart.ordered }}</view>\n    <view class=\"title-line\"></view>\n  </view>\n\n  <!-- 菜品列表 -->\n  <view class=\"goods-container\">\n    <view class=\"goods-item\" wx:for=\"{{goodsList}}\" wx:key=\"id\">\n      <view class=\"goods-image-wrap\">\n        <image class=\"goods-image\" src=\"{{ item.pic }}\" mode=\"aspectFill\" />\n        <!-- 状态角标 -->\n        <view class=\"status-badge status-{{ item.cyTableStatus }}\">\n          <text wx:if=\"{{ item.cyTableStatus == 0 }}\">{{$t.cart.Tobeconfirmed }}</text>\n          <text wx:if=\"{{ item.cyTableStatus == 1 }}\">{{$t.cart.Cooked }}</text>\n          <text wx:if=\"{{ item.cyTableStatus == 2 }}\">{{$t.cart.Served }}</text>\n        </view>\n      </view>\n      <view class=\"goods-info\">\n        <view class=\"goods-name\">{{ item.goodsName }}</view>\n        <view class=\"goods-property\" wx:if=\"{{ item.property }}\">{{ item.property }}</view>\n        <view class=\"goods-bottom\">\n          <view class=\"goods-price\">¥{{ item.amount }}</view>\n          <view class=\"goods-quantity\">x{{ item.number }}</view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 价格统计区域 -->\n  <view class=\"price-summary\">\n    <view class=\"summary-item\">\n      <view class=\"summary-label\">{{$t.cart.Numofdishes }}</view>\n      <view class=\"summary-value\">{{ orderInfo.goodsNumber }} 份</view>\n    </view>\n    <view class=\"summary-item\">\n      <view class=\"summary-label\">{{$t.cart.Consumptionamount }}</view>\n      <view class=\"summary-value\">¥{{ orderInfo.amount }}</view>\n    </view>\n    <view class=\"summary-divider\"></view>\n    <view class=\"summary-item summary-total\">\n      <view class=\"summary-label\">{{$t.cart.Payableamount }}</view>\n      <view class=\"summary-value-total\">¥{{ orderInfo.amountReal }}</view>\n    </view>\n  </view>\n\n  <view class=\"bottom-safe\"></view>\n  \n  <!-- 底部结账栏 -->\n  <view class=\"checkout-bar\">\n    <view class=\"checkout-total\">\n      <view class=\"checkout-label\">{{ $t.PickingUp.total }}</view>\n      <view class=\"checkout-price\">¥{{ orderInfo.amountReal }}</view>\n    </view>\n    <view class=\"checkout-button\" bindtap=\"goPayOrder\">\n      <text>{{ $t.cart.Check }}</text>\n    </view>\n  </view>\n</block>\n\n<!-- 支付成功页面 -->\n<view wx:if=\"{{ paySuccess }}\" class=\"pay-success-page\">\n  <view class=\"success-animation\">\n    <view class=\"success-circle\">\n      <van-icon name=\"checked\" size=\"120rpx\" color=\"#fff\" />\n    </view>\n  </view>\n  <view class=\"success-title\">{{ $t.asset.success }}</view>\n  <view class=\"success-subtitle\">感谢您的光临</view>\n</view>\n\n<payment\n  money=\"{{ money }}\"\n  remark=\"{{ $t.payment.maidan }}\"\n  nextAction=\"{{ nextAction }}\"\n  show=\"{{ paymentShow }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>"
  },
  {
    "path": "pages/cart/order.wxss",
    "content": "page {\n  background: linear-gradient(180deg, #FFF5EB 0%, #FFFFFF 40%);\n  min-height: 100vh;\n  padding-bottom: 0;\n}\n\n/* ========== 顶部桌号区域 ========== */\n.header-section {\n  padding: 32rpx 32rpx 24rpx;\n}\n\n.table-card {\n  background: linear-gradient(135deg, #FFE4D1 0%, #FFD4B8 100%);\n  border-radius: 24rpx;\n  padding: 32rpx;\n  display: flex;\n  align-items: center;\n  box-shadow: 0 8rpx 32rpx rgba(255, 178, 130, 0.2);\n}\n\n.table-icon {\n  font-size: 56rpx;\n  margin-right: 24rpx;\n}\n\n.table-info {\n  flex: 1;\n}\n\n.table-label {\n  font-size: 24rpx;\n  color: #8B5A3C;\n  opacity: 0.8;\n  margin-bottom: 8rpx;\n}\n\n.table-number {\n  font-size: 40rpx;\n  font-weight: 600;\n  color: #5C3D2E;\n  letter-spacing: 2rpx;\n}\n\n/* ========== 标题装饰 ========== */\n.section-title {\n  display: flex;\n  align-items: center;\n  padding: 40rpx 32rpx 24rpx;\n  gap: 16rpx;\n}\n\n.title-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent 0%, #E6C4A8 50%, transparent 100%);\n}\n\n.title-text {\n  font-size: 28rpx;\n  color: #8B5A3C;\n  font-weight: 500;\n  padding: 0 16rpx;\n  letter-spacing: 2rpx;\n}\n\n/* ========== 菜品列表 ========== */\n.goods-container {\n  padding: 0 32rpx;\n  margin-bottom: 24rpx;\n}\n\n.goods-item {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 24rpx;\n  margin-bottom: 24rpx;\n  display: flex;\n  box-shadow: 0 4rpx 24rpx rgba(139, 90, 60, 0.06);\n  transition: all 0.3s ease;\n}\n\n.goods-item:active {\n  transform: scale(0.98);\n  box-shadow: 0 2rpx 16rpx rgba(139, 90, 60, 0.08);\n}\n\n.goods-image-wrap {\n  position: relative;\n  margin-right: 24rpx;\n  flex-shrink: 0;\n}\n\n.goods-image {\n  width: 160rpx;\n  height: 160rpx;\n  border-radius: 16rpx;\n  background: #F5F5F5;\n}\n\n.status-badge {\n  position: absolute;\n  top: -8rpx;\n  right: -8rpx;\n  padding: 8rpx 16rpx;\n  border-radius: 20rpx;\n  font-size: 20rpx;\n  font-weight: 500;\n  box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);\n}\n\n.status-0 {\n  background: linear-gradient(135deg, #FFF4E6 0%, #FFE7BA 100%);\n  color: #D97706;\n}\n\n.status-1 {\n  background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);\n  color: #2E7D32;\n}\n\n.status-2 {\n  background: linear-gradient(135deg, #E3F2FD 0%, #BBDEFB 100%);\n  color: #1976D2;\n}\n\n.goods-info {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  min-width: 0;\n}\n\n.goods-name {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  line-height: 1.4;\n  margin-bottom: 8rpx;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n}\n\n.goods-property {\n  font-size: 24rpx;\n  color: #999999;\n  line-height: 1.5;\n  margin-bottom: 12rpx;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.goods-bottom {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n}\n\n.goods-price {\n  font-size: 36rpx;\n  font-weight: 700;\n  color: #D97706;\n  font-family: -apple-system, 'DIN Alternate', 'Helvetica Neue', sans-serif;\n}\n\n.goods-quantity {\n  font-size: 28rpx;\n  color: #666666;\n  padding: 4rpx 16rpx;\n  background: #F5F5F5;\n  border-radius: 12rpx;\n}\n\n/* ========== 价格统计区域 ========== */\n.price-summary {\n  margin: 24rpx 32rpx 24rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF9F5 100%);\n  border-radius: 24rpx;\n  padding: 32rpx;\n  box-shadow: 0 4rpx 24rpx rgba(139, 90, 60, 0.06);\n}\n\n.summary-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 16rpx 0;\n}\n\n.summary-label {\n  font-size: 28rpx;\n  color: #666666;\n}\n\n.summary-value {\n  font-size: 28rpx;\n  color: #333333;\n  font-weight: 500;\n}\n\n.summary-divider {\n  height: 1rpx;\n  background: linear-gradient(90deg, transparent 0%, #E6C4A8 20%, #E6C4A8 80%, transparent 100%);\n  margin: 16rpx 0;\n}\n\n.summary-total {\n  padding: 24rpx 0 8rpx;\n}\n\n.summary-total .summary-label {\n  font-size: 32rpx;\n  color: #333333;\n  font-weight: 600;\n}\n\n.summary-value-total {\n  font-size: 44rpx;\n  font-weight: 700;\n  color: #D97706;\n  font-family: -apple-system, 'DIN Alternate', 'Helvetica Neue', sans-serif;\n}\n\n/* ========== 底部安全区域 ========== */\n.bottom-safe {\n  height: 180rpx;\n}\n\n/* ========== 底部结账栏 ========== */\n.checkout-bar {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  background: #FFFFFF;\n  padding: 20rpx 32rpx;\n  padding-bottom: calc(20rpx + env(safe-area-inset-bottom));\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  box-shadow: 0 -4rpx 24rpx rgba(0, 0, 0, 0.06);\n  z-index: 100;\n}\n\n.checkout-total {\n  flex: 1;\n}\n\n.checkout-label {\n  font-size: 24rpx;\n  color: #999999;\n  margin-bottom: 4rpx;\n}\n\n.checkout-price {\n  font-size: 40rpx;\n  font-weight: 700;\n  color: #D97706;\n  font-family: -apple-system, 'DIN Alternate', 'Helvetica Neue', sans-serif;\n}\n\n.checkout-button {\n  background: linear-gradient(135deg, #FF9A62 0%, #FF7A45 100%);\n  color: #FFFFFF;\n  padding: 28rpx 64rpx;\n  border-radius: 56rpx;\n  font-size: 32rpx;\n  font-weight: 600;\n  box-shadow: 0 8rpx 24rpx rgba(255, 122, 69, 0.3);\n  transition: all 0.3s ease;\n}\n\n.checkout-button:active {\n  transform: scale(0.96);\n  box-shadow: 0 4rpx 16rpx rgba(255, 122, 69, 0.4);\n}\n\n/* ========== 支付成功页面 ========== */\n.pay-success-page {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  min-height: 100vh;\n  background: linear-gradient(180deg, #FFF5EB 0%, #FFFFFF 100%);\n  padding: 64rpx 32rpx;\n}\n\n.success-animation {\n  margin-bottom: 48rpx;\n  animation: scaleIn 0.5s ease-out;\n}\n\n@keyframes scaleIn {\n  0% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  50% {\n    transform: scale(1.1);\n  }\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n\n.success-circle {\n  width: 200rpx;\n  height: 200rpx;\n  border-radius: 50%;\n  background: linear-gradient(135deg, #52C41A 0%, #73D13D 100%);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 16rpx 48rpx rgba(82, 196, 26, 0.3);\n}\n\n.success-title {\n  font-size: 48rpx;\n  font-weight: 700;\n  color: #333333;\n  margin-bottom: 16rpx;\n  animation: fadeInUp 0.6s ease-out 0.2s both;\n}\n\n.success-subtitle {\n  font-size: 28rpx;\n  color: #999999;\n  animation: fadeInUp 0.6s ease-out 0.4s both;\n}\n\n@keyframes fadeInUp {\n  0% {\n    transform: translateY(30rpx);\n    opacity: 0;\n  }\n  100% {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}"
  },
  {
    "path": "pages/coupons/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\n\nvar sliderWidth = 96; // 需要设置slider的宽度，用于计算中间位置\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    tabs: {\n      zh_CN: ['可领', '已领', '失效', '口令'],\n      en: ['Can Fetch', 'Available', 'Invalid', 'Exchange'],\n    },\n    activeIndex: 0,\n\n    showPwdPop: false\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function (e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n        title: this.data.$t.coupons.title,\n    })\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow: function () {\n    if (this.data.activeIndex == 0) {\n      this.sysCoupons()\n    }\n    AUTH.checkHasLogined().then(isLogined => {\n      this.setData({\n        isLogined\n      })\n      if (isLogined) {\n        if (this.data.activeIndex == 1) {\n          this.getMyCoupons()\n        }\n        if (this.data.activeIndex == 2) {\n          this.invalidCoupons()\n        }\n      }\n    })\n  },\n  onReachBottom: function () {\n    \n  },\n  tabClick: function (e) {\n    this.setData({\n      activeIndex: e.detail.index\n    });\n    if (this.data.activeIndex == 0) {\n      this.sysCoupons()\n    }\n    if (this.data.activeIndex == 1) {\n      this.getMyCoupons()\n    }\n    if (this.data.activeIndex == 2) {\n      this.invalidCoupons()\n    }\n  },\n  sysCoupons() { // 读取可领取券列表\n    var _this = this;\n    wx.showLoading({\n      title: '',\n    })\n    WXAPI.coupons().then(function (res) {\n      wx.hideLoading({\n        success: (res) => {},\n      })\n      if (res.code == 0) {\n        _this.setData({\n          coupons: res.data\n        });\n      } else {\n        _this.setData({\n          coupons: null\n        });\n      }\n    })\n  },\n  getCounpon2(){\n    if (!this.data.couponPwd) {\n      wx.showToast({\n        title: this.data.$t.coupons.inputpassword,\n        icon: 'none'\n      })\n      return\n    }\n    const e = {\n      kl: true,\n      currentTarget: {\n        dataset: {\n          id: this.data.pwdCounponId\n        }\n      }\n    }\n    this.getCounpon(e)\n  },\n  getCounpon: function (e) {\n    const that = this\n    if (e.currentTarget.dataset.pwd) {\n      this.setData({\n        pwdCounponId: e.currentTarget.dataset.id,\n        showPwdPop: true\n      })\n      return\n    } else {\n      if (!e.kl) {\n        this.data.couponPwd = ''\n      }\n    }\n    this.setData({\n      showPwdPop: false\n    })\n    WXAPI.fetchCoupons({\n      id: e.currentTarget.dataset.id,\n      token: wx.getStorageSync('token'),\n      pwd: this.data.couponPwd\n    }).then(function (res) {\n      if (res.code == 20001 || res.code == 20002) {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: that.data.$t.coupons.Cominglate,\n          showCancel: false\n        })\n        return;\n      }\n      if (res.code == 20003) {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: that.data.$t.coupons.receivedgreedy,\n          showCancel: false\n        })\n        return;\n      }\n      if (res.code == 30001) {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: that.data.$t.coupons.pointsinsufficient,\n          showCancel: false\n        })\n        return;\n      }\n      if (res.code == 20004) {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: that.data.$t.coupons.Expired,\n          showCancel: false\n        })\n        return;\n      }\n      if (res.code == 0) {\n        wx.showToast({\n          title: that.data.$t.coupons.Successfullyclaimed,\n          icon: 'success'\n        })\n      } else {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: res.msg,\n          showCancel: false\n        })\n      }\n    })\n  },\n  getMyCoupons: function () {\n    var _this = this;\n    wx.showLoading({\n      title: '',\n    })\n    WXAPI.myCoupons({\n      token: wx.getStorageSync('token'),\n      status: 0\n    }).then(function (res) {\n      wx.hideLoading({\n        success: (res) => {},\n      })\n      if (res.code == 0) {\n        res.data.forEach(ele => {\n          if (ele.dateEnd) {\n            ele.dateEnd = ele.dateEnd.split(\" \")[0]\n          }\n        })\n        _this.setData({\n          coupons: res.data\n        })\n      } else {\n        _this.setData({\n          coupons: null\n        })\n      }\n    })\n  },\n  invalidCoupons: function () {\n    var _this = this;\n    wx.showLoading({\n      title: '',\n    })\n    WXAPI.myCoupons({\n      token: wx.getStorageSync('token'),\n      status: '1,2,3'\n    }).then(function (res) {\n      wx.hideLoading({\n        success: (res) => {},\n      })\n      if (res.code == 0) {\n        _this.setData({\n          coupons: res.data\n        })\n      } else {\n        _this.setData({\n          coupons: null\n        })\n      }\n    })\n  },\n  async touse(e) {\n    const item = e.currentTarget.dataset.item\n    const res = await WXAPI.couponDetail(item.pid)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    if (!res.data.couponRefs || res.data.couponRefs.length == 0) {\n      wx.switchTab({\n        url: \"/pages/index/index\"\n      })\n      return\n    }\n    let categoryId, goodsId\n    res.data.couponRefs.forEach(ele => {\n      if (ele.type == 0) {\n        categoryId = ele.refId\n      }\n      if (ele.type == 1) {\n        goodsId = ele.refId\n      }\n    })\n    if (categoryId) {\n      wx.navigateTo({\n        url: '/pages/goods/list?categoryId=' + categoryId,\n      })\n      return\n    }\n    if (goodsId) {\n      wx.navigateTo({\n        url: '/pages/goods-details/index?id=' + goodsId,\n      })\n      return\n    }\n  },\n  pwdCouponChange(e){\n    this.setData({\n      couponPwd: e.detail.value\n    })\n  },\n  onPullDownRefresh() {\n    if (this.data.activeIndex == 0) {\n      this.sysCoupons()\n    }\n    if (this.data.activeIndex == 1) {\n      this.getMyCoupons()\n    }\n    if (this.data.activeIndex == 2) {\n      this.invalidCoupons()\n    }\n    wx.stopPullDownRefresh()\n  },\n  closePwd() {\n    this.setData({\n      showPwdPop: false\n    })\n  },\n  async exchangeCoupons() {\n    if (!this.data.number) {\n      wx.showToast({\n        title: this.data.$t.coupons.enternum,\n        icon: 'none'\n      })\n      return\n    }\n    if (!this.data.pwd) {\n      wx.showToast({\n        title: this.data.$t.coupons.password,\n        icon: 'none'\n      })\n      return\n    }\n    this.setData({\n      exchangeCouponsLoading: true\n    })\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.exchangeCoupons(wx.getStorageSync('token'), this.data.number, this.data.pwd)\n    wx.hideLoading({\n      success: (res) => {},\n    })\n    this.setData({\n      exchangeCouponsLoading: false\n    })\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    } else {\n      wx.showToast({\n        title: this.data.$t.coupons.Redemption,\n      })\n    }\n  },\n  onShareAppMessage: function() {    \n    return {\n      title: wx.getStorageSync('mallName') + this.data.$t.coupons.Invitingcoupons,\n      path: '/pages/coupons/index?inviter_id=' + wx.getStorageSync('uid')\n    }\n  },\n  onShareTimeline() {    \n    return {\n      title: wx.getStorageSync('mallName') + this.data.$t.coupons.Invitingcoupons,\n      query: 'inviter_id=' + wx.getStorageSync('uid'),\n      imageUrl: wx.getStorageSync('share_pic')\n    }\n  },\n})"
  },
  {
    "path": "pages/coupons/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\",\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "pages/coupons/index.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 顶部标签栏 -->\n  <van-sticky>\n    <view class=\"tabs-wrapper\">\n      <van-tabs bind:change=\"tabClick\" color=\"#8B6F47\" title-active-color=\"#8B6F47\" title-inactive-color=\"#999\">\n        <van-tab wx:for=\"{{ tabs[language] }}\" wx:key=\"index\" title=\"{{item}}\"></van-tab>\n      </van-tabs>\n    </view>\n  </van-sticky>\n\n  <!-- 优惠券列表容器 -->\n  <view class=\"coupons-container\">\n    <!-- 空状态 -->\n    <view wx:if=\"{{ activeIndex != 3 && (!coupons || coupons.length == 0) }}\" class=\"empty-state\">\n      <image class=\"empty-icon\" src=\"/images/empty.png\" mode=\"widthFix\"></image>\n      <view class=\"empty-text\">{{ $t.common.empty }}</view>\n    </view>\n\n    <!-- 可领取的优惠券 -->\n    <view class=\"coupon-card\" wx:for=\"{{coupons}}\" wx:key=\"id\" wx:if=\"{{activeIndex == 0}}\">\n      <view class=\"coupon-card-inner\">\n        <!-- 左侧金额区域 -->\n        <view class=\"coupon-left\">\n          <view class=\"coupon-amount-wrapper\">\n            <view wx:if=\"{{ item.moneyType == 0 }}\" class=\"coupon-amount\">\n              <text class=\"currency\">¥</text>\n              <text class=\"amount-num\">{{item.moneyMin}}</text>\n            </view>\n            <view wx:if=\"{{ item.moneyType == 1 }}\" class=\"coupon-amount\">\n              <text class=\"amount-num\">{{item.moneyMin}}</text>\n              <text class=\"percent\">折</text>\n            </view>\n            <view class=\"coupon-condition\">满{{item.moneyHreshold}}可用</view>\n          </view>\n          <!-- 圆形镂空效果 -->\n          <view class=\"circle-top\"></view>\n          <view class=\"circle-bottom\"></view>\n        </view>\n\n        <!-- 右侧信息区域 -->\n        <view class=\"coupon-right\">\n          <view class=\"coupon-info\">\n            <view class=\"coupon-badge\">{{ $t.coupons.Vouchers }}</view>\n            <view class=\"coupon-name\">{{item.name}}</view>\n            <view class=\"coupon-desc\">{{ $t.coupons.over }} {{item.moneyHreshold}} 元可用</view>\n          </view>\n          <view class=\"coupon-action\">\n            <view class=\"action-btn\" bindtap=\"getCounpon\" data-id=\"{{item.id}}\" data-pwd=\"{{item.pwd}}\">\n              {{ $t.coupons.btn }}\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 已领取的优惠券 -->\n    <view class=\"coupon-card active-card\" wx:for=\"{{coupons}}\" wx:key=\"id\" wx:if=\"{{activeIndex == 1}}\">\n      <view class=\"coupon-card-inner\">\n        <!-- 左侧金额区域 -->\n        <view class=\"coupon-left active-left\">\n          <view class=\"coupon-amount-wrapper\">\n            <view wx:if=\"{{ item.moneyType == 0 }}\" class=\"coupon-amount\">\n              <text class=\"currency\">¥</text>\n              <text class=\"amount-num\">{{item.money}}</text>\n            </view>\n            <view wx:if=\"{{ item.moneyType == 1 }}\" class=\"coupon-amount\">\n              <text class=\"amount-num\">{{item.money}}</text>\n              <text class=\"percent\">折</text>\n            </view>\n            <view class=\"coupon-condition\">满{{item.moneyHreshold}}可用</view>\n          </view>\n          <view class=\"circle-top\"></view>\n          <view class=\"circle-bottom\"></view>\n        </view>\n\n        <!-- 右侧信息区域 -->\n        <view class=\"coupon-right\">\n          <view class=\"coupon-info\">\n            <view class=\"coupon-badge active-badge\">{{ $t.coupons.Vouchers }}</view>\n            <view class=\"coupon-name\">{{item.name}}</view>\n            <view class=\"coupon-desc\">有效期至 {{item.dateEnd}}</view>\n          </view>\n          <view class=\"coupon-action\">\n            <view class=\"action-btn active-btn\" bindtap=\"touse\" data-item=\"{{ item }}\">\n              {{ $t.coupons.toUse }}\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 失效的优惠券 -->\n    <view class=\"coupon-card disabled-card\" wx:for=\"{{coupons}}\" wx:key=\"id\" wx:if=\"{{activeIndex == 2}}\">\n      <view class=\"coupon-card-inner\">\n        <!-- 左侧金额区域 -->\n        <view class=\"coupon-left disabled-left\">\n          <view class=\"coupon-amount-wrapper\">\n            <view wx:if=\"{{ item.moneyType == 0 }}\" class=\"coupon-amount disabled-amount\">\n              <text class=\"currency\">¥</text>\n              <text class=\"amount-num\">{{item.money}}</text>\n            </view>\n            <view wx:if=\"{{ item.moneyType == 1 }}\" class=\"coupon-amount disabled-amount\">\n              <text class=\"amount-num\">{{item.money}}</text>\n              <text class=\"percent\">折</text>\n            </view>\n            <view class=\"coupon-condition disabled-text\">满{{item.moneyHreshold}}可用</view>\n          </view>\n          <view class=\"circle-top\"></view>\n          <view class=\"circle-bottom\"></view>\n        </view>\n\n        <!-- 右侧信息区域 -->\n        <view class=\"coupon-right\">\n          <view class=\"coupon-info\">\n            <view class=\"coupon-badge disabled-badge\">{{ $t.coupons.Vouchers }}</view>\n            <view class=\"coupon-name disabled-text\">{{item.name}}</view>\n            <view class=\"coupon-desc disabled-text\">{{ item.statusStr }}</view>\n          </view>\n          <view class=\"coupon-action\">\n            <view class=\"action-btn disabled-btn\">{{ item.statusStr }}</view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 口令兑换区域 -->\n    <view class=\"exchange-container\" wx:if=\"{{activeIndex == 3}}\">\n      <view class=\"exchange-card\">\n        <view class=\"exchange-title\">兑换优惠券</view>\n        <view class=\"exchange-subtitle\">输入口令码，领取专属优惠</view>\n        \n        <view class=\"exchange-form\">\n          <van-field\n            label=\"{{ $t.coupons.number }}\"\n            placeholder=\"{{ $t.coupons.numberPlaceholder }}\"\n            model:value=\"{{ number }}\"\n            clearable\n            size=\"large\"\n            border=\"{{ false }}\"\n            custom-style=\"background: #F7F8FA; border-radius: 16rpx; padding: 24rpx; margin-bottom: 24rpx;\"\n            bind:change=\"onChange\"\n          />\n          <van-field\n            label=\"{{ $t.coupons.pwd }}\"\n            placeholder=\"{{ $t.coupons.pwdPlaceholder }}\"\n            model:value=\"{{ pwd }}\"\n            clearable\n            size=\"large\"\n            border=\"{{ false }}\"\n            custom-style=\"background: #F7F8FA; border-radius: 16rpx; padding: 24rpx;\"\n            bind:change=\"onChange\"\n          />\n        </view>\n\n        <view class=\"exchange-btn-wrapper\">\n          <view class=\"exchange-btn\" bindtap=\"exchangeCoupons\">\n            <text wx:if=\"{{ !exchangeCouponsLoading }}\">{{ $t.coupons.change }}</text>\n            <text wx:if=\"{{ exchangeCouponsLoading }}\">兑换中...</text>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <view class=\"bottom-safe\"></view>\n</view>\n\n<!-- 密码弹窗 -->\n<block wx:if=\"{{showPwdPop}}\">\n  <view class=\"pwd-mask\" bindtap=\"closePwd\"></view>\n  <view class=\"pwd-dialog\">\n    <view class=\"pwd-dialog-header\">\n      <view class=\"pwd-dialog-title\">{{ $t.coupons.inputpassword }}</view>\n      <view class=\"pwd-dialog-close\" bindtap=\"closePwd\">✕</view>\n    </view>\n    <view class=\"pwd-dialog-body\">\n      <input \n        bindinput=\"pwdCouponChange\" \n        class=\"pwd-input\" \n        value=\"{{couponPwd}}\" \n        placeholder=\"请输入优惠券密码\"\n        auto-focus\n      />\n    </view>\n    <view class=\"pwd-dialog-footer\">\n      <view class=\"pwd-cancel-btn\" bindtap=\"closePwd\">取消</view>\n      <view class=\"pwd-confirm-btn\" bindtap=\"getCounpon2\">{{ $t.coupons.btn }}</view>\n    </view>\n  </view>\n</block>\n"
  },
  {
    "path": "pages/coupons/index.wxss",
    "content": "/* 页面基础样式 */\npage {\n  background: linear-gradient(180deg, #FFF8F0 0%, #F5F5F5 100%);\n  min-height: 100vh;\n}\n\n.page-container {\n  min-height: 100vh;\n  padding-bottom: 32rpx;\n}\n\n/* 顶部标签栏样式 */\n.tabs-wrapper {\n  background: #FFFFFF;\n  box-shadow: 0 4rpx 12rpx rgba(139, 111, 71, 0.08);\n}\n\n/* 优惠券列表容器 */\n.coupons-container {\n  padding: 24rpx 32rpx;\n}\n\n/* 空状态样式 */\n.empty-state {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 120rpx 0;\n}\n\n.empty-icon {\n  width: 240rpx;\n  opacity: 0.6;\n  margin-bottom: 32rpx;\n}\n\n.empty-text {\n  font-size: 28rpx;\n  color: #999999;\n}\n\n/* 优惠券卡片样式 */\n.coupon-card {\n  margin-bottom: 32rpx;\n  position: relative;\n}\n\n.coupon-card-inner {\n  display: flex;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\n  border-radius: 20rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 24rpx rgba(139, 111, 71, 0.12);\n  position: relative;\n}\n\n/* 左侧金额区域 */\n.coupon-left {\n  width: 240rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #B8935F 100%);\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 40rpx 0;\n}\n\n.active-left {\n  background: linear-gradient(135deg, #F4A460 0%, #D2691E 100%);\n}\n\n.disabled-left {\n  background: linear-gradient(135deg, #CCCCCC 0%, #999999 100%);\n}\n\n.coupon-amount-wrapper {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  z-index: 2;\n}\n\n.coupon-amount {\n  display: flex;\n  align-items: baseline;\n  margin-bottom: 12rpx;\n}\n\n.coupon-amount .currency {\n  font-size: 36rpx;\n  font-weight: 600;\n  color: #FFFFFF;\n  margin-right: 4rpx;\n}\n\n.coupon-amount .amount-num {\n  font-size: 72rpx;\n  font-weight: bold;\n  color: #FFFFFF;\n  line-height: 1;\n  font-family: DIN, Helvetica, Arial, sans-serif;\n}\n\n.coupon-amount .percent {\n  font-size: 36rpx;\n  font-weight: 600;\n  color: #FFFFFF;\n  margin-left: 4rpx;\n}\n\n.coupon-condition {\n  font-size: 22rpx;\n  color: rgba(255, 255, 255, 0.9);\n  text-align: center;\n  padding: 8rpx 16rpx;\n  background: rgba(255, 255, 255, 0.2);\n  border-radius: 20rpx;\n}\n\n/* 圆形镂空效果 */\n.circle-top,\n.circle-bottom {\n  position: absolute;\n  right: -12rpx;\n  width: 24rpx;\n  height: 24rpx;\n  background: linear-gradient(180deg, #FFF8F0 0%, #F5F5F5 100%);\n  border-radius: 50%;\n  z-index: 1;\n}\n\n.circle-top {\n  top: -12rpx;\n}\n\n.circle-bottom {\n  bottom: -12rpx;\n}\n\n/* 虚线分割 */\n.coupon-left::after {\n  content: '';\n  position: absolute;\n  right: 0;\n  top: 24rpx;\n  bottom: 24rpx;\n  width: 2rpx;\n  background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.3) 50%, transparent 50%);\n  background-size: 2rpx 12rpx;\n}\n\n/* 右侧信息区域 */\n.coupon-right {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  padding: 36rpx 32rpx;\n  position: relative;\n}\n\n.coupon-info {\n  flex: 1;\n}\n\n.coupon-badge {\n  display: inline-block;\n  background: linear-gradient(135deg, #F4A460 0%, #D2691E 100%);\n  color: #FFFFFF;\n  font-size: 20rpx;\n  padding: 6rpx 16rpx;\n  border-radius: 20rpx;\n  font-weight: 500;\n  margin-bottom: 16rpx;\n  letter-spacing: 1rpx;\n}\n\n.active-badge {\n  background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%);\n}\n\n.disabled-badge {\n  background: #CCCCCC;\n}\n\n.coupon-name {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  margin-bottom: 12rpx;\n  line-height: 1.4;\n}\n\n.coupon-desc {\n  font-size: 24rpx;\n  color: #999999;\n  line-height: 1.5;\n}\n\n.disabled-text {\n  color: #CCCCCC !important;\n}\n\n.disabled-amount {\n  opacity: 0.6;\n}\n\n/* 按钮样式 */\n.coupon-action {\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 20rpx;\n}\n\n.action-btn {\n  padding: 16rpx 40rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #B8935F 100%);\n  color: #FFFFFF;\n  font-size: 26rpx;\n  font-weight: 500;\n  border-radius: 40rpx;\n  text-align: center;\n  box-shadow: 0 4rpx 12rpx rgba(180, 147, 95, 0.3);\n  transition: all 0.3s ease;\n}\n\n.active-btn {\n  background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%);\n  box-shadow: 0 4rpx 12rpx rgba(255, 107, 53, 0.3);\n}\n\n.disabled-btn {\n  background: #EEEEEE;\n  color: #CCCCCC;\n  box-shadow: none;\n}\n\n/* 已领取卡片特殊样式 */\n.active-card .coupon-card-inner {\n  background: linear-gradient(135deg, #FFFBF7 0%, #FFF5E8 100%);\n  border: 2rpx solid rgba(255, 140, 66, 0.2);\n}\n\n/* 失效卡片特殊样式 */\n.disabled-card .coupon-card-inner {\n  background: #F5F5F5;\n  opacity: 0.7;\n}\n\n/* 口令兑换区域 */\n.exchange-container {\n  padding: 24rpx 0;\n}\n\n.exchange-card {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\n  border-radius: 24rpx;\n  padding: 48rpx 40rpx;\n  box-shadow: 0 8rpx 32rpx rgba(139, 111, 71, 0.15);\n}\n\n.exchange-title {\n  font-size: 36rpx;\n  font-weight: bold;\n  color: #333333;\n  text-align: center;\n  margin-bottom: 12rpx;\n}\n\n.exchange-subtitle {\n  font-size: 26rpx;\n  color: #999999;\n  text-align: center;\n  margin-bottom: 48rpx;\n}\n\n.exchange-form {\n  margin-bottom: 48rpx;\n}\n\n.exchange-btn-wrapper {\n  display: flex;\n  justify-content: center;\n}\n\n.exchange-btn {\n  width: 100%;\n  padding: 28rpx 0;\n  background: linear-gradient(135deg, #F4A460 0%, #D2691E 100%);\n  color: #FFFFFF;\n  font-size: 32rpx;\n  font-weight: 600;\n  text-align: center;\n  border-radius: 48rpx;\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.4);\n  transition: all 0.3s ease;\n}\n\n/* 密码弹窗样式 */\n.pwd-mask {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100vh;\n  background: rgba(0, 0, 0, 0.5);\n  z-index: 999;\n  animation: fadeIn 0.3s ease;\n}\n\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n\n.pwd-dialog {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 600rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  z-index: 1000;\n  overflow: hidden;\n  animation: slideUp 0.3s ease;\n}\n\n@keyframes slideUp {\n  from {\n    transform: translate(-50%, -40%);\n    opacity: 0;\n  }\n  to {\n    transform: translate(-50%, -50%);\n    opacity: 1;\n  }\n}\n\n.pwd-dialog-header {\n  position: relative;\n  padding: 48rpx 32rpx 24rpx;\n  border-bottom: 1rpx solid #F0F0F0;\n}\n\n.pwd-dialog-title {\n  font-size: 34rpx;\n  font-weight: 600;\n  color: #333333;\n  text-align: center;\n}\n\n.pwd-dialog-close {\n  position: absolute;\n  top: 32rpx;\n  right: 32rpx;\n  width: 48rpx;\n  height: 48rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 36rpx;\n  color: #999999;\n}\n\n.pwd-dialog-body {\n  padding: 48rpx 40rpx;\n}\n\n.pwd-input {\n  width: 100%;\n  padding: 28rpx 32rpx;\n  background: #F7F8FA;\n  border-radius: 16rpx;\n  font-size: 30rpx;\n  color: #333333;\n  border: 2rpx solid transparent;\n  transition: all 0.3s ease;\n}\n\n.pwd-input:focus {\n  background: #FFFFFF;\n  border-color: #D4A574;\n}\n\n.pwd-dialog-footer {\n  display: flex;\n  border-top: 1rpx solid #F0F0F0;\n}\n\n.pwd-cancel-btn,\n.pwd-confirm-btn {\n  flex: 1;\n  padding: 32rpx 0;\n  text-align: center;\n  font-size: 32rpx;\n  transition: all 0.3s ease;\n}\n\n.pwd-cancel-btn {\n  color: #999999;\n  border-right: 1rpx solid #F0F0F0;\n}\n\n.pwd-confirm-btn {\n  color: #D4A574;\n  font-weight: 600;\n}\n\n.pwd-cancel-btn:active {\n  background: #F7F8FA;\n}\n\n.pwd-confirm-btn:active {\n  background: #FFF8F0;\n}\n\n/* 底部安全区 */\n.bottom-safe {\n  height: 32rpx;\n}\n\n/* 优化动画效果 */\n.coupon-card {\n  animation: cardSlideIn 0.4s ease;\n  animation-fill-mode: both;\n}\n\n.coupon-card:nth-child(1) {\n  animation-delay: 0.05s;\n}\n\n.coupon-card:nth-child(2) {\n  animation-delay: 0.1s;\n}\n\n.coupon-card:nth-child(3) {\n  animation-delay: 0.15s;\n}\n\n@keyframes cardSlideIn {\n  from {\n    opacity: 0;\n    transform: translateY(30rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}"
  },
  {
    "path": "pages/goods/list.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    listType: 2, // 1为1个商品一行，2为2个商品一行    \n    name: '', // 搜索关键词\n    orderBy: '', // 排序规则\n    page: 1 // 读取第几页\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.goodsList.t,\n    })\n    this.setData({\n      name: options.name,\n      categoryId: options.categoryId\n    })\n    this.search()\n    this.readConfigVal()\n    // 补偿写法\n    getApp().configLoadOK = () => {\n      this.readConfigVal()\n    }\n  },\n  onShow: function () {\n\n  },\n  readConfigVal() {\n    const show_seller_number = wx.getStorageSync('show_seller_number')\n    const goods_search_show_type = wx.getStorageSync('goods_search_show_type')\n    let listType = 2\n    if (goods_search_show_type == 2) {\n      listType = 2\n    }\n    this.setData({\n      show_seller_number,\n      listType\n    })\n  },\n  async search(){\n    wx.showLoading({\n      title: '',\n    })\n    const _data = {\n      orderBy: this.data.orderBy,\n      page: this.data.page,\n      pageSize: 20,\n    }\n    if (this.data.name) {\n      _data.k = this.data.name\n    }\n    if (this.data.categoryId) {\n      _data.categoryId = this.data.categoryId\n    }\n    const res = await WXAPI.goodsv2(_data)\n    wx.hideLoading()\n    if (res.code == 0) {\n      if (this.data.page == 1) {\n        this.setData({\n          goods: res.data.result,\n        })\n      } else {\n        this.setData({\n          goods: this.data.goods.concat(res.data.result),\n        })\n      }\n    } else {\n      if (this.data.page == 1) {\n        this.setData({\n          goods: null,\n        })\n      }\n    }\n  },\n  onReachBottom() {\n    this.setData({\n      page: this.data.page + 1\n    });\n    this.search()\n  },\n  changeShowType(){\n    if (this.data.listType == 1) {\n      this.setData({\n        listType: 2\n      })\n    } else {\n      this.setData({\n        listType: 1\n      })\n    }\n  },\n  bindinput(e){\n    this.setData({\n      name: e.detail.value\n    })\n  },\n  bindconfirm(e){\n    this.setData({\n      page: 1,\n      name: e.detail.value\n    })\n    this.search()\n  },\n  filter(e){\n    this.setData({\n      page: 1,\n      orderBy: e.currentTarget.dataset.val\n    })\n    this.search()\n  },\n  async addShopCar(e) {\n    const curGood = this.data.goods.find(ele => {\n      return ele.id == e.currentTarget.dataset.id\n    })\n    if (!curGood) {\n      return\n    }\n    if (curGood.stores <= 0) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noStores,\n        icon: 'none'\n      })\n      return\n    }\n    this.addShopCarCheck({\n      goodsId: curGood.id,\n      buyNumber: 1,\n      sku: []\n    })\n  },\n  async addShopCarCheck(options) {\n    AUTH.checkHasLogined().then(isLogined => {\n      this.setData({\n        wxlogin: isLogined\n      })\n      if (isLogined) {\n        // 处理加入购物车的业务逻辑\n        this.addShopCarDone(options)\n      }\n    })\n  },\n  async addShopCarDone(options) {\n    const res = await WXAPI.shippingCarInfoAddItem(wx.getStorageSync('token'), options.goodsId, options.buyNumber, options.sku)\n    if (res.code == 30002) {\n      // 需要选择规格尺寸\n      const skuCurGoodsRes = await WXAPI.goodsDetail(options.goodsId)\n      if (skuCurGoodsRes.code != 0) {\n        wx.showToast({\n          title: skuCurGoodsRes.msg,\n          icon: 'none'\n        })\n        return\n      }\n      const skuCurGoods = skuCurGoodsRes.data\n      skuCurGoods.basicInfo.storesBuy = 1\n      this.setData({\n        skuCurGoods\n      })\n      return\n    }\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    wx.showToast({\n      title: this.data.$t.goodsDetail.addCartSuccess,\n      icon: 'success'\n    })\n    this.setData({\n      skuCurGoods: null\n    })\n  },\n  storesJia() {\n    const skuCurGoods = this.data.skuCurGoods\n    if (skuCurGoods.basicInfo.storesBuy < skuCurGoods.basicInfo.stores) {\n      skuCurGoods.basicInfo.storesBuy++\n      this.setData({\n        skuCurGoods\n      })\n    }\n  },\n  storesJian() {\n    const skuCurGoods = this.data.skuCurGoods\n    if (skuCurGoods.basicInfo.storesBuy > 1) {\n      skuCurGoods.basicInfo.storesBuy--\n      this.setData({\n        skuCurGoods\n      })\n    }\n  },\n  closeSku() {\n    this.setData({\n      skuCurGoods: null\n    })\n    wx.showTabBar()\n  },\n  skuSelect(e) {\n    const pid = e.currentTarget.dataset.pid\n    const id = e.currentTarget.dataset.id\n    // 处理选中\n    const skuCurGoods = this.data.skuCurGoods\n    const property = skuCurGoods.properties.find(ele => { return ele.id == pid })\n    property.childsCurGoods.forEach(ele => {\n      if (ele.id == id) {\n        ele.active = true\n      } else {\n        ele.active = false\n      }\n    })\n    this.setData({\n      skuCurGoods\n    })\n  },\n  addCarSku() {\n    const skuCurGoods = this.data.skuCurGoods\n    const propertySize = skuCurGoods.properties.length // 有几组SKU\n    const sku = []\n    skuCurGoods.properties.forEach(p => {\n      const o = p.childsCurGoods.find(ele => { return ele.active })\n      if (!o) {\n        return\n      }\n      sku.push({\n        optionId: o.propertyId,\n        optionValueId: o.id\n      })\n    })\n    if (sku.length != propertySize) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noSelectSku,\n        icon: 'none'\n      })\n      return\n    }\n    const options = {\n      goodsId: skuCurGoods.basicInfo.id,\n      buyNumber: skuCurGoods.basicInfo.storesBuy,\n      sku\n    }\n    this.addShopCarDone(options)\n  },\n})"
  },
  {
    "path": "pages/goods/list.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/goods/list.wxml",
    "content": "<van-sticky>\n  <view class=\"header\">\n    <view class=\"search\">\n      <input type=\"text\" placeholder=\"{{ $t.common.searchPlaceholder }}\" value=\"{{name}}\" bindinput=\"bindinput\" bindconfirm=\"bindconfirm\"></input>\n      <image src=\"/images/icon/search.svg\" bindtap=\"search\"></image>\n    </view>\n    <image class=\"show-type\" src=\"/images/icon/list{{listType}}.svg\" bindtap=\"changeShowType\"></image>\n  </view>\n  <view class=\"filters\">\n    <view class=\"item {{orderBy==''?'active':''}}\" data-val=\"\" bindtap=\"filter\">{{ $t.goodsList.sort.zh }}</view>\n    <view class=\"item {{orderBy=='addedDown'?'active':''}}\" data-val=\"addedDown\" bindtap=\"filter\">{{ $t.goodsList.sort.xp }}</view>\n    <view class=\"item {{orderBy=='ordersDown'?'active':''}}\" data-val=\"ordersDown\" bindtap=\"filter\">{{ $t.goodsList.sort.xl }}</view>\n    <view class=\"item {{orderBy=='priceUp'?'active':''}}\" data-val=\"priceUp\" bindtap=\"filter\">{{ $t.goodsList.sort.jg }}</view>\n  </view>\n</van-sticky>\n<van-empty wx:if=\"{{ !goods || goods.length == 0 }}\" description=\"{{ $t.common.empty }}\" />\n<wxs module=\"goodsDetailPage\">\nmodule.exports = {\n  url : function(item) {\n    if (item.supplyType == 'cps_jd') {\n      return '/packageCps/pages/goods-details/cps-jd?id=' + item.id\n    } else if (item.supplyType == 'vop_jd') {\n      return '/pages/goods-details/vop?id=' + item.yyId + '&goodsId=' + item.id\n    } else if (item.supplyType == 'cps_pdd') {\n      return '/packageCps/pages/goods-details/cps-pdd?id=' + item.id\n    } else if (item.supplyType == 'cps_taobao') {\n      return '/packageCps/pages/goods-details/cps-taobao?id=' + item.id\n    } else {\n      return '/pages/goods-details/index?id=' + item.id\n    }\n  }\n}\n</wxs>\n<block wx:if=\"{{listType == 1}}\">\n  <view class=\"list1\" wx:for=\"{{goods}}\" wx:key=\"id\">\n    <navigator url=\"{{ goodsDetailPage.url(item) }}\">\n      <image class=\"img\" mode=\"aspectFill\" src=\"{{item.pic}}\"></image>\n    </navigator>\n    <view class=\"goods-info\">\n      <navigator url=\"{{ goodsDetailPage.url(item) }}\">\n        <view class=\"title ellipsis\">{{item.name}}</view>\n      </navigator>\n      <view wx:if=\"{{item.characteristic}}\" class=\"characteristic van-multi-ellipsis--l2\" style=\"padding:0;-webkit-line-clamp: 1;\">{{item.characteristic}}</view>\n      <view class=\"price\">\n        <text class=\"price-symbol\">¥</text>{{item.minPrice}}\n        <text wx:if=\"{{item.originalPrice && item.originalPrice > 0}}\" class=\"originalPrice\">¥{{item.originalPrice}}</text>\n      </view>\n      <view class=\"buy-info\">\n        <view wx:if=\"{{ show_seller_number == '1' }}\" class=\"num\">已售 {{item.numberSells}}</view>\n        <image class=\"car\" src=\"/images/icon/car.svg\" data-id=\"{{item.id}}\" bindtap=\"addShopCar\"></image>\n      </view>\n    </view>\n  </view>\n</block>\n<view wx:if=\"{{listType == 2}}\" class=\"list2-box\">\n  <view class=\"list2\" wx:for=\"{{goods}}\" wx:key=\"id\">\n    <navigator url=\"{{ goodsDetailPage.url(item) }}\">\n      <image class=\"img\" mode=\"aspectFill\" src=\"{{item.pic}}\"></image>\n    </navigator>\n    <view class=\"goods-info\">\n      <navigator url=\"{{ goodsDetailPage.url(item) }}\">\n        <view class=\"title van-multi-ellipsis--l2\">{{item.name}}</view>\n      </navigator>\n      <view wx:if=\"{{item.characteristic}}\" class=\"characteristic van-multi-ellipsis--l2\" style=\"padding:0;-webkit-line-clamp: 1;\">{{item.characteristic}}</view>\n      <view class=\"price\">\n        <text class=\"price-symbol\">¥</text>{{item.minPrice}}\n        <text wx:if=\"{{item.originalPrice && item.originalPrice > 0}}\" class=\"originalPrice\">¥{{item.originalPrice}}</text>\n      </view>\n      <view class=\"buy-info\">\n        <view wx:if=\"{{ show_seller_number == '1' }}\" class=\"num\">已售 {{item.numberSells}}</view>\n        <image class=\"car\" src=\"/images/icon/car.svg\" data-id=\"{{item.id}}\" bindtap=\"addShopCar\"></image>\n      </view>\n    </view>\n  </view>\n</view>\n\n\n<block wx:if=\"{{skuCurGoods}}\">\n  <view class=\"sku-mask\"></view>\n  <view class=\"sku-container\">\n    <image class=\"close\" src=\"/images/icon/close.svg\" bindtap=\"closeSku\"></image>\n    <view class=\"sku\" wx:for=\"{{skuCurGoods.properties}}\" wx:key=\"id\">\n      <view class=\"t\">{{item.name}}</view>\n      <view class=\"items\">\n        <text class=\"{{small.active? 'active' : ''}}\" wx:for=\"{{item.childsCurGoods}}\" wx:for-item=\"small\" wx:key=\"id\" data-pid=\"{{small.propertyId}}\" data-id=\"{{small.id}}\" bindtap=\"skuSelect\">{{small.name}}</text>\n      </view>\n    </view>\n    <view class=\"num\">\n      <view class=\"t\">{{ $t.goodsDetail.buyNumber }}</view>\n      <view class=\"num-box\">\n        <text class=\"a\" bindtap=\"storesJian\">-</text>\n        <text class=\"b\">{{skuCurGoods.basicInfo.storesBuy}}</text>\n        <text class=\"a\" bindtap=\"storesJia\">+</text>\n      </view>\n    </view>\n  </view>\n  <view class=\"sku-btn\" bindtap=\"addCarSku\">{{ $t.goodsDetail.addCartBtn }}</view>\n</block>"
  },
  {
    "path": "pages/goods/list.wxss",
    "content": "page {\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8D6 100%);\n  min-height: 100vh;\n}\npage,view,image,input {\n  display: block;\n  box-sizing: border-box;\n}\n.header {\n  padding: 24rpx 32rpx 20rpx;\n  background: linear-gradient(135deg, #FFD4A3 0%, #FFC78E 100%);\n  display: flex;\n  align-items: center;\n  box-shadow: 0 4rpx 20rpx rgba(255, 180, 100, 0.15);\n}\n.header .search {\n  position: relative;\n  width: 650rpx;\n  height: 72rpx;\n}\n.header .search input {\n  border: none;\n  width: 100%;\n  height: 100%;\n  border-radius: 36rpx;\n  padding-left: 48rpx;\n  padding-right: 72rpx;\n  background: rgba(255, 255, 255, 0.95);\n  font-size: 28rpx;\n  color: #6B4E3D;\n  box-shadow: 0 2rpx 12rpx rgba(255, 180, 100, 0.1);\n}\n.header .search input::placeholder {\n  color: #C4A57B;\n}\n.header .search image {\n  width: 38rpx;\n  height: 38rpx;\n  position: absolute;\n  top: 17rpx;\n  right: 24rpx;\n  z-index: 9999;\n  opacity: 0.7;\n}\n.header .show-type {\n  width: 44rpx;\n  height: 44rpx;\n  margin-left: 20rpx;\n  opacity: 0.8;\n}\n.line {\n  width: 100vw;\n  height: 2rpx;\n  background: #dfdfdf;\n}\n.filters {\n  width: 100vw;\n  height: 96rpx;\n  background: linear-gradient(135deg, #FFECD6 0%, #FFE5C8 100%);\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n  padding: 0 16rpx;\n  box-shadow: 0 2rpx 16rpx rgba(255, 180, 100, 0.08);\n}\n.filters .item {\n  height: 60rpx;\n  line-height: 60rpx;\n  padding: 0 24rpx;\n  font-size: 28rpx;\n  color: #8B6F47;\n  border-radius: 30rpx;\n  transition: all 0.3s ease;\n  position: relative;\n}\n.filters .active {\n  color: #fff;\n  background: linear-gradient(135deg, #D4A574 0%, #C89A6A 100%);\n  font-weight: 600;\n  box-shadow: 0 4rpx 12rpx rgba(200, 154, 106, 0.3);\n  transform: scale(1.05);\n}\n.list1 {\n  margin: 20rpx 16rpx;\n  width: 718rpx;\n  display: flex;\n  background: #fff;\n  border-radius: 24rpx;\n  position: relative;\n  overflow: hidden;\n  box-shadow: 0 6rpx 24rpx rgba(139, 111, 71, 0.08);\n  transition: all 0.3s ease;\n}\n.list1:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 16rpx rgba(139, 111, 71, 0.12);\n}\n.list1 .img {\n  width: 240rpx;\n  height: 240rpx;\n  flex-shrink: 0;\n  border-radius: 20rpx 0 0 20rpx;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8D6 50%);\n}\n.list1 .goods-info {\n  padding: 20rpx 32rpx 16rpx 24rpx;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n.list1 .goods-info .title {\n  color: #3D2817;\n  font-size: 30rpx;\n  font-weight: 500;\n  line-height: 1.4;\n  margin-bottom: 8rpx;\n}\n.ellipsis {\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  -webkit-box-orient: vertical;\n  word-break: break-all;\n}\n.list1 .goods-info .characteristic {\n  font-size: 24rpx;\n  color: #A08B6F;\n  margin: 6rpx 0;\n}\n.list1 .goods-info .price {\n  color: #D4A574;\n  font-size: 38rpx;\n  font-weight: 700;\n  margin-top: auto;\n  padding-top: 12rpx;\n}\n.list1 .goods-info .price .price-symbol {\n  font-size: 28rpx;\n  font-weight: 600;\n  margin-right: 2rpx;\n}\n.list1 .goods-info .buy-info {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 8rpx;\n}\n.list1 .goods-info .buy-info .num {\n  font-size: 24rpx;\n  color: #C4A57B;\n  font-weight: 400;\n}\n.list1 .goods-info .buy-info .car {\n  position: absolute;\n  right: 20rpx;\n  bottom: 20rpx;\n  width: 60rpx;\n  height: 60rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C89A6A 100%);\n  border-radius: 50%;\n  padding: 14rpx;\n  box-shadow: 0 6rpx 16rpx rgba(200, 154, 106, 0.35);\n  transition: all 0.2s ease;\n}\n.list1 .goods-info .buy-info .car:active {\n  transform: scale(0.9);\n}\n.list2-box {\n  margin: 0 16rpx;\n  width: 718rpx;\n  display: flex;\n  justify-content: space-between;\n  flex-wrap: wrap;\n}\n.list2 {\n  margin: 20rpx 0;\n  width: 345rpx;\n  background: #fff;\n  border-radius: 24rpx;\n  overflow: hidden;\n  position: relative;\n  box-shadow: 0 8rpx 28rpx rgba(139, 111, 71, 0.1);\n  transition: all 0.3s ease;\n}\n.list2:active {\n  transform: translateY(-4rpx);\n  box-shadow: 0 12rpx 32rpx rgba(139, 111, 71, 0.15);\n}\n.list2 .img {\n  width: 345rpx;\n  height: 345rpx;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8D6 50%);\n}\n.list2 .goods-info {\n  padding: 20rpx 20rpx 80rpx 20rpx;\n  position: relative;\n}\n.list2 .goods-info .title {\n  color: #3D2817;\n  font-size: 28rpx;\n  font-weight: 500;\n  line-height: 1.4;\n  min-height: 78rpx;\n}\n.list2 .goods-info .characteristic {\n  font-size: 24rpx;\n  color: #A08B6F;\n  margin-top: 8rpx;\n}\n.list2 .goods-info .price {\n  color: #D4A574;\n  font-size: 36rpx;\n  font-weight: 700;\n  margin-top: 12rpx;\n}\n.list2 .goods-info .price .price-symbol {\n  font-size: 26rpx;\n  font-weight: 600;\n  margin-right: 2rpx;\n}\n.list2 .goods-info .buy-info {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 8rpx;\n}\n.list2 .goods-info .buy-info .num {\n  font-size: 22rpx;\n  color: #C4A57B;\n  font-weight: 400;\n}\n.list2 .goods-info .buy-info .car {\n  width: 64rpx;\n  height: 64rpx;\n  position: absolute;\n  right: 20rpx;\n  bottom: 20rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C89A6A 100%);\n  border-radius: 50%;\n  padding: 16rpx;\n  box-shadow: 0 8rpx 20rpx rgba(200, 154, 106, 0.4);\n  transition: all 0.2s ease;\n}\n.list2 .goods-info .buy-info .car:active {\n  transform: scale(0.9);\n}\n\n\n.sku-mask {\n  width: 100vw;\n  height: 100vh;\n  position: fixed;\n  top: 0;\n  left: 0;\n  background: rgba(61, 40, 23, 0.5);\n  backdrop-filter: blur(4rpx);\n}\n.sku-container {\n  position: fixed;\n  width: 100vw;\n  bottom: 100rpx;\n  left: 0;\n  background: linear-gradient(180deg, #FFF9F0 0%, #FFFFFF 100%);\n  padding: 40rpx 32rpx 24rpx 32rpx;\n  border-radius: 32rpx 32rpx 0 0;\n  box-shadow: 0 -8rpx 32rpx rgba(139, 111, 71, 0.15);\n}\n.sku-container .close {\n  position: absolute;\n  width: 56rpx;\n  height: 56rpx;\n  top: 20rpx;\n  right: 20rpx;\n  background: rgba(139, 111, 71, 0.08);\n  border-radius: 50%;\n  padding: 12rpx;\n  opacity: 0.8;\n}\n.sku-container .sku {\n  border-bottom: 1rpx solid rgba(212, 165, 116, 0.2);\n  padding-bottom: 24rpx;\n  margin-bottom: 20rpx;\n}\n.sku-container .sku .t {\n  color: #3D2817;\n  font-size: 30rpx;\n  font-weight: 600;\n  margin-bottom: 16rpx;\n}\n.sku-container .sku .items {\n  display: flex;\n  flex-wrap: wrap;\n}\n.sku-container .sku .items text {\n  padding: 12rpx 24rpx;\n  border: 2rpx solid #E5D4C1;\n  color: #8B6F47;\n  margin: 16rpx 16rpx 0 0;\n  font-size: 26rpx;\n  border-radius: 16rpx;\n  background: #FFFBF5;\n  transition: all 0.2s ease;\n}\n.sku-container .sku .items text.active {\n  border: 2rpx solid #D4A574;\n  color: #fff;\n  background: linear-gradient(135deg, #D4A574 0%, #C89A6A 100%);\n  font-weight: 600;\n  box-shadow: 0 4rpx 12rpx rgba(200, 154, 106, 0.3);\n}\n.sku-container .num {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 28rpx;\n}\n.sku-container .num .t {\n  color: #3D2817;\n  font-size: 30rpx;\n  font-weight: 600;\n}\n.sku-container .num .num-box {\n  display: flex;\n  align-items: center;\n  background: #FFFBF5;\n  border-radius: 16rpx;\n  overflow: hidden;\n  border: 2rpx solid #E5D4C1;\n}\n.sku-container .num .num-box .a {\n  width: 72rpx;\n  height: 64rpx;\n  text-align: center;\n  line-height: 64rpx;\n  font-size: 40rpx;\n  color: #8B6F47;\n  background: transparent;\n  transition: all 0.2s ease;\n}\n.sku-container .num .num-box .a:active {\n  background: rgba(212, 165, 116, 0.15);\n}\n.sku-container .num .num-box .b {\n  color: #3D2817;\n  line-height: 64rpx;\n  padding: 0 32rpx;\n  font-size: 32rpx;\n  font-weight: 600;\n  min-width: 80rpx;\n  text-align: center;\n}\n.sku-btn {\n  width: 100vw;\n  height: 100rpx;\n  line-height: 100rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C89A6A 100%);\n  color: #fff;\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  text-align: center;\n  font-size: 32rpx;\n  font-weight: 600;\n  box-shadow: 0 -4rpx 24rpx rgba(200, 154, 106, 0.25);\n  transition: all 0.2s ease;\n}\n.sku-btn:active {\n  background: linear-gradient(135deg, #C89A6A 0%, #B88A5F 100%);\n}\n.originalPrice {\n  color: #C4A57B;\n  text-decoration: line-through;\n  margin-left: 16rpx;\n  font-size: 24rpx;\n  font-weight: 400;\n}\n\n/* 空状态样式优化 */\n.van-empty {\n  padding: 120rpx 0;\n  background: transparent;\n}\n\n/* 页面整体优化 */\npage::before {\n  content: '';\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 300rpx;\n  background: linear-gradient(180deg, rgba(255, 212, 163, 0.3) 0%, transparent 100%);\n  pointer-events: none;\n  z-index: 0;\n}\n\n/* 商品卡片进入动画 */\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    transform: translateY(40rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.list1, .list2 {\n  animation: fadeInUp 0.4s ease-out;\n}\n\n/* 优化导航链接样式 */\nnavigator {\n  display: block;\n}\n\n/* 特殊标签样式（如新品、热销等） */\n.goods-tag {\n  position: absolute;\n  top: 16rpx;\n  left: 16rpx;\n  background: linear-gradient(135deg, #FF9A76 0%, #FF6B9D 100%);\n  color: #fff;\n  padding: 6rpx 16rpx;\n  border-radius: 20rpx;\n  font-size: 22rpx;\n  font-weight: 600;\n  box-shadow: 0 4rpx 12rpx rgba(255, 107, 157, 0.3);\n  z-index: 10;\n}\n\n/* 优化滚动性能 */\n.list1, .list2 {\n  will-change: transform;\n  transform: translateZ(0);\n}\n\n/* 搜索框聚焦效果 */\n.header .search input:focus {\n  box-shadow: 0 4rpx 16rpx rgba(255, 180, 100, 0.2);\n  transform: scale(1.01);\n  transition: all 0.2s ease;\n}"
  },
  {
    "path": "pages/goods-details/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst TOOLS = require('../../utils/tools.js')\nconst AUTH = require('../../utils/auth')\nimport Poster from 'wxa-plugin-canvas/poster/poster'\n\nPage({\n  data: {\n    goodsDetail: {},\n    hasMoreSelect: false,\n    selectSizePrice: 0,\n    selectSizeOPrice: 0,\n    totalScoreToPay: 0,\n    shopNum: 0,\n    hideShopPopup: true,\n    buyNumber: 0,\n    buyNumMin: 1,\n    buyNumMax: 0,\n    propertyChildIds: \"\",\n    propertyChildNames: \"\",\n    canSubmit: false, //  选中规格尺寸时候是否允许加入购物车\n  },\n  onLoad(e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.goodsDetail.title,\n    })\n    // e.id = 122843\n    // 读取分享链接中的邀请人编号\n    if (e && e.inviter_id) {\n      wx.setStorageSync('referrer', e.inviter_id)\n    }\n    // 读取小程序码中的邀请人编号\n    if (e && e.scene) {\n      const scene = decodeURIComponent(e.scene) // 处理扫码进商品详情页面的逻辑\n      if (scene && scene.split(',').length >= 2) {\n        e.id = scene.split(',')[0]\n        wx.setStorageSync('referrer', scene.split(',')[1])\n      }\n    }\n    this.data.goodsId = e.id\n    this.data.kjJoinUid = e.kjJoinUid\n    let goodsDetailSkuShowType = wx.getStorageSync('goodsDetailSkuShowType')\n    if (!goodsDetailSkuShowType) {\n      goodsDetailSkuShowType = 0\n    }\n    // 补偿写法\n    getApp().configLoadOK = () => {\n      this.readConfigVal()\n    }\n    this.setData({\n      goodsDetailSkuShowType,\n      curuid: wx.getStorageSync('uid')\n    })\n    this.readConfigVal()\n    this.getGoodsDetailAndKanjieInfo(this.data.goodsId)\n    this.shippingCartInfo()\n    this.goodsAddition()\n  },\n  readConfigVal() {\n\n  },\n  async _goodsTimesSchedule() {\n    const res = await WXAPI.goodsTimesSchedule(this.data.goodsId, '') // todo sku\n    if (res.code == 0) {\n      const goodsTimesSchedule = res.data\n      res.data.forEach(ele => {\n        ele.active = false\n      })\n      goodsTimesSchedule[0].active = true\n      goodsTimesSchedule[0].items[0].active = true\n      this.setData({\n        goodsTimesSchedule\n      })\n      this.calculateGoodsPrice()\n    } else {\n      this.setData({\n        goodsTimesSchedule: null\n      })\n    }\n  },\n  async goodsAddition() {\n    const res = await WXAPI.goodsAddition(this.data.goodsId)\n    if (res.code == 0) {\n      this.setData({\n        goodsAddition: res.data,\n        hasMoreSelect: true,\n      })\n    }\n  },\n  async shippingCartInfo() {\n    const number = await TOOLS.showTabBarBadge(true)\n    this.setData({\n      shopNum: number\n    })\n  },\n  onShow() {\n    AUTH.checkHasLogined().then(isLogin => {\n      if (isLogin) {\n        AUTH.bindSeller()\n      } else {\n        AUTH.authorize().then(res => {\n          AUTH.bindSeller()\n        })\n      }\n    })\n  },\n  async getGoodsDetailAndKanjieInfo(goodsId) {\n    const token = wx.getStorageSync('token')\n    const that = this;\n    const goodsDetailRes = await WXAPI.goodsDetail(goodsId, token ? token : '')\n    const goodsKanjiaSetRes = await WXAPI.kanjiaSet(goodsId)\n    if (goodsDetailRes.code == 0) {\n      if (!goodsDetailRes.data.pics || goodsDetailRes.data.pics.length == 0) {\n        goodsDetailRes.data.pics = [{\n          pic: goodsDetailRes.data.basicInfo.pic\n        }]\n      }\n      if (goodsDetailRes.data.properties) {\n        that.setData({\n          hasMoreSelect: true,\n          selectSizePrice: goodsDetailRes.data.basicInfo.minPrice,\n          selectSizeOPrice: goodsDetailRes.data.basicInfo.originalPrice,\n          totalScoreToPay: goodsDetailRes.data.basicInfo.minScore\n        });\n      }\n      if (goodsDetailRes.data.basicInfo.shopId) {\n        this.shopSubdetail(goodsDetailRes.data.basicInfo.shopId)\n      }\n      that.data.goodsDetail = goodsDetailRes.data;\n      if (goodsDetailRes.data.basicInfo.videoId) {\n        that.getVideoSrc(goodsDetailRes.data.basicInfo.videoId);\n      }\n      let _data = {\n        goodsDetail: goodsDetailRes.data,\n        selectSizePrice: goodsDetailRes.data.basicInfo.minPrice,\n        selectSizeOPrice: goodsDetailRes.data.basicInfo.originalPrice,\n        totalScoreToPay: goodsDetailRes.data.basicInfo.minScore,\n        buyNumMax: goodsDetailRes.data.basicInfo.stores,\n        buyNumber: (goodsDetailRes.data.basicInfo.stores > 0) ? 1 : 0\n      }\n      if (goodsKanjiaSetRes.code == 0) {\n        _data.curGoodsKanjia = goodsKanjiaSetRes.data[0]\n        that.data.kjId = _data.curGoodsKanjia.id\n        // 获取当前砍价进度\n        if (!that.data.kjJoinUid) {\n          that.data.kjJoinUid = wx.getStorageSync('uid')\n        }\n        const curKanjiaprogress = await WXAPI.kanjiaDetail(_data.curGoodsKanjia.id, that.data.kjJoinUid)\n        const myHelpDetail = await WXAPI.kanjiaHelpDetail(wx.getStorageSync('token'), _data.curGoodsKanjia.id, that.data.kjJoinUid)\n        if (curKanjiaprogress.code == 0) {\n          _data.curKanjiaprogress = curKanjiaprogress.data\n        }\n        if (myHelpDetail.code == 0) {\n          _data.myHelpDetail = myHelpDetail.data\n        }\n        //砍价商品 tabs栏显示砍价情况\n        // var tabs = that.data.tabs\n        // tabs[2].tabs_name=that.data.$t.goodsDetail.kanjiaLogs\n        // tabs[2].view_id=\"kanjia\"\n        // that.setData({\n        //   tabs:tabs\n        // })\n      }\n      that.setData(_data)\n      that._goodsTimesSchedule()\n    }\n  },\n  async shopSubdetail(shopId) {\n    const res = await WXAPI.shopSubdetail(shopId)\n    if (res.code == 0) {\n      this.setData({\n        shopSubdetail: res.data\n      })\n    }\n  },\n  goShopCar: function () {\n    wx.reLaunch({\n      url: \"/pages/shop-cart/index\"\n    });\n  },\n  async toAddShopCar() {\n    this.bindGuiGeTap();\n  },\n  /**\n   * 规格选择弹出框\n   */\n  async bindGuiGeTap() {\n    this.setData({\n      hideShopPopup: false,\n      selectSizePrice: this.data.goodsDetail.basicInfo.minPrice,\n      selectSizeOPrice: this.data.goodsDetail.basicInfo.originalPrice,\n      skuGoodsPic: this.data.goodsDetail.basicInfo.pic\n    })\n    await this._goodsTimesSchedule()\n  },\n  /**\n   * 规格选择弹出框隐藏\n   */\n  closePopupTap: function () {\n    this.setData({\n      hideShopPopup: true\n    })\n  },\n  stepChange(event) {\n    this.setData({\n      buyNumber: event.detail\n    })\n  },\n  /**\n   * 选择商品规格\n   */\n  async labelItemTap(e) {\n    const propertyindex = e.currentTarget.dataset.propertyindex\n    const propertychildindex = e.currentTarget.dataset.propertychildindex\n\n    const property = this.data.goodsDetail.properties[propertyindex]\n    const child = property.childsCurGoods[propertychildindex]\n    // 取消该分类下的子栏目所有的选中状态\n    property.childsCurGoods.forEach(child => {\n      child.active = false\n    })\n    // 设置当前选中状态\n    property.optionValueId = child.id\n    child.active = true\n    // 获取所有的选中规格尺寸数据\n    const needSelectNum = this.data.goodsDetail.properties.length\n    let curSelectNum = 0;\n    let propertyChildIds = \"\";\n    let propertyChildNames = \"\";\n\n    this.data.goodsDetail.properties.forEach(p => {\n      p.childsCurGoods.forEach(c => {\n        if (c.active) {\n          curSelectNum++;\n          propertyChildIds = propertyChildIds + p.id + \":\" + c.id + \",\";\n          propertyChildNames = propertyChildNames + p.name + \":\" + c.name + \"  \";\n        }\n      })\n    })\n    let canSubmit = false;\n    if (needSelectNum == curSelectNum) {\n      canSubmit = true;\n    }\n    let skuGoodsPic = this.data.skuGoodsPic\n    if (this.data.goodsDetail.subPics && this.data.goodsDetail.subPics.length > 0) {\n      const _subPic = this.data.goodsDetail.subPics.find(ele => {\n        return ele.optionValueId == child.id\n      })\n      if (_subPic) {\n        skuGoodsPic = _subPic.pic\n      }\n    }\n    this.setData({\n      goodsDetail: this.data.goodsDetail,\n      canSubmit,\n      skuGoodsPic,\n      propertyChildIds,\n      propertyChildNames,\n    })\n    this.calculateGoodsPrice()\n  },\n  async calculateGoodsPrice() {\n    // 计算最终的商品价格\n    let price = this.data.goodsDetail.basicInfo.minPrice\n    let originalPrice = this.data.goodsDetail.basicInfo.originalPrice\n    let totalScoreToPay = this.data.goodsDetail.basicInfo.minScore\n    let buyNumMax = this.data.goodsDetail.basicInfo.stores\n    let buyNumber = this.data.goodsDetail.basicInfo.minBuyNumber\n    // 计算 sku 价格\n    if (this.data.canSubmit) {\n      const token = wx.getStorageSync('token')\n      const res = await WXAPI.goodsPriceV2({\n        token: token ? token : '',\n        goodsId: this.data.goodsDetail.basicInfo.id,\n        propertyChildIds: this.data.propertyChildIds\n      })\n      if (res.code == 0) {\n        price = res.data.price\n        originalPrice = res.data.originalPrice\n        totalScoreToPay = res.data.score\n        buyNumMax = res.data.stores\n      }\n    }\n    // 计算时段定价的价格\n    if (this.data.goodsTimesSchedule) {\n      const a = this.data.goodsTimesSchedule.find(ele => ele.active)\n      if (a) {\n        const b = a.items.find(ele => ele.active)\n        if (b) {\n          price = b.price\n          buyNumMax = b.stores\n        }\n      }\n    }\n    // 计算配件价格\n    if (this.data.goodsAddition) {\n      this.data.goodsAddition.forEach(big => {\n        big.items.forEach(small => {\n          if (small.active) {\n            price = (price * 100 + small.price * 100) / 100\n          }\n        })\n      })\n    }\n    this.setData({\n      selectSizePrice: price,\n      selectSizeOPrice: originalPrice,\n      totalScoreToPay: totalScoreToPay,\n      buyNumMax,\n      buyNumber: (buyNumMax > buyNumber) ? buyNumber : 0\n    });\n  },\n  /**\n   * 选择可选配件\n   */\n  async labelItemTap2(e) {\n    const propertyindex = e.currentTarget.dataset.propertyindex\n    const propertychildindex = e.currentTarget.dataset.propertychildindex\n\n    const goodsAddition = this.data.goodsAddition\n    const property = goodsAddition[propertyindex]\n    const child = property.items[propertychildindex]\n    if (child.active) {\n      // 该操作为取消选择\n      child.active = false\n      this.setData({\n        goodsAddition\n      })\n      this.calculateGoodsPrice()\n      return\n    }\n    // 单选配件取消所有子栏目选中状态\n    if (property.type == 0) {\n      property.items.forEach(child => {\n        child.active = false\n      })\n    }\n    // 设置当前选中状态\n    child.active = true\n    this.setData({\n      goodsAddition\n    })\n    this.calculateGoodsPrice()\n  },\n  async skuClick3(e) {\n    const propertyindex = e.currentTarget.dataset.idx1\n    const propertychildindex = e.currentTarget.dataset.idx2\n\n    const goodsTimesSchedule = this.data.goodsTimesSchedule\n    const property = goodsTimesSchedule[propertyindex]\n    const child = property.items[propertychildindex]\n    if (child.stores <= 0) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noStores,\n        icon: 'none'\n      })\n      return\n    }\n    goodsTimesSchedule.forEach(a => {\n      a.active = false\n      a.items.forEach(b => {\n        b.active = false\n      })\n    })\n    property.active = true\n    child.active = true\n    this.setData({\n      goodsTimesSchedule\n    })\n    this.calculateGoodsPrice()\n  },\n  /**\n   * 加入购物车\n   */\n  async addShopCar() {\n    if (this.data.goodsDetail.properties && !this.data.canSubmit) {\n      if (!this.data.canSubmit) {\n        wx.showToast({\n          title: this.data.$t.goodsDetail.noSelectSku,\n          icon: 'none'\n        })\n      }\n      this.bindGuiGeTap()\n      return\n    }\n    const goodsAddition = []\n    if (this.data.goodsAddition) {\n      let canSubmit = true\n      this.data.goodsAddition.forEach(ele => {\n        if (ele.required) {\n          const a = ele.items.find(item => {\n            return item.active\n          })\n          if (!a) {\n            canSubmit = false\n          }\n        }\n        ele.items.forEach(item => {\n          if (item.active) {\n            goodsAddition.push({\n              id: item.id,\n              pid: item.pid\n            })\n          }\n        })\n      })\n      if (!canSubmit) {\n        wx.showToast({\n          title: this.data.$t.goodsDetail.noSelectAddtion,\n          icon: 'none'\n        })\n        this.bindGuiGeTap()\n        return\n      }\n    }\n    if (this.data.buyNumber < 1) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noSelectNumber,\n        icon: 'none'\n      })\n      return\n    }\n    const isLogined = await AUTH.checkHasLogined()\n    if (!isLogined) {\n      return\n    }\n    const token = wx.getStorageSync('token')\n    const goodsId = this.data.goodsDetail.basicInfo.id\n    const sku = []\n    if (this.data.goodsDetail.properties) {\n      this.data.goodsDetail.properties.forEach(p => {\n        sku.push({\n          optionId: p.id,\n          optionValueId: p.optionValueId\n        })\n      })\n    }\n    // 砍价的话先清空现有购物车\n    if (this.data.curKanjiaprogress && this.data.curKanjiaprogress.kanjiaInfo.uid == this.data.curuid) {\n      await WXAPI.shippingCarInfoRemoveAll(token)\n    }\n    const d = {\n      token,\n      goodsId,\n      number: this.data.buyNumber,\n      sku: sku && sku.length > 0 ? JSON.stringify(sku) : '',\n      addition: goodsAddition && goodsAddition.length > 0 ? JSON.stringify(goodsAddition) : '',\n    }\n    if (this.data.goodsTimesSchedule) {\n      const a = this.data.goodsTimesSchedule.find(ele => ele.active)\n      if (a) {\n        const b = a.items.find(ele => ele.active)\n        if (b) {\n          d.goodsTimesDay = a.day\n          d.goodsTimesItem = b.name\n        }\n      }\n    }\n    const res = await WXAPI.shippingCarInfoAddItemV2(d)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n\n    this.closePopupTap();\n    wx.showToast({\n      title: this.data.$t.goodsDetail.addCartSuccess,\n      icon: 'success'\n    })\n    this.shippingCartInfo()\n    // 砍价的话跳转到下单页面\n    if (this.data.curKanjiaprogress && this.data.curKanjiaprogress.kanjiaInfo.uid == this.data.curuid) {\n      wx.navigateTo({\n        url: '/pages/pay/index?kjId=' + this.data.curGoodsKanjia.id,\n      })\n    }\n  },\n  onShareAppMessage() {\n    let _data = {\n      title: this.data.goodsDetail.basicInfo.name,\n      path: '/pages/goods-details/index?id=' + this.data.goodsDetail.basicInfo.id + '&inviter_id=' + wx.getStorageSync('uid'),\n      success: function (res) {\n        // 转发成功\n      },\n      fail: function (res) {\n        // 转发失败\n      }\n    }\n    if (this.data.kjJoinUid) {\n      _data.title = this.data.curKanjiaprogress.joiner.nick + ' ' + this.data.$t.goodsDetail.inviteKanJia\n      _data.path += '&kjJoinUid=' + this.data.kjJoinUid\n    }\n    return _data\n  },\n  getVideoSrc: function (videoId) {\n    var that = this;\n    WXAPI.videoDetail(videoId).then(function (res) {\n      if (res.code == 0) {\n        that.setData({\n          videoMp4Src: res.data.fdMp4\n        });\n      }\n    })\n  },\n  goIndex() {\n    wx.switchTab({\n      url: '/pages/index/index',\n    });\n  },\n  helpKanjia() {\n    const _this = this;\n    AUTH.checkHasLogined().then(isLogined => {\n      if (isLogined) {\n        _this.helpKanjiaDone()\n      }\n    })\n  },\n  helpKanjiaDone() {\n    const _this = this;\n    WXAPI.kanjiaHelp(wx.getStorageSync('token'), _this.data.kjId, _this.data.kjJoinUid, '').then(function (res) {\n      if (res.code != 0) {\n        wx.showToast({\n          title: res.msg,\n          icon: 'none'\n        })\n        return;\n      }\n      _this.setData({\n        myHelpDetail: res.data\n      });\n      wx.showModal({\n        confirmText: _this.data.$t.common.confirm,\n        cancelText: _this.data.$t.common.cancel,\n        content: _this.data.$t.goodsDetail.kanJiaAmount + ' ' + res.data.cutPrice,\n        showCancel: false\n      })\n      _this.getGoodsDetailAndKanjieInfo(_this.data.goodsDetail.basicInfo.id)\n    })\n  },\n  closePop() {\n    this.setData({\n      posterShow: false\n    })\n  },\n  async drawSharePic() {\n    const _this = this\n    const qrcodeRes = await WXAPI.wxaQrcode({\n      scene: _this.data.goodsDetail.basicInfo.id + ',' + wx.getStorageSync('uid'),\n      page: 'pages/goods-details/index',\n      is_hyaline: true,\n      autoColor: true,\n      expireHours: 1\n    })\n    if (qrcodeRes.code != 0) {\n      wx.showToast({\n        title: qrcodeRes.msg,\n        icon: 'none'\n      })\n      return\n    }\n    const qrcode = qrcodeRes.data\n    const pic = _this.data.goodsDetail.basicInfo.pic\n    wx.getImageInfo({\n      src: pic,\n      success(res) {\n        const height = 490 * res.height / res.width\n        _this.drawSharePicDone(height, qrcode)\n      },\n      fail(e) {\n        console.error(e)\n      }\n    })\n  },\n  drawSharePicDone(picHeight, qrcode) {\n    const _this = this\n    const _baseHeight = 74 + (picHeight + 120)\n    this.setData({\n      posterConfig: {\n        width: 750,\n        height: picHeight + 660,\n        backgroundColor: '#fff',\n        debug: false,\n        blocks: [{\n          x: 76,\n          y: 74,\n          width: 604,\n          height: picHeight + 120,\n          borderWidth: 2,\n          borderColor: '#c2aa85',\n          borderRadius: 8\n        }],\n        images: [{\n            x: 133,\n            y: 133,\n            url: _this.data.goodsDetail.basicInfo.pic, // 商品图片\n            width: 490,\n            height: picHeight\n          },\n          {\n            x: 76,\n            y: _baseHeight + 199,\n            url: qrcode, // 二维码\n            width: 222,\n            height: 222\n          }\n        ],\n        texts: [{\n            x: 375,\n            y: _baseHeight + 80,\n            width: 650,\n            lineNum: 2,\n            text: _this.data.goodsDetail.basicInfo.name,\n            textAlign: 'center',\n            fontSize: 40,\n            color: '#333'\n          },\n          {\n            x: 375,\n            y: _baseHeight + 180,\n            text: '￥' + _this.data.goodsDetail.basicInfo.minPrice,\n            textAlign: 'center',\n            fontSize: 50,\n            color: '#e64340'\n          },\n          {\n            x: 352,\n            y: _baseHeight + 320,\n            text: _this.data.$t.goodsDetail.longTapQrcode,\n            fontSize: 28,\n            color: '#999'\n          }\n        ],\n      }\n    }, () => {\n      Poster.create();\n    });\n  },\n  onPosterSuccess(e) {\n    console.log('success:', e)\n    this.setData({\n      posterImg: e.detail,\n      showposterImg: true\n    })\n  },\n  onPosterFail(e) {\n    console.error('fail:', e)\n  },\n  savePosterPic() {\n    const _this = this\n    wx.saveImageToPhotosAlbum({\n      filePath: this.data.posterImg,\n      success: (res) => {\n        wx.showModal({\n          content: _this.data.$t.goodsDetail.qrcodeSaved,\n          showCancel: false,\n          confirmText: _this.data.$t.common.gotIt,\n          confirmColor: '#333'\n        })\n      },\n      complete: () => {\n        _this.setData({\n          showposterImg: false\n        })\n      },\n      fail: (res) => {\n        wx.showToast({\n          title: res.errMsg,\n          icon: 'none',\n          duration: 2000\n        })\n      }\n    })\n  },\n  previewImage(e) {\n    const url = e.currentTarget.dataset.url\n    wx.previewImage({\n      current: url, // 当前显示图片的http链接\n      urls: [url] // 需要预览的图片http链接列表\n    })\n  },\n  onTabsChange(e) {\n    var index = e.detail.index\n    this.setData({\n      toView: this.data.tabs[index].view_id\n    })\n  },\n  backToHome() {\n    wx.switchTab({\n      url: '/pages/index/index',\n    })\n  },\n  joinKanjia() {\n    AUTH.checkHasLogined().then(isLogined => {\n      if (isLogined) {\n        this.doneJoinKanjia();\n      }\n    })\n  },\n  doneJoinKanjia: function () { // 报名参加砍价活动\n    const _this = this;\n    if (!_this.data.curGoodsKanjia) {\n      return;\n    }\n    wx.showLoading({\n      title: ''\n    })\n    WXAPI.kanjiaJoin(wx.getStorageSync('token'), _this.data.curGoodsKanjia.id).then(function (res) {\n      wx.hideLoading()\n      if (res.code == 0) {\n        _this.setData({\n          kjJoinUid: wx.getStorageSync('uid'),\n          myHelpDetail: null\n        })\n        _this.getGoodsDetailAndKanjieInfo(_this.data.goodsDetail.basicInfo.id)\n      } else {\n        wx.showToast({\n          title: res.msg,\n          icon: 'none'\n        })\n      }\n    })\n  },\n})\n\n"
  },
  {
    "path": "pages/goods-details/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\",\n  \"usingComponents\": {\n    \"poster\": \"wxa-plugin-canvas/poster\"\n  }\n}"
  },
  {
    "path": "pages/goods-details/index.wxml",
    "content": "<view class=\"container\">\n  <!-- 商品图片区域 -->\n  <view class=\"swiper-container\" id=\"swiper-container\">\n    <swiper class=\"swiper_box\" indicator-dots=\"true\" indicator-color=\"rgba(255,255,255,0.5)\" indicator-active-color=\"#D4A574\"\n      autoplay=\"{{!goodsDetail.basicInfo.videoId}}\" circular>\n      <swiper-item wx:if=\"{{goodsDetail.basicInfo.videoId}}\">\n        <video src=\"{{videoMp4Src}}\" autoplay=\"true\" loop=\"true\" style='width:100%;height:100%;'></video>\n      </swiper-item>\n      <swiper-item wx:for=\"{{goodsDetail.pics}}\" wx:key=\"id\">\n        <image src=\"{{item.pic}}\" class=\"slide-image\" mode=\"aspectFill\" lazy-load=\"true\" />\n      </swiper-item>\n    </swiper>\n  </view>\n  \n  <!-- 商品信息卡片 -->\n  <view class=\"goods-info-card\">\n    <view class=\"price-section\">\n      <view class=\"current-price\">\n        <text class=\"currency\">¥</text>\n        <text class=\"price-num\">{{selectSizePrice}}</text>\n      </view>\n      <view wx:if=\"{{goodsDetail.basicInfo.originalPrice && goodsDetail.basicInfo.originalPrice > 0}}\"\n        class=\"original-price\">\n        <text>¥{{selectSizeOPrice}}</text>\n      </view>\n    </view>\n    \n    <view class=\"goods-title\">{{goodsDetail.basicInfo.name}}</view>\n    \n    <view wx:if=\"{{goodsDetail.basicInfo.characteristic}}\" class=\"characteristic-tag\">\n      <text class=\"tag-icon\">✦</text>\n      <text class=\"tag-text\">{{goodsDetail.basicInfo.characteristic}}</text>\n    </view>\n    \n    <view class=\"commission-tip\" wx:if=\"{{goodsDetail.basicInfo.commissionType == 1}}\">\n      <text class=\"tip-icon\">💰</text>\n      {{ $t.goodsDetail.commission1 }} {{goodsDetail.basicInfo.commission}} {{ $t.goodsDetail.commission2 }}\n    </view>\n    <view class=\"commission-tip\" wx:if=\"{{goodsDetail.basicInfo.commissionType == 2}}\">\n      <text class=\"tip-icon\">💰</text>\n      {{ $t.goodsDetail.commission1 }} {{goodsDetail.basicInfo.commission}} {{ $t.goodsDetail.commission3 }}\n    </view>\n  </view>\n  <van-cell-group wx:if=\"{{curGoodsKanjia}}\" title=\"{{ $t.goodsDetail.kanJiaSetting }}\">\n    <van-cell title=\"{{ $t.goodsDetail.limit }}\" value=\"{{curGoodsKanjia.number}}\" />\n    <van-cell title=\"{{ $t.goodsDetail.saledNum }}\" value=\"{{curGoodsKanjia.numberBuy}}\" />\n    <van-cell title=\"{{ $t.goodsDetail.originalPrice }}\" value=\"￥{{curGoodsKanjia.originalPrice}}\" />\n    <van-cell title=\"{{ $t.goodsDetail.minPrice }}\" value=\"￥{{curGoodsKanjia.minPrice}}\" />\n    <van-cell title=\"{{ $t.goodsDetail.end }}\" value=\"{{curGoodsKanjia.dateEnd}}\" />\n  </van-cell-group>\n  <view class=\"curKanjiaprogress\" wx:if=\"{{curKanjiaprogress}}\">\n    <view class=\"name\">{{ $t.goodsDetail.help }}\n      <text style='color:red;font-weight:bold;'>{{curKanjiaprogress.joiner.nick}}</text> {{ $t.goodsDetail.kanjia }}！\n    </view>\n    <van-progress\n      percentage=\"{{100 * (curGoodsKanjia.originalPrice - curKanjiaprogress.kanjiaInfo.curPrice) / (curGoodsKanjia.originalPrice - curGoodsKanjia.minPrice)}}\"\n      pivot-text=\"￥{{curKanjiaprogress.kanjiaInfo.curPrice}}\"\n      pivot-color=\"#1aad19\"\n      color=\"#1aad19\"\n      custom-class=\"van-progress\"\n    />\n    <view class=\"flex\">\n      <view class=\"kjbutton\">\n        <button type=\"primary\" open-type=\"share\">{{ $t.goodsDetail.inviteKanJiaFriend }}</button>\n      </view>\n    </view>\n    <van-cell title=\"{{ $t.goodsDetail.helpPerson }}\" value=\"{{curKanjiaprogress.kanjiaInfo .helpNumber}}\" />\n    <van-cell title=\"{{ $t.goodsDetail.status }}\" value=\"{{curKanjiaprogress.kanjiaInfo .statusStr}}\" />\n    <van-cell title=\"{{ $t.goodsDetail.joinTime }}\" value=\"{{curKanjiaprogress.kanjiaInfo .dateAdd}}\" />\n  </view>\n  \n  <!-- 规格选择卡片 -->\n  <view wx:if=\"{{hasMoreSelect && goodsDetailSkuShowType==0}}\" class=\"spec-select-card\" bind:tap=\"bindGuiGeTap\">\n    <view class=\"spec-title\">{{ $t.common.select }}</view>\n    <view class=\"spec-content\">\n      <block wx:for=\"{{goodsDetail.properties}}\" wx:key=\"id\">\n        <text class=\"spec-tag\">{{item.name}}</text>\n      </block>\n      <block wx:for=\"{{goodsAddition}}\" wx:key=\"id\">\n        <text class=\"spec-tag\">{{item.name}}</text>\n      </block>\n    </view>\n    <view class=\"spec-arrow\">›</view>\n  </view>\n  \n  <!-- 展开式规格选择 -->\n  <view class=\"spec-select-expanded\" wx:if=\"{{goodsDetailSkuShowType==1}}\">\n    <view class=\"section-header\">\n      <view class=\"header-line\"></view>\n      <view class=\"header-text\">{{ $t.goodsDetail.noSelectSku }}</view>\n      <view class=\"header-line\"></view>\n    </view>\n    \n    <view class=\"spec-options-wrapper\">\n      <block wx:for=\"{{goodsDetail.properties}}\" wx:for-item=\"property\" wx:for-index=\"idx\" wx:key=\"id\">\n        <view class=\"spec-group\">\n          <view class=\"spec-label\">{{property.name}}</view>\n          <view class=\"spec-items\">\n            <view class=\"spec-item {{item.active ? 'active' : '' }}\" wx:for=\"{{property.childsCurGoods}}\" wx:key=\"id\"\n              bindtap=\"labelItemTap\" data-propertyindex=\"{{idx}}\" data-propertychildindex=\"{{index}}\">\n              {{item.name}}\n            </view>\n          </view>\n        </view>\n      </block>\n    </view>\n    \n    <view class=\"quantity-selector\">\n      <view class=\"quantity-label\">{{ $t.goodsDetail.buyNumber }}</view>\n      <van-stepper value=\"{{ buyNumber }}\" min=\"{{ buyNumMin }}\" max=\"{{ buyNumMax }}\" bind:change=\"stepChange\" \n        button-size=\"36rpx\" />\n    </view>\n  </view>\n  \n  <!-- 店铺信息卡片 -->\n  <view wx:if=\"{{shopSubdetail}}\" class=\"shop-info-card\">\n    <view class=\"shop-badge\">\n      <image mode=\"aspectFill\" src=\"{{shopSubdetail.info.pic}}\" class=\"shop-avatar\"></image>\n    </view>\n    <view class=\"shop-details\">\n      <view class=\"shop-name\">{{shopSubdetail.info.name}}</view>\n      <view class=\"shop-address\">📍 {{shopSubdetail.info.address}}</view>\n    </view>\n  </view>\n  \n  <!-- 商品详情卡片 -->\n  <view class=\"goods-detail-card\" id=\"goods-des-info\">\n    <view class=\"detail-header\">\n      <view class=\"header-decorator\"></view>\n      <view class=\"header-title\">{{ $t.goodsDetail.title }}</view>\n      <view class=\"header-decorator\"></view>\n    </view>\n    <view class=\"detail-content\">\n      <parser html=\"{{goodsDetail.content}}\" />\n    </view>\n  </view>\n  <van-cell-group wx:if=\"{{curKanjiaprogress && curKanjiaprogress.helps && curKanjiaprogress.helps.length>0}}\" title=\"{{ $t.goodsDetail.kanjiaLogs }}\">\n    <view class=\"kjlj\"  wx:for=\"{{curKanjiaprogress.helps}}\" wx:key=\"*this\">\n      <image class=\"kjlj-l\" src=\"{{item.avatarUrl}}\" mode=\"aspectFill\" />\n      <van-cell custom-class=\"kjlj-r\" title=\"￥ {{item.cutPrice}}\" label=\"{{item.nick}} {{item.dateAdd}} {{ $t.goodsDetail.help2 }}\" size=\"large\" />\n    </view>\n    <view style=\"height: 64rpx;\"></view>\n  </van-cell-group>\n  <view class='kjBuyButton' wx:if=\"{{curGoodsKanjia && curKanjiaprogress}}\">\n    <view class=\"item\" wx:if=\"{{curKanjiaprogress.kanjiaInfo.uid != curuid}}\">\n      <van-button type=\"primary\" block bind:click=\"helpKanjia\" disabled=\"{{myHelpDetail}}\">\n        {{myHelpDetail ? $t.goodsDetail.helped : $t.goodsDetail.helphe}}</van-button>\n    </view>\n    <view class=\"item\" wx:else>\n      <van-button type=\"danger\" block bind:click=\"tobuy\">{{ $t.goodsDetail.buyUseCurPrice }}</van-button>\n    </view>\n  </view>\n  <van-goods-action wx:if=\"{{ goodsDetail.basicInfo.stores < goodsDetail.basicInfo.minBuyNumber }}\">\n    <van-goods-action-button text='{{ $t.goodsDetail.storeing }}' type=\"warning\" disabled />\n  </van-goods-action>\n  <van-goods-action wx:else>\n    <van-goods-action-button wx:if=\"{{ curKanjiaprogress }}\" text='{{myHelpDetail ? $t.goodsDetail.helped : $t.goodsDetail.helphe}}' type=\"danger\" bind:click=\"helpKanjia\" disabled=\"{{ myHelpDetail }}\" />\n    <van-goods-action-button wx:if=\"{{ goodsDetail.basicInfo.kanjia && !curGoodsKanjia }}\" text=\"{{ $t.goodsDetail.ended }}\" type=\"warning\" disabled />\n    <van-goods-action-button wx:elif=\"{{curGoodsKanjia && (!curKanjiaprogress || curKanjiaprogress.kanjiaInfo.uid != curuid)}}\" text=\"{{ $t.goodsDetail.kanjiaBtn }}\" type=\"warning\" bind:click=\"joinKanjia\" />\n    <van-goods-action-button wx:elif=\"{{ curKanjiaprogress && curKanjiaprogress.kanjiaInfo.uid == curuid }}\" text=\"￥{{curKanjiaprogress.kanjiaInfo.curPrice}} {{ $t.goodsDetail.buy }}\" type=\"warning\" bind:click=\"{{goodsDetailSkuShowType==0?'toAddShopCar':'addShopCar'}}\" />\n    <van-goods-action-button wx:else text=\"{{ $t.goodsDetail.addCartBtn }}\" type=\"warning\" bind:click=\"{{goodsDetailSkuShowType==0?'toAddShopCar':'addShopCar'}}\" />\n  </van-goods-action>\n</view>\n\n<block wx:if=\"{{posterShow}}\">\n  <view class=\"poster-mask\"></view>\n  <view class=\"poster\">\n    <canvas class=\"canvas\" style=\"{{canvasstyle}}\" canvas-id=\"firstCanvas\"></canvas>\n  </view>\n  <view class=\"poster-btn\">\n    <button type=\"primary\" size=\"mini\" bindtap='_saveToMobile'> {{ $t.goodsDetail.saveImage }} </button>\n    <button type=\"warn\" size=\"mini\" bindtap='closePop'> {{ $t.common.cancel }} </button>\n  </view>\n</block>\n\n<poster id=\"poster\" config=\"{{posterConfig}}\" bind:success=\"onPosterSuccess\" bind:fail=\"onPosterFail\"></poster>\n<view wx:if=\"{{showposterImg}}\" class=\"popup-mask\"></view>\n<view wx:if=\"{{showposterImg}}\" class=\"posterImg-box\">\n  <image mode=\"widthFix\" class=\"posterImg\" src=\"{{posterImg}}\"></image>\n  <view class=\"btn-create\" bindtap=\"savePosterPic\">{{ $t.goodsDetail.saveImage }}</view>\n</view>\n\n<van-popup show=\"{{ !hideShopPopup }}\" round closeable position=\"bottom\"\n  custom-style=\"padding-top:48rpx;max-height: 80%;border-radius: 32rpx 32rpx 0 0;\" bind:close=\"closePopupTap\">\n  \n  <!-- 弹窗商品信息 -->\n  <view class=\"popup-goods-card\">\n    <image class=\"popup-goods-image\" src=\"{{ skuGoodsPic }}\" mode=\"aspectFill\"></image>\n    <view class=\"popup-goods-info\">\n      <view class=\"popup-goods-name\">{{ goodsDetail.basicInfo.name }}</view>\n      <view class=\"popup-price-row\">\n        <text class=\"popup-current-price\">¥{{ selectSizePrice }}</text>\n        <text wx:if=\"{{ selectSizePrice != selectSizeOPrice }}\" class=\"popup-original-price\">¥{{ selectSizeOPrice }}</text>\n      </view>\n    </view>\n  </view>\n  \n  <!-- 规格选择区域 -->\n  <view class=\"popup-spec-area\">\n    <block wx:for=\"{{goodsDetail.properties}}\" wx:for-item=\"property\" wx:for-index=\"idx\" wx:key=\"id\">\n      <view class=\"popup-spec-group\">\n        <view class=\"popup-spec-label\">{{property.name}}</view>\n        <view class=\"popup-spec-items\">\n          <view class=\"popup-spec-item {{item.active ? 'active' : '' }}\" wx:for=\"{{property.childsCurGoods}}\" wx:key=\"id\"\n            bindtap=\"labelItemTap\" data-propertyindex=\"{{idx}}\" data-propertychildindex=\"{{index}}\">\n            {{item.name}}\n          </view>\n        </view>\n      </view>\n    </block>\n    \n    <block wx:for=\"{{goodsAddition}}\" wx:for-item=\"property\" wx:for-index=\"idx\" wx:key=\"id\">\n      <view class=\"popup-spec-group\">\n        <view class=\"popup-spec-label\">{{property.name}}</view>\n        <view class=\"popup-spec-items\">\n          <view class=\"popup-spec-item {{item.active ? 'active' : '' }}\" wx:for=\"{{property.items}}\" wx:key=\"id\"\n            bindtap=\"labelItemTap2\" data-propertyindex=\"{{idx}}\" data-propertychildindex=\"{{index}}\">\n            {{item.name}}\n          </view>\n        </view>\n      </view>\n    </block>\n    \n    <block wx:for=\"{{goodsTimesSchedule}}\" wx:for-item=\"property\" wx:key=\"id\">\n      <view class=\"popup-spec-group\">\n        <view class=\"popup-spec-label\">{{property.day}}</view>\n        <view class=\"popup-spec-items\">\n          <view class=\"popup-spec-item {{item.active ? 'active' : '' }}\" wx:for-index=\"index2\" wx:for=\"{{property.items}}\" wx:key=\"id\"\n            bindtap=\"skuClick3\" data-idx1=\"{{index}}\" data-idx2=\"{{index2}}\">\n            {{item.name}}\n          </view>\n        </view>\n      </view>\n    </block>\n  </view>\n  \n  <!-- 数量选择 -->\n  <view wx:if=\"{{ !(curKanjiaprogress && curKanjiaprogress.kanjiaInfo.uid == curuid) }}\" class=\"popup-quantity\">\n    <view class=\"popup-quantity-label\">{{ $t.goodsDetail.buyNumber }}</view>\n    <van-stepper value=\"{{ buyNumber }}\" min=\"{{ buyNumMin }}\" max=\"{{ buyNumMax }}\" bind:change=\"stepChange\" \n      button-size=\"40rpx\" />\n  </view>\n  \n  <!-- 确认按钮 -->\n  <view class=\"popup-action-area\">\n    <view wx:if=\"{{ curKanjiaprogress && curKanjiaprogress.kanjiaInfo.uid == curuid }}\" \n      class=\"popup-confirm-btn premium\" bindtap=\"addShopCar\">\n      ¥{{curKanjiaprogress.kanjiaInfo.curPrice}} {{ $t.goodsDetail.buy }}\n    </view>\n    <view wx:else class=\"popup-confirm-btn premium\" bindtap=\"addShopCar\">\n      {{ $t.goodsDetail.addCartBtn }}\n    </view>\n  </view>\n</van-popup>"
  },
  {
    "path": "pages/goods-details/index.wxss",
    "content": "/* 页面基础样式 */\npage {\n  background: linear-gradient(180deg, #FDF8F3 0%, #F5EFE7 100%);\n  padding-bottom: 32rpx;\n}\n\nview,\nimage,\ninput,\ntextarea {\n  display: block;\n  box-sizing: border-box;\n}\n\n/* ======================== 容器样式 ======================== */\n.container {\n  min-height: 100vh;\n  padding-bottom: 120rpx;\n  background: linear-gradient(180deg, #FDF8F3 0%, #F5EFE7 100%);\n}\n\n/* ======================== 商品图片区域 ======================== */\n.swiper-container {\n  width: 100%;\n  position: relative;\n  overflow: hidden;\n}\n\n.swiper_box {\n  width: 100%;\n  height: 750rpx;\n  border-radius: 0 0 48rpx 48rpx;\n  overflow: hidden;\n}\n\nswiper-item image {\n  width: 100%;\n  height: 750rpx;\n  display: block;\n}\n\n.slide-image {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n/* ======================== 商品信息卡片 ======================== */\n.goods-info-card {\n  margin: 24rpx 24rpx 24rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\n  border-radius: 32rpx;\n  padding: 40rpx 32rpx;\n  box-shadow: 0 8rpx 32rpx rgba(212, 165, 116, 0.15);\n  position: relative;\n  z-index: 10;\n}\n\n.goods-info-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 6rpx;\n  background: linear-gradient(90deg, #D4A574 0%, #C9935E 100%);\n  border-radius: 32rpx 32rpx 0 0;\n}\n\n/* 价格区域 */\n.price-section {\n  display: flex;\n  align-items: baseline;\n  margin-bottom: 24rpx;\n}\n\n.current-price {\n  display: flex;\n  align-items: baseline;\n  color: #C9935E;\n}\n\n.currency {\n  font-size: 32rpx;\n  font-weight: 600;\n  margin-right: 4rpx;\n}\n\n.price-num {\n  font-size: 56rpx;\n  font-weight: 700;\n  letter-spacing: -1rpx;\n}\n\n.original-price {\n  margin-left: 16rpx;\n  font-size: 28rpx;\n  color: #B8B8B8;\n  text-decoration: line-through;\n}\n\n/* 商品标题 */\n.goods-title {\n  font-size: 36rpx;\n  font-weight: 600;\n  color: #333333;\n  line-height: 1.5;\n  margin-bottom: 16rpx;\n  letter-spacing: 0.5rpx;\n}\n\n/* 特性标签 */\n.characteristic-tag {\n  display: inline-flex;\n  align-items: center;\n  background: linear-gradient(135deg, #FFF5E8 0%, #FFE8CC 100%);\n  padding: 12rpx 24rpx;\n  border-radius: 40rpx;\n  margin-bottom: 16rpx;\n}\n\n.tag-icon {\n  font-size: 24rpx;\n  color: #D4A574;\n  margin-right: 8rpx;\n}\n\n.tag-text {\n  font-size: 26rpx;\n  color: #8B6F47;\n  font-weight: 500;\n}\n\n/* 佣金提示 */\n.commission-tip {\n  display: flex;\n  align-items: center;\n  font-size: 26rpx;\n  color: #D4A574;\n  padding: 16rpx 24rpx;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF3E0 100%);\n  border-radius: 16rpx;\n  margin-top: 16rpx;\n  border: 1rpx solid #FFE8CC;\n}\n\n.tip-icon {\n  margin-right: 8rpx;\n  font-size: 28rpx;\n}\n\n/* ======================== 规格选择卡片 ======================== */\n.spec-select-card {\n  margin: 0 24rpx 24rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 28rpx 32rpx;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.1);\n  transition: all 0.3s ease;\n}\n\n.spec-select-card:active {\n  transform: scale(0.98);\n}\n\n.spec-title {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #666666;\n  margin-right: 16rpx;\n}\n\n.spec-content {\n  flex: 1;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12rpx;\n}\n\n.spec-tag {\n  font-size: 26rpx;\n  color: #999999;\n  padding: 8rpx 16rpx;\n  background: #F8F8F8;\n  border-radius: 8rpx;\n}\n\n.spec-arrow {\n  font-size: 48rpx;\n  color: #D4A574;\n  font-weight: 300;\n  margin-left: 16rpx;\n}\n\n/* ======================== 展开式规格选择 ======================== */\n.spec-select-expanded {\n  margin: 0 24rpx 24rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 32rpx;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.1);\n}\n\n.section-header {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 32rpx;\n}\n\n.header-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent 0%, #E8D5C4 50%, transparent 100%);\n}\n\n.header-text {\n  font-size: 28rpx;\n  color: #8B6F47;\n  font-weight: 600;\n  padding: 0 24rpx;\n  letter-spacing: 2rpx;\n}\n\n.spec-options-wrapper {\n  margin-bottom: 32rpx;\n}\n\n.spec-group {\n  margin-bottom: 32rpx;\n}\n\n.spec-label {\n  font-size: 28rpx;\n  color: #666666;\n  font-weight: 600;\n  margin-bottom: 16rpx;\n}\n\n.spec-items {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16rpx;\n}\n\n.spec-item {\n  font-size: 28rpx;\n  color: #666666;\n  padding: 16rpx 32rpx;\n  background: #F8F8F8;\n  border-radius: 16rpx;\n  border: 2rpx solid transparent;\n  transition: all 0.3s ease;\n}\n\n.spec-item.active {\n  color: #C9935E;\n  background: linear-gradient(135deg, #FFF5E8 0%, #FFE8CC 100%);\n  border-color: #D4A574;\n  font-weight: 600;\n}\n\n/* 数量选择器 */\n.quantity-selector {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding-top: 24rpx;\n  border-top: 2rpx solid #F5F5F5;\n}\n\n.quantity-label {\n  font-size: 28rpx;\n  color: #666666;\n  font-weight: 600;\n}\n\n/* ======================== 店铺信息卡片 ======================== */\n.shop-info-card {\n  margin: 0 24rpx 24rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF7 100%);\n  border-radius: 24rpx;\n  padding: 28rpx 32rpx;\n  display: flex;\n  align-items: center;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.1);\n}\n\n.shop-badge {\n  width: 96rpx;\n  height: 96rpx;\n  border-radius: 50%;\n  overflow: hidden;\n  margin-right: 24rpx;\n  box-shadow: 0 4rpx 12rpx rgba(212, 165, 116, 0.2);\n}\n\n.shop-avatar {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n\n.shop-details {\n  flex: 1;\n}\n\n.shop-name {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  margin-bottom: 8rpx;\n}\n\n.shop-address {\n  font-size: 26rpx;\n  color: #999999;\n  line-height: 1.5;\n}\n\n/* ======================== 商品详情卡片 ======================== */\n.goods-detail-card {\n  margin: 0 24rpx 24rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 40rpx 32rpx;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.1);\n}\n\n.detail-header {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 32rpx;\n}\n\n.header-decorator {\n  width: 80rpx;\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent 0%, #D4A574 100%);\n}\n\n.header-decorator:last-child {\n  background: linear-gradient(90deg, #D4A574 0%, transparent 100%);\n}\n\n.header-title {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  padding: 0 24rpx;\n  letter-spacing: 2rpx;\n}\n\n.detail-content {\n  font-size: 28rpx;\n  color: #666666;\n  line-height: 1.8;\n}\n\n.detail-content image {\n  width: 100%;\n  border-radius: 16rpx;\n  margin: 16rpx 0;\n}\n\n/* ======================== 砍价相关样式 ======================== */\n.curKanjiaprogress {\n  width: 100%;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  margin: 0 24rpx 24rpx;\n  padding: 32rpx;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.1);\n}\n\n.curKanjiaprogress .name {\n  font-size: 32rpx;\n  padding: 0 0 24rpx 0;\n  text-align: center;\n  color: #333333;\n}\n\n.van-progress {\n  margin: 32rpx 0;\n}\n\n.flex {\n  display: flex;\n  width: 100%;\n}\n\n.kjbutton {\n  flex: 1;\n  padding: 0 30rpx;\n}\n\n.kjbutton button {\n  border-radius: 40rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C9935E 100%);\n}\n\n.kjBuyButton {\n  position: fixed;\n  left: 0;\n  bottom: calc(env(safe-area-inset-bottom) / 2);\n  width: 100%;\n  display: flex;\n  padding: 16rpx 24rpx;\n  background: #FFFFFF;\n  box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.05);\n}\n\n.kjBuyButton .item {\n  flex: 1;\n}\n\n.kjlj {\n  display: flex;\n  background: #FFFFFF;\n  padding: 16rpx 32rpx;\n  align-items: center;\n}\n\n.kjlj-l {\n  width: 88rpx;\n  height: 88rpx;\n  border-radius: 50%;\n  flex-shrink: 0;\n  margin-right: 16rpx;\n}\n\n/* ======================== 弹窗样式 ======================== */\n.popup-mask {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.6);\n  z-index: 9998;\n}\n\n.popup-goods-card {\n  display: flex;\n  padding: 0 32rpx 32rpx;\n  border-bottom: 2rpx solid #F5F5F5;\n}\n\n.popup-goods-image {\n  width: 160rpx;\n  height: 160rpx;\n  border-radius: 16rpx;\n  margin-right: 24rpx;\n  object-fit: cover;\n  box-shadow: 0 4rpx 12rpx rgba(212, 165, 116, 0.15);\n}\n\n.popup-goods-info {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.popup-goods-name {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #333333;\n  line-height: 1.4;\n  margin-bottom: 12rpx;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n}\n\n.popup-price-row {\n  display: flex;\n  align-items: baseline;\n}\n\n.popup-current-price {\n  font-size: 36rpx;\n  font-weight: 700;\n  color: #C9935E;\n  margin-right: 12rpx;\n}\n\n.popup-original-price {\n  font-size: 26rpx;\n  color: #B8B8B8;\n  text-decoration: line-through;\n}\n\n/* 弹窗规格选择 */\n.popup-spec-area {\n  padding: 32rpx;\n  max-height: 600rpx;\n  overflow-y: auto;\n}\n\n.popup-spec-group {\n  margin-bottom: 32rpx;\n}\n\n.popup-spec-label {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #666666;\n  margin-bottom: 16rpx;\n}\n\n.popup-spec-items {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16rpx;\n}\n\n.popup-spec-item {\n  font-size: 28rpx;\n  color: #666666;\n  padding: 16rpx 32rpx;\n  background: #F8F8F8;\n  border-radius: 16rpx;\n  border: 2rpx solid transparent;\n  transition: all 0.3s ease;\n}\n\n.popup-spec-item.active {\n  color: #C9935E;\n  background: linear-gradient(135deg, #FFF5E8 0%, #FFE8CC 100%);\n  border-color: #D4A574;\n  font-weight: 600;\n}\n\n/* 弹窗数量选择 */\n.popup-quantity {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 24rpx 32rpx;\n  border-top: 2rpx solid #F5F5F5;\n}\n\n.popup-quantity-label {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #666666;\n}\n\n/* 弹窗确认按钮 */\n.popup-action-area {\n  padding: 24rpx 32rpx 32rpx;\n}\n\n.popup-confirm-btn {\n  width: 100%;\n  height: 88rpx;\n  line-height: 88rpx;\n  text-align: center;\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #FFFFFF;\n  background: linear-gradient(135deg, #D4A574 0%, #C9935E 100%);\n  border-radius: 44rpx;\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.4);\n  transition: all 0.3s ease;\n}\n\n.popup-confirm-btn:active {\n  transform: scale(0.96);\n  box-shadow: 0 4rpx 12rpx rgba(212, 165, 116, 0.3);\n}\n\n.popup-confirm-btn.premium {\n  background: linear-gradient(135deg, #C9935E 0%, #A87C4F 100%);\n}\n\n/* ======================== 海报相关样式 ======================== */\n.poster-mask {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.7);\n  z-index: 9999;\n}\n\n.poster {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  z-index: 10000;\n}\n\n.canvas {\n  width: 686rpx;\n}\n\n.poster-btn {\n  position: fixed;\n  bottom: 100rpx;\n  left: 50%;\n  transform: translateX(-50%);\n  display: flex;\n  gap: 24rpx;\n  z-index: 10001;\n}\n\n.poster-btn button {\n  border-radius: 40rpx;\n}\n\n.posterImg-box {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 686rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  overflow: hidden;\n  z-index: 10000;\n}\n\n.posterImg {\n  width: 100%;\n}\n\n.btn-create {\n  margin: 32rpx;\n  height: 88rpx;\n  line-height: 88rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C9935E 100%);\n  color: #FFFFFF;\n  text-align: center;\n  border-radius: 44rpx;\n  font-size: 32rpx;\n  font-weight: 600;\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.4);\n}\n\n/* ======================== 底部操作栏 ======================== */\n.van-goods-action {\n  background: #FFFFFF;\n  box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.05);\n}\n\n/* ======================== Vant组件样式覆盖 ======================== */\n.van-cell {\n  padding: 24rpx 32rpx;\n  background: #FFFFFF;\n  border-radius: 16rpx;\n}\n\n.van-cell-group {\n  margin: 0 24rpx 24rpx;\n  border-radius: 24rpx;\n  overflow: hidden;\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.1);\n}\n\n.van-button--primary {\n  background: linear-gradient(135deg, #D4A574 0%, #C9935E 100%);\n  border: none;\n  border-radius: 40rpx;\n}\n\n.van-button--danger {\n  background: linear-gradient(135deg, #C9935E 0%, #A87C4F 100%);\n  border: none;\n  border-radius: 40rpx;\n}\n\n.van-button--warning {\n  background: linear-gradient(135deg, #FFB84D 0%, #FF9E2C 100%);\n  border: none;\n  border-radius: 40rpx;\n}\n\n.van-stepper {\n  font-size: 28rpx;\n}\n\n/* ======================== 通用样式 ======================== */\n.clearfix:after {\n  content: \"\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\n/* ======================== 响应式优化 ======================== */\n@media (prefers-color-scheme: dark) {\n  /* 暗色模式下保持亮色主题 */\n  page {\n    background: linear-gradient(180deg, #FDF8F3 0%, #F5EFE7 100%);\n  }\n}\n"
  },
  {
    "path": "pages/home/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n\n  },\n  onLoad(e) {\n    getApp().initLanguage(this)\n    getApp().getUserDetailOK = (apiUserInfoMap) => {\n      this.processGotUserDetail(apiUserInfoMap)\n    }\n    this.banners()\n  },\n  onShow() {\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n  },\n  async processGotUserDetail(apiUserInfoMap) {\n    if (!apiUserInfoMap) {\n      return\n    }\n    this.setData({\n      apiUserInfoMap,\n      nick: apiUserInfoMap.base.nick\n    })\n  },\n  async banners() {\n    // https://www.yuque.com/apifm/nu0f75/ms21ki\n    const res = await WXAPI.banners({\n      type: 'shouye'\n    })\n    if (res.code == 0) {\n      this.setData({\n        banners: res.data\n      })\n    }\n  },\n  tapBanner(e) {\n    const url = e.currentTarget.dataset.url\n    if (url) {\n      wx.navigateTo({\n        url\n      })\n    }\n  },\n  onShareAppMessage() {\n    return {\n      title: wx.getStorageSync('mallName') + ' ' + wx.getStorageSync('share_profile'),\n      path: '/pages/home/index?inviter_id=' + (wx.getStorageSync('uid') || ''),\n      imageUrl: wx.getStorageSync('share_pic')\n    }\n  },\n  onShareTimeline() {\n    return {\n      title: wx.getStorageSync('mallName') + ' ' + wx.getStorageSync('share_profile'),\n      query: 'inviter_id=' + (wx.getStorageSync('uid') || ''),\n      imageUrl: wx.getStorageSync('share_pic')\n    }\n  },\n  changeLang() {\n    getApp().changeLang(this)\n  },\n  huiyuan() {\n    wx.navigateTo({\n      url: '/pages/member-center/index',\n    })\n  },\n  coupon() {\n    wx.navigateTo({\n      url: '/pages/coupons/index',\n    })\n  },\n  changePeisongType(e) {\n    const peisongType = e.currentTarget.dataset.type\n    wx.setStorageSync('peisongType', peisongType)\n    wx.switchTab({\n      url: '/pages/index/index',\n    })\n  },\n  about() {\n    wx.navigateTo({\n      url: '/pages/about/index',\n    })\n  },\n  about() {\n    wx.navigateTo({\n      url: '/pages/about/index',\n    })\n  },\n  touming() {\n    wx.navigateTo({\n      url: '/pages/about/index?key=toumingshicai',\n    })\n  },\n  card() {\n    wx.navigateTo({\n      url: '/pages/card/index',\n    })\n  },\n})"
  },
  {
    "path": "pages/home/index.json",
    "content": "{\n  \"navigationStyle\": \"custom\",\n  \"navigationBarTextStyle\": \"white\"\n}"
  },
  {
    "path": "pages/home/index.wxml",
    "content": "<view class=\"home-container\">\n  <!-- 轮播图区域 -->\n  <view class=\"banner-section\">\n    <swiper wx:if=\"{{banners}}\" class=\"banner-swiper\" indicator-dots indicator-color=\"rgba(255,255,255,0.5)\" indicator-active-color=\"#ff6b9d\" autoplay circular>\n      <swiper-item wx:for=\"{{banners}}\" wx:key=\"id\">\n        <image class=\"banner-image\" mode=\"aspectFill\" bindtap=\"tapBanner\" data-url=\"{{item.linkUrl}}\" src=\"{{item.picUrl}}\" />\n      </swiper-item>\n    </swiper>\n  </view>\n\n  <!-- 用户信息卡片 -->\n  <view class=\"user-card\">\n    <view class=\"user-main\" bind:tap=\"huiyuan\">\n      <image class=\"user-avatar\" src=\"{{ apiUserInfoMap.base.avatarUrl ? apiUserInfoMap.base.avatarUrl : '/images/who.png' }}\" mode=\"aspectFill\"></image>\n      <view class=\"user-info\">\n        <view class=\"user-nick\">{{ nick ? nick : $t.my.nickSet }}</view>\n        <view class=\"user-member\">\n          <van-tag type=\"warning\" round size=\"medium\">{{ apiUserInfoMap.userLevel.name || $t.home.huiyuan }}</van-tag>\n        </view>\n      </view>\n    </view>\n    <view class=\"user-actions\">\n      <view wx:if=\"{{ language }}\" class=\"language-btn\" bind:tap=\"changeLang\">\n        <image class=\"language-icon\" src=\"/images/lang/{{language}}.png\" mode=\"aspectFill\"></image>\n      </view>\n      <view class=\"coupon-btn\" bind:tap=\"coupon\">\n        <text>{{ $t.coupons.title }}</text>\n        <van-icon name=\"arrow\" />\n      </view>\n    </view>\n  </view>\n\n  <!-- 配送方式选择 -->\n  <view class=\"delivery-section\">\n    <view class=\"section-title\">配送方式</view>\n    <view class=\"delivery-types\">\n      <view class=\"delivery-card\" data-type=\"zq\" bind:tap=\"changePeisongType\">\n        <view class=\"delivery-icon-wrapper\">\n          <image class=\"delivery-icon\" src=\"/images/zq.png\"></image>\n        </view>\n        <view class=\"delivery-text\">{{ $t.home.zq }}</view>\n        <view class=\"delivery-desc\">到店自取</view>\n      </view>\n      <view class=\"delivery-card\" data-type=\"kd\" bind:tap=\"changePeisongType\">\n        <view class=\"delivery-icon-wrapper\">\n          <image class=\"delivery-icon\" src=\"/images/ps.png\"></image>\n        </view>\n        <view class=\"delivery-text\">{{ $t.home.ps }}</view>\n        <view class=\"delivery-desc\">外卖配送</view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 功能入口 -->\n  <view class=\"features-section\">\n    <view class=\"section-title\">更多服务</view>\n    <view class=\"features-grid\">\n      <view class=\"feature-item\" bind:tap=\"touming\">\n        <view class=\"feature-icon-box\">\n          <image class=\"feature-icon\" src=\"/images/sc.png\"></image>\n        </view>\n        <view class=\"feature-name\">{{ $t.home.sc }}</view>\n      </view>\n      <view class=\"feature-item\" bind:tap=\"card\">\n        <view class=\"feature-icon-box\">\n          <image class=\"feature-icon\" src=\"/images/lp.png\"></image>\n        </view>\n        <view class=\"feature-name\">{{ $t.home.lpk }}</view>\n      </view>\n      <view class=\"feature-item\">\n        <view class=\"feature-icon-box\">\n          <image class=\"feature-icon\" src=\"/images/tg.png\"></image>\n        </view>\n        <view class=\"feature-name\">{{ $t.home.tg }}</view>\n      </view>\n      <view class=\"feature-item\">\n        <view class=\"feature-icon-box\">\n          <image class=\"feature-icon\" src=\"/images/bh.png\"></image>\n        </view>\n        <view class=\"feature-name\">{{ $t.home.bh }}</view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 品牌底部 -->\n  <view class=\"brand-footer\" bind:tap=\"about\">\n    <view class=\"brand-line\"></view>\n    <view class=\"brand-name\">TEA WORK</view>\n    <view class=\"brand-line\"></view>\n  </view>\n</view>"
  },
  {
    "path": "pages/home/index.wxss",
    "content": "/* 全局容器 */\n.home-container {\n  min-height: 100vh;\n  background: linear-gradient(180deg, #fef8f4 0%, #fff5ed 100%);\n  padding-bottom: 60rpx;\n}\n\n/* ==================== 轮播图区域 ==================== */\n.banner-section {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.banner-swiper {\n  width: 100%;\n  height: 420rpx;\n  border-radius: 0 0 48rpx 48rpx;\n  overflow: hidden;\n}\n\n.banner-image {\n  width: 100%;\n  height: 100%;\n}\n\n/* ==================== 用户信息卡片 ==================== */\n.user-card {\n  margin: 32rpx 32rpx 0;\n  padding: 32rpx;\n  background: linear-gradient(135deg, #ffffff 0%, #fff9f6 100%);\n  border-radius: 28rpx;\n  box-shadow: 0 8rpx 32rpx rgba(255, 107, 157, 0.12);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  position: relative;\n  z-index: 10;\n}\n\n.user-main {\n  display: flex;\n  align-items: center;\n  flex: 1;\n}\n\n.user-avatar {\n  width: 100rpx;\n  height: 100rpx;\n  border-radius: 50%;\n  border: 4rpx solid #ffe8f0;\n  box-shadow: 0 4rpx 16rpx rgba(255, 107, 157, 0.2);\n}\n\n.user-info {\n  margin-left: 24rpx;\n  display: flex;\n  flex-direction: column;\n  gap: 8rpx;\n}\n\n.user-nick {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333;\n  letter-spacing: 1rpx;\n}\n\n.user-member {\n  display: flex;\n}\n\n.user-actions {\n  display: flex;\n  align-items: center;\n  gap: 16rpx;\n}\n\n.language-btn {\n  width: 56rpx;\n  height: 56rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: #fff;\n  border-radius: 50%;\n  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);\n}\n\n.language-icon {\n  width: 36rpx;\n  height: 36rpx;\n  border-radius: 50%;\n}\n\n.coupon-btn {\n  display: flex;\n  align-items: center;\n  padding: 12rpx 24rpx;\n  background: linear-gradient(135deg, #ff6b9d 0%, #ff8fab 100%);\n  border-radius: 40rpx;\n  color: #fff;\n  font-size: 26rpx;\n  box-shadow: 0 4rpx 16rpx rgba(255, 107, 157, 0.3);\n  transition: all 0.3s;\n}\n\n.coupon-btn text {\n  margin-right: 4rpx;\n}\n\n/* ==================== 配送方式区域 ==================== */\n.delivery-section {\n  margin: 40rpx 32rpx 0;\n}\n\n.section-title {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333;\n  margin-bottom: 24rpx;\n  padding-left: 12rpx;\n  border-left: 6rpx solid #ff6b9d;\n}\n\n.delivery-types {\n  display: flex;\n  gap: 24rpx;\n}\n\n.delivery-card {\n  flex: 1;\n  background: linear-gradient(135deg, #fff 0%, #fffbf8 100%);\n  border-radius: 24rpx;\n  padding: 36rpx 24rpx;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  box-shadow: 0 6rpx 24rpx rgba(255, 141, 107, 0.08);\n  border: 2rpx solid #ffe8f0;\n  transition: all 0.3s;\n  position: relative;\n  overflow: hidden;\n}\n\n.delivery-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 4rpx;\n  background: linear-gradient(90deg, #ff6b9d 0%, #ff8fab 100%);\n  transform: scaleX(0);\n  transition: transform 0.3s;\n}\n\n.delivery-card:active::before {\n  transform: scaleX(1);\n}\n\n.delivery-card:active {\n  transform: translateY(-4rpx);\n  box-shadow: 0 12rpx 32rpx rgba(255, 141, 107, 0.16);\n}\n\n.delivery-icon-wrapper {\n  width: 96rpx;\n  height: 96rpx;\n  background: linear-gradient(135deg, #fff0f5 0%, #ffe8f0 100%);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 16rpx;\n}\n\n.delivery-icon {\n  width: 60rpx;\n  height: 60rpx;\n}\n\n.delivery-text {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #333;\n  margin-bottom: 8rpx;\n}\n\n.delivery-desc {\n  font-size: 24rpx;\n  color: #999;\n}\n\n/* ==================== 功能入口区域 ==================== */\n.features-section {\n  margin: 48rpx 32rpx 0;\n}\n\n.features-grid {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 24rpx;\n}\n\n.feature-item {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 24rpx 12rpx;\n  background: linear-gradient(135deg, #fff 0%, #fffbf8 100%);\n  border-radius: 20rpx;\n  box-shadow: 0 4rpx 16rpx rgba(255, 141, 107, 0.06);\n  transition: all 0.3s;\n}\n\n.feature-item:active {\n  transform: translateY(-4rpx);\n  box-shadow: 0 8rpx 24rpx rgba(255, 141, 107, 0.12);\n}\n\n.feature-icon-box {\n  width: 80rpx;\n  height: 80rpx;\n  background: linear-gradient(135deg, #fff5f0 0%, #ffebe8 100%);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 12rpx;\n}\n\n.feature-icon {\n  width: 48rpx;\n  height: 48rpx;\n}\n\n.feature-name {\n  font-size: 24rpx;\n  color: #666;\n  text-align: center;\n  line-height: 1.4;\n}\n\n/* ==================== 品牌底部 ==================== */\n.brand-footer {\n  margin-top: 64rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 24rpx;\n  padding: 0 64rpx;\n}\n\n.brand-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent 0%, #e8d5c8 50%, transparent 100%);\n}\n\n.brand-name {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #a67c52;\n  letter-spacing: 4rpx;\n  font-family: 'Georgia', serif;\n}\n\n/* ==================== 响应式优化 ==================== */\n@media (min-width: 375px) {\n  .banner-swiper {\n    height: 460rpx;\n  }\n}\n\n@media (min-width: 414px) {\n  .banner-swiper {\n    height: 500rpx;\n  }\n}\n\n/* ==================== 动画效果 ==================== */\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    transform: translateY(20rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.user-card,\n.delivery-section,\n.features-section {\n  animation: fadeInUp 0.6s ease-out;\n}"
  },
  {
    "path": "pages/index/index.js",
    "content": "const APP = getApp()\nconst AUTH = require('../../utils/auth')\nconst WXAPI = require('apifm-wxapi')\nPage({\n  data: {\n    page: 1,\n    peisongType: 'zq', // zq 自取，kd 配送\n    showCartPop: false, // 是否显示购物车列表\n    showGoodsDetailPOP: false, // 是否显示商品详情\n    showCouponPop: false, // 是否弹出优惠券领取提示\n    shopIsOpened: false, // 是否营业\n\n    showPingtuanPop: false,\n    share_goods_id: undefined,\n    share_pingtuan_open_id: undefined,\n    lijipingtuanbuy: false,\n    pingtuan_open_id: undefined,\n    menuButtonBoundingClientRect: wx.getMenuButtonBoundingClientRect(),\n\n    // 连续滚动模式相关数据\n    isContinuousMode: true, // 是否启用连续滚动模式\n    categoryIndex: 0, // 当前激活的分类索引\n    goodsByCategory: [], // 按分类分组的商品数据，用于跟踪每个分类的商品范围\n    scrollTop: 0, // 当前滚动位置\n    currentCategoryIndex: 0, // 当前滚动到的分类索引\n  },  \n  onLoad: function (e) {\n    getApp().initLanguage(this)\n    const _data = {}\n    // 测试拼团入口\n    // e = {\n    //   share_goods_id: 521055,\n    //   share_pingtuan_open_id: 11267\n    // }\n\n    // 测试扫码点餐\n    // shopId=36,id=111,key=Y6RoIT 进行 url编码，3个值分别为 门店id，餐桌id，餐桌密钥\n    // e = {\n    //   scene: 'shopId%3d12879%2cid%3d111%2ckey%3dY6RoIT' \n    // }\n\n    let mod = 0 // 0 普通模式； 1 扫码点餐模式\n    if (e && e.scene) {\n      const scene = decodeURIComponent(e.scene) // 处理扫码进商品详情页面的逻辑\n      if (scene && scene.split(',').length == 3) {\n        // 扫码点餐\n        const scanDining = {}\n        if (scene.indexOf('key=') != -1) {\n          // 原来shopId=36,id=111,key=Y6RoIT的参数\n          scene.split(',').forEach(ele => {\n            scanDining[ele.split('=')[0]] = ele.split('=')[1]\n          })\n        } else {\n          // 新的 1007292,1015,zsT1U3 模式\n          const _scene = scene.split(',')\n          scanDining.shopId = _scene[0]\n          scanDining.id = _scene[1]\n          scanDining.key = _scene[2]\n        }\n        \n        wx.setStorageSync('scanDining', scanDining)\n        _data.scanDining = scanDining\n        this.cyTableToken(scanDining.id, scanDining.key)\n        mod = 1\n      } else {\n        wx.removeStorageSync('scanDining')\n      }\n    }\n    if (wx.getStorageSync('scanDining')) {\n      mod = 1\n      _data.scanDining = wx.getStorageSync('scanDining')\n      wx.hideTabBar()\n    }\n    this.setData(_data)\n    if (e.share_goods_id) {\n      this.data.share_goods_id = e.share_goods_id\n      this._showGoodsDetailPOP(e.share_goods_id)\n    }\n    if (e.share_pingtuan_open_id) {\n      this.data.share_pingtuan_open_id = e.share_pingtuan_open_id\n    } else {\n      this._showCouponPop()\n    }\n    // 静默式授权注册/登陆\n    if (mod == 0) {\n      AUTH.checkHasLogined().then(isLogin => {\n        if (isLogin) {\n          AUTH.bindSeller()\n        } else {\n          AUTH.authorize().then(res => {\n            AUTH.bindSeller()\n          })\n        }\n      })\n    }\n    // 设置标题\n    const mallName = wx.getStorageSync('mallName')\n    if (mallName) {\n      this.setData({\n        mallName\n      })\n      wx.setNavigationBarTitle({\n        title: mallName\n      })\n    }\n    APP.configLoadOK = () => {\n      const mallName = wx.getStorageSync('mallName')\n      if (mallName) {\n        wx.setNavigationBarTitle({\n          title: mallName\n        })\n      }\n    }\n    // 读取默认配送方式\n    let peisongType = wx.getStorageSync('peisongType')\n    if (!peisongType) {\n      peisongType = 'zq'\n      wx.setStorageSync('peisongType', peisongType)\n    }\n    this.setData({\n      peisongType\n    })\n    this.noticeLastOne()\n    this.getshopInfo()\n    this.banners()\n  },\n  onShow: function(){\n    const peisongType = wx.getStorageSync('peisongType')\n    if (peisongType) {\n      this.setData({\n        peisongType\n      })\n    }\n    this.shippingCarInfo()\n    const refreshIndex = wx.getStorageSync('refreshIndex')\n    if (refreshIndex) {\n      this.getshopInfo()\n      wx.removeStorageSync('refreshIndex')\n    }\n  },\n  async cyTableToken(tableId, key) {\n    const res = await WXAPI.cyTableToken(tableId, key)\n    if (res.code != 0) {\n      wx.showModal({\n        confirmText: this.data.$t.common.confirm,\n        cancelText: this.data.$t.common.cancel,\n        content: res.msg,\n        showCancel: false\n      })\n      return\n    }\n    wx.hideTabBar()\n    wx.setStorageSync('uid', res.data.uid)\n    wx.setStorageSync('token', res.data.token)\n  },\n  async getshopInfo(){\n    let shopInfo = wx.getStorageSync('shopInfo')\n    if (shopInfo) {\n      this.setData({\n        shopInfo: shopInfo,\n        shopIsOpened: this.checkIsOpened(shopInfo.openingHours)\n      })\n      this.categories()\n      return\n    }\n    wx.getLocation({\n      type: 'wgs84', //wgs84 返回 gps 坐标，gcj02 返回可用于 wx.openLocation 的坐标\n      success: (res) => {\n        // console.log(res)\n        this.data.latitude = res.latitude\n        this.data.longitude = res.longitude\n        this.fetchShops(res.latitude, res.longitude, '')\n      },      \n      fail: (e) => {\n        console.log(e);\n        if (e.errMsg.indexOf('fail auth deny') != -1) {\n          AUTH.checkAndAuthorize('scope.userLocation')\n        } else if (e.errMsg.indexOf('fail privacy permission is not authorized') != -1) {\n          wx.showModal({\n            confirmText: this.data.$t.common.confirm,\n            cancelText: this.data.$t.common.cancel,\n            content: this.data.$t.common.privacyPermission,\n            showCancel: false,\n            success: () => {\n              wx.reLaunch({\n                url: '/pages/index/index',\n              })\n            }\n          })\n        } else {\n          wx.showModal({\n            confirmText: this.data.$t.common.confirm,\n            cancelText: this.data.$t.common.cancel,\n            content: e.errMsg,\n            showCancel: false\n          })\n        }\n      }\n    })\n  },\n  async fetchShops(latitude, longitude, kw){\n    const res = await WXAPI.fetchShops({\n      curlatitude: latitude,\n      curlongitude: longitude,\n      nameLike: kw,\n      pageSize: 1\n    })\n    if (res.code != 0) {\n      wx.showModal({\n        content: this.data.$t.common.empty,\n        confirmText: this.data.$t.common.confirm,\n        cancelText: this.data.$t.common.cancel,\n        showCancel: false\n      })\n      return\n    }\n    res.data.forEach(ele => {\n      ele.distance = ele.distance.toFixed(1) // 距离保留3位小数\n    })\n    this.setData({\n      shopInfo: res.data[0],\n      shopIsOpened: this.checkIsOpened(res.data[0].openingHours)\n    })\n    wx.setStorageSync('shopInfo', res.data[0])\n    this.categories()\n  },\n  async _showCouponPop() {\n    const a = wx.getStorageSync('has_pop_coupons')\n    if (a) {\n      return\n    }\n    // 检测是否需要弹出优惠券的福袋\n    const res = await WXAPI.coupons({\n      token: wx.getStorageSync('token')\n    })\n    if (res.code == 0) {\n      this.data.showCouponPop = true\n      wx.setStorageSync('has_pop_coupons', true)\n    } else {\n      this.data.showCouponPop = false\n    }\n    this.setData({\n      showCouponPop: this.data.showCouponPop\n    })\n  },\n  changePeisongType(e) {\n    const peisongType = e.currentTarget.dataset.type\n    this.setData({\n      peisongType\n    })\n    wx.setStorageSync('peisongType', peisongType)\n  },\n  // 获取分类\n  async categories() {\n    const shopInfo = wx.getStorageSync('shopInfo')\n    const shop_goods_split = wx.getStorageSync('shop_goods_split')\n    let shopId = '0'\n    if (shopInfo) {\n      shopId = '0,' + shopInfo.id\n    }\n    if (shop_goods_split != '1') {\n      shopId = ''\n    }\n    // https://www.yuque.com/apifm/nu0f75/racmle\n    const res = await WXAPI.goodsCategoryV2(shopId)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }    \n    this.setData({\n      page: 1,\n      categories: res.data,\n      categorySelected: res.data[0],\n      categoryIndex: 0,\n      currentCategoryIndex: 0, // 初始化为第一个分类\n      goodsByCategory: []\n    })\n    if (shop_goods_split == '1') {\n      wx.setStorageSync('shopIds', shopInfo.id)\n    } else {\n      wx.removeStorageSync('shopIds')\n    }\n    this.data.page = 1\n    this.getGoodsList()\n  },\n  async getGoodsList() {\n    if (!this.data.isContinuousMode) {\n      // 原有的单分类模式\n      this._getGoodsListSingleCategory()\n      return\n    }\n\n    // 连续滚动模式\n    await this._getGoodsListContinuous()\n  },\n\n  // 原有的单分类商品加载逻辑\n  async _getGoodsListSingleCategory() {\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/wg5t98\n    const res = await WXAPI.goodsv2({\n      page: this.data.page,\n      categoryId: this.data.categorySelected.id,\n      pageSize: 10000\n    })\n    wx.hideLoading()\n    if (res.code == 700) {\n      if (this.data.page == 1) {\n        this.setData({\n          goods: null\n        })\n      }\n      return\n    }\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    res.data.result.forEach(ele => {\n      if (ele.miaosha) {\n        // 秒杀商品，显示倒计时\n        const _now = new Date().getTime()\n        ele.dateStartInt = new Date(ele.dateStart.replace(/-/g, '/')).getTime() - _now\n        ele.dateEndInt = new Date(ele.dateEnd.replace(/-/g, '/')).getTime() -_now\n      }\n    })\n    if (this.data.page == 1) {\n      this.setData({\n        goods: res.data.result\n      })\n    } else {\n      this.setData({\n        goods: this.data.goods.concat(res.data.result)\n      })\n    }\n    this.processBadge()\n  },\n\n  // 连续滚动模式的商品加载逻辑\n  async _getGoodsListContinuous() {\n    wx.showLoading({\n      title: '',\n    })\n\n    const categories = this.data.categories\n    const categoryIndex = this.data.categoryIndex\n    let allGoods = this.data.goods || []\n    let goodsByCategory = this.data.goodsByCategory || []\n\n    // 如果是首次加载，重置数据\n    if (this.data.page == 1) {\n      allGoods = []\n      goodsByCategory = []\n    }\n\n    // 循环加载所有分类的商品\n    for (let i = categoryIndex; i < categories.length; i++) {\n      const category = categories[i]\n      const res = await WXAPI.goodsv2({\n        page: 1, // 每个分类都从第一页开始\n        categoryId: category.id,\n        pageSize: 10000\n      })\n\n      if (res.code == 0 && res.data.result && res.data.result.length > 0) {\n        // 处理秒杀商品倒计时\n        res.data.result.forEach(ele => {\n          if (ele.miaosha) {\n            const _now = new Date().getTime()\n            ele.dateStartInt = new Date(ele.dateStart.replace(/-/g, '/')).getTime() - _now\n            ele.dateEndInt = new Date(ele.dateEnd.replace(/-/g, '/')).getTime() - _now\n          }\n        })\n\n        // 记录该分类的商品范围\n        const startIndex = allGoods.length\n        const endIndex = startIndex + res.data.result.length - 1\n        goodsByCategory.push({\n          categoryId: category.id,\n          categoryName: category.name,\n          startIndex: startIndex,\n          endIndex: endIndex,\n          goodsCount: res.data.result.length\n        })\n\n        // 添加到总商品列表\n        allGoods = allGoods.concat(res.data.result)\n\n        // 如果加载到足够商品，停止加载更多分类\n        if (allGoods.length >= 50) { // 限制初始加载数量\n          break\n        }\n      }\n    }\n\n    wx.hideLoading()\n\n    this.setData({\n      goods: allGoods,\n      goodsByCategory: goodsByCategory,\n      categoryIndex: Math.min(categoryIndex + 1, categories.length - 1),\n      currentCategoryIndex: 0 // 初始化第一个分类为激活状态\n    })\n\n    console.log('商品数据加载完成，分类数据:', goodsByCategory)\n    this.processBadge()\n  },\n  _onReachBottom() {\n    if (!this.data.isContinuousMode) {\n      // 原有的单分类模式\n      this.data.page++\n      this.getGoodsList()\n      return\n    }\n\n    // 连续滚动模式：继续加载更多分类的商品\n    this._loadMoreCategories()\n  },\n\n  // 连续滚动模式下加载更多分类的商品\n  async _loadMoreCategories() {\n    const categories = this.data.categories\n    const categoryIndex = this.data.categoryIndex\n    let allGoods = this.data.goods || []\n    let goodsByCategory = this.data.goodsByCategory || []\n\n    // 如果已经加载完所有分类，不再加载\n    if (categoryIndex >= categories.length) {\n      return\n    }\n\n    wx.showLoading({\n      title: '',\n    })\n\n    // 从当前分类索引开始继续加载\n    for (let i = categoryIndex; i < categories.length; i++) {\n      const category = categories[i]\n      const res = await WXAPI.goodsv2({\n        page: 1,\n        categoryId: category.id,\n        pageSize: 10000\n      })\n\n      if (res.code == 0 && res.data.result && res.data.result.length > 0) {\n        // 处理秒杀商品倒计时\n        res.data.result.forEach(ele => {\n          if (ele.miaosha) {\n            const _now = new Date().getTime()\n            ele.dateStartInt = new Date(ele.dateStart.replace(/-/g, '/')).getTime() - _now\n            ele.dateEndInt = new Date(ele.dateEnd.replace(/-/g, '/')).getTime() - _now\n          }\n        })\n\n        // 记录该分类的商品范围\n        const startIndex = allGoods.length\n        const endIndex = startIndex + res.data.result.length - 1\n        goodsByCategory.push({\n          categoryId: category.id,\n          categoryName: category.name,\n          startIndex: startIndex,\n          endIndex: endIndex,\n          goodsCount: res.data.result.length\n        })\n\n        // 添加到总商品列表\n        allGoods = allGoods.concat(res.data.result)\n\n        // 每次只加载一个分类，避免一次性加载太多\n        break\n      }\n    }\n\n    wx.hideLoading()\n\n    this.setData({\n      goods: allGoods,\n      goodsByCategory: goodsByCategory,\n      categoryIndex: Math.min(categoryIndex + 1, categories.length)\n      // 注意：不在这里设置currentCategoryIndex，以避免影响滚动时的选中状态\n    })\n\n    this.processBadge()\n  },\n\n  // 滚动事件监听\n  onScroll(e) {\n    if (!this.data.isContinuousMode) {\n      return\n    }\n\n    const scrollTop = e.detail.scrollTop\n    // this.setData({\n    //   scrollTop: scrollTop\n    // })\n\n    // 计算当前滚动到的分类\n    this._calculateCurrentCategory(scrollTop)\n  },\n\n  // 计算当前滚动位置对应的分类\n  _calculateCurrentCategory(scrollTop) {\n    const goodsByCategory = this.data.goodsByCategory\n    if (!goodsByCategory || goodsByCategory.length === 0) {\n      console.log('goodsByCategory为空，无法计算分类')\n      return\n    }\n\n    // 更准确的估算值（rpx转px，微信小程序中1rpx = 0.5px在大多数设备上）\n    const itemHeight = 200 // 每个商品卡片约200px高度（包括间距）\n    const headerHeight = 200 // banner等头部高度约200px\n\n    // 计算当前可见区域的商品索引\n    const visibleStartIndex = Math.max(0, Math.floor((scrollTop - headerHeight) / itemHeight))\n\n    console.log('计算分类 - 滚动位置:', scrollTop, '可见商品索引:', visibleStartIndex, '分类数据:', goodsByCategory)\n\n    // 找到对应的分类\n    let currentCategoryIndex = 0\n    for (let i = 0; i < goodsByCategory.length; i++) {\n      const category = goodsByCategory[i]\n      if (visibleStartIndex >= category.startIndex && visibleStartIndex <= category.endIndex) {\n        currentCategoryIndex = i\n        console.log('找到匹配分类:', i, category)\n        break\n      }\n    }\n\n    // 如果滚动到了最后，设置最后一个分类为激活状态\n    if (visibleStartIndex >= goodsByCategory[goodsByCategory.length - 1].endIndex) {\n      currentCategoryIndex = goodsByCategory.length - 1\n      console.log('滚动到最后，设置最后一个分类:', currentCategoryIndex)\n    }\n\n    console.log('最终激活分类:', currentCategoryIndex, '当前值:', this.data.currentCategoryIndex)\n\n    // 更新当前分类索引\n    if (currentCategoryIndex !== this.data.currentCategoryIndex) {\n      console.log('更新激活分类:', currentCategoryIndex)\n      this.setData({\n        currentCategoryIndex: currentCategoryIndex\n      })\n    }\n  },\n\n  categoryClick(e) {\n    const index = e.currentTarget.dataset.idx\n\n    if (!this.data.isContinuousMode) {\n      // 原有的单分类模式\n      const categorySelected = this.data.categories[index]\n      this.setData({\n        page: 1,\n        categorySelected,\n        scrolltop: 0\n      })\n      this.getGoodsList()\n      return\n    }\n\n    // 连续滚动模式：滚动到对应分类的第一个商品\n    this._scrollToCategory(index)\n  },\n\n  // 滚动到指定分类的第一个商品\n  _scrollToCategory(categoryIndex) {\n    const goodsByCategory = this.data.goodsByCategory\n    if (!goodsByCategory || goodsByCategory.length <= categoryIndex) {\n      return\n    }\n\n    const category = goodsByCategory[categoryIndex]\n    if (!category) {\n      return\n    }\n\n    // 估算滚动位置：商品索引 * 商品高度 + 头部高度\n    const itemHeight = 200 // 与_calculateCurrentCategory中的估算值保持一致\n    const headerHeight = 200 // banner等头部高度\n    const scrollTop = category.startIndex * itemHeight + headerHeight\n\n    this.setData({\n      scrollTop: scrollTop,\n      currentCategoryIndex: categoryIndex\n    })\n\n    // 使用scroll-view的滚动方法\n    // 注意：需要在wxml中为scroll-view添加scroll-top属性绑定\n  },\n  async shippingCarInfo() {\n    const res = await WXAPI.shippingCarInfo(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        shippingCarInfo: res.data\n      })\n    } else {\n      this.setData({\n        shippingCarInfo: null,\n        showCartPop: false\n      })\n    }\n    this.processBadge()\n  },\n  showCartPop() {\n    if (this.data.scanDining) {\n      // 扫码点餐，前往购物车页面\n      wx.navigateTo({\n        url: '/pages/cart/index',\n      })\n    } else {\n      this.setData({\n        showCartPop: !this.data.showCartPop\n      })\n    }\n  },\n  hideCartPop() {\n    this.setData({\n      showCartPop: false\n    })\n  },\n  async addCart1(e) {\n    const token = wx.getStorageSync('token')\n    const index = e.currentTarget.dataset.idx\n    const item = this.data.goods[index]\n    wx.showLoading({\n      title: '',\n    })\n    let number = item.minBuyNumber // 加入购物车的数量\n    if (this.data.shippingCarInfo && this.data.shippingCarInfo.items) {\n      const goods = this.data.shippingCarInfo.items.find(ele => { return ele.goodsId == item.id})\n      console.log(goods);\n      if (goods) {\n        number = 1\n      }\n    }\n    const res = await WXAPI.shippingCarInfoAddItem(token, item.id, number, [])\n    wx.hideLoading()\n    if (res.code == 2000) {\n      AUTH.login(this)\n      return\n    }\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    this.shippingCarInfo()\n  },\n  async skuClick(e) {\n    const index1 = e.currentTarget.dataset.idx1\n    const index2 = e.currentTarget.dataset.idx2\n    const curGoodsMap = this.data.curGoodsMap\n    curGoodsMap.properties[index1].childsCurGoods.forEach(ele => {\n      ele.selected = false\n    })\n    curGoodsMap.properties[index1].childsCurGoods[index2].selected = true\n    let skuGoodsPic = this.data.skuGoodsPic\n    if (curGoodsMap.subPics && curGoodsMap.subPics.length > 0) {\n      const _subPic = curGoodsMap.subPics.find(ele => {\n        return ele.optionValueId == curGoodsMap.properties[index1].childsCurGoods[index2].id\n      })\n      if (_subPic) {\n        skuGoodsPic = _subPic.pic\n      }\n    }\n    this.setData({\n      curGoodsMap,\n      skuGoodsPic\n    })\n    this.calculateGoodsPrice()\n  },\n  async calculateGoodsPrice() {\n    const curGoodsMap = this.data.curGoodsMap\n    // 计算最终的商品价格\n    let price = curGoodsMap.basicInfo.minPrice\n    let originalPrice = curGoodsMap.basicInfo.originalPrice\n    let totalScoreToPay = curGoodsMap.basicInfo.minScore\n    let buyNumMax = curGoodsMap.basicInfo.stores\n    let buyNumber = curGoodsMap.basicInfo.minBuyNumber\n    if (this.data.shopType == 'toPingtuan') {\n      price = curGoodsMap.basicInfo.pingtuanPrice\n    }\n    // 计算 sku 价格\n    const canSubmit = this.skuCanSubmit()\n    if (canSubmit) {\n      let propertyChildIds = \"\";\n      if (curGoodsMap.properties) {\n        curGoodsMap.properties.forEach(big => {\n          const small = big.childsCurGoods.find(ele => {\n            return ele.selected\n          })\n          propertyChildIds = propertyChildIds + big.id + \":\" + small.id + \",\"\n        })\n      }\n      const res = await WXAPI.goodsPrice(curGoodsMap.basicInfo.id, propertyChildIds)\n      if (res.code == 0) {\n        price = res.data.price\n        if (this.data.shopType == 'toPingtuan') {\n          price = res.data.pingtuanPrice\n        }\n        originalPrice = res.data.originalPrice\n        totalScoreToPay = res.data.score\n        buyNumMax = res.data.stores\n      }\n    }\n    // 计算时段定价的价格\n    if (this.data.goodsTimesSchedule) {\n      const a = this.data.goodsTimesSchedule.find(ele => ele.active)\n      if (a) {\n        const b = a.items.find(ele => ele.active)\n        if (b) {\n          price = b.price\n          buyNumMax = b.stores\n        }\n      }\n    }\n    // 计算配件价格\n    if (this.data.goodsAddition) {\n      this.data.goodsAddition.forEach(big => {\n        big.items.forEach(small => {\n          if (small.active) {\n            price = (price*100 + small.price*100) / 100\n          }\n        })\n      })\n    }\n    curGoodsMap.price = price\n    this.setData({\n      curGoodsMap,\n      buyNumMax\n    });\n  },\n  async skuClick2(e) {\n    const propertyindex = e.currentTarget.dataset.idx1\n    const propertychildindex = e.currentTarget.dataset.idx2\n\n    const goodsAddition = this.data.goodsAddition\n    const property = goodsAddition[propertyindex]\n    const child = property.items[propertychildindex]\n    if (child.active) {\n      // 该操作为取消选择\n      child.active = false\n      this.setData({\n        goodsAddition\n      })\n      this.calculateGoodsPrice()\n      return\n    }\n    // 单选配件取消所有子栏目选中状态\n    if (property.type == 0) {\n      property.items.forEach(child => {\n        child.active = false\n      })\n    }\n    // 设置当前选中状态\n    child.active = true\n    this.setData({\n      goodsAddition\n    })\n    this.calculateGoodsPrice()\n  },\n  skuCanSubmit() {\n    const curGoodsMap = this.data.curGoodsMap\n    let canSubmit = true\n    if (curGoodsMap.properties) {\n      curGoodsMap.properties.forEach(big => {\n        const small = big.childsCurGoods.find(ele => {\n          return ele.selected\n        })\n        if (!small) {\n          canSubmit = false\n        }\n      })\n    }\n    if (this.data.goodsTimesSchedule) {\n      const a = this.data.goodsTimesSchedule.find(ele => ele.active)\n      if (!a) {\n        canSubmit = false\n      } else {\n        const b = a.items.find(ele => ele.active)\n        if (!b) {\n          canSubmit = false\n        }\n      }\n    }\n    return canSubmit\n  },\n  additionCanSubmit() {\n    const curGoodsMap = this.data.curGoodsMap\n    let canSubmit = true\n    if (curGoodsMap.basicInfo.hasAddition) {\n      this.data.goodsAddition.forEach(ele => {\n        if (ele.required) {\n          const a = ele.items.find(item => {return item.active})\n          if (!a) {\n            canSubmit = false\n          }\n        }\n      })\n    }\n    return canSubmit\n  },\n  async addCart2() {\n    const token = wx.getStorageSync('token')\n    const curGoodsMap = this.data.curGoodsMap\n    const canSubmit = this.skuCanSubmit()\n    const additionCanSubmit = this.additionCanSubmit()\n    if (!canSubmit || !additionCanSubmit) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noSelectSku,\n        icon: 'none'\n      })\n      return\n    }\n    const sku = []\n    if (curGoodsMap.properties) {\n      curGoodsMap.properties.forEach(big => {\n        const small = big.childsCurGoods.find(ele => {\n          return ele.selected\n        })\n        sku.push({\n          optionId: big.id,\n          optionValueId: small.id\n        })\n      })\n    }\n    const goodsAddition = []\n    if (this.data.goodsAddition) {\n      this.data.goodsAddition.forEach(ele => {\n        ele.items.forEach(item => {\n          if (item.active) {\n            goodsAddition.push({\n              id: item.id,\n              pid: item.pid\n            })\n          }\n        })\n      })\n    }\n    wx.showLoading({\n      title: '',\n    })\n    const d = {\n      token,\n      goodsId: curGoodsMap.basicInfo.id,\n      number: curGoodsMap.number,\n      sku: sku && sku.length > 0 ? JSON.stringify(sku) : '',\n      addition: goodsAddition && goodsAddition.length > 0 ? JSON.stringify(goodsAddition) : '',\n    }\n    if (this.data.goodsTimesSchedule) {\n      const a = this.data.goodsTimesSchedule.find(ele => ele.active)\n      if (a) {\n        const b = a.items.find(ele => ele.active)\n        if (b) {\n          d.goodsTimesDay = a.day\n          d.goodsTimesItem = b.name\n        }\n      }\n    }\n    const res = await WXAPI.shippingCarInfoAddItemV2(d)\n    wx.hideLoading()\n    if (res.code == 2000) {\n      this.hideGoodsDetailPOP()\n      AUTH.login(this)\n      return\n    }\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    this.hideGoodsDetailPOP()\n    this.shippingCarInfo()\n  },\n  async cartStepChange(e) {\n    const token = wx.getStorageSync('token')\n    const index = e.currentTarget.dataset.idx\n    const item = this.data.shippingCarInfo.items[index]\n    if (e.detail < 1) {\n      // 删除商品\n      wx.showLoading({\n        title: '',\n      })\n      const res = await WXAPI.shippingCarInfoRemoveItem(token, item.key)\n      wx.hideLoading()\n      if (res.code == 700) {\n        this.setData({\n          shippingCarInfo: null,\n          showCartPop: false\n        })\n      } else if (res.code == 0) {\n        this.setData({\n          shippingCarInfo: res.data\n        })\n      } else {\n        this.setData({\n          shippingCarInfo: null,\n          showCartPop: false\n        })\n      }\n      this.processBadge()\n    } else {\n      // 修改数量\n      wx.showLoading({\n        title: '',\n      })\n      const res = await WXAPI.shippingCarInfoModifyNumber(token, item.key, e.detail)\n      wx.hideLoading()\n      if (res.code != 0) {\n        wx.showToast({\n          title: res.msg,\n          icon: 'none'\n        })\n        return\n      }\n      this.shippingCarInfo()\n    }\n  },\n  goodsStepChange(e) {\n    const curGoodsMap = this.data.curGoodsMap\n    curGoodsMap.number = e.detail\n    this.setData({\n      curGoodsMap\n    })\n  },\n  async clearCart() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.shippingCarInfoRemoveAll(wx.getStorageSync('token'))\n    wx.hideLoading()\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    this.shippingCarInfo()\n  },\n  async showGoodsDetailPOP(e) {\n    const index = e.currentTarget.dataset.idx\n    const goodsId = this.data.goods[index].id\n    this._showGoodsDetailPOP(goodsId)\n    this.goodsAddition(goodsId)\n    this._goodsTimesSchedule(goodsId)\n  },\n  async _showGoodsDetailPOP(goodsId) {\n    const token = wx.getStorageSync('token')\n    const res = await WXAPI.goodsDetail(goodsId)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    wx.hideTabBar()\n    res.data.price = res.data.basicInfo.minPrice\n    res.data.number = res.data.basicInfo.minBuyNumber\n    const _data = {\n      curGoodsMap: res.data,\n      skuGoodsPic: res.data.basicInfo.pic,\n      pingtuan_open_id: null,\n      lijipingtuanbuy: false\n    }\n    if (res.data.basicInfo.pingtuan) {\n      _data.showPingtuanPop = true\n      _data.showGoodsDetailPOP = false\n      // 获取拼团设置\n      const resPintuanSet = await WXAPI.pingtuanSet(goodsId)\n      if (resPintuanSet.code != 0) {\n        _data.showPingtuanPop = false\n        _data.showGoodsDetailPOP = true\n        wx.showToast({\n          title: this.data.$t.index.pingtuanNoOpen,\n          icon: 'none'\n        })\n        return\n      } else {\n        _data.pintuanSet = resPintuanSet.data\n        // 是否是别人分享的团进来的\n        if (this.data.share_goods_id && this.data.share_goods_id == goodsId && this.data.share_pingtuan_open_id) {\n          // 分享进来的\n          _data.pingtuan_open_id = this.data.share_pingtuan_open_id\n        } else {\n          // 不是通过分享进来的\n          const resPintuanOpen = await WXAPI.pingtuanOpen(token, goodsId)\n          if (resPintuanOpen.code == 2000) {\n            AUTH.login(this)\n            return\n          }\n          if (resPintuanOpen.code != 0) {\n            wx.showToast({\n              title: resPintuanOpen.msg,\n              icon: 'none'\n            })\n            return\n          }\n          _data.pingtuan_open_id = resPintuanOpen.data.id\n        }\n        // 读取拼团记录\n        const helpUsers = []\n        for (let i = 0; i < _data.pintuanSet.numberOrder; i++) {\n          helpUsers[i] = '/images/who.png'\n        }\n        _data.helpNumers = 0\n        const resPingtuanJoinUsers = await WXAPI.pingtuanJoinUsers(_data.pingtuan_open_id)\n        if (resPingtuanJoinUsers.code == 700 && this.data.share_pingtuan_open_id) {\n          this.data.share_pingtuan_open_id = null\n          this._showGoodsDetailPOP(goodsId)\n          return\n        }\n        if (resPingtuanJoinUsers.code == 0) {\n          _data.helpNumers = resPingtuanJoinUsers.data.length\n          resPingtuanJoinUsers.data.forEach((ele, index) => {\n            if (_data.pintuanSet.numberOrder > index) {\n              helpUsers.splice(index, 1, ele.apiExtUserHelp.avatarUrl)\n            }\n          })\n        }\n        _data.helpUsers = helpUsers\n      }\n    } else {\n      _data.showPingtuanPop = false\n      _data.showGoodsDetailPOP = true\n    }\n    this.setData(_data)\n  },\n  hideGoodsDetailPOP() {\n    this.setData({\n      showGoodsDetailPOP: false,\n      showPingtuanPop: false\n    })\n    if (!this.data.scanDining) {\n      wx.showTabBar()\n    }\n  },\n  goPay() {\n    if (this.data.scanDining) {\n      // 扫码点餐，前往购物车\n      wx.navigateTo({\n        url: '/pages/cart/index',\n      })\n    } else {\n      wx.navigateTo({\n        url: '/pages/pay/index',\n      })\n    }\n  },\n  onShareAppMessage: function() {\n    let uid = wx.getStorageSync('uid')\n    if (!uid) {\n      uid = ''\n    }\n    let path = '/pages/index/index?inviter_id=' + uid\n    if (this.data.pingtuan_open_id) {\n      path = path + '&share_goods_id=' +  this.data.curGoodsMap.basicInfo.id + '&share_pingtuan_open_id=' +  this.data.pingtuan_open_id\n    }\n    return {\n      title: '\"' + wx.getStorageSync('mallName') + '\" ' + wx.getStorageSync('share_profile'),\n      path\n    }\n  },\n  couponOverlayClick() {\n    this.setData({\n      showCouponPop: false\n    })\n  },\n  couponImageClick() {\n    wx.navigateTo({\n      url: '/pages/coupons/index',\n    })\n  },\n  async noticeLastOne() {\n    const res = await WXAPI.noticeLastOne()\n    if (res.code == 0) {\n      this.setData({\n        noticeLastOne: res.data\n      })\n    }\n  },\n  goNotice(e) {\n    const id = e.currentTarget.dataset.id\n    wx.navigateTo({\n      url: '/pages/notice/detail?id=' + id,\n    })\n  },\n  async banners() {\n    // https://www.yuque.com/apifm/nu0f75/ms21ki\n    const res = await WXAPI.banners({\n      type: 'diancang'\n    })\n    if (res.code == 0) {\n      this.setData({\n        banners: res.data\n      })\n    }\n  },\n  tapBanner(e) {\n    const url = e.currentTarget.dataset.url\n    if (url) {\n      wx.navigateTo({\n        url\n      })\n    }\n  },\n  checkIsOpened(openingHours) {\n    if (!openingHours) {\n      return true\n    }\n    const date = new Date();\n    const startTime = openingHours.split('-')[0]\n    const endTime = openingHours.split('-')[1]\n    const dangqian=date.toLocaleTimeString('chinese',{hour12:false})\n    \n    const dq=dangqian.split(\":\")\n    const a = startTime.split(\":\")\n    const b = endTime.split(\":\")\n\n    const dqdq=date.setHours(dq[0],dq[1])\n    const aa=date.setHours(a[0],a[1])\n    const bb=date.setHours(b[0],b[1])\n\n    if (a[0]*1 > b[0]*1) {\n      // 说明是到第二天\n      return !this.checkIsOpened(endTime + '-' + startTime)\n    }\n    return aa<dqdq && dqdq<bb\n  },\n  yuanjiagoumai() {\n    this.setData({\n      showPingtuanPop: false,\n      showGoodsDetailPOP: true\n    })\n  },\n  _lijipingtuanbuy() {\n    const curGoodsMap = this.data.curGoodsMap\n    curGoodsMap.price = curGoodsMap.basicInfo.pingtuanPrice\n    this.setData({\n      curGoodsMap,\n      showPingtuanPop: false,\n      showGoodsDetailPOP: true,\n      lijipingtuanbuy: true\n    })\n  },\n  pingtuanbuy() {\n    // 加入 storage 里\n    const curGoodsMap = this.data.curGoodsMap\n    const canSubmit = this.skuCanSubmit()\n    const additionCanSubmit = this.additionCanSubmit()\n    if (!canSubmit || !additionCanSubmit) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noSelectSku,\n        icon: 'none'\n      })\n      return\n    }\n    const sku = []\n    if (curGoodsMap.properties) {\n      curGoodsMap.properties.forEach(big => {\n        const small = big.childsCurGoods.find(ele => {\n          return ele.selected\n        })\n        sku.push({\n          optionId: big.id,\n          optionValueId: small.id,\n          optionName: big.name,\n          optionValueName: small.name\n        })\n      })\n    }\n    const additions = []\n    if (curGoodsMap.basicInfo.hasAddition) {\n      this.data.goodsAddition.forEach(ele => {\n        ele.items.forEach(item => {\n          if (item.active) {\n            additions.push({\n              id: item.id,\n              pid: item.pid,\n              pname: ele.name,\n              name: item.name\n            })\n          }\n        })\n      })\n    }\n    const pingtuanGoodsList = []\n    pingtuanGoodsList.push({\n      goodsId: curGoodsMap.basicInfo.id,\n      number: curGoodsMap.number,\n      categoryId: curGoodsMap.basicInfo.categoryId,\n      shopId: curGoodsMap.basicInfo.shopId,\n      price: curGoodsMap.price,\n      score: curGoodsMap.basicInfo.score,\n      pic: curGoodsMap.basicInfo.pic,\n      name: curGoodsMap.basicInfo.name,\n      minBuyNumber: curGoodsMap.basicInfo.minBuyNumber,\n      logisticsId: curGoodsMap.basicInfo.logisticsId,\n      sku,\n      additions\n    })\n    wx.setStorageSync('pingtuanGoodsList', pingtuanGoodsList)\n    // 跳转\n    wx.navigateTo({\n      url: '/pages/pay/index?orderType=buyNow&pingtuanOpenId=' + this.data.pingtuan_open_id,\n    })\n  },\n  _lijipingtuanbuy2() {\n    this.data.share_pingtuan_open_id = null\n    this._showGoodsDetailPOP(this.data.curGoodsMap.basicInfo.id)\n  },\n  async goodsAddition(goodsId){\n    const res = await WXAPI.goodsAddition(goodsId)\n    if (res.code == 0) {\n      this.setData({\n        goodsAddition: res.data\n      })\n    } else {\n      this.setData({\n        goodsAddition: null\n      })\n    }\n  },\n  tabbarChange(e) {\n    if (e.detail == 1) {\n      wx.navigateTo({\n        url: '/pages/cart/index',\n      })\n    }\n    if (e.detail == 2) {\n      wx.navigateTo({\n        url: '/pages/cart/order',\n      })\n    }\n  },\n  // 显示分类和商品数量徽章\n  processBadge() {\n    const categories = this.data.categories\n    const goods = this.data.goods\n    const shippingCarInfo = this.data.shippingCarInfo\n    if (!categories) {\n      return\n    }\n    if (!goods) {\n      return\n    }\n    categories.forEach(ele => {\n      ele.badge = 0\n    })\n    goods.forEach(ele => {\n      ele.badge = 0\n    })\n    if (shippingCarInfo) {\n      shippingCarInfo.items.forEach(ele => {\n        if (ele.categoryId) {\n          const category = categories.find(a => {\n            return a.id == ele.categoryId\n          })\n          if (category) {\n            category.badge += ele.number\n          }\n        }\n        if (ele.goodsId) {\n          const _goods = goods.find(a => {\n            return a.id == ele.goodsId\n          })\n          if (_goods) {\n            _goods.badge += ele.number\n          }\n        }\n      })\n    }\n    this.setData({\n      categories,\n      goods\n    })\n  },\n  selectshop() {\n    wx.navigateTo({\n      url: '/pages/shop/select?type=index',\n    })\n  },\n  goGoodsDetail(e) {\n    const index = e.currentTarget.dataset.idx\n    const goodsId = this.data.goods[index].id\n    wx.navigateTo({\n      url: '/pages/goods-details/index?id=' + goodsId,\n    })\n  },\n  async _goodsTimesSchedule(goodsId) {\n    const res = await WXAPI.goodsTimesSchedule(goodsId, '') // todo sku\n    if (res.code == 0) {\n      const goodsTimesSchedule = res.data\n      res.data.forEach(ele => {\n        ele.active = false\n      })\n      goodsTimesSchedule[0].active = true\n      goodsTimesSchedule[0].items[0].active = true\n      this.setData({\n        goodsTimesSchedule\n      })\n      this.calculateGoodsPrice()\n    } else {\n      this.setData({\n        goodsTimesSchedule: null\n      })\n    }\n  },\n  async skuClick3(e) {\n    const propertyindex = e.currentTarget.dataset.idx1\n    const propertychildindex = e.currentTarget.dataset.idx2\n\n    const goodsTimesSchedule = this.data.goodsTimesSchedule\n    const property = goodsTimesSchedule[propertyindex]\n    const child = property.items[propertychildindex]\n    if (child.stores <= 0) {\n      wx.showToast({\n        title: this.data.$t.goodsDetail.noStores,\n        icon: 'none'\n      })\n      return\n    }\n    goodsTimesSchedule.forEach(a => {\n      a.active = false\n      a.items.forEach(b => {\n        b.active = false\n      })\n    })\n    property.active = true\n    child.active = true\n    this.setData({\n      goodsTimesSchedule\n    })\n    this.calculateGoodsPrice()\n  },\n  changeLang() {\n    getApp().changeLang(this)\n  },\n  waimai() {\n    wx.clearStorageSync()\n    wx.showTabBar()\n    wx.reLaunch({\n      url: '/pages/index/index',\n    })\n  },\n})\n"
  },
  {
    "path": "pages/index/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/index/index.wxml",
    "content": "<!-- 语言切换悬浮按钮 -->\n<view wx:if=\"{{ language }}\" class=\"float-lang-btn\" bind:tap=\"changeLang\">\n  <image class=\"lang-icon\" src=\"/images/lang/{{language}}.png\" mode=\"aspectFill\"></image>\n</view>\n\n<view wx:if=\"{{noticeLastOne}}\" class=\"notice\">\n  <van-notice-bar\n    mode=\"link\"\n    left-icon=\"volume-o\"\n    text=\"{{noticeLastOne.title}}\"\n    bind:click=\"goNotice\"\n    data-id=\"{{noticeLastOne.id}}\"\n  />\n</view>\n<view wx:if=\"{{ !scanDining }}\" class=\"box\">\n  <view class=\"shop-name\">\n    <view class=\"name\" bindtap=\"selectshop\">{{shopInfo.name}}</view>\n    <view wx:if=\"{{ shopInfo.openWaimai && shopInfo.openZiqu }}\" class=\"select\">\n      <view class=\"{{peisongType == 'zq' ? 'on' : 'off'}}\" data-type=\"zq\" bindtap=\"changePeisongType\">{{ $t.index.pickup }}</view>\n      <view class=\"{{peisongType == 'kd' ? 'on' : 'off'}}\" data-type=\"kd\" bindtap=\"changePeisongType\">{{ $t.index.Delivery }}</view>\n    </view>\n  </view>\n  <view class=\"distance-bar\">\n    <view class=\"distance\">{{shopInfo.distance}}km</view>\n    <navigator url=\"/pages/shop/detail?id={{shopInfo.id}}\" hover-class=\"none\">\n      <view class=\"shop-message\">\n        <view class=\"message\">{{ $t.index.shopDetail }}</view>\n        <van-icon name=\"arrow\" />\n      </view>\n    </navigator>\n  </view>\n</view>\n<view class=\"box1\">\n  <view class=\"box-1\">\n    <van-sidebar activeKey=\"{{ currentCategoryIndex }}\">\n      <van-sidebar-item\n        wx:for=\"{{categories}}\" wx:key=\"id\"\n        title=\"{{item.name}}\"\n        badge=\"{{ item.badge ? item.badge : '' }}\"\n        active=\"{{index === currentCategoryIndex}}\"\n        data-idx=\"{{index}}\" bind:click=\"categoryClick\"\n      />\n    </van-sidebar>\n  </view>\n  <scroll-view class=\"box-2\" scroll-y=\"true\" scroll-top=\"{{scrollTop}}\" bindscrolltolower=\"_onReachBottom\" bindscroll=\"onScroll\">\n    <swiper wx:if=\"{{banners}}\" class=\"swiper1\" indicator-dots=\"true\" autoplay circular>\n      <swiper-item wx:for=\"{{banners}}\" wx:key=\"id\">\n        <image  mode=\"aspectFill\" bindtap=\"tapBanner\" data-url=\"{{item.linkUrl}}\" src=\"{{item.picUrl}}\" />\n      </swiper-item>\n    </swiper>\n    <van-empty wx:if=\"{{!goods || goods.length == 0}}\" description=\"{{ $t.common.empty }}\" />\n    <van-card\n      wx:for=\"{{goods}}\" wx:key=\"id\"\n      centered=\"true\"\n      lazy-load=\"true\"\n      origin-price=\"{{ (item.originalPrice > 0 && item.originalPrice != item.minPrice) ? item.originalPrice : '' }}\"\n      price=\"{{item.minPrice}}\"\n      thumb-mode=\"aspectFill\"\n      tag=\"{{ item.badge ? item.badge : '' }}\"\n      title=\"{{item.name}}\"\n      thumb-link=\"/pages/goods-details/index?id={{ item.id }}\"\n      thumb=\"{{item.pic}}\">\n      <view slot=\"desc\">\n        <view wx:if=\"{{ item.miaosha && item.dateStartInt > 0 }}\">\n          <van-count-down class=\"count-downno-start\" time=\"{{ item.dateStartInt }}\" format=\"HH时mm分ss秒\"></van-count-down>\n        </view>\n        <view wx:elif=\"{{ item.miaosha && item.dateStartInt <= 0 && item.dateEndInt > 0 }}\">\n          <van-count-down class=\"count-downno-start\" time=\"{{ item.dateEndInt }}\" format=\"HH时mm分ss秒\"></van-count-down>\n        </view>\n        <view wx:elif=\"{{ item.kanjia }}\">\n          {{ $t.index.minPrice }} {{ item.kanjiaPrice }}\n        </view>\n        <view wx:else>{{ item.characteristic }}</view>\n      </view>\n      <view class=\"goods-btn\" slot=\"footer\">\n        <van-button wx:if=\"{{ item.stores < item.minBuyNumber }}\" size=\"small\" color=\"#e64340\" round disabled>{{ $t.goodsDetail.storeing }}</van-button>\n        <van-button wx:elif=\"{{ item.miaosha && item.dateStartInt > 0 }}\" size=\"small\" color=\"#e64340\" round disabled>{{ $t.index.noStart }}</van-button>\n        <van-button wx:elif=\"{{ item.miaosha && item.dateEndInt <= 0 }}\" size=\"small\" color=\"#e64340\" round disabled>{{ $t.index.miaoshaEnd }}</van-button>\n        <van-button wx:elif=\"{{item.kanjia}}\" size=\"small\" color=\"#e64340\" round data-idx=\"{{index}}\" bind:click=\"goGoodsDetail\">{{ $t.goodsDetail.kanjia }}</van-button>\n        <van-button wx:elif=\"{{item.pingtuan}}\" size=\"small\" color=\"#e64340\" round data-idx=\"{{index}}\" bind:click=\"showGoodsDetailPOP\">{{ $t.index.pingtuan }}</van-button>\n        <van-button wx:elif=\"{{item.propertyIds || item.hasAddition || item.hasGoodsTimes}}\" size=\"small\" color=\"#e64340\" round data-idx=\"{{index}}\" bind:click=\"showGoodsDetailPOP\">{{ $t.index.selectSku }}</van-button>\n        <van-icon wx:else name=\"add\" color=\"#e64340\" size=\"50rpx\" data-idx=\"{{index}}\" bind:click=\"addCart1\" />\n      </view>\n    </van-card>\n  </scroll-view>\n</view>\n\n<view class=\"cart-bar\" wx:if=\"{{shippingCarInfo && shippingCarInfo.number}}\">\n  <view class=\"l\" bindtap=\"showCartPop\">\n    <van-button type=\"default\" round icon=\"shopping-cart-o\">{{ $t.cart.title }}</van-button>\n    <view class=\"badge\">{{shippingCarInfo.number}}</view>\n  </view>  \n  <view class=\"r\">\n    <view class=\"amount\"><text>¥</text>{{shippingCarInfo.price}}</view>\n    <view wx:if=\"{{shopIsOpened}}\" class=\"topay\" bindtap=\"goPay\">{{ $t.index.submit }}</view>\n    <view wx:elif=\"{{ !shopInfo }}\" class=\"topay\" bindtap=\"getshopInfo\">{{ $t.index.selectShop }}</view>\n    <view wx:else class=\"topay noopen\">{{ $t.index.noBusiness }}</view>\n  </view>\n</view>\n\n\n\n<van-popup\n  show=\"{{ showGoodsDetailPOP }}\"\n  custom-style=\"max-height: 80%;z-index:99999;\"\n  closeable\n  close-icon=\"close\"\n  position=\"bottom\"\n  bind:close=\"hideGoodsDetailPOP\">\n  <scroll-view scroll-y=\"true\" class=\"goods-detail-scroll\">\n    <image wx:if=\"{{ showGoodsDetailPOP }}\" mode='aspectFill' class='photos-00' src='{{ skuGoodsPic }}'></image>\n    <view class=\"title-name\">{{curGoodsMap.basicInfo.name}}</view>  \n    <view wx:for=\"{{curGoodsMap.properties}}\" wx:key=\"id\" class=\"content-1\">\n      <view class=\"title\">{{item.name}}</view>\n      <view class=\"box-1\">\n        <view wx:for=\"{{item.childsCurGoods}}\" wx:key=\"id\" wx:for-item=\"small\" wx:for-index=\"index2\" class=\"title-1 {{small.selected?'active':''}}\" data-idx1=\"{{index}}\" data-idx2=\"{{index2}}\" bindtap=\"skuClick\">{{small.name}}</view>\n      </view>\n    </view>\n    <view wx:for=\"{{goodsAddition}}\" wx:key=\"id\" class=\"content-1\">\n      <view class=\"title\">{{item.name}}</view>\n      <view class=\"box-1\">\n        <view wx:for=\"{{item.items}}\" wx:key=\"id\" wx:for-item=\"small\" wx:for-index=\"index2\" class=\"title-1 {{small.active?'active':''}}\" data-idx1=\"{{index}}\" data-idx2=\"{{index2}}\" bindtap=\"skuClick2\">{{small.name}}</view>\n      </view>\n    </view>\n    <view wx:for=\"{{goodsTimesSchedule}}\" wx:key=\"id\" class=\"content-1\">\n      <view class=\"title\">{{item.day}}</view>\n      <view class=\"box-1\">\n        <view wx:for=\"{{item.items}}\" wx:key=\"id\" wx:for-item=\"small\" wx:for-index=\"index2\" class=\"title-1 {{small.active?'active':''}}\" data-idx1=\"{{index}}\" data-idx2=\"{{index2}}\" bindtap=\"skuClick3\">{{small.name}}</view>\n      </view>\n    </view>\n\n    <view wx:if=\"{{curGoodsMap.content}}\" class=\"introduce\">\n      <view class=\"title\">{{ $t.goodsDetail.title }}</view>\n      <view class=\"content\">\n        <parser html=\"{{curGoodsMap.content}}\" />\n      </view>\n    </view>\n\n    <view class=\"blank\"></view>\n    <view class=\"add-bar\">\n      <view class=\"add-box\">\n        <view class=\"price\"><text>¥</text>{{curGoodsMap.price}}</view>\n        <van-stepper value=\"{{ curGoodsMap.number }}\" min=\"{{curGoodsMap.basicInfo.minBuyNumber}}\" max=\"{{ buyNumMax }}\" bind:change=\"goodsStepChange\"/>\n      </view>\n      <view class=\"add-cart\">\n        <van-button wx:if=\"{{lijipingtuanbuy}}\" block color=\"#e64340\" bind:click=\"pingtuanbuy\">{{ $t.index.pingtuan }}</van-button>\n        <van-button wx:else block color=\"#e64340\" bind:click=\"addCart2\">{{ $t.goodsDetail.addCartBtn }}</van-button>\n      </view>\n    </view>\n  </scroll-view>\n</van-popup> \n\n<van-popup\n  show=\"{{ showCartPop }}\"\n  position=\"bottom\"\n  custom-style=\"bottom: 100rpx;max-height: 80%;\"\n  bind:close=\"hideCartPop\">\n  <view class=\"empty-box\" bindtap=\"clearCart\">\n    <van-icon name=\"delete\" />\n    <view class=\"empty-1\">{{ $t.cart.clear }}</view>\n  </view>\n  <view wx:for=\"{{shippingCarInfo.items}}\" wx:key=\"key\" class=\"cart-goods-list\">\n    <view class=\"l\">\n      <view class=\"title\">{{item.name}}</view>\n      <view wx:if=\"{{item.sku}}\" class=\"content\">\n        <block wx:for=\"{{item.sku}}\" wx:key=\"optionValueId\" wx:for-item=\"_sku\">{{_sku.optionValueName}} </block>\n      </view>\n      <view wx:if=\"{{item.additions}}\" class=\"content\">\n        <block wx:for=\"{{item.additions}}\" wx:for-item=\"option\" wx:key=\"index\">{{option.name}} </block>\n      </view>\n      <view wx:if=\"{{item.goodsTimesDay && item.goodsTimesItem}}\" class=\"content\">\n        <block>{{ item.goodsTimesDay }} {{ item.goodsTimesItem }}</block>\n      </view>\n    </view>\n    <view class=\"r\">\n      <view class=\"price\">¥{{ item.price }}</view>\n      <van-stepper value=\"{{ item.number }}\" min=\"0\" async-change disable-input data-idx=\"{{index}}\" bind:change=\"cartStepChange\"/>\n    </view>\n  </view>\n</van-popup>\n\n<van-popup\n  show=\"{{ showPingtuanPop }}\"\n  custom-style=\"max-height: 80%;z-index:99999;\"\n  position=\"bottom\"\n  closeable\n  bind:close=\"hideGoodsDetailPOP\"\n>\n<view class=\"pingtuan-bar\">\n  <image mode='aspectFill' class='photos' src='{{curGoodsMap.basicInfo.pic}}'></image>\n  <view class=\"pingtuan-box\">\n    <view class=\"title\">{{curGoodsMap.basicInfo.name}}</view>\n    <view class=\"price\">\n      <view class=\"xianjia\">¥{{curGoodsMap.basicInfo.pingtuanPrice}}</view>\n      <view wx:if=\"{{curGoodsMap.basicInfo.minPrice > 0 && curGoodsMap.basicInfo.minPrice != curGoodsMap.basicInfo.pingtuanPrice}}\" class=\"yuanjia\">{{ $t.goodsDetail.originalPrice }} ¥{{curGoodsMap.basicInfo.minPrice}}</view>\n    </view>\n    <view class=\"jilu\">{{pintuanSet.numberOrder}}{{ $t.index.p_persion }} / {{ $t.index.p_numsuc }}{{curGoodsMap.basicInfo.numberSells}}</view>\n  </view>\n</view>\n<view wx:if=\"{{pintuanSet.numberOrder > helpNumers}}\" class=\"pingdan-title\">{{ $t.index.remain }}{{pintuanSet.numberOrder - helpNumers}}{{ $t.index.remainToSuccess }}</view>\n<view wx:else class=\"pingdan-title\">{{ $t.index.pingSuccess }}</view>\n<view class=\"pingtuan-photos\">\n  <image wx:for=\"{{helpUsers}}\" wx:key=\"index\" mode='aspectFill' class='photos' src='{{item}}'></image>\n</view>\n<view class=\"botton-box\">\n  <van-button round type=\"default\" bind:click=\"yuanjiagoumai\">{{ $t.index.originalPriceBuy }}</van-button>\n  <van-button wx:if=\"{{pintuanSet.numberOrder > helpNumers}}\" round type=\"default\" color=\"#d3aa79\" bind:click=\"_lijipingtuanbuy\">{{ $t.index.pingtuan }}</van-button>\n  <van-button wx:else round type=\"default\" color=\"#d3aa79\" bind:click=\"_lijipingtuanbuy2\">{{ $t.index.openNewPingtuan }}</van-button>\n</view>\n<van-divider contentPosition=\"center\" dashed>{{ $t.index.pingtuanProcess }}</van-divider>\n<view class=\"liucheng\">\n  <view class=\"liucheng-1\">\n    <image mode='aspectFill' class='icon' src='/images/pay-pingtuan.png'></image>\n    <view class=\"content\">{{ $t.index.step1 }}</view>\n  </view>\n  <view class=\"liucheng-1\">\n    <image mode='aspectFill' class='icon' src='/images/friend.png'></image>\n    <view class=\"content\">{{ $t.index.step2 }}</view>\n  </view>\n  <view class=\"liucheng-1\">\n    <image mode='aspectFill' class='icon' src='/images/quhuo.png'></image>\n    <view class=\"content\">{{ $t.index.step3 }}</view>\n  </view>\n  <view class=\"liucheng-1\">\n    <image mode='aspectFill' class='icon' src='/images/tuikuan.png'></image>\n    <view class=\"content\">{{ $t.index.step4 }}</view>\n  </view>\n</view>\n</van-popup> \n\n<van-overlay show=\"{{ !scanDining && showCouponPop }}\" bind:click=\"couponOverlayClick\">\n  <view class=\"couponOverlay-container\">\n    <image src=\"/images/coupon.png\" bindtap=\"couponImageClick\"></image>\n  </view>\n</van-overlay>\n\n\n<block wx:if=\"{{ scanDining }}\">\n  <van-tabbar active=\"{{ 0 }}\" fixed=\"{{ false }}\" inactive-color=\"#6e6d6b\" active-color=\"#e64340\" bind:change=\"tabbarChange\">\n    <van-tabbar-item icon=\"goods-collect-o\">{{ $t.index.order }}</van-tabbar-item>\n    <van-tabbar-item icon=\"shopping-cart-o\">{{ $t.cart.title }}</van-tabbar-item>\n    <van-tabbar-item icon=\"bill-o\">{{ $t.index.ordered }}</van-tabbar-item>\n  </van-tabbar>\n  <view class=\"float-btn float-kf\" bind:tap=\"waimai\">\n    <van-icon name=\"logistics\" color=\"#e64340\" size=\"52rpx\"/>\n    <text>{{ $t.index.Delivery }}</text>\n  </view>\n</block>"
  },
  {
    "path": "pages/index/index.wxss",
    "content": "page {\n  width: 100vw;\n  height: 100vh;\n  display: flex;\n  flex-direction: column;\n  background: linear-gradient(180deg, #FAF8F5 0%, #FFFFFF 100%);\n}\n\n/* 语言切换悬浮按钮 */\n.float-lang-btn {\n  position: fixed;\n  top: 64rpx;\n  right: 24rpx;\n  z-index: 9999;\n  width: 80rpx;\n  height: 80rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FAFAFA 100%);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.12);\n  border: 3rpx solid rgba(255, 255, 255, 0.8);\n  transition: all 0.3s ease;\n  backdrop-filter: blur(10rpx);\n}\n.float-lang-btn:active {\n  transform: scale(0.92);\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.15);\n}\n.float-lang-btn .lang-icon {\n  width: 48rpx;\n  height: 48rpx;\n  border-radius: 50%;\n}\n\n.notice {\n  margin: 16rpx 24rpx 0;\n  border-radius: 16rpx;\n  overflow: hidden;\n  box-shadow: 0 2rpx 12rpx rgba(192, 154, 107, 0.15);\n}\n.box{\n  height: auto;\n  margin: 20rpx 24rpx 16rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 32rpx;\n  box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.06);\n  position: relative;\n  overflow: hidden;\n}\n.box::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 4rpx;\n  background: linear-gradient(90deg, #C09A6B 0%, #D4A574 50%, #C09A6B 100%);\n}\n.shop-name{\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.shop-name .name{\n  font-size: 38rpx;\n  font-weight: 600;\n  color: #2C2416;\n  flex: 1;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.shop-name .select{\n  display: flex;\n  align-items: center;\n  font-size: 26rpx;\n  width: 196rpx;\n  height: 64rpx;\n  border-radius: 32rpx;\n  background: linear-gradient(135deg, #F5F5F5 0%, #ECECEC 100%);\n  padding: 4rpx;\n  box-shadow: inset 0 2rpx 8rpx rgba(0, 0, 0, 0.06);\n}\n.shop-name .select .on{\n  width: 94rpx;\n  height: 56rpx;\n  background: linear-gradient(135deg, #C09A6B 0%, #D4A574 100%);\n  color: #FFFFFF;\n  border-radius: 28rpx;\n  text-align: center; \n  line-height: 56rpx;\n  font-weight: 600;\n  box-shadow: 0 4rpx 12rpx rgba(192, 154, 107, 0.4);\n  transition: all 0.3s ease;\n}\n.shop-name .select .off{\n  width: 94rpx;\n  height: 56rpx;\n  color: #999999;\n  border-radius: 28rpx;\n  text-align: center; \n  line-height: 56rpx;\n  transition: all 0.3s ease;\n}\n\n.distance-bar{\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 24rpx;\n  padding-top: 24rpx;\n  border-top: 1rpx solid #F0F0F0;\n}\n.distance-bar .distance{\n  font-size: 26rpx;\n  color: #8FB996;\n  font-weight: 500;\n  padding: 8rpx 20rpx;\n  background: linear-gradient(135deg, #F0F9F4 0%, #E8F5ED 100%);\n  border-radius: 20rpx;\n}\n.distance-bar .shop-message{\n  display: flex;\n  align-items: center;\n  color: #666666;\n}\n.distance-bar .shop-message .message{\n  font-size: 26rpx;\n  margin-right: 4rpx;\n}\n.distance-bar .shop-message .go{\n  height: 32rpx;\n  width: 32rpx;\n}\n.box1{\n  flex: 1;\n  display: flex;\n  overflow: hidden;\n  gap: 16rpx;\n  padding: 0 24rpx 24rpx;\n}\n.box1 .box-1{\n  height: 100%;\n  overflow-y: scroll;\n  width: 180rpx;\n  background: #FFFFFF;\n  border-radius: 20rpx;\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);\n}\n\n.box1 .box-2{\n  flex: 1;\n  height: 100%;\n  overflow-y: scroll;\n  background: #FFFFFF;\n  border-radius: 20rpx;\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);\n  padding: 20rpx;\n}\n.swiper1 {\n  width: 100%;\n  height: 260rpx;\n  margin-bottom: 20rpx;\n  border-radius: 16rpx;\n  overflow: hidden;\n}\n.swiper1 image {\n  width: 100%;\n  height: 100%;\n}\n.pay-btn{\n  background-color: #d3aa79 !important;\n  border-style: none !important;\n  \n}\n.price-0{\n  color: #000000 !important;\n}\n.pay-btn-box{\n  background-color:#eeeeee !important;\n}\n.cart-box{\n  background-color:#eeeeee ;\n  margin-left: 50rpx;\n  padding: 18rpx 32rpx;\n  border-radius: 50rpx;\n}\n.goods-detail-scroll {\n  max-height: 80vh;\n  height: auto;\n}\n.photos-00{\n  height: 320rpx;\n  width: 320rpx;\n  border-radius: 24rpx;\n  margin: 40rpx auto 0;\n  display: block;\n  box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.15);\n  border: 8rpx solid #FFFFFF;\n}\n.title-name{\n  margin: 32rpx 40rpx 0;\n  font-size: 36rpx;\n  font-weight: 600;\n  color: #2C2416;\n  text-align: center;\n}\n.content-1{\n  margin: 40rpx 32rpx 0;\n  padding: 28rpx;\n  background: linear-gradient(135deg, #FAF8F5 0%, #FFFFFF 100%);\n  border-radius: 20rpx;\n}\n.content-1 .title{\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #2C2416;\n  margin-bottom: 20rpx;\n  position: relative;\n  padding-left: 20rpx;\n}\n.content-1 .title::before {\n  content: '';\n  position: absolute;\n  left: 0;\n  top: 50%;\n  transform: translateY(-50%);\n  width: 6rpx;\n  height: 28rpx;\n  background: linear-gradient(180deg, #C09A6B 0%, #D4A574 100%);\n  border-radius: 3rpx;\n}\n.content-1 .box-1{\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  font-size: 28rpx;\n  gap: 16rpx;\n}\n.content-1 .box-1 .title-1{\n  background: #FFFFFF;\n  padding: 16rpx 28rpx;\n  border-radius: 40rpx;\n  border: 2rpx solid #E8E8E8;\n  color: #666666;\n  font-size: 28rpx;\n  transition: all 0.3s ease;\n  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);\n}\n.content-1 .box-1 .title-1.active{\n  background: linear-gradient(135deg, #C09A6B 0%, #D4A574 100%);\n  color: #FFFFFF;\n  border-color: #C09A6B;\n  font-weight: 600;\n  box-shadow: 0 6rpx 20rpx rgba(192, 154, 107, 0.35);\n  transform: translateY(-2rpx);\n}\n.introduce{\n  font-size: 28rpx;\n  margin: 40rpx 32rpx;\n  padding: 28rpx;\n  background: linear-gradient(135deg, #FAF8F5 0%, #FFFFFF 100%);\n  border-radius: 20rpx;\n  color: #666666;\n  line-height: 1.8;\n}\n.introduce .title {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #2C2416;\n  margin-bottom: 20rpx;\n}\n.introduce .content{\n  margin-top: 16rpx;\n}\n.blank{\n  background: linear-gradient(90deg, #F5F5F5 0%, #EEEEEE 50%, #F5F5F5 100%);\n  height: 16rpx;\n  margin: 20rpx 0;\n}\n.add-box{\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin: 40rpx 32rpx;\n  padding: 32rpx;\n  background: linear-gradient(135deg, #FAF8F5 0%, #FFFFFF 100%);\n  border-radius: 20rpx;\n  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);\n}\n.add-box .price {\n  color: #C09A6B;\n  font-size: 56rpx;\n  font-weight: 700;\n  letter-spacing: 1rpx;\n}\n.add-box .price text {\n  color: #C09A6B;\n  font-size: 32rpx;\n  margin-right: 4rpx;\n}\n.add-box .plus{\n  border-radius: 50rpx;\n  background: linear-gradient(135deg, #C09A6B 0%, #D4A574 100%);\n  color: #FFFFFF;\n  box-shadow: 0 4rpx 16rpx rgba(192, 154, 107, 0.3);\n}\n.add-box .minus{\n  border-radius: 50rpx;\n  background: #F5F5F5;\n  color: #999999;\n}\n.add-box .input{\n  background: #FFFFFF;\n  border: 2rpx solid #E8E8E8;\n  border-radius: 12rpx;\n  font-weight: 600;\n  color: #2C2416;\n}\n.add-cart{\n  padding: 0 32rpx 40rpx;\n}\n.add-cart .van-button {\n  height: 88rpx;\n  border-radius: 44rpx;\n  font-size: 34rpx;\n  font-weight: 600;\n  letter-spacing: 4rpx;\n  box-shadow: 0 8rpx 24rpx rgba(192, 154, 107, 0.4);\n}\n.empty-box{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 24rpx;\n  margin: 20rpx;\n  background: linear-gradient(135deg, #FFF5F5 0%, #FFE8E8 100%);\n  border-radius: 16rpx;\n  border: 2rpx dashed #FFCCCC;\n}\n.empty-box .empty-0{\n  height: 32rpx;\n  width: 32rpx;\n}\n.empty-box .empty-1{\n  font-size: 28rpx;\n  margin-left: 12rpx;\n  color: #FF6B6B;\n  font-weight: 500;\n}\n\n.pingtuan-bar{\n  margin: 40rpx 32rpx;\n  padding: 32rpx;\n  display: flex;\n  align-items: center;\n  background: linear-gradient(135deg, #FAF8F5 0%, #FFFFFF 100%);\n  border-radius: 24rpx;\n  box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08);\n}\n.pingtuan-bar .photos{\n  height: 160rpx;\n  width: 160rpx;\n  border-radius: 20rpx;\n  box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.12);\n  border: 6rpx solid #FFFFFF;\n}\n.pingtuan-bar .pingtuan-box{\n  flex: 1;\n  margin-left: 28rpx;\n}\n.pingtuan-bar .pingtuan-box .title{\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #2C2416;\n  line-height: 1.4;\n}\n.pingtuan-bar .pingtuan-box .price{\n  display: flex;\n  align-items: center;\n  margin-top: 16rpx;\n}\n.pingtuan-bar .pingtuan-box .price .xianjia{\n  color: #C09A6B;\n  font-size: 40rpx;\n  font-weight: 700;\n}\n.pingtuan-bar .pingtuan-box .price .yuanjia{\n  font-size: 24rpx;\n  margin-left: 16rpx;\n  color: #999999;\n  text-decoration: line-through;\n}\n.pingtuan-bar .pingtuan-box .jilu{\n  font-size: 24rpx;\n  margin-top: 12rpx;\n  color: #999999;\n}\n.pingdan-title{\n  font-size: 40rpx;\n  font-weight: 700;\n  text-align: center;\n  color: #2C2416;\n  margin: 32rpx 0;\n  letter-spacing: 2rpx;\n}\n.pingtuan-photos{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin: 48rpx 0;\n  gap: 20rpx;\n}\n.pingtuan-photos .photos{\n  width: 96rpx;\n  height: 96rpx;\n  border-radius: 50%;\n  border: 4rpx solid #FFFFFF;\n  box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.12);\n}\n.botton-box{\n  display: flex;\n  justify-content: center;\n  gap: 24rpx;\n  margin: 40rpx 32rpx;\n}\n.botton-box .van-button {\n  height: 80rpx;\n  border-radius: 40rpx;\n  font-size: 30rpx;\n  font-weight: 600;\n  padding: 0 48rpx;\n  box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.1);\n}\n.liucheng{\n  margin: 32rpx;\n  padding: 40rpx 20rpx;\n  display: flex;\n  justify-content: space-around;\n  background: linear-gradient(135deg, #FAF8F5 0%, #FFFFFF 100%);\n  border-radius: 20rpx;\n}\n.liucheng .liucheng-1{\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  flex: 1;\n}\n.liucheng .liucheng-1 .icon{\n  width: 72rpx;\n  height: 72rpx;\n  padding: 16rpx;\n  background: linear-gradient(135deg, #FFF8F0 0%, #FFE8CC 100%);\n  border-radius: 50%;\n  box-shadow: 0 4rpx 16rpx rgba(192, 154, 107, 0.2);\n}\n.liucheng .liucheng-1 .content{\n  font-size: 24rpx;\n  margin-top: 16rpx;\n  color: #666666;\n  text-align: center;\n}\n\n\n.goods-btn {\n  position: absolute;\n  right: 20rpx;\n  bottom: 20rpx;\n}\n.cart-bar {\n  width: 100vw;\n  height: 120rpx;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.95) 20%, rgba(255,255,255,0.98) 100%);\n  backdrop-filter: blur(20rpx);\n  z-index: 99999;\n  padding: 0 24rpx;\n  box-shadow: 0 -4rpx 24rpx rgba(0, 0, 0, 0.08);\n}\n.cart-bar .l {\n  position: relative;\n  transform: scale(1.1);\n  transition: transform 0.3s ease;\n}\n.cart-bar .r {\n  display: flex;\n  align-items: center;\n  height: 100%;\n  gap: 24rpx;\n}\n.cart-bar .r .amount {\n  color: #C09A6B;\n  font-size: 52rpx;\n  font-weight: 700;\n  letter-spacing: 1rpx;\n}\n.cart-bar .r .amount text {\n  color: #C09A6B;\n  font-size: 28rpx;\n  margin-right: 4rpx;\n}\n.cart-bar .r .topay {\n  width: 220rpx;\n  height: 80rpx;\n  background: linear-gradient(135deg, #C09A6B 0%, #D4A574 100%);\n  color: #FFFFFF;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 40rpx;\n  font-size: 32rpx;\n  font-weight: 600;\n  box-shadow: 0 8rpx 24rpx rgba(192, 154, 107, 0.4);\n  letter-spacing: 2rpx;\n}\n.cart-bar .r .topay.noopen {\n  background: linear-gradient(135deg, #CCCCCC 0%, #AAAAAA 100%);\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.15);\n}\n.badge {\n  top: 16rpx !important;\n  right: 28rpx !important;\n  background: linear-gradient(135deg, #FF6B6B 0%, #FF5252 100%) !important;\n  box-shadow: 0 4rpx 12rpx rgba(255, 107, 107, 0.4);\n  font-weight: 600;\n}\n.cart-goods-list {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 28rpx 32rpx;\n  margin: 0 20rpx 16rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FAFAFA 100%);\n  border-radius: 16rpx;\n  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04);\n  border: 1rpx solid #F5F5F5;\n}\n.cart-goods-list .r {\n  display: flex;\n  align-items: center;\n  gap: 24rpx;\n}\n.cart-goods-list .title{\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #2C2416;\n  margin-bottom: 8rpx;\n}\n.cart-goods-list .content{\n  font-size: 24rpx;\n  color: #999999;\n  margin-top: 4rpx;\n}\n.cart-goods-list .price{\n  font-size: 28rpx;\n  color: #C09A6B;\n  font-weight: 600;\n}\n.couponOverlay-container {\n  width: 100vw;\n  height: 100vh;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.couponOverlay-container image {\n  width: 240rpx;\n  height: 240rpx;\n  margin: auto;\n}\n.count-downno-start .van-count-down {\n  color: #ed6a0c;\n  padding: 8rpx 0;\n}\n.float-btn {\n  position: fixed;\n  right: 32rpx;\n  bottom: 400rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FAFAFA 100%);\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  border-radius: 50%;\n  padding: 16rpx;\n  width: 112rpx;\n  height: 112rpx;\n  font-size: 24rpx;\n  color: #C09A6B;\n  font-weight: 600;\n  box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.15);\n  border: 2rpx solid #FFFFFF;\n  transition: all 0.3s ease;\n}\n.float-btn:active {\n  transform: scale(0.95);\n}\n\n/* Van-card 商品卡片样式覆盖 */\n.van-card {\n  margin-bottom: 20rpx !important;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FAFAFA 100%) !important;\n  border-radius: 20rpx !important;\n  overflow: hidden !important;\n  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06) !important;\n  padding: 20rpx !important;\n  border: 1rpx solid #F5F5F5 !important;\n}\n.van-card__thumb {\n  width: 180rpx !important;\n  height: 180rpx !important;\n  border-radius: 16rpx !important;\n  overflow: hidden !important;\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08) !important;\n}\n.van-card__title {\n  font-size: 32rpx !important;\n  font-weight: 600 !important;\n  color: #2C2416 !important;\n  line-height: 1.4 !important;\n  margin-bottom: 8rpx !important;\n}\n.van-card__desc {\n  font-size: 24rpx !important;\n  color: #999999 !important;\n  margin-top: 8rpx !important;\n}\n.van-card__price {\n  font-size: 40rpx !important;\n  font-weight: 700 !important;\n  color: #C09A6B !important;\n}\n.van-card__origin-price {\n  font-size: 24rpx !important;\n  color: #CCCCCC !important;\n}\n.van-card__tag {\n  background: linear-gradient(135deg, #FF6B6B 0%, #FF5252 100%) !important;\n  color: #FFFFFF !important;\n  border-radius: 8rpx 0 16rpx 0 !important;\n  font-size: 22rpx !important;\n  padding: 8rpx 16rpx !important;\n  font-weight: 600 !important;\n  box-shadow: 0 4rpx 12rpx rgba(255, 107, 107, 0.3);\n}\n\n\n\n/* Van-button 按钮样式覆盖 */\n.van-button--round {\n  border-radius: 40rpx !important;\n}\n.van-button--small {\n  height: 60rpx !important;\n  padding: 0 32rpx !important;\n  font-size: 26rpx !important;\n  font-weight: 600 !important;\n}\n\n/* Van-notice-bar 通知栏样式 */\n.van-notice-bar {\n  background: linear-gradient(135deg, #FFF8F0 0%, #FFE8CC 100%) !important;\n  color: #C09A6B !important;\n  border-radius: 0 !important;\n  font-size: 26rpx !important;\n}\n\n/* Van-popup 弹窗样式覆盖 */\n.van-popup {\n  border-radius: 32rpx 32rpx 0 0 !important;\n  overflow: hidden !important;\n}\n.van-popup--bottom {\n  background: linear-gradient(180deg, #FFFFFF 0%, #FAF8F5 100%) !important;\n}\n\n/* Van-stepper 步进器样式覆盖 */\n.van-stepper__input {\n  background: #F5F5F5 !important;\n  border-radius: 12rpx !important;\n  font-weight: 600 !important;\n  color: #2C2416 !important;\n}\n.van-stepper__plus, .van-stepper__minus {\n  background: linear-gradient(135deg, #C09A6B 0%, #D4A574 100%) !important;\n  color: #FFFFFF !important;\n  border-radius: 50% !important;\n  width: 56rpx !important;\n  height: 56rpx !important;\n  box-shadow: 0 4rpx 12rpx rgba(192, 154, 107, 0.3) !important;\n}\n.van-stepper__minus {\n  background: #F5F5F5 !important;\n  color: #999999 !important;\n  box-shadow: none !important;\n}\n\n/* Van-icon 图标颜色覆盖 */\n.van-icon--add {\n  background: linear-gradient(135deg, #C09A6B 0%, #D4A574 100%);\n  border-radius: 50%;\n  padding: 8rpx;\n  box-shadow: 0 6rpx 20rpx rgba(192, 154, 107, 0.4);\n}\n\n/* Van-empty 空状态样式 */\n.van-empty__description {\n  color: #999999 !important;\n  font-size: 28rpx !important;\n}"
  },
  {
    "path": "pages/member-center/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n  \n}\n\nPage({\n  data: {\n    totleConsumed: 0\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.vip.title,\n    })\n    this.userLevelList()\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n    getApp().getUserDetailOK = (apiUserInfoMap) => {\n      this.processGotUserDetail(apiUserInfoMap)\n    }\n  },\n  onShow: function () {\n  },\n  async processGotUserDetail(apiUserInfoMap) {\n    if (!apiUserInfoMap) {\n      return\n    }\n    this.setData({\n      apiUserInfoMap\n    })\n    this.userAmount()\n  },\n  async userAmount() {\n    // https://www.yuque.com/apifm/nu0f75/wrqkcb\n    const res = await WXAPI.userAmount(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        totleConsumed: res.data.totleConsumed\n      });\n    }\n  },\n  async userLevelList() {\n    // https://www.yuque.com/apifm/nu0f75/fsh4gu\n    const res = await WXAPI.userLevelList()\n    if (res.code == 0) {\n      this.setData({\n        levelList: res.data.result\n      });\n    }\n  },\n})"
  },
  {
    "path": "pages/member-center/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/member-center/index.wxml",
    "content": "<view class=\"member-container\">\n  <!-- 顶部装饰波浪 -->\n  <view class=\"top-wave\"></view>\n  \n  <!-- 会员卡片 -->\n  <view class=\"member-card\">\n    <view class=\"card-bg-decoration\"></view>\n    <view class=\"card-content\">\n      <view class=\"user-info\">\n        <view class=\"avatar-box\">\n          <image mode='aspectFill' class='avatar' src='{{apiUserInfoMap.base.avatarUrl}}'></image>\n          <view class=\"avatar-ring\"></view>\n        </view>\n        <view class=\"user-detail\">\n          <view class=\"user-name\">{{apiUserInfoMap.base.nick}}</view>\n          <view class=\"user-consumption\">\n            <text class=\"consumption-label\">{{ $t.vip.consumption }}</text>\n            <text class=\"consumption-value\">￥{{totleConsumed}}</text>\n          </view>\n        </view>\n      </view>\n      \n      <view class=\"member-level-box\">\n        <view wx:if=\"{{apiUserInfoMap.userLevel}}\" class=\"level-badge\">\n          <text class=\"level-icon\">👑</text>\n          <text class=\"level-name\">{{apiUserInfoMap.userLevel.name}}</text>\n        </view>\n        <view wx:else class=\"level-badge level-normal\">\n          <text class=\"level-icon\">✨</text>\n          <text class=\"level-name\">{{ $t.vip.notVIP }}</text>\n        </view>\n        <view class=\"level-tip\">{{ $t.vip.tip }}</view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 会员权益说明 -->\n  <view class=\"benefits-section\">\n    <view class=\"section-header\">\n      <view class=\"header-line\"></view>\n      <view class=\"section-title\">{{ $t.vip.growth }}</view>\n      <view class=\"header-line\"></view>\n    </view>\n\n    <!-- 表头 -->\n    <view class=\"benefits-table-header\">\n      <view class=\"table-header-item\">{{ $t.vip.growthName }}</view>\n      <view class=\"table-header-item\">{{ $t.vip.growthDiscount }}</view>\n      <view class=\"table-header-item\">{{ $t.vip.growthConsumption }}</view>\n    </view>\n\n    <!-- 等级列表卡片 -->\n    <view class=\"level-cards\">\n      <view wx:for=\"{{levelList}}\" wx:key=\"id\" class=\"level-card-item\">\n        <view class=\"level-card-bg\"></view>\n        <view class=\"level-info\">\n          <view class=\"level-col\">\n            <view class=\"level-label\">等级</view>\n            <view class=\"level-value level-name-text\">{{item.name}}</view>\n          </view>\n          <view class=\"level-col level-col-highlight\">\n            <view class=\"level-label\">折扣</view>\n            <view class=\"level-value discount-text\">{{item.rebate}}</view>\n          </view>\n          <view class=\"level-col\">\n            <view class=\"level-label\">消费额</view>\n            <view class=\"level-value\">￥{{item.upgradeAmount}}</view>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 底部说明 -->\n  <view class=\"footer-remark\">\n    <view class=\"remark-icon\">ℹ️</view>\n    <view class=\"remark-text\">{{ $t.vip.profile }}</view>\n  </view>\n</view>"
  },
  {
    "path": "pages/member-center/index.wxss",
    "content": "/* 页面容器 */\r\n.member-container {\r\n  min-height: 100vh;\r\n  background: linear-gradient(180deg, #FFF5EB 0%, #FFFFFF 100%);\r\n  padding-bottom: 40rpx;\r\n}\r\n\r\n/* 顶部装饰波浪 */\r\n.top-wave {\r\n  height: 120rpx;\r\n  background: linear-gradient(135deg, #E8C4A0 0%, #D4A574 100%);\r\n  border-radius: 0 0 50% 50%;\r\n  position: relative;\r\n}\r\n\r\n/* 会员卡片 */\r\n.member-card {\r\n  margin: -60rpx 30rpx 0;\r\n  background: linear-gradient(135deg, #E8C4A0 0%, #D4A574 50%, #C89968 100%);\r\n  border-radius: 24rpx;\r\n  padding: 40rpx 30rpx;\r\n  box-shadow: 0 16rpx 40rpx rgba(212, 165, 116, 0.3);\r\n  position: relative;\r\n  overflow: hidden;\r\n}\r\n\r\n/* 卡片背景装饰 */\r\n.card-bg-decoration {\r\n  position: absolute;\r\n  top: -50rpx;\r\n  right: -50rpx;\r\n  width: 300rpx;\r\n  height: 300rpx;\r\n  background: radial-gradient(circle, rgba(255, 255, 255, 0.15) 0%, transparent 70%);\r\n  border-radius: 50%;\r\n}\r\n\r\n.card-content {\r\n  position: relative;\r\n  z-index: 1;\r\n}\r\n\r\n/* 用户信息区域 */\r\n.user-info {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 40rpx;\r\n}\r\n\r\n/* 头像盒子 */\r\n.avatar-box {\r\n  position: relative;\r\n  margin-right: 24rpx;\r\n}\r\n\r\n.avatar {\r\n  width: 120rpx;\r\n  height: 120rpx;\r\n  border-radius: 50%;\r\n  border: 4rpx solid rgba(255, 255, 255, 0.9);\r\n  box-shadow: 0 8rpx 20rpx rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.avatar-ring {\r\n  position: absolute;\r\n  top: -6rpx;\r\n  left: -6rpx;\r\n  width: 132rpx;\r\n  height: 132rpx;\r\n  border-radius: 50%;\r\n  border: 2rpx solid rgba(255, 255, 255, 0.5);\r\n}\r\n\r\n/* 用户详情 */\r\n.user-detail {\r\n  flex: 1;\r\n}\r\n\r\n.user-name {\r\n  font-size: 36rpx;\r\n  font-weight: 700;\r\n  color: #FFFFFF;\r\n  margin-bottom: 12rpx;\r\n  text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.user-consumption {\r\n  display: flex;\r\n  align-items: baseline;\r\n  font-size: 26rpx;\r\n  color: rgba(255, 255, 255, 0.95);\r\n}\r\n\r\n.consumption-label {\r\n  margin-right: 8rpx;\r\n}\r\n\r\n.consumption-value {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #FFF;\r\n}\r\n\r\n/* 会员等级盒子 */\r\n.member-level-box {\r\n  text-align: center;\r\n  padding-top: 30rpx;\r\n  border-top: 1rpx solid rgba(255, 255, 255, 0.3);\r\n}\r\n\r\n.level-badge {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  background: rgba(255, 255, 255, 0.25);\r\n  backdrop-filter: blur(10rpx);\r\n  padding: 16rpx 40rpx;\r\n  border-radius: 50rpx;\r\n  margin-bottom: 16rpx;\r\n}\r\n\r\n.level-icon {\r\n  font-size: 40rpx;\r\n  margin-right: 12rpx;\r\n}\r\n\r\n.level-name {\r\n  font-size: 38rpx;\r\n  font-weight: 700;\r\n  color: #FFFFFF;\r\n  text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.level-normal {\r\n  background: rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n.level-tip {\r\n  font-size: 24rpx;\r\n  color: rgba(255, 255, 255, 0.9);\r\n  line-height: 1.6;\r\n}\r\n\r\n/* 权益说明区域 */\r\n.benefits-section {\r\n  margin: 40rpx 30rpx;\r\n}\r\n\r\n/* 区域标题 */\r\n.section-header {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-bottom: 32rpx;\r\n}\r\n\r\n.header-line {\r\n  width: 80rpx;\r\n  height: 2rpx;\r\n  background: linear-gradient(90deg, transparent 0%, #D4A574 100%);\r\n}\r\n\r\n.header-line:last-child {\r\n  background: linear-gradient(90deg, #D4A574 0%, transparent 100%);\r\n}\r\n\r\n.section-title {\r\n  font-size: 36rpx;\r\n  font-weight: 700;\r\n  color: #8B5A3C;\r\n  margin: 0 20rpx;\r\n  position: relative;\r\n}\r\n\r\n/* 表头 */\r\n.benefits-table-header {\r\n  display: flex;\r\n  background: linear-gradient(135deg, #D4A574 0%, #C89968 100%);\r\n  border-radius: 16rpx 16rpx 0 0;\r\n  padding: 24rpx 20rpx;\r\n  box-shadow: 0 4rpx 12rpx rgba(212, 165, 116, 0.2);\r\n}\r\n\r\n.table-header-item {\r\n  flex: 1;\r\n  text-align: center;\r\n  font-size: 28rpx;\r\n  font-weight: 600;\r\n  color: #FFFFFF;\r\n}\r\n\r\n/* 等级卡片列表 */\r\n.level-cards {\r\n  background: #FFFFFF;\r\n  border-radius: 0 0 16rpx 16rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n.level-card-item {\r\n  position: relative;\r\n  border-bottom: 1rpx solid #F5F5F5;\r\n  overflow: hidden;\r\n}\r\n\r\n.level-card-item:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n.level-card-item:nth-child(odd) {\r\n  background: linear-gradient(90deg, #FFFBF7 0%, #FFFFFF 100%);\r\n}\r\n\r\n/* 等级卡片背景装饰 */\r\n.level-card-bg {\r\n  position: absolute;\r\n  right: -20rpx;\r\n  top: 50%;\r\n  transform: translateY(-50%);\r\n  width: 120rpx;\r\n  height: 120rpx;\r\n  background: radial-gradient(circle, rgba(212, 165, 116, 0.05) 0%, transparent 70%);\r\n  border-radius: 50%;\r\n}\r\n\r\n.level-info {\r\n  display: flex;\r\n  padding: 32rpx 20rpx;\r\n  position: relative;\r\n  z-index: 1;\r\n}\r\n\r\n.level-col {\r\n  flex: 1;\r\n  text-align: center;\r\n}\r\n\r\n.level-col-highlight {\r\n  position: relative;\r\n}\r\n\r\n.level-col-highlight::before {\r\n  content: '';\r\n  position: absolute;\r\n  left: 50%;\r\n  top: 50%;\r\n  transform: translate(-50%, -50%);\r\n  width: 140rpx;\r\n  height: 100rpx;\r\n  background: linear-gradient(135deg, rgba(255, 193, 7, 0.1) 0%, rgba(255, 152, 0, 0.1) 100%);\r\n  border-radius: 12rpx;\r\n  z-index: -1;\r\n}\r\n\r\n.level-label {\r\n  font-size: 22rpx;\r\n  color: #999999;\r\n  margin-bottom: 8rpx;\r\n}\r\n\r\n.level-value {\r\n  font-size: 30rpx;\r\n  font-weight: 600;\r\n  color: #333333;\r\n}\r\n\r\n.level-name-text {\r\n  color: #8B5A3C;\r\n  font-weight: 700;\r\n}\r\n\r\n.discount-text {\r\n  font-size: 36rpx;\r\n  color: #FF9800;\r\n  font-weight: 700;\r\n}\r\n\r\n/* 底部说明 */\r\n.footer-remark {\r\n  margin: 40rpx 30rpx;\r\n  padding: 24rpx 30rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 16rpx;\r\n  border-left: 6rpx solid #D4A574;\r\n  box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);\r\n  display: flex;\r\n  align-items: flex-start;\r\n}\r\n\r\n.remark-icon {\r\n  font-size: 32rpx;\r\n  margin-right: 12rpx;\r\n  line-height: 1;\r\n}\r\n\r\n.remark-text {\r\n  flex: 1;\r\n  font-size: 24rpx;\r\n  color: #666666;\r\n  line-height: 1.8;\r\n}\r\n\r\n"
  },
  {
    "path": "pages/my/feedback.js",
    "content": "const WXAPI = require('apifm-wxapi')\n\nPage({\n  data: {\n    autosize: {\n      minHeight: 100\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function(options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.feedback.title,\n    })\n  },\n  onShow: function() {\n  },\n  async bindSave() {    \n    if (!this.data.name) {\n      wx.showToast({\n        title: this.data.$t.feedback.nameRequired,\n        icon: 'none',\n      })\n      return\n    }\n    if (!this.data.content) {\n      wx.showToast({\n        title: this.data.$t.feedback.contentRequired,\n        icon: 'none',\n      })\n      return\n    }\n    const extJsonStr = {}\n    extJsonStr['姓名'] = this.data.name\n    extJsonStr['联系电话'] = this.data.mobile || ''\n\n    // 批量上传附件\n    if (this.data.picsList) {\n      for (let index = 0; index < this.data.picsList.length; index++) {\n        const pic = this.data.picsList[index];\n        const res = await WXAPI.uploadFileV2(wx.getStorageSync('token'), pic.url)\n        if (res.code == 0) {\n          extJsonStr['file' + index] = res.data.url\n        }\n      }\n    }\n\n    const res = await WXAPI.addComment({\n      token: wx.getStorageSync('token'),\n      type: 1,\n      extJsonStr: JSON.stringify(extJsonStr),\n      content: this.data.content\n    })\n    if (res.code == 0) {\n      wx.showToast({\n        title: this.data.$t.common.submitSuccess,\n      })\n      setTimeout(() => {\n        wx.navigateBack({\n          delta: 0,\n        })\n      }, 1000);\n    } else {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    }\n  },\n  afterPicRead(e) {\n    let picsList = this.data.picsList\n    if (!picsList) {\n      picsList = []\n    }\n    picsList = picsList.concat(e.detail.file)\n    this.setData({\n      picsList\n    })\n  },\n  afterPicDel(e) {\n    let picsList = this.data.picsList\n    picsList.splice(e.detail.index, 1)\n    this.setData({\n      picsList\n    })\n  }\n})"
  },
  {
    "path": "pages/my/feedback.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/my/feedback.wxml",
    "content": "<view class=\"feedback-container\">\n  <!-- 顶部装饰波浪 -->\n  <view class=\"header-wave\"></view>\n  \n  <!-- 页面标题区域 -->\n  <view class=\"feedback-header\">\n    <view class=\"header-icon\">💭</view>\n    <view class=\"header-title\">听听您的心声</view>\n    <view class=\"header-subtitle\">您的每一条建议都是我们前进的动力</view>\n  </view>\n\n  <!-- 表单卡片 -->\n  <view class=\"feedback-card\">\n    <!-- 姓名输入 -->\n    <view class=\"input-section\">\n      <view class=\"input-label\">\n        <view class=\"label-icon\">👤</view>\n        <view class=\"label-text\">{{ $t.feedback.name }}</view>\n      </view>\n      <van-field\n        placeholder=\"{{ $t.feedback.namePlaceholder }}\"\n        model:value=\"{{ name }}\"\n        clearable\n        border=\"{{ false }}\"\n        custom-class=\"custom-field\"\n      />\n    </view>\n\n    <!-- 分割线 -->\n    <view class=\"divider\"></view>\n\n    <!-- 手机号输入 -->\n    <view class=\"input-section\">\n      <view class=\"input-label\">\n        <view class=\"label-icon\">📱</view>\n        <view class=\"label-text\">{{ $t.feedback.mobile }}</view>\n      </view>\n      <van-field\n        placeholder=\"{{ $t.feedback.mobilePlaceholder }}\"\n        type=\"number\"\n        model:value=\"{{ mobile }}\"\n        clearable\n        border=\"{{ false }}\"\n        custom-class=\"custom-field\"\n      />\n    </view>\n\n    <!-- 分割线 -->\n    <view class=\"divider\"></view>\n\n    <!-- 反馈内容 -->\n    <view class=\"input-section content-section\">\n      <view class=\"input-label\">\n        <view class=\"label-icon\">✍️</view>\n        <view class=\"label-text\">反馈内容</view>\n      </view>\n      <van-field\n        model:value=\"{{ content }}\"\n        placeholder=\"{{ $t.feedback.contentPlaceholder }}\"\n        type=\"textarea\"\n        autosize=\"{{ autosize }}\"\n        border=\"{{ false }}\"\n        custom-class=\"custom-textarea\"\n      />\n    </view>\n\n    <!-- 图片上传区域 -->\n    <view class=\"upload-section\">\n      <view class=\"input-label\">\n        <view class=\"label-icon\">📷</view>\n        <view class=\"label-text\">{{ $t.feedback.imageOrVideo }}</view>\n        <view class=\"label-tip\">(选填)</view>\n      </view>\n      <view class=\"uploader-wrapper\">\n        <van-uploader\n          accept=\"media\"\n          multiple\n          max-count=\"6\"\n          image-fit=\"aspectFill\"\n          file-list=\"{{ picsList }}\"\n          bind:after-read=\"afterPicRead\"\n          bind:delete=\"afterPicDel\"\n        />\n      </view>\n    </view>\n  </view>\n\n  <!-- 温馨提示卡片 -->\n  <view class=\"tips-card\">\n    <view class=\"tips-icon\">💡</view>\n    <view class=\"tips-content\">\n      <view class=\"tips-title\">温馨提示</view>\n      <view class=\"tips-text\">我们会认真对待每一条反馈，并在24小时内给予回复</view>\n    </view>\n  </view>\n\n  <!-- 提交按钮 -->\n  <view class=\"submit-wrapper\">\n    <view class=\"submit-btn\" bind:tap=\"bindSave\">\n      <view class=\"btn-text\">提交反馈</view>\n      <view class=\"btn-icon\">→</view>\n    </view>\n  </view>\n\n  <!-- 底部装饰 -->\n  <view class=\"footer-decoration\">\n    <view class=\"decoration-circle circle-1\"></view>\n    <view class=\"decoration-circle circle-2\"></view>\n    <view class=\"decoration-circle circle-3\"></view>\n  </view>\n</view>"
  },
  {
    "path": "pages/my/feedback.wxss",
    "content": "/* 页面整体容器 */\npage {\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE4D6 50%, #FFD4C4 100%);\n  min-height: 100vh;\n}\n\n.feedback-container {\n  min-height: 100vh;\n  padding: 0 30rpx 60rpx;\n  position: relative;\n}\n\n/* 顶部装饰波浪 */\n.header-wave {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 180rpx;\n  background: linear-gradient(135deg, #D4A574 0%, #C49563 100%);\n  border-radius: 0 0 50% 50%;\n  opacity: 0.15;\n}\n\n/* 页面头部 */\n.feedback-header {\n  padding-top: 60rpx;\n  padding-bottom: 40rpx;\n  text-align: center;\n  position: relative;\n  z-index: 1;\n}\n\n.header-icon {\n  font-size: 80rpx;\n  margin-bottom: 20rpx;\n  animation: bounce 2s infinite;\n}\n\n@keyframes bounce {\n  0%, 100% { transform: translateY(0); }\n  50% { transform: translateY(-10rpx); }\n}\n\n.header-title {\n  font-size: 48rpx;\n  font-weight: bold;\n  color: #8B5A3C;\n  margin-bottom: 16rpx;\n  letter-spacing: 2rpx;\n}\n\n.header-subtitle {\n  font-size: 24rpx;\n  color: #A67C52;\n  opacity: 0.9;\n}\n\n/* 表单卡片 */\n.feedback-card {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF5 100%);\n  border-radius: 32rpx;\n  padding: 40rpx 32rpx;\n  margin-bottom: 30rpx;\n  box-shadow: 0 12rpx 48rpx rgba(212, 165, 116, 0.15),\n              0 4rpx 16rpx rgba(196, 149, 99, 0.08);\n  position: relative;\n  overflow: hidden;\n}\n\n.feedback-card::before {\n  content: '';\n  position: absolute;\n  top: -50rpx;\n  right: -50rpx;\n  width: 200rpx;\n  height: 200rpx;\n  background: linear-gradient(135deg, #FFE4D6 0%, #FFD4C4 100%);\n  border-radius: 50%;\n  opacity: 0.3;\n}\n\n/* 输入区域 */\n.input-section {\n  margin-bottom: 32rpx;\n  position: relative;\n}\n\n.input-section:last-child {\n  margin-bottom: 0;\n}\n\n.input-label {\n  display: flex;\n  align-items: center;\n  margin-bottom: 20rpx;\n  padding-left: 8rpx;\n}\n\n.label-icon {\n  font-size: 32rpx;\n  margin-right: 12rpx;\n}\n\n.label-text {\n  font-size: 28rpx;\n  color: #8B5A3C;\n  font-weight: 600;\n}\n\n.label-tip {\n  font-size: 22rpx;\n  color: #C49563;\n  margin-left: 8rpx;\n}\n\n/* 自定义输入框样式 */\n.custom-field {\n  background: #FFF9F0 !important;\n  border-radius: 16rpx !important;\n  padding: 24rpx 20rpx !important;\n  font-size: 28rpx !important;\n  color: #333 !important;\n  border: 2rpx solid #FFE4D6 !important;\n  transition: all 0.3s ease;\n}\n\n.custom-field:focus {\n  border-color: #D4A574 !important;\n  box-shadow: 0 0 0 4rpx rgba(212, 165, 116, 0.1) !important;\n}\n\n.custom-textarea {\n  background: #FFF9F0 !important;\n  border-radius: 16rpx !important;\n  padding: 24rpx 20rpx !important;\n  font-size: 28rpx !important;\n  color: #333 !important;\n  min-height: 200rpx !important;\n  border: 2rpx solid #FFE4D6 !important;\n  transition: all 0.3s ease;\n}\n\n/* 分割线 */\n.divider {\n  height: 1rpx;\n  background: linear-gradient(90deg, transparent 0%, #FFE4D6 50%, transparent 100%);\n  margin: 32rpx 0;\n}\n\n/* 内容区域 */\n.content-section {\n  margin-bottom: 32rpx;\n}\n\n/* 上传区域 */\n.upload-section {\n  margin-top: 32rpx;\n}\n\n.uploader-wrapper {\n  margin-top: 20rpx;\n  padding: 20rpx;\n  background: #FFF9F0;\n  border-radius: 16rpx;\n  border: 2rpx dashed #FFE4D6;\n}\n\n/* 温馨提示卡片 */\n.tips-card {\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF5E6 100%);\n  border-radius: 24rpx;\n  padding: 28rpx 32rpx;\n  margin-bottom: 40rpx;\n  display: flex;\n  align-items: flex-start;\n  border-left: 6rpx solid #D4A574;\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.08);\n}\n\n.tips-icon {\n  font-size: 36rpx;\n  margin-right: 16rpx;\n  flex-shrink: 0;\n}\n\n.tips-content {\n  flex: 1;\n}\n\n.tips-title {\n  font-size: 26rpx;\n  color: #8B5A3C;\n  font-weight: 600;\n  margin-bottom: 8rpx;\n}\n\n.tips-text {\n  font-size: 22rpx;\n  color: #A67C52;\n  line-height: 1.6;\n}\n\n/* 提交按钮 */\n.submit-wrapper {\n  padding: 20rpx 0;\n}\n\n.submit-btn {\n  background: linear-gradient(135deg, #D4A574 0%, #C49563 100%);\n  border-radius: 50rpx;\n  padding: 32rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 16rpx 48rpx rgba(212, 165, 116, 0.35),\n              0 8rpx 24rpx rgba(196, 149, 99, 0.2);\n  position: relative;\n  overflow: hidden;\n  transition: all 0.3s ease;\n}\n\n.submit-btn::before {\n  content: '';\n  position: absolute;\n  top: -50%;\n  left: -50%;\n  width: 200%;\n  height: 200%;\n  background: linear-gradient(45deg, transparent, rgba(255, 255, 255, 0.3), transparent);\n  transform: rotate(45deg);\n  animation: shimmer 3s infinite;\n}\n\n@keyframes shimmer {\n  0% { transform: translateX(-100%) translateY(-100%) rotate(45deg); }\n  100% { transform: translateX(100%) translateY(100%) rotate(45deg); }\n}\n\n.submit-btn:active {\n  transform: scale(0.98);\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.25);\n}\n\n.btn-text {\n  font-size: 32rpx;\n  color: #FFFFFF;\n  font-weight: bold;\n  letter-spacing: 4rpx;\n  margin-right: 12rpx;\n}\n\n.btn-icon {\n  font-size: 32rpx;\n  color: #FFFFFF;\n  font-weight: bold;\n  animation: arrow-move 1.5s infinite;\n}\n\n@keyframes arrow-move {\n  0%, 100% { transform: translateX(0); }\n  50% { transform: translateX(8rpx); }\n}\n\n/* 底部装饰 */\n.footer-decoration {\n  position: fixed;\n  bottom: 40rpx;\n  left: 50%;\n  transform: translateX(-50%);\n  display: flex;\n  gap: 12rpx;\n  z-index: 0;\n  pointer-events: none;\n}\n\n.decoration-circle {\n  width: 12rpx;\n  height: 12rpx;\n  border-radius: 50%;\n  background: #D4A574;\n  opacity: 0.3;\n}\n\n.circle-1 { animation: pulse 2s infinite 0s; }\n.circle-2 { animation: pulse 2s infinite 0.3s; }\n.circle-3 { animation: pulse 2s infinite 0.6s; }\n\n@keyframes pulse {\n  0%, 100% { transform: scale(1); opacity: 0.3; }\n  50% { transform: scale(1.5); opacity: 0.6; }\n}\n\n/* 覆盖 vant 组件样式 */\n.van-field__control {\n  color: #333 !important;\n}\n\n.van-field__placeholder {\n  color: #C49563 !important;\n}\n\n.van-uploader__upload {\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF5E6 100%) !important;\n  border: 2rpx dashed #D4A574 !important;\n  border-radius: 16rpx !important;\n}\n\n.van-uploader__preview-image {\n  border-radius: 16rpx !important;\n}\n\n.van-uploader__upload-icon {\n  color: #D4A574 !important;\n}\n\n.van-uploader__upload-text {\n  color: #A67C52 !important;\n  font-size: 22rpx !important;\n}"
  },
  {
    "path": "pages/my/index.js",
    "content": "const CONFIG = require('../../config.js')\nconst WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\n\nPage({\n  data: {\n    couponStatistics: {\n      canUse: 0\n    },\n    balance: 0.00,\n    score: 0,\n    nick: undefined,\n  },\n  onLoad() {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.my.title,\n    })\n    this.setData({\n      myBg: wx.getStorageSync('myBg'),\n      version: CONFIG.version,\n      customerServiceType: CONFIG.customerServiceType\n    })\n    getApp().getUserDetailOK = (apiUserInfoMap) => {\n      this.processGotUserDetail(apiUserInfoMap)\n    }\n  },\n  onShow() {\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n  },\n  async processGotUserDetail(apiUserInfoMap) {\n    if (!apiUserInfoMap) {\n      return\n    }\n    const order_hx_uids = wx.getStorageSync('order_hx_uids')\n    const _data = {}\n    _data.apiUserInfoMap = apiUserInfoMap\n    _data.nick = apiUserInfoMap.base.nick\n    if (order_hx_uids && order_hx_uids.indexOf(apiUserInfoMap.base.id) != -1) {\n      _data.canHX = true // 具有扫码核销的权限\n    }\n    const admin_uids = wx.getStorageSync('admin_uids')\n    if (admin_uids && admin_uids.indexOf(apiUserInfoMap.base.id) != -1) {\n      _data.isAdmin = true\n    }\n    this.setData(_data)\n    this.getUserAmount()\n    this.couponStatistics()\n  },\n  async couponStatistics() {\n    const res = await WXAPI.couponStatistics(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        couponStatistics: res.data\n      })\n    }\n  },\n  async getUserAmount() {\n    const res = await WXAPI.userAmount(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        balance: res.data.balance,\n        score: res.data.score\n      })\n    }\n  },\n  scanOrderCode(){\n    wx.scanCode({\n      onlyFromCamera: true,\n      success(res) {\n        wx.navigateTo({\n          url: '/pages/order-details/scan-result?hxNumber=' + res.result,\n        })\n      },\n      fail(err) {\n        console.error(err)\n        wx.showToast({\n          title: err.errMsg,\n          icon: 'none'\n        })\n      }\n    })\n  },\n  goCoupons() {\n    wx.navigateTo({\n      url: '/pages/coupons/index?tabIndex=1',\n    })\n  },\n  goBalance() {\n    wx.navigateTo({\n      url: '/pages/asset/index',\n    })\n  },\n  goScorelog() {\n    wx.navigateTo({\n      url: '/pages/score/logs',\n    })\n  },\n  goadmin() {\n    wx.navigateToMiniProgram({\n      appId: 'wx5e5b0066c8d3f33d',\n      path: 'pages/autoLogin?token=' + wx.getStorageSync('token'),\n    })\n  },\n  clearStorage() {\n    wx.clearStorageSync()\n    wx.reLaunch({\n      url: '/pages/index/index',\n    })\n  },\n  govip() {\n    wx.navigateTo({\n      url: '/pages/member-center/index',\n    })\n  },\n  editNick() {\n    this.setData({\n      nickShow: true\n    })\n  },\n  async _editNick() {\n    if (!this.data.nick) {\n      wx.showToast({\n        title: this.data.$t.my.nickRequired,\n        icon: 'none'\n      })\n      return\n    }\n    const postData = {\n      token: wx.getStorageSync('token'),\n      nick: this.data.nick,\n    }\n    // https://www.yuque.com/apifm/nu0f75/ykr2zr\n    const res = await WXAPI.modifyUserInfoV2(postData)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    wx.showToast({\n      title: this.data.$t.common.submitSuccess,\n    })\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n  },\n  async onChooseAvatar(e) {\n    console.log(e);\n    const avatarUrl = e.detail.avatarUrl\n    let res = await WXAPI.uploadFileV2(wx.getStorageSync('token'), avatarUrl)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    // https://www.yuque.com/apifm/nu0f75/ykr2zr\n    res = await WXAPI.modifyUserInfoV2({\n      token: wx.getStorageSync('token'),\n      avatarUrl: res.data.url,\n    })\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    wx.showToast({\n      title: this.data.$t.common.submitSuccess,\n    })\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n  },\n  goUserCode() {\n    wx.navigateTo({\n      url: '/pages/my/user-code',\n    })\n  },\n  customerService() {\n    wx.openCustomerServiceChat({\n      extInfo: {url: wx.getStorageSync('customerServiceChatUrl')},\n      corpId: wx.getStorageSync('customerServiceChatCorpId'),\n      success: res => {},\n      fail: err => {\n        console.error(err)\n      }\n    })\n  },\n  copyuid() {\n    wx.setClipboardData({\n      data: this.data.apiUserInfoMap.base.id + ''\n    })\n  },\n})"
  },
  {
    "path": "pages/my/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/my/index.wxml",
    "content": "<view class=\"page-container\">\r\n  <!-- 顶部背景区域 -->\r\n  <view class=\"header-section\">\r\n    <image mode='aspectFill' class='header-bg' src='{{myBg}}'></image>\r\n    <view class=\"header-gradient\"></view>\r\n    \r\n    <!-- 用户信息卡片 -->\r\n    <view class=\"user-card\">\r\n      <view class=\"user-info-row\">\r\n        <view class=\"avatar-section\">\r\n          <button class=\"avatar-btn\" open-type=\"chooseAvatar\" bind:chooseavatar=\"onChooseAvatar\">\r\n            <image src=\"{{ apiUserInfoMap.base.avatarUrl ? apiUserInfoMap.base.avatarUrl : '/images/default.png' }}\" mode=\"aspectFill\" class=\"avatar-img\"></image>\r\n          </button>\r\n          <view class=\"avatar-ring\"></view>\r\n        </view>\r\n        \r\n        <view class=\"user-details\">\r\n          <view class=\"nickname\" bindtap=\"editNick\">\r\n            {{ nick ? nick : $t.my.nickSet }}\r\n          </view>\r\n          <view class=\"uid-row\" bindtap=\"copyuid\">\r\n            <text class=\"uid-label\">{{ $t.my.uid }}</text>\r\n            <text class=\"uid-value\">{{ apiUserInfoMap.base.id }}</text>\r\n          </view>\r\n          <view class=\"vip-badge\" bindtap=\"govip\">\r\n            <text wx:if=\"{{apiUserInfoMap.userLevel}}\" class=\"vip-text\">{{apiUserInfoMap.userLevel.name}}</text>\r\n            <text wx:else class=\"vip-text\">{{ $t.vip.notVIP }}</text>\r\n          </view>\r\n        </view>\r\n        \r\n        <view class=\"qr-section\" bindtap=\"goUserCode\">\r\n          <view class=\"qr-icon-wrapper\">\r\n            <van-icon name=\"qr\" size=\"48rpx\" color=\"#8B7355\" />\r\n          </view>\r\n          <view class=\"qr-text\">{{ $t.my.userCode }}</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 资产卡片区域 -->\r\n  <view wx:if=\"{{apiUserInfoMap}}\" class=\"assets-section\">\r\n    <view class=\"asset-card\" bindtap=\"goCoupons\">\r\n      <view class=\"asset-icon coupon-icon\">\r\n        <van-icon name=\"coupon-o\" size=\"48rpx\" color=\"#FF9800\" />\r\n      </view>\r\n      <view class=\"asset-value\">{{couponStatistics.canUse}}</view>\r\n      <view class=\"asset-label\">{{ $t.coupons.title }}</view>\r\n    </view>\r\n    \r\n    <view class=\"asset-card highlight-card\" bindtap=\"goBalance\">\r\n      <view class=\"asset-icon balance-icon\">\r\n        <van-icon name=\"balance-o\" size=\"48rpx\" color=\"#F5DEB3\" />\r\n      </view>\r\n      <view class=\"asset-value-large\">\r\n        <text class=\"currency\">¥</text>\r\n        <text class=\"amount\">{{balance}}</text>\r\n      </view>\r\n      <view class=\"asset-label\">{{ $t.order.balance }}</view>\r\n    </view>\r\n    \r\n    <view class=\"asset-card\" bindtap=\"goScorelog\">\r\n      <view class=\"asset-icon score-icon\">\r\n        <van-icon name=\"gold-coin-o\" size=\"48rpx\" color=\"#FFD700\" />\r\n      </view>\r\n      <view class=\"asset-value\">{{score}}</view>\r\n      <view class=\"asset-label\">{{ $t.my.score }}</view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 功能菜单区域 -->\r\n  <view class=\"menu-section\">\r\n    <!-- 常用功能 -->\r\n    <view class=\"menu-group\">\r\n      <view class=\"menu-title\">\r\n        <view class=\"title-dot\"></view>\r\n        <text>常用功能</text>\r\n      </view>\r\n      <view class=\"menu-grid\">\r\n        <view class=\"menu-item\" bindtap=\"scanOrderCode\" wx:if=\"{{canHX}}\">\r\n          <view class=\"menu-icon-wrapper scan-icon\">\r\n            <van-icon name=\"scan\" size=\"44rpx\" />\r\n          </view>\r\n          <text class=\"menu-text\">{{ $t.my.scanHx }}</text>\r\n        </view>\r\n        <view class=\"menu-item\" url=\"/pages/sign/index\">\r\n          <navigator url=\"/pages/sign/index\" hover-class=\"none\">\r\n            <view class=\"menu-icon-wrapper sign-icon\">\r\n              <van-icon name=\"calendar-o\" size=\"44rpx\" />\r\n            </view>\r\n            <text class=\"menu-text\">{{ $t.my.signDaily }}</text>\r\n          </navigator>\r\n        </view>\r\n        <view class=\"menu-item\">\r\n          <navigator url=\"/pages/booking/index\" hover-class=\"none\">\r\n            <view class=\"menu-icon-wrapper booking-icon\">\r\n              <van-icon name=\"clock-o\" size=\"44rpx\" />\r\n            </view>\r\n            <text class=\"menu-text\">{{ $t.booking.title }}</text>\r\n          </navigator>\r\n        </view>\r\n        <view class=\"menu-item\">\r\n          <navigator url=\"/pages/youhui-pay/index\" hover-class=\"none\">\r\n            <view class=\"menu-icon-wrapper pay-icon\">\r\n              <van-icon name=\"gold-coin-o\" size=\"44rpx\" />\r\n            </view>\r\n            <text class=\"menu-text\">{{ $t.my.youhuimaidan }}</text>\r\n          </navigator>\r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 我的服务 -->\r\n    <view class=\"menu-group\">\r\n      <view class=\"menu-title\">\r\n        <view class=\"title-dot\"></view>\r\n        <text>我的服务</text>\r\n      </view>\r\n      <view class=\"menu-list\">\r\n        <navigator url=\"/pages/member-center/index\" hover-class=\"none\">\r\n          <view class=\"menu-list-item\">\r\n            <view class=\"item-left\">\r\n              <view class=\"list-icon vip-icon\">\r\n                <van-icon name=\"gem-o\" size=\"40rpx\" />\r\n              </view>\r\n              <text class=\"list-text\">{{ $t.vip.title }}</text>\r\n            </view>\r\n            <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n          </view>\r\n        </navigator>\r\n        <navigator url=\"/pages/all-orders/index\" hover-class=\"none\">\r\n          <view class=\"menu-list-item\">\r\n            <view class=\"item-left\">\r\n              <view class=\"list-icon order-icon\">\r\n                <van-icon name=\"orders-o\" size=\"40rpx\" />\r\n              </view>\r\n              <text class=\"list-text\">{{ $t.order.title }}</text>\r\n            </view>\r\n            <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n          </view>\r\n        </navigator>\r\n        <navigator url=\"/pages/ad/index\" hover-class=\"none\">\r\n          <view class=\"menu-list-item\">\r\n            <view class=\"item-left\">\r\n              <view class=\"list-icon address-icon\">\r\n                <van-icon name=\"location-o\" size=\"40rpx\" />\r\n              </view>\r\n              <text class=\"list-text\">{{ $t.ad_index.title }}</text>\r\n            </view>\r\n            <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n          </view>\r\n        </navigator>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 其他设置 -->\r\n    <view class=\"menu-group\">\r\n      <view class=\"menu-title\">\r\n        <view class=\"title-dot\"></view>\r\n        <text>其他设置</text>\r\n      </view>\r\n      <view class=\"menu-list\">\r\n        <navigator url=\"/pages/about/index\" hover-class=\"none\">\r\n          <view class=\"menu-list-item\">\r\n            <view class=\"item-left\">\r\n              <view class=\"list-icon about-icon\">\r\n                <van-icon name=\"info-o\" size=\"40rpx\" />\r\n              </view>\r\n              <text class=\"list-text\">{{ $t.my.aboutUs }}</text>\r\n            </view>\r\n            <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n          </view>\r\n        </navigator>\r\n        <view class=\"menu-list-item\" wx:if=\"{{ customerServiceType == 'QW' }}\" bindtap=\"customerService\">\r\n          <view class=\"item-left\">\r\n            <view class=\"list-icon service-icon\">\r\n              <van-icon name=\"service-o\" size=\"40rpx\" />\r\n            </view>\r\n            <text class=\"list-text\">{{ $t.my.Contact }}</text>\r\n          </view>\r\n          <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n        </view>\r\n        <navigator url=\"/pages/my/feedback\" hover-class=\"none\">\r\n          <view class=\"menu-list-item\">\r\n            <view class=\"item-left\">\r\n              <view class=\"list-icon feedback-icon\">\r\n                <van-icon name=\"chat-o\" size=\"40rpx\" />\r\n              </view>\r\n              <text class=\"list-text\">{{ $t.feedback.title }}</text>\r\n            </view>\r\n            <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n          </view>\r\n        </navigator>\r\n        <view class=\"menu-list-item\" bindtap=\"clearStorage\">\r\n          <view class=\"item-left\">\r\n            <view class=\"list-icon clear-icon\">\r\n              <van-icon name=\"delete-o\" size=\"40rpx\" />\r\n            </view>\r\n            <text class=\"list-text\">{{ $t.my.clearStorage }}</text>\r\n          </view>\r\n          <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n        </view>\r\n        <view class=\"menu-list-item\" bindtap=\"goadmin\">\r\n          <view class=\"item-left\">\r\n            <view class=\"list-icon admin-icon\">\r\n              <van-icon name=\"manager-o\" size=\"40rpx\" />\r\n            </view>\r\n            <text class=\"list-text\">{{ $t.auth.goAdmin }}</text>\r\n          </view>\r\n          <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\r\n        </view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 版本信息 -->\r\n  <view class=\"version-text\">v{{version}}</view>\r\n</view>\r\n\r\n<!-- 编辑昵称弹窗 -->\r\n<van-dialog\r\n  use-slot\r\n  title=\"{{ $t.my.nickEdit }}\"\r\n  show=\"{{ nickShow }}\"\r\n  show-cancel-button\r\n  bind:confirm=\"_editNick\"\r\n>\r\n  <van-field\r\n    model:value=\"{{ nick }}\"\r\n    type=\"nickname\"\r\n    placeholder=\"{{ $t.my.nickRequired }}\"\r\n    size=\"large\"\r\n    clearable\r\n  />\r\n</van-dialog>\r\n"
  },
  {
    "path": "pages/my/index.wxss",
    "content": "/* 页面容器 */\r\n.page-container {\r\n  min-height: 100vh;\r\n  background: linear-gradient(180deg, #FFF5E6 0%, #FFFFFF 50%);\r\n  padding-bottom: 40rpx;\r\n}\r\n\r\n/* ==================== 顶部区域 ==================== */\r\n.header-section {\r\n  position: relative;\r\n  width: 100%;\r\n  height: 280rpx;\r\n  overflow: hidden;\r\n}\r\n\r\n.header-bg {\r\n  width: 100%;\r\n  height: 100%;\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  filter: blur(20rpx);\r\n  opacity: 0.9;\r\n  z-index: 9;\r\n}\r\n\r\n.header-gradient {\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  height: 100%;\r\n  background: linear-gradient(135deg, \r\n    rgba(245, 222, 179, 0.9) 0%, \r\n    rgba(210, 180, 140, 0.85) 50%,\r\n    rgba(139, 115, 85, 0.8) 100%\r\n  );\r\n}\r\n\r\n/* ==================== 用户信息卡片 ==================== */\r\n.user-card {\r\n  position: absolute;\r\n  bottom: 32rpx;\r\n  left: 32rpx;\r\n  right: 32rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 32rpx;\r\n  padding: 40rpx 32rpx;\r\n  box-shadow: 0 8rpx 32rpx rgba(139, 115, 85, 0.15);\r\n  z-index: 10;\r\n}\r\n\r\n.user-info-row {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n}\r\n\r\n/* 头像区域 */\r\n.avatar-section {\r\n  position: relative;\r\n  margin-right: 24rpx;\r\n}\r\n\r\n.avatar-btn {\r\n  width: 140rpx;\r\n  height: 140rpx;\r\n  border-radius: 50%;\r\n  padding: 0;\r\n  margin: 0;\r\n  background: transparent;\r\n  border: none;\r\n  overflow: visible;\r\n  position: relative;\r\n  z-index: 2;\r\n}\r\n\r\n.avatar-btn::after {\r\n  border: none;\r\n}\r\n\r\n.avatar-img {\r\n  width: 140rpx;\r\n  height: 140rpx;\r\n  border-radius: 50%;\r\n  border: 6rpx solid #FFFFFF;\r\n  box-shadow: 0 4rpx 16rpx rgba(139, 115, 85, 0.2);\r\n}\r\n\r\n.avatar-ring {\r\n  position: absolute;\r\n  top: -6rpx;\r\n  left: -6rpx;\r\n  width: 152rpx;\r\n  height: 152rpx;\r\n  border-radius: 50%;\r\n  border: 3rpx solid transparent;\r\n  background: linear-gradient(135deg, #FFD700, #FFA500, #FF8C00);\r\n  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\r\n  mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\r\n  -webkit-mask-composite: xor;\r\n  mask-composite: exclude;\r\n  padding: 3rpx;\r\n  animation: rotate 3s linear infinite;\r\n  z-index: 1;\r\n}\r\n\r\n@keyframes rotate {\r\n  from { transform: rotate(0deg); }\r\n  to { transform: rotate(360deg); }\r\n}\r\n\r\n/* 用户详情 */\r\n.user-details {\r\n  flex: 1;\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: center;\r\n}\r\n\r\n.nickname {\r\n  font-size: 36rpx;\r\n  font-weight: 600;\r\n  color: #333333;\r\n  margin-bottom: 8rpx;\r\n  max-width: 300rpx;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.uid-row {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 12rpx;\r\n}\r\n\r\n.uid-label {\r\n  font-size: 24rpx;\r\n  color: #999999;\r\n  margin-right: 8rpx;\r\n}\r\n\r\n.uid-value {\r\n  font-size: 24rpx;\r\n  color: #666666;\r\n  font-family: 'Courier New', monospace;\r\n}\r\n\r\n.vip-badge {\r\n  display: inline-block;\r\n  padding: 8rpx 20rpx;\r\n  background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%);\r\n  border-radius: 20rpx;\r\n  align-self: flex-start;\r\n}\r\n\r\n.vip-text {\r\n  font-size: 22rpx;\r\n  color: #FFFFFF;\r\n  font-weight: 500;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n/* 二维码区域 */\r\n.qr-section {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  padding: 8rpx 16rpx;\r\n}\r\n\r\n.qr-icon-wrapper {\r\n  width: 72rpx;\r\n  height: 72rpx;\r\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE4B5 100%);\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-bottom: 8rpx;\r\n  box-shadow: 0 4rpx 12rpx rgba(139, 115, 85, 0.15);\r\n}\r\n\r\n.qr-text {\r\n  font-size: 22rpx;\r\n  color: #8B7355;\r\n  font-weight: 500;\r\n}\r\n\r\n/* ==================== 资产卡片区域 ==================== */\r\n.assets-section {\r\n  margin: 96rpx 32rpx 32rpx;\r\n  display: flex;\r\n  gap: 20rpx;\r\n  justify-content: space-between;\r\n}\r\n\r\n.asset-card {\r\n  flex: 1;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  padding: 32rpx 20rpx;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);\r\n  transition: all 0.3s ease;\r\n  position: relative;\r\n  overflow: hidden;\r\n}\r\n\r\n.asset-card::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  height: 6rpx;\r\n  background: linear-gradient(90deg, #FFD700 0%, #FFA500 100%);\r\n  opacity: 0;\r\n  transition: opacity 0.3s ease;\r\n}\r\n\r\n.asset-card:active::before {\r\n  opacity: 1;\r\n}\r\n\r\n.highlight-card {\r\n  background: linear-gradient(135deg, #8B7355 0%, #A0826D 100%);\r\n  box-shadow: 0 8rpx 24rpx rgba(139, 115, 85, 0.3);\r\n}\r\n\r\n.highlight-card .asset-label,\r\n.highlight-card .asset-value,\r\n.highlight-card .asset-value-large {\r\n  color: #FFFFFF !important;\r\n}\r\n\r\n.asset-icon {\r\n  width: 72rpx;\r\n  height: 72rpx;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-bottom: 16rpx;\r\n}\r\n\r\n.coupon-icon {\r\n  background: linear-gradient(135deg, #FFE4B5 0%, #FFD7A3 100%);\r\n}\r\n\r\n.balance-icon {\r\n  background: rgba(255, 255, 255, 0.25);\r\n}\r\n\r\n.score-icon {\r\n  background: linear-gradient(135deg, #FFF8DC 0%, #FFEAA7 100%);\r\n}\r\n\r\n.asset-value {\r\n  font-size: 44rpx;\r\n  font-weight: 600;\r\n  color: #333333;\r\n  margin-bottom: 8rpx;\r\n  font-family: 'DIN Alternate', 'Helvetica Neue', sans-serif;\r\n}\r\n\r\n.asset-value-large {\r\n  display: flex;\r\n  align-items: baseline;\r\n  margin-bottom: 8rpx;\r\n}\r\n\r\n.currency {\r\n  font-size: 28rpx;\r\n  font-weight: 500;\r\n  color: #FFFFFF;\r\n  margin-right: 4rpx;\r\n}\r\n\r\n.amount {\r\n  font-size: 48rpx;\r\n  font-weight: 700;\r\n  color: #FFFFFF;\r\n  font-family: 'DIN Alternate', 'Helvetica Neue', sans-serif;\r\n}\r\n\r\n.asset-label {\r\n  font-size: 24rpx;\r\n  color: #999999;\r\n}\r\n\r\n/* ==================== 功能菜单区域 ==================== */\r\n.menu-section {\r\n  padding: 0 32rpx;\r\n}\r\n\r\n.menu-group {\r\n  margin-bottom: 32rpx;\r\n}\r\n\r\n.menu-title {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 24rpx;\r\n  padding-left: 8rpx;\r\n}\r\n\r\n.title-dot {\r\n  width: 8rpx;\r\n  height: 28rpx;\r\n  background: linear-gradient(180deg, #8B7355 0%, #A0826D 100%);\r\n  border-radius: 4rpx;\r\n  margin-right: 16rpx;\r\n}\r\n\r\n.menu-title text {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #333333;\r\n}\r\n\r\n/* 网格菜单 */\r\n.menu-grid {\r\n  display: flex;\r\n  gap: 20rpx;\r\n  margin-bottom: 16rpx;\r\n}\r\n\r\n.menu-item {\r\n  flex: 1;\r\n  background: #FFFFFF;\r\n  border-radius: 20rpx;\r\n  padding: 32rpx 16rpx;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n.menu-item navigator {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  width: 100%;\r\n}\r\n\r\n.menu-item:active {\r\n  transform: translateY(-4rpx);\r\n  box-shadow: 0 8rpx 20rpx rgba(139, 115, 85, 0.15);\r\n}\r\n\r\n.menu-icon-wrapper {\r\n  width: 80rpx;\r\n  height: 80rpx;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-bottom: 16rpx;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n.scan-icon {\r\n  background: linear-gradient(135deg, #E3F2FD 0%, #BBDEFB 100%);\r\n  color: #2196F3;\r\n}\r\n\r\n.sign-icon {\r\n  background: linear-gradient(135deg, #FCE4EC 0%, #F8BBD0 100%);\r\n  color: #E91E63;\r\n}\r\n\r\n.booking-icon {\r\n  background: linear-gradient(135deg, #F3E5F5 0%, #E1BEE7 100%);\r\n  color: #9C27B0;\r\n}\r\n\r\n.pay-icon {\r\n  background: linear-gradient(135deg, #FFF9C4 0%, #FFF59D 100%);\r\n  color: #FFA000;\r\n}\r\n\r\n.menu-text {\r\n  font-size: 24rpx;\r\n  color: #666666;\r\n  text-align: center;\r\n  line-height: 1.4;\r\n}\r\n\r\n/* 列表菜单 */\r\n.menu-list {\r\n  background: #FFFFFF;\r\n  border-radius: 20rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n.menu-list navigator {\r\n  display: block;\r\n}\r\n\r\n.menu-list-item {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 32rpx 28rpx;\r\n  border-bottom: 1rpx solid #F5F5F5;\r\n  transition: background 0.3s ease;\r\n}\r\n\r\n.menu-list-item:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n.menu-list-item:active {\r\n  background: #FAFAFA;\r\n}\r\n\r\n.item-left {\r\n  display: flex;\r\n  align-items: center;\r\n  flex: 1;\r\n}\r\n\r\n.list-icon {\r\n  width: 72rpx;\r\n  height: 72rpx;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-right: 24rpx;\r\n}\r\n\r\n.vip-icon {\r\n  background: linear-gradient(135deg, #FFF8E1 0%, #FFECB3 100%);\r\n  color: #FFA000;\r\n}\r\n\r\n.order-icon {\r\n  background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 100%);\r\n  color: #4CAF50;\r\n}\r\n\r\n.address-icon {\r\n  background: linear-gradient(135deg, #E3F2FD 0%, #BBDEFB 100%);\r\n  color: #2196F3;\r\n}\r\n\r\n.about-icon {\r\n  background: linear-gradient(135deg, #F3E5F5 0%, #E1BEE7 100%);\r\n  color: #9C27B0;\r\n}\r\n\r\n.service-icon {\r\n  background: linear-gradient(135deg, #E0F2F1 0%, #B2DFDB 100%);\r\n  color: #009688;\r\n}\r\n\r\n.feedback-icon {\r\n  background: linear-gradient(135deg, #FFF3E0 0%, #FFE0B2 100%);\r\n  color: #FF9800;\r\n}\r\n\r\n.clear-icon {\r\n  background: linear-gradient(135deg, #FFEBEE 0%, #FFCDD2 100%);\r\n  color: #F44336;\r\n}\r\n\r\n.admin-icon {\r\n  background: linear-gradient(135deg, #F5F5F5 0%, #E0E0E0 100%);\r\n  color: #757575;\r\n}\r\n\r\n.list-text {\r\n  font-size: 28rpx;\r\n  color: #333333;\r\n  font-weight: 500;\r\n}\r\n\r\n/* ==================== 版本信息 ==================== */\r\n.version-text {\r\n  text-align: center;\r\n  margin-top: 48rpx;\r\n  padding-bottom: 32rpx;\r\n  color: #BDBDBD;\r\n  font-size: 24rpx;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n/* ==================== 兼容旧样式 ==================== */\r\n.userinfo, .uploader, .tunnel {\r\n  display: none;\r\n}\r\n\r\n.userinfo-avatar {\r\n  background: transparent;\r\n  border: none;\r\n  padding: 0;\r\n  margin: 0;\r\n  overflow: visible;\r\n}\r\n\r\n.userinfo-avatar::after {\r\n  border: none;\r\n}\r\n\r\n.userinfo-avatar-img {\r\n  display: none;\r\n}\r\n\r\n.userinfo-nickname {\r\n  display: none;\r\n}\r\n\r\n.userinfo-nickname::after {\r\n  border: none;\r\n}\r\n"
  },
  {
    "path": "pages/my/user-code.js",
    "content": "const WXAPI = require('apifm-wxapi')\nimport wxbarcode from 'wxbarcode'\n\nPage({\n  data: {\n    balance: 0,\n    freeze: 0,\n    score: 0,\n    growth: 0,\n    userCode: undefined\n  },\n  onLoad(e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.my.userCode,\n    })\n    this.getUserAmount()\n    this.dynamicUserCode()\n  },\n  onShow: function () {\n  },\n  onPullDownRefresh() {\n    this.getUserAmount()\n    this.dynamicUserCode()\n    wx.stopPullDownRefresh()\n  },\n  async getUserAmount() {\n    const res = await WXAPI.userAmount(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        balance: res.data.balance,\n        freeze: res.data.freeze,\n        score: res.data.score,\n        growth: res.data.growth\n      })\n    }\n  },\n  async dynamicUserCode() {\n    const res = await WXAPI.dynamicUserCode(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      this.setData({\n        userCode: res.data\n      })\n      wxbarcode.barcode('barcode', res.data, 560, 200);\n      wxbarcode.qrcode('qrcode', res.data, 450, 450);\n    }\n  },\n})"
  },
  {
    "path": "pages/my/user-code.json",
    "content": "{\n  \"navigationBarTitleText\": \"\",\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "pages/my/user-code.wxml",
    "content": "<view class=\"member-code-page\">\n  <!-- 顶部装饰 -->\n  <view class=\"top-decoration\">\n    <view class=\"decoration-circle circle-1\"></view>\n    <view class=\"decoration-circle circle-2\"></view>\n    <view class=\"decoration-circle circle-3\"></view>\n  </view>\n\n  <!-- 会员信息卡片 -->\n  <view class=\"member-card\">\n    <view class=\"card-header\">\n      <view class=\"member-badge\">\n        <text class=\"badge-icon\">👑</text>\n        <text class=\"badge-text\">会员专属</text>\n      </view>\n    </view>\n    \n    <!-- 会员码编号 -->\n    <view class=\"code-number\">\n      <text class=\"code-label\">会员编号</text>\n      <text class=\"code-value\">{{ userCode }}</text>\n    </view>\n\n    <!-- 二维码区域 -->\n    <view class=\"qrcode-container\">\n      <view class=\"qrcode-wrapper\">\n        <canvas class=\"user-code\" canvas-id=\"qrcode\" />\n        <view class=\"qrcode-corners\">\n          <view class=\"corner corner-tl\"></view>\n          <view class=\"corner corner-tr\"></view>\n          <view class=\"corner corner-bl\"></view>\n          <view class=\"corner corner-br\"></view>\n        </view>\n      </view>\n      <text class=\"qrcode-tip\">向商家出示此码享受会员优惠</text>\n    </view>\n\n    <!-- 条形码区域 -->\n    <view class=\"barcode-container\">\n      <canvas class=\"user-code-bar\" canvas-id=\"barcode\" />\n    </view>\n  </view>\n\n  <!-- 账户信息卡片 -->\n  <view class=\"account-info\">\n    <view class=\"info-item\">\n      <view class=\"info-icon-wrapper balance-icon\">\n        <text class=\"info-icon\">💰</text>\n      </view>\n      <view class=\"info-content\">\n        <text class=\"info-label\">{{ $t.order.balance }}</text>\n        <text class=\"info-value\">¥{{ balance }}</text>\n      </view>\n    </view>\n    \n    <view class=\"info-divider\"></view>\n    \n    <view class=\"info-item\">\n      <view class=\"info-icon-wrapper score-icon\">\n        <text class=\"info-icon\">⭐</text>\n      </view>\n      <view class=\"info-content\">\n        <text class=\"info-label\">{{ $t.my.score }}</text>\n        <text class=\"info-value\">{{ score }}</text>\n      </view>\n    </view>\n  </view>\n\n  <!-- 底部提示 -->\n  <view class=\"bottom-tips\">\n    <view class=\"tip-item\">\n      <text class=\"tip-dot\">•</text>\n      <text class=\"tip-text\">每次消费可累积积分</text>\n    </view>\n    <view class=\"tip-item\">\n      <text class=\"tip-dot\">•</text>\n      <text class=\"tip-text\">积分可兑换精美礼品</text>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "pages/my/user-code.wxss",
    "content": "/* 页面容器 */\n.member-code-page {\n  min-height: 100vh;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8CC 50%, #FFDDB3 100%);\n  padding: 40rpx 30rpx;\n  position: relative;\n  overflow: hidden;\n}\n\n/* 顶部装饰圆圈 */\n.top-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 300rpx;\n  pointer-events: none;\n}\n\n.decoration-circle {\n  position: absolute;\n  border-radius: 50%;\n  opacity: 0.15;\n}\n\n.circle-1 {\n  width: 200rpx;\n  height: 200rpx;\n  background: linear-gradient(135deg, #FF9A76 0%, #FF6B9D 100%);\n  top: -100rpx;\n  right: 50rpx;\n}\n\n.circle-2 {\n  width: 150rpx;\n  height: 150rpx;\n  background: linear-gradient(135deg, #FFC837 0%, #FF8008 100%);\n  top: 100rpx;\n  left: -50rpx;\n}\n\n.circle-3 {\n  width: 100rpx;\n  height: 100rpx;\n  background: linear-gradient(135deg, #A8EDEA 0%, #FED6E3 100%);\n  top: 50rpx;\n  right: 200rpx;\n}\n\n/* 会员卡片 */\n.member-card {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF9F3 100%);\n  border-radius: 32rpx;\n  padding: 40rpx 30rpx;\n  margin-bottom: 30rpx;\n  box-shadow: 0 16rpx 48rpx rgba(255, 168, 76, 0.15);\n  position: relative;\n  overflow: hidden;\n}\n\n.member-card::before {\n  content: '';\n  position: absolute;\n  top: -50%;\n  right: -50rpx;\n  width: 300rpx;\n  height: 300rpx;\n  background: linear-gradient(135deg, rgba(255, 193, 7, 0.08) 0%, rgba(255, 152, 0, 0.08) 100%);\n  border-radius: 50%;\n}\n\n/* 卡片头部 */\n.card-header {\n  display: flex;\n  justify-content: center;\n  margin-bottom: 30rpx;\n}\n\n.member-badge {\n  display: inline-flex;\n  align-items: center;\n  background: linear-gradient(135deg, #FFD93D 0%, #FFA826 100%);\n  padding: 12rpx 32rpx;\n  border-radius: 50rpx;\n  box-shadow: 0 8rpx 24rpx rgba(255, 168, 38, 0.3);\n}\n\n.badge-icon {\n  font-size: 32rpx;\n  margin-right: 8rpx;\n}\n\n.badge-text {\n  color: #6B4423;\n  font-size: 28rpx;\n  font-weight: bold;\n  letter-spacing: 2rpx;\n}\n\n/* 会员编号 */\n.code-number {\n  text-align: center;\n  margin-bottom: 40rpx;\n}\n\n.code-label {\n  display: block;\n  color: #999;\n  font-size: 24rpx;\n  margin-bottom: 10rpx;\n  letter-spacing: 1rpx;\n}\n\n.code-value {\n  display: block;\n  color: #8B5A3C;\n  font-size: 32rpx;\n  font-weight: bold;\n  letter-spacing: 3rpx;\n  font-family: 'Courier New', monospace;\n}\n\n/* 二维码容器 */\n.qrcode-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-bottom: 30rpx;\n}\n\n.qrcode-wrapper {\n  position: relative;\n  width: 510rpx;\n  height: 510rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  box-shadow: 0 8rpx 32rpx rgba(139, 90, 60, 0.08);\n}\n\n.user-code {\n  width: 450rpx;\n  height: 450rpx;\n  border-radius: 16rpx;\n  display: block;\n}\n\n/* 二维码四角装饰 */\n.qrcode-corners {\n  position: absolute;\n  top: 30rpx;\n  left: 30rpx;\n  right: 30rpx;\n  bottom: 30rpx;\n  pointer-events: none;\n}\n\n.corner {\n  position: absolute;\n  width: 40rpx;\n  height: 40rpx;\n  border: 4rpx solid #FFA826;\n}\n\n.corner-tl {\n  top: 0;\n  left: 0;\n  border-right: none;\n  border-bottom: none;\n  border-radius: 8rpx 0 0 0;\n}\n\n.corner-tr {\n  top: 0;\n  right: 0;\n  border-left: none;\n  border-bottom: none;\n  border-radius: 0 8rpx 0 0;\n}\n\n.corner-bl {\n  bottom: 0;\n  left: 0;\n  border-right: none;\n  border-top: none;\n  border-radius: 0 0 0 8rpx;\n}\n\n.corner-br {\n  bottom: 0;\n  right: 0;\n  border-left: none;\n  border-top: none;\n  border-radius: 0 0 8rpx 0;\n}\n\n.qrcode-tip {\n  margin-top: 24rpx;\n  color: #8B5A3C;\n  font-size: 24rpx;\n  text-align: center;\n  opacity: 0.8;\n}\n\n/* 条形码容器 */\n.barcode-container {\n  display: flex;\n  justify-content: center;\n  padding: 20rpx;\n  background: #FFFFFF;\n  border-radius: 16rpx;\n  box-shadow: 0 4rpx 16rpx rgba(139, 90, 60, 0.05);\n}\n\n.user-code-bar {\n  width: 600rpx;\n  height: 150rpx;\n}\n\n/* 账户信息卡片 */\n.account-info {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF9F3 100%);\n  border-radius: 24rpx;\n  padding: 40rpx 30rpx;\n  margin-bottom: 30rpx;\n  box-shadow: 0 16rpx 48rpx rgba(255, 168, 76, 0.15);\n  display: flex;\n  align-items: center;\n  justify-content: space-around;\n}\n\n.info-item {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  justify-content: center;\n}\n\n.info-icon-wrapper {\n  width: 88rpx;\n  height: 88rpx;\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 20rpx;\n  box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.08);\n}\n\n.balance-icon {\n  background: linear-gradient(135deg, #FFD93D 0%, #FFA826 100%);\n}\n\n.score-icon {\n  background: linear-gradient(135deg, #FF9A76 0%, #FF6B9D 100%);\n}\n\n.info-icon {\n  font-size: 44rpx;\n}\n\n.info-content {\n  display: flex;\n  flex-direction: column;\n}\n\n.info-label {\n  color: #999;\n  font-size: 24rpx;\n  margin-bottom: 8rpx;\n}\n\n.info-value {\n  color: #8B5A3C;\n  font-size: 36rpx;\n  font-weight: bold;\n  letter-spacing: 1rpx;\n}\n\n.info-divider {\n  width: 2rpx;\n  height: 60rpx;\n  background: linear-gradient(180deg, rgba(139, 90, 60, 0) 0%, rgba(139, 90, 60, 0.2) 50%, rgba(139, 90, 60, 0) 100%);\n  margin: 0 20rpx;\n}\n\n/* 底部提示 */\n.bottom-tips {\n  padding: 30rpx 20rpx;\n}\n\n.tip-item {\n  display: flex;\n  align-items: center;\n  margin-bottom: 20rpx;\n}\n\n.tip-dot {\n  color: #FFA826;\n  font-size: 28rpx;\n  margin-right: 12rpx;\n  font-weight: bold;\n}\n\n.tip-text {\n  color: #8B5A3C;\n  font-size: 24rpx;\n  opacity: 0.7;\n  letter-spacing: 1rpx;\n}\n\n/* 兼容vant组件 */\n.van-grid-item__text {\n  color: #e64340 !important;\n  font-size: 28rpx !important;\n}"
  },
  {
    "path": "pages/notice/detail.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\nPage({\n  data: {\n\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.notice.title,\n    })\n    this.noticeDetail(options.id)\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow: function () {\n\n  },\n  async noticeDetail(id) {\n    const res = await WXAPI.noticeDetail(id)\n    if (res.code == 0) {\n      this.setData({\n        noticeDetail: res.data\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/notice/detail.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/notice/detail.wxml",
    "content": "<view class=\"content\">\n  <parser html=\"{{noticeDetail.content}}\" />\n</view>"
  },
  {
    "path": "pages/notice/detail.wxss",
    "content": ".content {\n  padding: 32rpx;\n  line-height: 64rpx;\n}\n.content image {\n  max-width: 100%;\n}"
  },
  {
    "path": "pages/order-details/doing.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst wxbarcode = require('wxbarcode')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\nPage({\n  data: {\n    apiOk: false,\n    isLogined: true\n  },\n  onLoad: function (options) {\n    \n  },\n  onShow: function () {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.index.PickingUp,\n    })\n    AUTH.checkHasLogined().then(isLogined => {\n      this.setData({\n        isLogined\n      })\n      if (isLogined) {\n        this.orderList();\n      }\n    })\n  },\n  toIndexPage: function() {\n    wx.switchTab({\n      url: \"/pages/index/index\"\n    });\n  },\n  async orderList() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.orderList({\n      token: wx.getStorageSync('token'),\n      type: 0,\n      statusBatch: '1,2'\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        orderList: res.data.orderList,\n        logisticsMap: res.data.logisticsMap,\n        goodsMap: res.data.goodsMap,\n        apiOk: true\n      })\n      wxbarcode.qrcode('qrcode_0', res.data.orderList[0].hxNumber, 400, 400);\n    } else {\n      this.setData({\n        orderList: null,\n        logisticsMap: null,\n        goodsMap: null,\n        apiOk: true\n      })\n    }\n  },\n  bindchange(e) {\n    const index = e.detail.current\n    const hxNumber = this.data.orderList[index].hxNumber\n    if (!hxNumber) {\n      return\n    }    \n    wxbarcode.qrcode('qrcode_' + index, hxNumber, 400, 400);\n  },\n})"
  },
  {
    "path": "pages/order-details/doing.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/order-details/doing.wxml",
    "content": "<view wx:if=\"{{apiOk && !orderList}}\" class=\"no-order\">\n  <view class=\"empty-icon\">🥤</view>\n  <view class=\"content-1\">{{ $t.order.empty.t1 }}</view>\n  <view class=\"content-2\">{{ $t.order.empty.t2 }}</view>\n  <view class=\"to-index-btn\" bindtap=\"toIndexPage\">{{ $t.order.empty.btn }}</view>\n</view>\n\n<swiper class=\"swiper\" indicator-dots=\"{{orderList && orderList.length > 1}}\" indicator-color=\"rgba(255,255,255,0.3)\" indicator-active-color=\"#fff\" circular bindchange=\"bindchange\">\n  <swiper-item wx:for=\"{{orderList}}\" wx:for-item=\"order\" wx:key=\"id\">\n    <scroll-view scroll-y class=\"scroll-view\">\n      <view class=\"page-container\">\n        \n        <!-- 取单号卡片 -->\n        <view wx:if=\"{{!order.isNeedLogistics}}\" class=\"pickup-card\">\n          <view class=\"card-header\">\n            <view class=\"header-icon\">📋</view>\n            <view class=\"header-title\">{{ $t.PickingUp.qudanhao }}</view>\n          </view>\n          <view class=\"pickup-number-wrapper\">\n            <view class=\"pickup-number\">{{order.qudanhao}}</view>\n            <view class=\"pickup-tips\">请向店员出示取餐码</view>\n          </view>\n          <view class=\"qrcode-wrapper\">\n            <view class=\"qrcode-container\">\n              <canvas class=\"hx-canvas\" canvas-id=\"qrcode_{{index}}\" />\n              <view class=\"qrcode-corners\">\n                <view class=\"corner corner-tl\"></view>\n                <view class=\"corner corner-tr\"></view>\n                <view class=\"corner corner-bl\"></view>\n                <view class=\"corner corner-br\"></view>\n              </view>\n            </view>\n            <view class=\"qrcode-label\">核销二维码</view>\n          </view>\n        </view>\n\n        <!-- 配送卡片 -->\n        <view wx:if=\"{{order.isNeedLogistics}}\" class=\"pickup-card delivery-card\">\n          <view class=\"card-header\">\n            <view class=\"header-icon\">🚚</view>\n            <view class=\"header-title\">{{ $t.PickingUp.Deliverying }}</view>\n          </view>\n          <view class=\"qrcode-wrapper delivery-qrcode\">\n            <view class=\"qrcode-container\">\n              <canvas class=\"hx-canvas\" canvas-id=\"qrcode_{{index}}\" />\n              <view class=\"qrcode-corners\">\n                <view class=\"corner corner-tl\"></view>\n                <view class=\"corner corner-tr\"></view>\n                <view class=\"corner corner-bl\"></view>\n                <view class=\"corner corner-br\"></view>\n              </view>\n            </view>\n            <view class=\"qrcode-label\">配送核销码</view>\n          </view>\n        </view>\n\n        <!-- 配送地址卡片 -->\n        <view wx:if=\"{{logisticsMap[order.id]}}\" class=\"info-card address-card\">\n          <view class=\"card-section-title\">\n            <view class=\"title-icon\">📍</view>\n            <text>配送信息</text>\n          </view>\n          <view class=\"address-content\">\n            <view class=\"address-contact\">\n              <text class=\"contact-name\">{{logisticsMap[order.id].linkMan}}</text>\n              <text class=\"contact-phone\">{{logisticsMap[order.id].mobile}}</text>\n            </view>\n            <view class=\"address-detail\">{{logisticsMap[order.id].provinceStr}}{{logisticsMap[order.id].cityStr}}{{logisticsMap[order.id].areaStr}}{{logisticsMap[order.id].address}}</view>\n          </view>\n        </view>\n\n        <!-- 订单详情卡片 -->\n        <view class=\"info-card order-card\">\n          <view class=\"card-section-title\">\n            <view class=\"title-icon\">📝</view>\n            <text>订单明细</text>\n          </view>\n          \n          <view class=\"goods-list\">\n            <view wx:for=\"{{goodsMap[order.id]}}\" wx:for-item=\"goods\" wx:key=\"id\" class=\"goods-item\">\n              <view class=\"goods-main\">\n                <view class=\"goods-name\">{{goods.goodsName}}</view>\n                <view class=\"goods-specs\" wx:if=\"{{goods.property}}\">{{goods.property}}</view>\n              </view>\n              <view class=\"goods-right\">\n                <view class=\"goods-quantity\">x{{goods.number}}</view>\n                <view class=\"goods-price\">¥{{goods.amount}}</view>\n              </view>\n            </view>\n          </view>\n\n          <view class=\"divider-line\"></view>\n          \n          <view class=\"total-row\">\n            <view class=\"total-label\">{{ $t.PickingUp.total }}</view>\n            <view class=\"total-amount\">¥{{order.amountReal}}</view>\n          </view>\n\n          <view class=\"order-time\">\n            <text class=\"time-icon\">🕐</text>\n            <text>{{ $t.order.dateAdd }}: {{order.dateAdd}}</text>\n          </view>\n        </view>\n\n        <!-- 底部装饰 -->\n        <view class=\"bottom-decoration\">\n          <view class=\"decoration-line\"></view>\n          <view class=\"decoration-text\">享受每一口美好</view>\n          <view class=\"decoration-line\"></view>\n        </view>\n\n      </view>\n    </scroll-view>\n  </swiper-item>\n</swiper>"
  },
  {
    "path": "pages/order-details/doing.wxss",
    "content": "/* 页面主体样式 */\npage {\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE4D1 50%, #FFF0E6 100%);\n  display: flex;\n  flex-direction: column;\n  height: 100vh;\n}\n\n/* 空状态样式 */\n.no-order {\n  margin-top: 200rpx;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  animation: fadeIn 0.6s ease;\n}\n\n.empty-icon {\n  font-size: 120rpx;\n  margin-bottom: 40rpx;\n  animation: float 3s ease-in-out infinite;\n}\n\n.content-1 {\n  font-size: 32rpx;\n  text-align: center;\n  margin-top: 20rpx;\n  color: #8B6F47;\n  font-weight: 500;\n}\n\n.content-2 {\n  font-size: 28rpx;\n  text-align: center;\n  margin-top: 16rpx;\n  color: #A89080;\n}\n\n.to-index-btn {\n  color: #fff;\n  background: linear-gradient(135deg, #FF9F5A 0%, #FF7B3E 100%);\n  border-radius: 48rpx;\n  width: 320rpx;\n  height: 88rpx;\n  line-height: 88rpx;\n  text-align: center;\n  font-size: 32rpx;\n  margin-top: 60rpx;\n  box-shadow: 0 8rpx 24rpx rgba(255, 159, 90, 0.3);\n  font-weight: 500;\n}\n\n/* Swiper容器 */\n.swiper {\n  flex: 1;\n}\n\n.scroll-view {\n  height: 100%;\n}\n\n.page-container {\n  padding: 40rpx 30rpx 60rpx;\n  min-height: 100%;\n}\n\n/* 取单号卡片 */\n.pickup-card {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFBF5 100%);\n  border-radius: 32rpx;\n  padding: 48rpx;\n  margin-bottom: 32rpx;\n  box-shadow: 0 8rpx 32rpx rgba(139, 111, 71, 0.08);\n  position: relative;\n  overflow: hidden;\n}\n\n.pickup-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 8rpx;\n  background: linear-gradient(90deg, #FF9F5A 0%, #6DD0A5 100%);\n}\n\n.card-header {\n  display: flex;\n  align-items: center;\n  margin-bottom: 40rpx;\n}\n\n.header-icon {\n  font-size: 48rpx;\n  margin-right: 16rpx;\n}\n\n.header-title {\n  font-size: 36rpx;\n  color: #8B6F47;\n  font-weight: 600;\n}\n\n/* 取单号显示 */\n.pickup-number-wrapper {\n  text-align: center;\n  margin-bottom: 48rpx;\n  padding: 40rpx 0;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFEDE0 100%);\n  border-radius: 24rpx;\n  position: relative;\n}\n\n.pickup-number {\n  font-size: 96rpx;\n  color: #FF7B3E;\n  font-weight: 700;\n  letter-spacing: 8rpx;\n  text-shadow: 0 4rpx 16rpx rgba(255, 123, 62, 0.2);\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Arial, sans-serif;\n}\n\n.pickup-tips {\n  font-size: 26rpx;\n  color: #A89080;\n  margin-top: 20rpx;\n  letter-spacing: 2rpx;\n}\n\n/* 二维码容器 */\n.qrcode-wrapper {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-top: 40rpx;\n}\n\n.qrcode-container {\n  position: relative;\n  padding: 32rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.06);\n}\n\n.hx-canvas {\n  width: 400rpx;\n  height: 400rpx;\n  display: block;\n}\n\n/* 二维码装饰角 */\n.qrcode-corners {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  pointer-events: none;\n}\n\n.corner {\n  position: absolute;\n  width: 40rpx;\n  height: 40rpx;\n  border-color: #FF9F5A;\n  border-style: solid;\n}\n\n.corner-tl {\n  top: 16rpx;\n  left: 16rpx;\n  border-width: 6rpx 0 0 6rpx;\n  border-radius: 8rpx 0 0 0;\n}\n\n.corner-tr {\n  top: 16rpx;\n  right: 16rpx;\n  border-width: 6rpx 6rpx 0 0;\n  border-radius: 0 8rpx 0 0;\n}\n\n.corner-bl {\n  bottom: 16rpx;\n  left: 16rpx;\n  border-width: 0 0 6rpx 6rpx;\n  border-radius: 0 0 0 8rpx;\n}\n\n.corner-br {\n  bottom: 16rpx;\n  right: 16rpx;\n  border-width: 0 6rpx 6rpx 0;\n  border-radius: 0 0 8rpx 0;\n}\n\n.qrcode-label {\n  margin-top: 24rpx;\n  font-size: 26rpx;\n  color: #A89080;\n  letter-spacing: 2rpx;\n}\n\n/* 配送卡片特殊样式 */\n.delivery-card::before {\n  background: linear-gradient(90deg, #6DD0A5 0%, #4FB89D 100%);\n}\n\n.delivery-qrcode {\n  margin-top: 20rpx;\n}\n\n/* 信息卡片 */\n.info-card {\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 40rpx;\n  margin-bottom: 32rpx;\n  box-shadow: 0 4rpx 24rpx rgba(139, 111, 71, 0.06);\n}\n\n.card-section-title {\n  display: flex;\n  align-items: center;\n  font-size: 32rpx;\n  color: #5D4E3C;\n  font-weight: 600;\n  margin-bottom: 32rpx;\n  padding-bottom: 20rpx;\n  border-bottom: 2rpx solid #F5F0EA;\n}\n\n.title-icon {\n  font-size: 40rpx;\n  margin-right: 12rpx;\n}\n\n/* 地址卡片 */\n.address-content {\n  padding: 24rpx;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFEDE0 100%);\n  border-radius: 16rpx;\n}\n\n.address-contact {\n  display: flex;\n  align-items: center;\n  margin-bottom: 16rpx;\n}\n\n.contact-name {\n  font-size: 32rpx;\n  color: #5D4E3C;\n  font-weight: 600;\n  margin-right: 24rpx;\n}\n\n.contact-phone {\n  font-size: 28rpx;\n  color: #8B6F47;\n}\n\n.address-detail {\n  font-size: 28rpx;\n  color: #A89080;\n  line-height: 44rpx;\n}\n\n/* 商品列表 */\n.goods-list {\n  margin-bottom: 24rpx;\n}\n\n.goods-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-start;\n  padding: 24rpx 0;\n  border-bottom: 1rpx solid #F5F0EA;\n}\n\n.goods-item:last-child {\n  border-bottom: none;\n}\n\n.goods-main {\n  flex: 1;\n  margin-right: 24rpx;\n}\n\n.goods-name {\n  font-size: 30rpx;\n  color: #5D4E3C;\n  font-weight: 500;\n  margin-bottom: 8rpx;\n  line-height: 42rpx;\n}\n\n.goods-specs {\n  font-size: 24rpx;\n  color: #A89080;\n  line-height: 36rpx;\n  margin-top: 4rpx;\n}\n\n.goods-right {\n  display: flex;\n  align-items: center;\n  gap: 24rpx;\n}\n\n.goods-quantity {\n  font-size: 28rpx;\n  color: #8B6F47;\n  min-width: 60rpx;\n  text-align: right;\n}\n\n.goods-price {\n  font-size: 32rpx;\n  color: #FF7B3E;\n  font-weight: 600;\n  min-width: 100rpx;\n  text-align: right;\n}\n\n/* 分隔线 */\n.divider-line {\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent 0%, #F5F0EA 50%, transparent 100%);\n  margin: 24rpx 0;\n}\n\n/* 总计行 */\n.total-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 24rpx;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFEDE0 100%);\n  border-radius: 16rpx;\n  margin-bottom: 24rpx;\n}\n\n.total-label {\n  font-size: 32rpx;\n  color: #5D4E3C;\n  font-weight: 600;\n}\n\n.total-amount {\n  font-size: 44rpx;\n  color: #FF7B3E;\n  font-weight: 700;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Arial, sans-serif;\n}\n\n/* 订单时间 */\n.order-time {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 24rpx;\n  color: #A89080;\n  padding: 16rpx;\n}\n\n.time-icon {\n  margin-right: 8rpx;\n  font-size: 28rpx;\n}\n\n/* 底部装饰 */\n.bottom-decoration {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-top: 40rpx;\n  padding: 32rpx 0;\n}\n\n.decoration-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent 0%, #E5D5C5 50%, transparent 100%);\n  max-width: 120rpx;\n}\n\n.decoration-text {\n  font-size: 24rpx;\n  color: #C4B5A8;\n  padding: 0 24rpx;\n  letter-spacing: 2rpx;\n  font-weight: 300;\n}\n\n/* 动画效果 */\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n    transform: translateY(20rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes float {\n  0%, 100% {\n    transform: translateY(0);\n  }\n  50% {\n    transform: translateY(-20rpx);\n  }\n}"
  },
  {
    "path": "pages/order-details/index.js",
    "content": "const APP = getApp();\r\nconst WXAPI = require('apifm-wxapi')\r\nAPP.configLoadOK = () => {\r\n  wx.setNavigationBarTitle({\r\n    title: wx.getStorageSync('mallName')\r\n  })\r\n}\r\nconst wxbarcode = require('wxbarcode')\r\n\r\nPage({\r\n    data:{\r\n      \r\n    },\r\n    onLoad(e){\r\n      getApp().initLanguage(this)\r\n      wx.setNavigationBarTitle({\r\n        title: this.data.$t.order.detail,\r\n      })\r\n      // e.id = 1234\r\n      // e.payOrderNo = 'ZF2411231847541110'\r\n      this.setData({\r\n        orderId: e.id,\r\n        payOrderNo: e.payOrderNo,\r\n      })\r\n      if (e.payOrderNo) {\r\n        this.payLogs()\r\n      }\r\n    },\r\n    onShow : function () {\r\n      this.orderDetail()\r\n    },\r\n    async payLogs() {\r\n      wx.showLoading({\r\n        title: '',\r\n      })\r\n      const res = await WXAPI.payLogs({\r\n        token: wx.getStorageSync('token'),\r\n        orderNo: this.data.payOrderNo\r\n      })\r\n      wx.hideLoading()\r\n      if (res.code != 0) {\r\n        wx.showModal({\r\n          content: res.msg,\r\n          showCancel: false\r\n        })\r\n        return\r\n      }\r\n      const nextAction = res.data[0].nextAction\r\n      if(!nextAction) {\r\n        wx.navigateTo({\r\n          url: '/pages/asset/index',\r\n        })\r\n        return\r\n      }\r\n      const _nextAction = JSON.parse(nextAction)\r\n      if (_nextAction.type != 0) {\r\n        wx.navigateTo({\r\n          url: '/pages/asset/index',\r\n        })\r\n        return\r\n      }\r\n      this.setData({\r\n        orderId: _nextAction.id,\r\n      })\r\n      this.orderDetail()\r\n    },\r\n    async orderDetail() {\r\n      if (!this.data.orderId) {\r\n        return\r\n      }\r\n      wx.showLoading({\r\n        title: '',\r\n      })\r\n      const res = await WXAPI.orderDetail(wx.getStorageSync('token'), this.data.orderId)\r\n      wx.hideLoading()\r\n      if (res.code != 0) {\r\n        wx.showModal({\r\n          confirmText: this.data.$t.common.confirm,\r\n          cancelText: this.data.$t.common.cancel,\r\n          content: res.msg,\r\n          showCancel: false\r\n        })\r\n        return\r\n      }\r\n      // 绘制核销码\r\n      if (res.data.orderInfo.hxNumber && res.data.orderInfo.status == 1) {\r\n        wxbarcode.qrcode('qrcode', res.data.orderInfo.hxNumber, 400, 400);\r\n      }        \r\n      this.setData({\r\n        orderDetail: res.data\r\n      })\r\n      if (res.data.orderInfo.shopIdZt) {\r\n        this.shopSubdetail()\r\n      }\r\n    },\r\n    async shopSubdetail() {\r\n      const res = await WXAPI.shopSubdetail(this.data.orderDetail.orderInfo.shopIdZt)\r\n      if (res.code == 0) {\r\n        this.setData({\r\n          shopSubdetail: res.data\r\n        })\r\n      }\r\n    },\r\n    async toPayTap() {\r\n      // 立即支付\r\n      let res = await WXAPI.userAmount(wx.getStorageSync('token'))\r\n      if (res.code != 0) {\r\n        wx.showToast({\r\n          title: res.msg,\r\n          icon: 'none'\r\n        })\r\n        return\r\n      }\r\n      const balance = res.data.balance // 当前用户的余额\r\n      let needPay = this.data.orderDetail.orderInfo.amountReal*1 - balance*1\r\n      needPay = needPay.toFixed(2)\r\n      if (needPay <= 0) {\r\n        // 余额足够\r\n        WXAPI.orderPay(wx.getStorageSync('token'), this.data.orderDetail.orderInfo.id).then(res => {\r\n          wx.showToast({\r\n            title: this.data.$t.asset.success,\r\n            icon: 'success'\r\n          })\r\n          this.orderDetail();\r\n        })\r\n      } else {\r\n        // 微信支付\r\n        this.setData({\r\n          paymentShow: true,\r\n          money: needPay,\r\n          orderId: this.data.orderDetail.orderInfo.id,\r\n          nextAction: {\r\n            type: 0,\r\n            id: this.data.orderDetail.orderInfo.id\r\n          }\r\n        })\r\n      }\r\n    },\r\n    paymentOk(e) {\r\n      console.log(e.detail); // 这里是组件里data的数据\r\n      this.setData({\r\n        paymentShow: false\r\n      })\r\n      wx.redirectTo({\r\n        url: '/pages/all-orders/index',\r\n      })\r\n    },\r\n    paymentCancel() {\r\n      this.setData({\r\n        paymentShow: false\r\n      })\r\n    },\r\n    callshop() {\r\n      wx.makePhoneCall({\r\n        phoneNumber: this.data.shopSubdetail.info.linkPhone,\r\n      })\r\n    },\r\n    wuliuDetailsTap:function(e){\r\n      var orderId = e.currentTarget.dataset.id;\r\n      wx.navigateTo({\r\n        url: \"/pages/wuliu/index?id=\" + orderId\r\n      })\r\n    },\r\n    confirmBtnTap(e){\r\n      let that = this;\r\n      let orderId = this.data.orderId;\r\n      wx.showModal({\r\n        confirmText: this.data.$t.common.confirm,\r\n          cancelText: this.data.$t.common.cancel,\r\n          content: this.data.$t.order.askConfirm,\r\n          success: function(res) {\r\n            if (res.confirm) {\r\n              WXAPI.orderDelivery(wx.getStorageSync('token'), orderId).then(function (res) {\r\n                if (res.code == 0) {\r\n                  that.onShow();                  \r\n                }\r\n              })\r\n            }\r\n          }\r\n      })\r\n    },\r\n    submitReputation: function (e) {\r\n      let that = this;\r\n      let postJsonString = {};\r\n      postJsonString.token = wx.getStorageSync('token');\r\n      postJsonString.orderId = this.data.orderId;\r\n      let reputations = [];\r\n      let i = 0;\r\n      while (e.detail.value[\"orderGoodsId\" + i]) {\r\n        let orderGoodsId = e.detail.value[\"orderGoodsId\" + i];\r\n        let goodReputation = e.detail.value[\"goodReputation\" + i];\r\n        let goodReputationRemark = e.detail.value[\"goodReputationRemark\" + i];\r\n\r\n        let reputations_json = {};\r\n        reputations_json.id = orderGoodsId;\r\n        reputations_json.reputation = goodReputation;\r\n        reputations_json.remark = goodReputationRemark;\r\n\r\n        reputations.push(reputations_json);\r\n        i++;\r\n      }\r\n      postJsonString.reputations = reputations;\r\n      WXAPI.orderReputation({\r\n        postJsonString: JSON.stringify(postJsonString)\r\n      }).then(function (res) {\r\n        if (res.code == 0) {\r\n          that.onShow();\r\n        }\r\n      })\r\n    }\r\n})"
  },
  {
    "path": "pages/order-details/index.json",
    "content": "{\r\n    \"navigationBarTitleText\": \"\"\r\n}"
  },
  {
    "path": "pages/order-details/index.wxml",
    "content": "<view class=\"page-container\">\r\n  <!-- 订单状态卡片 -->\r\n  <view class=\"status-card\">\r\n    <!-- 已关闭状态 -->\r\n    <view wx:if=\"{{orderDetail.orderInfo.status == -1}}\" class=\"status-content status-closed\">\r\n      <view class=\"status-icon-wrapper\">\r\n        <van-icon name=\"close\" size=\"100rpx\" color=\"#fff\" />\r\n      </view>\r\n      <view class=\"status-title\">{{ $t.order.stausClosed }}</view>\r\n      <view class=\"status-desc\">订单已取消</view>\r\n    </view>\r\n\r\n    <!-- 待支付状态 -->\r\n    <view wx:if=\"{{orderDetail.orderInfo.status == 0}}\" class=\"status-content status-unpay\">\r\n      <view class=\"status-icon-wrapper\">\r\n        <van-icon name=\"gold-coin-o\" size=\"100rpx\" color=\"#fff\" />\r\n      </view>\r\n      <view class=\"status-title\">{{ $t.order.stausNoPay }}</view>\r\n      <view class=\"status-desc\">请尽快完成支付</view>\r\n      <view class=\"pay-btn-wrapper\">\r\n        <view class=\"pay-btn\" bind:tap=\"toPayTap\">{{ $t.order.toPayTap }}</view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 待取餐状态（自提） -->\r\n    <view wx:if=\"{{orderDetail.orderInfo.status == 1 && !orderDetail.orderInfo.isNeedLogistics}}\" class=\"status-content status-pickup\">\r\n      <view class=\"status-icon-wrapper\">\r\n        <van-icon name=\"shopping-cart-o\" size=\"100rpx\" color=\"#fff\" />\r\n      </view>\r\n      <view class=\"status-title\">等待取餐</view>\r\n      <view class=\"pickup-number-label\">{{ $t.PickingUp.qudanhao }}</view>\r\n      <view class=\"pickup-number\">{{orderDetail.orderInfo.qudanhao}}</view>\r\n      <view class=\"qrcode-wrapper\">\r\n        <view class=\"qrcode-container\">\r\n          <canvas class=\"qrcode-canvas\" canvas-id=\"qrcode\" />\r\n        </view>\r\n        <view class=\"qrcode-tip\">出示此码给店员核销</view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 配送中状态 -->\r\n    <view wx:if=\"{{(orderDetail.orderInfo.status == 1 || orderDetail.orderInfo.status == 2) && orderDetail.orderInfo.isNeedLogistics}}\" class=\"status-content status-delivery\">\r\n      <view class=\"status-icon-wrapper\">\r\n        <van-icon name=\"logistics\" size=\"100rpx\" color=\"#fff\" />\r\n      </view>\r\n      <view class=\"status-title\">{{ $t.PickingUp.Deliverying }}</view>\r\n      <view class=\"status-desc\">骑手正在火速配送中</view>\r\n      <view class=\"qrcode-wrapper\">\r\n        <view class=\"qrcode-container\">\r\n          <canvas class=\"qrcode-canvas\" canvas-id=\"qrcode\" />\r\n        </view>\r\n        <view class=\"qrcode-tip\">出示此码给骑手</view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 已完成状态 -->\r\n    <view wx:if=\"{{orderDetail.orderInfo.status == 3 || orderDetail.orderInfo.status == 4}}\" class=\"status-content status-success\">\r\n      <view class=\"status-icon-wrapper\">\r\n        <van-icon name=\"passed\" size=\"100rpx\" color=\"#fff\" />\r\n      </view>\r\n      <view class=\"status-title\">{{ $t.order.stausSuccess }}</view>\r\n      <view class=\"status-desc\">感谢您的光临，期待再次为您服务</view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 店铺信息卡片 -->\r\n  <view wx:if=\"{{shopSubdetail}}\" class=\"shop-card\">\r\n    <view class=\"card-header\">\r\n      <view class=\"header-icon\">🏪</view>\r\n      <view class=\"header-title\">店铺信息</view>\r\n    </view>\r\n    <view class=\"shop-info\">\r\n      <view class=\"shop-main\">\r\n        <view class=\"shop-name\">{{shopSubdetail.info.name}}</view>\r\n        <view class=\"shop-address\">{{shopSubdetail.info.address}}</view>\r\n      </view>\r\n      <view class=\"shop-phone\" bind:tap=\"callshop\">\r\n        <van-icon name=\"phone-circle-o\" size=\"48rpx\" color=\"#8B4513\" />\r\n        <view class=\"phone-text\">联系</view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 收货地址卡片 -->\r\n  <view wx:if=\"{{orderDetail.logistics}}\" class=\"address-card\">\r\n    <view class=\"card-header\">\r\n      <view class=\"header-icon\">📍</view>\r\n      <view class=\"header-title\">收货信息</view>\r\n    </view>\r\n    <view class=\"address-info\">\r\n      <view class=\"address-user\">\r\n        <view class=\"user-name\">{{orderDetail.logistics.linkMan}}</view>\r\n        <view class=\"user-phone\">{{orderDetail.logistics.mobile}}</view>\r\n      </view>\r\n      <view class=\"address-detail\">{{orderDetail.logistics.provinceStr}}{{orderDetail.logistics.cityStr}}{{orderDetail.logistics.areaStr}}{{orderDetail.logistics.address}}</view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 商品信息卡片 -->\r\n  <view class=\"goods-card\">\r\n    <view class=\"card-header\">\r\n      <view class=\"header-icon\">🥤</view>\r\n      <view class=\"header-title\">订单商品</view>\r\n    </view>\r\n    <view class=\"goods-list\">\r\n      <view wx:for=\"{{orderDetail.goods}}\" wx:key=\"id\" class=\"goods-item\">\r\n        <view class=\"goods-info\">\r\n          <view class=\"goods-name\">{{item.goodsName}}</view>\r\n          <view wx:if=\"{{item.property}}\" class=\"goods-spec\">{{item.property}}</view>\r\n        </view>\r\n        <view class=\"goods-right\">\r\n          <view class=\"goods-price\">¥{{item.amount}}</view>\r\n          <view class=\"goods-num\">x{{item.number}}</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n    \r\n    <view class=\"goods-divider\"></view>\r\n    \r\n    <view class=\"goods-total\">\r\n      <view class=\"total-label\">{{ $t.PickingUp.total }}</view>\r\n      <view class=\"total-price\">¥{{orderDetail.orderInfo.amountReal}}</view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 订单信息卡片 -->\r\n  <view class=\"order-info-card\">\r\n    <view class=\"card-header\">\r\n      <view class=\"header-icon\">📋</view>\r\n      <view class=\"header-title\">订单信息</view>\r\n    </view>\r\n    <view class=\"info-list\">\r\n      <view class=\"info-item\">\r\n        <view class=\"info-label\">{{ $t.order.dateAdd }}</view>\r\n        <view class=\"info-value\">{{orderDetail.orderInfo.dateAdd}}</view>\r\n      </view>\r\n      <view wx:if=\"{{orderDetail.orderInfo.status == -1}}\" class=\"info-item\">\r\n        <view class=\"info-label\">{{ $t.common.cancel }}</view>\r\n        <view class=\"info-value\">{{orderDetail.orderInfo.dateClose}}</view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 底部安全距离 -->\r\n  <view class=\"safe-bottom\"></view>\r\n</view>\r\n\r\n<payment\r\n  money=\"{{ money }}\"\r\n  remark=\"{{ $t.payment.order }} ：{{ orderId }}\"\r\n  nextAction=\"{{ nextAction }}\"\r\n  show=\"{{ paymentShow }}\"\r\n  bind:cancel=\"paymentCancel\"\r\n  bind:ok=\"paymentOk\"\r\n/>"
  },
  {
    "path": "pages/order-details/index.wxss",
    "content": "page {\r\n  background: linear-gradient(180deg, #F5E6D3 0%, #FFF8F0 100%);\r\n  min-height: 100vh;\r\n  padding-bottom: 40rpx;\r\n}\r\n\r\n/* 页面容器 */\r\n.page-container {\r\n  padding: 24rpx;\r\n}\r\n\r\n/* ========== 订单状态卡片 ========== */\r\n.status-card {\r\n  margin-bottom: 24rpx;\r\n  border-radius: 24rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 8rpx 24rpx rgba(139, 69, 19, 0.12);\r\n}\r\n\r\n.status-content {\r\n  padding: 60rpx 40rpx 50rpx;\r\n  text-align: center;\r\n  position: relative;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n}\r\n\r\n/* 状态背景渐变 */\r\n.status-closed {\r\n  background: linear-gradient(135deg, #B0B0B0 0%, #808080 100%);\r\n}\r\n\r\n.status-unpay {\r\n  background: linear-gradient(135deg, #FFB84D 0%, #FF9500 100%);\r\n}\r\n\r\n.status-pickup {\r\n  background: linear-gradient(135deg, #8B4513 0%, #A0522D 100%);\r\n}\r\n\r\n.status-delivery {\r\n  background: linear-gradient(135deg, #FF8C42 0%, #FF6B35 100%);\r\n}\r\n\r\n.status-success {\r\n  background: linear-gradient(135deg, #52C41A 0%, #389E0D 100%);\r\n}\r\n\r\n/* 状态图标 */\r\n.status-icon-wrapper {\r\n  width: 140rpx;\r\n  height: 140rpx;\r\n  background: rgba(255, 255, 255, 0.2);\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-bottom: 24rpx;\r\n  backdrop-filter: blur(10rpx);\r\n}\r\n\r\n/* 状态文字 */\r\n.status-title {\r\n  font-size: 40rpx;\r\n  font-weight: bold;\r\n  color: #fff;\r\n  margin-bottom: 12rpx;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n.status-desc {\r\n  font-size: 26rpx;\r\n  color: rgba(255, 255, 255, 0.9);\r\n  margin-top: 8rpx;\r\n}\r\n\r\n/* 支付按钮 */\r\n.pay-btn-wrapper {\r\n  margin-top: 32rpx;\r\n}\r\n\r\n.pay-btn {\r\n  display: inline-block;\r\n  background: #fff;\r\n  color: #FF9500;\r\n  padding: 20rpx 80rpx;\r\n  border-radius: 60rpx;\r\n  font-size: 30rpx;\r\n  font-weight: bold;\r\n  box-shadow: 0 8rpx 16rpx rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n/* 取餐号 */\r\n.pickup-number-label {\r\n  font-size: 28rpx;\r\n  color: rgba(255, 255, 255, 0.9);\r\n  margin-top: 24rpx;\r\n  margin-bottom: 12rpx;\r\n}\r\n\r\n.pickup-number {\r\n  font-size: 80rpx;\r\n  font-weight: bold;\r\n  color: #FFE4C4;\r\n  letter-spacing: 8rpx;\r\n  text-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);\r\n  margin: 16rpx 0;\r\n}\r\n\r\n/* 二维码 */\r\n.qrcode-wrapper {\r\n  margin-top: 32rpx;\r\n}\r\n\r\n.qrcode-container {\r\n  background: #fff;\r\n  border-radius: 20rpx;\r\n  padding: 24rpx;\r\n  display: inline-block;\r\n  box-shadow: 0 8rpx 20rpx rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n.qrcode-canvas {\r\n  width: 400rpx;\r\n  height: 400rpx;\r\n  display: block;\r\n}\r\n\r\n.qrcode-tip {\r\n  font-size: 24rpx;\r\n  color: rgba(255, 255, 255, 0.85);\r\n  margin-top: 20rpx;\r\n}\r\n\r\n/* ========== 通用卡片样式 ========== */\r\n.shop-card,\r\n.address-card,\r\n.goods-card,\r\n.order-info-card {\r\n  background: #fff;\r\n  border-radius: 20rpx;\r\n  margin-bottom: 24rpx;\r\n  padding: 32rpx;\r\n  box-shadow: 0 4rpx 16rpx rgba(139, 69, 19, 0.08);\r\n}\r\n\r\n/* 卡片头部 */\r\n.card-header {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 24rpx;\r\n  padding-bottom: 20rpx;\r\n  border-bottom: 2rpx solid #F5E6D3;\r\n}\r\n\r\n.header-icon {\r\n  font-size: 36rpx;\r\n  margin-right: 12rpx;\r\n}\r\n\r\n.header-title {\r\n  font-size: 32rpx;\r\n  font-weight: bold;\r\n  color: #8B4513;\r\n}\r\n\r\n/* ========== 店铺信息 ========== */\r\n.shop-info {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n}\r\n\r\n.shop-main {\r\n  flex: 1;\r\n}\r\n\r\n.shop-name {\r\n  font-size: 32rpx;\r\n  font-weight: bold;\r\n  color: #333;\r\n  margin-bottom: 12rpx;\r\n}\r\n\r\n.shop-address {\r\n  font-size: 26rpx;\r\n  color: #666;\r\n  line-height: 40rpx;\r\n}\r\n\r\n.shop-phone {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  background: linear-gradient(135deg, #FFF8F0 0%, #F5E6D3 100%);\r\n  border-radius: 16rpx;\r\n  padding: 20rpx 24rpx;\r\n  margin-left: 24rpx;\r\n}\r\n\r\n.phone-text {\r\n  font-size: 22rpx;\r\n  color: #8B4513;\r\n  margin-top: 8rpx;\r\n}\r\n\r\n/* ========== 收货地址 ========== */\r\n.address-info {\r\n  font-size: 28rpx;\r\n}\r\n\r\n.address-user {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 16rpx;\r\n}\r\n\r\n.user-name {\r\n  font-size: 32rpx;\r\n  font-weight: bold;\r\n  color: #333;\r\n  margin-right: 24rpx;\r\n}\r\n\r\n.user-phone {\r\n  font-size: 28rpx;\r\n  color: #666;\r\n}\r\n\r\n.address-detail {\r\n  font-size: 28rpx;\r\n  color: #666;\r\n  line-height: 44rpx;\r\n}\r\n\r\n/* ========== 商品列表 ========== */\r\n.goods-list {\r\n  margin-bottom: 24rpx;\r\n}\r\n\r\n.goods-item {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  justify-content: space-between;\r\n  padding: 24rpx 0;\r\n  border-bottom: 1rpx solid #F5F5F5;\r\n}\r\n\r\n.goods-item:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n.goods-info {\r\n  flex: 1;\r\n  padding-right: 24rpx;\r\n}\r\n\r\n.goods-name {\r\n  font-size: 30rpx;\r\n  color: #333;\r\n  margin-bottom: 8rpx;\r\n  font-weight: 500;\r\n}\r\n\r\n.goods-spec {\r\n  font-size: 24rpx;\r\n  color: #999;\r\n  line-height: 36rpx;\r\n  background: #F5F5F5;\r\n  padding: 4rpx 12rpx;\r\n  border-radius: 6rpx;\r\n  display: inline-block;\r\n  margin-top: 8rpx;\r\n}\r\n\r\n.goods-right {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: flex-end;\r\n}\r\n\r\n.goods-price {\r\n  font-size: 32rpx;\r\n  font-weight: bold;\r\n  color: #8B4513;\r\n  margin-bottom: 8rpx;\r\n}\r\n\r\n.goods-num {\r\n  font-size: 26rpx;\r\n  color: #999;\r\n}\r\n\r\n/* 商品分隔线 */\r\n.goods-divider {\r\n  height: 2rpx;\r\n  background: linear-gradient(to right, #F5E6D3, #D2B48C, #F5E6D3);\r\n  margin: 24rpx 0;\r\n}\r\n\r\n/* 总价 */\r\n.goods-total {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding-top: 24rpx;\r\n}\r\n\r\n.total-label {\r\n  font-size: 30rpx;\r\n  color: #666;\r\n}\r\n\r\n.total-price {\r\n  font-size: 40rpx;\r\n  font-weight: bold;\r\n  color: #8B4513;\r\n}\r\n\r\n/* ========== 订单信息 ========== */\r\n.info-list {\r\n  font-size: 26rpx;\r\n}\r\n\r\n.info-item {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  padding: 16rpx 0;\r\n  line-height: 40rpx;\r\n}\r\n\r\n.info-label {\r\n  color: #999;\r\n}\r\n\r\n.info-value {\r\n  color: #666;\r\n  text-align: right;\r\n}\r\n\r\n/* 底部安全距离 */\r\n.safe-bottom {\r\n  height: 40rpx;\r\n}"
  },
  {
    "path": "pages/order-details/scan-result.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\n\nPage({\n  data: {\n    \n  },\n  onLoad: function (e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.my.scanHx,\n    })\n    // e.hxNumber = '2008010532287842'\n    this.setData({\n      hxNumber: e.hxNumber\n    });\n  },\n  onShow: function () {\n    var that = this;\n    WXAPI.orderDetail(wx.getStorageSync('token'), '', this.data.hxNumber).then(function (res) {\n      if (res.code != 0) {\n        wx.showModal({\n          confirmText: this.data.$t.common.confirm,\n          cancelText: this.data.$t.common.cancel,\n          content: res.msg,\n          showCancel: false\n        })\n        return;\n      }\n      that.setData({\n        orderDetail: res.data\n      });\n    })\n  },\n  wuliuDetailsTap: function (e) {\n    var orderId = e.currentTarget.dataset.id;\n    wx.navigateTo({\n      url: \"/pages/wuliu/index?id=\" + orderId\n    })\n  },\n  confirmBtnTap(e) {\n    let that = this;\n    let orderId = this.data.orderId;\n    wx.showModal({\n      content: this.data.$t.order.askConfirm,\n      confirmText: this.data.$t.common.confirm,\n      cancelText: this.data.$t.common.cancel,\n      success: function (res) {\n        if (res.confirm) {\n          WXAPI.orderDelivery(wx.getStorageSync('token'), orderId).then(function (res) {\n            if (res.code == 0) {\n              that.onShow();\n            }\n          })\n        }\n      }\n    })\n  },\n  submitReputation: function (e) {\n    let that = this;\n    let postJsonString = {};\n    postJsonString.token = wx.getStorageSync('token');\n    postJsonString.orderId = this.data.orderId;\n    let reputations = [];\n    let i = 0;\n    while (e.detail.value[\"orderGoodsId\" + i]) {\n      let orderGoodsId = e.detail.value[\"orderGoodsId\" + i];\n      let goodReputation = e.detail.value[\"goodReputation\" + i];\n      let goodReputationRemark = e.detail.value[\"goodReputationRemark\" + i];\n\n      let reputations_json = {};\n      reputations_json.id = orderGoodsId;\n      reputations_json.reputation = goodReputation;\n      reputations_json.remark = goodReputationRemark;\n\n      reputations.push(reputations_json);\n      i++;\n    }\n    postJsonString.reputations = reputations;\n    WXAPI.orderReputation({\n      postJsonString: JSON.stringify(postJsonString)\n    }).then(function (res) {\n      if (res.code == 0) {\n        that.onShow();\n      }\n    })\n  },\n  async doneHx(){\n    wx.showLoading({\n      title: '',\n    })\n    // https://www.yuque.com/apifm/nu0f75/sq4sma\n    const res = await WXAPI.orderHXV2({\n      token: wx.getStorageSync('token'),\n      hxNumber: this.data.hxNumber\n    })\n    wx.hideLoading()\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    } else {\n      wx.showToast({\n        title: this.data.$t.order.VerificationCompleted,\n        icon: 'success'\n      })\n      this.onShow()\n    }\n  },\n})"
  },
  {
    "path": "pages/order-details/scan-result.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/order-details/scan-result.wxml",
    "content": "<view class=\"container\">\n  <!-- 核销成功标识 -->\n  <view class=\"success-header\">\n    <view class=\"success-icon\">✓</view>\n    <view class=\"success-title\">订单核销详情</view>\n    <view class=\"success-subtitle\">请确认以下信息</view>\n  </view>\n\n  <!-- 配送地址卡片 -->\n  <view class=\"card-section\" wx:if=\"{{orderDetail.logistics}}\">\n    <view class=\"card-header\">\n      <view class=\"card-icon location-icon\">📍</view>\n      <view class=\"card-title\">配送信息</view>\n    </view>\n    <view class=\"address-card\">\n      <view class=\"address-info\">\n        <view class=\"recipient-row\">\n          <view class=\"recipient-name\">{{orderDetail.logistics.linkMan}}</view>\n          <view class=\"recipient-phone\">{{orderDetail.logistics.mobile}}</view>\n        </view>\n        <view class=\"address-detail\">\n          {{orderDetail.logistics.provinceStr}} {{orderDetail.logistics.cityStr}} {{orderDetail.logistics.areaStr}} {{orderDetail.logistics.address}}\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 商品列表卡片 -->\n  <view class=\"card-section goods-section\">\n    <view class=\"card-header\">\n      <view class=\"card-icon goods-icon\">🥤</view>\n      <view class=\"card-title\">{{ $t.PickingUp.goodsInfo }}</view>\n    </view>\n    <form bindsubmit=\"submitReputation\" report-submit=\"true\">\n      <block wx:for=\"{{orderDetail.goods}}\" wx:key=\"{{index}}\">\n        <view class=\"goods-item\">\n          <view class=\"goods-image-wrap\">\n            <image src=\"{{item.pic}}\" class=\"goods-image\" mode=\"aspectFill\" />\n          </view>\n          <view class=\"goods-content\">\n            <view class=\"goods-title\">{{item.goodsName}}</view>\n            <view class=\"goods-specs\" wx:if=\"{{item.property}}\">{{item.property}}</view>\n            <view class=\"goods-footer\">\n              <view class=\"goods-price-wrap\">\n                <text class=\"price-symbol\">¥</text>\n                <text class=\"price-number\">{{item.amount}}</text>\n              </view>\n              <view class=\"goods-quantity\">x {{item.number}}</view>\n            </view>\n          </view>\n        </view>\n      </block>\n    </form>\n  </view>\n\n  <!-- 优惠券信息 -->\n  <view wx:if=\"{{orderDetail.goodsCoupons}}\" class=\"card-section coupon-section\">\n    <view class=\"card-header\">\n      <view class=\"card-icon\">🎁</view>\n      <view class=\"card-title\">优惠信息</view>\n    </view>\n    <view class=\"coupon-list\">\n      <block wx:for=\"{{orderDetail.goodsCoupons}}\" wx:key=\"{{item.id}}\">\n        <view wx:if=\"{{item.type == 0}}\" class=\"coupon-item\">\n          <view class=\"coupon-label\">{{ $t.coupons.title }}</view>\n          <view class=\"coupon-value\">{{item.coupon}}</view>\n        </view>\n        <image mode=\"widthFix\" wx:if=\"{{item.type == 1}}\" src=\"{{item.coupon}}\" class=\"coupon-image\"></image>\n      </block>\n    </view>\n  </view>\n\n  <!-- 费用明细卡片 -->\n  <view class=\"card-section amount-section\">\n    <view class=\"card-header\">\n      <view class=\"card-icon\">💰</view>\n      <view class=\"card-title\">费用明细</view>\n    </view>\n    <view class=\"amount-list\">\n      <view class=\"amount-item\">\n        <view class=\"amount-label\">{{ $t.PickingUp.goodsAmount }}</view>\n        <view class=\"amount-value\">¥ {{orderDetail.orderInfo.amount}}</view>\n      </view>\n      <view class=\"amount-item\">\n        <view class=\"amount-label\">{{ $t.PickingUp.freight }}</view>\n        <view class=\"amount-value\">+ ¥ {{orderDetail.orderInfo.amountLogistics}}</view>\n      </view>\n      <view class=\"amount-divider\"></view>\n      <view class=\"amount-item total-amount\">\n        <view class=\"amount-label\">{{ $t.PickingUp.realAmount }}</view>\n        <view class=\"amount-value total-price\">\n          <text class=\"price-symbol\">¥</text>\n          <text class=\"price-number\">{{orderDetail.orderInfo.amountReal}}</text>\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 底部占位 -->\n  <view class=\"bottom-placeholder\"></view>\n</view>\n\n<!-- 核销按钮 -->\n<view wx:if=\"{{orderDetail.orderInfo.status ==1 || orderDetail.orderInfo.status ==2}}\" class=\"confirm-button-wrap\">\n  <view class=\"confirm-button\" bindtap=\"doneHx\">\n    <text class=\"button-text\">{{ $t.PickingUp.ConfirmVerification }}</text>\n  </view>\n</view>"
  },
  {
    "path": "pages/order-details/scan-result.wxss",
    "content": "/* 页面整体样式 - 奶茶店风格 */\npage {\n  min-height: 100%;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8CC 50%, #FFDAB3 100%);\n}\n\n.container {\n  min-height: 100%;\n  padding: 20rpx 0 120rpx 0;\n}\n\n/* 顶部成功标识 */\n.success-header {\n  text-align: center;\n  padding: 50rpx 0 40rpx 0;\n  animation: fadeInDown 0.6s ease-out;\n}\n\n.success-icon {\n  width: 100rpx;\n  height: 100rpx;\n  line-height: 100rpx;\n  margin: 0 auto 20rpx;\n  background: linear-gradient(135deg, #A0673E 0%, #8B5A3C 100%);\n  color: #fff;\n  font-size: 60rpx;\n  font-weight: bold;\n  border-radius: 50%;\n  box-shadow: 0 8rpx 24rpx rgba(139, 90, 60, 0.3);\n}\n\n.success-title {\n  font-size: 36rpx;\n  font-weight: bold;\n  color: #5D3A1A;\n  margin-bottom: 12rpx;\n  letter-spacing: 2rpx;\n}\n\n.success-subtitle {\n  font-size: 26rpx;\n  color: #8B7355;\n  opacity: 0.9;\n}\n\n/* 卡片通用样式 */\n.card-section {\n  margin: 0 24rpx 24rpx 24rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  box-shadow: 0 8rpx 24rpx rgba(139, 90, 60, 0.12);\n  overflow: hidden;\n  animation: fadeInUp 0.5s ease-out;\n}\n\n.card-header {\n  display: flex;\n  align-items: center;\n  padding: 32rpx 28rpx 24rpx 28rpx;\n  border-bottom: 2rpx solid #F5F5F5;\n}\n\n.card-icon {\n  font-size: 36rpx;\n  margin-right: 16rpx;\n  width: 48rpx;\n  height: 48rpx;\n  line-height: 48rpx;\n  text-align: center;\n  border-radius: 12rpx;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8CC 100%);\n}\n\n.card-title {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #5D3A1A;\n  letter-spacing: 1rpx;\n}\n\n/* 配送地址样式 */\n.address-card {\n  padding: 24rpx 28rpx 32rpx 28rpx;\n}\n\n.address-info {\n  position: relative;\n  padding-left: 20rpx;\n  border-left: 4rpx solid #A0673E;\n}\n\n.recipient-row {\n  display: flex;\n  align-items: center;\n  margin-bottom: 16rpx;\n}\n\n.recipient-name {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #2C2C2C;\n  margin-right: 24rpx;\n}\n\n.recipient-phone {\n  font-size: 28rpx;\n  color: #666666;\n  background: #F8F8F8;\n  padding: 4rpx 16rpx;\n  border-radius: 8rpx;\n}\n\n.address-detail {\n  font-size: 26rpx;\n  color: #666666;\n  line-height: 40rpx;\n}\n\n/* 商品列表样式 */\n.goods-section {\n  padding-bottom: 16rpx;\n}\n\n.goods-item {\n  display: flex;\n  padding: 24rpx 28rpx;\n  position: relative;\n}\n\n.goods-item::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 28rpx;\n  right: 28rpx;\n  height: 1rpx;\n  background: linear-gradient(90deg, transparent 0%, #EEEEEE 50%, transparent 100%);\n}\n\n.goods-item:last-child::after {\n  display: none;\n}\n\n.goods-image-wrap {\n  width: 180rpx;\n  height: 180rpx;\n  border-radius: 16rpx;\n  overflow: hidden;\n  margin-right: 20rpx;\n  box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);\n  flex-shrink: 0;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE8CC 100%);\n}\n\n.goods-image {\n  width: 100%;\n  height: 100%;\n}\n\n.goods-content {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  padding: 8rpx 0;\n}\n\n.goods-title {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #2C2C2C;\n  line-height: 40rpx;\n  margin-bottom: 8rpx;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n}\n\n.goods-specs {\n  font-size: 24rpx;\n  color: #999999;\n  background: #F5F5F5;\n  padding: 6rpx 12rpx;\n  border-radius: 6rpx;\n  display: inline-block;\n  align-self: flex-start;\n  margin-bottom: 12rpx;\n}\n\n.goods-footer {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n}\n\n.goods-price-wrap {\n  display: flex;\n  align-items: baseline;\n}\n\n.price-symbol {\n  font-size: 24rpx;\n  color: #A0673E;\n  font-weight: 600;\n  margin-right: 4rpx;\n}\n\n.price-number {\n  font-size: 32rpx;\n  color: #A0673E;\n  font-weight: 700;\n}\n\n.goods-quantity {\n  font-size: 26rpx;\n  color: #999999;\n  background: #F8F8F8;\n  padding: 6rpx 16rpx;\n  border-radius: 8rpx;\n}\n\n/* 优惠券样式 */\n.coupon-section {\n  background: linear-gradient(135deg, #FFF8F0 0%, #FFFFFF 100%);\n}\n\n.coupon-list {\n  padding: 0 28rpx 24rpx 28rpx;\n}\n\n.coupon-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 20rpx 24rpx;\n  background: linear-gradient(90deg, #A0673E 0%, #8B5A3C 100%);\n  border-radius: 12rpx;\n  margin-bottom: 16rpx;\n}\n\n.coupon-item:last-child {\n  margin-bottom: 0;\n}\n\n.coupon-label {\n  font-size: 26rpx;\n  color: #FFFFFF;\n  font-weight: 600;\n}\n\n.coupon-value {\n  font-size: 28rpx;\n  color: #FFE8CC;\n  font-weight: 700;\n}\n\n.coupon-image {\n  width: 100%;\n  border-radius: 12rpx;\n}\n\n/* 费用明细样式 */\n.amount-section {\n  background: linear-gradient(135deg, #FFFBF5 0%, #FFFFFF 100%);\n}\n\n.amount-list {\n  padding: 16rpx 28rpx 24rpx 28rpx;\n}\n\n.amount-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 16rpx 0;\n}\n\n.amount-label {\n  font-size: 28rpx;\n  color: #666666;\n}\n\n.amount-value {\n  font-size: 28rpx;\n  color: #2C2C2C;\n  font-weight: 500;\n}\n\n.amount-divider {\n  height: 1rpx;\n  background: linear-gradient(90deg, transparent 0%, #DDDDDD 50%, transparent 100%);\n  margin: 12rpx 0;\n}\n\n.total-amount {\n  padding: 20rpx 0 8rpx 0;\n}\n\n.total-amount .amount-label {\n  font-size: 30rpx;\n  color: #2C2C2C;\n  font-weight: 600;\n}\n\n.total-amount .total-price {\n  display: flex;\n  align-items: baseline;\n}\n\n.total-amount .price-symbol {\n  font-size: 28rpx;\n  color: #A0673E;\n  font-weight: 700;\n}\n\n.total-amount .price-number {\n  font-size: 40rpx;\n  color: #A0673E;\n  font-weight: 800;\n}\n\n/* 底部占位 */\n.bottom-placeholder {\n  height: 40rpx;\n}\n\n/* 确认核销按钮 */\n.confirm-button-wrap {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding: 16rpx 24rpx 32rpx 24rpx;\n  background: linear-gradient(to top, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0.95) 80%, transparent 100%);\n  z-index: 999;\n}\n\n.confirm-button {\n  width: 100%;\n  height: 96rpx;\n  background: linear-gradient(135deg, #A0673E 0%, #8B5A3C 100%);\n  border-radius: 48rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 8rpx 24rpx rgba(139, 90, 60, 0.4);\n  transition: all 0.3s ease;\n}\n\n.confirm-button:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 12rpx rgba(139, 90, 60, 0.5);\n}\n\n.button-text {\n  font-size: 32rpx;\n  color: #FFFFFF;\n  font-weight: 700;\n  letter-spacing: 4rpx;\n}\n\n/* 动画效果 */\n@keyframes fadeInDown {\n  from {\n    opacity: 0;\n    transform: translateY(-30rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    transform: translateY(30rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n/* 兼容旧样式类名 */\n.hx-btn {\n  width: 650rpx;\n  margin: 0 50rpx 50rpx 50rpx;\n  background: linear-gradient(135deg, #A0673E 0%, #8B5A3C 100%);\n  color: #fff;\n  text-align: center;\n  height: 88rpx;\n  line-height: 88rpx;\n  border-radius: 48rpx;\n  font-weight: 700;\n  font-size: 32rpx;\n  letter-spacing: 2rpx;\n  box-shadow: 0 8rpx 24rpx rgba(139, 90, 60, 0.4);\n}"
  },
  {
    "path": "pages/pay/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\n\nPage({\n  data: {\n    wxlogin: true,\n    switch1 : true, //switch开关\n\n    addressList: [],\n    curAddressData: [],\n\n    totalScoreToPay: 0,\n    goodsList: [],\n    allGoodsPrice: 0,\n    amountReal: 0,\n    yunPrice: 0,\n    allGoodsAndYunPrice: 0,\n    goodsJsonStr: \"\",\n    orderType: \"\", //订单类型，购物车下单或立即支付下单，默认是购物车，\n    pingtuanOpenId: undefined, //拼团的话记录团号\n    \n    curCoupon: null, // 当前选择使用的优惠券\n    curCouponShowText: '', // 当前选择使用的优惠券\n    peisongType: '', // 配送方式 kd,zq 分别表示快递/到店自取【默认值到onshow修改，这里修改无效】\n    submitLoding: false,\n    remark: '',\n    \n    // 会员卡相关\n    cardMyList: [], // 我的会员卡列表\n    curCard: null, // 当前选择使用的会员卡\n\n    currentDate: new Date().getHours() + ':' + (new Date().getMinutes() % 10 === 0 ? new Date().getMinutes() : Math.ceil(new Date().getMinutes() / 10) * 10),\n    minHour: new Date().getHours(),\n    minMinute: new Date().getMinutes(),\n    formatter(type, value) {\n      if (type === 'hour') {\n        return `${value}点`;\n      } else if (type === 'minute') {\n        return `${value}分`;\n      }\n      return value;\n    },\n    filter(type, options) {\n      if (type === 'minute') {\n        return options.filter((option) => option % 10 === 0);\n      }\n      return options;\n    },\n    packaging_fee_use: '1', // 自提需要包装费\n    tihuodianOpen: false, // 是否开启提货点，后台系统开关参数控制\n    selectedPickPointId: null, // 选择的提货点ID\n  },\n  diningTimeChange(a) {\n    const selectedHour = a.detail.getColumnValue(0).replace('点', '') * 1\n    if (selectedHour == new Date().getHours()) {\n      let minMinute = new Date().getMinutes()\n      if (minMinute % 10 != 0) {\n        minMinute = Math.round(minMinute / 10 + 1);\n      }\n      this.setData({\n        minMinute\n      })\n    } else {\n      this.setData({\n        minMinute: 0\n      })\n    }\n  },\n  onShow(){\n    const shopInfo = wx.getStorageSync('shopInfo')\n    let peisongType = wx.getStorageSync('peisongType')\n    if (!peisongType) {\n      peisongType = 'zq' // 此处修改默认值\n    }\n    if (shopInfo.openWaimai && !shopInfo.openZiqu) {\n      peisongType = 'kd'\n    }\n    if (!shopInfo.openWaimai && shopInfo.openZiqu) {\n      peisongType = 'zq'\n    }\n    this.setData({\n      shopInfo,\n      peisongType\n    })\n    this._pickPoints()\n    AUTH.checkHasLogined().then(isLogined => {\n      this.setData({\n        wxlogin: isLogined\n      })\n      if (isLogined) {\n        this.doneShow()\n      }\n    })\n    AUTH.wxaCode().then(code => {\n      this.data.code = code\n    })\n  },\n  async doneShow() {\n    let goodsList = [];\n    const token = wx.getStorageSync('token')\n    //立即购买下单\n    if (\"buyNow\" == this.data.orderType) {\n      goodsList = wx.getStorageSync('pingtuanGoodsList')\n    } else {\n      //购物车下单\n      const res = await WXAPI.shippingCarInfo(token)\n      if (res.code == 0) {\n        goodsList = res.data.items\n      }\n    }\n    this.setData({\n      goodsList: goodsList\n    })\n    this.initShippingAddress()\n    this.loadCardList()\n  },\n\n  onLoad(e) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.pay.title,\n    })\n    let _data = {\n      kjId: e.kjId,\n      create_order_select_time: wx.getStorageSync('create_order_select_time'),\n      packaging_fee: wx.getStorageSync('packaging_fee'),\n      curCouponShowText: this.data.$t.pay.choose,\n      tihuodianOpen: wx.getStorageSync('tihuodianOpen'),\n    }\n    if (e.orderType) {\n      _data.orderType = e.orderType\n    }\n    if (e.pingtuanOpenId) {\n      _data.pingtuanOpenId = e.pingtuanOpenId\n    }\n    this.setData(_data)\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n    getApp().getUserDetailOK = (apiUserInfoMap) => {\n      this.processGotUserDetail(apiUserInfoMap)\n    }\n    this._peisonFeeList()\n  },\n  async processGotUserDetail(apiUserInfoMap) {\n    if (!apiUserInfoMap) {\n      return\n    }\n    this.setData({\n      nick: apiUserInfoMap.base.nick,\n      avatarUrl: apiUserInfoMap.base.avatarUrl,\n      mobile: apiUserInfoMap.base.mobile\n    })\n  },\n  selected(e){\n    const peisongType = e.currentTarget.dataset.pstype\n    this.setData({\n      peisongType\n    })\n    wx.setStorageSync('peisongType', peisongType)\n    this.createOrder()\n  },\n  \n  getDistrictId: function (obj, aaa) {\n    if (!obj) {\n      return \"\";\n    }\n    if (!aaa) {\n      return \"\";\n    }\n    return aaa;\n  },\n  // 备注\n  remarkChange(e){\n    this.data.remark = e.detail.value\n  },\n  goCreateOrder(){\n    if (this.data.submitLoding) return\n    const mobile = this.data.mobile\n    if (this.data.peisongType == 'zq' && !mobile) {\n      wx.showToast({\n        title: this.data.$t.pay.inputphoneNO,\n        icon: 'none'\n      })\n      return\n    }\n    if (!this.data.diningTime && this.data.create_order_select_time == '1') {\n      wx.showToast({\n        title: this.data.$t.pay.select,\n        icon: 'none'\n      })\n      return\n    }\n    this.setData({\n      submitLoding: true\n    })\n    const subscribe_ids = wx.getStorageSync('subscribe_ids')\n    if (subscribe_ids) {\n      wx.requestSubscribeMessage({\n        tmplIds: subscribe_ids.split(','),\n        success(res) {},\n        fail(e) {\n          this.setData({\n            submitLoding: false\n          })\n          console.error(e)\n        },\n        complete: (e) => {\n          this.createOrder(true)\n        },\n      })\n    } else {\n      if (this.data.shopInfo.serviceDistance && this.data.distance && this.data.distance > this.data.shopInfo.serviceDistance * 1 && this.data.peisongType == 'kd') {\n        wx.showToast({\n          title: this.data.$t.pay.address,\n          icon: 'none'\n        })\n        return\n      }\n      this.createOrder(true)\n    }\n  },\n  async createOrder(e) {\n    var that = this;\n    var loginToken = wx.getStorageSync('token') // 用户登录 token\n    var remark = this.data.remark; // 备注信息\n    const postData = {\n      token: loginToken,\n      goodsJsonStr: that.data.goodsJsonStr,\n      remark: remark,\n      peisongType: that.data.peisongType,\n      isCanHx: true\n    }\n    if (e && that.data.peisongType == 'zq' && that.data.tihuodianOpen == '1') {\n      // 开启了自提点的功能\n      if (!that.data.selectedPickPointId) {\n        wx.showToast({\n          title: '请选择提货点',\n          icon: 'none'\n        })\n        return\n      }\n      postData.pickPointId = that.data.selectedPickPointId\n    }\n    if (this.data.shopInfo) {\n      if (!this.data.shopInfo.openWaimai && !this.data.shopInfo.openZiqu) {\n        wx.showModal({\n          confirmText: this.data.$t.common.confirm,\n          cancelText: this.data.$t.common.cancel,\n          content: this.data.$t.pay.servicesclosed,\n          showCancel: false\n        })\n        return;\n      }\n      postData.shopIdZt = this.data.shopInfo.id\n      postData.shopNameZt = this.data.shopInfo.name\n    }\n    if (that.data.kjId) {\n      postData.kjid = that.data.kjId\n    }\n    if (that.data.pingtuanOpenId) {\n      postData.pingtuanOpenId = that.data.pingtuanOpenId\n    }\n    const extJsonStr = {}\n    if (postData.peisongType == 'zq') {\n      extJsonStr['联系电话'] = this.data.mobile\n      if (this.data.packaging_fee && this.data.packaging_fee_use == '1') {\n        postData.trips = this.data.packaging_fee\n      }\n    }\n    if (this.data.create_order_select_time == '1') {\n      if (postData.peisongType == 'zq') {\n        extJsonStr['取餐时间'] = this.data.diningTime\n      } else {\n        extJsonStr['送达时间'] = this.data.diningTime\n      }\n    }\n    postData.extJsonStr = JSON.stringify(extJsonStr)\n    // 有设置了配送费的情况下，计算运费\n    if (this.data.peisonFeeList && postData.peisongType == 'kd') {\n      let distance = await this.getDistance(this.data.curAddressData)\n      const peisonFee = this.data.peisonFeeList.find(ele => {\n        return ele.distance >= distance\n      })\n      if (peisonFee) {\n        postData.peisongFeeId = peisonFee.id\n      }\n    }\n    // 达达配送\n    if (this.data.shopInfo && this.data.shopInfo.number && this.data.shopInfo.expressType == 'dada' && postData.peisongType == 'kd') {\n      if (!that.data.curAddressData) {\n        wx.hideLoading();\n        wx.showToast({\n          title: this.data.$t.pay.setaddress,\n          icon: 'none'\n        })\n        return;\n      }\n      postData.dadaShopNo = this.data.shopInfo.number\n      postData.lat = this.data.curAddressData.latitude\n      postData.lng = this.data.curAddressData.longitude\n    }\n    if (e && postData.peisongType == 'kd') {\n      if (!that.data.curAddressData) {\n        wx.hideLoading();\n        wx.showToast({\n          title: this.data.$t.pay.Receivingaddress,\n          icon: 'none'\n        })\n        return;\n      }\n      postData.provinceId = that.data.curAddressData.provinceId;\n      postData.cityId = that.data.curAddressData.cityId;\n      if (that.data.curAddressData.districtId) {\n        postData.districtId = that.data.curAddressData.districtId;\n      }\n      postData.address = that.data.curAddressData.address;\n      postData.linkMan = that.data.curAddressData.linkMan;\n      postData.mobile = that.data.curAddressData.mobile;\n      postData.code = that.data.curAddressData.code;     \n    }\n    if (that.data.curCoupon) {\n      postData.couponId = that.data.curCoupon.id;\n    }\n    if (that.data.curCard) {\n      postData.cardId = that.data.curCard.id;\n    }\n    if (!e) {\n      postData.calculate = \"true\";\n    }\n    // console.log(postData)\n    // console.log(e)\n    WXAPI.orderCreate(postData)\n    .then(function (res) {     \n      console.log(res.data) \n      if (res.code != 0) {\n        wx.showModal({\n          confirmText: that.data.$t.common.confirm,\n          cancelText: that.data.$t.common.cancel,\n          content: res.msg,\n          showCancel: false\n        })\n        return;\n      }\n\n      if (e && \"buyNow\" != that.data.orderType) {\n        // 清空购物车数据\n        WXAPI.shippingCarInfoRemoveAll(loginToken)\n      }\n      if (!e) {\n        const coupons = res.data.couponUserList\n        if (coupons) {\n          coupons.forEach(ele => {\n            let moneyUnit = '元'\n            if (ele.moneyType == 1) {\n              moneyUnit = '%'\n            }\n            if (ele.moneyHreshold) {\n              ele.nameExt = ele.name + + ' ['+ that.data.$t.pay.Fullconsumption +'' + ele.moneyHreshold + that.data.$t.pay.RMBreduced + ele.money + moneyUnit +']'\n            } else {\n              ele.nameExt = ele.name + ' ['+ that.data.$t.pay.Fullconsumption +'' + ele.money + moneyUnit + ']'\n            }\n          })\n        }\n        that.setData({\n          totalScoreToPay: res.data.score,\n          allGoodsNumber: res.data.goodsNumber,\n          allGoodsPrice: res.data.amountTotle,\n          allGoodsAndYunPrice: res.data.amountLogistics + res.data.amountTotle,\n          yunPrice: res.data.amountLogistics,\n          peisongfee: res.data.peisongfee,\n          amountReal: res.data.amountReal,\n          coupons\n        });\n        return;\n      }\n      return that.processAfterCreateOrder(res)\n    })\n    .finally(() => {\n      // 再唤起微信支付的时候，有大约1s的弹窗动画过度，加上 1s 的延迟可以稳定防止重复下单\n      setTimeout(() => {\n        this.setData({\n          submitLoding: false\n        })\n      }, 1000)\n    })\n  },\n  async processAfterCreateOrder(res) {\n    const token = wx.getStorageSync('token')\n    if (res.data.status != 0) {\n      // 待支付状态才需要支付\n      wx.redirectTo({\n        url: \"/pages/all-orders/index\"\n      })\n      return\n    }\n    // 直接弹出支付，取消支付的话，去订单列表\n    const res1 = await WXAPI.userAmount(token)\n    if (res1.code != 0) {\n      wx.showToast({\n        title: this.data.$t.pay.information,\n        icon: 'none'\n      })\n      wx.redirectTo({\n        url: \"/pages/all-orders/index\"\n      });\n      return\n    }\n    const money = res.data.amountReal * 1 - res1.data.balance*1\n    if (money <= 0) {\n      // 使用余额支付\n      await WXAPI.orderPay(token, res.data.id)\n      // 跳到订单列表\n      wx.redirectTo({\n        url: \"/pages/all-orders/index\"\n      })\n    } else {\n      this.setData({\n        paymentShow: true,\n        money,\n        orderId: res.data.id,\n        nextAction: {\n          type: 0,\n          id: res.data.id\n        }\n      })\n    }\n  },\n  paymentOk(e) {\n    console.log(e.detail); // 这里是组件里data的数据\n    this.setData({\n      paymentShow: false\n    })\n    wx.redirectTo({\n      url: '/pages/all-orders/index',\n    })\n  },\n  paymentCancel() {\n    this.setData({\n      paymentShow: false\n    })\n  },\n  async getDistance(curAddressData) {\n    // 计算门店与收货地址之间的距离\n    if (!this.data.shopInfo || !this.data.shopInfo.latitude || !this.data.shopInfo.longitude || !curAddressData || !curAddressData.latitude || !curAddressData.longitude) {\n      return 0\n    }\n    let distance = 0\n    const QQ_MAP_KEY = wx.getStorageSync('QQ_MAP_KEY')\n    if (QQ_MAP_KEY == '1') {\n      const distanceRes = await WXAPI.gpsDistance({\n        key: QQ_MAP_KEY,\n        mode: 'bicycling',\n        from: this.data.shopInfo.latitude + ',' + this.data.shopInfo.longitude,\n        to: curAddressData.latitude + ',' + curAddressData.longitude\n      })\n      if (distanceRes.code != 0) {\n        wx.showToast({\n          title: distanceRes.msg,\n          icon: 'none'\n        })\n        return distance\n      }\n      distance = distanceRes.data.result.rows[0].elements[0].distance / 1000.0\n      return distance\n    }\n    // 只能计算直线距离\n    return this.getDistanceLine(this.data.shopInfo.latitude, this.data.shopInfo.longitude, curAddressData.latitude, curAddressData.longitude) / 1000\n  },\n  getDistanceLine(lat1, lng1, lat2, lng2) {\n    var dis = 0;\n    var radLat1 = toRadians(lat1);\n    var radLat2 = toRadians(lat2);\n    var deltaLat = radLat1 - radLat2;\n    var deltaLng = toRadians(lng1) - toRadians(lng2);\n    var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));\n    return dis * 6378137;\n  \n    function toRadians(d) {\n      return d * Math.PI / 180;\n    }\n  },\n  async initShippingAddress() {\n    const res = await WXAPI.defaultAddress(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      // 计算距离\n      let distance = await this.getDistance(res.data.info)\n      console.log('distance', distance);\n      if (this.data.shopInfo.serviceDistance && distance > this.data.shopInfo.serviceDistance * 1 && this.data.peisongType == 'kd') {\n        wx.showToast({\n          title: this.data.$t.pay.address,\n          icon: 'none'\n        })\n      }\n      this.setData({\n        curAddressData: res.data.info,\n        distance\n      })\n    } else {\n      this.setData({\n        curAddressData: null\n      });\n    }\n    this.processYunfei();\n  },\n  processYunfei() {\n    var goodsList = this.data.goodsList\n    if (goodsList.length == 0) {\n      return\n    }\n    const goodsJsonStr = []\n    var isNeedLogistics = 0;\n\n    let inviter_id = 0;\n    let inviter_id_storge = wx.getStorageSync('referrer');\n    if (inviter_id_storge) {\n      inviter_id = inviter_id_storge;\n    }\n    for (let i = 0; i < goodsList.length; i++) {\n      let carShopBean = goodsList[i];\n      if (carShopBean.stores < carShopBean.minBuyNumber) {\n        continue\n      }\n      if (carShopBean.logistics || carShopBean.logisticsId) {\n        isNeedLogistics = 1;\n      }\n\n      const _goodsJsonStr = {\n        propertyChildIds: carShopBean.propertyChildIds\n      }\n      if (carShopBean.sku && carShopBean.sku.length > 0) {\n        let propertyChildIds = ''\n        carShopBean.sku.forEach(option => {\n          propertyChildIds = propertyChildIds + ',' + option.optionId + ':' + option.optionValueId\n        })\n        _goodsJsonStr.propertyChildIds = propertyChildIds\n      }\n      if (carShopBean.additions && carShopBean.additions.length > 0) {\n        let goodsAdditionList = []\n        carShopBean.additions.forEach(option => {\n          goodsAdditionList.push({\n            pid: option.pid,\n            id: option.id\n          })\n        })\n        _goodsJsonStr.goodsAdditionList = goodsAdditionList\n      }\n      _goodsJsonStr.goodsId = carShopBean.goodsId\n      _goodsJsonStr.number = carShopBean.number\n      _goodsJsonStr.logisticsType = 0\n      _goodsJsonStr.inviter_id = inviter_id\n      _goodsJsonStr.goodsTimesDay = carShopBean.goodsTimesDay || ''\n      _goodsJsonStr.goodsTimesItem = carShopBean.goodsTimesItem || ''\n      goodsJsonStr.push(_goodsJsonStr)\n    }\n    this.setData({\n      isNeedLogistics: isNeedLogistics,\n      goodsJsonStr: JSON.stringify(goodsJsonStr)\n    });\n    this.createOrder()\n  },\n  addAddress: function () {\n    wx.navigateTo({\n      url: \"/pages/ad/index\"\n    })\n  },\n  selectAddress: function () {\n    wx.navigateTo({\n      url: \"/pages/ad/index\"\n    })\n  },\n  bindChangeCoupon: function (e) {\n    const selIndex = e.detail.value;\n    this.setData({\n      curCoupon: this.data.coupons[selIndex],\n      curCouponShowText: this.data.coupons[selIndex].nameExt\n    })\n    this.createOrder()\n  },\n  // 加载会员卡列表\n  async loadCardList() {\n    const token = wx.getStorageSync('token')\n    const res = await WXAPI.cardMyList(token)\n    if (res.code == 0 && res.data && res.data.length > 0) {\n      // 过滤出可用的会员卡（已激活且有余额/次数）\n      const availableCards = res.data.filter(card => {\n        return card.isActive && card.amount > 0\n      })\n      this.setData({\n        cardMyList: availableCards\n      })\n    }\n  },\n  // 选择会员卡\n  selectCard: function (e) {\n    const card = e.currentTarget.dataset.card\n    this.setData({\n      curCard: card\n    })\n    this.createOrder()\n  },\n  // 选择提货点\n  selectPickPoint: function (e) {\n    const pickPointId = e.currentTarget.dataset.id;\n    this.setData({\n      selectedPickPointId: pickPointId\n    })\n  },\n  async getPhoneNumber(e) {\n    if (!e.detail.errMsg || e.detail.errMsg != \"getPhoneNumber:ok\") {\n      wx.showToast({\n        title: e.detail.errMsg,\n        icon: 'none'\n      })\n      return;\n    }\n    const res = await WXAPI.bindMobileWxapp(wx.getStorageSync('token'), this.data.code, e.detail.encryptedData, e.detail.iv)\n    AUTH.wxaCode().then(code => {\n      this.data.code = code\n    })\n    if (res.code === 10002) {\n      wx.showToast({\n        title: this.data.$t.pay.login,\n        icon: 'none'\n      })\n      return\n    }\n    if (res.code == 0) {\n      wx.showToast({\n        title: this.data.$t.pay.fetchsuccessful,\n        icon: 'success'\n      })\n      this.setData({\n        mobile: res.data\n      })\n    } else {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    }\n  },\n  diningTimeShow() {\n    this.setData({\n      diningTimeShow: true\n    })\n  },\n  diningTimeHide() {\n    this.setData({\n      diningTimeShow: false\n    })\n  },\n  diningTimeConfirm(e) {\n    this.setData({\n      diningTime: e.detail\n    })\n    this.diningTimeHide()\n  },\n  updateUserInfo(e) {\n    wx.getUserProfile({\n      lang: 'zh_CN',\n      desc: this.data.$t.pay.memberinformation,\n      success: res => {\n        console.log(res);\n        this._updateUserInfo(res.userInfo)\n      },\n      fail: err => {\n        wx.showToast({\n          title: err.errMsg,\n          icon: 'none'\n        })\n      }\n    })\n  },\n  async _updateUserInfo(userInfo) {\n    const postData = {\n      token: wx.getStorageSync('token'),\n      nick: userInfo.nickName,\n      avatarUrl: userInfo.avatarUrl,\n      city: userInfo.city,\n      province: userInfo.province,\n      gender: userInfo.gender,\n    }\n    // https://www.yuque.com/apifm/nu0f75/ykr2zr\n    const res = await WXAPI.modifyUserInfoV2(postData)\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n      return\n    }\n    wx.showToast({\n      title: this.data.$t.pay.Loginsuccessful,\n    })\n    getApp().getUserApiInfo().then(apiUserInfoMap => {\n      this.processGotUserDetail(apiUserInfoMap)\n    })\n  },\n  async _peisonFeeList() {\n    // https://www.yuque.com/apifm/nu0f75/nx465k\n    const res = await WXAPI.peisonFeeList()\n    if (res.code == 0) {\n      this.data.peisonFeeList = res.data\n    }\n  },\n  packaging_fee_Change(event) {\n    this.setData({\n      packaging_fee_use: event.detail,\n    })\n    this.createOrder()\n  },\n  packaging_fee_Click(event) {\n    const { name } = event.currentTarget.dataset;\n    this.setData({\n      packaging_fee_use: name,\n    })\n    this.createOrder()\n  },\n  async _pickPoints() {\n    // 获取提货点列表 https://www.yuque.com/apifm/nu0f75/hm3exv\n    const res = await WXAPI.pickPoints({\n      shopIds: '0,' + this.data.shopInfo.id\n    })\n    if (res.code == 0) {\n      this.setData({\n        pickPoints: res.data.result\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/pay/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/pay/index.wxml",
    "content": "<!-- 店铺信息卡片 -->\n<view class=\"shop-card\">\n  <navigator class=\"shop-header\" url=\"/pages/shop/select?type=pay\">\n    <view class=\"shop-icon\">\n      <van-icon name=\"shop-o\" size=\"36rpx\" color=\"#8B5A3C\" />\n    </view>\n    <view class=\"shop-info\">\n      <view class=\"shop-name\">{{shopInfo.name}}<text wx:if=\"{{shopInfo.distance}}\" class=\"distance\">{{shopInfo.distance}}km</text></view>\n      <view class=\"shop-address\">{{shopInfo.address}}</view>\n    </view>\n    <view class=\"arrow-icon\">\n      <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\n    </view>\n  </navigator>\n</view>\n\n<!-- 配送方式卡片 -->\n<view class=\"delivery-card\">\n  <view class=\"card-title\">配送方式</view>\n  <view wx:if=\"{{ shopInfo.openWaimai && shopInfo.openZiqu }}\" class=\"delivery-options\">\n    <view class=\"delivery-option {{peisongType == 'zq' ? 'active' : ''}}\" bindtap=\"selected\" data-pstype=\"zq\">\n      <view class=\"option-icon\">\n        <van-icon name=\"shop-collect-o\" size=\"40rpx\" color=\"{{peisongType == 'zq' ? '#fff' : '#8B5A3C'}}\" />\n      </view>\n      <view class=\"option-text\">{{ $t.index.pickup }}</view>\n    </view>\n    <view class=\"delivery-option {{peisongType == 'kd' ? 'active' : ''}}\" bindtap=\"selected\" data-pstype=\"kd\">\n      <view class=\"option-icon\">\n        <van-icon name=\"logistics\" size=\"40rpx\" color=\"{{peisongType == 'kd' ? '#fff' : '#8B5A3C'}}\" />\n      </view>\n      <view class=\"option-text\">{{ $t.index.Delivery }}</view>\n    </view>\n  </view>\n  \n  <!-- 配送地址 -->\n  <view class=\"address-section\" wx:if=\"{{peisongType == 'kd'}}\">\n    <view class=\"section-divider\"></view>\n    <view class=\"address-content\" wx:if=\"{{!curAddressData}}\" bindtap=\"addAddress\">\n      <view class=\"add-address-btn\">\n        <van-icon name=\"add-o\" color=\"#D4A574\" size=\"40rpx\" />\n        <text class=\"add-text\">{{ $t.pay.Addaddress }}</text>\n      </view>\n    </view>\n    <view class=\"address-content address-detail\" wx:if=\"{{curAddressData}}\" bindtap=\"selectAddress\">\n      <view class=\"address-left\">\n        <view class=\"address-icon\">\n          <van-icon name=\"location-o\" size=\"36rpx\" color=\"#D4A574\" />\n        </view>\n        <view class=\"address-info\">\n          <view class=\"contact-info\">{{curAddressData.linkMan}} {{curAddressData.mobile}}</view>\n          <view class=\"address-text\">{{curAddressData.address}}</view>\n        </view>\n      </view>\n      <view class=\"address-right\">\n        <van-icon name=\"arrow\" size=\"32rpx\" color=\"#999\" />\n      </view>\n    </view>\n  </view>\n\n  <!-- 自取手机号 -->\n  <view class=\"phone-section\" wx:if=\"{{peisongType == 'zq'}}\">\n    <view class=\"section-divider\"></view>\n    <van-field\n      model:value=\"{{ mobile }}\"\n      label=\"{{ $t.booking.mobile }}\"\n      label-width=\"120rpx\"\n      type=\"number\"\n      clearable\n      focus\n      placeholder=\"{{ $t.pay.inputphoneNO }}\"\n      custom-style=\"background: transparent; padding: 24rpx 0;\">\n      <van-button slot=\"button\" size=\"small\" round custom-class=\"phone-btn\" open-type=\"getPhoneNumber\" bind:getphonenumber=\"getPhoneNumber\">{{ $t.pay.reBind }}</van-button>\n    </van-field>\n  </view>\n\n  <!-- 提货点选择 -->\n  <view class=\"pickpoint-section\" wx:if=\"{{peisongType == 'zq' && tihuodianOpen == 1 && pickPoints && pickPoints.length > 0}}\">\n    <view class=\"section-divider\"></view>\n    <view class=\"section-title\">选择提货点</view>\n    <view class=\"pickpoint-list\">\n      <view class=\"pickpoint-item {{selectedPickPointId == item.id ? 'active' : ''}}\" wx:for=\"{{pickPoints}}\" wx:key=\"id\" bindtap=\"selectPickPoint\" data-id=\"{{item.id}}\">\n        <view class=\"pickpoint-info\">\n          <view class=\"pickpoint-name\">{{item.name}}</view>\n          <view class=\"pickpoint-address\">{{item.address}}</view>\n        </view>\n        <view class=\"pickpoint-radio\">\n          <van-radio name=\"{{item.id}}\" checked-color=\"#D4A574\" checked=\"{{selectedPickPointId == item.id}}\" />\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <!-- 配送时间 -->\n  <view class=\"time-section\" wx:if=\"{{ create_order_select_time == '1' }}\">\n    <view class=\"section-divider\"></view>\n    <view class=\"time-selector\" bind:tap=\"diningTimeShow\">\n      <view class=\"time-label\">\n        <van-icon name=\"clock-o\" size=\"32rpx\" color=\"#8B5A3C\" />\n        <text>{{ peisongType == 'zq' ? $t.pay.Mealtime : $t.pay.Deliverytime }}</text>\n      </view>\n      <view class=\"time-value\">\n        <text class=\"{{diningTime ? 'selected' : 'placeholder'}}\">{{ diningTime ? diningTime : $t.common.select }}</text>\n        <van-icon name=\"arrow\" size=\"28rpx\" color=\"#999\" />\n      </view>\n    </view>\n  </view>\n</view>\n\n<!-- 商品清单卡片 -->\n<view class=\"goods-card\">\n  <view class=\"card-title\">\n    <text>商品清单</text>\n    <view class=\"title-decoration\"></view>\n  </view>\n  <view class=\"goods-list\">\n    <view class=\"goods-item\" wx:for=\"{{goodsList}}\" wx:key=\"index\">\n      <view class=\"goods-main\">\n        <view class=\"goods-info\">\n          <view class=\"goods-name {{ (item.minBuyNumber && item.stores < item.minBuyNumber) ? 'quehuo' : '' }}\">\n            {{item.name}}\n            <van-tag wx:if=\"{{ item.minBuyNumber && item.stores < item.minBuyNumber }}\" type=\"danger\" size=\"mini\">{{ $t.goodsDetail.storeing }}</van-tag>\n          </view>\n          <view class=\"goods-specs\">\n            {{item.label}}\n            <block wx:for=\"{{item.sku}}\" wx:for-item=\"option\" wx:key=\"index\">\n              {{option.optionName}}:{{option.optionValueName}}\n            </block>\n            <block wx:for=\"{{item.additions}}\" wx:for-item=\"option\" wx:key=\"index\">\n              {{option.pname}}:{{option.name}}\n            </block>\n          </view>\n        </view>\n        <view class=\"goods-quantity\">×{{item.number}}</view>\n        <view class=\"goods-price\">¥{{item.price}}</view>\n      </view>\n    </view>\n  </view>\n  <view class=\"goods-total\">\n    <text class=\"total-label\">{{ $t.pay.Total }}</text>\n    <text class=\"total-quantity\">×{{allGoodsNumber}}</text>\n    <text class=\"total-price\">¥{{allGoodsPrice}}</text>\n  </view>\n</view>\n\n<!-- 优惠券卡片 -->\n<view class=\"coupon-card\" wx:if=\"{{coupons}}\">\n  <picker bindchange=\"bindChangeCoupon\" range=\"{{coupons}}\" range-key=\"nameExt\">\n    <view class=\"coupon-selector\">\n      <view class=\"coupon-left\">\n        <van-icon name=\"coupon-o\" size=\"36rpx\" color=\"#D4A574\" />\n        <text class=\"coupon-label\">{{ $t.coupons.title }}</text>\n      </view>\n      <view class=\"coupon-right\">\n        <text class=\"coupon-value\">{{curCouponShowText}}</text>\n        <van-icon name=\"arrow\" size=\"28rpx\" color=\"#999\" />\n      </view>\n    </view>\n  </picker>\n</view>\n\n<!-- 会员卡卡片 -->\n<view class=\"card-select-card\" wx:if=\"{{cardMyList && cardMyList.length > 0}}\">\n  <view class=\"card-header\">\n    <van-icon name=\"balance-o\" size=\"36rpx\" color=\"#D4A574\" />\n    <text class=\"card-title-text\">会员卡</text>\n  </view>\n  \n  <view class=\"card-list-wrapper\">\n    <!-- 不使用会员卡选项 -->\n    <view class=\"card-item {{!curCard ? 'active' : ''}}\" bindtap=\"selectCard\" data-card=\"{{null}}\">\n      <view class=\"card-item-content\">\n        <view class=\"card-item-left\">\n          <view class=\"card-item-icon no-card\">\n            <van-icon name=\"close\" size=\"32rpx\" color=\"#999\" />\n          </view>\n          <view class=\"card-item-info\">\n            <view class=\"card-item-name\">不使用会员卡</view>\n            <view class=\"card-item-desc\">使用其他支付方式</view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <!-- 会员卡列表 -->\n    <view class=\"card-item {{curCard && curCard.id == item.id ? 'active' : ''}}\" wx:for=\"{{cardMyList}}\" wx:key=\"id\" bindtap=\"selectCard\" data-card=\"{{item}}\">\n      <view class=\"card-item-content\">\n        <view class=\"card-item-left\">\n          <view class=\"card-item-icon {{item.cardInfo.type == 0 ? 'times-card-icon' : 'balance-card-icon'}}\">\n            <van-icon name=\"{{item.cardInfo.type == 0 ? 'coupon-o' : 'balance-list-o'}}\" size=\"32rpx\" color=\"#fff\" />\n          </view>\n          <view class=\"card-item-info\">\n            <view class=\"card-item-name\">\n              {{item.cardInfo.name}}\n              <view class=\"card-type-tag {{item.cardInfo.type == 0 ? 'times-tag' : 'balance-tag'}}\">\n                {{item.cardInfo.type == 0 ? '次卡' : '储值卡'}}\n              </view>\n            </view>\n            <view class=\"card-item-desc\">\n              <text wx:if=\"{{item.cardInfo.type == 0}}\">剩余 {{item.amount}} 次</text>\n              <text wx:if=\"{{item.cardInfo.type == 1}}\">余额 ¥{{item.amount}}</text>\n              <text class=\"card-expire\"> | 至 {{item.dateEnd}}</text>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n\n<!-- 保温袋选择卡片 -->\n<view class=\"bag-card\" wx:if=\"{{ peisongType == 'zq' && packaging_fee }}\">\n  <view class=\"card-title\">{{ $t.pay.Insulationbag }}</view>\n  <van-radio-group value=\"{{ packaging_fee_use }}\" bind:change=\"packaging_fee_Change\">\n    <view class=\"bag-options\">\n      <view class=\"bag-option\" data-name=\"1\" bind:tap=\"packaging_fee_Click\">\n        <text class=\"bag-text\">{{ $t.pay.Needbag }}</text>\n        <van-radio name=\"1\" checked-color=\"#D4A574\" />\n      </view>\n      <view class=\"bag-option\" data-name=\"2\" bind:tap=\"packaging_fee_Click\">\n        <text class=\"bag-text\">{{ $t.pay.UNneedbag }}</text>\n        <van-radio name=\"2\" checked-color=\"#D4A574\" />\n      </view>\n    </view>\n  </van-radio-group>\n</view>\n\n<!-- 费用明细卡片 -->\n<view class=\"fee-card\" wx:if=\"{{ yunPrice || peisongfee }}\">\n  <view class=\"fee-item\" wx:if=\"{{ yunPrice }}\">\n    <text class=\"fee-label\">{{ $t.pay.DeliveryFee }}</text>\n    <text class=\"fee-value\">¥{{ yunPrice }}</text>\n  </view>\n  <view class=\"fee-item\" wx:if=\"{{ peisongfee && peisongfee.amount1 }}\">\n    <text class=\"fee-label\">{{ peisongfee.fwf1Name }}</text>\n    <text class=\"fee-value\">¥{{ peisongfee.amount1 }}</text>\n  </view>\n  <view class=\"fee-item\" wx:if=\"{{ peisongfee && peisongfee.amount2 }}\">\n    <text class=\"fee-label\">{{ peisongfee.fwf2Name }}</text>\n    <text class=\"fee-value\">¥{{ peisongfee.amount2 }}</text>\n  </view>\n  <view class=\"fee-item\" wx:if=\"{{ peisongfee && peisongfee.amount3 }}\">\n    <text class=\"fee-label\">{{ peisongfee.fwf3Name }}</text>\n    <text class=\"fee-value\">¥{{ peisongfee.amount3 }}</text>\n  </view>\n</view>\n\n<!-- 备注卡片 -->\n<view class=\"remark-card\">\n  <view class=\"remark-container\">\n    <view class=\"remark-icon\">\n      <van-icon name=\"comment-o\" size=\"32rpx\" color=\"#8B5A3C\" />\n    </view>\n    <van-field\n      value=\"{{remark}}\"\n      label=\"{{ $t.pay.remark }}\"\n      label-width=\"120rpx\"\n      clearable\n      input-align=\"right\"\n      placeholder=\"{{ $t.pay.remarkPlaceholder }}\"\n      bindblur=\"remarkChange\"\n      custom-style=\"background: transparent; flex: 1;\"\n    />\n  </view>\n</view>\n<view class=\"bottom\"></view>\n<van-submit-bar\n\twx:if=\"{{ nick && avatarUrl }}\"\n\tprice=\"{{ amountReal*100 }}\"\n  label=\"{{ $t.PickingUp.total }}\"\n\tbutton-text=\"{{peisongType == 'kd' && amountReal < shopInfo.serviceAmountMin ? ('￥' + shopInfo.serviceAmountMin + $t.pay.qisong) : $t.order.toPayTap }}\"\n\tbind:submit=\"goCreateOrder\"\n\tbutton-class=\"pay-btn\"\n\tdisabled=\"{{(peisongType == 'kd' && amountReal < shopInfo.serviceAmountMin) || submitLoding }}\"\n/>\n<van-submit-bar\n  wx:else\n\tprice=\"{{ amountReal*100 }}\"\n  label=\"{{ $t.PickingUp.total }}\"\n\tbutton-text=\"{{ $t.pay.login }}\"\n\tbind:submit=\"updateUserInfo\"\n\tbutton-class=\"pay-btn\"\n/>\n\n<van-popup\n  show=\"{{ diningTimeShow }}\"\n\tposition=\"bottom\"\n\tround\n  bind:close=\"diningTimeHide\"\n>\n<van-datetime-picker\n  type=\"time\"\n\tvalue=\"{{ currentDate }}\"\n\tmin-hour=\"{{ minHour }}\"\n\tmax-hour=\"{{ 22 }}\"\n\tmin-minute=\"{{ minMinute }}\"\n\tformatter=\"{{ formatter }}\"\n\tfilter=\"{{ filter }}\"\n\tbind:change=\"diningTimeChange\"\n  bind:cancel=\"diningTimeHide\"\n  bind:confirm=\"diningTimeConfirm\"\n/>\n</van-popup>\n\n<payment\n  money=\"{{ money }}\"\n  remark=\"{{ $t.payment.order }} ：{{ orderId }}\"\n  nextAction=\"{{ nextAction }}\"\n  show=\"{{ paymentShow }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>"
  },
  {
    "path": "pages/pay/index.wxss",
    "content": "page {\r\n  background: linear-gradient(180deg, #FFF8F0 0%, #F5F5F5 100%);\r\n  min-height: 100vh;\r\n  padding-bottom: 140rpx;\r\n}\r\n\r\n/* ========== 店铺信息卡片 ========== */\r\n.shop-card {\r\n  margin: 24rpx 24rpx 20rpx;\r\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFFAF5 100%);\r\n  border-radius: 24rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.shop-header {\r\n  display: flex;\r\n  align-items: center;\r\n  padding: 32rpx;\r\n  position: relative;\r\n  text-decoration: none;\r\n  color: inherit;\r\n}\r\n\r\n.shop-icon {\r\n  width: 88rpx;\r\n  height: 88rpx;\r\n  background: linear-gradient(135deg, #F5E6D3 0%, #E8D4B8 100%);\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-right: 24rpx;\r\n  box-shadow: 0 4rpx 12rpx rgba(139, 90, 60, 0.15);\r\n}\r\n\r\n.shop-info {\r\n  flex: 1;\r\n  overflow: hidden;\r\n}\r\n\r\n.shop-name {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #2C2C2C;\r\n  margin-bottom: 12rpx;\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.distance {\r\n  font-size: 24rpx;\r\n  color: #D4A574;\r\n  font-weight: 500;\r\n  margin-left: 12rpx;\r\n  background: rgba(212, 165, 116, 0.1);\r\n  padding: 4rpx 12rpx;\r\n  border-radius: 12rpx;\r\n}\r\n\r\n.shop-address {\r\n  font-size: 26rpx;\r\n  color: #999;\r\n  line-height: 1.5;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.arrow-icon {\r\n  margin-left: 16rpx;\r\n}\r\n\r\n/* ========== 配送方式卡片 ========== */\r\n.delivery-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  padding: 32rpx;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.card-title {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #2C2C2C;\r\n  margin-bottom: 24rpx;\r\n  position: relative;\r\n  padding-left: 20rpx;\r\n}\r\n\r\n.card-title::before {\r\n  content: '';\r\n  position: absolute;\r\n  left: 0;\r\n  top: 50%;\r\n  transform: translateY(-50%);\r\n  width: 8rpx;\r\n  height: 32rpx;\r\n  background: linear-gradient(180deg, #D4A574 0%, #C99960 100%);\r\n  border-radius: 4rpx;\r\n}\r\n\r\n.delivery-options {\r\n  display: flex;\r\n  gap: 20rpx;\r\n  margin-bottom: 8rpx;\r\n}\r\n\r\n.delivery-option {\r\n  flex: 1;\r\n  height: 140rpx;\r\n  background: #FAFAFA;\r\n  border-radius: 20rpx;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  transition: all 0.3s ease;\r\n  border: 2rpx solid transparent;\r\n}\r\n\r\n.delivery-option.active {\r\n  background: linear-gradient(135deg, #D4A574 0%, #C99960 100%);\r\n  border-color: #D4A574;\r\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.3);\r\n  transform: translateY(-4rpx);\r\n}\r\n\r\n.option-icon {\r\n  margin-bottom: 12rpx;\r\n}\r\n\r\n.option-text {\r\n  font-size: 28rpx;\r\n  font-weight: 500;\r\n  color: #666;\r\n}\r\n\r\n.delivery-option.active .option-text {\r\n  color: #FFFFFF;\r\n  font-weight: 600;\r\n}\r\n\r\n/* 分割线 */\r\n.section-divider {\r\n  height: 1rpx;\r\n  background: linear-gradient(90deg, \r\n    rgba(0, 0, 0, 0) 0%, \r\n    rgba(0, 0, 0, 0.06) 50%, \r\n    rgba(0, 0, 0, 0) 100%\r\n  );\r\n  margin: 32rpx 0 24rpx;\r\n}\r\n\r\n/* 地址部分 */\r\n.address-section {\r\n  margin-top: 8rpx;\r\n}\r\n\r\n.address-content {\r\n  min-height: 100rpx;\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.add-address-btn {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  width: 100%;\r\n  padding: 24rpx 0;\r\n  background: linear-gradient(135deg, #FFFAF5 0%, #FFF5EB 100%);\r\n  border-radius: 16rpx;\r\n  border: 2rpx dashed #D4A574;\r\n}\r\n\r\n.add-text {\r\n  font-size: 28rpx;\r\n  color: #D4A574;\r\n  margin-left: 12rpx;\r\n  font-weight: 500;\r\n}\r\n\r\n.address-detail {\r\n  padding: 16rpx 0;\r\n}\r\n\r\n.address-left {\r\n  flex: 1;\r\n  display: flex;\r\n  align-items: flex-start;\r\n}\r\n\r\n.address-icon {\r\n  margin-right: 16rpx;\r\n  margin-top: 4rpx;\r\n}\r\n\r\n.address-info {\r\n  flex: 1;\r\n}\r\n\r\n.contact-info {\r\n  font-size: 30rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 600;\r\n  margin-bottom: 12rpx;\r\n}\r\n\r\n.address-text {\r\n  font-size: 26rpx;\r\n  color: #666;\r\n  line-height: 1.6;\r\n}\r\n\r\n.address-right {\r\n  margin-left: 16rpx;\r\n}\r\n\r\n/* 手机号部分 */\r\n.phone-section {\r\n  margin-top: 8rpx;\r\n}\r\n\r\n/* 时间选择 */\r\n.time-section {\r\n  margin-top: 8rpx;\r\n}\r\n\r\n.time-selector {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 24rpx 0;\r\n}\r\n\r\n.time-label {\r\n  display: flex;\r\n  align-items: center;\r\n  font-size: 28rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 500;\r\n}\r\n\r\n.time-label text {\r\n  margin-left: 12rpx;\r\n}\r\n\r\n.time-value {\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.time-value text {\r\n  font-size: 28rpx;\r\n  margin-right: 8rpx;\r\n}\r\n\r\n.time-value .selected {\r\n  color: #D4A574;\r\n  font-weight: 600;\r\n}\r\n\r\n.time-value .placeholder {\r\n  color: #999;\r\n}\r\n\r\n/* ========== 商品清单卡片 ========== */\r\n.goods-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  padding: 32rpx;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.goods-card .card-title {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  margin-bottom: 32rpx;\r\n}\r\n\r\n.title-decoration {\r\n  width: 80rpx;\r\n  height: 6rpx;\r\n  background: linear-gradient(90deg, #D4A574 0%, transparent 100%);\r\n  border-radius: 3rpx;\r\n}\r\n\r\n.goods-list {\r\n  margin-bottom: 24rpx;\r\n}\r\n\r\n.goods-item {\r\n  padding: 24rpx 0;\r\n  border-bottom: 1rpx solid #F5F5F5;\r\n}\r\n\r\n.goods-item:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n.goods-main {\r\n  display: flex;\r\n  align-items: flex-start;\r\n}\r\n\r\n.goods-info {\r\n  flex: 1;\r\n  min-width: 0;\r\n  margin-right: 16rpx;\r\n}\r\n\r\n.goods-name {\r\n  font-size: 30rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 500;\r\n  margin-bottom: 12rpx;\r\n  line-height: 1.4;\r\n  display: flex;\r\n  align-items: center;\r\n  flex-wrap: wrap;\r\n  gap: 8rpx;\r\n}\r\n\r\n.goods-name.quehuo {\r\n  text-decoration: line-through;\r\n  color: #BBB;\r\n}\r\n\r\n.goods-specs {\r\n  font-size: 24rpx;\r\n  color: #999;\r\n  line-height: 1.6;\r\n}\r\n\r\n.goods-quantity {\r\n  font-size: 28rpx;\r\n  color: #666;\r\n  margin-right: 32rpx;\r\n  min-width: 60rpx;\r\n  text-align: center;\r\n}\r\n\r\n.goods-price {\r\n  font-size: 32rpx;\r\n  color: #D4A574;\r\n  font-weight: 600;\r\n  min-width: 100rpx;\r\n  text-align: right;\r\n}\r\n\r\n.goods-total {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: flex-end;\r\n  padding: 24rpx 0 8rpx;\r\n  border-top: 1rpx solid #F5F5F5;\r\n}\r\n\r\n.total-label {\r\n  font-size: 28rpx;\r\n  color: #666;\r\n  margin-right: 16rpx;\r\n}\r\n\r\n.total-quantity {\r\n  font-size: 28rpx;\r\n  color: #666;\r\n  margin-right: 32rpx;\r\n}\r\n\r\n.total-price {\r\n  font-size: 36rpx;\r\n  color: #D4A574;\r\n  font-weight: 700;\r\n}\r\n\r\n/* ========== 优惠券卡片 ========== */\r\n.coupon-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFFFFF 100%);\r\n  border-radius: 24rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 4rpx 20rpx rgba(212, 165, 116, 0.1);\r\n}\r\n\r\n.coupon-selector {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 32rpx;\r\n}\r\n\r\n.coupon-left {\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.coupon-label {\r\n  font-size: 28rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 500;\r\n  margin-left: 12rpx;\r\n}\r\n\r\n.coupon-right {\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.coupon-value {\r\n  font-size: 26rpx;\r\n  color: #D4A574;\r\n  font-weight: 600;\r\n  margin-right: 8rpx;\r\n  max-width: 300rpx;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n/* ========== 会员卡选择卡片 ========== */\r\n.card-select-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  padding: 32rpx;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.card-header {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 24rpx;\r\n}\r\n\r\n.card-title-text {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #2C2C2C;\r\n  margin-left: 12rpx;\r\n}\r\n\r\n.card-list-wrapper {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16rpx;\r\n}\r\n\r\n.card-item {\r\n  background: #FAFAFA;\r\n  border-radius: 20rpx;\r\n  border: 2rpx solid transparent;\r\n  transition: all 0.3s ease;\r\n  overflow: hidden;\r\n}\r\n\r\n.card-item.active {\r\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF5EB 100%);\r\n  border-color: #D4A574;\r\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.2);\r\n}\r\n\r\n.card-item-content {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 24rpx 20rpx;\r\n}\r\n\r\n.card-item-left {\r\n  flex: 1;\r\n  display: flex;\r\n  align-items: center;\r\n  min-width: 0;\r\n}\r\n\r\n.card-item-icon {\r\n  width: 80rpx;\r\n  height: 80rpx;\r\n  border-radius: 50%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-right: 20rpx;\r\n  flex-shrink: 0;\r\n}\r\n\r\n.card-item-icon.no-card {\r\n  background: linear-gradient(135deg, #F5F5F5 0%, #E8E8E8 100%);\r\n}\r\n\r\n.card-item-icon.times-card-icon {\r\n  background: linear-gradient(135deg, #66BB6A 0%, #43A047 100%);\r\n  box-shadow: 0 4rpx 12rpx rgba(67, 160, 71, 0.3);\r\n}\r\n\r\n.card-item-icon.balance-card-icon {\r\n  background: linear-gradient(135deg, #FFA726 0%, #FB8C00 100%);\r\n  box-shadow: 0 4rpx 12rpx rgba(251, 140, 0, 0.3);\r\n}\r\n\r\n.card-item-info {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n.card-item-name {\r\n  font-size: 30rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 600;\r\n  margin-bottom: 8rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8rpx;\r\n}\r\n\r\n.card-type-tag {\r\n  padding: 4rpx 12rpx;\r\n  border-radius: 8rpx;\r\n  font-size: 20rpx;\r\n}\r\n\r\n.card-type-tag.times-tag {\r\n  background: rgba(67, 160, 71, 0.15);\r\n  color: #2E7D32;\r\n}\r\n\r\n.card-type-tag.balance-tag {\r\n  background: rgba(251, 140, 0, 0.15);\r\n  color: #E65100;\r\n}\r\n\r\n.card-item-desc {\r\n  font-size: 24rpx;\r\n  color: #666;\r\n  line-height: 1.5;\r\n}\r\n\r\n.card-expire {\r\n  color: #999;\r\n  margin-left: 8rpx;\r\n}\r\n\r\n.card-item-radio {\r\n  margin-left: 16rpx;\r\n  flex-shrink: 0;\r\n}\r\n\r\n/* ========== 保温袋卡片 ========== */\r\n.bag-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  padding: 32rpx;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.bag-options {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 20rpx;\r\n}\r\n\r\n.bag-option {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 28rpx 24rpx;\r\n  background: #FAFAFA;\r\n  border-radius: 16rpx;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n.bag-text {\r\n  font-size: 28rpx;\r\n  color: #2C2C2C;\r\n}\r\n\r\n/* ========== 费用明细卡片 ========== */\r\n.fee-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  padding: 32rpx;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.fee-item {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 20rpx 0;\r\n  border-bottom: 1rpx solid #F5F5F5;\r\n}\r\n\r\n.fee-item:last-child {\r\n  border-bottom: none;\r\n}\r\n\r\n.fee-label {\r\n  font-size: 28rpx;\r\n  color: #666;\r\n}\r\n\r\n.fee-value {\r\n  font-size: 32rpx;\r\n  color: #D4A574;\r\n  font-weight: 600;\r\n}\r\n\r\n/* ========== 备注卡片 ========== */\r\n.remark-card {\r\n  margin: 0 24rpx 20rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 4rpx 20rpx rgba(139, 90, 60, 0.08);\r\n}\r\n\r\n.remark-container {\r\n  display: flex;\r\n  align-items: center;\r\n  padding: 24rpx 32rpx;\r\n}\r\n\r\n.remark-icon {\r\n  margin-right: 12rpx;\r\n}\r\n\r\n/* ========== 底部提交栏 ========== */\r\n.bottom {\r\n  height: 120rpx;\r\n}\r\n\r\n.pay-btn {\r\n  background: linear-gradient(135deg, #D4A574 0%, #C99960 100%) !important;\r\n  border: none !important;\r\n  border-radius: 40rpx !important;\r\n  font-weight: 600 !important;\r\n  font-size: 32rpx !important;\r\n  box-shadow: 0 8rpx 24rpx rgba(212, 165, 116, 0.3) !important;\r\n}\r\n\r\n/* ========== 自定义按钮样式 ========== */\r\n.phone-btn {\r\n  background: linear-gradient(135deg, #D4A574 0%, #C99960 100%) !important;\r\n  color: #FFFFFF !important;\r\n  border: none !important;\r\n  font-weight: 500 !important;\r\n  padding: 0 24rpx !important;\r\n  height: 56rpx !important;\r\n  line-height: 56rpx !important;\r\n}\r\n\r\n/* ========== 通用样式 ========== */\r\n.red {\r\n  color: #D4A574 !important;\r\n}\r\n\r\n.quehuo {\r\n  text-decoration: line-through;\r\n  color: #BBB;\r\n}\r\n\r\n/* ========== 动画效果 ========== */\r\n.shop-card,\r\n.delivery-card,\r\n.goods-card,\r\n.coupon-card,\r\n.bag-card,\r\n.fee-card,\r\n.remark-card {\r\n  animation: fadeInUp 0.5s ease-out;\r\n}\r\n\r\n@keyframes fadeInUp {\r\n  from {\r\n    opacity: 0;\r\n    transform: translateY(20rpx);\r\n  }\r\n  to {\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n}\r\n\r\n/* ========== 提货点选择 ========== */\r\n.pickpoint-section {\r\n  margin-top: 8rpx;\r\n}\r\n\r\n.section-title {\r\n  font-size: 28rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 600;\r\n  margin-bottom: 24rpx;\r\n  padding-left: 4rpx;\r\n}\r\n\r\n.pickpoint-list {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16rpx;\r\n}\r\n\r\n.pickpoint-item {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 24rpx 20rpx;\r\n  background: #FAFAFA;\r\n  border-radius: 16rpx;\r\n  border: 2rpx solid transparent;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n.pickpoint-item.active {\r\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF5EB 100%);\r\n  border-color: #D4A574;\r\n  box-shadow: 0 4rpx 16rpx rgba(212, 165, 116, 0.2);\r\n}\r\n\r\n.pickpoint-info {\r\n  flex: 1;\r\n  min-width: 0;\r\n}\r\n\r\n.pickpoint-name {\r\n  font-size: 30rpx;\r\n  color: #2C2C2C;\r\n  font-weight: 600;\r\n  margin-bottom: 8rpx;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.pickpoint-address {\r\n  font-size: 26rpx;\r\n  color: #666;\r\n  line-height: 1.4;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.pickpoint-radio {\r\n  margin-left: 16rpx;\r\n}\r\n\r\n/* ========== 响应式优化 ========== */\r\n@media (max-width: 375px) {\r\n  .shop-name {\r\n    font-size: 30rpx;\r\n  }\r\n\r\n  .card-title {\r\n    font-size: 30rpx;\r\n  }\r\n\r\n  .goods-name {\r\n    font-size: 28rpx;\r\n  }\r\n\r\n  .pickpoint-name {\r\n    font-size: 28rpx;\r\n  }\r\n\r\n  .pickpoint-address {\r\n    font-size: 24rpx;\r\n  }\r\n}\r\n"
  },
  {
    "path": "pages/queue/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\n\nPage({\n  data: {\n\n  },\n  onLoad: function (options) {\n    \n  },\n  onShow: function () {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.queue.t,\n    })\n    AUTH.checkHasLogined().then(isLogin => {\n      if (isLogin) {\n        this.queuingTypes()\n        this.queuingMy()\n        AUTH.bindSeller()\n      } else {\n        AUTH.authorize().then(res => {\n          this.queuingTypes()\n          this.queuingMy()\n          AUTH.bindSeller()\n        })\n      }\n    })\n    \n  },\n  async queuingTypes() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.queuingTypes()\n    wx.hideLoading({\n      success: (res) => {},\n    })\n    if (res.code == 0) {\n      this.setData({\n        list: res.data\n      })\n    }\n  },\n  async queuingMy() {\n    const res = await WXAPI.queuingMy(wx.getStorageSync('token'))\n    if (res.code == 0) {\n      const mylist = []\n      res.data.forEach(ele => {\n        const queuingLog  = ele.queuingLog\n        const queuingUpType = ele.queuingUpType\n        const waitMinitus = (queuingLog.number - queuingUpType.curNumber -1) * queuingUpType.minitus\n        if (waitMinitus) {\n          queuingLog.waitMinitus = waitMinitus\n        }\n        queuingLog.typeEntity = queuingUpType\n        mylist.push(queuingLog)\n      })\n      this.setData({\n        mylist\n      })\n    }\n  },\n  async queuingGet(e) {\n    const index = e.currentTarget.dataset.index\n    const queueType = this.data.list[index]\n    const isLogined = await AUTH.checkHasLogined()\n    if (!isLogined) {\n      AUTH.login(this)\n      return\n    }\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.queuingGet(wx.getStorageSync('token'), queueType.id)\n    wx.hideLoading({\n      success: (res) => {},\n    })\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    } else {\n      wx.showToast({\n        title: this.data.$t.queue.success\n      })\n      this.queuingMy()\n    }\n  },\n})"
  },
  {
    "path": "pages/queue/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/queue/index.wxml",
    "content": "<view class=\"queue-container\">\n  <!-- 头部装饰区域 -->\n  <view class=\"header-section\">\n    <view class=\"header-decoration\"></view>\n    <view class=\"header-title\">\n      <view class=\"title-main\">智能取号</view>\n      <view class=\"title-sub\">SMART QUEUE</view>\n    </view>\n  </view>\n\n  <!-- 取号区域 -->\n  <view class=\"queue-content\">\n    <!-- 空状态 -->\n    <view wx:if=\"{{!list}}\" class=\"empty-state\">\n      <view class=\"empty-icon\">🍵</view>\n      <view class=\"empty-text\">{{ $t.common.empty }}</view>\n    </view>\n\n    <!-- 取号卡片列表 -->\n    <view wx:else class=\"queue-cards\">\n      <view class=\"section-title\">\n        <view class=\"title-dot\"></view>\n        <text>选择取号类型</text>\n      </view>\n      \n      <view class=\"card-item\" wx:for=\"{{list}}\" wx:key=\"id\" bindtap=\"queuingGet\" data-index=\"{{ index }}\">\n        <view class=\"card-content\">\n          <view class=\"card-left\">\n            <view class=\"card-icon\">☕</view>\n            <view class=\"card-info\">\n              <view class=\"card-name\">{{ item.name }}</view>\n              <view class=\"card-desc\">点击立即取号</view>\n            </view>\n          </view>\n          <view class=\"card-right\">\n            <view class=\"queue-number\">\n              <view class=\"current-num\">{{ item.curNumber }}</view>\n              <view class=\"total-num\">/ {{ item.numberGet }}</view>\n            </view>\n            <view class=\"queue-label\">当前排队</view>\n          </view>\n        </view>\n        <view class=\"card-shine\"></view>\n      </view>\n    </view>\n\n    <!-- 我的号码区域 -->\n    <view wx:if=\"{{ mylist && mylist.length > 0 }}\" class=\"my-queue-section\">\n      <view class=\"section-title\">\n        <view class=\"title-dot\"></view>\n        <text>{{ $t.queue.myNumber }}</text>\n      </view>\n      \n      <view class=\"my-queue-cards\">\n        <view class=\"my-queue-card\" wx:for=\"{{mylist}}\" wx:key=\"id\">\n          <view class=\"my-card-header\">\n            <view class=\"my-card-type\">{{ item.typeEntity.name }}</view>\n            <view class=\"my-card-number\">{{ item.number }}</view>\n          </view>\n          <view class=\"my-card-status\">\n            <view class=\"status-tag\">{{ item.statusStr }}</view>\n            <view wx:if=\"{{ item.waitMinitus }}\" class=\"wait-time\">\n              <text class=\"wait-icon\">⏱</text>\n              <text>{{ $t.queue.ExpectedWaiting }}: {{ item.waitMinitus }}{{ $t.queue.minutes }}</text>\n            </view>\n          </view>\n          <view class=\"my-card-bg-decoration\"></view>\n        </view>\n      </view>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "pages/queue/index.wxss",
    "content": "/* 页面容器 */\n.queue-container {\n  min-height: 100vh;\n  background: linear-gradient(180deg, #FFF5F0 0%, #FFF9F6 50%, #FFFFFF 100%);\n  padding-bottom: 40rpx;\n}\n\n/* 头部区域 */\n.header-section {\n  position: relative;\n  padding: 60rpx 0 80rpx;\n  text-align: center;\n  overflow: hidden;\n}\n\n.header-decoration {\n  position: absolute;\n  top: -100rpx;\n  left: 50%;\n  transform: translateX(-50%);\n  width: 400rpx;\n  height: 400rpx;\n  background: radial-gradient(circle, rgba(199, 147, 115, 0.1) 0%, transparent 70%);\n  border-radius: 50%;\n}\n\n.header-title {\n  position: relative;\n  z-index: 1;\n}\n\n.title-main {\n  font-size: 56rpx;\n  font-weight: 600;\n  color: #4A3428;\n  letter-spacing: 4rpx;\n  margin-bottom: 8rpx;\n}\n\n.title-sub {\n  font-size: 24rpx;\n  color: #C79373;\n  letter-spacing: 6rpx;\n  font-weight: 300;\n}\n\n/* 内容区域 */\n.queue-content {\n  padding: 0 32rpx;\n}\n\n/* 空状态 */\n.empty-state {\n  text-align: center;\n  padding: 120rpx 0;\n}\n\n.empty-icon {\n  font-size: 120rpx;\n  margin-bottom: 24rpx;\n  opacity: 0.6;\n}\n\n.empty-text {\n  font-size: 28rpx;\n  color: #999;\n}\n\n/* 分区标题 */\n.section-title {\n  display: flex;\n  align-items: center;\n  margin-bottom: 32rpx;\n  padding-left: 8rpx;\n}\n\n.title-dot {\n  width: 8rpx;\n  height: 32rpx;\n  background: linear-gradient(180deg, #C79373 0%, #D4A574 100%);\n  border-radius: 4rpx;\n  margin-right: 16rpx;\n}\n\n.section-title text {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #4A3428;\n}\n\n/* 取号卡片区域 */\n.queue-cards {\n  margin-bottom: 60rpx;\n}\n\n.card-item {\n  position: relative;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  margin-bottom: 24rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 32rpx rgba(199, 147, 115, 0.12);\n  transition: all 0.3s ease;\n}\n\n.card-item:active {\n  transform: scale(0.98);\n  box-shadow: 0 4rpx 16rpx rgba(199, 147, 115, 0.2);\n}\n\n.card-content {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 32rpx 28rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.card-left {\n  display: flex;\n  align-items: center;\n  flex: 1;\n}\n\n.card-icon {\n  font-size: 64rpx;\n  margin-right: 24rpx;\n  filter: grayscale(0.2);\n}\n\n.card-info {\n  flex: 1;\n}\n\n.card-name {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #4A3428;\n  margin-bottom: 8rpx;\n}\n\n.card-desc {\n  font-size: 24rpx;\n  color: #999;\n}\n\n.card-right {\n  text-align: right;\n  padding-left: 24rpx;\n}\n\n.queue-number {\n  display: flex;\n  align-items: baseline;\n  justify-content: flex-end;\n  margin-bottom: 8rpx;\n}\n\n.current-num {\n  font-size: 48rpx;\n  font-weight: 700;\n  color: #C79373;\n  line-height: 1;\n}\n\n.total-num {\n  font-size: 28rpx;\n  color: #999;\n  margin-left: 4rpx;\n}\n\n.queue-label {\n  font-size: 22rpx;\n  color: #999;\n}\n\n.card-shine {\n  position: absolute;\n  top: 0;\n  right: -100rpx;\n  width: 200rpx;\n  height: 100%;\n  background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.6) 50%, transparent 100%);\n  transform: skewX(-20deg);\n  opacity: 0;\n  transition: all 0.6s ease;\n}\n\n.card-item:active .card-shine {\n  right: 100%;\n  opacity: 1;\n}\n\n/* 我的号码区域 */\n.my-queue-section {\n  margin-top: 60rpx;\n}\n\n.my-queue-cards {\n  display: flex;\n  flex-direction: column;\n  gap: 24rpx;\n}\n\n.my-queue-card {\n  position: relative;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF9F6 100%);\n  border-radius: 24rpx;\n  padding: 32rpx;\n  overflow: hidden;\n  box-shadow: 0 8rpx 32rpx rgba(199, 147, 115, 0.15);\n  border: 2rpx solid rgba(199, 147, 115, 0.1);\n}\n\n.my-card-bg-decoration {\n  position: absolute;\n  top: -40rpx;\n  right: -40rpx;\n  width: 160rpx;\n  height: 160rpx;\n  background: radial-gradient(circle, rgba(199, 147, 115, 0.08) 0%, transparent 70%);\n  border-radius: 50%;\n}\n\n.my-card-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 24rpx;\n  position: relative;\n  z-index: 1;\n}\n\n.my-card-type {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #4A3428;\n}\n\n.my-card-number {\n  font-size: 56rpx;\n  font-weight: 700;\n  color: #C79373;\n  font-family: 'DIN Alternate', -apple-system, sans-serif;\n}\n\n.my-card-status {\n  display: flex;\n  align-items: center;\n  gap: 16rpx;\n  flex-wrap: wrap;\n  position: relative;\n  z-index: 1;\n}\n\n.status-tag {\n  display: inline-block;\n  padding: 8rpx 20rpx;\n  background: linear-gradient(135deg, #FFE8DC 0%, #FFD4C4 100%);\n  color: #C79373;\n  font-size: 24rpx;\n  font-weight: 500;\n  border-radius: 32rpx;\n}\n\n.wait-time {\n  display: flex;\n  align-items: center;\n  font-size: 26rpx;\n  color: #666;\n}\n\n.wait-icon {\n  margin-right: 8rpx;\n  font-size: 28rpx;\n}\n\n/* 响应式调整 */\n@media (max-width: 320px) {\n  .title-main {\n    font-size: 48rpx;\n  }\n  \n  .card-name {\n    font-size: 28rpx;\n  }\n  \n  .current-num {\n    font-size: 42rpx;\n  }\n}\n\n/* 过渡动画 */\n.card-item,\n.my-queue-card {\n  animation: fadeInUp 0.5s ease-out;\n}\n\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    transform: translateY(20rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}"
  },
  {
    "path": "pages/score/logs.js",
    "content": "const APP = getApp()\nconst WXAPI = require('apifm-wxapi')\n\n// fixed首次打开不显示标题的bug\nAPP.configLoadOK = () => {\n  \n}\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.scoreLogs.title,\n    })\n    this.scoreLogs()\n  },\n  onShow: function () {\n\n  },\n  async scoreLogs() {\n    wx.showLoading({\n      title: '',\n    })\n    const res = await WXAPI.scoreLogs({\n      token: wx.getStorageSync('token'),\n      page:1,\n      pageSize:500\n    })\n    wx.hideLoading()\n    if (res.code == 0) {\n      this.setData({\n        scoreLogs: res.data.result\n      })\n    }\n  },\n})"
  },
  {
    "path": "pages/score/logs.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/score/logs.wxml",
    "content": "<view class=\"score-logs-container\">\n  <!-- 顶部装饰背景 -->\n  <view class=\"header-decoration\">\n    <view class=\"wave-bg\"></view>\n  </view>\n\n  <!-- 积分记录列表 -->\n  <view class=\"logs-content\">\n    <block wx:if=\"{{scoreLogs && scoreLogs.length > 0}}\">\n      <view class=\"logs-list\">\n        <view class=\"log-item\" wx:for=\"{{scoreLogs}}\" wx:key=\"id\">\n          <view class=\"log-card\">\n            <view class=\"log-left\">\n              <!-- 图标区域 -->\n              <view class=\"icon-wrapper {{item.score > 0 ? 'icon-add' : 'icon-minus'}}\">\n                <text class=\"icon-text\">{{item.score > 0 ? '+' : '-'}}</text>\n              </view>\n              <!-- 信息区域 -->\n              <view class=\"info-wrapper\">\n                <view class=\"type-text\">{{item.typeStr}}</view>\n                <view class=\"date-text\">{{item.dateAdd}}</view>\n              </view>\n            </view>\n            <view class=\"log-right\">\n              <view class=\"score-value {{item.score > 0 ? 'score-add' : 'score-minus'}}\">\n                {{item.score > 0 ? '+' : ''}}{{item.score}}\n              </view>\n              <view class=\"score-label\">积分</view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </block>\n\n    <!-- 空状态 -->\n    <view class=\"empty-state\" wx:if=\"{{!scoreLogs || scoreLogs.length == 0}}\">\n      <view class=\"empty-icon\">📝</view>\n      <view class=\"empty-text\">暂无积分记录</view>\n      <view class=\"empty-desc\">快去购买奶茶赚取积分吧</view>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "pages/score/logs.wxss",
    "content": "/* pages/score/logs.wxss */\n\npage {\n  background: linear-gradient(180deg, #FFF5E6 0%, #FFFFFF 35%);\n  min-height: 100vh;\n}\n\n.score-logs-container {\n  width: 100%;\n  min-height: 100vh;\n  padding-bottom: 40rpx;\n}\n\n/* 顶部装饰背景 */\n.header-decoration {\n  width: 100%;\n  height: 240rpx;\n  position: relative;\n  overflow: hidden;\n  background: linear-gradient(135deg, #FFB84D 0%, #FF9A4D 100%);\n}\n\n.wave-bg {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  bottom: -2rpx;\n  left: 0;\n  background: radial-gradient(circle at 30% 50%, rgba(255, 255, 255, 0.15) 0%, transparent 50%),\n              radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%);\n}\n\n.wave-bg::before {\n  content: '';\n  position: absolute;\n  width: 200%;\n  height: 120rpx;\n  bottom: 0;\n  left: -50%;\n  background: #FFFFFF;\n  border-radius: 50% 50% 0 0 / 100% 100% 0 0;\n}\n\n/* 内容区域 */\n.logs-content {\n  width: 100%;\n  padding: 0 30rpx;\n  margin-top: -60rpx;\n  position: relative;\n  z-index: 10;\n}\n\n/* 列表容器 */\n.logs-list {\n  width: 100%;\n}\n\n/* 单条记录 */\n.log-item {\n  width: 100%;\n  margin-bottom: 24rpx;\n  animation: slideUp 0.4s ease-out;\n}\n\n@keyframes slideUp {\n  from {\n    opacity: 0;\n    transform: translateY(20rpx);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.log-card {\n  width: 100%;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 32rpx 28rpx;\n  box-shadow: 0 4rpx 20rpx rgba(255, 154, 77, 0.08);\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  transition: all 0.3s ease;\n  position: relative;\n  overflow: hidden;\n}\n\n.log-card::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 6rpx;\n  height: 100%;\n  background: linear-gradient(180deg, #FFB84D 0%, #FF9A4D 100%);\n}\n\n.log-card:active {\n  transform: scale(0.98);\n  box-shadow: 0 2rpx 12rpx rgba(255, 154, 77, 0.12);\n}\n\n/* 左侧内容 */\n.log-left {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  min-width: 0;\n}\n\n.icon-wrapper {\n  width: 88rpx;\n  height: 88rpx;\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-right: 24rpx;\n  flex-shrink: 0;\n  position: relative;\n  overflow: hidden;\n}\n\n.icon-wrapper::before {\n  content: '';\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  border-radius: 50%;\n  opacity: 0.15;\n}\n\n.icon-add {\n  background: linear-gradient(135deg, #FFF3E6 0%, #FFE8CC 100%);\n}\n\n.icon-add::before {\n  background: #FFB84D;\n}\n\n.icon-minus {\n  background: linear-gradient(135deg, #F5F5F5 0%, #ECECEC 100%);\n}\n\n.icon-minus::before {\n  background: #999999;\n}\n\n.icon-text {\n  font-size: 48rpx;\n  font-weight: 600;\n  position: relative;\n  z-index: 1;\n}\n\n.icon-add .icon-text {\n  color: #FFB84D;\n}\n\n.icon-minus .icon-text {\n  color: #999999;\n}\n\n.info-wrapper {\n  flex: 1;\n  min-width: 0;\n}\n\n.type-text {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #333333;\n  margin-bottom: 8rpx;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  letter-spacing: 0.5rpx;\n}\n\n.date-text {\n  font-size: 24rpx;\n  color: #999999;\n  letter-spacing: 0.5rpx;\n}\n\n/* 右侧积分 */\n.log-right {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n  flex-shrink: 0;\n  margin-left: 20rpx;\n}\n\n.score-value {\n  font-size: 40rpx;\n  font-weight: 700;\n  margin-bottom: 4rpx;\n  font-family: 'DIN Alternate', 'Helvetica Neue', Arial, sans-serif;\n  letter-spacing: 1rpx;\n}\n\n.score-add {\n  color: #FFB84D;\n}\n\n.score-minus {\n  color: #999999;\n}\n\n.score-label {\n  font-size: 22rpx;\n  color: #CCCCCC;\n  letter-spacing: 1rpx;\n}\n\n/* 空状态 */\n.empty-state {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 160rpx 60rpx;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  box-shadow: 0 4rpx 20rpx rgba(255, 154, 77, 0.06);\n}\n\n.empty-icon {\n  font-size: 120rpx;\n  margin-bottom: 32rpx;\n  opacity: 0.6;\n  animation: float 3s ease-in-out infinite;\n}\n\n@keyframes float {\n  0%, 100% {\n    transform: translateY(0);\n  }\n  50% {\n    transform: translateY(-10rpx);\n  }\n}\n\n.empty-text {\n  font-size: 32rpx;\n  color: #666666;\n  font-weight: 600;\n  margin-bottom: 16rpx;\n  letter-spacing: 1rpx;\n}\n\n.empty-desc {\n  font-size: 26rpx;\n  color: #999999;\n  letter-spacing: 0.5rpx;\n}"
  },
  {
    "path": "pages/shop/detail.js",
    "content": "const WXAPI = require('apifm-wxapi')\r\nconst APP = getApp()\r\nAPP.configLoadOK = () => {\r\n\r\n}\r\n\r\nPage({\r\n  data: {\r\n    markers: [],\r\n  },\r\n  onLoad: function (options) {\r\n    getApp().initLanguage(this)\r\n    // options.id = 36\r\n    this.data.id = options.id\r\n    this.shopSubdetail()\r\n  },\r\n  async shopSubdetail() {\r\n    const res = await WXAPI.shopSubdetail(this.data.id)\r\n    if (res.code != 0) {\r\n      wx.showModal({\r\n        confirmText: this.data.$t.common.confirm,\r\n        cancelText: this.data.$t.common.cancel,\r\n        content: res.msg,\r\n        showCancel: false\r\n      })\r\n      wx.navigateBack()\r\n    } else {\r\n      wx.setNavigationBarTitle({\r\n        title: res.data.info.name,\r\n      })\r\n      const marker = {\r\n        latitude: res.data.info.latitude,\r\n        longitude: res.data.info.longitude,\r\n        iconPath: wx.getStorageSync('mapPos'),\r\n        height: 30,\r\n        width: 30,\r\n      }\r\n      const markers = [marker]\r\n      this.setData({\r\n        shopSubdetailData: res.data,\r\n        shopInfo: res.data.info,\r\n        markers\r\n      })\r\n    }\r\n  },\r\n  // \r\n  phoneCall:function(){\r\n    var phoneNumber = this.data.shopInfo.linkPhone\r\n    wx.makePhoneCall({\r\n      phoneNumber,\r\n      // phoneNumber: phoneNumber,\r\n    })\r\n  },\r\n  // \r\n  guideNow: function(){\r\n    var name = this.data.shopInfo.name\r\n    var address = this.data.shopInfo.address\r\n    var latitude = this.data.shopInfo.latitude\r\n    var longitude = this.data.shopInfo.longitude\r\n    wx.openLocation({\r\n      name: name,\r\n      address: address,\r\n      latitude: latitude,\r\n      longitude: longitude,\r\n    })\r\n  },\r\n})"
  },
  {
    "path": "pages/shop/detail.json",
    "content": "{\r\n  \"navigationBarTitleText\": \"\"\r\n}"
  },
  {
    "path": "pages/shop/detail.wxml",
    "content": "<view class=\"container\">\r\n  <!-- 顶部图片区域 -->\r\n  <view class=\"header-section\">\r\n    <image class=\"shop-cover\" mode=\"aspectFill\" src=\"{{shopInfo.pic}}\"></image>\r\n    <view class=\"cover-overlay\"></view>\r\n  </view>\r\n\r\n  <!-- 门店信息卡片 -->\r\n  <view class=\"shop-card\">\r\n    <view class=\"shop-title-area\">\r\n      <view class=\"shop-name\">{{shopInfo.name}}</view>\r\n      <view class=\"shop-tag\" wx:if=\"{{shopInfo.characteristic}}\">\r\n        <text class=\"tag-icon\">✨</text>\r\n        <text class=\"tag-text\">{{shopInfo.characteristic}}</text>\r\n      </view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 快捷操作按钮 -->\r\n  <view class=\"action-buttons\">\r\n    <view class=\"action-btn\" bind:tap=\"phoneCall\">\r\n      <view class=\"btn-icon phone-icon\">📞</view>\r\n      <view class=\"btn-text\">{{ $t.shop.contactUs || '联系电话' }}</view>\r\n      <view class=\"btn-sub-text\">{{shopInfo.linkPhone}}</view>\r\n    </view>\r\n    <view class=\"action-divider\"></view>\r\n    <view class=\"action-btn\" bind:tap=\"guideNow\">\r\n      <view class=\"btn-icon nav-icon\">🧭</view>\r\n      <view class=\"btn-text\">{{ $t.shop.Navigation || '到店导航' }}</view>\r\n      <view class=\"btn-sub-text\">{{ $t.shop.viewMap || '查看地图' }}</view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 详细信息区域 -->\r\n  <view class=\"detail-section\">\r\n    <view class=\"detail-title\">门店信息</view>\r\n    \r\n    <view class=\"info-item\">\r\n      <view class=\"info-label\">\r\n        <text class=\"label-icon\">🕐</text>\r\n        <text>{{ $t.shop.openingHours || '营业时间' }}</text>\r\n      </view>\r\n      <view class=\"info-value\">{{shopInfo.openingHours}}</view>\r\n    </view>\r\n\r\n    <view class=\"info-item\">\r\n      <view class=\"info-label\">\r\n        <text class=\"label-icon\">📍</text>\r\n        <text>{{ $t.shop.address || '门店地址' }}</text>\r\n      </view>\r\n      <view class=\"info-value\">{{shopInfo.address}}</view>\r\n    </view>\r\n  </view>\r\n\r\n  <!-- 地图区域 -->\r\n  <view class=\"map-section\">\r\n    <view class=\"map-header\">\r\n      <text class=\"map-title\">📌 门店位置</text>\r\n      <text class=\"map-tip\" bind:tap=\"guideNow\">点击导航 →</text>\r\n    </view>\r\n    <map \r\n      id=\"map\" \r\n      class=\"map-container\" \r\n      latitude=\"{{shopInfo.latitude}}\" \r\n      longitude=\"{{shopInfo.longitude}}\" \r\n      markers=\"{{markers}}\" \r\n      show-location \r\n      enable-3D\r\n      show-compass \r\n      show-scale\r\n      enable-rotate\r\n      enable-traffic \r\n    />\r\n  </view>\r\n\r\n  <!-- 底部安全距离 -->\r\n  <view class=\"safe-bottom\"></view>\r\n</view>"
  },
  {
    "path": "pages/shop/detail.wxss",
    "content": "/* 页面容器 */\r\n.container {\r\n  width: 100vw;\r\n  min-height: 100vh;\r\n  background: linear-gradient(180deg, #FFF8F0 0%, #FFFFFF 100%);\r\n}\r\n\r\n/* 顶部图片区域 */\r\n.header-section {\r\n  position: relative;\r\n  width: 100%;\r\n  height: 500rpx;\r\n  overflow: hidden;\r\n}\r\n\r\n.shop-cover {\r\n  width: 100%;\r\n  height: 100%;\r\n}\r\n\r\n.cover-overlay {\r\n  position: absolute;\r\n  bottom: 0;\r\n  left: 0;\r\n  right: 0;\r\n  height: 150rpx;\r\n  background: linear-gradient(to bottom, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 100%);\r\n}\r\n\r\n/* 门店信息卡片 */\r\n.shop-card {\r\n  position: relative;\r\n  margin: -80rpx 30rpx 24rpx;\r\n  padding: 40rpx 32rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  box-shadow: 0 8rpx 32rpx rgba(210, 180, 140, 0.15);\r\n}\r\n\r\n.shop-title-area {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 20rpx;\r\n}\r\n\r\n.shop-name {\r\n  font-size: 40rpx;\r\n  font-weight: 600;\r\n  color: #3D2817;\r\n  line-height: 56rpx;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.shop-tag {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  align-self: flex-start;\r\n  padding: 12rpx 24rpx;\r\n  background: linear-gradient(135deg, #FFE8D1 0%, #FFD4A8 100%);\r\n  border-radius: 50rpx;\r\n  gap: 8rpx;\r\n}\r\n\r\n.tag-icon {\r\n  font-size: 24rpx;\r\n}\r\n\r\n.tag-text {\r\n  font-size: 24rpx;\r\n  color: #8B5A2B;\r\n  font-weight: 500;\r\n}\r\n\r\n/* 快捷操作按钮 */\r\n.action-buttons {\r\n  display: flex;\r\n  margin: 0 30rpx 24rpx;\r\n  padding: 32rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  box-shadow: 0 8rpx 32rpx rgba(210, 180, 140, 0.15);\r\n}\r\n\r\n.action-btn {\r\n  flex: 1;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  gap: 12rpx;\r\n  padding: 16rpx 0;\r\n  transition: all 0.3s;\r\n}\r\n\r\n.action-btn:active {\r\n  opacity: 0.7;\r\n  transform: scale(0.95);\r\n}\r\n\r\n.btn-icon {\r\n  font-size: 48rpx;\r\n  margin-bottom: 8rpx;\r\n}\r\n\r\n.btn-text {\r\n  font-size: 28rpx;\r\n  color: #3D2817;\r\n  font-weight: 500;\r\n}\r\n\r\n.btn-sub-text {\r\n  font-size: 22rpx;\r\n  color: #999999;\r\n  margin-top: 4rpx;\r\n  max-width: 240rpx;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.action-divider {\r\n  width: 2rpx;\r\n  height: 100rpx;\r\n  background: linear-gradient(to bottom, rgba(210, 180, 140, 0) 0%, rgba(210, 180, 140, 0.3) 50%, rgba(210, 180, 140, 0) 100%);\r\n}\r\n\r\n/* 详细信息区域 */\r\n.detail-section {\r\n  margin: 0 30rpx 24rpx;\r\n  padding: 40rpx 32rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  box-shadow: 0 8rpx 32rpx rgba(210, 180, 140, 0.15);\r\n}\r\n\r\n.detail-title {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #3D2817;\r\n  margin-bottom: 32rpx;\r\n  padding-bottom: 24rpx;\r\n  border-bottom: 2rpx solid #F5F5F5;\r\n}\r\n\r\n.info-item {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16rpx;\r\n  padding: 24rpx 0;\r\n  border-bottom: 1rpx solid #F8F8F8;\r\n}\r\n\r\n.info-item:last-child {\r\n  border-bottom: none;\r\n  padding-bottom: 0;\r\n}\r\n\r\n.info-label {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12rpx;\r\n  font-size: 26rpx;\r\n  color: #666666;\r\n  font-weight: 500;\r\n}\r\n\r\n.label-icon {\r\n  font-size: 28rpx;\r\n}\r\n\r\n.info-value {\r\n  font-size: 28rpx;\r\n  color: #333333;\r\n  line-height: 44rpx;\r\n  padding-left: 40rpx;\r\n}\r\n\r\n/* 地图区域 */\r\n.map-section {\r\n  margin: 0 30rpx 24rpx;\r\n  background: #FFFFFF;\r\n  border-radius: 24rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 8rpx 32rpx rgba(210, 180, 140, 0.15);\r\n}\r\n\r\n.map-header {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  padding: 32rpx;\r\n  background: linear-gradient(135deg, #FFF8F0 0%, #FFFFFF 100%);\r\n}\r\n\r\n.map-title {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #3D2817;\r\n}\r\n\r\n.map-tip {\r\n  font-size: 24rpx;\r\n  color: #D2691E;\r\n  font-weight: 500;\r\n  padding: 8rpx 16rpx;\r\n  background: rgba(255, 228, 196, 0.5);\r\n  border-radius: 20rpx;\r\n}\r\n\r\n.map-container {\r\n  width: 100%;\r\n  height: 500rpx;\r\n  border-top: 1rpx solid #F5F5F5;\r\n}\r\n\r\n/* 底部安全距离 */\r\n.safe-bottom {\r\n  height: 40rpx;\r\n}"
  },
  {
    "path": "pages/shop/join-apply.js",
    "content": "const WXAPI = require('apifm-wxapi')\n\nPage({\n  data: {\n    autosize: {\n      minHeight: 100\n    }\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function(options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.shop.join,\n    })\n  },\n  onShow: function() {\n  },\n  async bindSave() {    \n    if (!this.data.name) {\n      wx.showToast({\n        title: this.data.$t.shop.nameRequired,\n        icon: 'none',\n      })\n      return\n    }\n    if (!this.data.mobile) {\n      wx.showToast({\n        title: this.data.$t.shop.mobileRequired,\n        icon: 'none',\n      })\n      return\n    }\n    if (!this.data.content) {\n      this.data.content = '申请入驻'\n    }\n    if (!this.data.content) {\n      wx.showToast({\n        title: this.data.$t.shop.contentRequired,\n        icon: 'none',\n      })\n      return\n    }\n    const extJsonStr = {}\n    extJsonStr['姓名'] = this.data.name\n    extJsonStr['联系电话'] = this.data.mobile\n\n    // 批量上传附件\n    if (this.data.picsList) {\n      for (let index = 0; index < this.data.picsList.length; index++) {\n        const pic = this.data.picsList[index];\n        const res = await WXAPI.uploadFileV2(wx.getStorageSync('token'), pic.url)\n        if (res.code == 0) {\n          extJsonStr['file' + index] = res.data.url\n        }\n      }\n    }\n\n    const res = await WXAPI.addComment({\n      token: wx.getStorageSync('token'),\n      type: 1,\n      extJsonStr: JSON.stringify(extJsonStr),\n      content: this.data.content\n    })\n    if (res.code == 0) {\n      wx.showToast({\n        title: this.data.$t.common.submitSuccess,\n      })\n      setTimeout(() => {\n        wx.navigateBack({\n          delta: 0,\n        })\n      }, 1000);\n    } else {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    }\n  },\n  afterPicRead(e) {\n    let picsList = this.data.picsList\n    if (!picsList) {\n      picsList = []\n    }\n    picsList = picsList.concat(e.detail.file)\n    this.setData({\n      picsList\n    })\n  },\n  afterPicDel(e) {\n    let picsList = this.data.picsList\n    picsList.splice(e.detail.index, 1)\n    this.setData({\n      picsList\n    })\n  }\n})"
  },
  {
    "path": "pages/shop/join-apply.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/shop/join-apply.wxml",
    "content": "<view class=\"join-apply-container\">\n  <!-- 顶部装饰背景 -->\n  <view class=\"header-decoration\">\n    <view class=\"bubble bubble-1\"></view>\n    <view class=\"bubble bubble-2\"></view>\n    <view class=\"bubble bubble-3\"></view>\n  </view>\n\n  <!-- 欢迎标题区域 -->\n  <view class=\"welcome-section\">\n    <view class=\"icon-wrapper\">\n      <text class=\"icon\">🍵</text>\n    </view>\n    <view class=\"welcome-title\">商家入驻申请</view>\n    <view class=\"welcome-subtitle\">加入我们，开启您的甜蜜事业</view>\n  </view>\n\n  <!-- 表单卡片 -->\n  <view class=\"form-card\">\n    <!-- 基本信息板块 -->\n    <view class=\"form-section\">\n      <view class=\"section-title\">\n        <view class=\"title-line\"></view>\n        <text class=\"title-text\">基本信息</text>\n        <view class=\"title-line\"></view>\n      </view>\n      \n      <view class=\"field-item\">\n        <view class=\"field-label\">\n          <text class=\"label-icon\">👤</text>\n          <text class=\"label-text\">{{ $t.shop.name }}</text>\n          <text class=\"required-mark\">*</text>\n        </view>\n        <van-field\n          model:value=\"{{ name }}\"\n          placeholder=\"{{ $t.shop.namePlaceholder }}\"\n          clearable\n          border=\"{{ false }}\"\n          custom-style=\"padding: 20rpx 0; background: #f8f8f8; border-radius: 16rpx; padding-left: 24rpx;\"\n        />\n      </view>\n\n      <view class=\"field-item\">\n        <view class=\"field-label\">\n          <text class=\"label-icon\">📱</text>\n          <text class=\"label-text\">{{ $t.shop.mobile }}</text>\n          <text class=\"required-mark\">*</text>\n        </view>\n        <van-field\n          type=\"number\"\n          model:value=\"{{ mobile }}\"\n          placeholder=\"{{ $t.shop.mobilePlaceholder }}\"\n          clearable\n          border=\"{{ false }}\"\n          custom-style=\"padding: 20rpx 0; background: #f8f8f8; border-radius: 16rpx; padding-left: 24rpx;\"\n        />\n      </view>\n    </view>\n\n    <!-- 店铺资料板块 -->\n    <view class=\"form-section\">\n      <view class=\"section-title\">\n        <view class=\"title-line\"></view>\n        <text class=\"title-text\">店铺资料</text>\n        <view class=\"title-line\"></view>\n      </view>\n\n      <view class=\"field-item\">\n        <view class=\"field-label\">\n          <text class=\"label-icon\">📸</text>\n          <text class=\"label-text\">店铺照片</text>\n          <text class=\"field-tip\">（营业执照、店铺照片等）</text>\n        </view>\n        <view class=\"uploader-wrapper\">\n          <van-uploader\n            accept=\"media\"\n            multiple\n            upload-text=\"{{ $t.feedback.imageOrVideo }}\"\n            image-fit=\"aspectFill\"\n            file-list=\"{{ picsList }}\"\n            bind:after-read=\"afterPicRead\"\n            bind:delete=\"afterPicDel\"\n            max-count=\"9\"\n          />\n        </view>\n      </view>\n\n      <view class=\"field-item\">\n        <view class=\"field-label\">\n          <text class=\"label-icon\">✍️</text>\n          <text class=\"label-text\">申请说明</text>\n          <text class=\"required-mark\">*</text>\n        </view>\n        <view class=\"textarea-wrapper\">\n          <van-field\n            model:value=\"{{ content }}\"\n            placeholder=\"{{ $t.shop.contentPlaceholder }}\"\n            type=\"textarea\"\n            autosize=\"{{ autosize }}\"\n            border=\"{{ false }}\"\n            custom-style=\"background: #f8f8f8; border-radius: 16rpx; padding: 24rpx;\"\n          />\n        </view>\n      </view>\n    </view>\n\n    <!-- 提示信息 -->\n    <view class=\"tips-section\">\n      <view class=\"tips-title\">💡 温馨提示</view>\n      <view class=\"tips-item\">• 请确保提供的信息真实有效</view>\n      <view class=\"tips-item\">• 我们将在1-3个工作日内审核您的申请</view>\n      <view class=\"tips-item\">• 审核结果将通过短信或站内消息通知</view>\n    </view>\n  </view>\n\n  <!-- 提交按钮 -->\n  <view class=\"submit-section\">\n    <van-button \n      type=\"primary\" \n      block \n      bind:click=\"bindSave\"\n      custom-class=\"submit-button\"\n    >\n      {{ $t.shop.joinBtn }}\n    </van-button>\n  </view>\n\n  <!-- 底部装饰 -->\n  <view class=\"footer-decoration\">\n    <text class=\"footer-text\">期待与您携手共创美好未来</text>\n  </view>\n</view>"
  },
  {
    "path": "pages/shop/join-apply.wxss",
    "content": "/* 整体容器 */\n.join-apply-container {\n  min-height: 100vh;\n  background: linear-gradient(135deg, #FFF5E6 0%, #FFE4D6 50%, #FFF8F0 100%);\n  padding-bottom: 40rpx;\n  position: relative;\n  overflow: hidden;\n}\n\n/* 顶部装饰背景 */\n.header-decoration {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 400rpx;\n  overflow: hidden;\n}\n\n.bubble {\n  position: absolute;\n  background: rgba(255, 255, 255, 0.3);\n  border-radius: 50%;\n  animation: float 6s ease-in-out infinite;\n}\n\n.bubble-1 {\n  width: 120rpx;\n  height: 120rpx;\n  top: 50rpx;\n  left: 30rpx;\n  animation-delay: 0s;\n}\n\n.bubble-2 {\n  width: 180rpx;\n  height: 180rpx;\n  top: 150rpx;\n  right: 40rpx;\n  animation-delay: 2s;\n}\n\n.bubble-3 {\n  width: 90rpx;\n  height: 90rpx;\n  top: 280rpx;\n  left: 50%;\n  animation-delay: 4s;\n}\n\n@keyframes float {\n  0%, 100% {\n    transform: translateY(0) scale(1);\n    opacity: 0.5;\n  }\n  50% {\n    transform: translateY(-30rpx) scale(1.1);\n    opacity: 0.8;\n  }\n}\n\n/* 欢迎标题区域 */\n.welcome-section {\n  position: relative;\n  z-index: 10;\n  padding: 60rpx 0 50rpx;\n  text-align: center;\n}\n\n.icon-wrapper {\n  margin-bottom: 24rpx;\n  animation: bounce 2s ease-in-out infinite;\n}\n\n.icon {\n  font-size: 100rpx;\n  display: inline-block;\n}\n\n@keyframes bounce {\n  0%, 100% {\n    transform: translateY(0);\n  }\n  50% {\n    transform: translateY(-10rpx);\n  }\n}\n\n.welcome-title {\n  font-size: 48rpx;\n  font-weight: bold;\n  color: #5D3A1A;\n  margin-bottom: 16rpx;\n  letter-spacing: 2rpx;\n}\n\n.welcome-subtitle {\n  font-size: 26rpx;\n  color: #8B6F47;\n  opacity: 0.9;\n}\n\n/* 表单卡片 */\n.form-card {\n  position: relative;\n  z-index: 10;\n  margin: 0 30rpx;\n  background: #FFFFFF;\n  border-radius: 32rpx;\n  padding: 40rpx 30rpx;\n  box-shadow: 0 8rpx 32rpx rgba(93, 58, 26, 0.08);\n}\n\n/* 表单板块 */\n.form-section {\n  margin-bottom: 50rpx;\n}\n\n.form-section:last-child {\n  margin-bottom: 0;\n}\n\n/* 板块标题 */\n.section-title {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 40rpx;\n  gap: 20rpx;\n}\n\n.title-line {\n  flex: 1;\n  height: 2rpx;\n  background: linear-gradient(90deg, transparent, #D4A574, transparent);\n  max-width: 120rpx;\n}\n\n.title-text {\n  font-size: 30rpx;\n  font-weight: 600;\n  color: #5D3A1A;\n  white-space: nowrap;\n}\n\n/* 表单项 */\n.field-item {\n  margin-bottom: 32rpx;\n}\n\n.field-item:last-child {\n  margin-bottom: 0;\n}\n\n/* 字段标签 */\n.field-label {\n  display: flex;\n  align-items: center;\n  margin-bottom: 16rpx;\n  padding-left: 8rpx;\n}\n\n.label-icon {\n  font-size: 32rpx;\n  margin-right: 12rpx;\n}\n\n.label-text {\n  font-size: 28rpx;\n  color: #333333;\n  font-weight: 500;\n}\n\n.required-mark {\n  color: #FF6B6B;\n  margin-left: 6rpx;\n  font-size: 28rpx;\n}\n\n.field-tip {\n  font-size: 22rpx;\n  color: #999999;\n  margin-left: 8rpx;\n}\n\n/* 上传组件包装 */\n.uploader-wrapper {\n  padding: 20rpx;\n  background: #FAFAFA;\n  border-radius: 16rpx;\n  border: 2rpx dashed #E0E0E0;\n}\n\n/* 文本域包装 */\n.textarea-wrapper {\n  margin-top: 8rpx;\n}\n\n/* 提示信息板块 */\n.tips-section {\n  margin-top: 40rpx;\n  padding: 30rpx;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFF5E6 100%);\n  border-radius: 20rpx;\n  border-left: 6rpx solid #D4A574;\n}\n\n.tips-title {\n  font-size: 28rpx;\n  font-weight: 600;\n  color: #5D3A1A;\n  margin-bottom: 20rpx;\n  display: flex;\n  align-items: center;\n}\n\n.tips-item {\n  font-size: 24rpx;\n  color: #666666;\n  line-height: 40rpx;\n  margin-bottom: 8rpx;\n  padding-left: 8rpx;\n}\n\n.tips-item:last-child {\n  margin-bottom: 0;\n}\n\n/* 提交按钮区域 */\n.submit-section {\n  position: relative;\n  z-index: 10;\n  margin: 50rpx 30rpx 30rpx;\n}\n\n.submit-button {\n  height: 96rpx !important;\n  border-radius: 48rpx !important;\n  background: linear-gradient(135deg, #D4A574 0%, #A67C52 100%) !important;\n  box-shadow: 0 8rpx 24rpx rgba(164, 124, 82, 0.3) !important;\n  font-size: 32rpx !important;\n  font-weight: 600 !important;\n  letter-spacing: 4rpx !important;\n}\n\n/* 底部装饰 */\n.footer-decoration {\n  position: relative;\n  z-index: 10;\n  text-align: center;\n  margin-top: 40rpx;\n  padding: 0 30rpx;\n}\n\n.footer-text {\n  font-size: 24rpx;\n  color: #8B6F47;\n  opacity: 0.7;\n}\n\n/* Vant 组件样式覆盖 */\n.van-field__control {\n  color: #333333;\n  font-size: 28rpx;\n}\n\n.van-field__placeholder {\n  color: #BBBBBB;\n  font-size: 26rpx;\n}\n\n/* 上传组件美化 */\n.van-uploader__upload {\n  background: #FFFFFF !important;\n  border: 2rpx dashed #D4A574 !important;\n  border-radius: 12rpx !important;\n}\n\n.van-uploader__upload-text {\n  color: #8B6F47 !important;\n  font-size: 24rpx !important;\n}\n\n.van-uploader__preview-image {\n  border-radius: 12rpx !important;\n}\n\n/* 响应式优化 */\n@media (max-width: 375px) {\n  .welcome-title {\n    font-size: 44rpx;\n  }\n  \n  .form-card {\n    padding: 36rpx 24rpx;\n  }\n}"
  },
  {
    "path": "pages/shop/select.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\n\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.shop.select,\n    })\n    this.setData({\n      type: options.type,\n      shop_join_open: wx.getStorageSync('shop_join_open')\n    })\n  },\n  onShow: function () {\n    wx.getLocation({\n      type: 'wgs84', //wgs84 返回 gps 坐标，gcj02 返回可用于 wx.openLocation 的坐标\n      success: (res) => {\n        this.data.latitude = res.latitude\n        this.data.longitude = res.longitude\n        this.fetchShops(res.latitude, res.longitude, '')\n      },\n      fail(e){\n        console.error(e)\n        AUTH.checkAndAuthorize('scope.userLocation')\n      }\n    })    \n  },\n  async fetchShops(latitude, longitude, kw){\n    const res = await WXAPI.fetchShops({\n      curlatitude: latitude,\n      curlongitude: longitude,\n      nameLike: kw\n    })\n    if (res.code == 0) {\n      res.data.forEach(ele => {\n        ele.distance = ele.distance.toFixed(1) // 距离保留3位小数\n      })\n      this.setData({\n        shops: res.data\n      })\n    } else {\n      this.setData({\n        shops: null\n      })\n    }\n  },\n  searchChange(event){\n    this.setData({\n      searchValue: event.detail.value\n    })\n  },\n  search(event){\n    console.log('search')\n    this.setData({\n      searchValue: event.detail.value\n    })\n    this.fetchShops(this.data.latitude, this.data.longitude, event.detail.value)\n  },\n  goShop(e){\n    const idx = e.currentTarget.dataset.idx    \n    wx.setStorageSync('shopInfo', this.data.shops[idx])\n    if (this.data.type == 'index') {\n      wx.setStorageSync('refreshIndex', 1)\n    }\n    if (this.data.type == 'pay') {\n      wx.navigateBack()\n    } else {\n      wx.switchTab({\n        url: '/pages/index/index'\n      })\n    }\n    \n  },\n  joinApply() {\n    wx.navigateTo({\n      url: '/pages/shop/join-apply',\n    })\n  },\n})"
  },
  {
    "path": "pages/shop/select.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/shop/select.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 顶部搜索区域 -->\n  <view class=\"search-wrapper\">\n    <view class=\"search-box\">\n      <view class=\"search-icon\">\n        <van-icon name=\"search\" size=\"32rpx\" />\n      </view>\n      <input \n        class=\"search-input\" \n        placeholder=\"{{ $t.common.search }}\" \n        placeholder-class=\"search-placeholder\"\n        bindinput=\"searchChange\" \n        bindconfirm=\"search\" \n      />\n    </view>\n  </view>\n\n  <!-- 门店列表 -->\n  <view class=\"shop-list\">\n    <view class=\"shop-card {{ index == 0 ? 'shop-card-nearest' : '' }}\" wx:for=\"{{shops}}\" wx:key=\"id\">\n      <!-- 当前门店标签 -->\n      <!-- <view wx:if=\"{{index == 0}}\" class=\"nearest-badge\">\n        <text class=\"badge-text\">当前门店</text>\n      </view> -->\n\n      <!-- 门店头部 -->\n      <view class=\"shop-header\">\n        <view class=\"shop-title\">\n          <view class=\"shop-icon\">\n            <van-icon name=\"shop-o\" size=\"36rpx\" color=\"#8B4513\" />\n          </view>\n          <text class=\"shop-name\">{{ item.name }}</text>\n        </view>\n        <view class=\"distance-wrapper\">\n          <text class=\"distance-num\">{{ item.distance }}</text>\n          <text class=\"distance-unit\">km</text>\n        </view>\n      </view>\n\n      <!-- 门店信息 -->\n      <view class=\"shop-info\">\n        <view class=\"info-item\">\n          <view class=\"info-icon\">\n            <van-icon name=\"location-o\" size=\"28rpx\" color=\"#A0826D\" />\n          </view>\n          <text class=\"info-text\">{{ item.address }}</text>\n        </view>\n        \n        <view class=\"info-item\">\n          <view class=\"info-icon\">\n            <van-icon name=\"clock-o\" size=\"28rpx\" color=\"#A0826D\" />\n          </view>\n          <text class=\"info-text\">{{ item.openingHours }}</text>\n        </view>\n        \n        <view class=\"info-item\">\n          <view class=\"info-icon\">\n            <van-icon name=\"phone-o\" size=\"28rpx\" color=\"#A0826D\" />\n          </view>\n          <text class=\"info-text\">{{ item.linkPhone }}</text>\n        </view>\n      </view>\n\n      <!-- 选择按钮 -->\n      <view wx:if=\"{{index == 0}}\" class=\"select-btn-wrapper\">\n        <button class=\"select-btn select-btn-primary\" bindtap=\"goShop\" data-idx=\"{{ index }}\">\n          {{ $t.shop.select }}\n        </button>\n      </view>\n\n      <!-- 切换按钮 -->\n      <view wx:if=\"{{index > 0}}\" class=\"switch-btn-wrapper\">\n        <button class=\"select-btn select-btn-secondary\" bindtap=\"goShop\" data-idx=\"{{ index }}\">\n          切换至该门店\n          <van-icon name=\"arrow\" size=\"28rpx\" />\n        </button>\n      </view>\n    </view>\n  </view>\n\n  <!-- 底部申请入驻 -->\n  <view class=\"footer-btn\">\n    <button class=\"apply-btn\" bindtap=\"joinApply\">\n      <van-icon name=\"add-o\" size=\"32rpx\" />\n      <text>商家申请入驻</text>\n    </button>\n  </view>\n</view>"
  },
  {
    "path": "pages/shop/select.wxss",
    "content": "/* 页面容器 */\n.page-container {\n  min-height: 100vh;\n  background: linear-gradient(180deg, #FFF9F0 0%, #FFEEDD 100%);\n  padding-bottom: 120rpx;\n}\n\n/* 搜索区域 */\n.search-wrapper {\n  padding: 24rpx 32rpx 32rpx;\n  background: linear-gradient(180deg, #8B4513 0%, #A0826D 100%);\n  position: sticky;\n  top: 0;\n  z-index: 100;\n  box-shadow: 0 4rpx 20rpx rgba(139, 69, 19, 0.15);\n}\n\n.search-box {\n  position: relative;\n  background: #FFFFFF;\n  border-radius: 50rpx;\n  height: 80rpx;\n  display: flex;\n  align-items: center;\n  box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08);\n  overflow: hidden;\n}\n\n.search-icon {\n  position: absolute;\n  left: 28rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #A0826D;\n}\n\n.search-input {\n  flex: 1;\n  height: 100%;\n  padding: 0 28rpx 0 72rpx;\n  font-size: 28rpx;\n  color: #333;\n}\n\n.search-placeholder {\n  color: #BFAB9A;\n  font-size: 28rpx;\n}\n\n/* 门店列表 */\n.shop-list {\n  padding: 32rpx 32rpx 0;\n}\n\n/* 门店卡片 */\n.shop-card {\n  position: relative;\n  background: #FFFFFF;\n  border-radius: 24rpx;\n  padding: 32rpx;\n  margin-bottom: 24rpx;\n  box-shadow: 0 8rpx 24rpx rgba(139, 69, 19, 0.08);\n  transition: all 0.3s ease;\n  overflow: hidden;\n}\n\n/* 最近门店卡片特殊样式 */\n.shop-card-nearest {\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF9F0 100%);\n  border: 2rpx solid #D4AF37;\n  box-shadow: 0 12rpx 32rpx rgba(212, 175, 55, 0.2);\n}\n\n/* 当前门店标签 */\n.nearest-badge {\n  position: absolute;\n  top: 0;\n  right: 32rpx;\n  background: linear-gradient(135deg, #D4AF37 0%, #FFD700 100%);\n  padding: 12rpx 28rpx;\n  border-radius: 0 0 20rpx 20rpx;\n  box-shadow: 0 4rpx 12rpx rgba(212, 175, 55, 0.3);\n}\n\n.badge-text {\n  font-size: 22rpx;\n  color: #FFFFFF;\n  font-weight: 600;\n  letter-spacing: 1rpx;\n}\n\n/* 门店头部 */\n.shop-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 28rpx;\n}\n\n.shop-title {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  margin-right: 20rpx;\n}\n\n.shop-icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 72rpx;\n  height: 72rpx;\n  background: linear-gradient(135deg, #FFF9F0 0%, #FFE4C4 100%);\n  border-radius: 16rpx;\n  margin-right: 20rpx;\n}\n\n.shop-name {\n  font-size: 32rpx;\n  font-weight: 600;\n  color: #2C1810;\n  line-height: 44rpx;\n  letter-spacing: 0.5rpx;\n}\n\n/* 距离显示 */\n.distance-wrapper {\n  display: flex;\n  align-items: baseline;\n  padding: 12rpx 24rpx;\n  background: linear-gradient(135deg, #F5E6D3 0%, #FFE4C4 100%);\n  border-radius: 32rpx;\n  box-shadow: 0 2rpx 8rpx rgba(139, 69, 19, 0.1);\n}\n\n.distance-num {\n  font-size: 36rpx;\n  font-weight: 700;\n  color: #8B4513;\n  line-height: 1;\n}\n\n.distance-unit {\n  font-size: 22rpx;\n  color: #A0826D;\n  margin-left: 4rpx;\n  font-weight: 500;\n}\n\n/* 门店信息 */\n.shop-info {\n  display: flex;\n  flex-direction: column;\n  gap: 20rpx;\n  padding: 24rpx 0;\n  border-top: 1rpx solid #F5E6D3;\n  border-bottom: 1rpx solid #F5E6D3;\n}\n\n.info-item {\n  display: flex;\n  align-items: flex-start;\n}\n\n.info-icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 48rpx;\n  height: 48rpx;\n  background: #FFF9F0;\n  border-radius: 12rpx;\n  margin-right: 16rpx;\n  flex-shrink: 0;\n}\n\n.info-text {\n  flex: 1;\n  font-size: 26rpx;\n  color: #5A4A42;\n  line-height: 48rpx;\n  letter-spacing: 0.3rpx;\n}\n\n/* 按钮容器 */\n.select-btn-wrapper,\n.switch-btn-wrapper {\n  margin-top: 28rpx;\n}\n\n/* 按钮基础样式 */\n.select-btn {\n  width: 100%;\n  height: 88rpx;\n  border-radius: 44rpx;\n  font-size: 30rpx;\n  font-weight: 600;\n  letter-spacing: 1rpx;\n  border: none;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: all 0.3s ease;\n  box-shadow: 0 8rpx 16rpx rgba(0, 0, 0, 0.1);\n}\n\n.select-btn::after {\n  border: none;\n}\n\n/* 主按钮 */\n.select-btn-primary {\n  background: linear-gradient(135deg, #8B4513 0%, #A0826D 100%);\n  color: #FFFFFF;\n  box-shadow: 0 8rpx 20rpx rgba(139, 69, 19, 0.3);\n}\n\n/* 次要按钮 */\n.select-btn-secondary {\n  background: linear-gradient(135deg, #F5E6D3 0%, #FFE4C4 100%);\n  color: #8B4513;\n  border: 2rpx solid #D4AF37;\n  box-shadow: 0 4rpx 12rpx rgba(139, 69, 19, 0.15);\n}\n\n/* 底部申请入驻按钮 */\n.footer-btn {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding: 20rpx 32rpx 32rpx;\n  background: linear-gradient(180deg, rgba(255, 249, 240, 0) 0%, rgba(255, 249, 240, 0.95) 30%, rgba(255, 249, 240, 1) 100%);\n  z-index: 99;\n}\n\n.apply-btn {\n  width: 100%;\n  height: 88rpx;\n  background: linear-gradient(135deg, #FFFFFF 0%, #FFF9F0 100%);\n  border: 2rpx solid #D4AF37;\n  border-radius: 44rpx;\n  color: #8B4513;\n  font-size: 28rpx;\n  font-weight: 600;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 12rpx;\n  box-shadow: 0 8rpx 24rpx rgba(212, 175, 55, 0.2);\n  transition: all 0.3s ease;\n}\n\n.apply-btn::after {\n  border: none;\n}\n\n.apply-btn text {\n  letter-spacing: 1rpx;\n}"
  },
  {
    "path": "pages/sign/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\n\nPage({\n  data: {\n    minDate: new Date().getTime(),\n    maxDate: new Date().getTime(),\n    formatter(day) {\n      return day;\n    },\n  },\n  onLoad: function(options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.my.signDaily,\n    })\n    this.scoreSignLogs()\n  },\n  onShow: function() {\n    AUTH.checkHasLogined().then(isLogined => {\n      if (!isLogined) {\n        AUTH.login(this)\n      }\n    })\n  },\n  async scoreSignLogs() {\n    const _this = this\n    const res = await WXAPI.scoreSignLogs({\n      token: wx.getStorageSync('token')\n    })\n    if (res.code == 0) {\n      this.setData({\n        scoreSignLogs: res.data.result,\n        formatter(day) {\n          const _log = res.data.result.find(ele => {\n            const year = day.date.getYear() + 1900\n            let month = day.date.getMonth() + 1\n            month = month + ''\n            if (month.length == 1) {\n              month = '0' + month\n            }\n            let date = day.date.getDate() + ''\n            if (date.length == 1) {\n              date = '0' + date\n            }\n            return ele.dateAdd.indexOf(`${year}-${month}-${date}`) == 0\n          })\n          if (_log) {\n            day.bottomInfo = _this.data.$t.sign.signed\n          }\n          return day;\n        }\n      })\n    }\n  },\n  async sign() {\n    const res = await WXAPI.scoreSign(wx.getStorageSync('token'))\n    if (res.code == 10000) {\n      wx.showToast({\n        title: this.data.$t.sign.signSuccess,\n        icon: 'success'\n      })\n      this.scoreSignLogs()\n      return\n    }\n    if (res.code != 0) {\n      wx.showToast({\n        title: res.msg,\n        icon: 'none'\n      })\n    } else {\n      wx.showToast({\n        title: this.data.$t.sign.signSuccess,\n        icon: 'success'\n      })\n      this.scoreSignLogs()\n    }\n  },\n})"
  },
  {
    "path": "pages/sign/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/sign/index.wxml",
    "content": "<van-calendar\n  show-title=\"{{ false }}\"\n  poppable=\"{{ false }}\"\n  min-date=\"{{ minDate }}\"\n  max-date=\"{{ maxDate }}\"\n  show-confirm=\"{{ false }}\"\n  formatter=\"{{ formatter }}\"\n/>\n<view class=\"zwqd-box\">\n   <image src=\"/images/zw.png\" bindtap=\"sign\"></image>\n   <view>{{ $t.sign.signBtn }}</view>\n</view>"
  },
  {
    "path": "pages/sign/index.wxss",
    "content": ".todo-dot-bottom {\n  color: red !important;\n}\n.zwqd-box {\n  text-align: center;\n  margin: auto;\n  margin-top: 32rpx;\n}\n.zwqd-box image {\n  width: 140rpx;\n  height: 140rpx;\n  margin: auto;\n}\n.zwqd-box view {\n  margin-top: 16rpx;\n  color: #999;\n  font-size: 26rpx;\n}"
  },
  {
    "path": "pages/youhui-pay/index.js",
    "content": "const WXAPI = require('apifm-wxapi')\nconst AUTH = require('../../utils/auth')\nconst APP = getApp()\nAPP.configLoadOK = () => {\n\n}\nPage({\n  data: {\n    rechargeSendRules: []\n  },\n  onLoad: function (options) {\n    getApp().initLanguage(this)\n    wx.setNavigationBarTitle({\n      title: this.data.$t.my.youhuimaidan,\n    })\n    WXAPI.payBillDiscounts().then(res => {\n      if (res.code === 0) {\n        this.setData({\n          rechargeSendRules: res.data\n        });\n      }\n    })\n  },\n  onShow () {\n    this.setData({\n      shopInfo: wx.getStorageSync('shopInfo')\n    })  \n  },\n  async bindSave(e) {\n    const _this = this    \n    const amount = e.detail.value.amount;\n    console.log(amount)\n    if (amount == \"\" || amount * 1 < 0) {\n      wx.showToast({\n        title: this.data.$t.youhuipay.amountRequired,\n        icon: 'none'\n      })\n      return\n    }\n    const userMoney = await WXAPI.userAmount(wx.getStorageSync('token'))\n    if (userMoney.code == 2000) {\n      AUTH.login(this)\n      return\n    }\n    if (userMoney.code != 0) {\n      wx.showToast({\n        title: userMoney.msg,\n        icon: 'none'\n      })\n      return\n    }\n    const rechargeSendRule = this.data.rechargeSendRules.sort((a, b) => {\n      return b.consume - a.consume\n    }).find(ele => {\n      return amount >= ele.consume\n    })\n    let _msg = this.data.$t.youhuipay.curAmount + ' ￥' + amount + ' '\n    let needPayAmount = amount*1\n    if (rechargeSendRule) {\n      needPayAmount -= rechargeSendRule.discounts\n      _msg += ','+ this.data.$t.youhuipay.youhui +' ￥' + rechargeSendRule.discounts + ' '\n    }\n    if (userMoney.data.balance*1 > 0) {\n      _msg += ',' + this.data.$t.order.balance + ' ￥' + userMoney.data.balance + ' '\n    }\n    needPayAmount = needPayAmount.toFixed(2) // 需要买单支付的金额\n    const wxpayAmount = (needPayAmount - userMoney.data.balance).toFixed(2) // 需要额外微信支付的金额\n    console.log(needPayAmount)\n    console.log(wxpayAmount)\n    \n    if (wxpayAmount > 0) {\n      _msg += ',' + this.data.$t.order.payAmount + ' ￥' + wxpayAmount\n    }\n    wx.showModal({\n      content: _msg,\n      confirmText: this.data.$t.common.confirm,\n      cancelText: this.data.$t.common.cancel,\n      success: function (res) {\n        console.log(res);\n        if (res.confirm) {\n          _this.goPay(amount, wxpayAmount)\n        }\n      }\n    });\n  },\n  goPay(amount, wxpayAmount){\n    const _this = this\n    if (wxpayAmount > 0) {\n      this.setData({\n        paymentShow: true,\n        money: wxpayAmount,\n        nextAction: {\n          type: 4,\n          uid: wx.getStorageSync('uid'),\n          money: amount\n        }\n      })\n    } else {\n      WXAPI.payBill(wx.getStorageSync('token'), amount).then(function (res) {\n        if (res.code == 0) {\n          wx.showModal({\n            confirmText: _this.data.$t.common.confirm,\n            cancelText: _this.data.$t.common.cancel,\n            content: _this.data.$t.asset.success,\n            showCancel: false\n          })\n        } else {\n          wx.showModal({\n            confirmText: _this.data.$t.common.confirm,\n            cancelText: _this.data.$t.common.cancel,\n            content: res.msg,\n            showCancel: false\n          })\n        }        \n      })\n    }\n  },\n  paymentOk(e) {\n    console.log(e.detail); // 这里是组件里data的数据\n    this.setData({\n      paymentShow: false\n    })\n    wx.redirectTo({\n      url: '/pages/asset/index',\n    })\n  },\n  paymentCancel() {\n    this.setData({\n      paymentShow: false\n    })\n  },\n})"
  },
  {
    "path": "pages/youhui-pay/index.json",
    "content": "{\n  \"navigationBarTitleText\": \"\"\n}"
  },
  {
    "path": "pages/youhui-pay/index.wxml",
    "content": "<view class=\"page-container\">\n  <!-- 店铺信息卡片 -->\n  <view class=\"shop-card\">\n    <van-cell \n      icon=\"location-o\" \n      title=\"{{shopInfo.name}}\" \n      label=\"{{shopInfo.address}}\" \n      is-link \n      url=\"/pages/shop/select?type=pay\" \n      custom-class=\"shop-cell\"\n    />\n  </view>\n\n  <form bindsubmit=\"bindSave\" report-submit=\"true\">\n    <!-- 金额输入卡片 -->\n    <view class=\"amount-card\">\n      <view class=\"amount-header\">\n        <view class=\"header-icon\">💰</view>\n        <view class=\"header-title\">{{ $t.cart.Consumptionamount }}</view>\n      </view>\n      \n      <view class=\"amount-input-wrapper\">\n        <view class=\"currency-symbol\">¥</view>\n        <input \n          class='amount-input' \n          placeholder='{{ $t.youhuipay.askAmount }}' \n          name=\"amount\" \n          type=\"digit\"\n          placeholder-class=\"input-placeholder\"\n        ></input>\n      </view>\n\n      <view class=\"pay-button-wrapper\">\n        <button class=\"pay-button\" formType=\"submit\">\n          <view class=\"button-content\">\n            <text class=\"button-text\">{{ $t.youhuipay.btn }}</text>\n            <text class=\"button-icon\">→</text>\n          </view>\n        </button>\n      </view>\n    </view>\n\n    <!-- 优惠规则卡片 -->\n    <view class=\"discount-card\" wx:if=\"{{rechargeSendRules && rechargeSendRules.length > 0}}\">\n      <view class=\"discount-header\">\n        <view class=\"header-left\">\n          <view class=\"discount-icon\">🎁</view>\n          <view class=\"discount-title\">{{ $t.youhuipay.youhuiList }}</view>\n        </view>\n        <view class=\"discount-badge\">限时优惠</view>\n      </view>\n\n      <view class=\"discount-list\">\n        <block wx:for='{{rechargeSendRules}}' wx:key=\"index\" wx:for-item=\"item\">\n          <view class=\"discount-item\">\n            <view class=\"discount-item-top\">\n              <view class=\"discount-amount\">¥{{item.discounts}}</view>\n              <view class=\"discount-label\">优惠</view>\n            </view>\n            <view class=\"discount-divider\"></view>\n            <view class=\"discount-item-bottom\">\n              <text class=\"discount-rule\">满¥{{item.consume}}可用</text>\n            </view>\n          </view>\n        </block>\n      </view>\n    </view>\n  </form>\n\n  <!-- 温馨提示 -->\n  <view class=\"tips-card\">\n    <view class=\"tips-icon\">💡</view>\n    <view class=\"tips-text\">消费满额即可享受相应优惠，余额不足将使用微信支付</view>\n  </view>\n</view>\n\n\n<payment\n  money=\"{{ money }}\"\n  remark=\"{{ $t.payment.maidan }} ：{{ money }}\"\n  nextAction=\"{{ nextAction }}\"\n  show=\"{{ paymentShow }}\"\n  bind:cancel=\"paymentCancel\"\n  bind:ok=\"paymentOk\"\n/>"
  },
  {
    "path": "pages/youhui-pay/index.wxss",
    "content": "page {\r\n  background: linear-gradient(180deg, #f8f4f0 0%, #fff5eb 100%);\r\n  min-height: 100vh;\r\n  padding-bottom: 40rpx;\r\n}\r\n\r\n/* 页面容器 */\r\n.page-container {\r\n  padding: 30rpx 25rpx;\r\n}\r\n\r\n/* 店铺信息卡片 */\r\n.shop-card {\r\n  background: #ffffff;\r\n  border-radius: 24rpx;\r\n  margin-bottom: 24rpx;\r\n  overflow: hidden;\r\n  box-shadow: 0 8rpx 24rpx rgba(210, 180, 140, 0.12);\r\n}\r\n\r\n.shop-cell {\r\n  background: linear-gradient(135deg, #fff 0%, #fefcf9 100%);\r\n}\r\n\r\n/* 金额输入卡片 */\r\n.amount-card {\r\n  background: linear-gradient(135deg, #ffffff 0%, #fffaf5 100%);\r\n  border-radius: 32rpx;\r\n  padding: 50rpx 40rpx;\r\n  margin-bottom: 24rpx;\r\n  box-shadow: 0 12rpx 40rpx rgba(210, 180, 140, 0.15);\r\n  position: relative;\r\n  overflow: hidden;\r\n}\r\n\r\n.amount-card::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: -50%;\r\n  right: -50rpx;\r\n  width: 400rpx;\r\n  height: 400rpx;\r\n  background: radial-gradient(circle, rgba(255, 200, 124, 0.08) 0%, transparent 70%);\r\n  border-radius: 50%;\r\n}\r\n\r\n.amount-header {\r\n  display: flex;\r\n  align-items: center;\r\n  margin-bottom: 40rpx;\r\n}\r\n\r\n.header-icon {\r\n  font-size: 48rpx;\r\n  margin-right: 16rpx;\r\n  animation: pulse 2s ease-in-out infinite;\r\n}\r\n\r\n@keyframes pulse {\r\n  0%, 100% { transform: scale(1); }\r\n  50% { transform: scale(1.1); }\r\n}\r\n\r\n.header-title {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #8b6f47;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n/* 金额输入区域 */\r\n.amount-input-wrapper {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  background: linear-gradient(135deg, #fff9f0 0%, #ffffff 100%);\r\n  border-radius: 24rpx;\r\n  padding: 40rpx 50rpx;\r\n  margin-bottom: 40rpx;\r\n  border: 3rpx solid transparent;\r\n  background-clip: padding-box;\r\n  position: relative;\r\n}\r\n\r\n.amount-input-wrapper::before {\r\n  content: '';\r\n  position: absolute;\r\n  inset: 0;\r\n  border-radius: 24rpx;\r\n  padding: 3rpx;\r\n  background: linear-gradient(135deg, #d4a574 0%, #e8c8a0 100%);\r\n  -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\r\n  -webkit-mask-composite: xor;\r\n  mask-composite: exclude;\r\n  opacity: 0.3;\r\n}\r\n\r\n.currency-symbol {\r\n  font-size: 56rpx;\r\n  font-weight: 700;\r\n  color: #c9935b;\r\n  margin-right: 20rpx;\r\n}\r\n\r\n.amount-input {\r\n  flex: 1;\r\n  font-size: 72rpx;\r\n  font-weight: 700;\r\n  color: #2c2416;\r\n  text-align: left;\r\n  height: 100rpx;\r\n  line-height: 100rpx;\r\n}\r\n\r\n.input-placeholder {\r\n  color: #d4b896;\r\n  font-weight: 400;\r\n  font-size: 48rpx;\r\n}\r\n\r\n/* 支付按钮 */\r\n.pay-button-wrapper {\r\n  position: relative;\r\n}\r\n\r\n.pay-button {\r\n  width: 100%;\r\n  height: 100rpx;\r\n  border-radius: 50rpx;\r\n  background: linear-gradient(135deg, #d4a574 0%, #c9935b 100%);\r\n  border: none;\r\n  box-shadow: 0 8rpx 24rpx rgba(201, 147, 91, 0.3);\r\n  position: relative;\r\n  overflow: hidden;\r\n  transition: all 0.3s ease;\r\n}\r\n\r\n.pay-button::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: 0;\r\n  left: -100%;\r\n  width: 100%;\r\n  height: 100%;\r\n  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);\r\n  transition: left 0.5s;\r\n}\r\n\r\n.pay-button:active {\r\n  transform: scale(0.98);\r\n  box-shadow: 0 4rpx 12rpx rgba(201, 147, 91, 0.4);\r\n}\r\n\r\n.button-content {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  height: 100%;\r\n}\r\n\r\n.button-text {\r\n  font-size: 36rpx;\r\n  font-weight: 600;\r\n  color: #ffffff;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n.button-icon {\r\n  font-size: 40rpx;\r\n  color: #ffffff;\r\n  margin-left: 12rpx;\r\n  font-weight: bold;\r\n}\r\n\r\n/* 优惠规则卡片 */\r\n.discount-card {\r\n  background: linear-gradient(135deg, #ffffff 0%, #fffbf7 100%);\r\n  border-radius: 32rpx;\r\n  padding: 40rpx;\r\n  margin-bottom: 24rpx;\r\n  box-shadow: 0 12rpx 40rpx rgba(210, 180, 140, 0.15);\r\n}\r\n\r\n.discount-header {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  margin-bottom: 32rpx;\r\n}\r\n\r\n.header-left {\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.discount-icon {\r\n  font-size: 44rpx;\r\n  margin-right: 16rpx;\r\n}\r\n\r\n.discount-title {\r\n  font-size: 32rpx;\r\n  font-weight: 600;\r\n  color: #8b6f47;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.discount-badge {\r\n  background: linear-gradient(135deg, #ff9a62 0%, #ff7f50 100%);\r\n  color: #ffffff;\r\n  font-size: 22rpx;\r\n  padding: 8rpx 20rpx;\r\n  border-radius: 20rpx;\r\n  font-weight: 500;\r\n  box-shadow: 0 4rpx 12rpx rgba(255, 127, 80, 0.3);\r\n  animation: shake 3s ease-in-out infinite;\r\n}\r\n\r\n@keyframes shake {\r\n  0%, 100% { transform: translateX(0); }\r\n  25% { transform: translateX(-3rpx); }\r\n  75% { transform: translateX(3rpx); }\r\n}\r\n\r\n/* 优惠列表 */\r\n.discount-list {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 20rpx;\r\n}\r\n\r\n.discount-item {\r\n  flex: 0 0 calc(50% - 10rpx);\r\n  background: linear-gradient(135deg, #fff9f0 0%, #ffffff 100%);\r\n  border-radius: 20rpx;\r\n  padding: 28rpx 20rpx;\r\n  position: relative;\r\n  overflow: hidden;\r\n  border: 2rpx solid #f5e6d3;\r\n  box-shadow: 0 4rpx 16rpx rgba(210, 180, 140, 0.1);\r\n}\r\n\r\n.discount-item::before {\r\n  content: '';\r\n  position: absolute;\r\n  top: -20rpx;\r\n  right: -20rpx;\r\n  width: 100rpx;\r\n  height: 100rpx;\r\n  background: radial-gradient(circle, rgba(255, 200, 124, 0.15) 0%, transparent 70%);\r\n  border-radius: 50%;\r\n}\r\n\r\n.discount-item-top {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  margin-bottom: 16rpx;\r\n}\r\n\r\n.discount-amount {\r\n  font-size: 52rpx;\r\n  font-weight: 700;\r\n  color: #d4a574;\r\n  line-height: 1.2;\r\n  letter-spacing: -1rpx;\r\n}\r\n\r\n.discount-label {\r\n  font-size: 24rpx;\r\n  color: #a88560;\r\n  font-weight: 500;\r\n  margin-top: 4rpx;\r\n}\r\n\r\n.discount-divider {\r\n  height: 2rpx;\r\n  background: linear-gradient(90deg, transparent, #e8d5c4, transparent);\r\n  margin: 16rpx 0;\r\n}\r\n\r\n.discount-item-bottom {\r\n  text-align: center;\r\n}\r\n\r\n.discount-rule {\r\n  font-size: 26rpx;\r\n  color: #8b6f47;\r\n  font-weight: 500;\r\n}\r\n\r\n/* 温馨提示卡片 */\r\n.tips-card {\r\n  background: linear-gradient(135deg, #fffbf7 0%, #fff9f0 100%);\r\n  border-radius: 24rpx;\r\n  padding: 32rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  border: 2rpx solid #f5e6d3;\r\n  box-shadow: 0 4rpx 16rpx rgba(210, 180, 140, 0.08);\r\n}\r\n\r\n.tips-icon {\r\n  font-size: 40rpx;\r\n  margin-right: 20rpx;\r\n  flex-shrink: 0;\r\n}\r\n\r\n.tips-text {\r\n  font-size: 26rpx;\r\n  color: #a88560;\r\n  line-height: 1.6;\r\n  flex: 1;\r\n}"
  },
  {
    "path": "project.config.json",
    "content": "{\n  \"description\": \"项目配置文件，详见文档：https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html\",\n  \"setting\": {\n    \"urlCheck\": false,\n    \"es6\": true,\n    \"enhance\": true,\n    \"postcss\": true,\n    \"preloadBackgroundData\": false,\n    \"minified\": true,\n    \"newFeature\": true,\n    \"coverView\": true,\n    \"nodeModules\": true,\n    \"autoAudits\": false,\n    \"showShadowRootInWxmlPanel\": true,\n    \"scopeDataCheck\": false,\n    \"uglifyFileName\": false,\n    \"checkInvalidKey\": true,\n    \"checkSiteMap\": true,\n    \"uploadWithSourceMap\": true,\n    \"compileHotReLoad\": true,\n    \"useMultiFrameRuntime\": true,\n    \"babelSetting\": {\n      \"ignore\": [],\n      \"disablePlugins\": [],\n      \"outputPath\": \"\"\n    },\n    \"enableEngineNative\": false,\n    \"useIsolateContext\": false,\n    \"userConfirmedBundleSwitch\": false,\n    \"packNpmManually\": false,\n    \"packNpmRelationList\": [],\n    \"minifyWXSS\": true,\n    \"disableUseStrict\": false,\n    \"minifyWXML\": true,\n    \"showES6CompileOption\": false,\n    \"useCompilerPlugins\": false,\n    \"lazyloadPlaceholderEnable\": false,\n    \"useStaticServer\": true,\n    \"ignoreUploadUnusedFiles\": true,\n    \"condition\": false\n  },\n  \"compileType\": \"miniprogram\",\n  \"simulatorType\": \"wechat\",\n  \"simulatorPluginLibVersion\": {},\n  \"condition\": {\n    \"search\": {\n      \"list\": []\n    },\n    \"conversation\": {\n      \"list\": []\n    },\n    \"game\": {\n      \"currentL\": -1,\n      \"list\": []\n    },\n    \"miniprogram\": {\n      \"list\": []\n    }\n  },\n  \"editorSetting\": {\n    \"tabIndent\": \"insertSpaces\",\n    \"tabSize\": 2\n  },\n  \"appid\": \"wx47586bbed56a5001\",\n  \"packOptions\": {\n    \"ignore\": [],\n    \"include\": []\n  }\n}"
  },
  {
    "path": "project.private.config.json",
    "content": "{\n  \"setting\": {\n    \"compileHotReLoad\": true,\n    \"urlCheck\": false\n  },\n  \"condition\": {\n    \"miniprogram\": {\n      \"list\": [\n        {\n          \"name\": \"pages/pay/index\",\n          \"pathName\": \"pages/pay/index\",\n          \"query\": \"\",\n          \"scene\": null,\n          \"launchMode\": \"default\"\n        }\n      ]\n    }\n  },\n  \"projectname\": \"%E5%B0%8F%E8%9C%9C%E8%9C%82%E7%82%B9%E9%A4%90\",\n  \"description\": \"项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档：https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html\",\n  \"libVersion\": \"3.7.12\"\n}"
  },
  {
    "path": "sitemap.json",
    "content": "{\n  \"desc\": \"关于本文件的更多信息，请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html\",\n  \"rules\": [{\n  \"action\": \"allow\",\n  \"page\": \"*\"\n  }]\n}"
  },
  {
    "path": "utils/auth.js",
    "content": "const WXAPI = require('apifm-wxapi')\r\nconst i18n = require(\"../i18n/index\")\r\nconst $t = i18n.$t()\r\n\r\nasync function checkSession(){\r\n  return new Promise((resolve, reject) => {\r\n    wx.checkSession({\r\n      success() {\r\n        return resolve(true)\r\n      },\r\n      fail() {\r\n        return resolve(false)\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\nasync function bindSeller() {\r\n  const token = wx.getStorageSync('token')\r\n  const referrer = wx.getStorageSync('referrer')\r\n  if (!token) {\r\n    return\r\n  }\r\n  if (!referrer) {\r\n    return\r\n  }\r\n  const res = await WXAPI.bindSeller({\r\n    token,\r\n    uid: referrer\r\n  })\r\n}\r\n\r\n// 检测登录状态，返回 true / false\r\nasync function checkHasLogined() {\r\n  const token = wx.getStorageSync('token')\r\n  if (!token) {\r\n    return false\r\n  }\r\n  const loggined = await checkSession()\r\n  if (!loggined) {\r\n    wx.removeStorageSync('token')\r\n    return false\r\n  }\r\n  const checkTokenRes = await WXAPI.checkToken(token)\r\n  if (checkTokenRes.code != 0) {\r\n    wx.removeStorageSync('token')\r\n    return false\r\n  }\r\n  return true\r\n}\r\n\r\nasync function wxaCode(){\r\n  return new Promise((resolve, reject) => {\r\n    wx.login({\r\n      success(res) {\r\n        return resolve(res.code)\r\n      },\r\n      fail() {\r\n        wx.showToast({\r\n          title: $t.common.getCodeError,\r\n          icon: 'none'\r\n        })\r\n        return resolve($t.common.getCodeError)\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\nasync function login(page){\r\n  const _this = this\r\n  wx.login({\r\n    success: function (res) {\r\n      const componentAppid = wx.getStorageSync('componentAppid')\r\n      if (componentAppid) {\r\n        WXAPI.wxappServiceLogin({\r\n          componentAppid,\r\n          appid: wx.getStorageSync('appid'),\r\n          code: res.code\r\n        }).then(function (res) {        \r\n          if (res.code == 10000) {\r\n            // 去注册\r\n            return;\r\n          }\r\n          if (res.code != 0) {\r\n            // 登录错误\r\n            wx.showModal({\r\n              confirmText: $t.common.confirm,\r\n              cancelText: $t.common.cancel,\r\n              title: $t.common.loginFail,\r\n              content: res.msg,\r\n              showCancel: false\r\n            })\r\n            return;\r\n          }\r\n          wx.setStorageSync('token', res.data.token)\r\n          wx.setStorageSync('uid', res.data.uid)\r\n          _this.bindSeller()\r\n          if ( page ) {\r\n            page.onShow()\r\n          }\r\n        })\r\n      } else {\r\n        WXAPI.login_wx(res.code).then(function (res) {        \r\n          if (res.code == 10000) {\r\n            // 去注册\r\n            return;\r\n          }\r\n          if (res.code != 0) {\r\n            // 登录错误\r\n            wx.showModal({\r\n              confirmText: $t.common.confirm,\r\n              cancelText: $t.common.cancel,\r\n              title: $t.common.loginFail,\r\n              content: res.msg,\r\n              showCancel: false\r\n            })\r\n            return;\r\n          }\r\n          wx.setStorageSync('token', res.data.token)\r\n          wx.setStorageSync('uid', res.data.uid)\r\n          _this.bindSeller()\r\n          if ( page ) {\r\n            page.onShow()\r\n          }\r\n        })\r\n      }\r\n    }\r\n  })\r\n}\r\n\r\nasync function authorize() {\r\n  return new Promise((resolve, reject) => {\r\n    wx.login({\r\n      success: function (res) {\r\n        const code = res.code\r\n        let referrer = '' // 推荐人\r\n        let referrer_storge = wx.getStorageSync('referrer');\r\n        if (referrer_storge) {\r\n          referrer = referrer_storge;\r\n        }\r\n        // 下面开始调用注册接口\r\n        const componentAppid = wx.getStorageSync('componentAppid')\r\n        if (componentAppid) {\r\n          WXAPI.wxappServiceAuthorize({\r\n            code: code,\r\n            referrer: referrer\r\n          }).then(function (res) {\r\n            if (res.code == 0) {\r\n              wx.setStorageSync('token', res.data.token)\r\n              wx.setStorageSync('uid', res.data.uid)\r\n              resolve(res)\r\n            } else {\r\n              wx.showToast({\r\n                title: res.msg,\r\n                icon: 'none'\r\n              })\r\n              reject(res.msg)\r\n            }\r\n          })\r\n        } else {\r\n          WXAPI.authorize({\r\n            code: code,\r\n            referrer: referrer\r\n          }).then(function (res) {\r\n            if (res.code == 0) {\r\n              wx.setStorageSync('token', res.data.token)\r\n              wx.setStorageSync('uid', res.data.uid)\r\n              resolve(res)\r\n            } else {\r\n              wx.showToast({\r\n                title: res.msg,\r\n                icon: 'none'\r\n              })\r\n              reject(res.msg)\r\n            }\r\n          })\r\n        }\r\n      },\r\n      fail: err => {\r\n        reject(err)\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\nfunction loginOut(){\r\n  wx.removeStorageSync('token')\r\n  wx.removeStorageSync('uid')\r\n}\r\n\r\nasync function checkAndAuthorize (scope) {\r\n  return new Promise((resolve, reject) => {\r\n    wx.getSetting({\r\n      success(res) {\r\n        if (!res.authSetting[scope]) {\r\n          wx.authorize({\r\n            scope: scope,\r\n            success() {\r\n              resolve() // 无返回参数\r\n            },\r\n            fail(e){\r\n              console.error(e)\r\n              // if (e.errMsg.indexof('auth deny') != -1) {\r\n              //   wx.showToast({\r\n              //     title: e.errMsg,\r\n              //     icon: 'none'\r\n              //   })\r\n              // }\r\n              wx.showModal({\r\n                content: $t.common.authorizeRequired,\r\n                showCancel: false,\r\n                confirmText: $t.common.authorize,\r\n                confirmColor: '#e64340',\r\n                success(res) {\r\n                  wx.openSetting();\r\n                },\r\n                fail(e){\r\n                  console.error(e)\r\n                  reject(e)\r\n                },\r\n              })\r\n            }\r\n          })\r\n        } else {\r\n          resolve() // 无返回参数\r\n        }\r\n      },\r\n      fail(e){\r\n        console.error(e)\r\n        reject(e)\r\n      }\r\n    })\r\n  })  \r\n}\r\n\r\nmodule.exports = {\r\n  checkHasLogined: checkHasLogined,\r\n  wxaCode: wxaCode,\r\n  login: login,\r\n  loginOut: loginOut,\r\n  checkAndAuthorize: checkAndAuthorize,\r\n  authorize: authorize,\r\n  bindSeller: bindSeller\r\n}\r\n"
  },
  {
    "path": "utils/image.js",
    "content": "function imageUtil (originalWidth, originalHeight) {\n  let imageSize = {}\n  wx.getSystemInfo({\n    success: function (res) {\n      const windowWidth = res.windowWidth\n      imageSize.x = 0\n      imageSize.y = 0\n      imageSize.windowWidth = windowWidth\n      imageSize.imageWidth = originalWidth\n      imageSize.imageHeight = originalHeight\n      if (originalWidth > windowWidth) {\n        imageSize.imageWidth = windowWidth\n        imageSize.imageHeight = windowWidth * originalHeight / originalWidth\n      } else {\n        imageSize.x = (windowWidth - originalWidth) / 2\n      }\n    }\n  })\n  return imageSize\n}\n\nmodule.exports = {\n  imageUtil: imageUtil\n}\n"
  },
  {
    "path": "utils/pay.js",
    "content": "const WXAPI = require('apifm-wxapi')\r\nconst i18n = require(\"../i18n/index\")\r\nconst $t = i18n.$t()\r\n\r\n/**\r\n * type: order 支付订单 recharge 充值 paybill 优惠买单\r\n * data: 扩展数据对象，用于保存参数\r\n */\r\nfunction wxpay(type, money, orderId, redirectUrl, data) {\r\n  const postData = {\r\n    token: wx.getStorageSync('token'),\r\n    money: money,\r\n    remark: \"在线充值\",\r\n  }\r\n  if (type === 'order') {\r\n    postData.remark = \"支付订单 ：\" + orderId;\r\n    postData.nextAction = {\r\n      type: 0,\r\n      id: orderId\r\n    };\r\n  }\r\n  if (type === 'paybill') {\r\n    postData.remark = $t.my.youhuimaidan + \" ：\" + data.money;\r\n    postData.nextAction = {\r\n      type: 4,\r\n      uid: wx.getStorageSync('uid'),\r\n      money: data.money\r\n    };\r\n  }\r\n  postData.payName = postData.remark;\r\n  if (postData.nextAction) {\r\n    postData.nextAction = JSON.stringify(postData.nextAction);  \r\n  }\r\n  WXAPI.wxpay(postData).then(function (res) {\r\n    if (res.code == 0) {\r\n      // 发起支付\r\n      wx.requestPayment({\r\n        timeStamp: res.data.timeStamp,\r\n        nonceStr: res.data.nonceStr,\r\n        package: res.data.package,\r\n        signType: res.data.signType,\r\n        paySign: res.data.paySign,\r\n        fail: function (aaa) {\r\n          console.error(aaa)\r\n          wx.showToast({\r\n            title: aaa\r\n          })\r\n          if (redirectUrl) {\r\n            wx.redirectTo({\r\n              url: redirectUrl,\r\n            })\r\n          }\r\n        },\r\n        success: function () {\r\n          // 提示支付成功\r\n          wx.showToast({\r\n            title: $t.asset.success\r\n          })\r\n          if (redirectUrl) {\r\n            wx.redirectTo({\r\n              url: redirectUrl,\r\n            })\r\n          }\r\n        }\r\n      })\r\n    } else {\r\n      wx.showModal({\r\n        confirmText: $t.common.confirm,\r\n        cancelText: $t.common.cancel,\r\n        content: JSON.stringify(res),\r\n        showCancel: false\r\n      })      \r\n    }\r\n  })\r\n}\r\n\r\nmodule.exports = {\r\n  wxpay: wxpay\r\n}"
  },
  {
    "path": "utils/runtime.js",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar regeneratorRuntime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n"
  },
  {
    "path": "utils/tools.js",
    "content": "const WXAPI = require('apifm-wxapi')\r\n\r\n// 显示购物车tabBar的Badge\r\nasync function showTabBarBadge(noTabBarPage){\r\n  const token = wx.getStorageSync('token')\r\n  if (!token) {\r\n    return 0\r\n  }\r\n  let number = 0\r\n  // 自营商品\r\n  let res = await WXAPI.shippingCarInfo(token)\r\n  if (res.code == 0) {\r\n    number += res.data.number\r\n  }\r\n  if (!noTabBarPage) {\r\n    if (number == 0) {\r\n      // 删除红点点\r\n      wx.removeTabBarBadge({\r\n        index: 3\r\n      })\r\n    } else {\r\n      // 显示红点点\r\n      wx.setTabBarBadge({\r\n        index: 3,\r\n        text: number + ''\r\n      })\r\n    }\r\n  }\r\n  return number\r\n}\r\n\r\nmodule.exports = {\r\n  showTabBarBadge: showTabBarBadge\r\n}"
  },
  {
    "path": "utils/util.js",
    "content": "const formatTime = date => {\n  const year = date.getFullYear()\n  const month = date.getMonth() + 1\n  const day = date.getDate()\n  const hour = date.getHours()\n  const minute = date.getMinutes()\n  const second = date.getSeconds()\n\n  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')\n}\n\nconst formatNumber = n => {\n  n = n.toString()\n  return n[1] ? n : '0' + n\n}\n\nmodule.exports = {\n  formatTime: formatTime\n}\n"
  }
]