[
  {
    "path": ".gitignore",
    "content": "# OSX\n#\n.DS_Store\nnode_modules/\n\n#Intellij idea\n.idea/\n/idea/\n.vscode/\n/unpackage/\n.hbuilderx/launch.json\n.project.config.json\n.project.private.config.json\n"
  },
  {
    "path": "App.vue",
    "content": "<script>\r\n\t/**\r\n\t * vuex管理登录状态，具体可以参考官方登录模板示例\r\n\t */\r\n\timport config from \"@/config/config\";\r\nimport {\r\n\tgetClipboardData\r\n} from \"@/js_sdk/h5-copy/h5-copy.js\";\r\nimport APPUpdate from \"@/plugins/APPUpdate\";\r\nimport storage from \"@/utils/storage\";\r\nimport {\r\n\tmapMutations\r\n} from \"vuex\";\r\n\r\n\t\r\n\t\r\n\t/**\r\n\t * 路由监听并删除路由\r\n\t * https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html\r\n\t * */\r\n\t// #ifdef MP-WEIXIN\r\n\twx.onAppRoute((res) => {\r\n\t\t\r\n\t})\r\n\t// #endif\r\n\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tconfig,\r\n\t\t\t};\r\n\t\t},\r\n\r\n\r\n\t\t/**\r\n\t\t * 监听返回\r\n\t\t */\r\n\t\tonBackPress(e) {\r\n\t\t\tconsole.log(\"onBackPress-APP\", e);\r\n\t\t\tif (e.from == \"backbutton\") {\r\n\t\t\t\tlet routes = getCurrentPages();\r\n\t\t\t\tlet curRoute = routes[routes.length - 1].options;\r\n\t\t\t\troutes.forEach((item) => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\titem.route == \"pages/tabbar/cart/cartList\" ||\r\n\t\t\t\t\t\titem.route.indexOf(\"pages/product/goods\") != -1\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tuni.redirectTo({\r\n\t\t\t\t\t\t\turl: item.route,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (curRoute.addId) {\r\n\t\t\t\t\tuni.reLaunch({\r\n\t\t\t\t\t\turl: \"/pages/tabbar/cart/cartList\",\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tuni.navigateBack();\r\n\t\t\t\t}\r\n\t\t\t\treturn true; //阻止默认返回行为\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t...mapMutations([\"login\"]),\r\n\t\t},\r\n\t\tonLaunch: function(val) {\r\n\t\t\tif(val.query.inviter){\r\n\t\t\t\tstorage.setInviter(val.query.inviter)\r\n\t\t\t}\r\n\r\n      // #ifdef APP-PLUS\r\n\t\t\t// 重点是以下： 一定要监听后台恢复 ！一定要\r\n\t\t\tplus.globalEvent.addEventListener(\"newintent\", (e) => {\r\n\t\t\t\tthis.checkArguments(); // 检测启动参数\r\n\t\t\t});\r\n\t\t\t// #endif\r\n\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.applyUpdateWeChat();\r\n\t\t\t// #endif\r\n\t\t},\r\n\r\n\t\tonShow() {\r\n\t\t\t// #ifndef H5\r\n\t\t\tif(this.config.enableGetClipboard){\r\n\t\t\t\tthis.getClipboard();\r\n\t\t\t}\r\n\t\t\t// #endif\r\n\t\t\t// #ifdef APP-PLUS\r\n\r\n\t\t\tif (storage.getShow()) {\r\n\t\t\t\tif (uni.getSystemInfoSync().platform == 'ios') {\r\n\t\t\t\t\tthis.$u.route(\"/pages/tabbar/screen/fullScreen\");\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t/**\r\n\t\t\t * 微信小程序版本提交更新版本 解决缓存问题\r\n\t\t\t */\r\n\t\t\tapplyUpdateWeChat() {\r\n\t\t\t\tconst updateManager = uni.getUpdateManager();\r\n\r\n\t\t\t\tupdateManager.onCheckForUpdate(function(res) {\r\n\t\t\t\t\t// 请求完新版本信息的回调\r\n\t\t\t\t});\r\n\r\n\t\t\t\tupdateManager.onUpdateReady(function(res) {\r\n\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\ttitle: \"更新提示\",\r\n\t\t\t\t\t\tcontent: \"发现新版本，是否重启应用？\",\r\n\t\t\t\t\t\tsuccess(res) {\r\n\t\t\t\t\t\t\tif (res.confirm) {\r\n\t\t\t\t\t\t\t\t// 新的版本已经下载好，调用 applyUpdate 应用新版本并重启\r\n\t\t\t\t\t\t\t\tupdateManager.applyUpdate();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t\tupdateManager.onUpdateFailed(function(res) {\r\n\t\t\t\t\t// 新的版本下载失败\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t//  TODO 开屏广告 后续优化添加\r\n\t\t\tlaunch() {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// 获取本地存储中launchFlag标识 开屏广告\r\n\t\t\t\t\tconst value = uni.getStorageSync(\"launchFlag\");\r\n\t\t\t\t\tif (!value) {\r\n\t\t\t\t\t\t// this.$u.route(\"/pages/index/agreement\");\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t//app启动时打开启动广告页\r\n\t\t\t\t\t\tvar w = plus.webview.open(\r\n\t\t\t\t\t\t\t\"/hybrid/html/advertise/advertise.html\",\r\n\t\t\t\t\t\t\t\"本地地址\", {\r\n\t\t\t\t\t\t\t\ttop: 0,\r\n\t\t\t\t\t\t\t\tbottom: 0,\r\n\t\t\t\t\t\t\t\tzindex: 999,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fade-in\",\r\n\t\t\t\t\t\t\t500\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\t//设置定时器，4s后关闭启动广告页\r\n\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\tplus.webview.close(w);\r\n\t\t\t\t\t\t\tAPPUpdate();\r\n\t\t\t\t\t\t}, 3000);\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t// error\r\n\t\t\t\t\tuni.setStorage({\r\n\t\t\t\t\t\tkey: \"launchFlag\",\r\n\t\t\t\t\t\tdata: true,\r\n\t\t\t\t\t\tsuccess: function() {\r\n\t\t\t\t\t\t\tconsole.log(\"error时存储launchFlag\");\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 获取粘贴板数据\r\n\t\t\t */\r\n\t\t\tasync getClipboard() {\r\n\t\t\t\tlet res = await getClipboardData();\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * 解析粘贴板数据\r\n\t\t\t\t */\r\n\r\n\t\t\t\tif (res.indexOf(config.shareLink) != -1 && (res != this.$store.state.shareLink)) {\r\n\t\t\t\t\tthis.$store.state.shareLink = res\r\n\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\ttitle: \"提示\",\r\n\t\t\t\t\t\tcontent: \"检测到一个分享链接是否跳转？\",\r\n\t\t\t\t\t\tconfirmText: \"跳转\",\r\n\t\t\t\t\t\tsuccess: function(callback) {\r\n\t\t\t\t\t\t\tif (callback.confirm) {\r\n\t\t\t\t\t\t\t\tconst path = res.split(config.shareLink)[1];\r\n\t\t\t\t\t\t\t\tif (path.indexOf(\"tabbar\") != -1) {\r\n\t\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\t\turl: path,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\t\t\turl: path,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * h5中打开app获取跳转app的链接并跳转\r\n\t\t\t */\r\n\t\t\tcheckArguments() {\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tconst args = plus.runtime.arguments;\r\n\t\t\t\t\tif (args) {\r\n\t\t\t\t\t\tconst argsStr = decodeURIComponent(args);\r\n\t\t\t\t\t\tconst path = argsStr.split(\"//\")[1];\r\n\t\t\t\t\t\tif (path.indexOf(\"tabbar\") != -1) {\r\n\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\turl: `/${path}`,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\turl: `/${path}`,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\t@import \"uview-ui/index.scss\";\r\n\r\n\t// -------适配底部安全区  苹果x系列刘海屏\r\n\r\n\t// #ifdef MP-WEIXIN\r\n\t.mp-iphonex-bottom {\r\n\t\tpadding-bottom: constant(safe-area-inset-bottom);\r\n\t\tpadding-bottom: env(safe-area-inset-bottom);\r\n\t\tbox-sizing: content-box;\r\n\t\theight: auto !important;\r\n\t\tpadding-top: 10rpx;\r\n\t}\r\n\r\n\t// #endif\r\n\r\n\tbody {\r\n\t\tbackground-color: $bg-color;\r\n\t}\r\n\r\n\t/************************ */\r\n\t.w200 {\r\n\t\twidth: 200rpx !important;\r\n\t}\r\n\r\n\t.flex1 {\r\n\t\tflex: 1; //必须父级设置flex\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "CustomStoryboard/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"ipad12_9\" orientation=\"portrait\" layout=\"fullscreen\" appearance=\"light\"/>\n    <dependencies>\n        <deployment version=\"4096\" identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" tag=\"1\" contentMode=\"scaleAspectFit\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1024\" height=\"1366\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"LILI商城  享你所购\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"9\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aap-f2-ctd\">\n                                <rect key=\"frame\" x=\"417.5\" y=\"1291\" width=\"189\" height=\"65\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" relation=\"greaterThanOrEqual\" constant=\"189\" id=\"IEH-DH-MSh\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"65\" id=\"Owl-Zu-11N\"/>\n                                    <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"65\" id=\"pa9-7L-Yn2\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"189\" id=\"xdI-XG-GYE\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"23\"/>\n                                <color key=\"textColor\" white=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                                <color key=\"highlightedColor\" systemColor=\"secondarySystemGroupedBackgroundColor\"/>\n                            </label>\n                            <imageView clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"1.png\" highlightedImage=\"1.png\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tDb-oz-ZqQ\" userLabel=\"logo.png\">\n                                <rect key=\"frame\" x=\"437\" y=\"1126\" width=\"150\" height=\"150\"/>\n                                <color key=\"tintColor\" systemColor=\"systemGray6Color\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"150\" id=\"2Pc-RJ-7fL\"/>\n                                    <constraint firstAttribute=\"width\" secondItem=\"tDb-oz-ZqQ\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"K9U-1h-yR6\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"150\" id=\"Ocb-HD-CX3\"/>\n                                </constraints>\n                            </imageView>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"IW3-oA-Ytg\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <color key=\"tintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <constraints>\n                            <constraint firstItem=\"IW3-oA-Ytg\" firstAttribute=\"bottom\" secondItem=\"aap-f2-ctd\" secondAttribute=\"bottom\" constant=\"10\" id=\"AaD-Ch-YkJ\"/>\n                            <constraint firstItem=\"aap-f2-ctd\" firstAttribute=\"top\" secondItem=\"tDb-oz-ZqQ\" secondAttribute=\"bottom\" constant=\"15\" id=\"TSj-WP-wlO\"/>\n                            <constraint firstItem=\"tDb-oz-ZqQ\" firstAttribute=\"centerX\" secondItem=\"IW3-oA-Ytg\" secondAttribute=\"centerX\" id=\"XFM-cQ-LjU\"/>\n                            <constraint firstItem=\"tDb-oz-ZqQ\" firstAttribute=\"centerX\" secondItem=\"aap-f2-ctd\" secondAttribute=\"centerX\" id=\"gTF-LF-cb1\"/>\n                        </constraints>\n                        <variation key=\"heightClass=regular-widthClass=compact\">\n                            <color key=\"tintColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        </variation>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"50.390625\" y=\"373.35285505124449\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"1.png\" width=\"86\" height=\"57\"/>\n        <systemColor name=\"secondarySystemGroupedBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <systemColor name=\"systemGray6Color\">\n            <color red=\"0.94901960784313721\" green=\"0.94901960784313721\" blue=\"0.96862745098039216\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\r\n                       Version 3, 19 November 2007\r\n\r\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n                            Preamble\r\n\r\n  The GNU Affero General Public License is a free, copyleft license for\r\nsoftware and other kinds of works, specifically designed to ensure\r\ncooperation with the community in the case of network server software.\r\n\r\n  The licenses for most software and other practical works are designed\r\nto take away your freedom to share and change the works.  By contrast,\r\nour General Public Licenses are intended to guarantee your freedom to\r\nshare and change all versions of a program--to make sure it remains free\r\nsoftware for all its users.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthem if you wish), that you receive source code or can get it if you\r\nwant it, that you can change the software or use pieces of it in new\r\nfree programs, and that you know you can do these things.\r\n\r\n  Developers that use our General Public Licenses protect your rights\r\nwith two steps: (1) assert copyright on the software, and (2) offer\r\nyou this License which gives you legal permission to copy, distribute\r\nand/or modify the software.\r\n\r\n  A secondary benefit of defending all users' freedom is that\r\nimprovements made in alternate versions of the program, if they\r\nreceive widespread use, become available for other developers to\r\nincorporate.  Many developers of free software are heartened and\r\nencouraged by the resulting cooperation.  However, in the case of\r\nsoftware used on network servers, this result may fail to come about.\r\nThe GNU General Public License permits making a modified version and\r\nletting the public access it on a server without ever releasing its\r\nsource code to the public.\r\n\r\n  The GNU Affero General Public License is designed specifically to\r\nensure that, in such cases, the modified source code becomes available\r\nto the community.  It requires the operator of a network server to\r\nprovide the source code of the modified version running there to the\r\nusers of that server.  Therefore, public use of a modified version, on\r\na publicly accessible server, gives the public access to the source\r\ncode of the modified version.\r\n\r\n  An older license, called the Affero General Public License and\r\npublished by Affero, was designed to accomplish similar goals.  This is\r\na different license, not a version of the Affero GPL, but Affero has\r\nreleased a new version of the Affero GPL which permits relicensing under\r\nthis license.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\n                       TERMS AND CONDITIONS\r\n\r\n  0. Definitions.\r\n\r\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\r\n\r\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\r\nworks, such as semiconductor masks.\r\n\r\n  \"The Program\" refers to any copyrightable work licensed under this\r\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\r\n\"recipients\" may be individuals or organizations.\r\n\r\n  To \"modify\" a work means to copy from or adapt all or part of the work\r\nin a fashion requiring copyright permission, other than the making of an\r\nexact copy.  The resulting work is called a \"modified version\" of the\r\nearlier work or a work \"based on\" the earlier work.\r\n\r\n  A \"covered work\" means either the unmodified Program or a work based\r\non the Program.\r\n\r\n  To \"propagate\" a work means to do anything with it that, without\r\npermission, would make you directly or secondarily liable for\r\ninfringement under applicable copyright law, except executing it on a\r\ncomputer or modifying a private copy.  Propagation includes copying,\r\ndistribution (with or without modification), making available to the\r\npublic, and in some countries other activities as well.\r\n\r\n  To \"convey\" a work means any kind of propagation that enables other\r\nparties to make or receive copies.  Mere interaction with a user through\r\na computer network, with no transfer of a copy, is not conveying.\r\n\r\n  An interactive user interface displays \"Appropriate Legal Notices\"\r\nto the extent that it includes a convenient and prominently visible\r\nfeature that (1) displays an appropriate copyright notice, and (2)\r\ntells the user that there is no warranty for the work (except to the\r\nextent that warranties are provided), that licensees may convey the\r\nwork under this License, and how to view a copy of this License.  If\r\nthe interface presents a list of user commands or options, such as a\r\nmenu, a prominent item in the list meets this criterion.\r\n\r\n  1. Source Code.\r\n\r\n  The \"source code\" for a work means the preferred form of the work\r\nfor making modifications to it.  \"Object code\" means any non-source\r\nform of a work.\r\n\r\n  A \"Standard Interface\" means an interface that either is an official\r\nstandard defined by a recognized standards body, or, in the case of\r\ninterfaces specified for a particular programming language, one that\r\nis widely used among developers working in that language.\r\n\r\n  The \"System Libraries\" of an executable work include anything, other\r\nthan the work as a whole, that (a) is included in the normal form of\r\npackaging a Major Component, but which is not part of that Major\r\nComponent, and (b) serves only to enable use of the work with that\r\nMajor Component, or to implement a Standard Interface for which an\r\nimplementation is available to the public in source code form.  A\r\n\"Major Component\", in this context, means a major essential component\r\n(kernel, window system, and so on) of the specific operating system\r\n(if any) on which the executable work runs, or a compiler used to\r\nproduce the work, or an object code interpreter used to run it.\r\n\r\n  The \"Corresponding Source\" for a work in object code form means all\r\nthe source code needed to generate, install, and (for an executable\r\nwork) run the object code and to modify the work, including scripts to\r\ncontrol those activities.  However, it does not include the work's\r\nSystem Libraries, or general-purpose tools or generally available free\r\nprograms which are used unmodified in performing those activities but\r\nwhich are not part of the work.  For example, Corresponding Source\r\nincludes interface definition files associated with source files for\r\nthe work, and the source code for shared libraries and dynamically\r\nlinked subprograms that the work is specifically designed to require,\r\nsuch as by intimate data communication or control flow between those\r\nsubprograms and other parts of the work.\r\n\r\n  The Corresponding Source need not include anything that users\r\ncan regenerate automatically from other parts of the Corresponding\r\nSource.\r\n\r\n  The Corresponding Source for a work in source code form is that\r\nsame work.\r\n\r\n  2. Basic Permissions.\r\n\r\n  All rights granted under this License are granted for the term of\r\ncopyright on the Program, and are irrevocable provided the stated\r\nconditions are met.  This License explicitly affirms your unlimited\r\npermission to run the unmodified Program.  The output from running a\r\ncovered work is covered by this License only if the output, given its\r\ncontent, constitutes a covered work.  This License acknowledges your\r\nrights of fair use or other equivalent, as provided by copyright law.\r\n\r\n  You may make, run and propagate covered works that you do not\r\nconvey, without conditions so long as your license otherwise remains\r\nin force.  You may convey covered works to others for the sole purpose\r\nof having them make modifications exclusively for you, or provide you\r\nwith facilities for running those works, provided that you comply with\r\nthe terms of this License in conveying all material for which you do\r\nnot control copyright.  Those thus making or running the covered works\r\nfor you must do so exclusively on your behalf, under your direction\r\nand control, on terms that prohibit them from making any copies of\r\nyour copyrighted material outside their relationship with you.\r\n\r\n  Conveying under any other circumstances is permitted solely under\r\nthe conditions stated below.  Sublicensing is not allowed; section 10\r\nmakes it unnecessary.\r\n\r\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\r\n\r\n  No covered work shall be deemed part of an effective technological\r\nmeasure under any applicable law fulfilling obligations under article\r\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\r\nsimilar laws prohibiting or restricting circumvention of such\r\nmeasures.\r\n\r\n  When you convey a covered work, you waive any legal power to forbid\r\ncircumvention of technological measures to the extent such circumvention\r\nis effected by exercising rights under this License with respect to\r\nthe covered work, and you disclaim any intention to limit operation or\r\nmodification of the work as a means of enforcing, against the work's\r\nusers, your or third parties' legal rights to forbid circumvention of\r\ntechnological measures.\r\n\r\n  4. Conveying Verbatim Copies.\r\n\r\n  You may convey verbatim copies of the Program's source code as you\r\nreceive it, in any medium, provided that you conspicuously and\r\nappropriately publish on each copy an appropriate copyright notice;\r\nkeep intact all notices stating that this License and any\r\nnon-permissive terms added in accord with section 7 apply to the code;\r\nkeep intact all notices of the absence of any warranty; and give all\r\nrecipients a copy of this License along with the Program.\r\n\r\n  You may charge any price or no price for each copy that you convey,\r\nand you may offer support or warranty protection for a fee.\r\n\r\n  5. Conveying Modified Source Versions.\r\n\r\n  You may convey a work based on the Program, or the modifications to\r\nproduce it from the Program, in the form of source code under the\r\nterms of section 4, provided that you also meet all of these conditions:\r\n\r\n    a) The work must carry prominent notices stating that you modified\r\n    it, and giving a relevant date.\r\n\r\n    b) The work must carry prominent notices stating that it is\r\n    released under this License and any conditions added under section\r\n    7.  This requirement modifies the requirement in section 4 to\r\n    \"keep intact all notices\".\r\n\r\n    c) You must license the entire work, as a whole, under this\r\n    License to anyone who comes into possession of a copy.  This\r\n    License will therefore apply, along with any applicable section 7\r\n    additional terms, to the whole of the work, and all its parts,\r\n    regardless of how they are packaged.  This License gives no\r\n    permission to license the work in any other way, but it does not\r\n    invalidate such permission if you have separately received it.\r\n\r\n    d) If the work has interactive user interfaces, each must display\r\n    Appropriate Legal Notices; however, if the Program has interactive\r\n    interfaces that do not display Appropriate Legal Notices, your\r\n    work need not make them do so.\r\n\r\n  A compilation of a covered work with other separate and independent\r\nworks, which are not by their nature extensions of the covered work,\r\nand which are not combined with it such as to form a larger program,\r\nin or on a volume of a storage or distribution medium, is called an\r\n\"aggregate\" if the compilation and its resulting copyright are not\r\nused to limit the access or legal rights of the compilation's users\r\nbeyond what the individual works permit.  Inclusion of a covered work\r\nin an aggregate does not cause this License to apply to the other\r\nparts of the aggregate.\r\n\r\n  6. Conveying Non-Source Forms.\r\n\r\n  You may convey a covered work in object code form under the terms\r\nof sections 4 and 5, provided that you also convey the\r\nmachine-readable Corresponding Source under the terms of this License,\r\nin one of these ways:\r\n\r\n    a) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by the\r\n    Corresponding Source fixed on a durable physical medium\r\n    customarily used for software interchange.\r\n\r\n    b) Convey the object code in, or embodied in, a physical product\r\n    (including a physical distribution medium), accompanied by a\r\n    written offer, valid for at least three years and valid for as\r\n    long as you offer spare parts or customer support for that product\r\n    model, to give anyone who possesses the object code either (1) a\r\n    copy of the Corresponding Source for all the software in the\r\n    product that is covered by this License, on a durable physical\r\n    medium customarily used for software interchange, for a price no\r\n    more than your reasonable cost of physically performing this\r\n    conveying of source, or (2) access to copy the\r\n    Corresponding Source from a network server at no charge.\r\n\r\n    c) Convey individual copies of the object code with a copy of the\r\n    written offer to provide the Corresponding Source.  This\r\n    alternative is allowed only occasionally and noncommercially, and\r\n    only if you received the object code with such an offer, in accord\r\n    with subsection 6b.\r\n\r\n    d) Convey the object code by offering access from a designated\r\n    place (gratis or for a charge), and offer equivalent access to the\r\n    Corresponding Source in the same way through the same place at no\r\n    further charge.  You need not require recipients to copy the\r\n    Corresponding Source along with the object code.  If the place to\r\n    copy the object code is a network server, the Corresponding Source\r\n    may be on a different server (operated by you or a third party)\r\n    that supports equivalent copying facilities, provided you maintain\r\n    clear directions next to the object code saying where to find the\r\n    Corresponding Source.  Regardless of what server hosts the\r\n    Corresponding Source, you remain obligated to ensure that it is\r\n    available for as long as needed to satisfy these requirements.\r\n\r\n    e) Convey the object code using peer-to-peer transmission, provided\r\n    you inform other peers where the object code and Corresponding\r\n    Source of the work are being offered to the general public at no\r\n    charge under subsection 6d.\r\n\r\n  A separable portion of the object code, whose source code is excluded\r\nfrom the Corresponding Source as a System Library, need not be\r\nincluded in conveying the object code work.\r\n\r\n  A \"User Product\" is either (1) a \"consumer product\", which means any\r\ntangible personal property which is normally used for personal, family,\r\nor household purposes, or (2) anything designed or sold for incorporation\r\ninto a dwelling.  In determining whether a product is a consumer product,\r\ndoubtful cases shall be resolved in favor of coverage.  For a particular\r\nproduct received by a particular user, \"normally used\" refers to a\r\ntypical or common use of that class of product, regardless of the status\r\nof the particular user or of the way in which the particular user\r\nactually uses, or expects or is expected to use, the product.  A product\r\nis a consumer product regardless of whether the product has substantial\r\ncommercial, industrial or non-consumer uses, unless such uses represent\r\nthe only significant mode of use of the product.\r\n\r\n  \"Installation Information\" for a User Product means any methods,\r\nprocedures, authorization keys, or other information required to install\r\nand execute modified versions of a covered work in that User Product from\r\na modified version of its Corresponding Source.  The information must\r\nsuffice to ensure that the continued functioning of the modified object\r\ncode is in no case prevented or interfered with solely because\r\nmodification has been made.\r\n\r\n  If you convey an object code work under this section in, or with, or\r\nspecifically for use in, a User Product, and the conveying occurs as\r\npart of a transaction in which the right of possession and use of the\r\nUser Product is transferred to the recipient in perpetuity or for a\r\nfixed term (regardless of how the transaction is characterized), the\r\nCorresponding Source conveyed under this section must be accompanied\r\nby the Installation Information.  But this requirement does not apply\r\nif neither you nor any third party retains the ability to install\r\nmodified object code on the User Product (for example, the work has\r\nbeen installed in ROM).\r\n\r\n  The requirement to provide Installation Information does not include a\r\nrequirement to continue to provide support service, warranty, or updates\r\nfor a work that has been modified or installed by the recipient, or for\r\nthe User Product in which it has been modified or installed.  Access to a\r\nnetwork may be denied when the modification itself materially and\r\nadversely affects the operation of the network or violates the rules and\r\nprotocols for communication across the network.\r\n\r\n  Corresponding Source conveyed, and Installation Information provided,\r\nin accord with this section must be in a format that is publicly\r\ndocumented (and with an implementation available to the public in\r\nsource code form), and must require no special password or key for\r\nunpacking, reading or copying.\r\n\r\n  7. Additional Terms.\r\n\r\n  \"Additional permissions\" are terms that supplement the terms of this\r\nLicense by making exceptions from one or more of its conditions.\r\nAdditional permissions that are applicable to the entire Program shall\r\nbe treated as though they were included in this License, to the extent\r\nthat they are valid under applicable law.  If additional permissions\r\napply only to part of the Program, that part may be used separately\r\nunder those permissions, but the entire Program remains governed by\r\nthis License without regard to the additional permissions.\r\n\r\n  When you convey a copy of a covered work, you may at your option\r\nremove any additional permissions from that copy, or from any part of\r\nit.  (Additional permissions may be written to require their own\r\nremoval in certain cases when you modify the work.)  You may place\r\nadditional permissions on material, added by you to a covered work,\r\nfor which you have or can give appropriate copyright permission.\r\n\r\n  Notwithstanding any other provision of this License, for material you\r\nadd to a covered work, you may (if authorized by the copyright holders of\r\nthat material) supplement the terms of this License with terms:\r\n\r\n    a) Disclaiming warranty or limiting liability differently from the\r\n    terms of sections 15 and 16 of this License; or\r\n\r\n    b) Requiring preservation of specified reasonable legal notices or\r\n    author attributions in that material or in the Appropriate Legal\r\n    Notices displayed by works containing it; or\r\n\r\n    c) Prohibiting misrepresentation of the origin of that material, or\r\n    requiring that modified versions of such material be marked in\r\n    reasonable ways as different from the original version; or\r\n\r\n    d) Limiting the use for publicity purposes of names of licensors or\r\n    authors of the material; or\r\n\r\n    e) Declining to grant rights under trademark law for use of some\r\n    trade names, trademarks, or service marks; or\r\n\r\n    f) Requiring indemnification of licensors and authors of that\r\n    material by anyone who conveys the material (or modified versions of\r\n    it) with contractual assumptions of liability to the recipient, for\r\n    any liability that these contractual assumptions directly impose on\r\n    those licensors and authors.\r\n\r\n  All other non-permissive additional terms are considered \"further\r\nrestrictions\" within the meaning of section 10.  If the Program as you\r\nreceived it, or any part of it, contains a notice stating that it is\r\ngoverned by this License along with a term that is a further\r\nrestriction, you may remove that term.  If a license document contains\r\na further restriction but permits relicensing or conveying under this\r\nLicense, you may add to a covered work material governed by the terms\r\nof that license document, provided that the further restriction does\r\nnot survive such relicensing or conveying.\r\n\r\n  If you add terms to a covered work in accord with this section, you\r\nmust place, in the relevant source files, a statement of the\r\nadditional terms that apply to those files, or a notice indicating\r\nwhere to find the applicable terms.\r\n\r\n  Additional terms, permissive or non-permissive, may be stated in the\r\nform of a separately written license, or stated as exceptions;\r\nthe above requirements apply either way.\r\n\r\n  8. Termination.\r\n\r\n  You may not propagate or modify a covered work except as expressly\r\nprovided under this License.  Any attempt otherwise to propagate or\r\nmodify it is void, and will automatically terminate your rights under\r\nthis License (including any patent licenses granted under the third\r\nparagraph of section 11).\r\n\r\n  However, if you cease all violation of this License, then your\r\nlicense from a particular copyright holder is reinstated (a)\r\nprovisionally, unless and until the copyright holder explicitly and\r\nfinally terminates your license, and (b) permanently, if the copyright\r\nholder fails to notify you of the violation by some reasonable means\r\nprior to 60 days after the cessation.\r\n\r\n  Moreover, your license from a particular copyright holder is\r\nreinstated permanently if the copyright holder notifies you of the\r\nviolation by some reasonable means, this is the first time you have\r\nreceived notice of violation of this License (for any work) from that\r\ncopyright holder, and you cure the violation prior to 30 days after\r\nyour receipt of the notice.\r\n\r\n  Termination of your rights under this section does not terminate the\r\nlicenses of parties who have received copies or rights from you under\r\nthis License.  If your rights have been terminated and not permanently\r\nreinstated, you do not qualify to receive new licenses for the same\r\nmaterial under section 10.\r\n\r\n  9. Acceptance Not Required for Having Copies.\r\n\r\n  You are not required to accept this License in order to receive or\r\nrun a copy of the Program.  Ancillary propagation of a covered work\r\noccurring solely as a consequence of using peer-to-peer transmission\r\nto receive a copy likewise does not require acceptance.  However,\r\nnothing other than this License grants you permission to propagate or\r\nmodify any covered work.  These actions infringe copyright if you do\r\nnot accept this License.  Therefore, by modifying or propagating a\r\ncovered work, you indicate your acceptance of this License to do so.\r\n\r\n  10. Automatic Licensing of Downstream Recipients.\r\n\r\n  Each time you convey a covered work, the recipient automatically\r\nreceives a license from the original licensors, to run, modify and\r\npropagate that work, subject to this License.  You are not responsible\r\nfor enforcing compliance by third parties with this License.\r\n\r\n  An \"entity transaction\" is a transaction transferring control of an\r\norganization, or substantially all assets of one, or subdividing an\r\norganization, or merging organizations.  If propagation of a covered\r\nwork results from an entity transaction, each party to that\r\ntransaction who receives a copy of the work also receives whatever\r\nlicenses to the work the party's predecessor in interest had or could\r\ngive under the previous paragraph, plus a right to possession of the\r\nCorresponding Source of the work from the predecessor in interest, if\r\nthe predecessor has it or can get it with reasonable efforts.\r\n\r\n  You may not impose any further restrictions on the exercise of the\r\nrights granted or affirmed under this License.  For example, you may\r\nnot impose a license fee, royalty, or other charge for exercise of\r\nrights granted under this License, and you may not initiate litigation\r\n(including a cross-claim or counterclaim in a lawsuit) alleging that\r\nany patent claim is infringed by making, using, selling, offering for\r\nsale, or importing the Program or any portion of it.\r\n\r\n  11. Patents.\r\n\r\n  A \"contributor\" is a copyright holder who authorizes use under this\r\nLicense of the Program or a work on which the Program is based.  The\r\nwork thus licensed is called the contributor's \"contributor version\".\r\n\r\n  A contributor's \"essential patent claims\" are all patent claims\r\nowned or controlled by the contributor, whether already acquired or\r\nhereafter acquired, that would be infringed by some manner, permitted\r\nby this License, of making, using, or selling its contributor version,\r\nbut do not include claims that would be infringed only as a\r\nconsequence of further modification of the contributor version.  For\r\npurposes of this definition, \"control\" includes the right to grant\r\npatent sublicenses in a manner consistent with the requirements of\r\nthis License.\r\n\r\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\r\npatent license under the contributor's essential patent claims, to\r\nmake, use, sell, offer for sale, import and otherwise run, modify and\r\npropagate the contents of its contributor version.\r\n\r\n  In the following three paragraphs, a \"patent license\" is any express\r\nagreement or commitment, however denominated, not to enforce a patent\r\n(such as an express permission to practice a patent or covenant not to\r\nsue for patent infringement).  To \"grant\" such a patent license to a\r\nparty means to make such an agreement or commitment not to enforce a\r\npatent against the party.\r\n\r\n  If you convey a covered work, knowingly relying on a patent license,\r\nand the Corresponding Source of the work is not available for anyone\r\nto copy, free of charge and under the terms of this License, through a\r\npublicly available network server or other readily accessible means,\r\nthen you must either (1) cause the Corresponding Source to be so\r\navailable, or (2) arrange to deprive yourself of the benefit of the\r\npatent license for this particular work, or (3) arrange, in a manner\r\nconsistent with the requirements of this License, to extend the patent\r\nlicense to downstream recipients.  \"Knowingly relying\" means you have\r\nactual knowledge that, but for the patent license, your conveying the\r\ncovered work in a country, or your recipient's use of the covered work\r\nin a country, would infringe one or more identifiable patents in that\r\ncountry that you have reason to believe are valid.\r\n\r\n  If, pursuant to or in connection with a single transaction or\r\narrangement, you convey, or propagate by procuring conveyance of, a\r\ncovered work, and grant a patent license to some of the parties\r\nreceiving the covered work authorizing them to use, propagate, modify\r\nor convey a specific copy of the covered work, then the patent license\r\nyou grant is automatically extended to all recipients of the covered\r\nwork and works based on it.\r\n\r\n  A patent license is \"discriminatory\" if it does not include within\r\nthe scope of its coverage, prohibits the exercise of, or is\r\nconditioned on the non-exercise of one or more of the rights that are\r\nspecifically granted under this License.  You may not convey a covered\r\nwork if you are a party to an arrangement with a third party that is\r\nin the business of distributing software, under which you make payment\r\nto the third party based on the extent of your activity of conveying\r\nthe work, and under which the third party grants, to any of the\r\nparties who would receive the covered work from you, a discriminatory\r\npatent license (a) in connection with copies of the covered work\r\nconveyed by you (or copies made from those copies), or (b) primarily\r\nfor and in connection with specific products or compilations that\r\ncontain the covered work, unless you entered into that arrangement,\r\nor that patent license was granted, prior to 28 March 2007.\r\n\r\n  Nothing in this License shall be construed as excluding or limiting\r\nany implied license or other defenses to infringement that may\r\notherwise be available to you under applicable patent law.\r\n\r\n  12. No Surrender of Others' Freedom.\r\n\r\n  If conditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot convey a\r\ncovered work so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you may\r\nnot convey it at all.  For example, if you agree to terms that obligate you\r\nto collect a royalty for further conveying from those to whom you convey\r\nthe Program, the only way you could satisfy both those terms and this\r\nLicense would be to refrain entirely from conveying the Program.\r\n\r\n  13. Remote Network Interaction; Use with the GNU General Public License.\r\n\r\n  Notwithstanding any other provision of this License, if you modify the\r\nProgram, your modified version must prominently offer all users\r\ninteracting with it remotely through a computer network (if your version\r\nsupports such interaction) an opportunity to receive the Corresponding\r\nSource of your version by providing access to the Corresponding Source\r\nfrom a network server at no charge, through some standard or customary\r\nmeans of facilitating copying of software.  This Corresponding Source\r\nshall include the Corresponding Source for any work covered by version 3\r\nof the GNU General Public License that is incorporated pursuant to the\r\nfollowing paragraph.\r\n\r\n  Notwithstanding any other provision of this License, you have\r\npermission to link or combine any covered work with a work licensed\r\nunder version 3 of the GNU General Public License into a single\r\ncombined work, and to convey the resulting work.  The terms of this\r\nLicense will continue to apply to the part which is the covered work,\r\nbut the work with which it is combined will remain governed by version\r\n3 of the GNU General Public License.\r\n\r\n  14. Revised Versions of this License.\r\n\r\n  The Free Software Foundation may publish revised and/or new versions of\r\nthe GNU Affero General Public License from time to time.  Such new versions\r\nwill be similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\n  Each version is given a distinguishing version number.  If the\r\nProgram specifies that a certain numbered version of the GNU Affero General\r\nPublic License \"or any later version\" applies to it, you have the\r\noption of following the terms and conditions either of that numbered\r\nversion or of any later version published by the Free Software\r\nFoundation.  If the Program does not specify a version number of the\r\nGNU Affero General Public License, you may choose any version ever published\r\nby the Free Software Foundation.\r\n\r\n  If the Program specifies that a proxy can decide which future\r\nversions of the GNU Affero General Public License can be used, that proxy's\r\npublic statement of acceptance of a version permanently authorizes you\r\nto choose that version for the Program.\r\n\r\n  Later license versions may give you additional or different\r\npermissions.  However, no additional obligations are imposed on any\r\nauthor or copyright holder as a result of your choosing to follow a\r\nlater version.\r\n\r\n  15. Disclaimer of Warranty.\r\n\r\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\r\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\r\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\r\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\r\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\r\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. Limitation of Liability.\r\n\r\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\r\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\r\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\r\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\r\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\r\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\r\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\r\nSUCH DAMAGES.\r\n\r\n  17. Interpretation of Sections 15 and 16.\r\n\r\n  If the disclaimer of warranty and limitation of liability provided\r\nabove cannot be given local legal effect according to their terms,\r\nreviewing courts shall apply local law that most closely approximates\r\nan absolute waiver of all civil liability in connection with the\r\nProgram, unless a warranty or assumption of liability accompanies a\r\ncopy of the Program in return for a fee.\r\n\r\n                     END OF TERMS AND CONDITIONS\r\n\r\n            How to Apply These Terms to Your New Programs\r\n\r\n  If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.\r\n\r\n  To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nstate the exclusion of warranty; and each file should have at least\r\nthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the program's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This program is free software: you can redistribute it and/or modify\r\n    it under the terms of the GNU Affero General Public License as published\r\n    by the Free Software Foundation, either version 3 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU Affero General Public License for more details.\r\n\r\n    You should have received a copy of the GNU Affero General Public License\r\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\n  If your software can interact with users remotely through a computer\r\nnetwork, you should also make sure that it provides a way for users to\r\nget its source.  For example, if your program is a web application, its\r\ninterface could display a \"Source\" link that leads users to an archive\r\nof the code.  There are many ways you could offer source, and different\r\nsolutions will be better for different programs; see section 13 for the\r\nspecific requirements.\r\n\r\n  You should also get your employer (if you work as a programmer) or school,\r\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\r\nFor more information on this, and how to apply and follow the GNU AGPL, see\r\n<http://www.gnu.org/licenses/>.\r\n"
  },
  {
    "path": "README.md",
    "content": "## Lilishop B2B2C 商城系统\n\n### 商城介绍\n\n**官网**：https://pickmall.cn\n\n**更多 README**：https://gitee.com/beijing_hongye_huicheng/lilishop/blob/master/README.md\n\n**演示站点**：https://m-b2b2c.pickmall.cn/ 账号：13011111111 验证码：111111\n\n**商城 小程序/公众号/APP**：扫描二维码\n\n![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png)\n\n## lilishop-uniapp如何在本地h5和微信小程序中运行\nhttps://www.bilibili.com/video/BV17K8EemEh2/\n\n## lilishop-uniapp如何打包h5到服务器\nhttps://www.bilibili.com/video/BV1CX87exE64/\n\n### 快速开始\n\n#### 阅读文档\n\n`uni-app` https://uniapp.dcloud.net.cn/api/\n\n`vue2` https://v2.cn.vuejs.org/\n\n`uView v1` https://v1.uviewui.com/\n\n#### 环境\n\n在开发之前保证本地安装了以下软件\n`hbulider` https://www.dcloud.io/hbuilderx.html\n\n### 技术栈\n\n本项目技术栈为 `uni-app` + `scss` + `ES2015` + `uView` 提前学习和了解这些知识将帮助你更好地上手我们的项目。\n\n### 安装\n\n1. 克隆项目到本地\n\n```shell\ngit clone https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git\n```\n\n2. 从`hbulider`中打开项目\n\n```shell\n直接将项目拖进hbulider中点击运行即可\n```\n\n### 目录结构\n\n```\n├── api  // 接口\n├── components  // 组件\n├── config  // 配置文件\n├── CustomStartPage  // 打包配置的开屏页\n├── CustomStoryboard  // ios自定义storyboard启动页\n├── hybrid  // 广告配置页\n├── js_sdk  // 封装的js_sdk\n├── lib  // 封装的部分方法\n├── pages  // 页面\n├── plugins  // 插件\n├── static  // 静态资源\n├── store  // vuex\n├── utils  // 工具类\n├── uview-ui  // uview\n├── App.vue  // 入口页面\n├── main.js  // 入口文件\n├── manifest.json  // hbulider配置文件\n├── pages.json  // 路由配置文件\n├── uni.scss  // 全局样式\n└── vue.config.js  // vue配置文件\n```\n\n### 运行\n\n#### 运行在 h5\n\n在`hbulider`中点击`运行`->`运行到浏览器`->`选择自己的浏览器九号`\n\n#### 运行在微信小程序\n\n1.需要保证本地要有`微信开发者工具` https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html\n\n2.在`hbulider`中点击`运行`->`运行到小程序模拟器`->`微信开发者工具` 运行的时候需要配置小程序的`appid`，配置完成后即可运行\n\n#### 运行 APP\n\n##### 运行在安卓\n\n在`hbulider`中点击`运行`->`运行到手机或模拟器`->`选择运行到安卓APP基座`\n\n##### 运行在 IOS\n\n在`hbulider`中点击`运行`->`运行到手机或模拟器`->`选择运行到IOS基座`\n\n\n\n\n### 项目配置/开发\n\n#### config配置\n在根目录`config`下的`config`设置中配置了一些默认的配置，可以根据自己的需求进行修改\n\n```\nconst name = \"lilishop\"; //全局商城name\nconst schemeName = \"lilishop\"; //唤醒app需要的schemeName\nexport default {\n  name: name,\n  schemeLink: `${schemeName}://`, //唤起app地址\n  downloadLink: \"https://pickmall.cn/download-page/index.html\", //下载地址，下载app的地址\n  shareLink: \"https://m-b2b2c.pickmall.cn\", //分享地址，也就是在h5中默认的复制地址\n  appid: \"\", //小程序唯一凭证，即 AppID，可在「微信公众平台 - 设置 - 开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）\n  aMapKey: \"\", //在高德中申请Web服务key\n  scanAuthNavigation: [\"https://m-b2b2c.pickmall.cn/\"], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转\n  iosAppId: \"id1564638363\", //AppStore的应用地址id 具体在分享->拷贝链接中查看\n  logo: \"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png\", //logo地址\n  customerServiceMobile: \"13161366885\", //客服电话\n  customerServiceEmail: \"lili@lili.com\", //客服邮箱\n  imWebSrc: \"https://im.pickmall.cn\", //IM地址\n  baseWsUrl: \"wss://im-api.pickmall.cn/lili/webSocket\", // IM WS 地址\n  enableGetClipboard: false, //是否启用粘贴板获取 scanAuthNavigation 中的链接，如果匹配则会跳转到对应页面\n  enableMiniBarStartUpApp: true, //是否在h5中右侧浮空按钮点击启动app\n  /**\n   * 如需更换主题请修改此处以及uni.scss中的全局颜色\n   */\n  mainColor: \"#ff3c2a\", // 主题色\n  lightColor: \"#ff6b35\", // 高亮主题色\n  aiderLightColor: \"#ff9f28\", // 辅助高亮颜色\n  defaultUserPhoto: \"/static/missing-face.png\", // 默认用户头像\n  enableFetchMobileLogin: false // 是否启用获取手机号登录 如果微信小程序提示封禁手机号获取权限 可将此选项设置成false作为备用登录方案\n};\n\n```\n#### 组件\n在根目录`components`下的`components`设置中配置了一些默认的组件，可以根据自己的需求进行修改或阅读组件详情代码以及README.md文档\n\n#### 页面\n在`pages`文件夹写入或修改页面代码，在`pages.json`中去配置页面路由，具体配置可以参考`pages.json` 或参考uni-app的文档\n\n在微信小程序中默认启用分包操作，如果需要在微信小程序中使用分包，需要在`pages.json`中配置分包路径，具体配置可以参考`pages.json` 或参考uni-app的文档\n\n#### 主题\n1.现在`config`中设置主题色\n\n2.在`uni.scss`中设置全局颜色\n\n3.替换项目中一些icon以及图片的颜色\n\n\n\n\n### 常见问题\n\n#### 微信小程序移动端启动报错\n\n小程序直播插件报错，在`manifest`中删除代码。\n![启动报错](https://docs.pickmall.cn/configure/images/live.png)\n\n#### 微信小程序上传文件过大超出 2MB\n\n1.关闭微信小程序，停止微信小程序运行\n\n2.重新点击运行小程序模拟器，在最下方有一个 `运行时是否压缩代码` 勾选并重新运行\n\n3.如果还是提示超出2MB，重新执行1步骤，然后点击`发行`->`小程序`即可\n\n4.以上1-3步骤都不行，可以尝试删除一些自己开发的代码或本地的静态资源图片\n\n#### 微信小程序在开发者工具中可以使用接口在测试版却不行\n1.首先保证是否填写`request`合法域名 在微信小程序后台配置\n\n2.需保证接口为https请求\n\nrequest合法域名基础配置如下\n```\nhttps://buyer-api.pickmall.cn\nhttps://common-api.pickmall.cn\nhttps://im-api.pickmall.cn\nhttps://restapi.amap.com\n```\n\nsocket合法域名\n```\nwss://im-api.pickmall.cn\n```\nuploadFile合法域名\n```\nhttps://common-api.pickmall.cn\n```\ndownloadFile合法域名\n```\nhttps://buyer-api.pickmall.cn\nhttps://common-api.pickmall.cn\nhttps://im-api.pickmall.cn\nhttps://lilishop-oss.oss-cn-beijing.aliyuncs.com\n```\n\n#### 如何配置API\n在根目录 `config` -> `api` 中配置开发环境以及生产环境 api 接口地址\n\n#### 运行报错\n初次运行时候可能因为本地环境缺少编译插件，这个时候一定要注意看报错信息，根据报错信息安装相应的插件即可\n\n#### 如何配置微信小程序appid\n在根目录 `manifest.json` 中配置微信小程序appid\n\n\n#### 微信登录报错\n需检查appId是否配置正确，在后台管理中信任登录的`appId`以及`appSecret`是否配置正确\n\n\n\n"
  },
  {
    "path": "androidPrivacy.json",
    "content": "{\n    \"version\" : \"1\",\n    \"prompt\" : \"template\",\n    \"title\" : \"服务协议和隐私政策\",\n    \"message\" : \"　　请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款，包括但不限于：为了更好的向你提供服务，我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>　　你可阅读<a href=\\\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\\\">《服务协议》</a>和<a href=\\\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\\\">《隐私政策》</a>了解详细信息。如果你同意，请点击下面按钮开始接受我们的服务。\",\n    \"buttonAccept\" : \"同意并接受\",\n    \"buttonRefuse\" : \"暂不同意\",\n    \"second\" : {\n        \"title\" : \"确认提示\",\n        \"message\" : \"　　进入应用前，你需先同意<a href=\\\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\\\">《服务协议》</a>和<a href=\\\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\\\">《隐私政策》</a>，否则将退出应用。\",\n        \"buttonAccept\" : \"同意并继续\",\n        \"buttonRefuse\" : \"退出应用\"\n    },\n    \"styles\" : {\n        \"borderRadius\" : \"5px\"\n    }\n}\n"
  },
  {
    "path": "api/address.js",
    "content": "/**\n * 收货地址相关API\n */\n\nimport { http, Method } from \"@/utils/request.js\";\n\nimport api from \"@/config/api.js\";\n\n/**\n * 获取收货地址列表\n * @returns {AxiosPromise}\n */\nexport function getAddressList(pageNumber, pageSize) {\n  return http.request({\n    url: \"/member/address\",\n    method: Method.GET,\n    needToken: true,\n    params: { pageNumber, pageSize },\n  });\n}\n\n\n/**\n * 获取物流公司\n */\nexport function getLogistics() {\n  return http.request({\n    url: \"/other/logistics\",\n    method: Method.GET,\n    needToken: true,\n    params: { pageNumber: 1, pageSize: 200, disabled: \"OPEN\" },\n  });\n}\n\n/**\n * 通过cityCode获取地区代码\n */\nexport function getAddressCode(cityCode, townName) {\n  return http.request({\n    url: api.common + \"/common/region/region\",\n    method: Method.GET,\n    needToken: true,\n    params: { cityCode, townName },\n  });\n}\n\n/**\n * 添加收货地址\n * @param params 地址参数\n * @returns {AxiosPromise}\n */\nexport function addAddress(data) {\n  return http.request({\n    url: \"/member/address\",\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: data,\n  });\n}\n\n/**\n * 编辑地址\n * @param id 地址ID\n * @param params 地址参数\n * @returns {AxiosPromise}\n */\nexport function editAddress(params) {\n  return http.request({\n    url: `/member/address`,\n    method: Method.PUT,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: params,\n  });\n}\n\n/**\n * 删除收货地址\n * @param id\n */\nexport function deleteAddress(id) {\n  return http.request({\n    url: `/member/address/delById/${id}`,\n    method: Method.DELETE,\n    needToken: true,\n  });\n}\n\n\n\n/**\n * 根据ID获取会员收件地址\n * @param id\n */\nexport function getAddressDetail(id) {\n  return http.request({\n    url: `/member/address/get/${id}`,\n    method: Method.GET,\n    loading: false,\n    needToken: true,\n  });\n}\n\n/**\n *\n */\nexport function getAddressDefault() {\n  return http.request({\n    url: `/member/address/get/default`,\n    method: Method.GET,\n    loading: false,\n    needToken: true,\n  });\n}\n"
  },
  {
    "path": "api/after-sale.js",
    "content": "/**\n * 申请售后相关API\n */\n\nimport { http, Method } from \"@/utils/request.js\";\n\n/**\n * 获取售后列表\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getAfterSale(params) {\n  return http.request({\n    url: \"after-sales/refunds\",\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n    params,\n  });\n}\n\n\n/******************* 以下为新方法 ***********************/\n/**\n * 申请取消订单\n * @param params\n */\nexport function applyCancelOrder(params) {\n  return http.request({\n    url: \"after-sales/apply/cancel/order\",\n    method: Method.POST,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n/**\n * 获取商家售后收件地址\n */\nexport function getStoreAfterSaleAddress(sn) {\n  return http.request({\n    url: `/order/afterSale/getStoreAfterSaleAddress/${sn}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n/**\n * 取消售后\n */\nexport function cancelAfterSale(afterSaleSn) {\n  return http.request({\n    url: `/order/afterSale/cancel/${afterSaleSn}`,\n    method: Method.POST,\n    needToken: true,\n  });\n}\n\n\n\n/**\n * 获取售后服务记录相关数据\n * @param params 参数\n */\nexport function getAfterSaleList(params) {\n  return http.request({\n    url: `/order/afterSale/page`,\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 查看售后服务详情\n * @param sn 售后服务单编号\n */\nexport function getServiceDetail(sn) {\n  return http.request({\n    url: `/order/afterSale/get/${sn}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n\n/**\n * 添加投诉\n */\nexport function addComplain(params) {\n  return http.request({\n    url: `/order/complain`,\n    method: Method.POST,\n    needToken: true,\n    header: {\n      \"Content-Type\": \"application/x-www-form-urlencoded\",\n    },\n    data: params,\n  });\n}\n\n/**\n * 取消投诉\n */\nexport function clearComplain(id, params) {\n  return http.request({\n    url: `/order/complain/status/${id}`,\n    method: Method.PUT,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 取消投诉\n */\nexport function getAfterSaleLog(sn) {\n  return http.request({\n    url: `/order/afterSale/get/getAfterSaleLog/${sn}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 投诉列表\n */\nexport function getComplain(params) {\n  return http.request({\n    url: `/order/complain`,\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取申请原因\n */\nexport function getAfterSaleReason(serviceType) {\n  return http.request({\n    url: `/order/afterSale/get/afterSaleReason/${serviceType}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 获取取消原因\n */\nexport function getClearReason() {\n  return http.request({\n    url: `/order/afterSale/get/afterSaleReason/CANCEL`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 获取投诉原因\n */\nexport function getComplainReason() {\n  return http.request({\n    url: `/order/afterSale/get/afterSaleReason/COMPLAIN`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n/**\n * 获取投诉详情\n */\nexport function getComplainDetail(id) {\n  return http.request({\n    url: `/order/complain/${id}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 获取申请售后页面信息\n */\nexport function getAfterSaleInfo(sn) {\n  return http.request({\n    url: `/order/afterSale/applyAfterSaleInfo/${sn}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 申请退货服务\n * @param params\n */\nexport function applyReturn(orderItemSn, params) {\n  return http.request({\n    url: `/order/afterSale/save/${orderItemSn}`,\n    method: Method.POST,\n    header: {\n      \"Content-Type\": \"application/x-www-form-urlencoded\",\n    },\n    data: params,\n  });\n}\n\n/**\n * 填充物流信息\n * @param afterSaleSn 售后服务单号\n * @param params 参数信息\n */\nexport function fillShipInfo(afterSaleSn, params) {\n  return http.request({\n    url: `/order/afterSale/delivery/${afterSaleSn}`,\n    method: Method.POST,\n    header: {\n      \"Content-Type\": \"application/x-www-form-urlencoded\",\n    },\n    data: params,\n  });\n}\n\n// 添加交易投诉对话\nexport function communication(params) {\n  return http.request({\n    url: `/order/complain/communication`,\n    method: Method.POST,\n    needToken: true,\n    params\n  });\n}"
  },
  {
    "path": "api/article.js",
    "content": "/**\n * 文章相关API\n */\n\nimport {http,Method} from '@/utils/request.js';\nimport api from '@/config/api.js';\n\n/**\n * 获取某个分类的文章列表\n * @param category_type\n */\nexport function getArticleCategory(category_type) {\n  return http.request({\n    url: `${api.base}/pages/article-categories`,\n    method: Method.GET,\n    params: {category_type},\n  });\n}\n\n/**\n * 获取文章详情\n * @param type\n */\nexport function getArticleDetail(type) {\n  return http.request({\n    url: `/other/article/get/${type}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取文章详情\n * @param type\n */\n export function getArticleDetailByType(type) {\n  return http.request({\n    url: `/other/article/type/${type}`,\n    method: Method.GET,\n  });\n}\n\n\n\n"
  },
  {
    "path": "api/common.js",
    "content": "/**\r\n * 公共API\r\n */\r\nimport { http, Method } from \"@/utils/request.js\";\r\nimport api from \"@/config/api.js\";\r\n\r\n/**\r\n * 获取地区数据\r\n * @param id\r\n */\r\nexport function getRegionsById(id = 0) {\r\n  return http.request({\r\n    url: `${api.common}/common/region/item/${id}`,\r\n    method: Method.GET,\r\n    message: false,\r\n  });\r\n}\r\n\r\n// 获取IM接口前缀\r\nexport function getIMDetail() {\r\n  return http.request({\r\n    url: `${api.common}/IM`,\r\n    method: Method.GET,\r\n    message: false,\r\n  });\r\n}\r\n\r\n/**\r\n * 文件上传地址\r\n * @type {string}\r\n */\r\nexport const upload = api.common + \"/common/upload/file\";\r\n"
  },
  {
    "path": "api/connect.js",
    "content": "/**\r\n * 信任登录相关API\r\n */\r\n\r\nimport {\r\n\thttp,\r\n\tMethod\r\n} from '@/utils/request.js';\r\nconst request = http.request;\r\n\r\n\r\n/**\r\n * web 第三方登录\r\n * @param {Object} code\r\n */\r\nexport function webConnect(code) {\r\n\treturn http.request({\r\n\t\turl: `passport/connect/connect/login/web/${code}`,\r\n\t\tmethod: Method.GET,\r\n\t\tneedToken: true,\r\n\t\theader: {\r\n\t\t\t\"clientType\": \"H5\"\r\n\t\t}\r\n\t});\r\n}\r\nexport function openIdLogin(params, clientType) {\r\n\treturn http.request({\r\n\t\turl: `passport/connect/connect/app/login`,\r\n\t\tmethod: Method.POST,\r\n\t\tneedToken: true,\r\n\t\tdata: params,\r\n\t\theader: {\r\n\t\t\t\"clientType\": clientType\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * 第三方登录成功 回调接口\r\n */\r\nexport function loginCallback(state) {\r\n\treturn http.request({\r\n\t\turl: `passport/connect/connect/result?state=${state}`,\r\n\t\tmethod: Method.GET,\r\n\t\tneedToken: false\r\n\t});\r\n}\r\n\r\n\r\n\r\n/**\r\n * 小程序自动登录\r\n * @param params\r\n */\r\nexport function mpAutoLogin(params) {\r\n\treturn http.request({\r\n\t\turl: 'passport/connect/miniProgram/auto-login',\r\n\t\tmethod: Method.GET,\r\n\t\tparams\r\n\t});\r\n}\r\n"
  },
  {
    "path": "api/entry.js",
    "content": "/**\n * 入驻类相关api\n */\n\nimport { http, Method } from \"@/utils/request.js\";\n\n// 获取当前用户的代理入驻详情\nexport function getCompanyDetail(params) {\n  return http.request({\n    url: \"/store/store/apply\",\n    method: Method.GET,\n    params,\n  });\n}\n\n// 申请店铺第一步-填写企业信息\nexport function applyFirst(params) {\n  return http.request({\n    url: \"/store/store/apply/first\",\n    method: Method.PUT,\n    params,\n  });\n}\n\n// 申请店铺第二步-填写银行\nexport function applySecond(params) {\n  return http.request({\n    url: \"/store/store/apply/second\",\n    method: Method.PUT,\n    params,\n  });\n}\n\n// 申请店铺第三步-填写银行\nexport function applyThird(params) {\n  return http.request({\n    url: \"/store/store/apply/third\",\n    method: Method.PUT,\n    params,\n  });\n}\n"
  },
  {
    "path": "api/goods.js",
    "content": "/**\n * 商品相关API\n */\n\nimport { http, Method } from \"@/utils/request.js\";\n\n/**\n * 从ES中获取相关商品品牌名称，分类名称及属性\n */\n export function getGoodsMessage(goodsId) {\n  return http.request({\n    url: `/goods/goods/get/${goodsId}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 从ES中获取相关商品品牌名称，分类名称及属性\n */\nexport function getGoodsRelated(params) {\n  return http.request({\n    url: `/goods/goods/es/related`,\n    method: Method.GET,\n    params,\n  });\n}\n\n/**\n * 获取商品详情\n * @param skuId 商品ID\n * @returns {AxiosPromise}\n */\n export function getGoods(skuId, goodsId) {\n  return http.request({\n    url: `/goods/goods/sku/${goodsId}/${skuId}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取商品分销\n * @param distributionId 商品分销ID\n */\n export function getGoodsDistribution(distributionId) {\n  return http.request({\n    url: `/distribution/distribution/bindingDistribution/${distributionId}`,\n    method: Method.GET,\n  });\n}\n\n\n/**\n * 获取商品列表\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getGoodsList(params) {\n  return http.request({\n    url: \"/goods/goods/es\",\n    method: Method.GET,\n    params,\n  });\n}\n\n/**\n * 获取上新商品列表\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getGoodsListUplog(params) {\n  return http.request({\n    url: \"goods/search/uplog\",\n    method: Method.GET,\n    params,\n  });\n}\n\n\n\n/**\n * 获取标签商品\n * @param storeId 卖家id\n * @param mark      标签 hot：热卖 new：新品 recommend：推荐\n * @param num       获取个数\n */\nexport function getTagGoods(storeId, mark = \"hot\", num = 5) {\n  return http.request({\n    url: `goods/tags/${mark}/goods`,\n    method: Method.GET,\n    loading: false,\n    params: {\n      storeId,\n      mark,\n      num,\n    },\n  });\n}\n/**\n * 获取标签商品\n */\nexport function getPlateformTagGoods(tag_id) {\n  return http.request({\n    url: `goods/tags/byid/${tag_id}`,\n    method: Method.GET,\n    loading: false,\n  });\n}\n\n/**\n * 获取首页商品分类 左侧列表\n * @param parent_id\n */\nexport function getCategoryList(id) {\n  return http.request({\n    url: `/goods/category/get/${id}`,\n    method: Method.GET,\n    loading: false,\n  });\n}\n\n\n\n\n/**\n * 获取当前会员的分销商信息 可根据分销商信息查询待提现金额以及冻结金额等信息\n */\nexport function distribution() {\n  return http.request({\n    url: `/distribution/distribution`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 申请分销商\n */\nexport function applyDistribution(params) {\n  return http.request({\n    url: `/distribution/distribution`,\n    method: Method.POST,\n    params,\n  });\n}\n\n/**\n * 分销商提现\n */\nexport function cash(params) {\n  return http.request({\n    url: `/distribution/cash`,\n    method: Method.POST,\n    params,\n  });\n}\n\n/**\n * 分销商提现历史\n */\nexport function cashLog(params) {\n  return http.request({\n    url: `/distribution/cash`,\n    method: Method.GET,\n    params\n\n  });\n}\n\n/**\n * 获取分销商分页订单列表\n */\nexport function distributionOrderList(params) {\n  return http.request({\n    url: `/distribution/distribution/distributionOrder`,\n    method: Method.GET,\n    params\n  });\n}\n\n/**\n * 获取分销商商品列表\n */\nexport function distributionGoods(params) {\n  return http.request({\n    url: `/distribution/goods`,\n    method: Method.GET,\n    params,\n  });\n}\n/**\n * 选择分销商品 分销商品id\n */\nexport function checkedDistributionGoods(params) {\n  return http.request({\n    url: `/distribution/goods/checked/${params.id}`,\n    method: Method.GET,\n    params\n  });\n}\n\n/**\n * 获取 小程序码\n */\n export function getMpCode(params){\n  return http.request({\n    url:`/passport/connect/miniProgram/mp/unlimited`,\n    method:Method.GET,\n    params\n  })\n}\n\n/**\n * 根据shortlink 获取页面参数\n */\n export function getMpScene(id){\n  return http.request({\n    url:`/passport/connect/miniProgram/mp/unlimited/scene?id=${id}`,\n    method:Method.GET,\n\n  })\n}\n"
  },
  {
    "path": "api/home.js",
    "content": "import { http, Method } from \"@/utils/request.js\";\n\n export function toSpecial(data) {\n  return http.request({\n    url: `/other/pageData/getSpecial`,\n    method: Method.GET,\n    data\n  });\n}\n/**\n * 专题内容\n */\n export function getSpecial(id) {\n  return http.request({\n    url: `/other/pageData/get/${id}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取广告图\n */\nexport function getAdvertisement() {\n  return http.request({\n    url: \"/advertisement\",\n    method: Method.GET,\n  });\n}\n\n\n\n/**\n * 获取首页商品分类\n * @param parent_id\n */\nexport function getCategory(parent_id = 0) {\n  return http.request({\n    url: `goods/categories/${parent_id}/children`,\n    method: Method.GET,\n    loading: false,\n  });\n}\n\n/**\n * 获取热门关键词\n * @param num\n */\nexport function getHotKeywords(count) {\n  return http.request({\n    url: \"/goods/goods/hot-words\",\n    method: Method.GET,\n    loading: false,\n    params: { count },\n  });\n}\n\n/**\n * 获取楼层数据\n * @param client_type\n * @param page_type\n */\nexport function getFloorData(params) {\n  return http.request({\n    url: `/other/pageData/getIndex?clientType=H5`,\n    method: \"get\",\n    params\n  });\n}\n\n/**\n * 获取店铺楼层数据\n */\nexport function getFloorStoreData(params) {\n  return http.request({\n    url: `/other/pageData?pageClientType=H5`,\n    method: \"get\",\n    params\n  });\n}\n\n/**\n * 获取获取首页分类数据\n */\nexport function getCategoryIndexData(parentId = 0) {\n  return http.request({\n    url: `/goods/category/get/${parentId}`,\n    method: \"get\",\n  });\n}\n"
  },
  {
    "path": "api/im.js",
    "content": "import { http,Method } from \"@/utils/request.js\";\n\nimport api from \"@/config/api.js\";\n\n/**\n * 获取聊天详情接口\n * @param {*} talkId \n * @returns \n */\nexport function getTalk(talkId) {\n    return http.request({\n      url: `${api.im}/talk/${talkId}`,\n      method: Method.GET,\n    });\n}\n\n/**\n * 获取与用户的聊天详情\n * @param {*} talkId \n * @returns \n */\n export function getTalkByUser(userId) {\n  return http.request({\n    url: `${api.im}/talk/by/user/${userId}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取聊天列表\n * @param {*} talkId \n * @returns \n */\n export function getTalkList(params) {\n    return http.request({\n      url: `${api.im}/talk/list`,\n      method: Method.GET,\n      params\n    });\n}\n\n/**\n * 获取聊天信息接口\n * @param {*} params \n * @returns \n */\n export function getTalkMessage(params) {\n    return http.request({\n      url: `${api.im}/message`,\n      method: Method.GET,\n      params\n    });\n}\n\n/**\n * 获取聊天信息接口\n * @param {*} params \n * @returns \n */\n export function cleanUnreadMessage(params) {\n  return http.request({\n    url: `${api.im}/message/clean/unred`,\n    method: Method.PUT,\n    params\n  });\n}\n// 从商品页点击 客服 跳转 获取商品详情\nexport function jumpObtain(skuId, goodsId) {\n  return http.request({\n    url: `/goods/goods/sku/${goodsId}/${skuId}`,\n    method: Method.GET,\n  });\n}\n// 清除未读\n// /im/message/clean/unred\nexport function clearmeaager() {\n  return http.request({\n    url: `${api.im}/message/clean/unred`,\n    method: Method.PUT,\n  });\n}\n\n"
  },
  {
    "path": "api/login.js",
    "content": "import { http } from \"@/utils/request.js\";\r\n\r\nimport api from \"@/config/api.js\";\r\n\r\n/**\r\n * 通过短信重置密码\r\n * @param  mobile\r\n */\r\nexport function resetByMobile(params) {\r\n  return http.request({\r\n    url: `/passport/member/resetByMobile`,\r\n    method: \"POST\",\r\n    params,\r\n  });\r\n}\r\n\r\n/**\r\n * 绑定手机号码\r\n * @param  mobile\r\n */\r\nexport function bindMobile(params) {\r\n  return http.request({\r\n    url: `/passport/member/bindMobile`,\r\n    method: \"POST\",\r\n    params,\r\n  });\r\n}\r\n\r\n//获取自动发券\r\nexport function getAutoCoup(){\r\n  return http.request({\r\n    url:`/promotion/coupon/activity`,\r\n    method:\"GET\",\r\n    needToken: true,\r\n  });\r\n}\r\n\r\n/**\r\n * 账号密码登陆\r\n * @params  password\r\n * @params  username\r\n */\r\n export function userLogin(params, clientType){\r\n  return http.request({\r\n    method: \"POST\",\r\n    url:`/passport/member/userLogin`,\r\n    data: params,\r\n    header: {\r\n      \"content-type\": \"application/x-www-form-urlencoded\",\r\n\t  clientType: clientType,\r\n    },\r\n  })\r\n}\r\n\r\n\r\n/**\r\n * 发送验证码\r\n * @param  mobile\r\n */\r\nexport function sendMobile(mobile,type='LOGIN') {\r\n  return http.request({\r\n    url: `${api.common}/common/sms/${type}/${mobile}`,\r\n    method: \"GET\",\r\n  });\r\n}\r\n\r\n/**\r\n * 短信登录\r\n * @param  mobile\r\n * @param  smsCode\r\n */\r\nexport function smsLogin(params, clientType) {\r\n  return http.request({\r\n    url: `/passport/member/smsLogin`,\r\n    method: \"POST\",\r\n    data: params,\r\n    header: {\r\n      \"content-type\": \"application/x-www-form-urlencoded\",\r\n      clientType: clientType,\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * 修改密码\r\n * @param  newPassword\r\n * @param  password\r\n */\r\n\r\nexport function modifyPass(params) {\r\n  return http.request({\r\n    url: `/passport/member/modifyPass`,\r\n    method: \"PUT\",\r\n    params,\r\n  });\r\n}\r\n\r\n/**\r\n * 修改密码\r\n * @param  newPassword\r\n * @param  password\r\n */\r\nexport function resetPassword(params) {\r\n  return http.request({\r\n    url: `/passport/member/resetPassword`,\r\n    method: \"POST\",\r\n    params,\r\n  });\r\n}\r\n\r\n/**\r\n * 刷新token\r\n */\r\nexport function refreshTokenFn(refresh_token) {\r\n  return http.request({\r\n    url: `/passport/member/refresh/${refresh_token}`,\r\n    method: \"GET\",\r\n  });\r\n}\r\n\r\n// 获取密码状态\r\nexport function logout () {\r\n  return http.request({\r\n    url: '/passport/member/logout',\r\n    method: \"POST\",\r\n    needToken: true,\r\n  })\r\n}\r\n\r\nexport function scannerCodeLogin(params){\r\n\treturn http.request({\r\n\t  url: '/passport/member/app_scanner',\r\n\t  method: \"POST\",\r\n\t  params,\r\n\t  needToken: true,\r\n\t});\r\n}\r\nexport function scannerCodeLoginConfirm(params){\r\n\treturn http.request({\r\n\t  url: '/passport/member/app_confirm',\r\n\t  method: \"POST\",\r\n\t  params,\r\n\t  needToken: true,\r\n\t});\r\n}\r\n\r\n// 注销用户\r\nexport function logoffConfirm() {\r\n\treturn http.request({\r\n\t\turl: '/passport/member/cancellation',\r\n\t\tmethod: \"PUT\",\r\n\t\tneedToken: true,\r\n\t})\r\n}\r\n"
  },
  {
    "path": "api/members.js",
    "content": "import storage from \"@/utils/storage\";\nimport { http, Method } from \"@/utils/request.js\";\n\n/**\n * 意见反馈\n */\nexport function feedBack(params) {\n  return http.request({\n    url: \"/other/feedback\",\n    method: Method.POST,\n    needToken: true,\n    params,\n  });\n}\n\n// 提现\nexport function withdrawalApply(params) {\n  return http.request({\n    url: \"/wallet/wallet/withdrawal\",\n    method: Method.POST,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 支付结果查询\n * @param orderType 交易类型,可用值:TRADE,ORDER,RECHARGE\n * @param sn   订单编号\n */\nexport function payCallback(params) {\n  return http.request({\n    url: `/payment/cashier/result`,\n    method: Method.GET,\n    params,\n  });\n}\n\n// 在线充值\nexport function recharge(params) {\n  return http.request({\n    url: \"/trade/recharge\",\n    method: Method.POST,\n    params,\n  });\n}\n\n/**\n * 分页获取预存款充值记录\n * @param params\n */\nexport function getUserRecharge(params) {\n  return http.request({\n    url: \"/member/recharge\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 分页获取预存款充值记录\n * @param params\n */\nexport function getWalletLog(params) {\n  return http.request({\n    url: \"/wallet/log\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取优惠券列表\n * @param params\n */\nexport function getCoupons(params) {\n  return http.request({\n    url: \"/promotion/coupon/getCoupons\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 领取优惠券\n * @param couponId\n */\nexport function receiveCoupons(couponId) {\n  return http.request({\n    url: `/promotion/coupon/receive/${couponId}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 获取积分明细数据\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getPointsData(params) {\n  return http.request({\n    url: \"member/memberPointsHistory/getByPage\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取我的评论列表\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getComments(params) {\n  return http.request({\n    url: \"/member/evaluation\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取当前会员的浏览数量是多少\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getFootprintNum(params) {\n  return http.request({\n    url: \"/member/footprint/getFootprintNum\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 订单评论\n * @param params\n */\nexport function commentsMemberOrder(params) {\n  return http.request({\n    url: \"/member/evaluation\",\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: params,\n  });\n}\n\n/**\n * 追加评论\n * @param params\n */\nexport function AppendCommentsOrder(params) {\n  return http.request({\n    url: \"members/comments/additional\",\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: params,\n  });\n}\n\n// TODO 第一版本暂未实现此功能\n/**\n * 商品咨询\n * @param goods_id\n * @param ask_content\n */\nexport function consultating(goods_id, ask_content, anonymous) {\n  return http.request({\n    url: \"members/asks\",\n    method: Method.POST,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    needToken: true,\n    data: {\n      goods_id,\n      ask_content,\n      anonymous,\n    },\n  });\n}\n\n/**\n * 获取商品收藏\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getGoodsCollection(params, type) {\n  return http.request({\n    url: `/member/collection/${type}`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n    message: false,\n    params,\n  });\n}\n\n/**\n * 获取商品收藏\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getStoreCollection(params, type) {\n  return http.request({\n    url: `/member/storeCollection/${type}`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n    message: false,\n    params,\n  });\n}\n\n/**\n * 收藏商品\n * @returns {AxiosPromise}\n */\nexport function collectionGoods(type, id) {\n  return http.request({\n    url: `/member/collection/add/${type}/${id}`,\n    method: Method.POST,\n    needToken: true,\n  });\n}\n\n/**\n * 删除商品收藏\n * @param ids 收藏ID【集合或单个商品ID】\n * @returns {AxiosPromise}\n */\nexport function deleteGoodsCollection(ids) {\n  if (Array.isArray(ids)) {\n    ids = ids.join(\",\");\n  }\n  return http.request({\n    url: `/member/collection/delete/GOODS/${ids}`,\n    method: Method.DELETE,\n    needToken: true,\n  });\n}\n\n/**\n * 删除店铺收藏\n * @param store_id\n */\nexport function deleteStoreCollection(store_id) {\n  return http.request({\n    url: `/member/storeCollection/delete/STORE/${store_id}`,\n    method: Method.DELETE,\n    needToken: true,\n  });\n}\n\n/**\n * 获取商品是否被收藏\n * @param good_id\n */\nexport function getGoodsIsCollect(type, good_id) {\n  return http.request({\n    url: `/member/collection/isCollection/${type}/${good_id}`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n  });\n}\n\n/**\n * 获取商品是否被收藏\n * @param good_id\n */\nexport function getStoreIsCollect(type, store_id) {\n  return http.request({\n    url: `/member/storeCollection/isCollection/${type}/${store_id}`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n  });\n}\n\n/**\n * 收藏店铺\n * @param store_id 店铺ID\n * @returns {AxiosPromise}\n */\nexport function collectionStore(store_id) {\n  return http.request({\n    url: `/member/storeCollection/add/STORE/${store_id}`,\n    method: Method.POST,\n    needToken: true,\n  });\n}\n\n/**\n * 获取当前登录的用户信息\n * @returns {AxiosPromise}\n */\nexport function getUserInfo() {\n  return http.request({\n    url: \"/passport/member\",\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 获取当前用户的预存款\n * @returns {AxiosPromise}\n */\nexport function getUserWallet() {\n  return http.request({\n    url: \"/wallet/wallet\",\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 保存用户信息\n * @param params\n * @returns {AxiosPromise}\n */\nexport function saveUserInfo(params) {\n  return http.request({\n    url: \"/passport/member/editOwn\",\n    method: Method.PUT,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    needToken: true,\n    data: params,\n  });\n}\n\n/**\n * 添加发票\n * @param params\n */\nexport function addReceipt(params) {\n  return http.request({\n    url: \"/trade/receipt\",\n    method: Method.POST,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取商品评论列表\n * @param goodsId\n * @param params\n */\nexport function getGoodsComments(goodsId, params) {\n  return http.request({\n    url: `/member/evaluation/${goodsId}/goodsEvaluation`,\n    method: Method.GET,\n    loading: false,\n    params,\n  });\n}\n\n/**\n * 获取商品评论数量统计\n * @param goodsId\n */\nexport function getGoodsCommentsCount(goodsId) {\n  return http.request({\n    url: `/member/evaluation/${goodsId}/evaluationNumber`,\n    method: Method.GET,\n    loading: false,\n  });\n}\n\n/**\n * 获取未读消息数量信息\n */\nexport function getNoReadMessageNum() {\n  return http.request({\n    url: `members/member-nocice-logs/number`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 我的足迹列表\n * @param pageNumber  pageSize\n *\n */\nexport function myTrackList(params) {\n  return http.request({\n    url: `/member/footprint`,\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 根据id删除会员足迹\n * @param id\n */\nexport function deleteHistoryListId(ids) {\n  return http.request({\n    url: `/member/footprint/delByIds/${ids}`,\n    method: Method.DELETE,\n    needToken: true,\n  });\n}\n\n/**\n * 获取当前会员优惠券列表\n * @param\n */\nexport function getMemberCoupons(data) {\n  return http.request({\n    url: `/promotion/coupon/getCoupons`,\n    method: Method.GET,\n    needToken: true,\n    params: data,\n  });\n}\n\n/**\n * 获取当前会员可使用的优惠券数量\n *\n */\nexport function getCouponsNum() {\n  return http.request({\n    url: `/promotion/coupon/getCouponsNum`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 获取会员积分VO\n * @param\n */\nexport function getMemberPointSum() {\n  return http.request({\n    url: `member/memberPointsHistory/getMemberPointsHistoryVO`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取会员积分VO\n * @param\n */\nexport function withdrawalSettingVO() {\n  return http.request({\n    url: `/wallet/wallet/withdrawalSettingVO`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n"
  },
  {
    "path": "api/message.js",
    "content": "/**\n * 站内消息相关API\n */\n\nimport {http,Method} from '@/utils/request.js';\nconst request = http.request\n\nimport api from '@/config/api.js';\n\n/**\n * 获取微信消息订阅\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getWeChatMpMessage() { \n  return http.request({\n    url: 'passport/connect/miniProgram/subscribeMessage',\n    method: Method.GET\n  });\n}\n\n/**\n * 获取消息列表\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getMessages(params) {\n  params = params || {};\n  params.pageSize = params.pageSize || 5;\n  return http.request({\n    url: 'members/member-nocice-logs',\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n\n/**\n * 标记消息为已读\n * @param ids\n */\nexport function messageMarkAsRead(ids) {\n  return http.request({\n    url: `/message/member/${ids}`,\n    method: Method.PUT,\n    needToken: true,\n  });\n}\n\n//读取站内消息\nexport function editMessages(message_id,params){\n  return http.request({\n    url:`/message/member/${message_id}`,\n    method:Method.PUT,\n    needToken:true,\n    params\n  })\n}\n//获取站内消息\nexport function messages(params) {\n  return http.request({\n    url: \"/message/member\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取物流消息列表\n * @param params\n * @returns {AxiosPromise}\n */\nexport function getLogisticsMessages(params) {\n  params = params || {};\n  params.pageSize = params.pageSize || 5;\n  return http.request({\n    url: 'trade/logistics/message',\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n\n/**\n * @param appType\n * @returns {AxiosPromise}\n * \n */\t\n export function getAppVersion(appType) {\n  return http.request({\n    url: `/other/appVersion/${appType}`,\n    method: Method.GET,\n    type:\"manager\"\n  });\n}\n\n/**\n * @param appType\n * @returns {AxiosPromise}\n * \n */\t\n export function getAppVersionList(type,data) {\n  return http.request({\n    url: `/other/appVersion/appVersion/${type}`,\n    method: Method.GET,\n    type:\"manager\",\n    data\n  });\n}\n"
  },
  {
    "path": "api/order.js",
    "content": "/**\n * 订单相关API\n */\n\nimport { http, Method } from \"@/utils/request.js\";\n\n\n\n\n/**\n * 选择发票\n * @param params\n */\n export function getReceipt(params) {\n  return http.request({\n    url: \"/trade/carts/select/receipt\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 选择发票\n * @param id\n */\nexport function getReceiptDetail(id) {\n  return http.request({\n    url: `/trade/receipt/${id}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 选择配送方式\n * @param params\n */\nexport function selectedShipMethod(params) {\n  return http.request({\n    url: \"/trade/carts/shippingMethod\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取订单列表\n * @param params\n */\nexport function getOrderList(params) {\n  return http.request({\n    url: \"/order/order\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n/**\n * 获取订单详情\n * @param orderSn 订单编号\n */\nexport function getOrderDetail(orderSn) {\n  return http.request({\n    url: `/order/order/${orderSn}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 取消订单\n * @param orderSn 订单编号\n * @param reason   取消原因\n */\nexport function cancelOrder(orderSn, reason) {\n  return http.request({\n    url: `/order/order/${orderSn}/cancel`,\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: reason,\n  });\n}\n\n/**\n * 确认收货\n * @param orderSn 订单编号\n */\nexport function confirmReceipt(orderSn) {\n  return http.request({\n    url: `/order/order/${orderSn}/receiving`,\n    method: Method.POST,\n    needToken: true,\n  });\n}\n\n\n\n/**\n * 获取当前拼团订单的拼团分享信息\n * @param {*} parentOrderSn\n * @param {*} skuId\n */\nexport function getPinTuanShare(parentOrderSn,skuId) {\n  return http.request({\n    url: `promotion/pintuan/share`,\n    method: Method.GET,\n    needToken: true,\n    params:{parentOrderSn,skuId}\n  });\n}\n\n"
  },
  {
    "path": "api/passport.js",
    "content": "/**\n * Created by Andste on 2018/5/2.\n * 用户认证相关API\n */\nimport storage from '@/utils/storage.js';\nimport {http, Method} from '@/utils/request.js';\nimport { md5 } from '@/utils/md5.js';\n\n/**\n * 普通登录\n * @param username\n * @param password\n * @param captcha\n */\nexport function login(username, password, captcha) {\n  return http.request({\n    url: 'passport/login',\n    method: Method.POST,\n    params: {\n      username,\n      password: md5(password),\n      captcha,\n      uuid: storage.getUuid(),\n    },\n  });\n}\n\n\n\n\n\n/**\n * 验证账户信息\n * @param captcha\n * @param account\n */\nexport function validAccount(captcha, account) {\n  return http.request({\n    url: 'passport/find-pwd',\n    method: Method.GET,\n    params: {\n      uuid: storage.getUuid(),\n      captcha,\n      account,\n    },\n  });\n}\n\n/**\n * 发送找回密码短信\n * @param uuid\n * @param captcha\n */\nexport function sendFindPasswordSms(uuid,captcha) {\n  return http.request({\n    url: 'passport/find-pwd/send',\n    method: Method.POST,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    data: {\n      uuid:uuid,\n      captcha,\n    },\n  });\n}\n\n/**\n * 校验找回密码验证码\n * @param uuid\n * @param sms_code\n */\nexport function validFindPasswordSms(uuid, sms_code) {\n  return http.request({\n    url: 'passport/find-pwd/valid',\n    method: Method.GET,\n    params: {\n      uuid,\n      sms_code,\n    },\n  });\n}\n\n/**\n * 修改密码【找回密码用】\n * @param password\n * @param uuid\n */\nexport function changePassword(password, uuid) {\n  if (!uuid) {\n    uuid = storage.getUuid();\n  }\n  return http.request({\n    url: 'passport/find-pwd/update-password',\n    method: Method.PUT,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    data: {\n      uuid,\n      password: md5(password),\n    },\n  });\n}\n\n\n\n// 保存生物认证登录\nexport function setBiolofy(params) {\n\treturn http.request({\n\t\turl: `passport/login/save/biology`,\n\t\tmethod: 'POST',\n\t\tparams\n\t})\n}\n"
  },
  {
    "path": "api/point.js",
    "content": "\nimport {http, Method} from '@/utils/request.js';\n\n/**\n * 签到\n * @param params\n */\nexport function sign() {\n  return http.request({\n    url: '/members/sign',\n    method: Method.POST,\n    needToken: true,\n  });\n}\n\n\n\n/**\n * 签到时间获取\n * @param params\n */\nexport function signTime(time) {\n  return http.request({\n    url: '/members/sign?time='+time,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n"
  },
  {
    "path": "api/promotions.js",
    "content": "/**\n * 促销相关API\n */\nimport { http, Method } from \"@/utils/request.js\";\n\n/**\n * 获取当前直播列表\n *\n * @param {*}\n * @returns\n */\nexport function getLiveList(params) {\n  return http.request({\n    url: `broadcast/studio`,\n    method: Method.GET,\n    params,\n  });\n}\n\n/**\n * 获取当前拼团活动的未成团的会员\n */\nexport function getPromotionGroupMember(pintuanId) {\n  return http.request({\n    url: `promotion/pintuan/${pintuanId}/members`,\n    method: Method.GET,\n  });\n}\n\n/** 获取拼团列表 */\nexport function getAssembleList(params) {\n  return http.request({\n    url: \"promotion/pintuan\",\n    method: Method.GET,\n    loading: false,\n    params,\n  });\n}\n\n/**\n * 获取积分商城分类\n */\nexport function getPointsCategory() {\n  return http.request({\n    url: \"/promotion/pointsGoods/category\",\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取积分商城商品\n * @param params\n */\n export function getPointsGoods(params) {\n  return http.request({\n    url: \"/promotion/pointsGoods\",\n    method: Method.GET,\n    params,\n  });\n}\n/**\n * 获取积分商城商品详情\n * @param params\n */\nexport function getPointsGoodsDetail(id) {\n  return http.request({\n    url: \"/promotion/pointsGoods/\"+id,\n    method: Method.GET,\n  });\n}\n\n\n\n/**\n * 获取限时抢购时间线 当天限时抢购信息\n */\nexport function getSeckillTimeLine() {\n  return http.request({\n    url: \"promotion/seckill\",\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取限时抢购商品 获取某个时刻的限时抢购商品信息\n * @param params\n */\nexport function getSeckillTimeGoods(timeline) {\n  return http.request({\n    url: `promotion/seckill/${timeline}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取全部优惠券\n * @param params\n */\nexport function getAllCoupons(params) {\n  return http.request({\n    url: \"/promotion/coupon\",\n    method: Method.GET,\n    params,\n  });\n}\n\n/**\n * 分页获取砍价商品\n * @param params\n */\nexport function getBargainList(params) {\n  return http.request({\n    url: \"/promotion/kanjiaGoods\",\n    method: Method.GET,\n    params,\n  });\n}\n\n/**\n * 分页获取砍价商品\n * @param params\n */\nexport function getBargainDetail(id) {\n  return http.request({\n    url: `/promotion/kanjiaGoods/${id}`,\n    method: Method.GET,\n  });\n}\n\n/**\n * 获取砍价活动\n * @param params\n */\nexport function getBargainActivity(params) {\n  return http.request({\n    url: `/promotion/kanjiaGoods/getKanjiaActivity`,\n    method: Method.POST,\n    params,\n  });\n}\n\n/**\n * 发起砍价活动\n * @param params\n */\nexport function openBargain(params) {\n  return http.request({\n    url: `/promotion/kanjiaGoods`,\n    method: Method.POST,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: params,\n  });\n}\n\n/**\n * 分页获取砍价活动-帮砍记录\n */\nexport function getBargainLog(params) {\n  return http.request({\n    url: `/promotion/kanjiaGoods/getKanjiaActivity/logs`,\n    method: Method.GET,\n    data: params,\n  });\n}\n\n\n/**\n * 分页获取砍价活动-帮砍记录\n */\n export function helpBargain(kanJiaActivityId) {\n  return http.request({\n    url: `promotion/kanjiaGoods/help/${kanJiaActivityId}`,\n    method: Method.POST,\n  });\n}\n\n/**\n * 分页获取已参与的砍价活动\n */\nexport function getMineBargainLog(params) {\n  return http.request({\n    url: `/promotion/kanjiaGoods/kanjiaActivity/mine/`,\n    method: Method.GET,\n    params\n  });\n}\n\n\n"
  },
  {
    "path": "api/safe.js",
    "content": "/**\n * 安全相关API\n */\n\nimport {http,Method} from '@/utils/request.js';\nimport storage from \"@/utils/storage.js\"\nimport { md5 } from '@/utils/md5.js'\n\n/**\n * 发送绑定手机验证码\n * @param mobile\n * @param captcha\n */\nexport function sendBindMobileSms(mobile, captcha) {\n  return http.request({\n    url: `members/security/bind/send/${mobile}`,\n    method: Method.POST,\n    needToken: true,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    data: {\n      uuid: storage.getUuid(),\n      captcha,\n    },\n  });\n}\n\n/**\n * 绑定手机号\n * @param mobile\n * @param sms_code\n */\nexport function bindMobile(mobile, sms_code) {\n  return http.request({\n    url: `members/security/bind/${mobile}`,\n    method: Method.PUT,\n    needToken: true,\n    data: {sms_code},\n  });\n}\n\n/**\n * 发送手机验证码\n * 在修改手机号和更改密码时通用\n * @param captcha\n */\nexport function sendMobileSms(captcha) {\n  return http.request({\n    url: 'members/security/send',\n    method: Method.POST,\n    needToken: true,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    data: {\n      uuid: storage.getUuid(),\n      captcha,\n    },\n  });\n}\n\n/**\n * 验证更换手机号短信\n * @param sms_code\n */\nexport function validChangeMobileSms(sms_code) {\n  return http.request({\n    url: 'members/security/exchange-bind',\n    method: Method.GET,\n    needToken: true,\n    params: {sms_code},\n  });\n}\n\n/**\n * 更换手机号\n * @param mobile\n * @param sms_code\n */\nexport function changeMobile(mobile, sms_code) {\n  return http.request({\n    url: `members/security/exchange-bind/${mobile}`,\n    method: Method.PUT,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    needToken: true,\n    data: {sms_code},\n  });\n}\n\n\n/**\n * 更改密码\n * @param captcha\n * @param password\n */\nexport function changePassword(captcha, password) {\n  return http.request({\n    url: 'members/security/password',\n    method: Method.PUT,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    needToken: true,\n    data: {\n      uuid: storage.getUuid(),\n      captcha,\n      password: md5(password),\n    },\n  });\n}\n\n/**\n * 获取当前实名认证进度\n * @param email\n * @param email_code\n */\nexport function contractStep() {\n  return http.request({\n    url: `members/contract/step`,\n    method: Method.GET,\n    needToken: true\n  })\n}\n\n/**\n * 实名认证\n * @param email\n * @param email_code\n */\nexport function authentication(params) {\n  return http.request({\n    url: `members/contract/authentication`,\n    method: Method.POST,\n    needToken: true,\n\theader:{'content-type':\"application/x-www-form-urlencoded\"},\n    data: params\n  })\n}\n\n\n\n"
  },
  {
    "path": "api/store.js",
    "content": "/**\n * 店铺相关API\n */\n\nimport {http, Method} from '@/utils/request.js';\n\n\n\n\n/**\n * 获取店铺列表\n * @param params\n */\nexport function getStoreList(params) {\n  return http.request({\n    url: '/store/store',\n    method: Method.GET,\n    params,\n  });\n}\n\n/**\n * 获取店铺基本信息\n * @param storeId\n */\n export function getStoreBaseInfo(storeId) {\n  return http.request({\n    url: `/store/store/get/detail/${storeId}`,\n    method: Method.GET,\n    loading: false,\n  });\n}\n\n/**\n * 获取店铺分类\n * @param id\n */\n export function getStoreCategory(id) {\n  return http.request({\n    url: `/store/store/label/get/${id}`,\n    method: Method.GET,\n  });\n}\n\n\n/**\n * 营业执照\n * @param id\n */\n export function getLicencePhoto(id) {\n  return http.request({\n    url: `/store/store/get/licencePhoto/${id}`,\n    method: Method.GET,\n  });\n}\n\n\n/**\n * 获取自提点信息\n * @param id\n */\n export function getStoreAddress(storeId,params) {\n  return http.request({\n    url: `/store/address/page/${storeId}`,\n    method: Method.GET,\n    params\n  });\n}\n\n\n\n"
  },
  {
    "path": "api/trade.js",
    "content": "/**\n * 交♂易相关API\n */\n\nimport { http, Method } from \"@/utils/request.js\";\n\n/**\n * 获取购物车列表\n * @param show_type 要显示的类型 all：全部 checked：已选中的\n */\nexport function getCarts() {\n  return http.request({\n    url: `/trade/carts/all`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n  });\n}\n\n/**\n * 获取购物车总数\n * @param show_type 要显示的类型 all：全部 checked：已选中的\n */\nexport function getCartNum() {\n  return http.request({\n    url: `/trade/carts/count`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n  });\n}\n\n/**\n * 获取购物车可用优惠券数量\n * @param way 购物车购买：CART/立即购买：BUY_NOW/拼团购买：PINTUAN / 积分购买：POINT\n */\nexport function getCartCouponNum(way) {\n  return http.request({\n    url: `/trade/carts/coupon/num?way=${way}`,\n    method: Method.GET,\n    needToken: true,\n    loading: false,\n  });\n}\n\n/**\n * 添加货品到购物车\n * @param skuId      产品ID\n * @param num         产品的购买数量\n * @param cartType   \t购物车类型，默认加入购物车\n */\nexport function addToCart(data) {\n  return http.request({\n    url: \"/trade/carts\",\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data,\n  });\n}\n\n\n\n/**\n * 更新购物车商品数量\n * @param skuId\n * @param num\n */\nexport function updateSkuNum(skuId, num = 1) {\n  return http.request({\n    url: `/trade/carts/sku/num/${skuId}`,\n    method: Method.POST,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    needToken: true,\n    data: { num },\n  });\n}\n\n/**\n * 更新购物车货品选中状态\n * @param skuId\n * @param checked\n */\nexport function updateSkuChecked(skuId, checked) {\n  return http.request({\n    url: `/trade/carts/sku/checked/${skuId}`,\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: { checked },\n  });\n}\n\n/**\n * 删除多个货品项\n * @param skuIds\n */\nexport function deleteSkuItem(skuIds) {\n  return http.request({\n    url: `/trade/carts/sku/remove?skuIds=${skuIds}`,\n    method: Method.DELETE,\n    needToken: true,\n  });\n}\n\n\n/**\n * 设置全部货品为选中或不选中\n * @param checked\n */\nexport function checkAll(checked) {\n  return http.request({\n    url: \"/trade/carts/sku/checked\",\n    method: Method.POST,\n    needToken: true,\n    params: { checked },\n  });\n}\n\n/**\n * 设置店铺内全部货品选中状态\n * @param storeId\n * @param checked\n */\nexport function checkStore(storeId, checked) {\n  return http.request({\n    url: `/trade/carts/store/${storeId}`,\n    method: Method.POST,\n    needToken: true,\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n    data: { checked },\n  });\n}\n\n/**\n * 获取结算参数\n */\nexport function getCheckoutParams(way) {\n  return http.request({\n    url: \"/trade/carts/checked?way=\" + way,\n    method: Method.GET,\n    needToken: true,\n  });\n}\n\n/**\n * 设置收货地址ID\n * @param addressId\n */\nexport function setAddressId(addressId,way) {\n  return http.request({\n    url: `/trade/carts/shippingAddress?shippingAddressId=${addressId}&way=${way}`,\n    method: Method.GET,\n    needToken: true,\n  \n  });\n}\n/**\n * 设置收货地址ID\n * @param addressId\n */\n export function setStoreAddressId(storeAddressId,way) {\n  return http.request({\n    url: `/trade/carts/storeAddress?storeAddressId=${storeAddressId}&way=${way}`,\n    method: Method.GET,\n    needToken: true,\n  \n  });\n}\n\n\n/**\n * 创建交易\n */\nexport function createTrade(params) {\n  return http.request({\n    url: \"/trade/carts/create/trade\",\n    method: Method.POST,\n    needToken: true,\n    message: false,\n    data:params,\n  });\n}\n\n\n/**\n * 根据交易编号或订单编号查询收银台数据\n * @param params\n */\nexport function getCashierData(params) {\n  return http.request({\n    url: \"payment/cashier/tradeDetail\",\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n\n\n/**\n * 发起支付\n * @param paymentMethod\n * @param paymentClient\n * @param params\n * @returns {*|*}\n */\nexport function initiatePay(paymentMethod, paymentClient, params) {\n  return http.request({\n    url: `payment/cashier/pay/${paymentMethod}/${paymentClient}`,\n    method: Method.GET,\n    needToken: true,\n    params,\n  });\n}\n  \n\n/**\n * 查询物流\n * @param orderSn\n\n */\nexport function getExpress(orderSn) {\n  return http.request({\n    url: `/order/order/getTraces/${orderSn}`,\n    method: Method.POST,\n    needToken: true,\n   \n  });\n}\n\n\n/**\n * 获取当前会员的对于当前商品可使用的优惠券列表\n */\n export function getMemberCanUse(data) {\n  return http.request({\n    url: `/promotion/coupon/canUse`,\n    method: Method.GET,\n    params: data,\n  });\n}\n\n\n\n/**\n * 获取当前会员的优惠券列表\n */\nexport function getMemberCouponList(data) {\n  return http.request({\n    url: `/promotion/coupon/getCoupons`,\n    method: Method.GET,\n    params: data,\n  });\n}\n\n/**\n * 使用优惠券\n\n */\nexport function useCoupon(params) {\n  return http.request({\n    url: `/trade/carts/select/coupon`,\n    method: Method.GET,\n    needToken: true,\n    params: params,\n  });\n}\n\n\n/**\n * 更换参与活动\n * @param params\n */\nexport function changeActivity(params) {\n  return http.request({\n    url: \"trade/promotion\",\n    method: Method.POST,\n    needToken: true,\n    data: params,\n\n    header: { \"content-type\": \"application/x-www-form-urlencoded\" },\n  });\n}\n\n/**\n * 根据交易单号查询订单列表\n * @param trade_sn\n */\nexport function reBuy(sn) {\n  return http.request({\n    url: `trade/carts/rebuy/${sn}`,\n    method: Method.POST,\n    needToken: true,\n  });\n}\n\n\n/**\n * 获取全部配送方式\n */\n export function shippingMethodList(params) {\n  return http.request({\n    url: `/trade/carts/shippingMethodList`,\n    method: Method.GET,\n    needToken: true,\n    params: params,\n  });\n}\n\n/**\n * 提交配送方式\n * @param params\n */\n export function setShipMethod(params) {\n  return http.request({\n    url: \"/trade/carts/shippingMethod\",\n    method: Method.PUT,\n    needToken: true,\n    params,\n  });\n}\n\n// 查看包裹列表\nexport function getPackage(orderSn) {\n  return http.request({\n    url: `/order/order/getPackage/${orderSn}`,\n    method: Method.GET,\n    needToken: true,\n  });\n}"
  },
  {
    "path": "components/Sansnn-uQRCode/uqrcode.js",
    "content": "// uqrcode.js 复制直接用\n//---------------------------------------------------------------------\n// github https://github.com/Sansnn/uQRCode\n//---------------------------------------------------------------------\n \nlet uQRCode = {};\n \n(function() {\n\t//---------------------------------------------------------------------\n\t// QRCode for JavaScript\n\t//\n\t// Copyright (c) 2009 Kazuhiko Arase\n\t//\n\t// URL: http://www.d-project.com/\n\t//\n\t// Licensed under the MIT license:\n\t//   http://www.opensource.org/licenses/mit-license.php\n\t//\n\t// The word \"QR Code\" is registered trademark of \n\t// DENSO WAVE INCORPORATED\n\t//   http://www.denso-wave.com/qrcode/faqpatent-e.html\n\t//\n\t//---------------------------------------------------------------------\n \n\t//---------------------------------------------------------------------\n\t// QR8bitByte\n\t//---------------------------------------------------------------------\n \n\tfunction QR8bitByte(data) {\n\t\tthis.mode = QRMode.MODE_8BIT_BYTE;\n\t\tthis.data = data;\n\t}\n \n\tQR8bitByte.prototype = {\n \n\t\tgetLength: function(buffer) {\n\t\t\treturn this.data.length;\n\t\t},\n \n\t\twrite: function(buffer) {\n\t\t\tfor (var i = 0; i < this.data.length; i++) {\n\t\t\t\t// not JIS ...\n\t\t\t\tbuffer.put(this.data.charCodeAt(i), 8);\n\t\t\t}\n\t\t}\n\t};\n \n\t//---------------------------------------------------------------------\n\t// QRCode\n\t//---------------------------------------------------------------------\n \n\tfunction QRCode(typeNumber, errorCorrectLevel) {\n\t\tthis.typeNumber = typeNumber;\n\t\tthis.errorCorrectLevel = errorCorrectLevel;\n\t\tthis.modules = null;\n\t\tthis.moduleCount = 0;\n\t\tthis.dataCache = null;\n\t\tthis.dataList = new Array();\n\t}\n \n\tQRCode.prototype = {\n \n\t\taddData: function(data) {\n\t\t\tvar newData = new QR8bitByte(data);\n\t\t\tthis.dataList.push(newData);\n\t\t\tthis.dataCache = null;\n\t\t},\n \n\t\tisDark: function(row, col) {\n\t\t\tif (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {\n\t\t\t\tthrow new Error(row + \",\" + col);\n\t\t\t}\n\t\t\treturn this.modules[row][col];\n\t\t},\n \n\t\tgetModuleCount: function() {\n\t\t\treturn this.moduleCount;\n\t\t},\n \n\t\tmake: function() {\n\t\t\t// Calculate automatically typeNumber if provided is < 1\n\t\t\tif (this.typeNumber < 1) {\n\t\t\t\tvar typeNumber = 1;\n\t\t\t\tfor (typeNumber = 1; typeNumber < 40; typeNumber++) {\n\t\t\t\t\tvar rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);\n \n\t\t\t\t\tvar buffer = new QRBitBuffer();\n\t\t\t\t\tvar totalDataCount = 0;\n\t\t\t\t\tfor (var i = 0; i < rsBlocks.length; i++) {\n\t\t\t\t\t\ttotalDataCount += rsBlocks[i].dataCount;\n\t\t\t\t\t}\n \n\t\t\t\t\tfor (var i = 0; i < this.dataList.length; i++) {\n\t\t\t\t\t\tvar data = this.dataList[i];\n\t\t\t\t\t\tbuffer.put(data.mode, 4);\n\t\t\t\t\t\tbuffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));\n\t\t\t\t\t\tdata.write(buffer);\n\t\t\t\t\t}\n\t\t\t\t\tif (buffer.getLengthInBits() <= totalDataCount * 8)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis.typeNumber = typeNumber;\n\t\t\t}\n\t\t\tthis.makeImpl(false, this.getBestMaskPattern());\n\t\t},\n \n\t\tmakeImpl: function(test, maskPattern) {\n \n\t\t\tthis.moduleCount = this.typeNumber * 4 + 17;\n\t\t\tthis.modules = new Array(this.moduleCount);\n \n\t\t\tfor (var row = 0; row < this.moduleCount; row++) {\n \n\t\t\t\tthis.modules[row] = new Array(this.moduleCount);\n \n\t\t\t\tfor (var col = 0; col < this.moduleCount; col++) {\n\t\t\t\t\tthis.modules[row][col] = null; //(col + row) % 3;\n\t\t\t\t}\n\t\t\t}\n \n\t\t\tthis.setupPositionProbePattern(0, 0);\n\t\t\tthis.setupPositionProbePattern(this.moduleCount - 7, 0);\n\t\t\tthis.setupPositionProbePattern(0, this.moduleCount - 7);\n\t\t\tthis.setupPositionAdjustPattern();\n\t\t\tthis.setupTimingPattern();\n\t\t\tthis.setupTypeInfo(test, maskPattern);\n \n\t\t\tif (this.typeNumber >= 7) {\n\t\t\t\tthis.setupTypeNumber(test);\n\t\t\t}\n \n\t\t\tif (this.dataCache == null) {\n\t\t\t\tthis.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);\n\t\t\t}\n \n\t\t\tthis.mapData(this.dataCache, maskPattern);\n\t\t},\n \n\t\tsetupPositionProbePattern: function(row, col) {\n \n\t\t\tfor (var r = -1; r <= 7; r++) {\n \n\t\t\t\tif (row + r <= -1 || this.moduleCount <= row + r) continue;\n \n\t\t\t\tfor (var c = -1; c <= 7; c++) {\n \n\t\t\t\t\tif (col + c <= -1 || this.moduleCount <= col + c) continue;\n \n\t\t\t\t\tif ((0 <= r && r <= 6 && (c == 0 || c == 6)) ||\n\t\t\t\t\t\t(0 <= c && c <= 6 && (r == 0 || r == 6)) ||\n\t\t\t\t\t\t(2 <= r && r <= 4 && 2 <= c && c <= 4)) {\n\t\t\t\t\t\tthis.modules[row + r][col + c] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.modules[row + r][col + c] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n \n\t\tgetBestMaskPattern: function() {\n \n\t\t\tvar minLostPoint = 0;\n\t\t\tvar pattern = 0;\n \n\t\t\tfor (var i = 0; i < 8; i++) {\n \n\t\t\t\tthis.makeImpl(true, i);\n \n\t\t\t\tvar lostPoint = QRUtil.getLostPoint(this);\n \n\t\t\t\tif (i == 0 || minLostPoint > lostPoint) {\n\t\t\t\t\tminLostPoint = lostPoint;\n\t\t\t\t\tpattern = i;\n\t\t\t\t}\n\t\t\t}\n \n\t\t\treturn pattern;\n\t\t},\n \n\t\tcreateMovieClip: function(target_mc, instance_name, depth) {\n \n\t\t\tvar qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);\n\t\t\tvar cs = 1;\n \n\t\t\tthis.make();\n \n\t\t\tfor (var row = 0; row < this.modules.length; row++) {\n \n\t\t\t\tvar y = row * cs;\n \n\t\t\t\tfor (var col = 0; col < this.modules[row].length; col++) {\n \n\t\t\t\t\tvar x = col * cs;\n\t\t\t\t\tvar dark = this.modules[row][col];\n \n\t\t\t\t\tif (dark) {\n\t\t\t\t\t\tqr_mc.beginFill(0, 100);\n\t\t\t\t\t\tqr_mc.moveTo(x, y);\n\t\t\t\t\t\tqr_mc.lineTo(x + cs, y);\n\t\t\t\t\t\tqr_mc.lineTo(x + cs, y + cs);\n\t\t\t\t\t\tqr_mc.lineTo(x, y + cs);\n\t\t\t\t\t\tqr_mc.endFill();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t\treturn qr_mc;\n\t\t},\n \n\t\tsetupTimingPattern: function() {\n \n\t\t\tfor (var r = 8; r < this.moduleCount - 8; r++) {\n\t\t\t\tif (this.modules[r][6] != null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.modules[r][6] = (r % 2 == 0);\n\t\t\t}\n \n\t\t\tfor (var c = 8; c < this.moduleCount - 8; c++) {\n\t\t\t\tif (this.modules[6][c] != null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.modules[6][c] = (c % 2 == 0);\n\t\t\t}\n\t\t},\n \n\t\tsetupPositionAdjustPattern: function() {\n \n\t\t\tvar pos = QRUtil.getPatternPosition(this.typeNumber);\n \n\t\t\tfor (var i = 0; i < pos.length; i++) {\n \n\t\t\t\tfor (var j = 0; j < pos.length; j++) {\n \n\t\t\t\t\tvar row = pos[i];\n\t\t\t\t\tvar col = pos[j];\n \n\t\t\t\t\tif (this.modules[row][col] != null) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n \n\t\t\t\t\tfor (var r = -2; r <= 2; r++) {\n \n\t\t\t\t\t\tfor (var c = -2; c <= 2; c++) {\n \n\t\t\t\t\t\t\tif (r == -2 || r == 2 || c == -2 || c == 2 ||\n\t\t\t\t\t\t\t\t(r == 0 && c == 0)) {\n\t\t\t\t\t\t\t\tthis.modules[row + r][col + c] = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.modules[row + r][col + c] = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n \n\t\tsetupTypeNumber: function(test) {\n \n\t\t\tvar bits = QRUtil.getBCHTypeNumber(this.typeNumber);\n \n\t\t\tfor (var i = 0; i < 18; i++) {\n\t\t\t\tvar mod = (!test && ((bits >> i) & 1) == 1);\n\t\t\t\tthis.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;\n\t\t\t}\n \n\t\t\tfor (var i = 0; i < 18; i++) {\n\t\t\t\tvar mod = (!test && ((bits >> i) & 1) == 1);\n\t\t\t\tthis.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;\n\t\t\t}\n\t\t},\n \n\t\tsetupTypeInfo: function(test, maskPattern) {\n \n\t\t\tvar data = (this.errorCorrectLevel << 3) | maskPattern;\n\t\t\tvar bits = QRUtil.getBCHTypeInfo(data);\n \n\t\t\t// vertical\t\t\n\t\t\tfor (var i = 0; i < 15; i++) {\n \n\t\t\t\tvar mod = (!test && ((bits >> i) & 1) == 1);\n\t\t\t\tif (i < 6) {\n\t\t\t\t\tthis.modules[i][8] = mod;\n\t\t\t\t} else if (i < 8) {\n\t\t\t\t\tthis.modules[i + 1][8] = mod;\n\t\t\t\t} else {\n\t\t\t\t\tthis.modules[this.moduleCount - 15 + i][8] = mod;\n\t\t\t\t}\n\t\t\t}\n \n\t\t\t// horizontal\n\t\t\tfor (var i = 0; i < 15; i++) {\n \n\t\t\t\tvar mod = (!test && ((bits >> i) & 1) == 1);\n\t\t\t\tif (i < 8) {\n\t\t\t\t\tthis.modules[8][this.moduleCount - i - 1] = mod;\n\t\t\t\t} else if (i < 9) {\n\t\t\t\t\tthis.modules[8][15 - i - 1 + 1] = mod;\n\t\t\t\t} else {\n\t\t\t\t\tthis.modules[8][15 - i - 1] = mod;\n\t\t\t\t}\n\t\t\t}\n \n\t\t\t// fixed module\n\t\t\tthis.modules[this.moduleCount - 8][8] = (!test);\n \n\t\t},\n \n\t\tmapData: function(data, maskPattern) {\n \n\t\t\tvar inc = -1;\n\t\t\tvar row = this.moduleCount - 1;\n\t\t\tvar bitIndex = 7;\n\t\t\tvar byteIndex = 0;\n \n\t\t\tfor (var col = this.moduleCount - 1; col > 0; col -= 2) {\n \n\t\t\t\tif (col == 6) col--;\n \n\t\t\t\twhile (true) {\n \n\t\t\t\t\tfor (var c = 0; c < 2; c++) {\n \n\t\t\t\t\t\tif (this.modules[row][col - c] == null) {\n \n\t\t\t\t\t\t\tvar dark = false;\n \n\t\t\t\t\t\t\tif (byteIndex < data.length) {\n\t\t\t\t\t\t\t\tdark = (((data[byteIndex] >>> bitIndex) & 1) == 1);\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tvar mask = QRUtil.getMask(maskPattern, row, col - c);\n \n\t\t\t\t\t\t\tif (mask) {\n\t\t\t\t\t\t\t\tdark = !dark;\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tthis.modules[row][col - c] = dark;\n\t\t\t\t\t\t\tbitIndex--;\n \n\t\t\t\t\t\t\tif (bitIndex == -1) {\n\t\t\t\t\t\t\t\tbyteIndex++;\n\t\t\t\t\t\t\t\tbitIndex = 7;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n \n\t\t\t\t\trow += inc;\n \n\t\t\t\t\tif (row < 0 || this.moduleCount <= row) {\n\t\t\t\t\t\trow -= inc;\n\t\t\t\t\t\tinc = -inc;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t}\n \n\t};\n \n\tQRCode.PAD0 = 0xEC;\n\tQRCode.PAD1 = 0x11;\n \n\tQRCode.createData = function(typeNumber, errorCorrectLevel, dataList) {\n \n\t\tvar rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);\n \n\t\tvar buffer = new QRBitBuffer();\n \n\t\tfor (var i = 0; i < dataList.length; i++) {\n\t\t\tvar data = dataList[i];\n\t\t\tbuffer.put(data.mode, 4);\n\t\t\tbuffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));\n\t\t\tdata.write(buffer);\n\t\t}\n \n\t\t// calc num max data.\n\t\tvar totalDataCount = 0;\n\t\tfor (var i = 0; i < rsBlocks.length; i++) {\n\t\t\ttotalDataCount += rsBlocks[i].dataCount;\n\t\t}\n \n\t\tif (buffer.getLengthInBits() > totalDataCount * 8) {\n\t\t\tthrow new Error(\"code length overflow. (\" +\n\t\t\t\tbuffer.getLengthInBits() +\n\t\t\t\t\">\" +\n\t\t\t\ttotalDataCount * 8 +\n\t\t\t\t\")\");\n\t\t}\n \n\t\t// end code\n\t\tif (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {\n\t\t\tbuffer.put(0, 4);\n\t\t}\n \n\t\t// padding\n\t\twhile (buffer.getLengthInBits() % 8 != 0) {\n\t\t\tbuffer.putBit(false);\n\t\t}\n \n\t\t// padding\n\t\twhile (true) {\n \n\t\t\tif (buffer.getLengthInBits() >= totalDataCount * 8) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbuffer.put(QRCode.PAD0, 8);\n \n\t\t\tif (buffer.getLengthInBits() >= totalDataCount * 8) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbuffer.put(QRCode.PAD1, 8);\n\t\t}\n \n\t\treturn QRCode.createBytes(buffer, rsBlocks);\n\t}\n \n\tQRCode.createBytes = function(buffer, rsBlocks) {\n \n\t\tvar offset = 0;\n \n\t\tvar maxDcCount = 0;\n\t\tvar maxEcCount = 0;\n \n\t\tvar dcdata = new Array(rsBlocks.length);\n\t\tvar ecdata = new Array(rsBlocks.length);\n \n\t\tfor (var r = 0; r < rsBlocks.length; r++) {\n \n\t\t\tvar dcCount = rsBlocks[r].dataCount;\n\t\t\tvar ecCount = rsBlocks[r].totalCount - dcCount;\n \n\t\t\tmaxDcCount = Math.max(maxDcCount, dcCount);\n\t\t\tmaxEcCount = Math.max(maxEcCount, ecCount);\n \n\t\t\tdcdata[r] = new Array(dcCount);\n \n\t\t\tfor (var i = 0; i < dcdata[r].length; i++) {\n\t\t\t\tdcdata[r][i] = 0xff & buffer.buffer[i + offset];\n\t\t\t}\n\t\t\toffset += dcCount;\n \n\t\t\tvar rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);\n\t\t\tvar rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);\n \n\t\t\tvar modPoly = rawPoly.mod(rsPoly);\n\t\t\tecdata[r] = new Array(rsPoly.getLength() - 1);\n\t\t\tfor (var i = 0; i < ecdata[r].length; i++) {\n\t\t\t\tvar modIndex = i + modPoly.getLength() - ecdata[r].length;\n\t\t\t\tecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;\n\t\t\t}\n \n\t\t}\n \n\t\tvar totalCodeCount = 0;\n\t\tfor (var i = 0; i < rsBlocks.length; i++) {\n\t\t\ttotalCodeCount += rsBlocks[i].totalCount;\n\t\t}\n \n\t\tvar data = new Array(totalCodeCount);\n\t\tvar index = 0;\n \n\t\tfor (var i = 0; i < maxDcCount; i++) {\n\t\t\tfor (var r = 0; r < rsBlocks.length; r++) {\n\t\t\t\tif (i < dcdata[r].length) {\n\t\t\t\t\tdata[index++] = dcdata[r][i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n \n\t\tfor (var i = 0; i < maxEcCount; i++) {\n\t\t\tfor (var r = 0; r < rsBlocks.length; r++) {\n\t\t\t\tif (i < ecdata[r].length) {\n\t\t\t\t\tdata[index++] = ecdata[r][i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n \n\t\treturn data;\n \n\t}\n \n\t//---------------------------------------------------------------------\n\t// QRMode\n\t//---------------------------------------------------------------------\n \n\tvar QRMode = {\n\t\tMODE_NUMBER: 1 << 0,\n\t\tMODE_ALPHA_NUM: 1 << 1,\n\t\tMODE_8BIT_BYTE: 1 << 2,\n\t\tMODE_KANJI: 1 << 3\n\t};\n \n\t//---------------------------------------------------------------------\n\t// QRErrorCorrectLevel\n\t//---------------------------------------------------------------------\n \n\tvar QRErrorCorrectLevel = {\n\t\tL: 1,\n\t\tM: 0,\n\t\tQ: 3,\n\t\tH: 2\n\t};\n \n\t//---------------------------------------------------------------------\n\t// QRMaskPattern\n\t//---------------------------------------------------------------------\n \n\tvar QRMaskPattern = {\n\t\tPATTERN000: 0,\n\t\tPATTERN001: 1,\n\t\tPATTERN010: 2,\n\t\tPATTERN011: 3,\n\t\tPATTERN100: 4,\n\t\tPATTERN101: 5,\n\t\tPATTERN110: 6,\n\t\tPATTERN111: 7\n\t};\n \n\t//---------------------------------------------------------------------\n\t// QRUtil\n\t//---------------------------------------------------------------------\n \n\tvar QRUtil = {\n \n\t\tPATTERN_POSITION_TABLE: [\n\t\t\t[],\n\t\t\t[6, 18],\n\t\t\t[6, 22],\n\t\t\t[6, 26],\n\t\t\t[6, 30],\n\t\t\t[6, 34],\n\t\t\t[6, 22, 38],\n\t\t\t[6, 24, 42],\n\t\t\t[6, 26, 46],\n\t\t\t[6, 28, 50],\n\t\t\t[6, 30, 54],\n\t\t\t[6, 32, 58],\n\t\t\t[6, 34, 62],\n\t\t\t[6, 26, 46, 66],\n\t\t\t[6, 26, 48, 70],\n\t\t\t[6, 26, 50, 74],\n\t\t\t[6, 30, 54, 78],\n\t\t\t[6, 30, 56, 82],\n\t\t\t[6, 30, 58, 86],\n\t\t\t[6, 34, 62, 90],\n\t\t\t[6, 28, 50, 72, 94],\n\t\t\t[6, 26, 50, 74, 98],\n\t\t\t[6, 30, 54, 78, 102],\n\t\t\t[6, 28, 54, 80, 106],\n\t\t\t[6, 32, 58, 84, 110],\n\t\t\t[6, 30, 58, 86, 114],\n\t\t\t[6, 34, 62, 90, 118],\n\t\t\t[6, 26, 50, 74, 98, 122],\n\t\t\t[6, 30, 54, 78, 102, 126],\n\t\t\t[6, 26, 52, 78, 104, 130],\n\t\t\t[6, 30, 56, 82, 108, 134],\n\t\t\t[6, 34, 60, 86, 112, 138],\n\t\t\t[6, 30, 58, 86, 114, 142],\n\t\t\t[6, 34, 62, 90, 118, 146],\n\t\t\t[6, 30, 54, 78, 102, 126, 150],\n\t\t\t[6, 24, 50, 76, 102, 128, 154],\n\t\t\t[6, 28, 54, 80, 106, 132, 158],\n\t\t\t[6, 32, 58, 84, 110, 136, 162],\n\t\t\t[6, 26, 54, 82, 110, 138, 166],\n\t\t\t[6, 30, 58, 86, 114, 142, 170]\n\t\t],\n \n\t\tG15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),\n\t\tG18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),\n\t\tG15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),\n \n\t\tgetBCHTypeInfo: function(data) {\n\t\t\tvar d = data << 10;\n\t\t\twhile (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {\n\t\t\t\td ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));\n\t\t\t}\n\t\t\treturn ((data << 10) | d) ^ QRUtil.G15_MASK;\n\t\t},\n \n\t\tgetBCHTypeNumber: function(data) {\n\t\t\tvar d = data << 12;\n\t\t\twhile (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {\n\t\t\t\td ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));\n\t\t\t}\n\t\t\treturn (data << 12) | d;\n\t\t},\n \n\t\tgetBCHDigit: function(data) {\n \n\t\t\tvar digit = 0;\n \n\t\t\twhile (data != 0) {\n\t\t\t\tdigit++;\n\t\t\t\tdata >>>= 1;\n\t\t\t}\n \n\t\t\treturn digit;\n\t\t},\n \n\t\tgetPatternPosition: function(typeNumber) {\n\t\t\treturn QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];\n\t\t},\n \n\t\tgetMask: function(maskPattern, i, j) {\n \n\t\t\tswitch (maskPattern) {\n \n\t\t\t\tcase QRMaskPattern.PATTERN000:\n\t\t\t\t\treturn (i + j) % 2 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN001:\n\t\t\t\t\treturn i % 2 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN010:\n\t\t\t\t\treturn j % 3 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN011:\n\t\t\t\t\treturn (i + j) % 3 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN100:\n\t\t\t\t\treturn (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN101:\n\t\t\t\t\treturn (i * j) % 2 + (i * j) % 3 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN110:\n\t\t\t\t\treturn ((i * j) % 2 + (i * j) % 3) % 2 == 0;\n\t\t\t\tcase QRMaskPattern.PATTERN111:\n\t\t\t\t\treturn ((i * j) % 3 + (i + j) % 2) % 2 == 0;\n \n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"bad maskPattern:\" + maskPattern);\n\t\t\t}\n\t\t},\n \n\t\tgetErrorCorrectPolynomial: function(errorCorrectLength) {\n \n\t\t\tvar a = new QRPolynomial([1], 0);\n \n\t\t\tfor (var i = 0; i < errorCorrectLength; i++) {\n\t\t\t\ta = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));\n\t\t\t}\n \n\t\t\treturn a;\n\t\t},\n \n\t\tgetLengthInBits: function(mode, type) {\n \n\t\t\tif (1 <= type && type < 10) {\n \n\t\t\t\t// 1 - 9\n \n\t\t\t\tswitch (mode) {\n\t\t\t\t\tcase QRMode.MODE_NUMBER:\n\t\t\t\t\t\treturn 10;\n\t\t\t\t\tcase QRMode.MODE_ALPHA_NUM:\n\t\t\t\t\t\treturn 9;\n\t\t\t\t\tcase QRMode.MODE_8BIT_BYTE:\n\t\t\t\t\t\treturn 8;\n\t\t\t\t\tcase QRMode.MODE_KANJI:\n\t\t\t\t\t\treturn 8;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error(\"mode:\" + mode);\n\t\t\t\t}\n \n\t\t\t} else if (type < 27) {\n \n\t\t\t\t// 10 - 26\n \n\t\t\t\tswitch (mode) {\n\t\t\t\t\tcase QRMode.MODE_NUMBER:\n\t\t\t\t\t\treturn 12;\n\t\t\t\t\tcase QRMode.MODE_ALPHA_NUM:\n\t\t\t\t\t\treturn 11;\n\t\t\t\t\tcase QRMode.MODE_8BIT_BYTE:\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\tcase QRMode.MODE_KANJI:\n\t\t\t\t\t\treturn 10;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error(\"mode:\" + mode);\n\t\t\t\t}\n \n\t\t\t} else if (type < 41) {\n \n\t\t\t\t// 27 - 40\n \n\t\t\t\tswitch (mode) {\n\t\t\t\t\tcase QRMode.MODE_NUMBER:\n\t\t\t\t\t\treturn 14;\n\t\t\t\t\tcase QRMode.MODE_ALPHA_NUM:\n\t\t\t\t\t\treturn 13;\n\t\t\t\t\tcase QRMode.MODE_8BIT_BYTE:\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\tcase QRMode.MODE_KANJI:\n\t\t\t\t\t\treturn 12;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error(\"mode:\" + mode);\n\t\t\t\t}\n \n\t\t\t} else {\n\t\t\t\tthrow new Error(\"type:\" + type);\n\t\t\t}\n\t\t},\n \n\t\tgetLostPoint: function(qrCode) {\n \n\t\t\tvar moduleCount = qrCode.getModuleCount();\n \n\t\t\tvar lostPoint = 0;\n \n\t\t\t// LEVEL1\n \n\t\t\tfor (var row = 0; row < moduleCount; row++) {\n \n\t\t\t\tfor (var col = 0; col < moduleCount; col++) {\n \n\t\t\t\t\tvar sameCount = 0;\n\t\t\t\t\tvar dark = qrCode.isDark(row, col);\n \n\t\t\t\t\tfor (var r = -1; r <= 1; r++) {\n \n\t\t\t\t\t\tif (row + r < 0 || moduleCount <= row + r) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n \n\t\t\t\t\t\tfor (var c = -1; c <= 1; c++) {\n \n\t\t\t\t\t\t\tif (col + c < 0 || moduleCount <= col + c) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (r == 0 && c == 0) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (dark == qrCode.isDark(row + r, col + c)) {\n\t\t\t\t\t\t\t\tsameCount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n \n\t\t\t\t\tif (sameCount > 5) {\n\t\t\t\t\t\tlostPoint += (3 + sameCount - 5);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t\t// LEVEL2\n \n\t\t\tfor (var row = 0; row < moduleCount - 1; row++) {\n\t\t\t\tfor (var col = 0; col < moduleCount - 1; col++) {\n\t\t\t\t\tvar count = 0;\n\t\t\t\t\tif (qrCode.isDark(row, col)) count++;\n\t\t\t\t\tif (qrCode.isDark(row + 1, col)) count++;\n\t\t\t\t\tif (qrCode.isDark(row, col + 1)) count++;\n\t\t\t\t\tif (qrCode.isDark(row + 1, col + 1)) count++;\n\t\t\t\t\tif (count == 0 || count == 4) {\n\t\t\t\t\t\tlostPoint += 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t\t// LEVEL3\n \n\t\t\tfor (var row = 0; row < moduleCount; row++) {\n\t\t\t\tfor (var col = 0; col < moduleCount - 6; col++) {\n\t\t\t\t\tif (qrCode.isDark(row, col) &&\n\t\t\t\t\t\t!qrCode.isDark(row, col + 1) &&\n\t\t\t\t\t\tqrCode.isDark(row, col + 2) &&\n\t\t\t\t\t\tqrCode.isDark(row, col + 3) &&\n\t\t\t\t\t\tqrCode.isDark(row, col + 4) &&\n\t\t\t\t\t\t!qrCode.isDark(row, col + 5) &&\n\t\t\t\t\t\tqrCode.isDark(row, col + 6)) {\n\t\t\t\t\t\tlostPoint += 40;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t\tfor (var col = 0; col < moduleCount; col++) {\n\t\t\t\tfor (var row = 0; row < moduleCount - 6; row++) {\n\t\t\t\t\tif (qrCode.isDark(row, col) &&\n\t\t\t\t\t\t!qrCode.isDark(row + 1, col) &&\n\t\t\t\t\t\tqrCode.isDark(row + 2, col) &&\n\t\t\t\t\t\tqrCode.isDark(row + 3, col) &&\n\t\t\t\t\t\tqrCode.isDark(row + 4, col) &&\n\t\t\t\t\t\t!qrCode.isDark(row + 5, col) &&\n\t\t\t\t\t\tqrCode.isDark(row + 6, col)) {\n\t\t\t\t\t\tlostPoint += 40;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t\t// LEVEL4\n \n\t\t\tvar darkCount = 0;\n \n\t\t\tfor (var col = 0; col < moduleCount; col++) {\n\t\t\t\tfor (var row = 0; row < moduleCount; row++) {\n\t\t\t\t\tif (qrCode.isDark(row, col)) {\n\t\t\t\t\t\tdarkCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n \n\t\t\tvar ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;\n\t\t\tlostPoint += ratio * 10;\n \n\t\t\treturn lostPoint;\n\t\t}\n \n\t};\n \n \n\t//---------------------------------------------------------------------\n\t// QRMath\n\t//---------------------------------------------------------------------\n \n\tvar QRMath = {\n \n\t\tglog: function(n) {\n \n\t\t\tif (n < 1) {\n\t\t\t\tthrow new Error(\"glog(\" + n + \")\");\n\t\t\t}\n \n\t\t\treturn QRMath.LOG_TABLE[n];\n\t\t},\n \n\t\tgexp: function(n) {\n \n\t\t\twhile (n < 0) {\n\t\t\t\tn += 255;\n\t\t\t}\n \n\t\t\twhile (n >= 256) {\n\t\t\t\tn -= 255;\n\t\t\t}\n \n\t\t\treturn QRMath.EXP_TABLE[n];\n\t\t},\n \n\t\tEXP_TABLE: new Array(256),\n \n\t\tLOG_TABLE: new Array(256)\n \n\t};\n \n\tfor (var i = 0; i < 8; i++) {\n\t\tQRMath.EXP_TABLE[i] = 1 << i;\n\t}\n\tfor (var i = 8; i < 256; i++) {\n\t\tQRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^\n\t\t\tQRMath.EXP_TABLE[i - 5] ^\n\t\t\tQRMath.EXP_TABLE[i - 6] ^\n\t\t\tQRMath.EXP_TABLE[i - 8];\n\t}\n\tfor (var i = 0; i < 255; i++) {\n\t\tQRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;\n\t}\n \n\t//---------------------------------------------------------------------\n\t// QRPolynomial\n\t//---------------------------------------------------------------------\n \n\tfunction QRPolynomial(num, shift) {\n \n\t\tif (num.length == undefined) {\n\t\t\tthrow new Error(num.length + \"/\" + shift);\n\t\t}\n \n\t\tvar offset = 0;\n \n\t\twhile (offset < num.length && num[offset] == 0) {\n\t\t\toffset++;\n\t\t}\n \n\t\tthis.num = new Array(num.length - offset + shift);\n\t\tfor (var i = 0; i < num.length - offset; i++) {\n\t\t\tthis.num[i] = num[i + offset];\n\t\t}\n\t}\n \n\tQRPolynomial.prototype = {\n \n\t\tget: function(index) {\n\t\t\treturn this.num[index];\n\t\t},\n \n\t\tgetLength: function() {\n\t\t\treturn this.num.length;\n\t\t},\n \n\t\tmultiply: function(e) {\n \n\t\t\tvar num = new Array(this.getLength() + e.getLength() - 1);\n \n\t\t\tfor (var i = 0; i < this.getLength(); i++) {\n\t\t\t\tfor (var j = 0; j < e.getLength(); j++) {\n\t\t\t\t\tnum[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));\n\t\t\t\t}\n\t\t\t}\n \n\t\t\treturn new QRPolynomial(num, 0);\n\t\t},\n \n\t\tmod: function(e) {\n \n\t\t\tif (this.getLength() - e.getLength() < 0) {\n\t\t\t\treturn this;\n\t\t\t}\n \n\t\t\tvar ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));\n \n\t\t\tvar num = new Array(this.getLength());\n \n\t\t\tfor (var i = 0; i < this.getLength(); i++) {\n\t\t\t\tnum[i] = this.get(i);\n\t\t\t}\n \n\t\t\tfor (var i = 0; i < e.getLength(); i++) {\n\t\t\t\tnum[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);\n\t\t\t}\n \n\t\t\t// recursive call\n\t\t\treturn new QRPolynomial(num, 0).mod(e);\n\t\t}\n\t};\n \n\t//---------------------------------------------------------------------\n\t// QRRSBlock\n\t//---------------------------------------------------------------------\n \n\tfunction QRRSBlock(totalCount, dataCount) {\n\t\tthis.totalCount = totalCount;\n\t\tthis.dataCount = dataCount;\n\t}\n \n\tQRRSBlock.RS_BLOCK_TABLE = [\n \n\t\t// L\n\t\t// M\n\t\t// Q\n\t\t// H\n \n\t\t// 1\n\t\t[1, 26, 19],\n\t\t[1, 26, 16],\n\t\t[1, 26, 13],\n\t\t[1, 26, 9],\n \n\t\t// 2\n\t\t[1, 44, 34],\n\t\t[1, 44, 28],\n\t\t[1, 44, 22],\n\t\t[1, 44, 16],\n \n\t\t// 3\n\t\t[1, 70, 55],\n\t\t[1, 70, 44],\n\t\t[2, 35, 17],\n\t\t[2, 35, 13],\n \n\t\t// 4\t\t\n\t\t[1, 100, 80],\n\t\t[2, 50, 32],\n\t\t[2, 50, 24],\n\t\t[4, 25, 9],\n \n\t\t// 5\n\t\t[1, 134, 108],\n\t\t[2, 67, 43],\n\t\t[2, 33, 15, 2, 34, 16],\n\t\t[2, 33, 11, 2, 34, 12],\n \n\t\t// 6\n\t\t[2, 86, 68],\n\t\t[4, 43, 27],\n\t\t[4, 43, 19],\n\t\t[4, 43, 15],\n \n\t\t// 7\t\t\n\t\t[2, 98, 78],\n\t\t[4, 49, 31],\n\t\t[2, 32, 14, 4, 33, 15],\n\t\t[4, 39, 13, 1, 40, 14],\n \n\t\t// 8\n\t\t[2, 121, 97],\n\t\t[2, 60, 38, 2, 61, 39],\n\t\t[4, 40, 18, 2, 41, 19],\n\t\t[4, 40, 14, 2, 41, 15],\n \n\t\t// 9\n\t\t[2, 146, 116],\n\t\t[3, 58, 36, 2, 59, 37],\n\t\t[4, 36, 16, 4, 37, 17],\n\t\t[4, 36, 12, 4, 37, 13],\n \n\t\t// 10\t\t\n\t\t[2, 86, 68, 2, 87, 69],\n\t\t[4, 69, 43, 1, 70, 44],\n\t\t[6, 43, 19, 2, 44, 20],\n\t\t[6, 43, 15, 2, 44, 16],\n \n\t\t// 11\n\t\t[4, 101, 81],\n\t\t[1, 80, 50, 4, 81, 51],\n\t\t[4, 50, 22, 4, 51, 23],\n\t\t[3, 36, 12, 8, 37, 13],\n \n\t\t// 12\n\t\t[2, 116, 92, 2, 117, 93],\n\t\t[6, 58, 36, 2, 59, 37],\n\t\t[4, 46, 20, 6, 47, 21],\n\t\t[7, 42, 14, 4, 43, 15],\n \n\t\t// 13\n\t\t[4, 133, 107],\n\t\t[8, 59, 37, 1, 60, 38],\n\t\t[8, 44, 20, 4, 45, 21],\n\t\t[12, 33, 11, 4, 34, 12],\n \n\t\t// 14\n\t\t[3, 145, 115, 1, 146, 116],\n\t\t[4, 64, 40, 5, 65, 41],\n\t\t[11, 36, 16, 5, 37, 17],\n\t\t[11, 36, 12, 5, 37, 13],\n \n\t\t// 15\n\t\t[5, 109, 87, 1, 110, 88],\n\t\t[5, 65, 41, 5, 66, 42],\n\t\t[5, 54, 24, 7, 55, 25],\n\t\t[11, 36, 12],\n \n\t\t// 16\n\t\t[5, 122, 98, 1, 123, 99],\n\t\t[7, 73, 45, 3, 74, 46],\n\t\t[15, 43, 19, 2, 44, 20],\n\t\t[3, 45, 15, 13, 46, 16],\n \n\t\t// 17\n\t\t[1, 135, 107, 5, 136, 108],\n\t\t[10, 74, 46, 1, 75, 47],\n\t\t[1, 50, 22, 15, 51, 23],\n\t\t[2, 42, 14, 17, 43, 15],\n \n\t\t// 18\n\t\t[5, 150, 120, 1, 151, 121],\n\t\t[9, 69, 43, 4, 70, 44],\n\t\t[17, 50, 22, 1, 51, 23],\n\t\t[2, 42, 14, 19, 43, 15],\n \n\t\t// 19\n\t\t[3, 141, 113, 4, 142, 114],\n\t\t[3, 70, 44, 11, 71, 45],\n\t\t[17, 47, 21, 4, 48, 22],\n\t\t[9, 39, 13, 16, 40, 14],\n \n\t\t// 20\n\t\t[3, 135, 107, 5, 136, 108],\n\t\t[3, 67, 41, 13, 68, 42],\n\t\t[15, 54, 24, 5, 55, 25],\n\t\t[15, 43, 15, 10, 44, 16],\n \n\t\t// 21\n\t\t[4, 144, 116, 4, 145, 117],\n\t\t[17, 68, 42],\n\t\t[17, 50, 22, 6, 51, 23],\n\t\t[19, 46, 16, 6, 47, 17],\n \n\t\t// 22\n\t\t[2, 139, 111, 7, 140, 112],\n\t\t[17, 74, 46],\n\t\t[7, 54, 24, 16, 55, 25],\n\t\t[34, 37, 13],\n \n\t\t// 23\n\t\t[4, 151, 121, 5, 152, 122],\n\t\t[4, 75, 47, 14, 76, 48],\n\t\t[11, 54, 24, 14, 55, 25],\n\t\t[16, 45, 15, 14, 46, 16],\n \n\t\t// 24\n\t\t[6, 147, 117, 4, 148, 118],\n\t\t[6, 73, 45, 14, 74, 46],\n\t\t[11, 54, 24, 16, 55, 25],\n\t\t[30, 46, 16, 2, 47, 17],\n \n\t\t// 25\n\t\t[8, 132, 106, 4, 133, 107],\n\t\t[8, 75, 47, 13, 76, 48],\n\t\t[7, 54, 24, 22, 55, 25],\n\t\t[22, 45, 15, 13, 46, 16],\n \n\t\t// 26\n\t\t[10, 142, 114, 2, 143, 115],\n\t\t[19, 74, 46, 4, 75, 47],\n\t\t[28, 50, 22, 6, 51, 23],\n\t\t[33, 46, 16, 4, 47, 17],\n \n\t\t// 27\n\t\t[8, 152, 122, 4, 153, 123],\n\t\t[22, 73, 45, 3, 74, 46],\n\t\t[8, 53, 23, 26, 54, 24],\n\t\t[12, 45, 15, 28, 46, 16],\n \n\t\t// 28\n\t\t[3, 147, 117, 10, 148, 118],\n\t\t[3, 73, 45, 23, 74, 46],\n\t\t[4, 54, 24, 31, 55, 25],\n\t\t[11, 45, 15, 31, 46, 16],\n \n\t\t// 29\n\t\t[7, 146, 116, 7, 147, 117],\n\t\t[21, 73, 45, 7, 74, 46],\n\t\t[1, 53, 23, 37, 54, 24],\n\t\t[19, 45, 15, 26, 46, 16],\n \n\t\t// 30\n\t\t[5, 145, 115, 10, 146, 116],\n\t\t[19, 75, 47, 10, 76, 48],\n\t\t[15, 54, 24, 25, 55, 25],\n\t\t[23, 45, 15, 25, 46, 16],\n \n\t\t// 31\n\t\t[13, 145, 115, 3, 146, 116],\n\t\t[2, 74, 46, 29, 75, 47],\n\t\t[42, 54, 24, 1, 55, 25],\n\t\t[23, 45, 15, 28, 46, 16],\n \n\t\t// 32\n\t\t[17, 145, 115],\n\t\t[10, 74, 46, 23, 75, 47],\n\t\t[10, 54, 24, 35, 55, 25],\n\t\t[19, 45, 15, 35, 46, 16],\n \n\t\t// 33\n\t\t[17, 145, 115, 1, 146, 116],\n\t\t[14, 74, 46, 21, 75, 47],\n\t\t[29, 54, 24, 19, 55, 25],\n\t\t[11, 45, 15, 46, 46, 16],\n \n\t\t// 34\n\t\t[13, 145, 115, 6, 146, 116],\n\t\t[14, 74, 46, 23, 75, 47],\n\t\t[44, 54, 24, 7, 55, 25],\n\t\t[59, 46, 16, 1, 47, 17],\n \n\t\t// 35\n\t\t[12, 151, 121, 7, 152, 122],\n\t\t[12, 75, 47, 26, 76, 48],\n\t\t[39, 54, 24, 14, 55, 25],\n\t\t[22, 45, 15, 41, 46, 16],\n \n\t\t// 36\n\t\t[6, 151, 121, 14, 152, 122],\n\t\t[6, 75, 47, 34, 76, 48],\n\t\t[46, 54, 24, 10, 55, 25],\n\t\t[2, 45, 15, 64, 46, 16],\n \n\t\t// 37\n\t\t[17, 152, 122, 4, 153, 123],\n\t\t[29, 74, 46, 14, 75, 47],\n\t\t[49, 54, 24, 10, 55, 25],\n\t\t[24, 45, 15, 46, 46, 16],\n \n\t\t// 38\n\t\t[4, 152, 122, 18, 153, 123],\n\t\t[13, 74, 46, 32, 75, 47],\n\t\t[48, 54, 24, 14, 55, 25],\n\t\t[42, 45, 15, 32, 46, 16],\n \n\t\t// 39\n\t\t[20, 147, 117, 4, 148, 118],\n\t\t[40, 75, 47, 7, 76, 48],\n\t\t[43, 54, 24, 22, 55, 25],\n\t\t[10, 45, 15, 67, 46, 16],\n \n\t\t// 40\n\t\t[19, 148, 118, 6, 149, 119],\n\t\t[18, 75, 47, 31, 76, 48],\n\t\t[34, 54, 24, 34, 55, 25],\n\t\t[20, 45, 15, 61, 46, 16]\n\t];\n \n\tQRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {\n \n\t\tvar rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);\n \n\t\tif (rsBlock == undefined) {\n\t\t\tthrow new Error(\"bad rs block @ typeNumber:\" + typeNumber + \"/errorCorrectLevel:\" + errorCorrectLevel);\n\t\t}\n \n\t\tvar length = rsBlock.length / 3;\n \n\t\tvar list = new Array();\n \n\t\tfor (var i = 0; i < length; i++) {\n \n\t\t\tvar count = rsBlock[i * 3 + 0];\n\t\t\tvar totalCount = rsBlock[i * 3 + 1];\n\t\t\tvar dataCount = rsBlock[i * 3 + 2];\n \n\t\t\tfor (var j = 0; j < count; j++) {\n\t\t\t\tlist.push(new QRRSBlock(totalCount, dataCount));\n\t\t\t}\n\t\t}\n \n\t\treturn list;\n\t}\n \n\tQRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {\n \n\t\tswitch (errorCorrectLevel) {\n\t\t\tcase QRErrorCorrectLevel.L:\n\t\t\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];\n\t\t\tcase QRErrorCorrectLevel.M:\n\t\t\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];\n\t\t\tcase QRErrorCorrectLevel.Q:\n\t\t\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];\n\t\t\tcase QRErrorCorrectLevel.H:\n\t\t\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n \n\t//---------------------------------------------------------------------\n\t// QRBitBuffer\n\t//---------------------------------------------------------------------\n \n\tfunction QRBitBuffer() {\n\t\tthis.buffer = new Array();\n\t\tthis.length = 0;\n\t}\n \n\tQRBitBuffer.prototype = {\n \n\t\tget: function(index) {\n\t\t\tvar bufIndex = Math.floor(index / 8);\n\t\t\treturn ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;\n\t\t},\n \n\t\tput: function(num, length) {\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tthis.putBit(((num >>> (length - i - 1)) & 1) == 1);\n\t\t\t}\n\t\t},\n \n\t\tgetLengthInBits: function() {\n\t\t\treturn this.length;\n\t\t},\n \n\t\tputBit: function(bit) {\n \n\t\t\tvar bufIndex = Math.floor(this.length / 8);\n\t\t\tif (this.buffer.length <= bufIndex) {\n\t\t\t\tthis.buffer.push(0);\n\t\t\t}\n \n\t\t\tif (bit) {\n\t\t\t\tthis.buffer[bufIndex] |= (0x80 >>> (this.length % 8));\n\t\t\t}\n \n\t\t\tthis.length++;\n\t\t}\n\t};\n \n\t//---------------------------------------------------------------------\n\t// Support Chinese\n\t//---------------------------------------------------------------------\n\tfunction utf16To8(text) {\n\t\tvar result = '';\n\t\tvar c;\n\t\tfor (var i = 0; i < text.length; i++) {\n\t\t\tc = text.charCodeAt(i);\n\t\t\tif (c >= 0x0001 && c <= 0x007F) {\n\t\t\t\tresult += text.charAt(i);\n\t\t\t} else if (c > 0x07FF) {\n\t\t\t\tresult += String.fromCharCode(0xE0 | c >> 12 & 0x0F);\n\t\t\t\tresult += String.fromCharCode(0x80 | c >> 6 & 0x3F);\n\t\t\t\tresult += String.fromCharCode(0x80 | c >> 0 & 0x3F);\n\t\t\t} else {\n\t\t\t\tresult += String.fromCharCode(0xC0 | c >> 6 & 0x1F);\n\t\t\t\tresult += String.fromCharCode(0x80 | c >> 0 & 0x3F);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n \n\tuQRCode = {\n \n\t\terrorCorrectLevel: QRErrorCorrectLevel,\n \n\t\tdefaults: {\n\t\t\tsize: 354,\n\t\t\tmargin: 0,\n\t\t\tbackgroundColor: '#ffffff',\n\t\t\tforegroundColor: '#000000',\n\t\t\tfileType: 'png', // 'jpg', 'png'\n\t\t\terrorCorrectLevel: QRErrorCorrectLevel.H,\n\t\t\ttypeNumber: -1\n\t\t},\n \n\t\tmake: function(options) {\n\t\t\treturn new Promise((reslove, reject) => {\n\t\t\t\tvar defaultOptions = {\n\t\t\t\t\tcanvasId: options.canvasId,\n\t\t\t\t\tcomponentInstance: options.componentInstance,\n\t\t\t\t\ttext: options.text,\n\t\t\t\t\tsize: this.defaults.size,\n\t\t\t\t\tmargin: this.defaults.margin,\n\t\t\t\t\tbackgroundColor: this.defaults.backgroundColor,\n\t\t\t\t\tforegroundColor: this.defaults.foregroundColor,\n\t\t\t\t\tfileType: this.defaults.fileType,\n\t\t\t\t\terrorCorrectLevel: this.defaults.errorCorrectLevel,\n\t\t\t\t\ttypeNumber: this.defaults.typeNumber\n\t\t\t\t};\n\t\t\t\tif (options) {\n\t\t\t\t\tfor (var i in options) {\n\t\t\t\t\t\tdefaultOptions[i] = options[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toptions = defaultOptions;\n\t\t\t\tif (!options.canvasId) {\n\t\t\t\t\tconsole.error('uQRCode: Please set canvasId!');\n\t\t\t\t\treturn;\n\t\t\t\t}\n \n\t\t\t\tfunction createCanvas() {\n\t\t\t\t\tvar qrcode = new QRCode(options.typeNumber, options.errorCorrectLevel);\n\t\t\t\t\tqrcode.addData(utf16To8(options.text));\n\t\t\t\t\tqrcode.make();\n \n\t\t\t\t\tvar ctx = uni.createCanvasContext(options.canvasId, options.componentInstance);\n\t\t\t\t\tctx.setFillStyle(options.backgroundColor);\n\t\t\t\t\tctx.fillRect(0, 0, options.size, options.size);\n \n\t\t\t\t\tvar tileW = (options.size - options.margin * 2) / qrcode.getModuleCount();\n\t\t\t\t\tvar tileH = tileW;\n \n\t\t\t\t\tfor (var row = 0; row < qrcode.getModuleCount(); row++) {\n\t\t\t\t\t\tfor (var col = 0; col < qrcode.getModuleCount(); col++) {\n\t\t\t\t\t\t\tvar style = qrcode.isDark(row, col) ? options.foregroundColor : options.backgroundColor;\n\t\t\t\t\t\t\tctx.setFillStyle(style);\n\t\t\t\t\t\t\tvar x = Math.round(col * tileW) + options.margin;\n\t\t\t\t\t\t\tvar y = Math.round(row * tileH) + options.margin;\n\t\t\t\t\t\t\tvar w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW);\n\t\t\t\t\t\t\tvar h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW);\n\t\t\t\t\t\t\tctx.fillRect(x, y, w, h);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n \n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tctx.draw(false, (function() {\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\tuni.canvasToTempFilePath({\n\t\t\t\t\t\t\t\t\tcanvasId: options.canvasId,\n\t\t\t\t\t\t\t\t\tfileType: options.fileType,\n\t\t\t\t\t\t\t\t\twidth: options.size,\n\t\t\t\t\t\t\t\t\theight: options.size,\n\t\t\t\t\t\t\t\t\tdestWidth: options.size,\n\t\t\t\t\t\t\t\t\tdestHeight: options.size,\n\t\t\t\t\t\t\t\t\tsuccess: function(res) {\n\t\t\t\t\t\t\t\t\t\tlet resData; // 将统一为base64格式\n\t\t\t\t\t\t\t\t\t\tlet tempFilePath = res.tempFilePath; // H5为base64，其他为相对路径\n \n\t\t\t\t\t\t\t\t\t\t// #ifdef H5\n\t\t\t\t\t\t\t\t\t\tresData = tempFilePath;\n\t\t\t\t\t\t\t\t\t\toptions.success && options.success(resData);\n\t\t\t\t\t\t\t\t\t\treslove(resData);\n\t\t\t\t\t\t\t\t\t\t// #endif\n \n\t\t\t\t\t\t\t\t\t\t// #ifdef APP-PLUS\n\t\t\t\t\t\t\t\t\t\tconst path = plus.io.convertLocalFileSystemURL(tempFilePath) // 绝对路径\n\t\t\t\t\t\t\t\t\t\tlet fileReader = new plus.io.FileReader();\n\t\t\t\t\t\t\t\t\t\tfileReader.readAsDataURL(path);\n\t\t\t\t\t\t\t\t\t\tfileReader.onloadend = res => {\n\t\t\t\t\t\t\t\t\t\t\tresData = res.target.result;\n\t\t\t\t\t\t\t\t\t\t\toptions.success && options.success(resData);\n\t\t\t\t\t\t\t\t\t\t\treslove(resData);\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t// #endif\n \n\t\t\t\t\t\t\t\t\t\t// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO\n\t\t\t\t\t\t\t\t\t\tuni.getFileSystemManager().readFile({\n\t\t\t\t\t\t\t\t\t\t\tfilePath: tempFilePath,\n\t\t\t\t\t\t\t\t\t\t\tencoding: 'base64',\n\t\t\t\t\t\t\t\t\t\t\tsuccess: res => {\n\t\t\t\t\t\t\t\t\t\t\t\tresData = 'data:image/png;base64,' + res.data;\n\t\t\t\t\t\t\t\t\t\t\t\toptions.success && options.success(resData);\n\t\t\t\t\t\t\t\t\t\t\t\treslove(resData);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t// #endif\n \n\t\t\t\t\t\t\t\t\t\t// #ifndef H5 || APP-PLUS || MP-WEIXIN || MP-QQ || MP-TOUTIAO\n\t\t\t\t\t\t\t\t\t\tif (plus) {\n\t\t\t\t\t\t\t\t\t\t\tconst path = plus.io.convertLocalFileSystemURL(tempFilePath) // 绝对路径\n\t\t\t\t\t\t\t\t\t\t\tlet fileReader = new plus.io.FileReader();\n\t\t\t\t\t\t\t\t\t\t\tfileReader.readAsDataURL(path);\n\t\t\t\t\t\t\t\t\t\t\tfileReader.onloadend = res => {\n\t\t\t\t\t\t\t\t\t\t\t\tresData = res.target.result;\n\t\t\t\t\t\t\t\t\t\t\t\toptions.success && options.success(resData);\n\t\t\t\t\t\t\t\t\t\t\t\treslove(resData);\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tuni.request({\n\t\t\t\t\t\t\t\t\t\t\t\turl: tempFilePath,\n\t\t\t\t\t\t\t\t\t\t\t\tmethod: 'GET',\n\t\t\t\t\t\t\t\t\t\t\t\tresponseType: 'arraybuffer',\n\t\t\t\t\t\t\t\t\t\t\t\tsuccess: res => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tresData = `data:image/png;base64,${uni.arrayBufferToBase64(res.data)}`; // 把arraybuffer转成base64\n\t\t\t\t\t\t\t\t\t\t\t\t\toptions.success && options.success(resData);\n\t\t\t\t\t\t\t\t\t\t\t\t\treslove(resData);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t// #endif\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tfail: function(error) {\n\t\t\t\t\t\t\t\t\t\toptions.fail && options.fail(error);\n\t\t\t\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tcomplete: function(res) {\n\t\t\t\t\t\t\t\t\t\toptions.complete && options.complete(res);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, options.componentInstance);\n\t\t\t\t\t\t\t}, options.text.length + 100);\n\t\t\t\t\t\t})());\n\t\t\t\t\t}, 150);\n\t\t\t\t}\n \n\t\t\t\tcreateCanvas();\n\t\t\t});\n\t\t}\n\t}\n \n})()\n \nexport default uQRCode\n \n "
  },
  {
    "path": "components/default-page/default-page.vue",
    "content": "<template>\n\t<view class=\"default-page\">\n\t\t<view class=\"default-wrap\">\n\t\t\t\n\t\t\t<text>{{title}}</text>\n\t\t\t<view v-if=\"isBtn\" class=\"btn\" @click=\"toHome\">\n\t\t\t\t去逛逛\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\t// 购物车 cart 消息 msg  订单 order 查询 search\n\t\ttype: {\n\t\t\ttype: String,\n\t\t\tdefault: 'search'\n\t\t},\n\t\tisBtn:{\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\ttitle:{\n\t\t\ttype: String,\n\t\t\tdefault: '没有相关内容'\n\t\t}\n\t},\n\t\n\tdata() {\n\t\treturn {\n\t\t\tsrc:''\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.src ='/static/default/default_'+ this.type + '.png';\n\t},\n\tmethods: {\n\t\ttoHome() {\n\t\t\tuni.switchTab({\n\t\t\t    url: '/pages/home/home'\n\t\t\t});\n\t\t}\n\t}\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\t.default-page{\n\t\tbackground: #FFFFFF;\n\t\twidth: 100%;\n\t\theight: 100vh;\n\t\t.default-wrap{\n\t\t\tposition: absolute;\n\t\t\ttop: calc(50vh - 320rpx);\n\t\t\tleft: calc(50% - 120rpx);\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\talign-items: center;\n\t\t\t\n\t\t\t>image{\n\t\t\t\twidth: 260rpx;\n\t\t\t\theight: 240rpx;\n\t\t\t\t\n\t\t\t\tmargin-bottom: 24rpx;\n\t\t\t}\n\t\t\ttext{\n\t\t\t\tfont-size: 32rpx;\n\t\t\t\tcolor: #828385;\n\t\t\t}\n\t\t\t.btn{\n\t\t\t\twidth: 160rpx;\n\t\t\t\theight: 56rpx;\n\t\t\t\tborder: 2rpx solid #3180F6;\n\t\t\t\tborder-radius: 6rpx;\n\t\t\t\ttext-align: center;\n\t\t\t\tline-height: 56rpx;\n\t\t\t\tmargin-top: 32rpx;\n\t\t\t\tfont-size: 24rpx;\n\t\t\t\tcolor: #3180F6;\n\t\t\t}\n\t\t}\n\t\t\n\t}\n</style>\n"
  },
  {
    "path": "components/m-airbtn/index.vue",
    "content": "<template>\r\n  <view>\r\n    <!-- #ifdef H5 -->\r\n    <view class=\"wrapper\" v-if=\"!weChat\" @click=\"openApp()\">\r\n      <!-- 左侧图标 -->\r\n      <image class=\"img\" :src=\"logo\"></image>\r\n      <view class=\"open\">\r\n        打开{{config.name}}\r\n      </view>\r\n    </view>\r\n\r\n    <!-- #endif -->\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport config from \"@/config/config\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      config, // 设置工具类\r\n      weChat: false,  // 是否微信浏览器，该项为true时不显示 当前整个页面\r\n      logo: require(\"@/icon.png\"), //显示的圆形logo\r\n    };\r\n  },\r\n  mounted() {\r\n    // #ifdef H5\r\n    // 判断是否是微信浏览器\r\n    var ua = navigator.userAgent.toLowerCase();\r\n    var isWeixin = ua.indexOf(\"micromessenger\") != -1;\r\n    if (isWeixin) {\r\n      this.weChat = true;\r\n    } else {\r\n      this.weChat = false;\r\n    }\r\n    // #endif\r\n  },\r\n  methods: {\r\n\r\n    /**\r\n     * 跳转到下载app页面\r\n     */\r\n    downloadApp() {\r\n      setTimeout(function () {\r\n        window.location.href = config.downloadLink;\r\n      }, 2000);\r\n    },\r\n\r\n    /**\r\n     * 打开app 仅在h5生效 使用ifream唤醒app\r\n     */\r\n    openApp() {\r\n      let src;\r\n      if (location.href) {\r\n        src = location.href.split(\"/pages\")[1];\r\n      }\r\n      let t = `${config.schemeLink}pages${src}`;\r\n\r\n      try {\r\n        var e = navigator.userAgent.toLowerCase(),\r\n          n = e.match(/cpu iphone os (.*?) like mac os/);\r\n        if (\r\n          ((n = null !== n ? n[1].replace(/_/g, \".\") : 0), parseInt(n) >= 9)\r\n        ) {\r\n          window.location.href = t;\r\n\r\n          this.downloadApp();\r\n        } else {\r\n          var r = document.createElement(\"iframe\");\r\n          (r.src = t), (r.style.display = \"none\"), document.body.appendChild(r);\r\n\r\n          this.downloadApp();\r\n        }\r\n      } catch (e) {\r\n        window.location.href = t;\r\n        this.downloadApp();\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.img {\r\n  margin: 0 4rpx;\r\n  width: 50rpx;\r\n  height: 50rpx;\r\n  border-radius: 50%;\r\n  border: 5rpx solid #fff;\r\n}\r\n\r\n.open {\r\n  margin: 0 10rpx;\r\n  text-align: center;\r\n  font-size: 26rpx;\r\n}\r\n.wrapper:hover {\r\n  transform: translateX(0);\r\n}\r\n.wrapper {\r\n  transform: translateX(160rpx);\r\n  transition: 0.35s;\r\n  align-items: center;\r\n  justify-content: center;\r\n  display: flex;\r\n  border-top-left-radius: 20px;\r\n  border-bottom-left-radius: 20px;\r\n  color: #fff;\r\n  // width: 220rpx;\r\n  background: $light-color;\r\n  position: fixed;\r\n  top: 25%;\r\n  right: 0;\r\n  height: 60rpx;\r\n  z-index: 9;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/m-buy/README.md",
    "content": "## 购买组件\n1.本组件是砍价，积分购买，参团等复用组\n2.后续会将此组件和商品购买组件合并，文档后续再出\n"
  },
  {
    "path": "components/m-buy/goods.vue",
    "content": "<template>\r\n\t<div class=\"wrapper\">\r\n\t\t<u-popup class=\"popup\" v-model=\"buyMask\" :height=\"setup.height\" closeable :mode=\"setup.mode\" :border-radius=\"setup.radius\" @close=\"closeMask()\">\r\n\t\t\t<!-- 商品 -->\r\n\t\t\t<view class=\"goods-box bottom\">\r\n\t\t\t\t<view class=\"goods-header\">\r\n\t\t\t\t\t<view class=\"goods-img\">\r\n\t\t\t\t\t\t<u-image width=\"200rpx\" border-radius=\"20\" class=\"uimage\" height=\"200rpx\" :src=\"selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail\"></u-image>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"goods-skus\">\r\n\t\t\t\t\t\t<!-- 有活动商品价格 -->\r\n\t\t\t\t\t\t<view class=\"goods-price\" v-if=\"goodsDetail.promotionPrice && ((isGroup && buyType === 'PINTUAN') || !isGroup)\">\r\n\t\t\t\t\t\t\t<span v-if=\"goodsDetail.promotionPrice && !pointDetail\">\r\n\t\t\t\t\t\t\t\t￥\r\n\t\t\t\t\t\t\t\t<span class=\"goods-price-promotionShow goods-price-bigshow\">{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[0] }}</span>\r\n\t\t\t\t\t\t\t\t.{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[1] }}\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<span v-if=\"pointDetail.points\">\r\n\t\t\t\t\t\t\t\t<span class=\"goods-price-promotionShow goods-price-bigshow\">{{ pointDetail.points }}</span>\r\n\t\t\t\t\t\t\t\t积分\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<div class=\"promotion-box\">\r\n\t\t\t\t\t\t\t\t￥\r\n\t\t\t\t\t\t\t\t<span class=\"goods-price-bigshow\">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>\r\n\t\t\t\t\t\t\t\t.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<!-- 正常商品的价格 -->\r\n\t\t\t\t\t\t<view v-else>\r\n\t\t\t\t\t\t\t<!-- 批发价格 -->\r\n\t\t\t\t\t\t\t<div class=\"price-row flex\" v-if=\"goodsDetail.salesModel === 'WHOLESALE'\">\r\n\t\t\t\t\t\t\t\t<div class=\"goods-price\" v-for=\"(item, index) in wholesaleList\" :key=\"index\">\r\n\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t￥\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"goods-price-bigshow\">{{ $options.filters.goodsFormatPrice(item.price)[0] }}</span>\r\n\t\t\t\t\t\t\t\t\t\t.{{ $options.filters.goodsFormatPrice(item.price)[1] }}\r\n\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t<span class=\"wholesale-item\">{{ item.num }}{{ goodsDetail.goodsUnit }}</span>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"goods-price\" v-else>\r\n\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t￥\r\n\t\t\t\t\t\t\t\t\t<span class=\"goods-price-bigshow\">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>\r\n\t\t\t\t\t\t\t\t\t.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<view class=\"goods-check-skus\">\r\n\t\t\t\t\t\t\t已选\r\n\t\t\t\t\t\t\t<span class=\"goods-check-skus-name\">\r\n\t\t\t\t\t\t\t\t{{ selectName }}\r\n\t\t\t\t\t\t\t\t<span>，{{ num }}个</span>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<view class=\"goods-check-skus\">\r\n\t\t\t\t\t\t\t库存\r\n\t\t\t\t\t\t\t<span class=\"goods-check-skus-name\">\r\n\t\t\t\t\t\t\t\t<span>{{ goodsDetail.quantity }}</span>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<!-- 商品信息 -->\r\n\t\t\t\t<scroll-view class=\"goods-skus-box\" :scroll-y=\"true\">\r\n\t\t\t\t\t<!-- 规格 -->\r\n\t\t\t\t\t<view class=\"goods-skus-view\" :key=\"specIndex\" v-for=\"(spec, specIndex) in formatList\">\r\n\t\t\t\t\t\t<view class=\"skus-view-list\">\r\n\t\t\t\t\t\t\t<view class=\"view-class-title\">{{ spec.name }}</view>\r\n\r\n\t\t\t\t\t\t\t<!-- 正常逻辑 循环出sku -->\r\n\t\t\t\t\t\t\t<view\r\n\t\t\t\t\t\t\t\tv-if=\"!parentOrder\"\r\n\t\t\t\t\t\t\t\t:class=\"{ active: spec_val.value == currentSelected[specIndex] }\"\r\n\t\t\t\t\t\t\t\tclass=\"skus-view-item\"\r\n\t\t\t\t\t\t\t\tv-for=\"(spec_val, spec_index) in spec.values\"\r\n\t\t\t\t\t\t\t\t:key=\"spec_index\"\r\n\t\t\t\t\t\t\t\t@click=\"handleClickSpec(spec, specIndex, spec_val)\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ spec_val.value }}\r\n\t\t\t\t\t\t\t</view>\r\n\r\n\t\t\t\t\t\t\t<!-- 拼团购买，仅筛选出当前拼团类型商品 -->\r\n\t\t\t\t\t\t\t<view\r\n\t\t\t\t\t\t\t\tv-if=\"parentOrder && spec_val.skuId == goodsDetail.id\"\r\n\t\t\t\t\t\t\t\t:class=\"{ active: spec_val.value == currentSelected[specIndex] }\"\r\n\t\t\t\t\t\t\t\tclass=\"skus-view-item\"\r\n\t\t\t\t\t\t\t\tv-for=\"(spec_val, spec_index) in spec.values\"\r\n\t\t\t\t\t\t\t\t:key=\"spec_index\"\r\n\t\t\t\t\t\t\t\t@click=\"handleClickSpec(spec, specIndex, spec_val)\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ spec_val.value }}\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<div class=\"soldout\" v-if=\"goodsDetail.quantity === 0\">\r\n\t\t\t\t\t\t<u-alert-tips type=\"warning\" title=\"商品已售罄\" description=\"当前商品库存为0\"></u-alert-tips>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- 数量 -->\r\n\t\t\t\t\t<view v-if=\"goodsDetail.quantity !== 0\" class=\"goods-skus-number flex flex-a-c flex-j-sb\">\r\n\t\t\t\t\t\t<view class=\"view-class-title\">数量</view>\r\n\t\t\t\t\t\t<uni-number-box class=\"uNumber\" :min=\"1\" :max=\"999\" :disabled=\"goodsDetail.quantity === 0\"  v-model=\"num\"></uni-number-box>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</scroll-view>\r\n\t\t\t\t<!-- 按钮 -->\r\n\t\t\t\t<view class=\"btns\" v-if=\"goodsDetail.quantity !== 0\">\r\n\t\t\t\t\t<view class=\"box-btn card\" v-if=\"buyType != 'PINTUAN' && goodsDetail.goodsType != 'VIRTUAL_GOODS'\" @click=\"addToCartOrBuy('cart')\">加入购物车</view>\r\n\t\t\t\t\t<view class=\"box-btn buy\" @click=\"addToCartOrBuy('buy')\">立即购买</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</u-popup>\r\n\t</div>\r\n</template>\r\n<script>\r\nimport * as API_trade from '@/api/trade.js';\r\nimport setup from './popup';\r\nimport uniNumberBox from '@/components/uni-number-box'\r\nexport default {\r\n\tcomponents: {\r\n\t\tuniNumberBox\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tsetup,\r\n\t\t\tnum: this.wholesaleList && this.wholesaleList.length > 0 ? this.wholesaleList[0].num : 1,\r\n\r\n\t\t\tselectName: '', //选中商品的昵称\r\n\t\t\tselectSkuList: '', //选中商铺sku,\r\n\t\t\tselectedSpecImg: '', //选中的图片路径\r\n\t\t\tbuyType: '', //用于存储促销，拼团等活动类型\r\n\t\t\tparentOrder: '', //父级拼团活动的数据 - 如果是团员则有数据\r\n\t\t\tformatList: [],\r\n\t\t\tcurrentSelected: [],\r\n\t\t\tskuList: '',\r\n\t\t\tisClose: false //是否可以点击遮罩关闭\r\n\t\t};\r\n\t},\r\n\tprops: {\r\n\t\twholesaleList: {\r\n\t\t\ttype: null,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\tbuyMask: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\tisGroup: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\tgoodsDetail: {\r\n\t\t\tdefault: '',\r\n\t\t\ttype: null\r\n\t\t},\r\n\t\tselectedSku: {\r\n\t\t\tdefault: '',\r\n\t\t\ttype: null\r\n\t\t},\r\n\t\tgoodsSpec: {\r\n\t\t\tdefault: '',\r\n\t\t\ttype: null\r\n\t\t},\r\n\t\taddr: {\r\n\t\t\tdefault: '',\r\n\t\t\ttype: null\r\n\t\t},\r\n\t\tpointDetail: {\r\n\t\t\tdefault: '',\r\n\t\t\ttype: null\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\twholesalePrice(key) {\r\n\t\t\treturn this.wholesaleList.length\r\n\t\t\t\t? this.wholesaleList.map(item => {\r\n\t\t\t\t\t\treturn item.price;\r\n\t\t\t\t  })\r\n\t\t\t\t: [];\r\n\t\t},\r\n\t\twholesaleNum(key) {\r\n\t\t\treturn this.wholesaleList.length\r\n\t\t\t\t? this.wholesaleList.map(item => {\r\n\t\t\t\t\t\treturn item.num;\r\n\t\t\t\t  })\r\n\t\t\t\t: [];\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tnum(val) {\r\n\t\t\t\r\n\t\t\tval == 0 ? this.num = 1 : ''\r\n\t\t\tif (val) {\r\n\t\t\t\t\r\n\t\t\t\t//超过库存后修改回库存\r\n\t\t\t\tif (val > this.goodsDetail.quantity) {\r\n\t\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\t\tthis.num = this.goodsDetail.quantity;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tbuyType: {\r\n\t\t\thandler(val) {\r\n\t\t\t\tif (val) {\r\n\t\t\t\t\tthis.buyType = val;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\timmediate: true\r\n\t\t},\r\n\t\tselectSkuList: {\r\n\t\t\thandler(val, oldval) {\r\n\t\t\t\tthis.$emit('changed', val);\r\n\t\t\t},\r\n\t\t\tdeep: true\r\n\t\t},\r\n\t\t'goodsDetail.quantity': {\r\n\t\t\thandler(val) {\r\n\t\t\t\tif (val == 0) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '商品已售罄',\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t})\r\n\t\t\t\t\tthis.num = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tmethods: {\r\n\t\tnumCheck(val) {\r\n\t\t\tif (this.wholesaleList && this.wholesaleList.length > 0) {\r\n\t\t\t\tif (this.num <= this.wholesaleList[0].num) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '批发商品购买数量不能小于起批数量!',\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis.num = this.wholesaleList[0].num;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcloseMask() {\r\n\t\t\tthis.$emit('closeBuy', false);\r\n\t\t},\r\n\t\t\r\n\t\t/**点击规格 */\r\n\t\thandleClickSpec(val, index, specValue) {\r\n\t\t\tthis.currentSelected[index] = specValue.value;\r\n\t\t\tlet selectedSkuId = this.goodsSpec.find(i => {\r\n\t\t\t\tlet matched = true;\r\n\t\t\t\tlet specValues = i.specValues.filter(j => j.specName !== 'images');\r\n\t\t\t\tfor (let n = 0; n < specValues.length; n++) {\r\n\t\t\t\t\tif (specValues[n].specValue !== this.currentSelected[n]) {\r\n\t\t\t\t\t\tmatched = false;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (matched) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tif (selectedSkuId?.skuId) {\r\n\t\t\t\tthis.$set(this.currentSelected, index, specValue.value);\r\n\t\t\t\tthis.selectSkuList = {\r\n\t\t\t\t\tspec: {\r\n\t\t\t\t\t\tspecName: val.name,\r\n\t\t\t\t\t\tspecValue: specValue.value\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdata: this.goodsDetail\r\n\t\t\t\t};\r\n\t\t\t\tthis.selectName = specValue.value;\r\n\r\n\t\t\t\tthis.$emit('handleClickSku', {\r\n\t\t\t\t\tskuId: selectedSkuId.skuId,\r\n\t\t\t\t\tgoodsId: this.goodsDetail.goodsId\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '暂无该商品!',\r\n\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 直接购买\r\n\t\t */\r\n\t\tbuy(data) {\r\n\t\t\tAPI_trade.addToCart(data).then(res => {\r\n\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\turl: `/pages/order/fillorder?way=${data.cartType}&addr=${''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 添加到购物车或购买\r\n\t\t */\r\n\t\taddToCartOrBuy(val) {\r\n\t\t\tif (!this.selectSkuList) {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '请选择规格商品',\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlet data = {\r\n\t\t\t\tskuId: this.goodsDetail.id,\r\n\t\t\t\tnum: this.num\r\n\t\t\t};\r\n\r\n\t\t\tif (val == 'cart') {\r\n\t\t\t\tAPI_trade.addToCart(data).then(res => {\r\n\t\t\t\t\tif (res.data.code == 200) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: '商品已添加到购物车',\r\n\t\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tthis.$emit('queryCart');\r\n\t\t\t\t\t\tthis.closeMask();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// 判断是否拼团商品\r\n\t\t\t\tif (this.buyType) {\r\n\t\t\t\t\tdata.cartType = 'PINTUAN';\r\n\t\t\t\t} else if (this.goodsDetail.goodsType == 'VIRTUAL_GOODS') {\r\n\t\t\t\t\tdata.cartType = 'VIRTUAL';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdata.cartType = 'BUY_NOW';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tAPI_trade.addToCart(data).then(res => {\r\n\t\t\t\t\tif (res.data.code == 200) {\r\n\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\turl: `/pages/order/fillorder?way=${data.cartType}&addr=${this.addr.id || ''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tformatSku(list) {\r\n\t\t\t// 格式化数据\r\n\t\t\tlet arr = [{}];\r\n\r\n\t\t\tif (!Array.isArray(list)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tlist.forEach((item, index) => {\r\n\t\t\t\titem.specValues.forEach((spec, specIndex) => {\r\n\t\t\t\t\tlet name = spec.specName;\r\n\t\t\t\t\tlet values = {\r\n\t\t\t\t\t\tvalue: spec.specValue,\r\n\t\t\t\t\t\tquantity: item.quantity,\r\n\t\t\t\t\t\tskuId: item.skuId\r\n\t\t\t\t\t};\r\n\t\t\t\t\tif (name === 'images') {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tarr.forEach((arrItem, arrIndex) => {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tarrItem.name == name &&\r\n\t\t\t\t\t\t\tarrItem.values &&\r\n\t\t\t\t\t\t\t!arrItem.values.find(i => {\r\n\t\t\t\t\t\t\t\treturn i.value === values.value;\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tarrItem.values.push(values);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlet keys = arr.map(key => {\r\n\t\t\t\t\t\t\treturn key.name;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif (!keys.includes(name)) {\r\n\t\t\t\t\t\t\tarr.push({\r\n\t\t\t\t\t\t\t\tname: name,\r\n\t\t\t\t\t\t\t\tvalues: [values]\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tarr.shift();\r\n\t\t\tthis.formatList = arr;\r\n\r\n\t\t\tlist.forEach(item => {\r\n\t\t\t\t// 默认选中\r\n\t\t\t\tif (item.skuId === this.goodsDetail.id) {\r\n\t\t\t\t\titem.specValues\r\n\t\t\t\t\t\t.filter(i => i.specName !== 'images')\r\n\t\t\t\t\t\t.forEach((value, _index) => {\r\n\t\t\t\t\t\t\tthis.currentSelected[_index] = value.specValue;\r\n\r\n\t\t\t\t\t\t\tthis.selectName = value.specValue;\r\n\r\n\t\t\t\t\t\t\tthis.selectSkuList = {\r\n\t\t\t\t\t\t\t\tspec: value,\r\n\t\t\t\t\t\t\t\tdata: this.goodsDetail\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.skuList = list;\r\n\t\t\t// console.log(\" this.skuList\", this.skuList)\r\n\t\t}\r\n\t},\r\n\r\n\tmounted() {\r\n\t\tthis.formatSku(this.goodsSpec);\r\n\r\n\t\tconsole.log(\"goodsDetail\",this.goodsDetail)\r\n\t}\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@import './popup.scss';\r\n\r\n.price-row {\r\n\ttext-align: center;\r\n}\r\n\r\n.buy {\r\n\tbackground-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);\r\n\tbox-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);\r\n}\r\n\r\n.card {\r\n\tbackground-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c);\r\n\tbox-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);\r\n}\r\n\r\n/deep/.u-icon-plus,\r\n.u-icon-minus,\r\n.u-icon-disabled {\r\n\theight: 30rpx !important;\r\n\tbackground: #fff !important;\r\n}\r\n\r\n.goods-skus-number {\r\n\tjustify-content: space-between;\r\n\tdisplay: flex;\r\n\r\n\t> .view-class-title {\r\n\t\tflex: 8;\r\n\t}\r\n\r\n\t> .view-class-input {\r\n\t\tflex: 1;\r\n\t}\r\n}\r\n\r\n/deep/ .uni-scroll-view {\r\n\toverflow: hidden !important;\r\n}\r\n\r\n.active {\r\n\tbackground: $price-light-color !important;\r\n\tborder: 2rpx solid $price-color;\r\n\tfont-weight: bold;\r\n\tcolor: $price-color !important;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n.goods-skus-box {\r\n\toverflow-y: auto;\r\n\theight: 610rpx;\r\n\t// #ifdef MP-WEIXIN\r\n\theight: 570rpx;\r\n\t// #endif\r\n\tmargin-bottom: 10rpx;\r\n}\r\n.soldout{\r\n\tmargin: 20rpx 0;\r\n}\r\n\r\n.goods-skus-view {\r\n\toverflow: hidden;\r\n\r\n\t.skus-view-list {\r\n\t\t> .skus-view-item {\r\n\t\t\tflex: 1;\r\n\t\t\tpadding: 0 36rpx;\r\n\r\n\t\t\toverflow: hidden;\r\n\t\t\theight: 60rpx;\r\n\t\t\tline-height: 60rpx;\r\n\t\t\tfloat: left;\r\n\t\t\ttext-align: center;\r\n\t\t\tmargin-left: 24rpx;\r\n\t\t\tmargin-bottom: 20rpx;\r\n\t\t\tfont-size: 22rpx;\r\n\t\t\tcolor: #262626;\r\n\t\t\tbackground: #f2f2f2;\r\n\t\t\tborder-radius: 30rpx;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.wholesale-item {\r\n\tcolor: #999 !important;\r\n\tfont-size: 24rpx;\r\n\tmargin: 0 20rpx;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n}\r\n\r\n.goods-header {\r\n\theight: 200rpx;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tmargin-bottom: 36rpx;\r\n}\r\n\r\n.goods-box {\r\n\tpadding: 50rpx 36rpx 0 36rpx;\r\n}\r\n\r\n.goods-skus {\r\n\tpadding: 0 20rpx;\r\n}\r\n\r\n.goods-price {\r\n\tcolor: $price-color;\r\n\tline-height: 80rpx;\r\n\tmargin-right: 20rpx;\r\n\r\n\t> * {\r\n\t\tcolor: $price-color;\r\n\t\tline-height: 80rpx;\r\n\t}\r\n}\r\n\r\n.promotion-box {\r\n\tline-height: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\ttext-decoration: line-through;\r\n\tcolor: #999;\r\n\tmargin-left: 10rpx;\r\n\r\n\t/deep/ span {\r\n\t\tfont-size: 30rpx;\r\n\t}\r\n}\r\n\r\n.promotion {\r\n\tfont-size: 30rpx;\r\n}\r\n\r\n.goods-price-promotionShow {\r\n\tfont-size: 48rpx;\r\n}\r\n\r\n.goods-check-skus {\r\n\tfont-size: 24rpx;\r\n\tcolor: #999;\r\n\r\n\t> .goods-check-skus-name {\r\n\t\tmargin-left: 4rpx;\r\n\t}\r\n\r\n\t> span {\r\n\t\tcolor: #333;\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/m-buy/popup.js",
    "content": "\n\nexport default {\n    height:\"1000rpx\", //弹出层高度\n    mode:\"bottom\", //弹出层位置\n    radius:\"32\", //圆角 rpx,\n    close:false //能否点击遮罩退出\n}"
  },
  {
    "path": "components/m-buy/popup.scss",
    "content": ".view-class-title {\n    font-size: 26rpx;\n    color: #262626;\n\n    font-weight: 700;\n    height: 80rpx;\n    line-height: 80rpx;\n}\n.confirmBtn {\n    width: 90%;\n}\n.confirmBtn,\n.box-btn {\n    line-height: 80rpx;\n    height: 80rpx;\n    \n    background: $price-color;\n    color: #fff;\n    border-radius: 200px;\n    text-align: center;\n    margin: 5rpx auto;\n}\n\n.btns {\n    display: flex;\n    width: 100%;\n\n    margin: 0 auto;\n}\n.goods-price-bigshow {\n    font-size: 48rpx;\n    font-weight: bold;\n}\n.box-btn {\n    flex: 1;\n    margin: 0 10rpx;\n}\n"
  },
  {
    "path": "components/m-canvas/README.md",
    "content": "### 说明 https://ext.dcloud.net.cn/plugin?id=3237\n"
  },
  {
    "path": "components/m-canvas/index.vue",
    "content": "<template>\r\n\r\n  <div class=\"index\">\r\n    <u-modal v-model=\"show\" :show-title=\"false\" :show-confirm-button=\"false\" mask-close-able>\r\n      <view class=\"slot-content\">\r\n        <image @click=\"downLoad()\" class=\"img\" :src=\"imgUrl\" />\r\n        <div class=\"canvas-hide\">\r\n          <!-- #ifdef MP-WEIXIN -->\r\n          <canvas id=\"canvas\" type=\"2d\" style=\"width: 600px; height: 960px\" />\r\n          <!-- #endif -->\r\n          <!-- #ifndef MP-WEIXIN -->\r\n          <canvas canvas-id=\"canvas\" id=\"canvas\" style=\"width: 600px; height: 960px\" />\r\n          <!-- #endif -->\r\n        </div>\r\n      </view>\r\n    </u-modal>\r\n\r\n  </div>\r\n</template>\r\n<script>\r\n// 引入绘制插件\r\nimport DrawPoster from \"@/js_sdk/u-draw-poster\";\r\n\r\nexport default {\r\n  data: () => ({\r\n    imgUrl: \"\", //绘制出来的图片路径\r\n    show: false, //是否展示模态框\r\n    dp: {}, //绘制的dp对象，用于存储绘制等一些方法。\r\n    logo: require(\"@/pages/passport/static/logo-title.png\"), //本地logo地址\r\n  }),\r\n\r\n  props: {\r\n    /**\r\n     * 父级传参的数据\r\n     */\r\n    res: {\r\n      type: null,\r\n      default: \"\",\r\n    },\r\n  },\r\n  onUnload() {},\r\n\r\n  methods: {\r\n    /**\r\n     * 解决微信小程序中图片模糊问题\r\n     */\r\n    // #ifdef MP-WEIXIN\r\n    st2: (size) => size * 2,\r\n    // #endif\r\n\r\n    // #ifndef MP-WEIXIN\r\n    st2: (size) => size,\r\n    // #endif\r\n\r\n    /**\r\n     * 保存图片\r\n     */\r\n    downLoad() {\r\n      uni.saveImageToPhotosAlbum({\r\n        filePath: this.imgUrl,\r\n        success: function () {\r\n          uni.showToast({\r\n            title: \"保存成功！\",\r\n            icon: \"none\",\r\n          });\r\n        },\r\n        fail: function () {\r\n          uni.showToast({\r\n            title: \"保存失败，请稍后重试！\",\r\n            icon: \"none\",\r\n          });\r\n        },\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 创建canvas\r\n     */\r\n    async init() {\r\n      this.show = true;\r\n      this.dp = await DrawPoster.build({\r\n        selector: \"canvas\",\r\n        componentThis: this,\r\n        loading: true,\r\n        debugging: true,\r\n      });\r\n      let dp = this.dp;\r\n      // #ifdef MP-WEIXIN\r\n      // 用于微信小程序中画布错乱问题\r\n      dp.canvas.width = this.st2(600);\r\n      dp.canvas.height = this.st2(960);\r\n      // #endif\r\n      this.draw(dp);\r\n    },\r\n\r\n    async draw(dp) {\r\n      const { width, height, background, title } = this.res.container;\r\n      const { code, img, price } = this.res.bottom;\r\n\r\n      // /** 绘制背景 */\r\n      await dp.draw((ctx) => {\r\n        ctx.fillStyle = background;\r\n        ctx.fillRoundRect(\r\n          this.st2(0),\r\n          this.st2(0),\r\n          this.st2(width),\r\n          this.st2(height),\r\n          this.st2(12)\r\n        );\r\n        ctx.clip();\r\n      });\r\n      /** 绘制图片 */\r\n      dp.draw(async (ctx) => {\r\n        await Promise.all([\r\n          // 绘制Logo\r\n          ctx.drawImage(\r\n            this.logo,\r\n            this.st2(175),\r\n            this.st2(0),\r\n            this.st2(256),\r\n            this.st2(144)\r\n          ),\r\n          // 中间图片\r\n          ctx.drawImage(\r\n            img,\r\n            this.st2(100),\r\n            this.st2(150),\r\n            this.st2(400),\r\n            this.st2(400)\r\n          ),\r\n          // 二维码\r\n          ctx.drawImage(\r\n            code,\r\n            this.st2(39),\r\n            this.st2(750),\r\n            this.st2(150),\r\n            this.st2(150)\r\n          ),\r\n        ]);\r\n      });\r\n\r\n      /** 绘制中间文字*/\r\n      await dp.draw((ctx) => {\r\n        ctx.fillStyle = \"#333\";\r\n        ctx.font = `bold ${this.st2(24)}px PingFang SC`;\r\n        ctx.textAlign = \"center\";\r\n        ctx.fillWarpText({\r\n          text: title,\r\n          maxWidth: this.st2(500),\r\n          x: this.st2(300),\r\n          y: this.st2(600),\r\n          layer: 1,\r\n        });\r\n\r\n        ctx.fillStyle = \"#ff3c2a\";\r\n        ctx.font = `${this.st2(38)}px PingFang SC`;\r\n        ctx.textAlign = \"center\";\r\n        ctx.fillText(price, this.st2(300), this.st2(680));\r\n      });\r\n\r\n      // /** 绘制底部文字 */\r\n      await dp.draw((ctx) => {\r\n        ctx.fillStyle = \"#666\";\r\n        ctx.font = `${this.st2(24)}px PingFang SC`;\r\n        ctx.fillText(\"长按图片，识别二维码\", this.st2(200), this.st2(866));\r\n        ctx.fillStyle = \"#666\";\r\n        ctx.font = `${this.st2(24)}px PingFang SC`;\r\n        ctx.fillText(\"查看商品详情\", this.st2(200), this.st2(900));\r\n      });\r\n\r\n      this.imgUrl = await dp.createImagePath();\r\n\r\n      // console.log(posterImgUrl)\r\n    },\r\n  },\r\n\r\n  async mounted() {\r\n    this.init();\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\npage,\r\n.index {\r\n  height: 100%;\r\n}\r\n.canvas-hide {\r\n  /* 1 */\r\n  position: fixed;\r\n  right: 100vw;\r\n  bottom: 100vh;\r\n  /* 2 */\r\n  z-index: -9999;\r\n  /* 3 */\r\n  opacity: 0;\r\n}\r\n.index {\r\n  position: relative;\r\n  text-align: center;\r\n  background: rgba($color: grey, $alpha: 0.2);\r\n}\r\n\r\nimage {\r\n  display: block;\r\n}\r\n.img {\r\n  width: 600rpx;\r\n  height: 960rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/m-city/m-city.vue",
    "content": "<template>\r\n  <view>\r\n    <view\r\n      class=\"mask\"\r\n      :class=\"{ maskShow: showPicker }\"\r\n      @click=\"hide\"\r\n      @click.stop.prevent\r\n      @touchmove.stop.prevent\r\n      catchtouchmove=\"true\"\r\n    ></view>\r\n    <view class=\"cpicker-content\" :class=\"{ cpickerShow: showPicker }\">\r\n      <view\r\n        class=\"city-head\"\r\n        @click.stop.prevent\r\n        @touchmove.stop.prevent\r\n        catchtouchmove=\"true\"\r\n      >\r\n        <view class=\"city-head-title\">{{ headTitle }}</view>\r\n        <icon\r\n          type=\"clear\"\r\n          v-if=\"clearRightIcon\"\r\n          class=\"clearRightIcon\"\r\n          size=\"20\"\r\n          color=\"#cccccc\"\r\n          @click=\"hide\"\r\n        ></icon>\r\n      </view>\r\n      <scroll-view\r\n        id=\"nav-bar\"\r\n        class=\"nav-bar\"\r\n        scroll-x=\"true\"\r\n        scroll-with-animation=\"true\"\r\n        :scroll-left=\"scrollLeft\"\r\n      >\r\n        <view\r\n          v-for=\"(item, index) in tabbars\"\r\n          class=\"nav-item\"\r\n          :key=\"index\"\r\n          :id=\"'tab' + index\"\r\n          @click=\"changeTab(index)\"\r\n          :class=\"{ current: index === tabCurrentIndex }\"\r\n          ><text class=\"nav-bar-title\">{{ item.localName }}</text></view\r\n        >\r\n      </scroll-view>\r\n      <view class=\"city_content\">\r\n        <scroll-view\r\n          class=\"panel-scroll-box\"\r\n          :scroll-y=\"enableScroll\"\r\n          :cscrollTop=\"scrollTop\"\r\n          :current=\"tabCurrentIndex\"\r\n          :scroll-top=\"scrollTop\"\r\n        >\r\n          <block\r\n            v-for=\"(item, index) in tabbars[tabCurrentIndex].children\"\r\n            :key=\"index\"\r\n          >\r\n            <view\r\n              class=\"flex-row-c-c\"\r\n              @click=\"changCity(tabCurrentIndex, item)\"\r\n            >\r\n              <text\r\n                class=\"city-text\"\r\n                :class=\"{ color: tabbars[tabCurrentIndex].id == item.id }\"\r\n                >{{ item.name }}</text\r\n              >\r\n              <icon\r\n                type=\"success_no_circle\"\r\n                v-if=\"tabbars[tabCurrentIndex].id == item.id\"\r\n                :id=\"'show' + tabCurrentIndex\"\r\n                class=\"ischeck\"\r\n                size=\"14\"\r\n                :color=\"$lightColor\"\r\n              ></icon>\r\n            </view>\r\n          </block>\r\n        </scroll-view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nlet windowWidth = 0\r\nimport { getRegionsById } from \"@/api/common.js\";\r\nexport default {\r\n  name: \"UniCityNvue\",\r\n  props: {\r\n    headTitle: {\r\n      //标题\r\n      type: String,\r\n      default: \"区域选择\",\r\n    },\r\n    pickerSize: {\r\n      // 使用多少个tab\r\n      type: [String, String],\r\n      default: \"1\",\r\n    },\r\n    provinceData: {\r\n      // 默认的省市区id，如果不使用id的情况下则为[]；\r\n      type: Array,\r\n      default: function () {\r\n        return [];\r\n      },\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      clearRightIcon: true, //是否显示右侧关闭icon\r\n      scrollLeft: 500, //顶部选项卡左滑距离\r\n      scrollTop: 0, //默认滚动顶部为0\r\n      enableScroll: true, //是否启用滚动\r\n      tabCurrentIndex: 0, //当前选项卡索引\r\n      tabbars: this.provinceData, //默认的省市区id\r\n      pickersize: this.pickerSize, //多少个tab 推荐为4级 \r\n      showPicker: false, //显示选取器\r\n    };\r\n  },\r\n  methods: {\r\n\r\n    /**\r\n     * 显示选择器\r\n     */\r\n    show() {\r\n      this.showPicker = true;\r\n      if (this.tabbars[0].children.length == 0) {\r\n        getRegionsById(0).then((res) => {\r\n          this.tabbars[0].children = res.data.result;\r\n        });\r\n      }\r\n\r\n      windowWidth = uni.getSystemInfoSync().windowWidth;\r\n    },\r\n\r\n    /**\r\n     * 关闭选择器\r\n     */\r\n    hide() {\r\n      this.showPicker = false;\r\n    },\r\n    \r\n    /**\r\n     * tab切换\r\n     */\r\n    changeTab(e) {\r\n      let index = e;\r\n      this.setScroll(index);\r\n      //延迟300ms,等待swiper动画结束再修改tabbar\r\n      this.tabCurrentIndex = index;\r\n      setTimeout(() => {\r\n        this.getScroll(\"show\" + index);\r\n      }, 10);\r\n    },\r\n    \r\n    /**\r\n     * 获得元素的大小\r\n     */\r\n    getElSize(id) {\r\n      return new Promise((res, rej) => {\r\n        let el = uni\r\n          .createSelectorQuery()\r\n          .in(this)\r\n          .select(\"#\" + id);\r\n        el.fields(\r\n          {\r\n            size: true,\r\n            scrollOffset: true,\r\n            rect: true,\r\n          },\r\n          (data) => {\r\n            res(data);\r\n          }\r\n        ).exec();\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 点击城市后回调\r\n     */\r\n    async changCity(index, item) {\r\n      if (this.tabbars[index].id != item.id) {\r\n        this.tabbars[index].localName = item.name;\r\n        this.tabbars[index].id = item.id;\r\n        this.tabbars[index].center = item.center\r\n        if (index < this.tabbars.length - 1) {\r\n          this.tabbars.splice(index + 1, this.tabbars.length - index - 1);\r\n        }\r\n        if (this.tabbars.length < this.pickersize) {\r\n          uni.showLoading({\r\n            title: \"加载中\",\r\n            mask:true\r\n          });\r\n          try {\r\n            let data = await getRegionsById(item.id);\r\n            uni.hideLoading();\r\n            // 当前选项级为最后一级时回调，将选中的数据返回\r\n            if (data.data.result.length == 0) {\r\n              this.$emit(\"funcValue\", this.tabbars);\r\n              this.hide();\r\n            } else {\r\n              // 将新的数据填充进下一级\r\n              var current = {\r\n                localName: \"请选择\",\r\n                id: \"\",\r\n                children: data.data.result,\r\n                \r\n              };\r\n              this.tabbars.push(current);\r\n              this.tabCurrentIndex++;\r\n\r\n              // 当前距离重新为最上面\r\n              this.$set(this,'scrollTop',0)\r\n            }\r\n            } catch (error) {\r\n              uni.hideLoading();\r\n            }\r\n         \r\n        } else {\r\n          this.$emit(\"funcValue\", this.tabbars);\r\n          this.hide();\r\n        }\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 获取当前tab中滚动的距离\r\n     */\r\n    async setScroll(index) {\r\n      let width = 0;\r\n      let nowWidth = 0;\r\n      for (let i = 0; i <= index; i++) {\r\n        let result = await this.getElSize(\"tab\" + i);\r\n        width += result.width;\r\n        if (i === index) {\r\n          nowWidth = result.width;\r\n        }\r\n      }\r\n      if (width + nowWidth > windowWidth) {\r\n        this.scrollLeft = width + nowWidth;\r\n      } else {\r\n        this.scrollLeft = 0;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 计算当前的滚动距离\r\n     */\r\n    getScroll(id) {\r\n      uni\r\n        .createSelectorQuery()\r\n        .in(this)\r\n        .select(\".panel-scroll-box\")\r\n        .boundingClientRect((data) => {\r\n          uni\r\n            .createSelectorQuery()\r\n            .in(this)\r\n            .select(\"#\" + id)\r\n            .boundingClientRect((res) => {\r\n              if (res != undefined && res != null && res != \"\") {\r\n                this.scrollTop = res.top - data.top;\r\n              }\r\n            })\r\n            .exec();\r\n        })\r\n        .exec();\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n.mask {\r\n  visibility: hidden;\r\n  position: fixed;\r\n  top: 0;\r\n  right: 0;\r\n  left: 0;\r\n  bottom: 0;\r\n  z-index: 1000;\r\n  background: rgba(0, 0, 0, 0.6);\r\n  opacity: 0;\r\n  transition: all 0.3s ease;\r\n}\r\n.maskShow {\r\n  visibility: visible;\r\n  opacity: 1;\r\n}\r\n.cpicker-content {\r\n  position: fixed;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n  background-color: #ffffff;\r\n  transition: all 0.3s ease;\r\n  transform: translateY(100%);\r\n  z-index: 3000;\r\n}\r\n.cpickerShow {\r\n  transform: translateY(0);\r\n}\r\n.city-head {\r\n  width: 750rpx;\r\n  height: 88rpx;\r\n  flex-direction: column;\r\n  border-bottom-width: 1px;\r\n  border-bottom-color: #f4f4f4;\r\n  border-bottom-style: solid;\r\n}\r\n.city-head-title {\r\n  font-size: 15px;\r\n  line-height: 88rpx;\r\n  align-items: center;\r\n  /* #ifndef APP-NVUE */\r\n  text-align: center;\r\n  /* #endif */\r\n}\r\n.clearRightIcon {\r\n  position: absolute;\r\n  right: 15px;\r\n  top: 12px;\r\n  font-size: 10px;\r\n  color: #bebebe;\r\n}\r\n.nav-bar {\r\n  position: relative;\r\n  z-index: 10;\r\n  height: 90rpx;\r\n  white-space: nowrap;\r\n  box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);\r\n  background-color: #fff;\r\n}\r\n\r\n.nav-item {\r\n  /* #ifndef APP-NVUE */\r\n  display: inline-flex !important;\r\n  /* #endif */\r\n  /* #ifdef APP-NVUE */\r\n  flex-direction: row !important;\r\n  /* #endif */\r\n  width: 170rpx;\r\n  padding: 7px 0px;\r\n  line-height: 26px;\r\n  align-items: center;\r\n  justify-content: center;\r\n  color: #303133;\r\n  position: relative;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n.nav-bar-title {\r\n  font-size: 12px;\r\n}\r\n.current {\r\n  color: $aider-light-color;\r\n  border-color: $aider-light-color;\r\n  border-bottom-width: 4rpx;\r\n  border-bottom-style: solid;\r\n}\r\n.current:after {\r\n  width: 50%;\r\n}\r\n.panel-scroll-box {\r\n  height: 516rpx;\r\n  margin-top: 8px;\r\n}\r\n.flex-row-c-c {\r\n  /* #ifndef APP-NVUE */\r\n  display: block;\r\n  /* #endif */\r\n  /* #ifdef APP-NVUE */\r\n  flex-direction: row;\r\n  /* #endif */\r\n  padding-left: 25px;\r\n}\r\n.city-text {\r\n  /* #ifdef APP-NVUE */\r\n  flex-direction: row;\r\n  /* #endif */\r\n  height: 35px;\r\n  line-height: 35px;\r\n  font-size: 13px;\r\n}\r\n.hide {\r\n  opacity: 0;\r\n}\r\n.ischeck {\r\n  /* #ifndef APP-NVUE */\r\n  display: inline-flex !important;\r\n  /* #endif */\r\n  /* #ifdef APP-NVUE */\r\n  flex-direction: column;\r\n  /* #endif */\r\n  margin-right: 5px;\r\n  vertical-align: middle;\r\n}\r\n.color {\r\n  color: $light-color;\r\n}\r\nicon {\r\n  margin-left: 40rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/m-goods-list/README.md",
    "content": "## 商品列表展示\n\n### OBJECT 参数说明\n\n| 属性        | 说明                                                       | 类型    | 必填 |\n| ----------- | ---------------------------------------------------------- | ------- | ---- |\n| `res`       | 显示数据                                                   | Array   | 是   |\n| `type`      | 商品展示类型 oneColumns twoColumns  ，默认展示一行两列商品 | String  | 否   |\n| `storeName` | 是否展示店铺名称，默认展示                                 | Boolean | 否   |\n| `keywords` | 高亮展示搜索内容                                 | String | 否   |\n\n"
  },
  {
    "path": "components/m-goods-list/base-list.vue",
    "content": "<template>\n  <div>\n    <!-- 一行两列商品展示 -->\n    <view class=\"goods-list\" v-if=\"type == 'twoColumns'\">\n      <view v-for=\"(item, index) in res\" :key=\"index\" class=\"goods-item\">\n        <view class=\"image-wrapper\" @click=\"navigateToDetailPage(item)\">\n          <u-image\n            :src=\"item.thumbnail\"\n            width=\"100%\"\n            height=\"330rpx\"\n           mode=\"aspectFit\"\n          >\n            <u-loading slot=\"loading\"></u-loading>\n          </u-image>\n        </view>\n        <view class=\"goods-detail\">\n          <div\n            class=\"title clamp\"\n            v-html=\"lightSearchStr(keyword, item.goodsName)\"\n            @click=\"navigateToDetailPage(item)\"\n          ></div>\n          <view class=\"price-box\" @click=\"navigateToDetailPage(item)\">\n            <div class=\"price\" v-if=\"item.price != undefined\">\n              ¥<span\n                >{{\n                  $options.filters.goodsFormatPrice(item.price)[0]\n                }} </span\n              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}\n            </div>\n          </view>\n          <div class=\"count-config\" @click=\"navigateToDetailPage(item)\">\n            <span>已售 {{ item.buyCount || \"0\" }}</span>\n            <span>{{ item.commentNum || \"0\" }}条评论</span>\n          </div>\n          <div\n            class=\"store-seller-name\"\n            v-if=\"storeName\"\n            @click=\"navigateToStoreDetailPage(item)\"\n          >\n            <div class=\"text-hidden\">\n              <u-tag\n                style=\"margin-right: 10rpx\"\n                size=\"mini\"\n                mode=\"dark\"\n                v-if=\"item.selfOperated\"\n                text=\"自营\"\n                type=\"error\"\n              />\n              <span>{{ item.storeName || \"暂无\" }}</span>\n            </div>\n            <span>\n              <u-icon name=\"arrow-right\"></u-icon>\n            </span>\n          </div>\n        </view>\n      </view>\n    </view>\n\t <!-- 一行一列商品展示 -->\n    <div v-if=\"type == 'oneColumns'\">\n      <div  v-for=\"(item, index) in res\" :key=\"index\" class=\"goods-row\">\n        <div class=\"flex goods-col\">\n          <div class=\"goods-img\" @click=\"navigateToDetailPage(item)\">\n            <u-image\n              width=\"230rpx\"\n              border-radius=\"16\"\n              height=\"230rpx\"\n\t\t\t\t\t\t\tmode=\"aspectFit\"\n              :src=\"item.goodsImage || item.thumbnail\"\n            >\n              <u-loading slot=\"loading\"></u-loading>\n            </u-image>\n          </div>\n          <div class=\"goods-detail\">\n            <div class=\"title clamp3\" @click=\"navigateToDetailPage(item)\">\n              {{ item.goodsName }}\n            </div>\n            <view class=\"price-box\" @click=\"navigateToDetailPage(item)\">\n              <div class=\"price\" v-if=\"item.price != undefined\">\n                ¥<span\n                  >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span\n                >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}\n              </div>\n            </view>\n            <div class=\"promotion\" @click=\"navigateToDetailPage(item)\">\n              <div v-if=\"item.salesModel == 'WHOLESALE'\">\n                <span>批</span>\n              </div>\n              <div\n                v-for=\"(promotionItem, promotionIndex) in getPromotion(item)\"\n                :key=\"promotionIndex\"\n              >\n                <span v-if=\"promotionItem.indexOf('COUPON') != -1\">劵</span>\n                <span v-if=\"promotionItem.indexOf('FULL_DISCOUNT') != -1\"\n                  >满减</span\n                >\n                <span v-if=\"promotionItem.indexOf('SECKILL') != -1\">秒杀</span>\n              </div>\n            </div>\n            <div\n              style=\"overflow: hidden\"\n              @click=\"navigateToDetailPage(item)\"\n              class=\"count-config\"\n            >\n              <span style=\"float: left; font-size: 22rpx\"\n                >已售 {{ item.buyCount || \"0\" }}</span\n              >\n              <span style=\"float: right; font-size: 22rpx\"\n                >{{ item.commentNum || \"0\" }}条评论</span\n              >\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport commonTpl from \"@/components/m-goods-list/common\";\nexport default {\n  data() {\n    return {\n      lightColor: this.$mainColor,\n    };\n  },\n  mixins: [commonTpl],\n  props: {\n\t// 展示的类型\n\ttype:{\n\t\ttype:String,\n\t\tdefault:\"oneColumns\"\n\t},\n    // 遍历的数据\n    res: {\n      type: Array,\n      default: () => {\n        return [];\n      },\n    },\n  },\n  methods: {\n    // 跳转到商品详情\n    navigateToDetailPage(item) {\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.goods-list {\n  display: flex;\n  flex-wrap: wrap;\n  margin: 10rpx 20rpx 284rpx;\n  width: 100%;\n\n  > .goods-item {\n    background-color: #ffffff;\n    display: flex;\n    border-radius: 16rpx;\n    flex-direction: column;\n    width: calc(50% - 30rpx);\n    margin-bottom: 20rpx;\n    padding-bottom: 20rpx;\n\n    &:nth-child(2n + 1) {\n      margin-right: 20rpx;\n    }\n\n    .image-wrapper {\n      width: 100%;\n      height: 330rpx;\n      border-radius: 16rpx 16rpx 0 0;\n      overflow: hidden;\n      padding: 0;\n    }\n  }\n\n  .count-config,\n  .store-seller-name {\n    font-size: $font-sm;\n  }\n\n  .text-hidden {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n}\n\n.goods-row {\n  background: #fff;\n  padding: 16rpx;\n\n  > .goods-col {\n    display: flex;\n\n    > .goods-img {\n      overflow: hidden;\n      flex: 4;\n    }\n\n    > .goods-detail {\n      flex: 7;\n    }\n  }\n}\n\n.goods-detail {\n  margin: 0 20rpx;\n\n  > .title {\n    font-size: $font-base;\n    color: $font-color-dark;\n    line-height: 1.5;\n    height: 86rpx;\n    padding: 10rpx 0 0;\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-line-clamp: 2;\n    overflow: hidden;\n  }\n\n  .promotion {\n    margin-top: 4rpx;\n    display: flex;\n\n    div {\n      span {\n        font-size: 24rpx;\n        color: $light-color;\n        margin-right: 10rpx;\n        padding: 0 4rpx;\n        border-radius: 2rpx;\n      }\n    }\n  }\n\n  .store-seller-name {\n    color: #666;\n    overflow: hidden;\n    display: flex;\n    justify-content: space-between;\n  }\n\n  .count-config {\n    padding: 5rpx 0;\n    color: #666;\n    display: flex;\n    font-size: 24rpx;\n    justify-content: space-between;\n  }\n\n  > .price-box {\n    margin-top: 10rpx;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding-right: 10rpx;\n    font-size: 24rpx;\n    color: $font-color-light;\n\n    > .price {\n      font-size: 26rpx;\n      line-height: 1;\n      color: $main-color;\n      font-weight: bold;\n\n      /deep/ span:nth-of-type(1) {\n        font-size: 38rpx;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "components/m-goods-list/common.vue",
    "content": "<template>\n</template>\n\n<script>\n\texport default {\n\t\tmethods: {\n\t\t\t// 高亮显示搜索内容\t\n\t\t\tlightSearchStr(keyword, str) {\n\t\t\t\tif (!keyword) {\n\t\t\t\t\treturn str\n\t\t\t\t} else {\n\t\t\t\t\tlet unicodes = '';\n\t\t\t\t\tfor (let i of Array.from(keyword)) {\n\t\t\t\t\t\tunicodes += this.unicode(i) + \"|\"\n\t\t\t\t\t}\n\t\t\t\t\tconst rule = '(' + unicodes + ')'\n\t\t\t\t\tconst reg = new RegExp(rule, 'gi');\n\t\t\t\t\treturn str ? str.replace(reg, matchValue =>\n\t\t\t\t\t\t`<span style=\"color:${this.lightColor}\">${matchValue}</span>`\n\t\t\t\t\t) : ''\n\t\t\t\t}\n\t\t\t},\n\t\t\t//  转换为unicode\n\t\t\tunicode(str) {\n\t\t\t\tvar value = '';\n\t\t\t\tfor (var i = 0; i < str.length; i++) {\n\t\t\t\t\tvalue += '\\\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\tleft_zero_4(str) {\n\t\t\t\tif (str != null && str != '' && str != 'undefined') {\n\t\t\t\t\tif (str.length == 2) {\n\t\t\t\t\t\treturn '00' + str;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t},\n\t\t\t// 数据去重一下 只显示一次 减免 劵 什么的\n\t\t\tgetPromotion(item) {\n\t\t\t\tif (item.promotionMap) {\n\t\t\t\t\tlet array = [];\n\t\t\t\t\tObject.keys(item.promotionMap).forEach((child) => {\n\t\t\t\t\t\tif (!array.includes(child.split(\"-\")[0])) {\n\t\t\t\t\t\t\tarray.push(child.split(\"-\")[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn array;\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 跳转到商品详情\n\t\t\tnavigateToDetailPage(item) {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,\n\t\t\t\t});\n\t\t\t},\n\t\t\t// 跳转地址\n\t\t\tnavigateToStoreDetailPage(item) {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl: `/pages/product/shopPage?id=${item.storeId}`,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t}\n</script>\n\n<style lang='scss' scoped>\n\t\n</style>\n"
  },
  {
    "path": "components/m-goods-list/list.vue",
    "content": "<template>\n\t<view>\n\t\t<!-- 一行两列商品展示 -->\n\t\t<view class=\"goods-list\" v-if=\"type == 'twoColumns'\">\n\t\t\t<view v-for=\"(item, index) in res\" :key=\"index\" class=\"goods-item\">\n\t\t\t\t<view class=\"image-wrapper\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t<u-image :src=\"item.thumbnail\" width=\"100%\" height='330rpx' mode=\"aspectFit\">\n\t\t\t\t\t\t<u-loading slot=\"loading\"></u-loading>\n\t\t\t\t\t</u-image>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"goods-detail\">\n\t\t\t\t\t<div class=\"title clamp\" v-html=\"lightSearchStr(keyword,item.goodsName)\"\n\t\t\t\t\t\t@click=\"navigateToDetailPage(item)\">\n\n\t\t\t\t\t</div>\n\t\t\t\t\t<view class=\"price-box\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t\t<div class=\"price\" v-if=\"item.price!=undefined\">\n\t\t\t\t\t\t\t¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{\n\t            $options.filters.goodsFormatPrice(item.price )[1]\n\t          }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</view>\n\t\t\t\t\t<div class=\"promotion\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t\t<div v-if=\"item.salesModel == 'WHOLESALE'\">\n\t\t\t\t\t\t\t<span>批</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-for=\"(promotionItem,promotionIndex) in  getPromotion(item)\" :key=\"promotionIndex\">\n\t\t\t\t\t\t\t<span v-if=\"promotionItem.indexOf('COUPON') != -1\">劵</span>\n\t\t\t\t\t\t\t<span v-if=\"promotionItem.indexOf('FULL_DISCOUNT') != -1\">满减</span>\n\t\t\t\t\t\t\t<span v-if=\"promotionItem.indexOf('SECKILL') != -1\">秒杀</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"count-config\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t\t<span>已售 {{ item.buyCount || \"0\" }}</span>\n\t\t\t\t\t\t<span>{{ item.commentNum || \"0\" }}条评论</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"store-seller-name\" v-if=\"storeName\" @click=\"navigateToStoreDetailPage(item)\">\n\t\t\t\t\t\t<div class=\"text-hidden\">\n\t\t\t\t\t\t\t<u-tag style=\"margin-right: 10rpx\" size=\"mini\" mode=\"dark\" v-if=\"item.selfOperated\"\n\t\t\t\t\t\t\t\ttext=\"自营\" type=\"error\" />\n\t\t\t\t\t\t\t<span>{{ item.storeName || \"暂无\" }}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<u-icon name=\"arrow-right\"></u-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t\t<!-- 一行一列商品展示 -->\n\t\t<div v-if=\"type == 'oneColumns'\"  class=\"goods-one-row\">\n\t\t\t<div v-for=\"(item, index) in res\" :key=\"index\" class=\"goods-row\">\n\t\t\t\t<div class=\"flex goods-col\">\n\t\t\t\t\t<div class=\"goods-img\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t\t<u-image width=\"230rpx\" mode=\"aspectFit\" border-radius='16' height=\"230rpx\" :src=\"item.thumbnail\">\n\t\t\t\t\t\t\t<u-loading slot=\"loading\"></u-loading>\n\t\t\t\t\t\t</u-image>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"goods-detail\">\n\t\t\t\t\t\t<div class=\"title clamp3\" @click=\"navigateToDetailPage(item)\">{{ item.goodsName }}</div>\n\t\t\t\t\t\t<view class=\"price-box\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t\t\t<div class=\"price\" v-if=\"item.price!=undefined\">\n\t\t\t\t\t\t\t\t¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{\n\t\t\t            $options.filters.goodsFormatPrice(item.price )[1]\n\t\t\t          }}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<div class=\"promotion\" @click=\"navigateToDetailPage(item)\">\n\t\t\t\t\t\t\t<div v-if=\"item.salesModel == 'WHOLESALE'\">\n\t\t\t\t\t\t\t\t<span>批</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div v-for=\"(promotionItem,promotionIndex) in  getPromotion(item)\" :key=\"promotionIndex\">\n\t\t\t\t\t\t\t\t<span v-if=\"promotionItem.indexOf('COUPON') != -1\">劵</span>\n\t\t\t\t\t\t\t\t<span v-if=\"promotionItem.indexOf('FULL_DISCOUNT') != -1\">满减</span>\n\t\t\t\t\t\t\t\t<span v-if=\"promotionItem.indexOf('SECKILL') != -1\">秒杀</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style=\"overflow: hidden\" @click=\"navigateToDetailPage(item)\" class=\"count-config\">\n\t\t\t\t\t\t\t<span style=\"float: left; font-size: 22rpx\">已售 {{ item.buyCount || '0' }}</span>\n\t\t\t\t\t\t\t<span style=\"float: right; font-size: 22rpx\">{{ item.commentNum || '0' }}条评论</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style=\"overflow: hidden\" @click=\"navigateToStoreDetailPage(item)\" class=\"count-config\">\n\t\t\t\t\t\t\t<div class=\"text-hidden\" v-if=\"storeName\">\n\t\t\t\t\t\t\t\t<u-tag style=\"margin-right: 10rpx\" size=\"mini\" mode=\"dark\" v-if=\"item.selfOperated\"\n\t\t\t\t\t\t\t\t\ttext=\"自营\" type=\"error\" />\n\t\t\t\t\t\t\t\t<span class=\"line1-store-name\">{{ item.storeName }}</span>\n\t\t\t\t\t\t\t\t<span class=\"to-store\">进店<u-icon size=\"24\" name=\"arrow-right\" color=\"#666\"></u-icon>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<u-icon name=\"arrow-right\" color=\"#c5c5c5\"></u-icon>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t</div>\n\t\t</div>\n\n\t</view>\n</template>\n\n<script>\n\timport commonTpl from '@/components/m-goods-list/common'\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tlightColor: this.$mainColor\n\t\t\t}\n\t\t},\n\t\tmixins: [commonTpl],\n\t\t\n\t\tprops: {\n\t\t\t// 遍历的数据\n\t\t\tres: {\n\t\t\t\ttype: Array,\n\t\t\t\tdefault: () => {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 一行两列还是一行一列显示\n\t\t\ttype: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: 'twoColumns',\n\t\t\t\tvalidator() {\n\t\t\t\t\treturn ['twoColumns', 'oneColumns']\n\t\t\t\t}\n\t\t\t},\n\t\t\tstoreName: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\t\t\tkeyword: {\n\t\t\t\ttype: null,\n\t\t\t\tdefault: ''\n\t\t\t}\n\n\t\t},\n\t\twatch: {\n\t\t\tkeyword(val) {\n\t\t\t\tif (val) {\n\t\t\t\t\tthis.lightSearchStr(val)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\n\t\t\t// 高亮显示搜索内容\t\n\t\t\tlightSearchStr(keyword, str) {\n\t\t\t\tif (!keyword) {\n\t\t\t\t\treturn str\n\t\t\t\t} else {\n\t\t\t\t\tlet unicodes = '';\n\t\t\t\t\tfor (let i of Array.from(keyword)) {\n\t\t\t\t\t\tunicodes += this.unicode(i) + \"|\"\n\t\t\t\t\t}\n\t\t\t\t\tconst rule = '(' + unicodes + ')'\n\t\t\t\t\tconst reg = new RegExp(rule, 'gi');\n\t\t\t\t\treturn str ? str.replace(reg, matchValue =>\n\t\t\t\t\t\t`<span style=\"color:${this.lightColor}\">${matchValue}</span>`\n\t\t\t\t\t) : ''\n\t\t\t\t}\n\t\t\t},\n\t\t\t//  转换为unicode\n\t\t\tunicode(str) {\n\t\t\t\tvar value = '';\n\t\t\t\tfor (var i = 0; i < str.length; i++) {\n\t\t\t\t\tvalue += '\\\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\tleft_zero_4(str) {\n\t\t\t\tif (str != null && str != '' && str != 'undefined') {\n\t\t\t\t\tif (str.length == 2) {\n\t\t\t\t\t\treturn '00' + str;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t},\n\t\t\t// 数据去重一下 只显示一次 减免 劵 什么的\n\t\t\tgetPromotion(item) {\n\t\t\t\tif (item ? item.promotionMap : item.promotionMap) {\n\t\t\t\t\tconst fieldList = item ? item.promotionMap : item.promotionMap\n\t\t\t\t\tlet array = [];\n\t\t\t\t\tObject.keys(fieldList).forEach((child) => {\n\t\t\t\t\t\tif (!array.includes(child.split(\"-\")[0])) {\n\t\t\t\t\t\t\tarray.push(child.split(\"-\")[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn array;\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 跳转到商品详情\n\t\t\tnavigateToDetailPage(item) {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,\n\t\t\t\t});\n\t\t\t},\n\t\t\t// 跳转地址\n\t\t\tnavigateToStoreDetailPage(item) {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl: `/pages/product/shopPage?id=${item.storeId}`,\n\t\t\t\t});\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang='scss' scoped>\n\t\t.goods-one-row{\n\t\t\tpadding-bottom: 250rpx;\n\t\t}\n\t\t/* 商品列表 */\n\t\t.goods-list {\n\t\t\tdisplay: flex;\n\t\t\tflex-wrap: wrap;\n\t\t\tmargin: 10rpx 20rpx 284rpx;\n\t\t\twidth: 100%;\n\t\n\t\t\t>.goods-item {\n\t\t\t\tbackground-color: #ffffff;\n\t\t\t\tdisplay: flex;\n\t\t\t\tborder-radius: 16rpx;\n\t\t\t\tflex-direction: column;\n\t\t\t\twidth: calc(50% - 30rpx);\n\t\t\t\tmargin-bottom: 20rpx;\n\t\t\t\tpadding-bottom: 20rpx;\n\t\n\t\t\t\t&:nth-child(2n + 1) {\n\t\t\t\t\tmargin-right: 20rpx;\n\t\t\t\t}\n\t\n\t\n\t\t\t\t.image-wrapper {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 330rpx;\n\t\t\t\t\tborder-radius: 16rpx 16rpx 0 0;\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tpadding: 0;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t.count-config,\n\t\t\t.store-seller-name {\n\t\t\t\tfont-size: $font-sm;\n\t\t\t}\n\t\n\t\t\t.text-hidden {\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\t\t}\n\t\n\t\n\t\t.goods-row {\n\t\t\tbackground: #fff;\n\t\t\tpadding: 16rpx;\n\t\n\t\t\t>.goods-col {\n\t\t\t\tdisplay: flex;\n\t\n\t\t\t\t>.goods-img {\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tflex: 4;\n\t\t\t\t}\n\t\n\t\t\t\t>.goods-detail {\n\t\t\t\t\tflex: 7;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t.goods-detail {\n\t\t\tmargin: 0 20rpx;\n\t\n\t\t\t>.title {\n\t\t\t\tfont-size: $font-base;\n\t\t\t\tcolor: $font-color-dark;\n\t\t\t\tline-height: 1.5;\n\t\t\t\theight: 86rpx;\n\t\t\t\tpadding: 10rpx 0 0;\n\t\t\t\tdisplay: -webkit-box;\n\t\t\t\t-webkit-box-orient: vertical;\n\t\t\t\t-webkit-line-clamp: 2;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\n\t\t\t.promotion {\n\t\t\t\tmargin-top: 4rpx;\n\t\t\t\tdisplay: flex;\n\t\n\t\t\t\tdiv {\n\t\t\t\t\tspan {\n\t\t\t\t\t\tfont-size: 24rpx;\n\t\t\t\t\t\tcolor: $light-color;\n\t\t\t\t\t\tmargin-right: 10rpx;\n\t\t\t\t\t\tpadding: 0 4rpx;\n\t\t\t\t\t\tborder-radius: 2rpx;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t.store-seller-name {\n\t\t\t\tcolor: #666;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t}\n\t\n\t\t\t.count-config {\n\t\t\t\tpadding: 5rpx 0;\n\t\t\t\tcolor: #666;\n\t\t\t\tdisplay: flex;\n\t\t\t\tfont-size: 24rpx;\n\t\t\t\tjustify-content: space-between;\n\t\t\t}\n\t\n\t\t\t>.price-box {\n\t\t\t\tmargin-top: 10rpx;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tpadding-right: 10rpx;\n\t\t\t\tfont-size: 24rpx;\n\t\t\t\tcolor: $font-color-light;\n\t\n\t\t\t\t>.price {\n\t\t\t\t\tfont-size: 26rpx;\n\t\t\t\t\tline-height: 1;\n\t\t\t\t\tcolor: $main-color;\n\t\t\t\t\tfont-weight: bold;\n\t\n\t\t\t\t\t/deep/ span:nth-of-type(1) {\n\t\t\t\t\t\tfont-size: 38rpx;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t}\n</style>\n"
  },
  {
    "path": "components/m-goods-list/promotion.vue",
    "content": "<template>\r\n\t<div>\r\n\t\t<div v-for=\"(item, index) in res\" :key=\"index\" class=\"goods-row\" @click=\"navigateToDetailPage(item)\">\r\n\t\t\t<div class=\"flex goods-col\">\r\n\t\t\t\t<div class=\"goods-img\">\r\n\t\t\t\t\t<u-image width=\"230rpx\" mode=\"aspectFit\" border-radius='16' height=\"230rpx\" :src=\"item.goodsImage || item.thumbnail\">\r\n\t\t\t\t\t\t<u-loading slot=\"loading\"></u-loading>\r\n\t\t\t\t\t</u-image>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"goods-detail\">\r\n\t\t\t\t\t<div class=\"title clamp3\">{{ item.goodsName }}</div>\r\n\t\t\t\t\t<div class='flex flex-a-c flex-j-sb'>\r\n\t\t\t\t\t\t<view class=\"price-box\">\r\n\t\t\t\t\t\t\t<!-- 秒杀 / 拼团 -->\r\n\t\t\t\t\t\t\t<div class=\"price\" v-if=\"!type && item.price!=undefined\">\r\n\t\t\t\t\t\t\t\t¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{\r\n\t\t\t\t\t\t\t\t\t\t$options.filters.goodsFormatPrice(item.price )[1]\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<!-- 砍价 -->\r\n\t\t\t\t\t\t\t<div class=\"price\" v-if=\"type && item.purchasePrice!=undefined\">\r\n\t\t\t\t\t\t\t\t最低：\r\n\t\t\t\t\t\t\t\t¥<span>{{ $options.filters.goodsFormatPrice(item.purchasePrice )[0] }} </span>.{{\r\n\t\t\t\t\t\t\t\t\t\t$options.filters.goodsFormatPrice(item.purchasePrice )[1]\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<!-- 兜底策略如果金额是0 -->\r\n\t\t\t\t\t\t\t<div class=\"price\" v-if=\"!item.price && !type\">\r\n\t\t\t\t\t\t\t\t¥<span>0 </span>.00\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t<image class='buy' :src=\"buy\"></image>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class='count-config' v-if=\"!type\">\r\n\t\t\t\t\t\t<span>即将恢复{{ item.originalPrice}}元</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\n\timport commonTpl from '@/components/m-goods-list/common'\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tlightColor: this.$mainColor,\r\n\t\t\t\tbuy: require('@/static/buy.png')\r\n\t\t\t}\r\n\t\t},\r\n\t\tmixins: [commonTpl],\r\n\t\tprops: {\r\n\t\t\t// 遍历的数据\r\n\t\t\tres: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault: () => {\r\n\t\t\t\t\treturn []\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\ttype:{\r\n\t\t\t\ttype:null,\r\n\t\t\t\tdefault:\"\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 跳转到商品详情\r\n\t\t\tnavigateToDetailPage(item) {\r\n\t\t\t\tif(this.type == 'kanJia'){\r\n\t\t\t\t\t uni.navigateTo({\r\n\t\t\t\t\t\turl: `/pages/promotion/bargain/detail?id=${item.id}`,\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: `/pages/product/goods?id=${item.skuId}&goodsId=${item.goodsId}`,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang='scss' scoped>\r\n\t.buy {\r\n\t\twidth: 152rpx;\r\n\t\theight: 108rpx;\r\n\t}\r\n\t.flex-j-sb {\r\n\t\twidth: 100%;\r\n\t}\r\n\t.goods-row {\r\n\t\tbackground: #fff;\r\n\t\tpadding: 16rpx;\r\n\t\t>.goods-col {\r\n\t\t\tdisplay: flex;\r\n\t\t\t>.goods-img {\r\n\t\t\t\toverflow: hidden;\r\n\t\t\t\tflex: 4;\r\n\t\t\t}\r\n\t\t\t>.goods-detail {\r\n\t\t\t\tflex: 7;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t.goods-detail {\r\n\t\tmargin: 0 20rpx;\r\n\t\t>.title {\r\n\t\t\tfont-size: $font-base;\r\n\t\t\tcolor: $font-color-dark;\r\n\t\t\tline-height: 1.5;\r\n\t\t\theight: 86rpx;\r\n\t\t\tpadding: 10rpx 0 0;\r\n\t\t\tdisplay: -webkit-box;\r\n\t\t\t-webkit-box-orient: vertical;\r\n\t\t\t-webkit-line-clamp: 2;\r\n\t\t\toverflow: hidden;\r\n\t\t}\r\n\r\n\t\t.promotion {\r\n\t\t\tmargin-top: 4rpx;\r\n\t\t\tdisplay: flex;\r\n\r\n\t\t\tdiv {\r\n\t\t\t\tspan {\r\n\t\t\t\t\tfont-size: 24rpx;\r\n\t\t\t\t\tcolor: $light-color;\r\n\t\t\t\t\tmargin-right: 10rpx;\r\n\t\t\t\t\tpadding: 0 4rpx;\r\n\t\t\t\t\tborder-radius: 2rpx;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.count-config {\r\n\t\t\tpadding: 5rpx 0;\r\n\t\t\tcolor: #666;\r\n\t\t\tdisplay: flex;\r\n\t\t\tfont-size: 24rpx;\r\n\t\t\tletter-spacing:2rpx;\r\n\t\t\tpadding-left: 10rpx;\r\n\t\t}\r\n\r\n\r\n\r\n\t}\r\n\r\n\t.price-box {\r\n\t\tmargin-top: 10rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t\tpadding-right: 10rpx;\r\n\t\tfont-size: 24rpx;\r\n\t\tcolor: $font-color-light;\r\n\r\n\t\t>.price {\r\n\t\t\tfont-size: 26rpx;\r\n\t\t\tline-height: 1;\r\n\t\t\tcolor: $main-color;\r\n\t\t\tfont-weight: bold;\r\n\r\n\t\t\t/deep/ span:nth-of-type(1) {\r\n\t\t\t\tfont-size: 48rpx;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "components/m-goods-recommend/README.md",
    "content": "## 商品推荐 \n\n\n### OBJECT 参数说明\n属性|说明|类型|必填\n---|---|---|---\n`title`|标题，用于顶部显示的内容|String|否\n`pageSize`|显示多少条数据，建议是2的倍数,默认为12条|*|否\n`categoryId`|分类id|Function|否\n`storeId`|卖家id，搜索店铺商品的时候使用|String|否"
  },
  {
    "path": "components/m-goods-recommend/index.vue",
    "content": "<template>\n  <div>\n    <div class=\"goods-recommend\">{{title ? `--${title}-- `:''}}</div>\n\t\t <goodsTemplate :res='goodsList' />\n  </div>\n</template>\n<script>\n\timport goodsTemplate from '@/components/m-goods-list/list'\nimport { getGoodsList } from \"@/api/goods.js\";\nexport default {\n  data() {\n    return {\n      goodsList: [],\n      params: {\n        pageNumber: 1,\n      },\n    };\n  },\n  props: {\n    title: {\n      type: String,\n      default: \"\",\n    },\n    pageSize: {\n      type: null,\n      default: 12,\n    },\n    categoryId: {\n      type: null,\n      default: \"\",\n    },\n    storeId: {\n      type: null,\n      default: \"\",\n    },\n  },\n\tcomponents:{goodsTemplate},\n  mounted() {\n    this.initGoods();\n  },\n  methods: {\n    /**\n     * 初始化商品\n     */\n    async initGoods() {\n      let submit = JSON.parse(\n        JSON.stringify(\n          Object.assign(this.params, {\n            pageSize: this.pageSize,\n            categoryId: this.categoryId,\n            storeId: this.storeId,\n          })\n        )\n      );\n\n      Object.keys(submit).map((key) => {\n        if (!submit[key] || submit[key].length == 0) {\n          delete submit[key];\n        }\n      });\n      let goodsList = await getGoodsList(submit);\n      this.goodsList.push(...goodsList.data.result.records);\n    },\n    handleClick(item) {\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,\n      });\n    },\n  },\n};\n</script>\n\n<style scoped lang=\"scss\">\n/**商品代码 */\n$w_94: 94%;\n.goods-recommend {\n  background: #f7f7f7;\n  height: 100rpx;\n  line-height: 100rpx;\n  text-align: center;\n  font-size: 30rpx;\n  font-weight: bold;\n}\n.goods-list {\n  display: flex;\n  flex-wrap: wrap;\n  background: #f7f7f7;\n}\n.goods-item {\n  width: 50%;\n  margin-bottom: 10px;\n  border-radius: 0.4em;\n  overflow: hidden;\n}\n.goods-img {\n  position: relative;\n  margin: 0 auto;\n  width: $w_94;\n  height: 350rpx;\n  border-top-left-radius: 20rpx;\n  border-top-right-radius: 20rpx;\n  overflow: hidden;\n  > img {\n    width: 100%;\n    height: 100%;\n  }\n}\n.goods-desc {\n  border-bottom-left-radius: 20rpx;\n  border-bottom-right-radius: 20rpx;\n  width: $w_94;\n  background: #fff;\n  padding: 8rpx 0 8rpx 8rpx;\n  margin: 0 auto;\n  > .goods-title {\n    font-size: 12px;\n    height: 70rpx;\n    display: -webkit-box;\n    font-weight: 500;\n    -webkit-box-orient: vertical;\n\n    -webkit-line-clamp: 2;\n\n    overflow: hidden;\n  }\n\n  > .goods-bottom {\n    display: flex;\n    font-weight: bold;\n\n    > .goods-price {\n      line-height: 2;\n      color: $main-color;\n    }\n  }\n}\n</style>"
  },
  {
    "path": "components/m-placard/index.vue",
    "content": "<template>\n\t<div class=\"index\">\n\t\t<view v-model=\"show\" class=\"slot-content\">\n\t\t\t<image @click=\"downLoad()\" class=\"img\" :src=\"imgUrl\" />\n\t\t\t<div class=\"canvas-hide\">\n\t\t\t\t<!-- #ifdef MP-WEIXIN -->\n\t\t\t\t<canvas id=\"canvas\" type=\"2d\" style=\"width: 560px; height: 800px\" />\n\t\t\t\t<!-- #endif -->\n\t\t\t\t<!-- #ifndef MP-WEIXIN -->\n\t\t\t\t<canvas canvas-id=\"canvas\" id=\"canvas\" style=\"width: 560px; height: 800px\" />\n\t\t\t\t<!-- #endif -->\n\t\t\t</div>\n\t\t</view>\n\t</div>\n</template>\n<script>\n// 引入绘制插件\nimport DrawPoster from \"@/js_sdk/u-draw-poster\";\n// 生成二维码\nimport uQRCode from '@/components/Sansnn-uQRCode/uqrcode.js';\n\nexport default {\n  data: () => ({\n    imgUrl: \"\", //绘制出来的图片路径\n    show: false, //是否展示模态框\n    dp: {}, //绘制的dp对象，用于存储绘制等一些方法。\n    logo: require(\"@/pages/passport/static/logo-title.png\"), \t// 本地logo地址\n\tmyFace: require(\"@/pages/passport/static/missing-face.png\"),\t// 本地默认头像\n\tsharingLink: '',\t// 二维码链接\n  }),\n  props: {\n    /**\n     * 父级传参的数据\n     */\n    res: {\n      type: null,\n      default: \"\",\n    },\n  },\n  onUnload() {},\n  onReady() {},\n  methods: {\n    /** 解决微信小程序中图片模糊问题 */\n    // #ifdef MP-WEIXIN\n    st2: (size) => size * 2,\n    // #endif\n\n    // #ifndef MP-WEIXIN\n    st2: (size) => size,\n    // #endif\n\n    /** 保存图片 */\n\tdownLoad() {\n\t\tuni.saveImageToPhotosAlbum({\n\t\t\tfilePath: this.imgUrl,\n\t\t\tsuccess: function () {\n\t\t\t\tuni.showToast({title: \"保存成功！\",icon: \"none\",});\n\t\t\t},\n\t\t\tfail: function () {\n\t\t\t\tuni.showToast({title: \"保存失败，请稍后重试！\",icon: \"none\",});\n\t\t\t},\n\t\t});\n\t},\n    /** 创建canvas */\n    async init() {\n\t\tthis.show = true;\n\t\tthis.dp = await DrawPoster.build({\n\t\t\tselector: \"canvas\",\n\t\t\tcomponentThis: this,\n\t\t\tloading: true,\n\t\t\tdebugging: true,\n\t\t});\n\t\tlet dp = this.dp;\n\t\t// #ifdef MP-WEIXIN\n\t\t// 用于微信小程序中画布错乱问题\n\t\tdp.canvas.width = this.st2(560);\n\t\tdp.canvas.height = this.st2(800);\n\t\t// #endif\n\t\tthis.showQRCode(dp);\n    },\n\t/** 生成二维码 */\n\tasync showQRCode(dp){\n\t\tawait uQRCode.make({\n\t\t\tcanvasId: 'canvas', // canvas画布\n\t\t\tcomponentInstance: this, \n\t\t\ttext: this.res.bottom.code, // 二维码内容\n\t\t\tsize: 130, // 二维码大小 \n\t\t\tmargin: 5, // 二维码内边距\n\t\t\tbackgroundColor: '#ffffff', // ！ 二维码背景颜色\n\t\t\tforegroundColor: '#000000', // ！二维码色块颜色\n\t\t\tfileType: 'jpg',\n\t\t\terrorCorrectLevel: 0, // <== 关键 容错率，M:0,L:1,H:2,Q:3,\n\t\t\t// errorCorrectLevel: uQRCode.errorCorrectLevel.M, // <== 关键 容错率，M:0,L:1,H:2,Q:3,\n\t\t\tsuccess: res => {\n\t\t\t\tthis.sharingLink = res; // res => 图片路径\n\t\t\t\t// 对画布进行绘制\n\t\t\t\tthis.draw(dp);\n\t\t\t},\n\t\t\tfail: res => {\n\t\t\t\t// console.log('失败',res)\n\t\t\t}\n\t\t})\n\t},\n    async draw(dp) {\n\t\tconst { face, nickName, desc } = this.res.memberInfo;\n\t\tconst { width, height, background, title } = this.res.container;\n\t\tconst { code, img, price } = this.res.bottom;\n\n\t\t/** 绘制背景 */\n\t\tawait dp.draw((ctx) => {\n\t\t\tctx.fillStyle = background;\n\t\t\tctx.fillRoundRect( this.st2(0), this.st2(0), this.st2(width), this.st2(height), this.st2(12));\n\t\t\tctx.clip();\n\t\t});\n\t\t/** 绘制圆角矩形 */\n\t\tawait dp.draw(async (ctx)=>{\n\t\t\t// 设置矩形色彩\n\t\t\tctx.fillStyle = \"#ffffff\";\n\t\t\t// 设置图形轮廓的颜色。默认情况下，线条和填充颜色都是黑色（CSS 颜色值 #000000）\n\t\t\tctx.strokeStyle = \"#ffffff\";\n\t\t\t// 这个属性设置当前绘线的粗细。属性值必须为正数。描述线段宽度的数字。 0、 负数、 Infinity 和 NaN 会被忽略。默认值是1.0。\n\t\t\tctx.lineWidth = this.st2(1);\n\t\t\t// 进行绘制\n\t\t\tctx.fillRoundRect(30, 150, 500, 620, 0);\n\t\t\t// ctx.strokeRoundRect(30, 150, 500, 620, 0);\n\t\t\t// ctx.strokeRect(30, 150, 500, 620, 0);\n\t\t})\n\t\t/** 绘制图片 */\n\t\tdp.draw(async (ctx) => {\n\t\t\tawait Promise.all([\n\t\t\t\t// 绘制头像face\n\t\t\t\tctx.drawImage(face?face:this.myFace, this.st2(30), this.st2(30), this.st2(90), this.st2(90)),\n\t\t\t\t// 绘制Logo\n\t\t\t\t// ctx.drawImage( this.logo, this.st2(175), this.st2(0), this.st2(256), this.st2(144)),\n\t\t\t\t// 中间图片\n\t\t\t\tctx.drawImage(img, this.st2(60), this.st2(170), this.st2(440), this.st2(440)),\n\t\t\t\t// 二维码\n\t\t\t\tctx.drawImage(this.sharingLink, this.st2(375), this.st2(625), this.st2(130), this.st2(130))\n\t\t\t]);\n\t\t});\n\t\t/** 绘制顶部文字（昵称 简述） */\n\t\tawait dp.draw((ctx) => {\n\t\t\tctx.fillStyle = \"#666\";\n\t\t\tctx.font = `${this.st2(24)}px PingFang SC`;\n\t\t\tctx.fillText(nickName, this.st2(150), this.st2(65));\n\t\t\tctx.fillStyle = \"#666\";\n\t\t\tctx.font = `${this.st2(24)}px PingFang SC`;\n\t\t\tctx.fillText(desc, this.st2(150), this.st2(105));\n\t\t});\n\t\t/** 绘制中间文字（商品名称 价格） */\n\t\tawait dp.draw((ctx) => {\n\t\t\tctx.fillStyle = \"#333\";\n\t\t\tctx.font = `bold ${this.st2(24)}px PingFang SC`;\n\t\t\tctx.textAlign = \"left\";\n\t\t\tctx.fillWarpText({\n\t\t\t\ttext: title,\n\t\t\t\tlineHeight: this.st2(32),\n\t\t\t\tmaxWidth: this.st2(280),\n\t\t\t\tx: this.st2(60),\n\t\t\t\ty: this.st2(710),\n\t\t\t\tlayer: 2,\n\t\t\t});\n\t\t\tctx.fillStyle = \"#ff3c2a\";\n\t\t\tctx.font = `${this.st2(38)}px PingFang SC`;\n\t\t\tctx.textAlign = \"left\";\n\t\t\tctx.fillText(price, this.st2(60), this.st2(665));\n\t\t});\n\t\t/** 绘制底部文字 */\n\t\t// await dp.draw((ctx) => {\n\t\t// \tctx.fillStyle = \"#666\";\n\t\t// \tctx.font = `${this.st2(24)}px PingFang SC`;\n\t\t// \tctx.fillText(\"长按图片，识别二维码\", this.st2(200), this.st2(866));\n\t\t// \tctx.fillStyle = \"#666\";\n\t\t// \tctx.font = `${this.st2(24)}px PingFang SC`;\n\t\t// \tctx.fillText(\"查看商品详情\", this.st2(200), this.st2(900));\n\t\t// });\n\t\t\n\t\t// 绘制生成本地地址\n\t\tthis.imgUrl = await dp.createImagePath();\n    },\n  },\n\n  async mounted() {\n    this.init();\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage,\n.index {\n  height: 100%;\n}\n.canvas-hide {\n  /* 1 */\n  position: fixed;\n  right: 100vw;\n  bottom: 100vh;\n  /* 2 */\n  z-index: -9999;\n  /* 3 */\n  opacity: 0;\n}\n.index {\n  position: relative;\n  text-align: center;\n  background: rgba($color: grey, $alpha: 0.2);\n}\n\nimage {\n  display: block;\n}\n.img {\n  width: 560rpx;\n  height: 800rpx;\n}\n\n.qrcode-content {\n\twidth: 100rpx;\n\theight: 100rpx;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n</style>\n"
  },
  {
    "path": "components/m-search-revision/m-search-revision.vue",
    "content": "<template>\r\n  <view class=\"serach\">\r\n    <view class=\"left-box\" @tap=\"onClickLeft\">\r\n      <u-icon name=\"arrow-left\" size=\"40\" color=\"#666\"></u-icon>\r\n    </view>\r\n    <view class=\"content\" :style=\"{ 'border-radius': radius + 'px' }\">\r\n      <!-- HM修改 增加进入输入状态的点击范围 -->\r\n      <view class=\"content-box\" :class=\"{ center: mode === 2 }\">\r\n        <u-icon name=\"search\" size=\"32\" style=\"padding:0 15rpx;\"></u-icon>\r\n        <!-- HM修改 增加placeholder input confirm-type confirm-->\r\n        <input style=\"width:100%; \" :placeholder=\"placeholder\" placeholder-class=\"placeholder-color\"\r\n          @input=\"inputChange\" confirm-type=\"search\" @confirm=\"triggerConfirm\" class=\"input\"\r\n          :class=\"{ center: !active && mode === 2 }\" :focus=\"isFocus\" v-model=\"inputVal\" @focus=\"focus\" @blur=\"blur\" />\r\n        <u-icon name=\"close\" v-if=\"isDelShow\" style=\"padding:0 30rpx;\" @click=\"clear\"></u-icon>\r\n      </view>\r\n\r\n    </view>\r\n    <view class=\"button active\" >\r\n      <view v-if=\"isShowSeachGoods !=true\" class=\"button-item\">\r\n        <div @click=\"out()\">取消</div>\r\n      </view>\r\n\r\n      <view v-else class=\"button-item\">\r\n        <u-icon name=\"grid-fill\" size=\"50\" @click=\"handelListClass()\" v-if=\"!switchLayout\"></u-icon>\r\n        <u-icon v-else @click=\"handelListClass()\" name=\"list-dot\" size=\"50\"></u-icon>\r\n      </view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  props: {\r\n    mode: {\r\n      value: Number,\r\n      default: 1,\r\n    },\r\n    //HM修改 定义默认搜索关键词(水印文字)\r\n    placeholder: {\r\n      value: String,\r\n      default: \"请输入搜索内容\",\r\n    },\r\n    value: {\r\n      type: String,\r\n      default: \"\",\r\n    },\r\n    // 默认半径为60\r\n    radius: {\r\n      value: String,\r\n      default: 60,\r\n    },\r\n    // 是否获取焦点\r\n    isFocusVal: {\r\n      value: Boolean,\r\n      default: true,\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      isShowSeachGoods: false, //是否显示查询的商品\r\n      active: false, //是否选中\r\n      inputVal: \"\", //Input中内容\r\n      isDelShow: false, //是否显示右侧删除icon\r\n      isFocus: false, //是否获取焦点\r\n      switchLayout: true, //切换当前商品的布局，默认为两列\r\n    };\r\n  },\r\n  mounted() {\r\n    this.isFocus = this.isFocusVal;\r\n  },\r\n  methods: {\r\n    //\r\n    out() {\r\n      uni.reLaunch({\r\n        url: \"/pages/tabbar/home/index\",\r\n      });\r\n    },\r\n    // 切换排列顺序\r\n    handelListClass() {\r\n      this.switchLayout = !this.switchLayout;\r\n      this.$emit(\"SwitchType\");\r\n    },\r\n    //HM修改 触发组件confirm事件\r\n    triggerConfirm() {\r\n      this.$emit(\"confirm\", false);\r\n      uni.hideKeyboard();\r\n    },\r\n    //HM修改 触发组件input事件\r\n    inputChange(event) {\r\n      var keyword = event.detail.value;\r\n      this.$emit(\"input\", keyword);\r\n      if (this.inputVal) {\r\n        this.isDelShow = true;\r\n      }\r\n    },\r\n    focus() {\r\n      this.active = true;\r\n      //HM修改 增加获取焦点判断\r\n      if (this.inputVal) {\r\n        this.isDelShow = true;\r\n      }\r\n    },\r\n    blur() {\r\n      this.isFocus = false;\r\n      if (!this.inputVal) {\r\n        this.active = false;\r\n      }\r\n    },\r\n    clear() {\r\n      //HM修改 收起键盘\r\n      uni.hideKeyboard();\r\n      this.isFocus = false;\r\n      this.inputVal = \"\";\r\n      this.active = false;\r\n      //HM修改 清空内容时候触发组件input\r\n      this.$emit(\"input\", \"\");\r\n      //this.$emit('search', '');//HM修改 清空内容时候不进行搜索\r\n    },\r\n\r\n    /**\r\n     * 回退到上一级\r\n     */\r\n    onClickLeft() {\r\n      const paths = getCurrentPages();\r\n      console.log(paths)\r\n      if(paths.length > 1){\r\n        uni.navigateBack();\r\n      }else{\r\n        uni.switchTab({\r\n          url:\"/pages/tabbar/home/index\"\r\n        })\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 内容为空时，输入默认关键字\r\n     */\r\n    search() {\r\n      if (!this.inputVal) {\r\n        if (this.searchName == \"取消\") {\r\n          uni.hideKeyboard();\r\n          this.isFocus = false;\r\n          this.active = false;\r\n          return;\r\n        }\r\n      }\r\n      this.$emit(\"search\", this.inputVal ? this.inputVal : this.placeholder);\r\n    },\r\n  },\r\n  watch: {\r\n    /**\r\n     * 监听当前是否有值 是否显示清除图标\r\n     */\r\n    inputVal(newVal) {\r\n      newVal ? (this.isDelShow = true) : (this.isDelShow = false);\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.serach {\r\n  display: flex;\r\n  width: 100%;\r\n  //border-bottom: 1px #f5f5f5 solid; //HM修改 去掉边框\r\n  box-sizing: border-box;\r\n  font-size: $uni-font-size-base;\r\n\r\n  .left-box {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 15%;\r\n    /* #ifndef APP-NVUE */\r\n    text-align: center;\r\n    // display: flex;\r\n    // /* #endif */\r\n  }\r\n\r\n  .content {\r\n    display: flex;\r\n    align-items: center;\r\n    width: 100%;\r\n    height: 70rpx;\r\n    color: #999;\r\n    background: #eee;\r\n    overflow: hidden;\r\n    transition: all 0.2s linear;\r\n    .content-box {\r\n      width: 100%;\r\n      display: flex;\r\n      align-items: center;\r\n      &.center {\r\n        justify-content: center;\r\n      }\r\n\r\n      .icon {\r\n        padding: 0 15rpx;\r\n\r\n        &.icon-serach:before {\r\n          content: \"\\e61c\";\r\n        }\r\n      }\r\n\r\n      .input {\r\n        width: 100%;\r\n        max-width: 100%;\r\n        line-height: 60rpx;\r\n        height: 60rpx;\r\n        transition: all 0.2s linear;\r\n\r\n        &.center {\r\n          width: 200rpx;\r\n        }\r\n\r\n        &.sub {\r\n          // position: absolute;\r\n          width: auto;\r\n          color: grey;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  .button {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    position: relative;\r\n    flex-shrink: 0;\r\n    width: 0;\r\n    transition: all 0.2s linear;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n\r\n    &.active {\r\n      padding-left: 15rpx;\r\n      width: 100rpx;\r\n    }\r\n  }\r\n}\r\n\r\n.icon {\r\n  font-family: iconfont;\r\n  font-size: 32rpx;\r\n  font-style: normal;\r\n  color: #999;\r\n}\r\n\r\n.placeholder-color {\r\n  color: #999;\r\n  opacity: 0.4;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/m-share/index.vue",
    "content": "<template>\n  <!-- 遮罩层 -->\n  <u-popup @close=\"close\" v-model=\"show\" mode=\"bottom\" border-radius=\"30\" height=\"260rpx\">\n\n    <view class=\"share-title\">\n      <span>分享至</span>\n    </view>\n    <view class=\"share-list\">\n      <!-- #ifdef MP-WEIXIN -->\n      <view class=\"share-item\">\n        <button class=\"share-btn\" @click=\"weChatShare\" open-type=\"share\">\n          <u-icon color=\"#04BE02\" size=\"80\" name=\"weixin-fill\"></u-icon>微信好友\n        </button>\n      </view>\n      <!-- #endif -->\n      <!-- #ifdef APP-PLUS -->\n      <view class=\"share-item\" @click=\"handleShare(item)\" v-for=\"(item, index) in list\" :key=\"index\">\n        <u-icon :color=\"item.color\" size=\"80\" :name=\"item.icon\"></u-icon>\n        <view>{{ item.title }}</view>\n      </view>\n      <!-- #endif -->\n      <!-- #ifdef H5 -->  \n      <view class=\"share-item\" @click=\"copyLink()\">\n        <u-icon color=\"#b4aee8\" size=\"80\" name=\"share-fill\"></u-icon>\n        <view>{{ '复制链接' }}</view>\n      </view>\n      <!-- #endif -->\n    </view>\n  </u-popup>\n</template>\n<script>\nimport { h5Copy } from \"@/js_sdk/h5-copy/h5-copy.js\";\nimport configs from \"@/config/config\";\nimport mpShare from \"uview-ui/libs/mixin/mpShare.js\";\n\nexport default {\n  mixins: [mpShare],\n  data() {\n    return {\n      configs,\n      show: true,\n      list: [\n        {\n          color: \"#04BE02\",\n          title: \"微信好友\",\n          icon: \"weixin-fill\",\n          type: 0,\n        },\n        {\n          color: \"#04BE02\",\n          title: \"朋友圈\",\n          icon: \"weixin-circle-fill\",\n          type: 1,\n        },\n      ],\n    };\n  },\n  // 图片缩略图、 商品名称 、 type（goods,shop,pintuan) 拼团商品分享以及店铺分享\n\n  props: [\"thumbnail\", \"goodsName\", \"type\", \"goodsId\", \"link\"],\n  methods: {\n    close() {\n      this.$emit(\"close\");\n    },\n    weChatShare(){\n      this.$u.mpShare = {\n        title:  this.shareTitle(), // 默认为小程序名称，可自定义\n        path: '', // 默认为当前页面路径，一般无需修改，QQ小程序不支持\n        // 分享图标，路径可以是本地文件路径、代码包文件路径或者网络图片路径。\n        // 支持PNG及JPG，默认为当前页面的截图\n        imageUrl: this.thumbnail ||''\n      }\n    },\n\n    // h5复制链接\n    // #ifdef H5\n    copyLink() {\n      let content;\n      if (this.link) {\n        content = this.configs.shareLink + this.link;\n      } else {\n        content =\n          this.configs.shareLink +\n          getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath;\n      }\n      this.$options.filters.setClipboard(content)\n    },\n    // #endif\n\n    shareTitle() {\n      let shareTitle;\n      if (this.type == \"goods\") {\n        shareTitle = `[好友推荐]${this.goodsName}快来跟我一起看看吧`;\n      } else if (this.type == \"shops\") {\n        shareTitle = `[好友发现]${this.goodsName}快来跟我一起看看吧`;\n      } else if (this.type == \"pintuan\") {\n        shareTitle = `[好友邀请]${this.goodsName}快来跟我一起抢购吧!`;\n      } else if (this.type == \"kanjia\") {\n        shareTitle = `[好友邀请]请快来帮我砍一刀${this.goodsName}`;\n      }\n      return shareTitle;\n    },\n\n    // #ifdef APP-PLUS\n    handleShare(val) {\n      console.log(\"12312312\")\n      if (val.type <= 1) {\n        let scene; //  \"WXSenceTimeline 朋友圈   WXSceneSession 微信好友\"\n        val.type == 1\n          ? (scene = \"WXSenceTimeline\")\n          : (scene = \"WXSceneSession\");\n        uni.share({\n          provider: \"weixin\",\n          scene: scene,\n          href: configs.shareLink + this.link,\n          imageUrl: this.thumbnail,\n          type: 0,\n          summary: this.goodsName,\n          title: this.shareTitle(),\n          success: function (res) {\n            uni.showToast({\n              title: \"分享成功!\",\n              duration: 2000,\n              icon: \"none\",\n            });\n            this.$emit(\"close\");\n          },\n          fail: function (err) {\n            uni.showToast({\n              title: \"分享失败!\",\n              duration: 2000,\n              icon: \"none\",\n            });\n            this.$emit(\"close\");\n          },\n        });\n      }\n    },\n    // #endif\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./mp-share.scss\";\n.share-title {\n  position: relative;\n  height: 90rpx;\n  font-size: 32rpx;\n  line-height: 90rpx;\n  text-align: center;\n  > .share-close {\n    position: absolute;\n    right: 0;\n    right: 20rpx;\n    top: 30rpx;\n  }\n}\nbutton:after {\n  border: none;\n}\n\n.share-list {\n  padding: 0 32rpx;\n  display: flex;\n  text-align: center;\n  align-items: center;\n  > .share-item {\n    width: 25%;\n    font-size: 24rpx;\n    color: #666;\n    > * {\n      margin: 8rpx 0;\n    }\n  }\n}\n</style>"
  },
  {
    "path": "components/m-share/mp-share.scss",
    "content": ".share-btn {\n    background: none;\n    font-size: 24rpx;\n    color: #666;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n}\n"
  },
  {
    "path": "components/m-take-down-sale-goods/index.vue",
    "content": "<template>\n  <div>\n    <u-popup v-model=\"show\" mode=\"bottom\" height=\"800rpx\" border-radius=\"14\">\n      <div class=\"wrapper\">\n        <view class=\"down-goods-tips\">该商品已下架</view>\n        <scroll-view scroll-y=\"true\" style=\"height: 670rpx\">\n          <goodsRecommend title=\"其他商品\" />\n        </scroll-view>\n      </div>\n    </u-popup>\n  </div>\n</template>\n\n<script>\nimport goodsRecommend from \"@/components/m-goods-recommend/index.vue\";\n\nexport default {\n  data() {\n    return {\n      show: true, // 是否显示\n    };\n  },\n  components: { goodsRecommend },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.down-goods-tips {\n  font-size: 36rpx;\n  text-align: center;\n  font-weight: bold;\n  padding: 40rpx 0;\n}\n</style>\n"
  },
  {
    "path": "components/popups/popups.vue",
    "content": "<template>\r\n  <view class=\"shadow\" :class=\"!show?'':'shadow-show'\" :style=\"{backgroundColor:show?maskBg:'rgba(0,0,0,0)'}\" @tap=\"tapMask\">\r\n    <view class=\"popups\" :class=\"[theme]\" :style=\"{top: popupsTop ,left: popupsLeft,flexDirection:direction}\">\r\n      <text :class=\"dynPlace\" :style=\"{width:'0px',height:'0px'}\" v-if=\"triangle\"></text>\r\n      <view v-for=\"(item,index) in popData\" :key=\"index\" @tap.stop=\"tapItem(item)\" class=\"itemChild view\" :class=\"[direction=='row'?'solid-right':'solid-bottom',item.disabled?'disabledColor':'']\">\r\n        <u-icon size=\"35\" :name=\"item.icon\" v-if=\"item.icon\"></u-icon><span class=\"title\">{{item.title}}</span>\r\n      </view>\r\n      <slot></slot>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  props: {\r\n    maskBg: {\r\n      type: String,\r\n      default: \"rgba(0,0,0,0)\",\r\n    },\r\n    placement: {\r\n      type: String,\r\n      default: \"default\", //default top-start top-end bottom-start bottom-end\r\n    },\r\n    direction: {\r\n      type: String,\r\n      default: \"column\", //column row\r\n    },\r\n    x: {\r\n      type: Number,\r\n      default: 0,\r\n    },\r\n    y: {\r\n      type: Number,\r\n      default: 0,\r\n    },\r\n    value: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    popData: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n    theme: {\r\n      type: String,\r\n      default: \"light\", //light dark\r\n    },\r\n    dynamic: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    gap: {\r\n      type: Number,\r\n      default: 20,\r\n    },\r\n    triangle: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      popupsTop: \"0rpx\",\r\n      popupsLeft: \"0rpx\",\r\n      show: false,\r\n      dynPlace: \"\",\r\n    };\r\n  },\r\n  mounted() {\r\n    this.popupsPosition();\r\n  },\r\n  methods: {\r\n    tapMask() {\r\n      this.$emit(\"input\", !this.value);\r\n    },\r\n    tapItem(item) {\r\n      if (item.disabled) return;\r\n      this.$emit(\"tapPopup\", item);\r\n      this.$emit(\"input\", !this.value);\r\n    },\r\n    getStatusBar() {\r\n      let promise = new Promise((resolve, reject) => {\r\n        uni.getSystemInfo({\r\n          success: function (e) {\r\n            let customBar;\r\n            // #ifdef H5\r\n\r\n            customBar = e.statusBarHeight + e.windowTop;\r\n\r\n            // #endif\r\n            resolve(customBar);\r\n          },\r\n        });\r\n      });\r\n      return promise;\r\n    },\r\n    async popupsPosition() {\r\n      let statusBar = await this.getStatusBar();\r\n      let promise = new Promise((resolve, reject) => {\r\n        let popupsDom = uni.createSelectorQuery().in(this).select(\".popups\");\r\n        popupsDom\r\n          .fields(\r\n            {\r\n              size: true,\r\n            },\r\n            (data) => {\r\n              let width = data.width;\r\n              let height = data.height;\r\n\r\n             \r\n\r\n              let y = this.dynamic\r\n                ? this.dynamicGetY(this.y, this.gap)\r\n                : this.transformRpx(this.y);\r\n\r\n              let x = this.dynamic\r\n                ? this.dynamicGetX(this.x, this.gap)\r\n                : this.transformRpx(this.x);\r\n\r\n              // #ifdef H5\r\n              y = this.dynamic\r\n                ? this.y + statusBar\r\n                : this.transformRpx(this.y + statusBar);\r\n              // #endif\r\n\r\n              this.dynPlace =\r\n                this.placement == \"default\"\r\n                  ? this.getPlacement(x, y)\r\n                  : this.placement;\r\n\r\n              switch (this.dynPlace) {\r\n                case \"top-start\":\r\n                  this.popupsTop = `${y + 9}rpx`;\r\n                  this.popupsLeft = `${x - 15}rpx`;\r\n                  break;\r\n                case \"top-end\":\r\n                  this.popupsTop = `${y + 9}rpx`;\r\n                  this.popupsLeft = `${x + 15 - width}rpx`;\r\n                  break;\r\n                case \"bottom-start\":\r\n                  this.popupsTop = `${y - 18 - height}rpx`;\r\n                  this.popupsLeft = `${x - 15}rpx`;\r\n                  break;\r\n                case \"bottom-end\":\r\n                  this.popupsTop = `${y - 9 - height}rpx`;\r\n                  this.popupsLeft = `${x + 15 - width}rpx`;\r\n                  break;\r\n              }\r\n              resolve();\r\n            }\r\n          )\r\n          .exec();\r\n      });\r\n      return promise;\r\n    },\r\n    getPlacement(x, y) {\r\n      let width = uni.getSystemInfoSync().windowWidth;\r\n      let height = uni.getSystemInfoSync().windowHeight;\r\n      if (x > width / 2 && y > height / 2) {\r\n        return \"bottom-end\";\r\n      } else if (x < width / 2 && y < height / 2) {\r\n        return \"top-start\";\r\n      } else if (x > width / 2 && y < height / 2) {\r\n        return \"top-end\";\r\n      } else if (x < width / 2 && y > height / 2) {\r\n        return \"bottom-start\";\r\n      } else if (x > width / 2) {\r\n        return \"top-end\";\r\n      } else {\r\n        return \"top-start\";\r\n      }\r\n    },\r\n    dynamicGetY(y, gap) {\r\n      let height = uni.getSystemInfoSync().windowHeight;\r\n      y = y < gap ? gap : y;\r\n      y = height - y < gap ? height - gap : y;\r\n\r\n      return y;\r\n    },\r\n    dynamicGetX(x, gap) {\r\n      let width = uni.getSystemInfoSync().windowWidth;\r\n      x = x < gap ? gap : x;\r\n      x = width - x < gap ? width - gap : x;\r\n      return x;\r\n    },\r\n    transformRpx(params) {\r\n      return (params * uni.getSystemInfoSync().screenWidth) / 375;\r\n    },\r\n  },\r\n  watch: {\r\n    value: {\r\n      immediate: true,\r\n      handler: async function (newVal, oldVal) {\r\n        if (newVal) await this.popupsPosition();\r\n        this.show = newVal;\r\n      },\r\n    },\r\n    placement: {\r\n      immediate: true,\r\n      handler(newVal, oldVal) {\r\n        this.dynPlace = newVal;\r\n      },\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.title {\r\n  margin-left: 20rpx;\r\n}\r\n.shadow {\r\n  position: fixed;\r\n  top: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  left: 0;\r\n  height: 100%;\r\n  z-index: 9999;\r\n  transition: background 0.3s ease-in-out;\r\n  visibility: hidden;\r\n\r\n  &.shadow-show {\r\n    visibility: visible;\r\n  }\r\n}\r\n\r\n.popups {\r\n  position: absolute;\r\n  padding: 20rpx;\r\n  border-radius: 5px;\r\n  display: flex;\r\n  .view {\r\n    display: flex;\r\n    align-items: center;\r\n    padding: 15rpx 10rpx;\r\n    font-size: 25rpx;\r\n  }\r\n  .image {\r\n    display: inline-block;\r\n    vertical-align: middle;\r\n    width: 40rpx;\r\n    height: 40rpx;\r\n    margin-right: 20rpx;\r\n  }\r\n}\r\n.dark {\r\n  background-color: #4c4c4c;\r\n  color: #fff;\r\n  .top-start:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    top: -18rpx;\r\n    left: 10rpx;\r\n    border-width: 0 20rpx 20rpx;\r\n    border-style: solid;\r\n    border-color: transparent transparent #4c4c4c;\r\n  }\r\n  .top-end:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    top: -18rpx;\r\n    right: 10rpx;\r\n    border-width: 0 20rpx 20rpx;\r\n    border-style: solid;\r\n    border-color: transparent transparent #4c4c4c;\r\n  }\r\n  .bottom-start:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    bottom: -18rpx;\r\n    left: 10rpx;\r\n    border-width: 20rpx 20rpx 0;\r\n    border-style: solid;\r\n    border-color: #4c4c4c transparent transparent;\r\n  }\r\n  .bottom-end:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    bottom: -18rpx;\r\n    right: 10rpx;\r\n    border-width: 20rpx 20rpx 0;\r\n    border-style: solid;\r\n    border-color: #4c4c4c transparent transparent;\r\n  }\r\n  .disabledColor {\r\n    color: #c5c8ce;\r\n  }\r\n}\r\n.light {\r\n  color: #515a6e;\r\n  box-shadow: 0upx 0upx 30upx rgba(0, 0, 0, 0.2);\r\n  background: #fff;\r\n  .top-start:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    top: -18rpx;\r\n    left: 10rpx;\r\n    border-width: 0 20rpx 20rpx;\r\n    border-style: solid;\r\n    border-color: transparent transparent #fff;\r\n  }\r\n  .top-end:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    top: -18rpx;\r\n    right: 10rpx;\r\n    border-width: 0 20rpx 20rpx;\r\n    border-style: solid;\r\n    border-color: transparent transparent #fff;\r\n  }\r\n  .bottom-start:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    bottom: -18rpx;\r\n    left: 10rpx;\r\n    border-width: 20rpx 20rpx 0;\r\n    border-style: solid;\r\n    border-color: #fff transparent transparent;\r\n  }\r\n  .bottom-end:after {\r\n    content: \"\";\r\n    position: absolute;\r\n    bottom: -18rpx;\r\n    right: 10rpx;\r\n    border-width: 20rpx 20rpx 0;\r\n    border-style: solid;\r\n    border-color: #fff transparent transparent;\r\n  }\r\n  .disabledColor {\r\n    color: #c5c8ce;\r\n  }\r\n}\r\n.solid-bottom {\r\n  border-bottom: 1px solid #f3f5f7;\r\n}\r\n.solid-right {\r\n  border-right: 1px solid #ccc;\r\n}\r\n.popups .itemChild:last-child {\r\n  border: none;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/uni-load-more/uni-load-more.vue",
    "content": "<template>\n\t<view class=\"uni-load-more\">\n\t\t<view class=\"uni-load-more__img\" v-show=\"status === 'loading' && showIcon\">\n\t\t\t<view class=\"load1\">\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t</view>\n\t\t\t<view class=\"load2\">\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t</view>\n\t\t\t<view class=\"load3\">\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t\t<view :style=\"{ background: color }\"></view>\n\t\t\t</view>\n\t\t</view>\n\t\t<text class=\"uni-load-more__text\" :style=\"{ color: color }\" v-if=\"showText\">\n\t\t\t{{ status === 'more' ? contentText.contentdown : status === 'loading' ? contentText.contentrefresh : contentText.contentnomore }}\n\t\t</text>\n\t</view>\n</template>\n\n<script>\nexport default {\n\tname: 'uni-load-more',\n\tprops: {\n\t\tstatus: {\n\t\t\t//上拉的状态：more-loading前；loading-loading中；noMore-没有更多了\n\t\t\ttype: String,\n\t\t\tdefault: 'more'\n\t\t},\n\t\tshowIcon: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tshowText: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tcolor: {\n\t\t\ttype: String,\n\t\t\tdefault: '#777777'\n\t\t},\n\t\tcontentText: {\n\t\t\ttype: Object,\n\t\t\tdefault() {\n\t\t\t\treturn {\n\t\t\t\t\tcontentdown: '上拉显示更多',\n\t\t\t\t\tcontentrefresh: '正在加载...',\n\t\t\t\t\tcontentnomore: '没有更多数据了'\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t},\n\tdata() {\n\t\treturn {};\n\t}\n};\n</script>\n\n<style>\n@charset \"UTF-8\";\n\n.uni-load-more {\n\tdisplay: flex;\n\tflex-direction: row;\n\theight: 80rpx;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.uni-load-more__text {\n\tfont-size: 28rpx;\n\tcolor: #999;\n}\n\n.uni-load-more__img {\n\theight: 24px;\n\twidth: 24px;\n\tmargin-right: 10px;\n}\n\n.uni-load-more__img > view {\n\tposition: absolute;\n}\n\n.uni-load-more__img > view view {\n\twidth: 6px;\n\theight: 2px;\n\tborder-top-left-radius: 1px;\n\tborder-bottom-left-radius: 1px;\n\tbackground: #999;\n\tposition: absolute;\n\topacity: 0.2;\n\ttransform-origin: 50%;\n\tanimation: load 1.56s ease infinite;\n}\n\n.uni-load-more__img > view view:nth-child(1) {\n\ttransform: rotate(90deg);\n\ttop: 2px;\n\tleft: 9px;\n}\n\n.uni-load-more__img > view view:nth-child(2) {\n\ttransform: rotate(180deg);\n\ttop: 11px;\n\tright: 0;\n}\n\n.uni-load-more__img > view view:nth-child(3) {\n\ttransform: rotate(270deg);\n\tbottom: 2px;\n\tleft: 9px;\n}\n\n.uni-load-more__img > view view:nth-child(4) {\n\ttop: 11px;\n\tleft: 0;\n}\n\n.load1,\n.load2,\n.load3 {\n\theight: 24px;\n\twidth: 24px;\n}\n\n.load2 {\n\ttransform: rotate(30deg);\n}\n\n.load3 {\n\ttransform: rotate(60deg);\n}\n\n.load1 view:nth-child(1) {\n\tanimation-delay: 0s;\n}\n\n.load2 view:nth-child(1) {\n\tanimation-delay: 0.13s;\n}\n\n.load3 view:nth-child(1) {\n\tanimation-delay: 0.26s;\n}\n\n.load1 view:nth-child(2) {\n\tanimation-delay: 0.39s;\n}\n\n.load2 view:nth-child(2) {\n\tanimation-delay: 0.52s;\n}\n\n.load3 view:nth-child(2) {\n\tanimation-delay: 0.65s;\n}\n\n.load1 view:nth-child(3) {\n\tanimation-delay: 0.78s;\n}\n\n.load2 view:nth-child(3) {\n\tanimation-delay: 0.91s;\n}\n\n.load3 view:nth-child(3) {\n\tanimation-delay: 1.04s;\n}\n\n.load1 view:nth-child(4) {\n\tanimation-delay: 1.17s;\n}\n\n.load2 view:nth-child(4) {\n\tanimation-delay: 1.3s;\n}\n\n.load3 view:nth-child(4) {\n\tanimation-delay: 1.43s;\n}\n\n@-webkit-keyframes load {\n\t0% {\n\t\topacity: 1;\n\t}\n\n\t100% {\n\t\topacity: 0.2;\n\t}\n}\n</style>\n"
  },
  {
    "path": "components/uni-number-box.vue",
    "content": "<template>\n\t<view class=\"uni-numbox\">\n\t\t<view @click=\"_calcValue('minus')\" class=\"uni-numbox__minus uni-numbox-btns\" :style=\"{background}\">\n\t\t\t<text class=\"uni-numbox--text\" :class=\"{ 'uni-numbox--disabled': inputValue <= min || disabled }\" :style=\"{color}\">-</text>\n\t\t</view>\n\t\t<input :disabled=\"disabled\" @focus=\"_onFocus\" @blur=\"_onBlur\" class=\"uni-numbox__value\" type=\"number\"\n\t\t\tv-model=\"inputValue\" :style=\"{background, color}\" />\n\t\t<view @click=\"_calcValue('plus')\" class=\"uni-numbox__plus uni-numbox-btns\" :style=\"{background}\">\n\t\t\t<text class=\"uni-numbox--text\" :class=\"{ 'uni-numbox--disabled': inputValue >= max || disabled }\" :style=\"{color}\">+</text>\n\t\t</view>\n\t</view>\n</template>\n<script>\n\t/**\n\t * NumberBox 数字输入框\n\t * @description 带加减按钮的数字输入框\n\t * @tutorial https://ext.dcloud.net.cn/plugin?id=31\n\t * @property {Number} value 输入框当前值\n\t * @property {Number} min 最小值\n\t * @property {Number} max 最大值\n\t * @property {Number} step 每次点击改变的间隔大小\n\t * @property {String} background 背景色\n\t * @property {String} color 字体颜色（前景色）\n\t * @property {Boolean} disabled = [true|false] 是否为禁用状态\n\t * @event {Function} change 输入框值改变时触发的事件，参数为输入框当前的 value\n\t * @event {Function} focus 输入框聚焦时触发的事件，参数为 event 对象\n\t * @event {Function} blur 输入框失焦时触发的事件，参数为 event 对象\n\t */\n\n\texport default {\n\t\tname: \"UniNumberBox\",\n\t\temits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],\n\t\tprops: {\n\t\t\tvalue: {\n\t\t\t\ttype: [Number, String],\n\t\t\t\tdefault: 1\n\t\t\t},\n\t\t\tmodelValue: {\n\t\t\t\ttype: [Number, String],\n\t\t\t\tdefault: 1\n\t\t\t},\n\t\t\tmin: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: 0\n\t\t\t},\n\t\t\tmax: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: 100\n\t\t\t},\n\t\t\tstep: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: 1\n\t\t\t},\n\t\t\tbackground: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '#f5f5f5'\n\t\t\t},\n\t\t\tcolor: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '#333'\n\t\t\t},\n\t\t\tdisabled: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: false\n\t\t\t}\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tinputValue: 0\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\tvalue(val) {\n\t\t\t\tthis.inputValue = +val;\n\t\t\t},\n\t\t\tmodelValue(val) {\n\t\t\t\tthis.inputValue = +val;\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tif (this.value === 1) {\n\t\t\t\tthis.inputValue = +this.modelValue;\n\t\t\t}\n\t\t\tif (this.modelValue === 1) {\n\t\t\t\tthis.inputValue = +this.value;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t_calcValue(type) {\n\t\t\t\tif (this.disabled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst scale = this._getDecimalScale();\n\t\t\t\tlet value = this.inputValue * scale;\n\t\t\t\tlet step = this.step * scale;\n\t\t\t\tif (type === \"minus\") {\n\t\t\t\t\tvalue -= step;\n\t\t\t\t\tif (value < (this.min * scale)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (value > (this.max * scale)) {\n\t\t\t\t\t\tvalue = this.max * scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (type === \"plus\") {\n\t\t\t\t\tvalue += step;\n\t\t\t\t\tif (value > (this.max * scale)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (value < (this.min * scale)) {\n\t\t\t\t\t\tvalue = this.min * scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.inputValue = (value / scale).toFixed(String(scale).length - 1);\n\t\t\t\tthis.$emit(\"change\", +this.inputValue);\n\t\t\t\t// TODO vue2 兼容\n\t\t\t\tthis.$emit(\"input\", +this.inputValue);\n\t\t\t\t// TODO vue3 兼容\n\t\t\t\tthis.$emit(\"update:modelValue\", +this.inputValue);\n\t\t\t},\n\t\t\t_getDecimalScale() {\n\n\t\t\t\tlet scale = 1;\n\t\t\t\t// 浮点型\n\t\t\t\tif (~~this.step !== this.step) {\n\t\t\t\t\tscale = Math.pow(10, String(this.step).split(\".\")[1].length);\n\t\t\t\t}\n\t\t\t\treturn scale;\n\t\t\t},\n\t\t\t_onBlur(event) {\n\t\t\t\tthis.$emit('blur', event)\n\t\t\t\tlet value = event.detail.value;\n\t\t\t\tif (!value) {\n\t\t\t\t\t// this.inputValue = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvalue = +value;\n\t\t\t\tif (value > this.max) {\n\t\t\t\t\tvalue = this.max;\n\t\t\t\t} else if (value < this.min) {\n\t\t\t\t\tvalue = this.min;\n\t\t\t\t}\n\t\t\t\tconst scale = this._getDecimalScale();\n\t\t\t\tthis.inputValue = value.toFixed(String(scale).length - 1);\n\t\t\t\tthis.$emit(\"change\", +this.inputValue);\n\t\t\t\tthis.$emit(\"input\", +this.inputValue);\n\t\t\t},\n\t\t\t_onFocus(event) {\n\t\t\t\tthis.$emit('focus', event)\n\t\t\t}\n\t\t}\n\t};\n</script>\n<style lang=\"scss\" scoped>\n\t$box-height: 48rpx;\n\t$bg: #f5f5f5;\n\t$br: 4rpx;\n\t$color: #333;\n\n\t.uni-numbox {\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t}\n\n\t.uni-numbox-btns {\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: 0 8px;\n\t\tbackground-color: $bg;\n\t\t/* #ifdef H5 */\n\t\tcursor: pointer;\n\t\t/* #endif */\n\t}\n\n\t.uni-numbox__value {\n\t\tmargin: 0 4rpx;\n\t\tbackground-color: $bg;\n\t\twidth: 70rpx;\n\t\theight: $box-height;\n\t\ttext-align: center;\n\t\tfont-size: 24rpx;\n\t\tborder-left-width: 0;\n\t\tborder-right-width: 0;\n\t\tcolor: $color;\n\t}\n\n\t.uni-numbox__minus {\n\t\tborder-top-left-radius: $br;\n\t\tborder-bottom-left-radius: $br;\n\t}\n\n\t.uni-numbox__plus {\n\t\tborder-top-right-radius: $br;\n\t\tborder-bottom-right-radius: $br;\n\t}\n\n\t.uni-numbox--text {\n\t\t// fix nvue\n\t\tline-height: 40rpx;\n\n\t\tfont-size: 40rpx;\n\t\tfont-weight: 300;\n\t\tcolor: $color;\n\t}\n\n\t.uni-numbox .uni-numbox--disabled {\n\t\tcolor: #c0c0c0 !important;\n\t\t/* #ifdef H5 */\n\t\tcursor: not-allowed;\n\t\t/* #endif */\n\t}\n</style>\n"
  },
  {
    "path": "components/uniMap.vue",
    "content": "<template></template>\n<script>\nimport { getAddressCode } from \"@/api/address\";\nimport config from '@/config/config'\nexport default {\n  data() {\n    return {\n      config\n    };\n  },\n  mounted() {\n    this.init();\n  },\n  methods: {\n    // 初始化地图并且调用\n    initMap() {\n      let that = this;\n      uni.chooseLocation({\n        success: function (res) {\n          /**获取地址详情地址 */\n          that.posToCity(res.latitude, res.longitude).then((val) => {\n            /**获取地址code */\n            getAddressCode(\n              val.regeocode.addressComponent.citycode,\n              val.regeocode.addressComponent.township\n            ).then((code) => {\n              that.$emit(\"callback\", { ...val, ...res, ...code });\n              that.$emit(\"close\");\n            });\n          });\n        },\n        fail(e) {\n          console.log(e)\n          that.$emit(\"close\");\n        },\n      });\n    },\n\n    // 根据当前客户端判断展示不同类型数据\n    init() {\n      // #ifdef MP-WEIXIN\n      this.wechatMap();\n      // #endif\n      // #ifndef MP-WEIXIN\n      this.initMap();\n      // #endif\n    },\n\n    // 如果是微信小程序单独走微信小程序授权模式\n    wechatMap() {\n      let that = this;\n      uni.authorize({\n        scope: \"scope.userLocation\",\n        success() {\n          // 允许授权\n          that.initMap();\n        },\n        fail() {\n          //拒绝授权\n          uni.showModal({\n            content: \"检测到您没打开获取地址功能权限，是否去设置打开？\",\n            confirmText: \"确认\",\n            cancelText: \"取消\",\n            success: (res) => {\n              if (res.confirm) {\n                // 打开设置好后重新刷新地图\n                uni.openSetting({\n                  success: (res) => {\n                    that.initMap();\n                  },\n                });\n              } else {\n                // 取消后关闭\n                that.$emit(\"close\");\n                return false;\n              }\n            },\n          });\n          return false;\n        },\n      });\n    },\n    // 获取城市的数据\n    posToCity(latitude, longitude) {\n      return new Promise((resolve, reject) => {\n        uni.request({\n          url: `https://restapi.amap.com/v3/geocode/regeo`,\n          method: \"GET\",\n          data: {\n            key: config.aMapKey, //web服务的key\n            location: `${longitude},${latitude}`,\n          },\n          success: ({ data }) => {\n            const { status, info } = data;\n            if (status === \"1\") {\n              resolve(data);\n            } else {\n              reject(info);\n            }\n          },\n          fail: (err) => {\n            reject(err);\n          },\n        });\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n</style>"
  },
  {
    "path": "components/verification/animation.css",
    "content": "/* \n  Animation 微动画  \n  基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28\n */\n\n/* css 滤镜 控制黑白底色gif的 */\n.gif-black{  \n  mix-blend-mode: screen;  \n}\n.gif-white{  \n  mix-blend-mode: multiply; \n}\n\n\n/* Animation css */\n[class*=animation-] {\n    animation-duration: .5s;\n    animation-timing-function: ease-out;\n    animation-fill-mode: both\n}\n\n.animation-fade {\n    animation-name: fade;\n    animation-duration: .8s;\n    animation-timing-function: linear\n}\n\n.animation-scale-up {\n    animation-name: scale-up\n}\n\n.animation-scale-down {\n    animation-name: scale-down\n}\n\n.animation-slide-top {\n    animation-name: slide-top\n}\n\n.animation-slide-bottom {\n    animation-name: slide-bottom\n}\n\n.animation-slide-left {\n    animation-name: slide-left\n}\n\n.animation-slide-right {\n    animation-name: slide-right\n}\n\n.animation-shake {\n    animation-name: shake\n}\n\n.animation-reverse {\n    animation-direction: reverse\n}\n\n@keyframes fade {\n    0% {\n        opacity: 0\n    }\n\n    100% {\n        opacity: 1\n    }\n}\n\n@keyframes scale-up {\n    0% {\n        opacity: 0;\n        transform: scale(.2)\n    }\n\n    100% {\n        opacity: 1;\n        transform: scale(1)\n    }\n}\n\n@keyframes scale-down {\n    0% {\n        opacity: 0;\n        transform: scale(1.8)\n    }\n\n    100% {\n        opacity: 1;\n        transform: scale(1)\n    }\n}\n\n@keyframes slide-top {\n    0% {\n        opacity: 0;\n        transform: translateY(-100%)\n    }\n\n    100% {\n        opacity: 1;\n        transform: translateY(0)\n    }\n}\n\n@keyframes slide-bottom {\n    0% {\n        opacity: 0;\n        transform: translateY(100%)\n    }\n\n    100% {\n        opacity: 1;\n        transform: translateY(0)\n    }\n}\n\n@keyframes shake {\n\n    0%,\n    100% {\n        transform: translateX(0)\n    }\n\n    10% {\n        transform: translateX(-9px)\n    }\n\n    20% {\n        transform: translateX(8px)\n    }\n\n    30% {\n        transform: translateX(-7px)\n    }\n\n    40% {\n        transform: translateX(6px)\n    }\n\n    50% {\n        transform: translateX(-5px)\n    }\n\n    60% {\n        transform: translateX(4px)\n    }\n\n    70% {\n        transform: translateX(-3px)\n    }\n\n    80% {\n        transform: translateX(2px)\n    }\n\n    90% {\n        transform: translateX(-1px)\n    }\n}\n\n@keyframes slide-left {\n    0% {\n        opacity: 0;\n        transform: translateX(-100%)\n    }\n\n    100% {\n        opacity: 1;\n        transform: translateX(0)\n    }\n}\n\n@keyframes slide-right {\n    0% {\n        opacity: 0;\n        transform: translateX(100%)\n    }\n\n    100% {\n        opacity: 1;\n        transform: translateX(0)\n    }\n}"
  },
  {
    "path": "components/verification/icon.css",
    "content": "@keyframes cuIcon-spin {\n\t0% {\n\t\t-webkit-transform: rotate(0);\n\t\ttransform: rotate(0);\n\t}\n\n\t100% {\n\t\t-webkit-transform: rotate(359deg);\n\t\ttransform: rotate(359deg);\n\t}\n}\n\n.cuIconfont-spin {\n\t-webkit-animation: cuIcon-spin 2s infinite linear;\n\tanimation: cuIcon-spin 2s infinite linear;\n\tdisplay: inline-block;\n}\n\n.cuIconfont-pulse {\n\t-webkit-animation: cuIcon-spin 1s infinite steps(8);\n\tanimation: cuIcon-spin 1s infinite steps(8);\n\tdisplay: inline-block;\n}\n\n[class*=\"cuIcon-\"] {\n\tfont-family: \"cuIcon\";\n\tfont-size: inherit;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: \"cuIcon\";\n\tsrc: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831');\n\t/* IE9*/\n\tsrc: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'),\n\t\t/* IE6-IE8 */\n\t\turl('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),\n\t\turl('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'),\n\t\t/* chrome, firefox, opera, Safari, Android, iOS 4.2+*/\n\t\turl('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#cuIconfont') format('svg');\n\t/* iOS 4.1- */\n}\n\n.cuIcon-appreciate:before {\n\tcontent: \"\\e644\";\n}\n\n.cuIcon-check:before {\n\tcontent: \"\\e645\";\n}\n\n.cuIcon-close:before {\n\tcontent: \"\\e646\";\n}\n\n.cuIcon-edit:before {\n\tcontent: \"\\e649\";\n}\n\n.cuIcon-emoji:before {\n\tcontent: \"\\e64a\";\n}\n\n.cuIcon-favorfill:before {\n\tcontent: \"\\e64b\";\n}\n\n.cuIcon-favor:before {\n\tcontent: \"\\e64c\";\n}\n\n.cuIcon-loading:before {\n\tcontent: \"\\e64f\";\n}\n\n.cuIcon-locationfill:before {\n\tcontent: \"\\e650\";\n}\n\n.cuIcon-location:before {\n\tcontent: \"\\e651\";\n}\n\n.cuIcon-phone:before {\n\tcontent: \"\\e652\";\n}\n\n.cuIcon-roundcheckfill:before {\n\tcontent: \"\\e656\";\n}\n\n.cuIcon-roundcheck:before {\n\tcontent: \"\\e657\";\n}\n\n.cuIcon-roundclosefill:before {\n\tcontent: \"\\e658\";\n}\n\n.cuIcon-roundclose:before {\n\tcontent: \"\\e659\";\n}\n\n.cuIcon-roundrightfill:before {\n\tcontent: \"\\e65a\";\n}\n\n.cuIcon-roundright:before {\n\tcontent: \"\\e65b\";\n}\n\n.cuIcon-search:before {\n\tcontent: \"\\e65c\";\n}\n\n.cuIcon-taxi:before {\n\tcontent: \"\\e65d\";\n}\n\n.cuIcon-timefill:before {\n\tcontent: \"\\e65e\";\n}\n\n.cuIcon-time:before {\n\tcontent: \"\\e65f\";\n}\n\n.cuIcon-unfold:before {\n\tcontent: \"\\e661\";\n}\n\n.cuIcon-warnfill:before {\n\tcontent: \"\\e662\";\n}\n\n.cuIcon-warn:before {\n\tcontent: \"\\e663\";\n}\n\n.cuIcon-camerafill:before {\n\tcontent: \"\\e664\";\n}\n\n.cuIcon-camera:before {\n\tcontent: \"\\e665\";\n}\n\n.cuIcon-commentfill:before {\n\tcontent: \"\\e666\";\n}\n\n.cuIcon-comment:before {\n\tcontent: \"\\e667\";\n}\n\n.cuIcon-likefill:before {\n\tcontent: \"\\e668\";\n}\n\n.cuIcon-like:before {\n\tcontent: \"\\e669\";\n}\n\n.cuIcon-notificationfill:before {\n\tcontent: \"\\e66a\";\n}\n\n.cuIcon-notification:before {\n\tcontent: \"\\e66b\";\n}\n\n.cuIcon-order:before {\n\tcontent: \"\\e66c\";\n}\n\n.cuIcon-samefill:before {\n\tcontent: \"\\e66d\";\n}\n\n.cuIcon-same:before {\n\tcontent: \"\\e66e\";\n}\n\n.cuIcon-deliver:before {\n\tcontent: \"\\e671\";\n}\n\n.cuIcon-evaluate:before {\n\tcontent: \"\\e672\";\n}\n\n.cuIcon-pay:before {\n\tcontent: \"\\e673\";\n}\n\n.cuIcon-send:before {\n\tcontent: \"\\e675\";\n}\n\n.cuIcon-store:before {\n\tcontent: \"\\e676\";\n}\n\n.cuIcon-ticket:before {\n\tcontent: \"\\e677\";\n}\n\n.cuIcon-back:before {\n\tcontent: \"\\e679\";\n}\n\n.cuIcon-cascades:before {\n\tcontent: \"\\e67c\";\n}\n\n.cuIcon-discover:before {\n\tcontent: \"\\e67e\";\n}\n\n.cuIcon-list:before {\n\tcontent: \"\\e682\";\n}\n\n.cuIcon-more:before {\n\tcontent: \"\\e684\";\n}\n\n.cuIcon-scan:before {\n\tcontent: \"\\e689\";\n}\n\n.cuIcon-settings:before {\n\tcontent: \"\\e68a\";\n}\n\n.cuIcon-questionfill:before {\n\tcontent: \"\\e690\";\n}\n\n.cuIcon-question:before {\n\tcontent: \"\\e691\";\n}\n\n.cuIcon-storefill:before {\n\tcontent: \"\\e697\";\n}\n\n.cuIcon-form:before {\n\tcontent: \"\\e699\";\n}\n\n.cuIcon-pic:before {\n\tcontent: \"\\e69b\";\n}\n\n.cuIcon-filter:before {\n\tcontent: \"\\e69c\";\n}\n\n.cuIcon-footprint:before {\n\tcontent: \"\\e69d\";\n}\n\n.cuIcon-top:before {\n\tcontent: \"\\e69e\";\n}\n\n.cuIcon-pulldown:before {\n\tcontent: \"\\e69f\";\n}\n\n.cuIcon-pullup:before {\n\tcontent: \"\\e6a0\";\n}\n\n.cuIcon-right:before {\n\tcontent: \"\\e6a3\";\n}\n\n.cuIcon-refresh:before {\n\tcontent: \"\\e6a4\";\n}\n\n.cuIcon-moreandroid:before {\n\tcontent: \"\\e6a5\";\n}\n\n.cuIcon-deletefill:before {\n\tcontent: \"\\e6a6\";\n}\n\n.cuIcon-refund:before {\n\tcontent: \"\\e6ac\";\n}\n\n.cuIcon-cart:before {\n\tcontent: \"\\e6af\";\n}\n\n.cuIcon-qrcode:before {\n\tcontent: \"\\e6b0\";\n}\n\n.cuIcon-remind:before {\n\tcontent: \"\\e6b2\";\n}\n\n.cuIcon-delete:before {\n\tcontent: \"\\e6b4\";\n}\n\n.cuIcon-profile:before {\n\tcontent: \"\\e6b7\";\n}\n\n.cuIcon-home:before {\n\tcontent: \"\\e6b8\";\n}\n\n.cuIcon-cartfill:before {\n\tcontent: \"\\e6b9\";\n}\n\n.cuIcon-discoverfill:before {\n\tcontent: \"\\e6ba\";\n}\n\n.cuIcon-homefill:before {\n\tcontent: \"\\e6bb\";\n}\n\n.cuIcon-message:before {\n\tcontent: \"\\e6bc\";\n}\n\n.cuIcon-addressbook:before {\n\tcontent: \"\\e6bd\";\n}\n\n.cuIcon-link:before {\n\tcontent: \"\\e6bf\";\n}\n\n.cuIcon-lock:before {\n\tcontent: \"\\e6c0\";\n}\n\n.cuIcon-unlock:before {\n\tcontent: \"\\e6c2\";\n}\n\n.cuIcon-vip:before {\n\tcontent: \"\\e6c3\";\n}\n\n.cuIcon-weibo:before {\n\tcontent: \"\\e6c4\";\n}\n\n.cuIcon-activity:before {\n\tcontent: \"\\e6c5\";\n}\n\n.cuIcon-friendaddfill:before {\n\tcontent: \"\\e6c9\";\n}\n\n.cuIcon-friendadd:before {\n\tcontent: \"\\e6ca\";\n}\n\n.cuIcon-friendfamous:before {\n\tcontent: \"\\e6cb\";\n}\n\n.cuIcon-friend:before {\n\tcontent: \"\\e6cc\";\n}\n\n.cuIcon-goods:before {\n\tcontent: \"\\e6cd\";\n}\n\n.cuIcon-selection:before {\n\tcontent: \"\\e6ce\";\n}\n\n.cuIcon-explore:before {\n\tcontent: \"\\e6d2\";\n}\n\n.cuIcon-present:before {\n\tcontent: \"\\e6d3\";\n}\n\n.cuIcon-squarecheckfill:before {\n\tcontent: \"\\e6d4\";\n}\n\n.cuIcon-square:before {\n\tcontent: \"\\e6d5\";\n}\n\n.cuIcon-squarecheck:before {\n\tcontent: \"\\e6d6\";\n}\n\n.cuIcon-round:before {\n\tcontent: \"\\e6d7\";\n}\n\n.cuIcon-roundaddfill:before {\n\tcontent: \"\\e6d8\";\n}\n\n.cuIcon-roundadd:before {\n\tcontent: \"\\e6d9\";\n}\n\n.cuIcon-add:before {\n\tcontent: \"\\e6da\";\n}\n\n.cuIcon-notificationforbidfill:before {\n\tcontent: \"\\e6db\";\n}\n\n.cuIcon-explorefill:before {\n\tcontent: \"\\e6dd\";\n}\n\n.cuIcon-fold:before {\n\tcontent: \"\\e6de\";\n}\n\n.cuIcon-game:before {\n\tcontent: \"\\e6df\";\n}\n\n.cuIcon-redpacket:before {\n\tcontent: \"\\e6e0\";\n}\n\n.cuIcon-selectionfill:before {\n\tcontent: \"\\e6e1\";\n}\n\n.cuIcon-similar:before {\n\tcontent: \"\\e6e2\";\n}\n\n.cuIcon-appreciatefill:before {\n\tcontent: \"\\e6e3\";\n}\n\n.cuIcon-infofill:before {\n\tcontent: \"\\e6e4\";\n}\n\n.cuIcon-info:before {\n\tcontent: \"\\e6e5\";\n}\n\n.cuIcon-forwardfill:before {\n\tcontent: \"\\e6ea\";\n}\n\n.cuIcon-forward:before {\n\tcontent: \"\\e6eb\";\n}\n\n.cuIcon-rechargefill:before {\n\tcontent: \"\\e6ec\";\n}\n\n.cuIcon-recharge:before {\n\tcontent: \"\\e6ed\";\n}\n\n.cuIcon-vipcard:before {\n\tcontent: \"\\e6ee\";\n}\n\n.cuIcon-voice:before {\n\tcontent: \"\\e6ef\";\n}\n\n.cuIcon-voicefill:before {\n\tcontent: \"\\e6f0\";\n}\n\n.cuIcon-friendfavor:before {\n\tcontent: \"\\e6f1\";\n}\n\n.cuIcon-wifi:before {\n\tcontent: \"\\e6f2\";\n}\n\n.cuIcon-share:before {\n\tcontent: \"\\e6f3\";\n}\n\n.cuIcon-wefill:before {\n\tcontent: \"\\e6f4\";\n}\n\n.cuIcon-we:before {\n\tcontent: \"\\e6f5\";\n}\n\n.cuIcon-lightauto:before {\n\tcontent: \"\\e6f6\";\n}\n\n.cuIcon-lightforbid:before {\n\tcontent: \"\\e6f7\";\n}\n\n.cuIcon-lightfill:before {\n\tcontent: \"\\e6f8\";\n}\n\n.cuIcon-camerarotate:before {\n\tcontent: \"\\e6f9\";\n}\n\n.cuIcon-light:before {\n\tcontent: \"\\e6fa\";\n}\n\n.cuIcon-barcode:before {\n\tcontent: \"\\e6fb\";\n}\n\n.cuIcon-flashlightclose:before {\n\tcontent: \"\\e6fc\";\n}\n\n.cuIcon-flashlightopen:before {\n\tcontent: \"\\e6fd\";\n}\n\n.cuIcon-searchlist:before {\n\tcontent: \"\\e6fe\";\n}\n\n.cuIcon-service:before {\n\tcontent: \"\\e6ff\";\n}\n\n.cuIcon-sort:before {\n\tcontent: \"\\e700\";\n}\n\n.cuIcon-down:before {\n\tcontent: \"\\e703\";\n}\n\n.cuIcon-mobile:before {\n\tcontent: \"\\e704\";\n}\n\n.cuIcon-mobilefill:before {\n\tcontent: \"\\e705\";\n}\n\n.cuIcon-copy:before {\n\tcontent: \"\\e706\";\n}\n\n.cuIcon-countdownfill:before {\n\tcontent: \"\\e707\";\n}\n\n.cuIcon-countdown:before {\n\tcontent: \"\\e708\";\n}\n\n.cuIcon-noticefill:before {\n\tcontent: \"\\e709\";\n}\n\n.cuIcon-notice:before {\n\tcontent: \"\\e70a\";\n}\n\n.cuIcon-upstagefill:before {\n\tcontent: \"\\e70e\";\n}\n\n.cuIcon-upstage:before {\n\tcontent: \"\\e70f\";\n}\n\n.cuIcon-babyfill:before {\n\tcontent: \"\\e710\";\n}\n\n.cuIcon-baby:before {\n\tcontent: \"\\e711\";\n}\n\n.cuIcon-brandfill:before {\n\tcontent: \"\\e712\";\n}\n\n.cuIcon-brand:before {\n\tcontent: \"\\e713\";\n}\n\n.cuIcon-choicenessfill:before {\n\tcontent: \"\\e714\";\n}\n\n.cuIcon-choiceness:before {\n\tcontent: \"\\e715\";\n}\n\n.cuIcon-clothesfill:before {\n\tcontent: \"\\e716\";\n}\n\n.cuIcon-clothes:before {\n\tcontent: \"\\e717\";\n}\n\n.cuIcon-creativefill:before {\n\tcontent: \"\\e718\";\n}\n\n.cuIcon-creative:before {\n\tcontent: \"\\e719\";\n}\n\n.cuIcon-female:before {\n\tcontent: \"\\e71a\";\n}\n\n.cuIcon-keyboard:before {\n\tcontent: \"\\e71b\";\n}\n\n.cuIcon-male:before {\n\tcontent: \"\\e71c\";\n}\n\n.cuIcon-newfill:before {\n\tcontent: \"\\e71d\";\n}\n\n.cuIcon-new:before {\n\tcontent: \"\\e71e\";\n}\n\n.cuIcon-pullleft:before {\n\tcontent: \"\\e71f\";\n}\n\n.cuIcon-pullright:before {\n\tcontent: \"\\e720\";\n}\n\n.cuIcon-rankfill:before {\n\tcontent: \"\\e721\";\n}\n\n.cuIcon-rank:before {\n\tcontent: \"\\e722\";\n}\n\n.cuIcon-bad:before {\n\tcontent: \"\\e723\";\n}\n\n.cuIcon-cameraadd:before {\n\tcontent: \"\\e724\";\n}\n\n.cuIcon-focus:before {\n\tcontent: \"\\e725\";\n}\n\n.cuIcon-friendfill:before {\n\tcontent: \"\\e726\";\n}\n\n.cuIcon-cameraaddfill:before {\n\tcontent: \"\\e727\";\n}\n\n.cuIcon-apps:before {\n\tcontent: \"\\e729\";\n}\n\n.cuIcon-paintfill:before {\n\tcontent: \"\\e72a\";\n}\n\n.cuIcon-paint:before {\n\tcontent: \"\\e72b\";\n}\n\n.cuIcon-picfill:before {\n\tcontent: \"\\e72c\";\n}\n\n.cuIcon-refresharrow:before {\n\tcontent: \"\\e72d\";\n}\n\n.cuIcon-colorlens:before {\n\tcontent: \"\\e6e6\";\n}\n\n.cuIcon-markfill:before {\n\tcontent: \"\\e730\";\n}\n\n.cuIcon-mark:before {\n\tcontent: \"\\e731\";\n}\n\n.cuIcon-presentfill:before {\n\tcontent: \"\\e732\";\n}\n\n.cuIcon-repeal:before {\n\tcontent: \"\\e733\";\n}\n\n.cuIcon-album:before {\n\tcontent: \"\\e734\";\n}\n\n.cuIcon-peoplefill:before {\n\tcontent: \"\\e735\";\n}\n\n.cuIcon-people:before {\n\tcontent: \"\\e736\";\n}\n\n.cuIcon-servicefill:before {\n\tcontent: \"\\e737\";\n}\n\n.cuIcon-repair:before {\n\tcontent: \"\\e738\";\n}\n\n.cuIcon-file:before {\n\tcontent: \"\\e739\";\n}\n\n.cuIcon-repairfill:before {\n\tcontent: \"\\e73a\";\n}\n\n.cuIcon-taoxiaopu:before {\n\tcontent: \"\\e73b\";\n}\n\n.cuIcon-weixin:before {\n\tcontent: \"\\e612\";\n}\n\n.cuIcon-attentionfill:before {\n\tcontent: \"\\e73c\";\n}\n\n.cuIcon-attention:before {\n\tcontent: \"\\e73d\";\n}\n\n.cuIcon-commandfill:before {\n\tcontent: \"\\e73e\";\n}\n\n.cuIcon-command:before {\n\tcontent: \"\\e73f\";\n}\n\n.cuIcon-communityfill:before {\n\tcontent: \"\\e740\";\n}\n\n.cuIcon-community:before {\n\tcontent: \"\\e741\";\n}\n\n.cuIcon-read:before {\n\tcontent: \"\\e742\";\n}\n\n.cuIcon-calendar:before {\n\tcontent: \"\\e74a\";\n}\n\n.cuIcon-cut:before {\n\tcontent: \"\\e74b\";\n}\n\n.cuIcon-magic:before {\n\tcontent: \"\\e74c\";\n}\n\n.cuIcon-backwardfill:before {\n\tcontent: \"\\e74d\";\n}\n\n.cuIcon-playfill:before {\n\tcontent: \"\\e74f\";\n}\n\n.cuIcon-stop:before {\n\tcontent: \"\\e750\";\n}\n\n.cuIcon-tagfill:before {\n\tcontent: \"\\e751\";\n}\n\n.cuIcon-tag:before {\n\tcontent: \"\\e752\";\n}\n\n.cuIcon-group:before {\n\tcontent: \"\\e753\";\n}\n\n.cuIcon-all:before {\n\tcontent: \"\\e755\";\n}\n\n.cuIcon-backdelete:before {\n\tcontent: \"\\e756\";\n}\n\n.cuIcon-hotfill:before {\n\tcontent: \"\\e757\";\n}\n\n.cuIcon-hot:before {\n\tcontent: \"\\e758\";\n}\n\n.cuIcon-post:before {\n\tcontent: \"\\e759\";\n}\n\n.cuIcon-radiobox:before {\n\tcontent: \"\\e75b\";\n}\n\n.cuIcon-rounddown:before {\n\tcontent: \"\\e75c\";\n}\n\n.cuIcon-upload:before {\n\tcontent: \"\\e75d\";\n}\n\n.cuIcon-writefill:before {\n\tcontent: \"\\e760\";\n}\n\n.cuIcon-write:before {\n\tcontent: \"\\e761\";\n}\n\n.cuIcon-radioboxfill:before {\n\tcontent: \"\\e763\";\n}\n\n.cuIcon-punch:before {\n\tcontent: \"\\e764\";\n}\n\n.cuIcon-shake:before {\n\tcontent: \"\\e765\";\n}\n\n.cuIcon-move:before {\n\tcontent: \"\\e768\";\n}\n\n.cuIcon-safe:before {\n\tcontent: \"\\e769\";\n}\n\n.cuIcon-activityfill:before {\n\tcontent: \"\\e775\";\n}\n\n.cuIcon-crownfill:before {\n\tcontent: \"\\e776\";\n}\n\n.cuIcon-crown:before {\n\tcontent: \"\\e777\";\n}\n\n.cuIcon-goodsfill:before {\n\tcontent: \"\\e778\";\n}\n\n.cuIcon-messagefill:before {\n\tcontent: \"\\e779\";\n}\n\n.cuIcon-profilefill:before {\n\tcontent: \"\\e77a\";\n}\n\n.cuIcon-sound:before {\n\tcontent: \"\\e77b\";\n}\n\n.cuIcon-sponsorfill:before {\n\tcontent: \"\\e77c\";\n}\n\n.cuIcon-sponsor:before {\n\tcontent: \"\\e77d\";\n}\n\n.cuIcon-upblock:before {\n\tcontent: \"\\e77e\";\n}\n\n.cuIcon-weblock:before {\n\tcontent: \"\\e77f\";\n}\n\n.cuIcon-weunblock:before {\n\tcontent: \"\\e780\";\n}\n\n.cuIcon-my:before {\n\tcontent: \"\\e78b\";\n}\n\n.cuIcon-myfill:before {\n\tcontent: \"\\e78c\";\n}\n\n.cuIcon-emojifill:before {\n\tcontent: \"\\e78d\";\n}\n\n.cuIcon-emojiflashfill:before {\n\tcontent: \"\\e78e\";\n}\n\n.cuIcon-flashbuyfill:before {\n\tcontent: \"\\e78f\";\n}\n\n.cuIcon-text:before {\n\tcontent: \"\\e791\";\n}\n\n.cuIcon-goodsfavor:before {\n\tcontent: \"\\e794\";\n}\n\n.cuIcon-musicfill:before {\n\tcontent: \"\\e795\";\n}\n\n.cuIcon-musicforbidfill:before {\n\tcontent: \"\\e796\";\n}\n\n.cuIcon-card:before {\n\tcontent: \"\\e624\";\n}\n\n.cuIcon-triangledownfill:before {\n\tcontent: \"\\e79b\";\n}\n\n.cuIcon-triangleupfill:before {\n\tcontent: \"\\e79c\";\n}\n\n.cuIcon-roundleftfill-copy:before {\n\tcontent: \"\\e79e\";\n}\n\n.cuIcon-font:before {\n\tcontent: \"\\e76a\";\n}\n\n.cuIcon-title:before {\n\tcontent: \"\\e82f\";\n}\n\n.cuIcon-recordfill:before {\n\tcontent: \"\\e7a4\";\n}\n\n.cuIcon-record:before {\n\tcontent: \"\\e7a6\";\n}\n\n.cuIcon-cardboardfill:before {\n\tcontent: \"\\e7a9\";\n}\n\n.cuIcon-cardboard:before {\n\tcontent: \"\\e7aa\";\n}\n\n.cuIcon-formfill:before {\n\tcontent: \"\\e7ab\";\n}\n\n.cuIcon-coin:before {\n\tcontent: \"\\e7ac\";\n}\n\n.cuIcon-cardboardforbid:before {\n\tcontent: \"\\e7af\";\n}\n\n.cuIcon-circlefill:before {\n\tcontent: \"\\e7b0\";\n}\n\n.cuIcon-circle:before {\n\tcontent: \"\\e7b1\";\n}\n\n.cuIcon-attentionforbid:before {\n\tcontent: \"\\e7b2\";\n}\n\n.cuIcon-attentionforbidfill:before {\n\tcontent: \"\\e7b3\";\n}\n\n.cuIcon-attentionfavorfill:before {\n\tcontent: \"\\e7b4\";\n}\n\n.cuIcon-attentionfavor:before {\n\tcontent: \"\\e7b5\";\n}\n\n.cuIcon-titles:before {\n\tcontent: \"\\e701\";\n}\n\n.cuIcon-icloading:before {\n\tcontent: \"\\e67a\";\n}\n\n.cuIcon-full:before {\n\tcontent: \"\\e7bc\";\n}\n\n.cuIcon-mail:before {\n\tcontent: \"\\e7bd\";\n}\n\n.cuIcon-peoplelist:before {\n\tcontent: \"\\e7be\";\n}\n\n.cuIcon-goodsnewfill:before {\n\tcontent: \"\\e7bf\";\n}\n\n.cuIcon-goodsnew:before {\n\tcontent: \"\\e7c0\";\n}\n\n.cuIcon-medalfill:before {\n\tcontent: \"\\e7c1\";\n}\n\n.cuIcon-medal:before {\n\tcontent: \"\\e7c2\";\n}\n\n.cuIcon-newsfill:before {\n\tcontent: \"\\e7c3\";\n}\n\n.cuIcon-newshotfill:before {\n\tcontent: \"\\e7c4\";\n}\n\n.cuIcon-newshot:before {\n\tcontent: \"\\e7c5\";\n}\n\n.cuIcon-news:before {\n\tcontent: \"\\e7c6\";\n}\n\n.cuIcon-videofill:before {\n\tcontent: \"\\e7c7\";\n}\n\n.cuIcon-video:before {\n\tcontent: \"\\e7c8\";\n}\n\n.cuIcon-exit:before {\n\tcontent: \"\\e7cb\";\n}\n\n.cuIcon-skinfill:before {\n\tcontent: \"\\e7cc\";\n}\n\n.cuIcon-skin:before {\n\tcontent: \"\\e7cd\";\n}\n\n.cuIcon-moneybagfill:before {\n\tcontent: \"\\e7ce\";\n}\n\n.cuIcon-usefullfill:before {\n\tcontent: \"\\e7cf\";\n}\n\n.cuIcon-usefull:before {\n\tcontent: \"\\e7d0\";\n}\n\n.cuIcon-moneybag:before {\n\tcontent: \"\\e7d1\";\n}\n\n.cuIcon-redpacket_fill:before {\n\tcontent: \"\\e7d3\";\n}\n\n.cuIcon-subscription:before {\n\tcontent: \"\\e7d4\";\n}\n\n.cuIcon-loading1:before {\n\tcontent: \"\\e633\";\n}\n\n.cuIcon-github:before {\n\tcontent: \"\\e692\";\n}\n\n.cuIcon-global:before {\n\tcontent: \"\\e7eb\";\n}\n\n.cuIcon-settingsfill:before {\n\tcontent: \"\\e6ab\";\n}\n\n.cuIcon-back_android:before {\n\tcontent: \"\\e7ed\";\n}\n\n.cuIcon-expressman:before {\n\tcontent: \"\\e7ef\";\n}\n\n.cuIcon-evaluate_fill:before {\n\tcontent: \"\\e7f0\";\n}\n\n.cuIcon-group_fill:before {\n\tcontent: \"\\e7f5\";\n}\n\n.cuIcon-play_forward_fill:before {\n\tcontent: \"\\e7f6\";\n}\n\n.cuIcon-deliver_fill:before {\n\tcontent: \"\\e7f7\";\n}\n\n.cuIcon-notice_forbid_fill:before {\n\tcontent: \"\\e7f8\";\n}\n\n.cuIcon-fork:before {\n\tcontent: \"\\e60c\";\n}\n\n.cuIcon-pick:before {\n\tcontent: \"\\e7fa\";\n}\n\n.cuIcon-wenzi:before {\n\tcontent: \"\\e6a7\";\n}\n\n.cuIcon-ellipse:before {\n\tcontent: \"\\e600\";\n}\n\n.cuIcon-qr_code:before {\n\tcontent: \"\\e61b\";\n}\n\n.cuIcon-dianhua:before {\n\tcontent: \"\\e64d\";\n}\n\n.cuIcon-cuIcon:before {\n\tcontent: \"\\e602\";\n}\n\n.cuIcon-loading2:before {\n\tcontent: \"\\e7f1\";\n}\n\n.cuIcon-btn:before {\n\tcontent: \"\\e601\";\n}\n"
  },
  {
    "path": "components/verification/verification.vue",
    "content": "<template>\r\n  <view>\r\n    <view\r\n      v-if=\"!hid\"\r\n      class=\"flex-row-center\"\r\n      :style=\"{ top: scHight }\"\r\n      style=\"width: 750rpx; position: fixed; z-index: 100; left: 0\"\r\n    >\r\n      <view\r\n        class=\"flex-column-center\"\r\n        style=\"background-color: #fcfcfc; padding: 30rpx; border-radius: 10rpx\"\r\n      >\r\n        <movable-area\r\n          class=\"flex\"\r\n          style=\"width: 100%\"\r\n          animation=\"false\"\r\n          :style=\"{ height: originalHeight }\"\r\n        >\r\n          <movable-view\r\n            scale-value=\"1\"\r\n            animation=\"false\"\r\n            damping=\"5000\"\r\n            :x=\"moveX\"\r\n            :style=\"{\r\n              height: sliderHeight,\r\n              width: sliderWidth,\r\n              'z-index': 101,\r\n            }\"\r\n            direction=\"horizontal\"\r\n          >\r\n            <image\r\n              :src=\"imgbk\"\r\n              class=\"image\"\r\n              mode=\"aspectFit\"\r\n              :style=\"{\r\n                height: sliderHeight,\r\n                width: sliderWidth,\r\n                'margin-top': imgbKH,\r\n              }\"\r\n            ></image>\r\n          </movable-view>\r\n          <image\r\n            :src=\"img\"\r\n            mode=\"aspectFit\"\r\n            :style=\"{ height: originalHeight, width: originalWidth }\"\r\n            style=\"border-radius: 10rpx\"\r\n          ></image>\r\n        </movable-area>\r\n\r\n        <movable-area\r\n          class=\"flex-row-start\"\r\n          style=\"\r\n            width: 100%;\r\n            background-color: #efefef;\r\n            height: 80rpx;\r\n            border-radius: 40rpx;\r\n            margin-top: 30rpx;\r\n          \"\r\n        >\r\n          <movable-view\r\n            scale-value=\"1\"\r\n            animation=\"false\"\r\n            damping=\"50\"\r\n            :x=\"movePv\"\r\n            class=\"flex-row-center\"\r\n            style=\"\r\n              border-radius: 50%;\r\n              height: 100rpx;\r\n              width: 100rpx;\r\n              background-color: #ffffff;\r\n              border: 2rpx solid #e3e3e3;\r\n              margin-top: -13rpx;\r\n            \"\r\n            direction=\"horizontal\"\r\n            @change=\"moveChange\"\r\n            @touchend=\"end\"\r\n          >\r\n            <u-icon\r\n              :color=\"mainColor\"\r\n              size=\"40\"\r\n              v-if=\"endLoad\"\r\n              name=\"arrow-right\"\r\n            ></u-icon>\r\n            <u-icon :color=\"mainColor\" size=\"40\" v-else name=\"reload\"></u-icon>\r\n          </movable-view>\r\n\r\n          <text style=\"padding-left: 140rpx\" :style=\"{ color: col }\">{{\r\n            hasImg\r\n          }}</text>\r\n        </movable-area>\r\n        <view class=\"flex-row-around padding-top\" style=\"width: 100%\">\r\n          <u-icon\r\n            @click=\"hide\"\r\n            :color=\"mainColor\"\r\n            size=\"40\"\r\n            name=\"close\"\r\n          ></u-icon>\r\n\r\n          <text class=\"cu-tag round\" @click=\"getCode\">刷新拼图</text>\r\n          <text class=\"my-neirong-sm cuIcon-safe\" style=\"color: #c1c1c1\"\r\n            >Lili-FRAMEWORK</text\r\n          >\r\n        </view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport api from \"@/config/api.js\";\r\nimport storage from \"@/utils/storage.js\";\r\nimport uuid from \"@/utils/uuid.modified.js\";\r\nconst phone = uni.getSystemInfoSync();\r\nconst l = phone.screenWidth / 750;\r\nexport default {\r\n  name: \"verification\",\r\n  created() {\r\n    // 可自行调整\r\n    this.scHight = phone.screenHeight / 2 - 200 + \"px\";\r\n    this.getCode();\r\n  },\r\n  props: {\r\n    height: {\r\n      type: String,\r\n      default: \"80rpx\",\r\n    },\r\n    width: {\r\n      type: String,\r\n      default: \"350rpx\",\r\n    },\r\n    left: {\r\n      type: String,\r\n      default: \"180rpx\",\r\n    },\r\n    top: {\r\n      type: String,\r\n      default: \"30rpx\",\r\n    },\r\n    business: {\r\n      type: String,\r\n      default: \"LOGIN\",\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      mainColor: this.$mainColor,\r\n      flage: false,\r\n      key: \"\", //key\r\n      vsrtx: \"点击进行验证\", //按钮提示语\r\n      vsr: false, //\r\n      hid: true,\r\n      col: \"#838383\",\r\n      movePv: 0,\r\n      hasImg: \"拖动滑块已完成拼图\",\r\n      spcode: \"\",\r\n      tl: 0,\r\n      moveCode: 0,\r\n      //X轴移动距离\r\n      moveX: 0,\r\n      //模版高度\r\n      originalHeight: \"\",\r\n      //模版宽度\r\n      originalWidth: \"\",\r\n      //拼图高度\r\n      sliderHeight: \"\",\r\n      //平涂宽度\r\n      sliderWidth: \"\",\r\n      scHight: 0,\r\n      //原图\r\n      img: \"\",\r\n      //拼图\r\n      imgbk: \"\",\r\n      endLoad: true,\r\n      imgbKH: \"\",\r\n    };\r\n  },\r\n  methods: {\r\n    show() {\r\n      this.hid = false;\r\n    },\r\n    hide() {\r\n      if (!this.vsr) {\r\n        // vsr判断是否验证成功，成功隐藏验证框\r\n        this.hid = !this.hid;\r\n      }\r\n    },\r\n    error() {\r\n      this.vsr = false;\r\n      this.hid = false;\r\n      this.moveX = 0;\r\n      this.moveCode = 0;\r\n    },\r\n    // 获取验证图片\r\n    getCode() {\r\n      this.col = \"#b3afae\";\r\n      this.hasImg = \"图片加载中...\";\r\n      if (!storage.getUuid()) {\r\n        storage.setUuid(uuid.v1());\r\n      }\r\n      uni.request({\r\n        url: api.common + \"/common/slider/\" + this.business,\r\n        header: {\r\n          uuid: storage.getUuid(),\r\n        },\r\n        success: (res) => {\r\n          this.col = \"#838383\";\r\n          this.hasImg = \"拖动滑块以完成拼图\";\r\n          var data = res.data.result;\r\n\r\n          // base64的图片\r\n          this.img = data.backImage;\r\n          this.imgbk = data.slidingImage;\r\n          // 根据参数动态适应验证图片的高宽\r\n          this.imgbKH = data.randomY * 1.8 + \"rpx\";\r\n          this.originalHeight = data.originalHeight * 1.8 + \"rpx\";\r\n          this.originalWidth = data.originalWidth * 1.8 + \"rpx\";\r\n          this.sliderHeight = data.sliderHeight * 1.8 + \"rpx\";\r\n          this.sliderWidth = data.sliderWidth * 1.8 + \"rpx\";\r\n          // 适应比率，用来适应滑动距离\r\n          this.tl = 1 / (1.8 * l);\r\n          // 无用信息\r\n          this.spcode = data.capcode;\r\n          // 验证令牌\r\n          this.key = data.key;\r\n          this.$store.state.verificationKey = data.key;\r\n        },\r\n      });\r\n    },\r\n    end(e) {\r\n      this.endLoad = false;\r\n      // 验证拼图位置是否正确\r\n      uni.request({\r\n        method: \"POST\",\r\n        url:\r\n          api.common +\r\n          \"/common/slider/\" +\r\n          this.business +\r\n          \"?xPos=\" +\r\n          parseInt(this.moveCode * this.tl),\r\n        header: {\r\n          uuid: storage.getUuid(),\r\n        },\r\n        success: (res) => {\r\n          this.endLoad = true;\r\n          res.data.result == false\r\n            ? (res.data.result = false)\r\n            : (res.data.result = true);\r\n\r\n          if (res.data && res.data.result) {\r\n            //验证成功后把key发送出去,后端会把验证信息存在缓存里\r\n            this.$emit(\"send\", this.key);\r\n            this.hide();\r\n            this.vsr = true;\r\n            this.vsrtx = \"已通过验证\";\r\n          } else {\r\n            this.getCode(); // 让滑块回到起始位置\r\n            if (this.movePv == 1) {\r\n              this.movePv = 0;\r\n            } else {\r\n              this.movePv = 1;\r\n            }\r\n          }\r\n        },\r\n        fail: (res) => {\r\n          this.$msg(\"连接服务器失败\");\r\n        },\r\n      });\r\n    },\r\n    // 绑定拼图位置\r\n    moveChange(e) {\r\n      this.moveX = e.detail.x;\r\n      this.moveCode = e.detail.x;\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"./animation.css\";\r\n@import \"./icon.css\";\r\n// @import './main.css';\r\n.dh-wt {\r\n  animation: at 1.1s ease;\r\n  animation-iteration-count: infinite;\r\n  animation-direction: alternate;\r\n  background-color: $main-color;\r\n  border-radius: 50%;\r\n}\r\n\r\n@keyframes at {\r\n  from {\r\n    width: 27rpx;\r\n    height: 27rpx;\r\n  }\r\n\r\n  to {\r\n    width: 45rpx;\r\n    height: 45rpx;\r\n  }\r\n}\r\n\r\n.ttcl {\r\n  color: $main-color;\r\n}\r\n\r\n.border-index {\r\n  border: 1rpx solid $main-color;\r\n}\r\n\r\n.status_bar {\r\n  height: var(--status-bar-height);\r\n  background-color: #f1f1f1;\r\n  width: 100%;\r\n}\r\n\r\n.status_bar-nobg {\r\n  height: var(--status-bar-height);\r\n  width: 100%;\r\n}\r\n\r\n/* 转圈动画 */\r\n.turn-load {\r\n  animation: turnmy 1s linear infinite;\r\n}\r\n\r\n@keyframes turnmy {\r\n  0% {\r\n    -webkit-transform: rotate(0deg);\r\n  }\r\n\r\n  25% {\r\n    -webkit-transform: rotate(90deg);\r\n  }\r\n\r\n  50% {\r\n    -webkit-transform: rotate(180deg);\r\n  }\r\n\r\n  75% {\r\n    -webkit-transform: rotate(270deg);\r\n  }\r\n\r\n  100% {\r\n    -webkit-transform: rotate(360deg);\r\n  }\r\n}\r\n\r\n.status_bar-fixed {\r\n  height: var(--status-bar-height);\r\n  width: 100%;\r\n  position: fixed;\r\n  background-color: #f1f1f1;\r\n  z-index: 20;\r\n}\r\n\r\n.head-dh-my {\r\n  display: flex;\r\n  position: fixed;\r\n  justify-content: space-around;\r\n  align-items: flex-end;\r\n  padding-bottom: 10rpx;\r\n  z-index: 15;\r\n  background-color: #e3e3e3;\r\n  width: 750rpx;\r\n}\r\n\r\n.padding-left {\r\n  padding-left: 20rpx;\r\n}\r\n\r\n.padding-left-top {\r\n  padding-left: 20rpx;\r\n  padding-top: 20rpx;\r\n}\r\n\r\n.padding-right {\r\n  padding-right: 20rpx;\r\n}\r\n\r\n.input-my {\r\n  padding-left: 20rpx;\r\n  border-radius: 40rpx;\r\n  height: 50rpx;\r\n  margin: 10rpx;\r\n}\r\n\r\n.tb-tag-absolute {\r\n  position: absolute;\r\n  z-index: 5;\r\n  border-radius: 25rpx;\r\n  font-size: 16rpx;\r\n  margin-left: 25rpx;\r\n  margin-top: -35rpx;\r\n}\r\n\r\n.flex-column-center {\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n\r\n.flex-column-between {\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n}\r\n\r\n.flex-column-start {\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: center;\r\n}\r\n\r\n.flex-column-around {\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: space-around;\r\n  align-items: center;\r\n}\r\n\r\n.flex-row-start {\r\n  display: flex;\r\n  flex-direction: row;\r\n  align-items: center;\r\n}\r\n\r\n.flex-row-around {\r\n  display: flex;\r\n  flex-direction: row;\r\n  justify-content: space-around;\r\n  align-items: center;\r\n}\r\n\r\n.flex-row-center {\r\n  display: flex;\r\n  flex-direction: row;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n\r\n.flex-row-between {\r\n  display: flex;\r\n  flex-direction: row;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n}\r\n\r\n.my-title {\r\n  font-size: 35rpx;\r\n  font-weight: bold;\r\n}\r\n\r\n.my-neirong {\r\n  font-size: 26rpx;\r\n  color: #6d6d6d;\r\n}\r\n\r\n.my-neirong-sm {\r\n  font-size: 23rpx;\r\n  color: #616161;\r\n}\r\n\r\n.my-tag-text {\r\n  font-size: 22rpx;\r\n  padding-top: 20rpx;\r\n  color: #bababa;\r\n}\r\n\r\n.padding-top {\r\n  padding-top: 35rpx;\r\n}\r\n\r\n.padding-top-sm {\r\n  padding-top: 20rpx;\r\n}\r\n\r\n.bottom-dh {\r\n  background-color: #f1f1f1;\r\n  position: fixed;\r\n  z-index: 10;\r\n  bottom: 0;\r\n  width: 750rpx;\r\n  height: 110rpx;\r\n}\r\n\r\n.tb-text {\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n\r\n.bottom-text {\r\n  width: 750rpx;\r\n  position: fixed;\r\n  text-align: center;\r\n  font-size: 26rpx;\r\n  color: #9d9d9d;\r\n  bottom: 70rpx;\r\n}\r\n\r\n.moneycolor {\r\n  color: #ea5002;\r\n}\r\n\r\n.margin-top {\r\n  margin-top: 20rpx;\r\n}\r\n\r\n.margin-top-sm {\r\n  margin-top: 12rpx;\r\n}\r\n\r\n.margin {\r\n  margin: 20rpx;\r\n}\r\n\r\n.margin-left {\r\n  margin-left: 20rpx;\r\n}\r\n\r\n.margin-right {\r\n  margin-right: 20rpx;\r\n}\r\n\r\n.main-color {\r\n  color: #07d188;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "components/verify-code/verify-code.vue",
    "content": "<template>\r\n\t<view class=\"xt__verify-code\">\r\n\t\t<!-- 输入框 -->\r\n\t\t<input\r\n\t\t\tid=\"xt__input\"\r\n\t\t\t:value=\"code\"\r\n\t\t\tclass=\"xt__input\"\r\n\t\t\t:focus=\"isFocus\"\r\n\t\t\t:password=\"isPassword\"\r\n\t\t\t:type=\"inputType\"\r\n\t\t\t:maxlength=\"size\"\r\n\t\t\t@input=\"input\"\r\n\t\t\t@focus=\"inputFocus\"\r\n\t\t\t@blur=\"inputBlur\"\r\n\t\t/>\r\n\r\n\t\t<!-- 光标 -->\r\n\t\t<view\r\n\t\t\tid=\"xt__cursor\"\r\n\t\t\tv-if=\"cursorVisible && type !== 'middle'\"\r\n\t\t\tclass=\"xt__cursor\"\r\n\t\t\t:style=\"{ left: codeCursorLeft[code.length] + 'px', height: cursorHeight + 'px', backgroundColor: cursorColor }\"\r\n\t\t></view>\r\n\r\n\t\t<!-- 输入框 - 组 -->\r\n\t\t<view id=\"xt__input-ground\" class=\"xt__input-ground\">\r\n\t\t\t<template v-for=\"(item, index) in size\">\r\n\t\t\t\t<view\r\n\t\t\t\t\t:key=\"index\"\r\n\t\t\t\t\t:style=\"{ borderColor: code.length === index && cursorVisible ? boxActiveColor : boxNormalColor }\"\r\n\t\t\t\t\t:class=\"['xt__box', `xt__box-${type + ''}`, `xt__box::after`]\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<view :style=\"{ borderColor: boxActiveColor }\" class=\"xt__middle-line\" v-if=\"type === 'middle' && !code[index]\"></view>\r\n\t\t\t\t\t<text class=\"xt__code-text\">{{ code[index] | codeFormat(isPassword) }}</text>\r\n\t\t\t\t</view>\r\n\t\t\t</template>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n<script>\r\n/**\r\n * @description 输入验证码组件\r\n * @property {string} type = [box|middle|bottom] - 显示类型 默认：box -eg:bottom\r\n * @property {string} inputType = [text|number] - 输入框类型 默认：number -eg:number\r\n * @property {number} size = [4|6] - 支持的验证码数量 默认：6 -eg:6\r\n * @property {boolean} isFocus - 是否立即聚焦 默认：true\r\n * @property {boolean} isPassword - 是否以密码形式显示 默认false -eg:false\r\n * @property {string} cursorColor - 光标颜色 默认：#cccccc\r\n * @property {string} boxNormalColor - 光标未聚焦到的框的颜色 默认：#cccccc\r\n * @property {string} boxActiveColor - 光标聚焦到的框的颜色 默认：#000000\r\n * @event {Function(data)} confirm - 输入完成\r\n */\r\nexport default {\r\n\tname: 'xt-verify-code',\r\n\tprops: {\r\n\t\tvalue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: () => ''\r\n\t\t},\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: () => 'box'\r\n\t\t},\r\n\t\tinputType: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: () => 'number'\r\n\t\t},\r\n\t\tsize: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: () => 6\r\n\t\t},\r\n\t\tisFocus: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: () => true\r\n\t\t},\r\n\t\tisPassword: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: () => false\r\n\t\t},\r\n\t\tcursorColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: () => '#cccccc'\r\n\t\t},\r\n\t\tboxNormalColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: () => '#cccccc'\r\n\t\t},\r\n\t\tboxActiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: () => '#000000'\r\n\t\t}\r\n\t},\r\n\tmodel: {\r\n\t\tprop: 'value',\r\n\t\tevent: 'input'\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tcursorVisible: false,\r\n\t\t\tcursorHeight: 35,\r\n\t\t\tcode: '', // 输入的验证码\r\n\t\t\tcodeCursorLeft: [] // 向左移动的距离数组\r\n\t\t};\r\n\t},\r\n\tcreated() {\r\n\t\tthis.cursorVisible = this.isFocus;\r\n\t},\r\n\tmounted() {\r\n\t\tthis.init();\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * @description 初始化\r\n\t\t */\r\n\t\tinit() {\r\n\t\t\tthis.getCodeCursorLeft();\r\n\t\t\tthis.setCursorHeight();\r\n\t\t},\r\n\t\t/**\r\n\t\t * @description 获取元素节点\r\n\t\t * @param {string} elm - 节点的id、class 相当于 document.querySelect的参数 -eg: #id\r\n\t\t * @param {string} type = [single|array] - 单个元素获取多个元素 默认是单个元素\r\n\t\t * @param {Function} callback - 回调函数\r\n\t\t */\r\n\t\tgetElement(elm, type = 'single', callback) {\r\n\t\t\tuni\r\n\t\t\t\t.createSelectorQuery()\r\n\t\t\t\t.in(this)\r\n\t\t\t\t[type === 'array' ? 'selectAll' : 'select'](elm)\r\n\t\t\t\t.boundingClientRect()\r\n\t\t\t\t.exec(data => {\r\n\t\t\t\t\tcallback(data[0]);\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t/**\r\n\t\t * @description 计算光标的高度\r\n\t\t */\r\n\t\tsetCursorHeight() {\r\n\t\t\tthis.getElement('.xt__box', 'single', boxElm => {\r\n\t\t\t\tthis.cursorHeight = boxElm.height * 0.6;\r\n\t\t\t});\r\n\t\t},\r\n\t\t/**\r\n\t\t * @description 获取光标在每一个box的left位置\r\n\t\t */\r\n\t\tgetCodeCursorLeft() {\r\n\t\t\t// 获取父级框的位置信息\r\n\t\t\tthis.getElement('#xt__input-ground', 'single', parentElm => {\r\n\t\t\t\tconst parentLeft = parentElm.left;\r\n\t\t\t\t// 获取各个box信息\r\n\t\t\t\tthis.getElement('.xt__box', 'array', elms => {\r\n\t\t\t\t\tthis.codeCursorLeft = [];\r\n\t\t\t\t\telms.forEach(elm => {\r\n\t\t\t\t\t\tthis.codeCursorLeft.push(elm.left - parentLeft + elm.width / 2);\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// 输入框输入变化的回调\r\n\t\tinput(e) {\r\n\t\t\tconst value = e.detail.value;\r\n\t\t\tthis.cursorVisible = value.length !== this.size;\r\n\t\t\tthis.$emit('input', value);\r\n\t\t\tthis.inputSuccess(value);\r\n\t\t},\r\n\r\n\t\t// 输入完成回调\r\n\t\tinputSuccess(value) {\r\n\t\t\tif (value.length === this.size) {\r\n\t\t\t\tthis.$emit('confirm', value);\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 输入聚焦\r\n\t\tinputFocus() {\r\n\t\t\tthis.cursorVisible = this.code.length !== this.size;\r\n\t\t},\r\n\t\t// 输入失去焦点\r\n\t\tinputBlur() {\r\n\t\t\tthis.cursorVisible = false;\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tvalue(val) {\r\n\t\t\tthis.code = val;\r\n\t\t}\r\n\t},\r\n\tfilters: {\r\n\t\tcodeFormat(val, isPassword) {\r\n\t\t\tlet value = '';\r\n\t\t\tif (val) {\r\n\t\t\t\tvalue = isPassword ? '*' : val;\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.xt__verify-code {\r\n\tposition: relative;\r\n\twidth: 100%;\r\n\tbox-sizing: border-box;\r\n\r\n\t.xt__input {\r\n\t\theight: 100%;\r\n\t\twidth: 200%;\r\n\t\tposition: absolute;\r\n\t\tleft: -100%;\r\n\t\tz-index: 1;\r\n\t}\r\n\t.xt__cursor {\r\n\t\tposition: absolute;\r\n\t\ttop: 50%;\r\n\t\ttransform: translateY(-50%);\r\n\t\tdisplay: inline-block;\r\n\t\twidth: 2px;\r\n\t\tanimation-name: cursor;\r\n\t\tanimation-duration: 0.8s;\r\n\t\tanimation-iteration-count: infinite;\r\n\t}\r\n\r\n\t.xt__input-ground {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\twidth: 100%;\r\n\t\tbox-sizing: border-box;\r\n\t\t.xt__box {\r\n\t\t\tposition: relative;\r\n\t\t\tdisplay: inline-block;\r\n\t\t\twidth: 76rpx;\r\n\t\t\theight: 112rpx;\r\n\t\t\t&-bottom {\r\n\t\t\t\tborder-bottom-width: 2px;\r\n\t\t\t\tborder-bottom-style: solid;\r\n\t\t\t}\r\n\r\n\t\t\t&-box {\r\n\t\t\t\tborder-width: 2px;\r\n\t\t\t\tborder-style: solid;\r\n\t\t\t}\r\n\r\n\t\t\t&-middle {\r\n\t\t\t\tborder: none;\r\n\t\t\t}\r\n\r\n\t\t\t.xt__middle-line {\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\ttop: 50%;\r\n\t\t\t\tleft: 50%;\r\n\t\t\t\twidth: 50%;\r\n\t\t\t\ttransform: translate(-50%, -50%);\r\n\t\t\t\tborder-bottom-width: 2px;\r\n\t\t\t\tborder-bottom-style: solid;\r\n\t\t\t}\r\n\r\n\t\t\t.xt__code-text {\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\ttop: 50%;\r\n\t\t\t\tleft: 50%;\r\n\t\t\t\tfont-size:52rpx;\r\n\t\t\t\ttransform: translate(-50%, -50%);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n@keyframes cursor {\r\n\t0% {\r\n\t\topacity: 1;\r\n\t}\r\n\r\n\t100% {\r\n\t\topacity: 0;\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "config/api.js",
    "content": "/**\r\n * base    : 基础业务API\r\n * buyer   : 买家API\r\n */\r\n// 开发环境\r\nconst dev = {\r\n  im: \"https://im-api.pickmall.cn\",\r\n  common: \"https://common-api.pickmall.cn\",\r\n  buyer: \"https://buyer-api.pickmall.cn\",\r\n  // common: \"http://192.168.0.113:8890\",\r\n  // buyer: \"http://192.168.0.113:8888\",\r\n  // im: \"http://192.168.0.113:8885\",\r\n};\r\n// 生产环境\r\nconst prod = {\r\n  im: \"https://im-api.pickmall.cn\",\r\n  common: \"https://common-api.pickmall.cn\",\r\n  buyer: \"https://buyer-api.pickmall.cn\",\r\n};\r\n\r\n//默认生产环境\r\nlet api = dev;\r\n//如果是开发环境\r\nif (process.env.NODE_ENV == \"development\") {\r\n  api = dev;\r\n} else {\r\n  api = prod;\r\n}\r\n//微信小程序，app的打包方式建议为生产环境，所以这块直接条件编译赋值\r\n// #ifdef MP-WEIXIN || APP-PLUS\r\napi = prod;\r\n// #endif\r\n\r\napi.buyer += \"/buyer\";\r\napi.common += \"/common\";\r\napi.im += \"/im\";\r\nexport default {\r\n  ...api,\r\n};\r\n"
  },
  {
    "path": "config/config.js",
    "content": "const name = \"lilishop\"; //全局商城name\nconst schemeName = \"lilishop\"; //唤醒app需要的schemeName\nexport default {\n  name: name,\n  schemeLink: `${schemeName}://`, //唤起app地址\n  downloadLink: \"https://pickmall.cn/download-page/index.html\", //下载地址，下载app的地址\n  shareLink: \"https://m-b2b2c.pickmall.cn\", //分享地址，也就是在h5中默认的复制地址\n  appid: \"wx6f10f29075dc1b0b\", //小程序唯一凭证，即 AppID，可在「微信公众平台 - 设置 - 开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）\n  aMapKey: \"1f78544934b66c9fbc0104117f663973\", //在高德中申请Web服务key\n  scanAuthNavigation: [\"https://m-b2b2c.pickmall.cn/\"], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转\n  iosAppId: \"id1564638363\", //AppStore的应用地址id 具体在分享->拷贝链接中查看\n  logo: \"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png\", //logo地址\n  customerServiceMobile: \"13161366885\", //客服电话\n  customerServiceEmail: \"lili@lili.com\", //客服邮箱\n  imWebSrc: \"https://im.pickmall.cn\", //IM地址\n  baseWsUrl: \"wss://im-api.pickmall.cn/lili/webSocket\", // IM WS 地址\n  enableGetClipboard: false, //是否启用粘贴板获取 scanAuthNavigation 中的链接，如果匹配则会跳转到对应页面\n  enableMiniBarStartUpApp: true, //是否在h5中右侧浮空按钮点击启动app\n  /**\n   * 如需更换主题请修改此处以及uni.scss中的全局颜色\n   */\n  mainColor: \"#ff3c2a\", // 主题色\n  lightColor: \"#ff6b35\", // 高亮主题色\n  aiderLightColor: \"#ff9f28\", // 辅助高亮颜色\n  defaultUserPhoto: \"/static/missing-face.png\", // 默认用户头像\n  enableFetchMobileLogin: false // 是否启用获取手机号登录 如果微信小程序提示封禁手机号获取权限 可将此选项设置成false作为备用登录方案\n};\n"
  },
  {
    "path": "hybrid/html/advertise/advertise.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<meta charset=\"utf-8\" />\r\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n\t\t<title>广告启动页</title>\r\n\t\t<link rel=\"stylesheet\" href=\"../css/advertise.css\">\r\n\t\t<!-- uni 的 SDK -->\r\n\t\t<script type=\"text/javascript\" src=\"../js/webView.js\"></script>\r\n\t</head>\r\n\t<body>\r\n\t\t<div class=\"content\">\r\n\t\t\t<div class=\"con\">\r\n\t\t\t\t<img id=\"img\" src=\"../imgs/domain.jpeg\">\r\n\t\t\t</div>\r\n\t\t\t<div class=\"btn\" id=\"timer\">\r\n\t\t\t\t<div id=\"info\">跳过</div>\r\n\t\t\t\t<div class=\"circleProgress_wrapper btn\">\r\n\t\t\t\t\t<div class=\"wrapper right\">\r\n\t\t\t\t\t\t<div class=\"circleProgress rightcircle\"></div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper left\">\r\n\t\t\t\t\t\t<div class=\"circleProgress leftcircle\"></div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</body>\r\n\t<script>\r\n\t\t\r\n\t\t// var currentAd = {\r\n\t\t// \toperation_type: 'NONE'\r\n\t\t// };\r\n\t\t\r\n\t\t\r\n\t\t// function getRandom(start, end, fixed = 0) {\r\n\t\t// \tlet differ = end - start\r\n\t\t// \tlet random = Math.random()\r\n\t\t// \treturn (start + differ * random).toFixed(fixed)\r\n\t\t// }\r\n\r\n\t\t// document.addEventListener('plusready', function () {\r\n\t\t// \tvar xhr = new plus.net.XMLHttpRequest();\r\n\t\t// \txhr.onreadystatechange = function () {\r\n\t\t// \t\tswitch (xhr.readyState) {\r\n\t\t// \t\t\tcase 0:\r\n\t\t// \t\t\t\tbreak;\r\n\t\t// \t\t\tcase 1:\r\n\t\t// \t\t\t\tbreak;\r\n\t\t// \t\t\tcase 2:\r\n\t\t// \t\t\t\tbreak;\r\n\t\t// \t\t\tcase 3:\r\n\t\t// \t\t\t\tbreak;\r\n\t\t// \t\t\tcase 4:\r\n\t\t// \t\t\t\tif (xhr.status == 200) {\r\n\t\t// \t\t\t\t\tlet res = JSON.parse(xhr.responseText);\r\n\t\t// \t\t\t\t\tif (res.length > 0) {\r\n\t\t// \t\t\t\t\t\tcurrentAd = res[getRandom(0, res.length - 1)];\r\n\t\t// \t\t\t\t\t\tdocument.getElementById(\"img\").src = currentAd.pic_url;\r\n\t\t// \t\t\t\t\t} else {\r\n\t\t// \t\t\t\t\t\tplus.webview.currentWebview().close();\r\n\t\t// \t\t\t\t\t}\t\t\r\n\t\t// \t\t\t\t\t//alert(\"xhr请求成功：\" + xhr.responseText);\r\n\t\t// \t\t\t\t} else {\r\n\t\t// \t\t\t\t\tplus.webview.currentWebview().close();\r\n\t\t// \t\t\t\t\t//alert(\"xhr请求失败：\" + xhr.readyState);\r\n\t\t// \t\t\t\t}\r\n\t\t// \t\t\t\tbreak;\r\n\t\t// \t\t\tdefault:\r\n\t\t// \t\t\t\tbreak;\r\n\t\t// \t\t}\r\n\t\t// \t}\r\n\t\t// \t// xhr.open(\"GET\", \"https://api-buyer-app.yinbei.cn/advertisement\");\r\n\t\t// \txhr.send();\r\n\t\t// }, false);\r\n\t\t\r\n\r\n\t\t// document.addEventListener('UniAppJSBridgeReady', function () {\r\n\t\t// \tdocument.querySelector('.con').addEventListener('click', function (e) {\r\n\t\t// \t\tif (e.isTrusted) {\r\n\t\t// \t\t\tplus.webview.currentWebview().close();\r\n\t\t// \t\t\tswitch (currentAd.operation_type) {\r\n\t\t// \t\t\t\t// 链接地址\r\n\t\t// \t\t\t\tcase 'URL':\r\n\t\t// \t\t\t\t\tplus.webview.open(currentAd.operation_url)\r\n\t\t// \t\t\t\t\tbreak;\r\n\t\t// \t\t\t\t// 商品\r\n\t\t// \t\t\t\tcase 'GOODS':\r\n\t\t// \t\t\t\t\tuni.navigateTo({\r\n\t\t// \t\t\t\t\t\turl: `/pages/product/goods?id=` + currentAd.operation_param\r\n\t\t// \t\t\t\t\t});\r\n\t\t// \t\t\t\t\tbreak;\r\n\t\t// \t\t\t\t// 关键字\r\n\t\t// \t\t\t\tcase 'KEYWORD':\r\n\t\t// \t\t\t\t\tuni.navigateTo({\r\n\t\t// \t\t\t\t\t\turl: '/pages/recommend/recommend' + currentAd.operation_param\r\n\t\t// \t\t\t\t\t});\r\n\t\t// \t\t\t\t\tbreak;\r\n\t\t// \t\t\t\t// 店铺\r\n\t\t// \t\t\t\tcase 'store':\r\n\t\t// \t\t\t\t\tuni.navigateTo({\r\n\t\t// \t\t\t\t\t\turl: `/pages/product/shopPage?id=` + currentAd.operation_param\r\n\t\t// \t\t\t\t\t});\r\n\t\t// \t\t\t\t\tbreak;\r\n\t\t// \t\t\t\t// 分类\r\n\t\t// \t\t\t\tcase 'CATEGORY':\r\n\t\t// \t\t\t\t\tuni.navigateTo({\r\n\t\t// \t\t\t\t\t\turl: '/pages/category/category'\r\n\t\t// \t\t\t\t\t});\r\n\t\t// \t\t\t\t\tbreak;\r\n\t\t// \t\t\t\tdefault:\r\n\t\t// \t\t\t\t\tbreak;\r\n\t\t// \t\t\t}\r\n\t\t// \t\t}\r\n\t\t// \t});\r\n\t\t// \tdocument.querySelector('.btn').addEventListener('click', function (e) {\r\n\t\t// \t\tif (e.isTrusted) {\r\n\t\t// \t\t\tplus.webview.currentWebview().close();\r\n\t\t// \t\t}\r\n\t\t// \t});\r\n\t\t// });\r\n\t</script>\r\n</html>\r\n"
  },
  {
    "path": "hybrid/html/css/advertise.css",
    "content": "* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\nhtml,\r\nbody {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.content {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.content .con {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tfont-size: 0;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n#img {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n#timer {\r\n\tdisplay: inline-block;\r\n\tposition: fixed;\r\n\ttop: 40px;\r\n\tright: 10px;\r\n}\r\n\r\n#info {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\tline-height: 36px;\r\n\tborder-radius: 50%;\r\n\tbackground-color: rgba(0, 0, 0, 0.3);\r\n\ttext-align: center;\r\n\tcolor: #FFFFFF;\r\n\tfont-size: 12px;\r\n}\r\n\r\n.circleProgress_wrapper {\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\tposition: relative;\r\n}\r\n\r\n.wrapper {\r\n\twidth: 18px;\r\n\theight: 36px;\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\toverflow: hidden;\r\n}\r\n\r\n.right {\r\n\tright: 0;\r\n}\r\n\r\n.left {\r\n\tleft: 0;\r\n}\r\n\r\n.circleProgress {\r\n\twidth: 32px;\r\n\theight: 32px;\r\n\tborder: 2px solid #FFFFFF;\r\n\tborder-radius: 50%;\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\t-webkit-transform: rotate(45deg);\r\n}\r\n\r\n.rightcircle {\r\n\tborder-top: 2px solid #03A9F4;\r\n\tborder-right: 2px solid #03A9F4;\r\n\tright: 0;\r\n\t-webkit-animation: circleProgressLoad_right 4s linear;\r\n\t/*动画停留在最后一帧*/\r\n\tanimation-fill-mode: forwards;\r\n\t-moz-animation-fill-mode: forwards;\r\n\t-webkit-animation-fill-mode: forwards;\r\n\t-o-animation-fill-mode: forwards;\r\n}\r\n\r\n.leftcircle {\r\n\tborder-bottom: 2px solid #03A9F4;\r\n\tborder-left: 2px solid #03A9F4;\r\n\tleft: 0;\r\n\t-webkit-animation: circleProgressLoad_left 4s linear;\r\n\t/*动画停留在最后一帧*/\r\n\tanimation-fill-mode: forwards;\r\n\t-moz-animation-fill-mode: forwards;\r\n\t-webkit-animation-fill-mode: forwards;\r\n\t-o-animation-fill-mode: forwards;\r\n}\r\n\r\n@-webkit-keyframes circleProgressLoad_right {\r\n\t0% {\r\n\t\tborder-top: 2px solid #03A9F4;\r\n\t\tborder-right: 2px solid #03A9F4;\r\n\t\t-webkit-transform: rotate(45deg);\r\n\t}\r\n\r\n\t50% {\r\n\t\tborder-top: 2px solid #03A9F4;\r\n\t\tborder-right: 2px solid #03A9F4;\r\n\t\tborder-left: 2px solid #FFFFFF;\r\n\t\tborder-bottom: 2px solid #FFFFFF;\r\n\t\t-webkit-transform: rotate(225deg);\r\n\t}\r\n\r\n\t100% {\r\n\t\tborder-left: 2px solid #FFFFFF;\r\n\t\tborder-bottom: 2px solid #FFFFFF;\r\n\t\t-webkit-transform: rotate(225deg);\r\n\t}\r\n}\r\n\r\n@-webkit-keyframes circleProgressLoad_left {\r\n\t0% {\r\n\t\tborder-bottom: 2px solid #03A9F4;\r\n\t\tborder-left: 2px solid #03A9F4;\r\n\t\t-webkit-transform: rotate(45deg);\r\n\t}\r\n\r\n\t50% {\r\n\t\tborder-bottom: 2px solid #03A9F4;\r\n\t\tborder-left: 2px solid #03A9F4;\r\n\t\tborder-top: 2px solid #FFFFFF;\r\n\t\tborder-right: 2px solid #FFFFFF;\r\n\t\t-webkit-transform: rotate(45deg);\r\n\t}\r\n\r\n\t100% {\r\n\t\tborder-top: 2px solid #FFFFFF;\r\n\t\tborder-right: 2px solid #FFFFFF;\r\n\t\t-webkit-transform: rotate(225deg);\r\n\t}\r\n}\n"
  },
  {
    "path": "hybrid/html/error.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<meta charset=\"utf-8\" />\r\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n\t\t<title>服务器异常</title>\r\n\t\t\r\n\t\t<script type=\"text/javascript\" src=\"./js/webView.js\"></script>\r\n\t\t<script type=\"text/javascript\">\r\n\t\t\t// H5 plus事件处理\r\n\t\t\tvar ws = null;\r\n\r\n\t\t\tfunction plusReady() {\r\n\t\t\t\t// Android处理返回键\r\n\t\t\t\tplus.key.addEventListener('backbutton', function() {\r\n\t\t\t\t\t(history.length == 1) && ws.close();\r\n\t\t\t\t\tvar c = setTimeout(function() {\r\n\t\t\t\t\t\tws.close();\r\n\t\t\t\t\t}, 1000);\r\n\t\t\t\t\twindow.onbeforeunload = function() {\r\n\t\t\t\t\t\tclearTimeout(c);\r\n\t\t\t\t\t}\r\n\t\t\t\t\thistory.go(-2);\r\n\t\t\t\t}, false);\r\n\t\t\t\tws = plus.webview.currentWebview();\r\n\t\t\t}\r\n\t\t\tif (window.plus) {\r\n\t\t\t\tplusReady();\r\n\t\t\t} else {\r\n\t\t\t\tdocument.addEventListener('plusready', plusReady, false);\r\n\t\t\t}\r\n\t\t\tdocument.addEventListener('touchstart', function() {\r\n\t\t\t\treturn false;\r\n\t\t\t}, true);\r\n\t\t\t// 禁止选择\r\n\t\t\tdocument.oncontextmenu = function() {\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t</script>\r\n\t\t<style>\r\n\t\t\thtml,\r\n\t\t\tbody {\r\n\t\t\t\tpadding: 0;\r\n\t\t\t\tmargin: 0;\r\n\t\t\t\twidth: 100%;\r\n\t\t\t\theight: 100%;\r\n\t\t\t}\r\n\r\n\t\t\t.main {\r\n\t\t\t\theight: 100%;\r\n\t\t\t\twidth: 100%;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tjustify-content: center;\r\n\t\t\t\tline-height: 80px;\r\n\t\t\t\tflex-direction: column;\r\n\t\t\t}\r\n\r\n\t\t\t.text {\r\n\t\t\t\tfont-size: 14px;\r\n\t\t\t\tcolor: #999999;\r\n\t\t\t}\r\n\r\n\t\t\timg {\r\n\t\t\t\twidth: 150px;\r\n\t\t\t\theight: 130px;\r\n\t\t\t}\r\n\r\n\t\t\tbutton {\r\n\t\t\t\tborder: 1px solid #1ABC9C;\r\n\t\t\t\tborder-radius: 2px;\r\n\t\t\t\tbackground-color: #FFFFFF;\r\n\t\t\t\tcolor: #1ABC9C;\r\n\t\t\t\twidth: 100px;\r\n\t\t\t\theight: 30px;\r\n\t\t\t\tmargin-bottom: 30px;\r\n\t\t\t\toutline: none;\r\n\t\t\t}\r\n\r\n\t\t\t.go-index {\r\n\t\t\t\tmargin-top: 20px;\r\n\t\t\t}\r\n\t\t</style>\r\n\t</head>\r\n\t<body>\r\n\t\t<div class=\"main\">\r\n\t\t\t<div class=\"text\">服务器异常</div>\r\n\t\t\t<button onclick=\"if(history.length == 1){ws.close();}else{ws.back();ws.back();}\">点击刷新</button>\r\n\t\t\t<button onclick=\"ws.close()\">点击关闭</button>\r\n\t\t\t<button onclick=\"plus.runtime.restart()\">点击重启</button>\r\n\t\t</div>\r\n\t\t</div>\r\n\t</body>\r\n</html>\r\n"
  },
  {
    "path": "hybrid/html/js/webView.js",
    "content": "!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){\"use strict\";try{var e={};Object.defineProperty(e,\"passive\",{get:function(){!0}}),window.addEventListener(\"test-passive\",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function t(e,t){return n.call(e,t)}var i=[],a=function(e,n){var t={options:{timestamp:+new Date},name:e,arg:n};if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){if(\"postMessage\"===e){var a={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(a):window.__dcloud_weex_.postMessage(JSON.stringify(a))}var o={type:\"WEB_INVOKE_APPSERVICE\",args:{data:t,webviewIds:i}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(o):window.__dcloud_weex_.postMessageToService(JSON.stringify(o))}if(!window.plus)return window.parent.postMessage({type:\"WEB_INVOKE_APPSERVICE\",data:t,pageId:\"\"},\"*\");if(0===i.length){var r=plus.webview.currentWebview();if(!r)throw new Error(\"plus.webview.currentWebview() is undefined\");var d=r.parent(),s=\"\";s=d?d.id:r.id,i.push(s)}if(plus.webview.getWebviewById(\"__uniapp__service\"))plus.webview.postMessageToUniNView({type:\"WEB_INVOKE_APPSERVICE\",args:{data:t,webviewIds:i}},\"__uniapp__service\");else{var w=JSON.stringify(t);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler(\"'.concat(\"WEB_INVOKE_APPSERVICE\",'\",').concat(w,\",\").concat(JSON.stringify(i),\");\"))}},o={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a(\"navigateTo\",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;a(\"navigateBack\",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a(\"switchTab\",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a(\"reLaunch\",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a(\"redirectTo\",{url:encodeURI(n)})},getEnv:function(e){window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a(\"postMessage\",e.data||{})}},r=/uni-app/i.test(navigator.userAgent),d=/Html5Plus/i.test(navigator.userAgent),s=/complete|loaded|interactive/;var w=window.my&&navigator.userAgent.indexOf(\"AlipayClient\")>-1;var u=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var g=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var v=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);for(var l,_=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent(\"UniAppJSBridgeReady\",{bubbles:!0,cancelable:!0}))},f=[function(e){if(r||d)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener(\"DOMContentLoaded\",e):window.plus&&s.test(document.readyState)?setTimeout(e,0):document.addEventListener(\"plusready\",e),o},function(e){if(v)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener(\"WeixinJSBridgeReady\",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener(\"QQJSBridgeReady\",e),window.qq.miniProgram},function(e){if(w){document.addEventListener(\"DOMContentLoaded\",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(u)return document.addEventListener(\"DOMContentLoaded\",e),window.swan.webView},function(e){if(g)return document.addEventListener(\"DOMContentLoaded\",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener(\"QaJSBridgeReady\",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){return document.addEventListener(\"DOMContentLoaded\",e),o}],m=0;m<f.length&&!(l=f[m](_));m++);l||(l={});var E=\"undefined\"!=typeof uni?uni:{};if(!E.navigateTo)for(var b in l)t(l,b)&&(E[b]=l[b]);return E.webView=l,E}));"
  },
  {
    "path": "js_sdk/amap-wx.130.js",
    "content": "function AMapWX(a){this.key=a.key;this.requestConfig={key:a.key,s:\"rsx\",platform:\"WXJS\",appname:a.key,sdkversion:\"1.2.0\",logversion:\"2.0\"};this.MeRequestConfig={key:a.key,serviceName:\"https://restapi.amap.com/rest/me\"}}\nAMapWX.prototype.getWxLocation=function(a,b){wx.getLocation({type:\"gcj02\",success:function(c){c=c.longitude+\",\"+c.latitude;wx.setStorage({key:\"userLocation\",data:c});b(c)},fail:function(c){wx.getStorage({key:\"userLocation\",success:function(d){d.data&&b(d.data)}});a.fail({errCode:\"0\",errMsg:c.errMsg||\"\"})}})};\nAMapWX.prototype.getMEKeywordsSearch=function(a){if(!a.options)return a.fail({errCode:\"0\",errMsg:\"\\u7f3a\\u5c11\\u5fc5\\u8981\\u53c2\\u6570\"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:\"rsx\",platform:\"WXJS\",appname:a.key,sdkversion:\"1.2.0\",logversion:\"2.0\"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.city&&(d.city=b.city);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&(d.pageSize=b.pageSize);b.sig&&(d.sig=\nb.sig);wx.request({url:c.serviceName+\"/cpoint/datasearch/local\",data:d,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(e){(e=e.data)&&e.status&&\"1\"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:\"0\",errMsg:e})},fail:function(e){a.fail({errCode:\"0\",errMsg:e.errMsg||\"\"})}})};\nAMapWX.prototype.getMEIdSearch=function(a){if(!a.options)return a.fail({errCode:\"0\",errMsg:\"\\u7f3a\\u5c11\\u5fc5\\u8981\\u53c2\\u6570\"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:\"rsx\",platform:\"WXJS\",appname:a.key,sdkversion:\"1.2.0\",logversion:\"2.0\"};b.layerId&&(d.layerId=b.layerId);b.id&&(d.id=b.id);b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+\"/cpoint/datasearch/id\",data:d,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(e){(e=e.data)&&e.status&&\"1\"===e.status&&\n0===e.code?a.success(e.data):a.fail({errCode:\"0\",errMsg:e})},fail:function(e){a.fail({errCode:\"0\",errMsg:e.errMsg||\"\"})}})};\nAMapWX.prototype.getMEPolygonSearch=function(a){if(!a.options)return a.fail({errCode:\"0\",errMsg:\"\\u7f3a\\u5c11\\u5fc5\\u8981\\u53c2\\u6570\"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:\"rsx\",platform:\"WXJS\",appname:a.key,sdkversion:\"1.2.0\",logversion:\"2.0\"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.polygon&&(d.polygon=b.polygon);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&(d.pageSize=b.pageSize);\nb.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+\"/cpoint/datasearch/polygon\",data:d,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(e){(e=e.data)&&e.status&&\"1\"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:\"0\",errMsg:e})},fail:function(e){a.fail({errCode:\"0\",errMsg:e.errMsg||\"\"})}})};\nAMapWX.prototype.getMEaroundSearch=function(a){if(!a.options)return a.fail({errCode:\"0\",errMsg:\"\\u7f3a\\u5c11\\u5fc5\\u8981\\u53c2\\u6570\"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:\"rsx\",platform:\"WXJS\",appname:a.key,sdkversion:\"1.2.0\",logversion:\"2.0\"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.center&&(d.center=b.center);b.radius&&(d.radius=b.radius);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&\n(d.pageSize=b.pageSize);b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+\"/cpoint/datasearch/around\",data:d,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(e){(e=e.data)&&e.status&&\"1\"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:\"0\",errMsg:e})},fail:function(e){a.fail({errCode:\"0\",errMsg:e.errMsg||\"\"})}})};\nAMapWX.prototype.getGeo=function(a){var b=this.requestConfig,c=a.options;b={key:this.key,extensions:\"all\",s:b.s,platform:b.platform,appname:this.key,sdkversion:b.sdkversion,logversion:b.logversion};c.address&&(b.address=c.address);c.city&&(b.city=c.city);c.batch&&(b.batch=c.batch);c.sig&&(b.sig=c.sig);wx.request({url:\"https://restapi.amap.com/v3/geocode/geo\",data:b,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(d){(d=d.data)&&d.status&&\"1\"===d.status?a.success(d):a.fail({errCode:\"0\",\nerrMsg:d})},fail:function(d){a.fail({errCode:\"0\",errMsg:d.errMsg||\"\"})}})};\nAMapWX.prototype.getRegeo=function(a){function b(d){var e=c.requestConfig;wx.request({url:\"https://restapi.amap.com/v3/geocode/regeo\",data:{key:c.key,location:d,extensions:\"all\",s:e.s,platform:e.platform,appname:c.key,sdkversion:e.sdkversion,logversion:e.logversion},method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(g){if(g.data.status&&\"1\"==g.data.status){g=g.data.regeocode;var h=g.addressComponent,f=[],k=g.roads[0].name+\"\\u9644\\u8fd1\",m=d.split(\",\")[0],n=d.split(\",\")[1];if(g.pois&&\ng.pois[0]){k=g.pois[0].name+\"\\u9644\\u8fd1\";var l=g.pois[0].location;l&&(m=parseFloat(l.split(\",\")[0]),n=parseFloat(l.split(\",\")[1]))}h.provice&&f.push(h.provice);h.city&&f.push(h.city);h.district&&f.push(h.district);h.streetNumber&&h.streetNumber.street&&h.streetNumber.number?(f.push(h.streetNumber.street),f.push(h.streetNumber.number)):f.push(g.roads[0].name);f=f.join(\"\");a.success([{iconPath:a.iconPath,width:a.iconWidth,height:a.iconHeight,name:f,desc:k,longitude:m,latitude:n,id:0,regeocodeData:g}])}else a.fail({errCode:g.data.infocode,\nerrMsg:g.data.info})},fail:function(g){a.fail({errCode:\"0\",errMsg:g.errMsg||\"\"})}})}var c=this;a.location?b(a.location):c.getWxLocation(a,function(d){b(d)})};\nAMapWX.prototype.getWeather=function(a){function b(g){var h=\"base\";a.type&&\"forecast\"==a.type&&(h=\"all\");wx.request({url:\"https://restapi.amap.com/v3/weather/weatherInfo\",data:{key:d.key,city:g,extensions:h,s:e.s,platform:e.platform,appname:d.key,sdkversion:e.sdkversion,logversion:e.logversion},method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(f){if(f.data.status&&\"1\"==f.data.status)if(f.data.lives){if((f=f.data.lives)&&0<f.length){f=f[0];var k={city:{text:\"\\u57ce\\u5e02\",data:f.city},\nweather:{text:\"\\u5929\\u6c14\",data:f.weather},temperature:{text:\"\\u6e29\\u5ea6\",data:f.temperature},winddirection:{text:\"\\u98ce\\u5411\",data:f.winddirection+\"\\u98ce\"},windpower:{text:\"\\u98ce\\u529b\",data:f.windpower+\"\\u7ea7\"},humidity:{text:\"\\u6e7f\\u5ea6\",data:f.humidity+\"%\"}};k.liveData=f;a.success(k)}}else f.data.forecasts&&f.data.forecasts[0]&&a.success({forecast:f.data.forecasts[0]});else a.fail({errCode:f.data.infocode,errMsg:f.data.info})},fail:function(f){a.fail({errCode:\"0\",errMsg:f.errMsg||\"\"})}})}\nfunction c(g){wx.request({url:\"https://restapi.amap.com/v3/geocode/regeo\",data:{key:d.key,location:g,extensions:\"all\",s:e.s,platform:e.platform,appname:d.key,sdkversion:e.sdkversion,logversion:e.logversion},method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(h){if(h.data.status&&\"1\"==h.data.status){h=h.data.regeocode;if(h.addressComponent)var f=h.addressComponent.adcode;else h.aois&&0<h.aois.length&&(f=h.aois[0].adcode);b(f)}else a.fail({errCode:h.data.infocode,errMsg:h.data.info})},\nfail:function(h){a.fail({errCode:\"0\",errMsg:h.errMsg||\"\"})}})}var d=this,e=d.requestConfig;a.city?b(a.city):d.getWxLocation(a,function(g){c(g)})};\nAMapWX.prototype.getPoiAround=function(a){function b(e){e={key:c.key,location:e,s:d.s,platform:d.platform,appname:c.key,sdkversion:d.sdkversion,logversion:d.logversion};a.querytypes&&(e.types=a.querytypes);a.querykeywords&&(e.keywords=a.querykeywords);wx.request({url:\"https://restapi.amap.com/v3/place/around\",data:e,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(g){if(g.data.status&&\"1\"==g.data.status){if((g=g.data)&&g.pois){for(var h=[],f=0;f<g.pois.length;f++){var k=0==\nf?a.iconPathSelected:a.iconPath;h.push({latitude:parseFloat(g.pois[f].location.split(\",\")[1]),longitude:parseFloat(g.pois[f].location.split(\",\")[0]),iconPath:k,width:22,height:32,id:f,name:g.pois[f].name,address:g.pois[f].address})}a.success({markers:h,poisData:g.pois})}}else a.fail({errCode:g.data.infocode,errMsg:g.data.info})},fail:function(g){a.fail({errCode:\"0\",errMsg:g.errMsg||\"\"})}})}var c=this,d=c.requestConfig;a.location?b(a.location):c.getWxLocation(a,function(e){b(e)})};\nAMapWX.prototype.getStaticmap=function(a){function b(e){c.push(\"location=\"+e);a.zoom&&c.push(\"zoom=\"+a.zoom);a.size&&c.push(\"size=\"+a.size);a.scale&&c.push(\"scale=\"+a.scale);a.markers&&c.push(\"markers=\"+a.markers);a.labels&&c.push(\"labels=\"+a.labels);a.paths&&c.push(\"paths=\"+a.paths);a.traffic&&c.push(\"traffic=\"+a.traffic);e=\"https://restapi.amap.com/v3/staticmap?\"+c.join(\"&\");a.success({url:e})}var c=[];c.push(\"key=\"+this.key);var d=this.requestConfig;c.push(\"s=\"+d.s);c.push(\"platform=\"+d.platform);\nc.push(\"appname=\"+d.appname);c.push(\"sdkversion=\"+d.sdkversion);c.push(\"logversion=\"+d.logversion);a.location?b(a.location):this.getWxLocation(a,function(e){b(e)})};\nAMapWX.prototype.getInputtips=function(a){var b=Object.assign({},this.requestConfig);a.location&&(b.location=a.location);a.keywords&&(b.keywords=a.keywords);a.type&&(b.type=a.type);a.city&&(b.city=a.city);a.citylimit&&(b.citylimit=a.citylimit);wx.request({url:\"https://restapi.amap.com/v3/assistant/inputtips\",data:b,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(c){c&&c.data&&c.data.tips&&a.success({tips:c.data.tips})},fail:function(c){a.fail({errCode:\"0\",errMsg:c.errMsg||\n\"\"})}})};\nAMapWX.prototype.getDrivingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);a.strategy&&(b.strategy=a.strategy);a.waypoints&&(b.waypoints=a.waypoints);a.avoidpolygons&&(b.avoidpolygons=a.avoidpolygons);a.avoidroad&&(b.avoidroad=a.avoidroad);wx.request({url:\"https://restapi.amap.com/v3/direction/driving\",data:b,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths,\ntaxi_cost:c.data.route.taxi_cost||\"\"})},fail:function(c){a.fail({errCode:\"0\",errMsg:c.errMsg||\"\"})}})};\nAMapWX.prototype.getWalkingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);wx.request({url:\"https://restapi.amap.com/v3/direction/walking\",data:b,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths})},fail:function(c){a.fail({errCode:\"0\",errMsg:c.errMsg||\"\"})}})};\nAMapWX.prototype.getTransitRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);a.strategy&&(b.strategy=a.strategy);a.city&&(b.city=a.city);a.cityd&&(b.cityd=a.cityd);wx.request({url:\"https://restapi.amap.com/v3/direction/transit/integrated\",data:b,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(c){c&&c.data&&c.data.route&&(c=c.data.route,a.success({distance:c.distance||\"\",taxi_cost:c.taxi_cost||\n\"\",transits:c.transits}))},fail:function(c){a.fail({errCode:\"0\",errMsg:c.errMsg||\"\"})}})};\nAMapWX.prototype.getRidingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);wx.request({url:\"https://restapi.amap.com/v3/direction/riding\",data:b,method:\"GET\",header:{\"content-type\":\"application/json\"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths})},fail:function(c){a.fail({errCode:\"0\",errMsg:c.errMsg||\"\"})}})};module.exports.AMapWX=AMapWX;"
  },
  {
    "path": "js_sdk/h5-copy/h5-copy.js",
    "content": "export  function h5Copy(content) {\r\n  \r\n  if (!document.queryCommandSupported('copy')) {\r\n    // 不支持\r\n    return false\r\n  }\r\n  \r\n  let textarea = document.createElement(\"textarea\")\r\n  textarea.value = content\r\n  textarea.readOnly = \"readOnly\"\r\n  document.body.appendChild(textarea)\r\n  textarea.select() // 选择对象\r\n  textarea.setSelectionRange(0, content.length) //核心\r\n  let result = document.execCommand(\"copy\") // 执行浏览器复制命令\r\n  textarea.remove()\r\n  return result\r\n  \r\n}\r\n\r\n\r\n\r\n/**\r\n * 获取系统剪贴板内容\r\n */\r\n export function getClipboardData() {\r\n  return new Promise((success, fail) => {\r\n    // #ifndef H5\r\n    uni.getClipboardData({\r\n      success: ({ data }) => success(data),\r\n      fail\r\n    })\r\n    // #endif\r\n\r\n    // #ifdef H5\r\n    try {\r\n      navigator.clipboard.readText().then(success).catch(fail)\r\n    } catch (error) {\r\n      fail(error)\r\n    }\r\n    // #endif\r\n  })\r\n}"
  },
  {
    "path": "js_sdk/lili-pay/wx-pay.js",
    "content": "/**\n * 微信小程序支付\n * 此处针对于微信小程序开发的支付插件\n * 第一次支付成功后会跳出订阅的消息 如果用户拒绝或同意都会跳转到支付成功页面\n * 如果点击订阅 会将状态写进缓存 之后不再提醒。\n * \n * @param {sn,price}\n */\n\nimport { getWeChatMpMessage } from \"@/api/message.js\";\nimport { initiatePay } from \"@/api/trade\";\nclass LiLiWXPay {\n  constructor(...payList) {\n    this.data = payList[0];\n    console.log(payList);\n    // 调用支付\n    this.pay = () => {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n\n      let submitData = {\n        sn: this.data.sn,\n        orderType: this.data.orderType || \"TRADE\",\n        clientType: \"WECHAT_MP\",\n      };\n      const paymentMethod = \"WECHAT\";\n      const paymentClient = \"MP\";\n      // 调用支付\n      initiatePay(paymentMethod, paymentClient, submitData).then((res) => {\n        let response = res.data.result;\n        uni.hideLoading();\n        uni.requestPayment({\n          provider: \"wxpay\",\n          appid: response.appid,\n          timeStamp: response.timeStamp,\n          nonceStr: response.nonceStr,\n          package: response.package,\n          signType: response.signType,\n          paySign: response.paySign,\n          success: (e) => {\n            uni.showToast({\n              icon: \"none\",\n              title: \"支付成功!\",\n            });\n            sendMessage(payList[0].price);\n          },\n          fail: (e) => {\n            this.exception = e;\n            // 支付异常或支付失败之后跳转到订单页面\n            uni.showModal({\n              content: \"支付失败,如果您已支付，请勿反复支付\",\n              showCancel: false,\n              success: () => {\n                uni.redirectTo({\n                  url: \"/pages/order/myOrder?status=0\",\n                });\n              },\n            });\n          },\n        });\n      });\n    };\n  }\n}\n\nfunction sendMessage(price) {\n\n\n  //订阅消息\n  getWeChatMpMessage().then((res) => {\n    var message = res.data.result;\n    var templateid = message.map((item) => item.code);\n    uni.requestSubscribeMessage({\n      tmplIds: templateid,\n      success: (res) => {\n      \n      },\n      fail: (res) => {\n        console.log('fail', res)\n        uni.showToast({\n          icon: \"none\",\n          title: \"订阅消息失败\",\n        })\n      },\n      complete: (res) => {\n        console.log('complete', res)\n\n        /**\n         * 已经支付成功\n         */\n        uni.redirectTo({\n          url:\n            \"/pages/cart/payment/success?paymentMethod=WECHAT\" +\n            \"&payPrice=\" +\n            price,\n        });\n      },\n    });\n  });\n\n}\n\nexport default LiLiWXPay;\n"
  },
  {
    "path": "js_sdk/t-jwt/jwt.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nexports.weBtoa = function (string) {\n    string = String(string);\n    var bitmap, a, b, c, result = \"\", i = 0, rest = string.length % 3;\n    for (; i < string.length;) {\n        if ((a = string.charCodeAt(i++)) > 255 ||\n            (b = string.charCodeAt(i++)) > 255 ||\n            (c = string.charCodeAt(i++)) > 255)\n            throw new TypeError(\"Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.\");\n        bitmap = (a << 16) | (b << 8) | c;\n        result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) +\n            b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63);\n    }\n    return rest ? result.slice(0, rest - 3) + \"===\".substring(rest) : result;\n};\nexports.weAtob = function (string) {\n    string = String(string).replace(/[\\t\\n\\f\\r ]+/g, \"\");\n    if (!b64re.test(string))\n        throw new TypeError(\"Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.\");\n    string += \"==\".slice(2 - (string.length & 3));\n    var bitmap, result = \"\", r1, r2, i = 0;\n    for (; i < string.length;) {\n        bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 |\n            (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++)));\n        result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :\n            r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :\n                String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);\n    }\n    return result;\n};\nfunction b64DecodeUnicode(str) {\n    return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function (p) {\n        var code = p.charCodeAt(0).toString(16).toUpperCase();\n        if (code.length < 2) {\n            code = \"0\" + code;\n        }\n        return \"%\" + code;\n    }));\n}\nfunction base64_url_decode(str) {\n    var output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    switch (output.length % 4) {\n        case 0:\n            break;\n        case 2:\n            output += \"==\";\n            break;\n        case 3:\n            output += \"=\";\n            break;\n        default:\n            throw \"Illegal base64url string!\";\n    }\n    try {\n        return b64DecodeUnicode(output);\n    }\n    catch (err) {\n        return exports.weAtob(output);\n    }\n}\nfunction weappJwtDecode(token, options) {\n    if (typeof token !== \"string\") {\n        throw (\"Invalid token specified\");\n    }\n    options = options || {};\n    var pos = options.header === true ? 0 : 1;\n    try {\n        return JSON.parse(base64_url_decode(token.split(\".\")[pos]));\n    }\n    catch (e) {\n        throw (\"Invalid token specified: \" + e.message);\n    }\n}\nexports.default = weappJwtDecode;"
  },
  {
    "path": "js_sdk/u-draw-poster/draw-poster.d.ts",
    "content": "import { Canvas, DrawPosterCanvasCtx, CreateImagePathOptions, DrawPosterBuildOpts, DrawPosterUseOpts, drawPosterExtends, DrawPosterUseCtxOpts } from \"./utils/interface\";\r\ndeclare type DrawPosterInstanceType = InstanceType<typeof DrawPoster> & drawPosterExtends;\r\ndeclare class DrawPoster {\r\n    canvas: Canvas;\r\n    ctx: DrawPosterCanvasCtx;\r\n    canvasId: string;\r\n    loading: boolean;\r\n    debugging: boolean;\r\n    loadingText: string;\r\n    createText: string;\r\n    [key: string]: any;\r\n    private executeOnions;\r\n    private stopStatus;\r\n    private drawType;\r\n    /** 构建器, 构建返回当前实例, 并挂载多个方法 */\r\n    constructor(canvas: Canvas, ctx: DrawPosterCanvasCtx, canvasId: string, loading: boolean, debugging: boolean, loadingText: string, createText: string, tips: boolean);\r\n    /** 提示器, 传入消息与数据 */\r\n    private debuggingLog;\r\n    /** 传入挂载配置对象, 添加扩展方法 */\r\n    static use: (opts: DrawPosterUseOpts) => void;\r\n    /** 传入挂载配置对象, 添加绘画扩展方法 */\r\n    static useCtx: (opts: DrawPosterUseCtxOpts) => void;\r\n    /** 构建绘制海报矩形方法, 传入canvas选择器或配置对象, 返回绘制对象 */\r\n    static build: (options: string | DrawPosterBuildOpts, tips?: boolean) => Promise<DrawPosterInstanceType>;\r\n    /** 构建多个绘制海报矩形方法, 传入选择器或配置对象的数组, 返回多个绘制对象 */\r\n    static buildAll: (optionsAll: (string | DrawPosterBuildOpts)[]) => Promise<{\r\n        [key: string]: DrawPosterInstanceType;\r\n    }>;\r\n    /** 绘制器, 接收执行器函数, 添加到绘制容器中 */\r\n    draw: (execute: (ctx: DrawPosterCanvasCtx) => Promise<any> | void) => void;\r\n    /** 等待创建绘画, 成功后清空绘制器容器 */\r\n    awaitCreate: () => Promise<boolean[]>;\r\n    /** 创建canvas本地地址 @returns {string} 本地地址 */\r\n    createImagePath: (baseOptions?: CreateImagePathOptions) => Promise<string>;\r\n    /** 停止当前绘画, 调用则停止当前绘画堆栈的绘画 */\r\n    stop: () => void;\r\n}\r\nexport default DrawPoster;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/draw-poster.js",
    "content": "import uni from \"./utils/global\";\r\nimport { handleBuildOpts, extendMount } from \"./utils/utils\";\r\nimport { getCanvas2dContext } from \"./utils/wx-utils\";\r\n// 扩展挂载储存\r\nlet drawPosterExtend = {};\r\nlet drawCtxPosterExtend = {};\r\nclass DrawPoster {\r\n    /** 构建器, 构建返回当前实例, 并挂载多个方法 */\r\n    constructor(canvas, ctx, canvasId, loading, debugging, loadingText, createText, tips) {\r\n        var _a;\r\n        this.canvas = canvas;\r\n        this.ctx = ctx;\r\n \r\n        this.canvasId = canvasId;\r\n        this.loading = loading;\r\n        this.debugging = debugging;\r\n        this.loadingText = loadingText;\r\n        this.createText = createText;\r\n        this.executeOnions = [];\r\n        this.stopStatus = false;\r\n        /** 提示器, 传入消息与数据 */\r\n        this.debuggingLog = (message, data, color = \"#3489fd\") => {\r\n            if (this.debugging) {\r\n                if (data) {\r\n                    console.log(`%c${this.canvasId} -> ${message}`, `color: ${color}`, data);\r\n                }\r\n                else {\r\n                    console.log(`%c${this.canvasId} -> ${message}`, `color: ${color}`);\r\n                }\r\n            }\r\n        };\r\n        /** 绘制器, 接收执行器函数, 添加到绘制容器中 */\r\n        this.draw = (execute) => {\r\n            const length = this.executeOnions.length;\r\n            this.executeOnions.push(async () => {\r\n                var _a, _b;\r\n                try {\r\n                    this.ctx.save();\r\n                    await execute(this.ctx);\r\n                    this.ctx.restore();\r\n                    return true;\r\n                }\r\n                catch (error) {\r\n                    const isOutError = ((_b = (_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.search) === null || _b === void 0 ? void 0 : _b.call(_a, `'nodeId' of undefined`)) >= 0;\r\n                    !isOutError && console.error(`${this.canvasId} -> 绘画栈(${length})，绘制错误：`, error);\r\n                    return false;\r\n                }\r\n            });\r\n        };\r\n        /** 等待创建绘画, 成功后清空绘制器容器 */\r\n        this.awaitCreate = async () => {\r\n            this.debuggingLog('绘制海报中...');\r\n            this.loading && uni.showLoading({ title: this.loadingText });\r\n            const tips = [];\r\n            for (let i = 0; i < this.executeOnions.length; i++) {\r\n                const execute = this.executeOnions[i];\r\n                tips.push(await execute());\r\n            }\r\n            this.executeOnions = [];\r\n            this.debuggingLog('绘制状况', tips);\r\n            // 当前绘制为 type2 绘制\r\n            if (this.drawType === 'type2d') {\r\n                this.loading && uni.hideLoading();\r\n            \r\n                return tips;\r\n            }\r\n            // 当前绘制为 context 绘制\r\n            return await new Promise((resolve) => {\r\n                this.ctx.draw(true, () => {\r\n                    resolve(tips);\r\n                    this.loading && uni.hideLoading();\r\n                });\r\n            });\r\n        };\r\n        /** 创建canvas本地地址 @returns {string} 本地地址 */\r\n        this.createImagePath = async (baseOptions = {}) => {\r\n            const { canvas, canvasId, executeOnions, awaitCreate } = this;\r\n            executeOnions.length && await awaitCreate();\r\n            // 如果当前为停止状态\r\n            if (this.stopStatus) {\r\n                this.stopStatus = false;\r\n                return '---stop createImagePath---';\r\n            }\r\n            this.loading && uni.showLoading({ title: this.createText });\r\n            const options = Object.assign({}, baseOptions);\r\n            if (this.drawType === 'context')\r\n                options.canvasId = canvasId;\r\n            if (this.drawType === 'type2d')\r\n                options.canvas = canvas;\r\n\r\n                console.log(options)\r\n            return new Promise((resolve, reject) => {\r\n                options.success = (res) => {\r\n                    resolve(res.tempFilePath);\r\n                    this.loading && uni.hideLoading();\r\n                    this.debuggingLog('绘制成功 🎉', res, '#19be6b');\r\n                };\r\n                options.fail = (err) => {\r\n                    reject(err);\r\n                    this.loading && uni.hideLoading();\r\n                    this.debuggingLog('绘制失败 🌟', err, '#fa3534');\r\n                };\r\n                uni.canvasToTempFilePath(options);\r\n            });\r\n        };\r\n        /** 停止当前绘画, 调用则停止当前绘画堆栈的绘画 */\r\n        this.stop = () => {\r\n            this.executeOnions = [];\r\n            this.stopStatus = true;\r\n        };\r\n        if (!canvas || !ctx || !canvasId) {\r\n            throw new Error(\"DrawPoster Error: Use DrawPoster.build(string | ops) to build drawPoster instance objects\");\r\n        }\r\n        // 判断当前绘制类型\r\n        ctx.drawType = this.drawType = (ctx.draw) ? 'context' : 'type2d';\r\n        // 挂载全局实例, 绘画扩展\r\n        extendMount(this.ctx, drawCtxPosterExtend, (extend, target) => {\r\n            var _a;\r\n            (_a = target === null || target === void 0 ? void 0 : target.init) === null || _a === void 0 ? void 0 : _a.call(target, this.canvas, this.ctx);\r\n            return (...args) => extend(this.canvas, this.ctx, ...args);\r\n        });\r\n        extendMount(this, drawPosterExtend, (extend, target) => {\r\n            var _a;\r\n            (_a = target === null || target === void 0 ? void 0 : target.init) === null || _a === void 0 ? void 0 : _a.call(target, this);\r\n            return (...args) => extend(this, ...args);\r\n        });\r\n        // 当离开页面时, 自动调用停止绘画\r\n        const _this = this;\r\n        const pages = getCurrentPages();\r\n        const page = pages[pages.length - 1];\r\n        // 查询标识, 不存在, 在替换页面卸载回调, 避免产生死循环\r\n        if (!((_a = page === null || page === void 0 ? void 0 : page.onUnload) === null || _a === void 0 ? void 0 : _a.identification)) {\r\n            page.oldOnUnload = page.onUnload;\r\n            page.onUnload = function () {\r\n                _this === null || _this === void 0 ? void 0 : _this.stop();\r\n                page.oldOnUnload();\r\n            };\r\n            page.onUnload.identification = true;\r\n        }\r\n        tips && this.debuggingLog('构建完成', { canvas, ctx, selector: canvasId }, '#19be6b');\r\n    }\r\n}\r\n/** 传入挂载配置对象, 添加扩展方法 */\r\nDrawPoster.use = (opts) => {\r\n    if (opts.name)\r\n        drawPosterExtend[opts.name] = opts;\r\n};\r\n/** 传入挂载配置对象, 添加绘画扩展方法 */\r\nDrawPoster.useCtx = (opts) => {\r\n    if (opts.name)\r\n        drawCtxPosterExtend[opts.name] = opts;\r\n};\r\n/** 构建绘制海报矩形方法, 传入canvas选择器或配置对象, 返回绘制对象 */\r\nDrawPoster.build = async (options, tips = true) => {\r\n    var _a, _b, _c, _d, _e;\r\n    const config = handleBuildOpts(options);\r\n    // 初始化监测当前页面绘制对象\r\n    const pages = getCurrentPages();\r\n    const page = pages[pages.length - 1];\r\n    const gcanvas = DrawPoster.prototype['gcanvas'];\r\n    if (page[config.selector + '__dp']) {\r\n        return page[config.selector + '__dp'];\r\n    }\r\n    if (config.gcanvas) {\r\n        if (!gcanvas)\r\n            console.error('--- 当前未引入gcanvas扩展, 将自动切换为普通 canvas ---');\r\n        else\r\n            gcanvas.enable((_b = (_a = config.componentThis) === null || _a === void 0 ? void 0 : _a.$refs) === null || _b === void 0 ? void 0 : _b[config.selector], {\r\n                bridge: gcanvas.WeexBridge\r\n            });\r\n    }\r\n    // 获取canvas实例\r\n    const canvas = config.gcanvas && gcanvas ?\r\n        gcanvas.enable((_d = (_c = config.componentThis) === null || _c === void 0 ? void 0 : _c.$refs) === null || _d === void 0 ? void 0 : _d[config.selector], {\r\n            bridge: gcanvas.WeexBridge\r\n        }) :\r\n        await getCanvas2dContext(config.selector, config.componentThis);\r\n    const ctx = (((_e = canvas.getContext) === null || _e === void 0 ? void 0 : _e.call(canvas, \"2d\")) || uni.createCanvasContext(config.selector, config.componentThis));\r\n    const dp = new DrawPoster(canvas, ctx, config.selector, config.loading, config.debugging, config.loadingText, config.createText, tips);\r\n    // 储存当前绘制对象\r\n    page[config.selector + '__dp'] = dp;\r\n    return page[config.selector + '__dp'];\r\n};\r\n/** 构建多个绘制海报矩形方法, 传入选择器或配置对象的数组, 返回多个绘制对象 */\r\nDrawPoster.buildAll = async (optionsAll) => {\r\n    const dpsArr = await Promise.all(optionsAll.map(async (options) => {\r\n        return await DrawPoster.build(options, false);\r\n    }));\r\n    const dpsObj = {};\r\n    dpsArr.forEach(dp => dpsObj[dp.canvasId] = dp);\r\n    console.log(\"%cdraw-poster 构建完成：\", \"#E3712A\", dpsObj);\r\n    return dpsObj;\r\n};\r\nexport default DrawPoster;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/create-from-list/index.d.ts",
    "content": "import { DrawPosterUseOpts } from '../../utils/interface';\r\nexport interface CreateLayerOpts {\r\n    background?: string;\r\n    self?: boolean;\r\n    line?: boolean;\r\n    lineHeight?: number;\r\n}\r\nexport interface DrawRowOpt {\r\n    text?: string;\r\n    font?: string;\r\n    color?: string;\r\n    center?: boolean;\r\n    width?: number;\r\n}\r\ndeclare const _default: DrawPosterUseOpts;\r\n/** 绘制表单扩展方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/create-from-list/index.js",
    "content": "/** 绘制表单扩展方法 */\r\nexport default {\r\n    name: 'createLayer',\r\n    init: (dp) => {\r\n        dp.from = {\r\n            height: 0,\r\n            padding: 8,\r\n            margin: 0\r\n        };\r\n        dp.setFromOptions = (opts) => {\r\n            if (typeof opts.height !== 'undefined') {\r\n                dp.from.height = opts.height;\r\n            }\r\n            if (typeof opts.margin !== 'undefined') {\r\n                dp.from.margin = opts.margin;\r\n            }\r\n            if (typeof opts.padding !== 'undefined') {\r\n                dp.from.padding = opts.padding;\r\n            }\r\n        };\r\n    },\r\n    handle: (dp, afferOpts, rowList) => {\r\n        // 当前配置(头部偏移量, 列内边距, 表单外边距)\r\n        const height = dp.from.height;\r\n        const margin = dp.from.margin;\r\n        const padding = dp.from.padding;\r\n        // 当前层宽度\r\n        const containerWidth = dp.canvas.width - (margin * 2);\r\n        // 基本层配置\r\n        const opts = Object.assign({ background: \"#fff\", columnY: height || margin, self: true, line: true, lineHeight: 0, border: true }, afferOpts);\r\n        // 基本列配置\r\n        const baseRowOpts = {\r\n            text: \"\",\r\n            font: \"24px sans-serif\",\r\n            color: \"#333\",\r\n            center: false,\r\n            width: 0,\r\n        };\r\n        // 累计最高的列为标准定义为层高度\r\n        let maxRowHeight = 0;\r\n        // 累计固定栅格列偏移量\r\n        let columnOffsetX = margin;\r\n        // 创建行绘制任务\r\n        const drawLayerInfos = rowList.map((afferRowOpts = {}, index) => {\r\n            const rowOpts = Object.assign(Object.assign({}, baseRowOpts), afferRowOpts);\r\n            let columnX = 0; // 每列的X轴\r\n            let columnW = 0; // 每列的宽度\r\n            let fontOffsetX = 0; // 字体偏移X轴\r\n            let fontMaxWidth = 100; // 字体最大宽度\r\n            opts.lineHeight = opts.lineHeight || Number(rowOpts.font.replace(/[^0-9.]/g, \"\"));\r\n            if (opts.self) {\r\n                // 自适应栅格格子计算\r\n                columnX = containerWidth - (containerWidth / (index + 1)) + margin;\r\n                columnW = containerWidth / rowList.length;\r\n                if (columnX > 0 && columnX < containerWidth - columnW) {\r\n                    columnX = (columnW * index) + margin;\r\n                }\r\n                fontOffsetX = rowOpts.center ? columnX + (columnW / 2) : columnX + padding;\r\n                fontMaxWidth = columnW - (padding * 3);\r\n            }\r\n            if (!opts.self) {\r\n                // 固定栅格格子计算\r\n                columnW = rowOpts.width;\r\n                columnX = columnOffsetX;\r\n                fontMaxWidth = columnW - (padding * 3);\r\n                fontOffsetX = rowOpts.center ? columnOffsetX + (rowOpts.width / 2) : columnOffsetX + padding;\r\n                columnOffsetX += rowOpts.width;\r\n            }\r\n            dp.ctx.font = rowOpts.font;\r\n            const drawFontInfos = dp.ctx.fillWarpText({\r\n                text: rowOpts.text,\r\n                maxWidth: fontMaxWidth,\r\n                lineHeight: opts.lineHeight,\r\n                x: fontOffsetX,\r\n                y: opts.columnY,\r\n                layer: 10,\r\n                notFillText: true\r\n            });\r\n            // 当前行的高度\r\n            const rowHeight = (opts.lineHeight * drawFontInfos.length) + (padding * 3);\r\n            // 若该列高度大于累计高度, 将累计高度替换\r\n            if (rowHeight > maxRowHeight) {\r\n                maxRowHeight = rowHeight;\r\n            }\r\n            return {\r\n                font: rowOpts.font,\r\n                center: rowOpts.center,\r\n                color: rowOpts.color,\r\n                border: opts.border,\r\n                background: opts.background,\r\n                lineHeight: opts.lineHeight,\r\n                line: opts.line,\r\n                drawFontInfos,\r\n                columnY: opts.columnY,\r\n                columnX,\r\n                columnW,\r\n                columnH: maxRowHeight,\r\n                margin,\r\n                padding\r\n            };\r\n        });\r\n        // 将行绘制任务添加至绘制容器中\r\n        dp.draw((ctx) => drawLayerInfos.forEach((rowOpts, index) => {\r\n            ctx.font = rowOpts.font;\r\n            ctx.fillStyle = rowOpts.background;\r\n            ctx.strokeStyle = \"#333\";\r\n            ctx.textBaseline = \"middle\";\r\n            ctx.textAlign = 'left';\r\n            if (rowOpts.center) {\r\n                ctx.textAlign = \"center\";\r\n            }\r\n            ctx.fillRect(rowOpts.columnX, rowOpts.columnY, rowOpts.columnW, rowOpts.columnH);\r\n            if (rowOpts.border) {\r\n                dp.ctx.strokeRect(margin, rowOpts.columnY, dp.canvas.width - margin, maxRowHeight);\r\n            }\r\n            if (rowOpts.line && rowOpts.columnX !== margin) {\r\n                ctx.moveTo(rowOpts.columnX, rowOpts.columnY);\r\n                ctx.lineTo(rowOpts.columnX, rowOpts.columnY + rowOpts.columnH);\r\n                ctx.stroke();\r\n                ctx.beginPath();\r\n            }\r\n            ctx.fillStyle = rowOpts.color;\r\n            rowOpts.drawFontInfos.forEach(fontInfo => {\r\n                // 计算每行字体绘制y轴长度\r\n                // y(当前列置顶轴) + (rowOpts.columnH(当前列最高长度) / 2) - (((总列数-1) * 行高) / 2)\r\n                const textTotal = rowOpts.drawFontInfos.length - 1;\r\n                const textMiddleY = (textTotal * rowOpts.lineHeight) / 2;\r\n                let fontOffsetY = fontInfo.y + (rowOpts.columnH / 2);\r\n                fontOffsetY -= textMiddleY;\r\n                ctx.fillText(fontInfo.text, fontInfo.x, fontOffsetY);\r\n            });\r\n        }));\r\n        if (opts.columnY === 0 || opts.columnY === margin) {\r\n            maxRowHeight += margin;\r\n        }\r\n        // 叠加高度\r\n        dp.from.height += maxRowHeight;\r\n        return maxRowHeight;\r\n    },\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/create-gcanvas/index.d.ts",
    "content": "import { DrawPosterUseOpts } from '../../utils/interface';\r\nexport * from './gcanvas';\r\ndeclare const _default: DrawPosterUseOpts;\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/create-gcanvas/index.js",
    "content": "import { WeexBridge, enable, Image } from './gcanvas';\r\nexport * from './gcanvas';\r\nimport DrawPoster from \"../../draw-poster\";\r\nDrawPoster.prototype['gcanvas'] = {\r\n    WeexBridge,\r\n    enable,\r\n    Image\r\n};\r\nexport default {};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\nimport { ObjectFit, ObjectPosition, Size } from \"../../utils/object-sizing\";\r\nexport interface ImageFitOption {\r\n    radius?: number;\r\n    objectFit?: ObjectFit;\r\n    intrinsicSize?: Size;\r\n    specifiedSize?: Size;\r\n    intrinsicPosition?: ObjectPosition;\r\n    specifiedPosition?: [number, number];\r\n}\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.js",
    "content": "import { calculateConcreteRect } from \"../../utils/object-sizing\";\r\nimport uni from \"../../utils/global\";\r\nexport default {\r\n    name: 'drawImageFit',\r\n    handle: async (canvas, ctx, url, options) => {\r\n        var _a, _b, _c;\r\n        const [error, imageInfo] = await uni.getImageInfo({ src: url });\r\n        // 配置默认值\r\n        const style = Object.assign({ radius: 0, objectFit: 'cover', intrinsicSize: { width: (_a = imageInfo === null || imageInfo === void 0 ? void 0 : imageInfo.width) !== null && _a !== void 0 ? _a : 100, height: (_b = imageInfo === null || imageInfo === void 0 ? void 0 : imageInfo.height) !== null && _b !== void 0 ? _b : 100 }, specifiedSize: { width: 100, height: 100 }, intrinsicPosition: ['center', 'center'], specifiedPosition: [0, 0] }, options);\r\n        // 计算图片尺寸\r\n        const drawImageInfo = calculateConcreteRect(style, style.intrinsicSize, style.specifiedSize);\r\n        // 如有圆角, 则进行裁剪\r\n        if (style.radius > 0) {\r\n            ctx.save();\r\n            (_c = ctx.setFillStyle) === null || _c === void 0 ? void 0 : _c.call(ctx, 'transparent');\r\n            ctx.fillStyle = 'transparent';\r\n            ctx.fillRoundRect(style.specifiedPosition[0], style.specifiedPosition[1], style.specifiedSize.width, style.specifiedSize.height, style.radius);\r\n            ctx.clip();\r\n        }\r\n        const result = await ctx.drawImage(url, ...Object.values(drawImageInfo));\r\n        if (style.radius > 0)\r\n            ctx.restore();\r\n        return result;\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/draw-image.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\n/** 等待绘制图片原型方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/draw-image.js",
    "content": "import { downloadImgUrl } from '../../utils/wx-utils';\r\n/** 等待绘制图片原型方法 */\r\nexport default {\r\n    name: 'drawImage',\r\n    init: (canvas, ctx) => {\r\n        ctx.drawImageProto = ctx.drawImage;\r\n    },\r\n    handle: async (canvas, ctx, url, sx, sy, sh, sw, dx, dy, dh, dw) => {\r\n        // 下载路径\r\n        const path = await downloadImgUrl(url);\r\n        // 标记当前绘画存在图片绘制\r\n        let result = false;\r\n        // 基本绘制方法, 如果是 fit 方式, 则传入所有参数, 不然则只传入四个参数\r\n        const baseDrawImage = (imageResource) => {\r\n            const isFit = typeof dx === 'number' && typeof dw === 'number';\r\n            if (isFit) {\r\n                ctx.drawImageProto(imageResource, sx, sy, sh, sw, dx, dy, dh, dw);\r\n            }\r\n            else {\r\n                ctx.drawImageProto(imageResource, sx, sy, sh, sw);\r\n            }\r\n        };\r\n        // 如果是 context 绘制方式, 则直接绘制\r\n        if (ctx.drawType === 'context') {\r\n            baseDrawImage(path);\r\n            result = true;\r\n        }\r\n        // 如果是 type2d 绘制方式, 则等待图片绘制完毕\r\n        if (ctx.drawType === 'type2d') {\r\n            result = await new Promise(resolve => {\r\n                const image = canvas.createImage();\r\n                image.src = path;\r\n                image.onload = () => {\r\n                    baseDrawImage(image);\r\n                    resolve(true);\r\n                };\r\n                image.onerror = () => resolve(false);\r\n            });\r\n        }\r\n        return result;\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/draw-round-image.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\n/** 绘制圆角图片原型方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/draw-round-image.js",
    "content": "/** 绘制圆角图片原型方法 */\r\nexport default {\r\n    name: 'drawRoundImage',\r\n    handle: async (canvas, ctx, url, x, y, w, h, r = 15) => {\r\n        var _a;\r\n        ctx.save();\r\n        (_a = ctx.setFillStyle) === null || _a === void 0 ? void 0 : _a.call(ctx, 'transparent');\r\n        ctx.fillStyle = 'transparent';\r\n        ctx.fillRoundRect(x, y, w, h, r);\r\n        ctx.clip();\r\n        const result = await ctx.drawImage(url, x, y, w, h);\r\n        ctx.restore();\r\n        return result;\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\n/** 绘制填充圆角矩形方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.js",
    "content": "/** 绘制填充圆角矩形方法 */\r\nexport default {\r\n    name: 'fillRoundRect',\r\n    handle: (canvas, ctx, x, y, w, h, r) => {\r\n        ctx.roundRect(x, y, w, h, r, true);\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\n/** 绘制换行字体原型方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.js",
    "content": "/** 绘制换行字体原型方法 */\r\nexport default {\r\n    name: 'fillWarpText',\r\n    handle: (canvas, ctx, config) => {\r\n        const newConfig = config = Object.assign({ maxWidth: 100, layer: 2, lineHeight: Number(ctx.font.replace(/[^0-9.]/g, '')), x: 0, y: Number(ctx.font.replace(/[^0-9.]/g, '')) / 1.2, splitText: '', notFillText: false }, config);\r\n        const { text, splitText, maxWidth, layer, lineHeight, notFillText, x, y } = newConfig;\r\n        // 当字符串为空时, 抛出错误\r\n        if (!text) {\r\n            throw Error('warpFillText Error: text is empty string');\r\n        }\r\n        // 分割所有单个字符串\r\n        const chr = text.split(splitText);\r\n        // 存入的每行字体的容器\r\n        let row = [];\r\n        // 判断字符串\r\n        let timp = '';\r\n        if (splitText) {\r\n            row = chr;\r\n        }\r\n        else {\r\n            // 遍历所有字符串, 填充行容器\r\n            for (let i = 0; i < chr.length; i++) {\r\n                // 当超出行列时, 停止执行遍历, 节省计算时间\r\n                if (row.length > layer) {\r\n                    break;\r\n                }\r\n                if (ctx.measureText(timp).width < maxWidth) {\r\n                    // 如果超出长度, 添加进row数组\r\n                    timp += chr[i];\r\n                }\r\n                else {\r\n                    // 如超出一行长度, 则换行, 并清除容器\r\n                    i--;\r\n                    row.push(timp);\r\n                    timp = '';\r\n                }\r\n            }\r\n            // 如有剩下字体, 则在最后时添加一行\r\n            if (timp) {\r\n                row.push(timp);\r\n            }\r\n            // 如果数组长度大于指定行数\r\n            if (row.length > layer) {\r\n                row = row.slice(0, layer);\r\n                // 结束的索引\r\n                const end = layer - 1;\r\n                for (let i = 0; i < row[end].length; i++) {\r\n                    const currentWidth = ctx.measureText(`${row[end]}...`).width;\r\n                    if (currentWidth > maxWidth) {\r\n                        // 加上... 当前宽度大于最大宽度时, 去除一位字符串\r\n                        const strEnd = row[end].length - 1;\r\n                        row[end] = row[end].slice(0, strEnd);\r\n                    }\r\n                    else {\r\n                        row[end] += '...';\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        // 储存并返回绘制信息\r\n        const drawInfos = row.map((item, index) => {\r\n            const info = {\r\n                text: item,\r\n                y: y + index * lineHeight,\r\n                x: x,\r\n            };\r\n            // 默认执行绘制信息\r\n            if (!notFillText) {\r\n                ctx.fillText(info.text, info.x, info.y);\r\n            }\r\n            return info;\r\n        });\r\n        return drawInfos;\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/index.d.ts",
    "content": "export { default as drawImage } from \"./draw-image\";\r\nexport { default as roundRect } from \"./round-rect\";\r\nexport { default as fillRoundRect } from \"./fill-round-rect\";\r\nexport { default as strokeRoundRect } from \"./stroke-round-rect\";\r\nexport { default as fillWarpText } from \"./fill-warp-text\";\r\nexport { default as drawRoundImage } from \"./draw-round-image\";\r\nexport { default as drawImageFit } from \"./draw-image-fit\";\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/index.js",
    "content": "/*\r\n * @Author: Mr.Mao\r\n * @LastEditors: Mr.Mao\r\n * @Date: 2020-11-11 20:43:33\r\n * @LastEditTime: 2021-01-02 00:16:59\r\n * @Description:\r\n * @任何一个傻子都能写出让电脑能懂的代码，而只有好的程序员可以写出让人能看懂的代码\r\n */\r\nexport { default as drawImage } from \"./draw-image\";\r\nexport { default as roundRect } from \"./round-rect\";\r\nexport { default as fillRoundRect } from \"./fill-round-rect\";\r\nexport { default as strokeRoundRect } from \"./stroke-round-rect\";\r\nexport { default as fillWarpText } from \"./fill-warp-text\";\r\nexport { default as drawRoundImage } from \"./draw-round-image\";\r\nexport { default as drawImageFit } from \"./draw-image-fit\";\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/round-rect.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\n/** 绘制圆角矩形原型方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/round-rect.js",
    "content": "/** 绘制圆角矩形原型方法 */\r\nexport default {\r\n    name: 'roundRect',\r\n    handle: (canvas, ctx, x, y, w, h, r = 15, fill = false, stroke = false) => {\r\n        if (r === 0) {\r\n            if (stroke)\r\n                ctx.strokeRect(x, y, w, h);\r\n            if (fill)\r\n                ctx.fillRect(x, y, w, h);\r\n            return;\r\n        }\r\n        if (w < 2 * r) {\r\n            r = w / 2;\r\n        }\r\n        if (h < 2 * r) {\r\n            r = h / 2;\r\n        }\r\n        // 开始绘制\r\n        ctx.beginPath();\r\n        ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5);\r\n        // 移动复制\r\n        ctx.moveTo(x + r, y);\r\n        ctx.lineTo(x + w - r, y);\r\n        ctx.lineTo(x + w, y + r);\r\n        // (x,y,z,j,f) x,y圆心z半径,j起始弧度f，终止弧度\r\n        ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2);\r\n        ctx.lineTo(x + w, y + h - r);\r\n        ctx.lineTo(x + w - r, y + h);\r\n        ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5);\r\n        ctx.lineTo(x + r, y + h);\r\n        ctx.lineTo(x, y + h - r);\r\n        ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI);\r\n        ctx.lineTo(x, y + r);\r\n        ctx.lineTo(x + r, y);\r\n        if (stroke)\r\n            ctx.stroke();\r\n        if (fill)\r\n            ctx.fill();\r\n        ctx.closePath();\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.d.ts",
    "content": "import { DrawPosterUseCtxOpts } from '../../utils/interface';\r\ndeclare const _default: DrawPosterUseCtxOpts;\r\n/** 绘制填充圆角矩形方法 */\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.js",
    "content": "/** 绘制填充圆角矩形方法 */\r\nexport default {\r\n    name: 'strokeRoundRect',\r\n    handle: (canvas, ctx, x, y, w, h, r) => {\r\n        ctx.roundRect(x, y, w, h, r, false, true);\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-painter/index.d.ts",
    "content": "import { DrawPosterUseOpts } from '../../utils/interface';\r\nimport { ImageFitOption } from '../draw-function/draw-image-fit';\r\n/** 矩形基本信息 */\r\ninterface PainterItemSize {\r\n    /** 容器的宽度，固定值 */\r\n    width: number;\r\n    /** 容器的高度，固定值 */\r\n    height: number;\r\n}\r\n/** 元素位置信息 */\r\ninterface PainterItemSite {\r\n    /** 元素锚点距左边的距离; 默认: 0 */\r\n    left?: number;\r\n    /** 元素锚点距上边的距离; 默认: 0 */\r\n    top?: number;\r\n}\r\n/** 绘制图片信息 */\r\ninterface PainterImageInfo extends PainterItemSize, PainterItemSite {\r\n    /** 绘制图片元素 */\r\n    type: 'image';\r\n    /** 图片地址 */\r\n    src: string;\r\n    /** 图片自适应, 可参考 css 属性 object-fit */\r\n    objectFit?: ImageFitOption['objectFit'];\r\n    /** 图片在元素容器中显示的位置，可参考 css 属性 object-position */\r\n    position?: ImageFitOption['intrinsicPosition'];\r\n    /** 圆角尺寸; 默认: 0 */\r\n    radius?: number;\r\n}\r\n/** 绘制矩形信息 */\r\ninterface PainterRectInfo extends PainterItemSize, PainterItemSite {\r\n    /** 绘制矩形元素 */\r\n    type: \"rect\";\r\n    /** 矩形背景颜色; 默认: \"#000\" */\r\n    background?: string;\r\n    /** 圆角尺寸; 默认: 0 */\r\n    radius?: number;\r\n}\r\n/** 绘制单行文字信息 */\r\ninterface PainterTextInfo extends PainterItemSite {\r\n    /** 绘制文本元素 */\r\n    type: \"text\";\r\n    /** 文本颜色; 默认: \"#000\" */\r\n    color?: string;\r\n    /** 字体; 默认: \"serial\" */\r\n    fontFamily?: string;\r\n    /** 字号(单位rpx); 默认: 30 rpx */\r\n    fontSize?: number;\r\n    /** 字重; 默认: \"normal\" 可选项: \"bold\" */\r\n    fontWeight?: string;\r\n    /** 字型 默认: \"normal\" 可选项: \"italic\" */\r\n    fontStyle?: string;\r\n    /** 元素的宽度(单位rpx), 水平排布时影响后一个元素的位置，为 null 时根据文字实际占用的宽度计算 */\r\n    width?: number;\r\n    /** 文本内容 */\r\n    content: string;\r\n}\r\n/** 绘制多行文字信息 */\r\ninterface PainterLineFeedTextInfo extends PainterItemSite {\r\n    /** 绘制换行文本元素 */\r\n    type: \"line-feed-text\";\r\n    /** 文本颜色; 默认: \"#000\" */\r\n    color?: string;\r\n    /** 字体; 默认: \"serial\" */\r\n    fontFamily?: string;\r\n    /** 字号(单位rpx); 默认: 30 rpx */\r\n    fontSize?: number;\r\n    /** 字重; 默认: \"normal\" 可选项: \"bold\" */\r\n    fontWeight?: string;\r\n    /** 字型 默认: \"normal\" 可选项: \"italic\" */\r\n    fontStyle?: string;\r\n    /** 文本块的宽度，不能为空 */\r\n    width: number;\r\n    /** 行高; 默认取当前文字行高 */\r\n    lineHeight?: number;\r\n    /** 文本最大行数,超出即显示省略号; 默认3行 */\r\n    lineClamp?: number;\r\n    /** 文本内容 */\r\n    content: string;\r\n}\r\n/** 绘制二维码信息 */\r\ninterface PainterQrCodeInfo extends PainterItemSite {\r\n    /** 绘制换行文本元素 */\r\n    type: \"qr-code\";\r\n    /** 二维码尺寸 */\r\n    size: number;\r\n    /** 二维码内容 */\r\n    content: string;\r\n    /** 边距，二维码实际尺寸会根据所设边距值进行缩放调整（默认：5） */\r\n    margin?: number;\r\n    /** 背景色（默认：'#ffffff'）*/\r\n    backgroundColor?: string;\r\n    /** 前景色（默认：'#000000'） */\r\n    foregroundColor?: string;\r\n}\r\nexport interface PainterContainerOption extends PainterItemSize {\r\n    /** 绘制项的数组 */\r\n    contents: Array<PainterImageInfo | PainterRectInfo | PainterTextInfo | PainterLineFeedTextInfo | PainterQrCodeInfo>;\r\n}\r\ndeclare const _default: DrawPosterUseOpts;\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-painter/index.js",
    "content": "export default {\r\n    name: 'painter',\r\n    handle: (dp, option) => {\r\n        dp.canvas.width = option.width;\r\n        dp.canvas.height = option.height;\r\n        dp.draw(async (ctx) => {\r\n            for (let i = 0; i < option.contents.length; i++) {\r\n                ctx.save();\r\n                const drawInfo = option.contents[i];\r\n                const { left = 0, top = 0 } = drawInfo;\r\n                if (drawInfo.type === 'rect') {\r\n                    ctx.fillStyle = drawInfo.background || '#000000';\r\n                    ctx.fillRoundRect(left, top, drawInfo.width, drawInfo.height, drawInfo.radius || 0);\r\n                }\r\n                if (drawInfo.type === 'image') {\r\n                    await ctx.drawImageFit(drawInfo.src, {\r\n                        objectFit: drawInfo.objectFit || 'cover',\r\n                        intrinsicPosition: drawInfo.position || ['center', 'center'],\r\n                        specifiedPosition: [left, top],\r\n                        specifiedSize: {\r\n                            width: drawInfo.width,\r\n                            height: drawInfo.height\r\n                        },\r\n                        radius: drawInfo.radius\r\n                    });\r\n                }\r\n                if (drawInfo.type === 'text') {\r\n                    ctx.fillStyle = drawInfo.color || '#000000';\r\n                    ctx.font = `\\\r\n          ${drawInfo.fontStyle || 'normal'} \\\r\n          ${drawInfo.fontWeight || 'normal'} \\\r\n          ${drawInfo.fontSize || 30} \\\r\n          ${drawInfo.fontFamily || 'serial'}\\\r\n          `;\r\n                    ctx.fillText(drawInfo.content, left, top, drawInfo.width);\r\n                }\r\n                if (drawInfo.type === 'line-feed-text') {\r\n                    ctx.fillStyle = drawInfo.color || '#000000';\r\n                    ctx.font = `\\\r\n          ${drawInfo.fontStyle || 'normal'} \\\r\n          ${drawInfo.fontWeight || 'normal'} \\\r\n          ${drawInfo.fontSize || 30} \\\r\n          ${drawInfo.fontFamily || 'serial'}\\\r\n          `;\r\n                    ctx.fillWarpText({\r\n                        x: drawInfo.left,\r\n                        y: drawInfo.top,\r\n                        layer: drawInfo.lineClamp,\r\n                        lineHeight: drawInfo.lineHeight,\r\n                        maxWidth: drawInfo.width,\r\n                        text: drawInfo.content\r\n                    });\r\n                }\r\n                if (drawInfo.type === 'qr-code') {\r\n                    if (typeof ctx.drawQrCode !== 'function') {\r\n                        console.error('--- 当前未引入qr-code扩展, 将自动省略该二维码绘制 ---');\r\n                        return false;\r\n                    }\r\n                    ctx.drawQrCode({\r\n                        x: left,\r\n                        y: top,\r\n                        size: drawInfo.size,\r\n                        text: drawInfo.content,\r\n                        margin: drawInfo.margin || 5,\r\n                        backgroundColor: drawInfo.backgroundColor || '#ffffff',\r\n                        foregroundColor: drawInfo.foregroundColor || '#000000',\r\n                    });\r\n                }\r\n                ctx.restore();\r\n            }\r\n        });\r\n    }\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-qr-code/index.d.ts",
    "content": "declare const _default: {\r\n    name: string;\r\n    handle: any;\r\n    errorCorrectLevel: any;\r\n};\r\nexport default _default;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-qr-code/index.js",
    "content": "import uQRCode from \"./uQRCode\";\r\nexport default {\r\n    name: \"drawQrCode\",\r\n    handle: uQRCode.make.bind(uQRCode),\r\n    errorCorrectLevel: uQRCode.errorCorrectLevel\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.d.ts",
    "content": "/*\r\n * @Author: Mr.Mao\r\n * @LastEditors: Mr.Mao\r\n * @Date: 2021-01-02 13:30:58\r\n * @LastEditTime: 2021-01-02 13:31:27\r\n * @Description: \r\n * @任何一个傻子都能写出让电脑能懂的代码，而只有好的程序员可以写出让人能看懂的代码\r\n */\r\ndeclare const uQRCode: any\r\nexport default uQRCode"
  },
  {
    "path": "js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.js",
    "content": "/*\r\n * @Author: Mr.Mao\r\n * @LastEditors: Mr.Mao\r\n * @Date: 2021-01-02 13:30:58\r\n * @LastEditTime: 2021-01-02 13:30:58\r\n * @Description: \r\n * @任何一个傻子都能写出让电脑能懂的代码，而只有好的程序员可以写出让人能看懂的代码\r\n */\r\n//---------------------------------------------------------------------\r\n// github https://github.com/Sansnn/uQRCode\r\n//---------------------------------------------------------------------\r\n\r\nlet uQRCode = {};\r\n\r\n(function () {\r\n  //---------------------------------------------------------------------\r\n  // QRCode for JavaScript\r\n  //\r\n  // Copyright (c) 2009 Kazuhiko Arase\r\n  //\r\n  // URL: http://www.d-project.com/\r\n  //\r\n  // Licensed under the MIT license:\r\n  //   http://www.opensource.org/licenses/mit-license.php\r\n  //\r\n  // The word \"QR Code\" is registered trademark of \r\n  // DENSO WAVE INCORPORATED\r\n  //   http://www.denso-wave.com/qrcode/faqpatent-e.html\r\n  //\r\n  //---------------------------------------------------------------------\r\n\r\n  //---------------------------------------------------------------------\r\n  // QR8bitByte\r\n  //---------------------------------------------------------------------\r\n\r\n  function QR8bitByte(data) {\r\n    this.mode = QRMode.MODE_8BIT_BYTE;\r\n    this.data = data;\r\n  }\r\n\r\n  QR8bitByte.prototype = {\r\n\r\n    getLength: function (buffer) {\r\n      return this.data.length;\r\n    },\r\n\r\n    write: function (buffer) {\r\n      for (var i = 0; i < this.data.length; i++) {\r\n        // not JIS ...\r\n        buffer.put(this.data.charCodeAt(i), 8);\r\n      }\r\n    }\r\n  };\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRCode\r\n  //---------------------------------------------------------------------\r\n\r\n  function QRCode(typeNumber, errorCorrectLevel) {\r\n    this.typeNumber = typeNumber;\r\n    this.errorCorrectLevel = errorCorrectLevel;\r\n    this.modules = null;\r\n    this.moduleCount = 0;\r\n    this.dataCache = null;\r\n    this.dataList = new Array();\r\n  }\r\n\r\n  QRCode.prototype = {\r\n\r\n    addData: function (data) {\r\n      var newData = new QR8bitByte(data);\r\n      this.dataList.push(newData);\r\n      this.dataCache = null;\r\n    },\r\n\r\n    isDark: function (row, col) {\r\n      if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {\r\n        throw new Error(row + \",\" + col);\r\n      }\r\n      return this.modules[row][col];\r\n    },\r\n\r\n    getModuleCount: function () {\r\n      return this.moduleCount;\r\n    },\r\n\r\n    make: function () {\r\n      // Calculate automatically typeNumber if provided is < 1\r\n      if (this.typeNumber < 1) {\r\n        var typeNumber = 1;\r\n        for (typeNumber = 1; typeNumber < 40; typeNumber++) {\r\n          var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);\r\n\r\n          var buffer = new QRBitBuffer();\r\n          var totalDataCount = 0;\r\n          for (var i = 0; i < rsBlocks.length; i++) {\r\n            totalDataCount += rsBlocks[i].dataCount;\r\n          }\r\n\r\n          for (var i = 0; i < this.dataList.length; i++) {\r\n            var data = this.dataList[i];\r\n            buffer.put(data.mode, 4);\r\n            buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));\r\n            data.write(buffer);\r\n          }\r\n          if (buffer.getLengthInBits() <= totalDataCount * 8)\r\n            break;\r\n        }\r\n        this.typeNumber = typeNumber;\r\n      }\r\n      this.makeImpl(false, this.getBestMaskPattern());\r\n    },\r\n\r\n    makeImpl: function (test, maskPattern) {\r\n\r\n      this.moduleCount = this.typeNumber * 4 + 17;\r\n      this.modules = new Array(this.moduleCount);\r\n\r\n      for (var row = 0; row < this.moduleCount; row++) {\r\n\r\n        this.modules[row] = new Array(this.moduleCount);\r\n\r\n        for (var col = 0; col < this.moduleCount; col++) {\r\n          this.modules[row][col] = null; //(col + row) % 3;\r\n        }\r\n      }\r\n\r\n      this.setupPositionProbePattern(0, 0);\r\n      this.setupPositionProbePattern(this.moduleCount - 7, 0);\r\n      this.setupPositionProbePattern(0, this.moduleCount - 7);\r\n      this.setupPositionAdjustPattern();\r\n      this.setupTimingPattern();\r\n      this.setupTypeInfo(test, maskPattern);\r\n\r\n      if (this.typeNumber >= 7) {\r\n        this.setupTypeNumber(test);\r\n      }\r\n\r\n      if (this.dataCache == null) {\r\n        this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);\r\n      }\r\n\r\n      this.mapData(this.dataCache, maskPattern);\r\n    },\r\n\r\n    setupPositionProbePattern: function (row, col) {\r\n\r\n      for (var r = -1; r <= 7; r++) {\r\n\r\n        if (row + r <= -1 || this.moduleCount <= row + r) continue;\r\n\r\n        for (var c = -1; c <= 7; c++) {\r\n\r\n          if (col + c <= -1 || this.moduleCount <= col + c) continue;\r\n\r\n          if ((0 <= r && r <= 6 && (c == 0 || c == 6)) ||\r\n            (0 <= c && c <= 6 && (r == 0 || r == 6)) ||\r\n            (2 <= r && r <= 4 && 2 <= c && c <= 4)) {\r\n            this.modules[row + r][col + c] = true;\r\n          } else {\r\n            this.modules[row + r][col + c] = false;\r\n          }\r\n        }\r\n      }\r\n    },\r\n\r\n    getBestMaskPattern: function () {\r\n\r\n      var minLostPoint = 0;\r\n      var pattern = 0;\r\n\r\n      for (var i = 0; i < 8; i++) {\r\n\r\n        this.makeImpl(true, i);\r\n\r\n        var lostPoint = QRUtil.getLostPoint(this);\r\n\r\n        if (i == 0 || minLostPoint > lostPoint) {\r\n          minLostPoint = lostPoint;\r\n          pattern = i;\r\n        }\r\n      }\r\n\r\n      return pattern;\r\n    },\r\n\r\n    createMovieClip: function (target_mc, instance_name, depth) {\r\n\r\n      var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);\r\n      var cs = 1;\r\n\r\n      this.make();\r\n\r\n      for (var row = 0; row < this.modules.length; row++) {\r\n\r\n        var y = row * cs;\r\n\r\n        for (var col = 0; col < this.modules[row].length; col++) {\r\n\r\n          var x = col * cs;\r\n          var dark = this.modules[row][col];\r\n\r\n          if (dark) {\r\n            qr_mc.beginFill(0, 100);\r\n            qr_mc.moveTo(x, y);\r\n            qr_mc.lineTo(x + cs, y);\r\n            qr_mc.lineTo(x + cs, y + cs);\r\n            qr_mc.lineTo(x, y + cs);\r\n            qr_mc.endFill();\r\n          }\r\n        }\r\n      }\r\n\r\n      return qr_mc;\r\n    },\r\n\r\n    setupTimingPattern: function () {\r\n\r\n      for (var r = 8; r < this.moduleCount - 8; r++) {\r\n        if (this.modules[r][6] != null) {\r\n          continue;\r\n        }\r\n        this.modules[r][6] = (r % 2 == 0);\r\n      }\r\n\r\n      for (var c = 8; c < this.moduleCount - 8; c++) {\r\n        if (this.modules[6][c] != null) {\r\n          continue;\r\n        }\r\n        this.modules[6][c] = (c % 2 == 0);\r\n      }\r\n    },\r\n\r\n    setupPositionAdjustPattern: function () {\r\n\r\n      var pos = QRUtil.getPatternPosition(this.typeNumber);\r\n\r\n      for (var i = 0; i < pos.length; i++) {\r\n\r\n        for (var j = 0; j < pos.length; j++) {\r\n\r\n          var row = pos[i];\r\n          var col = pos[j];\r\n\r\n          if (this.modules[row][col] != null) {\r\n            continue;\r\n          }\r\n\r\n          for (var r = -2; r <= 2; r++) {\r\n\r\n            for (var c = -2; c <= 2; c++) {\r\n\r\n              if (r == -2 || r == 2 || c == -2 || c == 2 ||\r\n                (r == 0 && c == 0)) {\r\n                this.modules[row + r][col + c] = true;\r\n              } else {\r\n                this.modules[row + r][col + c] = false;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    },\r\n\r\n    setupTypeNumber: function (test) {\r\n\r\n      var bits = QRUtil.getBCHTypeNumber(this.typeNumber);\r\n\r\n      for (var i = 0; i < 18; i++) {\r\n        var mod = (!test && ((bits >> i) & 1) == 1);\r\n        this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;\r\n      }\r\n\r\n      for (var i = 0; i < 18; i++) {\r\n        var mod = (!test && ((bits >> i) & 1) == 1);\r\n        this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;\r\n      }\r\n    },\r\n\r\n    setupTypeInfo: function (test, maskPattern) {\r\n\r\n      var data = (this.errorCorrectLevel << 3) | maskPattern;\r\n      var bits = QRUtil.getBCHTypeInfo(data);\r\n\r\n      // vertical\t\t\r\n      for (var i = 0; i < 15; i++) {\r\n\r\n        var mod = (!test && ((bits >> i) & 1) == 1);\r\n\r\n        if (i < 6) {\r\n          this.modules[i][8] = mod;\r\n        } else if (i < 8) {\r\n          this.modules[i + 1][8] = mod;\r\n        } else {\r\n          this.modules[this.moduleCount - 15 + i][8] = mod;\r\n        }\r\n      }\r\n\r\n      // horizontal\r\n      for (var i = 0; i < 15; i++) {\r\n\r\n        var mod = (!test && ((bits >> i) & 1) == 1);\r\n\r\n        if (i < 8) {\r\n          this.modules[8][this.moduleCount - i - 1] = mod;\r\n        } else if (i < 9) {\r\n          this.modules[8][15 - i - 1 + 1] = mod;\r\n        } else {\r\n          this.modules[8][15 - i - 1] = mod;\r\n        }\r\n      }\r\n\r\n      // fixed module\r\n      this.modules[this.moduleCount - 8][8] = (!test);\r\n\r\n    },\r\n\r\n    mapData: function (data, maskPattern) {\r\n\r\n      var inc = -1;\r\n      var row = this.moduleCount - 1;\r\n      var bitIndex = 7;\r\n      var byteIndex = 0;\r\n\r\n      for (var col = this.moduleCount - 1; col > 0; col -= 2) {\r\n\r\n        if (col == 6) col--;\r\n\r\n        while (true) {\r\n\r\n          for (var c = 0; c < 2; c++) {\r\n\r\n            if (this.modules[row][col - c] == null) {\r\n\r\n              var dark = false;\r\n\r\n              if (byteIndex < data.length) {\r\n                dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);\r\n              }\r\n\r\n              var mask = QRUtil.getMask(maskPattern, row, col - c);\r\n\r\n              if (mask) {\r\n                dark = !dark;\r\n              }\r\n\r\n              this.modules[row][col - c] = dark;\r\n              bitIndex--;\r\n\r\n              if (bitIndex == -1) {\r\n                byteIndex++;\r\n                bitIndex = 7;\r\n              }\r\n            }\r\n          }\r\n\r\n          row += inc;\r\n\r\n          if (row < 0 || this.moduleCount <= row) {\r\n            row -= inc;\r\n            inc = -inc;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n    }\r\n\r\n  };\r\n\r\n  QRCode.PAD0 = 0xEC;\r\n  QRCode.PAD1 = 0x11;\r\n\r\n  QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) {\r\n\r\n    var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);\r\n\r\n    var buffer = new QRBitBuffer();\r\n\r\n    for (var i = 0; i < dataList.length; i++) {\r\n      var data = dataList[i];\r\n      buffer.put(data.mode, 4);\r\n      buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));\r\n      data.write(buffer);\r\n    }\r\n\r\n    // calc num max data.\r\n    var totalDataCount = 0;\r\n    for (var i = 0; i < rsBlocks.length; i++) {\r\n      totalDataCount += rsBlocks[i].dataCount;\r\n    }\r\n\r\n    if (buffer.getLengthInBits() > totalDataCount * 8) {\r\n      throw new Error(\"code length overflow. (\" +\r\n        buffer.getLengthInBits() +\r\n        \">\" +\r\n        totalDataCount * 8 +\r\n        \")\");\r\n    }\r\n\r\n    // end code\r\n    if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {\r\n      buffer.put(0, 4);\r\n    }\r\n\r\n    // padding\r\n    while (buffer.getLengthInBits() % 8 != 0) {\r\n      buffer.putBit(false);\r\n    }\r\n\r\n    // padding\r\n    while (true) {\r\n\r\n      if (buffer.getLengthInBits() >= totalDataCount * 8) {\r\n        break;\r\n      }\r\n      buffer.put(QRCode.PAD0, 8);\r\n\r\n      if (buffer.getLengthInBits() >= totalDataCount * 8) {\r\n        break;\r\n      }\r\n      buffer.put(QRCode.PAD1, 8);\r\n    }\r\n\r\n    return QRCode.createBytes(buffer, rsBlocks);\r\n  }\r\n\r\n  QRCode.createBytes = function (buffer, rsBlocks) {\r\n\r\n    var offset = 0;\r\n\r\n    var maxDcCount = 0;\r\n    var maxEcCount = 0;\r\n\r\n    var dcdata = new Array(rsBlocks.length);\r\n    var ecdata = new Array(rsBlocks.length);\r\n\r\n    for (var r = 0; r < rsBlocks.length; r++) {\r\n\r\n      var dcCount = rsBlocks[r].dataCount;\r\n      var ecCount = rsBlocks[r].totalCount - dcCount;\r\n\r\n      maxDcCount = Math.max(maxDcCount, dcCount);\r\n      maxEcCount = Math.max(maxEcCount, ecCount);\r\n\r\n      dcdata[r] = new Array(dcCount);\r\n\r\n      for (var i = 0; i < dcdata[r].length; i++) {\r\n        dcdata[r][i] = 0xff & buffer.buffer[i + offset];\r\n      }\r\n      offset += dcCount;\r\n\r\n      var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);\r\n      var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);\r\n\r\n      var modPoly = rawPoly.mod(rsPoly);\r\n      ecdata[r] = new Array(rsPoly.getLength() - 1);\r\n      for (var i = 0; i < ecdata[r].length; i++) {\r\n        var modIndex = i + modPoly.getLength() - ecdata[r].length;\r\n        ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;\r\n      }\r\n\r\n    }\r\n\r\n    var totalCodeCount = 0;\r\n    for (var i = 0; i < rsBlocks.length; i++) {\r\n      totalCodeCount += rsBlocks[i].totalCount;\r\n    }\r\n\r\n    var data = new Array(totalCodeCount);\r\n    var index = 0;\r\n\r\n    for (var i = 0; i < maxDcCount; i++) {\r\n      for (var r = 0; r < rsBlocks.length; r++) {\r\n        if (i < dcdata[r].length) {\r\n          data[index++] = dcdata[r][i];\r\n        }\r\n      }\r\n    }\r\n\r\n    for (var i = 0; i < maxEcCount; i++) {\r\n      for (var r = 0; r < rsBlocks.length; r++) {\r\n        if (i < ecdata[r].length) {\r\n          data[index++] = ecdata[r][i];\r\n        }\r\n      }\r\n    }\r\n\r\n    return data;\r\n\r\n  }\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRMode\r\n  //---------------------------------------------------------------------\r\n\r\n  var QRMode = {\r\n    MODE_NUMBER: 1 << 0,\r\n    MODE_ALPHA_NUM: 1 << 1,\r\n    MODE_8BIT_BYTE: 1 << 2,\r\n    MODE_KANJI: 1 << 3\r\n  };\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRErrorCorrectLevel\r\n  //---------------------------------------------------------------------\r\n\r\n  var QRErrorCorrectLevel = {\r\n    L: 1,\r\n    M: 0,\r\n    Q: 3,\r\n    H: 2\r\n  };\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRMaskPattern\r\n  //---------------------------------------------------------------------\r\n\r\n  var QRMaskPattern = {\r\n    PATTERN000: 0,\r\n    PATTERN001: 1,\r\n    PATTERN010: 2,\r\n    PATTERN011: 3,\r\n    PATTERN100: 4,\r\n    PATTERN101: 5,\r\n    PATTERN110: 6,\r\n    PATTERN111: 7\r\n  };\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRUtil\r\n  //---------------------------------------------------------------------\r\n\r\n  var QRUtil = {\r\n\r\n    PATTERN_POSITION_TABLE: [\r\n      [],\r\n      [6, 18],\r\n      [6, 22],\r\n      [6, 26],\r\n      [6, 30],\r\n      [6, 34],\r\n      [6, 22, 38],\r\n      [6, 24, 42],\r\n      [6, 26, 46],\r\n      [6, 28, 50],\r\n      [6, 30, 54],\r\n      [6, 32, 58],\r\n      [6, 34, 62],\r\n      [6, 26, 46, 66],\r\n      [6, 26, 48, 70],\r\n      [6, 26, 50, 74],\r\n      [6, 30, 54, 78],\r\n      [6, 30, 56, 82],\r\n      [6, 30, 58, 86],\r\n      [6, 34, 62, 90],\r\n      [6, 28, 50, 72, 94],\r\n      [6, 26, 50, 74, 98],\r\n      [6, 30, 54, 78, 102],\r\n      [6, 28, 54, 80, 106],\r\n      [6, 32, 58, 84, 110],\r\n      [6, 30, 58, 86, 114],\r\n      [6, 34, 62, 90, 118],\r\n      [6, 26, 50, 74, 98, 122],\r\n      [6, 30, 54, 78, 102, 126],\r\n      [6, 26, 52, 78, 104, 130],\r\n      [6, 30, 56, 82, 108, 134],\r\n      [6, 34, 60, 86, 112, 138],\r\n      [6, 30, 58, 86, 114, 142],\r\n      [6, 34, 62, 90, 118, 146],\r\n      [6, 30, 54, 78, 102, 126, 150],\r\n      [6, 24, 50, 76, 102, 128, 154],\r\n      [6, 28, 54, 80, 106, 132, 158],\r\n      [6, 32, 58, 84, 110, 136, 162],\r\n      [6, 26, 54, 82, 110, 138, 166],\r\n      [6, 30, 58, 86, 114, 142, 170]\r\n    ],\r\n\r\n    G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),\r\n    G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),\r\n    G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),\r\n\r\n    getBCHTypeInfo: function (data) {\r\n      var d = data << 10;\r\n      while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {\r\n        d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));\r\n      }\r\n      return ((data << 10) | d) ^ QRUtil.G15_MASK;\r\n    },\r\n\r\n    getBCHTypeNumber: function (data) {\r\n      var d = data << 12;\r\n      while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {\r\n        d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));\r\n      }\r\n      return (data << 12) | d;\r\n    },\r\n\r\n    getBCHDigit: function (data) {\r\n\r\n      var digit = 0;\r\n\r\n      while (data != 0) {\r\n        digit++;\r\n        data >>>= 1;\r\n      }\r\n\r\n      return digit;\r\n    },\r\n\r\n    getPatternPosition: function (typeNumber) {\r\n      return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];\r\n    },\r\n\r\n    getMask: function (maskPattern, i, j) {\r\n\r\n      switch (maskPattern) {\r\n\r\n        case QRMaskPattern.PATTERN000:\r\n          return (i + j) % 2 == 0;\r\n        case QRMaskPattern.PATTERN001:\r\n          return i % 2 == 0;\r\n        case QRMaskPattern.PATTERN010:\r\n          return j % 3 == 0;\r\n        case QRMaskPattern.PATTERN011:\r\n          return (i + j) % 3 == 0;\r\n        case QRMaskPattern.PATTERN100:\r\n          return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;\r\n        case QRMaskPattern.PATTERN101:\r\n          return (i * j) % 2 + (i * j) % 3 == 0;\r\n        case QRMaskPattern.PATTERN110:\r\n          return ((i * j) % 2 + (i * j) % 3) % 2 == 0;\r\n        case QRMaskPattern.PATTERN111:\r\n          return ((i * j) % 3 + (i + j) % 2) % 2 == 0;\r\n\r\n        default:\r\n          throw new Error(\"bad maskPattern:\" + maskPattern);\r\n      }\r\n    },\r\n\r\n    getErrorCorrectPolynomial: function (errorCorrectLength) {\r\n\r\n      var a = new QRPolynomial([1], 0);\r\n\r\n      for (var i = 0; i < errorCorrectLength; i++) {\r\n        a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));\r\n      }\r\n\r\n      return a;\r\n    },\r\n\r\n    getLengthInBits: function (mode, type) {\r\n\r\n      if (1 <= type && type < 10) {\r\n\r\n        // 1 - 9\r\n\r\n        switch (mode) {\r\n          case QRMode.MODE_NUMBER:\r\n            return 10;\r\n          case QRMode.MODE_ALPHA_NUM:\r\n            return 9;\r\n          case QRMode.MODE_8BIT_BYTE:\r\n            return 8;\r\n          case QRMode.MODE_KANJI:\r\n            return 8;\r\n          default:\r\n            throw new Error(\"mode:\" + mode);\r\n        }\r\n\r\n      } else if (type < 27) {\r\n\r\n        // 10 - 26\r\n\r\n        switch (mode) {\r\n          case QRMode.MODE_NUMBER:\r\n            return 12;\r\n          case QRMode.MODE_ALPHA_NUM:\r\n            return 11;\r\n          case QRMode.MODE_8BIT_BYTE:\r\n            return 16;\r\n          case QRMode.MODE_KANJI:\r\n            return 10;\r\n          default:\r\n            throw new Error(\"mode:\" + mode);\r\n        }\r\n\r\n      } else if (type < 41) {\r\n\r\n        // 27 - 40\r\n\r\n        switch (mode) {\r\n          case QRMode.MODE_NUMBER:\r\n            return 14;\r\n          case QRMode.MODE_ALPHA_NUM:\r\n            return 13;\r\n          case QRMode.MODE_8BIT_BYTE:\r\n            return 16;\r\n          case QRMode.MODE_KANJI:\r\n            return 12;\r\n          default:\r\n            throw new Error(\"mode:\" + mode);\r\n        }\r\n\r\n      } else {\r\n        throw new Error(\"type:\" + type);\r\n      }\r\n    },\r\n\r\n    getLostPoint: function (qrCode) {\r\n\r\n      var moduleCount = qrCode.getModuleCount();\r\n\r\n      var lostPoint = 0;\r\n\r\n      // LEVEL1\r\n\r\n      for (var row = 0; row < moduleCount; row++) {\r\n\r\n        for (var col = 0; col < moduleCount; col++) {\r\n\r\n          var sameCount = 0;\r\n          var dark = qrCode.isDark(row, col);\r\n\r\n          for (var r = -1; r <= 1; r++) {\r\n\r\n            if (row + r < 0 || moduleCount <= row + r) {\r\n              continue;\r\n            }\r\n\r\n            for (var c = -1; c <= 1; c++) {\r\n\r\n              if (col + c < 0 || moduleCount <= col + c) {\r\n                continue;\r\n              }\r\n\r\n              if (r == 0 && c == 0) {\r\n                continue;\r\n              }\r\n\r\n              if (dark == qrCode.isDark(row + r, col + c)) {\r\n                sameCount++;\r\n              }\r\n            }\r\n          }\r\n\r\n          if (sameCount > 5) {\r\n            lostPoint += (3 + sameCount - 5);\r\n          }\r\n        }\r\n      }\r\n\r\n      // LEVEL2\r\n\r\n      for (var row = 0; row < moduleCount - 1; row++) {\r\n        for (var col = 0; col < moduleCount - 1; col++) {\r\n          var count = 0;\r\n          if (qrCode.isDark(row, col)) count++;\r\n          if (qrCode.isDark(row + 1, col)) count++;\r\n          if (qrCode.isDark(row, col + 1)) count++;\r\n          if (qrCode.isDark(row + 1, col + 1)) count++;\r\n          if (count == 0 || count == 4) {\r\n            lostPoint += 3;\r\n          }\r\n        }\r\n      }\r\n\r\n      // LEVEL3\r\n\r\n      for (var row = 0; row < moduleCount; row++) {\r\n        for (var col = 0; col < moduleCount - 6; col++) {\r\n          if (qrCode.isDark(row, col) &&\r\n            !qrCode.isDark(row, col + 1) &&\r\n            qrCode.isDark(row, col + 2) &&\r\n            qrCode.isDark(row, col + 3) &&\r\n            qrCode.isDark(row, col + 4) &&\r\n            !qrCode.isDark(row, col + 5) &&\r\n            qrCode.isDark(row, col + 6)) {\r\n            lostPoint += 40;\r\n          }\r\n        }\r\n      }\r\n\r\n      for (var col = 0; col < moduleCount; col++) {\r\n        for (var row = 0; row < moduleCount - 6; row++) {\r\n          if (qrCode.isDark(row, col) &&\r\n            !qrCode.isDark(row + 1, col) &&\r\n            qrCode.isDark(row + 2, col) &&\r\n            qrCode.isDark(row + 3, col) &&\r\n            qrCode.isDark(row + 4, col) &&\r\n            !qrCode.isDark(row + 5, col) &&\r\n            qrCode.isDark(row + 6, col)) {\r\n            lostPoint += 40;\r\n          }\r\n        }\r\n      }\r\n\r\n      // LEVEL4\r\n\r\n      var darkCount = 0;\r\n\r\n      for (var col = 0; col < moduleCount; col++) {\r\n        for (var row = 0; row < moduleCount; row++) {\r\n          if (qrCode.isDark(row, col)) {\r\n            darkCount++;\r\n          }\r\n        }\r\n      }\r\n\r\n      var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;\r\n      lostPoint += ratio * 10;\r\n\r\n      return lostPoint;\r\n    }\r\n\r\n  };\r\n\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRMath\r\n  //---------------------------------------------------------------------\r\n\r\n  var QRMath = {\r\n\r\n    glog: function (n) {\r\n\r\n      if (n < 1) {\r\n        throw new Error(\"glog(\" + n + \")\");\r\n      }\r\n\r\n      return QRMath.LOG_TABLE[n];\r\n    },\r\n\r\n    gexp: function (n) {\r\n\r\n      while (n < 0) {\r\n        n += 255;\r\n      }\r\n\r\n      while (n >= 256) {\r\n        n -= 255;\r\n      }\r\n\r\n      return QRMath.EXP_TABLE[n];\r\n    },\r\n\r\n    EXP_TABLE: new Array(256),\r\n\r\n    LOG_TABLE: new Array(256)\r\n\r\n  };\r\n\r\n  for (var i = 0; i < 8; i++) {\r\n    QRMath.EXP_TABLE[i] = 1 << i;\r\n  }\r\n  for (var i = 8; i < 256; i++) {\r\n    QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^\r\n      QRMath.EXP_TABLE[i - 5] ^\r\n      QRMath.EXP_TABLE[i - 6] ^\r\n      QRMath.EXP_TABLE[i - 8];\r\n  }\r\n  for (var i = 0; i < 255; i++) {\r\n    QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;\r\n  }\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRPolynomial\r\n  //---------------------------------------------------------------------\r\n\r\n  function QRPolynomial(num, shift) {\r\n\r\n    if (num.length == undefined) {\r\n      throw new Error(num.length + \"/\" + shift);\r\n    }\r\n\r\n    var offset = 0;\r\n\r\n    while (offset < num.length && num[offset] == 0) {\r\n      offset++;\r\n    }\r\n\r\n    this.num = new Array(num.length - offset + shift);\r\n    for (var i = 0; i < num.length - offset; i++) {\r\n      this.num[i] = num[i + offset];\r\n    }\r\n  }\r\n\r\n  QRPolynomial.prototype = {\r\n\r\n    get: function (index) {\r\n      return this.num[index];\r\n    },\r\n\r\n    getLength: function () {\r\n      return this.num.length;\r\n    },\r\n\r\n    multiply: function (e) {\r\n\r\n      var num = new Array(this.getLength() + e.getLength() - 1);\r\n\r\n      for (var i = 0; i < this.getLength(); i++) {\r\n        for (var j = 0; j < e.getLength(); j++) {\r\n          num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));\r\n        }\r\n      }\r\n\r\n      return new QRPolynomial(num, 0);\r\n    },\r\n\r\n    mod: function (e) {\r\n\r\n      if (this.getLength() - e.getLength() < 0) {\r\n        return this;\r\n      }\r\n\r\n      var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));\r\n\r\n      var num = new Array(this.getLength());\r\n\r\n      for (var i = 0; i < this.getLength(); i++) {\r\n        num[i] = this.get(i);\r\n      }\r\n\r\n      for (var i = 0; i < e.getLength(); i++) {\r\n        num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);\r\n      }\r\n\r\n      // recursive call\r\n      return new QRPolynomial(num, 0).mod(e);\r\n    }\r\n  };\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRRSBlock\r\n  //---------------------------------------------------------------------\r\n\r\n  function QRRSBlock(totalCount, dataCount) {\r\n    this.totalCount = totalCount;\r\n    this.dataCount = dataCount;\r\n  }\r\n\r\n  QRRSBlock.RS_BLOCK_TABLE = [\r\n\r\n    // L\r\n    // M\r\n    // Q\r\n    // H\r\n\r\n    // 1\r\n    [1, 26, 19],\r\n    [1, 26, 16],\r\n    [1, 26, 13],\r\n    [1, 26, 9],\r\n\r\n    // 2\r\n    [1, 44, 34],\r\n    [1, 44, 28],\r\n    [1, 44, 22],\r\n    [1, 44, 16],\r\n\r\n    // 3\r\n    [1, 70, 55],\r\n    [1, 70, 44],\r\n    [2, 35, 17],\r\n    [2, 35, 13],\r\n\r\n    // 4\t\t\r\n    [1, 100, 80],\r\n    [2, 50, 32],\r\n    [2, 50, 24],\r\n    [4, 25, 9],\r\n\r\n    // 5\r\n    [1, 134, 108],\r\n    [2, 67, 43],\r\n    [2, 33, 15, 2, 34, 16],\r\n    [2, 33, 11, 2, 34, 12],\r\n\r\n    // 6\r\n    [2, 86, 68],\r\n    [4, 43, 27],\r\n    [4, 43, 19],\r\n    [4, 43, 15],\r\n\r\n    // 7\t\t\r\n    [2, 98, 78],\r\n    [4, 49, 31],\r\n    [2, 32, 14, 4, 33, 15],\r\n    [4, 39, 13, 1, 40, 14],\r\n\r\n    // 8\r\n    [2, 121, 97],\r\n    [2, 60, 38, 2, 61, 39],\r\n    [4, 40, 18, 2, 41, 19],\r\n    [4, 40, 14, 2, 41, 15],\r\n\r\n    // 9\r\n    [2, 146, 116],\r\n    [3, 58, 36, 2, 59, 37],\r\n    [4, 36, 16, 4, 37, 17],\r\n    [4, 36, 12, 4, 37, 13],\r\n\r\n    // 10\t\t\r\n    [2, 86, 68, 2, 87, 69],\r\n    [4, 69, 43, 1, 70, 44],\r\n    [6, 43, 19, 2, 44, 20],\r\n    [6, 43, 15, 2, 44, 16],\r\n\r\n    // 11\r\n    [4, 101, 81],\r\n    [1, 80, 50, 4, 81, 51],\r\n    [4, 50, 22, 4, 51, 23],\r\n    [3, 36, 12, 8, 37, 13],\r\n\r\n    // 12\r\n    [2, 116, 92, 2, 117, 93],\r\n    [6, 58, 36, 2, 59, 37],\r\n    [4, 46, 20, 6, 47, 21],\r\n    [7, 42, 14, 4, 43, 15],\r\n\r\n    // 13\r\n    [4, 133, 107],\r\n    [8, 59, 37, 1, 60, 38],\r\n    [8, 44, 20, 4, 45, 21],\r\n    [12, 33, 11, 4, 34, 12],\r\n\r\n    // 14\r\n    [3, 145, 115, 1, 146, 116],\r\n    [4, 64, 40, 5, 65, 41],\r\n    [11, 36, 16, 5, 37, 17],\r\n    [11, 36, 12, 5, 37, 13],\r\n\r\n    // 15\r\n    [5, 109, 87, 1, 110, 88],\r\n    [5, 65, 41, 5, 66, 42],\r\n    [5, 54, 24, 7, 55, 25],\r\n    [11, 36, 12],\r\n\r\n    // 16\r\n    [5, 122, 98, 1, 123, 99],\r\n    [7, 73, 45, 3, 74, 46],\r\n    [15, 43, 19, 2, 44, 20],\r\n    [3, 45, 15, 13, 46, 16],\r\n\r\n    // 17\r\n    [1, 135, 107, 5, 136, 108],\r\n    [10, 74, 46, 1, 75, 47],\r\n    [1, 50, 22, 15, 51, 23],\r\n    [2, 42, 14, 17, 43, 15],\r\n\r\n    // 18\r\n    [5, 150, 120, 1, 151, 121],\r\n    [9, 69, 43, 4, 70, 44],\r\n    [17, 50, 22, 1, 51, 23],\r\n    [2, 42, 14, 19, 43, 15],\r\n\r\n    // 19\r\n    [3, 141, 113, 4, 142, 114],\r\n    [3, 70, 44, 11, 71, 45],\r\n    [17, 47, 21, 4, 48, 22],\r\n    [9, 39, 13, 16, 40, 14],\r\n\r\n    // 20\r\n    [3, 135, 107, 5, 136, 108],\r\n    [3, 67, 41, 13, 68, 42],\r\n    [15, 54, 24, 5, 55, 25],\r\n    [15, 43, 15, 10, 44, 16],\r\n\r\n    // 21\r\n    [4, 144, 116, 4, 145, 117],\r\n    [17, 68, 42],\r\n    [17, 50, 22, 6, 51, 23],\r\n    [19, 46, 16, 6, 47, 17],\r\n\r\n    // 22\r\n    [2, 139, 111, 7, 140, 112],\r\n    [17, 74, 46],\r\n    [7, 54, 24, 16, 55, 25],\r\n    [34, 37, 13],\r\n\r\n    // 23\r\n    [4, 151, 121, 5, 152, 122],\r\n    [4, 75, 47, 14, 76, 48],\r\n    [11, 54, 24, 14, 55, 25],\r\n    [16, 45, 15, 14, 46, 16],\r\n\r\n    // 24\r\n    [6, 147, 117, 4, 148, 118],\r\n    [6, 73, 45, 14, 74, 46],\r\n    [11, 54, 24, 16, 55, 25],\r\n    [30, 46, 16, 2, 47, 17],\r\n\r\n    // 25\r\n    [8, 132, 106, 4, 133, 107],\r\n    [8, 75, 47, 13, 76, 48],\r\n    [7, 54, 24, 22, 55, 25],\r\n    [22, 45, 15, 13, 46, 16],\r\n\r\n    // 26\r\n    [10, 142, 114, 2, 143, 115],\r\n    [19, 74, 46, 4, 75, 47],\r\n    [28, 50, 22, 6, 51, 23],\r\n    [33, 46, 16, 4, 47, 17],\r\n\r\n    // 27\r\n    [8, 152, 122, 4, 153, 123],\r\n    [22, 73, 45, 3, 74, 46],\r\n    [8, 53, 23, 26, 54, 24],\r\n    [12, 45, 15, 28, 46, 16],\r\n\r\n    // 28\r\n    [3, 147, 117, 10, 148, 118],\r\n    [3, 73, 45, 23, 74, 46],\r\n    [4, 54, 24, 31, 55, 25],\r\n    [11, 45, 15, 31, 46, 16],\r\n\r\n    // 29\r\n    [7, 146, 116, 7, 147, 117],\r\n    [21, 73, 45, 7, 74, 46],\r\n    [1, 53, 23, 37, 54, 24],\r\n    [19, 45, 15, 26, 46, 16],\r\n\r\n    // 30\r\n    [5, 145, 115, 10, 146, 116],\r\n    [19, 75, 47, 10, 76, 48],\r\n    [15, 54, 24, 25, 55, 25],\r\n    [23, 45, 15, 25, 46, 16],\r\n\r\n    // 31\r\n    [13, 145, 115, 3, 146, 116],\r\n    [2, 74, 46, 29, 75, 47],\r\n    [42, 54, 24, 1, 55, 25],\r\n    [23, 45, 15, 28, 46, 16],\r\n\r\n    // 32\r\n    [17, 145, 115],\r\n    [10, 74, 46, 23, 75, 47],\r\n    [10, 54, 24, 35, 55, 25],\r\n    [19, 45, 15, 35, 46, 16],\r\n\r\n    // 33\r\n    [17, 145, 115, 1, 146, 116],\r\n    [14, 74, 46, 21, 75, 47],\r\n    [29, 54, 24, 19, 55, 25],\r\n    [11, 45, 15, 46, 46, 16],\r\n\r\n    // 34\r\n    [13, 145, 115, 6, 146, 116],\r\n    [14, 74, 46, 23, 75, 47],\r\n    [44, 54, 24, 7, 55, 25],\r\n    [59, 46, 16, 1, 47, 17],\r\n\r\n    // 35\r\n    [12, 151, 121, 7, 152, 122],\r\n    [12, 75, 47, 26, 76, 48],\r\n    [39, 54, 24, 14, 55, 25],\r\n    [22, 45, 15, 41, 46, 16],\r\n\r\n    // 36\r\n    [6, 151, 121, 14, 152, 122],\r\n    [6, 75, 47, 34, 76, 48],\r\n    [46, 54, 24, 10, 55, 25],\r\n    [2, 45, 15, 64, 46, 16],\r\n\r\n    // 37\r\n    [17, 152, 122, 4, 153, 123],\r\n    [29, 74, 46, 14, 75, 47],\r\n    [49, 54, 24, 10, 55, 25],\r\n    [24, 45, 15, 46, 46, 16],\r\n\r\n    // 38\r\n    [4, 152, 122, 18, 153, 123],\r\n    [13, 74, 46, 32, 75, 47],\r\n    [48, 54, 24, 14, 55, 25],\r\n    [42, 45, 15, 32, 46, 16],\r\n\r\n    // 39\r\n    [20, 147, 117, 4, 148, 118],\r\n    [40, 75, 47, 7, 76, 48],\r\n    [43, 54, 24, 22, 55, 25],\r\n    [10, 45, 15, 67, 46, 16],\r\n\r\n    // 40\r\n    [19, 148, 118, 6, 149, 119],\r\n    [18, 75, 47, 31, 76, 48],\r\n    [34, 54, 24, 34, 55, 25],\r\n    [20, 45, 15, 61, 46, 16]\r\n  ];\r\n\r\n  QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {\r\n\r\n    var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);\r\n\r\n    if (rsBlock == undefined) {\r\n      throw new Error(\"bad rs block @ typeNumber:\" + typeNumber + \"/errorCorrectLevel:\" + errorCorrectLevel);\r\n    }\r\n\r\n    var length = rsBlock.length / 3;\r\n\r\n    var list = new Array();\r\n\r\n    for (var i = 0; i < length; i++) {\r\n\r\n      var count = rsBlock[i * 3 + 0];\r\n      var totalCount = rsBlock[i * 3 + 1];\r\n      var dataCount = rsBlock[i * 3 + 2];\r\n\r\n      for (var j = 0; j < count; j++) {\r\n        list.push(new QRRSBlock(totalCount, dataCount));\r\n      }\r\n    }\r\n\r\n    return list;\r\n  }\r\n\r\n  QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {\r\n\r\n    switch (errorCorrectLevel) {\r\n      case QRErrorCorrectLevel.L:\r\n        return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];\r\n      case QRErrorCorrectLevel.M:\r\n        return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];\r\n      case QRErrorCorrectLevel.Q:\r\n        return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];\r\n      case QRErrorCorrectLevel.H:\r\n        return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];\r\n      default:\r\n        return undefined;\r\n    }\r\n  }\r\n\r\n  //---------------------------------------------------------------------\r\n  // QRBitBuffer\r\n  //---------------------------------------------------------------------\r\n\r\n  function QRBitBuffer() {\r\n    this.buffer = new Array();\r\n    this.length = 0;\r\n  }\r\n\r\n  QRBitBuffer.prototype = {\r\n\r\n    get: function (index) {\r\n      var bufIndex = Math.floor(index / 8);\r\n      return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1;\r\n    },\r\n\r\n    put: function (num, length) {\r\n      for (var i = 0; i < length; i++) {\r\n        this.putBit(((num >>> (length - i - 1)) & 1) == 1);\r\n      }\r\n    },\r\n\r\n    getLengthInBits: function () {\r\n      return this.length;\r\n    },\r\n\r\n    putBit: function (bit) {\r\n\r\n      var bufIndex = Math.floor(this.length / 8);\r\n      if (this.buffer.length <= bufIndex) {\r\n        this.buffer.push(0);\r\n      }\r\n\r\n      if (bit) {\r\n        this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));\r\n      }\r\n\r\n      this.length++;\r\n    }\r\n  };\r\n\r\n  //---------------------------------------------------------------------\r\n  // Support Chinese\r\n  //---------------------------------------------------------------------\r\n  function utf16To8(text) {\r\n    var result = '';\r\n    var c;\r\n    for (var i = 0; i < text.length; i++) {\r\n      c = text.charCodeAt(i);\r\n      if (c >= 0x0001 && c <= 0x007F) {\r\n        result += text.charAt(i);\r\n      } else if (c > 0x07FF) {\r\n        result += String.fromCharCode(0xE0 | c >> 12 & 0x0F);\r\n        result += String.fromCharCode(0x80 | c >> 6 & 0x3F);\r\n        result += String.fromCharCode(0x80 | c >> 0 & 0x3F);\r\n      } else {\r\n        result += String.fromCharCode(0xC0 | c >> 6 & 0x1F);\r\n        result += String.fromCharCode(0x80 | c >> 0 & 0x3F);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  uQRCode = {\r\n\r\n    errorCorrectLevel: QRErrorCorrectLevel,\r\n\r\n    defaults: {\r\n      size: 354,\r\n      margin: 0,\r\n      backgroundColor: '#ffffff',\r\n      foregroundColor: '#000000',\r\n      errorCorrectLevel: QRErrorCorrectLevel.H,\r\n      typeNumber: -1\r\n    },\r\n\r\n    make: function (canvas, ctx, options) {\r\n      var defaultOptions = {\r\n        x: 0,\r\n        y: 0,\r\n        text: options.text,\r\n        size: this.defaults.size,\r\n        margin: this.defaults.margin,\r\n        backgroundColor: this.defaults.backgroundColor,\r\n        foregroundColor: this.defaults.foregroundColor,\r\n        errorCorrectLevel: this.defaults.errorCorrectLevel,\r\n        typeNumber: this.defaults.typeNumber\r\n      };\r\n      if (options) {\r\n        for (var i in options) {\r\n          defaultOptions[i] = options[i];\r\n        }\r\n      }\r\n      options = defaultOptions;\r\n\r\n      var qrcode = new QRCode(options.typeNumber, options.errorCorrectLevel);\r\n      qrcode.addData(utf16To8(options.text));\r\n      qrcode.make();\r\n\r\n      ctx.fill\r\n      ctx.fillStyle = options.backgroundColor;\r\n      ctx.fillRect(options.x, options.y, options.size, options.size);\r\n\r\n      var tileW = (options.size - options.margin * 2) / qrcode.getModuleCount();\r\n      var tileH = tileW;\r\n\r\n      for (var row = 0; row < qrcode.getModuleCount(); row++) {\r\n        for (var col = 0; col < qrcode.getModuleCount(); col++) {\r\n          var style = qrcode.isDark(row, col) ? options.foregroundColor : options.backgroundColor;\r\n          ctx.fillStyle = style\r\n          var x = Math.round(col * tileW) + options.margin;\r\n          var y = Math.round(row * tileH) + options.margin;\r\n          var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW);\r\n          var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW);\r\n          ctx.fillRect(options.x + x, options.y + y, w, h);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n})()\r\n\r\nexport default uQRCode"
  },
  {
    "path": "js_sdk/u-draw-poster/index.d.ts",
    "content": "import { DrawPosterBuildOpts } from \"./utils/interface\";\r\nimport DrawPoster from \"./draw-poster\";\r\nimport drawQrCode from \"./extends/draw-qr-code/index\";\r\nimport createFromList from './extends/create-from-list/index';\r\nimport drawPainter from './extends/draw-painter/index';\r\ndeclare const useDrawPoster: (options: string | DrawPosterBuildOpts) => Promise<DrawPoster & import(\"./utils/interface\").drawPosterExtends>;\r\ndeclare const useDrawPosters: (optionsAll: (string | DrawPosterBuildOpts)[]) => Promise<{\r\n    [key: string]: DrawPoster & import(\"./utils/interface\").drawPosterExtends;\r\n}>;\r\nexport { DrawPoster, useDrawPoster, useDrawPosters, drawQrCode, drawPainter, createFromList };\r\nexport default DrawPoster;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/index.js",
    "content": "import * as dfucs from \"./extends/draw-function/index\";\r\nimport DrawPoster from \"./draw-poster\";\r\nimport drawQrCode from \"./extends/draw-qr-code/index\";\r\nimport createFromList from './extends/create-from-list/index';\r\nimport drawPainter from './extends/draw-painter/index';\r\nDrawPoster.useCtx(dfucs.drawImage);\r\nDrawPoster.useCtx(dfucs.fillWarpText);\r\nDrawPoster.useCtx(dfucs.roundRect);\r\nDrawPoster.useCtx(dfucs.fillRoundRect);\r\nDrawPoster.useCtx(dfucs.strokeRoundRect);\r\nDrawPoster.useCtx(dfucs.drawRoundImage);\r\nDrawPoster.useCtx(dfucs.drawImageFit);\r\nconst useDrawPoster = async (options) => {\r\n    const dp = await DrawPoster.build(options);\r\n    return dp;\r\n};\r\nconst useDrawPosters = async (optionsAll) => {\r\n    const dps = await DrawPoster.buildAll(optionsAll);\r\n    return dps;\r\n};\r\nexport { DrawPoster, useDrawPoster, useDrawPosters, drawQrCode, drawPainter, createFromList };\r\nexport default DrawPoster;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/package.json",
    "content": "{\n    \"id\": \"u-draw-poster\",\n    \"name\": \"u-draw-poster uniVue2|3适用 海报绘制工具\",\n    \"version\": \"1.1.5\",\n    \"description\": \"全端支持，内置多种海报绘制方法、表单绘制、二维码生成，图片裁剪。原生开发体验，上手快，不污染组件数据\",\n    \"keywords\": [\n        \"海报\",\n        \"绘制\",\n        \"分享\",\n        \"小程序\",\n        \"canvas\"\n    ]\n}"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/global.d.ts",
    "content": "/// <reference types=\"@dcloudio/types\" />\r\n/** 当前环境类型 */\r\nexport declare type UniPlatforms = 'app-plus' | 'app-plus-nvue' | 'h5' | 'mp-weixin' | 'mp-alipay' | 'mp-baidu' | 'mp-toutiao' | 'mp-qq' | 'mp-360' | 'mp' | 'quickapp-webview' | 'quickapp-webview-union' | 'quickapp-webview-huawei' | undefined;\r\nexport declare const PLATFORM: UniPlatforms;\r\n/** 全局对象 */\r\ndeclare const _uni: UniApp.Uni;\r\nexport default _uni;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/global.js",
    "content": "var _a;\r\nexport const PLATFORM = typeof process !== 'undefined' ? (_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.VUE_APP_PLATFORM : undefined;\r\n/** 全局对象 */\r\nconst _uni = (function () {\r\n    if (typeof uni != \"undefined\")\r\n        return uni;\r\n    if (typeof wx != \"undefined\")\r\n        return wx;\r\n    return uni;\r\n})();\r\nexport default _uni;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/interface.d.ts",
    "content": "/// <reference types=\"@dcloudio/types\" />\r\nimport DrawPoster from \"../draw-poster\";\r\nimport { ImageFitOption } from '../extends/draw-function/draw-image-fit';\r\nimport { CreateLayerOpts, DrawRowOpt } from \"../extends/create-from-list\";\r\nimport { PainterContainerOption } from \"../extends/draw-painter\";\r\n/** 绘制容器 */\r\nexport declare type Execute = Array<() => Promise<boolean>>;\r\nexport interface drawPosterExtends {\r\n    from: {\r\n        height: number;\r\n        padding: number;\r\n        margin: number;\r\n    };\r\n    createLayer: (afferOpts: CreateLayerOpts, rowList: DrawRowOpt[]) => number;\r\n    setFromOptions: (opts: Partial<{\r\n        height: number;\r\n        padding: number;\r\n        margin: number;\r\n    }>) => void;\r\n    gcanvas: {\r\n        WeexBridge: any;\r\n        Image: any;\r\n        enable: (el: any, options: {\r\n            bridge?: any;\r\n            debug?: boolean;\r\n            disableAutoSwap?: any;\r\n            disableComboCommands?: any;\r\n        }) => Canvas;\r\n    };\r\n    painter: (option: PainterContainerOption) => void;\r\n}\r\n/** 构建器配置 */\r\nexport interface DrawPosterBuildOpts {\r\n    /** 查询选择器; 注意不需要加# */\r\n    selector: string;\r\n    /** 选取组件范围 */\r\n    componentThis?: any;\r\n    /** 绘制类型为2d绘制, 默认开启, 在微信小程序的时候动态加载 */\r\n    type2d?: boolean;\r\n    /** 是否在绘制时进行加载提示 */\r\n    loading?: boolean;\r\n    /** 当存在绘制图片时, 等待绘画完毕的时间（秒）仅App中生效\r\n     *\r\n     *  具体查看文档说明：https://github.com/TuiMao233/uni-draw-poster\r\n     */\r\n    drawImageTime?: number;\r\n    /** 是否开启调试模式 */\r\n    debugging?: boolean;\r\n    /** 加载提示文字 */\r\n    loadingText?: string;\r\n    /** 创建图片提示文字 */\r\n    createText?: string;\r\n    /** 是否启动gcanvas(nvue) */\r\n    gcanvas?: boolean;\r\n}\r\n/** 绘制换行配置 */\r\nexport interface FillWarpTextOpts {\r\n    text: string;\r\n    maxWidth?: number;\r\n    lineHeight?: number;\r\n    layer?: number;\r\n    x?: number;\r\n    y?: number;\r\n    splitText?: string;\r\n    notFillText?: boolean;\r\n}\r\n/** 绘制二维码配置 */\r\nexport interface DrawQrCodeOpts {\r\n    text: string;\r\n    x?: number;\r\n    y?: number;\r\n    size?: number;\r\n    margin?: number;\r\n    backgroundColor?: string;\r\n    foregroundColor?: string;\r\n}\r\n/** 绘制换行, 单行信息 */\r\nexport interface FillWarpTextItemInfo {\r\n    text: string;\r\n    y: number;\r\n    x: number;\r\n}\r\n/** 绘制画笔 */\r\nexport interface DrawPosterCanvasCtx extends UniApp.CanvasContext {\r\n    [key: string]: any;\r\n    createImageData: () => ImageData;\r\n    textAlign: CanvasTextDrawingStyles[\"textAlign\"];\r\n    textBaseline: CanvasTextDrawingStyles[\"textBaseline\"];\r\n    transform: CanvasTransform[\"transform\"];\r\n    /** 绘制图片原型 */\r\n    drawImageProto: UniApp.CanvasContext['drawImage'];\r\n    /** 当前绘制类型 */\r\n    drawType: 'context' | 'type2d';\r\n    /** 等待绘制图片\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    drawImage(url: string, dx?: number | undefined, dy?: number | undefined, dWidth?: number | undefined, dHeigt?: number | undefined, sx?: number | undefined, sy?: number | undefined, sWidth?: number | undefined, sHeight?: number | undefined): Promise<boolean>;\r\n    /** 绘制圆角图片\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    drawRoundImage(url: string, x: number, y: number, w: number, h: number, r?: number): Promise<boolean>;\r\n    /** 绘制 Object-Fit 模式图片\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    drawImageFit(url: string, opts?: ImageFitOption): Promise<boolean>;\r\n    /** 绘制换行字体\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    fillWarpText(options: FillWarpTextOpts): Array<FillWarpTextItemInfo>;\r\n    /** 绘制圆角矩形（原型）\r\n     *\r\n     */\r\n    roundRect(x: number, y: number, w: number, h: number, r: number, fill?: boolean, stroke?: boolean): void;\r\n    /** 绘制圆角矩形（填充）\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    fillRoundRect(x: number, y: number, w: number, h: number, r: number): void;\r\n    /** 绘制圆角矩形（边框）\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    strokeRoundRect(x: number, y: number, w: number, h: number, r: number): void;\r\n    /** 绘制二维码\r\n     *\r\n     * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste\r\n     */\r\n    drawQrCode(options: DrawQrCodeOpts): void;\r\n}\r\n/** Canvas2d实例 */\r\nexport interface Canvas {\r\n    width: number;\r\n    height: number;\r\n    getContext(contextType: \"2d\" | \"webgl\"): DrawPosterCanvasCtx | WebGLRenderingContext;\r\n    createImage(): {\r\n        src: string;\r\n        width: number;\r\n        height: number;\r\n        onload: () => void;\r\n        onerror: () => void;\r\n    };\r\n    requestAnimationFrame(callback: Function): number;\r\n    cancelAnimationFrame(requestID: number): void;\r\n    createImageData(): ImageData;\r\n    createPath2D(path: Path2D): Path2D;\r\n    toDataURL(type: string, encoderOptions: number): string;\r\n}\r\n/** 创建图片路径配置项 */\r\nexport interface CreateImagePathOptions {\r\n    x?: number;\r\n    y?: number;\r\n    width?: number;\r\n    height?: number;\r\n    destWidth?: number;\r\n    destHeight?: number;\r\n}\r\n/** 绘制实例扩展配置 */\r\nexport interface DrawPosterUseOpts {\r\n    name: string;\r\n    init?: (dp: InstanceType<typeof DrawPoster>) => void;\r\n    handle: (dp: InstanceType<typeof DrawPoster>, ...args: any[]) => any;\r\n    createImage?: (dp: InstanceType<typeof DrawPoster>) => void;\r\n    [key: string]: any;\r\n}\r\n/** 绘制画笔实例扩展配置 */\r\nexport interface DrawPosterUseCtxOpts {\r\n    name: string;\r\n    init?: (canvas: Canvas, ctx: DrawPosterCanvasCtx) => void;\r\n    handle: (canvas: Canvas, ctx: DrawPosterCanvasCtx, ...args: any[]) => any;\r\n    [key: string]: any;\r\n}\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/interface.js",
    "content": "export {};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/object-sizing.d.ts",
    "content": "export declare type ObjectFit = \"contain\" | \"cover\";\r\nexport declare type ObjectPosition = [\"left\" | \"center\" | \"right\", \"top\" | \"center\" | \"bottom\"];\r\nexport interface Size {\r\n    width: number;\r\n    height: number;\r\n}\r\n/**\r\n * 用于计算图片的宽高比例\r\n * @see https://drafts.csswg.org/css-images-3/#sizing-terms\r\n *\r\n * ## 名词解释\r\n * ### intrinsic dimensions\r\n * 图片本身的尺寸\r\n *\r\n * ### specified size\r\n * 用户指定的元素尺寸\r\n *\r\n * ### concrete object size\r\n * 应用了 `objectFit` 之后图片的显示尺寸\r\n *\r\n * ### default object size\r\n */\r\nexport declare function calculateConcreteRect(style: {\r\n    /** @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit */\r\n    objectFit?: ObjectFit;\r\n    /** @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-position */\r\n    intrinsicPosition?: ObjectPosition;\r\n    specifiedPosition?: [number, number];\r\n}, intrinsicSize: Size, specifiedSize: Size): {\r\n    sx: number;\r\n    sy: number;\r\n    sw: number;\r\n    sh: number;\r\n    dx: number;\r\n    dy: number;\r\n    dw: number;\r\n    dh: number;\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/object-sizing.js",
    "content": "/**\r\n * 用于计算图片的宽高比例\r\n * @see https://drafts.csswg.org/css-images-3/#sizing-terms\r\n *\r\n * ## 名词解释\r\n * ### intrinsic dimensions\r\n * 图片本身的尺寸\r\n *\r\n * ### specified size\r\n * 用户指定的元素尺寸\r\n *\r\n * ### concrete object size\r\n * 应用了 `objectFit` 之后图片的显示尺寸\r\n *\r\n * ### default object size\r\n */\r\nexport function calculateConcreteRect(style, intrinsicSize, specifiedSize) {\r\n    var _a, _b;\r\n    const isContain = style.objectFit === 'contain';\r\n    const specifiedPosition = style.specifiedPosition || [0, 0];\r\n    // ratio 越大表示矩形越\"扁\"\r\n    let intrinsicRatio = intrinsicSize.width / intrinsicSize.height;\r\n    let specifiedRatio = specifiedSize.width / specifiedSize.height;\r\n    /** 图片原始尺寸与最终尺寸之比 */\r\n    let concreteScale = 1;\r\n    if (intrinsicRatio > specifiedRatio && style.objectFit == \"contain\" ||\r\n        intrinsicRatio <= specifiedRatio && style.objectFit == \"cover\")\r\n        // 图片较\"胖\"时完整显示图片，图片较\"瘦\"时完全覆盖容器\r\n        // 这两种情况下有 concreteRect.width = specifiedSize.width\r\n        // 因为 concreteRect.width = intrinsicSize.width * concreteScale\r\n        // 所以:\r\n        concreteScale = specifiedSize.width / intrinsicSize.width;\r\n    else if (intrinsicRatio > specifiedRatio && style.objectFit == \"cover\" ||\r\n        intrinsicRatio <= specifiedRatio && style.objectFit == \"contain\")\r\n        // 图片较\"瘦\"时完整显示图片，图片较\"胖\"时完全覆盖容器\r\n        // 这两种情况下有 concreteRect.height = specifiedSize.height\r\n        // 因为 concreteRect.height = intrinsicSize.height * concreteScale\r\n        // 所以:\r\n        concreteScale = specifiedSize.height / intrinsicSize.height;\r\n    else\r\n        throw new Error(\"Unkonwn concreteScale\");\r\n    let concreteRectWidth = intrinsicSize.width * concreteScale;\r\n    let concreteRectHeight = intrinsicSize.height * concreteScale;\r\n    // 这里可以把 left top 的计算想象成投影\r\n    let xRelativeOrigin = { left: 0, center: .5, right: 1 }[((_a = style.intrinsicPosition) === null || _a === void 0 ? void 0 : _a[0]) || \"center\"];\r\n    let yRelativeOrigin = { top: 0, center: .5, bottom: 1 }[((_b = style.intrinsicPosition) === null || _b === void 0 ? void 0 : _b[1]) || \"center\"];\r\n    let concreteRectLeft = (specifiedSize.width - concreteRectWidth) * xRelativeOrigin;\r\n    let concreteRectTop = (specifiedSize.height - concreteRectHeight) * yRelativeOrigin;\r\n    if (isContain) {\r\n        concreteRectLeft += specifiedPosition[0];\r\n        concreteRectTop += specifiedPosition[1];\r\n    }\r\n    // 这里有两个坐标系，一个是 specified (dist) 的坐标系，一个是 intrinsic (src) 的坐标系\r\n    // 这里将两个坐标系的点位置进行变换\r\n    // 例: 带入 x=0, y=0, 得到的结果就是 specifiedRect 的左上角在 intrinsic 坐标系下的坐标位置\r\n    // 在 specified 坐标系下, intrinsic 的零点在 (concreteRectLeft, concreteRectTop), 缩放为 concreteScale\r\n    // 所以有 x_dist = x_src * concreteScale + concreteRectLeft\r\n    //        y_dist = y_src * concreteScale + concreteRectTop\r\n    let dist2src = (distX, distY) => [\r\n        /* srcX = */ (distX - concreteRectLeft) / concreteScale,\r\n        /* srcY = */ (distY - concreteRectTop) / concreteScale\r\n    ];\r\n    let [srcLeft, srcTop] = dist2src(0, 0);\r\n    // srcRight =  图片 specified 框右边在 src 坐标系下的 x 坐标\r\n    // srcBottom = 图片 specified 框下边在 src 坐标系下的 y 坐标\r\n    let [srcRight, srcBottom] = dist2src(specifiedSize.width, specifiedSize.height);\r\n    // 这里要对 src 和 disc 两个框进行约束\r\n    return {\r\n        sx: Math.max(srcLeft, 0),\r\n        sy: Math.max(srcTop, 0),\r\n        sw: Math.min(srcRight - srcLeft, intrinsicSize.width),\r\n        sh: Math.min(srcBottom - srcTop, intrinsicSize.height),\r\n        dx: isContain ? Math.max(concreteRectLeft, 0) : specifiedPosition[0],\r\n        dy: isContain ? Math.max(concreteRectTop, 0) : specifiedPosition[1],\r\n        dw: Math.min(concreteRectWidth, specifiedSize.width),\r\n        dh: Math.min(concreteRectHeight, specifiedSize.height)\r\n    };\r\n}\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/utils.d.ts",
    "content": "import { DrawPosterBuildOpts } from \"./interface\";\r\n/** 是否是base64本地地址 */\r\nexport declare const isBaseUrl: (str: string) => boolean;\r\n/** 是否是小程序本地地址 */\r\nexport declare const isTmpUrl: (str: string) => boolean;\r\n/** 是否是网络地址 */\r\nexport declare const isNetworkUrl: (str: string) => boolean;\r\n/** 对象target挂载到对象current */\r\nexport declare const extendMount: (current: Record<any, any>, target: Record<any, any>, handle?: (extend: Function, target?: Record<any, any> | undefined) => any) => void;\r\n/** 处理构建配置 */\r\nexport declare const handleBuildOpts: (options: string | DrawPosterBuildOpts) => {\r\n    selector: string;\r\n    componentThis: any;\r\n    type2d: boolean;\r\n    loading: boolean;\r\n    debugging: boolean;\r\n    loadingText: string;\r\n    createText: string;\r\n    gcanvas: boolean;\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/utils.js",
    "content": "import { PLATFORM } from \"./global\";\r\n/** 是否是base64本地地址 */\r\nexport const isBaseUrl = (str) => {\r\n    return /^\\s*data:(?:[a-z]+\\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s]*?)\\s*$/i.test(str);\r\n};\r\n/** 是否是小程序本地地址 */\r\nexport const isTmpUrl = (str) => {\r\n    return /http:\\/\\/temp\\/wx/.test(str);\r\n};\r\n/** 是否是网络地址 */\r\nexport const isNetworkUrl = (str) => {\r\n    return /^(((ht|f)tps?):\\/\\/)?[\\w-]+(\\.[\\w-]+)+([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/.test(str);\r\n};\r\n/** 对象target挂载到对象current */\r\nexport const extendMount = (current, target, handle = (extend, target) => undefined) => {\r\n    for (const key in target) {\r\n        current[key] = handle(target[key].handle, target[key]) || target[key].handle;\r\n    }\r\n};\r\n/** 处理构建配置 */\r\nexport const handleBuildOpts = (options) => {\r\n    let defaultOpts = {\r\n        selector: '',\r\n        componentThis: undefined,\r\n        type2d: true,\r\n        loading: false,\r\n        debugging: false,\r\n        loadingText: '绘制海报中...',\r\n        createText: '生成图片中...',\r\n        gcanvas: false\r\n    };\r\n    if (typeof options === \"string\") {\r\n        defaultOpts.selector = options;\r\n    }\r\n    else {\r\n        defaultOpts = Object.assign(Object.assign({}, defaultOpts), options);\r\n    }\r\n    const oldSelector = defaultOpts.selector;\r\n    if (PLATFORM === 'mp-weixin' && defaultOpts.type2d) {\r\n        defaultOpts.selector = '#' + defaultOpts.selector;\r\n    }\r\n    if (!PLATFORM) {\r\n        console.error('注意! draw-poster未开启uni条件编译! 当环境是微信小程序将不会动态切换为type2d模式');\r\n        console.error(`请在vue.config.js中的transpileDependencies中添加'uni-draw-poster'`);\r\n        console.error(`或者可以在选择器字符串前缀中添加#来切换为type2d绘制`);\r\n        defaultOpts.selector = oldSelector;\r\n    }\r\n    return defaultOpts;\r\n};\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/wx-utils.d.ts",
    "content": "import { Canvas } from \"./interface\";\r\nexport declare const downloadImgUrl: (url: string) => Promise<string>;\r\nexport declare const getCanvas2dContext: (selector: string, componentThis?: any) => Promise<Canvas | {}>;\r\n"
  },
  {
    "path": "js_sdk/u-draw-poster/utils/wx-utils.js",
    "content": "/*\r\n * @Author: Mr.Mao\r\n * @LastEditors: Mr.Mao\r\n * @Date: 2020-10-12 08:49:27\r\n * @LastEditTime: 2020-12-09 13:54:10\r\n * @Description:\r\n * @任何一个傻子都能写出让电脑能懂的代码，而只有好的程序员可以写出让人能看懂的代码\r\n */\r\nimport uni from \"./global\";\r\nimport { isBaseUrl, isNetworkUrl, isTmpUrl } from './utils';\r\n// 下载指定地址图片, 如果不符合下载图片, 则直接返回\r\nexport const downloadImgUrl = (url) => {\r\n    const isLocalFile = isBaseUrl(url) || isTmpUrl(url) || !isNetworkUrl(url);\r\n    return new Promise((resolve, reject) => {\r\n        if (isLocalFile) {\r\n            return resolve(url);\r\n        }\r\n        uni.downloadFile({\r\n            url,\r\n            success: (res) => resolve(res.tempFilePath),\r\n            fail: reject\r\n        });\r\n    });\r\n};\r\n// 获取当前指定 node 节点\r\nexport const getCanvas2dContext = (selector, componentThis) => {\r\n    return new Promise(resolve => {\r\n        const query = (componentThis ?\r\n            uni.createSelectorQuery().in(componentThis) :\r\n            uni.createSelectorQuery());\r\n        query.select(selector)\r\n            .fields({ node: true }, res => {\r\n            const node = res === null || res === void 0 ? void 0 : res.node;\r\n            resolve(node || {});\r\n        }).exec();\r\n    });\r\n};\r\n"
  },
  {
    "path": "js_sdk/wa-permission/permission.js",
    "content": "/**\r\n * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启\r\n * https://ext.dcloud.net.cn/plugin?id=594\r\n */\r\n\r\nvar isIos\r\n// #ifdef APP-PLUS\r\nisIos = (plus.os.name == \"iOS\")\r\n// #endif\r\n\r\n// 判断推送权限是否开启\r\nfunction judgeIosPermissionPush() {\r\n\tvar result = false;\r\n\tvar UIApplication = plus.ios.import(\"UIApplication\");\r\n\tvar app = UIApplication.sharedApplication();\r\n\tvar enabledTypes = 0;\r\n\tif (app.currentUserNotificationSettings) {\r\n\t\tvar settings = app.currentUserNotificationSettings();\r\n\t\tenabledTypes = settings.plusGetAttribute(\"types\");\r\n\t\tconsole.log(\"enabledTypes1:\" + enabledTypes);\r\n\t\tif (enabledTypes == 0) {\r\n\t\t\tconsole.log(\"推送权限没有开启\");\r\n\t\t} else {\r\n\t\t\tresult = true;\r\n\t\t\tconsole.log(\"已经开启推送功能!\")\r\n\t\t}\r\n\t\tplus.ios.deleteObject(settings);\r\n\t} else {\r\n\t\tenabledTypes = app.enabledRemoteNotificationTypes();\r\n\t\tif (enabledTypes == 0) {\r\n\t\t\tconsole.log(\"推送权限没有开启!\");\r\n\t\t} else {\r\n\t\t\tresult = true;\r\n\t\t\tconsole.log(\"已经开启推送功能!\")\r\n\t\t}\r\n\t\tconsole.log(\"enabledTypes2:\" + enabledTypes);\r\n\t}\r\n\tplus.ios.deleteObject(app);\r\n\tplus.ios.deleteObject(UIApplication);\r\n\treturn result;\r\n}\r\n\r\n// 判断定位权限是否开启\r\nfunction judgeIosPermissionLocation() {\r\n\tvar result = false;\r\n\tvar cllocationManger = plus.ios.import(\"CLLocationManager\");\r\n\tvar status = cllocationManger.authorizationStatus();\r\n\tresult = (status != 2)\r\n\tconsole.log(\"定位权限开启：\" + result);\r\n\t// 以下代码判断了手机设备的定位是否关闭，推荐另行使用方法 checkSystemEnableLocation\r\n\t/* var enable = cllocationManger.locationServicesEnabled();\r\n\tvar status = cllocationManger.authorizationStatus();\r\n\tconsole.log(\"enable:\" + enable);\r\n\tconsole.log(\"status:\" + status);\r\n\tif (enable && status != 2) {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"手机定位服务已开启且已授予定位权限\");\r\n\t} else {\r\n\t\tconsole.log(\"手机系统的定位没有打开或未给予定位权限\");\r\n\t} */\r\n\tplus.ios.deleteObject(cllocationManger);\r\n\treturn result;\r\n}\r\n\r\n// 判断麦克风权限是否开启\r\nfunction judgeIosPermissionRecord() {\r\n\tvar result = false;\r\n\tvar avaudiosession = plus.ios.import(\"AVAudioSession\");\r\n\tvar avaudio = avaudiosession.sharedInstance();\r\n\tvar permissionStatus = avaudio.recordPermission();\r\n\tconsole.log(\"permissionStatus:\" + permissionStatus);\r\n\tif (permissionStatus == 1684369017 || permissionStatus == 1970168948) {\r\n\t\tconsole.log(\"麦克风权限没有开启\");\r\n\t} else {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"麦克风权限已经开启\");\r\n\t}\r\n\tplus.ios.deleteObject(avaudiosession);\r\n\treturn result;\r\n}\r\n\r\n// 判断相机权限是否开启\r\nfunction judgeIosPermissionCamera() {\r\n\tvar result = false;\r\n\tvar AVCaptureDevice = plus.ios.import(\"AVCaptureDevice\");\r\n\tvar authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');\r\n\tconsole.log(\"authStatus:\" + authStatus);\r\n\tif (authStatus == 3) {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"相机权限已经开启\");\r\n\t} else {\r\n\t\tconsole.log(\"相机权限没有开启\");\r\n\t}\r\n\tplus.ios.deleteObject(AVCaptureDevice);\r\n\treturn result;\r\n}\r\n\r\n// 判断相册权限是否开启\r\nfunction judgeIosPermissionPhotoLibrary() {\r\n\tvar result = false;\r\n\tvar PHPhotoLibrary = plus.ios.import(\"PHPhotoLibrary\");\r\n\tvar authStatus = PHPhotoLibrary.authorizationStatus();\r\n\tconsole.log(\"authStatus:\" + authStatus);\r\n\tif (authStatus == 3) {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"相册权限已经开启\");\r\n\t} else {\r\n\t\tconsole.log(\"相册权限没有开启\");\r\n\t}\r\n\tplus.ios.deleteObject(PHPhotoLibrary);\r\n\treturn result;\r\n}\r\n\r\n// 判断通讯录权限是否开启\r\nfunction judgeIosPermissionContact() {\r\n\tvar result = false;\r\n\tvar CNContactStore = plus.ios.import(\"CNContactStore\");\r\n\tvar cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);\r\n\tif (cnAuthStatus == 3) {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"通讯录权限已经开启\");\r\n\t} else {\r\n\t\tconsole.log(\"通讯录权限没有开启\");\r\n\t}\r\n\tplus.ios.deleteObject(CNContactStore);\r\n\treturn result;\r\n}\r\n\r\n// 判断日历权限是否开启\r\nfunction judgeIosPermissionCalendar() {\r\n\tvar result = false;\r\n\tvar EKEventStore = plus.ios.import(\"EKEventStore\");\r\n\tvar ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);\r\n\tif (ekAuthStatus == 3) {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"日历权限已经开启\");\r\n\t} else {\r\n\t\tconsole.log(\"日历权限没有开启\");\r\n\t}\r\n\tplus.ios.deleteObject(EKEventStore);\r\n\treturn result;\r\n}\r\n\r\n// 判断备忘录权限是否开启\r\nfunction judgeIosPermissionMemo() {\r\n\tvar result = false;\r\n\tvar EKEventStore = plus.ios.import(\"EKEventStore\");\r\n\tvar ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);\r\n\tif (ekAuthStatus == 3) {\r\n\t\tresult = true;\r\n\t\tconsole.log(\"备忘录权限已经开启\");\r\n\t} else {\r\n\t\tconsole.log(\"备忘录权限没有开启\");\r\n\t}\r\n\tplus.ios.deleteObject(EKEventStore);\r\n\treturn result;\r\n}\r\n\r\n// Android权限查询\r\nfunction requestAndroidPermission(permissionID) {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tplus.android.requestPermissions(\r\n\t\t\t[permissionID], // 理论上支持多个权限同时查询，但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装\r\n\t\t\tfunction(resultObj) {\r\n\t\t\t\tvar result = 0;\r\n\t\t\t\tfor (var i = 0; i < resultObj.granted.length; i++) {\r\n\t\t\t\t\tvar grantedPermission = resultObj.granted[i];\r\n\t\t\t\t\tconsole.log('已获取的权限：' + grantedPermission);\r\n\t\t\t\t\tresult = 1\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i = 0; i < resultObj.deniedPresent.length; i++) {\r\n\t\t\t\t\tvar deniedPresentPermission = resultObj.deniedPresent[i];\r\n\t\t\t\t\tconsole.log('拒绝本次申请的权限：' + deniedPresentPermission);\r\n\t\t\t\t\tresult = 0\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i = 0; i < resultObj.deniedAlways.length; i++) {\r\n\t\t\t\t\tvar deniedAlwaysPermission = resultObj.deniedAlways[i];\r\n\t\t\t\t\tconsole.log('永久拒绝申请的权限：' + deniedAlwaysPermission);\r\n\t\t\t\t\tresult = -1\r\n\t\t\t\t}\r\n\t\t\t\tresolve(result);\r\n\t\t\t\t// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限\r\n\t\t\t\t// if (result != 1) {\r\n\t\t\t\t// gotoAppPermissionSetting()\r\n\t\t\t\t// }\r\n\t\t\t},\r\n\t\t\tfunction(error) {\r\n\t\t\t\tconsole.log('申请权限错误：' + error.code + \" = \" + error.message);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tcode: error.code,\r\n\t\t\t\t\tmessage: error.message\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t);\r\n\t});\r\n}\r\n\r\n// 使用一个方法，根据参数判断权限\r\nfunction judgeIosPermission(permissionID) {\r\n\tif (permissionID == \"location\") {\r\n\t\treturn judgeIosPermissionLocation()\r\n\t} else if (permissionID == \"camera\") {\r\n\t\treturn judgeIosPermissionCamera()\r\n\t} else if (permissionID == \"photoLibrary\") {\r\n\t\treturn judgeIosPermissionPhotoLibrary()\r\n\t} else if (permissionID == \"record\") {\r\n\t\treturn judgeIosPermissionRecord()\r\n\t} else if (permissionID == \"push\") {\r\n\t\treturn judgeIosPermissionPush()\r\n\t} else if (permissionID == \"contact\") {\r\n\t\treturn judgeIosPermissionContact()\r\n\t} else if (permissionID == \"calendar\") {\r\n\t\treturn judgeIosPermissionCalendar()\r\n\t} else if (permissionID == \"memo\") {\r\n\t\treturn judgeIosPermissionMemo()\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n// 跳转到**应用**的权限页面\r\nfunction gotoAppPermissionSetting() {\r\n\tif (isIos) {\r\n\t\tvar UIApplication = plus.ios.import(\"UIApplication\");\r\n\t\tvar application2 = UIApplication.sharedApplication();\r\n\t\tvar NSURL2 = plus.ios.import(\"NSURL\");\r\n\t\t// var setting2 = NSURL2.URLWithString(\"prefs:root=LOCATION_SERVICES\");\t\t\r\n\t\tvar setting2 = NSURL2.URLWithString(\"app-settings:\");\r\n\t\tapplication2.openURL(setting2);\r\n\r\n\t\tplus.ios.deleteObject(setting2);\r\n\t\tplus.ios.deleteObject(NSURL2);\r\n\t\tplus.ios.deleteObject(application2);\r\n\t} else {\r\n\t\t// console.log(plus.device.vendor);\r\n\t\tvar Intent = plus.android.importClass(\"android.content.Intent\");\r\n\t\tvar Settings = plus.android.importClass(\"android.provider.Settings\");\r\n\t\tvar Uri = plus.android.importClass(\"android.net.Uri\");\r\n\t\tvar mainActivity = plus.android.runtimeMainActivity();\r\n\t\tvar intent = new Intent();\r\n\t\tintent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);\r\n\t\tvar uri = Uri.fromParts(\"package\", mainActivity.getPackageName(), null);\r\n\t\tintent.setData(uri);\r\n\t\tmainActivity.startActivity(intent);\r\n\t}\r\n}\r\n\r\n// 检查系统的设备服务是否开启\r\n// var checkSystemEnableLocation = async function () {\r\nfunction checkSystemEnableLocation() {\r\n\tif (isIos) {\r\n\t\tvar result = false;\r\n\t\tvar cllocationManger = plus.ios.import(\"CLLocationManager\");\r\n\t\tvar result = cllocationManger.locationServicesEnabled();\r\n\t\tconsole.log(\"系统定位开启:\" + result);\r\n\t\tplus.ios.deleteObject(cllocationManger);\r\n\t\treturn result;\r\n\t} else {\r\n\t\tvar context = plus.android.importClass(\"android.content.Context\");\r\n\t\tvar locationManager = plus.android.importClass(\"android.location.LocationManager\");\r\n\t\tvar main = plus.android.runtimeMainActivity();\r\n\t\tvar mainSvr = main.getSystemService(context.LOCATION_SERVICE);\r\n\t\tvar result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);\r\n\t\tconsole.log(\"系统定位开启:\" + result);\r\n\t\treturn result\r\n\t}\r\n}\r\n\r\nmodule.exports = {\r\n\tjudgeIosPermission: judgeIosPermission,\r\n\trequestAndroidPermission: requestAndroidPermission,\r\n\tcheckSystemEnableLocation: checkSystemEnableLocation,\r\n\tgotoAppPermissionSetting: gotoAppPermissionSetting\r\n}\r\n"
  },
  {
    "path": "lib/request/adapters/index.js",
    "content": "import buildURL from '../helpers/buildURL'\nimport buildFullPath from '../core/buildFullPath'\nimport settle from '../core/settle'\n\n/**\n * 返回可选值存在的配置\n * @param {Array} keys - 可选值数组\n * @param {Object} config2 - 配置\n * @return {{}} - 存在的配置项\n */\nconst mergeKeys = (keys, config2) => {\n  let config = {}\n  keys.forEach(prop => {\n    if (typeof config2[prop] !== 'undefined') {\n      config[prop] = config2[prop]\n    }\n  })\n  return config\n}\nexport default (config) => {\n  return new Promise((resolve, reject) => {\n    const _config = {\n      url: buildURL(buildFullPath(config.baseURL, config.url), config.params),\n      header: config.header,\n      complete: (response) => {\n        response.config = config\n        try {\n          // 对可能字符串不是json 的情况容错\n          if (typeof response.data === 'string') {\n            response.data = JSON.parse(response.data)\n          }\n          // eslint-disable-next-line no-empty\n        } catch (e) {\n        }\n        settle(resolve, reject, response)\n      }\n    }\n    let requestTask\n    if (config.method === 'UPLOAD') {\n      let otherConfig = {\n        // #ifdef MP-ALIPAY\n        fileType: config.fileType,\n        // #endif\n        filePath: config.filePath,\n        name: config.name\n      }\n      const optionalKeys = [\n        // #ifdef APP-PLUS || H5\n        'files',\n        // #endif\n        // #ifdef H5\n        'file',\n        // #endif\n        'formData'\n      ]\n      requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)})\n    } else if (config.method === 'DOWNLOAD') {\n      requestTask = uni.downloadFile(_config)\n    } else {\n      const optionalKeys = [\n        'data',\n        'method',\n        // #ifdef MP-ALIPAY || MP-WEIXIN\n        'timeout',\n        // #endif\n        'dataType',\n        // #ifndef MP-ALIPAY || APP-PLUS\n        'responseType',\n        // #endif\n        // #ifdef APP-PLUS\n        'sslVerify',\n        // #endif\n        // #ifdef H5\n        'withCredentials'\n        // #endif\n      ]\n      requestTask = uni.request({..._config,...mergeKeys(optionalKeys, config)})\n    }\n    if (config.getTask) {\n      config.getTask(requestTask, config)\n    }\n  })\n}\n"
  },
  {
    "path": "lib/request/core/InterceptorManager.js",
    "content": "'use strict'\n\n\nfunction InterceptorManager() {\n  this.handlers = []\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n  this.handlers.push({\n    fulfilled: fulfilled,\n    rejected: rejected\n  })\n  return this.handlers.length - 1\n}\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n  if (this.handlers[id]) {\n    this.handlers[id] = null\n  }\n}\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n  this.handlers.forEach(h => {\n    if (h !== null) {\n      fn(h)\n    }\n  })\n}\n\nexport default InterceptorManager\n"
  },
  {
    "path": "lib/request/core/Request.js",
    "content": "/**\n * @Class Request\n * @description luch-request http请求插件\n * @version 3.0.2\n * @Author lu-ch\n * @Date 2020-06-04\n * @Email webwork.s@qq.com\n * 文档: https://quanzhan.co/luch-request/\n * github: https://github.com/lei-mu/luch-request\n * DCloud: http://ext.dcloud.net.cn/plugin?id=392\n * HBuilderX: 2.7.9\n */\n\n\nimport dispatchRequest from './dispatchRequest'\nimport InterceptorManager from './InterceptorManager'\nimport mergeConfig from './mergeConfig'\nimport defaults from './defaults'\nimport { isPlainObject } from '../utils'\n\nexport default class Request {\n  /**\n   * @param {Object} arg - 全局配置\n   * @param {String} arg.baseURL - 全局根路径\n   * @param {Object} arg.header - 全局header\n   * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式\n   * @param {String} arg.dataType = [json] - 全局默认的dataType\n   * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。App和支付宝小程序不支持\n   * @param {Object} arg.custom - 全局默认的自定义参数\n   * @param {Number} arg.timeout - 全局默认的超时时间，单位 ms。默认30000。仅微信小程序（2.10.0）、支付宝小程序支持\n   * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持（HBuilderX 2.3.3+）\n   * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证（cookies）。默认false。仅H5支持（HBuilderX 2.6.15+）\n   * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300\n   */\n  constructor(arg = {}) {\n    if (!isPlainObject(arg)) {\n      arg = {}\n      //console.warn('设置全局参数必须接收一个Object')\n    }\n    this.config = {...defaults, ...arg}\n    this.interceptors = {\n      request: new InterceptorManager(),\n      response: new InterceptorManager()\n    }\n  }\n\n  /**\n   * @Function\n   * @param {Request~setConfigCallback} f - 设置全局默认配置\n   */\n  setConfig(f) {\n    this.config = f(this.config)\n  }\n\n  _middleware(config) {\n    config = mergeConfig(this.config, config)\n    let chain = [dispatchRequest, undefined]\n    let promise = Promise.resolve(config)\n\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n      chain.unshift(interceptor.fulfilled, interceptor.rejected)\n    })\n\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n      chain.push(interceptor.fulfilled, interceptor.rejected)\n    })\n\n    while (chain.length) {\n      promise = promise.then(chain.shift(), chain.shift())\n    }\n\n    return promise\n  }\n\n  /**\n   * @Function\n   * @param {Object} config - 请求配置项\n   * @prop {String} options.url - 请求路径\n   * @prop {Object} options.data - 请求参数\n   * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型\n   * @prop {Object} [options.dataType = config.dataType] - 如果设为 json，会尝试对返回的数据做一次 JSON.parse\n   * @prop {Object} [options.header = config.header] - 请求header\n   * @prop {Object} [options.method = config.method] - 请求方法\n   * @returns {Promise<unknown>}\n   */\n  request(config = {}) {\n    return this._middleware(config)\n  }\n\n  get(url, options = {}) {\n    return this.request({\n      url,\n      method: 'GET',\n      ...options\n    })\n  }\n\n  post(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'POST',\n      ...options\n    })\n  }\n\n  // #ifndef MP-ALIPAY\n  put(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'PUT',\n      ...options\n    })\n  }\n\n  // #endif\n\n  // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU\n  delete(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'DELETE',\n      ...options\n    })\n  }\n\n  // #endif\n\n  // #ifdef APP-PLUS || H5 || MP-WEIXIN\n  connect(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'CONNECT',\n      ...options\n    })\n  }\n\n  // #endif\n\n  // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU\n  head(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'HEAD',\n      ...options\n    })\n  }\n\n  // #endif\n\n  // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU\n  options(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'OPTIONS',\n      ...options\n    })\n  }\n\n  // #endif\n\n  // #ifdef APP-PLUS || H5 || MP-WEIXIN\n  trace(url, data, options = {}) {\n    return this.request({\n      url,\n      data,\n      method: 'TRACE',\n      ...options\n    })\n  }\n\n  // #endif\n\n  upload(url, config = {}) {\n    config.url = url\n    config.method = 'UPLOAD'\n    return this._middleware(config)\n  }\n\n  download(url, config = {}) {\n    config.url = url\n    config.method = 'DOWNLOAD'\n    return this._middleware(config)\n  }\n}\n\n\n/**\n * setConfig回调\n * @return {Object} - 返回操作后的config\n * @callback Request~setConfigCallback\n * @param {Object} config - 全局默认config\n */\n"
  },
  {
    "path": "lib/request/core/buildFullPath.js",
    "content": "'use strict'\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL'\nimport combineURLs from '../helpers/combineURLs'\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n  if (baseURL && !isAbsoluteURL(requestedURL)) {\n    return combineURLs(baseURL, requestedURL)\n  }\n  return requestedURL\n}\n"
  },
  {
    "path": "lib/request/core/defaults.js",
    "content": "/**\n * 默认的全局配置\n */\n\n\nexport default {\n  baseURL: '',\n  header: {},\n  method: 'GET',\n  dataType: 'json',\n  // #ifndef MP-ALIPAY || APP-PLUS\n  responseType: 'text',\n  // #endif\n  custom: {},\n  // #ifdef MP-ALIPAY || MP-WEIXIN\n  timeout: 30000,\n  // #endif\n  // #ifdef APP-PLUS\n  sslVerify: true,\n  // #endif\n  // #ifdef H5\n  withCredentials: false,\n  // #endif\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300\n  }\n}\n"
  },
  {
    "path": "lib/request/core/dispatchRequest.js",
    "content": "import adapter from '../adapters/index'\n\n\nexport default (config) => {\n  config.header = config.header || {}\n  return adapter(config)\n}\n"
  },
  {
    "path": "lib/request/core/mergeConfig.js",
    "content": "import {deepMerge, isObject} from '../utils'\n\n/**\n * 合并局部配置优先的配置，如果局部有该配置项则用局部，如果全局有该配置项则用全局\n * @param {Array} keys - 配置项\n * @param {Object} globalsConfig - 当前的全局配置\n * @param {Object} config2 - 局部配置\n * @return {{}}\n */\nconst mergeKeys = (keys, globalsConfig, config2) => {\n  let config = {}\n  keys.forEach(prop => {\n    if (typeof config2[prop] !== 'undefined') {\n      config[prop] = config2[prop]\n    } else if (typeof globalsConfig[prop] !== 'undefined') {\n      config[prop] = globalsConfig[prop]\n    }\n  })\n  return config\n}\n/**\n *\n * @param globalsConfig - 当前实例的全局配置\n * @param config2 - 当前的局部配置\n * @return - 合并后的配置\n */\nexport default (globalsConfig, config2 = {}) => {\n  const method = config2.method || globalsConfig.method || 'GET'\n  let config = {\n    baseURL: globalsConfig.baseURL || '',\n    method: method,\n    url: config2.url || ''\n  }\n  const mergeDeepPropertiesKeys = ['header', 'params', 'custom']\n  const defaultToConfig2Keys = ['getTask', 'validateStatus']\n  mergeDeepPropertiesKeys.forEach(prop => {\n    if (isObject(config2[prop])) {\n      config[prop] = deepMerge(globalsConfig[prop], config2[prop])\n    } else if (typeof config2[prop] !== 'undefined') {\n      config[prop] = config2[prop]\n    } else if (isObject(globalsConfig[prop])) {\n      config[prop] = deepMerge(globalsConfig[prop])\n    } else if (typeof globalsConfig[prop] !== 'undefined') {\n      config[prop] = globalsConfig[prop]\n    }\n  })\n  config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)}\n\n  // eslint-disable-next-line no-empty\n  if (method === 'DOWNLOAD') {\n\n  } else if (method === 'UPLOAD') {\n    if (isObject(config.header)) {\n      delete config.header['content-type']\n      delete config.header['Content-Type']\n    }\n    const uploadKeys = [\n      // #ifdef APP-PLUS || H5\n      'files',\n      // #endif\n      // #ifdef MP-ALIPAY\n      'fileType',\n      // #endif\n      // #ifdef H5\n      'file',\n      // #endif\n      'filePath',\n      'name',\n      'formData',\n    ]\n    uploadKeys.forEach(prop => {\n      if (typeof config2[prop] !== 'undefined') {\n        config[prop] = config2[prop]\n      }\n    })\n  } else {\n    const defaultsKeys = [\n      'data',\n      // #ifdef MP-ALIPAY || MP-WEIXIN\n      'timeout',\n      // #endif\n      'dataType',\n      // #ifndef MP-ALIPAY || APP-PLUS\n      'responseType',\n      // #endif\n      // #ifdef APP-PLUS\n      'sslVerify',\n      // #endif\n      // #ifdef H5\n      'withCredentials'\n      // #endif\n    ]\n    config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)}\n  }\n\n  return config\n}\n"
  },
  {
    "path": "lib/request/core/settle.js",
    "content": "/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nexport default function settle(resolve, reject, response) {\n  const validateStatus = response.config.validateStatus\n  const status = response.statusCode\n  if (status && (!validateStatus || validateStatus(status))) {\n    resolve(response)\n  } else {\n    reject(response)\n  }\n}\n"
  },
  {
    "path": "lib/request/helpers/buildURL.js",
    "content": "'use strict'\n\nimport * as utils from './../utils'\n\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%40/gi, '@').\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']')\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url\n  }\n\n  var serializedParams\n  if (utils.isURLSearchParams(params)) {\n    serializedParams = params.toString()\n  } else {\n    var parts = []\n\n    utils.forEach(params, function serialize(val, key) {\n      if (val === null || typeof val === 'undefined') {\n        return\n      }\n\n      if (utils.isArray(val)) {\n        key = key + '[]'\n      } else {\n        val = [val]\n      }\n\n      utils.forEach(val, function parseValue(v) {\n        if (utils.isDate(v)) {\n          v = v.toISOString()\n        } else if (utils.isObject(v)) {\n          v = JSON.stringify(v)\n        }\n        parts.push(encode(key) + '=' + encode(v))\n      })\n    })\n\n    serializedParams = parts.join('&')\n  }\n\n  if (serializedParams) {\n    var hashmarkIndex = url.indexOf('#')\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex)\n    }\n\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams\n  }\n\n  return url\n}\n"
  },
  {
    "path": "lib/request/helpers/combineURLs.js",
    "content": "'use strict'\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL\n}\n"
  },
  {
    "path": "lib/request/helpers/isAbsoluteURL.js",
    "content": "'use strict'\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url)\n}\n"
  },
  {
    "path": "lib/request/index.js",
    "content": "import Request from './core/Request'\nexport default Request\n"
  },
  {
    "path": "lib/request/utils.js",
    "content": "'use strict'\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nexport function isArray (val) {\n  return toString.call(val) === '[object Array]'\n}\n\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nexport function isObject (val) {\n  return val !== null && typeof val === 'object'\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nexport function isDate (val) {\n  return toString.call(val) === '[object Date]'\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nexport function isURLSearchParams (val) {\n  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams\n}\n\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nexport function forEach (obj, fn) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return\n  }\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj]\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (var i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj)\n    }\n  } else {\n    // Iterate over object keys\n    for (var key in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, key)) {\n        fn.call(null, obj[key], key, obj)\n      }\n    }\n  }\n}\n\n/**\n * 是否为boolean 值\n * @param val\n * @returns {boolean}\n */\nexport function isBoolean(val) {\n  return typeof val === 'boolean'\n}\n\n/**\n * 是否为真正的对象{} new Object\n * @param {any} obj - 检测的对象\n * @returns {boolean}\n */\nexport function isPlainObject(obj) {\n  return Object.prototype.toString.call(obj) === '[object Object]'\n}\n\n\n\n/**\n * Function equal to merge with the difference being that no reference\n * to original objects is kept.\n *\n * @see merge\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nexport function deepMerge(/* obj1, obj2, obj3, ... */) {\n  let result = {}\n  function assignValue(val, key) {\n    if (typeof result[key] === 'object' && typeof val === 'object') {\n      result[key] = deepMerge(result[key], val)\n    } else if (typeof val === 'object') {\n      result[key] = deepMerge({}, val)\n    } else {\n      result[key] = val\n    }\n  }\n  for (let i = 0, l = arguments.length; i < l; i++) {\n    forEach(arguments[i], assignValue)\n  }\n  return result\n}\n"
  },
  {
    "path": "main.js",
    "content": "import Vue from \"vue\";\r\nimport App from \"./App\";\r\nimport * as filters from \"./utils/filters.js\"; // global filter\r\nimport uView from \"uview-ui\";\r\nimport store from \"./store\";\r\nimport config from '@/config/config';\r\nimport airBtn from \"@/components/m-airbtn/index.vue\";\r\nimport socketIO from './pages/mine/im/socket';\r\n/**\r\n * 仅在h5中显示唤醒app功能\r\n * 在h5页面手动挂载\r\n * \r\n */\r\n// #ifdef H5\r\nif (config.enableMiniBarStartUpApp) {\r\n  let btn = Vue.component(\"airBtn\", airBtn); //全局注册\r\n  document.body.appendChild(new btn().$mount().$el);\r\n}\r\n// #endif\r\n\r\n// 引入uView对小程序分享的mixin封装\r\nlet mpShare = require('uview-ui/libs/mixin/mpShare.js');\r\nVue.mixin(mpShare)\r\n\r\n/**\r\n * 全局filters\r\n */\r\n\r\nObject.keys(filters).forEach((key) => {\r\n  Vue.filter(key, filters[key]);\r\n});\r\n\r\n// 引入Vuex\r\nVue.prototype.$store = store;\r\n// Vue.prototype.socketIo = new socketIO();\r\nVue.use(uView);\r\nVue.config.productionTip = false;\r\n\r\n\r\n/**\r\n * 注意！\r\n * 此处将常用的颜色嵌入到原型链上面\r\n * 颜色使用驼峰命名对应 uni.scss中全局颜色变量名\r\n * 如需更换主题请修改此处以及uni.scss中的全局颜色\r\n */\r\n// 主题色\r\nVue.prototype.$mainColor = config.mainColor;\r\n// 高亮主题色\r\nVue.prototype.$lightColor = config.lightColor;\r\n// 辅助高亮颜色\r\nVue.prototype.$aiderLightColor = config.aiderLightColor;\r\n\r\n\r\nApp.mpType = \"app\";\r\n\r\nconst app = new Vue({\r\n  ...App,\r\n});\r\napp.$mount();\r\n"
  },
  {
    "path": "manifest.json",
    "content": "{\n    \"name\" : \"lilishop\",\n    \"appid\" : \"__UNI__ED807EA\",\n    \"description\" : \"\",\n    \"versionName\" : \"4.5.3\",\n    \"versionCode\" : 4000503,\n    \"transformPx\" : false,\n    \"app-plus\" : {\n        \"compatible\" : {\n            \"ignoreVersion\" : true //true表示忽略版本检查提示框，HBuilderX1.9.0及以上版本支持  \n        },\n        /* 5+App特有相关 */\n        \"usingComponents\" : true,\n        \"splashscreen\" : {\n            \"alwaysShowBeforeRender\" : true,\n            \"waiting\" : true,\n            \"autoclose\" : true,\n            \"delay\" : 0\n        },\n        \"modules\" : {\n            \"Payment\" : {},\n            \"Share\" : {},\n            \"Fingerprint\" : {},\n            \"FaceID\" : {},\n            \"Geolocation\" : {},\n            \"Maps\" : {},\n            \"OAuth\" : {}\n        },\n        \"error\" : {\n            /* 404错误页面*/\n            \"url\" : \"hybrid/html/error.html\"\n        },\n        /* 模块配置 */\n        \"distribute\" : {\n            /* 应用发布信息 */\n            \"android\" : {\n                /* android打包配置 */\n                \"permissions\" : [\n                    \"<uses-feature android:name=\\\"android.hardware.camera\\\"/>\",\n                    \"<uses-feature android:name=\\\"android.hardware.camera.autofocus\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.ACCESS_COARSE_LOCATION\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.ACCESS_FINE_LOCATION\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.ACCESS_NETWORK_STATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.ACCESS_WIFI_STATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.CALL_PHONE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.CAMERA\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.CHANGE_NETWORK_STATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.CHANGE_WIFI_STATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.FLASHLIGHT\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.GET_ACCOUNTS\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.INSTALL_PACKAGES\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.INTERNET\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.MODIFY_AUDIO_SETTINGS\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.READ_LOGS\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.READ_PHONE_STATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.RECORD_AUDIO\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.USE_FINGERPRINT\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.VIBRATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.WAKE_LOCK\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.WRITE_CONTACTS\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.WRITE_SETTINGS\\\"/>\"\n                ],\n                \"abiFilters\" : [ \"armeabi-v7a\", \"arm64-v8a\", \"x86\" ],\n                \"schemes\" : \"lilishop\",\n                //安卓自添加 权限  应用市场 过度索取权限\n                \"permissionExternalStorage\" : {\n                    \"request\" : \"none\",\n                    \"prompt\" : \"应用保存运行状态等信息，需要获取读写手机存储（系统提示为访问设备上的照片、媒体内容和文件）权限，请允许。\"\n                },\n                \"permissionPhoneState\" : {\n                    \"request\" : \"none\",\n                    \"prompt\" : \"为保证您正常、安全地使用，需要获取设备识别码（部分手机提示为获取手机号码）使用权限，请允许\"\n                },\n                \"autoSdkPermissions\" : false\n            },\n            //安卓自添加 权限  应用市场 过度索取权限\n            \"ios\" : {\n                \"idfa\" : false,\n                \"privacyDescription\" : {\n                    \"NSPhotoLibraryUsageDescription\" : \"需要用与评论上传，头像上传功能\",\n                    \"NSPhotoLibraryAddUsageDescription\" : \"保存商品图片到本地\",\n                    \"NSFaceIDUsageDescription\" : \"使用面部识别进行登录\",\n                    \"NSCameraUsageDescription\" : \"需要用与扫描二维码和商品评论图片拍摄\",\n                    \"NSLocationAlwaysAndWhenInUseUsageDescription\" : \"位置信息将用于高德地图的效果展示\",\n                    \"NSMicrophoneUsageDescription\" : \"用户上传视频时需使用音频信息\"\n                },\n                \"urltypes\" : \"lilishop\",\n                \"dSYMs\" : false\n            },\n            /* ios打包配置 */\n            \"sdkConfigs\" : {\n                \"payment\" : {\n                    \"weixin\" : {\n                        \"__platform__\" : [ \"ios\", \"android\" ],\n                        \"appid\" : \"wx32788b91bdb614c0\",\n                        \"UniversalLinks\" : \"https://m-b2b2c.pickmall.cn/app/\"\n                    },\n                    \"alipay\" : {\n                        \"__platform__\" : [ \"ios\", \"android\" ]\n                    }\n                },\n                \"ad\" : {},\n                \"share\" : {\n                    \"weixin\" : {\n                        \"appid\" : \"wx32788b91bdb614c0\",\n                        \"UniversalLinks\" : \"https://m-b2b2c.pickmall.cn/app/\"\n                    }\n                },\n                \"oauth\" : {\n                    \"weixin\" : {\n                        \"appid\" : \"wx32788b91bdb614c0\",\n                        \"appsecret\" : \"230233cef7520ee935bbecad372a370e\",\n                        \"UniversalLinks\" : \"https://m-b2b2c.pickmall.cn/app/\"\n                    },\n                    \"apple\" : {},\n                    \"qq\" : {\n                        \"appid\" : \"101918503\"\n                    }\n                },\n                \"geolocation\" : {\n                    \"amap\" : {\n                        \"__platform__\" : [ \"ios\", \"android\" ],\n                        \"appkey_ios\" : \"48e85877d7d8877661aeb7392c54deff\",\n                        \"appkey_android\" : \"fb3f1ccb34616c70f068aa950f3e27df\"\n                    }\n                },\n                \"maps\" : {\n                    \"amap\" : {\n                        \"appkey_ios\" : \"48e85877d7d8877661aeb7392c54deff\",\n                        \"appkey_android\" : \"fb3f1ccb34616c70f068aa950f3e27df\"\n                    }\n                },\n                \"push\" : {}\n            },\n            \"icons\" : {\n                \"android\" : {\n                    \"hdpi\" : \"unpackage/res/icons/72x72.png\",\n                    \"xhdpi\" : \"unpackage/res/icons/96x96.png\",\n                    \"xxhdpi\" : \"unpackage/res/icons/144x144.png\",\n                    \"xxxhdpi\" : \"unpackage/res/icons/192x192.png\"\n                },\n                \"ios\" : {\n                    \"appstore\" : \"unpackage/res/icons/1024x1024.png\",\n                    \"ipad\" : {\n                        \"app\" : \"unpackage/res/icons/76x76.png\",\n                        \"app@2x\" : \"unpackage/res/icons/152x152.png\",\n                        \"notification\" : \"unpackage/res/icons/20x20.png\",\n                        \"notification@2x\" : \"unpackage/res/icons/40x40.png\",\n                        \"proapp@2x\" : \"unpackage/res/icons/167x167.png\",\n                        \"settings\" : \"unpackage/res/icons/29x29.png\",\n                        \"settings@2x\" : \"unpackage/res/icons/58x58.png\",\n                        \"spotlight\" : \"unpackage/res/icons/40x40.png\",\n                        \"spotlight@2x\" : \"unpackage/res/icons/80x80.png\"\n                    },\n                    \"iphone\" : {\n                        \"app@2x\" : \"unpackage/res/icons/120x120.png\",\n                        \"app@3x\" : \"unpackage/res/icons/180x180.png\",\n                        \"notification@2x\" : \"unpackage/res/icons/40x40.png\",\n                        \"notification@3x\" : \"unpackage/res/icons/60x60.png\",\n                        \"settings@2x\" : \"unpackage/res/icons/58x58.png\",\n                        \"settings@3x\" : \"unpackage/res/icons/87x87.png\",\n                        \"spotlight@2x\" : \"unpackage/res/icons/80x80.png\",\n                        \"spotlight@3x\" : \"unpackage/res/icons/120x120.png\"\n                    }\n                }\n            },\n            \"splashscreen\" : {\n                \"iosStyle\" : \"common\",\n                \"ios\" : {\n                    \"storyboard\" : \"CustomStoryboard.zip\"\n                },\n                \"androidStyle\" : \"default\",\n                \"android\" : {\n                    \"hdpi\" : \"CustomStartPage/start-page.9.png\",\n                    \"xhdpi\" : \"CustomStartPage/start-page.9.png\",\n                    \"xxhdpi\" : \"CustomStartPage/start-page.9.png\"\n                }\n            }\n        }\n    },\n    \"permission\" : {\n        \"scope.userLocation\" : {\n            \"desc\" : \"你的位置信息将用于高德地图的效果展示\"\n        }\n    },\n    /* SDK配置 */\n    \"quickapp\" : {},\n    /* 快应用特有相关 */\n    \"mp-weixin\" : {\n        /* 小程序特有相关 */\n        \"usingComponents\" : true,\n        \"appid\" : \"wx6f10f29075dc1b0b\",\n        \"optimization\" : {\n            \"subPackages\" : true\n        },\n        \"setting\" : {\n            \"urlCheck\" : false,\n            \"minified\" : true,\n            \"postcss\" : false,\n            \"es6\" : true\n        },\n        \"permission\" : {\n            \"scope.userLocation\" : {\n                \"desc\" : \"位置信息将用于高德地图的效果展示\"\n            },\n            \"scope.writePhotosAlbum\" : {\n                \"desc\" : \"将用于保存图片\"\n            }\n        },\n        \"plugins\" : {},\n        // 直播插件注释\n        // \"live-player-plugin\" : {\n        //     \"version\" : \"1.3.0\",\n        //     \"provider\" : \"wx2b03c6e691cd7370\"\n        // }\n        \"requiredPrivateInfos\" : [ \"chooseLocation\", \"getLocation\" ]\n    },\n    \"h5\" : {\n        \"devServer\" : {\n            \"disableHostCheck\" : true\n        },\n        \"router\" : {\n            \"mode\" : \"history\",\n            \"base\" : \"\"\n        },\n        \"sdkConfigs\" : {\n            \"maps\" : {}\n        },\n        \"optimization\" : {\n            \"treeShaking\" : {\n                \"enable\" : true\n            }\n        },\n        \"title\" : \"lilishop\",\n        \"template\" : \"\"\n    }\n}\n"
  },
  {
    "path": "pages/cart/coupon/couponCenter.vue",
    "content": "<template>\r\n\t<view class=\"coupon-center\">\r\n\t\t<div class=\"swiper-box\">\r\n\t\t\t<div class=\"swiper-item\">\r\n\t\t\t\t<div class=\"scroll-v\" enableBackToTop=\"true\" scroll-y>\r\n\t\t\t\t\t<u-empty mode=\"coupon\" style='margin-top: 20%;' text=\"没有优惠券了\" v-if=\"whetherEmpty\"></u-empty>\r\n\t\t\t\t\t<view v-else class=\"coupon-item\" v-for=\"(item, index) in couponList\" :key=\"index\">\r\n\t\t\t\t\t\t<view class=\"left\">\r\n\t\t\t\t\t\t\t<view class=\"wave-line\">\r\n\t\t\t\t\t\t\t\t<view class=\"wave\" v-for=\"(item, index) in 12\" :key=\"index\"></view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"message\">\r\n\t\t\t\t\t\t\t\t<view>\r\n\t\t\t\t\t\t\t\t\t<!--判断当前优惠券类型  couponType  PRICE || DISCOUNT -->\r\n\t\t\t\t\t\t\t\t\t<span v-if=\"item.couponType == 'DISCOUNT'\">{{ item.couponDiscount }}折</span>\r\n\t\t\t\t\t\t\t\t\t<span v-else>{{ item.price }}元</span>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view>满{{ item.consumeThreshold | unitPrice }}元可用</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"circle circle-top\"></view>\r\n\t\t\t\t\t\t\t<view class=\"circle circle-bottom\"></view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<view class=\"right\">\r\n\t\t\t\t\t\t\t<view>\r\n\t\t\t\t\t\t\t\t<!-- 根据scopeType 判断是否是 平台、品类或店铺  -->\r\n\t\t\t\t\t\t\t\t<view class=\"coupon-title wes-3\" v-if=\"item.scopeType\">\r\n\t\t\t\t\t\t\t\t\t<span v-if=\"item.scopeType == 'ALL' && item.storeId == '0'\">全平台</span>\r\n\t\t\t\t\t\t\t\t\t<span v-if=\"item.scopeType == 'PORTION_GOODS_CATEGORY'\">仅限品类</span>\r\n\t\t\t\t\t\t\t\t\t<view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view v-if=\"item.endTime\">有效期至：{{ item.endTime.split(\" \")[0] }}</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"receive\" @click=\"receive(item)\">\r\n\t\t\t\t\t\t\t\t<text>点击</text><br />\r\n\t\t\t\t\t\t\t\t<text>领取</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"bg-quan\"> 券 </view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\treceiveCoupons\r\n\t} from \"@/api/members.js\";\r\n\timport {\r\n\t\tgetAllCoupons\r\n\t} from \"@/api/promotions.js\";\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tloadStatus: \"more\", //下拉状态\r\n\t\t\t\twhetherEmpty: false, //是否为空\r\n\t\t\t\tcouponList: [], // 优惠券列表\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t},\r\n\t\t\t\tstoreId: \"\", //店铺 id,\r\n\t\t\t\tcouponData: \"\"\r\n\t\t\t};\r\n\t\t},\r\n\t\tonLoad(option) {\r\n\t\t\tthis.storeId = option.storeId;\r\n\t\t\tthis.getCoupon();\r\n\t\t},\r\n\t\tonReachBottom() {\r\n\r\n\t\t\tthis.loadMore()\r\n\t\t},\r\n\t\tonPullDownRefresh() {\r\n\t\t\t//下拉刷新\r\n\t\t\tthis.params.pageNumber = 1;\r\n\t\t\tthis.couponList = [];\r\n\t\t\tthis.getCoupon();\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t/**\r\n\t\t\t * 获取当前优惠券\r\n\t\t\t */\r\n\t\t\tgetCoupon() {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"加载中\",\r\n\t\t\t\t});\r\n\t\t\t\tlet submitData = {\r\n\t\t\t\t\t...this.params\r\n\t\t\t\t};\r\n\t\t\t\t// 判断当前是否有店铺\r\n\t\t\t\tthis.storeId ? (submitData = {\r\n\t\t\t\t\t\t...this.params,\r\n\t\t\t\t\t\tstoreId: this.storeId\r\n\t\t\t\t\t}) : \"\",\r\n\t\t\t\t\tgetAllCoupons(submitData)\r\n\t\t\t\t\t.then((res) => {\r\n\t\t\t\t\t\tif (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\t\tuni.stopPullDownRefresh();\r\n\t\t\t\t\t\tif (res.data.code == 200) {\r\n\t\t\t\t\t\t\t// 如果请求成功，展示数据并进行展示\r\n\t\t\t\t\t\t\tthis.couponData = res.data.result\r\n\t\t\t\t\t\t\tif (this.couponData.total == 0) {\r\n\t\t\t\t\t\t\t\t// 当本次请求数据为空展示空信息\r\n\t\t\t\t\t\t\t\tthis.whetherEmpty = true;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tthis.couponList.push(...this.couponData.records);\r\n\t\t\t\t\t\t\t\tthis.loadStatus = \"noMore\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * 领取优惠券\r\n\t\t\t */\r\n\t\t\treceive(val) {\r\n\t\t\t\tthis.$u.throttle(()=>{\r\n\t\t\t\t\tthis.fetchCoupon(val)\r\n\t\t\t\t}, 1500)\r\n\t\t\t\t\r\n\t\t\t},\r\n\r\n\t\t\tfetchCoupon(val){\r\n\t\t\t\treceiveCoupons(val.id).then((res) => {\r\n\t\t\t\t\tif (res.data.code == 200) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"领取成功\",\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: res.data.message,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 加载更多\r\n\t\t\t */\r\n\t\t\tloadMore() {\r\n\t\t\t\tif (this.couponData.total > this.params.pageNumber * this.params.pageSize) {\r\n\t\t\t\t\tthis.params.pageNumber++;\r\n\t\t\t\t\tthis.getCoupon();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t\tonNavigationBarButtonTap(e) {\r\n\t\t\tuni.navigateTo({\r\n\t\t\t\turl: \"/pages/cart/coupon/couponIntro\",\r\n\t\t\t});\r\n\t\t},\r\n\t};\r\n</script>\r\n<style>\r\n\tpage {\r\n\t\theight: 100%;\r\n\t}\r\n</style>\r\n<style lang=\"scss\" scoped>\r\n\t.coupon-center {\r\n\t\theight: 100%;\r\n\r\n\t\t.swiper-box {\r\n\t\t\t.coupon-item {\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\theight: 220rpx;\r\n\t\t\t\tmargin: 20rpx;\r\n\r\n\t\t\t\t.left {\r\n\t\t\t\t\theight: 100%;\r\n\t\t\t\t\twidth: 260rpx;\r\n\t\t\t\t\tbackground-color: $light-color;\r\n\t\t\t\t\tposition: relative;\r\n\r\n\t\t\t\t\t.message {\r\n\t\t\t\t\t\tcolor: $font-color-white;\r\n\t\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\t\tjustify-content: center;\r\n\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\tflex-direction: column;\r\n\t\t\t\t\t\tmargin-top: 40rpx;\r\n\r\n\t\t\t\t\t\tview:nth-child(1) {\r\n\t\t\t\t\t\t\tfont-weight: bold;\r\n\t\t\t\t\t\t\tfont-size: 60rpx;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tview:nth-child(2) {\r\n\t\t\t\t\t\t\tfont-size: $font-sm;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t.wave-line {\r\n\t\t\t\t\t\theight: 220rpx;\r\n\t\t\t\t\t\twidth: 8rpx;\r\n\t\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\t\ttop: 0;\r\n\t\t\t\t\t\tleft: 0;\r\n\t\t\t\t\t\tbackground-color: $light-color;\r\n\t\t\t\t\t\toverflow: hidden;\r\n\r\n\t\t\t\t\t\t.wave {\r\n\t\t\t\t\t\t\twidth: 8rpx;\r\n\t\t\t\t\t\t\theight: 16rpx;\r\n\t\t\t\t\t\t\tbackground-color: #ffffff;\r\n\t\t\t\t\t\t\tborder-radius: 0 16rpx 16rpx 0;\r\n\t\t\t\t\t\t\tmargin-top: 4rpx;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t.circle {\r\n\t\t\t\t\t\twidth: 40rpx;\r\n\t\t\t\t\t\theight: 40rpx;\r\n\t\t\t\t\t\tbackground-color: $bg-color;\r\n\t\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\t\tborder-radius: 50%;\r\n\t\t\t\t\t\tz-index: 111;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t.circle-top {\r\n\t\t\t\t\t\ttop: -20rpx;\r\n\t\t\t\t\t\tright: -20rpx;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t.circle-bottom {\r\n\t\t\t\t\t\tbottom: -20rpx;\r\n\t\t\t\t\t\tright: -20rpx;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t.right {\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\tjustify-content: space-between;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\twidth: 450rpx;\r\n\t\t\t\t\tfont-size: $font-sm;\r\n\t\t\t\t\theight: 100%;\r\n\t\t\t\t\tbackground-color: #ffffff;\r\n\t\t\t\t\toverflow: hidden;\r\n\t\t\t\t\tposition: relative;\r\n\r\n\t\t\t\t\t>view:nth-child(1) {\r\n\t\t\t\t\t\tcolor: #666666;\r\n\t\t\t\t\t\tmargin-left: 20rpx;\r\n\t\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\t\theight: 100%;\r\n\t\t\t\t\t\tflex-direction: column;\r\n\t\t\t\t\t\tjustify-content: space-around;\r\n\r\n\t\t\t\t\t\t>view:nth-child(1) {\r\n\t\t\t\t\t\t\tcolor: #ff6262;\r\n\t\t\t\t\t\t\tfont-size: 30rpx;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t.receive {\r\n\t\t\t\t\t\tcolor: #ffffff;\r\n\t\t\t\t\t\tbackground-color: $main-color;\r\n\t\t\t\t\t\tborder-radius: 50%;\r\n\t\t\t\t\t\twidth: 86rpx;\r\n\t\t\t\t\t\theight: 86rpx;\r\n\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\tmargin-right: 30rpx;\r\n\t\t\t\t\t\tvertical-align: middle;\r\n\t\t\t\t\t\tpadding-top: 8rpx;\r\n\t\t\t\t\t\tposition: relative;\r\n\t\t\t\t\t\tz-index: 2;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t.bg-quan {\r\n\t\t\t\t\t\twidth: 244rpx;\r\n\t\t\t\t\t\theight: 244rpx;\r\n\t\t\t\t\t\tborder: 6rpx solid $main-color;\r\n\t\t\t\t\t\tborder-radius: 50%;\r\n\t\t\t\t\t\topacity: 0.1;\r\n\t\t\t\t\t\tcolor: $main-color;\r\n\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\tpadding-top: 30rpx;\r\n\t\t\t\t\t\tfont-size: 130rpx;\r\n\t\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\t\tright: -54rpx;\r\n\t\t\t\t\t\tbottom: -60rpx;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t.coupon-title {\r\n\t\twidth: 260rpx;\r\n\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/cart/coupon/couponDetail.vue",
    "content": "<template>\n  <view class=\"content\">\n    <view class=\"body\">\n      <view class=\"top-view\">\n        <view class=\"title\">{{coupon.title}}</view>\n        <view class=\"price\" v-if=\"coupon.couponType =='PRICE'\"><text>￥</text>{{coupon.price | unitPrice}}</view>\n        <view class=\"price\" v-if=\"coupon.couponType =='DISCOUNT'\">{{coupon.discount}}折</view>\n        <view class=\"text\">满{{coupon.consumeThreshold}}元可用</view>\n        <view class=\"bg-quan\">\n          券\n        </view>\n        <view class=\"jiao-1\" :class=\"{'used-color':coupon.used_status!=0}\">\n          <text class=\"text-1\">{{coupon.used_status == 0?'新到':coupon.used_status_text}}</text>\n        </view>\n      </view>\n      <view class=\"bottom-view\">\n        <view class=\"text\">• 使用范围：{{\n                    coupon.scopeType == 'ALL' && coupon.storeId == '0'\n                      ? \"全平台\"\n                      : coupon.scopeType == \"PORTION_GOODS\"\n                      ? \"部分商品\"\n\t\t\t\t\t  : coupon.scopeType == \"PORTION_GOODS_CATEGORY\"\n\t\t\t\t\t  ? \"部分分类商品\"\n                      : coupon.storeName == 'platform' ? '全平台' :coupon.storeName+''\n                  }}使用</view>\n        <view class=\"text\">• 有效期至：{{coupon.endTime}}</view>\n\n      </view>\n\n    </view>\n  </view>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      coupon: {}, //优惠券数据\n    };\n  },\n  onLoad(option) {\n    this.coupon = JSON.parse(decodeURIComponent(option.item));\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage,\n.content {\n  // background: $main-color;\n  height: 100%;\n}\n.body {\n  .top-view {\n    margin: 20rpx 20rpx 0;\n    height: 290rpx;\n    background: linear-gradient(\n      316deg,\n      $light-color 2%,\n      $aider-light-color 98%\n    );\n    position: relative;\n    overflow: hidden;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    align-items: center;\n    border-radius: 20rpx;\n    padding: 60rpx 0;\n    .title {\n      font-size: 30rpx;\n      color: #ffee80;\n    }\n    .price {\n      font-size: 60rpx;\n      font-weight: 600;\n      color: #ffffff;\n      text {\n        font-size: 30rpx;\n      }\n    }\n    .text {\n      font-size: 24rpx;\n      color: #ffffff;\n    }\n    .bg-quan {\n      width: 244rpx;\n      height: 244rpx;\n      border: 6rpx solid #ffffff;\n      border-radius: 50%;\n      opacity: 0.3;\n      color: #ffffff;\n      text-align: center;\n      padding-top: 30rpx;\n      font-size: 130rpx;\n      position: absolute;\n      right: -54rpx;\n      bottom: -54rpx;\n    }\n\n    .jiao-1 {\n      background-color: #ffc71c;\n      width: 400rpx;\n      transform: rotate(45deg);\n      text-align: center;\n      position: absolute;\n      right: -130rpx;\n      color: #ffffff;\n      top: 0;\n      .text-1 {\n        margin-left: 68rpx;\n        font-size: 28rpx;\n      }\n    }\n    .used-color {\n      background-color: #ffc71c;\n    }\n  }\n  .bottom-view {\n    border-radius: 0 0 20rpx 20rpx;\n    background-color: #ffffff;\n    height: 580rpx;\n    padding: 50rpx 50rpx;\n    margin: 0 30rpx;\n    line-height: 2em;\n    color: #999;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/cart/coupon/index.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <u-tabs\n      :list=\"list\"\n      :is-scroll=\"false\"\n      :active-color=\"lightColor\"\n      :current=\"current\"\n      @change=\"\n        (i) => {\n          current = i;\n        }\n      \"\n    >\n    </u-tabs>\n\n    <div class=\"empty\" v-if=\"couponsList.length <= 0\">\n      <u-empty text=\"暂无优惠券\" mode=\"coupon\"></u-empty>\n    </div>\n    <view class=\"coupon-item\" v-for=\"(item, index) in couponsList\" :key=\"index\">\n      <view class=\"left\">\n        <view class=\"wave-line\">\n          <view class=\"wave\" v-for=\"(item, index) in 12\" :key=\"index\"></view>\n        </view>\n        <view class=\"message\">\n          <view>\n            <span v-if=\"item.couponType == 'DISCOUNT'\">{{ item.discount }}折</span>\n            <span v-else>{{ item.price }}元</span>\n          </view>\n          <view>满{{ item.consumeThreshold | unitPrice }}元可用</view>\n        </view>\n        <view class=\"circle circle-top\"></view>\n        <view class=\"circle circle-bottom\"></view>\n      </view>\n      <view class=\"right\">\n        <view class=\"desc\">\n          <view v-if=\"item.scopeType\">\n            <span v-if=\"item.scopeType == 'ALL' && item.storeId == '0'\">全平台</span>\n            <span v-if=\"item.scopeType == 'PORTION_GOODS_CATEGORY'\">仅限品类</span>\n            <view v-else\n              >{{\n                item.storeName == \"platform\" ? \"全平台\" : item.storeName + \"店铺\"\n              }}使用</view\n            >\n          </view>\n          <view class=\"reason\" v-if=\"item.reason\">{{ item.reason }}</view>\n          <view class=\"end-time\">有效期至:{{ item.endTime }}</view>\n        </view>\n        <view\n          class=\"receive\"\n          v-if=\"current == 0 && !routerVal.selectedCoupon.includes(item.id)\"\n          @click=\"clickWay(item)\"\n        >\n          <text>立即</text><br />\n          <text>使用</text>\n        </view>\n        <view class=\"used\" v-if=\"current == 0 && routerVal.selectedCoupon.includes(item.id)\" @click=\"clickWay(item)\">\n          <text>取消</text><br />\n          <text>使用</text>\n        </view>\n        <view class=\"bg-quan\">券</view>\n      </view>\n    </view>\n  </div>\n</template>\n<script>\nimport { useCoupon } from \"@/api/trade.js\";\n\nexport default {\n  data() {\n    return {\n      lightColor: this.$lightColor,\n      current: 0,\n      list: [\n        {\n          name: \"可用优惠券\",\n        },\n        {\n          name: \"不可用优惠券\",\n        },\n      ],\n      couponsList: [], //优惠券集合\n      params: {\n        //传参\n        memberCouponStatus: \"NEW\", //优惠券状态\n        pageNumber: 1,\n        pageSize: 10,\n        scopeId: \"\", //商品skuid\n        storeId: \"\", //店铺id\n        totalPrice: \"\", //价格\n      },\n      routerVal: \"\", //上级传参\n    };\n  },\n  onLoad(options) {\n    this.routerVal = options;\n  },\n  watch: {\n    current(val) {\n      console.log(this.$store.state.cantUseCoupons);\n      val == 0\n        ? (this.couponsList = this.$store.state.canUseCoupons)\n        : (this.couponsList = this.$store.state.cantUseCoupons);\n    },\n  },\n\n  mounted() {\n    this.init();\n    console.log(this.routerVal);\n  },\n\n  methods: {\n    /**\n     * 从vuex中拿取优惠券信息\n     */\n    init() {\n      this.couponsList = this.$store.state.canUseCoupons;\n    },\n    /**\n     * 领取优惠券\n     */\n    clickWay(coupon) {\n      useCoupon({\n        memberCouponId: coupon.id,\n        used: !this.routerVal.selectedCoupon.includes(coupon.id),\n        way: this.routerVal.way,\n      }).then((res) => {\n        if (res.data.success) {\n          uni.navigateBack();\n        } else {\n          uni.showToast({\n            title: res.data.message,\n            duration: 2000,\n            icon: \"none\",\n          });\n        }\n      });\n    },\n  },\n};\n</script>\n<style scoped lang=\"scss\">\n.desc {\n  height: 220rpx;\n  flex: 2;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-around;\n}\n.end-time,\n.reason {\n  color: #999;\n  line-height: 1.5;\n  font-size: 24rpx;\n}\n\n.empty {\n  margin-top: 20px;\n  text-align: center;\n}\n.wrapper {\n  background: #f9f9f9;\n  overflow: hidden;\n}\n.coupon-item {\n  display: flex;\n  align-items: center;\n  height: 220rpx;\n  margin: 20rpx;\n\n  .left {\n    height: 100%;\n    width: 260rpx;\n    background-color: $light-color;\n    position: relative;\n    .message {\n      color: $font-color-white;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-direction: column;\n      margin-top: 40rpx;\n\n      view:nth-child(1) {\n        font-weight: bold;\n        font-size: 60rpx;\n      }\n\n      view:nth-child(2) {\n        font-size: $font-sm;\n      }\n    }\n\n    .wave-line {\n      height: 220rpx;\n      width: 8rpx;\n      position: absolute;\n      top: 0;\n      left: 0;\n      background-color: $light-color;\n      overflow: hidden;\n\n      .wave {\n        width: 8rpx;\n        height: 16rpx;\n        background-color: #ffffff;\n        border-radius: 0 16rpx 16rpx 0;\n        margin-top: 4rpx;\n      }\n    }\n    .circle {\n      width: 40rpx;\n      height: 40rpx;\n      background-color: $bg-color;\n      position: absolute;\n      border-radius: 50%;\n      z-index: 111;\n    }\n    .circle-top {\n      top: -20rpx;\n      right: -20rpx;\n    }\n    .circle-bottom {\n      bottom: -20rpx;\n      right: -20rpx;\n    }\n  }\n\n  .right {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    width: 450rpx;\n    font-size: $font-sm;\n    height: 220rpx;\n    background-color: #ffffff;\n    overflow: hidden;\n    position: relative;\n    > view:nth-child(1) {\n      color: #666666;\n      margin-left: 20rpx;\n\n      > view:nth-child(1) {\n        color: #ff6262;\n        font-size: 30rpx;\n      }\n    }\n\n    .receive {\n      color: #ffffff;\n      background-color: $main-color;\n      border-radius: 50%;\n      width: 86rpx;\n      height: 86rpx;\n      text-align: center;\n      margin-right: 30rpx;\n      vertical-align: middle;\n      padding-top: 8rpx;\n      position: relative;\n      z-index: 2;\n    }\n\n    .used {\n      color: #ffffff;\n      background-color: black;\n      border-radius: 50%;\n      width: 86rpx;\n      height: 86rpx;\n      text-align: center;\n      margin-right: 30rpx;\n      vertical-align: middle;\n      padding-top: 8rpx;\n      position: relative;\n      z-index: 2;\n    }\n\n    .bg-quan {\n      width: 244rpx;\n      height: 244rpx;\n      border: 6rpx solid $main-color;\n      border-radius: 50%;\n      opacity: 0.1;\n      color: $main-color;\n      text-align: center;\n      padding-top: 30rpx;\n      font-size: 130rpx;\n      position: absolute;\n      right: -54rpx;\n      bottom: -60rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/cart/coupon/myCoupon.vue",
    "content": "<template>\r\n  <view class=\"b-content\">\r\n    <view class=\"navbar\">\r\n      <!-- 循环出头部tab栏 -->\r\n      <view\r\n        v-for=\"(item, index) in navList\"\r\n        :key=\"index\"\r\n        class=\"nav-item\"\r\n        @click=\"handleTabClick(index)\"\r\n        ><text :class=\"{ current: tabCurrentIndex === index }\">{{\r\n          item.text\r\n        }}</text></view\r\n      >\r\n    </view>\r\n    <swiper\r\n      :current=\"tabCurrentIndex\"\r\n      class=\"swiper-box\"\r\n      duration=\"300\"\r\n      @change=\"changeTab\"\r\n    >\r\n      <swiper-item\r\n        class=\"tab-content\"\r\n        v-for=\"(navItem, navIndex) in navList\"\r\n        :key=\"navIndex\"\r\n      >\r\n        <scroll-view\r\n          class=\"list-scroll-content\"\r\n          scroll-y\r\n          @scrolltolower=\"loadData\"\r\n        >\r\n          <!-- 空白页 -->\r\n          <u-empty\r\n            mode=\"coupon\"\r\n            text=\"暂无优惠券了\"\r\n            v-if=\"navItem.whetherEmpty\"\r\n          ></u-empty>\r\n\r\n          <!-- 数据 -->\r\n          <view\r\n            v-if=\"navItem.dataList && coupon\"\r\n            class=\"coupon-item\"\r\n            :class=\"{ 'coupon-used': navIndex != 0 }\"\r\n            v-for=\"(coupon, index) in navItem.dataList\"\r\n            :key=\"index\"\r\n          >\r\n            <view class=\"left\">\r\n              <view class=\"wave-line\">\r\n                <view\r\n                  class=\"wave\"\r\n                  v-for=\"(item, index) in 12\"\r\n                  :key=\"index\"\r\n                ></view>\r\n              </view>\r\n              <view class=\"message\">\r\n                <view class=\"price\" v-if=\"coupon.couponType == 'DISCOUNT'\"\r\n                  >{{ coupon.discount }}折</view\r\n                >\r\n                <view class=\"price\" v-else>{{ coupon.price }}元</view>\r\n                <view class=\"sub-price\"\r\n                  >满{{ coupon.consumeThreshold | unitPrice }}可用</view\r\n                >\r\n              </view>\r\n              <view class=\"circle circle-top\"></view>\r\n              <view class=\"circle circle-bottom\"></view>\r\n            </view>\r\n            <view class=\"right\" v-if=\"coupon\">\r\n              <view class=\"content\">\r\n                <view class=\"title-1\">{{ coupon.title }}</view>\r\n                <view class=\"title-2\"\r\n                  >使用范围：{{\r\n                    coupon.scopeType == \"ALL\" && coupon.storeId == \"0\"\r\n                      ? \"全平台\"\r\n                      : coupon.scopeType == \"PORTION_GOODS\"\r\n                      ? \"部分商品\"\r\n\t\t\t\t\t  : coupon.scopeType == \"PORTION_GOODS_CATEGORY\"\r\n\t\t\t\t\t  ? \"部分分类商品\"\r\n                      : coupon.storeName == \"platform\"\r\n                      ? \"全平台\"\r\n                      : coupon.storeName + \"\"\r\n                  }}使用</view\r\n                >\r\n                <view v-if=\"coupon.endTime\">{{ coupon.endTime }}</view>\r\n                <view @click=\"couponDetail(coupon)\"\r\n                  >详细说明\r\n                  <u-icon\r\n                    style=\"float: right; margin-top: 10rpx\"\r\n                    name=\"arrow-right\"\r\n                  ></u-icon>\r\n                </view>\r\n              </view>\r\n              <view class=\"jiao-1\" v-if=\"navIndex == 0\">\r\n                <text class=\"text-1\">新到</text>\r\n                <text class=\"text-2\" v-if=\"coupon.used_status == 1\"\r\n                  >将过期</text\r\n                >\r\n              </view>\r\n              <image\r\n                class=\"no-icon\"\r\n                v-if=\"navIndex == 1\"\r\n                src=\"@/static/img/used.png\"\r\n              ></image>\r\n              <image\r\n                class=\"no-icon\"\r\n                v-if=\"navIndex == 2\"\r\n                src=\"@/static/img/overdue.png\"\r\n              ></image>\r\n              <view\r\n                class=\"receive\"\r\n                v-if=\"navIndex == 0\"\r\n                @click=\"useItNow(coupon)\"\r\n              >\r\n                <text>立即</text><br />\r\n                <text>使用</text>\r\n              </view>\r\n              <view class=\"bg-quan\"> 券 </view>\r\n            </view>\r\n          </view>\r\n          <uni-load-more :status=\"navItem.loadStatus\"></uni-load-more>\r\n        </scroll-view>\r\n      </swiper-item>\r\n    </swiper>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getMemberCoupons } from \"@/api/members.js\";\r\n\r\nexport default {\r\n  data() {\r\n    return {\r\n      tabCurrentIndex: 0, //tab栏下标默认为0 未使用\r\n      navList: [\r\n        //每个tab存储的信息\r\n        {\r\n          text: \"未使用\",\r\n          loadStatus: \"more\",\r\n          dataList: [],\r\n          params: {\r\n            memberCouponStatus: \"NEW\",\r\n            pageNumber: 1,\r\n            pageSize: 10,\r\n            status: 1,\r\n          },\r\n          whetherEmpty: false,\r\n        },\r\n        {\r\n          text: \"已使用\",\r\n          loadStatus: \"more\",\r\n          dataList: [],\r\n          params: {\r\n            memberCouponStatus: \"USED\",\r\n            pageNumber: 1,\r\n            pageSize: 10,\r\n            status: 2,\r\n          },\r\n          whetherEmpty: false,\r\n        },\r\n        {\r\n          text: \"已过期\",\r\n          loadStatus: \"more\",\r\n          dataList: [],\r\n          params: {\r\n            memberCouponStatus: \"EXPIRE\",\r\n            pageNumber: 1,\r\n            pageSize: 10,\r\n            status: 3,\r\n          },\r\n          whetherEmpty: false,\r\n        },\r\n      ],\r\n      couponList: [], //优惠券列表\r\n    };\r\n  },\r\n\r\n  onShow() {\r\n    this.navList[this.tabCurrentIndex].params.pageNumber = 1;\r\n    this.navList[this.tabCurrentIndex].dataList = [];\r\n    this.getData();\r\n  },\r\n\r\n  watch: {\r\n    /**\r\n     * 监听切换顶部tab栏实现刷新数据\r\n     */\r\n    tabCurrentIndex(val) {\r\n      if (this.navList[val].dataList.length == 0) this.getData();\r\n    },\r\n  },\r\n  methods: {\r\n    /**\r\n     * 顶部tab点击\r\n     */\r\n    handleTabClick(index) {\r\n      this.tabCurrentIndex = index;\r\n    },\r\n\r\n    /**\r\n     * 读取优惠券\r\n     */\r\n    getData() {\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      let index = this.tabCurrentIndex;\r\n      getMemberCoupons(this.navList[index].params).then((res) => {\r\n        uni.stopPullDownRefresh();\r\n        if (res.data.success) {\r\n          let data = res.data.result.records;\r\n          if (data.length == 0) {\r\n            if (res.data.pageNumber == 1) {\r\n              this.navList[index].whetherEmpty = true;\r\n            } else {\r\n              this.navList[index].loadStatus = \"noMore\";\r\n            }\r\n          } else if (data.length < 10) {\r\n            this.navList[index].loadStatus = \"noMore\";\r\n            this.navList[index].dataList.push(...data);\r\n          } else {\r\n            this.navList[index].dataList.push(...data);\r\n          }\r\n        }\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 切换tab\r\n     */\r\n    changeTab(e) {\r\n      this.tabCurrentIndex = e.target.current;\r\n    },\r\n\r\n    /**\r\n     * 加载数据\r\n     */\r\n    loadData() {\r\n      let index = this.tabCurrentIndex;\r\n      if (this.navList[index].loadStatus != \"noMore\") {\r\n        this.navList[index].params.pageNumber++;\r\n        this.getData();\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 立即使用优惠券\r\n     */\r\n    useItNow(item) {\r\n      uni.navigateTo({\r\n        url: `/pages/navigation/search/searchPage?promotionsId=${item.couponId}&promotionType=COUPON`,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 优惠券详情\r\n     */\r\n    couponDetail(item) {\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/cart/coupon/couponDetail?item=\" +\r\n          encodeURIComponent(JSON.stringify(item)),\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\npage {\r\n  height: 100%;\r\n}\r\n$item-color: #fff;\r\n\r\n.b-content {\r\n  background: $page-color-base;\r\n  height: 100%;\r\n}\r\n\r\n.swiper-box {\r\n  height: calc(100vh - 40px);\r\n}\r\n\r\n.list-scroll-content {\r\n  height: 100%;\r\n  width: 100%;\r\n\r\n  .coupon-item {\r\n    display: flex;\r\n    align-items: center;\r\n    height: 220rpx;\r\n    margin: 20rpx;\r\n\r\n    .left {\r\n      height: 100%;\r\n      width: 260rpx;\r\n      background-color: $light-color;\r\n      position: relative;\r\n\r\n      .message {\r\n        color: $font-color-white;\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        flex-direction: column;\r\n        margin-top: 40rpx;\r\n\r\n        view:nth-child(1) {\r\n          font-weight: bold;\r\n          font-size: 60rpx;\r\n        }\r\n\r\n        view:nth-child(2) {\r\n          font-size: $font-sm;\r\n        }\r\n      }\r\n\r\n      .wave-line {\r\n        height: 220rpx;\r\n        width: 8rpx;\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        background-color: $light-color;\r\n        overflow: hidden;\r\n\r\n        .wave {\r\n          width: 8rpx;\r\n          height: 16rpx;\r\n          background-color: #ffffff;\r\n          border-radius: 0 16rpx 16rpx 0;\r\n          margin-top: 4rpx;\r\n        }\r\n      }\r\n\r\n      .circle {\r\n        width: 40rpx;\r\n        height: 40rpx;\r\n        background-color: $bg-color;\r\n        position: absolute;\r\n        border-radius: 50%;\r\n        z-index: 111;\r\n      }\r\n\r\n      .circle-top {\r\n        top: -20rpx;\r\n        right: -20rpx;\r\n      }\r\n\r\n      .circle-bottom {\r\n        bottom: -20rpx;\r\n        right: -20rpx;\r\n      }\r\n    }\r\n\r\n    .right {\r\n      display: flex;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      width: 450rpx;\r\n      font-size: $font-sm;\r\n      height: 100%;\r\n      background-color: #ffffff;\r\n      overflow: hidden;\r\n      position: relative;\r\n\r\n      .content {\r\n        color: #666666;\r\n        margin-left: 20rpx;\r\n        line-height: 2em;\r\n        > view:nth-child(1) {\r\n          color: #ff6262;\r\n          font-size: 30rpx;\r\n        }\r\n\r\n        .title-1,\r\n        .title-2,\r\n        .title-3 {\r\n          font-size: 25rpx;\r\n        }\r\n      }\r\n      .receive {\r\n        color: #ffffff;\r\n        background-color: $main-color;\r\n        border-radius: 50%;\r\n        width: 86rpx;\r\n        height: 86rpx;\r\n        text-align: center;\r\n        margin-right: 48rpx;\r\n        vertical-align: middle;\r\n        padding-top: 8rpx;\r\n        position: relative;\r\n        z-index: 2;\r\n      }\r\n\r\n      .jiao-1 {\r\n        background-color: #ffc71c;\r\n        width: 400rpx;\r\n        transform: rotate(45deg);\r\n        text-align: center;\r\n        position: absolute;\r\n        color: #ffffff;\r\n        right: -130rpx;\r\n        top: 0;\r\n        .text-1 {\r\n          margin-left: 68rpx;\r\n          font-size: 28rpx;\r\n        }\r\n        .text-2 {\r\n          margin-left: 68rpx;\r\n          font-size: 28rpx;\r\n        }\r\n      }\r\n      .no-icon {\r\n        border-radius: 50%;\r\n        width: 86rpx;\r\n        height: 86rpx;\r\n        margin-right: 48rpx;\r\n        position: relative;\r\n        z-index: 2;\r\n      }\r\n      .bg-quan {\r\n        width: 244rpx;\r\n        height: 244rpx;\r\n        border: 6rpx solid $main-color;\r\n        border-radius: 50%;\r\n        opacity: 0.1;\r\n        color: $main-color;\r\n        text-align: center;\r\n        padding-top: 30rpx;\r\n        font-size: 130rpx;\r\n        position: absolute;\r\n        right: -54rpx;\r\n        bottom: -60rpx;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n.navbar {\r\n  display: flex;\r\n  height: 80rpx;\r\n  padding: 0 5px;\r\n  background: #fff;\r\n  color: $light-color;\r\n  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);\r\n  position: relative;\r\n  z-index: 10;\r\n\r\n  .nav-item {\r\n    flex: 1;\r\n    height: 100%;\r\n    font-size: 26rpx;\r\n    color: $light-color;\r\n    position: relative;\r\n    text-align: center;\r\n    text {\r\n      line-height: 80rpx;\r\n    }\r\n    .current {\r\n      font-weight: bold;\r\n      font-size: 28rpx;\r\n      &:after {\r\n        content: \"\";\r\n        position: absolute;\r\n        bottom: 10rpx;\r\n        left: 108rpx;\r\n        width: 30rpx;\r\n        border-bottom: 2px solid $light-color;\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/cart/payment/error.vue",
    "content": ""
  },
  {
    "path": "pages/cart/payment/payOrder.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <div class=\"box\">\r\n      <div class=\"block block-1\">\r\n        <image class=\"img\" src=\"@/pages/cart/static/pay.png\" />\r\n        <p class=\"ptips\">收银台</p>\r\n\r\n        <p class=\"ptips\">剩余支付时间：\r\n          <u-count-down :show-days=\"false\" :show-border=\"true\" font-size=\"28\" color=\"#008ffa\" border-color=\"#008ffa\" ref=\"uCountDown\" :timestamp=\"autoCancel\"></u-count-down>\r\n        </p>\r\n        <p class=\"ptips\">\r\n          支付金额\r\n          <span>¥{{ cashierParams.price | unitPrice }}</span>\r\n        </p>\r\n      </div>\r\n    </div>\r\n    <div class=\"__pay_form__\">\r\n    </div>\r\n    <div class=\"block-4\" v-if=\"cashierParams.price > 0\">\r\n      <div class=\"payItem\">支付方式</div>\r\n      <div class=\"payItem\" v-for=\"(item, index) in payList\" :key=\"index\">\r\n        <u-row class=\"row\">\r\n          <div class=\"col1\" @click=\"awaitPay(item, index)\" size=\"100\" style=\"text-align:left;\">\r\n            <div v-if=\"item == 'ALIPAY'\">\r\n              <u-icon class=\"method_icon\" name=\"zhifubao-circle-fill\" color=\"#008ffa\" size=\"80\"></u-icon>\r\n              <span class=\"method_name\">支付宝</span>\r\n            </div>\r\n            <div v-if=\"item == 'WECHAT'\">\r\n              <u-icon class=\"method_icon\" name=\"weixin-circle-fill\" color=\"#00c98b\" size=\"80\"></u-icon>\r\n              <span class=\"method_name\">微信</span>\r\n            </div>\r\n            <div v-if=\"item == 'WALLET'\">\r\n              <u-icon class=\"method_icon\" name=\"red-packet-fill\" color=\"#dd6161\" size=\"80\"></u-icon>\r\n              <span class=\"method_name\">余额支付(当前余额：¥{{ walletValue | unitPrice }})</span>\r\n            </div>\r\n          </div>\r\n          <div class=\"col3\" @click=\"awaitPay(item)\" textAlign=\"right\">\r\n            <u-icon size=\"26\" color=\"#b1b1b1\" name=\"arrow-right\"></u-icon>\r\n          </div>\r\n        </u-row>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n<script>\r\n\timport * as API_Trade from \"@/api/trade\";\r\n\timport {payCallback} from '@/api/members'\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t//路径传参\r\n\t\t\t\trouterVal: \"\",\r\n\t\t\t\t//收银台参数\r\n\t\t\t\tcashierParams: \"\",\r\n\t\t\t\t//支付方式集合\r\n\t\t\t\tpayList: \"\",\r\n\t\t\t\t//支付sn\r\n\t\t\t\tsn: \"\",\r\n\t\t\t\t//订单类型\r\n\t\t\t\torderType: \"\",\r\n\t\t\t\t//支付异常\r\n\t\t\t\texception: {},\r\n\t\t\t\t//支付表单\r\n\t\t\t\tpayForm: {},\r\n\t\t\t\t//支付类型 APP/WECHAT_MP/H5/NATIVE app/微信小程序/h5/二维码\r\n\t\t\t\tpaymentType: \"\",\r\n\t\t\t\t// 支付客户端 APP/NATIVE/JSAPI/H5\r\n\t\t\t\tpaymentClient: \"\",\r\n\t\t\t\t//余额\r\n\t\t\t\twalletValue: 0.0,\r\n\t\t\t\t// 支付倒计时\r\n\t\t\t\tautoCancel: 0,\r\n\t\t\t\r\n\t\t\t};\r\n\t\t},\r\n\t\tonLoad(val) {\r\n\t\t\tthis.routerVal = val;\r\n\r\n\t\t\t//初始化参数\r\n\t\t\t// #ifdef APP-PLUS\r\n\t\t\tthis.paymentType = \"APP\";\r\n\t\t\tthis.paymentClient = \"APP\";\r\n\t\t\t//#endif\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.paymentType = \"WECHAT_MP\";\r\n\t\t\tthis.paymentClient = \"MP\";\r\n\t\t\t//#endif\r\n\t\t\t// #ifdef H5\r\n\t\t\tthis.paymentType = \"H5\";\r\n\t\t\t//如果是微信浏览器，则使用公众号支付，否则使用h5，\r\n\t\t\t// 区别是：h5是通过浏览器外部调用微信app进行支付，而JSAPI则是 在微信浏览器内部，或者小程序 调用微信支付\r\n\t\t\tthis.paymentClient = this.isWeiXin() ? \"JSAPI\" : \"H5\";\r\n\t\t\t//#endif\r\n\r\n\r\n\r\n\t\t\t// \r\n\t\t},\r\n\t\tonBackPress(e) {\r\n\t\t\tif (e.from == \"backbutton\") {\r\n\t\t\t\t\t\t\tif(this.routerVal.recharge_sn){\r\n\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\t url: '/pages/tabbar/user/my'\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse{\r\n\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\turl: \"/pages/order/myOrder?status=0\",\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn true; //阻止默认返回行为\r\n\t\t\t\t\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.cashierData();\r\n\t\t},\r\n\t\tmethods: {\r\n\r\n\t\t\t/**\r\n\t\t\t * 支付成功后跳转\r\n\t\t\t */\r\n\t\t\tcallback(paymentMethod){\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/cart/payment/success?paymentMethod=\" +\r\n\t\t\t\t\tpaymentMethod +\r\n\t\t\t\t\t\"&payPrice=\" +\r\n\t\t\t\t\tthis.cashierParams.price+\r\n\t\t\t\t\t\"&orderType=\"+this.orderType \r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * 获取收银详情\r\n\t\t\t */\r\n\t\t\tcashierData() {\r\n\t\t\t\tlet parms = {};\r\n\r\n\t\t\t\tif (this.routerVal.recharge_sn) {\r\n\t\t\t\t\t// 判断当前是否是充值\r\n\t\t\t\t\tthis.sn = this.routerVal.recharge_sn;\r\n\t\t\t\t\tthis.orderType = \"RECHARGE\";\r\n\t\t\t\t\t\r\n\t\t\t\t} else if (this.routerVal.trade_sn) {\r\n\t\t\t\t\tthis.sn = this.routerVal.trade_sn;\r\n\t\t\t\t\tthis.orderType = \"TRADE\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.sn = this.routerVal.order_sn;\r\n\t\t\t\t\tthis.orderType = \"ORDER\";\r\n\t\t\t\t}\r\n\t\t\t\tparms.sn = this.sn;\r\n\t\t\t\tparms.orderType = this.orderType;\r\n\t\t\t\tparms.clientType = this.paymentType;\r\n\r\n\t\t\t\tAPI_Trade.getCashierData(parms).then((res) => {\r\n\t\t\t\t\r\n\t\t\t\t\tif(res.data.success){\r\n\t\t\t\t\tthis.cashierParams = res.data.result;\r\n\r\n\t\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\t\tthis.payList = res.data.result.support.filter((item) => {\r\n\t\t\t\t\t\treturn item != \"ALIPAY\";\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// #endif\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t  if(this.routerVal.recharge_sn){\r\n\t\t\t\t\t\tthis.payList = res.data.result.support.filter((item) => {\r\n\t\t\t\t\t\treturn item != \"WALLET\";\r\n\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\t else{\r\n\t\t\t\t\t\tthis.payList = res.data.result.support;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// #ifdef H5\r\n\t\t\t\t\t//判断是否微信浏览器\r\n\t\t\t\t\tvar ua = window.navigator.userAgent.toLowerCase();\r\n\t\t\t\t\tif (ua.match(/MicroMessenger/i) == 'micromessenger') {\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tthis.payList = res.data.result.support.filter((item) => {\r\n\t\t\t\t\t\t\treturn item != \"ALIPAY\";\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t// 充值的话仅保留微信支付\r\n\t\t\t\t\t\tif(this.orderType == \"RECHARGE\"){\r\n\t\t\t\t\t\t\tthis.payList = res.data.result.support.filter((item) => {\r\n\t\t\t\t\t\t\t\treturn item == \"WECHAT\";\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\tthis.walletValue = res.data.result.walletValue;\r\n\t\t\t\t\tthis.autoCancel =\r\n\t\t\t\t\t\t(res.data.result.autoCancel - new Date().getTime()) / 1000;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(res.data.code == 32000){\r\n\t\t\t\t\t\tsetTimeout(()=>{\r\n\t\t\t\t\t\t\tuni.redirectTo({\r\n\t\t\t\t\t\t\t url: `/pages/order/myOrder?status=0`\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t},500)\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\r\n\t\t\tawaitPay(payment){\r\n\t\t\t\tthis.$u.throttle(()=>{\r\n\t\t\t\t\tthis.pay(payment)\r\n\t\t\t\t}, 2000)\r\n\t\t\t},\r\n\r\n\t\t\t//订单支付\r\n\t\t\tasync pay(payment) {\r\n\t\t\t\t\r\n\t\t\t\t// 支付编号\r\n\t\t\t\tconst sn = this.sn;\r\n\t\t\t\t// 交易类型【交易号|订单号】\r\n\t\t\t\tconst orderType = this.orderType;\r\n\r\n\t\t\t\tconst clientType = this.paymentType;\r\n\t\t\t\tlet params = {\r\n\t\t\t\t\tsn,\r\n\t\t\t\t\torderType,\r\n\t\t\t\t\tclientType,\r\n\t\t\t\t};\r\n\r\n\t\t\t\t//支付方式 WECHAT/ALIPAY\r\n\t\t\t\tconst paymentMethod = payment;\r\n\t\t\t\t// 客户端类型 APP/NATIVE/JSAPI/H5\r\n\t\t\t\tconst paymentClient = this.paymentClient;\r\n\t\t\t\t\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t  title: \"正在唤起支付...\",\r\n\t\t\t\t  mask:true\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\t//APP pay\r\n\t\t\t\t// 初始化支付签名\r\n\t\t\t\tawait API_Trade.initiatePay(paymentMethod, paymentClient, params).then(\r\n\t\t\t\t\t(signXml) => {\r\n\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\t\t//如果支付异常\r\n\t\t\t\t\t\tif (!signXml.data.success) {\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ttitle: signXml.data.message,\r\n\t\t\t\t\t\t\t\tduration: 2000\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tlet payForm = signXml.data.result;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tlet paymentType = paymentMethod === \"WECHAT\" ? \"wxpay\" : \"alipay\";\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif(paymentMethod === \"WALLET\"){\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\ttitle: \"支付成功!\",\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tthis.callback(paymentMethod)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse{\r\n\t\t\t\t\t\t\tuni.requestPayment({\r\n\t\t\t\t\t\t\t\tprovider: paymentType,\r\n\t\t\t\t\t\t\t\torderInfo: payForm || '',\r\n\t\t\t\t\t\t\t\tsuccess: (e) => {\r\n\t\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t\t\ttitle: \"支付成功!\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tthis.callback(paymentMethod)\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tfail: (e) => {\r\n\t\t\t\t\t\t\t\t\tconsole.log(this);\r\n\t\t\t\t\t\t\t\t\tthis.exception = e;\r\n\t\t\t\t\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\t\t\t\t\tcontent: \"支付失败,如果您已支付，请勿反复支付\",\r\n\t\t\t\t\t\t\t\t\t\tshowCancel: false,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t\t//APP pay\r\n\t\t\t\t// #endif\r\n\r\n\t\t\t\t//#ifdef H5\r\n\t\t\t\t//H5 pay\r\n\t\t\t\tawait API_Trade.initiatePay(paymentMethod, paymentClient, params).then(\r\n\t\t\t\t\t(res) => {\r\n\t\t\t\t\t\tlet response = res.data;\r\n\t\t\t\t\t\t//如果非支付宝支付才需要进行判定，因为支付宝h5支付是直接输出的，没有返回所谓的消息状态\r\n\t\t\t\t\t\tif(paymentMethod !== \"ALIPAY\"){\r\n\t\t\t\t\t\t\t//如果支付异常\r\n\t\t\t\t\t\t\tif (!response.success) {\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: response.message,\r\n\t\t\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\t\t\ticon:\"none\"\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (paymentMethod === \"ALIPAY\") {\r\n\t\t\t\t\t\t\tdocument.write(response);\r\n\t\t\t\t\t\t} else if (paymentMethod === \"WECHAT\") {\r\n\t\t\t\t\t\t\tif (this.isWeiXin()) {\r\n\t\t\t\t\t\t\t\t//微信公众号支付\r\n\t\t\t\t\t\t\t\tWeixinJSBridge.invoke(\r\n\t\t\t\t\t\t\t\t\t\"getBrandWCPayRequest\",\r\n\t\t\t\t\t\t\t\t\tresponse.result,\r\n\t\t\t\t\t\t\t\t\t(res) => {\r\n\t\t\t\t\t\t\t\t\t\tif (res.err_msg == \"get_brand_wcpay_request:ok\") {\r\n\t\t\t\t\t\t\t\t\t\t\t// 使用以上方式判断前端返回,微信团队郑重提示：\r\n\t\t\t\t\t\t\t\t\t\t\t//res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。\r\n\t\t\t\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle: \"支付成功!\",\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\tthis.callback(paymentMethod)\r\n\t\t\t\t\t\t\t\t\t\t\t \r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\t\t\t\t\t\t\tcontent: \"支付失败,如果您已支付，请勿反复支付\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tshowCancel: false,\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\twindow.location.href = JSON.parse(response.result).h5_url;\r\n\t\t\t\t\t\t\t\tconst searchParams = {\r\n\t\t\t\t\t\t\t\t\t...params,\r\n\t\t\t\t\t\t\t\t\tprice:this.cashierParams,\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tconst timer = setInterval(()=>{\r\n\t\t\t\t\t\t\t\t\tpayCallback(searchParams).then(res=>{\r\n\t\t\t\t\t\t\t\t\tif(res.data.result){\r\n\t\t\t\t\t\t\t\t\t\tclearTimeout(timer);\r\n\t\t\t\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\t\t\t\turl:\"/pages/order/myOrder\"\r\n\t\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t},3000)\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\t\t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (paymentMethod === \"WALLET\") {\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ttitle: response.message,\r\n\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tif (response.success) {\r\n\t\t\t\t\t\t\t\tthis.callback(paymentMethod)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t\t//H5pay\r\n\t\t\t\t// #endif\r\n\r\n\t\t\t\t//#ifdef MP-WEIXIN\r\n\t\t\t\t//微信小程序\r\n\t\t\t\tawait API_Trade.initiatePay(paymentMethod, paymentClient, params).then(\r\n\t\t\t\t\t(res) => {\r\n\t\t\t\t\t\tlet response = res.data.result;\r\n\t\t\t\t\t\t//如果支付异常\r\n\t\t\t\t\t\tif (!res.data.success) {\r\n\t\t\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\t\t\tcontent: res.data.message,\r\n\t\t\t\t\t\t\t\tshowCancel: false,\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (paymentMethod === \"WECHAT\") {\r\n\t\t\t\t\t\t\tuni.requestPayment({\r\n\t\t\t\t\t\t\t\tprovider: \"wxpay\",\r\n\t\t\t\t\t\t\t\tappid: response.appid,\r\n\t\t\t\t\t\t\t\ttimeStamp: response.timeStamp,\r\n\t\t\t\t\t\t\t\tnonceStr: response.nonceStr,\r\n\t\t\t\t\t\t\t\tpackage: response.package,\r\n\t\t\t\t\t\t\t\tsignType: response.signType,\r\n\t\t\t\t\t\t\t\tpaySign: response.paySign,\r\n\t\t\t\t\t\t\t\tsuccess: (e) => {\r\n\t\t\t\t\t\t\t\t\tconsole.log(e);\r\n\t\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t\t\ttitle: \"支付成功!\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tthis.callback(paymentMethod)\r\n\t\t\t\t\t\t\t\t\t \r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tfail: (e) => {\r\n\t\t\t\t\t\t\t\t\tconsole.log(e);\r\n\t\t\t\t\t\t\t\t\tthis.exception = e;\r\n\t\t\t\t\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\t\t\t\t\tcontent: \"支付失败,如果您已支付，请勿反复支付\",\r\n\t\t\t\t\t\t\t\t\t\tshowCancel: false,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\ttitle: \"支付成功!\",\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tthis.callback(paymentMethod)\r\n\t\t\t\t\t\t\t \r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t\tisWeiXin() {\r\n\t\t\t\tvar ua = window.navigator.userAgent.toLowerCase();\r\n\t\t\t\tif (ua.match(/MicroMessenger/i) == \"micromessenger\") {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.method_icon {\r\n  vertical-align: middle;\r\n}\r\n\r\n.method_name {\r\n  font-size: 28rpx;\r\n  color: #999;\r\n  padding-left: 24rpx;\r\n}\r\n\r\n.row {\r\n  display: flex;\r\n  width: 100%;\r\n}\r\n\r\n/deep/ .u-row {\r\n  width: 100% !important;\r\n  display: flex;\r\n  justify-content: space-between !important;\r\n}\r\n\r\n.method_name,\r\n.col1 {\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.col1 {\r\n  text-align: center;\r\n  flex: 99;\r\n}\r\n\r\n.col3 {\r\n  text-align: right;\r\n  flex: 1;\r\n}\r\n\r\n.payItem {\r\n  padding: 13px 25rpx;\r\n  border-top: 1px solid #f9f9f9;\r\n\r\n  line-height: 100rpx;\r\n  font-size: 36rpx;\r\n  color: #333;\r\n}\r\n\r\n.ptips {\r\n  font-size: 32rpx;\r\n  margin: 20rpx 0;\r\n  color: #333;\r\n\r\n  > span {\r\n    font-size: 40rpx;\r\n    color: #df5a52;\r\n    margin-left: 10rpx;\r\n  }\r\n}\r\n\r\n.img {\r\n  width: 392rpx !important;\r\n  height: 296rpx !important;\r\n}\r\n\r\n.wrapper {\r\n  min-height: 100vh;\r\n  height: auto;\r\n  background: #f9f9f9;\r\n}\r\n\r\n.block-4 {\r\n  background: #fff;\r\n  color: $u-tips-color;\r\n\r\n  > p {\r\n    padding: 8rpx;\r\n  }\r\n}\r\n\r\n.box {\r\n  background: #fff;\r\n  padding: 40rpx 0;\r\n  //   justify-content: center; //这个是X轴居中\r\n  //   align-items: center; //这个是 Y轴居中\r\n}\r\n\r\n.block {\r\n  text-align: center;\r\n  display: block;\r\n  width: 100%;\r\n\r\n  image {\r\n    width: 200rpx;\r\n    height: 200rpx;\r\n  }\r\n}\r\n\r\n.block-1 {\r\n  margin-top: 80rpx;\r\n}\r\n\r\n.btns {\r\n  margin: 0 20rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/cart/payment/shareOrderGoods.vue",
    "content": "<template>\n  <view class=\"wrapper\" v-if=\"flag\">\n    <div class='goods' v-if=\"selectedGoods\">\n      <image class=\"goods-image\" :src=\"selectedGoods.thumbnail\" alt=\"\">\n        <p class=\"goodsName\">{{selectedGoods.goodsName}}</p>\n        <div class=\"goodsPrice\">{{(selectedGoods.promotionPrice || selectedGoods.price  ) | unitPrice('￥')}}</div>\n    </div>\n    <div>\n      <div class=\"tips\">\n\n        <span v-if=\"master.toBeGroupedNum\">\n          还差<span class=\"num\">{{master.toBeGroupedNum || 0}}</span>人，赶快邀请好友拼单吧\n        </span>\n        <span v-if=\"isBuy &&!master.toBeGroupedNum >0\">\n          已成功拼团\n        </span>\n        <span v-if=\"!master.toBeGroupedNum >0\">\n          拼团已结束\n        </span>\n      </div>\n\n      <div v-if=\"isMaster && !isOver\">\n        <div class=\"share-user\" v-if=\"master.toBeGroupedNum\" @click=\"share()\">\n          邀请好友拼团\n        </div>\n        <div class=\"home\" @click=\"handleClickHome()\">\n          去首页逛逛\n        </div>\n      </div>\n      <div v-if=\"!isMaster && !isOver && !isBuy && master.toBeGroupedNum\">\n        <div class=\"share-user\" @click=\"toBuy\">\n          参与拼团\n        </div>\n      </div>\n      <div v-if=\"!isMaster && !isOver && isBuy\">\n        <div class=\"share-user disabled\">\n          已购买该商品\n        </div>\n      </div>\n      <div v-if=\"isOver\">\n        <!-- <div class=\"share-user disabled\">\n          拼团已结束\n        </div> -->\n        <div class=\"home\" @click=\"handleClickHome()\">\n          去首页逛逛\n        </div>\n      </div>\n    </div>\n\n    <!-- 倒计时 -->\n    <div class=\"count-down\" v-if=\"!isOver && master.toBeGroupedNum\">\n      <u-count-down bg-color=\"#ededed\" :hide-zero-day=\"true\" @end=\"isOver\" :timestamp=\"timeStamp\"></u-count-down>\n    </div>\n\n    <div class=\"user-list\" v-if=\"data.pintuanMemberVOS\">\n      <div class=\"user-item\" v-for=\"(item,index) in data.pintuanMemberVOS\" :key=\"index\">\n        <span class=\"master\" v-if=\"item.orderSn == ''\">团长</span>\n        <image class=\"img\" :src=\"item.face\" alt=\"\">\n      </div>\n    </div>\n\n    <popupGoods :addr=\"addr\" ref=\"popupGoods\" :buyMask=\"maskFlag\" @closeBuy=\"closePopupBuy\" :goodsDetail=\"goodsDetail\" :goodsSpec=\"goodsSpec\" v-if=\"goodsDetail.id \" @handleClickSku=\"getGoodsDetail\" />\n    <shares @close=\"closeShare\" :link=\"'/pages/cart/payment/shareOrderGoods?sn='+this.routers.sn+'&sku='+this.routers.sku+'&goodsId='+this.routers.goodsId\" type=\"pintuan\"\n      :thumbnail=\"data.promotionGoods.thumbnail\" :goodsName=\"data.promotionGoods.goodsName\" v-if=\"shareFlag \" />\n  </view>\n</template>\n\n<script>\nimport { getGoods } from \"@/api/goods.js\";\nimport { getPinTuanShare } from \"@/api/order\";\nimport shares from \"@/components/m-share/index\";\nimport storage from \"@/utils/storage.js\";\nimport popupGoods from \"@/components/m-buy/goods\"; //购物车商品的模块\n\nexport default {\n  data() {\n    return {\n      flag: false, //判断接口是否正常请求\n      addr: {\n        id: \"\",\n      },\n      maskFlag: false, //商品弹框\n      timeStamp: 0,\n      shareFlag: false,\n      data: \"\",\n      isMaster: true,\n      selectedGoods: \"\", //选择的商品规格昵称\n      routers: \"\", //传参数据\n      goodsDetail: \"\", //商品详情\n      goodsSpec: \"\",\n      master: \"\", // 团长\n      PromotionList: \"\", //优惠集合\n      isGroup: false, //是否拼团\n      isOver: false, //是否结束活动\n      isBuy: false, //当前用户是是否购买\n    };\n  },\n  components: {\n    shares,\n    popupGoods,\n  },\n  watch: {\n    isGroup(val) {\n      if (val) {\n        let timer = setInterval(() => {\n          this.$refs.popupGoods.buyType = \"PINTUAN\";\n          clearInterval(timer);\n        }, 100);\n      } else {\n        this.$refs.popupGoods.buyType = \"\";\n      }\n    },\n  },\n  onLoad(options) {\n    this.routers = options;\n  },\n  mounted() {\n    this.init(this.routers.sn, this.routers.sku);\n  },\n  methods: {\n    closeShare() {\n      this.shareFlag = false;\n    },\n    // 这里的话得先跳到商品详情才能购买商品\n    toBuy() {\n      this.maskFlag = true;\n      this.$refs.popupGoods.parentOrder = {\n        ...this.master,\n        orderSn: this.routers.sn,\n      };\n      this.$refs.popupGoods.isMask = true;\n      this.$refs.popupGoods.isClose = true;\n      this.$refs.popupGoods.buyType = \"PINTUAN\";\n    },\n    // 分享\n    share() {\n      this.shareFlag = true;\n    },\n    closePopupBuy(val) {\n      this.maskFlag = false;\n    },\n    // 实例化本页面\n    async init(sn, sku) {\n      let res = await getPinTuanShare(sn, sku);\n      if (res.data.success && res.data.result.promotionGoods) {\n        this.flag = true;\n        this.data = res.data.result;\n        this.selectedGoods = res.data.result.promotionGoods;\n        let endTime = Date.parse(\n          res.data.result.promotionGoods.endTime.replace(/-/g, \"/\")\n        );\n        // 获取当前剩余的拼团商品时间\n        let timeStamp = Date.parse(new Date(endTime)) / 1000;\n\n        // 获取当前时间时间戳\n        let dateTime = Date.parse(new Date()) / 1000;\n\n        this.timeStamp = parseInt(timeStamp - dateTime);\n\n        this.timeStamp <= 0 ? (this.isOver = true) : (this.isOver = false);\n\n        // 获取剩余拼团人数\n        this.master =\n          res.data.result.pintuanMemberVOS.length != 0 &&\n          res.data.result.pintuanMemberVOS.filter((item) => {\n            return item.orderSn == \"\";\n          })[0];\n\n        // 获取当前是否是拼团本人\n        if (\n          storage.getUserInfo(this.routers.sku, this.routers.goodsId).id ==\n          this.master.memberId\n        ) {\n          this.isMaster = true;\n        } else {\n          this.isMaster = false;\n          // 获取商品详情\n          this.getGoodsDetail({\n            id: this.routers.sku,\n            goodsId: this.routers.goodsId,\n          });\n        }\n\n        // 获取当前商品是否已经购买\n        if (storage.getUserInfo().id) {\n          let isBuy = res.data.result.pintuanMemberVOS.filter((item) => {\n            return item.memberId == storage.getUserInfo().id;\n          });\n          isBuy.length != 0 ? (this.isBuy = true) : (this.isBuy = false);\n        }\n      } else {\n        uni.showToast({\n          title: \"当前拼团单有误！请联系管理员重试\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n    // 获取商品详情\n    getGoodsDetail(val) {\n      let { id, goodsId } = val;\n      uni.showLoading({\n        title: \"加载中\",\n        mask: true,\n      });\n      getGoods(id, goodsId).then((response) => {\n        this.goodsDetail = response.data.result.data;\n        this.selectedGoods = response.data.result.data;\n        this.goodsSpec = response.data.result.specs;\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        this.PromotionList = response.data.result.promotionMap;\n\n        // 判断是否拼团活动 如果有则显示拼团活动信息\n        this.PromotionList &&\n          Object.keys(this.PromotionList).forEach((item) => {\n            if (item.indexOf(\"PINTUAN\") == 0) {\n              this.isGroup = true;\n            }\n          });\n      });\n    },\n    handleClickHome() {\n      uni.switchTab({\n        url: \"/pages/tabbar/home/index\",\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage {\n  background: #fff;\n}\n.over {\n  margin: 10% 0;\n}\n.goods {\n  display: flex;\n  align-content: center;\n  justify-content: center;\n  flex-direction: column;\n  text-align: center;\n  width: 80%;\n  margin: 0 auto;\n}\n.goods-image {\n  margin: 40rpx auto;\n  width: 400rpx;\n  height: 400rpx;\n}\n.goodsName {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n  font-size: 30rpx;\n  font-weight: bold;\n}\n.goodsPrice {\n  margin-top: 10rpx;\n  font-weight: bold;\n  font-size: 40rpx;\n  color: $main-color;\n}\n.master {\n  z-index: 99;\n  position: absolute;\n  top: 0;\n  left: 0;\n  background: $light-color;\n  padding: 0 8rpx;\n  border-radius: 10rpx;\n  color: #fff;\n}\n.user-item {\n  position: relative;\n  margin: 20rpx;\n}\n.count-down {\n  margin: 40rpx 0;\n  text-align: center;\n}\n.img {\n  border-radius: 50%;\n  border: 2rpx solid $light-color;\n  width: 100rpx;\n  height: 100rpx;\n}\n.user-list {\n  width: 80%;\n  margin: 0 auto;\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n.tips {\n  margin-top: 10%;\n  text-align: center;\n  font-size: 40rpx;\n  font-weight: bold;\n  margin-bottom: 100rpx;\n}\n.num {\n  color: $main-color;\n  font-size: 60rpx;\n  margin: 0 10rpx;\n}\n\n.home,\n.share-user {\n  height: 80rpx;\n  line-height: 80rpx;\n  text-align: center;\n  width: 80%;\n  margin: 30rpx auto 0 auto;\n  color: #fff;\n  border-radius: 0.4em;\n}\n.share-user {\n  background: $main-color;\n}\n.disabled {\n  background: rgba($main-color, $alpha: 0.2);\n}\n.home {\n  color: $main-color;\n  border: 2rpx solid $main-color;\n}\n</style>\n"
  },
  {
    "path": "pages/cart/payment/success.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <div class=\"pay-wrapper\">\r\n      <div class=\"pay-money\">\r\n        ￥{{ Number(payPrice) | unitPrice }}\r\n      </div>\r\n      <div class=\"pay-btns\">\r\n        <div v-show=\"!from\" @click=\"checkOrder\">查看{{ this.orderType == \"RECHARGE\" ? '余额' : '订单' }}</div>\r\n        <div @click=\"navigateTo('/pages/tabbar/home/index', 'switch')\">回到首页</div>\r\n      </div>\r\n    </div>\r\n    <div class=\"pay-box\">\r\n      <div class=\"pay-tag-box\">\r\n        <h2>订单支付成功!</h2>\r\n        <div class=\"pay-item\">\r\n          <div>\r\n            支付方式：\r\n          </div>\r\n          <div>{{ paymentMethod | paymentTypeFilter }}</div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <goodsRecommend />\r\n  </div>\r\n\r\n</template>\r\n<script>\r\nimport goodsRecommend from \"@/components/m-goods-recommend\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      checked: false,\r\n      paymentMethod: \"\",\r\n\r\n      from: \"\",\r\n      payPrice: 0,\r\n      goodsList: [],\r\n      activeColor: this.$mainColor,\r\n    };\r\n  },\r\n  components: {\r\n    goodsRecommend,\r\n  },\r\n  filters: {\r\n    paymentTypeFilter(val) {\r\n      switch (val) {\r\n        case \"WECHAT\":\r\n          return \"微信\";\r\n        case \"ALIPAY\":\r\n          return \"支付宝\";\r\n        case \"WALLET\":\r\n          return \"余额支付\";\r\n        default:\r\n          return \"\";\r\n      }\r\n    },\r\n  },\r\n  onLoad(options) {\r\n    this.paymentMethod = options.paymentMethod || \"\";\r\n    this.from = options.from || \"\";\r\n    this.payPrice = options.payPrice || 0;\r\n    this.orderType = options.orderType;\r\n\r\n  },\r\n  methods: {\r\n    checkOrder() {\r\n      /**\r\n       * 查看订单\r\n       * 1.充值跳转到明细里面\r\n       * 2.支付跳转到订单详情\r\n       */\r\n      if (this.orderType == \"RECHARGE\") {\r\n        uni.reLaunch({\r\n          url: `/pages/mine/deposit/operation`,\r\n        });\r\n      } else {\r\n        this.navigateTo(\"/pages/order/myOrder?status=0\");\r\n      }\r\n    },\r\n\r\n    navigateTo(url, type) {\r\n      if (type === \"switch\") {\r\n        uni.switchTab({\r\n          url,\r\n        });\r\n      } else {\r\n        uni.redirectTo({\r\n          url,\r\n        });\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.subscribe {\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  margin: 0 auto 40rpx auto;\r\n  padding: 0 20rpx 20rpx;\r\n  width: 80%;\r\n}\r\n\r\n.pay-btns {\r\n  display: flex;\r\n  width: 50%;\r\n  justify-content: space-between;\r\n  margin: 0 auto;\r\n  color: #fff;\r\n\r\n  >div {\r\n    padding: 6px 12px;\r\n    border: 1px solid #fff;\r\n    border-radius: 100px;\r\n  }\r\n}\r\n\r\n.pay-money {\r\n  line-height: 1;\r\n  font-size: 50rpx;\r\n  color: #fff;\r\n  margin-bottom: 100rpx;\r\n}\r\n\r\n.pay-item {\r\n  font-weight: bold;\r\n  margin: 32rpx 0;\r\n  display: flex;\r\n  justify-content: space-between;\r\n  font-size: 24rpx;\r\n  color: rgba($color: $main-color, $alpha: 0.8);\r\n}\r\n\r\n.pay-box {\r\n  overflow: hidden;\r\n}\r\n\r\n.pay-tag-box {\r\n  width: 80%;\r\n  margin: 80rpx auto 40rpx auto;\r\n  padding: 20rpx;\r\n  border-radius: 20rpx;\r\n  background: rgba($color: $main-color, $alpha: 0.2);\r\n\r\n  >h2 {\r\n    margin-top: 20rpx;\r\n    font-size: 40rpx;\r\n    color: $main-color;\r\n  }\r\n}\r\n\r\n.pay-wrapper {\r\n  background-image: linear-gradient(90deg, #fa123b, #ff6b35, #ff9f28, #ffcc03);\r\n  height: 480rpx;\r\n  position: relative;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  flex-direction: column;\r\n}\r\n\r\n.pay-box {\r\n  transform: translateY(-100rpx);\r\n  width: 100%;\r\n  background: #fff;\r\n  border-top-right-radius: 100rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/floor/empty.vue",
    "content": "<template>\n\t<default-page v-if=\"type\" :type=\"type\" title=\"您的设备已断网\" :isBtn=\"false\" />\n</template>\n\n<script>\n\timport defaultPage from '@/components/default-page/default-page.vue';\n\texport default {\n\t\tcomponents: {\n\t\t\tdefaultPage\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\ttype: undefined\n\t\t\t}\n\t\t},\n\t\tonLoad(options) {\n\t\t\t\n\t\t}\n\t}\n</script>\n\n<style>\n\n</style>\n"
  },
  {
    "path": "pages/mine/address/add.vue",
    "content": "<template>\r\n  <view class=\"add-address\">\r\n    <div class=\"uForm\">\r\n      <u-form :border-bottom=\"false\" :model=\"form\" ref=\"uForm\" :error-type=\"['toast']\" :rule=\"rules\">\r\n\t\t\t\t<!-- #ifndef H5 -->\r\n        <view class=\"selectAddress\" @click=\"clickUniMap\">\r\n          选择收货地址\r\n        </view>\r\n\t\t\t\t<!-- #endif -->\r\n        <u-form-item class=\"border\" label=\"收货人\" label-width=\"130\" prop=\"name\">\r\n          <u-input v-model=\"form.name\" clearable placeholder=\"请输入收货人姓名\" />\r\n        </u-form-item>\r\n\r\n        <u-form-item label=\"手机号码\" label-width=\"130\" prop=\"mobile\">\r\n          <u-input v-model=\"form.mobile\" type=\"number\" maxlength=\"11\" placeholder=\"请输入收货人手机号码\" />\r\n        </u-form-item>\r\n        <u-form-item label=\"所在区域\" label-width=\"130\" prop=\"___path\">\r\n          <div  @click=\"showPicker\" >\r\n            {{ form.___path || '请选择所在地区' }}\r\n          </div>\r\n        </u-form-item>\r\n        <u-form-item class=\"detailAddress\" label=\"详细地址\" label-width=\"130\" prop=\"detail\">\r\n          <u-input type=\"textarea\" v-model=\"form.detail\" maxlength=\"100\" height=\"150\" placeholder=\"街道楼牌号等\" />\r\n        </u-form-item>\r\n        <u-form-item label=\"地址别名\" label-width=\"130\">\r\n          <u-input v-model=\"form.alias\" placeholder=\"请输入地址别名\" />\r\n        </u-form-item>\r\n        <u-checkbox-group shape=\"circle\" size=\"30\">\r\n          <u-checkbox :active-color=\"lightColor\" v-model=\"form.isDefault\">设为默认地址</u-checkbox>\r\n        </u-checkbox-group>\r\n\r\n        <div class=\"saveBtn\" @click=\"save\">保存</div>\r\n      </u-form>\r\n\r\n      <m-city :provinceData=\"list\" headTitle=\"区域选择\" ref=\"cityPicker\" @funcValue=\"getpickerParentValue\" pickerSize=\"4\">\r\n      </m-city>\r\n\r\n      <uniMap v-if=\"mapFlag\" @close=\"closeMap\" @callback=\"callBackAddress\" />\r\n    </div>\r\n  </view>\r\n</template>\r\n<script>\r\nimport { addAddress, editAddress, getAddressDetail } from \"@/api/address.js\";\r\nimport city from \"@/components/m-city/m-city.vue\";\r\nimport uniMap from \"@/components/uniMap\";\r\nimport permision from \"@/js_sdk/wa-permission/permission.js\";\r\nexport default {\r\n  components: {\r\n    \"m-city\": city,\r\n    uniMap,\r\n  },\r\n  onShow() {\r\n    // 判断当前系统权限定位是否开启\r\n  },\r\n  methods: {\r\n    // 关闭地图\r\n    closeMap() {\r\n      this.mapFlag = false;\r\n    },\r\n    // 打开地图并访问权限\r\n    clickUniMap() {\r\n      // #ifdef APP-PLUS\r\n      if (plus.os.name == \"iOS\") {\r\n        // ios系统\r\n        permision.judgeIosPermission(\"location\")\r\n          ? (this.mapFlag = true)\r\n          : this.refuseMap();\r\n      } else {\r\n        // 安卓\r\n        this.requestAndroidPermission(\r\n          \"android.permission.ACCESS_FINE_LOCATION\"\r\n        );\r\n      }\r\n      // #endif\r\n\r\n      // #ifndef APP-PLUS\r\n      this.mapFlag = true;\r\n      // #endif\r\n    },\r\n\r\n    // 如果拒绝权限 提示区设置\r\n    refuseMap() {\r\n      uni.showModal({\r\n        title: \"温馨提示\",\r\n        content: \"您已拒绝定位,请开启\",\r\n        confirmText: \"去设置\",\r\n        success(res) {\r\n          if (res.confirm) {\r\n            //打开授权设置\r\n            // #ifndef MP-WEIXIN\r\n            uni.getSystemInfo({\r\n              success(res) {\r\n                if (res.platform == \"ios\") {\r\n                  //IOS\r\n                  plus.runtime.openURL(\"app-settings://\");\r\n                } else if (res.platform == \"android\") {\r\n                  //安卓\r\n                  let main = plus.android.runtimeMainActivity();\r\n                  let Intent = plus.android.importClass(\r\n                    \"android.content.Intent\"\r\n                  );\r\n                  let mIntent = new Intent(\"android.settings.ACTION_SETTINGS\");\r\n                  main.startActivity(mIntent);\r\n                }\r\n              },\r\n            });\r\n            // #endif\r\n          }\r\n        },\r\n      });\r\n    },\r\n\r\n    // 获取安卓是否拥有地址权限\r\n    async requestAndroidPermission(permisionID) {\r\n      var result = await permision.requestAndroidPermission(permisionID);\r\n\r\n      if (result == 1) {\r\n        this.mapFlag = true;\r\n      } else {\r\n        this.refuseMap();\r\n      }\r\n    },\r\n\r\n    // 选择地址后数据的回调\r\n    callBackAddress(val) {\r\n      console.log(val)\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n\r\n      if (val.regeocode && val) {\r\n        let address = val.regeocode;\r\n        this.form.detail = address.formatted_address; //地址详情\r\n        this.form.___path = val.data.result.name;\r\n        this.form.consigneeAddressIdPath = val.data.result.id; // 地址id分割\r\n        this.form.consigneeAddressPath = val.data.result.name; //地址名称， '，'分割\r\n        this.form.lat = val.latitude; //纬度\r\n        this.form.lon = val.longitude; //经度\r\n         uni.hideLoading();\r\n      }\r\n\r\n      this.mapFlag = !this.mapFlag; //关闭地图\r\n    },\r\n\r\n    // 保存当前 地址\r\n    save() {\r\n      this.$refs.uForm.validate((valid) => {\r\n        if (valid) {\r\n          let pages = getCurrentPages(); //获取页面栈\r\n          let beforePage = pages[pages.length - 2]; //上个页面\r\n\r\n          // 如果没有id则为新增地址\r\n          if (!this.form.id) {\r\n            // 删除没有的数据\r\n            delete this.form.___path;\r\n            addAddress(this.form).then((res) => {\r\n              if (res.data.success) {\r\n                uni.navigateBack();\r\n              }\r\n            });\r\n          } else {\r\n            // 修改地址\r\n            delete this.form.___path;\r\n            delete this.form.updateBy;\r\n            delete this.form.updateTime;\r\n            editAddress(this.form).then((res) => {\r\n              if (res.data.success) {\r\n                uni.navigateBack();\r\n              }\r\n            });\r\n          }\r\n        }\r\n      });\r\n    },\r\n\r\n    // 三级地址联动回调\r\n    getpickerParentValue(e) {\r\n      // 将需要绑定的地址设置为空，并赋值\r\n      this.form.consigneeAddressIdPath = [];\r\n      this.form.consigneeAddressPath = [];\r\n      let name = \"\";\r\n\r\n      e.forEach((item, index) => {\r\n        if (item.id) {\r\n          // 遍历数据\r\n          this.form.consigneeAddressIdPath.push(item.id);\r\n          this.form.consigneeAddressPath.push(item.localName);\r\n          name += item.localName;\r\n          this.form.___path = name;\r\n        }\r\n        if (index == e.length - 1) {\r\n          //如果是最后一个\r\n          let _town = item.children.filter((_child) => {\r\n            return _child.id == item.id;\r\n          });\r\n\r\n          this.form.lat = _town[0].center.split(\",\")[1];\r\n          this.form.lon = _town[0].center.split(\",\")[0];\r\n        }\r\n      });\r\n    },\r\n\r\n    // 显示三级地址联动\r\n    showPicker() {\r\n      this.$refs.cityPicker.show();\r\n    },\r\n  },\r\n  mounted() {},\r\n  data() {\r\n    return {\r\n      lightColor: this.$lightColor, //高亮颜色\r\n      mapFlag: false, // 地图选择开\r\n      routerVal: \"\",\r\n      form: {\r\n        detail: \"\", //地址详情\r\n        name: \"\", //收货人姓名\r\n        mobile: \"\", //手机号码\r\n        consigneeAddressIdPath: [], //地址id\r\n        consigneeAddressPath: [], //地址名字\r\n        ___path: \"\", //所在区域\r\n        isDefault: false, //是否默认地址\r\n      },\r\n      // 表单提交校验规则\r\n      rules: {\r\n        name: [\r\n          {\r\n            required: true,\r\n            message: \"收货人姓名不能为空\",\r\n            trigger: [\"blur\", \"change\"],\r\n          },\r\n        ],\r\n        mobile: [\r\n          {\r\n            required: true,\r\n            message: \"手机号码不能为空\",\r\n            trigger: [\"blur\", \"change\"],\r\n          },\r\n          {\r\n            validator: (rule, value, callback) => {\r\n              return this.$u.test.mobile(value);\r\n            },\r\n            message: \"手机号码不正确\",\r\n            trigger: [\"change\", \"blur\"],\r\n          },\r\n        ],\r\n        ___path: [\r\n          {\r\n            required: true,\r\n            message: \"请选择所在区域\",\r\n            trigger: [\"change\"],\r\n          },\r\n        ],\r\n        detail: [\r\n          {\r\n            required: true,\r\n            message: \"请填写详细地址\",\r\n            trigger: [\"blur\", \"change\"],\r\n          },\r\n        ],\r\n      },\r\n      list: [\r\n        {\r\n          id: \"\",\r\n          localName: \"请选择\",\r\n          children: [],\r\n        },\r\n      ],\r\n    };\r\n  },\r\n  onLoad(option) {\r\n    uni.showLoading({\r\n      title: \"加载中\",\r\n    });\r\n    this.routerVal = option;\r\n    // 如果当前是编辑地址,则需要查询出地址详情信息\r\n    if (option.id) {\r\n      getAddressDetail(option.id).then((res) => {\r\n        const params = res.data.result;\r\n        params.___path = params.consigneeAddressPath;\r\n        this.$set(this, \"form\", params);\r\n\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    }\r\n     uni.hideLoading();\r\n  },\r\n  // 初始化rules必须要在onReady生命周期，因为onLoad生命周期组件可能尚未创建完毕\r\n  onReady() {\r\n    this.$refs.uForm.setRules(this.rules);\r\n  },\r\n};\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.detailAddress {\r\n  /deep/ .u-form-item--left {\r\n    display: flex;\r\n    align-items: flex-start;\r\n  }\r\n}\r\n.saveBtn,\r\n.selectAddress {\r\n  height: 70rpx;\r\n\r\n  line-height: 70rpx;\r\n  text-align: center;\r\n  font-size: 30rpx;\r\n  background: $aider-light-color;\r\n  color: #fff;\r\n  width: 70%;\r\n  margin: 40rpx auto 0 auto;\r\n  border-radius: 20rpx;\r\n}\r\n.selectAddress {\r\n  margin-top: 40rpx;\r\n  background: #fff;\r\n\r\n  color: $aider-light-color;\r\n  border: 2rpx solid $aider-light-color;\r\n}\r\n\r\n.uForm {\r\n  width: 94%;\r\n  overflow: hidden;\r\n  left: 3%;\r\n  position: relative;\r\n  top: 2%;\r\n  background: #fff;\r\n  border-radius: 20rpx;\r\n  padding: 0 0 40rpx 0;\r\n}\r\n.add-address {\r\n  width: 100%;\r\n  padding-top: 3%;\r\n\r\n  /deep/ .u-form-item {\r\n    background-color: #fff;\r\n    padding: 24rpx 30rpx;\r\n  }\r\n  .u-btn {\r\n    margin: 30rpx 30rpx 0 30rpx;\r\n    background-color: $main-color;\r\n  }\r\n\r\n  /deep/.u-checkbox {\r\n    margin: 30rpx 30rpx 0 30rpx;\r\n\r\n    .u-label-class.u-checkbox__label {\r\n      color: $font-color-light;\r\n      font-size: $font-sm;\r\n    }\r\n  }\r\n}\r\n/deep/ .u-checkbox__label {\r\n  font-size: 28rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/address/address.scss",
    "content": ".empty {\n    margin-top: 200rpx !important;\n  }\n  .alifont {\n    display: inline-block;\n  }\n  \n  .region {\n    span {\n      margin: 0 4rpx !important;\n    }\n  }\n  .address {\n    .default {\n      border: 1px solid #ff6262;\n      color: #ff6262;\n      font-size: 22rpx;\n      border-radius: 6rpx;\n      align-self: center;\n      padding: 2rpx 20rpx;\n    }\n    .list {\n      .item:hover {\n        background: #ededed;\n      }\n  \n      .item {\n        margin-top: 20rpx;\n        font-size: $font-base;\n        color: #666;\n  \n        .basic {\n          padding: 30rpx;\n          line-height: 1.5em;\n          border-bottom: 1px solid $border-color-light;\n  \n          :nth-child(2) {\n            margin: 0 20rpx;\n          }\n  \n          :nth-child(4) {\n            color: $font-color-light;\n            font-size: $font-sm;\n  \n            margin-top: 10rpx;\n  \n            text:nth-child(2) {\n              margin: 0;\n            }\n  \n            view {\n              font-size: 28rpx;\n            }\n          }\n        }\n  \n        .edit {\n          display: flex;\n          justify-content: space-between;\n          align-items: center;\n          vertical-align: middle;\n          height: 80rpx;\n          font-size: $font-sm;\n          color: $font-color-light;\n          padding: 0 30rpx;\n  \n          .unchecked {\n            width: 28rpx;\n            height: 28rpx;\n            border-radius: 50%;\n            border: 1px solid #e0e0e0;\n            display: inline-block;\n            vertical-align: middle;\n            margin-right: 8rpx;\n            position: relative;\n            top: -2rpx;\n            left: 0;\n          }\n  \n          view:nth-child(1) {\n            view:nth-child(1) {\n              font-size: $font-base;\n              color: $main-color;\n              margin-right: 8rpx;\n              vertical-align: middle;\n            }\n          }\n  \n          view:nth-child(2) {\n            text {\n              margin-left: 5rpx;\n            }\n  \n            .alifont {\n              font-size: 32rpx;\n            }\n  \n            .icon-bianji-copy {\n              font-size: 28rpx;\n              position: relative;\n              top: 2rpx;\n              left: 0;\n            }\n  \n            .icon-lajitong {\n              position: relative;\n              top: 4rpx;\n            }\n          }\n  \n          .mr-40 {\n            margin-right: 40rpx;\n          }\n        }\n      }\n    }\n  \n    .btn {\n      background: $light-color;\n      position: fixed;\n      width: 690rpx;\n      bottom: 60rpx;\n      height: 80rpx;\n      left: 30rpx;\n      font-size: 30rpx;\n      line-height: 80rpx;\n  \n      .u-icon {\n        margin-right: 10rpx;\n      }\n    }\n  }"
  },
  {
    "path": "pages/mine/address/address.vue",
    "content": "<template>\r\n  <view class=\"address\">\r\n\r\n    <u-empty class=\"empty\" v-if=\"addressList.length == 0\" text=\"暂无收货地址\" mode=\"address\"></u-empty>\r\n    <view class=\"list\" v-else>\r\n      <view class=\"item c-content\" v-for=\"(item, index) in addressList\" :key=\"index\">\r\n        <view class=\"basic\" @click=\"selectAddressData(item)\">\r\n          <text>{{ item.name }}</text>\r\n          <text>{{ item.mobile }}</text>\r\n          <text class=\"default\" v-show=\"item.isDefault\">默认</text>\r\n          <view>\r\n            <div class=\"region\">\r\n              <span v-if=\"item.consigneeAddressPath[0]\">{{item.consigneeAddressPath[0]}}</span>\r\n              <span v-if=\"item.consigneeAddressPath[1]\">{{item.consigneeAddressPath[1]}}</span>\r\n              <span v-if=\"item.consigneeAddressPath[2]\">{{item.consigneeAddressPath[2]}}</span>\r\n              <span v-if=\"item.consigneeAddressPath[3]\">{{item.consigneeAddressPath[3]}}</span>\r\n              <span>{{ item.detail }}</span>\r\n            </div>\r\n          </view>\r\n        </view>\r\n        <view class=\"edit\">\r\n          <view class=\"relative\" @click=\"setDefault(item)\">\r\n            <view v-if=\"item.isDefault\" class=\"alifont icon-xuanzhong\"></view>\r\n            <text v-else class=\"unchecked\"></text>\r\n            <text>{{ item.isDefault ? \"默认地址\" : \"设为默认\" }}</text>\r\n          </view>\r\n          <view class=\"relative\">\r\n            <view class=\"alifont icon-bianji-copy\"></view>\r\n            <text class=\"mr-40\" @click=\"addAddress(item.id)\">编辑</text>\r\n            <view class=\"alifont icon-lajitong\"></view>\r\n            <text @click=\"removeAddress(item.id)\">删除</text>\r\n          </view>\r\n        </view>\r\n      </view>\r\n      <view style=\"height: 100px\"></view>\r\n    </view>\r\n    <button type=\"default\" class=\"btn\" @click=\"addAddress('')\">\r\n      <u-icon name=\"plus-circle\"></u-icon>\r\n      添加新收货人\r\n    </button>\r\n    <u-action-sheet :list=\"removeList\" :tips=\"tips\" v-model=\"showAction\" @click=\"deleteAddressMessage\"></u-action-sheet>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport * as API_Trade from \"@/api/trade\";\r\nimport * as API_Address from \"@/api/address.js\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      addressList: [], //地址列表\r\n      showAction: false, //是否显示下栏框\r\n      removeList: [\r\n        {\r\n          text: \"确定\",\r\n        },\r\n      ],\r\n      tips: {\r\n        text: \"确定要删除该收货人信息吗？\",\r\n      },\r\n      removeId: \"\", //删除的地址id\r\n      routerVal: \"\",\r\n      params: {\r\n        pageNumber: 1,\r\n        pageSize: 1000,\r\n      },\r\n    };\r\n  },\r\n  onPullDownRefresh() {\r\n    //下拉刷新\r\n    this.addressList = [];\r\n    this.getAddressList();\r\n  },\r\n  onLoad: function (val) {\r\n    this.routerVal = val;\r\n  },\r\n  onShow() {\r\n    this.addressList = [];\r\n    this.getAddressList();\r\n  },\r\n  onHide() {},\r\n  methods: {\r\n    async selectAddressData(val) {\r\n      await API_Trade.setAddressId(val.id, this.routerVal.way);\r\n\r\n      uni.navigateBack({\r\n        delta: 1,\r\n      });\r\n    },\r\n    //获取地址列表\r\n    getAddressList() {\r\n      uni.showLoading();\r\n\r\n      API_Address.getAddressList(\r\n        this.params.pageNumber,\r\n        this.params.pageSize\r\n      ).then((res) => {\r\n        res.data.result.records.forEach((item) => {\r\n          item.consigneeAddressPath = item.consigneeAddressPath.split(\",\");\r\n        });\r\n        this.addressList = res.data.result.records;\r\n        console.log(this.addressList);\r\n\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    },\r\n    //删除地址\r\n    removeAddress(id) {\r\n      this.removeId = id;\r\n      this.showAction = true;\r\n    },\r\n    deleteAddressMessage() {\r\n      API_Address.deleteAddress(this.removeId).then((res) => {\r\n        if (res.statusCode == 200) {\r\n          uni.showToast({\r\n            icon: \"none\",\r\n            title: \"删除成功\",\r\n          });\r\n          this.getAddressList();\r\n        } else {\r\n          uni.showToast({\r\n            icon: \"none\",\r\n            title: res.data.message,\r\n            duration: 2000,\r\n          });\r\n        }\r\n      });\r\n    },\r\n    //新建。编辑地址\r\n    addAddress(id) {\r\n      if (id) {\r\n        uni.navigateTo({\r\n          url:\r\n            \"/pages/mine/address/add?id=\" +\r\n            id +\r\n            \"&way=\" +\r\n            this.routerVal.way +\r\n            \"&type=order\",\r\n        });\r\n      } else {\r\n        uni.navigateTo({\r\n          url:\r\n            \"/pages/mine/address/add?way=\" + this.routerVal.way + \"&type=order\",\r\n        });\r\n      }\r\n    },\r\n    //设为默认地址\r\n    setDefault(item) {\r\n      delete item.updateBy;\r\n      delete item.updateTime;\r\n      delete item.deleteFlag;\r\n\r\n      item.isDefault ? \"\" : (item.isDefault = !item.isDefault);\r\n\r\n      API_Address.editAddress(item).then((res) => {\r\n        uni.showToast({\r\n          title: \"设置默认地址成功\",\r\n          icon: \"none\",\r\n        });\r\n        this.getAddressList();\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"./address.scss\";\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/address/addressManage.vue",
    "content": "<template>\n  <view class=\"address\">\n    <u-empty class=\"empty\" v-if=\"this.addressList.length === 0\" text=\"暂无收货地址\" mode=\"address\"></u-empty>\n    <view class=\"list\" >\n      <view class=\"item c-content\" v-for=\"(item, index) in addressList\" :key=\"index\">\n        <view class=\"basic\">\n          <text>{{ item.name }}</text>\n          <text>{{ item.mobile }}</text>\n          <text class=\"default\" v-show=\"item.isDefault\">默认</text>\n          <view>\n            <div class=\"region\">\n              <span v-if=\"item.consigneeAddressPath[0]\">{{item.consigneeAddressPath[0]}}</span>\n              <span v-if=\"item.consigneeAddressPath[1]\">{{item.consigneeAddressPath[1]}}</span>\n              <span v-if=\"item.consigneeAddressPath[2]\">{{item.consigneeAddressPath[2]}}</span>\n              <span v-if=\"item.consigneeAddressPath[3]\">{{item.consigneeAddressPath[3]}}</span>\n              <span>{{ item.detail }}</span>\n            </div>\n          </view>\n        </view>\n        <view class=\"edit\">\n          <view class=\"relative\" @click=\"setDefault(item)\">\n            <view v-if=\"item.isDefault\" class=\"alifont icon-xuanzhong\"></view>\n            <text v-else class=\"unchecked\"></text>\n            <text>{{ item.isDefault ? \"默认地址\" : \"设为默认\" }}</text>\n          </view>\n          <view class=\"relative\">\n            <view class=\"alifont icon-bianji-copy\"></view>\n            <text class=\"mr-40\" @click=\"addAddress(item.id)\">编辑</text>\n            <view class=\"alifont icon-lajitong\"></view>\n            <text @click=\"removeAddress(item.id)\">删除</text>\n          </view>\n        </view>\n      </view>\n      <view style=\"height: 100px\"></view>\n    </view>\n\n    <button type=\"default\" class=\"btn\" @click=\"addAddress('')\">\n      <u-icon name=\"plus-circle\"></u-icon>\n      添加新收货人\n    </button>\n\n    <u-action-sheet :list=\"removeList\" :tips=\"tips\" v-model=\"showAction\" @click=\"deleteAddressMessage\"></u-action-sheet>\n  </view>\n</template>\n\n<script>\nimport * as API_Address from \"@/api/address.js\";\nexport default {\n  data() {\n    return {\n      addressList: [], //地址列表\n      showAction: false, //是否显示下栏框\n\n      removeList: [\n        {\n          text: \"确定\",\n        },\n      ],\n      tips: {\n        text: \"确定要删除该收货人信息吗？\",\n      },\n      removeId: \"\", //删除的地址id\n      routerVal: \"\",\n      params: {\n        pageNumber: 1,\n        pageSize: 1000,\n      },\n    };\n  },\n  // 返回上一级\n  onBackPress(e) {\n    uni.switchTab({\n      url: \"/pages/tabbar/user/my\",\n    });\n    return true;\n  },\n  onLoad: function (val) {\n    this.routerVal = val;\n  },\n  onPullDownRefresh() {\n    //下拉刷新\n    this.addressList = [];\n    this.getAddressList();\n  },\n  /**\n   * 进入页面检测当前账户是否登录\n   */\n  onShow() {\n    if (this.$options.filters.tipsToLogin()) {\n      this.getAddressList();\n    }\n  },\n  methods: {\n    //获取地址列表\n    getAddressList() {\n      uni.showLoading();\n      API_Address.getAddressList(\n        this.params.pageNumber,\n        this.params.pageSize\n      ).then((res) => {\n        res.data.result.records.forEach((item) => {\n          item.consigneeAddressPath = item.consigneeAddressPath.split(\",\");\n        });\n        this.addressList = res.data.result.records;\n\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n      });\n    },\n    //删除地址\n    removeAddress(id) {\n      this.removeId = id;\n      this.showAction = true;\n    },\n    // 删除地址\n    deleteAddressMessage() {\n      API_Address.deleteAddress(this.removeId).then((res) => {\n        if (res.statusCode == 200) {\n          uni.showToast({\n            icon: \"none\",\n            title: \"删除成功\",\n          });\n          this.getAddressList();\n        } else {\n          uni.showToast({\n            icon: \"none\",\n            title: res.data.message,\n            duration: 2000,\n          });\n        }\n      });\n    },\n    //新建。编辑地址\n    addAddress(id) {\n      uni.navigateTo({\n        url: `/pages/mine/address/add${id ? \"?id=\" + id : \"\"}`,\n      });\n    },\n    //设为默认地址\n    setDefault(item) {\n      delete item.updateBy;\n      delete item.updateTime;\n      delete item.deleteFlag;\n\n      item.isDefault ? \"\" : (item.isDefault = !item.isDefault);\n\n      API_Address.editAddress(item).then(() => {\n        uni.showToast({\n          title: \"设置默认地址成功\",\n          icon: \"none\",\n        });\n        this.getAddressList();\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"./address.scss\";\n</style>\n"
  },
  {
    "path": "pages/mine/address/storeAddress.vue",
    "content": "<template>\n  <view class=\"address\">\n\n    <u-empty class=\"empty\" v-if=\"storeAddressList.length == 0\" text=\"暂无自提地址\" mode=\"address\"></u-empty>\n    <view class=\"list\" v-else>\n      <view class=\"item c-content\" v-for=\"(item, index) in storeAddressList\" :key=\"index\">\n        <view class=\"basic\" @click=\"selectAddressData(item)\">\n          <text>{{ item.addressName }}</text>\n          <text>{{ item.mobile }}</text>\n          <view>\n            <div class=\"region\">\n              <span>{{ item.address }}</span>\n            </div>\n          </view>\n        </view>\n      </view>\n      <view style=\"height: 100px\"></view>\n    </view>\n    <u-action-sheet :list=\"removeList\" :tips=\"tips\" v-model=\"showAction\" @click=\"deleteAddressMessage\"></u-action-sheet>\n  </view>\n</template>\n\n<script>\nimport * as API_Trade from \"@/api/trade\";\nimport * as API_Store from \"@/api/store.js\";\nexport default {\n  data() {\n    return {\n      storeAddressList: [], //地址列表\n      showAction: false, //是否显示下栏框\n      removeList: [\n        {\n          text: \"确定\",\n        },\n      ],\n      tips: {\n        text: \"确定要删除该收货人信息吗？\",\n      },\n      removeId: \"\", //删除的地址id\n      routerVal: \"\",\n      params: {\n        pageNumber: 1,\n        pageSize: 1000,\n      },\n    };\n  },\n  onPullDownRefresh() {\n    //下拉刷新\n    this.storeAddressList = [];\n    this.getAddressList();\n  },\n  onLoad: function (val) {\n    this.routerVal = val;\n  },\n  onShow() {\n    this.storeAddressList = [];\n    this.getAddressList();\n  },\n  onHide() {},\n  methods: {\n    async selectAddressData(val) {\n      await API_Trade.setStoreAddressId(val.id, this.routerVal.way);\n\n      uni.navigateBack({\n        delta: 1,\n      });\n    },\n    //获取地址列表\n    getAddressList() {\n      uni.showLoading();\n\n      API_Store.getStoreAddress(\n        this.routerVal.storeId,\n        this.params\n      ).then((res) => {\n        this.storeAddressList = res.data.result.records;\n        console.log(this.storeAddressList);\n\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"./address.scss\";\n</style>\n"
  },
  {
    "path": "pages/mine/deposit/index.vue",
    "content": "<template>\r\n  <view class=\"wap\">\r\n    <u-navbar  title=\"预存款列表\">\r\n    </u-navbar>\r\n    <view class=\"wrapper-show-money\">\r\n      <view class=\"money-view\">\r\n        <h3>预存款金额 </h3>\r\n        <view class=\"money\">￥{{walletNum | unitPrice }}</view>\r\n\r\n      </view>\r\n    </view>\r\n    <view class=\"wrapper-tabs\">\r\n\r\n      <swiper class=\"swiper-box\"  :current=\"swiperCurrent\">\r\n        <swiper-item class=\"swiper-item\" v-for=\"index in list.length\" :key=\"index\">\r\n          <scroll-view class=\"scroll-v view-wrapper\" enableBackToTop=\"true\" scroll-with-animation scroll-y @scrolltolower=\"loadMore\">\r\n            <view v-if=\"depositData.length!=0\" class=\"view-item\" v-for=\"(logItem, logIndex) in depositData\" :key=\"logIndex\">\r\n              <view class=\"view-item-detail\">\r\n                <view class=\"-title\">{{logItem.detail}}</view>\r\n                <!-- <view class=\"-number\">{{logItem.detail}}</view> -->\r\n              </view>\r\n              <view class=\"view-item-change\">\r\n                <view class=\"-money green\" v-if=\"logItem.serviceType == 'WALLET_PAY' || logItem.serviceType == 'WALLET_WITHDRAWAL'\"> {{logItem.money | unitPrice}} </view>\r\n                <view class=\"-money\" v-if=\"logItem.serviceType == 'WALLET_REFUND' || logItem.serviceType == 'WALLET_RECHARGE' || logItem.serviceType == 'WALLET_COMMISSION' \">\r\n                  +{{logItem.money | unitPrice}} </view>\r\n                <view class=\"-time\">{{logItem.createTime}}</view>\r\n              </view>\r\n            </view>\r\n\r\n            <u-empty v-if=\"depositData.length==0\" mode=\"history\" text=\"暂无记录\" />\r\n      \r\n          </scroll-view>\r\n\r\n        </swiper-item>\r\n\r\n      </swiper>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getUserRecharge, getWalletLog } from \"@/api/members\";\r\nimport { getUserWallet } from \"@/api/members\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      walletNum: 0,\r\n      current: 0,\r\n      swiperCurrent: 0,\r\n      userInfo: \"\", //用户详情信息\r\n      params: {\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n        order: \"desc\",\r\n      },\r\n      depositData: [], //遍历的数据集合\r\n      rechargeList: \"\", //充值明细列表\r\n      walletLogList: \"\", //钱包变动列表\r\n      list: [\r\n        // {\r\n        //   name: \"充值明细\",\r\n        // },\r\n        {\r\n          name: \"预存款变动明细\",\r\n        },\r\n      ],\r\n    };\r\n  },\r\n  watch: {\r\n    swiperCurrent(index) {\r\n      this.swiperCurrent = index;\r\n    },\r\n  },\r\n  async mounted() {\r\n    this.getWallet();\r\n    let result = await getUserWallet(); //预存款\r\n\r\n    this.walletNum = result.data.result.memberWallet;\r\n  },\r\n  methods: {\r\n   \r\n    /**分页获取预存款充值记录 */\r\n    getRecharge() {\r\n      getUserRecharge(this.params).then((res) => {\r\n        if (res.data.success) {\r\n          if (res.data.result.records.length != 0) {\r\n            this.depositData.push(...res.data.result.records);\r\n          }\r\n        }\r\n      });\r\n    },\r\n\r\n    getWallet() {\r\n    \r\n      getWalletLog(this.params).then((res) => {\r\n        if (res.data.success) {\r\n          if (res.data.result.records.length != 0) {\r\n            this.depositData.push(...res.data.result.records);\r\n          }\r\n        }\r\n      });\r\n    },\r\n\r\n  \r\n    changed(index) {\r\n      this.depositData = [];\r\n      this.swiperCurrent = index;\r\n      this.params.pageNumber = 1;\r\n      if (index == 0) {\r\n        // this.getRecharge();\r\n        this.getWallet();\r\n      } else {\r\n        this.getWallet();\r\n      }\r\n    },\r\n\r\n    loadMore() {\r\n      this.params.pageNumber++;\r\n      this.getWallet();\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.green {\r\n    color: $aider-color-green !important;\r\n  }\r\n  .view-item {\r\n    padding: 32rpx;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n  }\r\n  .view-item-change {\r\n    text-align: right;\r\n    > .-money {\r\n      font-size: 36rpx;\r\n      color: $main-color;\r\n      font-weight: bold;\r\n    }\r\n    > .-time {\r\n      font-size: 22rpx;\r\n      color: #999;\r\n    }\r\n  }\r\n  .view-item-detail {\r\n    line-height: 1.75;\r\n    > .-title {\r\n      font-size: 28rpx;\r\n    }\r\n    > .-number {\r\n      font-size: 22rpx;\r\n      color: #999;\r\n    }\r\n  }\r\n  .submit-btn {\r\n    line-height: 90rpx;\r\n    text-align: center;\r\n  \r\n    color: #fff;\r\n    background: $main-color;\r\n  \r\n    margin: 0 auto;\r\n    height: 90rpx;\r\n  }\r\n  \r\n  .operation {\r\n    font-size: 32rpx;\r\n    margin-right: 24rpx;\r\n    color: rgb(96, 98, 102);\r\n  }\r\n  .money {\r\n    font-size: 40rpx;\r\n    font-weight: bold;\r\n  }\r\n  \r\n  .money-view {\r\n    height: 100%;\r\n    width: 100%;\r\n    padding: 0 32rpx;\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: center;\r\n    flex-direction: column;\r\n    color: #fff;\r\n    background-image: linear-gradient(\r\n      25deg,\r\n      $main-color,\r\n      $light-color,\r\n      $aider-light-color\r\n    );\r\n  }\r\n  \r\n  .swiper-item,\r\n  .scroll-v {\r\n    height: 100%;\r\n  }\r\n  \r\n  .swiper-box {\r\n    /* #ifndef H5 */\r\n    height: calc(100vh - 200rpx);\r\n    /* #endif */\r\n  \r\n    /* #ifdef H5 */\r\n    height: calc(100vh - 288rpx);\r\n    /* #endif */\r\n  }\r\n  \r\n  .wap {\r\n    width: 100%;\r\n    height: calc(100vh - 44px);\r\n  }\r\n  \r\n  .wrapper-show-money {\r\n    height: 200rpx;\r\n    // background-image: url('/static/img/main-bg.jpg');\r\n  }\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/deposit/info.vue",
    "content": "<template>\n  <view class=\"wrapper\">\n    <u-cell-group>\n      <u-cell-item title=\"申请单号\"></u-cell-item>\n      <u-cell-item title=\"提现金额\" value=\"新版本\"></u-cell-item>\n      <u-cell-item title=\"收款银行\"></u-cell-item>\n      <u-cell-item title=\"收款账号\" value=\"新版本\"></u-cell-item>\n      <u-cell-item title=\"开户人姓名\"></u-cell-item>\n      <u-cell-item title=\"创建时间\" value=\"新版本\"></u-cell-item>\n      <u-cell-item title=\"提现状态\" value=\"新版本\"></u-cell-item>\n    </u-cell-group>\n  </view>\n</template>\n\n<script>\nexport default {};\n</script>\n\n<style lang=\"scss\" scoped>\n.wrapper {\n}\n</style>\n"
  },
  {
    "path": "pages/mine/deposit/operation.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <u-navbar :custom-back=\"back\" title=\"余额\"></u-navbar>\n    <div class=\"box\">\n      <div class=\"deposit\">预存款金额</div>\n      <div class=\"money\">￥{{walletNum | unitPrice }}</div>\n      <div class=\"operation-btns\">\n        <div class=\"operation-btn light\" @click=\"navigateTo('/pages/mine/deposit/withdrawal')\">提现</div>\n        <div class=\"operation-btn\" @click=\"navigateTo('/pages/mine/deposit/recharge')\">充值</div>\n      </div>\n    </div>\n    <div class=\"box list\" @click=\"navigateTo('/pages/mine/deposit/index')\">\n      <div class=\"list-left\">预存款明细</div>\n      <div class=\"list-right\">\n        <u-icon name=\"arrow-right\"></u-icon>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getUserWallet } from \"@/api/members\";\nexport default {\n  data() {\n    return {\n      walletNum: 0,\n    };\n  },\n  async onShow() {\n    if (this.$options.filters.isLogin(\"auth\")) {\n      let result = await getUserWallet(); //预存款\n      this.walletNum = result.data.result.memberWallet;\n    } else {\n      this.$options.filters.navigateToLogin(\"redirectTo\");\n    }\n  },\n  methods: {\n    back() {\n      uni.switchTab({\n        url: \"/pages/tabbar/user/my\",\n      });\n    },\n    /**\n     * 跳转\n     */\n    navigateTo(url) {\n      uni.navigateTo({\n        url,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.list {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.list-left {\n  flex: 8;\n}\n.list-right {\n  flex: 2;\n  text-align: right;\n}\n.wrapper {\n  width: 94%;\n  margin: 0 3%;\n}\n.box {\n  margin: 20rpx 0;\n  background: #fff;\n  border-radius: 20rpx;\n\n  padding: 40rpx;\n}\n.operation-btns {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.money {\n  text-align: center;\n  color: #333;\n  font-size: 50rpx;\n  margin: 20rpx 0 40rpx 0;\n  letter-spacing: 2rpx;\n}\n.deposit {\n  margin-top: 50rpx;\n  text-align: center;\n  color: #999;\n  font-size: 28rpx;\n\n  letter-spacing: 2rpx;\n}\n.operation-btn {\n  background: #ee6d41;\n  color: #fff;\n  height: 90rpx;\n  width: 240rpx;\n  margin: 0 20rpx;\n  border-radius: 10rpx;\n  text-align: center;\n  line-height: 90rpx;\n  font-size: 32rpx;\n}\n.light {\n  background: #fdf2ee;\n  color: #ee6d41;\n}\n</style>"
  },
  {
    "path": "pages/mine/deposit/recharge.vue",
    "content": "\n<template>\n  <view>\n    <view class=\"-list\">\n      <view class=\"title\">充值金额</view>\n      <view class=\"content\">\n        <view class=\"price\">\n          <span> ￥</span>\n          <u-input v-model=\"price\" placeholder='金额' type=\"number\" />\n\t\t\t\t\t\n        </view>\n\n      </view>\n    </view>\n\n    <view class=\"submit\" :class=\"{'light':flag}\" @click=\"handlerRecharge\">充值</view>\n  </view>\n</template>\n<script>\nimport { recharge } from \"@/api/members\";\nexport default {\n  data() {\n    return {\n      price: 0,\n      flag: true,\n    };\n  },\n  watch: {\n    price(val) {\n      val <= 0 ? (this.flag = true) : (this.flag = false);\n    },\n  },\n  mounted() {},\n  methods: {\n    // 充值\n    async handlerRecharge() {\n      if (this.price > 0) {\n       \n        let res = await recharge({ price: this.price });\n        if (res.data.success) {\n          uni.navigateTo({\n            url: `/pages/cart/payment/payOrder?orderType=RECHARGE&recharge_sn=${res.data.result.rechargeSn}`,\n          });\n        }\n      }\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import './style.scss';\n</style>"
  },
  {
    "path": "pages/mine/deposit/style.scss",
    "content": "/deep/ .u-input__input,\n.u-input {\n  font-size: 80rpx !important;\n  height: 102rpx !important;\n}\n/deep/ .u-input__input {\n  height: 100%;\n  font-size: 80rpx;\n}\n.content {\n  display: flex;\n  > .price {\n    width: 60%;\n    margin: 20rpx 0;\n    font-size: 80rpx;\n    display: flex;\n  }\n  > .all {\n    justify-content: center;\n    width: 40%;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-end;\n  }\n}\n.-list {\n  margin: 20rpx 0;\n  background: #fff;\n  padding: 16rpx 32rpx;\n}\n.title {\n  font-size: 35rpx;\n}\n.light {\n  opacity: 0.6;\n}\n.submit {\n  margin: 80rpx auto;\n  width: 94%;\n  background: $light-color;\n  height: 90rpx;\n  color: #fff;\n  border-radius: 10rpx;\n  text-align: center;\n  line-height: 90rpx;\n}"
  },
  {
    "path": "pages/mine/deposit/withdrawal.vue",
    "content": "<template>\n  <view>\n    <view class=\"-list\">\n      <view class=\"title\">提现类型</view>\n      <view class=\"content\">\n        <view class=\"price\">\n          <u-input disabled :value=\"type === 'ALI' ? '支付宝' : '微信'\" placeholder=\"\" />\n        </view>\n\t  </view>\n    </view>\n\t<view class=\"-list\">\n\t  <view class=\"title\">提现金额</view>\n\t  <view class=\"content\">\n\t\t<view class=\"price\">\n\t      <span> ￥</span>\n\t      <u-input v-model=\"price\" placeholder=\"\" type=\"number\" />\n\t    </view>\n\t\n\t    <view class=\"all\">\n\t      <view @click=\"handleAll\" :style=\"{ color: $mainColor }\">全部</view>\n\t      <view style=\"font-size: 24rpx; color: #999\">可提现金额<span>{{ walletNum | unitPrice }}</span>元</view>\n\t    </view>\n\t\n\t  </view>\n\t  <view class=\"tips\">\n\t    最低提现金额为 {{ minPrice }} 元\n\t  </view>\n\t</view>\n\t<view class=\"-list\" v-if=\"type === 'ALI'\">\n\t  <view class=\"title\">真实姓名</view>\n\t  <view class=\"content\">\n\t\t<view class=\"price\">\n\t\t  <u-input v-model=\"realName\" placeholder=\"\" />\n\t\t</view>\n\t  </view>\n\t</view>\n\t<view class=\"-list\" v-if=\"type === 'ALI'\">\n\t  <view class=\"title\">第三方登录账号</view>\n\t  <view class=\"content\">\n\t\t<view class=\"price\">\n\t\t  <u-input v-model=\"connectNumber\" placeholder=\"\" />\n\t\t</view>\n\t  </view>\n\t</view>\n\n    <view class=\"submit\" @click=\"cashd\">提现</view>\n  </view>\n</template>\n<script>\nimport { getUserWallet, withdrawalApply, withdrawalSettingVO } from \"@/api/members\";\nexport default {\n  data() {\n    return {\n      price: 0,\n      walletNum: 0,\n\t  minPrice: 0,\n\t  type: '',\n\t  connectNumber: '',\n\t  realName: ''\n    };\n  },\n  async mounted() {\n    let result = await getUserWallet(); //预存款\n\tlet res = await withdrawalSettingVO();\n    this.walletNum = result.data.result.memberWallet;\n\tthis.minPrice = res.data.result.minPrice;\n\tthis.type = res.data.result.type;\n  },\n\n  methods: {\n    cashd() {\n      this.price = this.price + \"\";\n\n      if (this.$u.test.amount(parseInt(this.price))) {\n\t\tlet params = { price: this.price };\n\t\tif (this.type === 'ALI') {\n\t\t\tif (!this.connectNumber || !this.realName) {\n\t\t\t\tuni.showToast({\n\t\t\t\t  title: \"请输入真实姓名和第三方登录账号\",\n\t\t\t\t  duration: 2000,\n\t\t\t\t  icon: \"none\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tparams.connectNumber = this.connectNumber;\n\t\t\tparams.realName = this.realName;\n\t\t}\n        withdrawalApply(params).then((res) => {\n          if (res.data.success) {\n            uni.showToast({\n              title: \"提现成功!\",\n              duration: 2000,\n              icon: \"none\",\n            });\n            setTimeout(() => {\n              uni.navigateBack({\n                delta: 1,\n              });\n            }, 1000);\n          }\n        });\n      } else {\n        uni.showToast({\n          title: \"请输入正确金额\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n    handleAll() {\n      this.price = this.walletNum;\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./style.scss\";\n.tips {\n  font-size: 24rpx;\n  color: #999;\n}\n</style>"
  },
  {
    "path": "pages/mine/distribution/achievement.vue",
    "content": "<template>\n    \n</template>\n<script>\nexport default {\n    \n}\n</script>\n<style lang=\"scss\" scoped>\n\n</style>"
  },
  {
    "path": "pages/mine/distribution/auth.vue",
    "content": "<template>\n  <view class=\"wrapper\">\n    <view>\n      <h4>实名认证（请上传真实的个人信息，认证通过后将无法修改）</h4>\n      <view>\n        <u-form :model=\"ruleForm\" label-width=\"200rpx\" ref=\"uForm\">\n          <u-form-item label=\"姓名\" prop=\"name\">\n            <u-input v-model=\"ruleForm.name\" placeholder=\"请输入您的真实姓名\" />\n          </u-form-item>\n          <u-form-item label=\"身份证\" prop=\"idNumber\">\n            <u-input v-model=\"ruleForm.idNumber\" placeholder=\"请输入身份证号码\" />\n          </u-form-item>\n          <u-form-item label=\"银行开户行\" prop=\"settlementBankBranchName\">\n            <u-input v-model=\"ruleForm.settlementBankBranchName\" type=\"text\" placeholder=\"请输入银行开户行\" />\n          </u-form-item>\n          <u-form-item label=\"银行开户名\" prop=\"settlementBankAccountName\">\n            <u-input v-model=\"ruleForm.settlementBankAccountName\" type=\"text\" placeholder=\"请输入银行开户名\" />\n          </u-form-item>\n          <u-form-item label=\"银行账号\" prop=\"settlementBankAccountNum\">\n            <u-input v-model=\"ruleForm.settlementBankAccountNum\" type=\"text\" placeholder=\"请输入银行账号\" />\n          </u-form-item>\n          <!-- <u-form-item label=\"身份证正面照\" prop=\"name\">\n            <u-upload></u-upload>\n          </u-form-item>\n          <u-form-item label=\"身份证反面照\" prop=\"name\">\n            <u-upload></u-upload>\n          </u-form-item>\n          <u-form-item label=\"手持身份证照\" prop=\"name\">\n            <u-upload></u-upload>\n          </u-form-item> -->\n        </u-form>\n        <u-button :customStyle=\"{'background':$lightColor,'color':'#fff' }\" @click=\"submit\">提交</u-button>\n      </view>\n    </view>\n\n    <view class=\"tips\">\n      <view>您提交的信息正在审核</view>\n      <view>提交认证申请后，工作人员将在三个工作日进行核对完成审核</view>\n    </view>\n  </view>\n</template>\n<script>\nimport { applyDistribution } from \"@/api/goods\";\nimport { checkBankno } from \"@/utils/Foundation\";\nexport default {\n  data() {\n    return {\n      ruleForm: {\n        name: \"\",\n        idNumber: \"\",\n        settlementBankBranchName: \"\", // 银行开户行\n        settlementBankAccountName: \"\", //银行开户名\n        settlementBankAccountNum: \"\", //银行账号\n      },\n      rules: {\n        name: [\n          {\n            required: true,\n            message: \"请输入姓名\",\n            // 可以单个或者同时写两个触发验证方式\n            trigger: \"blur\",\n          },\n          {\n            // 自定义验证函数，见上说明\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return this.$u.test.chinese(value);\n            },\n            message: \"姓名输入不正确\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n        // 银行开户行\n        settlementBankBranchName: [\n          {\n            required: true,\n            message: \"银行开户行\",\n            // 可以单个或者同时写两个触发验证方式\n            trigger: \"blur\",\n          },\n          {\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return this.$u.test.chinese(value);\n            },\n            message: \"银行开户行不正确\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          },\n        ], //银行开户名\n        settlementBankAccountName: [\n          {\n            required: true,\n            message: \"银行开户名\",\n            // 可以单个或者同时写两个触发验证方式\n            trigger: \"blur\",\n          },\n        ],\n        //银行账号\n        settlementBankAccountNum: [\n          {\n            required: true,\n            message: \"银行账号不正确\",\n            // 可以单个或者同时写两个触发验证方式\n            trigger: \"blur\",\n          },\n          {\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return checkBankno(value);\n            },\n            message: \"银行账号不正确\",\n          },\n        ],\n        idNumber: [\n          {\n            required: true,\n            message: \"请输入身份证\",\n            // 可以单个或者同时写两个触发验证方式\n            trigger: \"blur\",\n          },\n          {\n            // 自定义验证函数，见上说明\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return this.$u.test.idCard(value);\n            },\n            message: \"身份证号码不正确\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n      },\n    };\n  },\n  methods: {\n    submit() {\n      this.$refs.uForm.validate((valid) => {\n        if (valid) {\n          applyDistribution(this.ruleForm).then((res) => {\n            if (res.data.success) {\n              uni.showToast({\n                title: \"认证提交成功!\",\n                duration: 2000,\n                icon: \"none\",\n              });\n\n              setTimeout(() => {\n                uni.navigateBack();\n              }, 500);\n            } else {\n              uni.showToast({\n                title: res.data.message,\n                duration: 2000,\n                icon: \"none\",\n              });\n            }\n          });\n        } else {\n          uni.showToast({\n            title: \"请填写有效信息\",\n            duration: 2000,\n            icon: \"none\",\n          });\n        }\n      });\n    },\n  },\n  onReady() {\n    this.$refs.uForm.setRules(this.rules);\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.wrapper {\n  padding: 32rpx;\n}\n.tips {\n  margin-top: 20rpx;\n  font-size: 24rpx;\n  color: #999;\n}\n</style>"
  },
  {
    "path": "pages/mine/distribution/history.vue",
    "content": "<template>\n  <view class=\"log-list\">\n    <!-- 提现记录 -->\n    <view class=\"log-way\" v-if=\"cashLogData.length != 0\" v-for=\"(item, index) in cashLogData\" :key=\"index\">\n      <view class=\"log-item\">\n        <view class=\"log-item-view\">\n          <view class=\"title\">{{\n            item.distributionCashStatus == \"APPLY\"\n              ? \"待处理\"\n              : item.distributionCashStatus == \"VIA_AUDITING\"\n                ? \"通过\"\n                : \"拒绝\"\n          }}</view>\n          <view class=\"price\">+{{ item.price | unitPrice }}</view>\n        </view>\n        <view class=\"log-item-view\">\n          <view>{{ item.createTime }}</view>\n          <view></view>\n        </view>\n      </view>\n    </view>\n    <!-- 分销业绩 -->\n    <view class=\"log-way\" v-if=\"achievementData.length != 0\" v-for=\"(item, index) in achievementData\" :key=\"index\">\n      <view class=\"log-item\">\n        <view class=\"log-item-view\">\n          <view class=\"title\">{{ item.goodsName }}</view>\n          <view class=\"price\">提成金额：+{{ item.rebate | unitPrice }}</view>\n        </view>\n        <view class=\"log-item-view\">\n          <view>创建时间：{{ item.createTime }}</view>\n          <view>店铺：{{ item.storeName }}</view>\n        </view>\n        <view class=\"log-item-footer\">\n          <view>会员名称：{{ item.memberName }}</view>\n        </view>\n        <view class=\"log-item-footers\">\n          <view>订单号：{{ item.orderSn }}</view>\n        </view>\n      </view>\n    </view>\n    <view class=\"empty\" v-if=\"empty\">\n      <u-loadmore :status=\"status\" :icon-type=\"iconType\" bg-color=\"#f7f7f7\" />\n    </view>\n  </view>\n</template>\n<script>\nimport { cashLog, distributionOrderList } from \"@/api/goods\";\nexport default {\n  data () {\n    return {\n      cashLogData: [], //提现记录数据集合\n      achievementData: [], //分销业绩数据合集,\n      status: \"loadmore\",\n      iconType: \"flower\",\n      empty: false,\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n      },\n\n      type: 0,\n      routers: \"\",\n      achParams: {\n        pageNumber: 1,\n        pageSize: 10,\n      },\n    };\n  },\n  onLoad (option) {\n    let title;\n    option.type == 0 ? (title = \"分销业绩\") : (title = \"提现记录\");\n\n    uni.setNavigationBarTitle({\n      title: title, //这是修改后的导航栏文字\n    });\n    this.routers = option;\n    this.type = option.type;\n    option.type == 0 ? this.achievement() : this.history();\n  },\n  mounted () { },\n  onReachBottom () {\n    this.status = \"loading\";\n    this.type == 0 ? this.achParams.pageNumber++ : this.params.pageNumber++;\n    this.type == 0 ? this.achievement() : this.history();\n  },\n  methods: {\n    // 业绩\n    achievement () {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      distributionOrderList(this.achParams).then((res) => {\n        if (res.data.success && res.data.result.records.length >= 1) {\n          this.achievementData.push(...res.data.result.records);\n        } else {\n          this.status = \"nomore\";\n          this.empty = true;\n        }\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n      });\n    },\n    // 初始化提现历史\n    history () {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      cashLog(this.params).then((res) => {\n        if (res.data.success && res.data.result.records.length >= 1) {\n          this.cashLogData.push(...res.data.result.records);\n        } else {\n          this.status = \"nomore\";\n          this.empty = true;\n        }\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.empty {\n  margin: 40rpx 0;\n}\n\n.price {\n  color: $main-color;\n  font-weight: bold;\n}\n\n.log-list {\n  padding: 0 8rpx;\n  overflow: hidden;\n  margin: 20rpx 0;\n}\n\n.log-way {\n  margin: 10rpx 0;\n  overflow: hidden;\n  background: #fff;\n  border-radius: 10rpx;\n  padding: 20rpx 0;\n}\n\n.title {\n  font-size: 30rpx;\n  font-weight: bold;\n}\n\n.log-item-view {\n  padding: 8rpx 32rpx;\n  display: flex;\n  font-size: 13px;\n  justify-content: space-between;\n}\n\n.log-item-footer {\n  padding: 8rpx 32rpx;\n  display: flex;\n  font-size: 13px;\n  justify-content: space-between;\n}\n\n.log-item-footers {\n  padding: 8rpx 32rpx;\n  display: flex;\n  font-size: 13px;\n  justify-content: space-between;\n}\n</style>\n"
  },
  {
    "path": "pages/mine/distribution/home.vue",
    "content": "<template>\r\n  <view>\r\n\t\r\n    <view class=\"nav-list\">\r\n      <view class=\"total\">可提现金额</view>\r\n      <view class=\"price\">{{ distributionData.canRebate | unitPrice }}</view>\r\n      <view class=\"frozen\"\r\n        >冻结金额{{ distributionData.commissionFrozen | unitPrice }}</view\r\n      >\r\n    </view>\r\n    <view class=\"nav\">\r\n      <view class=\"nav-item\">\r\n        <u-icon\r\n          size=\"50\"\r\n          @click=\"handleClick('/pages/mine/distribution/list?id='+distributionData.id+'&name='+distributionData.memberName)\"\r\n          color=\"#ff6b35\"\r\n          name=\"bag-fill\"\r\n        ></u-icon>\r\n        <view>分销商品</view>\r\n      </view>\r\n      <view\r\n        class=\"nav-item\"\r\n        @click=\"handleClick(`/pages/mine/distribution/history?type=0&id=${distributionData.id}&name=${distributionData.memberName}`)\"\r\n      >\r\n        <u-icon size=\"50\" color=\"#ff6b35\" name=\"order\"></u-icon>\r\n        <view>分销业绩</view>\r\n      </view>\r\n      <view\r\n        class=\"nav-item\"\r\n        @click=\"handleClick('/pages/mine/distribution/history?type=1')\"\r\n      >\r\n        <u-icon size=\"50\" color=\"#ff6b35\" name=\"red-packet-fill\"></u-icon>\r\n        <view>提现记录</view>\r\n      </view>\r\n      <view\r\n        class=\"nav-item\"\r\n        @click=\"handleClick('/pages/mine/distribution/withdrawal')\"\r\n      >\r\n        <u-icon size=\"50\" color=\"#ffc71c\" name=\"rmb-circle-fill\"></u-icon>\r\n        <view>提现</view>\r\n      </view>\r\n  \r\n     \r\n    </view>\r\n\r\n  </view>\r\n</template>\r\n\r\n<script>\r\n\r\nimport { distribution } from \"@/api/goods\";\r\nexport default {\r\n\r\n  data() {\r\n    return {\r\n      distributionData: \"\",\r\n    };\r\n  },\r\n  methods: {\r\n    handleClick(url) {\r\n      uni.navigateTo({\r\n        url,\r\n      });\r\n    },\r\n    queryGoods(src) {\r\n      uni.navigateTo({\r\n        url: `/pages/mine/distribution/${src}`,\r\n      });\r\n    },\r\n    /**\r\n     * 初始化推广商品\r\n     */\r\n    init() {\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      distribution().then((res) => {\r\n        if (res.data.result) {\r\n          this.distributionData = res.data.result;\r\n        }\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    },\r\n  },\r\n  onShow() {\r\n    this.init();\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.nav {\r\n  background: #fff;\r\n  align-items: center;\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n}\r\n.nav-list {\r\n  color: #fff;\r\n  padding: 40rpx 0;\r\n  background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);\r\n}\r\n.total {\r\n  padding: 10rpx 0;\r\n  text-align: center;\r\n  font-size: 28rpx;\r\n  opacity: 0.8;\r\n}\r\n.frozen {\r\n  text-align: center;\r\n  font-size: 24rpx;\r\n  opacity: 0.8;\r\n}\r\n.price {\r\n  text-align: center;\r\n  color: #fff;\r\n  font-size: 50rpx;\r\n}\r\n.nav-item {\r\n  height: 240rpx;\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  justify-content: center;\r\n  > * {\r\n    margin: 10rpx 0;\r\n  }\r\n  width: 33%;\r\n  //   color: #fff;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/distribution/join.vue",
    "content": "<template>\r\n  <view class=\"wrapper\">\r\n    <u-tabs\r\n      :list=\"list\"\r\n      :is-scroll=\"false\"\r\n      :current=\"current\"\r\n      @change=\"change\"\r\n      :active-color=\"$lightColor\"\r\n    ></u-tabs>\r\n\r\n  \r\n\r\n    <!-- 推广人资料 -->\r\n    <view class=\"message\">\r\n      <u-form :model=\"ruleForm\" label-width=\"250rpx\" ref=\"uForm\">\r\n        <u-form-item label=\"会员昵称\" prop=\"name\">\r\n          <u-input v-model=\"ruleForm.name\" />\r\n        </u-form-item>\r\n        <u-form-item label=\"账户类型\" prop=\"name\"> </u-form-item>\r\n        <u-form-item\r\n          label=\"收款人姓名\"\r\n          placeholder=\"请输入收款人姓名\"\r\n          prop=\"name\"\r\n        >\r\n          <u-input v-model=\"ruleForm.name\" />\r\n        </u-form-item>\r\n        <u-form-item\r\n          label=\"收款账号\"\r\n          placeholder=\"请输入收款人账号\"\r\n          prop=\"name\"\r\n        >\r\n          <u-input v-model=\"ruleForm.name\" />\r\n        </u-form-item>\r\n        <u-form-item\r\n          label=\"银行名称\"\r\n          placeholder=\"请输入开户银行支行名称\"\r\n          prop=\"name\"\r\n        >\r\n          <u-input v-model=\"ruleForm.name\" />\r\n        </u-form-item>\r\n      </u-form>\r\n      <u-button  :customStyle=\"{'background':$lightColor,'color':'#fff' }\"  @click=\"submit\">提交</u-button>\r\n    </view>\r\n  </view>\r\n</template>\r\n<script>\r\nexport default {\r\n  components: {},\r\n  // 必须要在onReady生命周期，因为onLoad生命周期组件可能尚未创建完毕\r\n  onReady() {\r\n    this.$refs.uForm.setRules(this.rules);\r\n  },\r\n  data() {\r\n    return {\r\n      current:0,\r\n      list: [\r\n        {\r\n          name: \"推广人资料\",\r\n        },\r\n        {\r\n          name: \"平台审核\",\r\n        },\r\n        {\r\n          name: \"完成\",\r\n        },\r\n      ],\r\n      ruleForm: {\r\n        name: \"\",\r\n        radio: \"\",\r\n      },\r\n      rules: {\r\n        name: [\r\n          {\r\n            required: true,\r\n            message: \"请输入姓名\",\r\n            // 可以单个或者同时写两个触发验证方式\r\n            trigger: \"blur\",\r\n          },\r\n        ],\r\n      },\r\n    };\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.menu {\r\n  height: 88rpx;\r\n  line-height: 88rpx;\r\n  background: $main-color;\r\n  display: flex;\r\n  > .menu-item {\r\n    flex: 1;\r\n    text-align: center;\r\n    color: $light-color;\r\n  }\r\n}\r\n.active {\r\n  color: #fff !important;\r\n}\r\n.message {\r\n  padding: 0 32rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/distribution/list.vue",
    "content": "<template>\n  <view class=\"wrapper\">\n    <!-- 筛选弹出层 TODO后续版本更新 -->\n    <!-- <u-popup width=\"90%\" v-model=\"popup\" mode=\"right\">\n      <view class=\"screen-title\">商品筛选</view>\n\n      <view class=\"screen-view\">\n        <view class=\"screen-item\">\n          <h4>价格区间</h4>\n          <view class=\"flex\">\n            <u-input class=\"u-bg\" placeholder-style=\"font-size:22rpx;\" type=\"number\" input-align=\"center\" placeholder=\"最低价\"></u-input>\n            <view class=\"line\"></view>\n            <u-input class=\"u-bg\" placeholder-style=\"font-size:22rpx;\" type=\"number\" input-align=\"center\" placeholder=\"最高价\"></u-input>\n          </view>\n        </view>\n        <view class=\"screen-item\">\n          <h4>销量</h4>\n          <view class=\"flex\">\n            <u-input class=\"u-bg w200 flex1\" placeholder-style=\"font-size:22rpx;\" type=\"number\" input-align=\"center\" placeholder=\"销量\"></u-input>\n            <view class=\"flex1\">笔以上</view>\n          </view>\n        </view>\n        <view class=\"screen-item\">\n          <h4>收入比率</h4>\n          <view class=\"flex\">\n            <u-input class=\"u-bg\" placeholder-style=\"font-size:22rpx;\" type=\"number\" input-align=\"center\" placeholder=\"最低%\"></u-input>\n            <view class=\"line\"></view>\n            <u-input class=\"u-bg\" placeholder-style=\"font-size:22rpx;\" type=\"number\" input-align=\"center\" placeholder=\"最高%\"></u-input>\n          </view>\n        </view>\n        <view class=\"screen-item\">\n          <h4>包邮</h4>\n          <view class=\"flex\">\n            <u-tag class=\"u-tag\" shape=\"circle\" text=\"包邮\" mode=\"plain\" type=\"info\" />\n          </view>\n        </view>\n        <view class=\"screen-item\">\n          <h4>促销活动</h4>\n          <view class=\"flex\">\n            <u-tag class=\"u-tag\" shape=\"circle\" text=\"限时抢购\" mode=\"plain\" type=\"info\" />\n            <u-tag class=\"u-tag\" shape=\"circle\" text=\"拼团秒杀\" mode=\"plain\" type=\"info\" />\n          </view>\n        </view>\n        <view class=\"screen-item\">\n          <h4>经营类型</h4>\n          <view class=\"flex\">\n            <u-tag class=\"u-tag\" shape=\"circle\" text=\"平台自营\" mode=\"plain\" type=\"info\" />\n            <u-tag class=\"u-tag\" shape=\"circle\" text=\"三方店铺\" mode=\"plain\" type=\"info\" />\n          </view>\n        </view>\n      </view>\n\n      <view class=\"screen-btn\">\n        <view class=\"screen-clear\"> 重置 </view>\n        <view class=\"screen-submit\"> 确定 </view>\n      </view>\n    </u-popup> -->\n\n    <!-- 导航栏 -->\n    <view class=\"nav\">\n      <view class=\"nav-item\" @click=\"handleMyGoods(true)\" :class=\"{ checked: params.checked }\">已选择</view>\n      <view class=\"nav-item\" @click=\"handleMyGoods(false)\" :class=\"{ checked: !params.checked }\">未选择</view>\n\n      <!-- <view class=\"nav-item\" @click=\"popup = !popup\">筛选</view> -->\n    </view>\n    <!-- 商品列表 -->\n\n    <view class=\"goods-list\">\n      <scroll-view class=\"body-view\" scroll-y @scrolltolower=\"renderDate\">\n        <u-swipe-action v-for=\"(item, index) in goodsList\" :disabled=\"!params.checked\" :show=\"item.___selected\" @open=\"openAction(item)\" :index=\"index\" :options=\"options\" bg-color=\"#fff\"\n                        ref=\"swiperAction\" :key=\"item.id\" @click=\"changeActionTab(item)\">\n\n          <div class=\"goods-item\">\n            <view class=\"goods-item-img\" @click=\"handleNavgationGoods(item)\">\n              <u-image width=\"176rpx\" height=\"176rpx\" :src=\"item.thumbnail\"></u-image>\n            </view>\n            <view class=\"goods-item-desc\">\n              <!-- 商品描述 -->\n              <view class=\"-item-title\" @click=\"handleNavgationGoods(item)\">\n                {{ item.goodsName }}\n              </view>\n              <!-- 商品金额 -->\n              <view class=\"-item-price\" @click=\"handleNavgationGoods(item)\">\n                佣金:\n                <span> ￥{{ item.commission | unitPrice }}</span>\n              </view>\n              <!-- 比率佣金 -->\n              <view class=\"-item-bottom\">\n                <view class=\"-item-bootom-money\" @click=\"handleNavgationGoods(item)\">\n                  <!-- <view class=\"-item-bl\">\n                  比率:\n                  <span>{{ \"5.00%\" }}</span>\n                </view> -->\n                  <view class=\"-item-yj\">\n                    <span>￥{{ item.price | unitPrice }}</span>\n                  </view>\n                </view>\n                <view>\n                  <view class=\"click\" v-if=\"!params.checked\" @click=\"handleClickGoods(item)\">立即选取</view>\n                  <view class=\"click\" v-if=\"params.checked\" @click=\"handleLink(item)\">分销商品</view>\n                </view>\n              </view>\n            </view>\n          </div>\n        </u-swipe-action>\n      </scroll-view>\n\n\n      <view class=\"empty\">\n        <!-- <u-empty v-if=\"empty\" text=\"没有分销商品了\" mode=\"list\"></u-empty> -->\n      </view>\n    </view>\n    <canvas class=\"canvas-hide\" canvas-id=\"qrcode\" />\n    <drawCanvas ref=\"drawCanvas\" v-if=\"showFlag\" :res=\"res\" />\n    <u-modal v-model=\"deleteShow\" :confirm-style=\"{'color':lightColor}\" @confirm=\"delectConfirm\" show-cancel-button :content=\"deleteContent\" :async-close=\"true\"></u-modal>\n\n  </view>\n</template>\n<script>\nimport {\n  distributionGoods,\n  checkedDistributionGoods,\n  getMpCode,\n} from \"@/api/goods\";\n\nimport drawCanvas from \"@/components/m-canvas\";\nexport default {\n  data() {\n    return {\n      lightColor: this.$lightColor,\n      deleteContent: \"解绑该商品？\", //删除显示的信息\n      // 商品栏右侧滑动按钮\n      options: [\n        {\n          text: \"解绑\",\n          style: {\n            backgroundColor: this.$lightColor, //高亮颜色\n          },\n        },\n      ],\n      showFlag: false, //分销分享开关\n      empty: false,\n      popup: false, //弹出层开关\n      active_color: this.$mainColor,\n      current: 0,\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n        checked: true,\n      },\n      goodsList: [],\n\n      // 分销分享 实例\n      res: {\n        container: {\n          width: 600,\n          height: 960,\n          background: \"#fff\",\n          title: \"分享背景\",\n        },\n        // 分销分享\n        bottom: {\n          img: \"\",\n          code: \"\",\n          price: 0,\n        },\n      },\n\n      routers: \"\",\n      deleteShow: false, //删除模态框\n      goodsVal: false, //分销商铺信息\n    };\n  },\n  components: {\n    drawCanvas,\n  },\n  onLoad(options) {\n    this.routers = options;\n  },\n  watch: {},\n  onShow() {\n    this.goodsList = [];\n    this.init();\n  },\n  methods: {\n    /**\n     * 滑动删除\n     */\n    changeActionTab(val) {\n      this.deleteShow = true;\n      this.goodsVal = val;\n    },\n\n    /**\n     * 点击解绑商品\n     */\n    delectConfirm() {\n      checkedDistributionGoods({ id: this.goodsVal.id, checked: false }).then(\n        (res) => {\n          if (res.data.success) {\n            uni.showToast({\n              title: \"此商品解绑成功\",\n              duration: 2000,\n            });\n            this.deleteShow = false;\n            this.goodsList = [];\n            this.init();\n          }\n        }\n      );\n    },\n\n    /**\n     * 左滑打开删除\n     */\n    openAction(val) {\n      this.goodsList.forEach((item) => {\n        this.$set(item, \"___selected\", false);\n      });\n      this.$set(val, \"___selected\", true);\n    },\n\n    /**\n     * 查看图片\n     */\n    handleNavgationGoods(val) {\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${val.skuId}&goodsId=${val.goodsId}`,\n      });\n    },\n\n    async handleLink(goods) {\n      uni.showToast({\n        title: \"请请按住保存图片\",\n        duration: 2000,\n        icon: \"none\",\n      });\n      let page = `pages/product/goods`;\n      let scene = `${goods.skuId},${goods.goodsId},${this.routers.id}`;\n      let result = await getMpCode({ page, scene });\n      if (result.data.success) {\n        let callback = result.data.result;\n        this.res.container.title = `${goods.goodsName}`;\n        this.res.bottom.code = `data:image/png;base64,${callback}`;\n        this.res.bottom.price = this.$options.filters.unitPrice(\n          goods.price,\n          \"￥\"\n        );\n        this.res.bottom.desc = `${goods.goodsName}`;\n        this.res.bottom.img = `${goods.thumbnail}`;\n\n        if (this.showFlag) {\n          this.$refs.drawCanvas.init();\n        }\n        this.showFlag = true;\n      } else {\n        uni.showToast({\n          title: `制作二维码失败！请稍后重试`,\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n\n    change(index) {\n      this.current = index;\n    },\n    // 点击我的选品库\n    handleMyGoods(flag) {\n      this.goodsList = [];\n      this.params.checked = flag;\n      this.init();\n    },\n\n    // 选择商品\n    handleClickGoods(val) {\n      checkedDistributionGoods({ id: val.id, checked: true }).then((res) => {\n        if (res.data.success) {\n          uni.showToast({\n            title: \"已添加到我的选品库\",\n            duration: 2000,\n            icon: \"none\",\n          });\n\n          setTimeout(() => {\n            this.goodsList = [];\n            this.init();\n          }, 500);\n        }\n      });\n    },\n\n    init() {\n      distributionGoods(this.params).then((res) => {\n        if (res.data.success && res.data.result.records.length >= 1) {\n          res.data.result.records.forEach((item) => {\n            this.$set(item, \"___selected\", false);\n          });\n          this.goodsList.push(...res.data.result.records);\n        }\n        if (this.goodsList.length === 0) {\n          this.empty = true;\n        }\n      });\n    },\n\n    /**\n     * 底部加载数据\n     */\n    renderDate() {\n\n      this.params.pageNumber += 1;\n      this.init();\n    },\n\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n\n.body-view {\n  overflow-y: auto;\n  height: calc(100vh - 44px - 80rpx - 104rpx);\n}\n.canvas-hide {\n  /* 1 */\n  position: fixed;\n  right: 100vw;\n  bottom: 100vh;\n  /* 2 */\n  z-index: -9999;\n  /* 3 */\n  opacity: 0;\n}\n.empty {\n  margin: 40rpx 0;\n}\n.checked {\n  color: $main-color;\n  font-weight: bold;\n}\n.screen-btn {\n  display: flex;\n  width: 100%;\n  height: 88rpx;\n  line-height: 88rpx;\n  position: fixed;\n  bottom: 0;\n  > .screen-clear,\n  .screen-submit {\n    width: 50%;\n    text-align: center;\n  }\n  .screen-submit {\n    background: $main-color;\n    color: #fff;\n  }\n}\n.screen-item {\n  margin-bottom: 40rpx;\n}\n.flex1 {\n  padding-left: 10rpx;\n}\n.u-tag {\n  margin-right: 20rpx;\n}\n.line {\n  width: 40rpx;\n  height: 2rpx;\n  background: #999;\n  margin: 0 10rpx;\n}\n.u-bg {\n  background: #eff1f4;\n  border-radius: 0.4em;\n  font-size: 22rpx;\n}\n.screen-title {\n  height: 88rpx;\n  text-align: center;\n  font-size: 28upz;\n  line-height: 88rpx;\n  border-bottom: 1px solid #ededed;\n}\n.flex {\n  display: flex;\n  margin: 20rpx 0;\n  align-items: center;\n}\n.screen-view {\n  padding: 32rpx;\n}\n.bar {\n  padding: 0 20rpx;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  height: 88rpx;\n  width: 100%;\n  background: #fff;\n  z-index: 8;\n  > .bar-btn {\n    display: flex;\n  }\n}\n.nav {\n  background: #fff;\n  width: 100%;\n  display: flex;\n  height: 88rpx;\n  box-sizing: border-box;\n  border-top: 1px solid #ededed;\n  border-bottom: 1px solid #ededed;\n  > .nav-item {\n    line-height: 88rpx;\n    height: 88rpx;\n    flex: 1;\n    text-align: center;\n  }\n}\n.click {\n  background: $main-color;\n  color: #fff;\n  margin: 0 4rpx;\n  font-size: 22rpx;\n  padding: 10rpx 20rpx;\n  border-radius: 100px;\n}\n.goods-list {\n  // #ifdef H5\n  height: calc(100vh - 176rpx);\n  // #endif\n  // #ifndef H5\n  height: calc(100vh - 88rpx);\n  // #endif\n  overflow: auto;\n}\n.goods-item {\n  border-radius: 20rpx;\n  background: #fff;\n  display: flex;\n  padding: 22rpx;\n  margin: 20rpx;\n  justify-content: space-between;\n  > .goods-item-desc {\n    flex: 2;\n    padding: 0 16rpx;\n    line-height: 1.7;\n    > .-item-bottom {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n\n      padding-bottom: 20rpx;\n      > .-item-bootom-money {\n        > .-item-bl,\n        .-item-yj {\n          margin-right: 10rpx;\n          font-size: 24rpx;\n          color: $font-color-base;\n        }\n      }\n    }\n    > .-item-title {\n      display: -webkit-box;\n\n      -webkit-box-orient: vertical;\n\n      -webkit-line-clamp: 1;\n\n      overflow: hidden;\n    }\n    > .-item-price {\n      color: $price-color;\n      > span {\n        font-size: 36rpx;\n      }\n    }\n  }\n}\n.wrapper {\n  width: 100%;\n}\n</style>"
  },
  {
    "path": "pages/mine/distribution/withdrawal.vue",
    "content": "<template>\n  <view>\n    <view class=\"withdrawal-list\">\n      <view class=\"title\">提现金额</view>\n      <view class=\"content\">\n        <view class=\"price\">\n          <span> ￥</span>\n          <u-input v-model=\"price\" placeholder=\"\" type=\"number\" />\n        </view>\n\n        <view class=\"all\">\n          <view @click=\"handleAll\" :style=\"{ color: $mainColor }\">全部</view>\n          <view style=\"font-size: 24rpx; color: #999\"\n            >可提现金额<span>{{ distributionData.canRebate | unitPrice }}</span\n            >元</view\n          >\n        </view>\n      </view>\n    </view>\n\n    <view class=\"submit\" @click=\"cashd\">提现</view>\n  </view>\n</template>\n<script>\nimport { distribution, cash } from \"@/api/goods\";\nexport default {\n  data() {\n    return {\n      price: 0,\n      distributionData: \"\",\n    };\n  },\n  mounted() {\n    this.init();\n  },\n  methods: {\n    cashd() {\n      this.price = this.price + \"\";\n    \n\n      if (this.$u.test.amount(parseInt(this.price))) {\n        cash({ price: this.price }).then((res) => {\n          if(res.data.success){\n            uni.showToast({\n              title: '提现成功!',\n              duration: 2000,\n              icon:\"none\"\n            });\n          setTimeout(()=>{\n            uni.navigateBack({\n               delta: 1\n            });\n          },1000)\n          }\n        });\n      } else {\n        uni.showToast({\n          title: \"请输入正确金额\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n    handleAll() {\n      this.price = this.distributionData.canRebate;\n    },\n    /**\n     * 初始化推广商品\n     */\n    init() {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      distribution().then((res) => {\n        if (res.data.result) {\n          this.distributionData = res.data.result;\n        }\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n/deep/ .u-input__input,\n.u-input {\n  font-size: 80rpx !important;\n  height: 102rpx !important;\n \n}\n/deep/ .u-input__input{\n  height: 100%;\n   font-size: 80rpx;\n}\n.content {\n  display: flex;\n  > .price {\n    width: 60%;\n    margin: 20rpx 0;\n    font-size: 80rpx;\n    display: flex;\n  }\n  > .all {\n    justify-content: center;\n    width: 40%;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-end;\n  }\n}\n.withdrawal-list {\n  margin: 20rpx 0;\n  background: #fff;\n  padding: 16rpx 32rpx;\n}\n.title {\n  font-size: 35rpx;\n}\n.submit {\n  margin: 80rpx auto;\n  width: 94%;\n  background: $light-color;\n  height: 90rpx;\n  color: #fff;\n  border-radius: 10rpx;\n  text-align: center;\n  line-height: 90rpx;\n}\n</style>"
  },
  {
    "path": "pages/mine/help/tips.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <u-parse :show-with-animation=\"true\" :lazy-load=\"true\" :selectable=\"true\" :html=\"res.content\" v-if=\"res\"></u-parse>\n\n  </div>\n</template>\n<script>\nimport { getArticleDetailByType } from \"@/api/article\";\nexport default {\n  data() {\n    return {\n      res: \"\",\n      way: {\n        USER_AGREEMENT: {\n          title: \"服务协议\",\n          type: \"USER_AGREEMENT\",\n        },\n        PRIVACY_POLICY: {\n          title: \"隐私政策\",\n          type: \"PRIVACY_POLICY\",\n        },\n        LICENSE_INFORMATION: {\n          title: \"证照信息\",\n          type: \"LICENSE_INFORMATION\",\n        },\n        ABOUT: {\n          title: \"关于我们\",\n          type: \"ABOUT\",\n        },\n        STORE_REGISTER: {\n          title: \"店铺入驻协议\",\n          type: \"STORE_REGISTER\",\n        },\n      },\n    };\n  },\n  mounted() {},\n  onLoad(option) {\n    console.log(this.way)\n    uni.setNavigationBarTitle({\n      title: this.way[option.type].title,\n    });\n    this.init(option);\n  },\n\n  methods: {\n    init(option) {\n      getArticleDetailByType(this.way[option.type].type).then((res) => {\n        if (res.data.success) {\n          this.res = res.data.result;\n          console.log(res)\n        }\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.wrapper {\n  padding: 16rpx;\n}\n</style>"
  },
  {
    "path": "pages/mine/im/index-app.scss",
    "content": ".status_bar {\n  height: var(--status-bar-height);\n  background-color: #f1f1f1;\n  width: 100%;\n\n}\n\n.status_bar-nobg {\n  height: var(--status-bar-height);\n  width: 100%;\n\n}\n\n/* 转圈动画 */\n.turn-load {\n  animation: turnmy 1s linear infinite;\n}\n\n@keyframes turnmy {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n\n  25% {\n    -webkit-transform: rotate(90deg);\n  }\n\n  50% {\n    -webkit-transform: rotate(180deg);\n  }\n\n  75% {\n    -webkit-transform: rotate(270deg);\n  }\n\n  100% {\n    -webkit-transform: rotate(360deg);\n  }\n}\n\n.one-show {\n  animation: oneshow 0.8s ease 1;\n}\n\n@keyframes oneshow {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n\n.status_bar-fixed {\n  height: var(--status-bar-height);\n  width: 100%;\n  position: fixed;\n  background-color: #f1f1f1;\n  z-index: 20;\n}\n\n.head-dh-my {\n  display: flex;\n  position: fixed;\n  justify-content: space-around;\n  align-items: flex-end;\n  padding-bottom: 10rpx;\n  z-index: 15;\n  background-color: #e3e3e3;\n  width: 750rpx;\n}\n\n.border-bom {\n  border-bottom: 0.5rpx solid #DDDDDD;\n}\n\n.border-red {\n  border-bottom: 1rpx solid #d33e18;\n}\n\n.border-bom-big {\n  border-bottom: 8rpx solid #DDDDDD;\n}\n\n.border-bom-white {\n  border-bottom: 2rpx solid #FFFFFF;\n}\n\n.border-bom-green {\n  border-bottom: 4rpx solid #f8f9bd;\n}\n\n.border-bom-index {\n  border-bottom: 4rpx solid #27d9b3;\n}\n\n.padding-left {\n  padding-left: 20rpx;\n}\n\n.padding-left-top {\n  padding-left: 20rpx;\n  padding-top: 20rpx;\n}\n\n.padding-right {\n  padding-right: 20rpx;\n}\n\n.input-my {\n  padding-left: 20rpx;\n  border-radius: 40rpx;\n  height: 50rpx;\n  margin: 10rpx;\n}\n\n.tb-tag-absolute {\n  position: absolute;\n  z-index: 5;\n  border-radius: 25rpx;\n  font-size: 16rpx;\n  margin-left: 25rpx;\n  margin-top: -35rpx;\n}\n\n.lk-tag {\n  height: 50rpx;\n  padding: 0 10rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border: 2rpx solid #24bd9f;\n  border-radius: 6rpx;\n  color: #1c947a;\n  font-weight: 500;\n\n\n}\n\n.tb-tag-my {\n  border-radius: 15rpx;\n  font-size: 16rpx;\n  margin-left: 5rpx;\n}\n\n.my-green {\n  color: #29c7a5;\n}\n\n.my-hui {\n  color: #585858;\n  font-size: 22rpx;\n}\n\n.flex-column-center {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n}\n\n.flex-column-between {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.flex-column-start {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.flex-column-around {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-around;\n  align-items: center;\n\n}\n\n.flex-row-start {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.flex-row-around {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-around;\n  align-items: center;\n}\n\n.flex-row-center {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n}\n\n.flex-row-between {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.my-title {\n  font-size: 35rpx;\n  font-weight: bold;\n}\n\n.my-neirong {\n  font-size: 26rpx;\n  color: #6d6d6d;\n}\n\n.my-neirong-sm {\n  font-size: 23rpx;\n  color: #616161;\n}\n\n.my-tag-text {\n  font-size: 22rpx;\n  padding-top: 20rpx;\n  color: #bababa;\n}\n\n.padding-top {\n  padding-top: 35rpx;\n}\n\n.padding-top-sm {\n  padding-top: 20rpx;\n}\n\n.bottom-dh {\n  background-color: #f1f1f1;\n  position: fixed;\n  z-index: 10;\n  bottom: 0;\n  width: 750rpx;\n  height: 110rpx;\n}\n\n.tb-text {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n}\n\n.bottom-text {\n  width: 750rpx;\n  position: fixed;\n  text-align: center;\n  font-size: 26rpx;\n  color: #9d9d9d;\n  bottom: 70rpx;\n}\n\n.white-box {\n  padding: 0 20rpx;\n  margin-bottom: 15rpx;\n  margin-top: 5rpx;\n  width: 715rpx;\n  background-color: #FFFFFF;\n  border-radius: 30rpx;\n}\n\n.green-box {\n  padding: 0 20rpx;\n  margin-bottom: 15rpx;\n  margin-top: 5rpx;\n  width: 715rpx;\n  background-color: #FFFFFF;\n  border-radius: 30rpx;\n  background-image: linear-gradient(#1faf97, #29c7a5);\n}\n\n.yuan-sm {\n  width: 13rpx;\n  height: 13rpx;\n  border-radius: 50%;\n  background-color: #1fc189;\n  margin-left: 10rpx;\n}\n\n.yuan-normal {\n  width: 14rpx;\n  height: 14rpx;\n  border-radius: 50%;\n  background-color: #159f3c;\n  margin-left: 10rpx;\n\n}\n\n.yuan-normal-red {\n  width: 14rpx;\n  height: 14rpx;\n  border-radius: 50%;\n  background-color: #bc3c11;\n  margin-left: 10rpx;\n\n}\n\n.yuan-sm-red {\n  width: 13rpx;\n  height: 13rpx;\n  border-radius: 50%;\n  background-color: #de410d;\n  margin-left: 10rpx;\n}\n\n.white-box-all {\n  margin-top: 5rpx;\n  width: 750rpx;\n  background-color: #FFFFFF;\n  border-radius: 13px;\n}\n\n.moneycolor {\n  color: #ea5002;\n}\n\n.text-bold-sm {\n  font-weight: 425;\n}\n\n.sm-moneycolor {\n  color: #e3793b;\n}\n\n.margin-top {\n  margin-top: 20rpx;\n}\n\n.margin-top-sm {\n  margin-top: 12rpx;\n}\n\n.margin {\n  margin: 20rpx;\n}\n\n.margin-left {\n  margin-left: 20rpx;\n}\n\n.margin-left-top {\n  margin-left: 20rpx;\n  margin-top: 20rpx;\n}\n\n.margin-right {\n  margin-right: 20rpx;\n}\n\n.my-absolute {\n  position: absolute;\n}\n\n.my-fixed {\n  position: fixed;\n}\n\n.my-seach {\n  width: 450rpx;\n  height: 55rpx;\n  background-color: #f8f8f8;\n  border-radius: 30rpx;\n  padding-left: 20rpx;\n}\n\n.move-view {\n  width: 48rpx;\n  height: 10rpx;\n  background-color: #28ba91;\n  border-radius: 4rpx;\n  margin-left: 100rpx;\n}\n\n.move-view-p {\n  width: 45rpx;\n  height: 10rpx;\n  background-color: #28ba91;\n  border-radius: 4rpx;\n}\n\n.header-dh {\n  position: fixed;\n  padding-top: 20rpx;\n  padding-bottom: 15rpx;\n  height: 70rpx;\n  width: 750rpx;\n  background-color: #f1f1f1;\n  z-index: 20;\n}\n\n.tp-normal {\n  width: 60rpx;\n  height: 60rpx;\n}\n\n.tp-sm {\n  width: 45rpx;\n  height: 45rpx;\n}\n\n.tp-big {\n  width: 70rpx;\n  height: 70rpx;\n  border-radius: 50%;\n}\n\n.main-color {\n  color: #07D188;\n}\n\n\n\n\n//icon\n@keyframes cuIcon-spin {\n  0% {\n    -webkit-transform: rotate(0);\n    transform: rotate(0);\n  }\n\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n.cuIconfont-spin {\n  -webkit-animation: cuIcon-spin 2s infinite linear;\n  animation: cuIcon-spin 2s infinite linear;\n  display: inline-block;\n}\n\n.cuIconfont-pulse {\n  -webkit-animation: cuIcon-spin 1s infinite steps(8);\n  animation: cuIcon-spin 1s infinite steps(8);\n  display: inline-block;\n}\n\n[class*=\"cuIcon-\"] {\n  font-family: \"cuIcon\";\n  font-size: inherit;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"cuIcon\";\n  src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831');\n  /* IE9*/\n  src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'),\n    /* IE6-IE8 */\n    url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),\n    url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'),\n    /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/\n    url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#cuIconfont') format('svg');\n  /* iOS 4.1- */\n}\n\n.cuIcon-appreciate:before {\n  content: \"\\e644\";\n}\n\n.cuIcon-check:before {\n  content: \"\\e645\";\n}\n\n.cuIcon-close:before {\n  content: \"\\e646\";\n}\n\n.cuIcon-edit:before {\n  content: \"\\e649\";\n}\n\n.cuIcon-emoji:before {\n  content: \"\\e64a\";\n}\n\n.cuIcon-favorfill:before {\n  content: \"\\e64b\";\n}\n\n.cuIcon-favor:before {\n  content: \"\\e64c\";\n}\n\n.cuIcon-loading:before {\n  content: \"\\e64f\";\n}\n\n.cuIcon-locationfill:before {\n  content: \"\\e650\";\n}\n\n.cuIcon-location:before {\n  content: \"\\e651\";\n}\n\n.cuIcon-phone:before {\n  content: \"\\e652\";\n}\n\n.cuIcon-roundcheckfill:before {\n  content: \"\\e656\";\n}\n\n.cuIcon-roundcheck:before {\n  content: \"\\e657\";\n}\n\n.cuIcon-roundclosefill:before {\n  content: \"\\e658\";\n}\n\n.cuIcon-roundclose:before {\n  content: \"\\e659\";\n}\n\n.cuIcon-roundrightfill:before {\n  content: \"\\e65a\";\n}\n\n.cuIcon-roundright:before {\n  content: \"\\e65b\";\n}\n\n.cuIcon-search:before {\n  content: \"\\e65c\";\n}\n\n.cuIcon-taxi:before {\n  content: \"\\e65d\";\n}\n\n.cuIcon-timefill:before {\n  content: \"\\e65e\";\n}\n\n.cuIcon-time:before {\n  content: \"\\e65f\";\n}\n\n.cuIcon-unfold:before {\n  content: \"\\e661\";\n}\n\n.cuIcon-warnfill:before {\n  content: \"\\e662\";\n}\n\n.cuIcon-warn:before {\n  content: \"\\e663\";\n}\n\n.cuIcon-camerafill:before {\n  content: \"\\e664\";\n}\n\n.cuIcon-camera:before {\n  content: \"\\e665\";\n}\n\n.cuIcon-commentfill:before {\n  content: \"\\e666\";\n}\n\n.cuIcon-comment:before {\n  content: \"\\e667\";\n}\n\n.cuIcon-likefill:before {\n  content: \"\\e668\";\n}\n\n.cuIcon-like:before {\n  content: \"\\e669\";\n}\n\n.cuIcon-notificationfill:before {\n  content: \"\\e66a\";\n}\n\n.cuIcon-notification:before {\n  content: \"\\e66b\";\n}\n\n.cuIcon-order:before {\n  content: \"\\e66c\";\n}\n\n.cuIcon-samefill:before {\n  content: \"\\e66d\";\n}\n\n.cuIcon-same:before {\n  content: \"\\e66e\";\n}\n\n.cuIcon-deliver:before {\n  content: \"\\e671\";\n}\n\n.cuIcon-evaluate:before {\n  content: \"\\e672\";\n}\n\n.cuIcon-pay:before {\n  content: \"\\e673\";\n}\n\n.cuIcon-send:before {\n  content: \"\\e675\";\n}\n\n.cuIcon-shop:before {\n  content: \"\\e676\";\n}\n\n.cuIcon-ticket:before {\n  content: \"\\e677\";\n}\n\n.cuIcon-back:before {\n  content: \"\\e679\";\n}\n\n.cuIcon-cascades:before {\n  content: \"\\e67c\";\n}\n\n.cuIcon-discover:before {\n  content: \"\\e67e\";\n}\n\n.cuIcon-list:before {\n  content: \"\\e682\";\n}\n\n.cuIcon-more:before {\n  content: \"\\e684\";\n}\n\n.cuIcon-scan:before {\n  content: \"\\e689\";\n}\n\n.cuIcon-settings:before {\n  content: \"\\e68a\";\n}\n\n.cuIcon-questionfill:before {\n  content: \"\\e690\";\n}\n\n.cuIcon-question:before {\n  content: \"\\e691\";\n}\n\n.cuIcon-shopfill:before {\n  content: \"\\e697\";\n}\n\n.cuIcon-form:before {\n  content: \"\\e699\";\n}\n\n.cuIcon-pic:before {\n  content: \"\\e69b\";\n}\n\n.cuIcon-filter:before {\n  content: \"\\e69c\";\n}\n\n.cuIcon-footprint:before {\n  content: \"\\e69d\";\n}\n\n.cuIcon-top:before {\n  content: \"\\e69e\";\n}\n\n.cuIcon-pulldown:before {\n  content: \"\\e69f\";\n}\n\n.cuIcon-pullup:before {\n  content: \"\\e6a0\";\n}\n\n.cuIcon-right:before {\n  content: \"\\e6a3\";\n}\n\n.cuIcon-refresh:before {\n  content: \"\\e6a4\";\n}\n\n.cuIcon-moreandroid:before {\n  content: \"\\e6a5\";\n}\n\n.cuIcon-deletefill:before {\n  content: \"\\e6a6\";\n}\n\n.cuIcon-refund:before {\n  content: \"\\e6ac\";\n}\n\n.cuIcon-cart:before {\n  content: \"\\e6af\";\n}\n\n.cuIcon-qrcode:before {\n  content: \"\\e6b0\";\n}\n\n.cuIcon-remind:before {\n  content: \"\\e6b2\";\n}\n\n.cuIcon-delete:before {\n  content: \"\\e6b4\";\n}\n\n.cuIcon-profile:before {\n  content: \"\\e6b7\";\n}\n\n.cuIcon-home:before {\n  content: \"\\e6b8\";\n}\n\n.cuIcon-cartfill:before {\n  content: \"\\e6b9\";\n}\n\n.cuIcon-discoverfill:before {\n  content: \"\\e6ba\";\n}\n\n.cuIcon-homefill:before {\n  content: \"\\e6bb\";\n}\n\n.cuIcon-message:before {\n  content: \"\\e6bc\";\n}\n\n.cuIcon-addressbook:before {\n  content: \"\\e6bd\";\n}\n\n.cuIcon-link:before {\n  content: \"\\e6bf\";\n}\n\n.cuIcon-lock:before {\n  content: \"\\e6c0\";\n}\n\n.cuIcon-unlock:before {\n  content: \"\\e6c2\";\n}\n\n.cuIcon-vip:before {\n  content: \"\\e6c3\";\n}\n\n.cuIcon-weibo:before {\n  content: \"\\e6c4\";\n}\n\n.cuIcon-activity:before {\n  content: \"\\e6c5\";\n}\n\n.cuIcon-friendaddfill:before {\n  content: \"\\e6c9\";\n}\n\n.cuIcon-friendadd:before {\n  content: \"\\e6ca\";\n}\n\n.cuIcon-friendfamous:before {\n  content: \"\\e6cb\";\n}\n\n.cuIcon-friend:before {\n  content: \"\\e6cc\";\n}\n\n.cuIcon-goods:before {\n  content: \"\\e6cd\";\n}\n\n.cuIcon-selection:before {\n  content: \"\\e6ce\";\n}\n\n.cuIcon-explore:before {\n  content: \"\\e6d2\";\n}\n\n.cuIcon-present:before {\n  content: \"\\e6d3\";\n}\n\n.cuIcon-squarecheckfill:before {\n  content: \"\\e6d4\";\n}\n\n.cuIcon-square:before {\n  content: \"\\e6d5\";\n}\n\n.cuIcon-squarecheck:before {\n  content: \"\\e6d6\";\n}\n\n.cuIcon-round:before {\n  content: \"\\e6d7\";\n}\n\n.cuIcon-roundaddfill:before {\n  content: \"\\e6d8\";\n}\n\n.cuIcon-roundadd:before {\n  content: \"\\e6d9\";\n}\n\n.cuIcon-add:before {\n  content: \"\\e6da\";\n}\n\n.cuIcon-notificationforbidfill:before {\n  content: \"\\e6db\";\n}\n\n.cuIcon-explorefill:before {\n  content: \"\\e6dd\";\n}\n\n.cuIcon-fold:before {\n  content: \"\\e6de\";\n}\n\n.cuIcon-game:before {\n  content: \"\\e6df\";\n}\n\n.cuIcon-redpacket:before {\n  content: \"\\e6e0\";\n}\n\n.cuIcon-selectionfill:before {\n  content: \"\\e6e1\";\n}\n\n.cuIcon-similar:before {\n  content: \"\\e6e2\";\n}\n\n.cuIcon-appreciatefill:before {\n  content: \"\\e6e3\";\n}\n\n.cuIcon-infofill:before {\n  content: \"\\e6e4\";\n}\n\n.cuIcon-info:before {\n  content: \"\\e6e5\";\n}\n\n.cuIcon-forwardfill:before {\n  content: \"\\e6ea\";\n}\n\n.cuIcon-forward:before {\n  content: \"\\e6eb\";\n}\n\n.cuIcon-rechargefill:before {\n  content: \"\\e6ec\";\n}\n\n.cuIcon-recharge:before {\n  content: \"\\e6ed\";\n}\n\n.cuIcon-vipcard:before {\n  content: \"\\e6ee\";\n}\n\n.cuIcon-voice:before {\n  content: \"\\e6ef\";\n}\n\n.cuIcon-voicefill:before {\n  content: \"\\e6f0\";\n}\n\n.cuIcon-friendfavor:before {\n  content: \"\\e6f1\";\n}\n\n.cuIcon-wifi:before {\n  content: \"\\e6f2\";\n}\n\n.cuIcon-share:before {\n  content: \"\\e6f3\";\n}\n\n.cuIcon-wefill:before {\n  content: \"\\e6f4\";\n}\n\n.cuIcon-we:before {\n  content: \"\\e6f5\";\n}\n\n.cuIcon-lightauto:before {\n  content: \"\\e6f6\";\n}\n\n.cuIcon-lightforbid:before {\n  content: \"\\e6f7\";\n}\n\n.cuIcon-lightfill:before {\n  content: \"\\e6f8\";\n}\n\n.cuIcon-camerarotate:before {\n  content: \"\\e6f9\";\n}\n\n.cuIcon-light:before {\n  content: \"\\e6fa\";\n}\n\n.cuIcon-barcode:before {\n  content: \"\\e6fb\";\n}\n\n.cuIcon-flashlightclose:before {\n  content: \"\\e6fc\";\n}\n\n.cuIcon-flashlightopen:before {\n  content: \"\\e6fd\";\n}\n\n.cuIcon-searchlist:before {\n  content: \"\\e6fe\";\n}\n\n.cuIcon-service:before {\n  content: \"\\e6ff\";\n}\n\n.cuIcon-sort:before {\n  content: \"\\e700\";\n}\n\n.cuIcon-down:before {\n  content: \"\\e703\";\n}\n\n.cuIcon-mobile:before {\n  content: \"\\e704\";\n}\n\n.cuIcon-mobilefill:before {\n  content: \"\\e705\";\n}\n\n.cuIcon-copy:before {\n  content: \"\\e706\";\n}\n\n.cuIcon-countdownfill:before {\n  content: \"\\e707\";\n}\n\n.cuIcon-countdown:before {\n  content: \"\\e708\";\n}\n\n.cuIcon-noticefill:before {\n  content: \"\\e709\";\n}\n\n.cuIcon-notice:before {\n  content: \"\\e70a\";\n}\n\n.cuIcon-upstagefill:before {\n  content: \"\\e70e\";\n}\n\n.cuIcon-upstage:before {\n  content: \"\\e70f\";\n}\n\n.cuIcon-babyfill:before {\n  content: \"\\e710\";\n}\n\n.cuIcon-baby:before {\n  content: \"\\e711\";\n}\n\n.cuIcon-brandfill:before {\n  content: \"\\e712\";\n}\n\n.cuIcon-brand:before {\n  content: \"\\e713\";\n}\n\n.cuIcon-choicenessfill:before {\n  content: \"\\e714\";\n}\n\n.cuIcon-choiceness:before {\n  content: \"\\e715\";\n}\n\n.cuIcon-clothesfill:before {\n  content: \"\\e716\";\n}\n\n.cuIcon-clothes:before {\n  content: \"\\e717\";\n}\n\n.cuIcon-creativefill:before {\n  content: \"\\e718\";\n}\n\n.cuIcon-creative:before {\n  content: \"\\e719\";\n}\n\n.cuIcon-female:before {\n  content: \"\\e71a\";\n}\n\n.cuIcon-keyboard:before {\n  content: \"\\e71b\";\n}\n\n.cuIcon-male:before {\n  content: \"\\e71c\";\n}\n\n.cuIcon-newfill:before {\n  content: \"\\e71d\";\n}\n\n.cuIcon-new:before {\n  content: \"\\e71e\";\n}\n\n.cuIcon-pullleft:before {\n  content: \"\\e71f\";\n}\n\n.cuIcon-pullright:before {\n  content: \"\\e720\";\n}\n\n.cuIcon-rankfill:before {\n  content: \"\\e721\";\n}\n\n.cuIcon-rank:before {\n  content: \"\\e722\";\n}\n\n.cuIcon-bad:before {\n  content: \"\\e723\";\n}\n\n.cuIcon-cameraadd:before {\n  content: \"\\e724\";\n}\n\n.cuIcon-focus:before {\n  content: \"\\e725\";\n}\n\n.cuIcon-friendfill:before {\n  content: \"\\e726\";\n}\n\n.cuIcon-cameraaddfill:before {\n  content: \"\\e727\";\n}\n\n.cuIcon-apps:before {\n  content: \"\\e729\";\n}\n\n.cuIcon-paintfill:before {\n  content: \"\\e72a\";\n}\n\n.cuIcon-paint:before {\n  content: \"\\e72b\";\n}\n\n.cuIcon-picfill:before {\n  content: \"\\e72c\";\n}\n\n.cuIcon-refresharrow:before {\n  content: \"\\e72d\";\n}\n\n.cuIcon-colorlens:before {\n  content: \"\\e6e6\";\n}\n\n.cuIcon-markfill:before {\n  content: \"\\e730\";\n}\n\n.cuIcon-mark:before {\n  content: \"\\e731\";\n}\n\n.cuIcon-presentfill:before {\n  content: \"\\e732\";\n}\n\n.cuIcon-repeal:before {\n  content: \"\\e733\";\n}\n\n.cuIcon-album:before {\n  content: \"\\e734\";\n}\n\n.cuIcon-peoplefill:before {\n  content: \"\\e735\";\n}\n\n.cuIcon-people:before {\n  content: \"\\e736\";\n}\n\n.cuIcon-servicefill:before {\n  content: \"\\e737\";\n}\n\n.cuIcon-repair:before {\n  content: \"\\e738\";\n}\n\n.cuIcon-file:before {\n  content: \"\\e739\";\n}\n\n.cuIcon-repairfill:before {\n  content: \"\\e73a\";\n}\n\n.cuIcon-taoxiaopu:before {\n  content: \"\\e73b\";\n}\n\n.cuIcon-weixin:before {\n  content: \"\\e612\";\n}\n\n.cuIcon-attentionfill:before {\n  content: \"\\e73c\";\n}\n\n.cuIcon-attention:before {\n  content: \"\\e73d\";\n}\n\n.cuIcon-commandfill:before {\n  content: \"\\e73e\";\n}\n\n.cuIcon-command:before {\n  content: \"\\e73f\";\n}\n\n.cuIcon-communityfill:before {\n  content: \"\\e740\";\n}\n\n.cuIcon-community:before {\n  content: \"\\e741\";\n}\n\n.cuIcon-read:before {\n  content: \"\\e742\";\n}\n\n.cuIcon-calendar:before {\n  content: \"\\e74a\";\n}\n\n.cuIcon-cut:before {\n  content: \"\\e74b\";\n}\n\n.cuIcon-magic:before {\n  content: \"\\e74c\";\n}\n\n.cuIcon-backwardfill:before {\n  content: \"\\e74d\";\n}\n\n.cuIcon-playfill:before {\n  content: \"\\e74f\";\n}\n\n.cuIcon-stop:before {\n  content: \"\\e750\";\n}\n\n.cuIcon-tagfill:before {\n  content: \"\\e751\";\n}\n\n.cuIcon-tag:before {\n  content: \"\\e752\";\n}\n\n.cuIcon-group:before {\n  content: \"\\e753\";\n}\n\n.cuIcon-all:before {\n  content: \"\\e755\";\n}\n\n.cuIcon-backdelete:before {\n  content: \"\\e756\";\n}\n\n.cuIcon-hotfill:before {\n  content: \"\\e757\";\n}\n\n.cuIcon-hot:before {\n  content: \"\\e758\";\n}\n\n.cuIcon-post:before {\n  content: \"\\e759\";\n}\n\n.cuIcon-radiobox:before {\n  content: \"\\e75b\";\n}\n\n.cuIcon-rounddown:before {\n  content: \"\\e75c\";\n}\n\n.cuIcon-upload:before {\n  content: \"\\e75d\";\n}\n\n.cuIcon-writefill:before {\n  content: \"\\e760\";\n}\n\n.cuIcon-write:before {\n  content: \"\\e761\";\n}\n\n.cuIcon-radioboxfill:before {\n  content: \"\\e763\";\n}\n\n.cuIcon-punch:before {\n  content: \"\\e764\";\n}\n\n.cuIcon-shake:before {\n  content: \"\\e765\";\n}\n\n.cuIcon-move:before {\n  content: \"\\e768\";\n}\n\n.cuIcon-safe:before {\n  content: \"\\e769\";\n}\n\n.cuIcon-activityfill:before {\n  content: \"\\e775\";\n}\n\n.cuIcon-crownfill:before {\n  content: \"\\e776\";\n}\n\n.cuIcon-crown:before {\n  content: \"\\e777\";\n}\n\n.cuIcon-goodsfill:before {\n  content: \"\\e778\";\n}\n\n.cuIcon-messagefill:before {\n  content: \"\\e779\";\n}\n\n.cuIcon-profilefill:before {\n  content: \"\\e77a\";\n}\n\n.cuIcon-sound:before {\n  content: \"\\e77b\";\n}\n\n.cuIcon-sponsorfill:before {\n  content: \"\\e77c\";\n}\n\n.cuIcon-sponsor:before {\n  content: \"\\e77d\";\n}\n\n.cuIcon-upblock:before {\n  content: \"\\e77e\";\n}\n\n.cuIcon-weblock:before {\n  content: \"\\e77f\";\n}\n\n.cuIcon-weunblock:before {\n  content: \"\\e780\";\n}\n\n.cuIcon-my:before {\n  content: \"\\e78b\";\n}\n\n.cuIcon-myfill:before {\n  content: \"\\e78c\";\n}\n\n.cuIcon-emojifill:before {\n  content: \"\\e78d\";\n}\n\n.cuIcon-emojiflashfill:before {\n  content: \"\\e78e\";\n}\n\n.cuIcon-flashbuyfill:before {\n  content: \"\\e78f\";\n}\n\n.cuIcon-text:before {\n  content: \"\\e791\";\n}\n\n.cuIcon-goodsfavor:before {\n  content: \"\\e794\";\n}\n\n.cuIcon-musicfill:before {\n  content: \"\\e795\";\n}\n\n.cuIcon-musicforbidfill:before {\n  content: \"\\e796\";\n}\n\n.cuIcon-card:before {\n  content: \"\\e624\";\n}\n\n.cuIcon-triangledownfill:before {\n  content: \"\\e79b\";\n}\n\n.cuIcon-triangleupfill:before {\n  content: \"\\e79c\";\n}\n\n.cuIcon-roundleftfill-copy:before {\n  content: \"\\e79e\";\n}\n\n.cuIcon-font:before {\n  content: \"\\e76a\";\n}\n\n.cuIcon-title:before {\n  content: \"\\e82f\";\n}\n\n.cuIcon-recordfill:before {\n  content: \"\\e7a4\";\n}\n\n.cuIcon-record:before {\n  content: \"\\e7a6\";\n}\n\n.cuIcon-cardboardfill:before {\n  content: \"\\e7a9\";\n}\n\n.cuIcon-cardboard:before {\n  content: \"\\e7aa\";\n}\n\n.cuIcon-formfill:before {\n  content: \"\\e7ab\";\n}\n\n.cuIcon-coin:before {\n  content: \"\\e7ac\";\n}\n\n.cuIcon-cardboardforbid:before {\n  content: \"\\e7af\";\n}\n\n.cuIcon-circlefill:before {\n  content: \"\\e7b0\";\n}\n\n.cuIcon-circle:before {\n  content: \"\\e7b1\";\n}\n\n.cuIcon-attentionforbid:before {\n  content: \"\\e7b2\";\n}\n\n.cuIcon-attentionforbidfill:before {\n  content: \"\\e7b3\";\n}\n\n.cuIcon-attentionfavorfill:before {\n  content: \"\\e7b4\";\n}\n\n.cuIcon-attentionfavor:before {\n  content: \"\\e7b5\";\n}\n\n.cuIcon-titles:before {\n  content: \"\\e701\";\n}\n\n.cuIcon-icloading:before {\n  content: \"\\e67a\";\n}\n\n.cuIcon-full:before {\n  content: \"\\e7bc\";\n}\n\n.cuIcon-mail:before {\n  content: \"\\e7bd\";\n}\n\n.cuIcon-peoplelist:before {\n  content: \"\\e7be\";\n}\n\n.cuIcon-goodsnewfill:before {\n  content: \"\\e7bf\";\n}\n\n.cuIcon-goodsnew:before {\n  content: \"\\e7c0\";\n}\n\n.cuIcon-medalfill:before {\n  content: \"\\e7c1\";\n}\n\n.cuIcon-medal:before {\n  content: \"\\e7c2\";\n}\n\n.cuIcon-newsfill:before {\n  content: \"\\e7c3\";\n}\n\n.cuIcon-newshotfill:before {\n  content: \"\\e7c4\";\n}\n\n.cuIcon-newshot:before {\n  content: \"\\e7c5\";\n}\n\n.cuIcon-news:before {\n  content: \"\\e7c6\";\n}\n\n.cuIcon-videofill:before {\n  content: \"\\e7c7\";\n}\n\n.cuIcon-video:before {\n  content: \"\\e7c8\";\n}\n\n.cuIcon-exit:before {\n  content: \"\\e7cb\";\n}\n\n.cuIcon-skinfill:before {\n  content: \"\\e7cc\";\n}\n\n.cuIcon-skin:before {\n  content: \"\\e7cd\";\n}\n\n.cuIcon-moneybagfill:before {\n  content: \"\\e7ce\";\n}\n\n.cuIcon-usefullfill:before {\n  content: \"\\e7cf\";\n}\n\n.cuIcon-usefull:before {\n  content: \"\\e7d0\";\n}\n\n.cuIcon-moneybag:before {\n  content: \"\\e7d1\";\n}\n\n.cuIcon-redpacket_fill:before {\n  content: \"\\e7d3\";\n}\n\n.cuIcon-subscription:before {\n  content: \"\\e7d4\";\n}\n\n.cuIcon-loading1:before {\n  content: \"\\e633\";\n}\n\n.cuIcon-github:before {\n  content: \"\\e692\";\n}\n\n.cuIcon-global:before {\n  content: \"\\e7eb\";\n}\n\n.cuIcon-settingsfill:before {\n  content: \"\\e6ab\";\n}\n\n.cuIcon-back_android:before {\n  content: \"\\e7ed\";\n}\n\n.cuIcon-expressman:before {\n  content: \"\\e7ef\";\n}\n\n.cuIcon-evaluate_fill:before {\n  content: \"\\e7f0\";\n}\n\n.cuIcon-group_fill:before {\n  content: \"\\e7f5\";\n}\n\n.cuIcon-play_forward_fill:before {\n  content: \"\\e7f6\";\n}\n\n.cuIcon-deliver_fill:before {\n  content: \"\\e7f7\";\n}\n\n.cuIcon-notice_forbid_fill:before {\n  content: \"\\e7f8\";\n}\n\n.cuIcon-fork:before {\n  content: \"\\e60c\";\n}\n\n.cuIcon-pick:before {\n  content: \"\\e7fa\";\n}\n\n.cuIcon-wenzi:before {\n  content: \"\\e6a7\";\n}\n\n.cuIcon-ellipse:before {\n  content: \"\\e600\";\n}\n\n.cuIcon-qr_code:before {\n  content: \"\\e61b\";\n}\n\n.cuIcon-dianhua:before {\n  content: \"\\e64d\";\n}\n\n.cuIcon-cuIcon:before {\n  content: \"\\e602\";\n}\n\n.cuIcon-loading2:before {\n  content: \"\\e7f1\";\n}\n\n.cuIcon-btn:before {\n  content: \"\\e601\";\n}\n\n\n\n\n//main\n\n\n/*\n  ColorUi for uniApp  v2.1.6 | by 文晓港 2019-05-31 10:44:24\n  仅供学习交流，如作它用所承受的法律责任一概与作者无关  \n  \n  *使用ColorUi开发扩展与插件时，请注明基于ColorUi开发 \n  \n  （QQ交流群：240787041）\n*/\n\n/* ==================\n        初始化\n ==================== */\nbody {\n  background-color: #f1f1f1;\n  font-size: 28upx;\n  color: #333333;\n  font-family: Helvetica Neue, Helvetica, sans-serif;\n}\n\nview,\nscroll-view,\nswiper,\nbutton,\ninput,\ntextarea,\nlabel,\nnavigator,\nimage {\n  box-sizing: border-box;\n}\n\n.round {\n  border-radius: 5000rpx;\n}\n\n.radius-m {\n  border-radius: 12rpx;\n}\n\n.radius {\n  border-radius: 6rpx;\n}\n\n/* ==================\n          图片\n ==================== */\n\nimage {\n  max-width: 100%;\n  display: inline-block;\n  position: relative;\n  z-index: 0;\n}\n\nimage.loading::before {\n  content: \"\";\n  background-color: #f5f5f5;\n  display: block;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  z-index: -2;\n}\n\nimage.loading::after {\n  content: \"\\e7f1\";\n  font-family: \"cuIcon\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 32upx;\n  height: 32upx;\n  line-height: 32upx;\n  right: 0;\n  bottom: 0;\n  z-index: -1;\n  font-size: 32upx;\n  margin: auto;\n  color: #ccc;\n  -webkit-animation: cuIcon-spin 2s infinite linear;\n  animation: cuIcon-spin 2s infinite linear;\n  display: block;\n}\n\n.response {\n  width: 100%;\n}\n\n/* ==================\n         开关\n ==================== */\n\nswitch,\ncheckbox,\nradio {\n  position: relative;\n}\n\nswitch::after,\nswitch::before {\n  font-family: \"cuIcon\";\n  content: \"\\e645\";\n  position: absolute;\n  color: #ffffff !important;\n  top: 0%;\n  left: 0upx;\n  font-size: 26upx;\n  line-height: 26px;\n  width: 50%;\n  text-align: center;\n  pointer-events: none;\n  transform: scale(0, 0);\n  transition: all 0.3s ease-in-out 0s;\n  z-index: 9;\n  bottom: 0;\n  height: 26px;\n  margin: auto;\n}\n\nswitch::before {\n  content: \"\\e646\";\n  right: 0;\n  transform: scale(1, 1);\n  left: auto;\n}\n\nswitch[checked]::after,\nswitch.checked::after {\n  transform: scale(1, 1);\n}\n\nswitch[checked]::before,\nswitch.checked::before {\n  transform: scale(0, 0);\n}\n\n/* #ifndef MP-ALIPAY */\nradio::before,\ncheckbox::before {\n  font-family: \"cuIcon\";\n  content: \"\\e645\";\n  position: absolute;\n  color: #ffffff !important;\n  top: 50%;\n  margin-top: -8px;\n  right: 5px;\n  font-size: 32upx;\n  line-height: 16px;\n  pointer-events: none;\n  transform: scale(1, 1);\n  transition: all 0.3s ease-in-out 0s;\n  z-index: 9;\n}\n\nradio .wx-radio-input,\ncheckbox .wx-checkbox-input,\nradio .uni-radio-input,\ncheckbox .uni-checkbox-input {\n  margin: 0;\n  width: 24px;\n  height: 24px;\n}\n\ncheckbox.round .wx-checkbox-input,\ncheckbox.round .uni-checkbox-input {\n  border-radius: 100upx;\n}\n\n/* #endif */\n\nswitch[checked]::before {\n  transform: scale(0, 0);\n}\n\nswitch .wx-switch-input,\nswitch .uni-switch-input {\n  border: none;\n  padding: 0 24px;\n  width: 48px;\n  height: 26px;\n  margin: 0;\n  border-radius: 100upx;\n}\n\nswitch .wx-switch-input:not([class*=\"bg-\"]),\nswitch .uni-switch-input:not([class*=\"bg-\"]) {\n  background: #8799a3 !important;\n}\n\nswitch .wx-switch-input::after,\nswitch .uni-switch-input::after {\n  margin: auto;\n  width: 26px;\n  height: 26px;\n  border-radius: 100upx;\n  left: 0upx;\n  top: 0upx;\n  bottom: 0upx;\n  position: absolute;\n  transform: scale(0.9, 0.9);\n  transition: all 0.1s ease-in-out 0s;\n}\n\nswitch .wx-switch-input.wx-switch-input-checked::after,\nswitch .uni-switch-input.uni-switch-input-checked::after {\n  margin: auto;\n  left: 22px;\n  box-shadow: none;\n  transform: scale(0.9, 0.9);\n}\n\nradio-group {\n  display: inline-block;\n}\n\n\n\nswitch.radius .wx-switch-input::after,\nswitch.radius .wx-switch-input,\nswitch.radius .wx-switch-input::before,\nswitch.radius .uni-switch-input::after,\nswitch.radius .uni-switch-input,\nswitch.radius .uni-switch-input::before {\n  border-radius: 10upx;\n}\n\nswitch .wx-switch-input::before,\nradio.radio::before,\ncheckbox .wx-checkbox-input::before,\nradio .wx-radio-input::before,\nswitch .uni-switch-input::before,\nradio.radio::before,\ncheckbox .uni-checkbox-input::before,\nradio .uni-radio-input::before {\n  display: none;\n}\n\nradio.radio[checked]::after,\nradio.radio .uni-radio-input-checked::after {\n  content: \"\";\n  background-color: transparent;\n  display: block;\n  position: absolute;\n  width: 8px;\n  height: 8px;\n  z-index: 999;\n  top: 0upx;\n  left: 0upx;\n  right: 0;\n  bottom: 0;\n  margin: auto;\n  border-radius: 200upx;\n  /* #ifndef MP */\n  border: 7px solid #ffffff !important;\n  /* #endif */\n\n  /* #ifdef MP */\n  border: 8px solid #ffffff !important;\n  /* #endif */\n}\n\n.switch-sex::after {\n  content: \"\\e71c\";\n}\n\n.switch-sex::before {\n  content: \"\\e71a\";\n}\n\n.switch-sex .wx-switch-input,\n.switch-sex .uni-switch-input {\n  background: #e54d42 !important;\n  border-color: #e54d42 !important;\n}\n\n.switch-sex[checked] .wx-switch-input,\n.switch-sex.checked .uni-switch-input {\n  background: #0081ff !important;\n  border-color: #0081ff !important;\n}\n\nswitch.red[checked] .wx-switch-input.wx-switch-input-checked,\ncheckbox.red[checked] .wx-checkbox-input,\nradio.red[checked] .wx-radio-input,\nswitch.red.checked .uni-switch-input.uni-switch-input-checked,\ncheckbox.red.checked .uni-checkbox-input,\nradio.red.checked .uni-radio-input {\n  background-color: #e54d42 !important;\n  border-color: #e54d42 !important;\n  color: #ffffff !important;\n}\n\nswitch.orange[checked] .wx-switch-input,\ncheckbox.orange[checked] .wx-checkbox-input,\nradio.orange[checked] .wx-radio-input,\nswitch.orange.checked .uni-switch-input,\ncheckbox.orange.checked .uni-checkbox-input,\nradio.orange.checked .uni-radio-input {\n  background-color: #f37b1d !important;\n  border-color: #f37b1d !important;\n  color: #ffffff !important;\n}\n\nswitch.yellow[checked] .wx-switch-input,\ncheckbox.yellow[checked] .wx-checkbox-input,\nradio.yellow[checked] .wx-radio-input,\nswitch.yellow.checked .uni-switch-input,\ncheckbox.yellow.checked .uni-checkbox-input,\nradio.yellow.checked .uni-radio-input {\n  background-color: #fbbd08 !important;\n  border-color: #fbbd08 !important;\n  color: #333333 !important;\n}\n\nswitch.olive[checked] .wx-switch-input,\ncheckbox.olive[checked] .wx-checkbox-input,\nradio.olive[checked] .wx-radio-input,\nswitch.olive.checked .uni-switch-input,\ncheckbox.olive.checked .uni-checkbox-input,\nradio.olive.checked .uni-radio-input {\n  background-color: #8dc63f !important;\n  border-color: #8dc63f !important;\n  color: #ffffff !important;\n}\n\nswitch.green[checked] .wx-switch-input,\nswitch[checked] .wx-switch-input,\ncheckbox.green[checked] .wx-checkbox-input,\ncheckbox[checked] .wx-checkbox-input,\nradio.green[checked] .wx-radio-input,\nradio[checked] .wx-radio-input,\nswitch.green.checked .uni-switch-input,\nswitch.checked .uni-switch-input,\ncheckbox.green.checked .uni-checkbox-input,\ncheckbox.checked .uni-checkbox-input,\nradio.green.checked .uni-radio-input,\nradio.checked .uni-radio-input {\n  background-color: #39b54a !important;\n  border-color: #39b54a !important;\n  color: #ffffff !important;\n  border-color: #39B54A !important;\n}\n\nswitch.cyan[checked] .wx-switch-input,\ncheckbox.cyan[checked] .wx-checkbox-input,\nradio.cyan[checked] .wx-radio-input,\nswitch.cyan.checked .uni-switch-input,\ncheckbox.cyan.checked .uni-checkbox-input,\nradio.cyan.checked .uni-radio-input {\n  background-color: #1cbbb4 !important;\n  border-color: #1cbbb4 !important;\n  color: #ffffff !important;\n}\n\nswitch.blue[checked] .wx-switch-input,\ncheckbox.blue[checked] .wx-checkbox-input,\nradio.blue[checked] .wx-radio-input,\nswitch.blue.checked .uni-switch-input,\ncheckbox.blue.checked .uni-checkbox-input,\nradio.blue.checked .uni-radio-input {\n  background-color: #0081ff !important;\n  border-color: #0081ff !important;\n  color: #ffffff !important;\n}\n\nswitch.purple[checked] .wx-switch-input,\ncheckbox.purple[checked] .wx-checkbox-input,\nradio.purple[checked] .wx-radio-input,\nswitch.purple.checked .uni-switch-input,\ncheckbox.purple.checked .uni-checkbox-input,\nradio.purple.checked .uni-radio-input {\n  background-color: #6739b6 !important;\n  border-color: #6739b6 !important;\n  color: #ffffff !important;\n}\n\nswitch.mauve[checked] .wx-switch-input,\ncheckbox.mauve[checked] .wx-checkbox-input,\nradio.mauve[checked] .wx-radio-input,\nswitch.mauve.checked .uni-switch-input,\ncheckbox.mauve.checked .uni-checkbox-input,\nradio.mauve.checked .uni-radio-input {\n  background-color: #9c26b0 !important;\n  border-color: #9c26b0 !important;\n  color: #ffffff !important;\n}\n\nswitch.pink[checked] .wx-switch-input,\ncheckbox.pink[checked] .wx-checkbox-input,\nradio.pink[checked] .wx-radio-input,\nswitch.pink.checked .uni-switch-input,\ncheckbox.pink.checked .uni-checkbox-input,\nradio.pink.checked .uni-radio-input {\n  background-color: #e03997 !important;\n  border-color: #e03997 !important;\n  color: #ffffff !important;\n}\n\nswitch.brown[checked] .wx-switch-input,\ncheckbox.brown[checked] .wx-checkbox-input,\nradio.brown[checked] .wx-radio-input,\nswitch.brown.checked .uni-switch-input,\ncheckbox.brown.checked .uni-checkbox-input,\nradio.brown.checked .uni-radio-input {\n  background-color: #a5673f !important;\n  border-color: #a5673f !important;\n  color: #ffffff !important;\n}\n\nswitch.grey[checked] .wx-switch-input,\ncheckbox.grey[checked] .wx-checkbox-input,\nradio.grey[checked] .wx-radio-input,\nswitch.grey.checked .uni-switch-input,\ncheckbox.grey.checked .uni-checkbox-input,\nradio.grey.checked .uni-radio-input {\n  background-color: #8799a3 !important;\n  border-color: #8799a3 !important;\n  color: #ffffff !important;\n}\n\nswitch.gray[checked] .wx-switch-input,\ncheckbox.gray[checked] .wx-checkbox-input,\nradio.gray[checked] .wx-radio-input,\nswitch.gray.checked .uni-switch-input,\ncheckbox.gray.checked .uni-checkbox-input,\nradio.gray.checked .uni-radio-input {\n  background-color: #f0f0f0 !important;\n  border-color: #f0f0f0 !important;\n  color: #333333 !important;\n}\n\nswitch.black[checked] .wx-switch-input,\ncheckbox.black[checked] .wx-checkbox-input,\nradio.black[checked] .wx-radio-input,\nswitch.black.checked .uni-switch-input,\ncheckbox.black.checked .uni-checkbox-input,\nradio.black.checked .uni-radio-input {\n  background-color: #333333 !important;\n  border-color: #333333 !important;\n  color: #ffffff !important;\n}\n\nswitch.white[checked] .wx-switch-input,\ncheckbox.white[checked] .wx-checkbox-input,\nradio.white[checked] .wx-radio-input,\nswitch.white.checked .uni-switch-input,\ncheckbox.white.checked .uni-checkbox-input,\nradio.white.checked .uni-radio-input {\n  background-color: #ffffff !important;\n  border-color: #ffffff !important;\n  color: #333333 !important;\n}\n\n/* ==================\n          边框\n ==================== */\n\n/* -- 实线 -- */\n\n.solid,\n.solid-top,\n.solid-right,\n.solid-bottom,\n.solid-left,\n.solids,\n.solids-top,\n.solids-right,\n.solids-bottom,\n.solids-left,\n.dashed,\n.dashed-top,\n.dashed-right,\n.dashed-bottom,\n.dashed-left {\n  position: relative;\n}\n\n.solid::after,\n.solid-top::after,\n.solid-right::after,\n.solid-bottom::after,\n.solid-left::after,\n.solids::after,\n.solids-top::after,\n.solids-right::after,\n.solids-bottom::after,\n.solids-left::after,\n.dashed::after,\n.dashed-top::after,\n.dashed-right::after,\n.dashed-bottom::after,\n.dashed-left::after {\n  content: \" \";\n  width: 200%;\n  height: 200%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  border-radius: inherit;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  pointer-events: none;\n  box-sizing: border-box;\n}\n\n.solid::after {\n  border: 1upx solid rgba(0, 0, 0, 0.1);\n}\n\n.solid-top::after {\n  border-top: 1upx solid rgba(0, 0, 0, 0.1);\n}\n\n.solid-right::after {\n  border-right: 1upx solid rgba(0, 0, 0, 0.1);\n}\n\n.solid-bottom::after {\n  border-bottom: 1upx solid rgba(0, 0, 0, 0.1);\n}\n\n.solid-left::after {\n  border-left: 1upx solid rgba(0, 0, 0, 0.1);\n}\n\n.solids::after {\n  border: 8upx solid #eee;\n}\n\n.solids-top::after {\n  border-top: 8upx solid #eee;\n}\n\n.solids-right::after {\n  border-right: 8upx solid #eee;\n}\n\n.solids-bottom::after {\n  border-bottom: 8upx solid #eee;\n}\n\n.solids-left::after {\n  border-left: 8upx solid #eee;\n}\n\n/* -- 虚线 -- */\n\n.dashed::after {\n  border: 1upx dashed #ddd;\n}\n\n.dashed-top::after {\n  border-top: 1upx dashed #ddd;\n}\n\n.dashed-right::after {\n  border-right: 1upx dashed #ddd;\n}\n\n.dashed-bottom::after {\n  border-bottom: 1upx dashed #ddd;\n}\n\n.dashed-left::after {\n  border-left: 1upx dashed #ddd;\n}\n\n/* -- 阴影 -- */\n\n.shadow[class*='white'] {\n  --ShadowSize: 0 1upx 6upx;\n}\n\n.shadow-lg {\n  --ShadowSize: 0upx 40upx 100upx 0upx;\n}\n\n.shadow-warp {\n  position: relative;\n  box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);\n}\n\n.shadow-warp:before,\n.shadow-warp:after {\n  position: absolute;\n  content: \"\";\n  top: 20upx;\n  bottom: 30upx;\n  left: 20upx;\n  width: 50%;\n  box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);\n  transform: rotate(-3deg);\n  z-index: -1;\n}\n\n.shadow-warp:after {\n  right: 20upx;\n  left: auto;\n  transform: rotate(3deg);\n}\n\n.shadow-blur {\n  position: relative;\n}\n\n.shadow-blur::before {\n  content: \"\";\n  display: block;\n  background: inherit;\n  filter: blur(10upx);\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  top: 10upx;\n  left: 10upx;\n  z-index: -1;\n  opacity: 0.4;\n  transform-origin: 0 0;\n  border-radius: inherit;\n  transform: scale(1, 1);\n}\n\n/* ==================\n          按钮\n ==================== */\n\n.cu-btn {\n  position: relative;\n  border: 0upx;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  box-sizing: border-box;\n  padding: 0 30upx;\n  font-size: 28upx;\n  height: 64upx;\n  line-height: 1;\n  text-align: center;\n  text-decoration: none;\n  overflow: visible;\n  margin-left: initial;\n  transform: translate(0upx, 0upx);\n  margin-right: initial;\n}\n\n.cu-btn::after {\n  display: none;\n}\n\n.cu-btn:not([class*=\"bg-\"]) {\n  background-color: #f0f0f0;\n}\n\n.cu-btn[class*=\"line\"] {\n  background-color: transparent;\n}\n\n.cu-btn[class*=\"line\"]::after {\n  content: \" \";\n  display: block;\n  width: 200%;\n  height: 200%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  border: 1upx solid currentColor;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  box-sizing: border-box;\n  border-radius: 12upx;\n  z-index: 1;\n  pointer-events: none;\n}\n\n.cu-btn.round[class*=\"line\"]::after {\n  border-radius: 1000upx;\n}\n\n.cu-btn[class*=\"lines\"]::after {\n  border: 6upx solid currentColor;\n}\n\n.cu-btn[class*=\"bg-\"]::after {\n  display: none;\n}\n\n.cu-btn.sm {\n  padding: 0 20upx;\n  font-size: 20upx;\n  height: 48upx;\n}\n\n.cu-btn.smm {\n  padding: 0 15upx;\n  font-size: 15upx;\n  height: 30upx;\n}\n\n.cu-btn.lg {\n  padding: 0 40upx;\n  font-size: 32upx;\n  height: 80upx;\n}\n\n.cu-btn.cuIcon.sm {\n  width: 48upx;\n  height: 48upx;\n}\n\n.cu-btn.cuIcon {\n  width: 64upx;\n  height: 64upx;\n  border-radius: 500upx;\n  padding: 0;\n}\n\nbutton.cuIcon.lg {\n  width: 80upx;\n  height: 80upx;\n}\n\n.cu-btn.shadow-blur::before {\n  top: 4upx;\n  left: 4upx;\n  filter: blur(6upx);\n  opacity: 0.6;\n}\n\n.cu-btn.button-hover {\n  transform: translate(1upx, 1upx);\n}\n\n.block {\n  display: block;\n}\n\n.cu-btn.block {\n  display: flex;\n}\n\n.cu-btn[disabled] {\n  opacity: 0.6;\n  color: #ffffff;\n}\n\n/* ==================\n          徽章\n ==================== */\n\n.cu-tag {\n  vertical-align: middle;\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  box-sizing: border-box;\n  padding: 0upx 16rpx;\n  height: 70rpx;\n  width: 150rpx;\n  font-family: Helvetica Neue, Helvetica, sans-serif;\n  white-space: nowrap;\n}\n\n.cu-tag:not([class*=\"bg\"]):not([class*=\"line\"]) {\n  background-color: #f1f1f1;\n}\n\n.cu-tag[class*=\"line-\"]::after {\n  content: \" \";\n  width: 200%;\n  height: 200%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  border: 1upx solid currentColor;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  box-sizing: border-box;\n  border-radius: inherit;\n  z-index: 1;\n  pointer-events: none;\n}\n\n.cu-tag.radius[class*=\"line\"]::after {\n  border-radius: 12upx;\n}\n\n.cu-tag.round[class*=\"line\"]::after {\n  border-radius: 1000upx;\n}\n\n.cu-tag[class*=\"line-\"]::after {\n  border-radius: 0;\n}\n\n.cu-tag+.cu-tag {\n  margin-left: 10upx;\n}\n\n.cu-tag.sm {\n  font-size: 20upx;\n  padding: 0upx 12upx;\n  height: 32upx;\n}\n\n.cu-capsule {\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.cu-capsule+.cu-capsule {\n  margin-left: 10upx;\n}\n\n.cu-capsule .cu-tag {\n  margin: 0;\n}\n\n.cu-capsule .cu-tag[class*=\"line-\"]:last-child::after {\n  border-left: 0upx solid transparent;\n}\n\n.cu-capsule .cu-tag[class*=\"line-\"]:first-child::after {\n  border-right: 0upx solid transparent;\n}\n\n.cu-capsule.radius .cu-tag:first-child {\n  border-top-left-radius: 6upx;\n  border-bottom-left-radius: 6upx;\n}\n\n.cu-capsule.radius .cu-tag:last-child::after,\n.cu-capsule.radius .cu-tag[class*=\"line-\"] {\n  border-top-right-radius: 12upx;\n  border-bottom-right-radius: 12upx;\n}\n\n.cu-capsule.round .cu-tag:first-child {\n  border-top-left-radius: 200upx;\n  border-bottom-left-radius: 200upx;\n  text-indent: 4upx;\n}\n\n.cu-capsule.round .cu-tag:last-child::after,\n.cu-capsule.round .cu-tag:last-child {\n  border-top-right-radius: 200upx;\n  border-bottom-right-radius: 200upx;\n  text-indent: -4upx;\n}\n\n.cu-tag.badge {\n  border-radius: 200upx;\n  position: absolute;\n  top: -10upx;\n  right: -10upx;\n  font-size: 20upx;\n  padding: 0upx 10upx;\n  height: 28upx;\n  color: #ffffff;\n}\n\n.cu-tag.badge:not([class*=\"bg-\"]) {\n  background-color: #dd514c;\n}\n\n.cu-tag:empty:not([class*=\"cuIcon-\"]) {\n  padding: 0upx;\n  width: 16upx;\n  height: 16upx;\n  top: -4upx;\n  right: -4upx;\n}\n\n.cu-tag[class*=\"cuIcon-\"] {\n  width: 32upx;\n  height: 32upx;\n  top: -4upx;\n  right: -4upx;\n}\n\n/* ==================\n          头像\n ==================== */\n\n.cu-avatar {\n  font-variant: small-caps;\n  margin: 0;\n  padding: 0;\n  display: inline-flex;\n  text-align: center;\n  justify-content: center;\n  align-items: center;\n  background-color: #ccc;\n  color: #ffffff;\n  white-space: nowrap;\n  position: relative;\n  width: 64upx;\n  height: 64upx;\n  background-size: cover;\n  background-position: center;\n  vertical-align: middle;\n  font-size: 1.5em;\n}\n\n.cu-avatar.sm {\n  width: 48upx;\n  height: 48upx;\n  font-size: 1em;\n}\n\n.cu-avatar.lg {\n  width: 96upx;\n  height: 96upx;\n  font-size: 2em;\n}\n\n.cu-avatar.xl {\n  width: 128upx;\n  height: 128upx;\n  font-size: 2.5em;\n}\n\n.cu-avatar .avatar-text {\n  font-size: 0.4em;\n}\n\n.cu-avatar-group {\n  direction: rtl;\n  unicode-bidi: bidi-override;\n  padding: 0 10upx 0 40upx;\n  display: inline-block;\n}\n\n.cu-avatar-group .cu-avatar {\n  margin-left: -30upx;\n  border: 4upx solid #f1f1f1;\n  vertical-align: middle;\n}\n\n.cu-avatar-group .cu-avatar.sm {\n  margin-left: -20upx;\n  border: 1upx solid #f1f1f1;\n}\n\n/* ==================\n         进度条\n ==================== */\n\n.cu-progress {\n  overflow: hidden;\n  height: 28upx;\n  background-color: #ebeef5;\n  display: inline-flex;\n  align-items: center;\n  width: 100%;\n}\n\n.cu-progress+view,\n.cu-progress+text {\n  line-height: 1;\n}\n\n.cu-progress.xs {\n  height: 10upx;\n}\n\n.cu-progress.sm {\n  height: 20upx;\n}\n\n.cu-progress view {\n  width: 0;\n  height: 100%;\n  align-items: center;\n  display: flex;\n  justify-items: flex-end;\n  justify-content: space-around;\n  font-size: 20upx;\n  color: #ffffff;\n  transition: width 0.6s ease;\n}\n\n.cu-progress text {\n  align-items: center;\n  display: flex;\n  font-size: 20upx;\n  color: #333333;\n  text-indent: 10upx;\n}\n\n.cu-progress.text-progress {\n  padding-right: 60upx;\n}\n\n.cu-progress.striped view {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 72upx 72upx;\n}\n\n.cu-progress.active view {\n  animation: progress-stripes 2s linear infinite;\n}\n\n@keyframes progress-stripes {\n  from {\n    background-position: 72upx 0;\n  }\n\n  to {\n    background-position: 0 0;\n  }\n}\n\n/* ==================\n          加载\n ==================== */\n\n.cu-load {\n  display: block;\n  line-height: 3em;\n  text-align: center;\n}\n\n.cu-load::before {\n  font-family: \"cuIcon\";\n  display: inline-block;\n  margin-right: 6upx;\n}\n\n.cu-load.loading::before {\n  content: \"\\e67a\";\n  animation: cuIcon-spin 2s infinite linear;\n}\n\n.cu-load.loading::after {\n  content: \"加载中...\";\n}\n\n.cu-load.over::before {\n  content: \"\\e64a\";\n}\n\n.cu-load.over::after {\n  content: \"没有更多了\";\n}\n\n.cu-load.erro::before {\n  content: \"\\e658\";\n}\n\n.cu-load.erro::after {\n  content: \"加载失败\";\n}\n\n.cu-load.load-cuIcon::before {\n  font-size: 32upx;\n}\n\n.cu-load.load-cuIcon::after {\n  display: none;\n}\n\n.cu-load.load-cuIcon.over {\n  display: none;\n}\n\n.cu-load.load-modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 140upx;\n  left: 0;\n  margin: auto;\n  width: 260upx;\n  height: 260upx;\n  background-color: #ffffff;\n  border-radius: 10upx;\n  box-shadow: 0 0 0upx 2000upx rgba(0, 0, 0, 0.5);\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  justify-content: center;\n  font-size: 28upx;\n  z-index: 9999;\n  line-height: 2.4em;\n}\n\n.cu-load.load-modal [class*=\"cuIcon-\"] {\n  font-size: 60upx;\n}\n\n.cu-load.load-modal image {\n  width: 70upx;\n  height: 70upx;\n}\n\n.cu-load.load-modal::after {\n  content: \"\";\n  position: absolute;\n  background-color: #ffffff;\n  border-radius: 50%;\n  width: 200upx;\n  height: 200upx;\n  font-size: 10px;\n  border-top: 6upx solid rgba(0, 0, 0, 0.05);\n  border-right: 6upx solid rgba(0, 0, 0, 0.05);\n  border-bottom: 6upx solid rgba(0, 0, 0, 0.05);\n  border-left: 6upx solid #f37b1d;\n  animation: cuIcon-spin 1s infinite linear;\n  z-index: -1;\n}\n\n.load-progress {\n  pointer-events: none;\n  top: 0;\n  position: fixed;\n  width: 100%;\n  left: 0;\n  z-index: 2000;\n}\n\n.load-progress.hide {\n  display: none;\n}\n\n.load-progress .load-progress-bar {\n  position: relative;\n  width: 100%;\n  height: 4upx;\n  overflow: hidden;\n  transition: all 200ms ease 0s;\n}\n\n.load-progress .load-progress-spinner {\n  position: absolute;\n  top: 10upx;\n  right: 10upx;\n  z-index: 2000;\n  display: block;\n}\n\n.load-progress .load-progress-spinner::after {\n  content: \"\";\n  display: block;\n  width: 24upx;\n  height: 24upx;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  border: solid 4upx transparent;\n  border-top-color: inherit;\n  border-left-color: inherit;\n  border-radius: 50%;\n  -webkit-animation: load-progress-spinner 0.4s linear infinite;\n  animation: load-progress-spinner 0.4s linear infinite;\n}\n\n@-webkit-keyframes load-progress-spinner {\n  0% {\n    -webkit-transform: rotate(0);\n    transform: rotate(0);\n  }\n\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes load-progress-spinner {\n  0% {\n    -webkit-transform: rotate(0);\n    transform: rotate(0);\n  }\n\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n/* ==================\n          列表\n ==================== */\n.grayscale {\n  filter: grayscale(1);\n}\n\n.cu-list+.cu-list {\n  margin-top: 30upx\n}\n\n.cu-list>.cu-item {\n  transition: all .6s ease-in-out 0s;\n  transform: translateX(0upx)\n}\n\n.cu-list>.cu-item.move-cur {\n  transform: translateX(-260upx)\n}\n\n.cu-list>.cu-item .move {\n  position: absolute;\n  right: 0;\n  display: flex;\n  width: 260upx;\n  height: 100%;\n  transform: translateX(100%)\n}\n\n.cu-list>.cu-item .move view {\n  display: flex;\n  flex: 1;\n  justify-content: center;\n  align-items: center\n}\n\n.cu-list.menu-avatar {\n  overflow: hidden;\n}\n\n.cu-list.menu-avatar>.cu-item {\n  position: relative;\n  display: flex;\n  padding-right: 10upx;\n  height: 140upx;\n  background-color: #ffffff;\n  justify-content: flex-end;\n  align-items: center\n}\n\n.cu-list.menu-avatar>.cu-item>.cu-avatar {\n  position: absolute;\n  left: 30upx\n}\n\n.cu-list.menu-avatar>.cu-item .flex .text-cut {\n  max-width: 510upx\n}\n\n.cu-list.menu-avatar>.cu-item .content {\n  position: absolute;\n  left: 146upx;\n  width: calc(100% - 96upx - 60upx - 120upx - 20upx);\n  line-height: 1.6em;\n}\n\n.cu-list.menu-avatar>.cu-item .content.flex-sub {\n  width: calc(100% - 96upx - 60upx - 20upx);\n}\n\n.cu-list.menu-avatar>.cu-item .content>view:first-child {\n  font-size: 30upx;\n  display: flex;\n  align-items: center\n}\n\n.cu-list.menu-avatar>.cu-item .content .cu-tag.sm {\n  display: inline-block;\n  margin-left: 10upx;\n  height: 28upx;\n  font-size: 16upx;\n  line-height: 32upx\n}\n\n.cu-list.menu-avatar>.cu-item .action {\n  width: 100upx;\n  text-align: center\n}\n\n.cu-list.menu-avatar>.cu-item .action view+view {\n  margin-top: 10upx\n}\n\n.cu-list.menu-avatar.comment>.cu-item .content {\n  position: relative;\n  left: 0;\n  width: auto;\n  flex: 1;\n}\n\n.cu-list.menu-avatar.comment>.cu-item {\n  padding: 30upx 30upx 30upx 120upx;\n  height: auto\n}\n\n.cu-list.menu-avatar.comment .cu-avatar {\n  align-self: flex-start\n}\n\n.cu-list.menu>.cu-item {\n  position: relative;\n  display: flex;\n  padding: 0 30upx;\n  min-height: 100upx;\n  background-color: #ffffff;\n  justify-content: space-between;\n  align-items: center\n}\n\n.cu-list.menu>.cu-item:last-child:after {\n  border: none\n}\n\n.cu-list.menu-avatar>.cu-item:after,\n.cu-list.menu>.cu-item:after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  box-sizing: border-box;\n  width: 200%;\n  height: 200%;\n  border-bottom: 1upx solid #ddd;\n  border-radius: inherit;\n  content: \" \";\n  transform: scale(.5);\n  transform-origin: 0 0;\n  pointer-events: none\n}\n\n.cu-list.menu>.cu-item.grayscale {\n  background-color: #f5f5f5\n}\n\n.cu-list.menu>.cu-item.cur {\n  background-color: #fcf7e9\n}\n\n.cu-list.menu>.cu-item.arrow {\n  padding-right: 90upx\n}\n\n.cu-list.menu>.cu-item.arrow:before {\n  position: absolute;\n  top: 0;\n  right: 30upx;\n  bottom: 0;\n  display: block;\n  margin: auto;\n  width: 30upx;\n  height: 30upx;\n  color: #8799a3;\n  content: \"\\e6a3\";\n  text-align: center;\n  font-size: 34upx;\n  font-family: cuIcon;\n  line-height: 30upx\n}\n\n.cu-list.menu>.cu-item button.content {\n  padding: 0;\n  background-color: transparent;\n  justify-content: flex-start\n}\n\n.cu-list.menu>.cu-item button.content:after {\n  display: none\n}\n\n.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar {\n  border-color: #ffffff\n}\n\n.cu-list.menu>.cu-item .content>view:first-child {\n  display: flex;\n  align-items: center\n}\n\n.cu-list.menu>.cu-item .content>text[class*=cuIcon] {\n  display: inline-block;\n  margin-right: 10upx;\n  width: 1.6em;\n  text-align: center\n}\n\n.cu-list.menu>.cu-item .content>image {\n  display: inline-block;\n  margin-right: 10upx;\n  width: 1.6em;\n  height: 1.6em;\n  vertical-align: middle\n}\n\n.cu-list.menu>.cu-item .content {\n  font-size: 30upx;\n  line-height: 1.6em;\n  flex: 1\n}\n\n.cu-list.menu>.cu-item .content .cu-tag.sm {\n  display: inline-block;\n  margin-left: 10upx;\n  height: 28upx;\n  font-size: 16upx;\n  line-height: 32upx\n}\n\n.cu-list.menu>.cu-item .action .cu-tag:empty {\n  right: 10upx\n}\n\n.cu-list.menu {\n  display: block;\n  overflow: hidden\n}\n\n.cu-list.menu.sm-border>.cu-item:after {\n  left: 30upx;\n  width: calc(200% - 120upx)\n}\n\n.cu-list.grid>.cu-item {\n  position: relative;\n  display: flex;\n  padding: 20upx 0 30upx;\n  transition-duration: 0s;\n  flex-direction: column\n}\n\n.cu-list.grid>.cu-item:after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  box-sizing: border-box;\n  width: 200%;\n  height: 200%;\n  border-right: 1px solid rgba(0, 0, 0, .1);\n  border-bottom: 1px solid rgba(0, 0, 0, .1);\n  border-radius: inherit;\n  content: \" \";\n  transform: scale(.5);\n  transform-origin: 0 0;\n  pointer-events: none\n}\n\n.cu-list.grid>.cu-item text {\n  display: block;\n  margin-top: 10upx;\n  color: #888;\n  font-size: 26upx;\n  line-height: 40upx\n}\n\n.cu-list.grid>.cu-item [class*=cuIcon] {\n  position: relative;\n  display: block;\n  margin-top: 20upx;\n  width: 100%;\n  font-size: 48upx\n}\n\n.cu-list.grid>.cu-item .cu-tag {\n  right: auto;\n  left: 50%;\n  margin-left: 20upx\n}\n\n.cu-list.grid {\n  background-color: #ffffff;\n  text-align: center\n}\n\n.cu-list.grid.no-border>.cu-item {\n  padding-top: 10upx;\n  padding-bottom: 20upx\n}\n\n.cu-list.grid.no-border>.cu-item:after {\n  border: none\n}\n\n.cu-list.grid.no-border {\n  padding: 20upx 10upx\n}\n\n.cu-list.grid.col-3>.cu-item:nth-child(3n):after,\n.cu-list.grid.col-4>.cu-item:nth-child(4n):after,\n.cu-list.grid.col-5>.cu-item:nth-child(5n):after {\n  border-right-width: 0\n}\n\n.cu-list.card-menu {\n  overflow: hidden;\n  margin-right: 30upx;\n  margin-left: 30upx;\n  border-radius: 20upx\n}\n\n\n/* ==================\n          操作条\n ==================== */\n\n.cu-bar {\n  display: flex;\n  position: relative;\n  align-items: center;\n  min-height: 100upx;\n  justify-content: space-between;\n}\n\n.cu-bar .action {\n  display: flex;\n  align-items: center;\n  height: 100%;\n  justify-content: center;\n  max-width: 100%;\n}\n\n.cu-bar .action.border-title {\n  position: relative;\n  top: -10upx;\n}\n\n.cu-bar .action.border-title text[class*=\"bg-\"]:last-child {\n  position: absolute;\n  bottom: -0.5rem;\n  min-width: 2rem;\n  height: 6upx;\n  left: 0;\n}\n\n.cu-bar .action.sub-title {\n  position: relative;\n  top: -0.2rem;\n}\n\n.cu-bar .action.sub-title text {\n  position: relative;\n  z-index: 1;\n}\n\n.cu-bar .action.sub-title text[class*=\"bg-\"]:last-child {\n  position: absolute;\n  display: inline-block;\n  bottom: -0.2rem;\n  border-radius: 6upx;\n  width: 100%;\n  height: 0.6rem;\n  left: 0.6rem;\n  opacity: 0.3;\n  z-index: 0;\n}\n\n.cu-bar .action.sub-title text[class*=\"text-\"]:last-child {\n  position: absolute;\n  display: inline-block;\n  bottom: -0.7rem;\n  left: 0.5rem;\n  opacity: 0.2;\n  z-index: 0;\n  text-align: right;\n  font-weight: 900;\n  font-size: 36upx;\n}\n\n.cu-bar.justify-center .action.border-title text:last-child,\n.cu-bar.justify-center .action.sub-title text:last-child {\n  left: 0;\n  right: 0;\n  margin: auto;\n  text-align: center;\n}\n\n.cu-bar .action:first-child {\n  margin-left: 30upx;\n  font-size: 30upx;\n}\n\n.cu-bar .action text.text-cut {\n  text-align: left;\n  width: 100%;\n}\n\n.cu-bar .cu-avatar:first-child {\n  margin-left: 20upx;\n}\n\n.cu-bar .action:first-child>text[class*=\"cuIcon-\"] {\n  margin-left: -0.3em;\n  margin-right: 0.3em;\n}\n\n.cu-bar .action:last-child {\n  margin-right: 30upx;\n}\n\n.cu-bar .action>text[class*=\"cuIcon-\"],\n.cu-bar .action>view[class*=\"cuIcon-\"] {\n  font-size: 36upx;\n}\n\n.cu-bar .action>text[class*=\"cuIcon-\"]+text[class*=\"cuIcon-\"] {\n  margin-left: 0.5em;\n}\n\n.cu-bar .content {\n  position: absolute;\n  text-align: center;\n  width: calc(100% - 340upx);\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  margin: auto;\n  height: 60upx;\n  font-size: 32upx;\n  line-height: 60upx;\n  cursor: none;\n  pointer-events: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n.cu-bar.ios .content {\n  bottom: 7px;\n  height: 30px;\n  font-size: 32upx;\n  line-height: 30px;\n}\n\n.cu-bar.btn-group {\n  justify-content: space-around;\n}\n\n.cu-bar.btn-group button {\n  padding: 20upx 32upx;\n}\n\n.cu-bar.btn-group button {\n  flex: 1;\n  margin: 0 20upx;\n  max-width: 50%;\n}\n\n.cu-bar .search-form {\n  background-color: #f5f5f5;\n  line-height: 64upx;\n  height: 64upx;\n  font-size: 24upx;\n  color: #333333;\n  flex: 1;\n  display: flex;\n  align-items: center;\n  margin: 0 30upx;\n}\n\n.cu-bar .search-form+.action {\n  margin-right: 30upx;\n}\n\n.cu-bar .search-form input {\n  flex: 1;\n  padding-right: 30upx;\n  height: 64upx;\n  line-height: 64upx;\n  font-size: 26upx;\n  background-color: transparent;\n}\n\n.cu-bar .search-form [class*=\"cuIcon-\"] {\n  margin: 0 0.5em 0 0.8em;\n}\n\n.cu-bar .search-form [class*=\"cuIcon-\"]::before {\n  top: 0upx;\n}\n\n.cu-bar.fixed,\n.nav.fixed {\n  position: fixed;\n  width: 100%;\n  top: 0;\n  z-index: 1024;\n  box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);\n}\n\n.cu-bar.foot {\n  position: fixed;\n  width: 100%;\n  bottom: 0;\n  z-index: 1024;\n  box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);\n}\n\n.cu-bar.tabbar {\n  padding: 0;\n  height: calc(100upx + env(safe-area-inset-bottom) / 2);\n  padding-bottom: calc(env(safe-area-inset-bottom) / 2);\n}\n\n.cu-tabbar-height {\n  min-height: 100upx;\n  height: calc(100upx + env(safe-area-inset-bottom) / 2);\n}\n\n.cu-bar.tabbar.shadow {\n  box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);\n}\n\n.cu-bar.tabbar .action {\n  font-size: 22upx;\n  position: relative;\n  flex: 1;\n  text-align: center;\n  padding: 0;\n  display: block;\n  height: auto;\n  line-height: 1;\n  margin: 0;\n  background-color: inherit;\n  overflow: initial;\n}\n\n.cu-bar.tabbar.shop .action {\n  width: 140upx;\n  flex: initial;\n}\n\n.cu-bar.tabbar .action.add-action {\n  position: relative;\n  z-index: 2;\n  padding-top: 50upx;\n}\n\n.cu-bar.tabbar .action.add-action [class*=\"cuIcon-\"] {\n  position: absolute;\n  width: 70upx;\n  z-index: 2;\n  height: 70upx;\n  border-radius: 50%;\n  line-height: 70upx;\n  font-size: 50upx;\n  top: -35upx;\n  left: 0;\n  right: 0;\n  margin: auto;\n  padding: 0;\n}\n\n.cu-bar.tabbar .action.add-action::after {\n  content: \"\";\n  position: absolute;\n  width: 100upx;\n  height: 100upx;\n  top: -50upx;\n  left: 0;\n  right: 0;\n  margin: auto;\n  box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08);\n  border-radius: 50upx;\n  background-color: inherit;\n  z-index: 0;\n}\n\n.cu-bar.tabbar .action.add-action::before {\n  content: \"\";\n  position: absolute;\n  width: 100upx;\n  height: 30upx;\n  bottom: 30upx;\n  left: 0;\n  right: 0;\n  margin: auto;\n  background-color: inherit;\n  z-index: 1;\n}\n\n.cu-bar.tabbar .btn-group {\n  flex: 1;\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n  padding: 0 10upx;\n}\n\n.cu-bar.tabbar button.action::after {\n  border: 0;\n}\n\n.cu-bar.tabbar .action [class*=\"cuIcon-\"] {\n  width: 100upx;\n  position: relative;\n  display: block;\n  height: auto;\n  margin: 0 auto 10upx;\n  text-align: center;\n  font-size: 40upx;\n}\n\n.cu-bar.tabbar .action .cuIcon-cu-image {\n  margin: 0 auto;\n}\n\n.cu-bar.tabbar .action .cuIcon-cu-image image {\n  width: 50upx;\n  height: 50upx;\n  display: inline-block;\n}\n\n.cu-bar.tabbar .submit {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  text-align: center;\n  position: relative;\n  flex: 2;\n  align-self: stretch;\n}\n\n.cu-bar.tabbar .submit:last-child {\n  flex: 2.6;\n}\n\n.cu-bar.tabbar .submit+.submit {\n  flex: 2;\n}\n\n.cu-bar.tabbar.border .action::before {\n  content: \" \";\n  width: 200%;\n  height: 200%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  border-right: 1upx solid rgba(0, 0, 0, 0.1);\n  z-index: 3;\n}\n\n.cu-bar.tabbar.border .action:last-child:before {\n  display: none;\n}\n\n.cu-bar.input {\n  padding-right: 20upx;\n  background-color: #ffffff;\n}\n\n.cu-bar.input input {\n  overflow: initial;\n  line-height: 64upx;\n  height: 64upx;\n  min-height: 64upx;\n  flex: 1;\n  font-size: 30upx;\n  margin: 0 20upx;\n}\n\n.cu-bar.input .action {\n  margin-left: 20upx;\n}\n\n.cu-bar.input .action [class*=\"cuIcon-\"] {\n  font-size: 48upx;\n}\n\n.cu-bar.input input+.action {\n  margin-right: 20upx;\n  margin-left: 0upx;\n}\n\n.cu-bar.input .action:first-child [class*=\"cuIcon-\"] {\n  margin-left: 0upx;\n}\n\n.cu-custom {\n  display: block;\n  position: relative;\n}\n\n.cu-custom .cu-bar .content {\n  width: calc(100% - 440upx);\n}\n\n/* #ifdef MP-ALIPAY */\n.cu-custom .cu-bar .action .cuIcon-back {\n  opacity: 0;\n}\n\n/* #endif */\n\n.cu-custom .cu-bar .content image {\n  height: 60upx;\n  width: 240upx;\n}\n\n.cu-custom .cu-bar {\n  min-height: 0px;\n  /* #ifdef MP-WEIXIN */\n  padding-right: 220upx;\n  /* #endif */\n  /* #ifdef MP-ALIPAY */\n  padding-right: 150upx;\n  /* #endif */\n  box-shadow: 0upx 0upx 0upx;\n  z-index: 9999;\n}\n\n.cu-custom .cu-bar .border-custom {\n  position: relative;\n  background: rgba(0, 0, 0, 0.15);\n  border-radius: 1000upx;\n  height: 30px;\n}\n\n.cu-custom .cu-bar .border-custom::after {\n  content: \" \";\n  width: 200%;\n  height: 200%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  border-radius: inherit;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  pointer-events: none;\n  box-sizing: border-box;\n  border: 1upx solid #ffffff;\n  opacity: 0.5;\n}\n\n.cu-custom .cu-bar .border-custom::before {\n  content: \" \";\n  width: 1upx;\n  height: 110%;\n  position: absolute;\n  top: 22.5%;\n  left: 0;\n  right: 0;\n  margin: auto;\n  transform: scale(0.5);\n  transform-origin: 0 0;\n  pointer-events: none;\n  box-sizing: border-box;\n  opacity: 0.6;\n  background-color: #ffffff;\n}\n\n.cu-custom .cu-bar .border-custom text {\n  display: block;\n  flex: 1;\n  margin: auto !important;\n  text-align: center;\n  font-size: 34upx;\n}\n\n/* ==================\n         导航栏\n ==================== */\n\n.nav {\n  white-space: nowrap;\n}\n\n::-webkit-scrollbar {\n  display: none;\n}\n\n.nav .cu-item {\n  height: 90upx;\n  display: inline-block;\n  line-height: 90upx;\n  margin: 0 10upx;\n  padding: 0 20upx;\n}\n\n.nav .cu-item.cur {\n  border-bottom: 4upx solid;\n}\n\n/* ==================\n         时间轴\n ==================== */\n\n.cu-timeline {\n  display: block;\n  background-color: #ffffff;\n}\n\n.cu-timeline .cu-time {\n  width: 120upx;\n  text-align: center;\n  padding: 20upx 0;\n  font-size: 26upx;\n  color: #888;\n  display: block;\n}\n\n.cu-timeline>.cu-item {\n  padding: 30upx 30upx 30upx 120upx;\n  position: relative;\n  display: block;\n  z-index: 0;\n}\n\n.cu-timeline>.cu-item:not([class*=\"text-\"]) {\n  color: #ccc;\n}\n\n.cu-timeline>.cu-item::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  width: 1upx;\n  background-color: #ddd;\n  left: 60upx;\n  height: 100%;\n  top: 0;\n  z-index: 8;\n}\n\n.cu-timeline>.cu-item::before {\n  font-family: \"cuIcon\";\n  display: block;\n  position: absolute;\n  top: 36upx;\n  z-index: 9;\n  background-color: #ffffff;\n  width: 50upx;\n  height: 50upx;\n  text-align: center;\n  border: none;\n  line-height: 50upx;\n  left: 36upx;\n}\n\n.cu-timeline>.cu-item:not([class*=\"cuIcon-\"])::before {\n  content: \"\\e763\";\n}\n\n.cu-timeline>.cu-item[class*=\"cuIcon-\"]::before {\n  background-color: #ffffff;\n  width: 50upx;\n  height: 50upx;\n  text-align: center;\n  border: none;\n  line-height: 50upx;\n  left: 36upx;\n}\n\n.cu-timeline>.cu-item>.content {\n  padding: 30upx;\n  border-radius: 6upx;\n  display: block;\n  line-height: 1.6;\n}\n\n.cu-timeline>.cu-item>.content:not([class*=\"bg-\"]) {\n  background-color: #f1f1f1;\n  color: #333333;\n}\n\n.cu-timeline>.cu-item>.content+.content {\n  margin-top: 20upx;\n}\n\n/* ==================\n         聊天\n ==================== */\n\n.cu-chat {\n  display: flex;\n  flex-direction: column;\n}\n\n.cu-chat .cu-item {\n  display: flex;\n  padding: 30upx 30upx 70upx;\n  position: relative;\n}\n\n.cu-chat .cu-item>.cu-avatar {\n  width: 80upx;\n  height: 80upx;\n}\n\n.cu-chat .cu-item>.main {\n  max-width: calc(100% - 260upx);\n  margin: 0 40upx;\n  display: flex;\n  align-items: center;\n}\n\n.cu-chat .cu-item>image {\n  height: 320upx;\n}\n\n.cu-chat .cu-item>.main .content {\n  padding: 20upx;\n  border-radius: 6upx;\n  display: inline-flex;\n  max-width: 100%;\n  align-items: center;\n  font-size: 30upx;\n  position: relative;\n  min-height: 80upx;\n  line-height: 40upx;\n  text-align: left;\n}\n\n.cu-chat .cu-item>.main .content:not([class*=\"bg-\"]) {\n  background-color: #ffffff;\n  color: #333333;\n}\n\n.cu-chat .cu-item .date {\n  position: absolute;\n  font-size: 24upx;\n  color: #8799a3;\n  width: calc(100% - 320upx);\n  bottom: 20upx;\n  left: 160upx;\n}\n\n.cu-chat .cu-item .action {\n  padding: 0 30upx;\n  display: flex;\n  align-items: center;\n}\n\n.cu-chat .cu-item>.main .content::after {\n  content: \"\";\n  top: 27upx;\n  transform: rotate(45deg);\n  position: absolute;\n  z-index: 100;\n  display: inline-block;\n  overflow: hidden;\n  width: 24upx;\n  height: 24upx;\n  left: -12upx;\n  right: initial;\n  background-color: inherit;\n}\n\n.cu-chat .cu-item.self>.main .content::after {\n  left: auto;\n  right: -12upx;\n}\n\n.cu-chat .cu-item>.main .content::before {\n  content: \"\";\n  top: 30upx;\n  transform: rotate(45deg);\n  position: absolute;\n  z-index: -1;\n  display: inline-block;\n  overflow: hidden;\n  width: 24upx;\n  height: 24upx;\n  left: -12upx;\n  right: initial;\n  background-color: inherit;\n  filter: blur(5upx);\n  opacity: 0.3;\n}\n\n.cu-chat .cu-item>.main .content:not([class*=\"bg-\"])::before {\n  background-color: #333333;\n  opacity: 0.1;\n}\n\n.cu-chat .cu-item.self>.main .content::before {\n  left: auto;\n  right: -12upx;\n}\n\n.cu-chat .cu-item.self {\n  justify-content: flex-end;\n  text-align: right;\n}\n\n.cu-chat .cu-info {\n  display: inline-block;\n  margin: 20upx auto;\n  font-size: 24upx;\n  padding: 8upx 12upx;\n  background-color: rgba(0, 0, 0, 0.2);\n  border-radius: 6upx;\n  color: #ffffff;\n  max-width: 400upx;\n  line-height: 1.4;\n}\n\n/* ==================\n         卡片\n ==================== */\n\n.cu-card {\n  display: block;\n  overflow: hidden;\n}\n\n.cu-card>.cu-item {\n  display: block;\n  background-color: #ffffff;\n  overflow: hidden;\n  border-radius: 10upx;\n  margin: 30upx;\n}\n\n.cu-card>.cu-item.shadow-blur {\n  overflow: initial;\n}\n\n.cu-card.no-card>.cu-item {\n  margin: 0upx;\n  border-radius: 0upx;\n}\n\n.cu-card .grid.grid-square {\n  margin-bottom: -20upx;\n}\n\n.cu-card.case .image {\n  position: relative;\n}\n\n.cu-card.case .image image {\n  width: 100%;\n}\n\n.cu-card.case .image .cu-tag {\n  position: absolute;\n  right: 0;\n  top: 0;\n}\n\n.cu-card.case .image .cu-bar {\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  background-color: transparent;\n  padding: 0upx 30upx;\n}\n\n.cu-card.case.no-card .image {\n  margin: 30upx 30upx 0;\n  overflow: hidden;\n  border-radius: 10upx;\n}\n\n.cu-card.dynamic {\n  display: block;\n}\n\n.cu-card.dynamic>.cu-item {\n  display: block;\n  background-color: #ffffff;\n  overflow: hidden;\n}\n\n.cu-card.dynamic>.cu-item>.text-content {\n  padding: 0 30upx 0;\n  max-height: 6.4em;\n  overflow: hidden;\n  font-size: 30upx;\n  margin-bottom: 20upx;\n}\n\n.cu-card.dynamic>.cu-item .square-img {\n  width: 100%;\n  height: 200upx;\n  border-radius: 6upx;\n}\n\n.cu-card.dynamic>.cu-item .only-img {\n  width: 100%;\n  height: 320upx;\n  border-radius: 6upx;\n}\n\n/* card.dynamic>.cu-item .comment {\n  padding: 20upx;\n  background-color: #f1f1f1;\n  margin: 0 30upx 30upx;\n  border-radius: 6upx;\n} */\n\n.cu-card.article {\n  display: block;\n}\n\n.cu-card.article>.cu-item {\n  padding-bottom: 30upx;\n}\n\n.cu-card.article>.cu-item .title {\n  font-size: 30upx;\n  font-weight: 900;\n  color: #333333;\n  line-height: 100upx;\n  padding: 0 30upx;\n}\n\n.cu-card.article>.cu-item .content {\n  display: flex;\n  padding: 0 30upx;\n}\n\n.cu-card.article>.cu-item .content>image {\n  width: 240upx;\n  height: 6.4em;\n  margin-right: 20upx;\n  border-radius: 6upx;\n}\n\n.cu-card.article>.cu-item .content .desc {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n\n.cu-card.article>.cu-item .content .text-content {\n  font-size: 28upx;\n  color: #888;\n  height: 4.8em;\n  overflow: hidden;\n}\n\n/* ==================\n         表单\n ==================== */\n\n.cu-form-group {\n  background-color: #ffffff;\n  padding: 1upx 30upx;\n  display: flex;\n  align-items: center;\n  min-height: 100upx;\n  justify-content: space-between;\n}\n\n.cu-form-group+.cu-form-group {\n  border-top: 1upx solid #eee;\n}\n\n.cu-form-group .title {\n  text-align: justify;\n  padding-right: 30upx;\n  font-size: 30upx;\n  position: relative;\n  height: 60upx;\n  line-height: 60upx;\n}\n\n.cu-form-group input {\n  flex: 1;\n  font-size: 30upx;\n  color: #555;\n  padding-right: 20upx;\n}\n\n.cu-form-group>text[class*=\"cuIcon-\"] {\n  font-size: 36upx;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n.cu-form-group textarea {\n  margin: 32upx 0 30upx;\n  height: 4.6em;\n  width: 100%;\n  line-height: 1.2em;\n  flex: 1;\n  font-size: 28upx;\n  padding: 0;\n}\n\n.cu-form-group.align-start .title {\n  height: 1em;\n  margin-top: 32upx;\n  line-height: 1em;\n}\n\n.cu-form-group picker {\n  flex: 1;\n  padding-right: 40upx;\n  overflow: hidden;\n  position: relative;\n}\n\n.cu-form-group picker .picker {\n  line-height: 100upx;\n  font-size: 28upx;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  width: 100%;\n  text-align: right;\n}\n\n.cu-form-group picker::after {\n  font-family: cuIcon;\n  display: block;\n  content: \"\\e6a3\";\n  position: absolute;\n  font-size: 34upx;\n  color: #8799a3;\n  line-height: 100upx;\n  width: 60upx;\n  text-align: center;\n  top: 0;\n  bottom: 0;\n  right: -20upx;\n  margin: auto;\n}\n\n.cu-form-group textarea[disabled],\n.cu-form-group textarea[disabled] .placeholder {\n  color: transparent;\n}\n\n/* ==================\n         模态窗口\n ==================== */\n\n.cu-modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1110;\n  opacity: 0;\n  outline: 0;\n  text-align: center;\n  -ms-transform: scale(1.185);\n  transform: scale(1.185);\n  backface-visibility: hidden;\n  perspective: 2000upx;\n  background: rgba(0, 0, 0, 0.6);\n  transition: all 0.3s ease-in-out 0s;\n  pointer-events: none;\n}\n\n.cu-modal::before {\n  content: \"\\200B\";\n  display: inline-block;\n  height: 100%;\n  vertical-align: middle;\n}\n\n.cu-modal.show {\n  opacity: 1;\n  transition-duration: 0.3s;\n  -ms-transform: scale(1);\n  transform: scale(1);\n  overflow-x: hidden;\n  overflow-y: auto;\n  pointer-events: auto;\n}\n\n.cu-dialog {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n  margin-left: auto;\n  margin-right: auto;\n  width: 680upx;\n  max-width: 100%;\n  background-color: #f8f8f8;\n  border-radius: 10upx;\n  overflow: hidden;\n}\n\n.cu-modal.bottom-modal::before {\n  vertical-align: bottom;\n}\n\n.cu-modal.bottom-modal .cu-dialog {\n  width: 100%;\n  border-radius: 0;\n}\n\n.cu-modal.bottom-modal {\n  margin-bottom: -1000upx;\n}\n\n.cu-modal.bottom-modal.show {\n  margin-bottom: 0;\n}\n\n.cu-modal.drawer-modal {\n  transform: scale(1);\n  display: flex;\n}\n\n.cu-modal.drawer-modal .cu-dialog {\n  height: 100%;\n  min-width: 200upx;\n  border-radius: 0;\n  margin: initial;\n  transition-duration: 0.3s;\n}\n\n.cu-modal.drawer-modal.justify-start .cu-dialog {\n  transform: translateX(-100%);\n}\n\n.cu-modal.drawer-modal.justify-end .cu-dialog {\n  transform: translateX(100%);\n}\n\n.cu-modal.drawer-modal.show .cu-dialog {\n  transform: translateX(0%);\n}\n\n.cu-modal .cu-dialog>.cu-bar:first-child .action {\n  min-width: 100rpx;\n  margin-right: 0;\n  min-height: 100rpx;\n}\n\n/* ==================\n         轮播\n ==================== */\nswiper .a-swiper-dot {\n  display: inline-block;\n  width: 16upx;\n  height: 16upx;\n  background: rgba(0, 0, 0, .3);\n  border-radius: 50%;\n  vertical-align: middle;\n}\n\nswiper[class*=\"-dot\"] .wx-swiper-dots,\nswiper[class*=\"-dot\"] .a-swiper-dots,\nswiper[class*=\"-dot\"] .uni-swiper-dots {\n  display: flex;\n  align-items: center;\n  width: 100%;\n  justify-content: center;\n}\n\nswiper.square-dot .wx-swiper-dot,\nswiper.square-dot .a-swiper-dot,\nswiper.square-dot .uni-swiper-dot {\n  background-color: #ffffff;\n  opacity: 0.4;\n  width: 10upx;\n  height: 10upx;\n  border-radius: 20upx;\n  margin: 0 8upx !important;\n}\n\nswiper.square-dot .wx-swiper-dot.wx-swiper-dot-active,\nswiper.square-dot .a-swiper-dot.a-swiper-dot-active,\nswiper.square-dot .uni-swiper-dot.uni-swiper-dot-active {\n  opacity: 1;\n  width: 30upx;\n}\n\nswiper.round-dot .wx-swiper-dot,\nswiper.round-dot .a-swiper-dot,\nswiper.round-dot .uni-swiper-dot {\n  width: 10upx;\n  height: 10upx;\n  position: relative;\n  margin: 4upx 8upx !important;\n}\n\nswiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after,\nswiper.round-dot .a-swiper-dot.a-swiper-dot-active::after,\nswiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after {\n  content: \"\";\n  position: absolute;\n  width: 10upx;\n  height: 10upx;\n  top: 0upx;\n  left: 0upx;\n  right: 0;\n  bottom: 0;\n  margin: auto;\n  background-color: #ffffff;\n  border-radius: 20upx;\n}\n\nswiper.round-dot .wx-swiper-dot.wx-swiper-dot-active,\nswiper.round-dot .a-swiper-dot.a-swiper-dot-active,\nswiper.round-dot .uni-swiper-dot.uni-swiper-dot-active {\n  width: 18upx;\n  height: 18upx;\n}\n\n.screen-swiper {\n  /* min-height: 375upx; */\n}\n\n.screen-swiper image,\n.screen-swiper video,\n.swiper-item image,\n.swiper-item video {\n  width: 100%;\n  display: block;\n  height: 100%;\n  margin: 0;\n  pointer-events: none;\n}\n\n.card-swiper {\n  height: 420upx !important;\n}\n\n.card-swiper swiper-item {\n  width: 610upx !important;\n  left: 70upx;\n  box-sizing: border-box;\n  padding: 40upx 0upx 70upx;\n  overflow: initial;\n}\n\n.card-swiper swiper-item .swiper-item {\n  width: 100%;\n  display: block;\n  height: 100%;\n  border-radius: 10upx;\n  transform: scale(0.9);\n  transition: all 0.2s ease-in 0s;\n  overflow: hidden;\n}\n\n.card-swiper swiper-item.cur .swiper-item {\n  transform: none;\n  transition: all 0.2s ease-in 0s;\n}\n\n\n.tower-swiper {\n  height: 420upx;\n  position: relative;\n  max-width: 750upx;\n  overflow: hidden;\n}\n\n.tower-swiper .tower-item {\n  position: absolute;\n  width: 300upx;\n  height: 380upx;\n  top: 0;\n  bottom: 0;\n  left: 50%;\n  margin: auto;\n  transition: all 0.2s ease-in 0s;\n  opacity: 1;\n}\n\n.tower-swiper .tower-item.none {\n  opacity: 0;\n}\n\n.tower-swiper .tower-item .swiper-item {\n  width: 100%;\n  height: 100%;\n  border-radius: 6upx;\n  overflow: hidden;\n}\n\n/* ==================\n          步骤条\n ==================== */\n\n.cu-steps {\n  display: flex;\n}\n\nscroll-view.cu-steps {\n  display: block;\n  white-space: nowrap;\n}\n\nscroll-view.cu-steps .cu-item {\n  display: inline-block;\n}\n\n.cu-steps .cu-item {\n  flex: 1;\n  text-align: center;\n  position: relative;\n  min-width: 100upx;\n}\n\n.cu-steps .cu-item:not([class*=\"text-\"]) {\n  color: #8799a3;\n}\n\n.cu-steps .cu-item [class*=\"cuIcon-\"],\n.cu-steps .cu-item .num {\n  display: block;\n  font-size: 40upx;\n  line-height: 80upx;\n}\n\n.cu-steps .cu-item::before,\n.cu-steps .cu-item::after,\n.cu-steps.steps-arrow .cu-item::before,\n.cu-steps.steps-arrow .cu-item::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  height: 0px;\n  width: calc(100% - 80upx);\n  border-bottom: 1px solid #ccc;\n  left: calc(0px - (100% - 80upx) / 2);\n  top: 40upx;\n  z-index: 0;\n}\n\n.cu-steps.steps-arrow .cu-item::before,\n.cu-steps.steps-arrow .cu-item::after {\n  content: \"\\e6a3\";\n  font-family: 'cuIcon';\n  height: 30upx;\n  border-bottom-width: 0px;\n  line-height: 30upx;\n  top: 0;\n  bottom: 0;\n  margin: auto;\n  color: #ccc;\n}\n\n.cu-steps.steps-bottom .cu-item::before,\n.cu-steps.steps-bottom .cu-item::after {\n  bottom: 40upx;\n  top: initial;\n}\n\n.cu-steps .cu-item::after {\n  border-bottom: 1px solid currentColor;\n  width: 0px;\n  transition: all 0.3s ease-in-out 0s;\n}\n\n.cu-steps .cu-item[class*=\"text-\"]::after {\n  width: calc(100% - 80upx);\n  color: currentColor;\n}\n\n.cu-steps .cu-item:first-child::before,\n.cu-steps .cu-item:first-child::after {\n  display: none;\n}\n\n.cu-steps .cu-item .num {\n  width: 40upx;\n  height: 40upx;\n  border-radius: 50%;\n  line-height: 40upx;\n  margin: 20upx auto;\n  font-size: 24upx;\n  border: 1px solid currentColor;\n  position: relative;\n  overflow: hidden;\n}\n\n.cu-steps .cu-item[class*=\"text-\"] .num {\n  background-color: currentColor;\n}\n\n.cu-steps .cu-item .num::before,\n.cu-steps .cu-item .num::after {\n  content: attr(data-index);\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  margin: auto;\n  transition: all 0.3s ease-in-out 0s;\n  transform: translateY(0upx);\n}\n\n.cu-steps .cu-item[class*=\"text-\"] .num::before {\n  transform: translateY(-40upx);\n  color: #ffffff;\n}\n\n.cu-steps .cu-item .num::after {\n  transform: translateY(40upx);\n  color: #ffffff;\n  transition: all 0.3s ease-in-out 0s;\n}\n\n.cu-steps .cu-item[class*=\"text-\"] .num::after {\n  content: \"\\e645\";\n  font-family: 'cuIcon';\n  color: #ffffff;\n  transform: translateY(0upx);\n}\n\n.cu-steps .cu-item[class*=\"text-\"] .num.err::after {\n  content: \"\\e646\";\n}\n\n/* ==================\n          布局\n ==================== */\n\n/*  -- flex弹性布局 -- */\n\n.flex {\n  display: flex;\n}\n\n.basis-xs {\n  flex-basis: 20%;\n}\n\n.basis-sm {\n  flex-basis: 40%;\n}\n\n.basis-df {\n  flex-basis: 50%;\n}\n\n.basis-lg {\n  flex-basis: 60%;\n}\n\n.basis-xl {\n  flex-basis: 80%;\n}\n\n.flex-sub {\n  flex: 1;\n}\n\n.flex-twice {\n  flex: 2;\n}\n\n.flex-treble {\n  flex: 3;\n}\n\n.flex-direction {\n  flex-direction: column;\n}\n\n.flex-wrap {\n  flex-wrap: wrap;\n}\n\n.align-start {\n  align-items: flex-start;\n}\n\n.align-end {\n  align-items: flex-end;\n}\n\n.align-center {\n  align-items: center;\n}\n\n.align-stretch {\n  align-items: stretch;\n}\n\n.self-start {\n  align-self: flex-start;\n}\n\n.self-center {\n  align-self: flex-center;\n}\n\n.self-end {\n  align-self: flex-end;\n}\n\n.self-stretch {\n  align-self: stretch;\n}\n\n.align-stretch {\n  align-items: stretch;\n}\n\n.justify-start {\n  justify-content: flex-start;\n}\n\n.justify-end {\n  justify-content: flex-end;\n}\n\n.justify-center {\n  justify-content: center;\n}\n\n.justify-between {\n  justify-content: space-between;\n}\n\n.justify-around {\n  justify-content: space-around;\n}\n\n/* grid布局 */\n\n.grid {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.grid.grid-square {\n  overflow: hidden;\n}\n\n.grid.grid-square .cu-tag {\n  position: absolute;\n  right: 0;\n  top: 0;\n  border-bottom-left-radius: 6upx;\n  padding: 6upx 12upx;\n  height: auto;\n  background-color: rgba(0, 0, 0, 0.5);\n}\n\n.grid.grid-square>view>text[class*=\"cuIcon-\"] {\n  font-size: 52upx;\n  position: absolute;\n  color: #8799a3;\n  margin: auto;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  flex-direction: column;\n}\n\n.grid.grid-square>view {\n  margin-right: 20upx;\n  margin-bottom: 20upx;\n  border-radius: 6upx;\n  position: relative;\n  overflow: hidden;\n}\n\n.grid.grid-square>view.bg-img image {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n}\n\n.grid.col-1.grid-square>view {\n  padding-bottom: 100%;\n  height: 0;\n  margin-right: 0;\n}\n\n.grid.col-2.grid-square>view {\n  padding-bottom: calc((100% - 20upx)/2);\n  height: 0;\n  width: calc((100% - 20upx)/2);\n}\n\n.grid.col-3.grid-square>view {\n  padding-bottom: calc((100% - 40upx)/3);\n  height: 0;\n  width: calc((100% - 40upx)/3);\n}\n\n.grid.col-4.grid-square>view {\n  padding-bottom: calc((100% - 60upx)/4);\n  height: 0;\n  width: calc((100% - 60upx)/4);\n}\n\n.grid.col-5.grid-square>view {\n  padding-bottom: calc((100% - 80upx)/5);\n  height: 0;\n  width: calc((100% - 80upx)/5);\n}\n\n.grid.col-2.grid-square>view:nth-child(2n),\n.grid.col-3.grid-square>view:nth-child(3n),\n.grid.col-4.grid-square>view:nth-child(4n),\n.grid.col-5.grid-square>view:nth-child(5n) {\n  margin-right: 0;\n}\n\n.grid.col-1>view {\n  width: 100%;\n}\n\n.grid.col-2>view {\n  width: 50%;\n}\n\n.grid.col-3>view {\n  width: 33.33%;\n}\n\n.grid.col-4>view {\n  width: 25%;\n}\n\n.grid.col-5>view {\n  width: 20%;\n}\n\n/*  -- 内外边距 -- */\n\n.margin-0 {\n  margin: 0;\n}\n\n.margin-xs {\n  margin: 10upx;\n}\n\n.margin-sm {\n  margin: 20upx;\n}\n\n.margin {\n  margin: 30upx;\n}\n\n.margin-lg {\n  margin: 40upx;\n}\n\n.margin-xl {\n  margin: 50upx;\n}\n\n.margin-top-xs {\n  margin-top: 10upx;\n}\n\n.margin-top-sm {\n  margin-top: 20upx;\n}\n\n.margin-top {\n  margin-top: 30upx;\n}\n\n.margin-top-lg {\n  margin-top: 40upx;\n}\n\n.margin-top-xl {\n  margin-top: 50upx;\n}\n\n.margin-right-xs {\n  margin-right: 10upx;\n}\n\n.margin-right-sm {\n  margin-right: 20upx;\n}\n\n.margin-right {\n  margin-right: 30upx;\n}\n\n.margin-right-lg {\n  margin-right: 40upx;\n}\n\n.margin-right-xl {\n  margin-right: 50upx;\n}\n\n.margin-bottom-xs {\n  margin-bottom: 10upx;\n}\n\n.margin-bottom-sm {\n  margin-bottom: 20upx;\n}\n\n.margin-bottom {\n  margin-bottom: 30upx;\n}\n\n.margin-bottom-lg {\n  margin-bottom: 40upx;\n}\n\n.margin-bottom-xl {\n  margin-bottom: 50upx;\n}\n\n.margin-left-xs {\n  margin-left: 10upx;\n}\n\n.margin-left-sm {\n  margin-left: 20upx;\n}\n\n.margin-left {\n  margin-left: 30upx;\n}\n\n.margin-left-lg {\n  margin-left: 40upx;\n}\n\n.margin-left-xl {\n  margin-left: 50upx;\n}\n\n.margin-lr-xs {\n  margin-left: 10upx;\n  margin-right: 10upx;\n}\n\n.margin-lr-sm {\n  margin-left: 20upx;\n  margin-right: 20upx;\n}\n\n.margin-lr {\n  margin-left: 30upx;\n  margin-right: 30upx;\n}\n\n.margin-lr-lg {\n  margin-left: 40upx;\n  margin-right: 40upx;\n}\n\n.margin-lr-xl {\n  margin-left: 50upx;\n  margin-right: 50upx;\n}\n\n.margin-tb-xs {\n  margin-top: 10upx;\n  margin-bottom: 10upx;\n}\n\n.margin-tb-sm {\n  margin-top: 20upx;\n  margin-bottom: 20upx;\n}\n\n.margin-tb {\n  margin-top: 30upx;\n  margin-bottom: 30upx;\n}\n\n.margin-tb-lg {\n  margin-top: 40upx;\n  margin-bottom: 40upx;\n}\n\n.margin-tb-xl {\n  margin-top: 50upx;\n  margin-bottom: 50upx;\n}\n\n.padding-0 {\n  padding: 0;\n}\n\n.padding-xs {\n  padding: 10upx;\n}\n\n.padding-sm {\n  padding: 20upx;\n}\n\n.padding {\n  padding: 30upx;\n}\n\n.padding-lg {\n  padding: 40upx;\n}\n\n.padding-xl {\n  padding: 50upx;\n}\n\n.padding-top-xs {\n  padding-top: 10upx;\n}\n\n.padding-top-sm {\n  padding-top: 20upx;\n}\n\n.padding-top {\n  padding-top: 30upx;\n}\n\n.padding-top-lg {\n  padding-top: 40upx;\n}\n\n.padding-top-xl {\n  padding-top: 50upx;\n}\n\n.padding-right-xs {\n  padding-right: 10upx;\n}\n\n.padding-right-sm {\n  padding-right: 20upx;\n}\n\n.padding-right {\n  padding-right: 30upx;\n}\n\n.padding-right-lg {\n  padding-right: 40upx;\n}\n\n.padding-right-xl {\n  padding-right: 50upx;\n}\n\n.padding-bottom-xs {\n  padding-bottom: 10upx;\n}\n\n.padding-bottom-sm {\n  padding-bottom: 20upx;\n}\n\n.padding-bottom {\n  padding-bottom: 30upx;\n}\n\n.padding-bottom-lg {\n  padding-bottom: 40upx;\n}\n\n.padding-bottom-xl {\n  padding-bottom: 50upx;\n}\n\n.padding-left-xs {\n  padding-left: 10upx;\n}\n\n.padding-left-sm {\n  padding-left: 20upx;\n}\n\n.padding-left {\n  padding-left: 30upx;\n}\n\n.padding-left-lg {\n  padding-left: 40upx;\n}\n\n.padding-left-xl {\n  padding-left: 50upx;\n}\n\n.padding-lr-xs {\n  padding-left: 10upx;\n  padding-right: 10upx;\n}\n\n.padding-lr-sm {\n  padding-left: 20upx;\n  padding-right: 20upx;\n}\n\n.padding-lr {\n  padding-left: 30upx;\n  padding-right: 30upx;\n}\n\n.padding-lr-lg {\n  padding-left: 40upx;\n  padding-right: 40upx;\n}\n\n.padding-lr-xl {\n  padding-left: 50upx;\n  padding-right: 50upx;\n}\n\n.padding-tb-xs {\n  padding-top: 10upx;\n  padding-bottom: 10upx;\n}\n\n.padding-tb-sm {\n  padding-top: 20upx;\n  padding-bottom: 20upx;\n}\n\n.padding-tb {\n  padding-top: 30upx;\n  padding-bottom: 30upx;\n}\n\n.padding-tb-lg {\n  padding-top: 40upx;\n  padding-bottom: 40upx;\n}\n\n.padding-tb-xl {\n  padding-top: 50upx;\n  padding-bottom: 50upx;\n}\n\n/* -- 浮动 --  */\n\n.cf::after,\n.cf::before {\n  content: \" \";\n  display: table;\n}\n\n.cf::after {\n  clear: both;\n}\n\n.fl {\n  float: left;\n}\n\n.fr {\n  float: right;\n}\n\n/* ==================\n          背景\n ==================== */\n\n.line-red::after,\n.lines-red::after {\n  border-color: #e54d42;\n}\n\n.line-orange::after,\n.lines-orange::after {\n  border-color: #f37b1d;\n}\n\n.line-yellow::after,\n.lines-yellow::after {\n  border-color: #fbbd08;\n}\n\n.line-olive::after,\n.lines-olive::after {\n  border-color: #8dc63f;\n}\n\n.line-green::after,\n.lines-green::after {\n  border-color: #39b54a;\n}\n\n.line-cyan::after,\n.lines-cyan::after {\n  border-color: #1cbbb4;\n}\n\n.line-blue::after,\n.lines-blue::after {\n  border-color: #0081ff;\n}\n\n.line-purple::after,\n.lines-purple::after {\n  border-color: #6739b6;\n}\n\n.line-mauve::after,\n.lines-mauve::after {\n  border-color: #9c26b0;\n}\n\n.line-pink::after,\n.lines-pink::after {\n  border-color: #e03997;\n}\n\n.line-brown::after,\n.lines-brown::after {\n  border-color: #a5673f;\n}\n\n.line-grey::after,\n.lines-grey::after {\n  border-color: #8799a3;\n}\n\n.line-gray::after,\n.lines-gray::after {\n  border-color: #aaaaaa;\n}\n\n.line-black::after,\n.lines-black::after {\n  border-color: #333333;\n}\n\n.line-white::after,\n.lines-white::after {\n  border-color: #ffffff;\n}\n\n.bg-red {\n  background-color: #e54d42;\n  color: #ffffff;\n}\n\n.bg-orange {\n  background-color: #f37b1d;\n  color: #ffffff;\n}\n\n.bg-user-orang {\n  background-color:rgba($main-color,0.1);\n  color: black;\n}\n\n.bg-to-color {\n  background-color: #F5F5F5;\n  color: black;\n}\n\n.bg-yellow {\n  background-color: #fbbd08;\n  color: #333333;\n}\n\n.bg-olive {\n  background-color: #8dc63f;\n  color: #ffffff;\n}\n\n.bg-green {\n  background-color: #39b54a;\n  color: #ffffff;\n}\n\n.bg-main-color {\n  background-color: $main-color;\n  color: #ffffff;\n}\n\n.bg-blue {\n  background-color: #0081ff;\n  color: #ffffff;\n}\n\n.bg-purple {\n  background-color: #6739b6;\n  color: #ffffff;\n}\n\n.bg-mauve {\n  background-color: #9c26b0;\n  color: #ffffff;\n}\n\n.bg-pink {\n  background-color: #e03997;\n  color: #ffffff;\n}\n\n.bg-brown {\n  background-color: #a5673f;\n  color: #ffffff;\n}\n\n.bg-grey {\n  background-color: #8799a3;\n  color: #ffffff;\n}\n\n.bg-gray {\n  background-color: #f0f0f0;\n  color: #333333;\n}\n\n.bg-black {\n  background-color: #333333;\n  color: #ffffff;\n}\n\n.bg-white {\n  background-color: #ffffff;\n  color: #666666;\n}\n\n.bg-shadeTop {\n  background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01));\n  color: #ffffff;\n}\n\n.bg-shadeBottom {\n  background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));\n  color: #ffffff;\n}\n\n.bg-red.light {\n  color: #e54d42;\n  background-color: #fadbd9;\n}\n\n.bg-orange.light {\n  color: #f37b1d;\n  background-color: #fde6d2;\n}\n\n.bg-yellow.light {\n  color: #fbbd08;\n  background-color: #fef2ced2;\n}\n\n.bg-olive.light {\n  color: #8dc63f;\n  background-color: #e8f4d9;\n}\n\n.bg-green.light {\n  color: #39b54a;\n  background-color: #d7f0dbff;\n}\n\n.bg-main-color.light {\n  color: #1cbbb4;\n  background-color: #d2f1f0;\n}\n\n.bg-blue.light {\n  color: #0081ff;\n  background-color: #cce6ff;\n}\n\n.bg-purple.light {\n  color: #6739b6;\n  background-color: #e1d7f0;\n}\n\n.bg-mauve.light {\n  color: #9c26b0;\n  background-color: #ebd4ef;\n}\n\n.bg-pink.light {\n  color: #e03997;\n  background-color: #f9d7ea;\n}\n\n.bg-brown.light {\n  color: #a5673f;\n  background-color: #ede1d9;\n}\n\n.bg-grey.light {\n  color: #8799a3;\n  background-color: #e7ebed;\n}\n\n.bg-gradual-red {\n  background-image: linear-gradient(45deg, #f43f3b, #ec008c);\n  color: #ffffff;\n}\n\n.bg-gradual-orange-sm {\n  background-image: linear-gradient(45deg, #ff7903, #ed9e00);\n  color: #ffffff;\n}\n\n.bg-gradual-orange {\n  background-image: linear-gradient(45deg, #ff9700, #ed1c24);\n  color: #ffffff;\n}\n\n.bg-gradual-green {\n  background-image: linear-gradient(45deg, #39b54a, #8dc63f);\n  color: #ffffff;\n}\n\n.bg-gradual-index-row {\n  background-image: linear-gradient(60deg, #23cb8e, #1ea875);\n  color: #ffffff;\n}\n\n.bg-gradual-purple {\n  background-image: linear-gradient(45deg, #9000ff, #5e00ff);\n  color: #ffffff;\n}\n\n.bg-gradual-pink {\n  background-image: linear-gradient(45deg, #ec008c, #6739b6);\n  color: #ffffff;\n}\n\n.bg-gradual-blue {\n  background-image: linear-gradient(45deg, #0081ff, #1cbbb4);\n  color: #ffffff;\n}\n\n.bg-gradual-blue-sm {\n  background-image: linear-gradient(45deg, #1bcaa7, #5ddfa2);\n  color: #ffffff;\n}\n\n.shadow[class*=\"-red\"] {\n  box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);\n}\n\n.shadow[class*=\"-orange\"] {\n  box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);\n}\n\n.shadow[class*=\"-yellow\"] {\n  box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);\n}\n\n.shadow[class*=\"-olive\"] {\n  box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);\n}\n\n.shadow[class*=\"-green\"] {\n  box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);\n}\n\n.shadow[class*=\"-cyan\"] {\n  box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);\n}\n\n.shadow[class*=\"-blue\"] {\n  box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);\n}\n\n.shadow[class*=\"-purple\"] {\n  box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);\n}\n\n.shadow[class*=\"-mauve\"] {\n  box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);\n}\n\n.shadow[class*=\"-pink\"] {\n  box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);\n}\n\n.shadow[class*=\"-brown\"] {\n  box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);\n}\n\n.shadow[class*=\"-grey\"] {\n  box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);\n}\n\n.shadow[class*=\"-gray\"] {\n  box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);\n}\n\n.shadow[class*=\"-black\"] {\n  box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);\n}\n\n.shadow[class*=\"-white\"] {\n  box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);\n}\n\n.text-shadow[class*=\"-red\"] {\n  text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);\n}\n\n.text-shadow[class*=\"-orange\"] {\n  text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);\n}\n\n.text-shadow[class*=\"-yellow\"] {\n  text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);\n}\n\n.text-shadow[class*=\"-olive\"] {\n  text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);\n}\n\n.text-shadow[class*=\"-green\"] {\n  text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);\n}\n\n.text-shadow[class*=\"-cyan\"] {\n  text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);\n}\n\n.text-shadow[class*=\"-blue\"] {\n  text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);\n}\n\n.text-shadow[class*=\"-purple\"] {\n  text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);\n}\n\n.text-shadow[class*=\"-mauve\"] {\n  text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);\n}\n\n.text-shadow[class*=\"-pink\"] {\n  text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);\n}\n\n.text-shadow[class*=\"-brown\"] {\n  text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);\n}\n\n.text-shadow[class*=\"-grey\"] {\n  text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);\n}\n\n.text-shadow[class*=\"-gray\"] {\n  text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);\n}\n\n.text-shadow[class*=\"-black\"] {\n  text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);\n}\n\n.bg-img {\n  background-size: cover;\n  background-position: center;\n  background-repeat: no-repeat;\n}\n\n.bg-mask {\n  background-color: #333333;\n  position: relative;\n}\n\n.bg-mask::after {\n  content: \"\";\n  border-radius: inherit;\n  width: 100%;\n  height: 100%;\n  display: block;\n  background-color: rgba(0, 0, 0, 0.4);\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n}\n\n.bg-mask view,\n.bg-mask cover-view {\n  z-index: 5;\n  position: relative;\n}\n\n.bg-video {\n  position: relative;\n}\n\n.bg-video video {\n  display: block;\n  height: 100%;\n  width: 100%;\n  -o-object-fit: cover;\n  object-fit: cover;\n  position: absolute;\n  top: 0;\n  z-index: 0;\n  pointer-events: none;\n}\n\n/* ==================\n          文本\n ==================== */\n\n.text-xs {\n  font-size: 20upx;\n}\n\n.text-sm {\n  font-size: 24upx;\n}\n\n.text-df {\n  font-size: 28upx;\n}\n\n.text-lg {\n  font-size: 32upx;\n}\n\n.text-xl {\n  font-size: 36upx;\n}\n\n.text-xxl {\n  font-size: 44upx;\n}\n\n.text-sl {\n  font-size: 80upx;\n}\n\n.text-xsl {\n  font-size: 120upx;\n}\n\n.text-Abc {\n  text-transform: Capitalize;\n}\n\n.text-ABC {\n  text-transform: Uppercase;\n}\n\n.text-abc {\n  text-transform: Lowercase;\n}\n\n.text-price::before {\n  content: \"¥\";\n  font-size: 80%;\n  margin-right: 4upx;\n}\n\n.text-cut {\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n.text-bold {\n  font-weight: bold;\n}\n\n.text-center {\n  text-align: center;\n}\n\n.text-content {\n  line-height: 1.6;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-red,\n.line-red,\n.lines-red {\n  color: #e54d42;\n}\n\n.text-orange,\n.line-orange,\n.lines-orange {\n  color: #f37b1d;\n}\n\n.text-yellow,\n.line-yellow,\n.lines-yellow {\n  color: #fbbd08;\n}\n\n.text-olive,\n.line-olive,\n.lines-olive {\n  color: #8dc63f;\n}\n\n.text-green,\n.line-green,\n.lines-green {\n  color: #39b54a;\n}\n\n.text-cyan,\n.line-cyan,\n.lines-cyan {\n  color: #1cbbb4;\n}\n\n.text-blue,\n.line-blue,\n.lines-blue {\n  color: #0081ff;\n}\n\n.text-hui {\n  color: #787878;\n}\n\n.text-purple,\n.line-purple,\n.lines-purple {\n  color: #6739b6;\n}\n\n.text-mauve,\n.line-mauve,\n.lines-mauve {\n  color: #9c26b0;\n}\n\n.text-pink,\n.line-pink,\n.lines-pink {\n  color: #e03997;\n}\n\n.text-brown,\n.line-brown,\n.lines-brown {\n  color: #a5673f;\n}\n\n.text-grey,\n.line-grey,\n.lines-grey {\n  color: #8799a3;\n}\n\n.text-gray,\n.line-gray,\n.lines-gray {\n  color: #aaaaaa;\n}\n\n.text-black,\n.line-black,\n.lines-black {\n  color: #333333;\n}\n\n.text-white,\n.line-white,\n.lines-white {\n  color: #ffffff;\n}\n\n\n//animation\n/* \n  Animation 微动画  \n  基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28\n */\n\n/* css 滤镜 控制黑白底色gif的 */\n.gif-black {\n  mix-blend-mode: screen;\n}\n\n.gif-white {\n  mix-blend-mode: multiply;\n}\n\n\n/* Animation css */\n[class*=animation-] {\n  animation-duration: .5s;\n  animation-timing-function: ease-out;\n  animation-fill-mode: both\n}\n\n.animation-fade {\n  animation-name: fade;\n  animation-duration: .8s;\n  animation-timing-function: linear\n}\n\n.animation-scale-up {\n  animation-name: scale-up\n}\n\n.animation-scale-down {\n  animation-name: scale-down\n}\n\n.animation-slide-top {\n  animation-name: slide-top\n}\n\n.animation-slide-bottom {\n  animation-name: slide-bottom\n}\n\n.animation-slide-left {\n  animation-name: slide-left\n}\n\n.animation-slide-right {\n  animation-name: slide-right\n}\n\n.animation-shake {\n  animation-name: shake\n}\n\n.animation-reverse {\n  animation-direction: reverse\n}\n\n@keyframes fade {\n  0% {\n    opacity: 0\n  }\n\n  100% {\n    opacity: 1\n  }\n}\n\n@keyframes scale-up {\n  0% {\n    opacity: 0;\n    transform: scale(.2)\n  }\n\n  100% {\n    opacity: 1;\n    transform: scale(1)\n  }\n}\n\n@keyframes scale-down {\n  0% {\n    opacity: 0;\n    transform: scale(1.8)\n  }\n\n  100% {\n    opacity: 1;\n    transform: scale(1)\n  }\n}\n\n@keyframes slide-top {\n  0% {\n    opacity: 0;\n    transform: translateY(-100%)\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0)\n  }\n}\n\n@keyframes slide-bottom {\n  0% {\n    opacity: 0;\n    transform: translateY(100%)\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0)\n  }\n}\n\n@keyframes shake {\n\n  0%,\n  100% {\n    transform: translateX(0)\n  }\n\n  10% {\n    transform: translateX(-9px)\n  }\n\n  20% {\n    transform: translateX(8px)\n  }\n\n  30% {\n    transform: translateX(-7px)\n  }\n\n  40% {\n    transform: translateX(6px)\n  }\n\n  50% {\n    transform: translateX(-5px)\n  }\n\n  60% {\n    transform: translateX(4px)\n  }\n\n  70% {\n    transform: translateX(-3px)\n  }\n\n  80% {\n    transform: translateX(2px)\n  }\n\n  90% {\n    transform: translateX(-1px)\n  }\n}\n\n@keyframes slide-left {\n  0% {\n    opacity: 0;\n    transform: translateX(-100%)\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateX(0)\n  }\n}\n\n@keyframes slide-right {\n  0% {\n    opacity: 0;\n    transform: translateX(100%)\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateX(0)\n  }\n}"
  },
  {
    "path": "pages/mine/im/index.vue",
    "content": "<template>\n  <view class=\"wrapper\">\n    <u-navbar class=\"my-title\" title-size=\"32\" :title=\"toUser.name\"></u-navbar>\n    <!-- 空盒子用来防止消息过少时 拉起键盘会遮盖消息 -->\n    <view :animation=\"anData\" style=\"height:0;\">\n    </view>\n    <!-- 消息体 -->\n    <!-- 用来获取消息体高度 -->\n    <view id=\"msgList\">\n      <!-- 消息 -->\n      <view class=\"flex-column-start\" v-if=\"msgList.length\" v-for=\"(item, index) in msgList\" :key=\"index\">\n        <view class=\"flex-row-start column-time\">\n          <!--  <view v-show=\"compareTime(index, item.createTime)\" class=\"flex-row-start date-text\"\n            v-text=\"beautifyTime(item.createTime)\">\n          </view> -->\n        </view>\n        <!-- 用户消息 头像可选加入-->\n        <view v-if=\"item.my\" class=\"flex justify-end padding-right one-show  align-start  padding-top\">\n          <view class=\"flex justify-end\" style=\"width: 400rpx;margin-top: 12px;\">\n            <view>\n              <view class=\"user-name\">{{ user.nickName }}</view>\n              <view class=\"margin-left padding-chat bg-user-orang\" style=\"border-radius: 35rpx; \">\n                <text style=\"word-break: break-all;\"\n                  v-if=\"item.messageType === 'MESSAGE' && !emojistwo.includes(item.text)\">{{ item.text }}</text>\n                <view v-if=\"item.messageType === 'MESSAGE' && emojistwo.includes(item.text)\"\n                  v-html=\"textReplaceEmoji(item.text)\"></view>\n                <view v-if=\"item.messageType == 'GOODS'\">\n                  <view class=\"goods-card u-flex u-row-between u-p-b-0\" style=\"width:100%;margin: 0 0; \">\n                    <view class=\"image-box\" @click=\"jumpGoodDesc(item)\">\n                      <image class=\"image\" :src=\"JSON.parse(item.text)['thumbnail']\" mode=\"widthFix\"></image>\n                    </view>\n                    <view class=\"goods-desc\" @click=\"jumpGoodDesc(item)\">\n                      <view class=\"goods-desc-name\">\n                        <text class=\"goods-card-goods-name\">{{\n                          JSON.parse(item.text)['goodsName']\n                        }}</text>\n                      </view>\n                      <view class=\"goods-desc-rice\" >￥{{\n                            JSON.parse(item.text)['price'] | unitPrice\n                          }}\n                      </view>\n                    </view>\n                  </view>\n                </view>\n          \n                <view v-if=\"item.messageType == 'ORDER'\" @click=\"linkTosOrders(item.text)\">\n                  <view class=\"order-sn\">\n                    <div class=\"wes\">订单号：{{ JSON.parse(item.text)['sn'] }}</div>\n                    <div class='order-item flex' v-if=\"JSON.parse(item.text).orderItems.length\"  v-for='(order,orderIndex) in JSON.parse(item.text).orderItems'>\n                      <u-image  mode=\"widthFix\" width='120rpx' height='120rpx' :src=\"order.image\" />\n                       <view class=\"name-or-time\">\n                        <div class=\"wes-2\" >{{\n                        order.name\n                        }}</div>\n                        <div class=\"main-color goods-desc-rice\">{{\n                          order.goodsPrice | unitPrice(\"￥\")\n                        }}</div>\n                        \n                      </view>\n                    </div>\n                    <view class=\"order-list\">\n                      <view class=\"order-time\">\n                          <text>{{ JSON.parse(item.text)['paymentTime'] }}</text>\n                        </view>\n                    </view>\n                  </view>\n                </view>\n              </view>\n            </view>\n          </view>\n          <view>\n            <u-avatar :src=\"user.face\" :text=\"user.face ? '' : user.name\" bg-color=\"#DDDDDD\"></u-avatar>\n          </view>\n        </view>\n        <!-- 接收人消息 -->\n        <view v-else class=\"flex-row-start margin-left margin-top one-show\">\n          <view class=\"chat-img flex-row-center\">\n            <u-avatar :src=\"toUser.face\" :text=\"toUser.face ? '' : toUser.name\" bg-color=\"#DDDDDD\">\n            </u-avatar>\n          </view>\n          <view class=\"flex\" style=\"width: 500rpx;\">\n            <view>\n              <view class=\"other-name\">{{ toUser.name }}</view>\n              <view class=\"margin-left padding-chat flex-column-start bg-to-color\" style=\"border-radius: 35rpx;\">\n                <text style=\"word-break: break-all;\"\n                  v-if=\"item.messageType === 'MESSAGE' && !emojistwo.includes(item.text)\">{{ item.text }}</text>\n                <view v-if=\"item.messageType === 'MESSAGE' && emojistwo.includes(item.text)\"\n                  v-html=\"textReplaceEmoji(item.text)\"></view>\n                <view v-if=\"item.messageType === 'GOODS'\">\n                  <view class=\"goods-card u-flex u-row-between u-p-b-0\" style=\"width:100%;margin: 0 0; \">\n                    <view class=\"image-box\" @click=\"jumpGoodDesc(item)\">\n                      <image class=\"image\" :src=\"JSON.parse(item.text)['thumbnail']\" mode=\"widthFix\"></image>\n                    </view>\n                    <view class=\"goods-desc\" @click=\"jumpGoodDesc(item)\">\n                      <view class=\"goods-desc-name\">\n                        <text class=\"goods-card-goods-name\">{{\n                          JSON.parse(item.text)['goodsName']\n                        }}</text>\n                      </view>\n                        <view class=\"goods-desc-rice\" >¥{{\n                            JSON.parse(item.text)['price']\n                          }}\n                      </view>\n                    </view>\n                  </view>\n                </view>\n                <view v-if=\"item.messageType === 'ORDER'\">\n                  <view class=\"order-sn\">\n                    <text>订单号：{{ JSON.parse(item.text)['sn'] }}</text>\n                    <view class=\"order-list\">\n                      <img style=\"height: 120rpx; width: 120rpx; margin-top: 15rpx;\"\n                        :src=\"JSON.parse(item.text)['groupImages']\" mode=\"widthFix\" />\n                      <view class=\"name-or-time\">\n                        <text @click=\"linkTosOrders(item.text)\">{{\n                          JSON.parse(item.text)['groupName']\n                        }}</text>\n                        <view class=\"order-time\">\n                          <text>{{ JSON.parse(item.text)['paymentTime'] }}</text>\n                        </view>\n                      </view>\n                    </view>\n                  </view>\n                </view>\n              </view>\n            </view>\n\n          </view>\n        </view>\n      </view>\n      <!-- 防止消息底部被遮 -->\n      <view v-if=\"showHide && !localImGoodsId && showHideModel\" class=\"flex-row-start margin-left margin-top\"\n        style=\"height: 120rpx;\">\n      </view>\n      <!-- 如果没有聊天记录，定位到底部 -->\n      <view\n        :style=\"{ position:'fixed' , bottom:(inputHeight+66)+'px' , width:  '100%' }\">\n        <view class=\"cart-message\" v-if=\"showHide && !localImGoodsId && showHideModel\">\n          <view class=\"goods-card u-flex u-row-between u-p-b-0\">\n            <view class=\"image-box\" @click=\"jumpGoodDesc(item)\">\n              <image class=\"image\" :src=\"goodListData.thumbnail\" mode=\"widthFix\"></image>\n            </view>\n            <view class=\"goods-desc\" @click=\"jumpGoodDesc(item)\">\n              <view class=\"goods-desc-name\">\n                <text class=\"goods-card-goods-name\">{{\n                  goodListData.goodsName\n                }}</text>\n              </view>\n              <view class=\"goods-desc-rice\" > ￥{{\n                goodListData.price | unitPrice\n              }}\n              </view>\n            </view>\n            <view class=\"cancel\" @click=\"cancelModel\">X</view>\n            <view class=\"send-goods\" @click=\"sendGoodsMessage\">\n              <view>发送商品</view>\n            </view>\n          </view>\n        </view>\n      </view>\n\n      <!-- 防止消息底部被遮 -->\n      <view  style=\"height: 120rpx;\">\n      </view>\n    </view>\n    <!-- 底部导航栏 -->\n    <view :style=\"{position: 'fixed', bottom:inputHeight+'px'}\" class=\"flex-column-center bottom-dh\"  :animation=\"animationData\">\n      <view class=\"bottom-dh-char flex-row-around\" style=\"font-size: 55rpx;\">\n        <!-- vue无法使用软键盘\"发送\" -->\n\n        <!-- #ifndef MP-WEIXIN -->\n         <div v-if=\"!isShow\" @click=\"navigateToBottom\"  class=\"dh-input\">\n          用一句简短的话描述您的问题\n         </div>\n         <input v-show=\"isShow\" ref=\"inputRef\" :focus=\"isShow\"  @focus=\"inputBindFocus\" @blur=\"eventHandle\" :adjust-position=\"false\" v-model=\"msg\" class=\"dh-input\" type=\"text\" style=\"background-color: #f0f0f0;\" @confirm=\"sendMessage\"\n         confirm-type=\"send\"  placeholder=\"用一句简短的话描述您的问题\" />\n         <!-- #endif  -->\n\n         <!-- #ifdef MP-WEIXIN -->\n         <input  ref=\"inputRef\"   @focus=\"inputBindFocus\" @blur=\"eventHandle\" :adjust-position=\"false\" v-model=\"msg\" class=\"dh-input\" type=\"text\" style=\"background-color: #f0f0f0;\" @confirm=\"sendMessage\"\n         confirm-type=\"send\"  placeholder=\"用一句简短的话描述您的问题\" />\n         <!-- #endif -->\n\n        <view @click=\"sendMessage\" class=\"cu-tag bg-main-color send round\">\n          发送 \n        </view>\n       \n        <!-- <text @click=\"ckAdd\" class=\"cuIcon-roundaddfill text-brown\"></text> -->\n      </view>\n    </view>\n    <div id=\"bottom\"></div>\n  </view>\n</template>\n\n<script>\n// rpx和px的比率\nvar l\n// 可用窗口高度\nvar wh\n// 顶部空盒子的高度\nvar mgUpHeight\nimport {\n  getTalkMessage,\n  getTalkByUser,\n  jumpObtain\n} from \"@/api/im.js\";\nimport SocketService from \"@/utils/socket_service.js\";\nimport storage from \"@/utils/storage.js\";\nimport {\n  beautifyTime\n} from \"@/utils/filters.js\"\nimport config from '@/config/config.js'\nimport { textReplaceEmoji, emojistwo } from '@/utils/emojis.js';\nexport default {\n  // 页面卸载后清除imGoodId\n  onUnload () {\n    // #ifdef H5\n    uni.setStorageSync(\"imGoodId\", '');\n    // #endif\n\n    if (this.socketOpen == true) {\n      uni.closeSocket();\n    }\n  },\n  onLoad (options) {\n    // 没有goodsid则不显示 发送商品弹窗\n    this.showHideModel = options.goodsid\n    // 发送后刷新页面不显示 发送商品弹窗 local里面imGoodId不为空显示\n    // #ifdef H5\n    this.localImGoodsId = uni.getStorageSync(\"imGoodId\");\n    // #endif\n    this.resolve = options\n    // 请求商品信息\n    if (this.resolve.goodsid) {\n      this.commodityDetails()\n    }\n \n    var query = uni.getSystemInfoSync()\n\n    l = query.screenWidth / 750\n    wh = query.windowHeight\n    this.scrollHeight = (query.windowHeight - 44) + \"px\"\n    this.user = storage.getUserInfo()\n    this.toUser = storage.getTalkToUser()\n\n    if (options.talkId) {\n      this.params.talkId = options.talkId;\n      this.getTalkMessage()\n    } else {\n      this.getTalk(options.userId)\n\n    }\n\n    // this.ws.connect();\n    this.socket();\n  },\n\n\n\n\n  // 页面隐藏\n  onHide () {\n    uni.closeSocket();\n  },\n  onUnload () {\n    uni.closeSocket();\n  },\n  onPullDownRefresh () {\n    this.params.pageNumber = this.params.pageNumber + 1\n    this.getTalkMessage()\n    setTimeout(function () {\n      uni.stopPullDownRefresh();\n    }, 1000);\n  },\n\n  data () {\n    return {\n      textReplaceEmoji,\n      emojistwo,\n      socketOpen: false, //是否连接\n      storage,\n      fixed: 'fixed',\n      bottom: '50px',\n      width: '100%',\n      showHideModel: undefined,\n      localImGoodsId: '',\n      showHide: true,\n      msgLoad: false,\n      anData: {},\n      animationData: {},\n      msgList: [],\n      oldHeight: 0,\n      params: { //搜索条件\n        talkId: '',\n        pageSize: 10,\n        pageNumber: 1,\n      },\n      goToIndex: 0, // 前往位置\n      msg: \"\",\n      go: 0,\n      newMessageNum: 0,\n      user: {},\n      toUser: {},\n      scrollHeight: 0,\n      ws: new SocketService(),\n      resolve: {},\n      goodListData: {},\n      count: 0, //判断socket断开连接请求次数\n      inputHeight:0,\n      isShow:false,\n    \n   \n    }\n  },\n  onPageScroll (e) {\n \n    // #ifdef APP-PLUS\n    uni.hideKeyboard()\n    this.isShow = false\n    // #endif\n  },\n  methods: {\n    navigateToBottom(){\n      // #ifdef H5\n      this.isShow = true\n      this.$refs.inputRef.focus()\n      // #endif\n\n      // #ifdef APP-PLUS\n      this.$nextTick(() => {\n        uni.pageScrollTo({\n          scrollTop: 5000000,\n          duration: 50,\n          success: () => {\n           setTimeout(() => { \n            this.isShow = true\n           }, 200);\n          ;\n          },\n          fail: () => { },\n          complete: () => {}\n        });\n      });\n      // #endif\n      \n    },\n\n    eventHandle(){\n     \n      this.inputHeight = 0\n      this.isShow = false\n    },\n    inputBindFocus(e){\n       if (e.detail.height) {\n     \n       \n          // #ifdef APP-PLUS\n          // 判断是否是ios\n          if (uni.getSystemInfoSync().platform == 'ios') {\n            this.inputHeight = e.detail.height - 40 //这个高度就是软键盘的高度\n          }else{\n            this.inputHeight = e.detail.height\n          }\n         //  #endif\n        \n          // #ifndef APP-PLUS\n          this.inputHeight = e.detail.height //这个高度就是软键盘的高度\n          //  #endif\n       }\n    },\n    sendMessage () {\n      if (this.msg == \"\") {\n        return 0;\n      }\n      if (this.socketOpen == false) {\n        return\n      }\n      let msg = {\n        operation_type: \"MESSAGE\",\n        to: this.toUser.userId,\n        from: this.user.id,\n        message_type: \"MESSAGE\",\n        context: this.msg,\n        talk_id: this.params.talkId,\n      }\n      let data = JSON.stringify(msg);\n      uni.sendSocketMessage({\n        data: data,\n      });\n      this.msgList.push({\n        \"text\": this.msg,\n        \"my\": true,\n        \"messageType\": 'MESSAGE'\n      })\n      let type = 'down';\n      this.msgGo(type)\n      this.msg = \"\"\n    },\n    sendGoodsMessage () {\n      let msg = {\n        operation_type: \"MESSAGE\",\n        to: this.toUser.userId,\n        from: this.user.id,\n        message_type: \"GOODS\",\n        context: this.goodListData,\n        talk_id: this.params.talkId,\n      }\n      let data = JSON.stringify(msg);\n      uni.sendSocketMessage({\n        data: data\n      });\n      this.msgList.push({\n        \"text\": JSON.stringify(this.goodListData),\n        \"my\": true,\n        \"messageType\": 'GOODS'\n      })\n      this.showHide = false\n      // #ifdef H5\n      uni.setStorageSync(\"imGoodId\", 1111111);\n      // #endif\n      this.$nextTick(() => {\n        uni.pageScrollTo({\n          scrollTop: 2000000,\n          duration: 300\n        });\n      })\n    },\n    socket () {\n      var _this = this;\n      uni.closeSocket();\n      this.socketOpen = false;\n      try {\n        //WebSocket的地址\n        var url = config.baseWsUrl + '/' + storage.getAccessToken();\n        // 连接\n        uni.connectSocket({\n          url: url,\n        });\n        // 监听WebSocket连接已打开\n        uni.onSocketOpen(function (res) {\n          _this.socketOpen = true;\n        });\n        if (!this.socketOpen) {\n          // 监听连接失败\n\n          uni.onSocketError(function (err) {\n            if (this.count < 3) {\n              if (err && err.code != 1000) {\n                _this.socketOpen = true;\n                setTimeout(() => {\n                  uni.connectSocket({\n                    url: url,\n                  });\n                }, 2000)\n              }\n            } else {\n              uni.closeSocket();\n            }\n            this.count++\n          });\n        }\n        // 监听收到信息\n        uni.onSocketMessage(function (res) {\n          res.data = JSON.parse(res.data)\n          console.log(res.data.result);\n          if (res.data.messageResultType == 'MESSAGE') {\n            _this.msgList.push(res.data.result)\n            console.log(_this.msgList)\n          }\n          console.log(res.data)\n          _this.msgGo()\n        })\n      } catch (e) {\n        uni.closeSocket();\n      }\n      // 监听是否断线，断线进行重新连接\n      uni.onSocketClose((res) => {\n        if (res.code != null && res.code != 1000) {\n          this.socket()\n        }\n      })\n    },\n    beautifyTime,\n    //订单详情\n    linkTosOrders (val) {\n      let order = JSON.parse(val)\n      uni.navigateTo({\n        url: '/pages/order/orderDetail?sn=' + order.sn,\n      });\n\n    },\n    // 跳转商品详情页\n    jumpGoodDesc (item) {\n      let info = JSON.parse(item.text)\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${info.id}&goodsId=${info.goodsId}`,\n      });\n    },\n\n    //取消发送\n    cancelModel () {\n      this.showHide = false\n    },\n    // 请求商品详情\n    commodityDetails () {\n      jumpObtain(this.resolve.skuid, this.resolve.goodsid).then((res) => {\n        this.goodListData = res.data.result.data\n      })\n    },\n    // 切换输入法时移动输入框(按照官方的上推页面的原理应该会自动适应不同的键盘高度-->官方bug)\n    goPag (kh) {\n      this.retractBox(0, 250)\n      if (this.keyHeight != 0) {\n        if (kh - this.keyHeight > 0) {\n          this.retractBox(this.keyHeight - kh, 250)\n        }\n      }\n    },\n    // 移动顶部的空盒子\n    messageBoxMove (x, t) {\n      var animation = uni.createAnimation({\n        duration: t,\n        timingFunction: 'linear',\n      })\n      this.animation = animation\n      animation.height(x).step()\n      this.anData = animation.export()\n    },\n    // 保持消息体可见\n    msgGo (type) {\n      const query = uni.createSelectorQuery()\n      // 延时100ms保证是最新的高度\n      setTimeout(() => {\n        // 获取消息体高度\n        query.select('#msgList').boundingClientRect(data => {\n          // 如果超过scorll高度就滚动scorll\n          if (type == 'up') {\n            this.go = data.height - this.oldHeight\n          } else if (type == 'down') {\n            this.go = data.height - wh + 120\n          }\n          // if (this.oldHeight > 0) {\n          // \tthis.go = data.height - this.oldHeight\n          // } else {\n          // \t// if (data.height - (wh - 32) > 0) {\n          // \tthis.go = data.height - wh + 120\n          // }\n          // 保证键盘第一次拉起时消息体能保持可见\n          var moveY = wh - data.height\n          // 超出页面则缩回空盒子\n          if (moveY - mgUpHeight < 0) {\n            // 小于0则视为0\n            if (moveY < 0) {\n              this.messageBoxMove(0, 200)\n            } else {\n              // 否则缩回盒子对应的高度\n              this.messageBoxMove(moveY, 200)\n            }\n          }\n          uni.pageScrollTo({\n            scrollTop: this.go,\n            duration: 0\n          })\n          this.oldHeight = data.height\n        }).exec();\n      }, 100)\n    },\n    // 回答问题的业务逻辑\n    answer (id) {\n      // 这里应该传入问题的id,模拟就用index代替了\n\n    },\n    // 不建议输入框聚焦时操作此动画\n    ckAdd () {\n      if (!this.showTow) {\n        this.retractBox(-180, 350)\n      } else {\n        this.retractBox(0, 200)\n      }\n      this.showTow = !this.showTow\n    },\n    hideKey () {\n      uni.hideKeyboard()\n    },\n    // 拉起/收回附加栏\n    retractBox (x, t) {\n      var animation = uni.createAnimation({\n        duration: t,\n        timingFunction: 'ease',\n      })\n      this.animation = animation\n      animation.translateY(x).step()\n      this.animationData = animation.export()\n    },\n    async getTalkMessage () {\n      let type = '';\n      await getTalkMessage(this.params).then(res => {\n        if (res.data.success) {\n          if (this.msgList.length >= 10) {\n            this.msgList.unshift(...res.data.result)\n            type = 'up'\n          } else {\n            this.msgList.unshift(...res.data.result)\n            type = 'down'\n          }\n          this.msgList.forEach(item => {\n            if (item.fromUser === this.user.id) {\n              item.my = true\n            }\n          })\n        }\n      })\n      console.log(this.msgList);\n      this.msgGo(type)\n    },\n    // 上拉加载\n    touchMoreMessage (e) {\n      if (e.target.scrollTop == 0) {\n        this.params.pageNumber = this.params.pageNumber + 1\n        this.getTalkMessage()\n      }\n    },\n    async getTalk (userId) {\n      getTalkByUser(userId).then(res => {\n        if (res.data.success) {\n          this.toUser = res.data.result\n          this.params.talkId = res.data.result.id\n          this.getTalkMessage()\n        }\n      })\n    },\n    // 处理消息时间是否显示\n    compareTime (index, datetime) {\n      if (datetime == undefined) {\n        return false;\n      }\n      if (typeof datetime == \"number\") {\n        datetime = this.unixToDate(datetime, \"yyyy-MM-dd hh:mm\");\n      }\n\n      if (this.msgList[index].is_revoke == 1) {\n        return false;\n      }\n      if (datetime) {\n        datetime = datetime.replace(/-/g, \"/\");\n      }\n\n      let time = Math.floor(Date.parse(datetime) / 1000);\n      let currTime = Math.floor(new Date().getTime() / 1000);\n\n      // 当前时间5分钟内时间不显示\n      if (currTime - time < 300) return false;\n      // 判断是否是最后一条消息,最后一条消息默认显示时间\n      if (index == this.msgList.length - 1) {\n        return true;\n      }\n      let nextDate\n      if (this.msgList[index + 1] && this.msgList[index + 1].createTime) {\n        nextDate = this.msgList[index + 1].createTime.replace(/-/g, \"/\");\n        if (nextDate - datetime < 300) return false;\n      }\n\n      return !(\n        this.unixToDate(new Date(datetime), \"{y}-{m}-{d} {h}:{i}\") ==\n        this.unixToDate(new Date(nextDate), \"{y}-{m}-{d} {h}:{i}\")\n      );\n    },\n\n    /**\n     * 将unix时间戳转换为指定格式\n     * @param unix   时间戳【秒】\n     * @param format 转换格式\n     * @returns {*|string}\n     */\n    unixToDate (unix, format) {\n      if (!unix) return unix;\n      let _format = format || \"yyyy-MM-dd hh:mm:ss\";\n      const d = new Date(unix);\n      const o = {\n        \"M+\": d.getMonth() + 1,\n        \"d+\": d.getDate(),\n        \"h+\": d.getHours(),\n        \"m+\": d.getMinutes(),\n        \"s+\": d.getSeconds(),\n        \"q+\": Math.floor((d.getMonth() + 3) / 3),\n        S: d.getMilliseconds(),\n      };\n      if (/(y+)/.test(_format))\n        _format = _format.replace(\n          RegExp.$1,\n          (d.getFullYear() + \"\").substr(4 - RegExp.$1.length)\n        );\n      for (const k in o)\n        if (new RegExp(\"(\" + k + \")\").test(_format))\n          _format = _format.replace(\n            RegExp.$1,\n            RegExp.$1.length === 1 ?\n              o[k] :\n              (\"00\" + o[k]).substr((\"\" + o[k]).length)\n          );\n      return _format;\n    },\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.send{\n  font-size: 24rpx !important;\n}\n.order-time {\n  margin-top: 15rpx;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.wrapper {\n  height: auto !important;\n}\n\n.order-list {\n  display: flex;\n  color: black;\n  font-size: 20rpx;\n  font-weight: bold;\n  width: 95%;\n}\n\n.order-sn {\n  width: 350rpx;\n\n}\n\n.name-or-time {\n  width: 200rpx;\n  margin: 15rpx 15rpx;\n\n}\n\n\n.goods-card {\n  border-radius: 20rpx;\n  margin-top: 15rpx;\n  background-color: #ffffff;\n  padding-left: 12rpx;\n  width: 95%;\n  height: 120rpx;\n  display: flex;\n  flex-wrap: wrap;\n  color: #302c2b;\n\n\n\n  .image-box {\n    width: 122rpx;\n    height: 122rpx;\n    overflow: hidden;\n\n    .image {\n      width: 122rpx;\n      border-radius: 10rpx;\n    }\n  }\n\n  .goods-desc {\n    flex: 1;\n    overflow: hidden;\n    margin-left: 12rpx;\n    width: 400rpx;\n\n    .goods-desc-name {\n      font-size: 30rpx;\n      line-height: 1.5;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      margin-bottom: 20rpx;\n\n\n      .goods-card-goods-name {\n        color: black;\n        text-overflow: ellipsis;\n        font-size: 26rpx;\n        font-weight: bold;\n      }\n    }\n\n    .price {\n      margin-top: 50rpx;\n      line-height: 2;\n      margin-left: 5px;\n      font-size: 26rpx;\n      font-weight: 700;\n    }\n  }\n\n  .send-goods {\n    color: #ffffff;\n    height: 50rpx;\n    width: 130rpx;\n    background-color: #f21c0c;\n    font-size: 24rpx;\n    border-radius: 17rpx;\n    text-align: center;\n    line-height: 50rpx;\n    padding: 0 10rpx;\n    position: relative;\n    top: 20rpx;\n    right: 20rpx;\n  }\n}\n\n.cancel {\n  color: #737373;\n  position: relative;\n  bottom: 40rpx;\n  left: 12%;\n}\n\n.cart-message {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.bottom-dh-char {\n  background-color: #f9f9f9;\n  width: 750rpx;\n  height: 110rpx;\n}\n\n.user-name {\n  text-align: right;\n  font-size: 24rpx;\n  color: #737373;\n  margin-bottom: 10rpx;\n  margin-right: 10rpx;\n}\n\n.other-name {\n  text-align: left;\n  font-size: 24rpx;\n  color: #737373;\n  margin-bottom: 10rpx;\n  margin-left: 10rpx;\n}\n.dh-input {\n  line-height: 65rpx;\n  width: 500rpx;\n  height: 65rpx;\n  border-radius: 30rpx;\n  padding-left: 15rpx;\n  font-size: 22rpx;\n  background-color: #FFFFFF;\n}\n.column-time {\n  justify-content: center;\n}\n\n\n\n.chat-img {\n  border-radius: 50%;\n  width: 100rpx;\n  height: 100rpx;\n  background-color: #f7f7f7;\n}\n\n.padding-chat {\n  padding: 17rpx 20rpx;\n}\n\n.tb-nv {\n  width: 50rpx;\n  height: 50rpx;\n}\n.goods-desc-rice{\n  font-size: 24rpx;\n  color: $main-color;\n  font-weight: bold;\n  margin-top: 10rpx;\n}\n.order-item{\n  margin: 10rpx 0\n}\n\n\nuni-page-head {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 9999;\n}\n.bottom-dh{\n  position: fixed;   // input 所在盒子设置绝对定位\n  flex-shrink: 0;\n  width: 100%;\n  left: 0;\n  bottom: 0;  // 默认 0\n  z-index: 199;\n  padding-bottom: env(safe-area-inset-bottom);\n  background: #FFFFFF;\n  box-sizing: border-box;\n\n}\n\n</style>\n\n<style lang=\"scss\" scoped>\n@import \"./index-app.scss\";\n</style>\n"
  },
  {
    "path": "pages/mine/im/list.vue",
    "content": "<template>\n  <view class=\"content\">\n    <u-navbar class=\"my-title\" title-size=\"32\" :title=\"'消息(' + talkList.length + ')'\"></u-navbar>\n    <scroll-view class=\"list-scroll-content\" scroll-y @scrolltolower=\"loadData(tabIndex)\">\n      \n      <!-- 消息列表 -->\n      <div class=\"iconBox\">\n        <view class=\"icon-list\">\n          <view class=\"icon-item\" @click=\"cleanUnread()\">\n            <div class=\"bag bag1\">\n              <u-icon name=\"trash\" size=\"50\" color=\"#fff\"></u-icon>\n            </div>\n            <view>清除未读</view>\n          </view>\n          <view class=\"icon-item\" @click=\"navigateTo('/pages/tabbar/home/title')\">\n            <div class=\"bag bag2\">\n              <u-icon name=\"bell\" size=\"50\" color=\"#fff\"></u-icon>\n            </div>\n            <view>系统消息</view>\n          </view>\n        </view>\n      </div>\n      <u-search class=\"nav-search\" v-model=\"userName\" clearabled @change=\"userTalkList()\" placeholder=\"搜索用户\"\n        :show-action=\"false\"></u-search>\n      <view class=\"talk-view\" :key=\"index\" v-for=\"(item, index) in talkList\">\n        <view>\n          <view @click=\"onclickToTalkInfo(item)\">\n            <view class=\"talk-item-view\">\n              <view class=\"talk-img\">\n                <u-avatar :src=\"item.face\" :text=\"item.face ? '' : item.name\" bg-color=\"#DDDDDD\"></u-avatar>\n              </view>\n              <view class=\"talk-info\">\n                <view class=\"talk-name u-line-2\">{{ item.name }}\n                  <u-tag class=\"talk-tag\" size=\"mini\" text=\"店铺\" type=\"warning\" v-if=\"item.storeFlag\" />\n                </view>\n                <view class=\"talk-message\">\n                  <span v-if=\"item.lastMessageType == 'MESSAGE'\">{{ item.lastTalkMessage }}</span>\n                  <span v-if=\"item.lastMessageType == 'GOODS'\">[商品链接]</span>\n                  <span v-if=\"item.lastMessageType == 'ORDER'\">[订单信息]</span>\n                </view>\n              </view>\n              <view class=\"talk-time\">\n                <view>\n                  {{ beautifyTime(item.lastTalkTime) }}\n                </view>\n                <view>\n                  <u-badge type=\"error\" absolute :offset=\"[45, 20]\" :count=\"item.unread\"></u-badge>\n                </view>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n      <!-- 空白页 -->\n      <u-empty text=\"暂无信息\" mode=\"list\" v-if=\"talkList.length === 0\"></u-empty>\n    </scroll-view>\n  </view>\n</template>\n\n<script>\nimport { getTalkList, clearmeaager } from \"@/api/im.js\";\nimport storage from \"@/utils/storage.js\";\nimport { beautifyTime } from \"@/utils/filters.js\"\nexport default {\n  data () {\n    return {\n      storage,\n      count: {\n        loadStatus: \"more\",\n      },\n      talkList: [], //聊天列表\n      userName: '',\n      pointData: {}, //累计获取 未输入 集合\n    };\n  },\n\n  onShow () {\n    this.userTalkList();\n  },\n  onPullDownRefresh () {\n    this.userTalkList()\n    console.log('下拉事件');\n    setTimeout(function () {\n      uni.stopPullDownRefresh();\n    }, 1000);\n  },\n  /**\n   * 触底加载\n   */\n  onReachBottom () {\n    this.userTalkList();\n  },\n  methods: {\n    beautifyTime,\n    onclickToTalkInfo (val) {\n      storage.setTalkToUser(val)\n      uni.navigateTo({\n        url:\n          \"/pages/mine/im/index?talkId=\" + val.id,\n      });\n    },\n    /**\n     * 获取聊天列表\n     */\n    userTalkList () {\n      let params = {\n        userName: this.userName,\n      }\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      getTalkList(params).then((res) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        if (res.data.success) {\n          this.talkList = res.data.result;\n          console.log(this.talkList, 'this.talkListthis.talkList');\n        }\n      });\n    },\n    navigateTo (url) {\n      uni.navigateTo({\n        url,\n      });\n    },\n    cleanUnread () {\n      clearmeaager().then((res) => {\n        console.log(res);\n        if (res.data.code == 200) {\n          this.userTalkList();\n          uni.showToast({\n            icon: \"none\",\n            title: res.data.message,\n          });\n        }\n      })\n    },\n  },\n};\n</script>\n  \n<style lang=\"scss\" scoped>\n.talk-view {\n  border-radius: 20rpx;\n  background-color: #fff;\n\n  .talk-item-view {\n    display: flex;\n    flex-wrap: wrap;\n    flex-direction: row;\n    padding: 10rpx 20rpx;\n\n    .talk-img {\n      width: 100rpx;\n      height: 100rpx;\n      margin-right: 10rpx;\n      margin-bottom: 10rpx;\n    }\n\n    .talk-info {\n      padding-left: 30rpx;\n      flex: 1;\n\n      .talk-name {\n        font-size: 28rpx;\n        margin-bottom: 10rpx;\n        font-weight: bold;\n        color: #333333;\n      }\n\n      .talk-message {\n        font-size: 28rpx;\n        margin-top: 10rpx;\n        color: #888787;\n\n      }\n\n\n      .talk-tag {\n        margin-left: 10rpx;\n      }\n    }\n  }\n}\n\n.talk-time {\n  position: relative;\n}\n\n.iconBox {\n  width: 94%;\n  margin: 0 3%;\n  background: #fff;\n  border-radius: 20rpx;\n  box-shadow: 0 4rpx 24rpx 0 rgba($color: #f6f6f6, $alpha: 1);\n  // transform: translateY(-30rpx);\n}\n\n.icon-list {\n  height: 140rpx;\n  text-align: center;\n  font-size: $font-sm;\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n  padding: 0 3%;\n  color: #999;\n\n  .icon-item {\n    position: relative;\n    line-height: 2em;\n    width: 96rpx;\n\n    :first-child {\n      font-size: 48rpx;\n      margin-bottom: 10rpx;\n    }\n  }\n}\n\n.bag {\n  width: 56rpx;\n  height: 56rpx;\n  border-radius: 50%;\n  margin: 0 auto;\n}\n\n.bag1 {\n  background: #ff0015;\n}\n\n.bag2 {\n  background: #73AF7C;\n}\n</style>\n<style lang=\"scss\" scoped>\n@import \"./index-app.scss\";\n</style>\n"
  },
  {
    "path": "pages/mine/im/socket.js",
    "content": "import config from '@/config/config.js'\nimport storage from '@/utils/storage';\nclass socketIO {\n  constructor(data, time, url) {\n    this.socketTask = null\n    this.is_open_socket = false //避免重复连接\n    this.url = config.baseWsUrl + '/' + storage.getAccessToken()  //连接地址\n    this.data = data ? data : null\n    this.connectNum = 1 // 重连次数\n    this.traderDetailIndex = 100 // traderDetailIndex ==2 重连\n    this.accountStateIndex = 100 // traderDetailIndex ==1 重连\n    this.followFlake = false // traderDetailIndex == true 重连\n    //心跳检测\n    this.timeout = time ? time : 15000 //多少秒执行检测\n    this.heartbeatInterval = null //检测服务器端是否还活着\n    this.reconnectTimeOut = null //重连之后多久再次重连\n  }\n  // 进入这个页面的时候创建websocket连接【整个页面随时使用】\n  connectSocketInit (data) {\n    this.data = data\n    this.socketTask = uni.connectSocket({\n      url: this.url,\n      success: () => {\n        console.log(\"正准备建立websocket中...\");\n        // 返回实例\n        return this.socketTask\n      },\n    });\n    this.socketTask.onOpen((res) => {\n      this.connectNum = 1\n      console.log(\"WebSocket连接正常！\");\n      this.send(data)\n      clearInterval(this.reconnectTimeOut)\n      clearInterval(this.heartbeatInterval)\n      this.is_open_socket = true;\n      this.start();\n      // 注：只有连接正常打开中 ，才能正常收到消息\n      this.socketTask.onMessage((e) => {\n        // 字符串转json\n        let res = JSON.parse(e.data);\n        console.log(\"res---------->\", res) // 这里 查看 推送过来的消息\n        if (res.data) {\n          uni.$emit('getPositonsOrder', res);\n        }\n      });\n    })\n    // 监听连接失败，这里代码我注释掉的原因是因为如果服务器关闭后，和下面的onclose方法一起发起重连操作，这样会导致重复连接\n    uni.onSocketError((res) => {\n      console.log('WebSocket连接打开失败，请检查！');\n      this.socketTask = null\n      this.is_open_socket = false;\n      clearInterval(this.heartbeatInterval)\n      clearInterval(this.reconnectTimeOut)\n      uni.$off('getPositonsOrder')\n      if (this.connectNum < 6) {\n        uni.showToast({\n          title: `WebSocket连接失败，正尝试第${this.connectNum}次连接`,\n          icon: \"none\"\n        })\n        this.reconnect();\n        this.connectNum += 1\n      } else {\n        uni.$emit('connectError');\n        this.connectNum = 1\n      }\n    });\n    // 这里仅是事件监听【如果socket关闭了会执行】\n    this.socketTask.onClose(() => {\n      console.log(\"已经被关闭了-------\")\n      clearInterval(this.heartbeatInterval)\n      clearInterval(this.reconnectTimeOut)\n      this.is_open_socket = false;\n      this.socketTask = null\n      uni.$off('getPositonsOrder')\n      if (this.connectNum < 6) {\n        this.reconnect();\n      } else {\n        uni.$emit('connectError');\n        this.connectNum = 1\n      }\n    })\n  }\n  // 主动关闭socket连接\n  Close () {\n    if (!this.is_open_socket) {\n      return\n    }\n    this.socketTask.close({\n      success () {\n        uni.showToast({\n          title: 'SocketTask 关闭成功',\n          icon: \"none\"\n        });\n      }\n    });\n  }\n  //发送消息\n  send (data) {\n    console.log(\"data---------->\", data);\n    // 注：只有连接正常打开中 ，才能正常成功发送消息\n    if (this.socketTask) {\n      this.socketTask.send({\n        data: JSON.stringify(data),\n        async success () {\n          console.log(\"消息发送成功\");\n        },\n      });\n    }\n  }\n  //开启心跳检测\n  start () {\n    this.heartbeatInterval = setInterval(() => {\n      this.send({\n        \"traderid\": 10260,\n        \"type\": \"Ping\"\n      });\n    }, this.timeout)\n  }\n  //重新连接\n  reconnect () {\n    //停止发送心跳\n    clearInterval(this.heartbeatInterval)\n    //如果不是人为关闭的话，进行重连\n    if (!this.is_open_socket && (this.traderDetailIndex == 2 || this.accountStateIndex == 0 || this\n      .followFlake)) {\n      this.reconnectTimeOut = setInterval(() => {\n        this.connectSocketInit(this.data);\n      }, 5000)\n    }\n  }\n  /**\n   * @description 将 scoket 数据进行过滤\n   * @param {array} array\n   * @param {string} type 区分 弹窗 openposition 分为跟随和我的\n   */\n  arrayFilter (array, type = 'normal', signalId = 0) {\n    let arr1 = []\n    let arr2 = []\n    let obj = {\n      arr1: [],\n      arr2: []\n    }\n    arr1 = array.filter(v => v.flwsig == true)\n    arr2 = array.filter(v => v.flwsig == false)\n    if (type == 'normal') {\n      if (signalId) {\n        arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalId)\n        return arr1\n      } else {\n        return arr1.concat(arr2)\n      }\n    } else {\n      if (signalId > 0) {\n        arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalId)\n        obj.arr1 = arr1\n      } else {\n        obj.arr1 = arr1\n      }\n      obj.arr2 = arr2\n      return obj\n    }\n  }\n}\nexport {\n  socketIO\n}"
  },
  {
    "path": "pages/mine/msgTips/main.vue",
    "content": "<template>\n\t<view class=\"container\">\n\t\t<view class=\"list-cell b-b m-t\" hover-class=\"cell-hover\" :hover-stay-time=\"50\">\n\t\t\t<u-row gutter=\"12\" justify=\"start\" @click=\"navigateTo('/pages/msgTips/sysMsg/index')\">\n\t\t\t\t<u-col span=\"2\" class=\"uCol\" style=\"text-align:center;\">\n\t\t\t\t\t<image class=\"img\" src=\"/static/mine/setting.png\"></image>\n\t\t\t\t</u-col>\n\t\t\t\t<u-col span=\"7\">\n\t\t\t\t\t<p class=\"tit_title\">系统消息</p>\n\t\t\t\t\t<p class=\"tit_tips\">查看系统消息</p>\n\t\t\t\t</u-col>\n\t\t\t\t<u-col span=\"3\">\n\t\t\t\t\t<view class=\"cell-more\">\n\t\t\t\t\t\t<u-tag size=\"mini\" v-if=\"no_read.system_num>0\" shape=\"circle\" mode=\"dark\" type=\"error\" :text=\"no_read.system_num\"></u-tag>\n\t\t\t\t\t\t<span class=\"yticon icon-you\"></span>\n\t\t\t\t\t</view>\n\t\t\t\t</u-col>\n\t\t\t</u-row>\n\t\t</view>\n\t\t<!-- <view class=\"list-cell b-b m-t\" hover-class=\"cell-hover\" :hover-stay-time=\"50\">\n\t\t\t<u-row gutter=\"12\" justify=\"start\" @click=\"navigateTo('/pages/msgTips/packagemsg/index')\">\n\t\t\t\t<u-col span=\"2\" class=\"uCol\" style=\"text-align:center;\">\n\t\t\t\t\t<image class=\"img\" src=\"/static/mine/logistics.png\"></image>\n\n\t\t\t\t</u-col>\n\t\t\t\t<u-col span=\"7\">\n\t\t\t\t\t<p class=\"tit_title\">物流消息</p>\n\t\t\t\t\t<p class=\"tit_tips\">查看物流消息</p>\n\t\t\t\t</u-col>\n\t\t\t\t<u-col span=\"3\">\n\t\t\t\t\t<view class=\"cell-more\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<u-tag v-if=\"no_read.logistics_num>0\" shape=\"circle\" mode=\"dark\" type=\"warning\" :text=\"no_read.logistics_num\"></u-tag>\n\t\t\t\t\t\t<span class=\"yticon icon-you\"></span>\n\t\t\t\t\t</view>\n\t\t\t\t</u-col>\n\t\t\t</u-row>\n\t\t</view> -->\n\t</view>\n</template>\n\n<script>\n\timport {\n\t\tmapMutations\n\t} from \"vuex\";\n\timport * as API_Message from \"@/api/members.js\";\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tno_read: ''\n\t\t\t};\n\t\t},\n\t\tonLoad() {\n\t\t\tthis.GET_NoReadMessageNum();\n\t\t},\n\t\tmethods: {\n\t\t\t...mapMutations([\"logout\"]),\n\t\t\tnavigateTo(url) {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl\n\t\t\t\t});\n\t\t\t},\n\t\t\t/** 获取未读消息数量信息 */\n\t\t\tGET_NoReadMessageNum() {\n\t\t\t\tAPI_Message.getNoReadMessageNum().then(response => {\n\t\t\t\t\tthis.no_read = response.data\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style scoped lang='scss'>\n\t.uCol {\n\t\tdisplay: flex;\n\t\tjustify-content: center !important;\n\t}\n\n\t.img {\n\t\twidth: 60rpx;\n\t\theight: 60rpx;\n\n\t}\n\n\t.container {\n\t\tbackground: #f9f9f9;\n\t}\n\n\t/deep/ .u-col-2 {\n\t\theight: 60px;\n\t\tline-height: 60px;\n\t\ttext-align: center !important;\n\n\t}\n\n\t.qicon {\n\t\ttext-align: center;\n\t\tdisplay: block;\n\t\tfont-size: 20px;\n\t}\n\n\t.redBox {\n\t\tdisplay: inline-block;\n\t\ttext-align: center;\n\t\tline-height: 1.5em;\n\t\tfont-size: 12px;\n\t\tmin-width: 1.5em;\n\t\tmin-height: 1.5em;\n\n\t\tbackground: #ed6533;\n\t\tborder-radius: 50%;\n\t\tcolor: #fff;\n\t}\n\n\t.tit_title {\n\t\tcolor: $u-main-color;\n\t}\n\n\t.tit_tips {\n\t\tcolor: $u-tips-color;\n\t}\n\n\t.u-col-3 {\n\t\ttext-align: right !important;\n\t\tpadding-right: 20rpx !important;\n\t}\n\n\t.list-cell {\n\t\tbackground: #fff;\n\t\talign-items: baseline;\n\t\tpadding: 20rpx 0;\n\t\tline-height: 60rpx;\n\n\t\tbackground: #fff;\n\t\tjustify-content: center;\n\n\t\t&.log-out-btn {\n\t\t\tmargin-top: 40rpx;\n\n\t\t\t.cell-tit {\n\t\t\t\tcolor: $uni-color-primary;\n\t\t\t\ttext-align: center;\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\n\t\t&.cell-hover {\n\t\t\tbackground: #fafafa;\n\t\t}\n\n\t\t&.b-b:after {\n\t\t\tleft: 30rpx;\n\t\t}\n\n\t\t&.m-t {\n\t\t\tmargin-top: 16rpx;\n\t\t}\n\n\t\t.cell-more {\n\t\t\t/* margin-top: 10rpx; */\n\t\t\theight: 60rpx;\n\t\t\ttext-align: right;\n\t\t\t/* display: flex;\n\t\t\tjustify-content: center; //这个是X轴居中\n\t\t\talign-items: center; //这个是 Y轴居中 */\n\t\t\tfont-size: $font-lg;\n\t\t\tcolor: $font-color-light;\n\t\t\t/* width: 100rpx; */\n\t\t}\n\n\t\t.cell-tit {\n\t\t\tflex: 1;\n\t\t\tfont-size: $font-base + 2rpx;\n\t\t\tcolor: $font-color-dark;\n\t\t\tmargin-right: 10rpx;\n\t\t}\n\n\t\t.cell-tip {\n\t\t\tfont-size: $font-base;\n\t\t\tcolor: $font-color-light;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "pages/mine/msgTips/packageMsg/index.vue",
    "content": "<template>\n  <view class=\"container \" style=\"font-size: 13px;\">\n\t <block v-for=\"(row, index) in messageList\" :key=\"index\">\n\t\t<view class=\"msgItem\">\n\t\t  <div class=\"msgMsg\">\n\t\t\t<div class=\"bagbar\">{{$u.timeFormat(row.send_time, 'yyyy-mm-dd')}}</div>\n\t\t  </div>\n\t\t  <u-card @click=\"goDetail(row.sn,row.logi_id,row.ship_no)\" :title=\"title\" title-color=\"#666666\" title-size=\"24\" sub-title-color=\"#666666\" sub-title-size=\"24\" :border=\"false\" :sub-title=row.status>\n\t\t\t<view class=\"msg-body\" slot=\"body\">\n\t\t\t  <image class=\"msgImg\" :src=\"row.goods_img\" mode=\"\"></image>\n\t\t\t  <view class=\"msgView\">\n\t\t\t\t<view>{{row.goodsName}}</view>\n\t\t\t\t<view class=\"msgNum\">订单号:{{row.sn}}</view>\n\t\t\t  </view>\n\t\t\t</view>\n\t\t  </u-card>\n\t\t</view>\n\t</block>\t\n\t<uni-load-more :status=\"loadStatus\"></uni-load-more>\n  </view>\n</template>\n\n<script>\nimport * as API_Message from \"@/api/message.js\";\nexport default {\n  data() {\n    return {\n\t  messageList: [],\n\t  title: \"物流更新通知\",\n\t  subTitle: \"运输中\",\n\t  loadStatus:'more',\n\t  params: {\n\t    pageNumber: 1,\n\t    pageSize: 10,\n\t  },\n\t  loadStatus:'more'\n    };\n  },\n  onLoad(){\n  \tthis.GET_LogisticsList(true);\n  },\n  onReachBottom() {\n  \tthis.params.pageNumber++\n  \tthis.GET_LogisticsList(false)\n  },\n  methods: {\n    goDetail(sn,logi_id,ship_no){\n\t\tuni.navigateTo({\n\t\t\turl:'/pages/msgTips/packagemsg/logisticsDetail?order_sn=' + sn +'&logi_id='+logi_id+'&ship_no='+ship_no,\n\t\t})\n\t},\n\t//获取物流消息\n\tGET_LogisticsList(reset){\n\t\tif (reset) {\n\t\t\tthis.params.pageNumber = 1\n\t\t }\n\t\tuni.showLoading({\n\t\t\ttitle:\"加载中\"\n\t\t})\n\t\tAPI_Message.getLogisticsMessages(this.params).then(async response => {\n\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() }\n\t\t    const { data } = response\n\t\t    if (!data || !data.length) {\n\t\t\t\tthis.messageList.push(...data.data)\n\t\t    }\n\t\t })\n\t\t\n\t}\n\t\t\n  }\n};\n</script>\n\n<style scoped lang='scss'>\n.ddnumber {\n  color: $u-tips-color;\n  font-size: 24rpx;\n}\n.msg-body{\n\tdisplay: flex;\n\tbackground-color: rgba(102, 110, 232, 0.0470588235294118);\n\t\n\t\n\t.msgImg{\n\t\twidth: 160rpx;\n\t\theight: 160rpx;\n\t}\n\t.msgView{\n\t\tmargin-left: 20rpx;\n\t\t.msgNum:last-child{\n\t\t\tmargin-top: 60rpx;\n\t\t}\n\t}\n\t\n}\n.bagbar {\n  display: inline;\n  border-radius: 500px;\n  color: #fff;\n  font-size: 24rpx;\n  padding: 10rpx 20rpx;\n  background: $u-type-info-disabled;\n}\n.storeImg {\n  width: 100%;\n  height: 100rpx;\n  margin-right: 20rpx;\n}\n.container {\n  background: #F9F9F9;\n  min-height: 100vh;\n}\n.msgMsg {\n  text-align: center;\n  color: $u-tips-color;\n}\n.msgItem {\n  padding: 1em 0;\n}\nview{\n\tfont-size: 13px;\n\tcolor: #666666;\n}\nu-card{\n\tfont-size: 13px;\n\tcolor: #666666;\n}\n</style>"
  },
  {
    "path": "pages/mine/msgTips/packageMsg/logisticsDetail.vue",
    "content": "<template>\n  <view class=\"logistics-detail\">\n    <view class=\"card\">\n      <view class=\"card-title\">\n        <span>{{ logiList.shipper }}</span>快递 <span>{{ logiList.logisticCode }}</span>\n      </view>\n      <view class=\"time-line\">\n        <u-time-line v-if=\"logiList.traces && logiList.traces.length != 0\">\n          <u-time-line-item nodeTop=\"2\" v-for=\"(item, index) in logiList.traces\" :key=\"index\">\n            <!-- 此处自定义了左边内容，用一个图标替代 -->\n            <template v-slot:node >\n              <view v-if=\"index == logiList.traces.length - 1\" class=\"u-node\" :style=\"{ background: $lightColor }\" style=\"padding: 0 4px\">\n                <!-- 此处为uView的icon组件 -->\n                <u-icon name=\"pushpin-fill\" color=\"#fff\" :size=\"24\"></u-icon>\n              </view>\n            </template>\n            <template v-slot:content>\n              <view>\n                <!-- <view class=\"u-order-title\">待取件</view> -->\n                <view class=\"u-order-desc\">{{ item.AcceptStation }}</view>\n                <view class=\"u-order-time\">{{ item.AcceptTime }}</view>\n              </view>\n            </template>\n          </u-time-line-item>\n        </u-time-line>\n        <u-empty class=\"empty\" v-else text=\"目前没有物流订单\" mode=\"list\"></u-empty>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { getExpress } from \"@/api/trade.js\";\nexport default {\n  data() {\n    return {\n      express: \"\",\n      resData: {\n        title: \"物流详情\",\n      },\n\n      logiList: \"\",\n      activeStep: 0,\n    };\n  },\n  methods: {\n    init(sn) {\n      getExpress(sn).then((res) => {\n        this.logiList = res.data.result;\n      });\n    },\n  },\n  onLoad(option) {\n    let sn = option.order_sn;\n    this.init(sn);\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.card-title {\n  background: #f2f2f2;\n}\n.logistics-detail {\n  margin-top: 20rpx;\n  padding: 0 16rpx;\n}\n.card {\n  background: #fff;\n  border-radius: 20rpx;\n  width: 100%;\n  > .card-title {\n    font-size: 24rpx;\n    border-top-left-radius: 20rpx;\n    border-top-right-radius: 20rpx;\n    padding: 16rpx;\n  }\n  > .time-line {\n    padding: 16rpx 32rpx;\n  }\n}\n.u-order-title {\n  font-weight: bold;\n}\n.u-order-desc {\n  font-size: 26rpx;\n  color: #666;\n  margin: 10rpx 0;\n}\n.u-order-time {\n  font-size: 24rpx;\n  color: #999;\n}\n.empty {\n  padding: 40rpx 0;\n}\n</style>\n"
  },
  {
    "path": "pages/mine/msgTips/serviceMsg/index.vue",
    "content": "<template>\n  <view class=\"container\">\n    <view class=\"list-cell b-b m-t\" hover-class=\"cell-hover\" :hover-stay-time=\"50\">\n      <u-row gutter=\"12\" justify=\"start\">\n        <u-col span=\"2\">\n          <img\n            class=\"list_img\"\n            src=\"https://web-assets.fancynode.com.cn/web_v1/images/pxcook/features/icon-cloud.png\"\n            alt\n          />\n        </u-col>\n        <u-col span=\"7\">\n          <p class=\"tit_title\">\n            <img\n              src=\"https://web-assets.fancynode.com.cn/web_v1/images/pxcook/features/icon-cloud.png\"\n              alt\n            />\n            在线客服\n          </p>\n          <p class=\"tit_tips\">查看回复客服的消息</p>\n        </u-col>\n        <u-col span=\"3\">\n          <text class=\"cell-more\">\n            <p class=\"msgTime\">2020-12-12</p>\n            <span class=\"redBox\">55</span>\n          </text>\n        </u-col>\n      </u-row>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapMutations } from \"vuex\";\nexport default {\n  data() {\n    return {};\n  },\n  methods: {\n    ...mapMutations([\"logout\"]),\n    \n  }\n};\n</script>\n\n<style scoped lang='scss'>\n.msgTime {\n  font-size: 13px;\n}\npage {\n  background: $page-color-base;\n}\n.list_img {\n  width: 100%;\n  height: 100%;\n  vertical-align: middle;\n  border-radius: 0.4em;\n}\n.qicon {\n  text-align: center;\n  display: block;\n  font-size: 20px;\n}\n.redBox {\n  padding: 10rpx 12rpx;\n  display: inline-block;\n  text-align: center;\n  font-size: 12px;\n  line-height: 1em;\n  width: 1em;\n  height: 1em;\n  background: #ed6533;\n  border-radius: 50%;\n\n  color: #fff;\n}\n.tit_title,\n.tit_tips {\n  margin-left: 8rpx;\n}\n.tit_title {\n  color: $u-main-color;\n  > img {\n    vertical-align: middle;\n    margin-right: 10rpx;\n    width: 40rpx;\n    height: 40rpx;\n  }\n}\n.tit_tips {\n  color: $u-tips-color;\n}\n.list-cell {\n  align-items: baseline;\n  padding: 20rpx  30rpx;\n  line-height: 60rpx;\n  position: relative;\n  background: #fff;\n  justify-content: center;\n  &.log-out-btn {\n    margin-top: 40rpx;\n    .cell-tit {\n      color: $uni-color-primary;\n      text-align: center;\n      margin-right: 0;\n    }\n  }\n  &.cell-hover {\n    background: #fafafa;\n  }\n  &.b-b:after {\n    left: 30rpx;\n  }\n  &.m-t {\n    margin-top: 16rpx;\n  }\n  .cell-more {\n    text-align: right;\n    margin-top: 10rpx;\n    height: 60rpx;\n    display: flex;\n    justify-content: center; //这个是X轴居中\n    align-items: center; //这个是 Y轴居中\n    align-self: baseline;\n    font-size: $font-lg;\n    color: $font-color-light;\n    margin-left: 10rpx;\n  }\n  .cell-tit {\n    flex: 1;\n    font-size: $font-base + 2rpx;\n    color: $font-color-dark;\n    margin-right: 10rpx;\n  }\n  .cell-tip {\n    font-size: $font-base;\n    color: $font-color-light;\n  }\n}\n</style>"
  },
  {
    "path": "pages/mine/msgTips/sysMsg/index.vue",
    "content": "<template>\n  <view class=\"container\">\n    <block v-for=\"(row, index) in messageList\" :key=\"index\">\n      <view class=\"msgItem\">\n        <div  class=\"is_read\">\n\t\t\t<!-- {{row.is_read}} -->\n\t\t\t<span v-if=\"row.is_read\"></span>\n\t\t\t<span v-else class=\"red\">·</span>\n\n\t\t</div>\n        <div class=\"msgMsg\">{{$u.timeFormat(row.send_time, 'yyyy-mm-dd')}}</div>\n        <u-card :title=\"title\" :title-size=\"35\" :border=\"false\">\n          <view class slot=\"body\">\n            <view class=\"u-body-item u-flex u-row-between u-p-b-0\">\n              <view class=\"u-body-item-title u-line-2\">{{row.content}}</view>\n            </view>\n          </view>\n        </u-card>\n      </view>\n    </block>\n    <uni-load-more :status=\"loadStatus\"></uni-load-more>\n  </view>\n</template>\n\n<script>\nimport { mapMutations } from \"vuex\";\nimport * as API_Message from \"@/api/message.js\";\nexport default {\n  data() {\n    return {\n      title: \"系统消息\",\n      subTitle: \"未读\",\n      finished: false,\n      loadStatus: \"more\",\n      params: {\n        pageNumber: 0,\n        pageSize: 5\n      },\n      messageList: []\n    };\n  },\n  onLoad() {\n    this.GET_MessageList(true);\n  },\n  onReachBottom() {\n    this.params.pageNumber++;\n    this.GET_MessageList(false);\n  },\n  methods: {\n    ...mapMutations([\"logout\"]),\n   \n    /** 获取站内消息 */\n    GET_MessageList(reset) {\n      if (reset) {\n        this.params.pageNumber = 1;\n        this.messageList = [];\n      }\n      uni.showLoading({\n        title: \"加载中\"\n      });\n      API_Message.getMessages(this.params).then(async response => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        const { data } = response;\n        if (!data || !data.length) {\n          this.messageList.push(...data.data);\n          this.handleReadPageMessages();\n        }\n      });\n    },\n    /** 设置消息已读 **/\n    handleReadPageMessages() {\n      const ids = this.messageList.map(item => item.id).join(\",\");\n      API_Message.messageMarkAsRead(ids).then(async () => {});\n    }\n  }\n};\n</script>\n\n<style scoped lang='scss'>\n.is_read{\n\tposition: absolute;\n    right: 25px;\n    top: 80rpx;\n    z-index: 999;\n}\n.container {\n  background: #f9f9f9;\n  min-height: 100vh;\n}\n.red{\n\tcolor: coral;\n\tfont-size: 100rpx;\n}\n.msgMsg {\n  text-align: center;\n  color: $u-tips-color;\n}\n.msgItem {\n  padding: 1em 0;\n  position: relative;\n}\n</style>"
  },
  {
    "path": "pages/mine/myCollect.vue",
    "content": "<template>\r\n\t<view class=\"content\">\r\n\t\t<u-navbar>\r\n\t\t\t<u-tabs :active-color=\"lightColor\"  class=\"slot-wrap\" :list=\"navList\" count=\"count\" :is-scroll=\"true\" :current=\"tabCurrentIndex\" @change=\"tabClick\"></u-tabs>\r\n\t\t</u-navbar>\r\n\t\t<view class=\"swiper-box\">\r\n\t\t\t<!-- 显示商品栏 -->\r\n\t\t\t<view v-if=\"tabCurrentIndex == 0\" class=\"tab-content\">\r\n\t\t\t\t<scroll-view class=\"list-scroll-content\" scroll-y>\r\n\t\t\t\t\t<!-- 空白页 -->\r\n\t\t\t\t\t<u-empty style=\"margin-top: 40rpx\" text=\"暂无收藏商品数据\" mode=\"favor\" v-if=\"goodsEmpty\"></u-empty>\r\n\t\t\t\t\t<!-- 商品展示数据 -->\r\n\t\t\t\t\t<u-swipe-action @open=\"openLeftChange(item, index, 'goods')\" :show=\"item.selected\" btn-width=\"180\"\r\n\t\t\t\t\t\t:options=\"LeftOptions\" v-else v-for=\"(item, index) in goodList\"\r\n\t\t\t\t\t\t@click=\"clickGoodsSwiperAction(item, index)\" :index=\"index\" :key=\"index\">\r\n\t\t\t\t\t\t<view class=\"goods\" @click=\"goGoodsDetail(item)\">\r\n\t\t\t\t\t\t\t<u-image width=\"131rpx\" height=\"131rpx\" :src=\"item.image\" mode=\"aspectFit\">\r\n\t\t\t\t\t\t\t\t<u-loading slot=\"loading\"></u-loading>\r\n\t\t\t\t\t\t\t</u-image>\r\n\t\t\t\t\t\t\t<view class=\"goods-intro\">\r\n\t\t\t\t\t\t\t\t<view>{{ item.goodsName }}</view>\r\n\t\t\t\t\t\t\t\t<view class=\"goods-sn\">{{ item.goods_sn }}</view>\r\n\t\t\t\t\t\t\t\t<view>￥{{ item.price | unitPrice }}</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</u-swipe-action>\r\n\r\n\t\t\t\t</scroll-view>\r\n\t\t\t</view>\r\n\t\t\t<!-- 显示收藏的店铺栏 -->\r\n\t\t\t<view v-else class=\"tab-content\">\r\n\t\t\t\t<scroll-view class=\"list-scroll-content\" scroll-y>\r\n\t\t\t\t\t<!-- 空白页 -->\r\n\t\t\t\t\t<u-empty style=\"margin-top: 40rpx\" text=\"暂无收藏店铺数据\" mode=\"favor\" v-if=\"storeEmpty\"></u-empty>\r\n\t\t\t\t\t<!-- 店铺展示数据 -->\r\n\t\t\t\t\t<u-swipe-action @open=\"openLeftChange(item, 'store')\" :show=\"item.selected\" btn-width=\"180\"\r\n\t\t\t\t\t\t:options=\"LeftOptions\" v-else v-for=\"(item, index) in storeList\" :key=\"index\"\r\n\t\t\t\t\t\t@click=\"clickStoreSwiperAction(item)\">\r\n\t\t\t\t\t\t<view class=\"store\" @click=\"goStoreMainPage(item.id)\">\r\n\t\t\t\t\t\t\t<view class=\"intro\">\r\n\t\t\t\t\t\t\t\t<view class=\"store-logo\">\r\n\t\t\t\t\t\t\t\t\t<u-image width=\"102rpx\" height=\"102rpx\" :src=\"item.storeLogo\" :alt=\"item.storeName\"\r\n\t\t\t\t\t\t\t\t\t\tmode=\"aspectFit\">\r\n\t\t\t\t\t\t\t\t\t\t<u-loading slot=\"loading\"></u-loading>\r\n\t\t\t\t\t\t\t\t\t</u-image>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view class=\"store-name\">\r\n\t\t\t\t\t\t\t\t\t<view>{{ item.storeName }}</view>\r\n\t\t\t\t\t\t\t\t\t<u-tag size=\"mini\" type=\"error\" :color=\"$mainColor\" v-if=\"item.selfOperated\"\r\n\t\t\t\t\t\t\t\t\t\ttext=\"自营\" mode=\"plain\" shape=\"circle\" />\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view class=\"store-collect\">\r\n\t\t\t\t\t\t\t\t\t<view>进店逛逛</view>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</u-swipe-action>\r\n\t\t\t\t</scroll-view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tgetGoodsCollection,\r\n\t\tgetStoreCollection,\r\n\t\tdeleteGoodsCollection,\r\n\t\tdeleteStoreCollection,\r\n\t} from \"@/api/members.js\";\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n        lightColor:this.$lightColor,\r\n\t\t\t\t// 商品左滑侧边栏\r\n\t\t\t\tLeftOptions: [{\r\n\t\t\t\t\ttext: \"取消\",\r\n\t\t\t\t\tstyle: {\r\n\t\t\t\t\t\tbackgroundColor: this.$lightColor,\r\n\t\t\t\t\t},\r\n\t\t\t\t}, ],\r\n\t\t\t\ttabCurrentIndex: 0, //tab的下标默认为0，也就是说会默认请求商品\r\n\t\t\t\tnavList: [\r\n\t\t\t\t\t//tab显示数据\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: \"商品(0)\",\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tparams: {\r\n\t\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: \"店铺(0)\",\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tparams: {\r\n\t\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\r\n\t\t\t\tgoodsEmpty: false, //商品数据是否为空\r\n\t\t\t\tstoreEmpty: false, //店铺数据是否为空\r\n\t\t\t\tgoodList: [], //商品集合\r\n\t\t\t\tstoreList: [], //店铺集合\r\n\t\t\t};\r\n\t\t},\r\n\t\tonShow() {\r\n\t\t\tthis.fetchReloadOrNextPage('reload')\r\n\t\t},\r\n\t\tonReachBottom() {\r\n\t\t\tthis.fetchReloadOrNextPage('next')\r\n\t\t},\r\n\r\n\t\tmethods: {\r\n\t\t\t// 刷新或者下一页\r\n\t\t\tfetchReloadOrNextPage(type) {\r\n\t\t\t\tif(type == 'next'){\r\n\t\t\t\t\tthis.navList[this.tabCurrentIndex].params.pageNumber ++;\r\n\t\t\t\t\tif (this.tabCurrentIndex == 0) {\r\n\t\t\t\t\tthis.getGoodList();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.getStoreList();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\tthis.navList[0].params.pageNumber = 1;\r\n\t\t\t\t\tthis.navList[1].params.pageNumber = 1;\r\n\t\t\t\t\tthis.goodList = [];\r\n\t\t\t\t\tthis.storeList = [];\r\n\t\t\t\t\tthis.getGoodList();\r\n\t\t\t\t\tthis.getStoreList();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 打开商品左侧取消收藏\r\n\t\t\t */\r\n\t\t\topenLeftChange(val, type) {\r\n\t\t\t\tconst {\r\n\t\t\t\t\tgoodList,\r\n\t\t\t\t\tstoreList\r\n\t\t\t\t} = this;\r\n\t\t\t\tlet way;\r\n\t\t\t\ttype == \"goods\" ? (way = goodList) : (way = storeList);\r\n\t\t\t\tway.forEach((item) => {\r\n\t\t\t\t\tthis.$set(item, \"selected\", false);\r\n\t\t\t\t});\r\n\t\t\t\tthis.$set(val, \"selected\", false);\r\n\t\t\t\tval.selected = true;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 点击商品左侧取消收藏\r\n\t\t\t */\r\n\t\t\tclickGoodsSwiperAction(val) {\r\n\t\t\t\tdeleteGoodsCollection(val.skuId).then((res) => {\r\n\t\t\t\t\tif (res.statusCode == 200) {\r\n\t\t\t\t\t\tthis.storeList = [];\r\n\t\t\t\t\t\tthis.goodList = [];\r\n\t\t\t\t\t\tthis.getGoodList();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 点击店铺左侧取消收藏\r\n\t\t\t */\r\n\t\t\tclickStoreSwiperAction(val) {\r\n\t\t\t\tdeleteStoreCollection(val.id).then((res) => {\r\n\t\t\t\t\tif (res.statusCode == 200) {\r\n\t\t\t\t\t\tthis.storeList = [];\r\n\t\t\t\t\t\tthis.getStoreList();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 顶部tab点击\r\n\t\t\t */\r\n\t\t\ttabClick(index) {\r\n\t\t\t\tthis.tabCurrentIndex = index;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 查看商品详情\r\n\t\t\t */\r\n\t\t\tgoGoodsDetail(val) {\r\n\t\t\t\t//商品详情\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/product/goods?id=\" + val.skuId + \"&goodsId=\" + val.goodsId,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 查看店铺详情\r\n\t\t\t */\r\n\t\t\tgoStoreMainPage(id) {\r\n\t\t\t\t//店铺主页\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/product/shopPage?id=\" + id,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 获取商品集合\r\n\t\t\t */\r\n\t\t\tgetGoodList() {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"加载中\",\r\n\t\t\t\t});\r\n\t\t\t\tgetGoodsCollection(this.navList[0].params, \"GOODS\").then((res) => {\r\n\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\tuni.stopPullDownRefresh();\r\n\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\tlet data = res.data.result;\r\n\t\t\t\t\t\tdata.selected = false;\r\n\t\t\t\t\t\t  this.navList[0].name = `商品(${data.total})`;\r\n          \r\n\t\t\t\t\t\tif (data.total == 0) {\r\n\t\t\t\t\t\t\tthis.goodsEmpty = true;\r\n\t\t\t\t\t\t} else if (data.total < 10) {\r\n\t\t\t\t\t\t\tthis.goodsLoad = \"noMore\";\r\n\t\t\t\t\t\t\tthis.goodList.push(...data.records);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.goodList.push(...data.records);\r\n\t\t\t\t\t\t\tif (data.total.length < 10) this.goodsLoad = \"noMore\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 获取店铺集合\r\n\t\t\t */\r\n\t\t\tgetStoreList() {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"加载中\",\r\n\t\t\t\t});\r\n\t\t\t\tgetStoreCollection(this.navList[1].params, \"STORE\").then((res) => {\r\n\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\tuni.stopPullDownRefresh();\r\n\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\tlet data = res.data.result;\r\n\t\t\t\t\t\tdata.selected = false;\r\n\t\t\t\t\t\t this.navList[1].name = `店铺(${data.total})`;\r\n\t\t\t\t\t\tif (data.total == 0) {\r\n\t\t\t\t\t\t\tthis.storeEmpty = true;\r\n\t\t\t\t\t\t} else if (data.total < 10) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tthis.storeList.push(...data.records);\r\n\t\t\t\t\t\t} \r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 下拉刷新时\r\n\t\t */\r\n\t\tonPullDownRefresh() {\r\n\t\t\tif (this.tabCurrentIndex == 0) {\r\n\t\t\t\tthis.navList[0].params.pageNumber = 1;\r\n\t\t\t\tthis.goodList = [];\r\n\t\t\t\tthis.getGoodList();\r\n\t\t\t} else {\r\n\t\t\t\tthis.navList[1].params.pageNumber = 1;\r\n\t\t\t\tthis.storeList = [];\r\n\t\t\t\tthis.getStoreList();\r\n\t\t\t}\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\tpage,\r\n\t.content {\r\n\t\tbackground: $page-color-base;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n  .slot-wrap{\r\n    flex: 1;\r\n    display: flex;\r\n    justify-content: center;\r\n    padding-right: 72rpx;\r\n  }\r\n\r\n\t.content {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.swiper-box {\r\n\t\toverflow-y: auto;\r\n\t}\r\n\r\n\t.list-scroll-content {\r\n\t\theight: 100%;\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t/deep/ .u-swipe-content {\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t.goods {\r\n\t\tbackground-color: #fff;\r\n\t\tborder-bottom: 1px solid $border-color-light;\r\n\t\theight: 190rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tpadding: 30rpx 20rpx;\r\n\t\tmargin-top: 20rpx;\r\n\r\n\t\timage {\r\n\t\t\twidth: 131rpx;\r\n\t\t\theight: 131rpx;\r\n\t\t\tborder-radius: 10rpx;\r\n\t\t}\r\n\r\n\t\t.goods-intro {\r\n\t\t\tflex: 1;\r\n\t\t\tfont-size: $font-base;\r\n\t\t\tline-height: 48rpx;\r\n\t\t\tmargin-left: 30rpx;\r\n\r\n\t\t\tview:nth-child(1) {\r\n\t\t\t\tline-height: 1.4em;\r\n\t\t\t\tfont-size: 24rpx;\r\n\t\t\t\tmax-height: 2.8em; //height是line-height的整数倍，防止文字显示不全\r\n\t\t\t\toverflow: hidden;\r\n\t\t\t\tcolor: #666;\r\n\t\t\t}\r\n\r\n\t\t\tview:nth-child(2) {\r\n\t\t\t\tcolor: #cccccc;\r\n\t\t\t\tfont-size: 24rpx;\r\n\t\t\t}\r\n\r\n\t\t\tview:nth-child(3) {\r\n\t\t\t\tcolor: $light-color;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbutton {\r\n\t\t\tcolor: $main-color;\r\n\t\t\theight: 50rpx;\r\n\t\t\twidth: 120rpx;\r\n\t\t\tfont-size: $font-sm;\r\n\t\t\tpadding: 0;\r\n\t\t\tline-height: 50rpx;\r\n\t\t\tbackground-color: #ffffff;\r\n\t\t\tmargin-top: 80rpx;\r\n\r\n\t\t\t&::after {\r\n\t\t\t\tborder-color: $main-color;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t.store {\r\n\t\tbackground-color: #fff;\r\n\t\tborder: 1px solid $border-color-light;\r\n\t\tborder-radius: 16rpx;\r\n\t\tmargin: 20rpx 10rpx;\r\n\r\n\t\t.intro {\r\n\t\t\tdisplay: flex;\r\n\t\t\tjustify-content: space-between;\r\n\t\t\talign-items: center;\r\n\t\t\tpadding: 0 30rpx 0 40rpx;\r\n\t\t\theight: 170rpx;\r\n\r\n\t\t\t.store-logo {\r\n\t\t\t\twidth: 102rpx;\r\n\t\t\t\theight: 102rpx;\r\n\t\t\t\tborder-radius: 50%;\r\n\t\t\t\toverflow: hidden;\r\n\r\n\t\t\t\timage {\r\n\t\t\t\t\twidth: 100%;\r\n\t\t\t\t\theight: 100%;\r\n\t\t\t\t\tborder-radius: 50%;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t.store-name {\r\n\t\t\t\tflex: 1;\r\n\t\t\t\tmargin-left: 30rpx;\r\n\t\t\t\tline-height: 2em;\r\n\r\n\t\t\t\t:first-child {\r\n\t\t\t\t\tfont-size: $font-base;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t:last-child {\r\n\t\t\t\t\tfont-size: $font-sm;\r\n\t\t\t\t\tcolor: #999;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t.store-collect {\r\n\t\t\t\tborder-left: 1px solid $border-color-light;\r\n\t\t\t\tpadding-left: 20rpx;\r\n\t\t\t\ttext-align: center;\r\n\r\n\t\t\t\t:last-child {\r\n\t\t\t\t\tcolor: #999;\r\n\t\t\t\t\tfont-size: $font-sm;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t.navbar {\r\n\t\tdisplay: flex;\r\n\t\theight: 40px;\r\n\t\tpadding: 0 5px;\r\n\t\tbackground: #fff;\r\n\t\tbox-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);\r\n\t\tposition: relative;\r\n\t\tz-index: 10;\r\n\r\n\t\t.nav-item {\r\n\t\t\tflex: 1;\r\n\t\t\tdisplay: flex;\r\n\t\t\tjustify-content: center;\r\n\t\t\talign-items: center;\r\n\t\t\theight: 100%;\r\n\t\t\tfont-size: 26rpx;\r\n\r\n\t\t\ttext {\r\n\t\t\t\tposition: relative;\r\n\t\t\t}\r\n\r\n\t\t\ttext.current {\r\n\t\t\t\tcolor: $light-color;\r\n\t\t\t\tfont-weight: bold;\r\n\t\t\t\tfont-size: 28rpx;\r\n\r\n\t\t\t\t&::after {\r\n\t\t\t\t\tcontent: \"\";\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tleft: 20rpx;\r\n\t\t\t\t\tbottom: -10rpx;\r\n\t\t\t\t\twidth: 30rpx;\r\n\t\t\t\t\theight: 0;\r\n\t\t\t\t\tborder-bottom: 2px solid $light-color;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/myTracks.vue",
    "content": "<template>\r\n\t<view class=\"myTracks\">\r\n\t\t<u-navbar title=\"我的足迹\">\r\n\t\t\t<div slot=\"right\">\r\n        <div class=\"light-color edit\" @click=\"isEdit = !isEdit\">{{ !isEdit ? '编辑' : '完成'}}</div>\r\n      </div>\r\n\t\t</u-navbar>\r\n\t\t<u-notice-bar mode=\"vertical\" :list=\"['右划删除浏览记录']\"></u-notice-bar>\r\n\t\t<u-empty text=\"暂无历史记录\" style=\"margin-top:200rpx;\" mode=\"history\" v-if=\"whetherEmpty\"></u-empty>\r\n\t\t<div v-else>\r\n\t\t\t<view v-for=\"(item, index) in trackList\" :key=\"index\">\r\n\t\t\t\t<view class=\"myTracks-title\" @click=\"navigateToStore(item)\">{{item.storeName}}</view>\r\n\t\t\t\t<view class=\"myTracks-items\">\r\n\r\n\t\t\t\t\t<u-swipe-action style=\"width: 100%;\" :show=\"item.show\" :index=\"index\" :key=\"item.id\"\r\n\t\t\t\t\t\t@click=\"delTracks\" @open=\"open\" :options=\"options\">\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<view class=\"myTracks-item\">\r\n\t\t\t\t\t\t\t<u-checkbox-group v-if=\"isEdit\" class=\"store-line-check\">\r\n\t\t\t\t\t\t\t\t<u-checkbox shape=\"circle\" :active-color=\"lightColor\" v-model=\"item.checked\"\r\n                @change=\"checkboxChangeDP(item)\"></u-checkbox>\r\n\t\t\t\t\t\t\t</u-checkbox-group>\r\n\t\t\t\t\t\t\t<view class=\"myTracks-item-img\" @click.stop=\"navigateToDetail(item)\">\r\n\t\t\t\t\t\t\t\t<image :src=\"item.thumbnail\"></image>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"myTracks-item-content\" @click.stop=\"navigateToDetail(item)\">\r\n\t\t\t\t\t\t\t\t<view class=\"myTracks-item-title\">\r\n\t\t\t\t\t\t\t\t\t{{ item.goodsName }}\r\n\t\t\t\t\t\t\t\t\t<view class=\"myTracks-item-title-desc\"> </view>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view class=\"myTracks-item-price\">\r\n\t\t\t\t\t\t\t\t\t￥{{ item.price | unitPrice }}\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</u-swipe-action>\r\n\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"myTracks-divider\"></view>\r\n\r\n\t\t\t</view>\r\n\t\t\t<div @click=\"handleClickDeleteSelected\" v-if=\"isEdit\" class=\"submit\">\r\n\t\t\t\t删除所选\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tmyTrackList,\r\n\t\tdeleteHistoryListId\r\n\t} from \"@/api/members.js\";\r\n\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tisEdit:false,\r\n\t\t\t\twhetherEmpty: false, //是否数据为空\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\torder: \"desc\",\r\n\t\t\t\t\tsort: \"updateTime\",\r\n\t\t\t\t},\r\n\t\t\t\tlightColor:this.$lightColor,\r\n\t\t\t\toptions: [{\r\n\t\t\t\t\ttext: '删除',\r\n\t\t\t\t\tstyle: {\r\n\t\t\t\t\t\tbackgroundColor: '#dd524d'\r\n\t\t\t\t\t}\r\n\t\t\t\t}],\r\n\t\t\t\ttrackList: [], //足迹列表\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 滑到底部加载下一页数据\r\n\t\t */\r\n\t\tonReachBottom() {\r\n\t\t\tthis.params.pageNumber++;\r\n\t\t\tthis.getList();\r\n\t\t},\r\n\t\tonShow() {\r\n\t\t\tthis.params.pageNumber = 1\r\n\t\t\tthis.trackList = [];\r\n\t\t\tthis.getList();\r\n\t\t},\r\n\t\tonPullDownRefresh() {\r\n\t\t\tthis.trackList = [];\r\n\t\t\tthis.getList();\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tcheckboxChangeDP(val){\r\n\t\t\t\tconsole.log(val)\r\n\t\t\t},\r\n\t\t\t// 删除所选的数据\r\n\t\t\thandleClickDeleteSelected(val){\r\n\t\t\t\tconst ids = this.trackList.filter(item=>item.checked).map(item=>item.goodsId);\r\n\t\t\t\tif(!ids.length){\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle:\"请选择删除数据\",\r\n\t\t\t\t\t\ticon:\"none\"\r\n\t\t\t\t\t})\r\n\t\t\t\t}else{\r\n\t\t\t\t\tthis.delTracks(0,ids)\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * 导航到店铺\r\n\t\t\t */\r\n\t\t\tnavigateToStore(val) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/product/shopPage?id=\" + val.storeId,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\topen(index) {\r\n\t\t\t\t// 先将正在被操作的swipeAction标记为打开状态，否则由于props的特性限制，\r\n\t\t\t\t// 原本为'false'，再次设置为'false'会无效\r\n\t\t\t\tthis.trackList[index].show = true;\r\n\t\t\t\tthis.trackList.map((val, idx) => {\r\n\t\t\t\t\tif (index != idx) this.trackList[idx].show = false;\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * 跳转详情\r\n\t\t\t */\r\n\t\t\tnavigateToDetail(item) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/product/goods?id=\" + item.id + \"&goodsId=\" + item.goodsId,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 获取我的足迹列表\r\n\t\t\t */\r\n\t\t\tgetList() {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"加载中\",\r\n\t\t\t\t});\r\n\t\t\t\tmyTrackList(this.params).then((res) => {\r\n\t\t\t\t\tuni.stopPullDownRefresh();\r\n\t\t\t\t\tuni.hideLoading();\r\n\t\t\t\t\tif (res.statusCode == 200) {\r\n\t\t\t\t\t\tres.data.result.records.length &&\r\n\t\t\t\t\t\t\tres.data.result.records.forEach((item) => {\r\n\t\t\t\t\t\t\t\titem.show = false;\r\n\t\t\t\t\t\t\t\titem.checked = false\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tlet data = res.data.result.records;\r\n\t\t\t\t\t\tif (data.total == 0) {\r\n\t\t\t\t\t\t\tthis.whetherEmpty = true;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.trackList.push(...data);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * 删除足迹\r\n\t\t\t */\r\n\t\t\tdelTracks(index,ids) {\r\n\t\t\t\tdeleteHistoryListId(ids || this.trackList[index].goodsId).then((res) => {\r\n\t\t\t\t\tif (res.data.code == 200) {\r\n\t\t\t\t\t\tthis.trackList = [];\r\n\t\t\t\t\t\tthis.params.pageNumber = 1\r\n\t\t\t\t\t\tthis.getList();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: res.data.message,\r\n\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t.submit{\r\n\t\tposition: fixed;\r\n\t\tbottom: 20rpx;\r\n\t\tleft: 10%;\r\n\t\twidth: 80%;\r\n\t\theight: 80rpx;\r\n\t\tcolor: #fff;\r\n\t\tborder-radius: 100px;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tbackground: $light-color;\r\n\t}\r\n\t.myTracks {\r\n\t\twidth: 100%;\r\n\t\tpadding-top: 2rpx;\r\n\t}\r\n\r\n\t.myTracks-title {\r\n\t\twidth: 100%;\r\n\t\theight: 110rpx;\r\n\t\tpadding-left: 20rpx;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: #666;\r\n\t\tfont-weight: bold;\r\n\t\tbackground-color: #fff;\r\n\t\talign-items: center;\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t}\r\n\r\n\t.myTracks-items {\r\n\t\tpadding-top: 2rpx;\r\n\t\talign-items: center;\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t}\r\n\r\n\t.myTracks-item {\r\n\t\twidth: 100%;\r\n\t\theight: 226rpx;\r\n\t\tpadding-left: 20rpx;\r\n\t\tpadding-right: 20rpx;\r\n\t\tmargin-bottom: 2rpx;\r\n\t\t// border-radius: 6/@px;\r\n\t\tbackground-color: #fff;\r\n\t\tposition: relative;\r\n\t\talign-items: center;\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t}\r\n\r\n\t.myTracks-item-img {\r\n\t\tmargin-right: 20rpx;\r\n\t\tborder-radius: 8rpx;\r\n\r\n\t\timage {\r\n\t\t\twidth: 130rpx;\r\n\t\t\theight: 130rpx;\r\n\t\t\tborder-radius: 8rpx;\r\n\t\t}\r\n\t}\r\n\r\n\t.myTracks-item-title {\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.myTracks-item-title-desc {\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: #999;\r\n\t}\r\n\r\n\t.myTracks-item-price {\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $light-color;\r\n\t\tpadding: 10rpx 0 0 0;\r\n\t}\r\n\r\n\t.myTracks-action {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\tposition: fixed;\r\n\t\tbottom: 0;\r\n\t\tleft: 0;\r\n\t\twidth: 100%;\r\n\t\tbackground: #fff;\r\n\t\theight: 75rpx;\r\n\t\talign-items: center;\r\n\t\tpadding: 0 32rpx;\r\n\t}\r\n\r\n\t.myTracks-action-btn {\r\n\t\twidth: 130rpx;\r\n\t\theight: 60rpx;\r\n\t\tline-height: 60rpx;\r\n\t}\r\n\r\n\t.myTracks-divider {\r\n\t\twidth: 100%;\r\n\t\theight: 20rpx;\r\n\t}\r\n\r\n\r\n\r\n\t.myTracks-action-check {\r\n\t\talign-items: center;\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t}\r\n\t.edit{\r\n  \tpadding-right: 32rpx;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/point/myPoint.vue",
    "content": "<template>\r\n  <view class=\"content\">\r\n    <view class=\"portrait-box\">\r\n      <image src=\"/static/pointTrade/point_bg_1.png\" mode=\"\"></image>\r\n      <image class=\"point-img\" src=\"/static/pointTrade/tradehall.png\" />\r\n      <view class=\"position-point\">\r\n       \r\n\r\n      </view>\r\n    </view>\r\n    <u-row class=\"portrait-box2\">\r\n      <u-col span=\"6\" class=\"portrait-box2-col\" :gutter=\"16\">\r\n        <text>累计获得：</text>\r\n        <text class=\"pcolor\">{{ pointData.totalPoint || 0 }}</text>\r\n      </u-col>\r\n      <u-col span=\"6\" class=\"portrait-box2-col\">\r\n        <text>剩余积分：</text>\r\n        <text class=\"pcolor\">{{ pointData.point || 0 }}</text>\r\n      </u-col>\r\n    </u-row>\r\n\r\n    <div class=\"point-list\">\r\n      <view class=\"point-item\" v-for=\"(item, index) in pointList\" :key=\"index\">\r\n        <view>\r\n          <view class=\"point-label\">{{ item.content }}</view>\r\n          <view>{{ item.createTime}}</view>\r\n        </view>\r\n        <view :class=\"[item.pointType == 'INCREASE' ? 'plus' : 'reduce']\"><span>{{item.pointType == \"INCREASE\" ? '+' : '-'}}</span>{{ item.variablePoint }}</view>\r\n      </view>\r\n      <uni-load-more :status=\"count.loadStatus\"></uni-load-more>\r\n    </div>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getPointsData } from \"@/api/members.js\";\r\nimport { getMemberPointSum } from \"@/api/members.js\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      count: {\r\n        loadStatus: \"more\",\r\n      },\r\n      pointList: [], //积分数据集合\r\n      params: {\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n      },\r\n      pointData: {}, //累计获取 未输入 集合\r\n    };\r\n  },\r\n\r\n  onLoad() {\r\n    this.initPointData();\r\n    this.getList();\r\n  },\r\n\r\n  /**\r\n   * 触底加载\r\n   */\r\n  onReachBottom() {\r\n    this.params.pageNumber++;\r\n    this.getList();\r\n  },\r\n  methods: {\r\n    /**\r\n     * 获取积分数据\r\n     */\r\n    getList() {\r\n      let params = this.params;\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      getPointsData(params).then((res) => {\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n        if (res.data.success) {\r\n          let data = res.data.result.records;\r\n          if (data.length < 10) {\r\n            this.$set(this.count, \"loadStatus\", \"noMore\");\r\n            this.pointList.push(...data);\r\n          } else {\r\n            this.pointList.push(...data);\r\n            if (data.length < 10) this.$set(this.count, \"loadStatus\", \"noMore\");\r\n          }\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获得累计积分使用\r\n     */\r\n    initPointData() {\r\n      getMemberPointSum().then((res) => {\r\n        this.pointData = res.data.result;\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.point-list{\r\n  margin-top: 50rpx;\r\n}\r\n.title {\r\n  height: 80rpx;\r\n  text-align: center;\r\n  line-height: 80rpx;\r\n  font-size: 32rpx;\r\n  font-weight: bold;\r\n}\r\n.plus{\r\n  color: $light-color;\r\n  font-weight: bold;\r\n}\r\n.reduce{\r\n  color: $weChat-color;\r\n  font-weight: bold;\r\n}\r\n\r\n.point-item {\r\n  width: 100%;\r\n  height: 130rpx;\r\n  padding: 0 20rpx;\r\n  background: #ffffff;\r\n  font-size: $font-sm;\r\n  border-bottom: 1px solid $border-color-light;\r\n  display: flex;\r\n  justify-content: end;\r\n  align-items: center;\r\n  > view:nth-child(1) {\r\n    flex: 1;\r\n    line-height: 40rpx;\r\n    view {\r\n      color: #666666;\r\n    }\r\n    :last-child {\r\n      color: #999;\r\n    }\r\n  }\r\n\r\n  > view:nth-child(2) {\r\n    width: 100rpx;\r\n    text-align: center;\r\n  }\r\n}\r\n\r\n.portrait-box2 {\r\n  height: 100rpx;\r\n  background: #ffffff;\r\n  border-radius: 0 0 20rpx 20rpx;\r\n  margin: 0 20rpx;\r\n  font-size: 26rpx;\r\n  /deep/ .u-col {\r\n    text-align: center !important;\r\n  }\r\n  /deep/ .u-col:first-child {\r\n    border-right: 1px solid $border-color-light;\r\n  }\r\n  .pcolor {\r\n    color: $light-color;\r\n  }\r\n}\r\n\r\n.content {\r\n  background: #f9f9f9;\r\n}\r\n\r\n.more {\r\n  text-align: right;\r\n  color: $u-tips-color;\r\n  font-size: 24rpx;\r\n  padding-right: 40rpx !important;\r\n}\r\n\r\n.portrait-box {\r\n  background-color: $main-color;\r\n  height: 250rpx;\r\n   background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);\r\n  border-radius: 20rpx 20rpx 0 0;\r\n  margin: 20rpx 20rpx 0;\r\n  position: relative;\r\n  display: flex;\r\n  flex-direction: column;\r\n  justify-content: center;\r\n  align-items: center;\r\n  color: #ffffff;\r\n\r\n  > image:first-child {\r\n    width: 263rpx;\r\n    height: 250rpx;\r\n    position: absolute;\r\n    left: 0;\r\n    bottom: 0;\r\n    transform: rotateY(180deg);\r\n  }\r\n\r\n  .position-point {\r\n    position: absolute;\r\n    right: -2rpx;\r\n    top: 0;\r\n\r\n    .apply-point {\r\n      margin-top: 30rpx;\r\n      text-align: center;\r\n      line-height: 40rpx;\r\n      font-size: $font-sm;\r\n      color: #ffffff;\r\n      width: 142rpx;\r\n      height: 40rpx;\r\n      background: rgba(#ffffff, 0.2);\r\n      border-radius: 20rpx 0px 0px 20rpx;\r\n    }\r\n  }\r\n  .point-img {\r\n    height: 108rpx;\r\n    width: 108rpx;\r\n    margin-bottom: 30rpx;\r\n  }\r\n  .point {\r\n    font-size: 56rpx;\r\n  }\r\n  \r\n}\r\n.point-label{\r\n    font-weight: bold;\r\n    margin-bottom: 10rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/set/editionIntro.vue",
    "content": "\n<template>\n  <view class=\"edition-intro\">\n    <image :src=\"config.logo\" class=\"logo\" />\n    <h1> {{config.name}}</h1>\n    <view class='version'>\n      <!-- #ifdef APP-PLUS -->\n      Version {{localVersion.version}}\n      <!-- #endif -->\n\t  <!-- #ifdef MP-WEIXIN -->\n\t  小程序版本: {{localVersion.version}}  {{ localVersion.envVersion}}\n\t  <!--  #endif -->\n    </view>\n\n    <!-- {{localVersion}} -->\n    <u-cell-group class=\"cell\" :border=\"false\">\n      <!--  #ifdef APP-PLUS -->\n      <u-cell-item v-if=\"IosWhether\" @click=\"checkStar\" title=\"去评分\"></u-cell-item>\n      <u-cell-item title=\"功能介绍\" @click=\"navigateTo('/pages/mine/set/versionFunctionList')\"></u-cell-item>\n      <u-cell-item title=\"检查更新\" @click=\"checkUpdate\"></u-cell-item>\n      <!--  #endif -->\n\t \n      <u-cell-item title=\"证照信息\" @click=\"navigateTo('/pages/mine/help/tips?type=LICENSE_INFORMATION')\"></u-cell-item>\n      <u-cell-item title=\"服务协议\" @click=\"navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')\"></u-cell-item>\n      <u-cell-item title=\"隐私协议\" @click=\"navigateTo('/pages/mine/help/tips?type=PRIVACY_POLICY')\"></u-cell-item>\n      <u-cell-item title=\"关于我们\" :border-bottom=\"false\" @click=\"navigateTo('/pages/mine/help/tips?type=ABOUT')\"></u-cell-item>\n\n    </u-cell-group>\n\n    <view class=\"intro\">\n      <view>{{config.customerServiceMobile ? `客服热线：${config.customerServiceMobile}` :  ``}}</view>\n      <view style=\"margin:20rpx 0 0 0;\">{{config.customerServiceEmail ? `客服邮箱：${config.customerServiceEmail}` :  ``}}</view>\n\n      <view>\n        <view style=\"margin:20rpx 0; color:#003a8c;\" @click=\"navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')\">《{{config.name}}用户协议》</view>\n        <view>CopyRight ©{{config.name}} </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport APPUpdate from \"@/plugins/APPUpdate\";\nimport config from \"@/config/config\";\nimport { getAppVersion } from \"@/api/message.js\";\nexport default {\n  data() {\n    return {\n      config,\n      IosWhether: false, //是否是ios\n      editionHistory: [], //版本历史\n      versionData: {}, //版本信息\n      localVersion: \"\", //当前版本信息\n      params: {\n        pageNumber: 1,\n        pageSize: 5,\n      },\n    };\n  },\n  onLoad() {\n    // #ifdef APP-PLUS\n    const platform = uni.getSystemInfoSync().platform;\n    /**\n     * 获取是否是安卓\n     */\n    if (platform === \"android\") {\n      this.params.type = 0;\n    } else {\n      this.IosWhether = true;\n      this.params.type = 1;\n    }\n    this.getVersion(platform);\n\n    plus.runtime.getProperty(plus.runtime.appid, (inf) => {\n      this.localVersion = {\n        versionCode: inf.version.replace(/\\./g, \"\"),\n        version: inf.version,\n      };\n    });\n    // #endif\n\t\n\t\n\t// #ifdef MP-WEIXIN\n\tconst accountInfo = wx.getAccountInfoSync();\n\tconsole.log(\"===========accountInfo==============\");\n\tconsole.log(accountInfo);\n\tthis.version_number = accountInfo.miniProgram.version // 小程序 版本号\n\tthis.localVersion = {\n\t  versionCode: accountInfo.miniProgram.version.replace(/\\./g, \"\"),\n\t  version: accountInfo.miniProgram.version ,// 小程序 版本号,\n\t  envVersion:accountInfo.miniProgram.envVersion, //判断小程序是开发版本还是release版本\n\t};\n\t// #endif\n  },\n\n  methods: {\n    async getVersion(platform) {\n      let type;\n      platform == \"android\" ? (type = \"ANDROID\") : (type = \"IOS\");\n\n      let res = await getAppVersion(type);\n      if (res.data.success) {\n        this.versionData = res.data.result;\n      }\n    },\n\n    navigateTo(url) {\n      uni.navigateTo({\n        url,\n      });\n    },\n\n    /**\n     * ios点击评分\n     */\n    checkStar() {\n      plus.runtime.launchApplication({\n        action: `itms-apps://itunes.apple.com/app/${config.iosAppId}?action=write-review`,\n      });\n    },\n\n    /**\n     * 检查更新\n     */\n    checkUpdate() {\n      if (\n        this.versionData.version.replace(/\\./g, \"\") <\n        this.localVersion.versionCode\n      ) {\n        APPUpdate();\n      } else {\n        uni.showToast({\n          title: \"当前版本已是最新版\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage {\n  background: #fff !important;\n}\n.cell {\n  width: 90%;\n  margin: 0 auto;\n}\n.edition-intro {\n  min-height: 100vh;\n  background: #fff;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n\n  > h1 {\n    margin: 20rpx 0 20rpx 0;\n    letter-spacing: 2rpx;\n  }\n  > .version {\n    font-size: 30rpx;\n    margin-bottom: 100rpx;\n  }\n}\n.intro {\n  margin-top: 100rpx;\n  font-size: 24rpx;\n  letter-spacing: 2rpx;\n}\n.logo {\n  width: 200rpx;\n  height: 200rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/mine/set/feedBack.vue",
    "content": "<template>\n  <div class=\"feedBack\">\n    <div class=\"feedBack-box\">\n      <h4>猜你想问</h4>\n      <div class=\"feedBack-item\" :class=\"{'active':feedBack.type == item.value }\" @click=\"handleClick(index)\" v-for=\"(item,index) in list\" :key=\"index\">\n        {{item.text}}\n      </div>\n    </div>\n\n    <div class=\"feedBack-box\">\n      <h4>问题反馈 <span style=\"margin-left:10rpx;\" v-if=\"feedBack.type\">@{{ list.find(item=>{return item.value == feedBack.type }).text  }}</span></h4>\n      <u-input class=\"field-input\" height=\"500\" :border-bottom=\"false\" v-model=\"feedBack.context\" type=\"textarea\" placeholder=\"请输入反馈信息\">\n      </u-input>\n    </div>\n\n    <!-- 上传凭证 -->\n    <div class=\"feedBack-box\">\n      <view class=\"opt-view\">\n        <view class=\"img-title\">上传凭证（最多2张）</view>\n        <view class=\"images-view\">\n          <u-upload :header=\" { accessToken: storage.getAccessToken() }\" :action=\"action\" width=\"150\" @on-uploaded=\"onUploaded\" :max-count=\"2\" :show-progress=\"false\"></u-upload>\n        </view>\n      </view>\n    </div>\n\n    <div class=\"feedBack-box\">\n      <h4>手机号</h4>\n      <u-input :border-bottom=\"false\" v-model=\"feedBack.mobile\" placeholder=\"请输入您的手机号\">\n      </u-input>\n    </div>\n\n    <div class=\"submit\" @click=\"submit()\">提交</div>\n  </div>\n\n</template>\n\n<script>\nimport storage from \"@/utils/storage.js\";\nimport config from \"@/config/config\";\nimport { feedBack } from \"@/api/members.js\";\nimport { upload } from \"@/api/common.js\";\nexport default {\n  data() {\n    return {\n      storage,\n      config,\n      feedBack: {\n        type: \"FUNCTION\", //默认反馈问题为 '功能相关'\n      },\n      action: upload, //图片上传地址\n      list: [\n        { text: \"功能相关\", value: \"FUNCTION\" },\n        { text: \"优化反馈\", value: \"OPTIMIZE\" },\n        { text: \"其他\", value: \"OTHER\" },\n      ],\n    };\n  },\n  methods: {\n    // 点击反馈内容\n    handleClick(index) {\n      this.$set(this.feedBack, \"type\", this.list[index].value);\n    },\n\n    //图片上传\n    onUploaded(lists) {\n      let images = [];\n      lists.forEach((item) => {\n        images.push(item.response.result);\n      });\n      this.feedBack.images = images.join(\",\");\n    },\n\n    /**\n     * 提交意见反馈\n     */\n    submit() {\n      if (!this.feedBack.type) {\n        uni.showToast({\n          title: \"请填写反馈类型\",\n          duration: 2000,\n          icon: \"none\",\n        });\n        return false;\n      }\n      if (!this.feedBack.context) {\n        uni.showToast({\n          title: \"请填写反馈信息\",\n          duration: 2000,\n          icon: \"none\",\n        });\n        return false;\n      }\n      if (this.feedBack.mobile && !this.$u.test.mobile(this.feedBack.mobile)) {\n        uni.showToast({\n          title: \"请填写您的正确手机号\",\n          duration: 2000,\n          icon: \"none\",\n        });\n        return false;\n      }\n      /** 提交 */\n      feedBack(this.feedBack).then((res) => {\n        if (res.data.success) {\n          uni.showToast({\n            title: \"提交成功!\",\n            duration: 2000,\n            icon: \"none\",\n          });\n          setTimeout(() => {\n            uni.navigateBack({\n              delta: 1,\n            });\n          }, 500);\n        }\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.submit {\n  text-align: center;\n  background: $light-color;\n  height: 70rpx;\n  line-height: 70rpx;\n  color: #fff;\n  width: 92%;\n  margin-bottom: 100rpx;\n  margin: 0 auto;\n  border-radius: 100px;\n}\n.active{\n  color: $light-color !important;\n  font-weight: bold;\n}\n.feedBack {\n  padding-bottom: 100rpx;\n}\n.feedBack-box {\n  background: #fff;\n  border-radius: 20rpx;\n  padding: 32rpx;\n  margin-bottom: 40rpx;\n}\n/deep/ .u-input__textarea {\n  padding: 12px;\n}\n.feedBack-box:nth-of-type(1) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.feedBack-item {\n  margin: 20rpx 0;\n  font-size: 24rpx;\n  color: #666;\n}\nh4 {\n  font-size: 30rpx;\n}\n.field-input {\n  margin: 20rpx 0;\n  padding: 20rpx 0;\n  background: #fafafa;\n  border-radius: 0.6em;\n}\n</style>\n"
  },
  {
    "path": "pages/mine/set/personMsg.vue",
    "content": "<template>\n  <view class=\"person-msg\">\n    <view class=\"head c-content\" @click=\"changeFace\">\n      <image :src=\"form.face || '/static/missing-face.png'\" mode=\"\"></image>\n      <view>点击修改头像</view>\n    </view>\n    <u-form :model=\"form\" ref=\"uForm\" class=\"form\">\n      <u-form-item label=\"昵称\" label-width=\"150\">\n        <u-input v-model=\"form.nickName\" placeholder=\"请输入昵称\" />\n      </u-form-item>\n      <u-form-item label=\"性别\" label-width=\"150\">\n        <u-radio-group v-model=\"form.sex\" :active-color=\"lightColor\">\n          <u-radio name=\"1\">男</u-radio>\n          <u-radio name=\"0\">女</u-radio>\n        </u-radio-group>\n      </u-form-item>\n\n      <u-form-item label=\"生日\" label-width=\"150\" right-icon=\"arrow-right\">\n        <div style=\"width: 100%;\" @click=\"showBirthday = true\">{{ birthday || '请选择出生日期' }}</div>\n       <u-picker v-model=\"showBirthday\" mode=\"time\" :confirm-color=\"lightColor\" @confirm=\"selectTime\"></u-picker>\n      </u-form-item>\n      <u-form-item label=\"城市\" label-width=\"150\" placeholder=\"请选择城市\" right-icon=\"arrow-right\">\n        <div style=\"width: 100%;\" @click=\"clickRegion\">{{ form.___path || '请选择城市' }}</div>\n      </u-form-item>\n\t  \n\t  <u-form-item label=\"手机号\" label-width=\"150\">\n\t\t<view v-if=\"form.mobile\">\n\t\t\t{{form.mobile}}\n\t\t</view>\n\t\t<view v-else>\n\t\t\t<view class=\"submit\" @click=\"navigateTo(form.username)\">绑定手机号码</view>\n\t\t</view>\n\t  </u-form-item>\n    \n    </u-form>\n    <div class=\"bottom\">\n      <view class=\"submit\" @click=\"submit\">保存</view>\n\t    <view class=\"submit light\" @click=\"quiteLoginOut\">退出登录</view>\n    </div>\n    <m-city :provinceData=\"region\" headTitle=\"区域选择\" ref=\"cityPicker\" @funcValue=\"getPickerParentValue\" pickerSize=\"4\"></m-city>\n  </view>\n</template>\n<script>\nimport { saveUserInfo, getUserInfo } from \"@/api/members.js\";\nimport { upload } from \"@/api/common.js\";\nimport storage from \"@/utils/storage.js\";\nimport uFormItem from \"@/uview-ui/components/u-form-item/u-form-item.vue\";\nimport city from \"@/components/m-city/m-city.vue\";\nexport default {\n  components: { uFormItem, \"m-city\": city },\n  data() {\n    return {\n      lightColor: this.$lightColor, //高亮颜色\n      form: {\n        nickName: storage.getUserInfo().nickName || \"\",\n        birthday: storage.getUserInfo().birthday || \"\",\n        face: storage.getUserInfo().face || \"/static/missing-face.png\", //默认头像\n        regionId: [], //地址Id\n        region: storage.getUserInfo().region || [], //地址\n        sex: storage.getUserInfo().sex, //性别\n        ___path: storage.getUserInfo().region,\n\t\tmobile: storage.getUserInfo().mobile,\n\t\tusername: storage.getUserInfo().username,\n      },\n      birthday: storage.getUserInfo().birthday || \"\", //生日\n      photo: [\n        { text: \"立即拍照\", color: this.$mainColor },\n        { text: \"从相册选择\", color: this.$mainColor },\n      ],\n      region: [\n        //请求城市默认地址\n        {\n          id: \"\",\n          localName: \"请选择\",\n          children: [],\n        },\n      ],\n      showBirthday: false, //显示生日日期\n    };\n  },\n  methods: {\n\t  /**\n\t   * 退出登录\n\t   */\n\t  quiteLoginOut() {\n      this.$options.filters.quiteLoginOut();\n\t  },\n\t  \n    /**\n     * 选择地址回调\n     */\n    getPickerParentValue(e) {\n      this.form.region = [];\n      this.form.regionId = [];\n      let name = \"\";\n\n      e.forEach((item, index) => {\n        if (item.id) {\n          this.form.region.push(item.localName);\n          this.form.regionId.push(item.id);\n          if (index == e.length - 1) {\n            name += item.localName;\n          } else {\n            name += item.localName + \",\";\n          }\n          this.form.___path = name;\n        }\n      });\n    },\n\n    /**\n     * 点击选择地址\n     */\n    clickRegion() {\n      this.$refs.cityPicker.show();\n    },\n\n    /**\n     * 提交保存\n     */\n    submit() {\n      delete this.form.___path;\n      let params = JSON.parse(JSON.stringify(this.form));\n      saveUserInfo(params).then((res) => {\n        if (res.statusCode == 200) {\n          storage.setUserInfo(res.data.result);\n          uni.navigateBack();\n        }\n      });\n    },\n\n    /**\n     * 修改头像\n     */\n    changeFace(index) {\n      uni.chooseImage({\n        success: (chooseImageRes) => {\n          const tempFilePaths = chooseImageRes.tempFilePaths;\n          uni.uploadFile({\n            url: upload,\n            filePath: tempFilePaths[0],\n            name: \"file\",\n            header: {\n              accessToken: storage.getAccessToken(),\n            },\n            success: (uploadFileRes) => {\n              let data = JSON.parse(uploadFileRes.data);\n\n              this.form.face = data.result;\n            },\n          });\n        },\n      });\n    },\n\n    /**\n     * 选择地址\n     */\n    selectRegion(region) {\n      this.$set(\n        this.form,\n        \"address\",\n        `${region.province.label} ${region.city.label} ${region.area.label}`\n      );\n    },\n\n    /**\n     * 选择时间\n     */\n    selectTime(time) {\n      this.form.birthday = `${time.year}-${time.month}-${time.day}`;\n      this.birthday = `${time.year} - ${time.month} - ${time.day}`;\n    },\n\t\n\tnavigateTo(username) {\n\t  uni.navigateTo({\n\t    url: '/pages/mine/set/securityCenter/bindMobile' + '?username=' + username,\n\t  });\n\t},\n  },\n\n  /**\n   * 加载数据\n   */\n  onLoad() {},\n};\n</script>\n<style>\npage{\n  background: #fff;\n}\n</style>\n<style lang=\"scss\" scoped>\n.submit {\n  height: 90rpx;\n  line-height: 90rpx;\n  text-align: center;\n  margin-top: 90rpx;\n\n  width: 100%;\n  margin: 0 auto;\n  color: $main-color;\n  border-radius: 100px;\n}\n.head {\n  height: 260rpx;\n  color: $font-color-light;\n  font-size: $font-sm;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  line-height: 2em;\n  image {\n    width: 144rpx;\n    height: 144rpx;\n    border-radius: 50%;\n  }\n}\n/deep/ .u-form {\n  background-color: #ffffff;\n  padding: 0;\n  margin-top: 30rpx;\n  .u-form-item {\n    padding: 0 20rpx;\n    height: 110rpx;\n    line-height: 110rpx;\n  }\n}\n.form {\n  background-color: #ffffff;\n}\n.bottom{\n  position: fixed;\n  bottom: 40px;\n  display: flex;\n  align-items: center;\n  width: 100%;\n  >.submit{\n    background: $light-color;\n    color: #fff;\n    width: 40%;\n  }\n\n}\n.light{\n  background: rgba($color: $light-color, $alpha: 0.2) !important;\n  color: $light-color !important;\n}\n</style>\n"
  },
  {
    "path": "pages/mine/set/securityCenter/bindMobile.vue",
    "content": "<template>\n\t<view class=\"box\">\n\t\t<view class=\"box-tips\">\n\t\t\t<h2 class='h2'>\n\t\t\t\t绑定手机号码\n\t\t\t</h2>\n\t\t\t<view class=\"verification\"></view>\n\t\t</view>\n\t\t<view class=\"form\">\n\t\t\t<u-form :model=\"codeForm\" ref=\"validateCodeForm\">\n\t\t\t\t<view v-if=\"!validateFlage\">\n\t\t\t\t\t<u-form-item label-width=\"120\" label=\"手机号\" prop=\"mobile\">\n\t\t\t\t\t\t<u-input maxlength=\"11\" v-model=\"codeForm.mobile\" placeholder=\"请输入您的手机号\" />\n\t\t\t\t\t</u-form-item>\n\t\t\t\t\t\n\t\t\t\t\t<u-form-item class=\"sendCode\" label-width=\"120\" prop=\"code\" label=\"验证码\">\n\t\t\t\t\t\t<u-input v-model=\"codeForm.code\" placeholder=\"请输入验证码\" />\n\t\t\t\t\t\t<u-verification-code unique-key=\"page-edit\" :seconds=\"seconds\" @end=\"end\" @start=\"start\"\n\t\t\t\t\t\t\tref=\"uCode\" @change=\"codeChange\"></u-verification-code>\n\t\t\t\t\t\t<view @tap=\"getCode\" class=\"text-tips\">{{ tips }}</view>\n\t\t\t\t\t</u-form-item>\n\n\t\t\t\t\t<view class=\"submit\" @click=\"validatePhone\">绑定</view>\n\t\t\t\t\t<myVerification keep-running @send=\"verification\" class=\"verification\" ref=\"verification\"\n\t\t\t\t\t\tbusiness=\"BIND_MOBILE\" />\n\t\t\t\t</view>\n\t\t\t</u-form>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport {\n\t\tsendMobile,\n\t\tbindMobile\n\t} from \"@/api/login\";\n\n\timport myVerification from \"@/components/verification/verification.vue\"; //验证\n\timport uuid from \"@/utils/uuid.modified.js\";\n\texport default {\n\t\tcomponents: {\n\t\t\tmyVerification,\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tuuid,\n\t\t\t\tvalidateFlage: false, //是否进行了手机号验证\n\t\t\t\tstep: 0, //当前验证步骤\n\t\t\t\tflage: false, //是否验证码验证\n\t\t\t\tcodeForm: {\n\t\t\t\t\tmobile: \"\", //手机号\n\t\t\t\t\tcode: \"\", //验证码\n\t\t\t\t\tusername: \"\", //用户名\n\t\t\t\t},\n\t\t\t\ttips: \"\", //提示\n\t\t\t\tseconds: 69, // 60s等待时间\n\n\t\t\t\t// 验证码登录校验\n\t\t\t\tcodeRules: {\n\t\t\t\t\tmobile: [{\n\t\t\t\t\t\tvalidator: (rule, value, callback) => {\n\t\t\t\t\t\t\treturn this.$u.test.mobile(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmessage: \"手机号码不正确\",\n\t\t\t\t\t\ttrigger: [\"blur\"],\n\t\t\t\t\t}, ],\n\t\t\t\t\tcode: [{\n\t\t\t\t\t\tmin: 4,\n\t\t\t\t\t\tmax: 6,\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tmessage: \"请输入验证码\",\n\t\t\t\t\t\ttrigger: [\"blur\"],\n\t\t\t\t\t}, ],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tonLoad(options) {\n\t\t  this.codeForm.username = options.username;\n\t\t},\n\t\tonReady() {\n\t\t\t// 必须要在onReady生命周期，因为onLoad生命周期组件可能尚未创建完毕\n\t\t\tthis.$refs.validateCodeForm.setRules(this.codeRules);\n\t\t},\n\t\twatch: {\n\t\t\tflage(val) {\n\t\t\t\tif (val) {\n\t\t\t\t\tif (this.$refs.uCode.canGetCode) {\n\t\t\t\t\t\tuni.showLoading({\n\t\t\t\t\t\t\ttitle: \"正在获取验证码\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsendMobile(this.codeForm.mobile, \"BIND_MOBILE\").then((res) => {\n\t\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\n\t\t\t\t\t\t\t// 这里此提示会被this.start()方法中的提示覆盖\n\t\t\t\t\t\t\tif (res.data.success) {\n\t\t\t\t\t\t\t\tthis.$refs.uCode.start();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tuni.showToast({\n\t\t\t\t\t\t\t\t\ttitle: res.data.message,\n\t\t\t\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t\t\t\t\ticon: \"none\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tthis.flage = false;\n\t\t\t\t\t\t\t\tthis.$refs.verification.getCode();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$u.toast(\"请倒计时结束后再发送\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\n\t\tmethods: {\n\t\t\t// 验证码验证\n\t\t\tverification(val) {\n\t\t\t\tthis.flage = val == this.$store.state.verificationKey ? true : false;\n\t\t\t},\n\n\t\t\t// 验证手机号\n\t\t\tvalidatePhone() {\n\t\t\t\tthis.$refs.validateCodeForm.validate((valid) => {\n\t\t\t\t\tif (valid) {\n\t\t\t\t\t\tbindMobile(this.codeForm).then((res) => {\n\t\t\t\t\t\t\tif (res.data.success) {\n\t\t\t\t\t\t\t\tthis.validateFlage = !this.validateFlage;\n\t\t\t\t\t\t\t\t// 登录成功\n\t\t\t\t\t\t\t\tuni.showToast({\n\t\t\t\t\t\t\t\t\ttitle: \"绑定成功!\",\n\t\t\t\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t\t\t\t\ticon: \"none\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tuni.navigateBack({\n\t\t\t\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tcodeChange(text) {\n\t\t\t\tthis.tips = text;\n\t\t\t},\n\t\t\tend() {\n\t\t\t\t\n\t\t\t\tthis.flage = false;\n\t\t\t\t\tthis.$refs.verification.getCode()\n\t\t\t},\n\n\t\t\t/**获取验证码 */\n\t\t\tgetCode() {\n\t\t\t\tif (this.tips == \"重新获取\") {\n\t\t\t\t\tthis.$refs.verification.error(); //发送\n\t\t\t\t}\n\t\t\t\tif (!this.$u.test.mobile(this.codeForm.mobile)) {\n\t\t\t\t\tuni.showToast({\n\t\t\t\t\t\ttitle: \"请输入正确手机号\",\n\t\t\t\t\t\ticon: \"none\",\n\t\t\t\t\t});\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!this.flage) {\n\t\t\t\t\tthis.$refs.verification.error(); //发送\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tstart() {\n\t\t\t\tthis.$u.toast(\"验证码已发送\");\n\t\t\t\tthis.flage = true;\n\n\t\t\t\tthis.$refs.verification.hide();\n\t\t\t},\n\t\t},\n\t};\n</script>\n<style lang=\"scss\" scoped>\n\t@import url(\"@/pages/passport/login.scss\");\n\n\t/deep/ .u-form-item {\n\t\tmargin: 40rpx 0;\n\t}\n\n\t.sendCode {\n\t\t/deep/ .u-form-item--right__content__slot {\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t.h2 {\n\t\tfont-size: 40rpx;\n\t\tfont-weight: bold;\n\t}\n\n\tpage {\n\t\tbackground: #fff;\n\t}\n\n\t.box {\n\t\tpadding: 80rpx 0;\n\t\tborder-radius: 20rpx;\n\t}\n\n\t.submit {\n\t\tbackground: $light-color;\n\t}\n\n\t.box-tips {\n\t\tmargin: 0 72rpx;\n\t}\n\n\t.verification {\n\t\tfont-size: 24rpx;\n\t\tcolor: #999;\n\t\tmargin-top: 10rpx;\n\t}\n</style>\n"
  },
  {
    "path": "pages/mine/set/securityCenter/editLoginPassword.vue",
    "content": "<template>\n\t<view class=\"box\">\n\t\t<view class=\"box-tips\">\n\t\t\t<h2 class='h2'>\n\t\t\t\t{{verificationTitle.title}}\n\t\t\t</h2>\n\t\t\t<view class=\"verification\">{{verificationTitle.desc}}</view>\n\t\t</view>\n\t\t<view class=\"form\">\n\t\t\t<u-form :model=\"codeForm\" ref=\"validateCodeForm\">\n\t\t\t\t<u-form-item label-width=\"120\" label=\"旧密码\">\n\t\t\t\t\t\t<u-input type=\"password\" v-model=\"oldPassword\" placeholder=\"请输入您的旧密码\" />\n\t\t\t\t\t</u-form-item>\n\n\t\t\t\t\t<u-form-item label-width=\"120\" label=\"密码\">\n\t\t\t\t\t\t<u-input type=\"password\" v-model=\"password\" placeholder=\"请输入您的密码\" />\n\t\t\t\t\t</u-form-item>\n\n\t\t\t\t\t<u-form-item label-width=\"120\" label=\"确认密码\">\n\t\t\t\t\t\t<u-input type=\"password\" v-model=\"newPassword\" placeholder=\"请再次输入您的密码\" />\n\t\t\t\t\t</u-form-item>\n\n\t\t\t\t\t<view class=\"submit\" @click=\"updatePassword\">修改密码</view>\n\t\t\t</u-form>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport {\n\t\tresetByMobile,\n\t\tmodifyPass\n\t} from \"@/api/login\";\n\n\timport {\n\t\tmd5\n\t} from \"@/utils/md5.js\"; // md5\n\timport myVerification from \"@/components/verification/verification.vue\"; //验证\n\timport uuid from \"@/utils/uuid.modified.js\";\n\texport default {\n\t\tcomponents: {\n\t\t\tmyVerification,\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tuuid,\n\t\t\t\tvalidateFlage: false, //是否进行了手机号验证\n\t\t\t\tverificationTitle: {\n\t\t\t\t\ttitle: \"修改密码\",\n\t\t\t\t\tdesc: \"请验证并输入密码\",\n\t\t\t\t},\n\t\t\t\tstep: 0, //当前验证步骤\n\t\t\t\tflage: false, //是否验证码验证\n\n\t\t\t\tcodeForm: {\n\t\t\t\t\tmobile: \"\", //手机号\n\t\t\t\t\tcode: \"\", //验证码\n\t\t\t\t},\n\t\t\t\tnewPassword: \"\", //新密码\n\t\t\t\tpassword: \"\", //密码\n\t\t\t\toldPassword: '', //旧密码\n\t\t\t\ttips: \"\", //提示\n\t\t\t\tseconds: 69, // 60s等待时间\n\n\t\t\t\t// 验证码登录校验\n\t\t\t\tcodeRules: {\n\t\t\t\t\tmobile: [{\n\t\t\t\t\t\tvalidator: (rule, value, callback) => {\n\t\t\t\t\t\t\treturn this.$u.test.mobile(value);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmessage: \"手机号码不正确\",\n\t\t\t\t\t\ttrigger: [\"blur\"],\n\t\t\t\t\t}, ],\n\t\t\t\t\tcode: [{\n\t\t\t\t\t\tmin: 4,\n\t\t\t\t\t\tmax: 6,\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tmessage: \"请输入验证码\",\n\t\t\t\t\t\ttrigger: [\"blur\"],\n\t\t\t\t\t}, ],\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tonReady() {\n\t\t\t// 必须要在onReady生命周期，因为onLoad生命周期组件可能尚未创建完毕\n\t\t\tthis.$refs.validateCodeForm.setRules(this.codeRules);\n\t\t},\n\n\t\tmethods: {\n\t\t\t// 修改密码\n\t\t\tupdatePassword() {\n\t\t\t\tif(this.password !== this.newPassword){\n\t\t\t\t\tuni.showToast({\n\t\t\t\t\t\ttitle: \"两次输入密码不一致!\",\n\t\t\t\t\t\ticon: \"none\",\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmodifyPass({\n\t\t\t\t\tpassword: md5(this.oldPassword),\n\t\t\t\t\tnewPassword: md5(this.newPassword),\n\t\t\t\t}).then((res) => {\n\t\t\t\t\tif (res.data.success) {\n\t\t\t\t\t\tuni.showToast({\n\t\t\t\t\t\t\ttitle: \"修改成功!\",\n\t\t\t\t\t\t\tduration: 2000,\n\t\t\t\t\t\t\ticon: \"none\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tuni.navigateBack({\n\t\t\t\t\t\t\t\tdelta: 1,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t};\n</script>\n<style lang=\"scss\" scoped>\n\t@import url(\"@/pages/passport/login.scss\");\n\n\t/deep/ .u-form-item {\n\t\tmargin: 40rpx 0;\n\t}\n\n\t.sendCode {\n\t\t/deep/ .u-form-item--right__content__slot {\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t.h2 {\n\t\tfont-size: 40rpx;\n\t\tfont-weight: bold;\n\t}\n\n\tpage {\n\t\tbackground: #fff;\n\t}\n\n\t.box {\n\t\tpadding: 80rpx 0;\n\t\tborder-radius: 20rpx;\n\t}\n\n\t.submit {\n\t\tbackground: $light-color;\n\t}\n\n\t.box-tips {\n\t\tmargin: 0 72rpx;\n\t}\n\n\t.verification {\n\t\tfont-size: 24rpx;\n\t\tcolor: #999;\n\t\tmargin-top: 10rpx;\n\t}\n</style>\n"
  },
  {
    "path": "pages/mine/set/securityCenter/editPassword.vue",
    "content": "<template>\r\n\t<view class=\"box\">\r\n\t\t<view class=\"box-tips\">\r\n\t\t\t<h2 class='h2'>\r\n\t\t\t\t{{verificationTitle[validateFlage==false ? 0 : 1].title}}\r\n\t\t\t</h2>\r\n\t\t\t<view class=\"verification\">{{verificationTitle[step].desc}}</view>\r\n\t\t</view>\r\n\t\t<view class=\"form\">\r\n\t\t\t<u-form :model=\"codeForm\" ref=\"validateCodeForm\">\r\n\t\t\t\t<view v-if=\"!validateFlage\">\r\n\t\t\t\t\t<u-form-item label-width=\"120\" label=\"手机号\" prop=\"mobile\">\r\n\t\t\t\t\t\t<u-input maxlength=\"11\" v-model=\"codeForm.mobile\" placeholder=\"请输入您的手机号\" />\r\n\t\t\t\t\t</u-form-item>\r\n\r\n\t\t\t\t\t<u-form-item class=\"sendCode\" label-width=\"120\" prop=\"code\" label=\"验证码\">\r\n\t\t\t\t\t\t<u-input v-model=\"codeForm.code\" placeholder=\"请输入验证码\" />\r\n\t\t\t\t\t\t<u-verification-code unique-key=\"page-edit\" :seconds=\"seconds\" @end=\"end\" @start=\"start\"\r\n\t\t\t\t\t\t\tref=\"uCode\" @change=\"codeChange\"></u-verification-code>\r\n\t\t\t\t\t\t<view @tap=\"getCode\" class=\"text-tips\">{{ tips }}</view>\r\n\t\t\t\t\t</u-form-item>\r\n\r\n\t\t\t\t\t<view class=\"submit\" @click=\"validatePhone\">验证</view>\r\n\t\t\t\t\t<myVerification keep-running @send=\"verification\" class=\"verification\" ref=\"verification\"\r\n\t\t\t\t\t\tbusiness=\"FIND_USER\" />\r\n\t\t\t\t</view>\r\n\t\t\t\t<view v-if=\"validateFlage\">\r\n\t\t\t\t\t<u-form-item label-width=\"120\" label=\"密码\">\r\n\t\t\t\t\t\t<u-input type=\"password\" v-model=\"password\" placeholder=\"请输入您的密码\" />\r\n\t\t\t\t\t</u-form-item>\r\n\r\n\t\t\t\t\t<u-form-item label-width=\"120\" label=\"确认密码\">\r\n\t\t\t\t\t\t<u-input type=\"password\" v-model=\"newPassword\" placeholder=\"请再次输入您的密码\" />\r\n\t\t\t\t\t</u-form-item>\r\n\r\n\t\t\t\t\t<view class=\"submit\" @click=\"updatePassword\">修改密码</view>\r\n\t\t\t\t</view>\r\n\t\t\t</u-form>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tsendMobile,\r\n\t\tresetByMobile,\r\n\t\tresetPassword\r\n\t} from \"@/api/login\";\r\n\r\n\timport {\r\n\t\tmd5\r\n\t} from \"@/utils/md5.js\"; // md5\r\n\timport myVerification from \"@/components/verification/verification.vue\"; //验证\r\n\timport uuid from \"@/utils/uuid.modified.js\";\r\n\texport default {\r\n\t\tcomponents: {\r\n\t\t\tmyVerification,\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tuuid,\r\n\t\t\t\tvalidateFlage: false, //是否进行了手机号验证\r\n\t\t\t\tverificationTitle: [{\r\n\t\t\t\t\t\ttitle: \"安全验证\",\r\n\t\t\t\t\t\tdesc: \"请输入当前手机号进行安全验证\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttitle: \"修改密码\",\r\n\t\t\t\t\t\tdesc: \"请输入新密码\",\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tstep: 0, //当前验证步骤\r\n\t\t\t\tflage: false, //是否验证码验证\r\n\r\n\t\t\t\tcodeForm: {\r\n\t\t\t\t\tmobile: \"\", //手机号\r\n\t\t\t\t\tcode: \"\", //验证码\r\n\t\t\t\t},\r\n\t\t\t\tnewPassword: \"\", //新密码\r\n\t\t\t\tpassword: \"\", //密码\r\n\t\t\t\ttips: \"\", //提示\r\n\t\t\t\tseconds: 69, // 60s等待时间\r\n\r\n\t\t\t\t// 验证码登录校验\r\n\t\t\t\tcodeRules: {\r\n\t\t\t\t\tmobile: [{\r\n\t\t\t\t\t\tvalidator: (rule, value, callback) => {\r\n\t\t\t\t\t\t\treturn this.$u.test.mobile(value);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tmessage: \"手机号码不正确\",\r\n\t\t\t\t\t\ttrigger: [\"blur\"],\r\n\t\t\t\t\t}, ],\r\n\t\t\t\t\tcode: [{\r\n\t\t\t\t\t\tmin: 4,\r\n\t\t\t\t\t\tmax: 6,\r\n\t\t\t\t\t\trequired: true,\r\n\t\t\t\t\t\tmessage: \"请输入验证码\",\r\n\t\t\t\t\t\ttrigger: [\"blur\"],\r\n\t\t\t\t\t}, ],\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t},\r\n\t\tonReady() {\r\n\t\t\t// 必须要在onReady生命周期，因为onLoad生命周期组件可能尚未创建完毕\r\n\t\t\tthis.$refs.validateCodeForm.setRules(this.codeRules);\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tflage(val) {\r\n\t\t\t\tif (val) {\r\n\r\n\t\t\t\t\tif (this.$refs.uCode.canGetCode) {\r\n\t\t\t\t\t\tuni.showLoading({\r\n\t\t\t\t\t\t\ttitle: \"正在获取验证码\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tsendMobile(this.codeForm.mobile, \"FIND_USER\").then((res) => {\r\n\t\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\t\t\t// 这里此提示会被this.start()方法中的提示覆盖\r\n\t\t\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\t\t\tthis.$refs.uCode.start();\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: res.data.message,\r\n\t\t\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\tthis.flage = false;\r\n\t\t\t\t\t\t\t\tthis.$refs.verification.getCode();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.$u.toast(\"请倒计时结束后再发送\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\r\n\t\tmethods: {\r\n\t\t\t// 修改密码\r\n\t\t\tupdatePassword() {\r\n\t\t\t\tif(this.password !== this.newPassword){\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"两次输入密码不一致!\",\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tresetPassword({\r\n\t\t\t\t\tpassword: md5(this.password),\r\n\t\t\t\t}).then((res) => {\r\n\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"修改成功!\",\r\n\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tuni.navigateBack({\r\n\t\t\t\t\t\t\t\tdelta: 1,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}, 1000);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t// 验证码验证\r\n\t\t\tverification(val) {\r\n\t\t\t\tthis.flage = val == this.$store.state.verificationKey ? true : false;\r\n\t\t\t},\r\n\r\n\t\t\t// 验证手机号\r\n\t\t\tvalidatePhone() {\r\n\t\t\t\tthis.$refs.validateCodeForm.validate((valid) => {\r\n\t\t\t\t\tif (valid) {\r\n\t\t\t\t\t\tresetByMobile(this.codeForm).then((res) => {\r\n\t\t\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\t\t\tthis.validateFlage = !this.validateFlage;\r\n\t\t\t\t\t\t\t\t// 登录成功\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: \"验证成功!\",\r\n\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\tcodeChange(text) {\r\n\t\t\t\tthis.tips = text;\r\n\t\t\t},\r\n\t\t\tend() {\r\n\t\t\t\t\r\n\t\t\t\tthis.flage = false;\r\n\t\t\t\t\tthis.$refs.verification.getCode()\r\n\t\t\t},\r\n\r\n\t\t\t/**判断是否是当前用户的手机号 */\r\n\t\t\tisUserPhone() {\r\n\t\t\t\tlet flage = false;\r\n\t\t\t\tlet user = this.$options.filters.isLogin();\r\n\t\t\t\tif (user.mobile != this.codeForm.mobile) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"请输入当前绑定手机号\",\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\tflage = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tflage = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn flage;\r\n\t\t\t},\r\n\t\t\t/**获取验证码 */\r\n\t\t\tgetCode() {\r\n\t\t\t\tif (this.isUserPhone()) {\r\n\t\t\t\t\tif (this.tips == \"重新获取\") {\r\n\t\t\t\t\t\tthis.$refs.verification.error(); //发送\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!this.$u.test.mobile(this.codeForm.mobile)) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"请输入正确手机号\",\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!this.flage) {\r\n\t\t\t\t\t\tthis.$refs.verification.error(); //发送\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tstart() {\r\n\t\t\t\tthis.$u.toast(\"验证码已发送\");\r\n\t\t\t\tthis.flage = true;\r\n\r\n\t\t\t\tthis.$refs.verification.hide();\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n\t@import url(\"@/pages/passport/login.scss\");\r\n\r\n\t/deep/ .u-form-item {\r\n\t\tmargin: 40rpx 0;\r\n\t}\r\n\r\n\t.sendCode {\r\n\t\t/deep/ .u-form-item--right__content__slot {\r\n\t\t\tdisplay: flex;\r\n\t\t}\r\n\t}\r\n\r\n\t.h2 {\r\n\t\tfont-size: 40rpx;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\tpage {\r\n\t\tbackground: #fff;\r\n\t}\r\n\r\n\t.box {\r\n\t\tpadding: 80rpx 0;\r\n\t\tborder-radius: 20rpx;\r\n\t}\r\n\r\n\t.submit {\r\n\t\tbackground: $light-color;\r\n\t}\r\n\r\n\t.box-tips {\r\n\t\tmargin: 0 72rpx;\r\n\t}\r\n\r\n\t.verification {\r\n\t\tfont-size: 24rpx;\r\n\t\tcolor: #999;\r\n\t\tmargin-top: 10rpx;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/set/securityCenter/faceLogin.vue",
    "content": "// TODO 第一版本暂无此功能 后续优化以及更新\n<template>\n  <view class=\"face-login\">\n    <u-cell-group>\n      <u-cell-item class=\"border-top\" :arrow=\"false\" title=\"面容登录\">\n        <u-switch slot=\"right-icon\" @change=\"faceSwitchChange\" active-color=\"#1abc9c\" size=\"40\" v-model=\"checked\"></u-switch>\n      </u-cell-item>\n    </u-cell-group>\n    <view class=\"describe\">开启后可使用面容认证完成快捷登录，设置仅对本机生效。</view>\n  </view>\n</template>\n\n<script>\nimport storage from \"@/utils/storage.js\";\nimport { setBiolofy } from \"@/api/passport.js\";\n\nexport default {\n  data() {\n    return {\n      lightColor: this.$lightColor,\n      checked: true,\n    };\n  },\n  methods: {\n    faceSwitchChange(value) {\n      if (value === true) {\n        const res = uni.getSystemInfoSync();\n        plus.device.getInfo({\n          success: function (e) {\n            let params = {\n              mobile_type: res.model,\n              secret_key: e.uuid,\n            };\n            setBiolofy(params).then((res) => {\n              if (res.statusCode === 200) {\n                storage.setFaceLogin(true);\n              }\n            });\n          },\n          fail: function (e) {\n            //plus.nativeUI.toast('获取设备信息错误：' + JSON.stringify(e));\n            console.error(\"getDeviceInfo failed: \" + JSON.stringify(e));\n          },\n        });\n      } else {\n        storage.setFaceLogin(false);\n      }\n    },\n  },\n  onLoad() {\n    // #ifdef APP-PLUS\n    uni.checkIsSupportSoterAuthentication({\n      success(res) {\n        if (!res.supportMode.find((e) => e === \"facial\")) {\n          plus.nativeUI.toast(\"此设备不支持面部识别\");\n          uni.navigateBack();\n        }\n        uni.checkIsSoterEnrolledInDevice({\n          checkAuthMode: \"facial\",\n          success(_res) {\n            if (!_res.isEnrolled) {\n              plus.nativeUI.toast(\"此设备未录入面部信息\");\n              uni.navigateBack();\n            }\n          },\n          fail(_err) {\n            // plus.nativeUI.toast(JSON.stringify(_err));\n            uni.navigateBack();\n          },\n        });\n      },\n      fail(err) {\n        // plus.nativeUI.toast(JSON.stringify(err));\n        uni.navigateBack();\n      },\n    });\n    this.checked = storage.getFaceLogin() || false;\n    // #endif\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.face-login {\n}\n</style>\n"
  },
  {
    "path": "pages/mine/set/securityCenter/fingerLogin.vue",
    "content": "// TODO 第一版本暂无此功能 后续优化以及更新\n<template>\n  <view class=\"finger\">\n    <u-cell-group>\n      <u-cell-item class=\"border-top\" :arrow=\"false\" title=\"指纹登录\">\n        <u-switch slot=\"right-icon\" @change=\"fingerSwitchChange\" :active-color=\"lightColor\" size=\"40\" v-model=\"checked\"></u-switch>\n      </u-cell-item>\n    </u-cell-group>\n    <view class=\"describe\">开启后可使用指纹认证完成快捷登录，设置仅对本机生效。如需修改指纹，请在系统设置中操作。</view>\n  </view>\n</template>\n\n<script>\nimport storage from \"@/utils/storage.js\";\nimport { setBiolofy } from \"@/api/passport.js\";\n\nexport default {\n  data() {\n    return {\n      lightColor: this.$lightColor,\n      checked: false,\n    };\n  },\n  methods: {\n    fingerSwitchChange(value) {\n      if (value === true) {\n        const res = uni.getSystemInfoSync();\n        plus.device.getInfo({\n          success: function (e) {\n            let params = {\n              mobile_type: res.model,\n              secret_key: e.uuid,\n            };\n            setBiolofy(params).then((res) => {\n              if (res.statusCode === 200) {\n                storage.setFingerLogin(true);\n              }\n            });\n          },\n          fail: function (e) {\n            console.error(\"getDeviceInfo failed: \" + JSON.stringify(e));\n          },\n        });\n      } else {\n        storage.setFingerLogin(false);\n      }\n    },\n  },\n  onLoad() {\n    // #ifdef APP-PLUS\n    if (!plus.fingerprint.isSupport()) {\n      plus.nativeUI.toast(\"此设备不支持指纹识别\");\n      uni.navigateBack();\n    }\n    if (!plus.fingerprint.isKeyguardSecure()) {\n      plus.nativeUI.toast(\"此设备未设置密码锁屏\");\n      uni.navigateBack();\n    }\n    if (!plus.fingerprint.isEnrolledFingerprints()) {\n      plus.nativeUI.toast(\"此设备未录入指纹\");\n      uni.navigateBack();\n    }\n    this.checked = storage.getFingerLogin() || false;\n    // #endif\n  },\n};\n</script>\n\n<style scoped lang=\"scss\">\n</style>\n"
  },
  {
    "path": "pages/mine/set/securityCenter/securityCenter.vue",
    "content": "<template>\n  <view class=\"securityCenter\">\n    <u-cell-group>\n      <u-cell-item title=\"修改密码\" @click=\"navigateTo('/pages/mine/set/securityCenter/updatePwdTab')\"></u-cell-item>\n      <u-cell-item title=\"注销账户\" @click=\"zhuxiao\"></u-cell-item>\n    </u-cell-group>\n  </view>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      mobile: \"\", //存储手机号\n    };\n  },\n\n  methods: {\n    zhuxiao(){\n\n      uni.showModal({\n        title: \"警告\",\n        content: \"您确定要注销当前账号吗？\",\n        confirmText: \"确定注销\",\n        confirmColor: \"#FF0000\",\n        cancelText: \"取消\",\n        success: (res) => {\n          if (res.confirm) {\n            uni.showModal({\n              title: \"谨慎操作\",\n              content: \"再次向您确认，您确定要注销当前账号吗？\",\n              confirmText: \"坚持注销\",\n              confirmColor: \"#FF0000\",\n              cancelText: \"取消\",\n              success: (res) => {\n                if (res.confirm) {\n                  uni.showToast({\n                    title: \"您的注销申请已经提交，待管理员审核后。会自动注销当前账号\",\n                    duration: 10000,\n                  });\n                }\n              },\n            });\n          }\n        },\n      });\n    },\n    navigateTo(url) {\n      uni.navigateTo({\n        url: url,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.securityCenter {\n  .u-cell {\n    line-height: normal;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/mine/set/securityCenter/updatePwdTab.vue",
    "content": "<template>\n  <view class=\"securityCenter\">\n    <u-cell-group>\n      <u-cell-item title=\"验证密码\" @click=\"navigateTo('/pages/mine/set/securityCenter/editLoginPassword')\"></u-cell-item>\n      <u-cell-item title=\"验证手机号\" @click=\"navigateTo('/pages/mine/set/securityCenter/editPassword')\"></u-cell-item>\n    </u-cell-group>\n  </view>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      mobile: \"\", //存储手机号\n    };\n  },\n\n  methods: {\n    navigateTo(url) {\n      uni.navigateTo({\n        url: url,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.securityCenter {\n  .u-cell {\n    line-height: normal;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/mine/set/setUp.vue",
    "content": "<template>\r\n  <view class=\"container\">\r\n    <view class=\"person\" @click=\"checkUserInfo()\">\r\n      <u-image width=140 height=\"140\" shape=\"circle\" :src=\"userInfo.face || userImage\" mode=\"\">\r\n      </u-image>\r\n      <view class=\"user-name\">\r\n        {{ userInfo.id ? userInfo.nickName || '' : '暂未登录'  }}\r\n      </view>\r\n      <u-icon color=\"#ccc\" name=\"arrow-right\"></u-icon>\r\n    </view>\r\n    <!-- #ifdef MP-WEIXIN -->\r\n    <view style=\"height: 20rpx; width: 100%\"></view>\r\n    <!-- #endif -->\r\n    <u-cell-group :border=\"false\">\r\n      <!-- #ifdef APP-PLUS -->\r\n      <u-cell-item title=\"清除缓存\" :value=\"fileSizeString\" @click=\"clearCache\"></u-cell-item>\r\n      <!-- #endif -->\r\n      <!-- #ifndef MP-WEIXIN -->\r\n      <u-cell-item title=\"安全中心\" @click=\"navigateTo('/pages/mine/set/securityCenter/securityCenter')\"></u-cell-item>\r\n      <!-- #endif -->\r\n\t  <u-cell-item title=\"用户注销\" v-if=\"userInfo.id\" @click=\"logoff\"></u-cell-item>\r\n      <u-cell-item title=\"意见反馈\" @click=\"navigateTo('/pages/mine/set/feedBack')\"></u-cell-item>\r\n      <!-- #ifndef H5 -->\r\n      <!-- #endif -->\r\n      <u-cell-item :title=\"`关于${config.name}`\" @click=\"navigateTo('/pages/mine/set/editionIntro')\"></u-cell-item>\r\n    </u-cell-group>\r\n    <view class=\"submit\" v-if=\"userInfo.id\" @click=\"quiteLoginOut\">退出登录</view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport config from \"@/config/config\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      config,\r\n      userImage:config.defaultUserPhoto,\r\n      isCertificate: false,\r\n      userInfo: {},\r\n      fileSizeString: \"0B\",\r\n    };\r\n  },\r\n\r\n  methods: {\r\n    navigateTo(url) {\r\n      if (url == \"/pages/set/securityCenter/securityCenter\") {\r\n        url += `?mobile=${this.userInfo.mobile}`;\r\n      }\r\n      uni.navigateTo({\r\n        url: url,\r\n      });\r\n    },\r\n     /**\r\n\t   * 退出登录\r\n\t   */\r\n\t  quiteLoginOut() {\r\n      this.$options.filters.quiteLoginOut();\r\n\t  },\r\n  \r\n\t/**\r\n\t * 用户注销\r\n\t */\r\n\tlogoff(){\r\n\t\tthis.$options.filters.logoff();\r\n\t},\r\n\r\n    /**\r\n     * 读取当前缓存\r\n     */\r\n    getCacheSize() {\r\n      //获取缓存数据\r\n      let that = this;\r\n      plus.cache.calculate(function (size) {\r\n        let sizeCache = parseInt(size);\r\n        if (sizeCache == 0) {\r\n          that.fileSizeString = \"0B\";\r\n        } else if (sizeCache < 1024) {\r\n          that.fileSizeString = sizeCache + \"B\";\r\n        } else if (sizeCache < 1048576) {\r\n          that.fileSizeString = (sizeCache / 1024).toFixed(2) + \"KB\";\r\n        } else if (sizeCache < 1073741824) {\r\n          that.fileSizeString = (sizeCache / 1048576).toFixed(2) + \"MB\";\r\n        } else {\r\n          that.fileSizeString = (sizeCache / 1073741824).toFixed(2) + \"GB\";\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 点击用户详情\r\n     * 判断当前是否进入用户中心\r\n     */\r\n    checkUserInfo() {\r\n      if (this.$options.filters.isLogin(\"auth\")) {\r\n        this.navigateTo(\"/pages/mine/set/personMsg\");\r\n      } else {\r\n        this.$options.filters.tipsToLogin();\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 清除当前设备缓存\r\n     */\r\n    clearCache() {\r\n      //清理缓存\r\n      let that = this;\r\n      let os = plus.os.name;\r\n      if (os == \"Android\") {\r\n        let main = plus.android.runtimeMainActivity();\r\n        let sdRoot = main.getCacheDir();\r\n        let files = plus.android.invoke(sdRoot, \"listFiles\");\r\n        let len = files.length;\r\n        for (let i = 0; i < len; i++) {\r\n          let filePath = \"\" + files[i]; // 没有找到合适的方法获取路径，这样写可以转成文件路径\r\n          plus.io.resolveLocalFileSystemURL(\r\n            filePath,\r\n            function (entry) {\r\n              if (entry.isDirectory) {\r\n                entry.removeRecursively(\r\n                  function (entry) {\r\n                    //递归删除其下的所有文件及子目录\r\n                    uni.showToast({\r\n                      title: \"缓存清理完成\",\r\n                      duration: 2000,\r\n                      icon: \"none\",\r\n                    });\r\n                    that.getCacheSize(); // 重新计算缓存\r\n                  },\r\n                  function (e) {}\r\n                );\r\n              } else {\r\n                entry.remove();\r\n              }\r\n            },\r\n            function (e) {\r\n              uni.showToast({\r\n                title: \"文件路径读取失败\",\r\n                duration: 2000,\r\n                icon: \"none\",\r\n              });\r\n            }\r\n          );\r\n        }\r\n      } else {\r\n        // ios\r\n        plus.cache.clear(function () {\r\n          uni.showToast({\r\n            title: \"缓存清理完成\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n          that.getCacheSize();\r\n        });\r\n      }\r\n    },\r\n  },\r\n  onShow() {\r\n    this.userInfo = this.$options.filters.isLogin();\r\n    // #ifdef APP-PLUS\r\n    this.getCacheSize();\r\n    // #endif\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang='scss' scoped>\r\n.submit {\r\n  height: 90rpx;\r\n  line-height: 90rpx;\r\n  text-align: center;\r\n  margin-top: 90rpx;\r\n  background: #fff;\r\n  width: 100%;\r\n  margin: 0 auto;\r\n  color: $main-color;\r\n}\r\n.person {\r\n  height: 208rpx;\r\n  display: flex;\r\n  padding: 0 20rpx;\r\n  font-size: $font-base;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  margin-bottom: 20rpx;\r\n  .user-name {\r\n    width: 500rpx;\r\n    overflow: hidden;\r\n\r\n    text-overflow: ellipsis;\r\n\r\n    white-space: nowrap;\r\n    margin-left: 30rpx;\r\n    line-height: 2em;\r\n    font-size: 34rpx;\r\n  }\r\n}\r\n.u-cell {\r\n  height: 110rpx;\r\n  /* line-height: 110rpx; */\r\n  padding: 0 20rpx;\r\n  align-items: center;\r\n  color: #333333;\r\n}\r\n\r\n/deep/ .u-cell__value {\r\n  color: #cccccc !important;\r\n}\r\n\r\n/deep/ .u-cell__right-icon-wrap {\r\n  color: #cccccc !important;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/mine/set/versionFunctionList.vue",
    "content": "<template>\n  <div>\n    <u-collapse v-if=\"versionData.length !=0\">\n      <u-collapse-item class=\"version-item\" :title=\"item.versionName\" v-for=\"(item, index) in versionData\" :key=\"index\">\n        <!-- {{item.body}} -->\n\n        {{item.content}}\n      </u-collapse-item>\n\n    </u-collapse>\n    <u-empty class=\"empty\" v-else text=\"暂无版本信息\" mode=\"list\"></u-empty>\n  </div>\n</template>\n\n<script>\nimport { getAppVersionList } from \"@/api/message\";\nexport default {\n  data() {\n    return {\n      versionData: [],\n      appType: \"\",\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n      },\n    };\n  },\n  mounted() {\n    const platform = uni.getSystemInfoSync().platform;\n    /**\n     * 获取是否是安卓\n     */\n    if (platform === \"android\") {\n      this.appType = \"ANDROID\";\n    } else {\n      this.IosWhether = true;\n      this.appType = \"IOS\";\n    }\n    this.getVersionList();\n  },\n  methods: {\n    async getVersionList() {\n      let res = await getAppVersionList(this.appType, this.params);\n      if (res.data.success) {\n        this.versionData = res.data.result.records;\n      }\n    },\n  },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.version-item{\n    padding: 10rpx;\n    background: #fff;\n}\n\n</style>"
  },
  {
    "path": "pages/mine/signIn.vue",
    "content": "<template>\r\n  <view class=\"sign-in\">\r\n    <view class=\"date-card\">\r\n      <div class=\"box\">\r\n        <div class=\"circle-box\">\r\n          <div class=\"cricle\" @click=\"signIn()\">\r\n            <span v-if=\"!ifSign\" :class=\"{ active: signFlag || ifSign }\">签到</span>\r\n            <span v-else :class=\"{ active: signFlag || ifSign }\"\r\n              :style=\"ifSign ? 'transform: rotateY(0deg);' : ''\">已签</span>\r\n          </div>\r\n        </div>\r\n        <text class=\"tips\">坚持每天连续签到可以获多重奖励哦</text>\r\n      </div>\r\n    </view>\r\n    <div class=\"date-card\">\r\n      <view class=\"date-con\">\r\n        <view class=\"date-tit\">\r\n          <div class=\"current-month\">\r\n            <div class=\"day\">每日记录<span> ({{ currentMonth }})</span></div>\r\n          </div>\r\n        </view>\r\n        <view class=\"week\">\r\n          <text v-for=\"item in weekArr\" :key=\"item.id\">{{ item }}</text>\r\n        </view>\r\n        <view class=\"date\" v-for=\"obj in dataObj\" :key=\"obj.id\">\r\n          <view class=\"item\" v-for=\"item in obj\" :key=\"item.id\" :class=\"item == '' ? 'hide' : ''\"\r\n            :animation=\"item == currentDay ? animationData : ''\">\r\n            <view class=\"just\" :class=\"signArr.indexOf(item) != -1 ? 'active' : ''\">\r\n              <view class=\"top\">{{ item }} </view>\r\n              <view class=\"bottom\">\r\n                <u-icon name=\"error\" v-if=\"item <= currentDay\" color=\"#999\"></u-icon>\r\n              </view>\r\n            </view>\r\n            <view class=\"back\" :class=\"signArr.indexOf(item) != -1 ? 'active' : ''\" :style=\"\r\n                signArr.indexOf(item) != -1 && ifSign\r\n                  ? 'transform: rotateY(0deg);'\r\n                  : signArr.indexOf(item) != -1 && item != currentDay\r\n                  ? 'transform: rotateY(0deg);'\r\n                  : ''\r\n              \">\r\n              <view class=\"top\">{{ item }}</view>\r\n              <view class=\"bottom\">\r\n                <u-icon name=\"checkmark\" :color=\"aiderLightColor\"></u-icon>\r\n              </view>\r\n            </view>\r\n          </view>\r\n        </view>\r\n      </view>\r\n    </div>\r\n    <view class=\"mask\" :class=\"{ show: maskFlag, trans: transFlag }\" ref=\"mask\">\r\n      <view class=\"mask-header\">\r\n        <text class=\"close\"></text>\r\n        <text>签到成功</text>\r\n        <text class=\"close\" @click=\"close\">×</text>\r\n      </view>\r\n      <view class=\"mask-con\">\r\n        <u-icon size=\"120\" style=\"margin: 50rpx 0\" :color=\"aiderLightColor\" name=\"checkmark\"></u-icon>\r\n        <text class=\"text\">连续签到可获得额外奖励哦！</text>\r\n      </view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { sign, signTime } from \"@/api/point.js\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      aiderLightColor:this.$aiderLightColor,\r\n      signFlag: false,\r\n      animationData: {},\r\n      maskFlag: false, //\r\n      transFlag: false, //动画\r\n      weekArr: [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"], //周数组\r\n      dateArr: [], //每个月的天数\r\n      monthArr: [\r\n        //实例化每个月\r\n        \"1月\",\r\n        \"2月\",\r\n        \"3月\",\r\n        \"4月\",\r\n        \"5月\",\r\n        \"6月\",\r\n        \"7月\",\r\n        \"8月\",\r\n        \"9月\",\r\n        \"10月\",\r\n        \"11月\",\r\n        \"12月\",\r\n      ], //今天一个月英文\r\n      currentMonth: \"\", //当月\r\n      currentMonthIndex: \"\", //当月\r\n      currentYear: \"\", //今年\r\n      currentDay: \"\", //今天\r\n      currentWeek: \"\", //获取当月一号是周几\r\n      dataObj: [], //一个月有多少天这个获取\r\n      signArr: [], //本月签到过的天数 该参数用于请求接口后获取当月都哪天签到了\r\n      signAll: [], //所有签到数据\r\n      ifSign: false, //今天是否签到\r\n    };\r\n  },\r\n  async onLoad() {\r\n    //获取签到数据\r\n    var response = await signTime(\r\n      new Date().getFullYear() + \"\" + this.makeUp(new Date().getMonth() + 1)\r\n    );\r\n    this.signAll = response.data.result;\r\n    //获取展示数据\r\n    this.getDate();\r\n  },\r\n  methods: {\r\n    /**\r\n     * 补0\r\n     */\r\n    makeUp(val) {\r\n      if (val >= 10) {\r\n        return val;\r\n      } else {\r\n        return \"0\" + val;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 点击签到\r\n     */\r\n    async signIn() {\r\n      await sign().then((response) => {\r\n        if (this.ifSign) return;\r\n        if (this.signFlag) return;\r\n        if (response.data.code != 200) {\r\n          uni.showToast({\r\n            title: response.data.message,\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n\r\n          return false;\r\n        }\r\n        var that = this;\r\n        var animation = uni.createAnimation({\r\n          duration: 200,\r\n          timingFunction: \"linear\",\r\n        });\r\n        this.signArr.push(this.currentDay);\r\n        this.animation = animation;\r\n        animation.rotateY(0).step();\r\n        this.animationData = animation.export();\r\n\r\n        setTimeout(\r\n          function () {\r\n            that.signFlag = true;\r\n            this.maskFlag = true;\r\n            this.ifSign = !this.ifSign;\r\n            animation.rotateY(0).step();\r\n            this.animationData = animation.export();\r\n          }.bind(this),\r\n          200\r\n        );\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 签到成功后关闭弹窗\r\n     */\r\n    close() {\r\n      var that = this;\r\n      this.maskFlag = false;\r\n      this.transFlag = true;\r\n      setTimeout(() => {\r\n        that.transFlag = false;\r\n      }, 500);\r\n    },\r\n\r\n    /**\r\n     * 获取今天时间\r\n     *\r\n     */\r\n    getDate() {\r\n      var date = new Date(),\r\n        index = date.getMonth(),\r\n        curDay = null;\r\n      this.currentYear = date.getFullYear();\r\n      this.currentMonth = this.monthArr[index];\r\n      this.currentMonthIndex = index + 1;\r\n      this.currentDay = date.getDate();\r\n      if (this.currentDay == this.signArr[this.signArr.length - 1]) {\r\n        this.ifSign = true;\r\n      }\r\n      curDay = this.getWeekByDay(this.currentYear + \"-\" + (index + 1) + \"-1\");\r\n      this.getMonthDays(index, curDay);\r\n      this.curentSignData();\r\n    },\r\n\r\n    /**\r\n     * 获取当前已经签到的时间\r\n     */\r\n    curentSignData() {\r\n      var date = new Date(),\r\n        index = date.getMonth(),\r\n        curDay = null;\r\n      this.signArr = [];\r\n      for (var i = 0; i < this.signAll.length; i++) {\r\n        var item = this.signAll[i];\r\n        item.createTime = item.createTime.split(\" \")[0];\r\n        var itemVal = item.createTime.split(\"-\");\r\n        if (\r\n          Number(itemVal[0]) === Number(this.currentYear) &&\r\n          Number(itemVal[1]) === Number(this.currentMonthIndex)\r\n        ) {\r\n          this.signArr.push(Number(itemVal[2]));\r\n        }\r\n        if (\r\n          Number(itemVal[0]) === Number(date.getFullYear()) &&\r\n          Number(itemVal[1]) === Number(index + 1) &&\r\n          Number(itemVal[2]) === Number(date.getDate())\r\n        ) {\r\n          this.ifSign = true;\r\n        }\r\n      }\r\n    },\r\n\r\n    /**\r\n     *  循环出当前月份的时间\r\n     *  例子：\r\n     *  \"\",\"\",\"\",\"\",\"\",\"\",1,\r\n     *  2 ,3 ,4 ,5 ,6 ,7 ,8,\r\n     *  ...依次向下排\r\n     */\r\n    getMonthDays(index, day) {\r\n      //day 当月1号是周几\r\n      this.dateArr = [];\r\n      this.dataObj = [];\r\n      for (var i = 0; i < day; i++) {\r\n        this.dateArr.push(\"\");\r\n      }\r\n      if (\r\n        index == 0 ||\r\n        index == 2 ||\r\n        index == 4 ||\r\n        index == 6 ||\r\n        index == 7 ||\r\n        index == 9 ||\r\n        index == 11\r\n      ) {\r\n        for (let i = 1; i < 32; i++) {\r\n          this.dateArr.push(i);\r\n        }\r\n      }\r\n      if (index == 3 || index == 5 || index == 8 || index == 10) {\r\n        for (let i = 1; i < 31; i++) {\r\n          this.dateArr.push(i);\r\n        }\r\n      }\r\n      if (index == 1) {\r\n        if (\r\n          (this.currentYear % 4 == 0 && this.currentYear % 100 != 0) ||\r\n          this.currentYear % 400 == 0\r\n        ) {\r\n          for (let i = 1; i < 30; i++) {\r\n            this.dateArr.push(i);\r\n          }\r\n        } else {\r\n          for (let i = 1; i < 29; i++) {\r\n            this.dateArr.push(i);\r\n          }\r\n        }\r\n      }\r\n      for (var y = 0; y < 10; y++) {\r\n        if (this.dateArr.length > 7) {\r\n          this.dataObj.push(this.dateArr.splice(0, 7));\r\n        } else {\r\n          for (let i = 0; i < 7 - this.dateArr.length; i++) {\r\n            this.dateArr.push(\"\");\r\n          }\r\n        }\r\n      }\r\n      this.dataObj.push(this.dateArr);\r\n    },\r\n\r\n    /**\r\n     * 获取当前月份有几周\r\n     */\r\n    getWeekByDay(dayValue) {\r\n      var day = new Date(Date.parse(dayValue.replace(/-/g, \"/\"))).getDay(); //将日期值格式化\r\n      return day;\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style scoped>\r\npage {\r\n  background: #f7f7f7;\r\n}\r\n</style>\r\n<style lang=\"scss\" scoped>\r\n.date-card {\r\n  padding: 0 32rpx;\r\n  margin: 32rpx 0;\r\n  box-shadow: 0 4rpx 24rpx 0 rgba($color: #f6f6f6, $alpha: 1);\r\n}\r\n.tips {\r\n  margin-top: 54rpx;\r\n  color: #999;\r\n  font-size: 24rpx;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.circle-box {\r\n  width: 200rpx;\r\n  height: 200rpx;\r\n  border-radius: 50%;\r\n  background: $aider-light-color;\r\n  box-shadow: 0 4rpx 24rpx 0 rgba($color: $aider-light-color, $alpha: 1);\r\n  display: flex;\r\n  justify-content: center; //这个是X轴居中\r\n  align-items: center; //这个是 Y轴居中\r\n \r\n}\r\n\r\n.cricle {\r\n  width: 160rpx;\r\n  height: 160rpx;\r\n  border-radius: 50%;\r\n  background: $aider-light-color;\r\n  text-align: center;\r\n  line-height: 160rpx;\r\n  color: #fff;\r\n  font-size: 40rpx;\r\n}\r\n.current-month {\r\n  width: 100%;\r\n  margin: 20rpx 0;\r\n}\r\n.box {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  padding:64rpx 32rpx;\r\n  background: #fff;\r\n  border-radius: 20rpx;\r\n}\r\n.sign-in {\r\n  color: #333;\r\n  .date-con {\r\n    background: #fff;\r\n    min-height: 730rpx;\r\n    border-radius: 20rpx;\r\n    padding: 0 28rpx;\r\n  }\r\n  .day {\r\n    font-size: 36rpx;\r\n\r\n    > span {\r\n      font-size: 30rpx;\r\n      color: #999;\r\n      margin-left: 20rpx;\r\n    }\r\n  }\r\n  .date-tit {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    margin: 0 0 30rpx 0;\r\n  }\r\n\r\n  .week {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    color: #a6a6a6;\r\n    font-size: 26rpx;\r\n\r\n    text {\r\n      width: 66rpx;\r\n      text-align: center;\r\n    }\r\n  }\r\n\r\n  .date {\r\n    margin: 10rpx 0 36rpx;\r\n    display: flex;\r\n    justify-content: space-between;\r\n    flex-wrap: wrap;\r\n\r\n    .item {\r\n      width: 66rpx;\r\n      height: 80rpx;\r\n      border-radius: 5px;\r\n      overflow: hidden;\r\n\r\n      position: relative;\r\n\r\n      &.hide {\r\n        opacity: 0;\r\n      }\r\n\r\n      .just,\r\n      .back {\r\n        display: flex;\r\n        flex-direction: column;\r\n        width: 100%;\r\n        height: 100%;\r\n        position: absolute;\r\n\r\n        .top {\r\n          position: relative;\r\n          flex: 1;\r\n          text-align: center;\r\n          line-height: 40rpx;\r\n\r\n          &:before {\r\n            content: \"\";\r\n            width: 40rpx;\r\n            height: 40rpx;\r\n            position: absolute;\r\n            left: 50%;\r\n            transform: translateX(-50%);\r\n            top: 15rpx;\r\n          }\r\n        }\r\n      }\r\n\r\n      .just {\r\n        &.active {\r\n          display: none;\r\n        }\r\n      }\r\n      .back {\r\n        display: none;\r\n        &.active {\r\n          display: flex;\r\n        }\r\n\r\n        .top {\r\n          color: $aider-light-color;\r\n        }\r\n      }\r\n\r\n      .bottom {\r\n        color: #999;\r\n        font-size: 20rpx;\r\n        height: 20rpx;\r\n        line-height: 20rpx;\r\n        text-align: center;\r\n      }\r\n    }\r\n  }\r\n  .mask {\r\n    position: fixed;\r\n    top: 0;\r\n    bottom: 0;\r\n    left: -100%;\r\n    right: 100%;\r\n    background: rgba(0, 0, 0, 0.2);\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    align-items: center;\r\n    opacity: 0;\r\n    transition: opacity 0.5s;\r\n\r\n    &.show {\r\n      opacity: 1;\r\n      left: 0;\r\n      right: 0;\r\n    }\r\n\r\n    &.trans {\r\n      left: 0;\r\n      right: 0;\r\n    }\r\n\r\n    .mask-header {\r\n      width: 540rpx;\r\n      height: 130rpx;\r\n      line-height: 130rpx;\r\n      background: $aider-light-color;\r\n      color: #fff;\r\n      font-size: 40rpx;\r\n      font-weight: 500;\r\n      display: flex;\r\n      justify-content: space-between;\r\n\r\n      .close {\r\n        width: 60rpx;\r\n        font-size: 66rpx;\r\n        font-weight: 400;\r\n        line-height: 60rpx;\r\n      }\r\n    }\r\n\r\n    .mask-con {\r\n      width: 540rpx;\r\n      height: 380rpx;\r\n      background: #fff;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      color: #999;\r\n      font-size: 24rpx;\r\n      border-radius: 0 0 9px 9px;\r\n\r\n      .keep-sign {\r\n        font-size: 30rpx;\r\n        margin-top: 30rpx;\r\n\r\n        text {\r\n          font-size: 46rpx;\r\n          font-weight: 500;\r\n          color: #999;\r\n          padding: 0 6rpx 0 8rpx;\r\n        }\r\n      }\r\n\r\n      .mark {\r\n        // flex: 1;\r\n        display: flex;\r\n        align-items: flex-end;\r\n        position: relative;\r\n        margin-bottom: 16rpx;\r\n\r\n        text {\r\n          margin-left: 4rpx;\r\n          color: #999;\r\n        }\r\n      }\r\n\r\n      .text {\r\n        color: #6f6f6f;\r\n        height: 90rpx;\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/navigation/search/search.scss",
    "content": ".sort-active {\n  border: 1px solid $light-color;\n  color: $light-color;\n  background: $price-light-color !important;\n}\n\n.oldKeyList {\n  display: flex;\n  flex-wrap: wrap;\n  padding: 20rpx 3%;\n  > .oldKeyItem {\n    padding: 4rpx 24rpx;\n    background: #f0f2f5;\n    margin-right: 20rpx;\n    max-width: 200rpx;\n    border-radius: 100px;\n    font-size: 24rpx;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    margin-bottom: 20rpx;\n  }\n}\n\n.status_bar {\n  height: var(--status-bar-height);\n  background: #fff !important;\n  width: 100%;\n}\npage {\n  background-color: #fff !important;\n}\n.sort-box {\n  width: 100%;\n  height: 100%;\n  position: relative;\n  background: #f7f7f7;\n  .sort-list {\n    margin: 20rpx 0;\n    background: #fff;\n    border-radius: 20rpx;\n    padding: 30rpx;\n    > .sort-item {\n      > .sort-title {\n        margin: 20rpx 0;\n        font-size: 26rpx;\n        font-weight: bold;\n      }\n    }\n  }\n}\n.null-view {\n  height: 140rpx;\n}\n\n.sort-btn {\n  display: flex;\n  position: fixed;\n  bottom: 0;\n  border-top: 1px solid #f7f7f7;\n  height: 100rpx;\n  left: 0;\n  width: 100%;\n  background: #fff;\n  align-items: center;\n  > view {\n    width: 50%;\n    height: 80rpx;\n    line-height: 80rpx;\n    text-align: center;\n    margin: 0 20rpx;\n    border-radius: 1000px;\n  }\n  > .sort-btn-repick {\n    border: 1px solid #ededed;\n  }\n  > .sort-btn-confim {\n    color: #fff;\n    background-image: linear-gradient(90deg, #ff6b35, #ff9f28, #ffcc03);\n  }\n}\n.uinput {\n  width: 50% !important;\n  > .sort-radius {\n    height: 70rpx;\n    line-height: 70rpx;\n    font-size: 24rpx;\n  }\n  /deep/ .uni-input-input {\n    font-size: 24rpx;\n  }\n}\n.sort-radius {\n  margin: 0 12rpx;\n  background: #f7f7f7;\n  height: 65rpx;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  border-radius: 1000px;\n  font-size: 24rpx;\n}\n.flex {\n \n  flex-wrap: wrap;\n  align-items: center;\n  > .sort-brand-item {\n    width: 33%;\n    text-align: center;\n    margin-bottom: 20rpx;\n  }\n}\n.scoll-page {\n  overflow: auto;\n}\n.content {\n  background-color: $bg-color;\n  height: 100vh;\n  overflow: hidden;\n}\n\n.index-nav-arrow:last-child {\n  margin-top: -22rpx;\n}\n.line1-store-name{\n  font-size: 24rpx;\n  color: #999;\n}\n.to-store{\n  font-size: 24rpx;\n  color: #333;\n  margin-left: 10rpx;\n}\n.img {\n  width: 26rpx;\n  height: 26rpx;\n}\n.goods-row {\n  background: #fff;\n  padding: 16rpx; \n\n  >.goods-col{\n    display: flex;\n    >.goods-img{\n      flex: 4;\n    }\n    >.goods-detail{\n      flex: 7;\n    }\n  }\n}\n\n.add1 {\n  background: #fff;\n  padding: 30rpx 0;\n}\n\n.oldKeyRow {\n  background: #fff;\n  padding: 34rpx 3%;\n  border-bottom: 1px solid #eeeeee;\n}\n\n\n.clamp3 {\n  margin-bottom: 10rpx;\n  font-size: 28rpx;\n  color: #333333;\n  font-weight: 400;\n  display: -webkit-box;\n  height: 80rpx;\n  -webkit-box-orient: vertical;\n\n  -webkit-line-clamp: 2 !important;\n\n  overflow: hidden;\n  > span {\n    line-height: 1.5;\n  }\n}\n\n\nview {\n  display: block;\n}\n\n.store-seller-name {\n  color: #666;\n  overflow: hidden;\n\n  > div {\n    float: left;\n  }\n\n  > span {\n    float: right;\n  }\n}\n\n.count-config {\n  padding: 10rpx 0;\n  color: #666;\n  display: flex;\n  font-size: 24rpx;\n  justify-content: space-between;\n}\n\n.search-box {\n  z-index: 99;\n  width: 100%;\n  background: $light-color;\n  padding: 20rpx 2.5%;\n  display: flex;\n  justify-content: space-between;\n  position: sticky;\n  top: 0;\n}\n\n.search-box .mSearch-input-box {\n  width: 100%;\n}\n\n.search-box .input-box {\n  width: 85%;\n  flex-shrink: 1;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.search-box .search-btn {\n  width: 15%;\n  margin: 0 0 0 2%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  flex-shrink: 0;\n  font-size: 28rpx;\n  color: #fff;\n  background: linear-gradient(to right, #ff9801, #ff570a);\n  border-radius: 60rpx;\n}\n\n.search-box .input-box > input {\n  width: 100%;\n  height: 60rpx;\n  font-size: 32rpx;\n  border: 0;\n  border-radius: 60rpx;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  padding: 0 3%;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.uni-scroll-view-content {\n  background: #ededed !important;\n}\n\n.placeholder-class {\n  color: #9e9e9e;\n}\n\n.search-keyword {\n  width: 100%;\n  background-color: #ededed;\n}\n\n.keyword-list-box {\n  height: calc(100vh - 110rpx);\n  padding-top: 10rpx;\n  border-radius: 20rpx 20rpx 0 0;\n  background-color: #fff;\n}\n\n.keyword-entry-tap {\n  background-color: #eee;\n}\n\n.keyword-entry {\n  width: 94%;\n  height: 80rpx;\n  margin: 0 3%;\n  font-size: 30rpx;\n  color: #333;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  border-bottom: solid 1rpx #e7e7e7;\n}\n\n.keyword-entry image {\n  width: 60rpx;\n  height: 60rpx;\n}\n\n.keyword-entry .keyword-text,\n.keyword-entry .keyword-img {\n  height: 80rpx;\n  display: flex;\n  align-items: center;\n}\n\n.keyword-entry .keyword-text {\n  width: 90%;\n}\n\n.keyword-entry .keyword-img {\n  width: 10%;\n  justify-content: center;\n}\n\n.keyword-box {\n  background-color: #fff;\n}\n\n.keyword-box .keyword-block {\n  padding: 10rpx 0;\n}\n\n.keyword-box .keyword-block .keyword-list-header {\n  width: 100%;\n  padding: 20rpx 3%;\n  font-size: 27rpx;\n  color: #333;\n  display: flex;\n  justify-content: space-between;\n}\n\n.keyword-box .keyword-block .keyword-list-header image {\n  width: 40rpx;\n  height: 40rpx;\n}\n\n.keyword-box .keyword-block .keyword > view {\n  width: 50%;\n  line-height: 1.75;\n  overflow: hidden;\n  padding: 0 3% 0 3% !important;\n}\n\n.u-tips {\n  font-size: 30rpx;\n  font-weight: 700;\n  color: #333;\n}\n\n.keyword {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.keyword-box {\n  position: relative;\n}\n\n.clear {\n  color: #666666;\n  position: fixed;\n  bottom: 0;\n  width: 100%;\n  text-align: center;\n  height: 100rpx;\n  line-height: 100rpx;\n  font-size: 28rpx;\n  background: #f7f7f7;\n}\n\n.keyword-box .keyword-block .hide-hot-tis {\n  display: flex;\n  justify-content: center;\n  font-size: 28rpx;\n  color: #6b6b6b;\n}\n\n.navbar {\n  display: flex;\n  width: 100%;\n  height: 80rpx;\n  background: #fff;\n  box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06);\n  z-index: 10;\n  // position: fixed;\n  // left: 0;\n  // top: var(--status-bar-height);\n  .nav-item {\n    flex: 1;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    height: 100%;\n    font-size: 30rpx;\n    color: $font-color-dark;\n    position: relative;\n  }\n  .current {\n    color: $light-color;\n    position: relative;\n    &:after {\n      content: \"\";\n      position: absolute;\n      left: 50%;\n      bottom: 0;\n      transform: translateX(-50%);\n      width: 40rpx;\n      height: 0;\n      border-bottom: 4rpx solid $light-color;\n    }\n  }\n  .p-box {\n    display: flex;\n    flex-direction: column;\n\n    .yticon {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 30rpx;\n      height: 14rpx;\n      line-height: 1;\n      margin-left: 4rpx;\n      font-size: 26rpx;\n      color: #888;\n    }\n\n    .xia {\n      transform: scaleY(-1);\n    }\n  }\n}\n.status_bar {\n  height: var(--status-bar-height);\n  width: 100%;\n  background: $light-color;\n}\n\n.empty {\n  padding-top: 300rpx;\n  color: #999999;\n  text-align: center;\n  /deep/ .u-image {\n    width: 346rpx;\n    height: 304rpx;\n  }\n}\n"
  },
  {
    "path": "pages/navigation/search/searchPage.vue",
    "content": "<template>\n\t<view class=\"content\">\n\t\t<u-navbar :background=\"navObj\" :is-back=\"false\">\n\t\t\t<mSearch\n\t\t\t\tref=\"mSearch\"\n\t\t\t\tclass=\"mSearch-input-box\"\n\t\t\t\t@clickLeft=\"back\"\n\t\t\t\t:mode=\"2\"\n\t\t\t\t:placeholder=\"defaultKeyword\"\n\t\t\t\t@search=\"doSearch(false)\"\n\t\t\t\t@confirm=\"doSearch(false)\"\n\t\t\t\t@SwitchType=\"doSearchSwitch()\"\n\t\t\t\tv-model=\"keyword\"\n\t\t\t\t:isFocusVal=\"!isShowSeachGoods\"\n\t\t\t></mSearch>\n\t\t</u-navbar>\n\n\t\t<view class=\"search-keyword\" v-if=\"!isShowSeachGoods\">\n\t\t\t<scroll-view class=\"keyword-list-box\" v-show=\"isShowKeywordList\" scroll-y>\n\t\t\t\t<block v-for=\"(row, index) in keywordList\" :key=\"index\">\n\t\t\t\t\t<view class=\"keyword-entry\" hover-class=\"keyword-entry-tap\">\n\t\t\t\t\t\t<view class=\"keyword-text\" @tap.stop=\"doSearch(keywordList[index].words)\"><rich-text :nodes=\"row.words\"></rich-text></view>\n\t\t\t\t\t</view>\n\t\t\t\t</block>\n\t\t\t</scroll-view>\n\t\t\t<div class=\"keyword-box\" v-show=\"!isShowKeywordList\">\n\t\t\t\t<view class=\"keyword-block add1\">\n\t\t\t\t\t<view class=\"keyword-list-header\"><view class=\"u-tips\">热门搜索</view></view>\n\t\t\t\t\t<view class=\"keyword keywordBox\">\n\t\t\t\t\t\t<view class=\"wes\" v-for=\"(keyword, index) in hotKeywordList\" @tap=\"doSearch(keyword)\" :key=\"index\">{{ keyword }}</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"keyword-block\" v-if=\"oldKeywordList.length > 0\">\n\t\t\t\t\t<view class=\"keyword-list-header\"><view class=\"u-tips\">搜索历史</view></view>\n\t\t\t\t\t<div class=\"oldKeyList\">\n\t\t\t\t\t\t<div class=\"oldKeyItem\" v-if=\"keyword\" v-for=\"(keyword, index) in oldKeywordList\" :key=\"index\" @click=\"doSearch(keyword)\">\n\t\t\t\t\t\t\t<span>{{ keyword }}</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div @click=\"showMore\" v-if=\"oldKeywordIndex > loadIndex\" class=\"oldKeyItem\">展示更多</div>\n\t\t\t\t\t</div>\n\t\t\t\t</view>\n\n\t\t\t\t<div class=\"clear mp-iphonex-bottom\" @tap=\"oldDelete\">清空搜索历史</div>\n\t\t\t</div>\n\t\t</view>\n\t\t<!-- 搜索 -->\n\t\t<view class=\"goods-content\" v-if=\"isShowSeachGoods\">\n\t\t\t<view class=\"navbar\">\n\t\t\t\t<view class=\"nav-item\" :class=\"{ current: filterIndex === 0 }\" @click=\"tabClick(0)\">综合排序</view>\n\t\t\t\t<view class=\"nav-item\" :class=\"{ current: filterIndex === 3 }\" @click=\"tabClick(3, 'buyCount')\">\n\t\t\t\t\t<text>销量</text>\n\t\t\t\t\t<view class=\"p-box\">\n\t\t\t\t\t\t<view class=\"index-nav-arrow\">\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-up-1.png\" v-if=\"params.sort === 'buyCount' && params.order === 'asc'\" mode=\"aspectFit\"></image>\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-up.png\" v-else mode=\"aspectFit\"></image>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<view class=\"index-nav-arrow\">\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-down.png\" v-if=\"params.sort === 'buyCount' && params.order === 'desc'\" mode=\"aspectFit\"></image>\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-down-1.png\" v-else mode=\"aspectFit\"></image>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"nav-item\" :class=\"{ current: filterIndex === 4 }\" @click=\"tabClick(4, 'price')\">\n\t\t\t\t\t<text>价格</text>\n\t\t\t\t\t<view class=\"p-box\">\n\t\t\t\t\t\t<view class=\"index-nav-arrow\">\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-up-1.png\" v-if=\"params.sort === 'price' && params.order === 'asc'\" mode=\"aspectFit\"></image>\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-up.png\" v-else mode=\"aspectFit\"></image>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<view class=\"index-nav-arrow\">\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-down.png\" v-if=\"params.sort === 'price' && params.order === 'desc'\" mode=\"aspectFit\"></image>\n\t\t\t\t\t\t\t<image class=\"img\" src=\"/static/index/arrow-down-1.png\" v-else mode=\"aspectFit\"></image>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"nav-item\" @click=\"sortGoods\">筛选</view>\n\t\t\t</view>\n\t\t\t<!-- 一行一个商品展示 -->\n\t\t\t<div v-if=\"isSWitch\">\n\t\t\t\t<scroll-view\n\t\t\t\t\t:style=\"{ height: goodsHeight }\"\n\t\t\t\t\tenableBackToTop=\"true\"\n\t\t\t\t\tlower-threshold=\"250\"\n\t\t\t\t\t@scrolltolower=\"loadmore()\"\n\t\t\t\t\tscroll-with-animation\n\t\t\t\t\tscroll-y\n\t\t\t\t\tclass=\"scoll-page\"\n\t\t\t\t>\n\t\t\t\t\t<goodsList :res=\"goodsList\" type=\"oneColumns\" :keyword=\"keyword\" />\n\t\t\t\t\t<uni-load-more :status=\"loadingType\" @loadmore=\"loadmore()\"></uni-load-more>\n\t\t\t\t</scroll-view>\n\t\t\t</div>\n\t\t\t<!-- 一行两个商品展示 -->\n\t\t\t<div v-if=\"!isSWitch && !(goodsList == [] || goodsList == '' || goodsList == null)\">\n\t\t\t\t<scroll-view\n\t\t\t\t\t:style=\"{ height: goodsHeight }\"\n\t\t\t\t\tscroll-anchoring\n\t\t\t\t\tenableBackToTop=\"true\"\n\t\t\t\t\t@scrolltolower=\"loadmore()\"\n\t\t\t\t\tscroll-with-animation\n\t\t\t\t\tscroll-y\n\t\t\t\t\tlower-threshold=\"250\"\n\t\t\t\t\tclass=\"scoll-page\"\n\t\t\t\t>\n\t\t\t\t\t<goodsList :res=\"goodsList\" :keyword=\"keyword\" />\n\t\t\t\t\t<uni-load-more :status=\"loadingType\"></uni-load-more>\n\t\t\t\t</scroll-view>\n\t\t\t</div>\n\t\t</view>\n\n\t\t<u-popup border-radius=\"20\" mode=\"right\" width=\"90%\" v-model=\"sortPopup\">\n\t\t\t<view class=\"status_bar\"></view>\n\t\t\t<view class=\"sort-box  \">\n\t\t\t\t<view class=\"sort-list\">\n\t\t\t\t\t<view class=\"sort-item\">\n\t\t\t\t\t\t<view class=\"sort-title\">品牌</view>\n\t\t\t\t\t\t<view class=\"flex\" v-if=\"sortData.brands\">\n\t\t\t\t\t\t\t<view class=\"sort-brand-item\" :key=\"brandsIndex\" v-for=\"(brand, brandsIndex) in sortData.brands\" @click=\"handleSort(brand, brandsIndex, 'brand')\">\n\t\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t\t\tclass=\"sort-radius\"\n\t\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t\t'sort-active': brand.__selected\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ brand.name }}\n\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<!-- <u-empty v-else text=\"暂无品牌\" mode=\"list\"></u-empty> -->\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"sort-item\">\n\t\t\t\t\t\t<view class=\"sort-title\">全部分类</view>\n\t\t\t\t\t\t<view class=\"flex\" style=\"flex-wrap: wrap;\" v-if=\"sortData.categories\">\n\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t\tclass=\"sort-brand-item\"\n\t\t\t\t\t\t\t\t:key=\"categoriesIndex\"\n\t\t\t\t\t\t\t\tv-for=\"(categoryId, categoriesIndex) in sortData.categories\"\n\t\t\t\t\t\t\t\t@click=\"handleSort(categoryId, categoriesIndex, 'categoryId')\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t\t\tclass=\"sort-radius\"\n\t\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t\t'sort-active': categoryId.__selected\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ categoryId.name }}\n\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<!-- <u-empty v-else text=\"暂无分类\" mode=\"list\"></u-empty> -->\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"sort-list\">\n\t\t\t\t\t<view class=\"sort-item\">\n\t\t\t\t\t\t<view class=\"sort-title\">价格区间</view>\n\t\t\t\t\t\t<view style=\"display:flex;  margin-top:20rpx;    align-items: center;\">\n\t\t\t\t\t\t\t<view class=\"sort-brand-item uinput\">\n\t\t\t\t\t\t\t\t<view class=\"sort-radius\"><u-input v-model=\"minPrice\" type=\"number\" placeholder=\"最低价\" input-align=\"center\" /></view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t<view>-</view>\n\t\t\t\t\t\t\t<view class=\"sort-brand-item uinput\">\n\t\t\t\t\t\t\t\t<view class=\"sort-radius\"><u-input v-model=\"maxPrice\" type=\"number\" placeholder=\"最高价\" input-align=\"center\" /></view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\n\t\t\t\t<view class=\"sort-list\" v-if=\"sortData.paramOptions\">\n\t\t\t\t\t<view class=\"sort-item\" :key=\"paramIndex\" v-for=\"(param, paramIndex) in sortData.paramOptions\">\n\t\t\t\t\t\t<view class=\"sort-title\">{{ param.key }}</view>\n\t\t\t\t\t\t<view class=\"flex\" style=\"flex-warp:warp\" v-if=\"param.values\">\n\t\t\t\t\t\t\t<view class=\"sort-brand-item\" :key=\"i\" v-for=\"(value, i) in param.values\" @click=\"handleSort(value, i, 'prop', param)\">\n\t\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t\t\tclass=\"sort-radius\"\n\t\t\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t\t\t'sort-active': value.__selected\n\t\t\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ value.title }}\n\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\n\t\t\t\t<div class=\"null-view\"></div>\n\t\t\t\t<view class=\"sort-btn mp-iphonex-bottom\">\n\t\t\t\t\t<view class=\"sort-btn-repick\" @click=\"repick\">重置</view>\n\t\t\t\t\t<view class=\"sort-btn-confim\" @click=\"sortConfim\">确定</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</u-popup>\n\t\t<div class=\"empty\" v-if=\"empty\">\n\t\t\t<view><image style=\"width: 320rpx; height: 240rpx\" src=\"/static/nodata.png\"></image></view>\n\t\t\t<view>\n\t\t\t\t<p>没有找到相关的商品信息</p>\n\t\t\t\t<p>请换一个关键词试试吧</p>\n\t\t\t</view>\n\t\t</div>\n\t\t<u-back-top :scroll-top=\"scrollTop\"></u-back-top>\n\t</view>\n</template>\n\n<script>\nimport { getGoodsList, getGoodsRelated } from '@/api/goods.js';\nimport goodsList from '@/components/m-goods-list/list.vue';\nimport { getHotKeywords } from '@/api/home.js';\nimport mSearch from '@/components/m-search-revision/m-search-revision.vue';\nimport storage from '@/utils/storage';\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tempty: false,\n\t\t\tscrollTop: 0,\n\t\t\tloadIndex: 10,\n\t\t\toldKeywordIndex: 0,\n\t\t\tselectedWay: {\n\t\t\t\tbrand: [],\n\t\t\t\tcategoryId: [],\n\t\t\t\tprop: []\n\t\t\t},\n\n\t\t\tsortPopup: false, //筛选的开关\n\t\t\tnavObj: {\n\t\t\t\tbackground: '#fff'\n\t\t\t},\n\t\t\ttypeSortData: {\n\t\t\t\ttype: '',\n\t\t\t\tindex: ''\n\t\t\t},\n\t\t\tgoodsHeight: '',\n\t\t\tdefaultKeyword: '',\n\t\t\tkeyword: '',\n\t\t\toldKeywordList: [],\n\t\t\thotKeywordList: [],\n\t\t\tkeywordList: [],\n\t\t\tgoodsList: [],\n\n\t\t\tcateMaskState: 0, //分类面板展开状态\n\t\t\tloadingType: 'more', //加载更多状态\n\t\t\tfilterIndex: 0,\n\t\t\tcateId: 0, //已选三级分类id\n\t\t\tpriceOrder: 0, //1 价格从低到高 2价格从高到低\n\t\t\tcateList: [],\n\t\t\tisShowSeachGoods: false,\n\t\t\tisShowKeywordList: false,\n\t\t\tsortData: '',\n\t\t\tisSWitch: false,\n\n\t\t\tparams: {\n\t\t\t\tpageNumber: 1,\n\t\t\t\tpageSize: 10,\n\t\t\t\t// sort: 'grade_asc',\n\n\t\t\t\tkeyword: ''\n\t\t\t},\n\t\t\tminPrice: '',\n\t\t\tmaxPrice: '',\n\t\t\tsortParams: {\n\t\t\t\tpageNumber: 1,\n\t\t\t\tpageSize: 10,\n\n\t\t\t\t// price: \"\", //价格,示例值(10_30)\n\t\t\t\t// prop: \"\", //属性:参数名_参数值@参数名_参数值,示例值(屏幕类型_LED@屏幕尺寸_15英寸)\n\t\t\t\t// brandId:\"\", //品牌,可以多选 品牌Id@品牌Id@品牌Id\n\t\t\t\tcategoryId: ''\n\t\t\t},\n\n\t\t\trouterVal: ''\n\t\t};\n\t},\n\n\tonPageScroll(e) {\n\t\tconsole.log(e);\n\t\tthis.scrollTop = e.scrollTop;\n\t},\n\tonLoad(val) {\n\t\tthis.init();\n\t\t//  this.initSortGoods();\n\t\t// 接收分类的数据\n\n\t\tthis.routerVal = val;\n\n\t\t// 有值\n\t\tif (this.routerVal.category) {\n\t\t\tthis.params.categoryId = this.routerVal.category;\n\t\t\tthis.sortParams.categoryId = this.routerVal.category;\n\t\t\tthis.isShowSeachGoods = true;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.mSearch.isShowSeachGoods = true;\n\t\t\t});\n\t\t}\n\t\tif (this.routerVal.keyword) {\n\t\t\tthis.params.keyword = this.routerVal.keyword;\n\t\t\tthis.isShowSeachGoods = true;\n\t\t}\n\t\tif (this.routerVal.storeId) {\n\t\t\tthis.params.storeId = this.routerVal.storeId;\n\t\t\tthis.isShowSeachGoods = true;\n\t\t}\n\t\tif (this.routerVal.promotionType) {\n\t\t\tthis.params.promotionType = this.routerVal.promotionType;\n\t\t\tthis.isShowSeachGoods = true;\n\t\t}\n\t\tif (this.routerVal.promotionsId) {\n\t\t\tthis.params.promotionsId = this.routerVal.promotionsId;\n\t\t\tthis.isShowSeachGoods = true;\n\t\t}\n\t\tthis.loadData();\n\t},\n\tcomponents: {\n\t\tmSearch,\n\t\tgoodsList\n\t},\n\twatch: {\n\t\t/**\n\t\t * 将搜索的字和热词进行匹配,如果为热词则不改商品搜索关键字\n\t\t */\n\t\tkeyword(val) {\n\t\t\tif (val) {\n\t\t\t\tif (val) {\n\t\t\t\t\tthis.defaultKeyword = val;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.defaultKeyword = '请输入搜索商品';\n\t\t\t}\n\t\t},\n\t\tsortPopup(val) {\n\t\t\tif (val) {\n\t\t\t\tthis.selectedWay = { brand: [], categoryId: [], prop: [] };\n\t\t\t}\n\t\t}\n\t},\n\n\tonReachBottom() {\n\t\tthis.params.pageNumber++;\n\t\tthis.loadData();\n\t},\n\n\tmounted() {\n\t\tconst { windowWidth, windowHeight } = uni.getSystemInfoSync();\n\n\t\tlet topHeight = 0;\n\t\tlet navHeight = 0;\n\n\t\tuni.getSystemInfo({\n\t\t\tsuccess: function(res) {\n\t\t\t\t// res - 各种参数\n\n\t\t\t\tlet top = uni.createSelectorQuery().select('.u-navbar');\n\t\t\t\ttop.boundingClientRect(function(data) {\n\t\t\t\t\tif (data && data.height) {\n\t\t\t\t\t\t//data - 各种参数\n\t\t\t\t\t\ttopHeight = data.height; // 获取元素宽度\n\t\t\t\t\t}\n\t\t\t\t}).exec();\n\t\t\t\tlet nav = uni.createSelectorQuery().select('.navbar');\n\t\t\t\tnav.boundingClientRect(function(data) {\n\t\t\t\t\tif (data && data.height) {\n\t\t\t\t\t\t//data - 各种参数\n\t\t\t\t\t\tnavHeight = data.height; // 获取元素宽度\n\t\t\t\t\t}\n\t\t\t\t}).exec();\n\t\t\t}\n\t\t});\n\t\tthis.goodsHeight = windowHeight - navHeight - topHeight;\n\t\t// #ifdef APP-PLUS\n\t\tthis.goodsHeight = this.goodsHeight - 100;\n\t\t// #endif\n\t\tthis.goodsHeight += 'px';\n\t},\n\n\tmethods: {\n\t\t// 数据去重一下 只显示一次 减免 劵 什么的\n\t\tgetPromotion(item) {\n\t\t\tif (item.promotionMap) {\n\t\t\t\tlet array = [];\n\t\t\t\tObject.keys(item.promotionMap).forEach(child => {\n\t\t\t\t\tif (!array.includes(child.split('-')[0])) {\n\t\t\t\t\t\tarray.push(child.split('-')[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn array;\n\t\t\t}\n\t\t},\n\t\t// 展示更多数据\n\t\tshowMore() {\n\t\t\tthis.loadOldKeyword(this.oldKeywordIndex);\n\t\t},\n\n\t\t// 点击确定进行筛选\n\t\tsortConfim() {\n\t\t\t// 处理品牌（多选\n\t\t\tif (!this.params.brandId) {\n\t\t\t\tthis.params.brandId = [];\n\t\t\t} else {\n\t\t\t\tthis.params.brandId = [this.params.brandId];\n\t\t\t}\n\n\t\t\t// 如果选中品牌 赋值\n\t\t\tthis.selectedWay['brand'].forEach(item => {\n\t\t\t\tif (item.__selected) {\n\t\t\t\t\tthis.params.brandId.push(item.value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.params.brandId = this.params.brandId.join('@') || '';\n\n\t\t\t// 处理分类 (单选)\n\t\t\tif (this.selectedWay['categoryId'][0]) {\n\t\t\t\tthis.params.categoryId = this.selectedWay['categoryId'][0].value;\n\t\t\t}\n\t\t\tif (!this.params.prop) {\n\t\t\t\tthis.params.prop = [];\n\t\t\t} else {\n\t\t\t\tthis.params.prop = [this.params.prop];\n\t\t\t}\n\n\t\t\tthis.selectedWay['prop'].forEach(item => {\n\t\t\t\tif (item.__selected) {\n\t\t\t\t\tthis.params.prop.push(`${item.parent}_${item.title}`);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.params.prop = this.params.prop.join('@');\n\t\t\t// 处理价格\n\t\t\tif (this.minPrice || this.maxPrice) {\n\t\t\t\tthis.params.price = `${this.minPrice}_${this.maxPrice}`;\n\t\t\t} else {\n\t\t\t\tthis.params.price = 0;\n\t\t\t}\n\n\t\t\tthis.goodsList = [];\n\n\t\t\tthis.params.pageNumber = 1;\n\t\t\tthis.sortParams = this.params;\n\n\t\t\tthis.loadData();\n\t\t\tthis.sortPopup = false;\n\t\t},\n\n\t\t// 重置\n\t\trepick() {\n\t\t\tthis.sortParams = {\n\t\t\t\tpageNumber: 1,\n\t\t\t\tpageSize: 10,\n\t\t\t\tcategoryId: this.routerVal.category || ''\n\t\t\t};\n\t\t\tthis.sortPopup = false;\n\t\t\tthis.initSortGoods();\n\t\t\tthis.minPrice = '';\n\t\t\tthis.maxPrice = '';\n\t\t\tthis.params = {\n\t\t\t\tpageNumber: 1,\n\t\t\t\tpageSize: 10,\n\t\t\t\tcategoryId: this.routerVal.category || ''\n\t\t\t};\n\t\t\tthis.goodsList = [];\n\t\t\tthis.loadData();\n\t\t},\n\n\t\t// 点击筛选的内容\n\t\thandleSort(val, index, type, parent) {\n\t\t\tif (type == 'prop') {\n\t\t\t\tval.parent = parent.key;\n\t\t\t}\n\t\t\tthis.selectedWay[type].push(val);\n\t\t\tif (type == 'categoryId') {\n\t\t\t\tthis.sortData.categories.forEach(item => {\n\t\t\t\t\titem.__selected = false;\n\t\t\t\t});\n\t\t\t\tval.__selected = true;\n\t\t\t} else {\n\t\t\t\tval.__selected ? (val.__selected = false) : (val.__selected = true);\n\t\t\t}\n\t\t},\n\n\t\tinit() {\n\t\t\t// 加载搜索记录\n\t\t\tthis.loadOldKeyword(this.loadIndex);\n\t\t\t// 加载热词\n\t\t\tthis.loadHotKeyword();\n\t\t},\n\t\tblur() {\n\t\t\tuni.hideKeyboard();\n\t\t},\n\t\tback() {\n\t\t\tuni.navigateBack({\n\t\t\t\tdelta: 1\n\t\t\t});\n\t\t},\n\t\t// 跳转到商品详情\n\t\tnavigateToDetailPage(item) {\n\t\t\tuni.navigateTo({\n\t\t\t\turl: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`\n\t\t\t});\n\t\t},\n\t\t// 跳转地址\n\t\tnavigateToStoreDetailPage(item) {\n\t\t\tuni.navigateTo({\n\t\t\t\turl: `/pages/product/shopPage?id=${item.storeId}`\n\t\t\t});\n\t\t},\n\t\tloadmore() {\n\t\t\tthis.params.pageNumber++;\n\t\t\tthis.loadData();\n\t\t},\n\t\tinitSortGoods() {\n\t\t\tgetGoodsRelated(this.sortParams).then(res => {\n\t\t\t\tif (res.data.success) {\n\t\t\t\t\tfor (let item of Object.keys(res.data.result)) {\n\t\t\t\t\t\tres.data.result[item].forEach(child => {\n\t\t\t\t\t\t\tchild.__selected = false;\n\n\t\t\t\t\t\t\t// 循环出和品牌分类一样的数据格式\n\t\t\t\t\t\t\tif (child.values) {\n\t\t\t\t\t\t\t\tchild.values = child.values.map(item => ({\n\t\t\t\t\t\t\t\t\ttitle: item,\n\t\t\t\t\t\t\t\t\t__selected: false\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.sortData = res.data.result;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// 筛选商品\n\t\tsortGoods() {\n\t\t\tthis.sortPopup = true;\n\t\t},\n\n\t\ttabClick(index, type) {\n\t\t\tthis.params.pageNumber = 1;\n\t\t\tthis.params.pageSize = 10;\n\t\t\t// this.params.order = \"desc\";\n\t\t\tif (this.params.sort == type) {\n\t\t\t\tthis.params.order == 'asc' ? (this.params.order = 'desc') : (this.params.order = 'asc');\n\n\t\t\t\tthis.$set(this.params, 'sort', type);\n\t\t\t} else {\n\t\t\t\tthis.params.order = 'desc';\n\t\t\t\tthis.$set(this.params, 'sort', type);\n\t\t\t}\n\n\t\t\tif (index == 0) {\n\t\t\t\tthis.params.sort = 'releaseTime';\n\t\t\t\tthis.params.order = 'desc';\n\t\t\t}\n\n\t\t\tthis.filterIndex = index;\n\n\t\t\tuni.pageScrollTo({\n\t\t\t\tduration: 300,\n\t\t\t\tscrollTop: 0\n\t\t\t});\n\t\t\tthis.loadData('refresh', 1);\n\t\t\tuni.showLoading({\n\t\t\t\ttitle: '正在加载'\n\t\t\t});\n\t\t},\n\t\t//加载默认搜索关键字\n\t\tloadDefaultKeyword() {\n\t\t\t/**\n\t\t\t * 定义默认搜索关键字会根据当前热门搜索来进行显示\n\t\t\t * 如果当前热门搜索没有的话，则会显示默认关键字\n\t\t\t */\n\t\t\tif (this.hotKeywordList.length != 0) {\n\t\t\t\t//\n\t\t\t\tthis.defaultKeyword = this.hotKeywordList[0];\n\t\t\t} else {\n\t\t\t\tthis.defaultKeyword = '请输入搜索商品';\n\t\t\t}\n\t\t},\n\t\t//加载历史搜索,自动读取本地Storage\n\t\tloadOldKeyword(index) {\n\t\t\tthis.oldKeywordList = [];\n\t\t\tuni.getStorage({\n\t\t\t\tkey: 'OldKeys',\n\t\t\t\tsuccess: res => {\n\t\t\t\t\tvar OldKeys = JSON.parse(res.data);\n\t\t\t\t\tthis.oldKeywordIndex = OldKeys.length;\n\t\t\t\t\tfor (let i = 0; i < index; i++) {\n\t\t\t\t\t\tthis.oldKeywordList.push(OldKeys[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * 加载热门搜索\n\t\t * 1.5分钟之后更新缓存\n\t\t * 2.如果有缓存热门关键字则去请求缓存\n\t\t */\n\t\tasync loadHotKeyword() {\n\t\t\tthis.hotKeywordList = [];\n\t\t\tif (!storage.getHotWords().time || storage.getHotWords().time <= new Date().getTime() / 1000) {\n\t\t\t\t// 没有缓存或者第一次进入请求接口保存缓存\n\t\t\t\tlet res = await getHotKeywords(10);\n\t\t\t\tlet keywords = res.data.result;\n\n\t\t\t\tkeywords.forEach(item => {\n\t\t\t\t\tthis.hotKeywordList.push(item);\n\t\t\t\t});\n\n\t\t\t\tlet hotData = {\n\t\t\t\t\ttime: new Date().getTime() / 1000 + 30 * 5,\n\t\t\t\t\tkeywords: keywords\n\t\t\t\t};\n\t\t\t\tstorage.setHotWords(hotData);\n\t\t\t} else {\n\t\t\t\tlet keywords = storage.getHotWords().keywords;\n\n\t\t\t\tkeywords.forEach(item => {\n\t\t\t\t\tthis.hotKeywordList.push(item);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.loadDefaultKeyword();\n\t\t},\n\t\t//加载商品 ，带下拉刷新和上滑加载\n\t\tasync loadData(type, loading) {\n\t\t\tthis.loadingType = 'loading';\n\t\t\tif (type == 'refresh') {\n\t\t\t\tthis.goodsList = [];\n\t\t\t}\n\t\t\t//没有更多直接返回 #TODO\n\t\t\tlet goodsList = await getGoodsList(this.params);\n\t\t\tif (goodsList.data.result.records.length < 10) {\n\t\t\t\tthis.loadingType = 'noMore';\n\t\t\t\tthis.empty = true;\n\t\t\t} else {\n\t\t\t\tthis.empty = false;\n\t\t\t}\n\t\t\tthis.goodsList.push(...goodsList.data.result.records);\n\t\t\t\n\t\t\tthis.initSortGoods();\n\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\n\t\t},\n\n\t\t//高亮关键字\n\t\tdrawCorrelativeKeyword(keywords, keyword) {\n\t\t\tvar len = keywords.length,\n\t\t\t\tkeywordArr = [];\n\t\t\tfor (var i = 0; i < len; i++) {\n\t\t\t\tvar row = keywords[i];\n\t\t\t\t//定义高亮#9f9f9f\n\t\t\t\tvar html = row[0].replace(keyword, \"<span style='color: #9f9f9f;'>\" + keyword + '</span>');\n\t\t\t\thtml = '<div>' + html + '</div>';\n\t\t\t\tvar tmpObj = {\n\t\t\t\t\tkeyword: row[0],\n\t\t\t\t\thtmlStr: html\n\t\t\t\t};\n\t\t\t\tkeywordArr.push(tmpObj);\n\t\t\t}\n\t\t\treturn keywordArr;\n\t\t},\n\t\t//顶置关键字\n\t\tsetKeyword(index) {\n\t\t\tthis.keyword = this.keywordList[index].keyword;\n\t\t},\n\t\t//清除历史搜索\n\t\toldDelete() {\n\t\t\tuni.showModal({\n\t\t\t\tcontent: '确定清除历史搜索记录？',\n\t\t\t\tsuccess: res => {\n\t\t\t\t\tif (res.confirm) {\n\t\t\t\t\t\tthis.oldKeywordList = [];\n\t\t\t\t\t\tuni.removeStorage({\n\t\t\t\t\t\t\tkey: 'OldKeys'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// 样式修改布局\n\t\tdoSearchSwitch() {\n\t\t\tthis.isSWitch = !this.isSWitch;\n\t\t\tthis.isShowSeachGoods = true;\n\t\t\tthis.params.pageNumber = 1;\n\t\t\tthis.params.pageSize = 10;\n\t\t\tthis.loadData('refresh', 1);\n\t\t},\n\n\t\t/**\n\t\t * 执行搜索\n\t\t */\n\t\tdoSearch(keyword) {\n\t\t\t//  用户自行搜索/热门搜索/搜索历史\n\t\t\tkeyword = keyword === false ? this.keyword : keyword;\n\n\t\t\tif (!keyword) {\n\t\t\t\t/**\n\t\t\t\t * 进行空搜索\n\t\t\t\t * 第一次搜索如果没有关键词会将热门搜索中第一个热词进行判定\n\t\t\t\t * 如果没有热词则会展示一个空词搜索\n\t\t\t\t */\n\t\t\t\tkeyword = (this.hotKeywordList.length && this.hotKeywordList[0]) || '';\n\t\t\t}\n\t\t\tthis.defaultKeyword == '请输入搜索商品' ? (keyword = '') : '';\n\t\t\t\n\t\t\n\t\t\tkeyword ? (this.keyword = keyword) : '';\n\t\t\tthis.saveKeyword(keyword); //保存为历史\n\t\t\tthis.isShowSeachGoods = true;\n\t\t\tthis.$refs.mSearch.isShowSeachGoods = true;\n\t\t\tthis.$refs.mSearch.inputVal = keyword;\n\t\t\tthis.params.keyword = this.keyword;\n\t\t\tthis.params.pageNumber = 1;\n\t\t\tthis.$set(this.sortParams, 'keyword', keyword);\n\t\t\tthis.loadData('refresh', 1);\n\t\t},\n\t\t//保存关键字到历史记录\n\t\tsaveKeyword(keyword) {\n\t\t\tif (!keyword) return false;\n\t\t\tuni.getStorage({\n\t\t\t\tkey: 'OldKeys',\n\t\t\t\tsuccess: res => {\n\t\t\t\t\tvar OldKeys = JSON.parse(res.data);\n\t\t\t\t\tvar findIndex = OldKeys.indexOf(keyword);\n\t\t\t\t\tif (findIndex == -1) {\n\t\t\t\t\t\tOldKeys.unshift(keyword);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tOldKeys.splice(findIndex, 1);\n\t\t\t\t\t\tOldKeys.unshift(keyword);\n\t\t\t\t\t}\n\t\t\t\t\t//最多10个纪录\n\t\t\t\t\tOldKeys.length > 10 && OldKeys.pop();\n\n\t\t\t\t\tuni.setStorage({\n\t\t\t\t\t\tkey: 'OldKeys',\n\t\t\t\t\t\tdata: JSON.stringify(OldKeys)\n\t\t\t\t\t});\n\t\t\t\t\tthis.oldKeywordList = OldKeys; //更新历史搜索\n\t\t\t\t},\n\t\t\t\tfail: e => {\n\t\t\t\t\tvar OldKeys = [keyword];\n\t\t\t\t\tuni.setStorage({\n\t\t\t\t\t\tkey: 'OldKeys',\n\t\t\t\t\t\tdata: JSON.stringify(OldKeys)\n\t\t\t\t\t});\n\t\t\t\t\tthis.oldKeywordList = OldKeys; //更新历史搜索\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n};\n</script>\n<style lang=\"scss\" scoped>\n@import './search.scss';\n</style>\n"
  },
  {
    "path": "pages/order/afterSales/afterSales.vue",
    "content": "<template>\n  <view class=\"content\">\n    <view class=\"u-tabs-box\">\n      <u-tabs\n        bg-color=\"#fff\"\n        :list=\"list\"\n        :is-scroll=\"false\"\n        :current=\"current\"\n        @change=\"change\"\n        :active-color=\"$lightColor\"\n      ></u-tabs>\n    </view>\n    <div class=\"u-tabs-search\">\n      <u-search\n        placeholder=\"请输入订单编号/商品名称/售后单号\"\n        @search=\"submitSearchOrderList(current)\"\n        @clear=\"clear(current)\"\n        @custom=\"submitSearchOrderList(current)\"\n        v-model=\"keywords\"\n      >\n      </u-search>\n    </div>\n    <scroll-view class=\"body-view\" scroll-y @scrolltolower=\"renderDate\">\n      <view\n        class=\"seller-view\"\n        v-for=\"(order, orderIndex) in orderList\"\n        :key=\"orderIndex\"\n      >\n        <!-- 店铺名称 -->\n        <view class=\"seller-info u-flex u-row-between\" v-if=\"current == 0\">\n          <view class=\"seller-name\">\n            <view class=\"name\">{{ order.storeName }}</view>\n          </view>\n          <view class=\"order-sn\">订单编号:{{ order.sn }}</view>\n        </view>\n        <!-- 申请记录 选项卡 -->\n        <view class=\"seller-info u-flex u-row-between\" v-if=\"current != 0\">\n          <view class=\"order-sn\"\n            >售后单号：{{ order.service_sn || order.sn }}</view\n          >\n          <view class=\"order-sn\">{{ order.serviceType_text }}</view>\n        </view>\n        <view v-for=\"(sku, goodsIndex) in order.orderItems\" :key=\"goodsIndex\">\n          <view class=\"goods-item-view\" @click=\"onDetail(order, sku)\">\n            <view class=\"goods-img\">\n              <u-image\n                border-radius=\"6\"\n                width=\"100%\"\n                height=\"100%\"\n                :src=\"sku.image\"\n              ></u-image>\n            </view>\n            <view class=\"goods-info\">\n              <view class=\"goods-title u-line-2\">{{ sku.name }}</view>\n              <!-- 如果商品多个则不显示每个商品价格-->\n              <view class=\"goods-price\" v-if=\"order.orderItems.length <= 1\">\n                ￥{{ order.flowPrice | unitPrice }}\n              </view>\n            </view>\n            <view class=\"goods-num\">\n              <view>x{{ sku.num }}</view>\n            </view>\n          </view>\n          <view class=\"description\">\n            <!-- 售后申请  -->\n            <view v-if=\"current === 0 && sku.afterSaleStatus\">\n              <view\n                v-if=\"sku.afterSaleStatus.includes('ALREADY_APPLIED')\"\n                class=\"cannot_apply not_center\"\n              >\n                <u-icon class=\"icon\" name=\"info-circle-fill\"></u-icon>\n                该商品已申请售后服务\n              </view>\n            </view>\n            <view v-if=\"current === 0 && sku.afterSaleStatus\">\n              <view\n                v-if=\"sku.afterSaleStatus.includes('EXPIRED')\"\n                class=\"cannot_apply not_center\"\n                @click=\"tipsShow = true\"\n              >\n                <u-icon class=\"icon\" name=\"info-circle-fill\"></u-icon>\n                该商品无法申请售后\n              </view>\n            </view>\n\n            <div v-if=\"current === 1 || current === 2\">\n              <!-- 申请中 -->\n              <view\n                class=\"cannot_apply not_center\"\n                v-if=\"order.serviceType == 'RETURN_GOODS'\"\n              >\n                退货处理-{{ order.serviceStatus | serviceStatusList }}</view\n              >\n              <view\n                class=\"cannot_apply not_center\"\n                v-if=\"order.serviceType == 'SUPPLY_AGAIN_GOODS'\"\n              >\n                补发商品-{{ order.serviceStatus | serviceStatusList }}</view\n              >\n              <view\n                class=\"cannot_apply not_center\"\n                v-if=\"order.serviceType == 'RETURN_MONEY'\"\n              >\n                退款-{{ order.serviceStatus | serviceStatusList }}</view\n              >\n              <view\n                class=\"cannot_apply not_center\"\n                v-if=\"order.serviceType == 'EXCHANGE_GOODS'\"\n              >\n                换货-{{ order.serviceStatus | serviceStatusList }}</view\n              >\n              <view\n                class=\"cannot_apply not_center\"\n                v-if=\"order.serviceType == 'CANCEL'\"\n              >\n                取消订单-{{ order.serviceStatus | serviceStatusList }}</view\n              >\n            </div>\n\n            <!-- 申请记录 -->\n          </view>\n          <view class=\"btn-view u-flex u-row-right\">\n            <!-- 售后申请  -->\n\n            <div class=\"sale\" v-if=\"current === 0 && sku.afterSaleStatus\">\n              <div\n                v-if=\"\n\t\t\t\t\t\t\t\t\torder.flowPrice != 0 &&\n                  sku.afterSaleStatus.includes('NOT_APPLIED') ||\n                  sku.afterSaleStatus.includes('PART_AFTER_SALE')\n                \"\n                @click=\"applyService(sku.sn, order, sku)\"\n              >\n                <view class=\"default-btn border\"> 申请售后 </view>\n              </div>\n            </div>\n            <view class=\"after-line\">\n              <!-- 申请中 -->\n              <view\n                class=\"default-btn border\"\n                v-if=\"\n                  current === 2 &&\n                  order.serviceStatus &&\n                  order.serviceStatus == 'PASS' &&\n                  order.serviceType != 'RETURN_MONEY'\n                \"\n                @click=\"onExpress(order, sku)\"\n              >\n                提交物流\n              </view>\n              <view\n                @click=\"close(order, sku)\"\n                v-if=\"current === 1\"\n                class=\"default-btn close\"\n              >\n                取消售后\n              </view>\n              <view\n                @click=\"afterDetails(order, sku)\"\n                v-if=\"current === 1 || current === 2\"\n                class=\"default-btn border\"\n              >\n                售后详情\n              </view>\n            </view>\n          </view>\n        </view>\n        <view\n          v-if=\"\n            current === 0 &&\n            order.groupAfterSaleStatus &&\n            order.groupAfterSaleStatus != 'ALREADY_APPLIED' &&\n            order.orderItems.length >= 1\n          \"\n          class=\"btn-view u-flex u-row-between\"\n        >\n          <!-- 多个商品显示订单总价格 -->\n          <view class=\"cannot_apply\">\n            订单总金额:<span class=\"countMoney\"\n              >￥{{ order.flowPrice | unitPrice }}</span\n            >\n          </view>\n        </view>\n      </view>\n      <u-loadmore bg-color=\"#f8f8f8\" :status=\"status\" />\n    </scroll-view>\n    <u-modal\n      show-cancel-button\n      @confirm=\"closeService\"\n      v-model=\"cancelShow\"\n      content=\"确认取消售后\"\n    ></u-modal>\n    <u-modal\n      v-model=\"tipsShow\"\n      content=\"当订单未确认收货|已过售后服务有效期|已申请售后服务时，不能申请售后\"\n    ></u-modal>\n  </view>\n</template>\n\n<script>\nimport uniLoadMore from \"@/components/uni-load-more/uni-load-more.vue\";\nimport { getAfterSaleList, cancelAfterSale } from \"@/api/after-sale.js\";\nimport { getOrderList } from \"@/api/order.js\";\nimport storage from \"@/utils/storage\";\n\nexport default {\n  components: {\n    uniLoadMore,\n  },\n  data() {\n    return {\n      list: [\n        //tab表头\n        {\n          name: \"售后申请\",\n        },\n        {\n          name: \"申请中\",\n        },\n        {\n          name: \"申请记录\",\n        },\n      ],\n      current: 0, //当前表头索引\n      tipsShow: false, //提示开关\n      cancelShow: false, //取消显示开关\n      selectedOrder: \"\", //选中的order\n      orderList: [], //订单集合\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n        sort: \"createTime\",\n        flowPrice: 0,\n        order: \"desc\",\n      },\n\n      logParams: {\n        pageNumber: 1,\n        pageSize: 10,\n      },\n      status: \"loadmore\",\n      keywords: \"\", // 搜索订单sn\n    };\n  },\n  onLoad(options) {\n    this.orderList = [];\n    this.params.pageNumber = 1;\n    if (options.orderSn) this.params.keywords = options.orderSn;\n    this.searchOrderList(this.current);\n  },\n  onPullDownRefresh() {\n    this.change(this.current);\n  },\n  methods: {\n    /**\n     * 点击搜索执行搜索\n     */\n    submitSearchOrderList(current) {\n      this.params.pageNumber = 1;\n      this.logParams.pageNumber = 1;\n      this.orderList = [];\n      this.searchOrderList(current);\n    },\n    // 清空\n    clear(current){\n      this.params.pageNumber = 1;\n      this.logParams.pageNumber = 1;\n      this.params.keywords = ''\n      this.orderList = [];\n      this.searchOrderList(current);\n    },\n    /**\n     * 切换tab页时，初始化数据\n     */\n    change(index) {\n      this.current = index;\n      this.params = {\n        pageNumber: 1,\n        pageSize: 10,\n      };\n      this.orderList = [];\n      //如果是2 则读取售后申请记录列表\n      this.searchOrderList(index);\n      uni.stopPullDownRefresh();\n    },\n\n    /**\n     * 搜索初始化\n     * 根据当前tab传值的索引进行更改\n     */\n    searchOrderList(index) {\n      if (index == 0) {\n        this.keywords ? (this.params.keywords = this.keywords) : \"\";\n        this.getOrderList();\n      } else {\n        this.logParams = {\n          pageNumber: 1,\n          pageSize: 10,\n          sort: \"createTime\",\n          order: \"desc\",\n        };\n        if (index === 1) {\n          this.logParams.serviceStatus = \"APPLY\";\n        }\n        this.keywords ? (this.logParams.keywords = this.keywords) : \"\";\n        this.orderList = [];\n        this.getAfterSaleLogList();\n      }\n    },\n\n    /**\n     * 获取订单列表\n     */\n    getOrderList() {\n      uni.showLoading({\n        title: \"加载中\",\n        mask: true,\n      });\n      getOrderList(this.params).then((res) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        const orderList = res.data.result.records;\n        if (orderList.length > 0) {\n          this.orderList = this.orderList.concat(orderList);\n          this.params.pageNumber += 1;\n        }\n        if (orderList.length < 10) {\n          this.status = \"nomore\";\n        } else {\n          this.status = \"loading\";\n        }\n      });\n    },\n\n    close(order, sku) {\n      console.log(order, sku);\n      this.selectedOrder = order;\n      this.cancelShow = true;\n    },\n\n    async closeService() {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      console.log(this.selectedOrder);\n      let res = await cancelAfterSale(this.selectedOrder.sn);\n      if (res.data.success) {\n        uni.showToast({\n          title: \"取消成功!\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n      this.orderList = [];\n      this.searchOrderList(this.current);\n\n       if (this.$store.state.isShowToast){ uni.hideLoading() };\n    },\n\n    /**\n     * 售后详情\n     */\n    afterDetails(order) {\n      uni.navigateTo({\n        url: \"./applyDetail?sn=\" + order.sn,\n      });\n    },\n\n    /**\n     * 申请记录列表\n     */\n    getAfterSaleLogList() {\n      getAfterSaleList(this.logParams).then((res) => {\n        let afterSaleLogList = res.data.result.records;\n\n        afterSaleLogList.forEach((item) => {\n          item.orderItems = [\n            {\n              image: item.goodsImage,\n              skuId: item.skuId,\n              name: item.goodsName,\n              num: item.num,\n              price: item.flowPrice,\n            },\n          ];\n        });\n\n        this.orderList = this.orderList.concat(afterSaleLogList);\n\n        if (afterSaleLogList.length < 10) {\n          this.status = \"nomore\";\n        } else {\n          this.status = \"loading\";\n        }\n      });\n    },\n\n    /**\n     * 申请售后\n     */\n    applyService(sn, order, sku) {\n      let data = {\n        ...order,\n        ...sku,\n      };\n      storage.setAfterSaleData(data);\n      uni.navigateTo({\n        url: `/pages/order/afterSales/afterSalesSelect?sn=${sn}`,\n      });\n    },\n\n    /**\n     * 提交物流信息\n     */\n    onExpress(order, sku) {\n      sku.storeName = order.storeName;\n      let data = {\n        ...order,\n        ...sku,\n      };\n\n      storage.setAfterSaleData(data);\n      uni.navigateTo({\n        url: `./afterSalesDetailExpress?serviceSn=${order.sn}`,\n      });\n    },\n\n    /**\n     * 查看详情\n     */\n    onDetail(goods, sku) {\n      // 售后申请\n      if (this.current == 0) {\n        uni.navigateTo({\n          url: `/pages/product/goods?id=${sku.skuId}&goodsId=${\n            sku.goodsId || sku.goodsId\n          }`,\n        });\n      } else {\n        uni.navigateTo({\n          url: `/pages/product/goods?id=${goods.skuId}&goodsId=${\n            goods.goodsId || goods.goodsId\n          }`,\n        });\n      }\n    },\n\n    /**\n     * 底部加载数据\n     */\n    renderDate() {\n      if (this.current === 0) {\n        this.params.pageNumber += 1;\n        this.getOrderList();\n      } else {\n        this.logParams.pageNumber += 1;\n        this.getAfterSaleLogList();\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n}\n\n.body-view {\n  overflow-y: auto;\n  height: calc(100vh - 44px - 80rpx - 104rpx);\n}\n\n.u-tabs-search {\n  padding: 20rpx;\n  background: #fff;\n}\n\n.countMoney {\n  margin-left: 7rpx;\n  color: $main-color;\n  font-size: 28rpx;\n}\n\n.seller-view {\n  background-color: #fff;\n  margin: 20rpx 0rpx;\n  padding: 0rpx 20rpx;\n  border-radius: 20rpx;\n\n  .seller-info {\n    height: 70rpx;\n\n    .seller-name {\n      font-size: 28rpx;\n      display: flex;\n      flex-direction: row;\n\n      .name {\n        margin-left: 15rpx;\n        margin-top: -2rpx;\n      }\n    }\n\n    .order-sn {\n      font-size: 22rpx;\n      color: #909399;\n    }\n  }\n\n  .goods-item-view {\n    display: flex;\n    flex-direction: row;\n    padding: 10rpx 10rpx;\n\n    .goods-img {\n      width: 131rpx;\n      height: 131rpx;\n    }\n\n    .goods-info {\n      padding-left: 30rpx;\n      flex: 1;\n\n      .goods-title {\n        margin-bottom: 10rpx;\n        color: #333333;\n      }\n\n      .goods-specs {\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        color: #cccccc;\n      }\n\n      .goods-price {\n        font-size: 28rpx;\n        margin-bottom: 10rpx;\n        color: #ff5a10;\n      }\n    }\n\n    .goods-num {\n      width: 60rpx;\n      color: $main-color;\n    }\n  }\n\n  .btn-view {\n    padding: 16rpx 0;\n\n    .after-line {\n      display: flex;\n      line-height: 90rpx;\n    }\n  }\n}\n\n.description {\n  color: #909399;\n  size: 25rpx;\n}\n\n.cannot_apply {\n  text-align: center;\n  font-size: 22rpx;\n\n  color: #999999;\n  height: 70rpx;\n  line-height: 70rpx;\n}\n.not_center {\n  text-align: left;\n}\n\n.icon {\n  margin-right: 10rpx;\n}\n\n.sale {\n  width: 100%;\n  display: flex;\n  justify-content: flex-end;\n}\n\n.default-btn {\n  background-color: #ffffff;\n  margin-left: 15rpx;\n  height: 60rpx;\n  line-height: 60rpx;\n  text-align: center;\n  font-size: 24rpx;\n  padding: 0 24rpx;\n  border-radius: 200px;\n}\n\n.close {\n  color: $light-color;\n}\n\n.border {\n  border: 2rpx solid $light-color;\n  color: $light-color;\n}\n</style>\n"
  },
  {
    "path": "pages/order/afterSales/afterSalesDetail.vue",
    "content": "<template>\n  <view class=\"content\">\n    <u-form :model=\"form\" ref=\"uForm\">\n      <view class=\"after-sales-goods-detail-view\">\n        <view class=\"header\">\n          <view>\n            本次售后服务将由\n            <text class=\"seller-name\">{{ sku.storeName }}</text>\n            为您提供\n          </view>\n        </view>\n        <view>\n          <view class=\"goods-item-view\" v-for=\"(item,index) in sku.orderItems\" v-if=\"item.sn == sn\"\n            @click=\"gotoGoodsDetail(sku.goods_id)\">\n            <view class=\"goods-img\">\n              <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"item.image\"></u-image>\n            </view>\n            <view class=\"goods-info\">\n              <view class=\"goods-title u-line-2\">{{ item.name }}</view>\n              <view class=\"goods-price\">\n                <span>￥{{ applyInfo.applyRefundPrice }}</span>\n\n                <span class=\"num\">购买数量:{{ item.num }}</span>\n              </view>\n            </view>\n          </view>\n        </view>\n        <view class=\"after-num\">\n          <view>申请数量</view>\n          <view>\n            <u-number-box :value=\"parseInt(form.num)\" disabled-input :min=\"1\" :max=\"parseInt(sku.num)\" bg-color=\"#fff\"\n              @change=\"valChange\"></u-number-box>\n          </view>\n        </view>\n      </view>\n\n      <view class=\"body-view\">\n        <!-- 退款原因 -->\n        <view class=\"opt-view\">\n          <u-form-item label=\"申请原因\" :label-width=\"150\" >\n            <div style=\"width: 100%; text-align: right;\" @click=\"reasonSelectShow = true\">{{ form.reason || '请选择申请原因' }}</div>\n          </u-form-item>\n          <u-form-item label=\"申请说明\" :label-width=\"150\">\n            <u-input input-align=\"right\" type=\"textarea\" v-model=\"form.problemDesc\" placeholder=\"请描述申请售后的说明\" />\n          </u-form-item>\n        </view>\n\n        <!-- 上传凭证 -->\n        <view class=\"opt-view\">\n          <view class=\"img-title\">上传凭证（最多5张）</view>\n          <view class=\"images-view\">\n            <u-upload :header=\" { accessToken: storage.getAccessToken() }\" :action=\"action\" width=\"150\"\n              @on-uploaded=\"onUploaded\" :max-count=\"5\" :show-progress=\"false\"></u-upload>\n          </view>\n        </view>\n\n        <view class=\"opt-view\">\n          <u-form-item label=\"退款方式\" :label-width=\"150\">\n            <u-input :value=\"\n                applyInfo.refundWay == 'ORIGINAL' ? '原路退回' : '账号退款'\n              \" type=\"text\" input-align=\"right\" :disabled=\"true\" />\n          </u-form-item>\n          <view v-if=\"\n              applyInfo.accountType === 'BANK_TRANSFER' &&\n              applyInfo.applyRefundPrice != 0\">\n            <u-form-item label=\"银行开户行\" :label-width=\"150\">\n              <u-input v-model=\"form.bankDepositName\" type=\"text\" input-align=\"right\" placeholder=\"请输入银行开户行\" />\n            </u-form-item>\n            <u-form-item label=\"银行开户名\" :label-width=\"150\">\n              <u-input v-model=\"form.bankAccountName\" type=\"text\" input-align=\"right\" placeholder=\"请输入银行开户名\" />\n            </u-form-item>\n            <u-form-item label=\"银行账号\" :label-width=\"150\">\n              <u-input v-model=\"form.bankAccountNumber\" type=\"text\" input-align=\"right\" placeholder=\"请输入银行账号\" />\n            </u-form-item>\n          </view>\n\n          <u-form-item label=\"返回方式\" :label-width=\"150\">\n            <u-input type=\"text\" input-align=\"right\" value=\"快递至第三方卖家\" :disabled=\"true\" />\n          </u-form-item>\n        </view>\n\n        <view class=\"opt-tip\">提交服务单后，售后专员可能与您电话沟通，请保持手机畅通</view>\n      </view>\n    </u-form>\n\n    <view class=\"submit-view\">\n      <u-button type=\"primary\" ripple shape=\"circle\" v-if=\"applyInfo.refundWay\" :custom-style=\"customStyle\"\n        @click=\"onSubmit\">提交申请</u-button>\n    </view>\n    <u-select mode=\"single-column\" :list=\"reasonList\" v-model=\"reasonSelectShow\" @confirm=\"reasonSelectConfirm\">\n    </u-select>\n    <u-select mode=\"single-column\" :list=\"typeList\" v-model=\"typeSelectShow\" @confirm=\"typeSelectConfirm\"></u-select>\n    <u-select mode=\"single-column\" :list=\"returnList\" v-model=\"returnSelectShow\" @confirm=\"returnSelectConfirm\">\n    </u-select>\n    <u-toast ref=\"uToast\" />\n  </view>\n</template>\n\n<script>\nimport {\n  getAfterSaleReason,\n  applyReturn,\n  getAfterSaleInfo,\n} from \"@/api/after-sale\";\n\nimport city from \"@/components/m-city/m-city\";\nimport { upload } from \"@/api/common.js\";\nimport { checkBankno } from \"@/utils/Foundation\";\nimport storage from \"@/utils/storage.js\";\nexport default {\n  component: {\n    city,\n  },\n  data() {\n    return {\n      storage,\n      list: [{ id: \"\", localName: \"请选择\", children: [] }],\n      action: upload, //图片上传数据\n      fileList: [],\n      sn: \"\",\n      sku: {},\n      typeValue: 0,\n      value: \"\",\n      type: \"textarea\",\n      border: true,\n      //退款原因 弹出框\n      reasonSelectShow: false,\n      reasonList: [],\n      //退款方式为账号退款 账号类型弹出框\n      typeSelectShow: false,\n      typeList: [\n        {\n          value: \"ALIPAY\",\n          label: \"支付宝\",\n        },\n        {\n          value: \"WEIXINPAY\",\n          label: \"微信\",\n        },\n        {\n          value: \"BANK_TRANSFER\",\n          label: \"银行卡\",\n        },\n      ],\n      //返回方式\n      returnSelectShow: false,\n      returnList: [\n        {\n          value: 1,\n          label: \"快递至第三方卖家\",\n        },\n      ],\n\n      customStyle: {\n        backgroundColor: this.$lightColor,\n      },\n      applyInfo: {},\n      form: {\n        orderItemSn: \"\", // 订单sn\n        skuId: \"\",\n        reason: \"\", //退款原因\n        problemDesc: \"\", //退款说明\n        images: [], //图片凭证\n        num: 1, //退货数量\n        goodsId: \"\", //商品id\n        accountType: \"\",\n        applyRefundPrice: \"\",\n        refundWay: \"\",\n        serviceType: \"\", //申请类型\n      },\n    };\n  },\n\n  /**\n   * 判断当前内容并生成数据\n   */\n  onLoad(options) {\n    let navTitle = \"申请售后\";\n    this.form.serviceType = \"RETURN_GOODS\";\n    if (options.value == 1) {\n      navTitle = \"申请退货\";\n      this.form.serviceType = \"RETURN_GOODS\";\n    }\n    if (options.value == 2) {\n      navTitle = \"申请换货\";\n      this.form.serviceType = \"EXCHANGE_GOODS\";\n    }\n    if (options.value == 3) {\n      navTitle = \"申请退款\";\n      this.form.serviceType = \"RETURN_MONEY\";\n    }\n    this.typeValue = options.value;\n    uni.setNavigationBarTitle({\n      title: navTitle, //此处写页面的title\n    });\n    this.sn = options.sn;\n    this.sku = storage.getAfterSaleData();;\n\n    this.form.orderItemSn = options.sn;\n    this.form.skuId = this.sku.skuId;\n    this.form.num = this.sku.num;\n    this.form.goodsId = this.sku.goodsId;\n    this.getReasonActions(this.form.serviceType);\n\n    this.init(options.sn);\n  },\n  methods: {\n    /** 获取申请原因下拉框数据 */\n    async getReasonActions(serviceType) {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      await getAfterSaleReason(serviceType).then((res) => {\n        if (res.data.success) {\n          let action = [];\n          res.data.result.forEach((item) => {\n            action.push({\n              value: item.id,\n              label: item.reason,\n            });\n          });\n\n          this.reasonList = action;\n        }\n      });\n       if (this.$store.state.isShowToast){ uni.hideLoading() };\n    },\n    //打开地区选择器\n    showCitySelect() {\n      this.$refs.cityPicker.show();\n    },\n\n    // 初始化数据\n    init(sn) {\n      getAfterSaleInfo(sn).then((response) => {\n        if (response.data.code == 400) {\n          uni.showToast({\n            title: response.data.message,\n            duration: 2000,\n            icon: \"none\",\n          });\n        } else {\n          this.applyInfo = response.data.result;\n\n          this.form.accountType = response.data.result.accountType;\n        }\n      });\n    },\n\n    //退款原因\n    reasonSelectConfirm(e) {\n      this.form.reason = e[0].label;\n    },\n    //退款方式\n    typeSelectConfirm(e) {\n      this.form.accountType = e[0].value;\n      this.form.accountType_label = e[0].label;\n    },\n    //返回方式\n    returnSelectConfirm(e) {},\n\n    //修改申请数量\n    valChange(e) {\n      this.form.num = e.value;\n    },\n    //图片上传\n    onUploaded(lists) {\n      let images = [];\n\n      lists.forEach((item) => {\n        images.push(item.response.result);\n      });\n      this.form.images = images;\n    },\n    //提交申请\n    onSubmit() {\n      //提交申请前检测参数\n      if (!this.handleCheckParams()) {\n        return;\n      }\n\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      this.form.accountType = this.applyInfo.accountType;\n      this.form.refundWay = this.applyInfo.refundWay;\n      this.form.applyRefundPrice = this.applyInfo.applyRefundPrice;\n\n      applyReturn(this.sn, this.form).then((resp) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        if (resp.data.success) {\n          this.$refs.uToast.show({ title: \"提交成功\", type: \"success\" });\n          uni.redirectTo({\n            url: \"/pages/order/afterSales/applySuccess\",\n          });\n        } else {\n          this.$refs.uToast.show({ title: resp.data.message, type: \"error\" });\n        }\n      });\n    },\n    //检测提交参数\n    handleCheckParams() {\n      if (this.$u.test.isEmpty(this.form.reason)) {\n        this.$refs.uToast.show({ title: \"请选择 退款原因\", type: \"error\" });\n        return false;\n      }\n      if (this.$u.test.isEmpty(this.form.problemDesc)) {\n        this.$refs.uToast.show({ title: \"请输入 退款说明\", type: \"error\" });\n        return false;\n      }\n\n      console.log(this.form.accountType)\n      if (this.form.accountType == \"BANK_TRANSFER\") {\n        // 银行开户行校验\n        if (this.$u.test.isEmpty(this.form.bankDepositName)) {\n          this.$refs.uToast.show({\n            title: \"请输入 银行开户行\",\n            type: \"error\",\n          });\n          return false;\n        }\n        // 银行开户名校验\n        if (this.$u.test.isEmpty(this.form.bankAccountName)) {\n          this.$refs.uToast.show({\n            title: \"请输入 银行开户名\",\n            type: \"error\",\n          });\n          return false;\n        }\n        // 银行账号校验\n        if (this.$u.test.isEmpty(this.form.bankAccountNumber)) {\n          this.$refs.uToast.show({\n            title: \"请输入 银行账号\",\n            type: \"error\",\n          });\n          return false;\n        } else if (this.$u.test.chinese(this.form.bankAccountName) === false) {\n          this.$refs.uToast.show({\n            title: \"银行开户名输入错误\",\n            type: \"error\",\n          });\n          return false;\n        } else if (this.$u.test.chinese(this.form.bankDepositName) === false) {\n          this.$refs.uToast.show({\n            title: \"银行开户行输入错误\",\n            type: \"error\",\n          });\n          return false;\n        }\n      }\n\n      return true;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n}\n.body-view {\n  margin-bottom: 150rpx;\n}\n.after-sales-goods-detail-view {\n  background-color: #fff;\n  .header {\n    background-color: #f7f7f7;\n    color: #999999;\n    font-size: 22rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    line-height: 70rpx;\n    .header-text {\n      background-color: #999999;\n      padding: 10rpx 30rpx;\n      border-radius: 50rpx;\n    }\n    .seller-name {\n      color: $main-color;\n    }\n  }\n\n  .goods-item-view {\n    display: flex;\n    flex-direction: row;\n    padding: 10rpx 30rpx;\n    background-color: #eef1f2;\n\n    .goods-info {\n      padding-left: 30rpx;\n      flex: 1;\n      .goods-title {\n        margin-bottom: 10rpx;\n        color: $font-color-dark;\n      }\n      .goods-specs {\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        color: #cccccc;\n      }\n      .goods-price {\n        display: flex;\n        flex-direction: row;\n        justify-content: space-between;\n        font-size: 28rpx;\n        margin-bottom: 10rpx;\n        color: $light-color;\n        .num {\n          font-size: 24rpx;\n          color: #999999;\n        }\n      }\n    }\n    .goods-num {\n      width: 60rpx;\n      color: $main-color;\n    }\n  }\n}\n.after-num {\n  margin: 0rpx 30rpx;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  height: 80rpx;\n}\n\n.opt-tip {\n  margin-top: 20rpx;\n  padding: 10rpx 30rpx;\n  font-size: 22rpx;\n}\n.opt-view {\n  background-color: #fff;\n  margin-top: 20rpx;\n  padding: 10rpx 30rpx;\n  .how-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    height: 80rpx;\n    border-bottom: 1px solid $page-color-base;\n  }\n  .explain-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    height: 150rpx;\n  }\n  .img-title {\n    height: 80rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n  }\n  .images-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    flex-wrap: wrap;\n  }\n}\n.item-apply-voucher {\n  width: 100%;\n  display: flex;\n  justify-content: flex-end;\n}\n.submit-view {\n  position: fixed;\n  z-index: 999;\n  bottom: 0px;\n  left: 0px;\n  margin-top: 100rpx;\n  border: solid 2rpx #f2f2f2;\n  background-color: #ffffff;\n  height: 100rpx;\n  width: 750rpx;\n  justify-content: flex-end;\n\n  display: flex;\n  align-items: center;\n  width: 100%;\n  padding-right: 32rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/order/afterSales/afterSalesDetailExpress.vue",
    "content": "<template>\n  <view class=\"mp-iphonex-bottom content\">\n    <u-form :model=\"form\" ref=\"uForm\">\n      <view class=\"after-sales-goods-detail-view\">\n        <view class=\"header\">\n          <view>\n            本次售后服务将由\n            <text class=\"seller-name\">{{ sku.storeName }}</text>\n            为您提供\n          </view>\n        </view>\n        <view>\n          <view class=\"goods-item-view\" @click=\"gotoGoodsDetail(sku)\">\n            <view class=\"goods-img\">\n              <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"sku.image\"></u-image>\n            </view>\n            <view class=\"goods-info\">\n              <view class=\"goods-title u-line-2\">{{ sku.name }}</view>\n              <view class=\"goods-price\">\n                <span>￥{{ sku.price | unitPrice }}</span>\n                <span class=\"num\">购买数量: {{ sku.num }} </span>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n\n      <scroll-view scroll-y>\n        <!-- 上传凭证 -->\n        <view class=\"opt-view\">\n          <view class=\"img-title\" style=\"font-size: 30rpx\">填写物流信息</view>\n          <u-form-item label=\"返回方式\" :label-width=\"150\">\n            <div style=\"width: 100%; text-align: right;\">快递至第三方卖家</div>\n          </u-form-item>\n          <u-form-item label=\"快递公司\" :label-width=\"150\">\n            <div style=\"width: 100%; text-align: right;\" @click=\"companySelectShow = true\">\n              {{ form.courierCompany || '请选择快递公司' }}\n            </div>\n          </u-form-item>\n          <u-form-item label=\"快递单号\" :label-width=\"150\">\n            <u-input input-align=\"right\" v-model=\"form.logisticsNo\" placeholder=\"请输入快递单号\"/>\n          </u-form-item>\n          <u-form-item label=\"发货时间\" :label-width=\"150\">\n            <div style=\"width: 100%; text-align: right;\" @click=\"timeshow = true\">{{\n                form.mDeliverTime || '请选择发货时间'\n              }}\n            </div>\n          </u-form-item>\n        </view>\n      </scroll-view>\n\n      <view class=\"submit-view\">\n        <u-button ripple :customStyle=\"{'background':$lightColor,'color':'#fff' }\" shape=\"circle\" @click=\"onSubmit\">\n          提交申请\n        </u-button>\n      </view>\n    </u-form>\n    <u-select mode=\"single-column\" :list=\"companyList\" v-model=\"companySelectShow\"\n              @confirm=\"companySelectConfirm\"></u-select>\n    <u-calendar v-model=\"timeshow\" :mode=\"'date'\" @change=\"onTimeChange\"></u-calendar>\n    <u-toast ref=\"uToast\"/>\n  </view>\n</template>\n\n<script>\nimport {getLogistics} from \"@/api/address.js\";\nimport {fillShipInfo} from \"@/api/after-sale.js\";\nimport storage from \"@/utils/storage\";\n\nexport default {\n  data() {\n    return {\n      //快递公司 弹出框\n      companySelectShow: false,\n      companyList: [], //快递公司集合\n      timeshow: false, //发货时间\n      form: {\n        courierCompany: \"\", //快递公司\n        logisticsId: \"\", //快递公司ID\n        logisticsNo: \"\", //快递单号\n        mDeliverTime: \"\", //发货时间\n      },\n      serviceDetail: {}, //服务详情\n      sku: {}, //sku信息\n    };\n  },\n  onLoad(options) {\n\n    this.sku = storage.getAfterSaleData();\n    let navTitle = \"服务单详情\";\n    uni.setNavigationBarTitle({\n      title: navTitle, //此处写页面的title\n    });\n    this.serviceDetail.sn = options.serviceSn;\n    this.Logistics();\n  },\n  methods: {\n    /**\n     * 确认快递公司\n     */\n    companySelectConfirm(e) {\n      this.form.logisticsId = e[0].value;\n      this.form.courierCompany = e[0].label;\n    },\n\n    /**\n     * 获取快递公司\n     */\n    Logistics() {\n      getLogistics().then((res) => {\n        if (res.data.success) {\n          res.data.result.forEach((item, index) => {\n            this.companyList[index] = {\n              value: item.id,\n              label: item.name,\n            };\n          });\n        }\n      });\n    },\n\n    /**\n     * 更改时间\n     */\n    onTimeChange(e) {\n      this.form.mDeliverTime = e.result;\n    },\n\n    /**\n     * 点击提交\n     */\n    onSubmit() {\n      delete this.form.courierCompany;\n\n      if (this.form.logisticsId == \"\") {\n        this.$refs.uToast.show({\n          title: \"请选择快递公司\",\n          type: \"error\",\n        });\n        return;\n      }\n      if (this.form.logisticsNo == \"\") {\n        this.$refs.uToast.show({\n          title: \"请填写快递单号\",\n          type: \"error\",\n        });\n        return;\n      }\n      if (this.form.mDeliverTime == \"\") {\n        this.$refs.uToast.show({\n          title: \"请选择发货时间\",\n          type: \"error\",\n        });\n        return;\n      }\n\n      uni.showLoading({\n        title: \"加载中\",\n        mask: true,\n      });\n      fillShipInfo(this.serviceDetail.sn, this.form).then((res) => {\n        if (this.$store.state.isShowToast) {\n          uni.hideLoading()\n        }\n        ;\n        if (res.statusCode === 200) {\n          this.$refs.uToast.show({\n            title: \"提交成功\",\n            type: \"success\",\n            back: true,\n            url: \"/pages/order/afterSales/afterSales\",\n          });\n        }\n      });\n    },\n    gotoGoodsDetail(sku) {\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${sku.skuId}&goodsId=${sku.goodsId}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n}\n\n.mp-iphonex-bottom {\n  overflow: hidden;\n}\n\n.after-sales-goods-detail-view {\n  background-color: #fff;\n  padding: 10rpx 0rpx;\n\n  .header {\n    background-color: #f7f7f7;\n    color: #999999;\n    font-size: 22rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    line-height: 70rpx;\n\n    .header-text {\n      background-color: #999999;\n      padding: 10rpx 30rpx;\n      border-radius: 50rpx;\n    }\n\n    .seller-name {\n      color: $main-color;\n    }\n  }\n\n  .goods-item-view {\n    display: flex;\n    flex-direction: row;\n    padding: 20rpx 30rpx;\n    background-color: #eef1f2;\n\n    .goods-info {\n      padding-left: 30rpx;\n      flex: 1;\n\n      .goods-title {\n        margin-bottom: 10rpx;\n        color: $font-color-dark;\n      }\n\n      .goods-specs {\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        color: #cccccc;\n      }\n\n      .goods-price {\n        display: flex;\n        flex-direction: row;\n        justify-content: space-between;\n        font-size: 28rpx;\n        margin-bottom: 10rpx;\n        color: $light-color;\n\n        .num {\n          font-size: 24rpx;\n          color: #999999;\n        }\n      }\n    }\n\n    .goods-num {\n      width: 60rpx;\n      color: $main-color;\n    }\n  }\n}\n\n.opt-view {\n  background-color: #fff;\n  padding: 40rpx 30rpx 0rpx 30rpx;\n\n  font-size: 26rpx;\n\n  .how-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    height: 80rpx;\n    border-bottom: 1px solid $page-color-base;\n  }\n\n  .explain-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    height: 150rpx;\n  }\n\n  .img-title {\n    height: 80rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n  }\n\n  .images-view {\n    padding: 20rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    flex-wrap: wrap;\n  }\n}\n\n.submit-view {\n  position: fixed;\n  z-index: 999;\n  bottom: 10px;\n  left: 0px;\n  margin-top: 100rpx;\n  height: 100rpx;\n  width: 750rpx;\n  align-items: center;\n  padding: 0rpx 20rpx;\n  color: #fff;\n}\n</style>\n"
  },
  {
    "path": "pages/order/afterSales/afterSalesSelect.vue",
    "content": "<template>\n  <view>\n    <view class=\"after-sales-goods-detail-view\">\n      <view class=\"header\">\n        <view>\n          本次售后服务将由\n          <text class=\"seller-name\">{{ sku.storeName }}</text>\n          为您提供\n        </view>\n      </view>\n      <view>\n        <view class=\"goods-item-view\" :key=\"index\" v-for=\"(item,index) in sku.orderItems\" v-if=\"item.sn == sn\" @click=\"navigateToGoodsDetail(sku.skuId)\">\n          <view class=\"goods-img\">\n            <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"item.image\"></u-image>\n          </view>\n          <view class=\"goods-info\">\n            <view class=\"goods-title u-line-2\">{{ item.name }}</view>\n            <view class=\"goods-price\">\n              <span v-if=\"sku.orderItems.length <= 1\">￥{{ sku.flowPrice }}</span>\n              <span class=\"num\" v-else>购买数量{{item.num}}</span>\n              <span v-if=\"sku.orderItems.length <= 1\" class=\"num\">购买数量: {{ item.num }}</span>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <view class=\"select-view\">\n      <view class=\"select-cell\"  v-if=\"applyInfo.returnGoods\"  @click=\"onSelect(1)\">\n        <view class=\"select-image\">\n          <image style=\"height: 51rpx; width: 51rpx\" src=\"/static/order/t1.png\"></image>\n        </view>\n        <view class=\"right\">\n          <view class=\"select-title\">退货</view>\n          <view class=\"select-sub-title\">\n            退回收到的商品\n            <u-icon name=\"arrow-right\"  color=\"#bababa\"></u-icon>\n          </view>\n        </view>\n      </view>\n      <view class=\"select-cell\" v-if=\"applyInfo.returnMoney\"  @click=\"onSelect(3)\">\n        <view class=\"select-image\">\n          <image style=\"height: 51rpx; width: 51rpx\" src=\"/static/order/t3.png\"></image>\n        </view>\n        <view class=\"right\">\n          <view class=\"select-title\">退款</view>\n          <view class=\"select-sub-title\">\n            退款商品返还金额\n            <u-icon name=\"arrow-right\"  color=\"#bababa\"></u-icon>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { getAfterSaleInfo } from \"@/api/after-sale\";\nimport storage from \"@/utils/storage\";\nexport default {\n  data() {\n    return {\n      sn: \"\",\n      sku: {}, //sku\n      applyInfo:\"\"\n    };\n  },\n  onLoad(options) {\n    this.sn = options.sn;\n    this.sku = storage.getAfterSaleData();\n    // 查看当前商品是否支持退款退货\n    this.init()\n  },\n  methods: {\n    // 初始化数据\n    init() {\n      getAfterSaleInfo(this.sn).then((response) => {\n        if (response.data.success) {\n          this.applyInfo = response.data.result;\n        }\n      });\n    },\n\n    /**\n     * 选择退货流程\n     */\n    onSelect(value) {\n      uni.redirectTo({\n        url: `./afterSalesDetail?sn=${this.sn}&value=${value}`,\n      });\n    },\n\n    /**\n     * 跳转到商品信息\n     */\n    navigateToGoodsDetail(id) {\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${id}&goodsId=${goodsId}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n}\n.after-sales-goods-detail-view {\n  background-color: #fff;\n  .header {\n    background-color: #f7f7f7;\n    color: #999999;\n    font-size: 22rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    line-height: 70rpx;\n    .header-text {\n      background-color: #999999;\n      padding: 10rpx 30rpx;\n      border-radius: 50rpx;\n    }\n    .seller-name {\n      color: $main-color;\n    }\n  }\n\n  .goods-item-view {\n    display: flex;\n    flex-direction: row;\n    padding: 10rpx 30rpx;\n    background-color: #eef1f2;\n    .goods-img {\n    }\n    .goods-info {\n      padding-left: 30rpx;\n      flex: 1;\n      .goods-title {\n        margin-bottom: 10rpx;\n        color: $font-color-dark;\n      }\n      .goods-specs {\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        color: #cccccc;\n      }\n      .goods-price {\n        display: flex;\n        flex-direction: row;\n        justify-content: space-between;\n        font-size: 28rpx;\n        margin-bottom: 10rpx;\n        color: $light-color;\n        .num {\n          font-size: 24rpx;\n          color: #999999;\n        }\n      }\n    }\n    .goods-num {\n      width: 60rpx;\n      color: $main-color;\n    }\n  }\n}\n.select-view {\n  background-color: #fff;\n  margin-top: 20rpx;\n  .select-cell {\n    display: flex;\n    align-items: center;\n    margin: 0rpx 20rpx;\n    line-height: 110rpx;\n    border-bottom: 1px solid $page-color-base;\n    .select-image {\n      width: 51rpx;\n      height: 110rpx;\n      line-height: 110rpx;\n      display: flex;\n      align-items: center;\n    }\n    .right {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      .select-title {\n        margin-left: 18rpx;\n        color: #666666;\n        width: 200rpx;\n      }\n      .select-sub-title {\n        color: #cccccc;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/order/afterSales/applyDetail.vue",
    "content": "<template>\n  <view v-if=\"serviceDetail\">\n    <view class=\"after-sales-goods-detail-view\">\n      <view class=\"header\">\n        <view>\n          本次售后服务将由\n          <text class=\"seller-name\">{{ serviceDetail.storeName }}</text>\n          为您提供\n        </view>\n      </view>\n      <view class=\"apply-info-view\">\n        <view class=\"status-info\">\n          <view class=\"status-info-box\">\n            <view class=\"status-val\">{{\n            serviceDetail.serviceStatus | serviceStatusList\n            }}</view>\n\n            <view class=\"status-tip\">{{\n              serviceDetail.serviceStatus | statusFilter\n            }}</view>\n          </view>\n        </view>\n        <view class=\"log-box-bottom\"></view>\n        <view class=\"log-box-top\" @click=\"onProgress()\">\n          <view class=\"top01\">\n            <view>审核日志</view>\n            <view class=\"log-first-show\" v-if=\"logs[0]\">{{\n              logs[0].message\n            }}</view>\n          </view>\n         <u-icon name=\"arrow-right\" style=\"margin-right: 5px\" size=\"30\" color=\"#999\"></u-icon>\n        </view>\n      </view>\n      <view class=\"goods-info\">\n        <view class=\"info-box\">\n          <view class=\"goods-item-view\" @click=\"navgiateToGoodsDetail(serviceDetail)\">\n            <view class=\"goods-img\">\n              <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"serviceDetail.goodsImage\"></u-image>\n            </view>\n            <view class=\"goods-info\">\n              <view class=\"goods-title u-line-2\">{{\n                serviceDetail.goodsName\n              }}</view>\n\n              <view class=\"goods-price\">\n                <view class=\"price\"> ￥{{ serviceDetail.flowPrice | unitPrice }}</view>\n                <view>\n                  <view>申请售后数量：{{ serviceDetail.num }}</view>\n                </view>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n\n    <view class=\"apply-detail-view\">\n      <view class=\"detail-item\">\n        <view class=\"title\">服务单号:</view>\n        <view class=\"value\">{{ serviceDetail.sn }}</view>\n      </view>\n      <view class=\"detail-item\">\n        <view class=\"title\">订单编号:</view>\n        <view class=\"value\">{{ serviceDetail.orderSn }}</view>\n      </view>\n      <view class=\"detail-item\" v-if=\"serviceDetail.new_order_sn\">\n        <view class=\"title\">新订单编号:</view>\n        <view class=\"value\">{{ serviceDetail.new_order_sn }}</view>\n      </view>\n      <view class=\"detail-item\">\n        <view class=\"title\">服务类型:</view>\n        <view class=\"value\">{{\n          serviceTypeList[serviceDetail.serviceType]\n        }}</view>\n      </view>\n      <view class=\"detail-item\">\n        <view class=\"title\">申请原因:</view>\n        <view class=\"value\">{{ reason }}</view>\n      </view>\n      <!-- <view class=\"detail-item\" v-if=\"serviceDetail.apply_vouchers\">\n\t\t\t\t<view class=\"title\">申请凭证:</view>\n\t\t\t\t<view class=\"value\">{{ serviceDetail.apply_vouchers }}</view>\n\t\t\t</view> -->\n      <view class=\"detail-item\" v-if=\"serviceDetail.problemDesc\">\n        <view class=\"title\">问题描述:</view>\n        <view class=\"value\">{{ serviceDetail.problemDesc }}</view>\n      </view>\n\n      <view class=\"detail-item\" v-if=\"\n          serviceDetail.afterSaleImage &&\n          serviceDetail.afterSaleImage.split(',').length != 0\n        \">\n        <view v-for=\"(img, index) in serviceDetail.afterSaleImage.split(',')\" :key=\"index\">\n          <u-image width=\"100\" height=\"100\" :src=\"img\" @click=\"preview(serviceDetail.afterSaleImage.split(','), index)\"\n            ></u-image>\n        </view>\n      </view>\n      <!-- 如果服务类型为退款则不显示 -->\n      <view class=\"detail-item\"\n        v-if=\"serviceDetail.serviceType != 'RETURN_MONEY' && serviceDetail.serviceStatus != 'APPLY'\">\n        <view class=\"title\">收货地址:</view>\n        <view class=\"value\">\n          <span v-if=\"storeAfterSaleAddress.salesConsigneeAddressPath\">{{\n            storeAfterSaleAddress.salesConsigneeAddressPath\n          }}</span>\n        </view>\n      </view>\n      <!-- 如果服务类型为退款则不显示 -->\n      <view class=\"detail-item\"\n        v-if=\"serviceDetail.serviceType != 'RETURN_MONEY'  && serviceDetail.serviceStatus != 'APPLY'\">\n        <view class=\"title\">联系人:</view>\n        <view class=\"value\">{{ storeAfterSaleAddress.salesConsigneeName }}</view>\n      </view>\n      <!-- 如果服务类型为退款则不显示 -->\n      <view class=\"detail-item\"\n        v-if=\"serviceDetail.serviceType != 'RETURN_MONEY'  && serviceDetail.serviceStatus != 'APPLY'\">\n        <view class=\"title\">联系方式:</view>\n        <view class=\"value\">{{\n          storeAfterSaleAddress.salesConsigneeMobile || \"\" | secrecyMobile\n        }}</view>\n      </view>\n      <view v-if=\"refundShow\">\n        <view class=\"detail-item\">\n          <view class=\"title\">退款金额:</view>\n          <view class=\"value\">{{\n            serviceDetail.flowPrice | unitPrice(\"￥\")\n          }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.agree_price\">\n          <view class=\"title\">同意退款:</view>\n          <view class=\"value\">{{\n            serviceDetail.agree_price | unitPrice(\"￥\")\n          }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.actual_price\">\n          <view class=\"title\">实际退款:</view>\n          <view class=\"value\">{{\n            serviceDetail.actual_price | unitPrice(\"￥\")\n          }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.actual_price\">\n          <view class=\"title\">退款时间:</view>\n          <view class=\"value\">{{\n            serviceDetail.refund_time | unixToDate\n          }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.refund_price !== 0\">\n          <view class=\"title\">退款方式:</view>\n          <view class=\"value\">{{\n            serviceDetail.refundWay | refundWayFilter\n          }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"accountShow && serviceDetail.refund_price != 0\">\n          <view class=\"title\">账户类型:</view>\n          <view class=\"value\">{{\n            serviceDetail.accountType | accountTypeFilter\n          }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"\n            accountShow && !bankShow && serviceDetail.actualRefundPrice != 0\n          \">\n          <view class=\"title\">退款账号:</view>\n          <view class=\"value\">{{ serviceDetail.bankAccountNumber }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"bankShow\">\n          <view class=\"title\">银行名称:</view>\n          <view class=\"value\">{{ serviceDetail.bankAccountName }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"bankShow\">\n          <view class=\"title\">银行账号:</view>\n          <view class=\"value\">{{ serviceDetail.bankAccountNumber }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"bankShow\">\n          <view class=\"title\">银行开户名:</view>\n          <view class=\"value\">{{ serviceDetail.bankAccountName }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"bankShow\">\n          <view class=\"title\">银行开户行:</view>\n          <view class=\"value\">{{ serviceDetail.bankDepositName }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.mlogisticsName\">\n          <view class=\"title\">回寄快递:</view>\n          <view class=\"value\">{{ serviceDetail.mlogisticsName }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.mlogisticsNo\">\n          <view class=\"title\">回寄运单号:</view>\n          <view class=\"value\">{{ serviceDetail.mlogisticsNo }}</view>\n        </view>\n        <view class=\"detail-item\" v-if=\"serviceDetail.mDeliverTime\">\n          <view class=\"title\">回寄时间:</view>\n          <view class=\"value\">{{ serviceDetail.mDeliverTime }}</view>\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport {\n  getServiceDetail,\n  getStoreAfterSaleAddress,\n  getAfterSaleLog,\n  getAfterSaleReason,\n} from \"@/api/after-sale.js\";\nexport default {\n  data() {\n    return {\n      reason: \"\", //申请原因\n      serviceTypeList: {\n        // 售后类型\n        CANCEL: \"取消\",\n        RETURN_GOODS: \"退货\",\n        EXCHANGE_GOODS: \"换货\",\n        RETURN_MONEY: \"退款\",\n      },\n      serviceDetail: {}, // 售后详情\n      logs: [], //日志\n      goodsList: [], //商品列表\n      storeAfterSaleAddress: {}, //售后地址\n      refundShow: false, //退款开关\n      accountShow: false, //账户显示\n      bankShow: false, //银行显示\n      sn: \"\", //订单sn\n    };\n  },\n  onLoad(options) {\n    uni.setNavigationBarTitle({\n      title: \"服务单详情\",\n    });\n    this.sn = options.sn;\n    this.loadDetail();\n    this.getAddress();\n    this.getLog(options.sn);\n  },\n  filters: {\n    /**\n     * 售后状态信息\n     */\n    statusFilter(val) {\n      switch (val) {\n        case \"APPLY\":\n          return \"售后服务申请成功，等待商家审核\";\n        case \"PASS\":\n          return \"售后服务申请审核通过\";\n        case \"REFUSE\":\n          return \"售后服务申请已被商家拒绝，如有疑问请及时联系商家\";\n        case \"FULL_COURIER\":\n          return \"申请售后的商品已经寄出，等待商家收货\";\n        case \"STOCK_IN\":\n          return \"商家已将售后商品入库\";\n        case \"WAIT_FOR_MANUAL\":\n          return \"等待平台进行人工退款\";\n        case \"REFUNDING\":\n          return \"商家退款中，请您耐心等待\";\n        case \"COMPLETED\":\n          return \"售后服务已完成，感谢您的支持\";\n        case \"ERROR_EXCEPTION\":\n          return \"系统生成新订单异常，等待商家手动创建新订单\";\n        case \"CLOSED\":\n          return \"售后服务已关闭\";\n        case \"WAIT_REFUND\":\n          return \"等待平台进行退款\";\n        default:\n          return \"\";\n      }\n    },\n\n    /**\n     * 退款信息\n     */\n    refundWayFilter(val) {\n      switch (val) {\n        case \"OFFLINE\":\n          return \"账户退款\";\n        case \"OFFLINE\":\n          return \"线下退款\";\n        case \"ORIGINAL\":\n          return \"原路退回\";\n        default:\n          return \"\";\n      }\n    },\n    /**\n     * 账户信息\n     */\n    accountTypeFilter(val) {\n      switch (val) {\n        case \"WEIXINPAY\":\n          return \"微信\";\n        case \"ALIPAY\":\n          return \"支付宝\";\n        case \"BANK_TRANSFER\":\n          return \"银行卡\";\n        default:\n          return \"\";\n      }\n    },\n  },\n  methods: {\n    /**\n     * 点击图片放大或保存\n     */\n    preview(urls, index) {\n      uni.previewImage({\n        current: index,\n        urls: urls,\n        longPressActions: {\n          itemList: [\"保存图片\"],\n          success: function (data) {},\n          fail: function (err) {},\n        },\n      });\n    },\n\n    /**\n     * 获取地址信息\n     */\n    getAddress() {\n      getStoreAfterSaleAddress(this.sn).then((res) => {\n        if (res.data.success) {\n          this.storeAfterSaleAddress = res.data.result;\n        }\n      });\n    },\n\n    /**\n     * 获取日志\n     */\n    getLog(sn) {\n      getAfterSaleLog(sn).then((res) => {\n        this.logs = res.data.result;\n      });\n    },\n\n    /**\n     * 获取申请原因\n     */\n    getReasonList(serviceType) {\n      getAfterSaleReason(serviceType).then((res) => {\n        if (res.data.success) {\n          // 1357583466371219456\n          this.reason = this.serviceDetail.reason;\n        }\n      });\n    },\n\n    /**\n     * 初始化详情\n     */\n    loadDetail() {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      getServiceDetail(this.sn).then((res) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        this.serviceDetail = res.data.result;\n        if (\n          this.serviceDetail.serviceType == \"RETURN_GOODS\" ||\n          this.serviceDetail.serviceType === \"RETURN_MONEY\"\n        ) {\n          this.refundShow = true;\n        }\n\n        this.accountShow =\n          (this.serviceDetail.serviceType === \"RETURN_GOODS\" ||\n            this.serviceDetail.serviceType === \"ORDER_CANCEL\") &&\n          this.serviceDetail.refundWay === \"OFFLINE\";\n\n        this.bankShow =\n          this.serviceDetail.accountType === \"BANK_TRANSFER\" &&\n          this.serviceDetail.refundWay === \"OFFLINE\" &&\n          ((this.serviceDetail.serviceType === \"RETURN_GOODS\") |\n            (this.serviceDetail.serviceType === \"ORDER_CANCEL\") ||\n            this.serviceDetail.serviceType === \"RETURN_MONEY\");\n\n        this.getReasonList(this.serviceDetail.serviceType);\n      });\n    },\n\n    /**\n     * 访问商品详情\n     */\n    navgiateToGoodsDetail(item) {\n      uni.navigateTo({\n        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,\n      });\n    },\n\n    /**\n     * 进度\n     */\n    onProgress() {\n      uni.navigateTo({\n        url: `./applyProgress?sn=${\n          this.serviceDetail.sn\n        }&createTime=${encodeURIComponent(this.serviceDetail.createTime)}\n         &logs=${encodeURIComponent(JSON.stringify(this.logs))}&serviceStatus=${\n          this.serviceDetail.serviceStatus\n        }`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n}\n.after-sales-goods-detail-view {\n  background-color: #fff;\n  .header {\n    background-color: #f7f7f7;\n    color: #999999;\n    font-size: 22rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    line-height: 70rpx;\n    .header-text {\n      background-color: #999999;\n      padding: 10rpx 30rpx;\n      border-radius: 50rpx;\n    }\n    .seller-name {\n      color: $main-color;\n    }\n  }\n  .apply-info-view {\n    background: $page-color-base;\n  }\n\n  .goods-item-view {\n    display: flex;\n    flex-direction: row;\n    padding: 20rpx 30rpx;\n    background-color: #eef1f2;\n    .goods-info {\n      padding-left: 30rpx;\n      flex: 1;\n      .goods-title {\n        margin-bottom: 10rpx;\n        font-size: 28rpx;\n        color: $font-color-dark;\n      }\n      .goods-specs {\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        color: #cccccc;\n      }\n      .goods-price {\n        display: flex;\n        justify-content: space-between;\n        font-size: 24rpx;\n        color: #999999;\n      }\n      .price {\n        color: $light-color;\n      }\n    }\n    .goods-num {\n      width: 60rpx;\n      color: $main-color;\n    }\n  }\n}\n.apply-detail-view {\n  background-color: #f7f7f7;\n  margin-top: 10rpx;\n  padding: 20rpx;\n  color: #666666;\n\n  .detail-item {\n    padding: 12rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    font-size: 24rpx;\n    .title {\n      padding-left: 10rpx;\n      width: 140rpx;\n    }\n    .value {\n      padding-left: 40rpx;\n    }\n  }\n}\n\n.log-box-bottom {\n  height: 120rpx;\n  flex-direction: column;\n  background-color: rgb(247, 247, 247);\n}\n.log-box-top {\n  height: 153rpx;\n  display: flex;\n  flex-direction: row;\n  background-color: rgb(255, 255, 255);\n  position: absolute;\n  top: 200rpx;\n  left: 0rpx;\n  right: 0rpx;\n  bottom: 0rpx;\n  margin-left: 22rpx;\n  margin-right: 22rpx;\n  margin-top: 22rpx;\n  border-radius: 22rpx;\n  justify-content: space-between;\n  align-items: center;\n  padding-bottom: 52rpx;\n  padding-top: 52rpx;\n  padding-left: 32rpx;\n\n  .top01 {\n    width: 90%;\n    font-family: PingFangSC-Regular;\n    font-size: 28rpx;\n    line-height: 30rpx;\n    color: rgb(46, 45, 45);\n    overflow: hidden;\n    text-overflow: ellipsis;\n    overflow-wrap: break-word;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    white-space: normal;\n\n    .log-first-show {\n      flex-direction: row;\n      margin-top: 16rpx;\n      margin-right: 44rpx;\n      font-family: PingFangSC-Regular;\n      font-size: 22rpx;\n      color: rgb(140, 140, 140);\n      line-height: 30rpx;\n    }\n  }\n}\n.status-info {\n  flex-direction: row;\n  background-color: $light-color;\n\n  .status-info-box {\n    height: 180rpx;\n    flex-direction: row;\n    padding-left: 54rpx;\n    padding-right: 54rpx;\n    padding-top: 20rpx;\n    font-family: PingFangSC-Regular;\n    color: rgb(255, 255, 255);\n    background-color: rgba(0, 0, 0, 0);\n    line-height: 50rpx;\n\n    .status-val {\n      font-size: 32rpx;\n    }\n    .status-tip {\n      font-size: 24rpx;\n    }\n  }\n}\n.info-box {\n  padding-right: 40rpx 0rpx;\n  background-color: #eef1f2;\n}\n</style>\n"
  },
  {
    "path": "pages/order/afterSales/applyProgress.vue",
    "content": "<template>\r\n  <view>\r\n    <view class=\"info-view\">\r\n      <view class=\"header-title-view\">\r\n        <view class=\"title\">售后单号:</view>\r\n        <view>{{ sn }}</view>\r\n      </view>\r\n      <view class=\"header-title-view\">\r\n        <view class=\"title\">申请时间:</view>\r\n        <view>{{ createTime }}</view>\r\n      </view>\r\n    </view>\r\n    <view class=\"info-view\">\r\n      <view class=\"header-title-view\">\r\n        <view>{{ serviceStatus }}</view>\r\n      </view>\r\n    </view>\r\n    <view class=\"info-view\">\r\n      <view>\r\n        <u-time-line v-if=\"logList.length != 0\">\r\n          <u-time-line-item>\r\n            <!-- 此处没有自定义左边的内容，会默认显示一个点 -->\r\n            <template v-slot:content>\r\n              <view v-for=\"(time,index) in logList\" :key=\"index\">\r\n                <view class=\"u-order-desc\">{{time.message}}</view>\r\n                <view class=\"u-order-time\">{{time.createTime}}</view>\r\n              </view>\r\n            </template>\r\n          </u-time-line-item>\r\n        </u-time-line>\r\n        <view v-else>\r\n          <u-empty text=\"暂无审核日志\"></u-empty>\r\n        </view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  data() {\r\n    return {\r\n      sn: \"\", //sn\r\n      createTime: \"\", //创建时间\r\n      logList: [], //日志集合\r\n      serviceStatus: \"\", //订单状态\r\n    };\r\n  },\r\n  onLoad(options) {\r\n    this.sn = options.sn;\r\n    this.createTime = decodeURIComponent(options.createTime);\r\n    this.serviceStatus = this.statusFilter(options.serviceStatus);\r\n    this.logList = JSON.parse(decodeURIComponent(options.logs));\r\n\r\n  },\r\n  methods: {\r\n    statusFilter(val) {\r\n      switch (val) {\r\n        case \"APPLY\":\r\n          return \"售后服务申请成功，等待商家审核\";\r\n        case \"PASS\":\r\n          return \"售后服务申请审核通过\";\r\n        case \"REFUSE\":\r\n          return \"售后服务申请已被商家拒绝，如有疑问请及时联系商家\";\r\n        case \"FULL_COURIER\":\r\n          return \"申请售后的商品已经寄出，等待商家收货\";\r\n        case \"STOCK_IN\":\r\n          return \"商家已将售后商品入库\";\r\n        case \"WAIT_FOR_MANUAL\":\r\n          return \"等待平台进行人工退款\";\r\n        case \"REFUNDING\":\r\n          return \"商家退款中，请您耐心等待\";\r\n        case \"COMPLETED\":\r\n          return \"售后服务已完成，感谢您的支持\";\r\n        case \"ERROR_EXCEPTION\":\r\n          return \"系统生成新订单异常，等待商家手动创建新订单\";\r\n        case \"CLOSED\":\r\n          return \"售后服务已关闭\";\r\n        case \"WAIT_REFUND\":\r\n          return \"等待平台进行退款\";\r\n        default:\r\n          return \"\";\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\npage,\r\n.content {\r\n  background: $page-color-base;\r\n  height: 100%;\r\n}\r\n\r\n.u-order-time {\r\n  font-size: 24rpx;\r\n  color: #999;\r\n  margin: 20rpx 0;\r\n}\r\n\r\n.info-view {\r\n  margin: 20rpx 0;\r\n  border-radius: 20rpx;\r\n  background-color: #fff;\r\n  padding: 30rpx;\r\n\r\n  .header-title-view {\r\n    display: flex;\r\n    flex-direction: row;\r\n    align-items: center;\r\n    color: #909399;\r\n\r\n    .title {\r\n      width: 160rpx;\r\n    }\r\n  }\r\n\r\n  .steps-view {\r\n    display: flex;\r\n    flex-direction: row;\r\n    align-items: center;\r\n    color: #909399;\r\n    border-bottom: 1px solid $page-color-base;\r\n    margin-bottom: 10rpx;\r\n\r\n    .title {\r\n      width: 160rpx;\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/order/afterSales/applySuccess.vue",
    "content": "<template>\n  <view>\n    <view class=\"header\">\n      <u-icon name='checkmark' size=\"150\" color=\"#ff6b35\"></u-icon>\n      <view class=\"success-text\">售后申请提交成功</view>\n      <view class=\"btn-view\">\n        <view class=\"btn-item\">\n          <u-button ripple class=\"btn1\" shape=\"circle\" @click=\"navigateToAfterSales()\">查看记录</u-button>\n        </view>\n        <view class=\"btn-item\">\n          <u-button ripple class=\"btn2\" shape=\"circle\" @click=\"navigateToHome()\">回到主页</u-button>\n        </view>\n      </view>\n    </view>\n    <view class=\"text-view\">\n      <view style=\"display: flex; margin-bottom: 20rpx; align-items: center\">温馨提示：</view>\n      <view>• 商品寄回地址将在审核通过后在申请记录中查询。</view>\n      <view>• 提交服务单后，售后专员可能与您电话沟通，请保持手机畅通。</view>\n      <view>• 退货处理成功后退款金额将原路返回到您的支持账户中；</view>\n    </view>\n  </view>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {};\n  },\n  methods: {\n    /**\n     * 跳转到售后服务\n     */\n    navigateToAfterSales() {\n      uni.redirectTo({\n        url: \"/pages/order/afterSales/afterSales\",\n      });\n    },\n\n    /**\n     * 跳转到首页\n     */\n    navigateToHome() {\n      uni.switchTab({\n        url: \"/pages/tabbar/home/index\",\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage {\n  background: $page-color-base;\n  padding-bottom: 100rpx;\n}\n.btn1 {\n  background: $light-color;\n  color: #fff;\n}\n.btn2 {\n  color: $light-color;\n}\n.header {\n  background-color: #fff;\n  height: 500rpx;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  .success-text {\n    font-size: 40rpx;\n    font-weight: 400;\n    margin: 20rpx 0;\n  }\n  .btn-view {\n    display: flex;\n    flex-direction: row;\n    margin: 40rpx 0rpx;\n    .btn-item {\n      margin: 0rpx 20rpx;\n    }\n  }\n}\n.text-view {\n  margin: 40rpx;\n  color: #909399;\n}\n</style>\n"
  },
  {
    "path": "pages/order/complain/complain.vue",
    "content": "<template>\r\n  <view>\r\n    <!-- 商品模块 -->\r\n    <view class=\"seller-view\">\r\n      <view class=\"seller-info u-flex u-row-between\">\r\n        <view class=\"seller-name\">\r\n          <view class=\"name\">{{ order.storeName || \"\" }}</view>\r\n          <view class=\"status\">{{ orderStatusList[order.orderStatus] }}</view>\r\n        </view>\r\n        <view class=\"order-sn\"></view>\r\n      </view>\r\n      <u-line color=\"#DCDFE6\"></u-line>\r\n      <view class=\"goods-item-view\" v-for=\"(sku, index) in orderGoodsList\" :key=\"index\" v-if=\"sku.skuId == skuId\">\r\n        <view class=\"goods-img\">\r\n          <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"sku.image\"></u-image>\r\n        </view>\r\n        <view class=\"goods-info\">\r\n          <view class=\"goods-title u-line-2\">{{ sku.goodsName }}</view>\r\n          <view class=\"goods-price\">\r\n            ￥{{ sku.flowPrice | unitPrice }}\r\n          </view>\r\n        </view>\r\n        <view class=\"goods-num\">\r\n          <view>x{{ sku.num }}</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 投诉主题 -->\r\n    <u-select @confirm=\"confirmComplain\" v-model=\"complainShow\" :list=\"complainList\"></u-select>\r\n    <!-- 投诉模块 -->\r\n    <view class=\"cell\">\r\n      <view class=\"cell-item between\" @click=\"complainShow = true\">\r\n        <view class=\"cell-title\"> 投诉主题 </view>\r\n        <view class=\"cell-view\"> {{ complainTopic }} </view>\r\n        <u-icon style=\"margin-left: 20rpx\" name=\"arrow-down\"></u-icon>\r\n      </view>\r\n\r\n      <view class=\"cell-item complain-content\">\r\n        <view class=\"cell-title title\"> 投诉内容 </view>\r\n        <view class=\"cell-view content\">\r\n          <u-input type=\"textarea\" height=\"70rpx\" auto-height v-model=\"complainValue\" />\r\n        </view>\r\n      </view>\r\n      <view class=\"cell-item\">\r\n        <view class=\"cell-title\"> 投诉凭证 </view>\r\n        <view class=\"cell-view\">\r\n          <u-upload ref=\"uUpload\" :header=\" { accessToken: storage.getAccessToken() }\"   :action=\"action\" width=\"200\" @on-uploaded=\"onUploaded\" :max-count=\"5\">\r\n          </u-upload>\r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <view class=\"submit-btn\" @click=\"handleSubmit\">提交</view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport storage from \"@/utils/storage.js\";\r\nimport { getOrderDetail } from \"@/api/order.js\";\r\nimport { getComplainReason, addComplain } from \"@/api/after-sale.js\";\r\nimport { upload } from \"@/api/common.js\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      storage,\r\n      action: upload, //上传图片地址\r\n      orderStatusList: {\r\n        //订单状态列表\r\n        UNDELIVERED: \"待发货\",\r\n        PARTS_DELIVERED: \"部分发货\",\r\n        UNPAID: \"未付款\",\r\n        PAID: \"已付款\",\r\n        DELIVERED: \"已发货\",\r\n        CANCELLED: \"已取消\",\r\n        COMPLETE: \"已完成\",\r\n        TAKE: \"已完成\",\r\n      },\r\n      complainValue: \"\", //投诉内容\r\n      complainShow: false, //投诉主题开关\r\n      complainTopic: \"\", //投诉抱怨话题\r\n      complainList: [], // 投诉列表\r\n      images: [], //投诉内容图片\r\n      order: \"\", //订单\r\n      orderGoodsList: \"\", //订单商品\r\n      orderDetail: \"\", //订单详情\r\n      sn: \"\",\r\n      skuId: \"\", //商品skuid\r\n    };\r\n  },\r\n\r\n  onLoad(option) {\r\n    this.loadData(option.sn);\r\n    this.sn = option.sn;\r\n    this.skuId = option.skuId;\r\n    this.getReasion();\r\n  },\r\n\r\n  methods: {\r\n    /**\r\n     * 上传完成\r\n     */\r\n    onUploaded(lists) {\r\n      let images = [];\r\n      lists.forEach((item) => {\r\n        images.push(item.response.result);\r\n      });\r\n      this.images = images;\r\n    },\r\n    /**\r\n     * 提交\r\n     */\r\n    handleSubmit() {\r\n      if(!this.images.length && !this.complainValue){\r\n        uni.showToast({\r\n          title:'请上传图片凭证和投诉内容',\r\n          icon:'none'\r\n        })\r\n        return\r\n\r\n      }\r\n      // 循环出商品\r\n      let goods = this.orderGoodsList.filter((item) => {\r\n        return item.skuId == this.skuId;\r\n      });\r\n      //数据赋值\r\n      let data = {\r\n        complainTopic: this.complainTopic, //投诉主题,\r\n        content: this.complainValue, //投诉内容\r\n        goodsId: goods[0].goodsId, //商品id\r\n        images: this.images, //图片\r\n        orderSn: this.sn, //订单号\r\n        skuId: this.skuId, //skuid\r\n      };\r\n      addComplain(data).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            title: \"提交成功!\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n\r\n          setTimeout(() => {\r\n            uni.redirectTo({\r\n              url: \"/pages/order/complain/complainList\",\r\n            });\r\n          }, 1000);\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获取投诉原因\r\n     */\r\n    getReasion() {\r\n      getComplainReason().then((res) => {\r\n        if (res.data.result.length >= 1) {\r\n          res.data.result.forEach((item) => {\r\n            let way = {\r\n              value: item.reason,\r\n              label: item.reason,\r\n            };\r\n            this.complainList.push(way);\r\n          });\r\n          this.complainTopic = res.data.result[0].reason;\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 加载订单详情\r\n     */\r\n    loadData(sn) {\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      getOrderDetail(sn).then((res) => {\r\n        const order = res.data.result;\r\n        this.order = order.order;\r\n        this.orderGoodsList = order.orderItems;\r\n        this.orderDetail = res.data.result;\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 确认投诉\r\n     */\r\n    confirmComplain(e) {\r\n      this.complainTopic = e[0].label;\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../goods.scss\";\r\n.cell {\r\n  width: 100%;\r\n  background: #fff;\r\n  padding: 26rpx;\r\n}\r\n.cell-item {\r\n  padding: 30rpx 0;\r\n  border-bottom: 2rpx solid #f5f7fa;\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n.complain-content {\r\n  display: flex;\r\n  align-items: center;\r\n  .content {\r\n    width: 100%;\r\n  }\r\n  .title {\r\n    width: 140rpx;\r\n  }\r\n}\r\n\r\n/deep/ .u-input__textarea {\r\n  padding: 0;\r\n}\r\n.cell-title {\r\n  font-weight: bold;\r\n  margin-right: 20rpx;\r\n}\r\n.submit-btn {\r\n  width: 70%;\r\n  margin: 0 auto;\r\n  height: 80rpx;\r\n  line-height: 80rpx;\r\n  color: #fff;\r\n  text-align: center;\r\n  background: $light-color;\r\n  margin-top: 20px;\r\n  border-radius: 200px;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/order/complain/complainInfo.vue",
    "content": "<template>\r\n  <view class=\"wrapper\">\r\n    <view class=\"tips\">我的投诉信息</view>\r\n    <u-cell-group>\r\n      <u-cell-item :arrow=\"false\" :value=\"complainDetail.goodsName\" title=\"投诉商品\"></u-cell-item>\r\n      <u-cell-item :arrow=\"false\" :value=\"statusData[complainDetail.complainStatus]\" title=\"投诉状态\"></u-cell-item>\r\n      <u-cell-item :arrow=\"false\" :value=\"complainDetail.createTime\" title=\"投诉时间\"></u-cell-item>\r\n      <u-cell-item :arrow=\"false\" :value=\"complainDetail.complainTopic\" title=\"投诉主题\"></u-cell-item>\r\n      <u-cell-item :arrow=\"false\" :value=\"complainDetail.content\" title=\"投诉内容\"></u-cell-item>\r\n      <view class=\"row\" v-if=\"complainDetail.orderComplaintImages\">\r\n        <u-image width=\"100rpx\" height=\"100rpx\" border-radius=\"10\" style=\"margin: 0 10rpx\" v-for=\"(item, index) in complainDetail.orderComplaintImages\" :key=\"index\" :src=\"item\"\r\n          @click=\"preview(complainDetail.orderComplaintImages, index)\" />\r\n      </view>\r\n    </u-cell-group>\r\n    <view class=\"tips\">商家申诉信息</view>\r\n    <u-cell-group>\r\n      <u-cell-item :arrow=\"false\" :value=\"complainDetail.appealTime || '暂无'\" title=\"申诉时间\"></u-cell-item>\r\n      <u-cell-item :arrow=\"false\" :value=\"complainDetail.appealContent || '暂无'\" title=\"申诉内容\"></u-cell-item>\r\n      <view class=\"row\" v-if=\"complainDetail.appealImagesList\">\r\n        <u-image width=\"100rpx\" height=\"100rpx\" border-radius=\"10\" style=\"margin: 0 10rpx\" v-for=\"(item, index) in complainDetail.appealImagesList\"\r\n          @click=\"preview(complainDetail.appealImagesList, index)\" :key=\"index\" :src=\"item\" />\r\n      </view>\r\n    </u-cell-group>\r\n    <view class=\"tips\">对话详情</view>\r\n    <view class=\"speak-way\" v-if=\"complainDetail.orderComplaintCommunications\">\r\n      <view class=\"speak-msg seller\" :key=\"i\" v-for=\"(complaint, i) in complainDetail.orderComplaintCommunications\">\r\n        {{\r\n          complaint.owner == \"PLATFORM\"\r\n            ? \"平台\"\r\n            : complaint.owner == \"BUYER\"\r\n            ? \"买家\"\r\n            : \"卖家\"\r\n        }}：\r\n        <span>{{ complaint.content }}</span>\r\n      </view>\r\n    </view>\r\n    <view class=\"speak-way\" v-else>暂无对话</view>\n\t<div v-if=\"complainDetail.complainStatus!='COMPLETE'\">\r\n\t\t<view class=\"tips\">回复对话</view>\r\n\t\t<view class=\"cell-item complain-content\">\r\n\t\t  <view class=\"cell-view content\">\r\n\t\t\t<u-input type=\"textarea\" height=\"70rpx\" auto-height v-model=\"complainValue\" />\r\n\t\t  </view>\r\n\t\t</view>\r\n\t\t<view class=\"submit-btn\" @click=\"handleSubmit\">回复</view>\n\t</div>\r\n    <view class=\"tips\">平台仲裁</view>\r\n    <u-cell-group>\r\n      <u-cell-item :arrow=\"false\" title=\"仲裁意见\" :value=\"complainDetail.arbitrationResult || '暂无'\"></u-cell-item>\r\n    </u-cell-group>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getComplainDetail, communication } from \"@/api/after-sale\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      complainId: \"\",\r\n      complainValue: \"\", //回复内容\r\n      complainDetail: \"\", //投诉详情\r\n      statusData: {\r\n        NEW: \"新投诉\",\r\n        NO_APPLY: \"未申请\",\r\n        APPLYING: \"申请中\",\r\n        COMPLETE: \"已完成\",\r\n        EXPIRED: \"已失效\",\r\n        CANCEL: \"已取消\",\r\n        WAIT_ARBITRATION:\"等待仲裁\"\r\n      },\r\n    };\r\n  },\r\n\r\n  onLoad(option) {\r\n    this.complainId = option.id;\r\n    this.init(option.id);\r\n  },\r\n  methods: {\r\n    /**\r\n     * 点击图片放大或保存\r\n     */\r\n    preview(urls, index) {\r\n      uni.previewImage({\r\n        current: index,\r\n        urls: urls,\r\n        longPressActions: {\r\n          itemList: [\"保存图片\"],\r\n          success: function (data) {},\r\n          fail: function (err) {},\r\n        },\r\n      });\r\n    },\r\n    handleSubmit() {\r\n      if (!this.complainValue) {\r\n        uni.showToast({\r\n          title: \"请输入回复内容\",\r\n          duration: 2000,\r\n          icon: \"none\",\r\n        });\r\n        return;\r\n      }\r\n      let params = {\r\n        content: this.complainValue,\r\n        complainId: this.complainId,\r\n      };\r\n      communication(params).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            title: \"回复成功\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n          this.complainValue = '';\r\n          this.init(this.complainId);\r\n        } else {\r\n          uni.showToast({\r\n            title: res.data.message,\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n        }\r\n      });\r\n\r\n    },\r\n    /**\r\n     * 初始化投诉详情\r\n     */\r\n    init(id) {\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      getComplainDetail(id).then((res) => {\r\n        if (res.data.success) {\r\n          this.complainDetail = res.data.result;\r\n        } else {\r\n          uni.showToast({\r\n            title: res.data.message,\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n        }\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.row {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  padding: 26rpx 32rpx;\r\n}\r\n\r\n.speak-msg {\r\n  padding: 26rpx 32rpx;\r\n  > span {\r\n    color: #999 !important;\r\n  }\r\n}\r\n.admin {\r\n  color: $main-color;\r\n}\r\n.speak-way {\r\n  background: #fff;\r\n}\r\n.wrapper {\r\n  padding: 16rpx;\r\n}\r\n.tips {\r\n  margin: 40rpx 32rpx;\r\n}\r\n.cell {\r\n  width: 100%;\r\n  background: #fff;\r\n  padding: 26rpx;\r\n}\r\n.complain-content {\r\n  margin: 40rpx 32rpx;\r\n  display: flex;\r\n  align-items: center;\r\n\r\n  .content {\r\n    width: 100%;\r\n  }\r\n  .title {\r\n    width: 140rpx;\r\n  }\r\n}\r\n.submit-btn {\r\n  width: 70%;\r\n  margin: 0 auto;\r\n  height: 80rpx;\r\n  line-height: 80rpx;\r\n  color: #fff;\r\n  text-align: center;\r\n  background: $light-color;\r\n  margin-top: 20px;\r\n  border-radius: 200px;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/order/complain/complainList.vue",
    "content": "<template>\r\n  <view>\r\n    <view class=\"seller-view\" v-for=\"(item, index) in complaionData\" :key=\"index\">\r\n      <view class=\"seller-info u-flex u-row-between\">\r\n        <view class=\"seller-name\">\r\n          <view class=\"name\">{{ item.storeName }}</view>\r\n        </view>\r\n        <view class=\"order-sn\">{{ statusData[item.complainStatus] }}</view>\r\n      </view>\r\n      <u-line color=\"#DCDFE6\"></u-line>\r\n      <view class=\"goods-item-view\">\r\n        <view class=\"goods-img\" @click=\"handleToGoods(item)\">\r\n          <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"item.goodsImage\"></u-image>\r\n        </view>\r\n        <view class=\"goods-info\" @click=\"handleToGoods(item)\">\r\n          <view class=\"goods-title u-line-2\">{{ item.goodsName }}</view>\r\n          <view class=\"goods-price\">\r\n            ￥{{ item.goodsPrice | unitPrice }}\r\n            <!-- <span>+{{ '1' }}积分</span> -->\r\n          </view>\r\n        </view>\r\n        <view class=\"goods-num\">\r\n          <view>x{{ item.num }}</view>\r\n        </view>\r\n      </view>\r\n      <view class=\"complain-item-view\">\r\n        <view class=\"complain-time\"> {{ item.createTime }} </view>\r\n        <view class=\"complain-speak\"> {{ item.complainTopic }} </view>\r\n      </view>\r\n      <view class=\"complain-btn\">\r\n        <u-tag mode=\"plain\" @click=\"handleClear(item)\" class=\"complain-tag\" text=\"撤销投诉\" type=\"info\"\n\t\t v-if=\"item.complainStatus === 'APPLYING' || item.complainStatus === 'NEW'\" />\r\n        <u-tag mode=\"plain\" @click=\"handleInfo(item)\" class=\"complain-tag\" text=\"投诉详情\" type=\"info\" />\r\n      </view>\r\n    </view>\r\n\r\n    <u-empty v-if=\"empty\" :style=\"{'marginTop':complaionDetail.total == 0 ? '200rpx':'0rpx'}\" class=\"empty\" style=\"\" text=\"暂无投诉列表\" mode=\"list\"></u-empty>\r\n\r\n    <u-modal show-cancel-button @confirm=\"handleClearConfirm\" v-model=\"show\" :content=\"content\"></u-modal>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getComplain, clearComplain } from \"@/api/after-sale\";\r\n\r\nexport default {\r\n  data() {\r\n    return {\r\n      statusData: {\r\n        NEW: \"新投诉\",\r\n        NO_APPLY: \"未申请\",\r\n        APPLYING: \"申请中\",\r\n        COMPLETE: \"已完成\",\r\n        EXPIRED: \"已失效\",\r\n        CANCEL: \"已取消\",\r\n        WAIT_ARBITRATION:\"等待仲裁\"\r\n      },\r\n      show: false,\r\n      content: \"是否撤销投诉？\",\r\n      params: {\r\n        pageNumber: 1,\r\n        pageSize: 20,\r\n      },\r\n      complaionDetail: \"\", //返回的整个response\r\n      complaionData: [], //投诉列表\r\n      empty: false,\r\n      checkComplainData: \"\", //存储投诉信息\r\n    };\r\n  },\r\n  mounted() {\r\n    this.init();\r\n  },\r\n  /**\r\n   * 触底加载\r\n   */\r\n  onReachBottom() {\r\n    if (\r\n      this.complaionDetail &&\r\n      this.complaionDetail.total < this.params.pageNumber * this.params.pageSize\r\n    ) {\r\n      this.params.pageNumber++;\r\n      this.init();\r\n    }\r\n  },\r\n\r\n  methods: {\r\n    // 点击跳转到商品\r\n    handleToGoods(val) {\r\n      uni.navigateTo({\r\n        url: \"/pages/product/goods?id=\" + val.skuId + \"&goodsId=\" + val.goodsId,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 点击撤销投诉\r\n     */\r\n    handleClear(val) {\r\n      this.show = true;\r\n      this.checkComplainData = val;\r\n    },\r\n    /**\r\n     * 执行撤销\r\n     */\r\n    handleClearConfirm() {\r\n      clearComplain(this.checkComplainData.id).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            title: \"撤销成功\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n          this.complaionData = [];\r\n          this.params.pageNumber = 1;\r\n          this.init();\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 查看详情\r\n     */\r\n    handleInfo(val) {\r\n      uni.navigateTo({\r\n        url: \"./complainInfo?id=\" + val.id,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 初始化投诉列表\r\n     */\r\n    init() {\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      getComplain(this.params).then((res) => {\r\n        this.complaionDetail = res.data.result;\r\n        if (res.data.result.records.length >= 1) {\r\n          this.complaionData.push(...res.data.result.records);\r\n        } else {\r\n          this.empty = true;\r\n        }\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../goods.scss\";\r\n\r\n.complain-item-view {\r\n  border-bottom: 2rpx solid #f5f7fa;\r\n  border-top: 2rpx solid #f5f7fa;\r\n  padding: 20rpx 30rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n}\r\n\r\n.complain-time {\r\n  font-size: 24rpx;\r\n  color: #999;\r\n}\r\n/deep/ .seller-name {\r\n  width: auto !important;\r\n}\r\n.complain-btn {\r\n  padding: 20rpx 0;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: flex-end;\r\n  margin-right: 30rpx;\r\n}\r\n.complain-tag {\r\n  margin-left: 10rpx;\r\n}\r\n.empty {\r\n  margin-top: 40rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/order/deliverDetail.vue",
    "content": "<template>\n\t<div>\n\t\t<view class=\"logistics-detail\">\n\t\t\t<view class=\"card\">\n\t\t\t\t<div v-if=\"logisticsList && logisticsList.length>0\">\n\t\t\t\t\t<ul class=\"express-log\" v-for=\"(packageItem, packageIndex) in logisticsList\" :key=\"packageIndex\" v-if=\"packageItem\">\n\t\t\t\t\t\t<div class=\"layui-layer-wrap\">\n\t\t\t\t\t\t\t<dl>\n\t\t\t\t\t\t\t\t<dt>物流公司：</dt>\n\t\t\t\t\t\t\t\t<dd><div class=\"text-box\">{{ packageItem.logisticsName }}</div></dd>\n\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t<dl>\n\t\t\t\t\t\t\t\t<dt>快递单号：</dt>\n\t\t\t\t\t\t\t\t<dd>\n\t\t\t\t\t\t\t\t\t<div nctype=\"ordersSn\" class=\"text-box\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"item\" :href='\"https://www.baidu.com/s?wd=\"+packageItem.logisticsNo' target=\"_blank\">{{ packageItem.logisticsNo }}</a>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t</dl>\n\t\t\t\t\t\t\t<div class=\"div-express-log\">\n\t\t\t\t\t\t\t\t<ul class=\"express-log express-log-name\">\n\t\t\t\t\t\t\t\t\t<li v-for=\"(item, index) in packageItem.orderPackageItemList\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t\t<p class=\"time\" style=\"width: 50%;\"><span>商品名称：</span><span>{{ item.goodsName }}</span></p>\n\t\t\t\t\t\t\t\t\t\t<p class=\"time\" style=\"width: 30%;\"><span>发货时间：</span><span>{{ item.logisticsTime }}</span></p>\n\t\t\t\t\t\t\t\t\t\t<p class=\"time\" style=\"width: 20%;\"><span>发货数量：</span><span>{{ item.deliverNumber }}</span></p>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"div-express-log\">\n\t\t\t\t\t\t\t\t<ul class=\"express-log\" v-if=\"packageItem.traces && packageItem.traces.traces\">\n\t\t\t\t\t\t\t\t\t<li v-for=\"(item, index) in packageItem.traces.traces\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"time\">{{ item.AcceptTime || item.acceptTime }}</span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"detail\">{{ item.AcceptStation || item.remark }}</span>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t<ul class=\"express-log\" v-else>\n\t\t\t\t\t\t\t\t\t<li>暂无物流信息</li>\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</view>\n\t\t</view>\n\t</div>\n</template>\n\n<script>\nimport { getPackage } from \"@/api/trade.js\";\nexport default {\n    data() {\n        return {\n            order: {},\n            logisticsList: [],\n        }\n    },\n    components: {\n    },\n    computed: {\n    },\n\tonLoad(option) {\n\t  let sn = option.order_sn;\n\t  this.tracesList(sn);\n\t},\n    mounted() {\n    },\n    methods: {\n        tracesList(sn) {\n            getPackage(sn).then((res) => {\n                if(res.data.success){\n                    this.logisticsList = res.data.result;\n                }\n            });\n        },\n    },\n}\n</script>\n<style >\npage {\n    background: #fff;\n}\n</style>\n<style lang=\"scss\" scoped>\n// @import url('./goods.scss');\n.goods-item-view {\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n    padding: 10rpx 30rpx;\n\n    .goods-img {\n        flex: 1;\n    }\n\n    .goods-info {\n        padding-left: 30rpx;\n        flex: 3;\n\n        .goods-title {\n            margin-bottom: 10rpx;\n            color: $font-color-dark;\n        }\n\n        .goods-specs {\n            font-size: 24rpx;\n            margin-bottom: 10rpx;\n            color: #cccccc;\n        }\n\n        .goods-price {\n            font-size: 28rpx;\n            margin-bottom: 10rpx;\n            color: #ff5a10;\n        }\n    }\n\n    .goods-num {\n        >.good-complaint {\n            margin-top: 10rpx;\n        }\n\n        text-align: center;\n        flex: 1;\n        width: 60rpx;\n        color: $main-color;\n    }\n}\n\n\n.goods-info {\n    flex: 2;\n}\n\n.card-title {\n  background: #f2f2f2;\n}\n.logistics-detail {\n  margin-top: 20rpx;\n  padding: 0 16rpx;\n}\n.card {\n  background: #fff;\n  border-radius: 20rpx;\n  width: 100%;\n  > .card-title {\n    font-size: 24rpx;\n    border-top-left-radius: 20rpx;\n    border-top-right-radius: 20rpx;\n    padding: 16rpx;\n  }\n  > .time-line {\n    padding: 16rpx 32rpx;\n  }\n}\n.u-order-title {\n  font-weight: bold;\n}\n.u-order-desc {\n  font-size: 26rpx;\n  color: #666;\n  margin: 10rpx 0;\n}\n.u-order-time {\n  font-size: 24rpx;\n  color: #999;\n}\n.empty {\n  padding: 40rpx 0;\n}\n\n\n\n.express-log {\n  /*margin: 5px -10px 5px 5px;*/\n  padding: 20rpx;\n  list-style-type: none;\n  li {\n\t  display: flex;\n\t  margin-top: 18rpx;\n  }\n  li:nth-of-type(1) {\n\t  margin-top: 0;\n  }\n  .time {\n    width: 140rpx;\n    display: flex;\n    // float: left;\n\tflex-direction: column;\n\tfont-size: 24rpx;\n\tline-height: 40rpx;\n\tspan:nth-of-type(1) {\n\t\tmargin-bottom: 16rpx;\n\t}\n  }\n\n  .detail {\n    width: 100%;\n\tflex: 1;\n    margin-left: 30rpx;\n    display: inline-block;\n\tfont-size: 24rpx;\n\tline-height: 40rpx;\n  }\n\n  li {\n    line-height: 60rpx;\n  }\n}\n.layui-layer-wrap {\n  dl {\n    border-top: solid 1px #f5f5f5;\n    margin-top: -2rpx;\n    overflow: hidden;\n\n    dt {\n      font-size: 26rpx;\n      line-height: 40rpx;\n      display: inline-block;\n      padding: 16rpx 1% 16rpx 0;\n      color: #999;\n    }\n\n    dd {\n      font-size: 26rpx;\n      line-height: 40rpx;\n      display: inline-block;\n      padding: 16rpx 0 16rpx 16rpx;\n      border-left: solid 2rpx #f5f5f5;\n\n      .text-box {\n        line-height: 40rpx;\n        color: #333;\n        word-break: break-all;\n      }\n    }\n  }\n}\n.div-express-log {\n  // max-height: 600rpx;\n  border: solid 2rpx #e7e7e7;\n  background: #fafafa;\n  border-radius: 10rpx;\n  margin-bottom: 6rpx;\n  // overflow-y: auto;\n  // overflow-x: auto;\n}\n</style>"
  },
  {
    "path": "pages/order/evaluate/evaluateDetail.vue",
    "content": "<template>\n  <view>\n    <view class=\"exaluate-member-view\">\n      <view class=\"member-view\">\n        <view class=\"member-img\">\n          <u-image width=\"82rpx\" style=\"border: 1px solid #ededed\" height=\"82rpx\" shape=\"circle\" :src=\"comment.memberProfile || userImage\"></u-image>\n        </view>\n        <view class=\"member-info\">\n          <view class=\"memName\">{{ comment.memberName }}</view>\n          <view class=\"creName\">{{ comment.createTime }}</view>\n        </view>\n      </view>\n      <view class=\"goods-view\">\n        <view class=\"goods-title\">商品评价: {{ gradeList[comment.grade] }}</view>\n        <view class=\"goods-subtitle\">\n          {{ comment.content }}\n        </view>\n        <!-- 如果有图片则会循环显示评价的图片 -->\n        <view class=\"goods-imgs-view\" v-if=\"comment.images != null && comment.images.length != 0\">\n          <view class=\"img-view\" v-for=\"(img, imgIndex) in comment.images.split(',')\" :key=\"imgIndex\">\n            <u-image @click.native=\"preview(comment.images.split(','),imgIndex)\" width=\"160rpx\" height=\"160rpx\" :src=\"img\"></u-image>\n          </view>\n        </view>\n        <view class=\"goods-name\">\n          {{ comment.goodsName }}\n        </view>\n        <view class=\"goods-subtitle\"></view>\n        <view class=\"commentStyle\" v-if=\"comment.reply\">\n          商家回复：\n          <span class=\"addCommentSpan\">{{ comment.reply }}</span>\n          <view class=\"img\">\n            <!-- 循环出商家回复评价的图片 -->\n            <u-image width=\"140rpx\" height=\"140rpx\" v-if=\"comment.replyImage\" v-for=\"(replyImg, replyIndex) in splitImg(comment.replyImage)\" :src=\"replyImg\" :key=\"replyIndex\"\n              @click=\"preview(splitImg( comment.replyImage), index)\">\n            </u-image>\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport configs from '@/config/config'\nexport default {\n  data() {\n    return {\n      configs,\n      userImage:configs.defaultUserPhoto,\n\n      comment: {}, //评论信息\n      gradeList: {\n        //评价grade\n        GOOD: \"好评\",\n        MODERATE: \"中评\",\n        WORSE: \"差评\",\n        haveImage: \"有图\",\n      },\n    };\n  },\n  onLoad(options) {\n    this.comment = JSON.parse(decodeURIComponent(options.comment));\n  },\n  methods: {\n    /**\n     * 切割图像\n     */\n    splitImg(val) {\n      if (val && val.split(\",\")) {\n        return val.split(\",\");\n      } else if (val) {\n        return val;\n      } else {\n        return false;\n      }\n    },\n    /**\n     * 点击图片放大或保存\n     */\n    preview(urls, index) {\n      uni.previewImage({\n        current: index,\n        urls: urls,\n        longPressActions: {\n          itemList: [\"保存图片\"],\n          success: function (data) {},\n          fail: function (err) {},\n        },\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.commentStyle {\n  margin-top: 16rpx;\n  padding: 14rpx 26rpx;\n  background: #f5f5f5;\n  border-radius: 6px;\n  font-size: 22rpx;\n  font-weight: 700;\n  text-align: left;\n  line-height: 40rpx;\n}\n.img {\n  display: flex;\n  flex-wrap: wrap;\n  /* height: 140rpx; */\n  overflow: hidden;\n  margin: 10rpx 0;\n\n  image {\n    width: 166rpx;\n    height: 166rpx;\n    margin: 0 15rpx 15rpx 0;\n\n    &:nth-of-type(3n + 0) {\n      margin: 0 0 15rpx 0;\n    }\n  }\n}\n\n.addCommentSpan {\n  color: $u-tips-color !important;\n  padding-left: 20rpx;\n}\n.memName {\n  font-size: 28rpx;\n}\n\n.goods-name {\n  border-bottom: 1px solid #ededed;\n  padding-bottom: 30rpx;\n}\n.creName,\n.goods-name {\n  font-size: 24rpx;\n  color: $u-tips-color;\n}\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n}\n\n.exaluate-member-view {\n  background-color: #fff;\n  margin-top: 12rpx;\n  padding: 20rpx;\n  .member-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    .member-img {\n      width: 100rpx;\n      margin: 20rpx;\n    }\n    .member-info {\n      margin-left: 15rpx;\n    }\n  }\n  .goods-view {\n    margin-left: 15rpx;\n  }\n}\n.border-bottom {\n  padding-bottom: 20rpx;\n  border-bottom: 1px solid #ededed;\n}\n.goods-title {\n  margin-bottom: 10rpx;\n}\n.goods-subtitle {\n  margin-bottom: 20rpx;\n  color: #909399;\n}\n.goods-imgs-view {\n  margin: 20rpx 0;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  .img-view {\n    margin-right: 15rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/order/evaluate/myEvaluate.vue",
    "content": "<template>\n  <view>\n    <view class=\"wrap\">\n      <view class=\"u-tabs-box\">\n        <u-tabs :list=\"list\" :is-scroll=\"false\" inactive-color=\"#333\" :current=\"current\" class=\"utabs\"\n          :active-color=\"$lightColor\" @change=\"changeTab\"></u-tabs>\n      </view>\n      <swiper class=\"swiper-box\" :current=\"current\" @change=\"changeSwiper\" duration=\"500\">\n        <swiper-item v-for=\"(item, listIndex) in list\" :key=\"listIndex\">\n          <scroll-view scroll-y style=\"height: 100%\" @scrolltolower=\"renderData(listIndex)\">\n            <u-empty text=\"尚无需要评价的商品\" mode=\"list\" v-if=\"orderList.length == 0\"></u-empty>\n            <view class=\"seller-view\" v-for=\"(order, index) in orderList\" :key=\"index\">\n              <!-- 店铺名称 -->\n              <view class=\"box-title\">\n                <view class=\"title_seller_name\">\n                  {{ order.storeName }}\n                </view>\n              </view>\n              <view v-for=\"(sku, _index) in order.orderItems\" :key=\"_index\">\n                <view class=\"goods-item-view\">\n                  <view>\n                    <u-image border-radius=\"6rpx\" width=\"132rpx\" height=\"132rpx\" class=\"goods_img\" :src=\"sku.image\"\n                      alt />\n                  </view>\n                  <view class=\"goods-info\">\n                    <view class=\"goods-title u-line-2\">{{ sku.name }}</view>\n                    <view class=\"text title\">{{ gradeList[order.grade] || '' }}</view>\n                  </view>\n                </view>\n                <view class=\"btn-view u-row-between\" v-if=\"current == 2\">\n                  <view class=\"description\">\n                    <view class=\"text title\">\n                      <u-read-more ref=\"uReadMore\" :color=\"$lightColor\" text-indent=\"0\">\n                        <rich-text :nodes=\"'评论内容：' + order.content || ''\"></rich-text>\n                      </u-read-more>\n                    </view>\n\n                    <view class=\"goods-imgs-view\" v-if=\"order.image\">\n                      <view class=\"img-view\" v-if=\"order.image\" v-for=\"(img, imgIndex) in order.image.split(',')\"\n                        :key=\"imgIndex\">\n                        <u-image v-if=\"order.image\" @click.native=\"\n                            preview(order.image.split(','), imgIndex)\n                          \" width=\"160rpx\" height=\"160rpx\" :src=\"img\"></u-image>\n                      </view>\n                    </view>\n                  </view>\n                </view>\n                <view class=\"again-btn\" @click=\"onDetail(order)\" v-if=\"current == 2\">\n                  <u-tag text=\"评价详情\" shape=\"circle\" mode=\"plain\" type=\"error\" />\n                </view>\n                <view v-if=\"current == 1 && sku.commentStatus == 'UNFINISHED'\">\n                  <view class=\"evaluate\">\n                    <view @click=\"talkCommont(sku)\">\n                      <u-tag text=\"发表评价\" shape=\"circle\" mode=\"plain\" type=\"error\" />\n                    </view>\n                  </view>\n                </view>\n                <view class=\"tips\" v-if=\"sku.commentStatus\">\n                  {{groupCommentStatusWay[sku.commentStatus]}}\n                </view>\n              </view>\n\n            </view>\n            <uni-load-more :status=\"params.loadStatus\"></uni-load-more>\n          </scroll-view>\n        </swiper-item>\n      </swiper>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { getOrderList } from \"@/api/order.js\";\nimport { getComments } from \"@/api/members.js\";\n\nexport default {\n  data() {\n    return {\n      list: [\n        //顶部tab\n\n        {\n          name: \"全部订单\",\n        },\n        {\n          name: \"待评价\",\n        },\n        {\n          name: \"已评价\",\n        },\n      ],\n      gradeList: {\n        //评论表\n        GOOD: \"好评\",\n        MODERATE: \"中评\",\n        WORSE: \"差评\",\n        haveImage: \"有图\",\n      },\n      groupCommentStatusWay: {\n        NEW: \"新订单，不能进行评论\",\n        UNFINISHED: \"未完成评论\",\n        WAIT_CHASE: \"待追评的评论信息\",\n        FINISHED: \"已经完成评论\",\n      },\n      current: 0, //当前tabIndex\n      orderList: [], //商品集合\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n        loadStatus: \"more\",\n      },\n    };\n  },\n\n  onShow() {\n    this.orderList = [];\n    this.params.pageNumber = 1;\n    this.current = 0\n    this.loadData()\n  },\n  watch: {\n    /**\n     * 切换current\n     * 更改页面并重新加载数据\n     */\n    current(val) {\n      this.params.pageNumber = 1;\n      this.params.loadStatus = \"more\";\n      this.orderList = [];\n      //重新读取数据\n\n      if (val == 0) {\n        delete  this.params.commentStatus \n        this.loadData();\n      } else if (val == 1) {\n        this.params.commentStatus = \"UNFINISHED\";\n        this.orderList = [];\n        this.loadData();\n      } else {\n        this.params.commentStatus = \"FINISHED\";\n        this.orderList = [];\n        return this.loadComments();\n      }\n    },\n  },\n\n  methods: {\n    /**\n     * 判断当前店铺是否有可评价的商品\n     */\n    commentStatus(val) {\n      if (this.current == 2) {\n        return true;\n      } else {\n        let show;\n        val.orderItems &&\n          val.orderItems.forEach((item) => {\n            if (item.commentStatus == \"UNFINISHED\") {\n              show = true;\n            } else {\n              show = false;\n            }\n          });\n\n        return show;\n      }\n    },\n\n    /**\n     * 点击图片放大或保存\n     */\n    preview(urls, index) {\n      uni.previewImage({\n        current: index,\n        urls: urls,\n        longPressActions: {\n          itemList: [\"保存图片\"],\n          success: function (data) {},\n          fail: function (err) {},\n        },\n      });\n    },\n\n    /**\n     * 点击tab触发\n     */\n    changeTab(index) {\n      this.current = index;\n    },\n\n    /**\n     * 点击swiper\n     */\n    changeSwiper(e) {\n      this.current = e.target.current;\n    },\n\n    /**\n     * 获取订单数据\n     */\n    loadData() {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      getOrderList(this.params).then((res) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        const orderList = res.data.result.records;\n        if (orderList.length < 10) {\n          this.params.loadStatus = \"noMore\";\n        }\n        if (orderList.length > 0) {\n          this.orderList = this.orderList.concat(orderList);\n          this.params.pageNumber += 1;\n        }\n      });\n    },\n\n    /**\n     * 发表评价\n     */\n    talkCommont(sku) {\n      console.log(sku);\n      uni.navigateTo({\n        url: `./releaseEvaluate?sn=${sku.sn}&sku=${encodeURIComponent(\n          JSON.stringify(sku)\n        )}`,\n      });\n    },\n\n    /**\n     * 加载已评价数据\n     */\n    loadComments() {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      getComments(this.params).then((res) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        let orderList = res.data.result.records;\n        if (orderList.length < 10) {\n          this.params.loadStatus = \"noMore\";\n        }\n        orderList.forEach((item) => {\n          item.orderItems = [\n            {\n              image: item.goodsImage,\n              name: item.goodsName,\n              goodsId: item.goodsId,\n              skuId: item.skuId,\n            },\n          ];\n        });\n        this.orderList = this.orderList.concat(orderList);\n        this.params.pageNumber += 1;\n      });\n    },\n\n    /**\n     * 滑到底部加载数据\n     */\n    renderData(index) {\n      if (this.params.loadStatus == \"noMore\") return;\n      if (index == 0) {\n        this.loadData();\n      } else {\n        this.loadComments();\n      }\n    },\n\n    /**\n     * 评价详情\n     */\n    onDetail(comment) {\n      uni.navigateTo({\n        url:\n          \"./evaluateDetail?comment=\" +\n          encodeURIComponent(JSON.stringify(comment)),\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\npage {\n  height: 100%;\n}\n.tips {\n  text-align: right;\n  font-size: 24rpx;\n  color: #999;\n}\n.wrap {\n  background: #f6f6f6;\n  height: calc(100vh - var(--window-top));\n  width: 100%;\n}\n\n.goods-imgs-view {\n  margin: 20rpx 0;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  align-items: center;\n  .img-view {\n    margin-right: 15rpx;\n  }\n}\n.u-tabs-box {\n  position: relative;\n  z-index: 10;\n}\n.box-content {\n  margin: 20rpx 0;\n}\n.title_seller_name {\n  font-weight: 700;\n  font-size: 28rpx;\n  color: #333;\n  padding-left: 0 !important;\n}\n.box-title {\n  height: 90rpx;\n  line-height: 90rpx;\n}\n\n.swiper-box {\n  height: calc(100% - 88rpx);\n}\n\n.goods-specs {\n  margin-bottom: 10rpx;\n  color: #cccccc;\n  font-size: 24rpx;\n}\n.goods-price {\n  margin-bottom: 10rpx;\n  color: #999999;\n  font-size: 24rpx;\n}\n.goods-item-view {\n  display: flex;\n  margin-bottom: 20rpx;\n  .goods-info {\n    padding-left: 30rpx;\n\n    .goods-title {\n      color: $u-main-color;\n      margin-bottom: 10rpx;\n    }\n  }\n  .goods-num {\n    margin: 0rpx 10rpx;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-end;\n    justify-content: space-between;\n    margin-bottom: 10rpx;\n    .u-num {\n      color: $aider-light-color;\n      font-size: 33rpx;\n    }\n  }\n}\n.again-btn {\n  margin: 0rpx 10rpx;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n  margin-bottom: 10rpx;\n}\n.seller-view {\n  background-color: #fff;\n  margin: 20rpx 0px;\n  padding: 0px 20rpx 20rpx 20rpx;\n  border-radius: 20rpx;\n  .seller-info {\n    height: 70rpx;\n    .seller-name {\n      font-size: 33rpx;\n      font-weight: 600;\n    }\n    .order-sn {\n      color: #909399;\n    }\n  }\n\n  .btn-view {\n    min-height: 70rpx;\n    margin: 5rpx 5rpx;\n    display: flex;\n    flex-direction: row;\n    .description {\n      size: 25rpx;\n      color: #999999;\n      .text {\n        margin: 20rpx 0rpx;\n      }\n      .title {\n        color: #5f5d5f;\n      }\n    }\n  }\n  .evaluate {\n    padding: 20rpx 0;\n    display: flex;\n    justify-content: flex-end;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/order/evaluate/releaseEvaluate.vue",
    "content": "<template>\n  <view>\n    <!-- 遍历出评价商品 -->\n    <view>\n      <view class=\"after-sales-goods-detail-view\">\n        <view>\n          <view class=\"goods-item-view\">\n            <view class=\"goods-img\">\n              <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"sku.image\" />\n            </view>\n            <view class=\"goods-info\">\n              <view class=\"goods-title u-line-2\">{{ sku.name }}</view>\n              <view class=\"goods-price\">\n                <view>x{{ sku.num }}</view>\n              </view>\n            </view>\n          </view>\n        </view>\n      </view>\n      <view class=\"goods-evaluate-view\">\n        <view class=\"goods-view\">\n          <view>商品评价</view>\n          <view class=\"sub-title\">满意请打好评哦</view>\n        </view>\n        <view class=\"rate-view\">\n          <view class=\"rate-btn\" @click=\"onGrade('GOOD')\">\n            <u-icon name=\"heart-fill\" style=\"font-size: 42rpx\"\n              :style=\"{ color: form.grade === 'GOOD' ? 'red' : '#CCCCCC' }\"></u-icon>\n            <text>好评</text>\n          </view>\n          <view class=\"rate-btn\" @click=\"onGrade('MODERATE')\">\n            <u-icon name=\"heart-fill\" style=\"font-size: 42rpx\"\n              :style=\"{ color: form.grade === 'MODERATE' ? 'red' : '#CCCCCC' }\"></u-icon>\n            <text>中评</text>\n          </view>\n          <view class=\"rate-btn\" @click=\"onGrade('WORSE')\">\n            <u-icon name=\"heart-fill\" style=\"font-size: 42rpx\"\n              :style=\"{ color: form.grade === 'WORSE' ? 'red' : '#CCCCCC' }\"></u-icon>\n            <text>差评</text>\n          </view>\n        </view>\n      </view>\n      <view class=\"info-evaluate-view\">\n        <view class=\"input-view\">\n          <u-input v-model=\"form.content\" height=\"200\" placeholder-style=\"font-size:12px;color:#CCCCCC\" :type=\"type\"\n            :border=\"border\" :maxlength=\"maxlength\" :placeholder=\"placeholder\" />\n        </view>\n        <view class=\"input-num\">\n          <text>{{ form.content.length }}/{{ maxlength }}</text>\n        </view>\n      </view>\n      <view class=\"info-evaluate-view\">\n        <view class=\"images-view\">\n          <u-upload :header=\" { accessToken: storage.getAccessToken() }\" :action=\"action\" width=\"150\"\n            @on-uploaded=\"onUploaded\" :max-count=\"5\" :show-progress=\"false\"></u-upload>\n        </view>\n      </view>\n    </view>\n    <view class=\"info-evaluate-view\" style=\"margin-bottom: 150rpx\">\n      <view class=\"info-header\">店铺评分</view>\n      <view>\n        <view class=\"seller-rate-view\">\n          <view class=\"rate-title\">描述相符</view>\n          <view>\n            <u-rate count=\"count\" gutter=\"20\" active-color=\"#FFC71C\" v-model=\"form.descriptionScore\" :size=\"40\">\n            </u-rate>\n          </view>\n        </view>\n        <view class=\"seller-rate-view\">\n          <view class=\"rate-title\">服务态度</view>\n          <view>\n            <u-rate count=\"count\" gutter=\"20\" active-color=\"#FFC71C\" v-model=\"form.serviceScore\" :size=\"40\"></u-rate>\n          </view>\n        </view>\n        <view class=\"seller-rate-view\">\n          <view class=\"rate-title\">物流服务</view>\n          <view>\n            <u-rate count=\"count\" gutter=\"20\" active-color=\"#FFC71C\" v-model=\"form.deliveryScore\" :size=\"40\"></u-rate>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"onSubmit\" @click=\"onSubmit\"> 提交申请</view>\n\n    <u-toast ref=\"uToast\" />\n  </view>\n</template>\n\n<script>\nimport storage from \"@/utils/storage.js\";\nimport { commentsMemberOrder } from \"@/api/members.js\";\nimport { upload } from \"@/api/common.js\";\n\nexport default {\n  data() {\n    return {\n      storage,\n      type: \"textarea\", //输入框状态为 textarea\n      border: false, //没有border\n      maxlength: 500, //评价最大字数为500字\n      placeholder:\n        \"宝贝满足您的期待吗？说说它的优点和美中不足的地方吧。您的评价会帮助更多的人\",\n      sku: {}, //订单信息\n      form: {\n        content: \"\", //评价详情\n        goodsId: \"\", //商品id\n        grade: \"GOOD\", //默认为好评\n        orderItemSn: \"\", //商品的sn\n        skuId: \"\", //商品skuId\n        descriptionScore: 5, //默认描述得分为5分\n        serviceScore: 5, //默认服务得分为5分\n        deliveryScore: 5, //默认物流得分为5分\n      },\n      action: upload, //图片上传地址\n    };\n  },\n  onLoad(options) {\n    // 获取上一级传过来的数据进行解析\n    this.form.orderItemSn = options.sn;\n    this.sku = JSON.parse(decodeURIComponent(options.sku));\n    this.form.goodsId = this.sku.goodsId;\n    this.form.skuId = this.sku.skuId;\n  },\n  methods: {\n    /**\n     * 点击评价\n     */\n    onGrade(grade) {\n      this.form.grade = grade;\n    },\n\n    /**\n     * 提交评价\n     */\n    onSubmit() {\n      uni.showLoading({\n        title: \"加载中\",\n      });\n      commentsMemberOrder(this.form).then((res) => {\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\n        if (res.data.success) {\n          uni.showToast({\n            title: \"发布评价成功\",\n            duration: 2000,\n            icon: \"none\",\n            success: () => {\n              setTimeout(() => {\n                uni.navigateBack();\n              }, 500);\n            },\n          });\n        }\n      });\n    },\n\n    /**\n     * 图片成功后回调\n     */\n    onUploaded(lists) {\n      let images = [];\n      lists.forEach((item) => {\n        images.push(item.response.result);\n      });\n      this.form.images = images;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\npage,\n.content {\n  background: $page-color-base;\n  height: 100%;\n  margin-bottom: 100rpx;\n}\n.onSubmit {\n  width: 80%;\n  margin: 0 auto;\n  text-align: center;\n  color: #fff;\n  background: $aider-light-color;\n  height: 80rpx;\n  line-height: 80rpx;\n  border-radius: 100px;\n}\n.after-sales-goods-detail-view {\n  background-color: #f4f4f5;\n  padding: 10rpx 0rpx;\n  .header {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n    padding-bottom: 20rpx;\n    .header-text {\n      background-color: #f4f4f5;\n      padding: 10rpx 30rpx;\n      border-radius: 50rpx;\n      .seller-name {\n        color: $main-color;\n        font-weight: 600;\n      }\n    }\n  }\n  .goods-item-view {\n    display: flex;\n    flex-direction: row;\n    padding: 10rpx 30rpx;\n    background-color: #eef1f2;\n    .goods-img {\n    }\n    .goods-info {\n      padding-left: 30rpx;\n      flex: 1;\n      .goods-title {\n        margin-bottom: 10rpx;\n        color: $font-color-dark;\n      }\n      .goods-specs {\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        color: #cccccc;\n      }\n      .goods-price {\n        font-size: 28rpx;\n        margin-bottom: 10rpx;\n        color: $light-color;\n      }\n    }\n    .goods-num {\n      width: 60rpx;\n      color: $main-color;\n    }\n  }\n  .after-num {\n    margin: 0rpx 30rpx;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: space-between;\n    height: 80rpx;\n  }\n}\n.goods-evaluate-view {\n  margin-top: 8rpx;\n  padding: 20rpx;\n  margin-bottom: 5rpx;\n  background-color: #fff;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  .goods-view {\n    width: 250rpx;\n    font-size: 28rpx;\n    color: #333333;\n    .sub-title {\n      font-size: 22rpx;\n      color: #cccccc;\n    }\n  }\n  .rate-view {\n    color: #333333;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    .rate-btn {\n      margin: 0rpx 20rpx;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      text {\n        margin-left: 10rpx;\n      }\n    }\n  }\n}\n.info-evaluate-view {\n  margin-top: 8rpx;\n  padding: 20rpx;\n  background-color: #fff;\n  align-items: center;\n  font-size: 24rpx;\n  .input-view {\n    width: 100%;\n  }\n  .input-num {\n    color: #cccccc;\n    text-align: right;\n  }\n  .images-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    flex-wrap: wrap;\n  }\n  .info-header {\n    font-size: 28rpx;\n    color: #333333;\n    margin-bottom: 30rpx;\n  }\n  .seller-rate-view {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    .rate-title {\n      line-height: 70rpx;\n      width: 150rpx;\n      font-size: 26rpx;\n      color: #333333;\n    }\n  }\n}\n\n.submit-view {\n  position: fixed;\n  z-index: 999;\n  bottom: 0px;\n  left: 0px;\n  margin-top: 100rpx;\n  border: solid 2rpx #f2f2f2;\n  background-color: #ffffff;\n  height: 100rpx;\n  width: 750rpx;\n  align-items: center;\n  padding: 0rpx 20rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/order/fillorder.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <!-- 选择地址 -->\r\n    <div\r\n      class=\"address-box\"\r\n      @click=\"clickToAddress()\"\r\n      v-if=\"shippingText == 'LOGISTICS' && orderMessage.cartTypeEnum != 'VIRTUAL'\"\r\n    >\r\n      <div class=\"user-box flex\">\r\n        <div class=\"flex-8\">\r\n          <div v-if=\"!address.id\">请选择地址</div>\r\n          <div v-else>\r\n            <div class=\"user-address\">\r\n              <!-- 省市区 -->\r\n              <div class=\"flex flex-a-c\">\r\n                <span class=\"default\" v-if=\"address.isDefault\">默认</span>\r\n                <div\r\n                  class=\"address-list\"\r\n                  v-if=\"address.consigneeAddressPath.length != 0\"\r\n                >\r\n                  <span\r\n                    class=\"address-item\"\r\n                    v-for=\"(item, index) in address.consigneeAddressPath\"\r\n                    :key=\"index\"\r\n                  >\r\n                    {{ item }}\r\n                  </span>\r\n                </div>\r\n              </div>\r\n              <!-- 详细地址 -->\r\n              <div class=\"user-address-detail wes-2\">\r\n                {{ address.detail }}\r\n              </div>\r\n              <!-- 姓名 手机号 -->\r\n              <div>\r\n                <span>{{ address.name }}</span>\r\n                <span class=\"mobile\">{{ address.mobile | secrecyMobile }}</span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <u-icon name=\"arrow-right\" style=\"color: #bababa\"></u-icon>\r\n      </div>\r\n      <!-- 背景 -->\r\n      <div class=\"bar\"></div>\r\n    </div>\r\n    <!-- 选择自提点 -->\r\n    <div class=\"address-box\" v-if=\"shippingText == 'SELF_PICK_UP'\">\r\n      <div @click=\"clickToStoreAddress()\">\r\n        <div class=\"user-box flex\">\r\n          <div class=\"flex-8\">\r\n            <div v-if=\"storeAddress\">\r\n              <div class=\"user-address\">\r\n                <!-- 自提点地址 -->\r\n                <div class=\"user-address-detail wes-2\">\r\n                  {{ storeAddress.address }}\r\n                </div>\r\n                <!-- 联系手机号 -->\r\n                <div></div>\r\n              </div>\r\n            </div>\r\n            <div v-else>请选择自提点</div>\r\n          </div>\r\n          <u-icon name=\"arrow-right\" style=\"color: #bababa\"></u-icon>\r\n        </div>\r\n        <!-- 背景 -->\r\n        <div class=\"bar\"></div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- 开团信息 -->\r\n    <view class=\"group-box\" v-if=\"isAssemble\">\r\n      <view class=\"group-title\">\r\n        <span v-if=\"pintuanFlage\">你正在开团购买</span>\r\n        <span v-else\r\n          >为你加入仅差<span>{{ routerVal.parentOrder.toBeGroupedNum }}</span\r\n          >人的团购买</span\r\n        >\r\n      </view>\r\n      <view class=\"group\">\r\n        <view>\r\n          <u-image\r\n            borderRadius=\"50%\"\r\n            shape=\"square\"\r\n            class=\"head-img\"\r\n            width=\"81rpx\"\r\n            height=\"81rpx\"\r\n            :src=\"masterWay.face || userImage\"\r\n          ></u-image>\r\n          <view class=\"btn-one\">团长</view>\r\n        </view>\r\n        <view class=\"line\"> </view>\r\n        <view>\r\n          <!-- 如果有最后一名，显示最后一名，没有最后一名，显示等待参团 -->\r\n          <u-image\r\n            class=\"head-img\"\r\n            v-if=\"endWay.face\"\r\n            :src=\"endWay.face\"\r\n            borderRadius=\"50%\"\r\n            shape=\"square\"\r\n            width=\"81rpx\"\r\n            height=\"81rpx\"\r\n          >\r\n            <view slot=\"loading\"></view>\r\n          </u-image>\r\n          <u-image\r\n            class=\"head-img\"\r\n            borderRadius=\"50%\"\r\n            shape=\"square\"\r\n            v-else\r\n            width=\"81rpx\"\r\n            height=\"81rpx\"\r\n            :src=\"endWay.face || userImage\"\r\n          ></u-image>\r\n\r\n          <view class=\"wait\">{{ endWay.nickname || \"等待参团\" }}</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 店铺商品信息 -->\r\n    <div\r\n      class=\"box box2\"\r\n      v-for=\"(item, index) in orderMessage.cartList\"\r\n      :key=\"index\"\r\n    >\r\n      <div v-if=\"item.checked\">\r\n        <div @click=\"navigateToStore(item)\">\r\n          <div class=\"store-name\">\r\n            <span>{{ item.storeName }}</span>\r\n          </div>\r\n        </div>\r\n        <div class=\"promotionNotice\">{{ item.promotionNotice || \"\" }}</div>\r\n        <div\r\n          class=\"flex goods-item\"\r\n          v-for=\"(val, i) in item.checkedSkuList\"\r\n          :key=\"i\"\r\n        >\r\n          <div\r\n            class=\"goods-image\"\r\n            @click=\"\r\n              navigateTo(\r\n                '/pages/product/goods?id=' +\r\n                  val.goodsSku.id +\r\n                  '&goodsId=' +\r\n                  val.goodsSku.goodsId\r\n              )\r\n            \"\r\n            :span=\"3\"\r\n          >\r\n            <u-image\r\n              borderRadius=\"10rpx\"\r\n              width=\"200rpx\"\r\n              height=\"200rpx\"\r\n              :src=\"val.goodsSku.thumbnail\"\r\n              alt\r\n            />\r\n          </div>\r\n          <div\r\n            @click=\"\r\n              navigateTo(\r\n                '/pages/product/goods?id=' +\r\n                  val.goodsSku.id +\r\n                  '&goodsId=' +\r\n                  val.goodsSku.goodsId\r\n              )\r\n            \"\r\n            class=\"goods-detail\"\r\n          >\r\n            <div class=\"flex\">\r\n              <p class=\"goods-name\">{{ val.goodsSku.goodsName }}</p>\r\n              <span class=\"nums\">x{{ val.num }}</span>\r\n            </div>\r\n            <p class=\"goods-prices\">\r\n              <span>￥</span>\r\n              <span class=\"goods-price\">{{\r\n                $options.filters.goodsFormatPrice(val.purchasePrice)[0]\r\n              }}</span>\r\n              <span\r\n                >.{{\r\n                  $options.filters.goodsFormatPrice(val.purchasePrice)[1]\r\n                }}</span\r\n              >\r\n            </p>\r\n          </div>\r\n        </div>\r\n        <u-row>\r\n          <u-col :offset=\"0\" :span=\"4\">发票信息</u-col>\r\n          <u-col\r\n            :span=\"8\"\r\n            class=\"tipsColor\"\r\n            textAlign=\"right\"\r\n            @click.native=\"invoice()\"\r\n          >\r\n            <span v-if=\"receiptList\"\r\n              >{{ receiptList.receiptTitle }} -\r\n              {{ receiptList.receiptContent }}</span\r\n            >\r\n            <span v-else>不开发票</span>\r\n          </u-col>\r\n        </u-row>\r\n        <u-row>\r\n          <u-col\r\n            v-if=\"orderMessage.cartTypeEnum != 'VIRTUAL'\"\r\n            :offset=\"0\"\r\n            :span=\"9\"\r\n            @click=\"shippingFlag = true\"\r\n            >配送\r\n          </u-col>\r\n          <u-col\r\n            v-if=\"orderMessage.cartTypeEnum != 'VIRTUAL'\"\r\n            :span=\"3\"\r\n            textAlign=\"right\"\r\n            @click=\"shippingFlag = true\"\r\n          >\r\n            {{\r\n              shippingMethod.find((e) => {\r\n                return e.value == shippingText;\r\n              }).label\r\n            }}\r\n          </u-col>\r\n        </u-row>\r\n        <u-row>\r\n          <u-col :offset=\"0\" :span=\"4\" class=\"tl\" style=\"text-align: left\"\r\n            >备注信息</u-col\r\n          >\r\n          <u-col :span=\"8\" textAlign=\"right\">\r\n            <u-input\r\n              style=\"text-align: right\"\r\n              class=\"uinput\"\r\n              v-model=\"remarkVal[index].remark\"\r\n            />\r\n          </u-col>\r\n        </u-row>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- 发票信息 -->\r\n    <invoices\r\n      :res=\"receiptList\"\r\n      @callbackInvoice=\"callbackInvoice\"\r\n      v-if=\"invoiceFlag\"\r\n    />\r\n    <u-select\r\n      @confirm=\"confirmDistribution\"\r\n      v-model=\"shippingFlag\"\r\n      v-if=\"shippingMethod.length != 0\"\r\n      :list=\"shippingMethod\"\r\n    ></u-select>\r\n\r\n    <div class=\"box box5\" v-if=\"orderMessage.priceDetailDTO\">\r\n      <div>\r\n        <u-row>\r\n          <u-col :span=\"9\">商品合计</u-col>\r\n          <u-col :span=\"3\" textAlign=\"right\">\r\n            <span\r\n              >￥{{ orderMessage.priceDetailDTO.goodsPrice | unitPrice }}</span\r\n            >\r\n          </u-col>\r\n        </u-row>\r\n      </div>\r\n      <div>\r\n        <u-row v-if=\"shippingText == 'LOGISTICS'\">\r\n          <u-col v-if=\"orderMessage.cartTypeEnum != 'VIRTUAL'\" :span=\"7\"\r\n            >运费</u-col\r\n          >\r\n          <u-col\r\n            v-if=\"orderMessage.cartTypeEnum != 'VIRTUAL'\"\r\n            :span=\"5\"\r\n            class=\"tr tipsColor\"\r\n            textAlign=\"right\"\r\n          >\r\n            <span v-if=\"orderMessage.priceDetailDTO.freightPrice == 0\"\r\n              >包邮</span\r\n            >\r\n            <span v-else\r\n              >￥{{\r\n                orderMessage.priceDetailDTO.freightPrice | unitPrice\r\n              }}</span\r\n            >\r\n          </u-col>\r\n        </u-row>\r\n      </div>\r\n      <u-row\r\n        v-if=\"\r\n          orderMessage.priceDetailDTO.goodsPrice != 0 &&\r\n          orderMessage.priceDetailDTO.goodsPrice != null\r\n        \"\r\n      >\r\n        <u-col :offset=\"0\" :span=\"9\" @click=\"GET_Discount()\">优惠券</u-col>\r\n        <u-col\r\n          :span=\"3\"\r\n          v-if=\"\r\n            orderMessage.priceDetailDTO &&\r\n            orderMessage.priceDetailDTO.couponPrice\r\n          \"\r\n          textAlign=\"right\"\r\n          @click=\"GET_Discount()\"\r\n        >\r\n          <span class=\"main-color\"\r\n            >-￥{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span\r\n          >\r\n        </u-col>\r\n        <!--  orderMessage.priceDetailDTO.couponPrice | unitPrice  -->\r\n        <u-col :span=\"3\" v-else textAlign=\"right\" @click=\"GET_Discount()\">\r\n          {{ orderMessage.canUseCoupons.length || \"0\" }} 张可用\r\n          <u-icon name=\"arrow-right\"></u-icon>\r\n        </u-col>\r\n      </u-row>\r\n      <div>\r\n        <u-row>\r\n          <u-col :span=\"9\">优惠金额</u-col>\r\n          <u-col\r\n            :span=\"3\"\r\n            textAlign=\"right\"\r\n            v-if=\"orderMessage.priceDetailDTO.couponPrice\"\r\n          >\r\n            <span class=\"main-color\">\r\n              -￥{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span\r\n            >\r\n          </u-col>\r\n          <u-col :span=\"3\" textAlign=\"right\" v-else>0.00</u-col>\r\n        </u-row>\r\n      </div>\r\n      <div>\r\n        <u-row>\r\n          <u-col :span=\"6\">活动优惠</u-col>\r\n          <u-col :span=\"6\" class=\"tr tipsColor\" textAlign=\"right\">\r\n            <span v-if=\"orderMessage.priceDetailDTO.discountPrice\"\r\n              >-￥{{\r\n                orderMessage.priceDetailDTO.discountPrice | unitPrice\r\n              }}</span\r\n            >\r\n            <span v-else>0.00</span>\r\n          </u-col>\r\n        </u-row>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- 配送地区没有提示 -->\r\n    <div class=\"notSupportFreight\" v-if=\"notSupportFreight.length != 0\">\r\n      <u-notice-bar\r\n        style=\"width: 100%\"\r\n        :volume-icon=\"false\"\r\n        mode=\"horizontal\"\r\n        :list=\"notSupportFreightGoodsList\"\r\n      >\r\n      </u-notice-bar>\r\n    </div>\r\n\r\n    <!-- 结账 -->\r\n\r\n    <div class=\"box6 mp-iphonex-bottom\" v-if=\"orderMessage.priceDetailDTO\">\r\n      <div class=\"tabbar-left\">\r\n        <div v-if=\"!orderMessage.priceDetailDTO.payPoint\" class=\"number\">\r\n          <span>¥</span>\r\n          <span class=\"price\">{{\r\n            $options.filters.goodsFormatPrice(\r\n              orderMessage.priceDetailDTO.flowPrice\r\n            )[0]\r\n          }}</span>\r\n          <span\r\n            >.{{\r\n              $options.filters.goodsFormatPrice(\r\n                orderMessage.priceDetailDTO.flowPrice\r\n              )[1]\r\n            }}\r\n          </span>\r\n        </div>\r\n        <span v-else class=\"number\"\r\n          ><span style=\"margin-right: 10rpx\">{{\r\n            orderMessage.priceDetailDTO.payPoint | unitPrice\r\n          }}</span\r\n          >积分</span\r\n        >\r\n      </div>\r\n      <div class=\"navRiv\" @click=\"createTradeFun()\">\r\n        <!-- #ifndef MP-WEIXIN -->\r\n        <div class=\"tabbar-right\">提交订单</div>\r\n        <!-- #endif -->\r\n        <!-- #ifdef MP-WEIXIN -->\r\n        <div class=\"tabbar-right\">微信支付</div>\r\n        <!-- #endif -->\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n<script>\r\nimport * as API_Address from \"@/api/address\";\r\nimport * as API_Order from \"@/api/order\";\r\nimport * as API_Trade from \"@/api/trade\";\r\nimport configs from \"@/config/config\";\r\nimport LiLiWXPay from \"@/js_sdk/lili-pay/wx-pay.js\";\r\nimport invoices from \"@/pages/order/invoice/setInvoice\";\r\nimport { mapState } from \"vuex\";\r\nexport default {\r\n  onLoad: function (val) {\r\n    this.routerVal = val;\r\n  },\r\n  components: {\r\n    invoices,\r\n  },\r\n\r\n  data() {\r\n    return {\r\n      configs,\r\n      userImage: configs.defaultUserPhoto,\r\n      invoiceFlag: false, //开票开关\r\n      shippingText: \"LOGISTICS\",\r\n      shippingFlag: false,\r\n      shippingMethod: [],\r\n      shippingWay: [\r\n        {\r\n          value: \"LOGISTICS\",\r\n          label: \"物流\",\r\n        },\r\n        {\r\n          value: \"SELF_PICK_UP\",\r\n          label: \"自提\",\r\n        },\r\n      ],\r\n      isAssemble: false, //是否拼团\r\n      // 判断是否填写过备注\r\n      remarkFlag: false,\r\n      selectAddressId: \"\",\r\n      routerVal: \"\",\r\n      params: {},\r\n      // 优惠劵\r\n      couponList: \"\",\r\n      // 已选地址\r\n      address: \"\",\r\n      shopAddress: \"\",\r\n      // 发票信息\r\n      receiptList: \"\",\r\n      // 店铺信息\r\n      orderMessage: \"\",\r\n      data: \"\",\r\n      // 存储备注\r\n      remarkVal: [],\r\n      remarkVal1: \"\",\r\n      detail: \"\", //返回的所有数据\r\n      endWay: \"\", //最后一个参团人\r\n      masterWay: \"\", //团长信息\r\n      pintuanFlage: true, //是开团还是拼团\r\n      notSupportFreight: [], //不支持运费\r\n      notSupportFreightGoodsList: [\"以下商品超出配送范围：\"],\r\n      storeAddress: \"\",\r\n\r\n      originOrderData:\"\", // 原始订单数据\r\n    };\r\n  },\r\n  watch: {\r\n    // 监听备注 并在 vuex 中存储\r\n    remarkVal: {\r\n      handler(val) {\r\n        this.$store.commit(\"setRemark\", val);\r\n      },\r\n      immediate: true,\r\n      deep: true,\r\n    },\r\n  },\r\n  computed: {\r\n    ...mapState([\"remark\"]),\r\n  },\r\n  filters: {\r\n    /**\r\n     * 发票收据类型\r\n     */\r\n    receiptType(type) {\r\n      switch (type) {\r\n        case \"VATORDINARY\":\r\n          return \"增值税普通发票\";\r\n        case \"ELECTRO\":\r\n          return \"电子普通发票\";\r\n        case \"VATOSPECIAL\":\r\n          return \"增值税专用发票\";\r\n        default:\r\n          return \"不开发票\";\r\n      }\r\n    },\r\n  },\r\n\r\n  /**\r\n   * 监听返回\r\n   */\r\n  onBackPress(e) {\r\n    console.log(\"onBackPress\", e);\r\n    if (e.from == \"backbutton\") {\r\n      let routes = getCurrentPages();\r\n      let curRoute = routes[routes.length - 1].options;\r\n      routes.forEach((item) => {\r\n        if (\r\n          item.route == \"pages/tabbar/cart/cartList\" ||\r\n          item.route.indexOf(\"pages/product/goods\") != -1\r\n        ) {\r\n          uni.navigateTo({\r\n            url: item.route,\r\n          });\r\n        }\r\n      });\r\n      console.log(\"curRoute.addId\",curRoute.addId)\r\n      if (curRoute.addId) {\r\n        uni.reLaunch({\r\n          url: \"/pages/tabbar/cart/cartList\",\r\n        });\r\n      } else {\r\n        uni.navigateBack();\r\n      }\r\n      return true; //阻止默认返回行为\r\n    }\r\n  },\r\n\r\n  async onShow() {\r\n    // 判断是否存在写过备注信息的商品\r\n    if (this.remark && this.remark.length > 0) {\r\n      this.remarkFlag = true;\r\n    }\r\n    uni.showLoading({\r\n      mask: true,\r\n    });\r\n    await this.getOrderList();\r\n    await this.getDistribution();\r\n    if (this.$store.state.isShowToast) {\r\n      uni.hideLoading();\r\n    }\r\n    if (this.routerVal.way == \"PINTUAN\") {\r\n      this.isAssemble = true;\r\n      this.routerVal.parentOrder = JSON.parse(\r\n        decodeURIComponent(this.routerVal.parentOrder)\r\n      );\r\n      this.pintuanWay();\r\n    }\r\n  },\r\n  mounted() {},\r\n\r\n  methods: {\r\n    //发票回调 选择发票之后刷新购物车\r\n    async callbackInvoice(val) {\r\n      this.invoiceFlag = false;\r\n      this.receiptList = val;\r\n      if (val) {\r\n        let submit = {\r\n          way: this.routerVal.way,\r\n          ...this.receiptList,\r\n        };\r\n        let receipt = await API_Order.getReceipt(submit);\r\n        if (receipt.data.success) {\r\n          this.shippingFlag = false;\r\n          this.getOrderList();\r\n        }\r\n      }\r\n    },\r\n\r\n    // 跳转到店铺\r\n    navigateToStore(val) {\r\n      uni.navigateTo({\r\n        url: \"/pages/product/shopPage?id=\" + val.storeId,\r\n      });\r\n    },\r\n    // 点击跳转地址\r\n    clickToAddress() {\r\n      this.navigateTo(\r\n        `/pages/mine/address/address?from=cart&way=${\r\n          this.routerVal.way\r\n        }&parentOrder=${encodeURIComponent(\r\n          JSON.stringify(this.routerVal.parentOrder)\r\n        )}`\r\n      );\r\n    },\r\n    clickToStoreAddress() {\r\n      this.navigateTo(\r\n        `/pages/mine/address/storeAddress?from=cart&way=${this.routerVal.way}&storeId=${this.remarkVal[0].storeId}`\r\n      );\r\n    },\r\n\r\n    // 判断团长以及团员信息\r\n    pintuanWay() {\r\n      const { memberId } = this.routerVal.parentOrder;\r\n\r\n      const userInfo = this.$options.filters.isLogin();\r\n      if (memberId) {\r\n        this.endWay = userInfo;\r\n        this.masterWay = this.routerVal.parentOrder;\r\n        this.pintuanFlage = false;\r\n      } else {\r\n        this.pintuanFlage = true;\r\n        this.masterWay = userInfo;\r\n      }\r\n    },\r\n    // 判断发票\r\n    invoice() {\r\n      this.invoiceFlag = true;\r\n    },\r\n\r\n    // 领取优惠券\r\n    GET_Discount() {\r\n      // 循环店铺id,商品id获取优惠券\r\n      let store = [];\r\n      let skus = [];\r\n      let selectedCoupon = [];\r\n      if (this.orderMessage.platformCoupon)\r\n        selectedCoupon.push(this.orderMessage.platformCoupon.memberCoupon.id);\r\n      if (\r\n        this.orderMessage.storeCoupons &&\r\n        Object.keys(this.orderMessage.storeCoupons)[0]\r\n      ) {\r\n        let storeMemberCouponsId = Object.keys(\r\n          this.orderMessage.storeCoupons\r\n        )[0];\r\n        let storeCouponId =\r\n          this.orderMessage.storeCoupons[storeMemberCouponsId].memberCoupon.id;\r\n        selectedCoupon.push(storeCouponId);\r\n      }\r\n      this.orderMessage.cartList.forEach((item) => {\r\n        item.skuList.forEach((sku) => {\r\n          store.push(sku.storeId);\r\n          skus.push(sku.goodsSku.id);\r\n        });\r\n      });\r\n      store = Array.from(new Set(store));\r\n      skus = Array.from(new Set(skus));\r\n      uni.setStorage({\r\n        key: \"totalPrice\",\r\n        data: this.orderMessage.priceDetailDTO.goodsPrice,\r\n      });\r\n      this.navigateTo(\r\n        `/pages/cart/coupon/index?way=${this.routerVal.way}&storeId=${store}&skuId=${skus}&selectedCoupon=${selectedCoupon}`\r\n      );\r\n    },\r\n\r\n    /**\r\n     * 跳转\r\n     */\r\n    navigateTo(url) {\r\n      uni.navigateTo({\r\n        url,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 提交订单准备支付\r\n     */\r\n\r\n    // 创建订单\r\n    createTradeFun() {\r\n      // 防抖\r\n      this.$u.throttle(() => {\r\n        if (this.shippingText === \"SELF_PICK_UP\") {\r\n          if (!this.storeAddress.id) {\r\n            uni.showToast({\r\n              title: \"请选择提货点\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n            return false;\r\n          }\r\n        } else if (this.shippingText === \"LOGISTICS\" && this.orderMessage.cartTypeEnum !== 'VIRTUAL') {\r\n          if (!this.address.id) {\r\n            uni.showToast({\r\n              title: \"请选择地址\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n            return false;\r\n          }\r\n        }\r\n\r\n        //  创建订单\r\n        let client;\r\n        // #ifdef H5\r\n        client = \"H5\";\r\n        // #endif\r\n        // #ifdef MP-WEIXIN\r\n        client = \"WECHAT_MP\";\r\n        // #endif\r\n        // #ifdef APP-PLUS\r\n        client = \"APP\";\r\n        // #endif\r\n\r\n        let submit = {\r\n          client,\r\n          way: this.routerVal.way,\r\n          remark: this.remarkVal,\r\n          parentOrderSn: \"\",\r\n        };\r\n        // 如果是拼团并且当前用户不是团长\r\n        this.routerVal.parentOrder && this.routerVal.parentOrder.orderSn\r\n          ? (submit.parentOrderSn = this.routerVal.parentOrder.orderSn)\r\n          : delete submit.parentOrderSn;\r\n\r\n        /**\r\n         * 创建订单\r\n         */\r\n        API_Trade.createTrade(submit).then((res) => {\r\n          if (res.data.success) {\r\n            uni.showToast({\r\n              title: \"创建订单成功!\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n            // 如果当前价格为0跳转到订单列表\r\n            if (this.orderMessage.priceDetailDTO.billPrice == 0) {\r\n              uni.navigateTo({\r\n                url: \"/pages/order/myOrder?status=0\",\r\n              });\r\n            } else {\r\n              // #ifdef MP-WEIXIN\r\n              // 微信小程序中点击创建订单直接开始支付\r\n              this.pay(res.data.result.sn);\r\n              // #endif\r\n\r\n              // #ifndef MP-WEIXIN\r\n              this.navigateTo(\r\n                `/pages/cart/payment/payOrder?trade_sn=${res.data.result.sn}`\r\n              );\r\n              // #endif\r\n            }\r\n          } else {\r\n            uni.showToast({\r\n              title: res.data.message,\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n          }\r\n        });\r\n      }, 3000);\r\n    },\r\n\r\n    /**\r\n     * 微信小程序中直接支付\r\n     */\r\n    async pay(sn) {\r\n      new LiLiWXPay({\r\n        sn: sn,\r\n        price: this.orderMessage.priceDetailDTO.billPrice,\r\n      }).pay();\r\n    },\r\n\r\n    /**\r\n     * 获取用户地址\r\n     */\r\n    getUserAddress() {\r\n      // 如果没有商品选择地址的话 则选择 默认地址\r\n      API_Address.getAddressDefault().then((res) => {\r\n        if (res.data.result) {\r\n          res.data.result.consigneeAddressPath =\r\n            res.data.result.consigneeAddressPath.split(\",\");\r\n          this.address = res.data.result;\r\n        }\r\n      });\r\n    },\r\n    // 获取配送列表\r\n    async getDistribution() {\r\n      let shopRes = await API_Trade.shippingMethodList({\r\n        way: this.routerVal.way,\r\n      });\r\n      let shopList;\r\n      if (shopRes.data.success) {\r\n        shopList = shopRes.data.result;\r\n        let way = [];\r\n        console.log(shopList);\r\n        this.shippingWay.forEach((item) => {\r\n          shopList.forEach((child) => {\r\n            if (item.value == child) {\r\n              way.push(item);\r\n            }\r\n          });\r\n        });\r\n        this.shippingMethod = way;\r\n      }\r\n    },\r\n\r\n    // 选择配送\r\n    async confirmDistribution(val) {\r\n      let res = await API_Trade.setShipMethod({\r\n        shippingMethod: val[0].value,\r\n        way: this.routerVal.way,\r\n      });\r\n\r\n      this.shippingText = val[0].value;\r\n      if (res.data.success) {\r\n        this.getOrderList();\r\n      }\r\n    },\r\n\r\n    // 获取结算参数\r\n    async getOrderList() {\r\n      this.notSupportFreight = [];\r\n      // 获取结算参数\r\n      API_Trade.getCheckoutParams(this.routerVal.way).then((res) => {\r\n        // 获取结算参数 进行首次判断\r\n        this.originOrderData = this.orderMessage ? JSON.parse(JSON.stringify(this.orderMessage)) : \"\"\r\n        \r\n        if (\r\n          !res.data.result.checkedSkuList ||\r\n          res.data.result.checkedSkuList.length === 0\r\n        ) {\r\n\r\n          if(!this.originOrderData.checkedSkuList.length){\r\n            uni.switchTab({\r\n              url: \"/pages/tabbar/cart/cartList\",\r\n            });\r\n          }\r\n         \r\n        }\r\n        if (res.data.result.skuList.length <= 0) {\r\n\r\n          if(!this.originOrderData.skuList.length){\r\n            uni.navigateTo({\r\n              url: \"/pages/order/myOrder?status=0\",\r\n            });\r\n          }\r\n         \r\n        }\r\n\r\n        let repeatData;\r\n        res.data.result.cartList.forEach((item, index) => {\r\n          // 如果已经写过备注信息的话赋值\r\n          repeatData = {\r\n            remark: this.remarkFlag\r\n              ? this.remark[index].storeId == item.storeId\r\n                ? this.remark[index].remark\r\n                : item.remark\r\n              : item.remark,\r\n            storeId: item.storeId,\r\n          };\r\n\r\n          this.$set(this.remarkVal, index, repeatData);\r\n        });\r\n\r\n        this.orderMessage = res.data.result;\r\n        /**\r\n         * 为了避免路径传值在h5中超出限制问题\r\n         * 这块将可用的优惠券以及不可用的优惠券放入到vuex里面进行存储\r\n         */\r\n        this.$store.state.canUseCoupons = res.data.result.canUseCoupons;\r\n        this.$store.state.cantUseCoupons = res.data.result.cantUseCoupons;\r\n\r\n        if (!res.data.result.memberAddress) {\r\n          // 获取会员默认地址\r\n          this.getUserAddress();\r\n        } else {\r\n          this.address = res.data.result.memberAddress;\r\n          res.data.result.memberAddress.consigneeAddressPath =\r\n            res.data.result.memberAddress.consigneeAddressPath.split(\",\");\r\n        }\r\n        if (res.data.result.storeAddress) {\r\n          this.storeAddress = res.data.result.storeAddress;\r\n          console.log(\"storeAddress\", this.storeAddress);\r\n        }\r\n        if (\r\n          res.data.result.notSupportFreight &&\r\n          res.data.result.notSupportFreight.length != 0\r\n        ) {\r\n          this.notSupportFreight = res.data.result.notSupportFreight;\r\n\r\n          res.data.result.notSupportFreight.forEach((item) => {\r\n            this.notSupportFreightGoodsList[0] += item.goodsSku.goodsName;\r\n          });\r\n        }\r\n      });\r\n    },\r\n\r\n    //\r\n  },\r\n};\r\n</script>\r\n<style scoped>\r\npage {\r\n  background: #f7f7f7;\r\n}\r\n</style>\r\n<style scoped lang=\"scss\">\r\n.flex-8 {\r\n  flex: 8;\r\n}\r\n\r\n.main-color {\r\n  color: $main-color;\r\n  font-weight: bold;\r\n}\r\n\r\n.uinput {\r\n  /deep/ input {\r\n    text-align: right;\r\n  }\r\n}\r\n\r\n.promotionNotice {\r\n  font-size: 24rpx;\r\n  margin: 20rpx 0;\r\n  color: $aider-light-color;\r\n}\r\n\r\n.nums {\r\n  flex: 2;\r\n  color: $light-color;\r\n\r\n  text-align: center;\r\n}\r\n\r\n.wait {\r\n  font-size: 22rpx;\r\n  font-family: PingFang SC, PingFang SC-Regular;\r\n  font-weight: 400;\r\n  color: #cccccc;\r\n  text-align: center;\r\n}\r\n\r\n.line {\r\n  margin-left: 14rpx;\r\n  margin-right: 14rpx;\r\n  margin-bottom: 50rpx;\r\n  width: 143rpx;\r\n  border-bottom: 2px dotted #999;\r\n}\r\n\r\n.tabbar-left {\r\n  margin-left: 32rpx;\r\n}\r\n\r\n.btn-one,\r\n.wait {\r\n  margin-top: 14rpx;\r\n}\r\n\r\n.btn-one {\r\n  width: 100rpx;\r\n  height: 40rpx;\r\n  background: $light-color;\r\n  border-radius: 20rpx;\r\n  font-size: 22rpx;\r\n  font-family: PingFang SC, PingFang SC-Regular;\r\n  font-weight: 400;\r\n  text-align: left;\r\n  color: #ffffff;\r\n  text-align: center;\r\n  line-height: 40rpx;\r\n}\r\n\r\n.head-img {\r\n  width: 81rpx;\r\n  height: 81rpx;\r\n  margin: 0 auto;\r\n}\r\n\r\n.group-title {\r\n  text-align: center;\r\n  font-size: 28rpx;\r\n  font-weight: 400;\r\n  color: $light-color;\r\n}\r\n\r\n.group-box {\r\n  height: 242rpx;\r\n  align-items: center;\r\n  display: flex;\r\n  justify-content: center;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  background: #fff;\r\n}\r\n\r\n.group {\r\n  width: 100%;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n}\r\n\r\n.tr {\r\n  text-align: right;\r\n}\r\n\r\n.tl {\r\n  text-align: left;\r\n}\r\n\r\n/deep/ .u-col-3 {\r\n  text-align: right;\r\n}\r\n\r\n.bar {\r\n  height: 4rpx;\r\n  overflow: hidden;\r\n  width: 100%;\r\n  background: url(\"@/pages/order/imgs/line.png\") no-repeat;\r\n}\r\n\r\n.box2 {\r\n  margin-top: 20rpx;\r\n}\r\n\r\n.notSupportFreight {\r\n  position: fixed;\r\n\r\n  bottom: calc(100rpx + env(safe-area-inset-bottom));\r\n  // #ifdef H5\r\n  bottom: 100rpx;\r\n  // #endif\r\n  display: flex;\r\n  align-items: center;\r\n  left: 0;\r\n  background: #fdf6ec;\r\n  height: 100rpx;\r\n  width: 100%;\r\n  transition: 0.35s;\r\n\r\n  > .tips {\r\n    margin: 0 32rpx;\r\n  }\r\n}\r\n\r\n/deep/ .u-notice-bar-wrap {\r\n  width: 100% !important;\r\n}\r\n\r\n.box6 {\r\n  position: fixed;\r\n  bottom: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  height: 100rpx;\r\n  overflow: hidden;\r\n  line-height: 100rpx;\r\n  margin-bottom: 0px !important;\r\n  background: #fff;\r\n  color: #333;\r\n  display: flex;\r\n  justify-content: space-between;\r\n}\r\n\r\n.tabbar-right {\r\n  margin-top: 10rpx;\r\n  height: 80rpx;\r\n  color: #fff;\r\n  line-height: 80rpx;\r\n  background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);\r\n  padding: 0 44rpx;\r\n  text-align: center;\r\n  border-radius: 400px;\r\n  margin-right: 32rpx;\r\n}\r\n\r\n.sp_tag {\r\n  display: inline;\r\n  background: #f2f2f2;\r\n  padding: 0 20rpx 0 10rpx;\r\n  height: 20rpx;\r\n  line-height: 20rpx;\r\n  font-size: 24rpx;\r\n  color: #262626;\r\n  border-radius: 0.4em;\r\n}\r\n\r\n.goods-promotion {\r\n  float: left;\r\n  width: 75%;\r\n  margin: 4rpx 0;\r\n}\r\n\r\n.sp_tag_plain {\r\n  margin-left: 8rpx;\r\n  padding: 0 6rpx 0 6rpx;\r\n  background: #fff;\r\n  border: 1px solid $main-color;\r\n  font-size: 24rpx;\r\n  color: $main-color;\r\n  border-radius: 50px;\r\n}\r\n\r\n.sp_tag_plain:nth-of-type(1) {\r\n  margin-left: 0;\r\n}\r\n\r\n.goods-name {\r\n  flex: 8;\r\n  font-size: 28rpx;\r\n}\r\n\r\n.sp_type {\r\n  color: $u-tips-color;\r\n  padding: 8rpx 0;\r\n  font-size: 24rpx;\r\n}\r\n\r\n.number {\r\n  color: $main-color;\r\n  font-size: 26rpx;\r\n  font-weight: bold;\r\n\r\n  > span {\r\n    font-size: 36rpx;\r\n  }\r\n}\r\n\r\n.goods-prices {\r\n  margin: 10rpx 0;\r\n  color: $main-color;\r\n  font-size: 28rpx;\r\n  font-weight: bold;\r\n\r\n  > .goods-price {\r\n    font-size: 38rpx;\r\n    padding: 0 2rpx;\r\n  }\r\n}\r\n\r\n.box {\r\n  border-radius: 40rpx;\r\n  overflow: hidden;\r\n  background: #fff;\r\n  margin-bottom: 20rpx;\r\n  color: #666;\r\n  padding: 0 32rpx;\r\n}\r\n\r\n.wrapper {\r\n  height: auto;\r\n  background: #f7f7f7;\r\n  padding-bottom: 200rpx;\r\n  overflow: auto !important;\r\n}\r\n\r\n.store-name {\r\n  margin-top: 32rpx;\r\n  font-weight: 400;\r\n  color: #333333;\r\n}\r\n\r\n/deep/ .u-col {\r\n  padding: 36rpx 0 !important;\r\n}\r\n\r\n/deep/ .u-col-3,\r\n.tipsColor {\r\n  color: #333;\r\n}\r\n\r\n.goods-image {\r\n  text-align: left;\r\n  overflow: hidden;\r\n}\r\n\r\n.default {\r\n  background: $main-color;\r\n  font-size: 24rpx;\r\n  border-radius: 8rpx;\r\n  padding: 0rpx 12rpx;\r\n  color: #fff;\r\n  margin-right: 20rpx;\r\n}\r\n\r\n.address-box {\r\n  border-radius: 40rpx;\r\n  border-top-left-radius: 0 !important;\r\n  border-top-right-radius: 0 !important;\r\n  overflow: hidden;\r\n  background: #fff;\r\n  margin-bottom: 20rpx;\r\n  color: #666;\r\n}\r\n\r\n.address-item {\r\n  font-weight: normal;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.user-box {\r\n  padding: 32rpx;\r\n}\r\n\r\n.user-address-detail {\r\n  color: #333;\r\n  font-size: 38rpx;\r\n  font-weight: bold;\r\n  margin: 20rpx 0;\r\n  letter-spacing: 1rpx;\r\n}\r\n\r\n.mobile {\r\n  margin-left: 20rpx;\r\n}\r\n\r\n.price {\r\n  font-size: 50rpx !important;\r\n  margin: 0 2rpx;\r\n}\r\n\r\n.goods-detail {\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  justify-content: center;\r\n  flex: 8;\r\n  margin-left: 20rpx !important;\r\n\r\n  > p {\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n  }\r\n}\r\n\r\n.goods-item {\r\n  margin: 20rpx 0;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/order/goods.scss",
    "content": ".goods-item-view {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tpadding: 10rpx 30rpx;\n\t\t\n\t\t.goods-img {flex: 1;}\n\t\n\t\t.goods-info {\n\t\t\tpadding-left: 30rpx;\n\t\t\tflex: 3;\n\t\n\t\t\t.goods-title {\n\t\t\t\tmargin-bottom: 10rpx;\n\t\t\t\tcolor: $font-color-dark;\n\t\t\t}\n\t\n\t\t\t.goods-specs {\n\t\t\t\tfont-size: 24rpx;\n\t\t\t\tmargin-bottom: 10rpx;\n\t\t\t\tcolor: #cccccc;\n\t\t\t}\n\t\n\t\t\t.goods-price {\n\t\t\t\tfont-size: 28rpx;\n\t\t\t\tmargin-bottom: 10rpx;\n\t\t\t\tcolor: #ff5a10;\n\t\t\t}\n\t\t}\n\t\n\t\t.goods-num {\n\t\t\t>.good-complaint{\n\t\t\t\tmargin-top:10rpx;\n\t\t\t}\n\t\t\ttext-align: center;\n\t\t\tflex: 1;\n\t\t\twidth: 60rpx;\n\t\t\tcolor: $main-color;\n\t\t}\n\t}\n\t\n\t\n\t\n\t.seller-view {\n\t\tbackground-color: #fff;\n\t\tmargin: 20rpx 0rpx;\n\t\n\t\t.seller-info {\n\t\t\theight: 70rpx;\n\t\t\tpadding: 0 20rpx;\n\t\n\t\t\t.seller-name {\n\t\t\t\tfont-size: 33rpx;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tdisplay: flex;\n\t\t\t\twidth: 100%;\n\t\t\t\tflex-direction: row;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 90rpx;\n\t\t\t\t// justify-content: space-between;\n\t\n\t\t\t\timage {\n\t\t\t\t\twidth: 32rpx;\n\t\t\t\t\theight: 30rpx;\n\t\t\t\t}\n\t\n\t\t\t\t.name {\n\t\t\t\t\tmargin-left: 15rpx;\n\t\t\t\t\tmargin-top: -2rpx;\n\t\t\t\t\tfont-size: 28rpx;\n\t\t\t\t\tflex: 1;\n\t\t\t\t}\n\t\n\t\t\t\t.status {\n\t\t\t\t\n\t\t\t\t\tfont-size: 26rpx;\n\t\t\t\t\tcolor: #ff6262;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t.order-sn {\n\t\t\t\tcolor: #ff0000;\n\t\t\t}\n\t\t}\n\t\n\t\t\n\t\n\t\t.btn-view {\n\t\t\t// padding: 25rpx 30rpx;\n\t\t\tmargin-bottom: 60rpx;\n\t\t\tmargin-right: 30rpx;\n\t\n\t\t\t.description {\n\t\t\t\tcolor: #909399;\n\t\t\t\tsize: 25rpx;\n\t\n\t\t\t\t.price {\n\t\t\t\t\tcolor: #ff0000;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t.right-btn {\n\t\t\t\tfloat: right;\n\t\t\t}\n\t\t}\n\t}"
  },
  {
    "path": "pages/order/invoice/invoiceDetail.vue",
    "content": "<template>\n  <view class=\"invoice-detail\">\n    <view class=\"block-item flex-center\">\n      <view>\n        <view>\n          {{'增值税普通发票'}}\n          <view class=\"circle\">\n            <view></view>\n          </view>\n        </view>\n        <view>{{order.receiptPrice | unitPrice('￥')}}</view>\n      </view>\n    </view>\n    <view class=\"common-msg flex-center\">\n      <view>\n        <view>抬头类型</view>\n        <view>{{order.receiptTitle}}</view>\n      </view>\n      <view>\n        <view>发票状态</view>\n        <view class=\"invoice_status\">{{order.receiptStatus === 1?'已开具':'暂未开具'}}</view>\n      </view>\n    </view>\n    <u-cell-group :border=\"false\">\n      <u-cell-item title=\"发票类型\" :border-top=\"false\" :value=\"'增值税普通发票'\" :arrow=\"false\"></u-cell-item>\n      <u-cell-item title=\"发票内容\" :value=\"order.receiptContent\" :arrow=\"false\"></u-cell-item>\n      <u-cell-item title=\"发票抬头\" :value=\"order.receiptTitle\" :arrow=\"false\"></u-cell-item>\n      <u-cell-item title=\"纳税人识别号\" v-if=\"order.taxpayerId\" :value=\"order.taxpayerId\" :arrow=\"false\"></u-cell-item>\n    </u-cell-group>\n    <!-- <u-cell-group :border=\"false\" style=\"margin-top: 20rpx;\">\n      <u-cell-item title=\"订单状态\" :border-top=\"false\" :value=\"order.order_status_text\" :arrow=\"false\"></u-cell-item>\n      <u-cell-item title=\"订单编号\" :value=\"order.sn\" :arrow=\"false\"></u-cell-item>\n    </u-cell-group> -->\n    <!-- <view class=\"show-pic\" @click=\"preview\">\n\n      <text>点击预览发票</text>\n    </view>\n    <button class=\"btn\" @click=\"download\">下载电子发票</button>\n    <view class=\"block-2-view\" v-for=\"(item,index) in order.elec_file_list\" :key=\"index\">\n      <u-image width=\"300\" height=\"150\" :src=\"item\"></u-image>\n    </view> -->\n  </view>\n</template>\n\n<script>\nimport { getReceiptDetail } from \"@/api/order.js\";\n\nexport default {\n  data() {\n    return {\n      order: {},\n      order: {},\n      title_type: \"\",\n    };\n  },\n  onLoad(options) {\n    this.loadData(options.id);\n  },\n  methods: {\n    loadData(id) {\n      getReceiptDetail(id).then((res) => {\n        let order = res.data.result;\n        this.order = order;\n      });\n    },\n    /**\n     * 点击图片放大或保存\n     */\n    preview() {\n      //预览发票\n      if (this.order.elec_file_list.length) {\n        uni.previewImage({\n          current: 0,\n          urls: this.order.elec_file_list,\n          longPressActions: {\n            itemList: [\"发送给朋友\", \"保存图片\", \"收藏\"],\n            success: function (data) {},\n            fail: function (err) {},\n          },\n        });\n      } else {\n        uni.showToast({\n          title: \"暂无发票可预览\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n    download() {\n      //下载发票\n      let _this = this;\n      if (this.order.elec_file_list.length) {\n        this.order.elec_file_list.forEach((item) => {\n          uni.downloadFile({\n            url: item,\n            success: (res) => {\n              if (res.statusCode === 200) {\n                let tempFilePath = res.tempFilePath;\n                uni.saveFile({\n                  tempFilePath: tempFilePath,\n                  success: function (res) {\n                    uni.showToast({\n                      title: \"发票已下载到\" + res.savedFilePath,\n                      duration: 2000,\n                      icon: \"none\",\n                    });\n                  },\n                });\n              }\n            },\n          });\n        });\n      } else {\n        uni.showToast({\n          title: \"暂无发票可下载\",\n          duration: 2000,\n          icon: \"none\",\n        });\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.block-item {\n  height: 217rpx;\n  width: 100%;\n  position: relative;\n  > view {\n    color: #ff6262;\n  }\n  > view:first-child {\n    text-align: center;\n    line-height: 3em;\n    > view:first-child {\n      position: relative;\n      .circle {\n        width: 166rpx;\n        height: 65rpx;\n        border: 1px solid #ff6262;\n        border-radius: 100%;\n        position: absolute;\n        top: 0;\n        right: 0;\n        left: 0;\n        bottom: 0;\n        margin: auto;\n        view {\n          width: 130rpx;\n          height: 40rpx;\n          border: 1px solid #ff6262;\n          border-radius: 100%;\n          top: 0;\n          right: 0;\n          left: 0;\n          bottom: 0;\n          margin: auto;\n          position: absolute;\n        }\n      }\n    }\n    > view:last-child {\n      font-size: 40rpx;\n    }\n  }\n}\n\n.common-msg {\n  flex-direction: row;\n  padding: 20rpx;\n  height: 118rpx;\n  background-color: #ffffff;\n  margin-bottom: 20rpx;\n\n  > view {\n    width: 50%;\n    text-align: center;\n    color: #666666;\n    line-height: 1.5em;\n    view {\n      font-size: 24rpx;\n    }\n    .invoice_status {\n      color: #ff6262;\n    }\n  }\n\n  > view:first-child {\n    border-right: 1px solid #eee;\n  }\n}\n.show-pic {\n  text-align: center;\n  margin-top: 40rpx;\n  image {\n    width: 27rpx;\n    height: 27rpx;\n    margin-right: 10rpx;\n    vertical-align: middle;\n  }\n  text {\n    color: $main-color;\n    font-size: $font-sm;\n  }\n}\n\n.u-cell {\n  padding: 35rpx 20rpx;\n  height: 110rpx;\n  color: #333333;\n}\n</style>\n"
  },
  {
    "path": "pages/order/invoice/setInvoice.vue",
    "content": "<template>\n  <u-popup closeable border-radius=\"28\" @close=\"close\" mode=\"bottom\" height=\"80%\" v-model=\"show\">\n\n    <div class=\"wrapper\">\n      <!-- 发票类型 -->\n      <div class=\"invoice-title\">发票类型</div>\n      <div class=\"flex\">\n        <div class=\"invoice-item\" :class=\"{'active':typeItem.active,disabled:typeItem.disabled}\" v-for=\"(typeItem,index) in invoiceType\" :key=\"index\">\n          {{typeItem.title}}\n        </div>\n      </div>\n      <div class=\"tips\">\n        {{tips}}\n      </div>\n      <div class=\"divider\">\n      </div>\n      <!-- 发票抬头 -->\n      <div class=\"invoice-title\">发票抬头</div>\n\n      <div class=\"flex\">\n        <div class=\"invoice-item\" @click=\"handleClickHeader(headerItem,index,invoiceHeader)\" :class=\"{'active':headerItem.active,disabled:headerItem.disabled}\"\n          v-for=\"(headerItem,index) in invoiceHeader\" :key=\"index\">\n          {{headerItem.title}}\n        </div>\n      </div>\n      <div>\n        <div class=\"form-item\">\n          <span> {{title}}名称</span>\n          <u-input :placeholder=\"'请输入'+title+'名称'\" v-model=\"submitData.receiptTitle\" />\n        </div>\n        <div class=\"form-item\" v-if=\"taxpayerFlag\">\n          <span>纳税人识别号</span>\n          <u-input placeholder=\"请输入纳税人识别号\" v-model=\"submitData.taxpayerId\" />\n        </div>\n\n      </div>\n      <div class=\"divider\">\n      </div>\n      <div class=\"invoice-title\">\n        发票信息\n      </div>\n      <div class=\"flex\">\n        <div class=\"invoice-item\" @click=\"handleClickHeader(goodsItem,index,goodsType)\" :class=\"{'active':goodsItem.active,disabled:goodsItem.disabled}\" v-for=\"(goodsItem,index) in goodsType\"\n          :key=\"index\">\n          {{goodsItem.title}}\n        </div>\n      </div>\n\n      <div class=\"submit\" @click=\"submitInvoice()\">确定</div>\n    </div>\n  </u-popup>\n</template>\n<script>\nimport { addReceipt } from \"@/api/members\";\nexport default {\n  props: [\"res\"],\n  watch: {\n    invoiceHeader: {\n      handler(val) {\n        this.title = val.filter((item) => {\n          return item.active == true;\n        })[0].title;\n        this.taxpayerFlag = false;\n        this.submitData.taxpayerId = \"\";\n\n        if (this.title == \"单位\") {\n          this.taxpayerFlag = true;\n        }\n      },\n      deep: true,\n    },\n    goodsType: {\n      handler(val) {\n        this.submitData.receiptContent = val.filter((item) => {\n          return item.active == true;\n        })[0].title;\n      },\n      deep: true,\n    },\n  },\n\n  data() {\n    return {\n      taxpayerFlag: false,\n      submitData: {\n        receiptTitle: \"\", //发票抬头\n        taxpayerId: \"\", //纳税人\n        receiptContent: \"\",\n      },\n      show: true,\n      title: \"\",\n      tips:\n        \"电子发票即电子增值税发票，是税局认可的有效凭证，其法律效力、基本用途及使用规定同纸质发票。\",\n      //   发票类型\n      invoiceType: [\n        {\n          title: \"电子普通发票\",\n          active: true,\n        },\n        {\n          title: \"增值税专用发票\",\n          active: false,\n          disabled: true,\n        },\n      ],\n      //   发票抬头\n      invoiceHeader: [\n        {\n          title: \"个人\",\n          active: false,\n        },\n        {\n          title: \"单位\",\n          active: false,\n        },\n      ],\n      //   商品类型\n      goodsType: [\n        {\n          title: \"商品明细\",\n          active: false,\n        },\n        {\n          title: \"商品类别\",\n          active: false,\n        },\n      ],\n    };\n  },\n  mounted() {\n    if (this.res) {\n      this.submitData.receiptTitle = this.res.receiptTitle;\n      this.submitData.taxpayerId = this.res.taxpayerId; //纳税人\n      this.submitData.receiptContent = this.res.receiptContent;\n      this.res.receiptContent == \"商品明细\"\n        ? (this.goodsType[0].active = true)\n        : (this.goodsType[1].active = true);\n      this.res.taxpayerId\n        ? (this.invoiceHeader[1].active = true)\n        : (this.invoiceHeader[0].active = true);\n    } else {\n      this.invoiceHeader[0].active = true;\n      this.goodsType[0].active = true;\n    }\n\n  },\n  methods: {\n    handleClickHeader(val, index, arr) {\n      arr = arr.map((item) => {\n        return (item.active = false);\n      });\n      val.active = true;\n    },\n    /**\n     * 监听关闭\n     */\n    close(val) {\n      this.$emit(\"callbackInvoice\", val);\n    },\n    submitInvoice() {\n      /**\n       * 验证\n       */\n      const { receiptTitle, taxpayerId, receiptContent } = this.submitData;\n\n      if (this.$u.test.isEmpty(receiptTitle)) {\n        uni.showToast({\n          title: \"请您填写发票抬头!\",\n          duration: 2000,\n          icon: \"none\",\n        });\n        return false;\n      }\n      if (\n        !this.$u.test.isEmpty(receiptTitle) &&\n        this.$u.test.isEmpty(taxpayerId) &&\n        this.invoiceHeader[1].active == true\n      ) {\n        uni.showToast({\n          title: \"请您填写纳税人识别号!\",\n          duration: 2000,\n          icon: \"none\",\n        });\n     \n        return false;\n      }\n\n      this.show = false;\n      this.close(this.submitData);\n    },\n  },\n};\n</script>\n<style scoped lang=\"scss\">\n.form-item {\n  display: flex;\n  margin: 30rpx 0;\n  align-items: center;\n  > span {\n    margin-right: 50rpx;\n  }\n}\n.submit {\n  width: 100%;\n  margin-top: 100rpx;\n  background: $main-color;\n  text-align: center;\n  line-height: 80rpx;\n  height: 80rpx;\n  margin: 100rpx auto 0 auto;\n  color: #f2f2f2;\n  border-radius: 100px;\n}\n.invoice-item {\n  margin-right: 30rpx;\n  color: #333;\n  font-weight: 24rpx;\n\n  padding: 12rpx 46rpx;\n  border-radius: 100px;\n  background: #eee;\n  min-width: 100rpx;\n  text-align: center;\n}\n.active {\n  font-weight: bold;\n  color: $main-color;\n  border: 2rpx solid $main-color;\n  background: rgba($color: $main-color, $alpha: 0.1);\n}\n.disabled {\n  color: #b5b5b6;\n}\n.wrapper {\n  padding: 30rpx;\n}\n.invoice-title {\n  margin-bottom: 30rpx;\n  font-weight: bold;\n  font-size: 30rpx;\n}\n.tips {\n  margin-top: 30rpx;\n  color: #999;\n  font-size: 24rpx;\n}\n.divider {\n  margin: 30rpx 0;\n  height: 1rpx;\n  border-bottom: 1px solid #f2f3f5;\n}\n.flex {\n  display: flex;\n}\n</style>\n"
  },
  {
    "path": "pages/order/myOrder.vue",
    "content": "<template>\r\n\t<view class=\"content\">\r\n\t\t<view class=\"navbar\">\r\n\t\t\t<view v-for=\"(item, index) in navList\" :key=\"index\" class=\"nav-item\"\r\n\t\t\t\t:class=\"{ current: tabCurrentIndex === index }\" @click=\"tabClick(index)\">{{ item.text }}</view>\r\n\t\t</view>\r\n\t\t<swiper :current=\"tabCurrentIndex\" class=\"swiper-box\" duration=\"300\" @change=\"changeTab\">\r\n\t\t\t<swiper-item class=\"tab-content\" v-for=\"(tabItem, tabIndex) in navList\" :key=\"tabIndex\">\r\n\t\t\t\t<scroll-view class=\"list-scroll-content\" scroll-y @scrolltolower=\"loadData(tabIndex)\">\r\n\t\t\t\t\t<!-- 空白页 -->\r\n\t\t\t\t\t<u-empty text=\"暂无订单\" mode=\"list\"\r\n\t\t\t\t\t\tv-if=\"tabItem.loaded === true && tabItem.orderList.length === 0\"></u-empty>\r\n\t\t\t\t\t<!-- 订单列表 -->\r\n\t\t\t\t\t<view class=\"seller-view\" :key=\"oderIndex\" v-for=\"(order, oderIndex) in tabItem.orderList\">\r\n\t\t\t\t\t\t<!-- 店铺名称 -->\r\n\t\t\t\t\t\t<view class=\"seller-info u-flex u-row-between\">\r\n\t\t\t\t\t\t\t<view class=\"seller-name wes\" @click=\"navigateToStore(order)\">\r\n\t\t\t\t\t\t\t\t<view class=\"name\">{{ order.storeName }}</view>\r\n\r\n\t\t\t\t\t\t\t\t<view class=\"name\" v-if=\"order.orderPromotionType\">\r\n\t\t\t\t\t\t\t\t\t<u-tag \n\t\t\t\t\t\t\t\t\t:text=\"renderOrderTag(order.orderPromotionType)\" \n\t\t\t\t\t\t\t\t\t:color=\"renderOrderTagColor(order.orderPromotionType)\"\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</view>\r\n\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"order-sn\">{{\r\n\t\t\t\t\t\t\t\torder.orderStatus | orderStatusList\r\n\t\t\t\t\t\t\t  }}</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<view>\r\n\t\t\t\t\t\t\t<view>\r\n\t\t\t\t\t\t\t\t<view class=\"goods-item-view\" @click=\"navigateToOrderDetail(order.sn)\">\r\n\t\t\t\t\t\t\t\t\t<view class=\"goods-img\" v-for=\"(goods, goodsIndex) in order.orderItems\"\r\n\t\t\t\t\t\t\t\t\t\t:key=\"goodsIndex\">\r\n\t\t\t\t\t\t\t\t\t\t<u-image border-radius=\"6\" width=\"100%\" height=\"100%\"\r\n\t\t\t\t\t\t\t\t\t\t\t:src=\"goods.image\"></u-image>\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t\t<view class=\"goods-info\">\r\n\t\t\t\t\t\t\t\t\t\t<view v-if=\"order.orderItems.length <= 1\" class=\"goods-title u-line-2\">\r\n\t\t\t\t\t\t\t\t\t\t\t{{ order.groupName }}</view>\r\n\t\t\t\t\t\t\t\t\t\t<view v-if=\"order.orderItems.length <= 1\" class=\"goods-price\">\r\n\t\t\t\t\t\t\t\t\t\t\t￥{{ order.flowPrice | unitPrice }}\r\n\t\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t\t<view v-if=\"order.orderItems.length <= 1\" class=\"goods-num\">\r\n\t\t\t\t\t\t\t\t\t\t<view>x{{ order.groupNum }}</view>\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<view class=\"btn-view u-flex u-row-between\">\r\n\t\t\t\t\t\t\t\t<view class=\"description\">\r\n\t\t\t\t\t\t\t\t\t<!-- 等待付款 -->\r\n\t\t\t\t\t\t\t\t\t<div v-if=\"order.payStatus === 'PAID'\">已付金额:</div>\r\n\t\t\t\t\t\t\t\t\t<div v-else>应付金额:</div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"price\">￥{{ order.flowPrice | unitPrice }}</div>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t<view class=\"goods-btn flex flex-a-c\">\r\n\t\t\t\t\t\t\t\t\t<!-- 全部 -->\r\n\t\t\t\t\t\t\t\t\t<view ripple class=\"pay-btn\" shape=\"circle\" size=\"mini\"\r\n\t\t\t\t\t\t\t\t\t\tv-if=\"order.allowOperationVO.pay\" @click=\"waitPay(order)\">立即付款</view>\r\n\t\t\t\t\t\t\t\t\t<!-- 取消订单 -->\r\n\t\t\t\t\t\t\t\t\t<view ripple class=\"cancel-btn\" shape=\"circle\" size=\"mini\"\r\n\t\t\t\t\t\t\t\t\t\tv-if=\"order.allowOperationVO.cancel\" @click=\"onCancel(order.sn)\">\r\n\t\t\t\t\t\t\t\t\t\t取消订单\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t\t<!-- 等待收货 -->\r\n\t\t\t\t\t\t\t\t\t<view ripple shape=\"circle\" class=\"rebuy-btn\" size=\"mini\"\r\n\t\t\t\t\t\t\t\t\t\tv-if=\"order.allowOperationVO.showLogistics\" @click=\"navigateToLogistics(order)\">\r\n\t\t\t\t\t\t\t\t\t\t查看物流\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t\t<view ripple shape=\"circle\" class=\"pay-btn\" size=\"mini\"\r\n\t\t\t\t\t\t\t\t\t\tv-if=\"order.allowOperationVO.rog\" @click=\"onRog(order.sn)\">\r\n\t\t\t\t\t\t\t\t\t\t确认收货\r\n\t\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\t\t<view ripple shape=\"circle\" class=\"cancel-btn\" size=\"mini\"\r\n\t\t\t\t\t\t\t\t\t\tv-if=\"order.groupAfterSaleStatus && ( order.groupAfterSaleStatus.includes('NOT_APPLIED') || order.groupAfterSaleStatus.includes('PART_AFTER_SALE'))\"\r\n\t\t\t\t\t\t\t\t\t\t@click=\"applyService(order)\">\r\n\t\t\t\t\t\t\t\t\t\t退款/售后\r\n\t\t\t\t\t\t\t\t\t</view> \r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<uni-load-more :status=\"tabItem.loadStatus\"></uni-load-more>\r\n\t\t\t\t</scroll-view>\r\n\t\t\t</swiper-item>\r\n\t\t</swiper>\r\n\t\t<u-popup class=\"cancel-popup\" v-model=\"cancelShow\" mode=\"bottom\" length=\"60%\">\r\n\t\t\t<view class=\"header\">取消订单</view>\r\n\t\t\t<view class=\"body\">\r\n\t\t\t\t<view class=\"title\">取消订单后，本单享有的优惠可能会一并取消，是否继续？</view>\r\n\t\t\t\t<view>\r\n\t\t\t\t\t<u-radio-group v-model=\"reason\">\r\n\t\t\t\t\t\t<view class=\"value\">\r\n\t\t\t\t\t\t\t<view class=\"radio-view\" :key=\"index\" v-for=\"(item, index) in cancelList\">\r\n\t\t\t\t\t\t\t\t<u-radio :active-color=\"lightColor\" label-size=\"25\" shape=\"circle\" :name=\"item.reason\"\r\n\t\t\t\t\t\t\t\t\t@change=\"reasonChange\">{{ item.reason }}</u-radio>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</u-radio-group>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"footer\">\r\n\t\t\t\t<u-button size=\"medium\" ripple v-if=\"reason\" shape=\"circle\" @click=\"submitCancel\">提交</u-button>\r\n\t\t\t</view>\r\n\t\t</u-popup>\r\n\t\t<u-toast ref=\"uToast\" />\r\n\t\t<u-modal :confirm-color=\"lightColor\" v-model=\"rogShow\" :show-cancel-button=\"true\" :content=\"'是否确认收货?'\"\r\n\t\t\t@confirm=\"confirmRog\"></u-modal>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport uniLoadMore from \"@/components/uni-load-more/uni-load-more.vue\";\r\n\timport {\r\n\t\tgetOrderList,\r\n\t\tcancelOrder,\r\n\t\tconfirmReceipt\r\n\t} from \"@/api/order.js\";\r\n\timport {\r\n\t\tgetClearReason\r\n\t} from \"@/api/after-sale.js\";\r\n\timport LiLiWXPay from \"@/js_sdk/lili-pay/wx-pay.js\";\r\n\texport default {\r\n\t\tcomponents: {\r\n\t\t\tuniLoadMore,\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tlightColor: this.$lightColor,\r\n\t\t\t\ttabCurrentIndex: 0, //导航栏索引\r\n\t\t\t\tnavList: [\r\n\t\t\t\t\t//导航栏list\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstate: 0,\r\n\t\t\t\t\t\ttext: \"全部\",\r\n\t\t\t\t\t\tloadStatus: \"more\",\r\n\t\t\t\t\t\torderList: [],\r\n\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstate: 1,\r\n\t\t\t\t\t\ttext: \"待付款\",\r\n\t\t\t\t\t\tloadStatus: \"more\",\r\n\t\t\t\t\t\torderList: [],\r\n\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstate: 2,\r\n\t\t\t\t\t\ttext: \"待发货\",\r\n\t\t\t\t\t\tloadStatus: \"more\",\r\n\t\t\t\t\t\torderList: [],\r\n\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstate: 3,\r\n\t\t\t\t\t\ttext: \"待收货\",\r\n\t\t\t\t\t\tloadStatus: \"more\",\r\n\t\t\t\t\t\torderList: [],\r\n\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstate: 4,\r\n\t\t\t\t\t\ttext: \"已完成\",\r\n\t\t\t\t\t\tloadStatus: \"more\",\r\n\t\t\t\t\t\torderList: [],\r\n\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tstate: 5,\r\n\t\t\t\t\t\ttext: \"已取消\",\r\n\t\t\t\t\t\tloadStatus: \"more\",\r\n\t\t\t\t\t\torderList: [],\r\n\t\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tstatus: \"\", //接收导航栏状态\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\ttag: \"ALL\",\r\n\t\t\t\t},\r\n\t\t\t\torderStatus: [\r\n\t\t\t\t\t//订单状态\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"ALL\", //全部\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"WAIT_PAY\", //代付款\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"WAIT_SHIP\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"WAIT_ROG\", //待收货\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"COMPLETE\", //已完成\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"CANCELLED\", //已取消\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\torderStatus: \"STAY_PICKED_UP\", //待自提\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tcancelShow: false, //是否显示取消\r\n\t\t\t\torderSn: \"\", //ordersn\r\n\t\t\t\treason: \"\", //取消原因\r\n\t\t\t\tcancelList: \"\", //取消列表\r\n\t\t\t\trogShow: false, //显示是否收货\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 跳转到个人中心\r\n\t\t */\r\n\t\tonBackPress(e) {\r\n\t\t\tif (e.from == \"backbutton\") {\r\n\t\t\t\tuni.switchTab({\r\n\t\t\t\t\turl: \"/pages/tabbar/user/my\",\r\n\t\t\t\t});\r\n\t\t\t\treturn true; //阻止默认返回行为\r\n\t\t\t}\r\n\t\t},\r\n\t\tonPullDownRefresh() {\r\n\t\t\tif (this.tabCurrentIndex) {\r\n\t\t\t\tthis.initData(this.tabCurrentIndex);\r\n\t\t\t} else {\r\n\t\t\t\tthis.initData(0);\r\n\t\t\t}\r\n\t\t\t// this.loadData(this.status);\r\n\t\t},\r\n\t\tonShow() {\r\n\t\t\tif (this.$options.filters.tipsToLogin()) {\r\n\t\t\t\tif (!this.tabCurrentIndex) {\r\n\t\t\t\t\tthis.initData(0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// this.loadData(this.status);\r\n\t\t},\r\n\r\n\t\tonLoad(options) {\r\n\t\t\t/**\r\n\t\t\t * 修复app端点击除全部订单外的按钮进入时不加载数据的问题\r\n\t\t\t * 替换onLoad下代码即可\r\n\t\t\t */\r\n\t\t\tlet status = Number(options.status);\r\n\t\t\tthis.status = status;\r\n\r\n\t\t\tthis.tabCurrentIndex = status;\r\n\t\t\t// if (status == 0) {\r\n\t\t\t//   this.loadData(status);\r\n\t\t\t// }\r\n\t\t},\r\n\r\n\t\twatch: {\r\n\t\t\t/**监听更改请求数据 */\r\n\t\t\ttabCurrentIndex(val) {\r\n\t\t\t\tthis.params.tag = this.orderStatus[val].orderStatus;\r\n\t\t\t\t//切换标签页将所有的页数都重置为1\r\n\t\t\t\tthis.navList.forEach((res) => {\r\n\t\t\t\t\tres.pageNumber = 1;\r\n\t\t\t\t\tres.loadStatus = \"more\";\r\n\t\t\t\t\tres.orderList = [];\r\n\t\t\t\t});\r\n\t\t\t\tthis.loadData(val);\r\n\t\t\t},\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 售后\r\n\t\t\tapplyService(order) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: `/pages/order/afterSales/afterSales?orderSn=${order.sn}`,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t// 店铺详情\r\n\t\t\tnavigateToStore(val) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/product/shopPage?id=\" + val.storeId,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\trenderOrderTag(orderPromotionType) {\r\n\t\t\t\tswitch (orderPromotionType) {\r\n\t\t\t\t\tcase \"NORMAL\":\r\n\t\t\t\t\t\treturn \"普通订单\";\r\n\t\t\t\t\tcase \"PINTUAN\":\r\n\t\t\t\t\t\treturn \"拼团订单\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"GIFT\":\r\n\t\t\t\t\t\treturn \"赠品订单\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"POINTS\":\r\n\t\t\t\t\t\treturn \"积分订单\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"KANJIA\":\r\n\t\t\t\t\t\treturn \"砍价订单\";\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn \"\";\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\trenderOrderTagColor(orderPromotionType) {\r\n\t\t\t\tswitch (orderPromotionType) {\r\n\t\t\t\t\tcase \"NORMAL\":\r\n\t\t\t\t\t\treturn \"main\";\r\n\t\t\t\t\tcase \"PINTUAN\":\r\n\t\t\t\t\t\treturn \"red\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"GIFT\":\r\n\t\t\t\t\t\treturn \"blue\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"POINTS\":\r\n\t\t\t\t\t\treturn \"black\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"KANJIA\":\r\n\t\t\t\t\t\treturn \"pink\";\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn \"\";\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * 取消订单\r\n\t\t\t */\r\n\t\t\tonCancel(sn) {\r\n\t\t\t\tthis.orderSn = sn;\r\n\t\t\t\tthis.cancelShow = true;\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"加载中\",\r\n\t\t\t\t});\r\n\t\t\t\tgetClearReason().then((res) => {\r\n\t\t\t\t\tif (res.data.result.length >= 1) {\r\n\t\t\t\t\t\tthis.cancelList = res.data.result;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.$store.state.isShowToast) {\r\n\t\t\t\t\t\tuni.hideLoading()\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 初始化数据\r\n\t\t\t */\r\n\t\t\tinitData(index) {\r\n\t\t\t\tthis.navList[index].pageNumber = 1;\r\n\t\t\t\tthis.navList[index].loadStatus = \"more\";\r\n\t\t\t\tthis.navList[index].orderList = [];\r\n\t\t\t\tthis.loadData(index);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 等待支付\r\n\t\t\t */\r\n\t\t\twaitPay(val) {\r\n\t\t\t\tthis.$u.debounce(this.pay(val), 3000);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 支付\r\n\t\t\t */\r\n\t\t\tpay(val) {\r\n\t\t\t\tif (val.sn) {\r\n\t\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\t\tnew LiLiWXPay({\r\n\t\t\t\t\t\tsn: val.sn,\r\n\t\t\t\t\t\tprice: val.flowPrice,\r\n\t\t\t\t\t\torderType: \"ORDER\",\r\n\t\t\t\t\t}).pay();\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\turl: \"/pages/cart/payment/payOrder?order_sn=\" + val.sn,\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 获取订单列表\r\n\t\t\t */\r\n\t\t\tloadData(index) {\r\n\t\t\t\tthis.params.pageNumber = this.navList[index].pageNumber;\r\n\t\t\t\t// this.params.tag = this.orderStatus[index].orderStatus;\r\n\t\t\t\tgetOrderList(this.params).then((res) => {\r\n\t\t\t\t\tuni.stopPullDownRefresh();\r\n\t\t\t\t\tif (!res.data.success) {\r\n\t\t\t\t\t\tthis.navList[index].loadStatus = \"noMore\";\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet orderList = res.data.result.records;\r\n\t\t\t\t\tif (orderList.length == 0) {\r\n\t\t\t\t\t\tthis.navList[index].loadStatus = \"noMore\";\r\n\t\t\t\t\t} else if (orderList.length < 10) {\r\n\t\t\t\t\t\tthis.navList[index].loadStatus = \"noMore\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (orderList.length > 0) {\r\n\t\t\t\t\t\tthis.navList[index].orderList =\r\n\t\t\t\t\t\t\tthis.navList[index].orderList.concat(orderList);\r\n\t\t\t\t\t\tthis.navList[index].pageNumber += 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t//swiper 切换监听\r\n\t\t\tchangeTab(e) {\r\n\t\t\t\tthis.tabCurrentIndex = e.target.current;\r\n\t\t\t},\r\n\t\t\t//顶部tab点击\r\n\t\t\ttabClick(index) {\r\n\t\t\t\tthis.tabCurrentIndex = index;\r\n\t\t\t},\r\n\t\t\t//删除订单\r\n\t\t\tdeleteOrder(index) {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"请稍后\",\r\n\t\t\t\t});\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.navList[this.tabCurrentIndex].orderList.splice(index, 1);\r\n\t\t\t\t\tif (this.$store.state.isShowToast) {\r\n\t\t\t\t\t\tuni.hideLoading()\r\n\t\t\t\t\t};\r\n\t\t\t\t}, 600);\r\n\t\t\t},\r\n\t\t\t//取消订单\r\n\t\t\tcancelOrder(item) {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"请稍后\",\r\n\t\t\t\t});\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tlet {\r\n\t\t\t\t\t\tstateTip,\r\n\t\t\t\t\t\tstateTipColor\r\n\t\t\t\t\t} = this.orderStateExp(9);\r\n\t\t\t\t\titem = Object.assign(item, {\r\n\t\t\t\t\t\tstate: 9,\r\n\t\t\t\t\t\tstateTip,\r\n\t\t\t\t\t\tstateTipColor,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t//取消订单后删除待付款中该项\r\n\t\t\t\t\tlet list = this.navList[1].orderList;\r\n\t\t\t\t\tlet index = list.findIndex((val) => val.id === item.id);\r\n\t\t\t\t\tindex !== -1 && list.splice(index, 1);\r\n\t\t\t\t\tif (this.$store.state.isShowToast) {\r\n\t\t\t\t\t\tuni.hideLoading()\r\n\t\t\t\t\t};\r\n\t\t\t\t}, 600);\r\n\t\t\t},\r\n\r\n\t\t\t//订单状态文字和颜色\r\n\t\t\torderStateExp(state) {\r\n\t\t\t\tlet stateTip = \"\",\r\n\t\t\t\t\tstateTipColor = this.$lightColor;\r\n\t\t\t\tswitch (+state) {\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\tstateTip = \"待付款\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\tstateTip = \"待发货\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 9:\r\n\t\t\t\t\t\tstateTip = \"订单已关闭\";\r\n\t\t\t\t\t\tstateTipColor = \"#909399\";\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t//更多自定义\r\n\t\t\t\t}\r\n\t\t\t\treturn {\r\n\t\t\t\t\tstateTip,\r\n\t\t\t\t\tstateTipColor,\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 跳转到订单详情\r\n\t\t\t */\r\n\t\t\tnavigateToOrderDetail(sn) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"./orderDetail?sn=\" + sn,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 选择取消原因\r\n\t\t\t */\r\n\t\t\treasonChange(reason) {\r\n\t\t\t\tthis.reason = reason;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 提交取消订单（未付款）\r\n\t\t\t */\r\n\t\t\tsubmitCancel() {\r\n\t\t\t\tcancelOrder(this.orderSn, {\r\n\t\t\t\t\treason: this.reason\r\n\t\t\t\t}).then((res) => {\r\n\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"订单已取消\",\r\n\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.initData(this.tabCurrentIndex);\r\n\r\n\t\t\t\t\t\tthis.cancelShow = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: res.data.message,\r\n\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.cancelShow = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 确认收货显示\r\n\t\t\t */\r\n\t\t\tonRog(sn) {\r\n\t\t\t\tthis.orderSn = sn;\r\n\t\t\t\tthis.rogShow = true;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 点击确认收货\r\n\t\t\t */\r\n\t\t\tconfirmRog() {\r\n\t\t\t\tconfirmReceipt(this.orderSn).then((res) => {\r\n\t\t\t\t\tif (res.data.code == 200) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"已确认收货\",\r\n\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.initData(this.tabCurrentIndex);\r\n\t\t\t\t\t\tthis.rogShow = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 评价商品\r\n\t\t\t */\r\n\t\t\tonComment(sn) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"./evaluate/myEvaluate\",\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 重新购买\r\n\t\t\t */\r\n\t\t\treBuy(order) {\r\n\t\t\t\tconsole.log(order);\r\n\t\t\t\treturn;\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/product/goods?id=\" + order.id + \"&goodsId=\" + order.goodsId,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 查看物流\r\n\t\t\t */\r\n\t\t\tnavigateToLogistics(order) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/order/deliverDetail?order_sn=\" + order.sn,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\tpage,\r\n\t.content {\r\n\t\tbackground: $page-color-base;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t.swiper-box {\r\n\t\theight: calc(100vh - 40px);\r\n\t\t// #ifdef H5\r\n\t\theight: calc(100vh - 40px - 44px);\r\n\t\t// #endif\r\n\t}\r\n\r\n\t.list-scroll-content {\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t.navbar {\r\n\t\tdisplay: flex;\r\n\t\theight: 40px;\r\n\t\tpadding: 0 5px;\r\n\t\tbackground: #fff;\r\n\t\tbox-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);\r\n\t\tposition: relative;\r\n\t\tz-index: 10;\r\n\r\n\t\t.nav-item {\r\n\t\t\tflex: 1;\r\n\t\t\tdisplay: flex;\r\n\t\t\tjustify-content: center;\r\n\t\t\talign-items: center;\r\n\t\t\theight: 100%;\r\n\t\t\tfont-size: 26rpx;\r\n\t\t\tcolor: $font-color-light;\r\n\t\t\tposition: relative;\r\n\r\n\t\t\t&.current {\r\n\t\t\t\tcolor: $main-color;\r\n\r\n\t\t\t\t&:after {\r\n\t\t\t\t\tcontent: \"\";\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tleft: 50%;\r\n\t\t\t\t\tbottom: 0;\r\n\t\t\t\t\ttransform: translateX(-50%);\r\n\t\t\t\t\twidth: 44px;\r\n\t\t\t\t\theight: 0;\r\n\t\t\t\t\tborder-bottom: 2px solid $main-color;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t.uni-swiper-item {\r\n\t\theight: auto;\r\n\t}\r\n\r\n\t.seller-view {\r\n\t\tborder-radius: 20rpx;\r\n\t\tbackground-color: #fff;\r\n\t\tmargin: 20rpx 0rpx;\r\n\r\n\t\t.seller-info {\r\n\t\t\theight: 70rpx;\r\n\t\t\tpadding: 0 20rpx;\r\n\r\n\t\t\t.seller-name {\r\n\t\t\t\tflex: 10;\r\n\t\t\t\tfont-size: 28rpx;\r\n\t\t\t\tfont-weight: 600;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\tflex-direction: row;\n\t\t\t\t\ttext-align: center;\r\n\t\t\t\t.name {\r\n\t\t\t\t\tmargin-left: 15rpx;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t.order-sn {\r\n\t\t\t\tflex: 2;\r\n\t\t\t\twidth: 120rpx;\r\n\t\t\t\ttext-align: center;\r\n\t\t\t\tcolor: $aider-light-color;\r\n\t\t\t\tfont-size: 26rpx;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.goods-item-view {\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-wrap: wrap;\r\n\t\t\tflex-direction: row;\r\n\t\t\tpadding: 10rpx 20rpx;\r\n\r\n\t\t\t.goods-img {\r\n\t\t\t\twidth: 131rpx;\r\n\t\t\t\theight: 131rpx;\r\n\t\t\t\tmargin-right: 10rpx;\r\n\t\t\t\tmargin-bottom: 10rpx;\r\n\t\t\t}\r\n\r\n\t\t\t.goods-info {\r\n\t\t\t\tpadding-left: 30rpx;\r\n\t\t\t\tflex: 1;\r\n\r\n\t\t\t\t.goods-title {\r\n\t\t\t\t\tmargin-bottom: 10rpx;\r\n\t\t\t\t\tcolor: #333333;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t.goods-specs {\r\n\t\t\t\t\tfont-size: 24rpx;\r\n\t\t\t\t\tmargin-bottom: 10rpx;\r\n\t\t\t\t\tcolor: #cccccc;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t.goods-price {\r\n\t\t\t\t\tfont-size: 28rpx;\r\n\t\t\t\t\tmargin-bottom: 10rpx;\r\n\t\t\t\t\tcolor: $aider-light-color;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t.goods-num {\r\n\t\t\t\twidth: 60rpx;\r\n\t\t\t\tcolor: $main-color;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.btn-view {\r\n\t\t\tpadding: 25rpx 30rpx;\r\n\t\t\tfont-size: 26rpx;\r\n\r\n\t\t\t.description {\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\tcolor: #909399;\r\n\t\t\t\tsize: 24rpx;\r\n\t\t\t\tflex: 1;\r\n\r\n\t\t\t\t.price {\r\n\t\t\t\t\tcolor: $main-color;\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t.cancel-popup {\r\n\t\t.header {\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-direction: row;\r\n\t\t\tjustify-content: center;\r\n\t\t\tmargin: 15rpx 0rpx;\r\n\t\t}\r\n\r\n\t\t.body {\r\n\t\t\tpadding: 30rpx;\r\n\r\n\t\t\t.title {\r\n\t\t\t\tfont-weight: 600;\r\n\t\t\t}\r\n\r\n\t\t\t.value {\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\tflex-direction: column;\r\n\t\t\t\tmargin: 20rpx 0;\r\n\r\n\t\t\t\t.radio-view {\r\n\t\t\t\t\tmargin: 20rpx 0rpx;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.footer {\r\n\t\t\ttext-align: center;\r\n\t\t}\r\n\t}\r\n\r\n\t.goods-btn {\r\n\t\tdisplay: flex;\r\n\t}\r\n\r\n\t.cancel-btn,\r\n\t.pay-btn,\r\n\t.rebuy-btn {\r\n\t\ttext-align: center;\r\n\t\tmargin-left: 15rpx;\r\n\t\tfont-size: 24rpx;\r\n\t\tpadding: 14rpx 20rpx;\r\n\t\tborder-radius: 100px;\r\n\r\n\t}\r\n\r\n\t.cancel-btn {\r\n\t\tcolor: #333639 !important;\r\n\t\tbackground: rgba(46, 51, 56, .05) !important;\r\n\t}\r\n\r\n\t.pay-btn {\r\n\r\n\t\tbackground-color: $light-color !important;\r\n\r\n\t\tcolor: #ffffff !important;\r\n\t}\r\n\r\n\t.rebuy-btn {\r\n\t\tcolor: $light-color !important;\r\n\t\tborder-color: $light-color !important;\r\n\t\tbackground-color: #ffffff !important;\r\n\t}\r\n</style>"
  },
  {
    "path": "pages/order/orderDetail.vue",
    "content": "<template>\r\n  <view>\r\n    <!-- 订单状态 -->\r\n    <div class=\"info-view order-view\">\r\n      <div class=\"order-status\" v-if=\"orderStatusList[order.orderStatus]\">\r\n        {{ orderStatusList[order.orderStatus].title }}\r\n        <div>{{ orderStatusList[order.orderStatus].value }}</div>\r\n      </div>\r\n\r\n    </div>\r\n    <!-- 物流信息 -->\r\n    <view class=\"info-view logistics-view\">\r\n\r\n      <view class=\"logistics-List\">\r\n        <view class=\"verificationCode\" v-if=\"order.verificationCode\">\r\n          券码： {{ order.orderStatus == 'CANCELLED' ?  '已失效' : order.verificationCode }}\r\n        </view>\r\n\t\t<view @click=\"handleClickDeliver()\" class=\"info-view logi-view\"  v-else-if=\"orderPackage && orderPackage.length\">\r\n\t\t  <view class=\"verificationCode\">\r\n\t\t      当前订单有 {{ orderPackage.length }} 个包裹快递\r\n\t\t  </view>\r\n\t\t  <div>\r\n\t\t      点击此处查看\r\n\t\t  </div>\r\n\t\t</view>\r\n        <view v-else class=\"logistics-List-title\">\r\n          {{ '暂无物流信息' }}\r\n        </view>\r\n      </view>\r\n\r\n    </view>\r\n    <!-- 地址 -->\r\n    <view class=\"info-view\" v-if=\"order.deliveryMethod === 'LOGISTICS' && order.orderType !== 'VIRTUAL'\">\r\n      <view class=\"address-view\">\r\n        <view>\r\n          <view class=\"address-title\">\r\n            <span>{{ order.consigneeName || \"未填写昵称\" }}</span>\r\n            <span>{{ order.consigneeMobile || \"未填写手机号\" | secrecyMobile }}</span>\r\n          </view>\r\n          <view class=\"address\">地址：{{ order.consigneeAddressPath }}\r\n            {{ order.consigneeDetail }}</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 提货地址 -->\r\n    <view class=\"info-view\" v-if=\"order.deliveryMethod === 'SELF_PICK_UP'\">\r\n      <view class=\"address-view\">\r\n        <view>\r\n          <view class=\"order-info-view\">\r\n            <view class=\"title\">自提点地址:</view>\r\n            <view class=\"value address-line-height\">{{ order.storeAddressPath }}</view>\r\n          </view>\r\n          <view class=\"order-info-view\" @click=\"callPhone\" >\r\n            <view class=\"title\">联系方式:</view>\r\n            <view class=\"value\">{{ order.storeAddressMobile }}<u-icon name='phone-fill' ></u-icon></view>\r\n          </view>\r\n         \r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <!-- 商品信息 -->\r\n    <view>\r\n      <view class=\"seller-view\">\r\n        <!-- 店铺名称 -->\r\n        <view class=\"seller-info u-flex u-row-between\">\r\n          <view class=\"seller-name\" @click=\"goToShopPage(order)\">\r\n            <view class=\"name\">{{ order.storeName }}</view>\r\n            <view class=\"status\" v-if=\"orderStatusList[order.orderStatus]\"> {{ orderStatusList[order.orderStatus].title\r\n            }}</view>\r\n          </view>\r\n          <view class=\"order-sn\"></view>\r\n        </view>\r\n        <view>\r\n          <view v-for=\"(sku, skuIndex) in orderGoodsList\" :key=\"skuIndex\">\r\n            <view class=\"goods-item-view\">\r\n              <view class=\"goods-img\" @click=\"gotoGoodsDetail(sku)\">\r\n                <u-image border-radius=\"6\" width=\"131rpx\" height=\"131rpx\" :src=\"sku.image\"></u-image>\r\n              </view>\r\n              <view class=\"goods-info\" @click=\"gotoGoodsDetail(sku)\">\r\n                <view class=\"goods-title u-line-2\">{{ sku.goodsName }}</view>\r\n                <view class=\"goods-price\">\r\n                  ￥{{ sku.goodsPrice | unitPrice }}\r\n                  <!-- <span v-if=\"sku.point\">+{{ sku.point }}积分</span> -->\r\n\t\t\t\t  <span style=\"font-size: 24rpx;margin-left: 14rpx;color: #ff9900;\" v-if=\"sku.isRefund && sku.isRefund !== 'NO_REFUND'\">\r\n\t\t\t\t  {{refundPriceList(sku.isRefund)}} ({{ sku.refundPrice | unitPrice(\"￥\") }})\r\n\t\t\t\t   </span>\r\n                </view>\r\n              </view>\r\n              <view class=\"goods-num\">\r\n                <view>x{{ sku.num }}</view>\r\n\r\n                <view class=\"good-complaint\">\r\n                  <u-tag size=\"mini\" mode=\"plain\" @click=\"complaint(sku)\" v-if=\"sku.complainStatus == 'NO_APPLY'\"\r\n                    text=\"投诉\" type=\"info\" />\r\n                </view>\r\n              </view>\r\n            </view>\r\n\r\n          </view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n    <view class=\"info-view\">\r\n      <view>\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">商品总价：</view>\r\n          <view class=\"value\">￥{{ order.goodsPrice | unitPrice }}</view>\r\n        </view>\r\n        <view class=\"order-info-view\" v-if=\"order.freightPrice\">\r\n          <view class=\"title\">运费：</view>\r\n          <view class=\"value\">￥{{ order.freightPrice | unitPrice }}</view>\r\n        </view>\r\n        <view class=\"order-info-view\" v-if=\"order.priceDetailDTO\">\r\n          <view class=\"title\">优惠券：</view>\r\n          <view class=\"value main-color\">-￥{{ order.priceDetailDTO.couponPrice | unitPrice }}</view>\r\n        </view>\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">活动优惠：</view>\r\n          <view class=\"value main-color\">-￥{{ order.discountPrice | unitPrice }}</view>\r\n        </view>\r\n        <!-- <view class=\"order-info-view\" v-if=\"order.use_point\">\r\n\t\t\t\t\t<view class=\"title\">使用积分：</view>\r\n\t\t\t\t\t<view class=\"value\">{{ order.use_point }}</view>\r\n\t\t\t\t</view> -->\r\n      </view>\r\n    </view>\r\n    <!-- 客户服务， 售后，取消订单，查看物流，投诉等 -->\r\n    <view class=\"info-view\">\r\n      <view style=\"width: 100%\">\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">服务</view>\r\n        </view>\r\n        <view class=\"customer-list\">\r\n          <view class=\"customer-service\"\r\n            v-if=\"orderDetail.allowOperationVO && orderDetail.allowOperationVO.cancel == true\"\r\n            @click=\"onCancel(order.sn)\">取消订单</view>\r\n          <view class=\"customer-service\" v-if=\"order.orderStatus == 'DELIVERED'\" @click=\"onLogistics(order)\">查看物流</view>\r\n          <view class=\"customer-service\" v-if=\"order.orderStatus != 'UNPAID' && order.orderPromotionType == 'PINTUAN'\"\r\n            @click=\"ByUserMessage(order)\">查看拼团信息</view>\r\n            <view class=\"customer-service\"\r\n            @click=\"contact(order.storeId)\">联系客服</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n    <view class=\"info-view\">\r\n      <view style=\"width: 100%\">\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">订单编号：</view>\r\n          <view class=\"value\">\r\n            {{ order.sn }}\r\n            <u-tag class=\"copy\" text=\"复制\" type=\"info\" size=\"mini\" @click=\"onCopy(order.sn)\" />\r\n          </view>\r\n        </view>\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">下单时间：</view>\r\n          <view class=\"value\">{{\r\n              order.createTime\r\n          }}</view>\r\n        </view>\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">订单备注：</view>\r\n          <view class=\"value\">{{\r\n              order.remark || '暂无备注'\r\n          }}</view>\r\n        </view>\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">支付状态：</view>\r\n          <view class=\"value\">\r\n            {{\r\n                order.payStatus == \"UNPAID\"\r\n                  ? \"未付款\"\r\n                  : order.payStatus == \"PAID\"\r\n                    ? \"已付款\"\r\n                    : \"\"\r\n            }}</view>\r\n        </view>\r\n        <view class=\"order-info-view\">\r\n          <view class=\"title\">支付方式：</view>\r\n          <view class=\"value\">{{ orderDetail.paymentMethodValue || '暂无'}}</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n\r\n    <view class=\"info-view\" v-if=\"order.payStatus == 'PAID'\">\r\n      <view>\r\n        <view class=\"invoice-info-view\">\r\n          <view class=\"invoice-title\">发票信息：</view>\r\n          <view v-if=\"!order.needReceipt\" class=\"value\">无需发票</view>\r\n          <view v-else class=\"value\" @click=\"onReceipt(orderDetail.receipt)\">查看发票</view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n    <view style=\"padding-bottom: 150rpx\"></view>\r\n\r\n    <view class=\"bottom_view\">\r\n      <view class=\"btn-view u-flex u-row-between\">\r\n        <view class=\"description\">\r\n          <!-- 全部 -->\r\n          <!-- 等待付款 -->\r\n\r\n          <text v-if=\"order.payStatus === 'PAID'\">已付金额：</text>\r\n          <text v-else>应付金额：</text>\r\n\r\n          <text class=\"price\" v-if=\"order.priceDetailDTO\">￥{{ order.priceDetailDTO.flowPrice | unitPrice }}</text>\r\n        </view>\r\n        <view>\r\n          <!-- 全部 -->\r\n          <!-- 等待付款 -->\r\n          <u-button type=\"error\" ripple size=\"mini\" v-if=\"orderDetail.allowOperationVO && orderDetail.allowOperationVO.pay\"\r\n            @click=\"toPay(order)\">立即付款</u-button>\r\n\r\n          <!-- <u-button class=\"rebuy-btn\" size=\"mini\" v-if=\"order.order_operate_allowable_vo.allow_service_cancel\"> 提醒发货</u-button> -->\r\n          <!-- <div class=\"pay-btn\">确认收货</div> -->\r\n          <u-button shape=\"circle\" ripple type=\"warning\" size=\"mini\" v-if=\"order.orderStatus == 'DELIVERED'\"\r\n            @click=\"onRog(order.sn)\">确认收货</u-button>\r\n          <!-- 交易完成 未评价 -->\r\n          <u-button shape=\"circle\" ripple size=\"mini\" v-if=\"order.orderStatus == 'COMPLETE'\"\r\n            @click=\"onComment(order.sn)\">评价商品</u-button>\r\n        </view>\r\n      </view>\r\n    </view>\r\n    <u-popup class=\"cancel-popup\" v-model=\"cancelShow\" mode=\"bottom\" length=\"60%\">\r\n      <view class=\"header\">取消订单</view>\r\n      <view class=\"body\">\r\n        <view class=\"title\">取消订单后，本单享有的优惠可能会一并取消，是否继续？</view>\r\n        <view>\r\n          <u-radio-group v-model=\"reason\">\r\n            <view class=\"value\">\r\n              <view class=\"radio-view\" v-for=\"(item, index) in cancelList\" :key=\"index\">\r\n                <u-radio :active-color=\"lightColor\" label-size=\"25\" shape=\"circle\" :name=\"item.reason\"\r\n                  @change=\"reasonChange\">{{ item.reason }}</u-radio>\r\n              </view>\r\n            </view>\r\n          </u-radio-group>\r\n        </view>\r\n      </view>\r\n      <view class=\"footer\">\r\n        <u-button size=\"medium\" v-if=\"reason\" shape=\"circle\" @click=\"submitCancel\">提交</u-button>\r\n      </view>\r\n    </u-popup>\r\n    <u-toast ref=\"uToast\" />\r\n    <u-modal v-model=\"rogShow\" :show-cancel-button=\"true\" :content=\"'是否确认收货?'\" :confirm-color=\"lightColor\"\r\n      @confirm=\"confirmRog\"></u-modal>\r\n\r\n    <!-- 分享 -->\r\n    <shares v-if=\"shareFlag\" :thumbnail=\"orderDetail.orderItems[0].image\"\r\n      :goodsName=\"orderDetail.orderItems[0].goodsName\" @close=\"shareFlag = false\" />\r\n\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getExpress, getPackage } from \"@/api/trade.js\";\r\nimport { cancelOrder, confirmReceipt, getOrderDetail } from \"@/api/order.js\";\r\n\r\nimport shares from \"@/components/m-share/index\"; //分享\r\n\r\nimport { getClearReason } from \"@/api/after-sale.js\";\r\n\r\nexport default {\r\n  components: {\r\n    shares,\r\n  },\r\n  data() {\r\n    return {\r\n      lightColor: this.$lightColor,\r\n      logisticsList: \"\", //物流信息\r\n      shareFlag: false, //拼团分享开关\r\n      orderStatusList: {\r\n        UNPAID: {\r\n          title: \"未付款\",\r\n          value: \"商品暂未付款\",\r\n        },\r\n        PAID: {\r\n          title: \"已付款\",\r\n          value: \"买家已付款\",\r\n        },\r\n        UNDELIVERED: {\r\n          title: \"待发货\",\r\n          value: \"商品等待发货中\",\r\n        },\r\n        PARTS_DELIVERED: {\r\n          title: \"部分发货\",\r\n          value: \"商品已部分发货。\",\r\n        },\r\n        DELIVERED: {\r\n          title: \"已发货\",\r\n          value: \"商品已发货,请您耐心等待\",\r\n        },\r\n        CANCELLED: {\r\n          title: \"已取消\",\r\n          value: \"订单已取消\",\r\n        },\r\n        COMPLETED: {\r\n          title: \"已完成\",\r\n          value: \"订单已完成,祝您生活愉快\",\r\n        },\r\n        STAY_PICKED_UP: {\r\n          title: \"待自提\",\r\n          value: \"商品正在等待提取\",\r\n        },\r\n        TAKE: {\r\n          title: \"待核验\",\r\n        },\r\n      },\r\n      order: {},\r\n      cancelShow: false, //取消订单\r\n      orderSn: \"\",\r\n      orderGoodsList: \"\", //订单中商品集合\r\n      orderDetail: \"\", //订单详情信息\r\n      sn: \"\",\r\n      cancelList: \"\",\r\n      rogShow: false,\r\n      reason: \"\",\r\n\t  orderPackage:\"\",\r\n    };\r\n  },\r\n  onLoad(options) {\r\n    this.loadData(options.sn);\r\n    this.sn = options.sn;\r\n  },\r\n  methods: {\r\n\t//获取包裹\r\n\tasync getOrderPackage() {\r\n\t\tgetPackage(this.order.sn).then(res => {\r\n\t\t\tif (res.data.success) {\r\n\t\t\t\tthis.orderPackage = res.data.result\r\n\t\t\t}\r\n\t\t})\r\n\t},\r\n\thandleClickDeliver(){\r\n\t\tuni.navigateTo({\r\n\t\t\turl: `/pages/order/deliverDetail?order_sn=${this.order.sn}`,\r\n\t\t});\r\n\t},\r\n\t// 退款状态枚举\r\n\trefundPriceList(status) {\r\n\t\tswitch (status) {\r\n\t\tcase 'ALL_REFUND':\r\n\t\t  return \"全部退款\";\r\n\t\tcase 'PART_REFUND':\r\n\t\t  return \"部分退款\";\r\n\t\tcase 'NO_REFUND':\r\n\t\t  return \"未退款\";\r\n\t\tcase 'REFUNDING':\r\n\t\t  return \"退款中\";\r\n\t\tdefault:\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t},\r\n    callPhone(){\r\n      this.$options.filters.callPhone(this.order.storeAddressMobile )\r\n    },\r\n    //联系客服\r\n    contact(storeId){\r\n      this.$options.filters.talkIm(storeId)\r\n    },\r\n    goToShopPage(val) {\r\n      uni.navigateTo({\r\n        url: \"/pages/product/shopPage?id=\" + val.storeId,\r\n      });\r\n    },\r\n    // 获取物流信息\r\n    loadLogistics(sn) {\r\n      getExpress(sn).then((res) => {\r\n        this.logisticsList = res.data.result;\r\n      });\r\n    },\r\n\r\n    // 分享当前拼团信息\r\n    inviteGroup() {\r\n      this.shareFlag = true;\r\n    },\r\n    // #TODO 这块需要写一下 目前没有拼团的详细信息\r\n    ByUserMessage(order) {\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/cart/payment/shareOrderGoods?sn=\" +\r\n          order.sn +\r\n          \"&sku=\" +\r\n          this.orderGoodsList[0].skuId +\r\n          \"&goodsId=\" +\r\n          this.orderGoodsList[0].goodsId,\r\n      });\r\n    },\r\n    async loadData(sn) {\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      getOrderDetail(sn).then((res) => {\r\n        const order = res.data.result;\r\n        this.order = order.order;\r\n        this.orderGoodsList = order.orderItems;\r\n        this.orderDetail = res.data.result;\r\n        if (this.order.deliveryMethod === 'LOGISTICS') {\r\n          this.loadLogistics(sn);\r\n\t\t  this.getOrderPackage();\r\n        }\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n\r\n    },\r\n    onReceipt(val) {\r\n      uni.navigateTo({\r\n        url: \"/pages/order/invoice/invoiceDetail?id=\" + val.id,\r\n      });\r\n    },\r\n    gotoGoodsDetail(sku) {\r\n      uni.navigateTo({\r\n        url: `/pages/product/goods?id=${sku.skuId}&goodsId=${sku.goodsId}`,\r\n      });\r\n    },\r\n    onCopy(sn) {\r\n      this.$options.filters.setClipboard(sn)\r\n    },\r\n\r\n    /**\r\n     * 投诉\r\n     */\r\n    complaint(sku) {\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/order/complain/complain?sn=\" +\r\n          this.sn +\r\n          \"&skuId=\" +\r\n          sku.skuId,\r\n      });\r\n    },\r\n    //售后按钮\r\n    onAfterSales(sn, sku) {\r\n      uni.navigateTo({\r\n        url: `./afterSales/afterSalesSelect?sn=${sn}&sku=${encodeURIComponent(\r\n          JSON.stringify(sku)\r\n        )}`,\r\n      });\r\n    },\r\n    // 去支付\r\n    toPay(val) {\r\n      val.sn\r\n        ? uni.navigateTo({\r\n          url: \"/pages/cart/payment/payOrder?order_sn=\" + val.sn,\r\n        })\r\n        : false;\r\n    }, //删除订单\r\n    deleteOrder(index) {\r\n      uni.showLoading({\r\n        title: \"请稍后\",\r\n      });\r\n      setTimeout(() => {\r\n        this.navList[this.tabCurrentIndex].orderList.splice(index, 1);\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      }, 600);\r\n    },\r\n    //取消订单\r\n    onCancel(sn) {\r\n      this.orderSn = sn;\r\n\r\n      uni.showLoading({\r\n        title: \"加载中\",\r\n      });\r\n      getClearReason().then((res) => {\r\n        if (res.data.result.length >= 1) {\r\n          this.cancelList = res.data.result;\r\n        }\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      });\r\n\r\n      this.cancelShow = true;\r\n    },\r\n\r\n    //提交取消订单（未付款）\r\n    submitCancel() {\r\n      cancelOrder(this.orderSn, { reason: this.reason }).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            title: \"已取消\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n          this.cancelShow = false;\r\n          setTimeout(() => {\r\n            uni.reLaunch({\r\n              url: \"/pages/order/myOrder?status=0\",\r\n            });\r\n          }, 500);\r\n        } else {\r\n          uni.showToast({\r\n            title: res.data.message,\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n          this.cancelShow = false;\r\n        }\r\n      });\r\n    },\r\n\r\n    //确认收货\r\n    onRog(sn) {\r\n      this.orderSn = sn;\r\n      this.rogShow = true;\r\n    },\r\n    confirmRog() {\r\n      confirmReceipt(this.orderSn).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            title: \"已确认收货\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n          this.rogShow = false;\r\n          this.loadData(this.sn);\r\n        }\r\n      });\r\n    },\r\n    //评价商品\r\n    onComment(sn) {\r\n      uni.navigateTo({\r\n        url: \"./evaluate/myEvaluate\",\r\n      });\r\n    }, //查看物流\r\n    onLogistics(order) {\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/mine/msgTips/packageMsg/logisticsDetail?logi_id=\" +\r\n          order.logi_id +\r\n          \"&ship_no=\" +\r\n          order.ship_no +\r\n          \"&order_sn=\" +\r\n          order.sn,\r\n      });\r\n    },\r\n\r\n    //选择取消原因\r\n    reasonChange(reason) {\r\n      this.reason = reason;\r\n    },\r\n    reBuy(order) {\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/product/goods?id=\" + order.id + \"&goodsId=\" + order.goodsId,\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n@import \"./goods.scss\";\r\n\r\n.empty {\r\n  width: 100%;\r\n}\r\n\r\n.customer-service {\r\n  background: #ededed;\r\n  // padding: 12rpx 40rpx;\r\n  width: 48%;\r\n  margin: 0 1%;\r\n  height: 55rpx;\r\n  line-height: 55rpx;\r\n  margin-bottom: 10rpx;\r\n  text-align: center;\r\n  font-size: 24rpx;\r\n  border-radius: 10rpx;\r\n}\r\n\r\n.customer-list {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n.logistics-view {\r\n  justify-content: space-between;\r\n  padding: 30rpx !important;\r\n  margin: 0 !important;\r\n  transform: translateY(-10px);\r\n}\r\n\r\n.order-status {\r\n  color: #fff;\r\n  width: 100%;\r\n  text-align: center;\r\n  font-size: 36rpx;\r\n  margin-top: 40rpx;\r\n\r\n  >div {\r\n    font-size: 24rpx;\r\n    margin-top: 10rpx;\r\n  }\r\n}\r\n\r\n.logistics-List-title {\r\n  margin-bottom: 10rpx;\r\n  font-size: 26rpx;\r\n}\r\n\r\n.logistics-List-time {\r\n  font-size: 24rpx;\r\n  color: #999;\r\n}\r\n\r\n.info-detail {\r\n  margin-right: 30rpx;\r\n  color: #333;\r\n}\r\n\r\n.order-view {\r\n  margin: 0 !important;\r\n  border-radius: 0 !important;\r\n  width: 100%;\r\n  height: 200rpx;\r\n  padding: 0 !important;\r\n  background-image: linear-gradient(to right,\r\n      $light-color 0%,\r\n      $aider-light-color 100%) !important;\r\n}\r\n\r\npage,\r\n.content {\r\n  background: #f1f1f1;\r\n  height: 100%;\r\n}\r\n\r\n.info-line {\r\n  align-items: center;\r\n  display: flex;\r\n  border-radius: 30rpx;\r\n  flex-direction: row;\r\n  justify-content: space-between;\r\n  background-color: #fff;\r\n  width: 100%;\r\n  height: 110rpx;\r\n  color: #333333;\r\n  font-size: 28rpx;\r\n  border-bottom: 1rpx solid #eeeeee;\r\n\r\n  .info-title {\r\n    margin: 0 30rpx;\r\n    padding: 16rpx 0rpx;\r\n  }\r\n}\r\n\r\n.seller-view {\r\n  margin: 20rpx 0;\r\n  padding: 15rpx 0;\r\n  border-radius: 30rpx;\r\n}\r\n\r\n.address-title {\r\n  font-size: 26rpx;\r\n  font-weight: bold;\r\n\r\n  >span {\r\n    margin-right: 20rpx;\r\n  }\r\n}\r\n\r\n.info-view {\r\n  display: flex;\r\n  margin: 0 0 20rpx 0;\r\n  border-radius: 30rpx;\r\n  flex-direction: row;\r\n  padding: 15rpx 30rpx;\r\n  margin-bottom: 20rpx;\r\n  background-color: #fff;\r\n\r\n  .address-view {\r\n    display: flex;\r\n    flex-direction: row;\r\n    padding: 16rpx 0;\r\n\r\n    .address {\r\n      color: $font-color-light;\r\n      overflow: hidden;\r\n      line-height: 1.75;\r\n      font-size: 22rpx;\r\n    }\r\n  }\r\n\r\n  .order-info-view {\r\n    line-height: 60rpx;\r\n    display: flex;\r\n    flex-direction: row;\r\n    width: 100%;\r\n    margin: 10rpx 0rpx;\r\n\r\n    .title {\r\n      color: #666;\r\n      width: 140rpx;\r\n      font-size: 24rpx;\r\n      font-weight: 600;\r\n      flex:3;\r\n      min-width: 160rpx;\r\n    }\r\n\r\n    .value {\r\n      color: #666;\r\n      font-size: 24rpx;\r\n      flex:10;\r\n    }\r\n\r\n    .copy {\r\n      font-size: 20rpx;\r\n      color: #333;\r\n      border: 1px solid #dddddd;\r\n      margin-left: 30rpx;\r\n    }\r\n  }\r\n\r\n  .invoice-info-view {\r\n    display: flex;\r\n    flex-direction: row;\r\n    justify-content: space-between;\r\n    width: 100%;\r\n    margin: 10rpx 0rpx;\r\n\r\n    .invoice-title {\r\n      width: 550rpx;\r\n      font-size: 28rpx;\r\n      color: #333333;\r\n    }\r\n\r\n    .value {\r\n      color: $font-color-light;\r\n    }\r\n  }\r\n}\r\n\r\n.verificationCode {\r\n  font-weight: bold;\r\n  letter-spacing: 2rpx;\r\n}\r\n\r\n.bottom_view {\r\n  width: 100%;\r\n  height: 100rpx;\r\n  background-color: #ffffff;\r\n  position: fixed;\r\n  bottom: 0;\r\n  left: 0;\r\n\r\n  .btn-view {\r\n    padding: 0 30rpx;\r\n    line-height: 100rpx;\r\n    font-size: 26rpx;\r\n\r\n    .description {\r\n      color: #909399;\r\n      size: 25rpx;\r\n\r\n      .price {\r\n        color: $main-color;\r\n      }\r\n    }\r\n  }\r\n\r\n  .cancel-btn {\r\n    color: #999999;\r\n    border-color: #999999;\r\n    margin-left: 15rpx;\r\n    height: 60rpx;\r\n  }\r\n}\r\n\r\n.cancel-popup {\r\n  .header {\r\n    display: flex;\r\n    flex-direction: row;\r\n    justify-content: center;\r\n    margin: 15rpx 0rpx;\r\n  }\r\n\r\n  .body {\r\n    padding: 30rpx;\r\n\r\n    .title {\r\n      font-weight: 600;\r\n    }\r\n\r\n    .value {\r\n      display: flex;\r\n      flex-direction: column;\r\n\r\n      .radio-view {\r\n        margin: 10rpx 0rpx;\r\n      }\r\n    }\r\n  }\r\n\r\n  .footer {\r\n    text-align: center;\r\n  }\r\n}\r\n.address-line-height{\r\n  line-height: 1.75;\r\n}\r\n.seller-name{\r\n  >.name{\r\n    flex:10 !important;\r\n  }\r\n  >.status{\r\n    flex:2;\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/passport/article.vue",
    "content": "<template>\n  <!-- 此文件路径禁止移动 -->\n  <view>\n    <view class=\"container \">\n      <view class=\"u-skeleton\" v-if=\"!articleData\">\n          <u-empty text=\"文章暂无内容\" mode=\"list\"></u-empty>\n      </view>\n      <u-parse v-else :html=\"articleData\"></u-parse>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { getArticleDetail } from \"@/api/article.js\";\nexport default {\n  data() {\n    return {\n      // 用于接收上一级通过路径传输的数据\n      routers: \"\", \n      // 请求文章接口后存储文章信息\n      articleData: \"\",\n    };\n  },\n  onLoad(val) {\n    this.routers = val;\n    getArticleDetail(val.id).then((res) => {\n      if (res.data.result) {\n        // 将请求的文章数据赋值\n        this.articleData = res.data.result.content;\n      }\n      // 修改当前NavigationBar(标题头)为文章头部\n      uni.setNavigationBarTitle({\n        title: val.title,\n      });\n    });\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\npage {\n  background: #fff;\n}\n.container {\n  padding: 32rpx;\n  > p {\n    margin: 20rpx;\n  }\n}\n</style>"
  },
  {
    "path": "pages/passport/entry/seller/control.vue",
    "content": "<template>\n  <div>\n    <u-navbar :border-bottom=\"false\"></u-navbar>\n    <step1 v-if=\"current == 1\" :companyData=\"companyData\" @callback=\"next()\" />\n    <step2 v-if=\"current == 2\" :companyData=\"companyData\" @callback=\"next()\" />\n    <step3\n      v-if=\"current == 3\"\n      :companyData=\"companyData\"\n      @callback=\"finished()\"\n    />\n  </div>\n</template>\n\n<script>\nimport { getCompanyDetail } from \"@/api/entry\";\nimport step1 from \"./step1\";\nimport step2 from \"./step2\";\nimport step3 from \"./step3\";\nexport default {\n  data() {\n    return {\n      companyData: \"\",\n      current: 1,\n    };\n  },\n  components: {\n    step1,\n    step2,\n    step3,\n  },\n  mounted() {\n    this.init();\n  },\n  methods: {\n    async init(next) {\n      const res = await getCompanyDetail();\n      if (res.data.success) {\n        this.companyData = res.data.result;\n        next ? this.current++ : \"\";\n      }\n    },\n    next() {\n      this.init(\"next\");\n    },\n    finished() {\n      uni.navigateTo({\n        url: \"/pages/passport/entry/seller/index\",\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n"
  },
  {
    "path": "pages/passport/entry/seller/entry.scss",
    "content": ".flag-title {\n    font-size: 42rpx;\n    font-weight: bold;\n}\n.submit,\n.notice {\n  font-weight: bold;\n  font-size: 28rpx;\n\n  height: 92rpx;\n  text-align: center;\n  letter-spacing: 4rpx;\n  line-height: 92rpx;\n  border-radius: 20rpx;\n}\n.wrapper {\n  padding:16rpx;\n}"
  },
  {
    "path": "pages/passport/entry/seller/index.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n       <u-navbar :border-bottom=\"false\"></u-navbar>\n    <div>\n      <div class=\"title\">店铺入驻</div>\n      <div class=\"step-list\">\n        <div\n          class=\"step-item\"\n          :class=\"{ active: current == index }\"\n          v-for=\"(item, index) in entrySteps\"\n          :key=\"index\"\n        >\n          {{ item.title }}\n        </div>\n      </div>\n      <div class=\"submit\" @click=\"keepOn()\">开始填写</div>\n      <div class=\"notice\" @click=\"getEntryNotice\">查看店铺入驻协议</div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getCompanyDetail } from \"@/api/entry\";\nexport default {\n  components: {},\n\n  data() {\n    return {\n      current: 999,\n      entrySteps: [\n        {\n          title: \"填写资质信息\",\n          value: \"APPLY\",\n        },\n        {\n          title: \"提交审核\",\n          value: \"APPLYING\",\n        },\n      ],\n\n      storeStatusWay: [\n        {\n          title: \"申请已通过，请联系管理员\",\n          value: \"OPEN\",\n        },\n        {\n          title: \"店铺已关闭，重申请联系管理员\",\n          value: \"CLOSED\",\n        },\n        {\n          title: \"审核未通过,请修改资质信息\",\n          value: \"REFUSED\",\n        },\n      ],\n\n      companyData: \"\", // 公司信息\n    };\n  },\n  onShow() {\n    if(this.$options.filters.tipsToLogin()){\n        this.init();\n    }\n  },\n\n  mounted() {},\n\n  onLoad(options) {},\n  methods: {\n    getEntryNotice() {\n      uni.navigateTo({\n        url: \"/pages/mine/help/tips?type=STORE_REGISTER\",\n      });\n    },\n    keepOn() {\n      if (this.companyData && this.companyData.storeDisable == \"OPEN\") {\n        uni.showToast({\n          title:\"审核已通过\",\n          icon:\"none\"\n        })\n      } else {\n        uni.navigateTo({\n          url: \"/pages/passport/entry/seller/control\",\n        });\n      }\n    },\n    async init() {\n      this.entrySteps = [\n        {\n          title: \"填写资质信息\",\n          value: \"APPLY\",\n        },\n        {\n          title: \"提交审核\",\n          value: \"APPLYING\",\n        },\n      ];\n      const res = await getCompanyDetail();\n      if (res.data.success) {\n        this.companyData = res.data.result;\n\n        if (this.companyData) {\n          this.storeStatusWay.forEach((item) => {\n            if (item.value == this.companyData.storeDisable) {\n              this.entrySteps.push(item);\n            }\n          });\n\n          this.current =\n            this.entrySteps.findIndex(\n              (item) => item.value == this.companyData.storeDisable\n            ) || 0;\n        } else {\n          this.current = 0;\n        }\n      }\n    },\n  },\n};\n</script>\n<style>\npage {\n  background: #fff;\n}\n</style>\n<style lang=\"scss\" scoped>\n@import url(\"./entry.scss\");\n.wrapper {\n  padding: 0 80rpx;\n}\n\n.title {\n  padding-top: calc(104rpx);\n  font-style: normal;\n  line-height: 1;\n  font-weight: 500;\n  font-size: 56rpx;\n  color: #333;\n  padding-left: 20rpx;\n}\n.step-item {\n  padding: 30rpx 20rpx;\n  font-size: 40rpx;\n  font-weight: bold;\n  color: #666;\n}\n.step-list {\n  margin: 80rpx 0;\n  overflow: hidden;\n}\n.active {\n  color: $light-color;\n  background: rgba($color: $light-color, $alpha: 0.1);\n  border-radius: 20rpx;\n}\n.submit {\n  color: #fff;\n  margin-top: 120rpx;\n  background: rgba($light-color, 0.8);\n}\n.notice {\n  margin-top: 40rpx;\n  color: #333;\n  background: $bg-color;\n}\n</style>\n"
  },
  {
    "path": "pages/passport/entry/seller/step1.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <u-form label-width=\"200\" :model=\"form\" ref=\"uForm\">\n      <div class=\"column\">\n        <div class=\"flag-title light-color\">基础信息</div>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"companyName\"\n          label=\"公司名称\"\n          ><u-input\n            v-model=\"form.companyName\"\n            :custom-style=\"defaultInputStyle\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"companyAddressPath\"\n          label=\"公司所在地\"\n          >\n          <div @click=\"showPicker()\" style=\"margin-right: 30rpx;\">选择</div>\n          <u-input\n            disabled\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.companyAddressPath\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"companyAddress\"\n          label=\"公司详细地址\"\n          ><u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.companyAddress\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"employeeNum\"\n          label=\"员工人数\"\n          ><u-input\n            type=\"number\"\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.employeeNum\"\n        /></u-form-item>\n\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"companyPhone\"\n          label=\"公司电话\"\n          ><u-input\n            type=\"number\"\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.companyPhone\"\n        /></u-form-item>\n        <u-form-item\n          :border-bottom=\"false\"\n          prop=\"registeredCapital\"\n          label=\"注册资金\"\n          required\n          ><u-input\n            type=\"number\"\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.registeredCapital\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"linkName\"\n          label=\"联系人姓名\"\n          ><u-input :custom-style=\"defaultInputStyle\" v-model=\"form.linkName\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"linkPhone\"\n          label=\"联系人电话\"\n          ><u-input\n            type=\"number\"\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.linkPhone\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"companyEmail\"\n          label=\"电子邮箱\"\n          ><u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.companyEmail\"\n        /></u-form-item>\n      </div>\n      <div class=\"column\">\n        <div class=\"flag-title light-color\">营业执照信息</div>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"licenseNum\"\n          label=\"营业执照号\"\n          ><u-input :custom-style=\"defaultInputStyle\" v-model=\"form.licenseNum\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"scope\"\n          label=\"法定经营范围\"\n          ><u-input :custom-style=\"defaultInputStyle\" v-model=\"form.scope\"\n        /></u-form-item>\n        <u-form-item\n          :border-bottom=\"false\"\n          prop=\"licencePhoto\"\n          label=\"营业执照电子版\"\n          required\n        >\n          <div>\n            <u-upload\n              :file-list=\"licencePhotoFileList\"\n              :header=\"{ accessToken: storage.getAccessToken() }\"\n              :action=\"action\"\n              width=\"200\"\n              @on-uploaded=\"onUploaded($event, 'licencePhoto')\"\n              :max-count=\"1\"\n              :show-progress=\"false\"\n            ></u-upload>\n\n            <div class=\"tips\">\n              请压缩图片在2M以内，确保文字清晰以免上传或审核失败\n            </div>\n          </div>\n        </u-form-item>\n      </div>\n      <div class=\"column\">\n        <div class=\"flag-title light-color\">法人信息</div>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"legalName\"\n          label=\"法人姓名\"\n          ><u-input :custom-style=\"defaultInputStyle\" v-model=\"form.legalName\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"legalId\"\n          label=\"法人证件号\"\n          ><u-input :custom-style=\"defaultInputStyle\" v-model=\"form.legalId\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"legalPhoto\"\n          label=\"法人证件电子版\"\n        >\n          <div>\n            <u-upload\n              :file-list=\"legalPhotoFileList\"\n              :header=\"{ accessToken: storage.getAccessToken() }\"\n              :action=\"action\"\n              width=\"200\"\n              @on-uploaded=\"onUploaded($event, 'legalPhoto')\"\n              :max-count=\"1\"\n              :show-progress=\"false\"\n            ></u-upload>\n            <u-upload\n              :file-list=\"legalPhotoFileList\"\n              :header=\"{ accessToken: storage.getAccessToken() }\"\n              :action=\"action\"\n              width=\"200\"\n              @on-uploaded=\"onUploaded($event, 'legalPhoto')\"\n              :max-count=\"1\"\n              :show-progress=\"false\"\n            ></u-upload>\n          </div>\n        </u-form-item>\n        {{form}}\n      </div>\n    </u-form>\n    <div class=\"submit\" @click=\"validatorStep1Form\">提交/下一步</div>\n    <m-city\n      :provinceData=\"list\"\n      headTitle=\"区域选择\"\n      ref=\"cityPicker\"\n      @funcValue=\"getPickerParentValue\"\n      pickerSize=\"4\"\n    >\n    </m-city>\n  </div>\n</template>\n\n<script>\nimport { applyFirst } from \"@/api/entry\";\nimport city from \"@/components/m-city/m-city.vue\";\nimport storage from \"@/utils/storage.js\";\nimport { upload } from \"@/api/common.js\";\nimport * as RegExp from \"@/utils/RegExp.js\";\nexport default {\n  components: { \"m-city\": city },\n  data() {\n    return {\n      storage,\n      action: upload, //图片上传数据\n      defaultInputStyle: {\n        background: \"#f7f7f7\",\n        padding: \"0 20rpx\",\n        \"border-radius\": \"10rpx\",\n      },\n      legalPhotoFileList: [],\n      licencePhotoFileList: [],\n      form: {\n        companyName: \"\",\n        companyAddressIdPath: [],\n        companyAddressPath: \"\",\n        companyAddress: \"\",\n        employeeNum: \"\",\n        registeredCapital: \"\",\n        linkName: \"\",\n        linkPhone: \"\",\n        companyPhone: \"\",\n        companyEmail: \"\",\n        licenseNum: \"\",\n        scope: \"\",\n        legalPhoto: \"\",\n        licencePhoto: \"\",\n        legalName: \"\",\n        legalId: \"\",\n      },\n      list: [\n        {\n          id: \"\",\n          localName: \"请选择\",\n          children: [],\n        },\n      ],\n      rules: {\n        // 验证规则\n        companyName: [{ required: true, message: \"请填写公司信息\" }],\n        companyAddressPath: [{ required: true, message: \"请选择公司所在地\" }],\n        companyAddress: [{ required: true, message: \"请填写公司详细地址\" }],\n        employeeNum: [{ required: true, message: \"请填写公司员工总数\" }],\n        registeredCapital: [{ required: true, message: \"请填写公司注册资金\" }],\n        linkName: [{ required: true, message: \"请填写联系人姓名\" }],\n        linkPhone: [\n          { required: true, message: \"请填写联系人电话\" },\n          {\n            // 自定义验证函数，见上说明\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return this.$u.test.mobile(value);\n            },\n            message: \"手机号码不正确\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n        companyPhone: [\n          { required: true, message: \"请填写公司电话\" },\n          {\n            // 自定义验证函数，见上说明\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return this.$u.test.mobile(value);\n            },\n            message: \"请填写正确的号码\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n        companyEmail: [\n          { required: true, message: \"请填写电子邮箱\" },\n          {\n            // 自定义验证函数，见上说明\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return this.$u.test.email(value);\n            },\n            message: \"请填写正确的电子邮箱\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n        licenseNum: [\n          { required: true, message: \"请填写营业执照号\" },\n          { pattern: RegExp.licenseNum, message: \"请输入正确的营业执照号\" },\n        ],\n        scope: [{ required: true, message: \"请填写营业执照所示经营范围\" }],\n        legalPhoto: [{ required: true, message: \"请上传法人身份证照片\" },\n          {\n            // 自定义验证函数，见上说明\n            validator: (rule, value, callback) => {\n              // 上面有说，返回true表示校验通过，返回false表示不通过\n              // this.$u.test.mobile()就是返回true或者false的\n              return value.length === 2;\n            },\n            message: \"请上传法人身份证正反照片\",\n            // 触发器可以同时用blur和change\n            trigger: [\"change\", \"blur\"],\n          }],\n        licencePhoto: [{ required: true, message: \"请上传营业执照\" }],\n        legalName: [{ required: true, message: \"请输入法人姓名\" }],\n        legalId: [\n          { required: true, message: \"请输入法人证件号\" },\n          { pattern: RegExp.IDCard, message: \"请输入正确的证件号\" },\n        ],\n      },\n    };\n  },\n  mounted() {\n    this.$refs.uForm.setRules(this.rules);\n  },\n  props: [\"companyData\"],\n  watch: {\n    companyData: {\n      handler(val) {\n        if (val) {\n          this.$set(this, \"form\", val);\n          // 给图片赋值\n          const judgeDeepPhoto = [\"legalPhoto\", \"licencePhoto\"];\n          judgeDeepPhoto.forEach((key) => {\n            if (this.form[key]) {\n              this.form[key].split(\",\").forEach((item) => {\n                this[`${key}FileList`].push({ url: item });\n              });\n            }\n          });\n        }\n      },\n      deep: true,\n    },\n  },\n  methods: {\n    // 图片上传\n    onUploaded(lists, key) {\n      let images = [];\n      if(!this.form[key]){\n        this.form[key] = [];\n      }\n      lists.forEach((item) => {\n        images.push(item.response.result);\n      });\n      this.form[key].push(images[0]);\n    },\n    getPickerParentValue(e) {\n      this.form.companyAddressIdPath = [];\n\n      let name = \"\";\n      e.forEach((item, index) => {\n        if (item.id) {\n          // 遍历数据\n          this.form.companyAddressIdPath.push(item.id);\n          if (index == e.length - 1) {\n            name += item.localName;\n          } else {\n            name += item.localName + \",\";\n          }\n          this.form.companyAddressPath = name;\n        }\n      });\n    },\n    // 显示三级地址联动\n    showPicker() {\n      console.log(this.$refs)\n      this.$refs.cityPicker.show();\n    },\n    validatorStep1Form() {\n      this.$refs.uForm.validate(async (valid) => {\n        console.log(valid);\n        if (valid) {\n          const params = { ...this.form };\n\n          params.legalPhoto = params.legalPhoto.toString();\n          params.licencePhoto = params.licencePhoto.toString();\n          params.companyAddressIdPath = params.companyAddressIdPath.toString();\n          delete params.complexAddress;\n\n          const res = await applyFirst(params);\n          if (res.data.success) {\n            uni.showToast({\n              title: \"提交成功!\",\n              icon: \"none\",\n            });\n            this.$emit(\"callback\");\n          }\n        }\n      });\n    },\n  },\n};\n</script>\n<style>\n/* page {\n  background: #fff;\n} */\n</style>\n<style lang=\"scss\" scoped>\n@import url(\"./entry.scss\");\n\n.column {\n  padding: 32rpx;\n  margin-bottom: 20rpx;\n  background: #fff;\n}\n.submit {\n  color: #fff;\n  margin-top: 120rpx;\n  background: rgba($light-color, 0.8);\n}\n.tips {\n  color: #999;\n  font-size: 24rpx;\n  line-height: 1.2;\n  margin-top: 10rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/passport/entry/seller/step2.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <u-form label-width=\"250\" :model=\"form\" ref=\"uForm\">\n      <div class=\"column\">\n        <div class=\"flag-title light-color\">基础信息</div>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"settlementBankAccountName\"\n          label=\"银行开户名\"\n          ><u-input\n            v-model=\"form.settlementBankAccountName\"\n            :custom-style=\"defaultInputStyle\"\n        /></u-form-item>\n\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"settlementBankAccountNum\"\n          label=\"银行账号\"\n          ><u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.settlementBankAccountNum\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"settlementBankBranchName\"\n          label=\"开户银行支行名称\"\n          ><u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.settlementBankBranchName\"\n        /></u-form-item>\n\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"settlementBankJointName\"\n          label=\"支行联行号\"\n          ><u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.settlementBankJointName\"\n        /></u-form-item>\n      </div>\n    </u-form>\n    <div class=\"submit\" @click=\"validatorStep2Form\">提交/下一步</div>\n  </div>\n</template>\n\n<script>\nimport { applySecond } from \"@/api/entry\";\n\nexport default {\n  data() {\n    return {\n      defaultInputStyle: {\n        background: \"#f7f7f7\",\n        padding: \"0 20rpx\",\n        \"border-radius\": \"10rpx\",\n      },\n      form: {\n        settlementBankAccountName: \"\",\n        settlementBankAccountNum: \"\",\n        settlementBankBranchName: \"\",\n        settlementBankJointName: \"\",\n      },\n\n      rules: {\n        // 验证规则\n        settlementBankAccountName: [\n          { required: true, message: \"请填写银行开户名称\" },\n        ],\n        settlementBankAccountNum: [\n          { required: true, message: \"请填写银行账号\" },\n        ],\n        settlementBankBranchName: [\n          { required: true, message: \"请填写开户银行支行名称\" },\n        ],\n        settlementBankJointName: [\n          { required: true, message: \"请填写支行联行号\" },\n        ],\n      },\n    };\n  },\n  mounted() {\n    this.$refs.uForm.setRules(this.rules);\n  },\n  props: [\"companyData\"],\n  watch: {\n    companyData: {\n      handler(val) {\n        this.$set(this, \"form\", val);\n        console.log(this.form)\n      },\n      deep: true,\n      immediate:true\n    },\n  },\n  methods: {\n    validatorStep2Form() {\n      this.$refs.uForm.validate(async (valid) => {\n        if (valid) {\n          const params = { ...this.form };\n          const res = await applySecond(params);\n          if (res.data.success) {\n            uni.showToast({\n              title: \"提交成功!\",\n              icon: \"none\",\n            });\n            this.$emit(\"callback\");\n          }\n        }\n      });\n    },\n  },\n};\n</script>\n<style>\n/* page {\n  background: #fff;\n} */\n</style>\n<style lang=\"scss\" scoped>\n@import url(\"./entry.scss\");\n.wrapper {\n  // padding: 50rpx 32rpx 16rpx 32rpx;\n}\n.column {\n  padding: 32rpx;\n  margin-bottom: 20rpx;\n  background: #fff;\n}\n.submit {\n  color: #fff;\n  margin-top: 120rpx;\n  background: rgba($light-color, 0.8);\n}\n.tips {\n  color: #999;\n  font-size: 24rpx;\n  line-height: 1.2;\n  margin-top: 10rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/passport/entry/seller/step3.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <u-form label-width=\"200\" :model=\"form\" ref=\"uForm\">\n      <div class=\"column\">\n        <div class=\"flag-title light-color\">基础信息</div>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"storeName\"\n          label=\"店铺名称\"\n          ><u-input v-model=\"form.storeName\" :custom-style=\"defaultInputStyle\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"storeLogo\"\n          label=\"店铺logo\"\n        >\n          <div>\n            <u-upload\n              :file-list=\"storeLogoFileList\"\n              :header=\"{ accessToken: storage.getAccessToken() }\"\n              :action=\"action\"\n              width=\"200\"\n              @on-uploaded=\"onUploaded($event, 'storeLogo')\"\n              :max-count=\"1\"\n              :show-progress=\"false\"\n            ></u-upload>\n          </div>\n        </u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"goodsManagementCategory\"\n          label=\"店铺经营类目\"\n          >\n          <div @click=\"showCategory()\"   style=\"margin-right: 30rpx;\">选择</div>\n         \n          <u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"goodsManagementCategory\"\n            disabled\n            @click=\"showCategory()\"\n        /></u-form-item>\n\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"storeAddressPath\"\n          label=\"店铺所在地\"\n        >\n          <div @click=\"showPicker()\"   style=\"margin-right: 30rpx;\">选择</div>\n          <u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.storeAddressPath\"\n          \n            disabled\n            \n          />\n        </u-form-item>\n       \n        <!-- <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"storeAddressPath\"\n          label=\"店铺定位\"\n        >\n          <div class=\"get-center\" @click=\"clickUniMap()\">开始定位</div>\n          <div class=\"tips-success\" v-if=\"form.storeCenter\">已成功定位</div>\n        </u-form-item> -->\n\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"storeAddressDetail\"\n          label=\"店铺详细地址\"\n          ><u-input\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.storeAddressDetail\"\n        /></u-form-item>\n        <u-form-item\n          required\n          :border-bottom=\"false\"\n          prop=\"storeDesc\"\n          label=\"店铺简介\"\n          ><u-input\n            type=\"textarea\"\n            :custom-style=\"defaultInputStyle\"\n            v-model=\"form.storeDesc\"\n        /></u-form-item>\n      </div>\n    </u-form>\n    <div class=\"submit\" @click=\"validatorStep1Form\">提交平台审核</div>\n    <m-city\n      :provinceData=\"list\"\n      headTitle=\"区域选择\"\n      ref=\"cityPicker\"\n      @funcValue=\"getPickerParentValue\"\n      pickerSize=\"4\"\n    >\n    </m-city>\n\n    <u-select\n      v-model=\"enableCategory\"\n      @confirm=\"confirmCategory\"\n      :list=\"categoryList\"\n    ></u-select>\n\n    <uniMap v-if=\"mapFlag\" @close=\"closeMap\" @callback=\"callBackAddress\" />\n  </div>\n</template>\n\n<script>\nimport { applyThird } from \"@/api/entry\";\nimport { getCategoryList } from \"@/api/goods\";\nimport city from \"@/components/m-city/m-city.vue\";\nimport storage from \"@/utils/storage.js\";\nimport { upload } from \"@/api/common.js\";\nimport uniMap from \"@/components/uniMap\";\nimport permision from \"@/js_sdk/wa-permission/permission.js\";\nexport default {\n  components: { \"m-city\": city, uniMap },\n  data() {\n    return {\n      storage,\n      mapFlag: false,\n      action: upload, //图片上传数据\n      defaultInputStyle: {\n        background: \"#f7f7f7\",\n        padding: \"0 20rpx\",\n        \"border-radius\": \"10rpx\",\n      },\n      goodsManagementCategory: \"\",\n      storeLogoFileList: [],\n      categoryList: [],\n      form: {\n        storeName: \"\",\n        storeLogo: \"\",\n        goodsManagementCategory: \"\",\n        storeAddressPath: \"\",\n        storeAddressDetail: \"\",\n        storeDesc: \"\",\n      },\n      list: [\n        {\n          id: \"\",\n          localName: \"请选择\",\n          children: [],\n        },\n      ],\n      rules: {\n        // 验证规则\n        goodsManagementCategory: [\n          { required: true, message: \"请选择店铺经营类目\" },\n        ],\n        storeName: [{ required: true, message: \"请填写店铺名称\" }],\n        storeLogo: [{ required: true, message: \"请上传店铺logo\" }],\n        storeDesc: [{ required: true, message: \"请填写店铺简介\" }],\n        storeCenter: [{ required: true, message: \"请选择店铺位置\" }],\n        storeAddressIdPath: [{ required: true, message: \"请选择店铺位置\" }],\n        storeAddressDetail: [{ required: true, message: \"请输入店铺详细地址\" }],\n      },\n      enableCategory: false,\n    };\n  },\n  mounted() {\n    this.$refs.uForm.setRules(this.rules);\n    this.fetchCategoryList();\n  },\n  props: [\"companyData\"],\n  watch: {\n    companyData: {\n      handler(val) {\n        this.$set(this, \"form\", val);\n        // 给图片赋值\n        const judgeDeepPhoto = [\"storeLogo\"];\n\n        judgeDeepPhoto.forEach((key) => {\n          if (this.form[key]) {\n            this.form[key].split(\",\").forEach((item) => {\n              this[`${key}FileList`].push({ url: item });\n            });\n          }\n        });\n      },\n      deep: true,\n      immediate: true,\n    },\n  },\n\n  methods: {\n    callBackAddress(val) {\n      console.log(val);\n      this.form.storeAddressDetail = val.address;\n      this.form.storeCenter = `${val.longitude},${val.latitude}`;\n    },\n    // 关闭地图\n    closeMap() {\n      this.mapFlag = false;\n    },\n    // 打开地图并访问权限\n    clickUniMap() {\n      console.log(\"click\");\n      // #ifdef APP-PLUS\n      if (plus.os.name == \"iOS\") {\n        // ios系统\n        permision.judgeIosPermission(\"location\")\n          ? (this.mapFlag = true)\n          : this.refuseMap();\n      } else {\n        // 安卓\n        this.requestAndroidPermission(\n          \"android.permission.ACCESS_FINE_LOCATION\"\n        );\n      }\n      // #endif\n\n      // #ifndef APP-PLUS\n      this.mapFlag = true;\n      // #endif\n    },\n\n    // 如果拒绝权限 提示区设置\n    refuseMap() {\n      uni.showModal({\n        title: \"温馨提示\",\n        content: \"您已拒绝定位,请开启\",\n        confirmText: \"去设置\",\n        success(res) {\n          if (res.confirm) {\n            //打开授权设置\n            // #ifndef MP-WEIXIN\n            uni.getSystemInfo({\n              success(res) {\n                if (res.platform == \"ios\") {\n                  //IOS\n                  plus.runtime.openURL(\"app-settings://\");\n                } else if (res.platform == \"android\") {\n                  //安卓\n                  let main = plus.android.runtimeMainActivity();\n                  let Intent = plus.android.importClass(\n                    \"android.content.Intent\"\n                  );\n                  let mIntent = new Intent(\"android.settings.ACTION_SETTINGS\");\n                  main.startActivity(mIntent);\n                }\n              },\n            });\n            // #endif\n          }\n        },\n      });\n    },\n    // 获取安卓是否拥有地址权限\n    async requestAndroidPermission(permisionID) {\n      var result = await permision.requestAndroidPermission(permisionID);\n\n      if (result == 1) {\n        this.mapFlag = true;\n      } else {\n        this.refuseMap();\n      }\n    },\n\n    confirmCategory(val) {\n      this.form.goodsManagementCategory = val[0].value;\n      this.goodsManagementCategory = val[0].label;\n    },\n    async fetchCategoryList() {\n      const res = await getCategoryList(0);\n      if (res.data.success) {\n        if (res.data.result.length) {\n          this.categoryList = res.data.result.map((item) => {\n            return { label: item.name, value: item.id };\n          });\n\n          if (this.form.goodsManagementCategory) {\n            this.goodsManagementCategory = this.categoryList.find(\n              (item) => this.form.goodsManagementCategory == item.value\n            ).label;\n          }\n        }\n      }\n    },\n    // 图片上传\n    onUploaded(lists, key) {\n      let images = [];\n      lists.forEach((item) => {\n        images.push(item.response.result);\n      });\n      this.form[key] = images;\n    },\n    getPickerParentValue(e) {\n      this.form.storeAddressIdPath = [];\n      console.log(e)\n      let name = \"\";\n      e.forEach((item, index) => {\n        if (item.id) {\n          // 遍历数据\n          this.form.storeAddressIdPath.push(item.id);\n          if (index == e.length - 1) {\n            name += item.localName;\n          } else {\n            name += item.localName + \",\";\n          }\n          this.$set(this.form,'storeAddressPath',name)\n        }\n      });\n\n      this.form.storeCenter = e[e.length-1].center\n    },\n    // 显示三级地址联动\n    showPicker() {\n      this.$refs.cityPicker.show();\n    },\n    showCategory() {\n      this.enableCategory = true;\n    },\n    validatorStep1Form() {\n      this.$refs.uForm.validate(async (valid) => {\n        console.log(valid);\n        if (valid) {\n          const params = { ...this.form };\n          params.storeLogo = params.storeLogo.toString();\n          params.storeAddressIdPath = params.storeAddressIdPath.toString();\n          const res = await applyThird(params);\n          if (res.data.success) {\n            uni.showToast({\n              title: \"提交成功!\",\n              icon: \"none\",\n            });\n            this.$emit(\"callback\");\n          }\n        }\n      });\n    },\n  },\n};\n</script>\n<style>\n/* page {\n  background: #fff;\n} */\n</style>\n<style lang=\"scss\" scoped>\n@import url(\"./entry.scss\");\n.get-center {\n  padding: 12rpx 30rpx;\n  background: $light-color;\n  border-radius: 10rpx;\n  font-size: 24rpx;\n  color: #fff;\n  font-weight: bold;\n  display: inline;\n}\n.column {\n  padding: 32rpx;\n  margin-bottom: 20rpx;\n  background: #fff;\n}\n.submit {\n  color: #fff;\n  margin-top: 120rpx;\n  background: rgba($light-color, 0.8);\n}\n.tips {\n  color: #999;\n  font-size: 24rpx;\n  line-height: 1.2;\n  margin-top: 10rpx;\n}\n.tips-success {\n  color: $weChat-color;\n  font-size: 24rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/passport/login.scss",
    "content": ".sub-title {\n\tfont-size: 24rpx;\n\tcolor: #999;\n}\n.cell {\n\tmargin: 40rpx 0;\n}\n.login-ball {\n\tborder-bottom-left-radius: 300rpx;\n\theight: 400rpx;\n\tposition: relative;\n}\n\n/deep/ .u-form-item--right__content__slot {\n\twidth: 100%;\n\tdisplay: block;\n}\n\n.title {\n\tfont-size: 48rpx;\n\tcolor: #000;\n\ttext-align: center;\n}\n.privacy {\n\tfont-size: 24upx;\n\tcolor: #999;\n\ttext-align: center;\n\tmargin-top: 360rpx;\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n}\nspan {\n\tcolor: $aider-light-color;\n}\n.form {\n\tpadding: 0 72rpx;\n}\n.divider {\n\tmargin: 30rpx 0 !important;\n}\n.submit {\n\theight: 80rpx;\n\tline-height: 80rpx;\n\tcolor: #fff;\n\ttext-align: center;\n\tfont-size: 30rpx;\n\tborder-radius: 100px;\n}\n.logo {\n\tmargin-top: 20rpx;\n\twidth: 200rpx;\n\theight: 200rpx;\n\ttext-align: center;\n}\n.logo-cell {\n\ttext-align: center;\n}\n.text-tips {\n\ttext-align: center;\n}\n.tips {\n\tposition: absolute;\n\tbottom: 10rpx;\n\twidth: 100%;\n\n\ttext-align: center;\n}\n"
  },
  {
    "path": "pages/passport/login.vue",
    "content": "<template>\r\n\t<div class=\"wrapper\">\r\n\t\t<div v-if=\"!wechatLogin\">\r\n\t\t\t<u-navbar :is-back=\"showBack\" :border-bottom=\"false\"></u-navbar>\r\n\t\t\t<div>\r\n\t\t\t\t<div class=\"title\">{{ loginTitleWay[current].title }}</div>\r\n\t\t\t\t<div :class=\"current == 1 ? 'desc-light' : 'desc'\">\r\n\t\t\t\t\t{{ loginTitleWay[current].desc\r\n          }}<span v-if=\"current == 1\">{{ mobile | secrecyMobile }}</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<!-- 手机号 -->\r\n\t\t\t<div v-show=\"!enableUserPwdBox\">\r\n\t\t\t\t<div v-show=\"current == 0\">\r\n\t\t\t\t\t<u-input :custom-style=\"inputStyle\" :placeholder-style=\"placeholderStyle\" placeholder=\"请输入手机号 (11位)\"\r\n\t\t\t\t\t\tclass=\"mobile\" focus v-model=\"mobile\" type=\"number\" maxlength=\"11\" />\r\n\t\t\t\t\t<div :class=\"!enableFetchCode ? 'disable' : 'fetch'\" @click=\"fetchCode\" class=\"btn\">\r\n\t\t\t\t\t\t获取验证码\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<!-- 输入验证码 -->\r\n\t\t\t\t<div v-show=\"current == 1\" class=\"box-code\">\r\n\t\t\t\t\t<verifyCode type=\"bottom\" @confirm=\"submit\" boxActiveColor=\"#D8D8D8\" v-model=\"code\" isFocus\r\n\t\t\t\t\t\tboxNormalColor=\"#D8D8D8\" cursorColor=\"#D8D8D8\" />\r\n\r\n\t\t\t\t\t<div class=\"fetch-btn\">\r\n\t\t\t\t\t\t<u-verification-code change-text=\"验证码已发送（x）\" end-text=\"重新获取验证码\" unique-key=\"page-login\"\r\n\t\t\t\t\t\t\t:seconds=\"seconds\" @end=\"end\" @start=\"start\" ref=\"uCode\" @change=\"codeChange\">\r\n\t\t\t\t\t\t</u-verification-code>\r\n\t\t\t\t\t\t<span @tap=\"fetchCode\" :style=\"{ color: codeColor }\">\r\n\t\t\t\t\t\t\t{{ tips }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- 帐号密码登录 -->\r\n\t\t\t<div v-show=\"enableUserPwdBox\">\r\n\t\t\t\t<u-input :custom-style=\"inputStyle\" :placeholder-style=\"placeholderStyle\" placeholder=\"请输入用户名\"\r\n\t\t\t\t\tclass=\"mobile\" focus v-model=\"userData.username\" />\r\n\t\t\t\t<u-input :custom-style=\"inputStyle\" :placeholder-style=\"placeholderStyle\" placeholder=\"请输入密码\"\r\n\t\t\t\t\tclass=\"mobile\" focus v-model=\"userData.password\" type=\"password\" />\r\n\r\n\t\t\t\t<div :class=\"!enableUserBtnColor ? 'disable' : 'fetch'\" @click=\"passwordLogin\" class=\"btn\">\r\n\t\t\t\t\t帐号密码登录\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"flex\" v-show=\"current != 1\">\r\n\t\t\t\t<u-checkbox-group :icon-size=\"24\" width=\"45rpx\">\r\n\t\t\t\t\t<u-checkbox shape=\"circle\" v-model=\"enablePrivacy\" active-color=\"#FF5E00\"></u-checkbox>\r\n\t\t\t\t</u-checkbox-group>\r\n\t\t\t\t<div class=\"tips\">\r\n\t\t\t\t\t未注册的手机号验证后将自动创建用户账号，登录即代表您已同意<span @click=\"navigateToPrivacy('PRIVACY_POLICY')\">《隐私协议》</span>\r\n\t\t\t\t\t<span @click=\"navigateToPrivacy('USER_AGREEMENT')\">\r\n\t\t\t\t\t\t《用户协议》\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t\t<div v-if=\"current != 1\" class=\"user-password-tips\" @click=\"enableUserPwdBox = !enableUserPwdBox\">\r\n\t\t\t\t{{ !enableUserPwdBox ? \"帐号密码\" : \"手机号\" }}登录\r\n\t\t\t</div>\r\n\r\n\t\t\t<!-- 循环出当前可使用的第三方登录模式 -->\r\n\t\t\t<div class=\"flex login-list\">\r\n\t\t\t\t<div v-if=\"item.code\" :style=\"{ background: item.color }\" class=\"login-item\"\r\n\t\t\t\t\tv-for=\"(item, index) in loginList\" :key=\"index\">\r\n\t\t\t\t\t<u-icon v-if=\"item.title != 'APPLE'\" color=\"#fff\" size=\"42\" :name=\"item.icon\"\r\n\t\t\t\t\t\t@click=\"navigateLogin(item)\">\r\n\t\t\t\t\t</u-icon>\r\n\t\t\t\t\t<u-image v-else src=\"/static/appleidButton@2x.png\" :lazy-load=\"false\" @click=\"navigateLogin(item)\"\r\n\t\t\t\t\t\twidth=\"80\" height=\"80\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<myVerification v-if=\"codeFlag\" @send=\"verification\" class=\"verification\" ref=\"verification\"\r\n\t\t\t\tbusiness=\"LOGIN\" />\r\n\t\t</div>\r\n\t\t<view v-else>\r\n\t\t\t<wechatH5Login />\r\n\t\t</view>\r\n\t</div>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\topenIdLogin,\r\n\t\tloginCallback\r\n\t} from \"@/api/connect.js\";\r\n\timport api from \"@/config/api.js\";\r\n\timport {\r\n\t\tsendMobile,\r\n\t\tsmsLogin,\r\n\t\tuserLogin\r\n\t} from \"@/api/login\";\r\n\timport myVerification from \"@/components/verification/verification.vue\"; //验证码模块\r\n\timport uuid from \"@/utils/uuid.modified.js\"; // uuid\r\n\timport verifyCode from \"@/components/verify-code/verify-code\";\r\n\timport {\r\n\t\tgetUserInfo\r\n\t} from \"@/api/members\";\r\n\timport {\r\n\t\twhetherNavigate\r\n\t} from \"@/utils/Foundation\"; //登录跳转\r\n\timport storage from \"@/utils/storage.js\"; //缓存\r\n\timport wechatH5Login from \"./wechatH5Login.vue\";\r\n\timport {\r\n\t\twebConnect\r\n\t} from \"@/api/connect.js\";\r\n\timport {\r\n\t\tmd5\r\n\t} from \"@/utils/md5.js\";\r\n\r\n\texport default {\r\n\t\tcomponents: {\r\n\t\t\tmyVerification,\r\n\t\t\tverifyCode,\r\n\t\t\twechatH5Login\r\n\t\t},\r\n\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tuuid,\r\n\t\t\t\twechatLogin: false, //是否加载微信公众号登录\r\n\t\t\t\tflage: false, //是否验证码验证\r\n\t\t\t\tcodeFlag: true, //验证开关，用于是否展示验证码\r\n\t\t\t\ttips: \"\",\r\n\t\t\t\tenableUserPwdBox: false, //帐号密码登录\r\n\t\t\t\tcurrent: 0,\r\n\t\t\t\tcodeColor: \"#999\", //按钮验证码颜色\r\n\t\t\t\tlightColor: this.$lightColor,\r\n\t\t\t\tseconds: 60, //默认验证码等待时间\r\n\t\t\t\tloginTitleWay: [{\r\n\t\t\t\t\t\ttitle: \"欢迎登录\",\r\n\t\t\t\t\t\tdesc: \"登录后更精彩，美好生活即将开始\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttitle: \"请输入验证码\",\r\n\t\t\t\t\t\tdesc: \"已经发送验证码至\",\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\tuserData: {\r\n\t\t\t\t\tusername: \"\",\r\n\t\t\t\t\tpassword: \"\",\r\n\t\t\t\t},\r\n\t\t\t\tshowBack: false,\r\n\t\t\t\tenableFetchCode: false,\r\n\t\t\t\tenableUserBtnColor: false,\r\n\t\t\t\tenablePrivacy: false, //隐私政策\r\n\t\t\t\tmobile: \"\", //手机号\r\n\t\t\t\tcode: \"\", //验证码\r\n\t\t\t\tinputStyle: {\r\n\t\t\t\t\theight: \"104rpx\",\r\n\t\t\t\t\t\"border-bottom\": \"1rpx solid #D8D8D8\",\r\n\t\t\t\t\t\"letter-spacing\": \"1rpx\",\r\n\t\t\t\t\t\"font-size\": \"40rpx\",\r\n\t\t\t\t\t\"line-height\": \"40rpx\",\r\n\t\t\t\t\tcolor: \"#333\",\r\n\t\t\t\t},\r\n\t\t\t\tplaceholderStyle: \"font-size: 32rpx;line-height: 32rpx;color: #999999;\",\r\n\t\t\t\tloginList: [\r\n\t\t\t\t\t//第三方登录集合\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ticon: \"weixin-fill\",\r\n\t\t\t\t\t\tcolor: \"#00a327\",\r\n\t\t\t\t\t\ttitle: \"微信\",\r\n\t\t\t\t\t\tcode: \"WECHAT\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ticon: \"qq-fill\",\r\n\t\t\t\t\t\tcolor: \"#38ace9\",\r\n\t\t\t\t\t\ttitle: \"QQ\",\r\n\t\t\t\t\t\tcode: \"QQ\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ticon: \"apple-fill\",\r\n\t\t\t\t\t\tcolor: \"#000000\",\r\n\t\t\t\t\t\ttitle: \"Apple\",\r\n\t\t\t\t\t\tcode: \"APPLE\",\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t};\r\n\t\t},\r\n\t\tonShow() {\r\n\r\n\t\t\t// 只要是app登录的全部清除内容\r\n\t\t\t// #ifdef APP-PLUS\r\n\t\t\tstorage.setAccessToken(\"\");\r\n\t\t\tstorage.setRefreshToken(\"\");\r\n\t\t\tstorage.setUserInfo({});\r\n\t\t\t// #endif\r\n\r\n\r\n\t\t\t//#ifdef H5\r\n\t\t\tlet isWXBrowser = /micromessenger/i.test(navigator.userAgent);\r\n\t\t\tif (isWXBrowser) {\r\n\t\t\t\twebConnect(\"WECHAT\").then((res) => {\r\n\t\t\t\t\tlet data = res.data;\r\n\t\t\t\t\tif (data.success) {\r\n\t\t\t\t\t\twindow.location = data.result;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t//#endif\r\n\t\t},\r\n\r\n\t\tmounted() {\r\n\r\n\t\t\t// #ifndef APP-PLUS\r\n\t\t\t//判断是否微信浏览器\r\n\t\t\tvar ua = window.navigator.userAgent.toLowerCase();\r\n\t\t\tif (ua.match(/MicroMessenger/i) == \"micromessenger\") {\r\n\t\t\t\tthis.wechatLogin = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// #endif\r\n\t\t\t/**\r\n\t\t\t * 条件编译判断当前客户端类型\r\n\t\t\t */\r\n\t\t\t//#ifdef H5\r\n\t\t\tthis.clientType = \"H5\";\r\n\t\t\t//#endif\r\n\r\n\t\t\t//#ifdef APP-PLUS\r\n\t\t\tthis.clientType = \"APP\";\r\n\t\t\t/**如果是app 加载支持的登录方式*/\r\n\t\t\tlet _this = this;\r\n\t\t\tuni.getProvider({\r\n\t\t\t\tservice: \"oauth\",\r\n\t\t\t\tsuccess: (result) => {\r\n\t\t\t\t\t_this.loginList = result.provider.map((value) => {\r\n\t\t\t\t\t\t//展示title\r\n\t\t\t\t\t\tlet title = \"\";\r\n\t\t\t\t\t\t//系统code\r\n\t\t\t\t\t\tlet code = \"\";\r\n\t\t\t\t\t\t//颜色\r\n\t\t\t\t\t\tlet color = \"#8b8b8b\";\r\n\t\t\t\t\t\t//图标\r\n\t\t\t\t\t\tlet icon = \"\";\r\n\t\t\t\t\t\t//uni 联合登录 code\r\n\t\t\t\t\t\tlet appcode = \"\";\r\n\t\t\t\t\t\tswitch (value) {\r\n\t\t\t\t\t\t\tcase \"weixin\":\r\n\t\t\t\t\t\t\t\ticon = \"weixin-circle-fill\";\r\n\t\t\t\t\t\t\t\tcolor = \"#00a327\";\r\n\t\t\t\t\t\t\t\ttitle = \"微信\";\r\n\t\t\t\t\t\t\t\tcode = \"WECHAT\";\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase \"qq\":\r\n\t\t\t\t\t\t\t\ticon = \"qq-circle-fill\";\r\n\t\t\t\t\t\t\t\tcolor = \"#38ace9\";\r\n\t\t\t\t\t\t\t\ttitle = \"QQ\";\r\n\t\t\t\t\t\t\t\tcode = \"QQ\";\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase \"apple\":\r\n\t\t\t\t\t\t\t\ticon = \"apple-fill\";\r\n\t\t\t\t\t\t\t\tcolor = \"#000000\";\r\n\t\t\t\t\t\t\t\ttitle = \"Apple\";\r\n\t\t\t\t\t\t\t\tcode = \"APPLE\";\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\ttitle: title,\r\n\t\t\t\t\t\t\tcode: code,\r\n\t\t\t\t\t\t\tcolor: color,\r\n\t\t\t\t\t\t\ticon: icon,\r\n\t\t\t\t\t\t\tappcode: value,\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t},\r\n\t\t\t\tfail: (error) => {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"获取登录通道失败\" + error,\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t\t//#endif\r\n\r\n\t\t\t//特殊平台，登录方式需要过滤\r\n\t\t\t// #ifdef H5\r\n\t\t\tthis.methodFilter([\"QQ\"]);\r\n\t\t\t// #endif\r\n\r\n\t\t\t//微信小程序，只支持微信登录\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.methodFilter([\"WECHAT\"]);\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tcurrent(val) {\r\n\t\t\t\tval ? (this.showBack = true) : (this.showBack = false);\r\n\t\t\t},\r\n\t\t\tuserData: {\r\n\t\t\t\thandler(val) {\r\n\t\t\t\t\tif (this.userData.username && this.userData.password) {\r\n\t\t\t\t\t\tthis.enableUserBtnColor = true;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.enableUserBtnColor = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tdeep: true,\r\n\r\n\t\t\t},\r\n\t\t\tmobile: {\r\n\t\t\t\thandler(val) {\r\n\t\t\t\t\tif (val.length == 11) {\r\n\t\t\t\t\t\tthis.enableFetchCode = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t},\r\n\r\n\t\t\tasync flage(val) {\r\n\t\t\t\tif (val) {\r\n\t\t\t\t\tif (this.$refs.uCode.canGetCode) {\r\n\t\t\t\t\t\tif (this.enableUserPwdBox) {\r\n\t\t\t\t\t\t\tthis.submitUserLogin();\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t// 执行登录\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// 向后端请求验证码\r\n\t\t\t\t\t\t\tuni.showLoading({});\r\n\t\t\t\t\t\t\tlet res = await sendMobile(this.mobile);\r\n\t\t\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\t\t\t// 这里此提示会被this.start()方法中的提示覆盖\r\n\t\t\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\t\t\tthis.current = 1;\r\n\t\t\t\t\t\t\t\tthis.$refs.uCode.start();\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: res.data.message,\r\n\t\t\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\tthis.flage = false;\r\n\t\t\t\t\t\t\t\tthis.$refs.verification.getCode();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t!this.enableUserPwdBox ? this.$u.toast(\"请倒计时结束后再发送\") : \"\";\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.$refs.verification.hide();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t\tonLoad(options) {\r\n\t\t\tif (options && options.state) {\r\n\t\t\t\tthis.stateLogin(options.state);\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t//联合信息返回登录\r\n\t\t\tstateLogin(state) {\r\n\t\t\t\tloginCallback(state).then((res) => {\r\n\t\t\t\t\tlet data = res.data;\r\n\t\t\t\t\tif (data.success) {\r\n\t\t\t\t\t\tstorage.setAccessToken(data.result.accessToken);\r\n\t\t\t\t\t\tstorage.setRefreshToken(data.result.refreshToken);\r\n\t\t\t\t\t\t// 登录成功\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"登录成功!\",\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tgetUserInfo().then((user) => {\r\n\t\t\t\t\t\t\tif(user.data.success){\r\n\t\t\t\t\t\t\t\tstorage.setUserInfo(user.data.result);\r\n\t\t\t\t\t\t\t\tstorage.setHasLogin(true);\r\n\t\t\t\t\t\t\t}else {\r\n\t\t\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\t\ttitle: user.data.message,\r\n\t\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tstorage.setAccessToken('');\r\n\t\t\t\t\t\t\t\t\tstorage.setRefreshToken('');\r\n\t\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\t\turl: \"/pages/tabbar/user/my\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tgetCurrentPages().length > 1 ?\r\n\t\t\t\t\t\t\tuni.navigateBack({\r\n\t\t\t\t\t\t\t\tdelta: getCurrentPages().length - 2,\r\n\t\t\t\t\t\t\t}) :\r\n\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\turl: \"/pages/tabbar/home/index\",\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t/** 根据参数显示登录模块 */\r\n\t\t\tmethodFilter(code) {\r\n\t\t\t\tlet way = [];\r\n\t\t\t\tthis.loginList.forEach((item) => {\r\n\t\t\t\t\tif (code.length != 0) {\r\n\t\t\t\t\t\tcode.forEach((val) => {\r\n\t\t\t\t\t\t\tif (item.code == val) {\r\n\t\t\t\t\t\t\t\tway.push(item);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"配置有误请联系管理员\",\r\n\t\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tthis.loginList = way;\r\n\t\t\t},\r\n\t\t\t//非h5 获取openid\r\n\t\t\tasync nonH5OpenId(item) {\r\n\t\t\t\tlet _this = this;\r\n\t\t\t\t//获取各个openid\r\n\t\t\t\tawait uni.login({\r\n\t\t\t\t\tprovider: item.appcode,\r\n\t\t\t\t\t// #ifdef MP-ALIPAY\r\n\t\t\t\t\tscopes: \"auth_user\", //支付宝小程序需设置授权类型\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\tsuccess: function(res) {\r\n\t\t\t\t\t\tuni.setStorageSync(\"type\", item.code);\r\n\t\t\t\t\t\t//微信小程序意外的其它方式直接在storage中写入openid\r\n\t\t\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\t\t\tuni.setStorageSync(\"openid\", res.authResult.openid);\r\n\t\t\t\t\t\tres.authResult.unionId && uni.setStorageSync(\"unionId\", res.authResult.unionId);\r\n\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t},\r\n\t\t\t\t\tfail(e) {\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"第三方登录暂不可用！\",\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\tduration: 3000,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcomplete(e) {\r\n\t\t\t\t\t\t//获取用户信息\r\n\t\t\t\t\t\tuni.getUserInfo({\r\n\t\t\t\t\t\t\tprovider: item.appcode,\r\n\t\t\t\t\t\t\tsuccess: function(infoRes) {\r\n\t\t\t\t\t\t\t\t//写入用户信息\r\n\t\t\t\t\t\t\t\tuni.setStorageSync(\"nickname\", infoRes.userInfo.nickName);\r\n\t\t\t\t\t\t\t\tuni.setStorageSync(\"avatar\", infoRes.userInfo.avatarUrl);\r\n\t\t\t\t\t\t\t\tuni.setStorageSync(\"unionId\", infoRes.userInfo.unionId || infoRes.userInfo.unionid);\r\n\r\n\t\t\t\t\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\t\t\t\t\t//微信小程序获取openid 需要特殊处理 如需获取openid请参考uni-id: https://uniapp.dcloud.net.cn/uniCloud/uni-id\r\n\t\t\t\t\t\t\t\t_this.weixinMPOpenID(res).then((res) => {\r\n\t\t\t\t\t\t\t\t\t//这里需要先行获得openid，再使用openid登录，小程序登录需要两步，所以这里特殊编译\r\n\t\t\t\t\t\t\t\t\t_this.goOpenidLogin(\"WECHAT_MP\");\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t// #endif\r\n\r\n\t\t\t\t\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\t\t\t\t\t_this.goOpenidLogin(\"APP\");\r\n\t\t\t\t\t\t\t\t//#endif\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t//openid 登录\r\n\t\t\tgoOpenidLogin(clientType) {\r\n\t\t\t\t// 获取准备好的参数，进行登录系统\r\n\t\t\t\tlet params = {\r\n\t\t\t\t\tuuid: uni.getStorageSync(\"openid\"), //联合登陆id\r\n\t\t\t\t\tsource: uni.getStorageSync(\"type\"), //联合登陆类型\r\n\t\t\t\t\tnickname: uni.getStorageSync(\"nickname\"), // 昵称\r\n\t\t\t\t\tusername: uni.getStorageSync(\"openid\"), // 昵称\r\n\t\t\t\t\tavatar: uni.getStorageSync(\"avatar\"), // 头像\r\n\t\t\t\t\tuniAccessToken: uni.getStorageSync(\"uni_access_token\"), //第三方token\r\n\t\t\t\t\ttype:this.clientType,\r\n\t\t\t\t\ttoken:{unionId:\"\",openId:uni.getStorageSync(\"openid\")}\r\n\t\t\t\t};\r\n        \t\tuni.getStorageSync(\"unionId\") ? (params.token.unionId = uni.getStorageSync(\"unionId\")) : delete params.token;\r\n\r\n\t\t\t\topenIdLogin(params, clientType).then((res) => {\r\n\t\t\t\t\tif (!res.data.success) {\r\n\t\t\t\t\t\tlet errormessage = \"第三方登录暂不可用\";\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t// title: '未绑定第三方账号',\r\n\t\t\t\t\t\t\ttitle: errormessage,\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\tduration: 3000,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstorage.setAccessToken(res.data.result.accessToken);\r\n\t\t\t\t\t\tstorage.setRefreshToken(res.data.result.refreshToken);\r\n\t\t\t\t\t\t// 登录成功\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: \"第三方登录成功!\",\r\n\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t// 执行登录\r\n\t\t\t\t\t\tgetUserInfo().then((user) => {\r\n\t\t\t\t\t\t\tif (user.data.success) {\r\n\t\t\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t\t\t * 个人信息存储到缓存userInfo中\r\n\t\t\t\t\t\t\t\t */\r\n\t\t\t\t\t\t\t\tstorage.setUserInfo(user.data.result);\r\n\t\t\t\t\t\t\t\tstorage.setHasLogin(true);\r\n\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\turl: \"/pages/tabbar/home/index\",\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t\t\t * 计算出当前router路径\r\n\t\t\t\t\t\t\t\t * 1.如果跳转的链接为登录页面或跳转的链接为空页面。则会重新跳转到首页\r\n\t\t\t\t\t\t\t\t * 2.都不满足返回跳转页面\r\n\t\t\t\t\t\t\t\t */\r\n\t\t\t\t\t\t\t\tif (user.data.result.mobile) {\r\n\t\t\t\t\t\t\t\t\twhetherNavigate();\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\t\t\turl: \"/pages/passport/bindUserPhone\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\t\ttitle: user.data.message,\r\n\t\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tstorage.setAccessToken('');\r\n\t\t\t\t\t\t\t\t\tstorage.setRefreshToken('');\r\n\t\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\t\turl: \"/pages/tabbar/user/my\",\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}, 500);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t//微信小程序获取openid\r\n\t\t\tasync weixinMPOpenID(res) {\r\n\t\t\t\tawait miniProgramLogin(res.code).then((res) => {\r\n\t\t\t\t\tuni.setStorageSync(\"openid\", res.data);\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t/**跳转到登录页面 */\r\n\t\t\tnavigateLogin(connectLogin) {\r\n\t\t\t\t// #ifdef H5\r\n\t\t\t\tlet code = connectLogin.code;\r\n\t\t\t\tlet buyer = api.buyer;\r\n\t\t\t\twindow.open(\r\n\t\t\t\t\tbuyer + `/passport/connect/connect/login/web/` + code,\r\n\t\t\t\t\t\"_self\"\r\n\t\t\t\t);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\tthis.nonH5OpenId(connectLogin);\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\r\n\t\t\t// 提交\r\n\t\t\tsubmit() {\r\n\t\t\t\t/**\r\n\t\t\t\t * 清空当前账号信息\r\n\t\t\t\t */\r\n\t\t\t\tstorage.setHasLogin(false);\r\n\t\t\t\tstorage.setAccessToken(\"\");\r\n\t\t\t\tstorage.setRefreshToken(\"\");\r\n\t\t\t\tstorage.setUserInfo({});\r\n\t\t\t\t/**\r\n\t\t\t\t * 执行登录\r\n\t\t\t\t */\r\n\t\t\t\tsmsLogin({\r\n\t\t\t\t\tmobile: this.mobile,\r\n\t\t\t\t\tcode: this.code\r\n\t\t\t\t}, this.clientType).then(\r\n\t\t\t\t\t(res) => {\r\n\t\t\t\t\t\tthis.getUserInfoMethods(res);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t// 登录成功之后获取用户信息\r\n\t\t\tgetUserInfoMethods(res) {\r\n\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\tstorage.setAccessToken(res.data.result.accessToken);\r\n\t\t\t\t\tstorage.setRefreshToken(res.data.result.refreshToken);\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * 登录成功后获取个人信息\r\n\t\t\t\t\t */\r\n\t\t\t\t\tgetUserInfo().then((user) => {\r\n\t\t\t\t\t\tif (user.data.success) {\r\n\t\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t\t * 个人信息存储到缓存userInfo中\r\n\t\t\t\t\t\t\t */\r\n\t\t\t\t\t\t\tstorage.setUserInfo(user.data.result);\r\n\t\t\t\t\t\t\tstorage.setHasLogin(true);\r\n\t\t\t\t\t\t\tstorage.setAutoCp(0)\r\n\t\t\t\t\t\t\t// 登录成功\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ttitle:\"提示\",\r\n\t\t\t\t\t\t\t\tcontent: \"登录成功!\",\r\n\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t});\r\n\r\n\r\n\t\t\t\t\t\t\twhetherNavigate();\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: user.data.message,\r\n\t\t\t\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\tstorage.setAccessToken('');\r\n\t\t\t\t\t\t\t\tstorage.setRefreshToken('');\r\n\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\turl: \"/pages/tabbar/user/my\",\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}, 500);\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t// 验证码验证\r\n\t\t\tverification(val) {\r\n\t\t\t\tthis.flage = val == this.$store.state.verificationKey ? true : false;\r\n\t\t\t},\r\n\t\t\t// 跳转\r\n\t\t\tnavigateToPrivacy(val) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: \"/pages/mine/help/tips?type=\" + val,\r\n\t\t\t\t});\r\n\r\n\t\t\t},\r\n\r\n\t\t\t// 点击获取验证码\r\n\t\t\tstart() {\r\n\t\t\t\tthis.codeColor = \"#999\";\r\n\t\t\t\tthis.$u.toast(\"验证码已发送\");\r\n\t\t\t\tthis.flage = false;\r\n\t\t\t\tthis.codeFlag = false;\r\n\r\n\t\t\t\tthis.$refs.verification.hide();\r\n\t\t\t},\r\n\t\t\t/**点击验证码*/\r\n\t\t\tcodeChange(text) {\r\n\t\t\t\tthis.tips = text;\r\n\t\t\t},\r\n\t\t\t/** 结束验证码后执行 */\r\n\t\t\tend() {\r\n\t\t\t\tthis.codeColor = this.lightColor;\r\n\t\t\t\tthis.codeFlag = true;\r\n\t\t\t\tconsole.log(this.codeColor);\r\n\t\t\t},\r\n\r\n\t\t\tpasswordLogin() {\r\n\t\t\t\tif (!this.enablePrivacy) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"请同意用户隐私\",\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!this.userData.username) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"请填写用户名\",\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!this.userData.password) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"请填写密码\",\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!this.flage) {\r\n\t\t\t\t\tthis.$refs.verification.error(); //发送\r\n\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t// 提交用户登录\r\n\t\t\tasync submitUserLogin() {\r\n\t\t\t\tconst params = JSON.parse(JSON.stringify(this.userData));\r\n\t\t\t\tparams.password = md5(params.password);\r\n\t\t\t\ttry {\r\n\t\t\t\t\tlet res = await userLogin(params,this.clientType);\r\n\t\t\t\t\tif (res.data.success) {\r\n\t\t\t\t\t\tthis.getUserInfoMethods(res);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.$refs.verification.getCode();\r\n\t\t\t\t\t\tthis.flage = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tthis.$refs.verification.getCode();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t// 发送验证码\r\n\t\t\tfetchCode() {\r\n\t\t\t\tif (!this.enablePrivacy) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"请同意用户隐私\",\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!this.$u.test.mobile(this.mobile)) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"请填写正确手机号\",\r\n\t\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.tips == \"重新获取验证码\") {\r\n\t\t\t\t\tuni.showLoading({\r\n\t\t\t\t\t\ttitle: \"加载中\",\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (!this.codeFlag) {\r\n\t\t\t\t\t\tlet timer = setInterval(() => {\r\n\t\t\t\t\t\t\tif (this.$refs.verification) {\r\n\t\t\t\t\t\t\t\tthis.$refs.verification.error(); //发送\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tclearInterval(timer);\r\n\t\t\t\t\t\t}, 100);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t}\r\n\t\t\t\tif (!this.flage) {\r\n\t\t\t\t\tthis.$refs.verification.error(); //发送\r\n\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n<style>\r\n\tpage {\r\n\t\tbackground: #fff;\r\n\t}\r\n</style>\r\n<style lang=\"scss\" scoped>\r\n\t.wrapper {\r\n\t\tpadding: 0 80rpx;\r\n\t}\r\n\r\n\t.title {\r\n\t\tpadding-top: calc(104rpx);\r\n\t\tfont-style: normal;\r\n\t\tline-height: 1;\r\n\t\tfont-weight: 500;\r\n\t\tfont-size: 56rpx;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.box-code {\r\n\t\tmargin-top: 78rpx;\r\n\t}\r\n\r\n\t.desc,\r\n\t.desc-light {\r\n\t\tfont-size: 32rpx;\r\n\t\tline-height: 32rpx;\r\n\t\tcolor: #333333;\r\n\t\tmargin-top: 40rpx;\r\n\t}\r\n\r\n\t.desc {\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.desc-light {\r\n\t\tcolor: #999999;\r\n\r\n\t\t>span {\r\n\t\t\tcolor: #333;\r\n\t\t\tmargin-left: 8rpx;\r\n\t\t}\r\n\t}\r\n\r\n\t.mobile {\r\n\t\tmargin-top: 80rpx;\r\n\t}\r\n\r\n\t.disable {\r\n\t\tbackground: linear-gradient(90deg, #ffdcba 2.21%, #ffcfb2 99.86%);\r\n\t}\r\n\r\n\t.fetch {\r\n\t\tbackground: linear-gradient(57.72deg, #ff8a19 18.14%, #ff5e00 98.44%);\r\n\t}\r\n\r\n\t.btn {\r\n\t\tborder-radius: 100px;\r\n\t\twidth: 590rpx;\r\n\t\tmargin-top: 97rpx;\r\n\t\theight: 80rpx;\r\n\t\tfont-size: 30rpx;\r\n\t\tline-height: 80rpx;\r\n\t\ttext-align: center;\r\n\t\tcolor: #ffffff;\r\n\t}\r\n\r\n\t.tips {\r\n\t\tfont-size: 12px;\r\n\t\tline-height: 20px;\r\n\t\tmargin-top: 32rpx;\r\n\t\twidth: 546rpx;\r\n\r\n\t\t>span {\r\n\t\t\tcolor: $light-color;\r\n\t\t}\r\n\t}\r\n\r\n\t.fetch-btn {\r\n\t\twidth: 370rpx;\r\n\t\theight: 80rpx;\r\n\t\tline-height: 80rpx;\r\n\t\ttext-align: center;\r\n\t\tbackground: #f2f2f2;\r\n\t\tborder-radius: 100rpx;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: #999;\r\n\r\n\t\tmargin: 71rpx auto 0 auto;\r\n\t}\r\n\r\n\t.login-list {\r\n\t\tdisplay: flex;\r\n\t\twidth: 590rpx;\r\n\t\tposition: absolute;\r\n\t\ttop: 1200rpx;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t.login-item {\r\n\t\twidth: 80rpx;\r\n\t\tborder-radius: 10rpx;\r\n\t\theight: 80rpx;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\r\n\t\tmargin: 0 20rpx;\r\n\t}\r\n\r\n\t.user-password-tips {\r\n\t\ttext-align: center;\r\n\t\tcolor: $main-color;\r\n\t\tmargin: 20px 0;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/passport/scannerCodeLoginConfirm.vue",
    "content": "<template>\n  <view class=\"container\">\n    <u-navbar title=\"扫码登录授权\"></u-navbar>\n    <view class=\"wx-auth-container\">\n      <div class=\"box\">\n        <!-- <div v-if=\"!errorMsg\"> -->\n        <div>\n          <view class=\"small-tips flex flex-center\">\n            <u-image\n              width=\"400rpx\"\n              height=\"300rpx\"\n              src=\"https://lili-system.oss-cn-beijing.aliyuncs.com/confirm.png\"\n            ></u-image>\n            <div>电脑端登录确认</div>\n            <div>为确保帐号安全，请确认是您本人操作</div>\n          </view>\n\n          <view class=\"btns\">\n            <button @click=\"confirmLogin()\" class=\"btn-auth\">确认登录</button>\n            <div @click=\"cancelLogin()\" class=\"btn-callback\">取消登录</div>\n          </view>\n        </div>\n      </div>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { scannerCodeLogin, scannerCodeLoginConfirm } from \"@/api/login\";\nexport default {\n  data() {\n    return {\n      errorMsg: \"\",\n      token: \"\",\n    };\n  },\n  watch: {\n    errorMsg(val) {\n      if (val) {\n        uni.showToast({\n          title: val,\n          icon: \"none\",\n        });\n        // uni.navigateBack()\n      }\n    },\n  },\n  onShow() {\n    this.$options.filters.forceLogin();\n    scannerCodeLogin({ token: this.token }).then((res) => {\n      if (res.data.code == 200) {\n        let code = res.data.result;\n        switch (code) {\n          case 0:\n          case 1:\n            this.errorMsg = \"\";\n            break;\n          case 2:\n          case 3:\n            this.errorMsg = \"请勿重复扫码\";\n            break;\n          case 4:\n            this.errorMsg = \"二维码已过期，重新扫码\";\n            break;\n          default:\n            this.errorMsg = \"状态异常\";\n        }\n      } else {\n        this.errorMsg = res.data.message;\n      }\n    });\n  },\n  onLoad(params) {\n    this.token = params.token;\n    if (this.token == undefined || this.token == \"\") {\n      this.errorMsg = \"信息异常\";\n    }\n  },\n  methods: {\n    confirmLogin() {\n      this.config(1);\n    },\n    cancelLogin() {\n      this.config(0);\n    },\n    config(code) {\n      scannerCodeLoginConfirm({ token: this.token, code: code }).then((res) => {\n        let title = res.data.success ? \"操作成功\" : \"操作失败\";\n        uni.showToast({\n          title: title,\n          duration: 1500,\n          icon: \"none\",\n        });\n        setTimeout(function () {\n          uni.navigateBack();\n        }, 1000);\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\npage {\n  background: #fff;\n}\n</style>\n<style lang=\"scss\" scoped>\n.container {\n  background-color: #fff;\n  width: 100vw;\n  height: 100vh;\n}\n.wx-auth-container {\n  width: 100%;\n  background: #fff;\n  margin-top: 20%;\n}\ntext.title,\ntext.shop {\n  display: inline-block;\n  font-size: 60rpx;\n  color: #333;\n}\n\n.box {\n  margin: 0 32rpx;\n}\n\n/* 文字提示*/\n.small-tips {\n  width: 100%;\n\n  padding: 20rpx;\n  font-size: 29rpx;\n  margin: 0 0 20rpx;\n  color: #999;\n}\n\n.btn-auth {\n  width: 92%;\n  background: $main-color;\n  color: #fff;\n  margin: 0 auto 40rpx;\n  border-radius: 100px;\n}\n.btn-callback {\n  text-align: center;\n  font-size: 30rpx;\n  background: #ededed;\n  height: 90rpx;\n  line-height: 90rpx;\n  border-radius: 100px;\n  width: 92%;\n  margin: 0 auto;\n}\n\n.btns {\n  margin-top: 100rpx;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: center;\n}\n</style>\n"
  },
  {
    "path": "pages/passport/wechatH5Login.vue",
    "content": "<template>\n  <view class=\"container\">\n    <u-navbar :custom-back=\"back\" title=\"公众网页登录\"></u-navbar>\n    <view class=\"wx-auth-container\">\n      <div class=\"box\">\n        <view class=\"logo-info\">\n          <text class=\"title\">欢迎进入{{ projectName }}</text>\n        </view>\n        <view class=\"small-tips\">\n          <view>为您提供优质服务,{{ projectName }}需要获取以下信息</view>\n          <view>您的公开信息（昵称、头像）</view>\n        </view>\n        <view class=\"btns\">\n          <button @click=\"getUserProfile()\" class=\"btn-auth\">使用微信授权</button>\n          <div @click=\"backToHome\" class=\"btn-callback\">暂不登录</div>\n        </view>\n      </div>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { whetherNavigate } from \"@/utils/Foundation\"; //登录跳转\nimport config from \"@/config/config\";\nimport api from \"@/config/api.js\";\nexport default {\n  data() {\n    return {\n      // 授权信息展示，商城名称\n      projectName: config.name,\n    };\n  },\n\n  //微信小程序进入页面，先获取code，否则几率出现code和后续交互数据不对应情况\n  mounted() {\n    // 小程序默认分享\n    uni.showShareMenu({ withShareTicket: true });\n  },\n  methods: {\n    back() {\n      whetherNavigate();\n    },\n    getUserProfile() {\n      let code = \"WECHAT\";\n      let buyer = api.buyer;\n      window.open(buyer + `/passport/connect/connect/login/web/` + code, \"_self\");\n    },\n    backToHome() {\n      uni.switchTab({\n        url: `/pages/tabbar/home/index`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.wx-auth-container {\n  width: 100%;\n\n  margin-top: 20%;\n}\n\n.logo-info {\n  display: flex;\n  flex-wrap: nowrap;\n  justify-content: flex-start;\n  flex-direction: row;\n  align-items: flex-start;\n  padding: 20rpx;\n  flex-direction: column;\n  font-weight: bold;\n}\n\nimage {\n  width: 100px;\n  height: 100px;\n  text-align: center;\n  -webkit-transform: scale(2.5);\n  transform: scale(2.5);\n}\n\ntext.title,\ntext.shop {\n  display: inline-block;\n  font-size: 60rpx;\n  color: #333;\n}\n\n.box {\n  margin: 0 32rpx;\n}\n\n/* 文字提示*/\n.small-tips {\n  width: 94%;\n  padding: 20rpx;\n  font-size: 24rpx;\n  margin: 0 0 20rpx;\n  color: #999;\n}\n\n.btn-auth {\n  width: 92%;\n  background: $light-color;\n  color: #fff;\n  margin: 0 auto 40rpx;\n  border-radius: 100px;\n  animation: mymove 5s infinite;\n  -webkit-animation: mymove 5s infinite; /*Safari and Chrome*/\n  animation-direction: alternate; /*轮流反向播放动画。*/\n  animation-timing-function: ease-in-out; /*动画的速度曲线*/\n  /* Safari 和 Chrome */\n  -webkit-animation: mymove 5s infinite;\n  -webkit-animation-direction: alternate; /*轮流反向播放动画。*/\n  -webkit-animation-timing-function: ease-in-out; /*动画的速度曲线*/\n}\n.btn-callback {\n  text-align: center;\n  font-size: 30rpx;\n  background: #ededed;\n  height: 90rpx;\n  line-height: 90rpx;\n  border-radius: 100px;\n  width: 92%;\n  margin: 0 auto;\n}\n\n.btns {\n  margin-top: 100rpx;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: center;\n}\n\n@keyframes mymove {\n  0% {\n    transform: scale(1); /*开始为原始大小*/\n  }\n  25% {\n    transform: scale(1.1); /*放大1.1倍*/\n  }\n  50% {\n    transform: scale(1);\n  }\n  75% {\n    transform: scale(1.1);\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/passport/wechatMPLogin.vue",
    "content": "<template>\r\n\t<view class=\"container\">\r\n\t\t<u-navbar :custom-back=\"back\" title=\"小程序登录\"></u-navbar>\r\n\t\t<u-modal v-model=\"phoneAuthPopup\" :mask-close-able=\"true\" :title=\"projectName+'商城'\"\r\n\t\t\t:show-confirm-button=\"false\">\r\n\t\t\t<div class=\"tips\">\r\n\t\t\t\t为了更好地用户体验，需要您授权手机号\r\n\t\t\t</div>\r\n\t\t\t<button class=\"register\" type=\"primary\" open-type=\"getPhoneNumber\" @getphonenumber=\"getPhoneNumber\">\r\n\t\t\t\t去授权\r\n\t\t\t</button>\r\n\t\t</u-modal>\r\n\t\t<view class=\"wx-auth-container\">\r\n\t\t\t<div class=\"box\">\r\n\t\t\t\t<view class=\"logo-info\">\r\n\t\t\t\t\t<text class=\"title\">欢迎进入{{ projectName }}</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"small-tips\">\r\n\t\t\t\t\t<view>为您提供优质服务,{{ projectName }}需要获取以下信息</view>\r\n\t\t\t\t\t<view>您的公开信息（昵称、头像）</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"btns\">\r\n\t\t\t\t\t<button type=\"primary\" :disabled=\"logingFlag\" bindtap=\"getUserProfile\" @click=\"getUserProfile()\"\r\n\t\t\t\t\t\tclass=\"btn-auth\">登录</button>\r\n\t\t\t\t\t<div @click=\"backToHome\" class=\"btn-callback\">暂不登录</div>\r\n\t\t\t\t</view>\r\n\t\t\t\t<div class=\"privacy\">\r\n            <u-checkbox shape=\"circle\" v-model=\"checked\" :active-color=\"lightColor\">\r\n              <div class=\"flex\">\r\n                阅读并同意<navigator class=\"light-color\" url=\"/pages/mine/help/tips?type=PRIVACY_POLICY\">《隐私协议》</navigator>\r\n                <navigator class=\"light-color\" url=\"/pages/mine/help/tips?type=USER_AGREEMENT\">《用户协议》</navigator>\r\n              </div>\r\n            </u-checkbox>\r\n        </div>\r\n\t\t\t</div>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tmpAutoLogin\r\n\t} from \"@/api/connect.js\";\r\n\r\n\timport {\r\n\t\twhetherNavigate\r\n\t} from \"@/utils/Foundation\"; //登录跳转\r\n\timport {\r\n\t\tgetUserInfo\r\n\t} from \"@/api/members\";\r\n\timport storage from \"@/utils/storage.js\";\r\n\timport config from '@/config/config'\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tlightColor:this.$lightColor,\r\n\t\t\t\tchecked:false,\r\n        configs:config,\r\n\t\t\t\t// 是否展示手机号码授权弹窗，默认第一步不展示，要先获取用户基础信息\r\n\t\t\t\tphoneAuthPopup: false,\r\n\t\t\t\t// 授权信息展示，商城名称\r\n\t\t\t\tprojectName: config.name,\r\n\t\t\t\t//微信返回信息，用于揭秘信息，获取sessionkey\r\n\t\t\t\tcode: \"\",\r\n\t\t\t\t//微信昵称\r\n\t\t\t\tnickName: \"\",\r\n        logingFlag: false,\r\n\t\t\t\t//微信头像\r\n\t\t\t\timage: \"\",\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t//微信小程序进入页面，先获取code，否则几率出现code和后续交互数据不对应情况\r\n\t\tmounted() {\r\n\t\t\t// 小程序默认分享\r\n\t\t\tuni.showShareMenu({\r\n\t\t\t\twithShareTicket: true\r\n\t\t\t});\r\n\r\n\r\n      //获取code\r\n      uni.login({\r\n        success: (res) => {\r\n          if(res.errMsg === \"login:ok\") {\r\n            this.code = res.code\r\n          } else {\r\n            uni.showToast({\r\n              title: \"系统异常，请联系管理员！\"\r\n            })\r\n          }\r\n        },\r\n      });\r\n\t\t\t\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t/**\r\n\t\t\t * TODO 此方法不一定是最优解，如果有更好的办法请在  https://gitee.com/beijing_hongye_huicheng/lilishop/issues 中提出\r\n\t\t\t * 小程序返回bug\r\n\t\t\t * 1.介于微信登录是在login.vue的基础上作为判断跳转来\r\n\t\t\t * 所以在页面栈中会自动记录回退路径，所以导致每次微信小程序点击回退就会自动返回login页面\r\n\t\t\t * 当然login页面的判断就是 没有登录就会跳转到微信小程序页面 导致了无法回退到之前页面\r\n\t\t\t * 2.解决方法： 尝试在回退的时候判断地址，让回退多一级这样就避免了\r\n\t\t\t */\r\n\r\n\t\t\tback() {\r\n\t\t\t\twhetherNavigate(\"wx\");\r\n\t\t\t},\r\n\t\t\tbackToHome() {\r\n\t\t\t\tuni.switchTab({\r\n\t\t\t\t\turl: `/pages/tabbar/home/index`,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\r\n\r\n\r\n\t\t\t//获取用户信息\r\n      getUserProfile(e) {\r\n\t\t\t\tif(!this.checked){\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle:\"请勾选协议\",\r\n\t\t\t\t\t\ticon:'none'\r\n\t\t\t\t\t})\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n        this.logingFlag = true;\r\n\r\n        if (this.code) {\r\n          // 推荐使用wx.getUserProfile获取用户信息，开发者每次通过该接口获取用户个人信息均需用户确认\r\n          uni.getUserProfile({\r\n            desc: \"用于完善会员资料\", // 声明获取用户个人信息后的用途，后续会展示在弹窗中，请谨慎填写\r\n            success: (res) => {\r\n              console.log(\"success\", res)\r\n              this.nickName = res.userInfo.nickName;\r\n              this.image = res.userInfo.avatarUrl;\r\n\r\n              /**\r\n               * 根据公有的配置设置登录方式\r\n               */\r\n              if(this.configs.enableFetchMobileLogin){\r\n                this.phoneAuthPopup = true;\r\n                return false\r\n              }\r\n              let iv = res.iv;\r\n              let encryptedData = res.encryptedData;\r\n\r\n              let code = this.code;\r\n              let image = this.image;\r\n              let nickName = this.nickName;\r\n              mpAutoLogin({\r\n                encryptedData,\r\n                iv,\r\n                code,\r\n                image,\r\n                nickName,\r\n              }).then((apiRes) => {\r\n                storage.setAccessToken(apiRes.data.result.accessToken);\r\n                storage.setRefreshToken(apiRes.data.result.refreshToken);\r\n                // 登录成功\r\n                uni.showToast({\r\n                  title: \"登录成功!\",\r\n                  icon: \"none\",\r\n                });\r\n                //获取用户信息\r\n                getUserInfo().then((user) => {\r\n                  storage.setUserInfo(user.data.result);\r\n                  storage.setHasLogin(true);\r\n\r\n                  uni.navigateBack({\r\n                    delta: 1,\r\n                  });\r\n                });\r\n              });\r\n\r\n            },\r\n            fail: (res) => {\r\n              console.log(\"fail\", res)\r\n            },\r\n          });\r\n\r\n          this.logingFlag = false;\r\n        }\r\n\t\t\t},\r\n\r\n\t\t\t//获取手机号授权\r\n\t\t\tgetPhoneNumber(e) {\r\n\t\t\t  let iv = e.detail.iv;\r\n\t\t\t  let encryptedData = e.detail.encryptedData;\r\n\t\t\t  if (!e.detail.encryptedData) {\r\n\t\t\t    uni.showToast({\r\n\t\t\t      title: \"请授予手机号码权限，手机号码会和会员系统用户绑定！\",\r\n\t\t\t      icon: \"none\",\r\n\t\t\t    });\r\n\t\t\t    return;\r\n\t\t\t  }\r\n\r\n\t\t\t  let code = this.code;\r\n\t\t\t  let image = this.image;\r\n\t\t\t  let nickName = this.nickName;\r\n\t\t\t  mpAutoLogin({\r\n\t\t\t    encryptedData,\r\n\t\t\t    iv,\r\n\t\t\t    code,\r\n\t\t\t    image,\r\n\t\t\t    nickName,\r\n\t\t\t  }).then((res) => {\r\n\t\t\t    storage.setAccessToken(res.data.result.accessToken);\r\n\t\t\t    storage.setRefreshToken(res.data.result.refreshToken);\r\n\t\t\t    // 登录成功\r\n\t\t\t    uni.showToast({\r\n\t\t\t      title: \"登录成功!\",\r\n\t\t\t      icon: \"none\",\r\n\t\t\t    });\r\n\t\t\t    //获取用户信息\r\n\t\t\t    getUserInfo().then((user) => {\r\n\t\t\t      storage.setUserInfo(user.data.result);\r\n\t\t\t      storage.setHasLogin(true);\r\n\r\n\t\t\t      uni.navigateBack({\r\n\t\t\t        delta: 1,\r\n\t\t\t      });\r\n\t\t\t    });\r\n\t\t\t  });\r\n\t\t\t},\r\n\r\n\r\n\r\n\r\n\t\t},\r\n\t};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n\t/*微信授权*/\r\n\tpage {\r\n\t\tbackground-color: #ffffff;\r\n\t}\r\n\r\n\t.wx-auth-container {\r\n\t\twidth: 100%;\r\n\t\tmargin-top: 20%;\r\n\t}\r\n\r\n\t.logo-info {\r\n\t\tdisplay: flex;\r\n\t\tflex-wrap: nowrap;\r\n\t\tjustify-content: flex-start;\r\n\t\tflex-direction: row;\r\n\t\talign-items: flex-start;\r\n\t\tpadding: 20rpx;\r\n\r\n\t\tflex-direction: column;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\timage {\r\n\t\twidth: 100px;\r\n\t\theight: 100px;\r\n\t\ttext-align: center;\r\n\t\t-webkit-transform: scale(2.5);\r\n\t\ttransform: scale(2.5);\r\n\t}\r\n\r\n\t.logo-info-img {\r\n\t\twidth: 80rpx;\r\n\t\theight: 80rpx;\r\n\t\tborder-radius: 50%;\r\n\t\tborder: none;\r\n\t}\r\n\r\n\ttext.title,\r\n\ttext.shop {\r\n\t\tdisplay: inline-block;\r\n\t\tfont-size: 60rpx;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\ttext.shop {\r\n\t\tdisplay: inline-block;\r\n\t\tfont-size: 55rpx;\r\n\t\tcolor: #333;\r\n\t}\r\n\r\n\t.box {\r\n\t\tmargin: 0 32rpx;\r\n\t}\r\n\r\n\t/* 文字提示*/\r\n\t.small-tips {\r\n\t\twidth: 94%;\r\n\t\tpadding: 20rpx;\r\n\t\tfont-size: 24rpx;\r\n\t\tmargin: 0 0 20rpx;\r\n\t\tcolor: #999;\r\n\t}\r\n\r\n\t.auth-button {\r\n\t\tpadding: 10px 20px;\r\n\t\twidth: calc(100% - 20 * 4rpx);\r\n\t}\r\n\r\n\t.tips {\r\n\t\twidth: 80%;\r\n\t\ttext-align: left;\r\n\t\tmargin: 6% 10%;\r\n\t\tmargin-top: 48rpx;\r\n\t\tline-height: 1.75;\r\n\t}\r\n\r\n\t.register {\r\n\t\tcolor: $weChat-color !important;\r\n\t\tborder: none !important;\r\n\t\tbackground: #fff !important;\r\n\t}\r\n\r\n.btn-auth {\r\n  width: 92%;\r\n  margin: 0 auto 40rpx;\r\n  border-radius: 100px;\r\n  // animation: mymove 5s infinite;\r\n  // -webkit-animation: mymove 5s infinite; /*Safari and Chrome*/\r\n  // animation-direction: alternate; /*轮流反向播放动画。*/\r\n  // animation-timing-function: ease-in-out; /*动画的速度曲线*/\r\n  // /* Safari 和 Chrome */\r\n  // -webkit-animation: mymove 5s infinite;\r\n  // -webkit-animation-direction: alternate; /*轮流反向播放动画。*/\r\n  // -webkit-animation-timing-function: ease-in-out; /*动画的速度曲线*/\r\n}\r\n.btn-callback {\r\n  text-align: center;\r\n  font-size: 30rpx;\r\n  background: #ededed;\r\n  height: 90rpx;\r\n  line-height: 90rpx;\r\n  border-radius: 100px;\r\n  width: 92%;\r\n  margin: 0 auto;\r\n}\r\n\r\n\t.btn-callback {\r\n\t\ttext-align: center;\r\n\t\tfont-size: 30rpx;\r\n\t\tbackground: #ededed;\r\n\t\theight: 90rpx;\r\n\t\tline-height: 90rpx;\r\n\t\tborder-radius: 100px;\r\n\t\twidth: 92%;\r\n\t\tmargin: 0 auto;\r\n\t}\r\n\r\n\t.btns {\r\n\t\tmargin-top: 100rpx;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\twidth: 100%;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t@keyframes mymove {\r\n\t\t0% {\r\n\t\t\ttransform: scale(1);\r\n\t\t\t/*开始为原始大小*/\r\n\t\t}\r\n\r\n\t\t25% {\r\n\t\t\ttransform: scale(1.1);\r\n\t\t\t/*放大1.1倍*/\r\n\t\t}\r\n\r\n\t\t50% {\r\n\t\t\ttransform: scale(1);\r\n\t\t}\r\n\r\n\t\t75% {\r\n\t\t\ttransform: scale(1.1);\r\n\t\t}\r\n\t}\r\n\r\n.privacy{\r\n  text-align: center;\r\n  margin-top: 20rpx;\r\n  width: 100%;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/askList.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <div v-if=\"!askGoods.goods_id\" class=\"noMore\">\r\n      暂无信息\r\n    </div>\r\n    <div class=\"askBox\" v-else>\r\n      <u-row :gutter=\"24\">\r\n        <u-col span=\"2\" @click=\"goodsDetail()\">\r\n          <image class=\"img\" :src=\"queryGoodsDetail.thumbnail\"></image>\r\n        </u-col>\r\n        <u-col span=\"8\" @click=\"goodsDetail()\">\r\n          <h5 style=\"padding-left:10rpx;\">{{queryGoodsDetail.goodsName}}</h5>\r\n        </u-col>\r\n\r\n      </u-row>\r\n      <u-row>\r\n        <u-col span=\"12\">\r\n          <u-input v-model=\"params.askValue\" height=\"200\" type=\"textarea\" :border=\"border\" />\r\n        </u-col>\r\n        <u-radio-group v-model=\"params.anonymous\" @change=\"radioGroupChange\">\r\n          <u-radio @change=\"radioChange\">\r\n            匿名提交\r\n          </u-radio>\r\n        </u-radio-group>\r\n        <u-col span=\"12\">\r\n          <u-row :gutter=\"12\">\r\n            <u-col :offset=\"1\" span=\"4\">\r\n              <u-button class=\"btns\" @click=\"askValue=''\">清空</u-button>\r\n            </u-col>\r\n            <u-col :offset=\"2\" span=\"4\">\r\n              <u-button class=\"btns\" @click=\"getAskMessage()\" type=\"success\">提交</u-button>\r\n            </u-col>\r\n          </u-row>\r\n        </u-col>\r\n      </u-row>\r\n    </div>\r\n  </div>\r\n</template>\r\n<script>\r\nimport * as API_GOODS from \"../../api/goods\";\r\nimport * as API_MEM from \"../../api/members\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      askGoods: \"\",\r\n      queryGoodsDetail: \"\",\r\n      border: true,\r\n      params: {\r\n        askValue: \"\",\r\n        anonymous: \"YES\",\r\n      },\r\n    };\r\n  },\r\n  onLoad(options) {\r\n    this.askGoods = options;\r\n    this.getGoodsData();\r\n  },\r\n  methods: {\r\n    getGoodsData() {\r\n      if (this.askGoods.goods_id) {\r\n        API_GOODS.getGoods(this.askGoods.goods_id).then((result) => {\r\n          this.queryGoodsDetail = result.data;\r\n        });\r\n      }\r\n    },\r\n    getAskMessage() {\r\n      uni.showLoading();\r\n      if (this.params.askValue == \"\") {\r\n        uni.showToast({\r\n          title: \"请填写内容!\",\r\n          icon: \"none\",\r\n        });\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n        return false;\r\n      }\r\n      API_MEM.consultating(\r\n        this.askGoods.goods_id,\r\n        this.params.askValue,\r\n        this.params.anonymous\r\n      )\r\n        .then((res) => {\r\n          if (res.statusCode == 200) {\r\n            uni.showToast({\r\n              title: \"提交成功!\",\r\n              icon: \"none\",\r\n            });\r\n            this.askValue = \"\";\r\n          }\r\n           if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n        })\r\n        .catch((err) => {\r\n        \r\n           if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n        });\r\n    },\r\n    radioGroupChange(e) {\r\n     \r\n    },\r\n    radioChange(e) {\r\n      if (this.anonymous == \"YES\") {\r\n        this.anonymous = \"NO\";\r\n      } else {\r\n        this.anonymous = \"YES\";\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.img {\r\n  max-width: 100%;\r\n  height: 100rpx;\r\n}\r\n\r\n.noMore {\r\n  text-align: center;\r\n  margin: 40rpx 0;\r\n}\r\n\r\n.askBox {\r\n  padding: 32rpx;\r\n}\r\n\r\n/deep/ .u-col {\r\n  text-align: center;\r\n  padding: 16rpx 0 !important;\r\n}\r\n\r\n.wrapper {\r\n  background: #fff;\r\n  padding: 32rpx 0;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/comment.vue",
    "content": "<template>\r\n  <view class=\"comment\">\r\n    <view class=\"top-tab\">\r\n      <view class=\"tab-btn\" :v-if=\"commentDetail\">\r\n        <view @click=\"select(0)\" :class=\"{ cur: selectIndex == 0 }\">全部</view>\r\n        <view @click=\"select(1)\" :class=\"{ cur: selectIndex == 1 }\">好评{{ commentDetail.good }}</view>\r\n        <view @click=\"select(2)\" :class=\"{ cur: selectIndex == 2 }\">中评{{ commentDetail.moderate }}</view>\r\n        <view @click=\"select(3)\" :class=\"{ cur: selectIndex == 3 }\">差评{{ commentDetail.worse }}</view>\r\n        <view @click=\"select(4)\" :class=\"{ cur: selectIndex == 4 }\">有图{{ commentDetail.haveImage }}</view>\r\n      </view>\r\n    </view>\r\n    <!-- 评价 -->\r\n    <div class=\"goodsBoxOver\">\r\n      <div class=\"scoll-page\">\r\n        <view class=\"eva-section\">\r\n          <div class=\"empty\" v-if=\"commDetail.length < 1\">\r\n            <view>\r\n              <u-empty mode=\"message\" text=\"赞无评论\"></u-empty>\r\n            </view>\r\n          </div>\r\n          <view class=\"eva-box\" v-for=\"(item, index) in commDetail\" :key=\"index\">\r\n            <view class=\"section-info\">\r\n              <image class=\"portrait\" :src=\"item.memberProfile || userImage\" mode=\"aspectFit\"></image>\r\n              <view class=\"star-content\">\r\n                <text class=\"name\">{{ item.memberName | noPassByName }}</text>\r\n                <text class=\"time\">{{ item.createTime }}</text>\r\n              </view>\r\n              <view class=\"stars\">\r\n                <text :class=\"{ star: item.deliveryScore > 0 }\"></text>\r\n                <text :class=\"{ star: item.deliveryScore > 1 }\"></text>\r\n                <text :class=\"{ star: item.deliveryScore > 2 }\"></text>\r\n                <text :class=\"{ star: item.deliveryScore > 3 }\"></text>\r\n                <text :class=\"{ star: item.deliveryScore > 4 }\"></text>\r\n              </view>\r\n            </view>\r\n            <view class=\"section-contant\">\r\n              <div class=\"content\">{{ item.content }}</div>\r\n              <view class=\"img\">\r\n                <!-- 循环出用户评价的图片 -->\r\n                <u-image width=\"140rpx\" height=\"140rpx\" v-if=\"item.images\" v-for=\"(img, i) in splitImg(item.images)\" :src=\"img\" :key=\"i\" @click=\"preview(splitImg(item.images), i)\">\r\n                </u-image>\r\n              </view>\r\n              <view class=\"bot\">\r\n                <text class=\"attr\">{{ item.goodsName }} - {{ gradeList[item.grade] }}</text>\r\n              </view>\r\n            </view>\r\n            <view class=\"commentStyle\" v-if=\"item.reply\">\r\n              商家回复：\r\n              <span class=\"addCommentSpan\">{{ item.reply }}</span>\r\n              <view class=\"img\">\r\n                <!-- 循环出商家回复评价的图片 -->\r\n                <u-image width=\"140rpx\" height=\"140rpx\" v-if=\"item.replyImage\" v-for=\"(replyImg, replyIndex) in splitImg(item.replyImage)\" :src=\"replyImg\" :key=\"replyIndex\"\r\n                  @click=\"preview(splitImg( item.replyImage), index)\">\r\n                </u-image>\r\n              </view>\r\n            </view>\r\n          </view>\r\n          <u-loadmore bg-color=\"transparent\" style=\"margin:40rpx 0\" :status=\"status\" @loadmore=\"loadmore()\" icon-type=\"iconType\" />\r\n        </view>\r\n      </div>\r\n    </div>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\n// import { getGoodsDetail } from '@/api/goods.js';\r\nimport * as membersApi from \"@/api/members.js\";\r\nimport configs from '@/config/config'\r\nexport default {\r\n  data() {\r\n    return {\r\n      configs,\r\n      status: \"loadmore\", //底部刷新状态\r\n      userImage:configs.defaultUserPhoto,\r\n      commentDetail: \"\", //评价详情\r\n      selectIndex: \"0\", //检索条件\r\n      params: {  // 评论分页提交数据\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n        grade: \"\",\r\n      },\r\n      gradeList: {\r\n        GOOD: \"好评\",\r\n        MODERATE: \"中评\",\r\n        WORSE: \"差评\",\r\n        HAVEIMAGE: \"有图\",\r\n      },\r\n      // 评论详情\r\n      commDetail: [],\r\n      dataTotal: 0, //评论的总total数量\r\n      opid: \"\", //上级传参id\r\n    };\r\n  },\r\n  async onLoad(options) {\r\n    this.getGoodsCommentsFun(options.id);\r\n    this.getGoodsCommentsNum(options.id);\r\n    this.opid = options.id;\r\n  },\r\n  \r\n  /**\r\n   * 触底加载\r\n   */\r\n  onReachBottom() {\r\n    this.params.pageNumber++;\r\n    this.getGoodsCommentsFun(this.opid);\r\n  },\r\n\r\n  methods: {\r\n    /**\r\n     * 切割图像\r\n     */\r\n    splitImg(val) {\r\n      if (val && val.split(\",\")) {\r\n        return val.split(\",\");\r\n      } else if (val) {\r\n        return val;\r\n      } else {\r\n        return false;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 获取商品评论\r\n     */\r\n    getGoodsCommentsFun(id) {\r\n      this.status = \"loading\";\r\n      // getGoodsComments\r\n      membersApi.getGoodsComments(id, this.params).then((res) => {\r\n        if (\r\n          res.data.result.records == [] ||\r\n          res.data.result.records == \"\" ||\r\n          res.data.result.records == null\r\n        ) {\r\n          this.status = \"noMore\";\r\n          return false;\r\n        }\r\n        this.commDetail = this.commDetail.concat(res.data.result.records);\r\n        this.dataTotal = res.data.result.total;\r\n        this.status = \"loadmore\";\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获取商品评论数\r\n     */\r\n    getGoodsCommentsNum(id) {\r\n      membersApi.getGoodsCommentsCount(id).then((res) => {\r\n        if (res.statusCode === 200) {\r\n          this.commentDetail = res.data.result;\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 顶部筛选条件\r\n     */\r\n    select(index) {\r\n      this.params = {\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n      };\r\n      this.selectIndex = index;\r\n      this.params.grade = [\"\", \"GOOD\", \"MODERATE\", \"WORSE\", \"\"][\r\n        this.selectIndex\r\n      ];\r\n      this.selectIndex === 4 ? (this.params.haveImage = 1) : true;\r\n      this.commDetail = [];\r\n      if (this.selectIndex === 0) {\r\n        this.params = {\r\n          pageNumber: 1,\r\n          pageSize: 10,\r\n          grade: \"\",\r\n        };\r\n      }\r\n      // 重新加载评论\r\n      this.getGoodsCommentsFun(this.opid);\r\n    },\r\n\r\n    /**\r\n     * 点击图片放大或保存\r\n     */\r\n    preview(urls, index) {\r\n      uni.previewImage({\r\n        current: index,\r\n        urls: urls,\r\n        longPressActions: {\r\n          itemList: [\"保存图片\"],\r\n          success: function (data) {\r\n            uni.showToast({\r\n              title: \"保存成功\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n          },\r\n          fail: function (err) {\r\n            uni.showToast({\r\n              title: \"保存失败\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n          },\r\n        },\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.commentStyle {\r\n  margin-top: 16rpx;\r\n  padding: 14rpx 26rpx;\r\n  background: #f5f5f5;\r\n  border-radius: 6px;\r\n  font-size: 22rpx;\r\n  font-weight: 700;\r\n  text-align: left;\r\n  line-height: 40rpx;\r\n}\r\n\r\n.addCommentSpan {\r\n  color: $u-tips-color !important;\r\n  padding-left: 20rpx;\r\n}\r\n.img {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  /* height: 140rpx; */\r\n  overflow: hidden;\r\n\r\n  image {\r\n    width: 166rpx;\r\n    height: 166rpx;\r\n    margin: 0 15rpx 15rpx 0;\r\n\r\n    &:nth-of-type(3n + 0) {\r\n      margin: 0 0 15rpx 0;\r\n    }\r\n  }\r\n}\r\n\r\n.goodsBoxOver {\r\n  overflow-y: scroll;\r\n}\r\n\r\npage {\r\n  background: #f7f7f7;\r\n}\r\n.comment {\r\n  color: #333;\r\n  background: #f7f7f7;\r\n\r\n  overflow: hidden;\r\n\r\n  .top-tab {\r\n    background: #fff;\r\n    margin-bottom: 10rpx;\r\n    border-radius: 20rpx;\r\n    display: flex;\r\n    flex-direction: column;\r\n    padding: 0 30rpx 0 30rpx;\r\n    font-size: 24rpx;\r\n\r\n    .tab-btn {\r\n      margin-top: 20rpx;\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n\r\n      view {\r\n        min-width: 118rpx;\r\n        text-align: center;\r\n        height: 50rpx;\r\n        line-height: 50rpx;\r\n        padding: 0 10rpx;\r\n        background: #f8f8fe;\r\n        border-radius: 25rpx;\r\n        margin: 0 20rpx 30rpx 0;\r\n\r\n        &.cur {\r\n          background: $aider-light-color;\r\n          color: #fff;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  .eva-section {\r\n    padding: 20rpx 0;\r\n\r\n    .eva-box {\r\n      padding: 40rpx;\r\n      margin-bottom: 10rpx;\r\n      background: #fff;\r\n      border-radius: 20rpx;\r\n      /* star */\r\n      .star-content {\r\n        display: flex;\r\n        flex-direction: column;\r\n\r\n        view {\r\n          flex: 1;\r\n          display: flex;\r\n          align-items: center;\r\n        }\r\n\r\n        .time {\r\n          font-size: 24rpx;\r\n          color: #999;\r\n        }\r\n      }\r\n\r\n      .section-info {\r\n        display: flex;\r\n\r\n        .stars {\r\n          flex: 1;\r\n          display: flex;\r\n          justify-content: flex-end;\r\n          align-items: center;\r\n\r\n          .star {\r\n            width: 30rpx;\r\n            height: 30rpx;\r\n            background: url(\"/static/star.png\");\r\n            background-size: 100%;\r\n          }\r\n        }\r\n        .portrait {\r\n          flex-shrink: 0;\r\n          width: 80rpx;\r\n          height: 80rpx;\r\n          border-radius: 100px;\r\n          margin-right: 20rpx;\r\n        }\r\n      }\r\n      .section-contant {\r\n        display: flex;\r\n        flex-direction: column;\r\n\r\n        .content {\r\n          font-size: 24rpx;\r\n          line-height: 46rpx;\r\n          font-weight: 400;\r\n          color: $font-color-dark;\r\n          color: #333;\r\n          padding: 26rpx 0;\r\n        }\r\n\r\n        .img {\r\n          display: flex;\r\n          flex-wrap: wrap;\r\n          /* height: 140rpx; */\r\n          overflow: hidden;\r\n          > * {\r\n            margin-right: 16rpx;\r\n          }\r\n        }\r\n\r\n        .bot {\r\n          display: flex;\r\n          justify-content: space-between;\r\n          font-size: $font-sm;\r\n          color: $font-color-light;\r\n          margin-top: 20rpx;\r\n\r\n       \r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n.empty {\r\n  padding-top: 300rpx;\r\n  color: #999999;\r\n  text-align: center;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/customerservice/index.vue",
    "content": "<template>\n\t<view>\n\t\t<chat></chat>\n\t</view>\n</template>\n<script>\n\tvar chat = requirePlugin('myPlugin')\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t\n\t\t},\n\t\tonLoad (e) {\n\t\t\tconst params = JSON.parse((decodeURIComponent(e.params)))\n\t\t\tchat.init({\n\t\t\t\tsign: params.mpSign,  //必传，公司渠道唯一标识，腾讯云智服后台系统创建「小程序插件」渠道后，在「渠道管理」获取\n\t\t\t\ttoken: params.token, //非必填\n\t\t\t\tuid: params.uuid,   //用户唯一标识，如果没有则不填写，默认为空\n\t\t\t\ttitle: params.storageName, //非必填，如果未填写，默认获取配置标题\n\t\t\t\tisRMB: '', //商品是否显示人民币￥,默认显示，false不显示\n\t\t\t\tdata: {    //参数c1,c2,c3,c4,c5用于传递用户信息，参数d1,d2,d3,d4,d5,d6用于传递商品信息，默认为空\n\t\t\t\t  c1: '',\n\t\t\t\t  c2: '',\n\t\t\t\t  c3: '',\n\t\t\t\t  c4: '',\n\t\t\t\t  c5: '',\n\t\t\t\t  d1: params.goodsName, //商品描述\n\t\t\t\t  d2: params.price, //价格\n\t\t\t\t  d3: '', //原价格\n\t\t\t\t  d4: params.goodsImg, //展示商品图片链接\n\t\t\t\t  d5: '', //商品跳转链接\n\t\t\t\t  d6: params.goodsId, //商品id\n\t\t\t\t  data: ''//加密串,非必填\n\t\t\t\t},\n\t\t\t\tviewUrl(res){  //需要跳转外部链接，则需要配置一个web-view\n\t\t\t\tif (res) {\n\t\t\t\t  wx.navigateTo({\n\t\t\t\t\turl: '/pages/webview/index?href=' + res\n\t\t\t\t  })\n\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetTitle(res){  //设置标题\n\t\t\t\tif (res) {\n\t\t\t\t  wx.setNavigationBarTitle({\n\t\t\t\t\ttitle: res\n\t\t\t\t  })\n\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetBarColor(res) {   //设置导航栏背景色\n\t\t\t\tif (res) {\n\t\t\t\t  wx.setNavigationBarColor({\n\t\t\t\t\tfrontColor: '#ffffff',\n\t\t\t\t\tbackgroundColor: res\n\t\t\t\t  })\n\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsuccess(res){  //初始化成功时调用\n\t\t\t\tif (res.data == 'success') {\n\t\t\t\t  console.log('success');\n\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tfail(res){    //初始化失败时调用\n\t\t\t\tif (res.data == 'initError') {\n\t\t\t\t  console.log(res.message);\n\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tleave(res){       //离开会话页面\n\t\t\t\tif (res) {\n\t\t\t\t  console.log(res);\n\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n</script>"
  },
  {
    "path": "pages/product/goods.vue",
    "content": "<template>\r\n  <div class=\"main-page\">\r\n    <!-- #ifdef APP-PLUS -->\r\n    <view class=\"status_bar\"></view>\r\n    <!-- #endif -->\r\n    <!-- 仅h5有效 打开App -->\r\n\r\n    <!-- 分享 -->\r\n    <shares v-if=\"enableShare && goodsDetail.id\" :skuId=\"this.routerVal.id\" :goodsId=\"this.routerVal.goodsId\" :link=\"\r\n      '/pages/product/goods?id=' +\r\n      this.routerVal.id +\r\n      '&goodsId=' +\r\n      this.routerVal.goodsId\r\n    \" :thumbnail=\"goodsDetail.thumbnail\" :goodsName=\"goodsDetail.goodsName\" type=\"goods\"\r\n      @close=\"enableShare = false\" />\r\n    <popups v-model=\"popupsSwitch\" @tapPopup=\"handleNavbarList\" :popData=\"navbarListData\" :x=\"navbarListX\"\r\n      :y=\"navbarListY\" placement=\"top-start\" />\r\n    <view class=\"index\">\r\n      <!-- topBar -->\r\n      <u-navbar :background=\"navbar\" :is-back=\"false\" :class=\"headerFlag ? 'header' : 'header bg-none scroll-hide'\">\r\n        <div class=\"headerRow\">\r\n          <div class=\"backs\">\r\n            <u-icon @click=\"back()\" name=\"arrow-left\" class=\"icon-back\"></u-icon>\r\n\r\n            <u-icon name=\"list\" @click=\"popupsSwitch = !popupsSwitch\" class=\"icon-list\"></u-icon>\r\n          </div>\r\n          <div class=\"headerList\" :class=\"headerFlag ? 'tab-bar' : 'tab-bar scroll-hide'\">\r\n            <div class=\"headerRow\">\r\n              <div class=\"nav-item\" v-for=\"header in headerList\" :key=\"header.id\"\r\n                :class=\"{ cur: scrollId === header.id }\" @click=\"headerTab(header.id)\">\r\n                {{ header.text }}\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </u-navbar>\r\n\r\n      <u-navbar :border-bottom=\"false\" v-show=\"!headerFlag\" class=\"header-only-back\" :background=\"navbarOnlyBack\"\r\n        :is-back=\"false\">\r\n        <div>\r\n          <div class=\"bg-back\">\r\n            <u-icon size=\"40\" @click=\"back()\" name=\"arrow-left\" class=\"icon-back\"></u-icon>\r\n            <u-icon size=\"40\" @click=\"popupsSwitch = !popupsSwitch\" name=\"list\" class=\"icon-list\"></u-icon>\r\n          </div>\r\n        </div>\r\n      </u-navbar>\r\n    </view>\r\n\r\n    <view class=\"product-container\" :style=\"{ height: productRefHeight }\" ref=\"productRef\" id=\"productRef\">\r\n      <scroll-view scroll-anchoring enableBackToTop=\"true\" scroll-with-animation scroll-y class=\"scroll-page\"\r\n        :scroll-top=\"tabScrollTop\" @scroll=\"pageScroll\">\r\n        <view>\r\n          <!-- 轮播图 -->\r\n         \r\n          <GoodsSwiper id=\"main1\" :res=\"imgList\" :video=\"goodsDetail.goodsVideo\" />\r\n\r\n          <!-- 促销活动条 -->\r\n          <PromotionAssembleLayout v-if=\"PromotionList\" :detail=\"goodsDetail\" :res=\"PromotionList\" />\r\n\r\n          <view class=\"card-box top-radius-0\" id=\"main2\">\r\n            <!-- 活动不显示价钱 -->\r\n            <view v-if=\"isSeckill || isGroup\" class=\"desc-bold -goods-msg\">\r\n              <view class=\"-goods-flex\">\r\n                <view class=\"desc-bold\">\r\n                  {{ goodsDetail.goodsName || \"\" }}\r\n                </view>\r\n                <view class=\"favorite\" @click=\"clickFavorite(goodsDetail.id)\">\r\n                  <u-icon size=\"30\" :color=\"favorite ? '#f2270c' : '#262626'\" :name=\"favorite ? 'heart-fill' : 'heart'\">\r\n                  </u-icon>\r\n                  <view :style=\"{ color: favorite ? '#f2270c' : '#262626' }\">{{\r\n                    favorite? \"已收藏\": \"收藏\"\r\n                  }}</view>\r\n                </view>\r\n              </view>\r\n              <!-- 商品描述 -->\r\n              <view class=\"-goods-desc\">\r\n                {{ goodsDetail.sellingPoint || \"\" }}\r\n              </view>\r\n            </view>\r\n            <view v-else class=\"-goods-msg\">\r\n              <!-- 没有拼团，秒杀等活动的情况下 -->\r\n              <view>\r\n                <view class=\"-goods-flex\">\r\n                  <!-- 如果有积分显示积分 -->\r\n                  <view class=\"-goods-price\" v-if=\"goodsDetail.price != undefined\">\r\n\r\n                    <span>\r\n                      <span v-if=\"wholesaleList.length\">\r\n                        <span>¥</span><span class=\"price\">{{\r\n                          $options.filters.goodsFormatPrice(wholesaleList[wholesaleList.length - 1].price)[0]\r\n                        }}</span>.{{\r\n                          $options.filters.goodsFormatPrice(wholesaleList[wholesaleList.length - 1].price)[1]\r\n                        }}\r\n                        ~\r\n                        <span>¥</span><span class=\"price\">{{\r\n                          $options.filters.goodsFormatPrice(wholesaleList[0].price)[0]\r\n                        }}</span>.{{\r\n                          $options.filters.goodsFormatPrice(wholesaleList[0].price)[1]\r\n                        }}\r\n                      </span>\r\n                      <span v-else>\r\n                        <span>¥</span><span class=\"price\">{{\r\n                          $options.filters.goodsFormatPrice(goodsDetail.price)[0]\r\n                        }}</span>.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}\r\n                      </span>\r\n                    </span>\r\n                  </view>\r\n                  <view class=\"-goods-price\" v-else>\r\n                    <div v-if=\"takeDownFromSale\" class=\"price down-goods\">\r\n                      暂无报价\r\n                    </div>\r\n                    <span v-else>\r\n                    ¥<span class=\"price\">0 </span>.00\r\n                    </span>\r\n                  </view>\r\n\r\n                  <view class=\"icons share\" @click=\"shareChange()\">\r\n                    <u-icon size=\"30\" name=\"share-fill\"></u-icon>\r\n                    <view>分享</view>\r\n                  </view>\r\n                  <view class=\"icons\" @click=\"clickFavorite(goodsDetail.id)\">\r\n                    <u-icon size=\"30\" :color=\"favorite ? '#f2270c' : '#262626'\"\r\n                      :name=\"favorite ? 'heart-fill' : 'heart'\"></u-icon>\r\n                    <view :style=\"{ color: favorite ? '#f2270c' : '#262626' }\">{{\r\n                      favorite? \"已收藏\": \"收藏\"\r\n                    }}</view>\r\n                  </view>\r\n                </view>\r\n                <view class=\"-goods-name desc-bold\">\r\n                  {{ goodsDetail.goodsName || \"\" }}\r\n                </view>\r\n                <view class=\"-goods-desc\">\r\n                  {{ goodsDetail.sellingPoint || \"\" }}\r\n                </view>\r\n              </view>\r\n            </view>\r\n          </view>\r\n\r\n          <view class=\"card-box\">\r\n            <view class=\"card-flex\" @click=\"shutMask(1)\">\r\n              <view class=\"card-title\"> 促销 </view>\r\n              <view class=\"card-content\">\r\n                <span v-if=\"PromotionList && emptyPromotion()\">暂无促销信息</span>\r\n                <PromotionLayout v-else @shutMasks=\"shutMask\" :res=\"PromotionList\" />\r\n              </view>\r\n              <view class=\"card-bottom\">\r\n                <u-icon name=\"more-dot-fill\"></u-icon>\r\n              </view>\r\n            </view>\r\n          </view>\r\n\r\n          <!-- 拼团用户列表 -->\r\n          <PromotionAssembleListLayout v-if=\"isGroup\" @to-assemble-buy-now=\"toAssembleBuyNow\" :res=\"PromotionList\" />\r\n\r\n          <!-- 配置地址 如果是虚拟产品的时候不展示 -->\r\n          <view class=\"card-box\" v-if=\"goodsDetail.goodsType != 'VIRTUAL_GOODS'\">\r\n            <view class=\"card-flex\" @click=\"shutMask(4)\">\r\n              <view class=\"card-title\"> 已选 </view>\r\n              <view class=\"card-content\">\r\n                <span v-if=\"selectedGoods.spec\">{{ selectedGoods.spec.specName }}-{{\r\n                  selectedGoods.spec.specValue\r\n                }}</span>\r\n                <span v-else>默认</span>\r\n              </view>\r\n              <view class=\"card-bottom\">\r\n                <u-icon name=\"more-dot-fill\"></u-icon>\r\n              </view>\r\n            </view>\r\n            <view class=\"card-flex\" @click=\"shutMask(3)\">\r\n              <view class=\"card-title\"> 送至</view>\r\n              <view class=\"card-content\">\r\n                <span v-if=\"delivery\">{{\r\n                  delivery.consigneeAddressPath | clearStrComma\r\n                }}</span>\r\n                <span v-else>暂无地址信息</span>\r\n              </view>\r\n              <view class=\"card-bottom\">\r\n                <u-icon name=\"more-dot-fill\"></u-icon>\r\n              </view>\r\n            </view>\r\n          </view>\r\n\r\n          <!-- 评价 -->\r\n          <Evaluation id=\"main5\" :goodsDetail=\"goodsDetail\" />\r\n\r\n          <!-- 店铺推荐 -->\r\n          <storeLayout id=\"main7\" :storeDetail=\"storeDetail\" :goodsDetail=\"goodsDetail\" :res=\"recommendList\" />\r\n\r\n          <!-- 宝贝详情 -->\r\n          <GoodsIntro id=\"main9\" :res=\"goodsDetail\" :goodsParams=\"goodsParams\" :goodsId=\"goodsDetail.goodsId\"\r\n            v-if=\"goodsDetail.id\" />\r\n\r\n          <!-- 宝贝推荐 -->\r\n          <GoodsRecommend id=\"main11\" :res=\"likeGoodsList\" />\r\n        </view>\r\n      </scroll-view>\r\n\r\n\r\n      <view class=\"page-bottom mp-iphonex-bottom\" id=\"pageBottom\">\r\n        <view class=\"icon-btn\">\r\n          <view class=\"icon-btn-item\" @click=\"navigateToStore(goodsDetail.storeId)\">\r\n            <u-icon size=\"34\" class=\"red\" name=\"home-fill\"></u-icon>\r\n            <view class=\"red icon-btn-name\">店铺</view>\r\n          </view>\r\n          <view class=\"icon-btn-item\" @click=\"linkMsgDetail()\">\r\n            <u-icon size=\"34\" name=\"kefu-ermai\"></u-icon>\r\n            <view class=\"icon-btn-name\">客服</view>\r\n          </view>\r\n          <view class=\"icon-btn-item\" @click=\"reluchToCart()\">\r\n            <u-icon size=\"34\" name=\"storeping-cart\"></u-icon>\r\n            <view class=\"icon-btn-name\">购物车</view>\r\n            <view v-if=\"nums && nums > 0\" class=\"num-icon\">{{ nums }}</view>\r\n          </view>\r\n        </view>\r\n        <!-- 下架展示 -->\r\n        <div class=\"detail-btn\" v-if=\"takeDownFromSale\">\r\n          <view class=\"to-store-car to-store-btn\"  @click=\"reStartTakeDownSale\">\r\n            查看类似商品</view>\r\n        </div>\r\n        <!-- 正常结算页面 -->\r\n        <view class=\"detail-btn\" v-if=\"!isGroup && !takeDownFromSale\">\r\n          <view class=\"to-store-car to-store-btn\" v-if=\"goodsDetail.goodsType != 'VIRTUAL_GOODS'\" @click=\"shutMask(4)\">\r\n            加入购物车</view>\r\n          <view class=\"to-buy to-store-btn\" @click=\"shutMask(4, 'buy')\">立即购买</view>\r\n          <view class=\"to-store-car to-store-btn\" v-if=\"startTimer\">暂未开始</view>\r\n        </view>\r\n        <!-- 拼团结算 -->\r\n        <view class=\"detail-btn\" v-else-if=\"isGroup\">\r\n          <view class=\"to-store-car pt-buy to-store-btn\" @click=\"shutMask(4, 'buy')\">\r\n            <view>￥{{ goodsDetail.price | unitPrice }}</view>\r\n            <view>单独购买</view>\r\n          </view>\r\n          <view class=\"to-buy pt-buy to-store-btn\" @click=\"toAssembleBuyNow\">\r\n            <view>￥{{ goodsDetail.promotionPrice | unitPrice }}</view>\r\n            <view>拼团价格</view>\r\n          </view>\r\n        </view>\r\n      </view>\r\n      <!-- 规格-模态层弹窗 -->\r\n      <view class=\"spec\">\r\n        <!-- 促销弹窗 -->\r\n        <u-popup v-model=\"promotionShow\" :height=\"setup.height\" :mode=\"setup.mode\" :border-radius=\"setup.radius\"\r\n          @close=\"promotionShow = false\" :mask-close-able=\"setup.close\" closeable>\r\n          <view class=\"header-title\">优惠</view>\r\n          <view class=\"cuxiao\">\r\n            <scroll-view class=\"scroll_mask\" :scroll-y=\"true\">\r\n              <view class=\"con-cuxiao\">\r\n                <view class=\"cuxiao-title\">促销活动</view>\r\n                <PromotionDetailsLayout :res=\"PromotionList\" />\r\n              </view>\r\n              <view class=\"con-cuxiao coupons\">\r\n                <view class=\"cuxiao-title\">可领优惠券</view>\r\n                <PromotionCoupon @getCoupon=\"getCoupon\" :res=\"PromotionList\" />\r\n              </view>\r\n            </scroll-view>\r\n          </view>\r\n        </u-popup>\r\n\r\n        <!-- 配送地址弹窗 -->\r\n        <popupAddress @closeAddress=\"closePopupAddress\" @deliveryData=\"deliveryFun\" v-if=\"goodsDetail.id\"\r\n          :goodsId=\"goodsDetail.id\" :addressFlag=\"addressFlag\" />\r\n\r\n        <!-- 商品规格  商品详情，以及默认参与活动的id-->\r\n        <popupGoods :addr=\"delivery\" ref=\"popupGoods\" @changed=\"changedGoods\" @closeBuy=\"closePopupBuy\"\r\n          @queryCart=\"cartCount()\" :goodsDetail=\"goodsDetail\" :goodsSpec=\"goodsSpec\" :isGroup=\"isGroup\" :id=\"productId\"\r\n          v-if=\"goodsDetail.id\" :pointDetail=\"pointDetail\" :wholesaleList=\"wholesaleList\" @handleClickSku=\"selectSku\"\r\n          :buyMask=\"buyMask\" />\r\n\r\n\r\n        <!-- 下架框 -->\r\n        <takeDownFormSaleGoods ref=\"takeDownSale\" v-if=\"takeDownFromSale\" />\r\n      </view>\r\n    </view>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\n/************接口API***************/\r\nimport { getGoods, getGoodsList, getMpScene, getGoodsDistribution } from \"@/api/goods.js\";\r\nimport * as API_trade from \"@/api/trade.js\";\r\nimport * as API_Members from \"@/api/members.js\";\r\nimport * as API_store from \"@/api/store.js\";\r\nimport { getIMDetail } from \"@/api/common\";\r\nimport { modelNavigateTo } from \"@/pages/tabbar/home/template/tpl.js\";\r\n/************请求存储***************/\r\nimport storage from \"@/utils/storage.js\";\r\n\r\n/************组件***************/\r\nimport PromotionLayout from \"./product/promotion/-promotion\"; //促销组件\r\nimport PromotionDetailsLayout from \"./product/promotion/-promotion-details\"; //促销活动详情\r\nimport PromotionAssembleLayout from \"./product/promotion/-promotion-assemble-promotions\"; //促销活动条\r\nimport PromotionAssembleListLayout from \"./product/promotion/-promotion-assemble-list\"; //拼团用户列表\r\nimport PromotionCoupon from \"./product/promotion/-promotion-coupon\"; //优惠券组件\r\nimport GoodsIntro from \"./product/goods/-goods-intro\"; //商品介绍组件\r\nimport GoodsRecommend from \"./product/goods/-goods-recommend\"; //宝贝推荐\r\nimport storeLayout from \"./product/shop/-shop\"; //店铺组件\r\nimport Evaluation from \"./product/evaluation/-evaluation\"; //评价组件\r\nimport GoodsSwiper from \"./product/goods/-goods-swiper\"; //轮播图组件\r\nimport popupGoods from \"@/components/m-buy/goods\"; //购物车商品的模块\r\nimport popupAddress from \"./product/popup/address\"; //地址选择模块\r\nimport shares from \"@/components/m-share/index\"; //分享\r\nimport popups from \"@/components/popups/popups\"; //气泡框\r\nimport takeDownFormSaleGoods from \"@/components/m-take-down-sale-goods/index\"; //下架框\r\nimport setup from \"./product/popup/popup\";\r\n\r\nexport default {\r\n  components: {\r\n    popups,\r\n    shares,\r\n    PromotionLayout,\r\n    PromotionDetailsLayout,\r\n    PromotionAssembleLayout,\r\n    PromotionAssembleListLayout,\r\n    PromotionCoupon,\r\n    GoodsIntro,\r\n    GoodsRecommend,\r\n    storeLayout,\r\n    Evaluation,\r\n    GoodsSwiper,\r\n    popupGoods,\r\n    popupAddress,\r\n    takeDownFormSaleGoods\r\n  },\r\n  data () {\r\n    return {\r\n      setup,\r\n      promotionShow: false, //弹窗开关\r\n      // #ifdef H5\r\n      navbarListX: 110, //导航栏列表栏x轴\r\n      navbarListY: 80, //导航栏列表栏y轴\r\n      // #endif\r\n      // #ifdef MP-WEIXIN\r\n      navbarListX: 100, //导航栏列表栏x轴\r\n      navbarListY: 140, //导航栏列表栏y轴\r\n      // #endif\r\n      // #ifdef APP-PLUS\r\n      navbarListX: 120, //导航栏列表栏x轴\r\n      navbarListY: 170, //导航栏列表栏y轴\r\n      // #endif\r\n      navbarListData: [\r\n        //导航栏列表栏数据\r\n        {\r\n          title: \"首页\",\r\n          icon: \"home-fill\",\r\n          ___type: \"other\",\r\n        },\r\n        {\r\n          title: \"购物车\",\r\n          icon: \"bag-fill\",\r\n          ___type: \"other\",\r\n        },\r\n        {\r\n          title: \"搜索\",\r\n          icon: \"search\",\r\n          ___type: \"category\",\r\n        },\r\n        {\r\n          title: \"个人中心\",\r\n          icon: \"account-fill\",\r\n          ___type: \"other\",\r\n        },\r\n      ],\r\n      popupsSwitch: false, //导航栏列表栏开关\r\n      enableShare: false,\r\n      selectedGoods: \"\", //选择的商品规格昵称\r\n      isGroup: false, // 是否是拼团活动\r\n      isSeckill: false, // 是否秒杀活动\r\n      pointDetail: \"\", // 是否是积分商品\r\n      assemble: \"\", //拼团的sku\r\n      navbarOnlyBack: {\r\n        background: \"transparent\",\r\n      },\r\n      navbar: {\r\n        background: \"#fff\",\r\n      },\r\n\r\n      productRefHeight: \"\",\r\n      header: {\r\n        top: 0,\r\n        height: 50,\r\n      },\r\n      goodsParams: [], // 商品参数\r\n      headerFlag: false, //顶部导航显示与否\r\n      headerList: [\r\n        //顶部导航文字按照规则来 详情全局搜索\r\n        {\r\n          text: \"商品\",\r\n          id: \"1\",\r\n        },\r\n        {\r\n          text: \"评价\",\r\n          id: \"2\",\r\n        },\r\n        {\r\n          text: \"详情\",\r\n          id: \"3\",\r\n        },\r\n        {\r\n          text: \"推荐\",\r\n          id: \"4\",\r\n        },\r\n      ],\r\n      tabScrollTop: null,\r\n      scrollArr: [],\r\n      scrollId: \"1\",\r\n      scrollFlag: true,\r\n      current: \"1\", //当前显示的轮播图页\r\n      goodsDetail: {}, //商品数据\r\n      goodsSpec: \"\", //规格数据\r\n      imgList: [], //轮播图数据\r\n      favorite: false, //收藏与否flag\r\n      recommendList: [], //推荐列表\r\n      // maskFlag: false, //模态显示与否\r\n      goodsInfo: false, //商品介绍弹窗\r\n      addressFlag: false, //配送地址弹窗\r\n      buyMask: false, //添加购物车直接购买，查看已选 弹窗\r\n      num: 1, //添加到购物车的数量\r\n      skuId: \"\", //\r\n      storeDetail: \"\", //店铺基本信息,\r\n      // 店铺信息\r\n      storeParams: {\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n      },\r\n\r\n      likeGoodsList: \"\", //相似商品列表\r\n      PromotionList: \"\", //活动,促销，列表\r\n      specList: [],\r\n      selectedSpec: [],\r\n      nums: 0,\r\n      delivery: \"\",\r\n\r\n      exchange: {},\r\n      productId: 0,\r\n\r\n      startTimer: false, //未开启 是false\r\n\r\n      routerVal: \"\",\r\n      IMLink: \"\", // IM地址\r\n      wholesaleList: [],\r\n      takeDownFromSale: false, // 下架销售状态\r\n    };\r\n  },\r\n\r\n  computed: {\r\n    // udesk IM \r\n    IM () {\r\n      return this.IMLink + this.storeDetail.merchantEuid;\r\n    },\r\n  },\r\n\r\n  watch: {\r\n    isGroup (val) {\r\n      if (val) {\r\n        let timer = setInterval(() => {\r\n          this.$refs.popupGoods.buyType = \"PINTUAN\";\r\n          clearInterval(timer);\r\n        }, 100);\r\n      } else {\r\n        this.$refs.popupGoods.buyType = \"\";\r\n      }\r\n    },\r\n  },\r\n  mounted () {\r\n    const { windowHeight } = uni.getSystemInfoSync();\r\n    let bottomHeight = 0;\r\n    let topHeight = 0;\r\n    uni.getSystemInfo({\r\n      success: function (res) {\r\n        // res - 各种参数\r\n        let bottom = uni.createSelectorQuery().select(\".page-bottom\");\r\n        bottom\r\n          .boundingClientRect(function (data) {\r\n            if (data && data.height) {\r\n              //data - 各种参数\r\n              bottomHeight = data.height; // 获取元素宽度\r\n            }\r\n          })\r\n          .exec();\r\n        let top = uni.createSelectorQuery().select(\".header\");\r\n        top\r\n          .boundingClientRect(function (data) {\r\n            if (data && data.height) {\r\n              //data - 各种参数\r\n              topHeight = data.height; // 获取元素宽度\r\n            }\r\n          })\r\n          .exec();\r\n      },\r\n    });\r\n\r\n    this.productRefHeight = windowHeight - bottomHeight + \"px\";\r\n  },\r\n  async onLoad (options) {\r\n    this.routerVal = options;\r\n    // #ifdef MP-WEIXIN\r\n    // 小程序默认分享\r\n    uni.showShareMenu({\r\n      withShareTicket: true,\r\n      menus: [\"shareAppMessage\", \"shareTimeline\"],\r\n    });\r\n    // #endif\r\n  },\r\n  async onShow () {\r\n    this.goodsDetail = {};\r\n    //如果有参数ids说明事分销短连接，需要获取参数\r\n    if (this.routerVal.scene) {\r\n      getMpScene(this.routerVal.scene).then((res) => {\r\n        if (res.data.success) {\r\n          let data = res.data.result.split(\",\"); // skuId,goodsId,distributionId\r\n          this.init(data[0], data[1], data[2]);\r\n        }\r\n      });\r\n    } else {\r\n      this.init(this.routerVal.id, this.routerVal.goodsId, this.routerVal.distributionId);\r\n    }\r\n  },\r\n\r\n  methods: {\r\n    // 重新打开下架\r\n    reStartTakeDownSale(){\r\n      this.$refs.takeDownSale.show = true\r\n    },\r\n    share () {\r\n      return `/pages/product/goods?id=${this.routerVal.id}&goodsId=${this.routerVal.goodsId}`;\r\n    },\r\n    /**\r\n     * 导航栏列表栏\r\n     */\r\n    handleNavbarList (val) {\r\n      modelNavigateTo({ url: val });\r\n    },\r\n\r\n    /**\r\n     * 循环出当前促销是否为空\r\n     */\r\n    emptyPromotion () {\r\n      if (\r\n        this.PromotionList == \"\" ||\r\n        this.PromotionList == null ||\r\n        this.PromotionList == []\r\n      ) {\r\n        return true;\r\n      }\r\n    },\r\n    selectSku (idObj) {\r\n      this.init(idObj.skuId, idObj.goodsId);\r\n    },\r\n    /**\r\n     * 初始化信息\r\n     */\r\n    async init (id, goodsId, distributionId = \"\") {\r\n      this.isGroup = false; //初始化拼团\r\n      this.productId = id; // skuId\r\n      // 这里请求获取到页面数据  解析数据\r\n\r\n      let response = await getGoods(id || 'undefined', goodsId);\r\n      \r\n      // 判断当前接口返回内容 \r\n      if (!response.data.success) {\r\n        // 商品已下架\r\n        if(response.data.code == 11001){\r\n          this.takeDownFromSale = true\r\n        }\r\n        // setTimeout(() => {\r\n        //   uni.navigateBack();\r\n        // }, 500);\r\n      }\r\n      // 这里是绑定分销员\r\n      if ((distributionId || this.$store.state.distributionId) && this.$options.filters.isLogin(\"auth\")) {\r\n        let disResult = await getGoodsDistribution(distributionId);\r\n        if (!disResult.data.success || disResult.statusCode == 403) {\r\n          this.$store.state.distributionId = distributionId;\r\n        }\r\n      }\r\n      /**商品信息以及规格信息存储 */\r\n      this.goodsDetail = response.data.result.data;\r\n      this.wholesaleList = response.data.result.wholesaleList;\r\n      this.goodsSpec = response.data.result.specs;\r\n      this.PromotionList = response.data.result.promotionMap;\r\n      this.goodsParams = response.data.result.goodsParamsDTOList || [];\r\n\r\n      // 判断是否拼团活动或者积分商品 如果有则显示拼团活动信息\r\n      this.PromotionList &&\r\n        Object.keys(this.PromotionList).forEach((item) => {\r\n          // 拼团商品\r\n          if (item.indexOf(\"PINTUAN\") == 0) {\r\n            this.isGroup = true;\r\n          }\r\n\r\n          // 秒杀\r\n          if (item.indexOf(\"SECKILL\") == 0) {\r\n            this.isSeckill = true\r\n          }\r\n        });\r\n      // 轮播图\r\n      this.imgList = this.goodsDetail.goodsGalleryList.filter(i => i.indexOf(\"\\\"url\\\":\") === -1 && i.indexOf(\"\\\"status\\\":\") === -1);\r\n\r\n      // 获取店铺基本信息\r\n      this.getStoreBaseInfoFun(this.goodsDetail.storeId);\r\n\r\n      // 获取购物车\r\n      this.cartCount();\r\n\r\n      // 获取店铺推荐商品\r\n      this.getStoreRecommend();\r\n\r\n      // 获取商品列表\r\n      this.getOtherLikeGoods();\r\n      // 获取商品是否已被收藏 如果未登录不获取\r\n\r\n      if (this.$options.filters.isLogin(\"auth\")) {\r\n        this.getGoodsCollectionFun(this.goodsDetail.id);\r\n      }\r\n      // 获取IM 需要的话使用\r\n      // this.getIMDetailMethods();\r\n    },\r\n\r\n    async getIMDetailMethods () {\r\n      let res = await getIMDetail();\r\n      if (res.data.success) {\r\n        this.IMLink = res.data.result;\r\n      }\r\n    },\r\n\r\n    linkMsgDetail () {\r\n      // lili 基础客服\r\n      this.$options.filters.talkIm(this.goodsDetail.storeId, this.routerVal.goodsId, this.routerVal.id)\r\n      // uni.navigateTo({\r\n      //   url: `/pages/mine/im/index?userId=${this.goodsDetail.storeId}&goodsid=${this.routerVal.goodsId}&skuid=${this.routerVal.id}`\r\n      // });\r\n\r\n      // udesk 代码  \r\n      // if (this.storeDetail.merchantEuid) {\r\n      //   uni.navigateTo({\r\n      //     url: `/pages/tabbar/home/web-view?src=${this.IM}`,\r\n      //   });\r\n      // }\r\n\r\n\r\n      // 客服 云智服代码 \r\n      // // #ifdef MP-WEIXIN\r\n      // const params = {\r\n      //   storeName: this.storeDetail.storeName,\r\n      //   goodsName: this.goodsDetail.goodsName,\r\n      //   goodsId: this.goodsDetail.goodsId,\r\n      //   goodsImg: this.goodsDetail.thumbnail,\r\n      //   price: this.goodsDetail.promotionPrice || this.goodsDetail.price,\r\n      //   // originalPrice: this.goodsDetail.original || this.goodsDetail.price,\r\n      //   uuid: storage.getUuid(),\r\n      //   token: storage.getAccessToken(),\r\n      //   sign: this.storeDetail.yzfSign,\r\n      //   mpSign: this.storeDetail.yzfMpSign,\r\n      // };\r\n      // uni.navigateTo({\r\n      //   url:\r\n      //     \"/pages/product/customerservice/index?params=\" +\r\n      //     encodeURIComponent(JSON.stringify(params)),\r\n      // });\r\n      // // #endif\r\n      // // #ifndef MP-WEIXIN\r\n      // const sign = this.storeDetail.yzfSign;\r\n      // uni.navigateTo({\r\n      //   url:\r\n      //     \"/pages/tabbar/home/web-view?src=https://yzf.qq.com/xv/web/static/chat/index.html?sign=\" +\r\n      //     sign,\r\n      // });\r\n      // // #endif\r\n\r\n    },\r\n    /**选择商品 */\r\n    changedGoods (val) {\r\n      this.selectedGoods = val;\r\n    },\r\n\r\n    /**  点击子级地址回调参数*/\r\n    deliveryFun (val) {\r\n      this.delivery = val;\r\n    },\r\n    /**\r\n     * 地址子级关闭回调\r\n     */\r\n    closePopupAddress (val) {\r\n      this.addressFlag = val;\r\n      // this.maskFlag = false;\r\n    },\r\n    /**\r\n     * 商品规格子级关闭回调\r\n     */\r\n    closePopupBuy (val) {\r\n      this.buyMask = val;\r\n      // this.maskFlag = false;\r\n    },\r\n\r\n    /** 参与拼团  创建拼团 */\r\n    toAssembleBuyNow (order) {\r\n      this.shutMask(4, \"PINTUAN\", order);\r\n    },\r\n    /**\r\n     * 查看购物车\r\n     */\r\n    reluchToCart () {\r\n      let obj = {\r\n        from: \"product\",\r\n        id: this.productId,\r\n      };\r\n      storage.setCartBackbtn(obj);\r\n      uni.switchTab({\r\n        url: \"/pages/tabbar/cart/cartList\",\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 查询购物车总数量\r\n     */\r\n    cartCount () {\r\n      if (storage.getHasLogin()) {\r\n        API_trade.getCartNum().then((res) => {\r\n          this.nums = res.data.result;\r\n        });\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 返回\r\n     */\r\n    back () {\r\n      if (getCurrentPages().length == 1) {\r\n        uni.switchTab({\r\n          url: \"/pages/tabbar/home/index\",\r\n        });\r\n      } else {\r\n        uni.navigateBack();\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 获取店铺信息\r\n     */\r\n    getStoreBaseInfoFun (id) {\r\n      API_store.getStoreBaseInfo(id).then((res) => {\r\n        if (res.data.success) {\r\n          this.storeDetail = res.data.result;\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 删除收藏店铺\r\n     */\r\n    deleteGoodsCollectionFun (id) {\r\n      API_Members.deleteGoodsCollection(id).then((res) => {\r\n        if (res.statusCode == 200) {\r\n          uni.showToast({\r\n            title: \"商品已取消收藏!\",\r\n            icon: \"none\",\r\n          });\r\n          this.favorite = !this.favorite;\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获取商品是否已被收藏\r\n     */\r\n    getGoodsCollectionFun (goodsId) {\r\n      if (storage.getHasLogin()) {\r\n        API_Members.getGoodsIsCollect(\"GOODS\", goodsId).then((res) => {\r\n          this.favorite = res.data.result;\r\n        });\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 获取店铺推荐商品列表\r\n     */\r\n    getStoreRecommend () {\r\n      getGoodsList({\r\n        pageNumber: 1,\r\n        pageSize: 6,\r\n        storeId: this.goodsDetail.storeId,\r\n        recommend: true,\r\n      }).then((res) => {\r\n        this.recommendList = res.data.result.records;\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获取相似商品列表\r\n     *\r\n     */\r\n    getOtherLikeGoods () {\r\n      getGoodsList({\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n        currentGoodsId: this.goodsDetail.id,\r\n        keyword: this.goodsDetail.name\r\n      }).then((res) => {\r\n        this.likeGoodsList = res.data.result.records;\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 领取优惠券\r\n     */\r\n    receiveCouponsFun (id) {\r\n      API_Members.receiveCoupons(id).then((res) => {\r\n        uni.showToast({\r\n          title: res.data.message,\r\n          icon: \"none\",\r\n        });\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 跳转到店铺页面\r\n     */\r\n    navigateToStore (store_id) {\r\n      uni.navigateTo({\r\n        url: `/pages/product/shopPage?id=` + store_id,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获取优惠券按钮\r\n     */\r\n    getCoupon (item) {\r\n      this.receiveCouponsFun(item.id);\r\n    },\r\n\r\n    /**\r\n     * 规格弹窗开关\r\n     */\r\n    shutMask (flag, buyFlag, type) {\r\n      this.promotionShow = false;\r\n      this.buyMask = false;\r\n      this.addressFlag = false;\r\n      if (flag) {\r\n        switch (flag) {\r\n          case 1: //优惠券弹窗\r\n            this.promotionShow = true;\r\n\r\n            break;\r\n          case 3:\r\n            this.addressFlag = true;\r\n            break;\r\n          case 4: //添加购物车直接购买，查看已选 弹窗\r\n            // 判断是否是一个规格\r\n\r\n            this.buyMask = true;\r\n            if (buyFlag == \"PINTUAN\") {\r\n              if (type.orderSn) {\r\n                this.$refs.popupGoods.parentOrder = type;\r\n              }\r\n              this.$refs.popupGoods.buyType = \"PINTUAN\";\r\n            }\r\n            if (buyFlag == \"buy\") {\r\n              this.$refs.popupGoods.buyType = \"\";\r\n            }\r\n\r\n            break;\r\n        }\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 收藏\r\n     */\r\n    clickFavorite (id) {\r\n      if (this.favorite) {\r\n        // 取消收藏\r\n        this.deleteGoodsCollectionFun(id);\r\n        return false;\r\n      }\r\n      API_Members.collectionGoods(\"GOODS\", id).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            title: \"收藏成功!\",\r\n            icon: \"none\",\r\n          });\r\n        }\r\n      });\r\n      this.favorite = !this.favorite;\r\n    },\r\n\r\n    /**\r\n     * 顶部header显示或隐藏\r\n     */\r\n    pageScroll (e) {\r\n      if (this.scrollFlag) {\r\n        this.calcSize();\r\n      }\r\n      if (e.detail.scrollTop > 200) {\r\n        //当距离大于200时显示回到顶部按钮\r\n        this.headerFlag = true;\r\n      } else {\r\n        //当距离小于200时隐藏回到顶部按钮\r\n        this.headerFlag = false;\r\n      }\r\n      if (e.detail.scrollTop < this.scrollArr[0] - 10) {\r\n        this.scrollId = \"1\";\r\n      }\r\n      if (e.detail.scrollTop > this.scrollArr[1] - 10) {\r\n        this.scrollId = \"2\";\r\n      }\r\n      if (e.detail.scrollTop > this.scrollArr[2] - 10) {\r\n        this.scrollId = \"3\";\r\n      }\r\n      if (e.detail.scrollTop > this.scrollArr[3] - 10) {\r\n        this.scrollId = \"4\";\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 计算每个要跳转到的模块高度信息\r\n     */\r\n    calcSize () {\r\n      let h = 0;\r\n      let that = this;\r\n      let arr = [\r\n        \"main1\",\r\n        \"main2\",\r\n        \"main3\",\r\n        \"main4\",\r\n        \"main5\",\r\n        \"main6\",\r\n        \"main7\",\r\n        \"main8\",\r\n        \"main9\",\r\n        \"main10\",\r\n        \"main11\",\r\n      ];\r\n      arr.forEach((item) => {\r\n        let view = uni.createSelectorQuery().select(\"#\" + item);\r\n        view\r\n          .fields(\r\n            {\r\n              size: true,\r\n            },\r\n            (data) => {\r\n              if (\r\n                item === \"main1\" ||\r\n                item === \"main5\" ||\r\n                item === \"main9\" ||\r\n                item === \"main11\"\r\n              ) {\r\n                that.scrollArr.push(h);\r\n              }\r\n              if (data && data.height) {\r\n                h += data.height;\r\n              }\r\n            }\r\n          )\r\n          .exec();\r\n      });\r\n      this.scrollFlag = false;\r\n    },\r\n\r\n    /**\r\n     * 点击顶部跳转到对应位置\r\n     */\r\n    headerTab (id) {\r\n      if (this.scrollFlag) {\r\n        this.calcSize();\r\n      }\r\n      this.scrollId = id;\r\n\r\n      this.$nextTick(() => {\r\n        this.tabScrollTop = this.scrollArr[id - 1];\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 点击分享\r\n     */\r\n    async shareChange () {\r\n      this.enableShare = true;\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// #ifdef MP-WEIXIN\r\n@import \"./product/mp-goods.scss\";\r\n// #endif\r\n\r\n@import \"./product/style.scss\";\r\n@import \"./product/product.scss\";\r\n</style>\r\n"
  },
  {
    "path": "pages/product/licencePhoto.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <p>公司名称：{{storeData.companyName}}</p>\n    <p>公司地址：{{storeData.companyAddress}}</p>\n    <p>公司地址地区：{{storeData.companyAddressPath}}</p>\n    <p>员工人数：{{storeData.employeeNum}}</p>\n    <p>法定经营范围：{{storeData.scope}}</p>\n    <u-image @click=\"preview()\" width=\"100%\" height=\"400rpx\" mode=\"aspectFit\" :src=\"storeData.licencePhoto\"></u-image>\n  </div>\n</template>\n\n<script>\nimport { getLicencePhoto } from \"@/api/store.js\";\nexport default {\n  data() {\n    return {\n      storeData: {},\n    };\n  },\n  onLoad(options) {\n    this.getStoreLicencePhoto(options.id);\n  },\n  methods: {\n    async getStoreLicencePhoto(id) {\n      let res = await getLicencePhoto(id);\n      if (res.data.success) {\n        this.storeData = res.data.result;\n      }\n    },\n\n    /**\n     * 点击图片放大或保存\n     */\n    preview() {\n      uni.previewImage({\n        current: 0,\n        urls: [this.storeData.licencePhoto],\n        longPressActions: {\n          itemList: [\"保存图片\"],\n          success: function (data) {},\n          fail: function (err) {},\n        },\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.wrapper {\n  padding: 32rpx;\n  > p {\n    margin: 20rpx 0;\n  }\n}\n</style>"
  },
  {
    "path": "pages/product/product/evaluation/-evaluation.vue",
    "content": "<template>\n  <view class=\"evaluate-box\">\n    <view class=\"eva-section\" @click=\"toComment(goodsDetail.goodsId, goodsDetail.grade)\">\n      <view class=\"e-header\">\n\n        <view class=\"evaluate-title\">评价</view>\n        <text class=\"evaluate-num\">{{ commDetail.total || '0' }}+</text>\n        <text class=\"tip\">好评率 {{ grade || '100' }}%</text>\n      </view>\n      <div v-if=\"commDetail && commDetail.records && commDetail.records.length > 0\">\n        <view class=\"eva-box\" v-for=\"(commItem,commIndex) in commDetail.records.slice(0,2)\" :key=\"commIndex\">\n          <view class=\"section-info\">\n            <u-avatar mode=\"circle\" size=\"60\" class=\"portrait\" :src=\"commItem.memberProfile\"></u-avatar>\n            <view class=\"star-con\">\n              <text class=\"name\">{{ commItem.memberName | noPassByName }}</text>\n            </view>\n          </view>\n          <view class=\"section-contant\">\n            <u-read-more ref=\"uReadMore\" :color=\"lightColor\">\n              <rich-text @load=\"parseLoaded\" :nodes=\"commItem.content \" class=\"con\"></rich-text>\n            </u-read-more>\n            <scroll-view scroll-x class=\"scroll-x\" v-if=\"commItem.image\">\n              <view class=\"img\">\n                <u-image border-radius=\"12\" class=\"commImg\" width=\"160rpx\" height=\"160rpx\" v-for=\"(item, index) in commItem.image.split(',')\" :src=\"item\" :key=\"index\"\n                  @click.stop=\"previewImg(commItem.image, index)\"></u-image>\n              </view>\n            </scroll-view>\n            <view class=\"bot\">\n              <text class=\"attr\">{{ commItem.goodsName }}</text>\n            </view>\n          </view>\n        </view>\n      </div>\n\n      <div v-else class=\"goodsNoMore\">\n        <u-empty text=\"该商品暂无评论\" mode=\"message\"></u-empty>\n      </div>\n    </view>\n    <!-- 查看全部评价按钮 -->\n    <view v-if=\"commDetail && commDetail.records && commDetail.records.length > 0\" class=\"eva-section-btn\" @click=\"toComment(goodsDetail.goodsId, goodsDetail.grade)\">\n      <text>查看全部评价</text>\n    </view>\n  </view>\n</template>\n\n<script>\nimport * as API_Members from \"@/api/members.js\";\nexport default {\n  data() {\n    return {\n      lightColor: this.$lightColor,\n      // 评论集合\n      commDetail: [],\n      grade: \"\",\n      // 评论分页提交数据\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n        grade: \"\",\n      },\n    };\n  },\n  props: {\n    goodsDetail: {\n      default: {},\n      type: Object,\n    },\n  },\n\n  watch: {\n    goodsDetail: {\n      handler(val) {\n        this.grade = val.grade;\n        this.getGoodsCommentsMethods();\n      },\n      deep: true,\n      immediate: true,\n    },\n  },\n  mounted() {\n  \n  },\n  methods: {\n    parseLoaded() {\n      this.$refs.uReadMore.init();\n    },\n\n    // 获取商品评论\n    getGoodsCommentsMethods() {\n      API_Members.getGoodsComments(this.goodsDetail.goodsId, this.params).then(\n        (res) => {\n          this.commDetail = res.data.result;\n        }\n      );\n    },\n    toComment(id, grade) {\n      uni.navigateTo({\n        url: `/pages/product/comment?id=${id}&grade=${grade}`,\n      });\n    },\n    /**\n     * 点击图片放大或保存\n     */\n    previewImg(url, index) {\n      uni.previewImage({\n        urls: url,\n        indicator: \"number\",\n        current: index,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../product.scss\";\n.commImg {\n  margin-right: 12rpx;\n  margin-bottom: 10rpx;\n  display: inline-block;\n}\n.name {\n  color: #262626;\n  font-size: 22rpx;\n}\n.eva-section-btn {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 40rpx 40rpx 50rpx;\n  margin: 2px 0 20rpx 0;\n  background: #fff;\n\n  text {\n    width: 200rpx;\n    height: 50rpx;\n    font-size: 22rpx;\n    line-height: 46rpx;\n    text-align: center;\n    color: #262626;\n    border: 2rpx solid #ededed;\n    box-sizing: border-box;\n    border-radius: 30px;\n  }\n}\n\n.goodsNoMore {\n  padding: 20rpx 0;\n  text-align: center;\n  color: $u-tips-color;\n}\n/* 评价 */\n.eva-section {\n  display: flex;\n  flex-direction: column;\n\n  background: #fff;\n\n  .e-header {\n    display: flex;\n    align-items: baseline;\n\n    font-size: $font-sm + 2rpx;\n    color: $font-color-light;\n    > .evaluate-num {\n      margin-left: 10rpx;\n      font-size: 24rpx;\n      color: #333;\n    }\n    .tit {\n      font-size: 32rpx;\n      color: $font-color-dark;\n      font-weight: 500;\n      margin: 0 4rpx;\n    }\n\n    .tip {\n      flex: 1;\n      text-align: right;\n      color: #8c8c8c;\n      font-size: 24rpx;\n    }\n\n    .icon-you {\n      margin-left: 10rpx;\n    }\n  }\n}\n.scroll-x {\n  white-space: nowrap;\n  -webkit-overflow-scrolling: touch;\n\n  overflow-x: auto;\n}\n.eva-box {\n  padding: 36rpx 0 30rpx 0;\n  border-bottom: 2rpx solid #f2f2f2;\n  .section-info {\n    display: flex;\n    align-items: center;\n\n    .portrait {\n      flex-shrink: 0;\n      width: 80rpx;\n      height: 80rpx;\n      border-radius: 100px;\n      margin-right: 20rpx;\n    }\n\n    > view > text {\n      margin-left: 6rpx;\n    }\n  }\n\n  .section-contant {\n    display: flex;\n    flex-direction: column;\n\n    .con {\n      font-size: 26rpx;\n      line-height: 46rpx;\n      color: $font-color-dark;\n      color: #333;\n      padding: 20rpx 0;\n    }\n    .bot {\n      display: flex;\n      justify-content: space-between;\n      font-size: 22rpx;\n      color: #999;\n      margin-top: 20rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/product/product/goods/-goods-desc.vue",
    "content": "<template>\n    \n</template>\n\n<script>\nexport default {\n    \n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>"
  },
  {
    "path": "pages/product/product/goods/-goods-intro.vue",
    "content": "<template>\n  <div>\n    <view class=\"detail-box\">\n      <view class=\"goods-detail\">\n        <view class=\"detail_padding\">\n          <div class=\"goods-detail-box\">\n            <div class=\"goods-detail-item goods-active\">商品介绍</div>\n          </div>\n          <u-empty\n            class=\"empty\"\n            text=\"暂无商品介绍\"\n            mode=\"data\"\n            v-if=\"!res.mobileIntro\"\n          ></u-empty>\n          <u-parse\n            class=\"vhtml\"\n            :lazy-load=\"true\"\n            :use-cache=\"true\"\n            :show-with-animation=\"true\"\n            :html=\"res.mobileIntro\"\n            :tag-style=\"style\"\n          ></u-parse>\n        </view>\n      </view>\n    </view>\n\n    <view class=\"detail-box\">\n      <view class=\"goods-detail\">\n        <view class=\"detail_padding\">\n          <div class=\"goods-detail-box\">\n            <div class=\"goods-detail-item goods-active\">商品参数</div>\n          </div>\n          <!-- <u-divider>商品参数</u-divider> -->\n          <div class=\"param-list\" v-if=\"goodsParams.length == 0\">\n            <u-empty text=\"暂无商品参数\" mode=\"list\"></u-empty>\n          </div>\n          <div\n            class=\"params-group\"\n            v-for=\"(group, groupIndex) in goodsParams\"\n            :key=\"groupIndex\"\n          >\n            <view style=\"font-weight: bold; margin-left: 10px\">{{\n              group.groupName\n            }}</view>\n            <div class=\"param-list\">\n              <div\n                class=\"param-item\"\n                v-for=\"(param, index) in group.goodsParamsItemDTOList\"\n                :key=\"index\"\n              >\n                <div class=\"param-left\">{{ param.paramName }}</div>\n                <div class=\"param-right\">{{ param.paramValue }}</div>\n              </div>\n            </div>\n          </div>\n        </view>\n      </view>\n    </view>\n  </div>\n</template>\n\n<script>\nimport { getGoodsMessage } from \"@/api/goods\";\nexport default {\n  data() {\n    return {\n      goodsDetail: \"\",\n      style: {\n        img:\"display:block\"\n\t\t\t}\n    };\n  },\n  props: [\"res\", \"goodsId\", \"goodsParams\"],\n  async mounted() {\n    let res = await getGoodsMessage(this.goodsId);\n    if (res.data.success) {\n      this.goodsDetail = res.data.result;\n    }\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../product.scss\";\n.param-list {\n  padding: 40rpx 0 80rpx 0;\n}\n.param-item {\n  display: flex;\n  justify-content: center;\n  border-bottom: none;\n\n  > .param-left,\n  > .param-right {\n    padding: 16rpx 0;\n    font-size: 24rpx;\n    color: #666;\n    border: 1px solid rgb(220, 223, 230);\n    border-bottom: none;\n  }\n  > .param-left {\n    text-align: center;\n    border-right: none;\n    flex: 3;\n  }\n\n  > .param-right {\n    padding: 0 10rpx;\n    align-items: center;\n    display: flex;\n    flex: 7;\n  }\n}\n.param-item:nth-last-of-type(1) {\n  > .param-left,\n  > .param-right {\n    border-bottom: 1px solid rgb(220, 223, 230);\n  }\n}\n.empty {\n  margin: 40rpx 0;\n}\n.goods-detail /deep/ .vhtml {\n  overflow: hidden;\n\n  width: 100%;\n}\n.vhtml {\n  /deep/ img {\n    display: block !important;\n  }\n}\n\n/deep/ img {\n  width: 100%;\n}\n.goods-detail-box {\n  display: flex;\n  justify-content: space-between;\n  // padding: 0 80rpx;\n  height: 120rpx;\n  line-height: 120rpx;\n  > .goods-active {\n    font-weight: 700;\n    &::before {\n      position: absolute;\n      left: 50%;\n      bottom: 15px;\n      -webkit-transform: translateX(-50%);\n      transform: translateX(-50%);\n      content: \"\";\n      display: block;\n      width: 52rpx;\n      height: 6rpx;\n\n      background-image: linear-gradient(90deg, $price-color, $price-light-color);\n    }\n  }\n  > .goods-detail-item {\n    color: #262626;\n    position: relative;\n  }\n}\n.detail_padding {\n}\n</style>\n"
  },
  {
    "path": "pages/product/product/goods/-goods-recommend.vue",
    "content": "<template>\r\n  <view class=\"recommend-box\" >\r\n    <h4 class=\"goods-recommend-title\">热门商品</h4>\r\n\t\t<goodsList :res='res' v-if=\"res\" :storeName=\"false\" />\r\n\t </view>\r\n</template>\r\n\r\n<script>\r\nimport goodsList from '@/components/m-goods-list/list.vue'\r\nexport default {\r\n  props: [\"res\"],\r\n\tcomponents:{goodsList},\r\n  methods: {\r\n    }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../product.scss\";\r\n</style>\r\n"
  },
  {
    "path": "pages/product/product/goods/-goods-swiper.vue",
    "content": "<template>\n  <!-- 轮播图 -->\n  <view class=\"carousel\">\n\n    <swiper circular=\"true\" duration=\"400\" @change=\"swiperChange\">\n      <swiper-item v-if='video'>\n        <!-- #ifndef APP-PLUS -->\n        <video class=\"video\" show-mute-btn style=\"width:100%; height:100%;\" muted autoplay :src='video' loop\n          object-fit=\"cover\"></video>\n        <!-- #endif -->\n        <!-- #ifdef APP-PLUS -->\n        <view style=\"width:100%; height:100%;\">\n          <!-- <video class=\"video\" show-mute-btn style=\"width:100%; height:100%;\" muted autoplay :src='video' loop\n              object-fit=\"cover\"></video> -->\n          <view v-html=\"html\" style=\"width:100%; height:100%;\"></view>\n        </view>\n        <!-- #endif -->\n\n      </swiper-item>\n      <swiper-item class=\"swiper-item\" v-for=\"(item, index) in res\" :key=\"index\">\n\n        <view class=\"image-wrapper\">\n          <u-image :src=\"item\" mode=\"aspectFit\" class=\"loaded\" width=\"100%\" height=\"100%\">\n            <u-loading slot=\"loading\"></u-loading>\n          </u-image>\n        </view>\n      </swiper-item>\n    </swiper>\n    <view class=\"swiper-dots\">{{ current }}/{{ video ? res.length + 1 : res.length }}</view>\n  </view>\n</template>\n<script>\nexport default {\n  data() {\n    return {\n      current: 1,\n      html: \"\"\n    };\n  },\n  props: [\"res\", 'video'],\n  watch: {\n    video(val) {\n      this.html = '<video muted=\"muted\"   ref=\"videoPlay\" style=\"width:100%; height:100%;\" src=' + val + '  page-gesture show-mute-btn   autoplay  webkit-playsinline=\"\" playsinline=\"\" ></video>'\n    }\n  },\n  methods: {\n    // 轮播图对应的dot\n    swiperChange(e) {\n      this.current = e.detail.current + 1;\n    },\n  },\n  mounted() {\n    console.log(this.video)\n  }\n};\n</script>\n<style lang=\"scss\" scoped>\n.carousel {\n  // #ifdef MP-WEIXIN\n  margin-top: 44px;\n  // #endif\n  width: 750rpx;\n  height: 750rpx;\n  position: relative;\n\n  swiper {\n    height: 100%;\n  }\n\n  .image-wrapper {\n    width: 100%;\n    height: 100%;\n  }\n\n  .swiper-item {\n    display: flex;\n    justify-content: center;\n    align-content: center;\n    height: 750rpx;\n    overflow: hidden;\n\n    image {\n      width: 100%;\n      height: 100%;\n    }\n  }\n\n  position: relative;\n\n  .swiper-dots {\n    position: absolute;\n    right: 0rpx;\n    bottom: 40rpx;\n    font-size: 32rpx;\n    width: 107rpx;\n    height: 44rpx;\n    line-height: 44rpx;\n    text-align: center;\n    border-radius: 30rpx 0rpx 0rpx 30rpx;\n    background: #333333;\n    opacity: 0.4;\n    font-weight: 400;\n    color: #fff;\n  }\n}\n\n/deep/ .image-wrapper image {\n  opacity: 1 !important;\n}\n\n.video {\n  width: 100%;\n  height: 100%;\n}\n</style>\n"
  },
  {
    "path": "pages/product/product/mp-goods.scss",
    "content": "\n.showBack {\n    \n    margin-top: calc( var(--status-bar-height) + 20px ) !important;\n   \n}"
  },
  {
    "path": "pages/product/product/popup/address.vue",
    "content": "<template>\n  <u-popup class=\"popup\" v-model=\"addressFlag\" :height=\"setup.height\" :mode=\"setup.mode\" :border-radius=\"setup.radius\" @close=\"closeAddress()\"   closeable>\n    <view class=\"header-title\">选择地址</view>\n    <view class=\"view-box\" v-if=\"addressDetail\">\n      <view class=\"view-item\" v-for=\"(item, index) in addressDetail\" :key=\"index\" @click=\"clickAddress(item)\">\n        <view class=\"view-box-checkbox\">\n          <view class=\"checkbox\" :class=\"{ checked: item.isDefault }\">\n            <u-icon v-if=\"item.isDefault\" :class=\"{ active: item.isDefault }\" name=\"checkmark\" size=\"12\"></u-icon>\n          </view>\n        </view>\n        <view class=\"view-box-dress\" :class=\"{ 'box-dress-blod': item.isDefault }\">{{ item.consigneeAddressPath | clearStrComma }}</view>\n      </view>\n    </view>\n    <view class=\"view-box\" v-else>\n      <view class=\"noMore\">\n        <u-empty text=\"暂无收货地址\" mode=\"address\"></u-empty>\n      </view>\n    </view>\n\n    <!-- 按钮 -->\n\n    <view class=\"btns\">\n      <view class=\"box-btn light\" @click=\"getpicker\">选择其他地址</view>\n      <view class=\"box-btn\" @click=\"closeAddress()\">确定</view>\n    </view>\n    <m-city :provinceData=\"cityList\" headTitle=\"区域选择\" ref=\"cityPicker\"  pickerSize=\"4\"></m-city>\n  </u-popup>\n</template>\n<script>\nimport setup from \"@/components/m-buy/popup.js\";\n/************请求存储***************/\n\nimport * as API_Address from \"@/api/address.js\";\nexport default {\n  data() {\n    return {\n      checked: \"\",\n      setup,\n      addressDetail: \"\",\n      cityList: [\n        {\n          id: \"\",\n          localName: \"请选择\",\n          children: [],\n        },\n      ],\n    };\n  },\n  filters: {},\n  watch: {},\n  mounted() {\n    this.addressFlag = false;\n    if( this.$options.filters.isLogin(\"auth\") ){\n      this.getShippingAddress()\n    }\n    else{\n      uni.navigateTo({\n         url: 'pages/passport/login'\n      });\n    }\n \n  },\n  props: [\"goodsId\", \"addressFlag\"],\n\n  methods: {\n    /**关闭地址 */\n    closeAddress() {\n      this.$emit(\"closeAddress\", false);\n      this.$emit(\"deliveryData\", this.checked);\n    },\n\n    getpicker() {\n      // this.$refs.cityPicker.show();\n      uni.navigateTo({\n        url: \"/pages/mine/address/add\",\n      });\n      this.closeAddress();\n    },\n\n    /**获取地址 */\n    getShippingAddress() {\n      if (this.$options.filters.isLogin(\"auth\")) {\n        API_Address.getAddressList(1, 50).then((res) => {\n          if (res.data.success) {\n            this.addressDetail = res.data.result.records;\n            let addr = res.data.result.records.filter((item) => {\n              return item.isDefault == 1;\n            });\n\n            if (addr[0]) {\n              this.checked = addr[0];\n              this.$emit(\"deliveryData\", this.checked);\n            }\n            // addr[0] ? \"\" : (addr = res.data);\n\n            // /**获取默认地址是否有货 */\n            // this.clickAddress(addr[0]);\n          }\n        });\n      }\n    },\n\n    /**点击地址返回父级商品状态 */\n    clickAddress(val) {\n      this.checked = val;\n\n      this.addressDetail.forEach((item) => {\n        item.isDefault = false;\n      });\n      val.isDefault = !val.isDefault;\n      this.$emit(\"deliveryData\", this.checked);\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.light {\n  background-image: linear-gradient(\n    135deg,\n    #ffba0d,\n    #ffc30d 69%,\n    #ffcf0d\n  ) !important;\n  box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);\n}\n.noMore {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.view-item {\n  display: flex;\n  align-items: center;\n  padding: 22rpx 0;\n}\n.view-box-dress {\n  letter-spacing: 1rpx;\n  margin-left: 20rpx;\n  line-height: 42rpx;\n  color: #333;\n  font-size: 28rpx;\n}\n.checked {\n  background: $price-color;\n}\n.active {\n  color: #fff;\n}\n.checkbox {\n  text-align: center;\n  line-height: 40rpx;\n  width: 40rpx;\n  height: 40rpx;\n  border-radius: 50%;\n  border: 2rpx solid #ededed;\n}\n@import \"@/components/m-buy/popup.scss\";\n.view-box {\n  height: 810rpx;\n  // #ifdef MP-WEIXIN\n  height: 770rpx;\n  // #endif\n  padding: 0 20rpx;\n  overflow-y: auto;\n}\n.header-title {\n  font-weight: bold;\n  color: #333;\n  text-align: center;\n  height: 90rpx;\n  line-height: 90rpx;\n  font-size: 34rpx;\n}\n</style>"
  },
  {
    "path": "pages/product/product/popup/popup.js",
    "content": "\n\nexport default {\n    height:\"1000rpx\", //弹出层高度\n    mode:\"bottom\", //弹出层位置\n    radius:\"32\", //圆角 rpx,\n    close:true //能否点击遮罩退出\n}"
  },
  {
    "path": "pages/product/product/product.scss",
    "content": ".recommend-box,\n.detail-box,\n.store-recommend,\n.store-info,\n.evaluate-box,\n.card-box,\n.group-list {\n  border-radius: 32rpx;\n  padding: 0rpx 32rpx 0 32rpx;\n  background: #fff;\n  overflow: hidden;\n  margin: 20rpx 0;\n}\n.goods-recommend-title,\n.store-recommend-title,\n.evaluate-title,\n.group-name {\n  color: #262626;\n  font-size: 30rpx;\n  font-weight: 700;\n  height: 90rpx;\n  line-height: 90rpx;\n  padding-left: 14rpx;\n  position: relative;\n  &::before {\n    background-image: linear-gradient(180deg, $price-color, $price-light-color);\n    content: \"\";\n    position: absolute;\n    left: 0;\n    top: 50%;\n    -webkit-transform: translateY(-50%);\n    transform: translateY(-50%);\n    width: 3px;\n    height: 15px;\n  }\n}\n.scroll_mask {\n  height: 868rpx;\n  // padding-bottom: 100rpx;\n  overflow-y: auto;\n}\n\n.mask {\n  height: 600px;\n}\n.card-box {\n  padding-top: 0 !important;\n}\n.card-content {\n  padding: 0 40rpx;\n  flex: 8;\n}\n.card-flex {\n  display: flex;\n  align-items: center;\n  font-size: 26rpx;\n  padding: 36rpx 0;\n  border-bottom: 2rpx solid #f9f9f9;\n}\n.card-title {\n  flex: 1;\n  color: #262626;\n  font-weight: 700;\n}\n\n.down-goods{\n  font-size: 50rpx !important;\n}\n"
  },
  {
    "path": "pages/product/product/promotion/-promotion-assemble-list.vue",
    "content": "<template>\r\n  <view class=\"group-list\">\r\n    <view class=\"group-name\">拼购列表</view>\r\n    <view v-if=\"assembleOrder.length != 0\">\r\n      <view class=\"group-item\" v-for=\"(order, index) in assembleOrder\" :key=\"index\">\r\n        <view class=\"group-item-user\">\r\n          <u-image shape=\"circle\" width=\"40px\" height=\"40px\" :src=\"order.face || userImage\"></u-image>\r\n          <span class=\"group-item-name\">{{ order.nickName | noPassByName }}</span>\r\n        </view>\r\n        <view>\r\n          <span class=\"group-item-name\">还差{{ order.toBeGroupedNum }}人成团</span>\r\n        </view>\r\n        <view>\r\n          <u-button size=\"mini\" :custom-style=\"customStyle\" @click=\"buy(order)\"\r\n            >去参团</u-button\r\n          >\r\n        </view>\r\n      </view>\r\n    </view>\r\n    <view v-else class=\"nomore\">\r\n      <u-empty text=\"暂无拼团信息\" mode=\"list\"></u-empty>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport * as API_Promotions from \"@/api/promotions\";\r\nimport configs from '@/config/config'\r\nexport default {\r\n  data() {\r\n    return {\r\n      configs,\r\n      userImage:configs.defaultUserPhoto,\r\n\r\n      customStyle: {\r\n        background: this.$lightColor,\r\n        color: \"#fff\",\r\n      },\r\n      /** 待成团订单 */\r\n      assembleOrder: \"\",\r\n\r\n      /** 查看更多待成团订单 */\r\n      assembleOrderAll: \"\",\r\n    };\r\n  },\r\n  props: [\"res\"],\r\n\r\n  watch: {\r\n    res: {\r\n      handler() {\r\n        if (this.res && this.res.length != 0) {\r\n          Object.keys(this.res).forEach((item) => {\r\n            let key = item.split(\"-\");\r\n            if (key && key[0] == \"PINTUAN\") {\r\n              this.getAssembleInfo(item);\r\n            }\r\n          });\r\n        }\r\n      },\r\n      immediate: true,\r\n    },\r\n\r\n    // assembleOrder(val) {\r\n    //   this.$emit(\"assembleOrder\", val);\r\n    // },\r\n  },\r\n  computed: {},\r\n  mounted() {},\r\n  methods: {\r\n    // 获取此商品所有待成团的订单\r\n    getAssembleInfo(val) {\r\n      let id = this.res[val].id;\r\n      API_Promotions.getPromotionGroupMember(id).then((res) => {\r\n        if (res.data.success) {\r\n          console.warn(res.data.result);\r\n          this.assembleOrder = res.data.result;\r\n        }\r\n      });\r\n    },\r\n\r\n    buy(order) {\r\n      this.$emit(\"to-assemble-buy-now\", order);\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../product.scss\";\r\n.nomore {\r\n  padding: 10rpx 0;\r\n}\r\n\r\n.group-item {\r\n  margin: 30rpx 0;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n}\r\n\r\n.group-item-user {\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.group-item-name {\r\n  margin-left: 23rpx;\r\n  font-size: 24rpx;\r\n  color: #999999;\r\n  font-weight: 400;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/product/promotion/-promotion-assemble-promotions.vue",
    "content": "<template>\r\n  <view>\r\n    <div v-for=\"(promotion, promotion_index) in res\" :key=\"promotion_index\">\r\n      <div\r\n        class=\"showBox\"\r\n        v-if=\"\r\n          promotion.__key == 'SECKILL' ||\r\n          promotion.__key == 'GROUPBUY' ||\r\n          promotion.__key == 'PINTUAN'\r\n        \"\r\n      >\r\n        <view class=\"group-wrapper\">\r\n          <div class=\"u-group-row\">\r\n            <view :span=\"8\" class=\"showBox_L\">\r\n              <view class=\"u-group-flex\">\r\n                <!-- 限时抢购 -->\r\n                <view class=\"u-group-flex-left\" v-if=\"promotion.__key == 'SECKILL'\">\r\n                  <span\r\n                    class=\"u-group-flex-left-span\"\r\n                    v-if=\"detail.promotionPrice != undefined\"\r\n                  >\r\n                    ￥\r\n                    <span class=\"flex-price\">\r\n                      {{ $options.filters.goodsFormatPrice(detail.promotionPrice)[0] }}.{{\r\n                        $options.filters.goodsFormatPrice(detail.promotionPrice)[1]\r\n                      }}</span\r\n                    >\r\n                  </span>\r\n                  <view class=\"u-group-flex\" v-if=\"detail.price != undefined\">\r\n                    <span class=\"old-price\"\r\n                      >￥{{ $options.filters.goodsFormatPrice(detail.price)[0] }}.{{\r\n                        $options.filters.goodsFormatPrice(detail.price)[1]\r\n                      }}</span\r\n                    >\r\n                    <view class=\"promotion\">限时抢购</view>\r\n                  </view>\r\n                </view>\r\n\r\n                <!-- 团购 -->\r\n                <view class=\"u-group-flex-left\" v-if=\"promotion.__key == 'GROUPBUY'\">\r\n                  <span class=\"u-group-flex-left-span\">\r\n                    <span\r\n                      class=\"flex-price\"\r\n                      v-if=\"promotion.groupbuy_goods_vo.price != undefined\"\r\n                      >￥{{ $options.filters.goodsFormatPrice(promotion.groupbuy_goods_vo.price)[0] }}.{{\r\n                        $options.filters.goodsFormatPrice(promotion.groupbuy_goods_vo.price)[1]\r\n                      }}</span\r\n                    >\r\n                    <!-- <span v-if=\"promotion.point\">+{{promotion.point}}积分</span> -->\r\n                  </span>\r\n                  <view class=\"u-group-flex\">\r\n                    <span\r\n                      class=\"old-price\"\r\n                      v-if=\"promotion.groupbuy_goods_vo.original_price != undefined\"\r\n                      >￥{{\r\n                        $options.filters.goodsFormatPrice(promotion.groupbuy_goods_vo.original_price)[0]\r\n                      }}.{{\r\n                        $options.filters.goodsFormatPrice(promotion.groupbuy_goods_vo.original_price)[1]\r\n                      }}</span\r\n                    >\r\n                    <view class=\"promotion\">团购活动</view>\r\n                  </view>\r\n                </view>\r\n\r\n                <view class=\"u-group-flex-left\" v-if=\"promotion.__key == 'PINTUAN'\">\r\n                  <span\r\n                    class=\"u-group-flex-left-span\"\r\n                    v-if=\"detail.promotionPrice != undefined\"\r\n                  >\r\n                    ￥<span class=\"flex-price\">\r\n                      {{ $options.filters.goodsFormatPrice(detail.promotionPrice)[0] }}.</span\r\n                    >{{ $options.filters.goodsFormatPrice(detail.promotionPrice)[1] }}\r\n                  </span>\r\n                  <view class=\"u-group-flex\" v-if=\"detail.price != undefined\">\r\n                    <span class=\"old-price\"\r\n                      >￥{{ $options.filters.goodsFormatPrice(detail.price)[0] }}.{{\r\n                        $options.filters.goodsFormatPrice(detail.price)[1]\r\n                      }}</span\r\n                    >\r\n                    <view class=\"promotion\">拼团活动</view>\r\n                  </view>\r\n                </view>\r\n                <!--  拼团右侧 -->\r\n                <view class=\"u-group-flex-right\" v-if=\"promotion.__key == 'PINTUAN'\">\r\n                  <span class=\"group-bag\">{{ promotion.requiredNum }}人拼团 </span>\r\n                  <span class=\"group-bag\">限购{{ promotion.limitNum }}件</span>\r\n                </view>\r\n              </view>\r\n            </view>\r\n            <view class=\"showBox_R\" v-if=\"promotion && promotion.endTime\">\r\n              <u-tag :text=\"getIsTimer(promotion)\" size=\"mini\" type=\"error\" />\r\n              <u-count-down\r\n                :hide-zero-day=\"true\"\r\n                font-size=\"25\"\r\n                color=\"#fff\"\r\n                bg-color=\"#f71471\"\r\n                separator-size=\"25\"\r\n                separator-color=\"#f71471\"\r\n                :show-hours=\"true\"\r\n                :show-minutes=\"true\"\r\n                :timestamp=\"getCountDownTime(promotion.endTime)\"\r\n              ></u-count-down>\r\n            </view>\r\n          </div>\r\n        </view>\r\n      </div>\r\n    </div>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  data() {\r\n    return {};\r\n  },\r\n  props: {\r\n    // 活动，促销数据\r\n    res: {\r\n      type: null,\r\n      default: {},\r\n    },\r\n    // 商品详情\r\n    detail: {\r\n      type: null,\r\n      default: {},\r\n    },\r\n  },\r\n  watch: {\r\n    res: {\r\n      handler() {\r\n        if (this.res && this.res.length != 0) {\r\n          Object.keys(this.res).forEach((item) => {\r\n            let key = item.split(\"-\")[0];\r\n            this.res[item].__key = key;\r\n            // 针对现实向\r\n          });\r\n        }\r\n      },\r\n      immediate: true,\r\n    },\r\n  },\r\n  mounted() {},\r\n  methods: {\r\n    getCountDownTime(val) {\r\n      let date = new Date(val);\r\n      let timeSimple = new Date(date).getTime() / 1000;\r\n      return timeSimple - new Date().getTime() / 1000;\r\n    },\r\n    getIsTimer(val) {\r\n      var timestamp = new Date().getTime();\r\n\r\n      if (timestamp < val.start_time) {\r\n        this.startTimer = true;\r\n        return \"距离活动开始\";\r\n      } else {\r\n        return \"距离活动结束\";\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"./group.scss\";\r\n</style>\r\n"
  },
  {
    "path": "pages/product/product/promotion/-promotion-coupon.vue",
    "content": "<template>\r\n\t<view class=\"wrapper\">\r\n\t\t<div class=\"coupon-empty\" v-if=\"!res\">暂无优惠券</div>\r\n\t\t<view class=\"coupon-List\" v-for=\"(item, index) in couponRes\" :key=\"index\">\r\n\t\t\t<view class=\"coupon-item\">\r\n\t\t\t\t<view class=\"top\">\r\n\t\t\t\t\t<div class=\"price\">\r\n\t\t\t\t\t\t<span v-if=\"item.couponType == 'DISCOUNT'\">{{ item.couponDiscount }}折</span>\r\n\t\t\t\t\t\t<span v-if=\"item.couponType == 'PRICE'\">￥{{ item.price | unitPrice }}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<view class=\"text\">\r\n\t\t\t\t\t\t<div class=\"coupon-List-title\">\r\n\t\t\t\t\t\t\t<view v-if=\"item.scopeType\">\r\n\t\t\t\t\t\t\t\t<span v-if=\"item.scopeType == 'ALL' && item.storeId == '0'\">全平台</span>\r\n\t\t\t\t\t\t\t\t<span v-if=\"item.scopeType == 'PORTION_GOODS_CATEGORY'\">仅限品类</span>\r\n\t\t\t\t\t\t\t\t<view v-else>{{\r\n                         item.storeName == \"platform\" ? \"全平台\" : item.storeName + \"店铺\"\r\n                       }}使用</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div>满{{ item.consumeThreshold | unitPrice }}可用</div>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"lingqu-btn\" @click=\"getCoupon(item, index)\">\r\n\t\t\t\t\t\t<div :class=\"yhqFlag[index] ? 'cur' : ''\">\r\n\t\t\t\t\t\t\t{{ yhqFlag[index] ? \"已领取或领完\" : \"立即领取\" }}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"line\"></view>\r\n\t\t\t\t<view class=\"time\">{{ item.startTime / 1000 | unixToDate }} - {{ item.endTime / 1000 | unixToDate }}</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tyhqFlag: [], //获取优惠券判断是否点击\r\n\t\t\t\tcouponRes: [],\r\n\t\t\t};\r\n\t\t},\r\n\t\tprops: {\r\n\t\t\tres: {\r\n\t\t\t\ttype: null,\r\n\t\t\t\tdefault: \"\",\r\n\t\t\t},\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tres: {\r\n\t\t\t\thandler() {\r\n\t\t\t\t\tif (this.res && this.res.length != 0) {\r\n\t\t\t\t\t\tObject.keys(this.res).forEach((item) => {\r\n\t\t\t\t\t\t\tlet key = item.split(\"-\")[0];\r\n\t\t\t\t\t\t\tif (key === \"COUPON\") {\r\n\t\t\t\t\t\t\t\tthis.couponRes.push(this?.res[item]);\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\timmediate: true,\r\n\t\t\t},\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 提交优惠券\r\n\t\t\tgetCoupon(item, index) {\r\n\t\t\t\tthis.yhqFlag[index] = true;\r\n\t\t\t\tthis.$emit(\"getCoupon\", item);\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t.coupon-item {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n\r\n\t.coupon-List {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\theight: 230rpx;\r\n\t\tbackground: #e9ebfb;\r\n\t\tmargin: 30rpx 0;\r\n\t\tpadding: 10rpx 30rpx;\r\n\r\n\t\t.line {\r\n\t\t\theight: 1px;\r\n\t\t\tbackground: #fff;\r\n\t\t\tmargin: 0 20rpx;\r\n\t\t\tposition: relative;\r\n\r\n\t\t\t&:before,\r\n\t\t\t&:after {\r\n\t\t\t\tcontent: \"\";\r\n\t\t\t\tdisplay: block;\r\n\t\t\t\twidth: 15rpx;\r\n\t\t\t\theight: 30rpx;\r\n\t\t\t\tbackground: #fff;\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\ttop: -15rpx;\r\n\t\t\t}\r\n\r\n\t\t\t&:before {\r\n\t\t\t\tleft: -50rpx;\r\n\t\t\t}\r\n\r\n\t\t\t&:after {\r\n\t\t\t\tright: -50rpx;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.time {\r\n\t\t\tflex: 1;\r\n\t\t\tfont-size: 24rpx;\r\n\t\t\talign-items: center;\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t}\r\n\t}\r\n\r\n\t.top {\r\n\t\theight: 140rpx;\r\n\t\tdisplay: flex;\r\n\r\n\t\t.price {\r\n\t\t\twidth: 33%;\r\n\t\t\tjustify-content: center;\r\n\t\t\tcolor: #6772e5;\r\n\t\t\tfont-size: 40rpx;\r\n\t\t\tdisplay: flex;\r\n\r\n\t\t\theight: 100%;\r\n\t\t\talign-items: center;\r\n\r\n\t\t\tspan {\r\n\t\t\t\tfont-size: 50rpx;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.text {\r\n\t\t\twidth: 33%;\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-direction: column;\r\n\t\t\tjustify-content: center;\r\n\t\t\tfont-size: 26rpx;\r\n\t\t\tcolor: 333;\r\n\t\t\tmargin-left: 40rpx;\r\n\r\n\t\t\t.coupon-List-title {\r\n\t\t\t\tfont-size: 30rpx;\r\n\t\t\t\tfont-weight: bold;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t.lingqu-btn {\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tmargin-left: 40rpx;\r\n\r\n\t\t\ttext {\r\n\t\t\t\twidth: 140rpx;\r\n\t\t\t\theight: 40rpx;\r\n\t\t\t\ttext-align: center;\r\n\t\t\t\tline-height: 40rpx;\r\n\t\t\t\tcolor: #fff;\r\n\t\t\t\tbackground: #6772e5;\r\n\t\t\t\tborder-radius: 5px;\r\n\t\t\t\tfont-size: 26rpx;\r\n\r\n\t\t\t\t&.cur {\r\n\t\t\t\t\tbackground: none;\r\n\t\t\t\t\ttransform: rotate(45deg) translate(10rpx, -46rpx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/product/promotion/-promotion-details.vue",
    "content": "<template>\r\n  <view class=\"wrapper\" v-if=\"res\">\r\n    <view v-for=\"(prom, index) in Object.keys(res)\" :key=\"index\">\r\n      <view>\r\n        <view v-if=\"prom.split('-')[0] == 'FULL_DISCOUNT'\">\r\n          <div class=\"res_prom_item\" v-if=\"res[prom].fullMinus\">\r\n            <u-tag text=\"满减\" type=\"error\"></u-tag>\r\n            <!-- TODO 后续将优化为可点击的商品以及优惠券显示明细 -->\r\n            <span class=\"pro-text\"\r\n              >满{{ res[prom].fullMoney }}元 立减现金\r\n              <span class=\"price\">{{ res[prom].fullMinus }}元</span>\r\n              <span v-if=\"res[prom].couponFlag\"> 赠送<span>优惠券</span></span>\r\n              <span v-if=\"res[prom].pointFlag\"> 赠送{{ res[prom].point }}积分</span>\r\n              <span v-if=\"res[prom].giftFlag\"> 赠送商品</span>\r\n              <span v-if=\"res[prom].freeFreightFlag\">赠送包邮服务</span>\r\n            </span>\r\n          </div>\r\n          <div class=\"res_prom_item\" v-if=\"res[prom].fullRate && res[prom].fullRateFlag\">\r\n            <u-tag text=\"打折\" type=\"error\"></u-tag>\r\n            <span class=\"pro-text\"\r\n              >满{{ res[prom].fullMoney }}元，立享<span class=\"price\"\r\n                >{{ res[prom].fullRate }}折</span\r\n              >优惠</span\r\n            >\r\n          </div>\r\n        </view>\r\n\r\n        <view v-if=\"prom.split('-')[0] == 'PINTUAN'\">\r\n          <div class=\"res_prom_item\" v-if=\"res[prom].requiredNum\">\r\n            <u-tag text=\"拼团\" type=\"error\"></u-tag>\r\n            <span class=\"pro-text\"\r\n              >{{ res[prom].requiredNum }}人拼团 限购<span class=\"price\"\r\n                >{{ res[prom].limitNum }}件</span\r\n              ></span\r\n            >\r\n          </div>\r\n        </view>\r\n\r\n        <view v-if=\"prom.split('-')[0] == 'SECKILL'\">\r\n          <div class=\"res_prom_item\">\r\n            <u-tag text=\"限时抢购\" type=\"error\"></u-tag>\r\n            <span class=\"pro-text\">限时抢购</span>\r\n          </div>\r\n        </view>\r\n\r\n        <view v-if=\"prom.split('-')[0] == 'POINTS_GOODS'\">\r\n          <div class=\"res_prom_item\">\r\n            <u-tag text=\"积分活动\" type=\"error\"></u-tag>\r\n            <span class=\"pro-text\">当前商品参与积分活动。<span @click=\"handClickToJoinPromotion(prom)\" class=\"href\">点击此处参与活动</span></span>\r\n          </div>\r\n        </view>\r\n\r\n         <view v-if=\"prom.split('-')[0] == 'KANJIA'\">\r\n          <div class=\"res_prom_item\">\r\n            <u-tag text=\"砍价活动\" type=\"error\"></u-tag>\r\n            <span class=\"pro-text\">当前商品参与砍价活动。<span @click=\"handClickToJoinPromotion(prom)\" class=\"href\">点击此处参与活动</span></span>\r\n          </div>\r\n        </view>\r\n      </view>\r\n    </view>\r\n    <view v-if=\"!res\">暂无促销活动</view>\r\n  </view>\r\n</template>\r\n<script>\r\nexport default {\r\n  data() {\r\n    return {};\r\n  },\r\n  watch: {\r\n    res: {\r\n      handler() {\r\n        if (this.res && this.res.length != 0) {\r\n          Object.keys(this.res).forEach((item) => {\r\n            if (item != \"COUPON\") {\r\n              let key = item.split(\"-\")[0];\r\n              this.res[item]._key = key;\r\n            }\r\n          });\r\n        }\r\n      },\r\n\r\n      immediate: true,\r\n    },\r\n  },\r\n\r\n  props: {\r\n    // 父组件传递回来的数据\r\n    res: {\r\n      type: null,\r\n      default: \"\",\r\n    },\r\n  },\r\n  mounted() {},\r\n  methods: {\r\n    // 跳转到参与商品活动的详情列表中\r\n    handClickToJoinPromotion(val){\r\n    \r\n      const promotion = {\r\n        \"POINTS_GOODS\": `/pages/promotion/point/detail?id=${this.res[val].id}`,\r\n        \"KANJIA\": `/pages/promotion/bargain/detail?id=${this.res[val].id}`,\r\n      }\r\n\r\n      uni.navigateTo({\r\n        url:promotion[val.split('-')[0]]\r\n      })\r\n\r\n    }\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.pro-text {\r\n  font-size: 26rpx;\r\n  font-family: PingFang SC, PingFang SC-Regular;\r\n  font-weight: 400;\r\n  text-align: left;\r\n  color: #333333;\r\n  margin-left: 20rpx;\r\n  > span {\r\n    margin-right: 15rpx;\r\n  }\r\n}\r\n\r\n.wrapper {\r\n  display: block;\r\n}\r\n\r\n/deep/ .u-mode-light-error {\r\n  border: none;\r\n}\r\n\r\n.res_prom_item {\r\n  margin: 20rpx 0;\r\n}\r\n\r\n.price_image {\r\n  display: block;\r\n}\r\n.href{\r\n  color: $main-color;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/product/promotion/-promotion.vue",
    "content": "<template>\n\t<view>\n\t\t<view v-for=\"(promotionItem, promotionIndex) in promotion\" :key=\"promotionIndex\" class=\"promotion_row\" @click=\"shutMask(1)\">\n\t\t\t<view v-if=\"res != null\" v-for=\"(item, index) in Object.keys(res)\" :key=\"index\">\n\t\t\t\t<div class=\"promotion_col\" v-if=\"item.split('-')[0] == promotionItem.value && item.split('-')[0] == 'FULL_DISCOUNT'\">\n\t\t\t\t\t<!-- 满减，折扣 -->\n\t\t\t\t\t<div class=\"flex\">\n\t\t\t\t\t\t<view class=\"deg_tag\">{{ promotionItem.title }}</view>\n\t\t\t\t\t\t<div class=\"text proText\">满{{ res[item].fullMoney }}元，立享优惠</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"promotion_col\" v-if=\"item.split('-')[0] == promotionItem.value && item.split('-')[0] == 'PINTUAN'\">\n\t\t\t\t\t<!-- 拼团 -->\n\t\t\t\t\t<div class=\"flex\">\n\t\t\t\t\t\t<view class=\"deg_tag\">{{ promotionItem.title }}</view>\n\t\t\t\t\t\t<div class=\"text proText\">{{ res[item].promotionName }}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"promotion_col\" v-if=\"item.split('-')[0] == promotionItem.value && item.split('-')[0] == 'POINTS_GOODS'\">\n\t\t\t\t\t<!-- 积分活动 -->\n\t\t\t\t\t<div class=\"flex\">\n\t\t\t\t\t\t<view class=\"deg_tag\">{{ promotionItem.title }}</view>\n\t\t\t\t\t\t<div class=\"text proText\">{{ res[item].promotionName }}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"promotion_col\" v-if=\"item.split('-')[0] == promotionItem.value && item.split('-')[0] == 'KANJIA'\">\n\t\t\t\t\t<!-- 砍价活动 -->\n\t\t\t\t\t<div class=\"flex\">\n\t\t\t\t\t\t<view class=\"deg_tag\">{{ promotionItem.title }}</view>\n\t\t\t\t\t\t<div class=\"text proText\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"promotion_col\" v-if=\"item.split('-')[0] == promotionItem.value && item.split('-')[0] == 'SECKILL'\">\n\t\t\t\t\t<!-- 限时抢购 -->\n\t\t\t\t\t<div class=\"flex\">\n\t\t\t\t\t\t<view class=\"deg_tag\">{{ promotionItem.title }}</view>\n\t\t\t\t\t\t<div class=\"text proText\">{{ res[item].promotionName }}</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</view>\n\n\t\t\t<view class=\"promotion_row\">\n\t\t\t\t<view>\n\t\t\t\t\t<div class=\"promotion_col coupon\" v-if=\"couponList && promotionIndex == 1\">\n\t\t\t\t\t\t<!-- 优惠券 -->\n\n\t\t\t\t\t\t<div><view class=\"deg_tag\">优惠券</view></div>\n\t\t\t\t\t</div>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\n\t\t<view v-if=\"this.res != null && Object.keys(res).length == 0\">暂无促销信息</view>\n\t</view>\n</template>\n\n<script>\nimport promotion from './promotion_type';\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tpromotion,\n\t\t\tcouponList: ''\n\t\t};\n\t},\n\tprops: {\n\t\t// 父组件传递回来的数据\n\t\tres: {\n\t\t\ttype: null,\n\t\t\tdefault: {}\n\t\t}\n\t},\n\twatch: {\n\t\tres: {\n\t\t\thandler() {\n\t\t\t\tif (this.res && this.res.length != 0 && this.res != null) {\n\t\t\t\t\tObject.keys(this.res).forEach(item => {\n\t\t\t\t\t\tlet key = item.split('-')[0];\n\t\t\t\t\t\tthis.res[item].__key = key;\n\n\t\t\t\t\t\tif (item.split('-')[0] == 'COUPON') {\n\t\t\t\t\t\t\tthis.couponList = 'COUPON';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true\n\t\t}\n\t},\n\tmounted() {},\n\tmethods: {\n\t\t// 此方法条用父级方法\n\t\tshutMask(val) {\n\t\t\tthis.$emit('shutMasks', val);\n\t\t}\n\t}\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.deg_tag {\n\tcolor: $price-color;\n\tpadding: 0 4rpx;\n\tborder: 2rpx solid $price-color;\n\tfont-size: 22rpx;\n}\n\n.promotion_col {\n\t/**/\n\t// margin: 0 0 17rpx 0;\n\n\tpadding: 0 !important;\n\n\tmargin: 10rpx 0;\n}\n.promotion_row {\n}\n.flex {\n\tdisplay: flex;\n}\n.proText {\n\tfont-size: 26rpx;\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\ttext-align: left;\n\tcolor: #333333;\n\tmargin-left: 20rpx;\n}\n/deep/ .u-mode-light-error {\n\tborder: none;\n}\n.coupon{\n\tdisplay: flex;\n}\n</style>\n"
  },
  {
    "path": "pages/product/product/promotion/README.md",
    "content": "### promotion 促销显示\n### promotion-details 促销详情\n### promotion-assemble-promotions 限时抢购,团购活动条\n### promotion-assemble-group 拼团活动条\n### promotion-assemble-list 拼团活动用户列表\n### promotion-coupon 优惠券组件"
  },
  {
    "path": "pages/product/product/promotion/group.scss",
    "content": ".group-wrapper {\n\tbackground: url(\"/static/exchange.png\");\n\tbackground-size: cover;\n}\n.u-group-row {\n\twidth: 100%;\n\tpadding: 0 32rpx;\n\tdisplay: flex;\n\theight: 100rpx;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n.showBox_L {\n\t// background: #ff6262;\n\theight: 100%;\n\tcolor: #fff;\n\tflex: 2;\n}\n.flex-price {\n\tcolor: #fff;\n\tfont-size: 48rpx;\n}\n.u-group-flex-left {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n.u-group-flex-left-span {\n\tline-height: 1.2;\n\tfont-size: 32rpx;\n}\n.showBox_R {\n\tflex: 1;\n\theight: 100%;\n\tpadding: 4rpx 0 !important;\n\tbackground: #ffe7e6 !important;\n\ttext-align: center !important;\n}\n/deep/ .u-mode-light-error {\n\tborder: none;\n}\n\n.u-group-flex {\n\theight: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n.u-group-flex,\n.u-group-flex-right {\n\tdisplay: flex;\n}\n\n.u-group-flex-right {\n\theight: 100%;\n\talign-items: flex-end;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n}\n.old-price {\n\tcolor: #fff;\n\ttext-decoration: line-through;\n\tfont-size: 22rpx;\n\topacity: 0.8;\n}\n.u-group-flex-left {\n\theight: 100%;\n}\n.group-bag {\n\tfont-size: 20rpx;\n\tpadding: 4rpx 20rpx;\n\tborder-radius: 6rpx;\n\tmargin-right: 20rpx;\n}\n.promotion {\n\tfont-size: 22rpx;\n\tborder: 2rpx solid $price-light-color;\n\tpadding: 2rpx 6rpx;\n\tmargin-left: 10rpx;\n\tline-height: 1;\n}\n"
  },
  {
    "path": "pages/product/product/promotion/promotion_type.js",
    "content": "const promotion = [\n  {\n    title: \"积分活动\",\n    value: \"POINTS_GOODS\",\n  },\n  {\n    title: \"砍价活动\",\n    value: \"KANJIA\",\n  },\n  {\n    title: \"单品立减\",\n    value: \"MINUS\",\n  },\n  {\n    title: \"团购\",\n    value: \"GROUPBUY\",\n  },\n  {\n    title: \"积分换购\",\n    value: \"EXCHANGE\",\n  },\n  {\n    title: \"第二件半价\",\n    value: \"HALF_PRICE\",\n  },\n  {\n    title: \"满减优惠\",\n    value: \"FULL_DISCOUNT\",\n  },\n  {\n    title: \"限时抢购\",\n    value: \"SECKILL\",\n  },\n  {\n    title: \"拼团\",\n    value: \"PINTUAN\",\n  },\n  {\n    title: \"优惠券\",\n    value: \"COUPON\",\n  },\n];\nexport default promotion\n/**格式化 */\nexport function formatType(val){\n    if(val != undefined){\n        promotion.forEach(item=>{\n            if(val == item.value){\n                return item.title\n            }\n        })\n    }\n}"
  },
  {
    "path": "pages/product/product/shop/-shop.vue",
    "content": "<template>\r\n  <view v-if=\"storeDetail\">\r\n    <!-- 商店信息  -->\r\n    <view class=\"store-info\">\r\n      <view class=\"logo\">\r\n        <u-image width=\"120rpx\" mode=\"aspectFit\" height=\"120rpx\" :src=\"storeDetail.storeLogo\"></u-image>\r\n      </view>\r\n      <view class=\"name-star star-con\">\r\n        <div class=\"name\">\r\n          {{ storeDetail.storeName }}\r\n          <span v-if=\"storeDetail.selfOperated == 1\" class=\"shopTag\">自营</span>\r\n        </div>\r\n        <div class=\"store-row\">\r\n          <div class=\"collectionNum\">{{ storeDetail.collectionNum || 0 }}人关注</div>\r\n          <div class=\"goodsNum\">{{ storeDetail.goodsNum || 0 }}件商品</div>\r\n        </div>\r\n      </view>\r\n      <view class=\"to-store-btn\" @click=\"tostorePage(goodsDetail)\">\r\n        <view>进店逛逛</view>\r\n      </view>\r\n    </view>\r\n\r\n    <view class=\"store-recommend\">\r\n      <view class=\"store-recommend-title\">店内其他商品</view>\r\n      <view class=\"recommend-list\">\r\n        <view class=\"recommend-item\" @click=\"clickGoods(item)\" v-for=\"(item, index) in res\" :key=\"index\">\r\n          <u-image class=\"recommend-item-img\" :fade=\"true\" duration=\"450\" :lazy-load=\"true\" :src=\"item.thumbnail\" height=\"218rpx\">\r\n            <u-loading slot=\"loading\"></u-loading>\r\n            <view slot=\"error\" style=\"font-size: 24rpx; \">加载失败</view>\r\n          </u-image>\r\n          <view class=\"recommend-item-name\">\r\n            {{ item.goodsName }}\r\n          </view>\r\n          <view class=\"item-price\" v-if=\"item.price != undefined\">\r\n            ￥<span class=\"item-price-blod\">{{ $options.filters.goodsFormatPrice(item.price)[0] }}</span>.{{ $options.filters.goodsFormatPrice(item.price)[1] }}\r\n          </view>\r\n        </view>\r\n      </view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  data() {\r\n    return {};\r\n  },\r\n  props: [\"res\", \"goodsDetail\", \"storeDetail\"],\r\n  mounted() {},\r\n  methods: {\r\n    // 点击商品\r\n    clickGoods(val) {\r\n      uni.navigateTo({\r\n        url: `/pages/product/goods?id=${val.id}&goodsId=${val.goodsId}`,\r\n      });\r\n    },\r\n\r\n    tostorePage(val) {\r\n      uni.navigateTo({\r\n        url: \"../product/shopPage?id=\" + val.storeId,\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../product.scss\";\r\n.recommend-item-name {\r\n  height: 60rpx;\r\n  color: #333;\r\n  font-weight: 400;\r\n  font-size: 24rpx;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  display: -webkit-box;\r\n  -webkit-line-clamp: 2;\r\n  -webkit-box-orient: vertical;\r\n}\r\n.item-price-blod {\r\n  font-weight: bold;\r\n  font-size: 32rpx;\r\n}\r\n.recommend-item {\r\n  width: 30%;\r\n  margin: 10rpx 0rpx;\r\n  overflow: hidden;\r\n  border-radius: 12rpx;\r\n\r\n  /deep/ .u-image__image {\r\n    height: 218rpx;\r\n    border-radius: 12rpx !important;\r\n  }\r\n}\r\n\r\n.recommend-item-img {\r\n  /deep/ .u-image__image {\r\n    width: 100% !important;\r\n  }\r\n}\r\n\r\n.recommend-list-view {\r\n  width: 100%;\r\n}\r\n.shopTag {\r\n  background: $main-color;\r\n  font-size: 24rpx;\r\n  margin-left: 10rpx;\r\n  padding: 6rpx 12rpx;\r\n  border-radius: 10rpx;\r\n  font-weight: normal;\r\n  color: #fff;\r\n}\r\n\r\n.store-info {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  background: #fff;\r\n  padding: 40rpx 20rpx 50rpx;\r\n\r\n  .logo {\r\n    overflow: hidden;\r\n    border-radius: 6px;\r\n\r\n    > img {\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n  }\r\n\r\n  .name-star {\r\n    flex: 1;\r\n    margin-left: 20rpx;\r\n    .name {\r\n      display: flex;\r\n      align-items: center;\r\n      width: 100%;\r\n      line-height: 1;\r\n      font-weight: 700;\r\n      font-size: 28rpx;\r\n    }\r\n    .desc {\r\n      font-size: 12px;\r\n      color: #999;\r\n      margin-left: 10px;\r\n      text {\r\n        margin-right: 10px;\r\n      }\r\n    }\r\n  }\r\n\r\n  .to-store-btn {\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    > view {\r\n      font-size: 24rpx;\r\n      color: #fff;\r\n      width: 160rpx;\r\n      height: 60rpx;\r\n      line-height: 60rpx;\r\n      text-align: center;\r\n      background: $main-color;\r\n      border-radius: 28rpx;\r\n    }\r\n  }\r\n}\r\n\r\n/* star */\r\n.star-con {\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  view {\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    .star {\r\n      width: 30rpx;\r\n      height: 30rpx;\r\n      background: url(https://image.shutterstock.com/image-vector/star-icon-vector-illustration-260nw-474687040.jpg);\r\n      background-size: 100%;\r\n    }\r\n  }\r\n}\r\n\r\n.recommend-list {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  justify-content: space-between;\r\n\r\n  /deep/ .u-row {\r\n    width: 100%;\r\n  }\r\n\r\n  .item-price {\r\n    margin: 10rpx 0 20rpx 0;\r\n    text-align: left;\r\n    font-weight: bold;\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n    margin: 18rpx 0;\r\n    font-size: 22rpx;\r\n    color: $price-color;\r\n  }\r\n\r\n  .recommend-list-con {\r\n    display: flex;\r\n    flex-direction: column;\r\n    width: 32%;\r\n    margin-bottom: 24rpx;\r\n  }\r\n\r\n  .name {\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n  }\r\n}\r\n\r\n.store-recommend {\r\n  background: #fff;\r\n\r\n  margin: 20rpx 0 0 0;\r\n}\r\n.goodsNum,\r\n.collectionNum {\r\n  font-size: 24rpx;\r\n  color: #999;\r\n}\r\n.store-row {\r\n  display: flex;\r\n  margin: 10rpx 0;\r\n  > div {\r\n    margin-right: 20rpx;\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/product/style.scss",
    "content": ".red {\n    color: $price-color;\n}\npage {\n    background: #fff;\n}\n.num-icon {\n    position: absolute;\n    right: 5rpx;\n    top: 5rpx;\n    padding: 2rpx 6rpx;\n    border-top: 4rpx;\n    border: 2rpx solid $price-color;\n    color: $price-color;\n    font-size: 22rpx;\n    border-radius: 200px;\n    line-height: 18rpx;\n}\n.header-title{\n    font-weight: bold;\n    color: #333;\n    text-align: center;\n    height: 90rpx;\n    line-height: 90rpx;\n    font-size: 34rpx;\n}\n\n.cuxiao-title{\n    color: #999;\n    font-size: 24rpx;\n}\n.cuxiao{\n    padding:16rpx 32rpx;\n}\n.detail-btn {\n    display: flex;\n    align-items: center;\n    > .to-buy {\n        background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);\n    }\n    > .to-store-car {\n        background-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c);\n    }\n    > .to-store-btn {\n        flex: 1;\n        width: 100%;\n        margin: 0 5rpx;\n        height: 80rpx;\n\n        text-align: center;\n        line-height: 80rpx;\n        color: #fff;\n        font-size: 26rpx;\n        border-radius: 214px;\n        padding: 0;\n    }\n    > .pt-buy {\n        line-height: 1.2;\n        display: flex;\n        align-items: center;\n        flex-direction: column;\n        justify-content: center;\n        font-size: 22rpx;\n    }\n}\n.desc-bold {\n    flex: 8;\n    font-weight: 700;\n    color: #262626;\n    line-height: 42rpx;\n    font-size: 32rpx;\n}\n.-goods-desc {\n    padding: 36rpx 0 0 0;\n    margin-bottom: 24rpx;\n    font-size: 24rpx;\n    color: #666;\n    display: -webkit-box;\n\n    -webkit-box-orient: vertical;\n\n    -webkit-line-clamp: 2;\n\n    overflow: hidden;\n}\n.-goods-flex {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n}\n.icons,.favorite {\n    flex: 1;\n    font-size: 22rpx;\n    color: #262626;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n}\n.-goods-price {\n    flex: 7;\n    color: $price-color;\n    font-size: 32rpx;\n    line-height: 1;\n    /deep/ .price {\n        font-size: 60rpx;\n    }\n}\n.-goods-name {\n    margin-top: 24rpx;\n}\n\n.top-radius-0 {\n    margin-top: 0 !important;\n    border-top-left-radius: 0 !important;\n    border-top-right-radius: 0 !important;\n}\n.-goods-msg {\n    min-height: 120rpx;\n    margin-top: 24rpx;\n}\n.recommend-item {\n    // padding: 0 !important;\n    margin: 20rpx 0rpx;\n    overflow: hidden;\n    border-radius: 12rpx;\n\n    /deep/ .u-image__image {\n        // width: 228rpx;\n        height: 228rpx;\n        border-radius: 12rpx !important;\n    }\n}\n\n.detail_padding {\n    padding: 12px 20rpx 0 20rpx;\n\n    > .tips {\n        color: #000;\n        font-size: 30rpx;\n        font-weight: 400;\n        margin-bottom: 28rpx;\n    }\n}\n\n.headerRow {\n    height: 44px; //默认uni navbar就是44px\n    display: flex;\n    align-items: center;\n    width: 100%;\n    // background: #fff !important;\n\n    > .headerList {\n        flex: 8;\n    }\n\t// > div:nth-child(2) {\n\t//     flex: 1;\n\t// \t.headerList{\n\t// \t\tdisplay: flex;\n\t// \t\tdiv{\n\t// \t\t\tflex: 1;\n\t// \t\t}\n\t// \t}\n\t// }\n\t// > div:nth-child(3) {\n\t//     width: 100rpx;\n\t// }\n    \n    justify-content: space-between;\n}\n\n.scroll-hide {\n    opacity: 0;\n    transition: all 0.5s;\n}\n.cur {\n    color: $main-color;\n}\n.cur::after {\n    content: \"\";\n    height: 6rpx;\n\n    background: $main-color;\n    width: 100%;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n}\n\n.header-only-back {\n    background: transparent;\n}\n.header,\n.header-only-back {\n    padding-left: 10rpx;\n    position: fixed;\n    top: var(--status-bar-height);\n    width: 100%;\n    z-index: 8;\n    height: 90rpx;\n    font-size: 30rpx;\n    transition: all 0.5s;\n}\n/deep/ .u-navbar {\n    padding-left: 10rpx;\n}\n.nav-item {\n    flex: 2;\n    position: relative;\n    justify-content: center;\n    height: 100%;\n    display: flex;\n    align-items: center;\n}\n.header {\n    color: #666666;\n    background-color: #fff;\n    .tab-bar {\n        width: 100%;\n        color: #666;\n        font-weight: 400;\n        view {\n            padding: 0 3px;\n        }\n    }\n    &.bg-none {\n        background: transparent;\n    }\n}\n\n.page-bottom {\n    position: fixed;\n    bottom: 0;\n    left: 0;\n    z-index: 9;\n    background: #fff;\n    height: 100rpx;\n    width: 100%;\n    display: flex;\n    border-top: 2rpx solid #f2f2f2;\n    box-sizing: border-box;\n    > .icon-btn {\n        display: flex;\n        align-items: center;\n\n        flex: 1;\n        > .icon-btn-item {\n            flex: 1;\n            position: relative;\n            text-align: center;\n            font-size: 22rpx;\n            color: #262626;\n            display: flex;\n            flex-direction: column;\n            width: 100%;\n            height: 100%;\n            align-items: center;\n            justify-content: center;\n            > .icon-btn-name {\n                margin: 4rpx 0;\n            }\n        }\n    }\n    > .detail-btn {\n        flex: 1.5;\n    }\n}\n\n.main-page {\n    height: calc(100% - var(--status-bar-height));\n    overflow: hidden;\n}\n.icon-back {\n    padding-right: 10rpx;\n}\n.icon-list {\n    border-left: 2rpx solid rgb(194, 194, 194);\n    padding-left: 10rpx;\n}\n.backs,\n.bg-back {\n    width: 150rpx;\n    border: 2rpx solid #e8e8e8;\n    border-radius: 100px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 8rpx 0;\n}\n.bg-back {\n    background: rgba($color: #fff, $alpha: 0.8);\n}\n.backs {\n    text-align: center;\n    font-size: 42rpx;\n}\n\n.headerImg {\n    width: 50rpx;\n    height: 50rpx;\n    vertical-align: middle;\n}\n\n.shareImg {\n    width: 36rpx;\n    height: 36rpx;\n    vertical-align: middle;\n}\n\n.item-spec-value {\n    box-sizing: border-box;\n    margin: 10rpx;\n    padding: 10rpx 20rpx;\n    float: left;\n}\n\n.item-spec-value {\n    background: #ededed;\n}\n\npage {\n    background: #f0f0f0;\n    height: 100%;\n}\n\n.product-container {\n    .header-line {\n        height: 1px;\n        background: #f2f2f2;\n        position: fixed;\n        top: 90rpx;\n        left: 0;\n        right: 0;\n        z-index: 999;\n        transition: all 0.5s;\n\n        &.scroll-hide {\n            background: none;\n        }\n    }\n\n    .scroll-page {\n        width: 100%;\n        height: 100%;\n    }\n}\n\n.u-mode-light-error {\n    border: none;\n}\n\n.showBack {\n    height: 60rpx;\n    line-height: 60rpx;\n    position: fixed;\n    margin-top: calc(10px);\n    z-index: 8;\n    width: 100%;\n\n    /deep/ .u-row {\n        width: 100%;\n    }\n}\n\n.showBox {\n    width: 100%;\n    height: 90rpx;\n    background: #ff6262;\n    color: #fff;\n    padding: 0 20rpx;\n\n    /deep/ .price {\n        font-size: 36rpx;\n        font-weight: 400;\n        text-align: left;\n        letter-spacing: 1px;\n        color: #ffffff;\n        line-height: 90rpx;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n    }\n}\n\n.status_bar {\n    background: #fff;\n    height: var(--status-bar-height);\n}\n"
  },
  {
    "path": "pages/product/shopList.vue",
    "content": "<template>\n  <div>\n    <u-navbar>\n      <u-search placeholder=\"请输入店铺名称\" @search=\"search\" @clear=\"search\" @custom=\"search\" v-model=\"params.storeName\">\n      </u-search>\n    </u-navbar>\n    <div class=\"wrapper\" v-if=\"storeList.length!=0\">\n      <div class=\"store-item\" @click=\"handleClickStore(item)\" v-for=\"(item,index) in storeList\" :key=\"index\">\n        <div>\n          <u-image shape=\"circle\" width=\"100\" height=\"100\" :src=\"item.storeLogo\">\n          </u-image>\n        </div>\n        <div class=\"store-msg\">\n          <div class=\"store-name\">\n            {{item.storeName}}\n          </div>\n          <div class=\"goods-num\">\n            商品 {{item.goodsNum}}\n          </div>\n          <div class=\"flex store-distance\">\n            <div>\n              <span class=\"store-score\">{{item.serviceScore | unitPrice}}</span>\n              <span class=\"line\">|</span>\n              <span class=\"store-collection\">收藏 {{item.collectionNum}}</span>\n            </div>\n          </div>\n        </div>\n        <!-- \n          #TODO 后续将和后端补充从此处\n          <div class=\"flex store-goods\">\n            <div class=\"store-goods-item\" v-for=\"i in 3\" :key=\"i\">\n              <div>\n                <u-image src=\"https://picsum.photos/id/341/200/200\" border-radius=\"20\" width=\"215rpx\" height=\"215rpx\">\n                </u-image>\n              </div>\n              <div class=\"price\">\n                <span>\n                  ￥\n                  <span class=\" goods-price-bigshow\">{{ formatPrice(16)[0] }}</span>\n                  .{{ formatPrice(16)[1] }}\n                </span>\n\n              </div>\n              <div class=\"wes\">test</div>\n            </div>\n           </div> \n        -->\n      </div>\n    </div>\n    <u-empty style=\"margin-top:20%;\" text=\"暂无店铺信息\" v-else></u-empty>\n  </div>\n</template>\n\n<script>\nimport { getStoreList } from \"@/api/store\";\nexport default {\n  data() {\n    return {\n      keyword: \"\",\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n        storeName: \"\",\n      },\n      storeList: [], // 店铺列表\n    };\n  },\n  onReachBottom() {\n    this.params.pageNumber++;\n    this.init();\n  },\n  mounted() {\n    this.init();\n  },\n  methods: {\n    handleClickStore(val){\n      uni.navigateTo({\n         url: `/pages/product/shopPage?id=${val.id}`\n      });\n    },\n    search() {\n      this.storeList = [];\n      this.init();\n    },\n   \n    async init() {\n      let res = await getStoreList(this.params);\n      if (res.data.success) {\n        let data = res.data.result;\n        \n        this.storeList.push(...data.records);\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.wrapper {\n  padding: 0 16rpx;\n}\n.store-item {\n  display: flex;\n  background: #fff;\n  border-radius: 20rpx;\n  margin: 20rpx 0;\n  padding: 24rpx;\n}\n.store-msg {\n  margin-left: 20rpx;\n}\n.store-name {\n  font-weight: bold;\n  font-size: 30rpx;\n}\n.goods-num,\n.store-collection {\n  color: #999;\n  font-size: 24rpx;\n  line-height: 1.5;\n}\n.store-goods {\n  margin: 20rpx 0;\n}\n.store-goods-item {\n  flex: 1;\n  overflow: hidden;\n  display: flex;\n  justify-content: flex-start;\n  flex-direction: column;\n  margin: 0 5rpx;\n}\n.wes {\n  margin: 10rpx 0;\n  width: 100%;\n}\n.store-score {\n  color: $light-color;\n  font-size: 24rpx;\n  font-weight: bold;\n}\n.line {\n  margin: 0 6rpx;\n  color: #999;\n}\n.store-distance {\n  justify-content: space-between;\n}\n.price {\n  margin-top: 10rpx;\n  color: $main-color;\n}\n.goods-price-bigshow {\n  font-size: 34rpx;\n  font-weight: bold;\n}\n</style>"
  },
  {
    "path": "pages/product/shopPage.vue",
    "content": "<template>\r\n  <view>\r\n    <!-- 楼层装修店铺信息 -->\r\n    <div>\r\n      <u-navbar :border-bottom=\"false\">\r\n        <u-search\r\n          v-model=\"keyword\"\r\n          @search=\"search\"\r\n          @click=\"search\"\r\n          placeholder=\"请输入搜索\"\r\n        ></u-search>\r\n      </u-navbar>\r\n      <div class=\"wrapper\">\r\n        <!-- 店铺信息模块 -->\r\n        <div class=\"store flex\">\r\n          <u-image\r\n            border-radius=\"10\"\r\n            width=\"150\"\r\n            height=\"150\"\r\n            :src=\"storeInfo.storeLogo || config.logo\"\r\n            mode=\"aspectFit\"\r\n          >\r\n          </u-image>\r\n          <div class=\"box\">\r\n            <div class=\"store-name\" @click=\"getStoreLicencePhoto\">\r\n              {{ storeInfo.storeName || \"\" }}\r\n              <u-icon style=\"margin-left: 10rpx\" name=\"arrow-right\"></u-icon>\r\n            </div>\r\n            <div class=\"flex store-message\">\r\n              <div>\r\n                <span>{{ storeInfo.collectionNum || 0 }}</span\r\n                >关注\r\n              </div>\r\n              <div>\r\n                <span>{{ storeInfo.goodsNum || 0 }}</span\r\n                >件商品\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div class=\"collection\">\r\n            <div class=\"collection-btn\" @click=\"whetherCollection\">\r\n              {{ isCollection ? \"已关注\" : \"+ 关注\" }}\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <!-- 店铺简介 -->\r\n        <div class=\"store-desc wes-2\">\r\n          {{ storeInfo.storeDesc || '' }}\r\n        </div>\r\n\r\n        <!-- 联系客服 -->\r\n        <div class=\"kefu\" @click=\"talk\">\r\n          <u-icon name=\"kefu-ermai\"></u-icon>\r\n          联系客服\r\n        </div>\r\n      </div>\r\n      <!-- 优惠券 -->\r\n      <scroll-view\r\n        scroll-x=\"true\"\r\n        show-scrollbar=\"false\"\r\n        class=\"discount\"\r\n        v-if=\"couponList.length > 0\"\r\n      >\r\n        <view class=\"card-box\" v-for=\"(item, index) in couponList\" :key=\"index\">\r\n          <view class=\"card\" @click=\"getCoupon(item)\">\r\n            <view class=\"money\">\r\n              <view>\r\n                <span v-if=\"item.couponType == 'DISCOUNT'\"\r\n                  >{{ item.couponDiscount }}折</span\r\n                >\r\n                <span v-else>{{ item.price }}元</span>\r\n              </view>\r\n            </view>\r\n            <view class=\"xian\"></view>\r\n            <view class=\"text\">\r\n              <text>{{ \"领取优惠券\" }}</text>\r\n              <text>满{{ item.consumeThreshold | unitPrice }}元可用</text>\r\n            </view>\r\n          </view>\r\n        </view>\r\n      </scroll-view>\r\n\r\n      <!-- 基础店铺模式 -->\r\n      <div v-if=\"basePageData\">\r\n        <u-tabs :list=\"tabs\" :active-color=\"mainColor\" :is-scroll=\"false\" :current=\"current\" @change=\"changeTab\"></u-tabs>\r\n        <div class=\"content\" v-if=\"current == 0\">\r\n          <u-empty style='margin-top:100rpx' v-if=\"goodsList.length == 0\" class=\"empty\" text='暂无商品信息'></u-empty>\r\n          <goodsTemplate style=\"width:100%;\" v-else :res=\"goodsList\" :storeName=\"false\" />\r\n        </div>\r\n        <!-- 全部分类 -->\r\n        <div class=\"category\" v-if=\"current == 1\">\r\n          <div class=\"category-item\" v-for=\"(item,index) in categoryList\" :key=\"index\">\r\n            <div class=\"flex\" @click=\"getCategoryGoodsList(item)\">\r\n              <div>{{item.labelName}}</div>\r\n              <div>\r\n                <u-icon color=\"#999\" name=\"arrow-right\"></u-icon>\r\n              </div>\r\n            </div>\r\n            <!-- 分类子级 -->\r\n            <div class=\"child-list\" v-if=\"item.children && item.children.length!=0\">\r\n              <div class=\"child\" @click=\"getCategoryGoodsList(child)\" :key='i' v-for=\"(child,i) in item.children\">{{child.labelName}}\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- 楼层装修模式 -->\r\n      <div v-if=\"enablePageData\">\r\n        <!-- uni 中不能使用 vue component 所以用if判断每个组件 -->\r\n        <div v-for=\"(item, index) in pageData.list\" :key=\"index\">\r\n          <!-- 搜索栏，如果在楼层装修顶部则会自动浮动，否则不浮动 -->\r\n          <u-navbar\r\n            class=\"navbar\"\r\n            v-if=\"item.type == 'search'\"\r\n            :is-fixed=\"index === 1 ? false : true\"\r\n          >\r\n            <div class=\"navbar-right\"></div>\r\n\r\n            <search style=\"width: 100%\" :res=\"item.options\" :storeId = \"storeId\"/>         \r\n          </u-navbar>\r\n          <carousel v-if=\"item.type == 'carousel'\" :res=\"item.options\" />\r\n          <titleLayout v-if=\"item.type == 'title'\" :res=\"item.options\" />\r\n          <leftOneRightTwo\r\n            v-if=\"item.type == 'leftOneRightTwo'\"\r\n            :res=\"item.options\"\r\n          />\r\n          <leftTwoRightOne\r\n            v-if=\"item.type == 'leftTwoRightOne'\"\r\n            :res=\"item.options\"\r\n          />\r\n          <topOneBottomTwo\r\n            v-if=\"item.type == 'topOneBottomTwo'\"\r\n            :res=\"item.options\"\r\n          />\r\n          <topTwoBottomOne\r\n            v-if=\"item.type == 'topTwoBottomOne'\"\r\n            :res=\"item.options\"\r\n          />\r\n          <flexThree v-if=\"item.type == 'flexThree'\" :res=\"item.options\" />\r\n          <flexFive v-if=\"item.type == 'flexFive'\" :res=\"item.options\" />\r\n          <flexFour v-if=\"item.type == 'flexFour'\" :res=\"item.options\" />\r\n          <flexTwo v-if=\"item.type == 'flexTwo'\" :res=\"item.options\" />\r\n          <textPicture v-if=\"item.type == 'textPicture'\" :res=\"item.options\" />\r\n          <menuLayout v-if=\"item.type == 'menu'\" :res=\"item.options\" />\r\n          <flexOne v-if=\"item.type == 'flexOne'\" :res=\"item.options\" />\r\n\r\n          <goods v-if=\"item.type == 'goods'\" :res=\"item.options\" />\r\n\r\n          <group v-if=\"item.type == 'group'\" :res=\"item.options\" />\r\n          <!-- <joinGroup v-if=\"item.type == 'joinGroup'\" :res=\"item.options\" /> -->\r\n          <!-- <integral v-if=\"item.type == 'integral'\" :res=\"item.options\" /> -->\r\n          <!-- <spike v-if=\"item.type == 'spike'\" :res=\"item.options\" /> -->\r\n        </div>\r\n      </div>\r\n      <u-no-network></u-no-network>\r\n    </div>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\n// 引用组件\r\nimport tpl_banner from \"@/pages/tabbar/home/template/tpl_banner\"; //导航栏模块\r\nimport tpl_title from \"@/pages/tabbar/home/template/tpl_title\"; //标题栏模块\r\nimport tpl_left_one_right_two from \"@/pages/tabbar/home/template/tpl_left_one_right_two\"; //左一右二模块\r\nimport tpl_left_two_right_one from \"@/pages/tabbar/home/template/tpl_left_two_right_one\"; //左二右一模块\r\nimport tpl_top_one_bottom_two from \"@/pages/tabbar/home/template/tpl_top_one_bottom_two\"; //上一下二模块\r\nimport tpl_top_two_bottom_one from \"@/pages/tabbar/home/template/tpl_top_two_bottom_one\"; //上二下一模块\r\nimport tpl_flex_one from \"@/pages/tabbar/home/template/tpl_flex_one\"; //单行图片模块\r\nimport tpl_flex_two from \"@/pages/tabbar/home/template/tpl_flex_two\"; //两张横图模块\r\nimport tpl_flex_three from \"@/pages/tabbar/home/template/tpl_flex_three\"; //三列单行图片模块\r\nimport tpl_flex_five from \"@/pages/tabbar/home/template/tpl_flex_five\"; //五列单行图片模块\r\nimport tpl_flex_four from \"@/pages/tabbar/home/template/tpl_flex_four\"; //四列单行图片模块\r\nimport tpl_text_picture from \"@/pages/tabbar/home/template/tpl_text_picture\"; //文字图片模板\r\nimport tpl_menu from \"@/pages/tabbar/home/template/tpl_menu\"; //五列菜单模块\r\nimport tpl_search from \"@/pages/tabbar/home/template/tpl_search\"; //搜索栏\r\nimport tpl_group from \"@/pages/tabbar/home/template/tpl_group\"; //\r\nimport tpl_goods from \"@/pages/tabbar/home/template/tpl_goods\"; //商品分类以及分类中的商品\r\nimport goodsTemplate from '@/components/m-goods-list/list'\r\nimport { getStoreBaseInfo, getStoreCategory } from \"@/api/store.js\";\r\nimport {\r\n  receiveCoupons,\r\n  deleteStoreCollection,\r\n  collectionStore,\r\n  getStoreIsCollect,\r\n} from \"@/api/members.js\";\r\nimport config from \"@/config/config\";\r\n\r\nimport { getGoodsList } from \"@/api/goods.js\";\r\nimport { getAllCoupons } from \"@/api/promotions.js\";\r\nimport { getFloorStoreData } from \"@/api/home\"; //获取楼层装修接口\r\nexport default {\r\n  data() {\r\n    return {\r\n      config,\r\n      pageData: \"\", //楼层页面数据\r\n      enablePageData: false, //是否显示楼层装修内容\r\n      basePageData: false, //基础店铺信息\r\n      scrollTop: 0,\r\n      mainColor: this.$mainColor, //主色调\r\n      current: 0, //初始tabs的索引\r\n      tabs: [\r\n        {\r\n          name: \"全部商品\",\r\n        },\r\n        {\r\n          name: \"分类查看\",\r\n        },\r\n      ], // 标签\r\n      storeId: \"\",\r\n      keyword: \"\",\r\n      storeInfo: {}, //店铺详情\r\n      isCollection: false, //是否关注\r\n      goodsList: [], //推荐货物\r\n      couponList: [], //优惠券列表\r\n      categoryList: [],\r\n      couponParams: {\r\n        pageNumber: 1,\r\n        pageSize: 50,\r\n        storeId: \"\",\r\n      },\r\n      goodsParams: {\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n        storeId: \"\",\r\n      },\r\n    };\r\n  },\r\n  components: {\r\n    carousel: tpl_banner,\r\n    titleLayout: tpl_title,\r\n    leftOneRightTwo: tpl_left_one_right_two,\r\n    leftTwoRightOne: tpl_left_two_right_one,\r\n    topOneBottomTwo: tpl_top_one_bottom_two,\r\n    topTwoBottomOne: tpl_top_two_bottom_one,\r\n    flexThree: tpl_flex_three,\r\n    flexFive: tpl_flex_five,\r\n    flexFour: tpl_flex_four,\r\n    flexTwo: tpl_flex_two,\r\n    textPicture: tpl_text_picture,\r\n    menuLayout: tpl_menu,\r\n    search: tpl_search,\r\n    flexOne: tpl_flex_one,\r\n    goods: tpl_goods,\r\n    group: tpl_group,\r\n    goodsTemplate\r\n    // spike: tpl_spike,\r\n    // joinGroup: tpl_join_group,\r\n    // integral: tpl_integral,\r\n  },\r\n  watch: {\r\n    current(val) {\r\n      val == 0\r\n        ? () => {\r\n            this.goodsList = [];\r\n            this.getGoodsData();\r\n          }\r\n        : this.getCategoryData();\r\n    },\r\n  },\r\n\r\n  /**\r\n   * 加载\r\n   */\r\n  async onLoad(options) {\r\n    this.storeId = options.id;\r\n    console.log(this.storeId,'this.storeId')\r\n\r\n    this.goodsParams.storeId = options.id;\r\n    this.couponParams.storeId = options.id;\r\n  },\r\n  onPageScroll(e) {\r\n    this.scrollTop = e.scrollTop;\r\n  },\r\n  onPullDownRefresh() {\r\n    this.init();\r\n  },\r\n  mounted() {\r\n    // #ifdef MP-WEIXIN\r\n    // 小程序默认分享\r\n    uni.showShareMenu({\r\n      withShareTicket: true,\r\n    });\r\n    // #endif\r\n    this.init();\r\n  },\r\n\r\n  // 下拉加载\r\n  onReachBottom() {\r\n    this.goodsParams.pageNumber++;\r\n    this.getGoodsData();\r\n  },\r\n\r\n  methods: {\r\n    talk(){\r\n      this.$options.filters.talkIm(this.storeInfo.storeId)\r\n    },\r\n    back() {\r\n      uni.navigateBack();\r\n    },\r\n    /**\r\n     * 实例化首页数据楼层\r\n     */\r\n    initPageData() {\r\n      this.pageData = \"\";\r\n      getFloorStoreData({\r\n        pageType: \"STORE\",\r\n        num: this.storeId,\r\n      }).then((res) => {\r\n        if (res.data.success) {\r\n          this.pageData = JSON.parse(res.data.result.pageData);\r\n        }\r\n      });\r\n    },\r\n    getStoreLicencePhoto() {\r\n      uni.navigateTo({\r\n        url: `/pages/product/licencePhoto?id=${this.storeId}`,\r\n      });\r\n    },\r\n    /**\r\n     * 初始化信息\r\n     */\r\n    init() {\r\n      this.goodsList = [];\r\n      this.categoryList = [];\r\n      this.couponList = [];\r\n      this.goodsParams.pageNumber = 1;\r\n      if (this.$options.filters.isLogin(\"auth\")) {\r\n        this.enableGoodsIsCollect();\r\n      }\r\n      // 店铺信息\r\n      this.getStoreData();\r\n    },\r\n    /**\r\n     * 联系客服\r\n     */\r\n    linkKefuDetail() {\r\n      // 客服\r\n      // #ifdef MP-WEIXIN\r\n\r\n      const params = {\r\n        // originalPrice: this.goodsDetail.original || this.goodsDetail.price,\r\n        uuid: storage.getUuid(),\r\n        token: storage.getAccessToken(),\r\n        sign: this.storeInfo.yzfSign,\r\n        mpSign: this.storeInfo.yzfMpSign,\r\n      };\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/mine/im/index\"\r\n      });\r\n      // uni.navigateTo({\r\n      //   url:\r\n      //     \"/pages/product/customerservice/index?params=\" +\r\n      //     encodeURIComponent(JSON.stringify(params)),\r\n      // });\r\n      // // #endif\r\n      // // #ifndef MP-WEIXIN\r\n      // const sign = this.storeInfo.yzfSign;\r\n      // uni.navigateTo({\r\n      //   url:\r\n      //     \"/pages/tabbar/home/web-view?src=https://yzf.qq.com/xv/web/static/chat/index.html?sign=\" +\r\n      //     sign,\r\n      // });\r\n      // #endif\r\n    },\r\n\r\n    /** 获取店铺分类 */\r\n    async getCategoryData() {\r\n      let res = await getStoreCategory(this.storeId);\r\n      if (res.data.success) {\r\n        this.categoryList = res.data.result;\r\n      }\r\n    },\r\n    /**是否收藏店铺 */\r\n    async enableGoodsIsCollect() {\r\n      let res = await getStoreIsCollect(\"STORE\", this.storeId);\r\n      if (res.data.success) {\r\n        this.isCollection = res.data.result;\r\n      }\r\n    },\r\n\r\n    /**商品分类中商品集合 */\r\n    getCategoryGoodsList(val) {\r\n      uni.navigateTo({\r\n        url: `/pages/product/shopPageGoods?title=${val.labelName}&id=${val.id}&storeId=${this.storeId}`,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 搜索\r\n     */\r\n    search() {\r\n      uni.navigateTo({\r\n        url: `/pages/navigation/search/searchPage?storeId=${this.storeId}&keyword=${this.keyword}`,\r\n      });\r\n    },\r\n\r\n    /** 点击tab */\r\n    changeTab(index) {\r\n      this.current = index;\r\n    },\r\n\r\n    /**\r\n     * 店铺信息\r\n     */\r\n    async getStoreData() {\r\n      let res = await getStoreBaseInfo(this.storeId);\r\n      if (res.data.success) {\r\n        this.storeInfo = res.data.result;\r\n        // 优惠券信息\r\n        this.getCouponsData();\r\n        if(res.data.result.pageShow == '1'){\r\n          // 开启了楼层装修店铺\r\n          this.initPageData();\r\n          this.enablePageData = true;\r\n        }\r\n        else{\r\n          // 商品信息\r\n          this.getGoodsData();\r\n          // 店铺分类\r\n          this.getCategoryData();\r\n          \r\n          this.basePageData = true;\r\n        }\r\n      } else {\r\n        uni.reLaunch({\r\n          url: \"/\",\r\n        });\r\n      }\r\n    },\r\n\r\n    /** 加载商品 */\r\n    async getGoodsData() {\r\n      let res = await getGoodsList(this.goodsParams);\r\n      if (res.data.success) {\r\n        this.goodsList.push(...res.data.result.records);\r\n      }\r\n    },\r\n\r\n    /** 加载优惠券 */\r\n    async getCouponsData() {\r\n      this.couponParams.storeId = this.storeId;\r\n      let res = await getAllCoupons(this.couponParams);\r\n      if (res.data.success) {\r\n        this.couponList.push(...res.data.result.records);\r\n      }\r\n    },\r\n\r\n  \r\n\r\n    /**\r\n     *  是否收藏\r\n     */\r\n    whetherCollection() {\r\n      if (this.isCollection) {\r\n        deleteStoreCollection(this.storeId).then((res) => {\r\n          if (res.data.success) {\r\n            this.isCollection = false;\r\n            uni.showToast({\r\n              icon: \"none\",\r\n              duration: 3000,\r\n              title: \"取消关注成功！\",\r\n            });\r\n          }\r\n        });\r\n      } else {\r\n        collectionStore(this.storeId).then((res) => {\r\n          if (res.data.success) {\r\n            this.isCollection = true;\r\n            uni.showToast({\r\n              icon: \"none\",\r\n              duration: 3000,\r\n              title: \"关注成功！\",\r\n            });\r\n          }\r\n        });\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 领取\r\n     */\r\n    getCoupon(item) {\r\n      if (!this.$options.filters.isLogin(\"auth\")) {\r\n        uni.showToast({\r\n          icon: \"none\",\r\n          duration: 3000,\r\n          title: \"请先登录！\",\r\n        });\r\n\r\n        this.$options.filters.navigateToLogin(\"redirectTo\");\r\n        return false;\r\n      }\r\n      receiveCoupons(item.id).then((res) => {\r\n        if (res.data.success) {\r\n          uni.showToast({\r\n            icon: \"none\",\r\n            duration: 3000,\r\n            title: \"领取成功！\",\r\n          });\r\n        }\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.wrapper {\r\n  background: #fff;\r\n  padding: 32rpx;\r\n}\r\n\r\n.store {\r\n  align-items: center;\r\n\r\n  > .box {\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    margin-left: 30rpx;\r\n    font-size: 24rpx;\r\n    color: #999;\r\n    flex: 2;\r\n\r\n    > .store-name {\r\n      font-size: 34rpx;\r\n      color: #333;\r\n      letter-spacing: 1rpx;\r\n      font-weight: bold;\r\n    }\r\n\r\n    > .store-message {\r\n      margin-top: 25rpx;\r\n\r\n      > div {\r\n        font-size: 26rpx;\r\n        margin: 0 5rpx;\r\n\r\n        > span {\r\n          font-size: 26rpx;\r\n          font-weight: bold;\r\n          color: #333;\r\n          margin-right: 8rpx;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n.collection-btn {\r\n  background: $main-color;\r\n  padding: 6rpx 0;\r\n  width: 140rpx;\r\n  font-size: 24rpx;\r\n  color: #fff;\r\n  border-radius: 100px;\r\n  text-align: center;\r\n}\r\n\r\n.store-desc {\r\n  margin: 40rpx 0 0 0;\r\n  color: #999;\r\n}\r\n\r\n.content {\r\n  margin-top: 20rpx;\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  justify-content: space-between;\r\n\r\n  > .empty {\r\n    width: 100%;\r\n    display: flex;\r\n    justify-content: center;\r\n    margin-top: 40rpx;\r\n  }\r\n\r\n  .item {\r\n    overflow: hidden;\r\n\r\n    background: #fff;\r\n    width: 49%;\r\n    height: 484rpx;\r\n    font-size: 26rpx;\r\n    display: flex;\r\n    flex-direction: column;\r\n    border: 1px solid #f8f8f8;\r\n    margin-bottom: 20rpx;\r\n\r\n    .name {\r\n      text-align: left !important;\r\n      color: #333;\r\n      padding: 0 20rpx;\r\n      margin-top: 20rpx;\r\n      height: 80rpx;\r\n      overflow: hidden;\r\n    }\r\n\r\n    .price {\r\n      font-weight: 500;\r\n      color: $main-color;\r\n      font-size: 30rpx;\r\n      padding: 0 20rpx;\r\n      margin-top: 20rpx;\r\n      white-space: nowrap;\r\n    }\r\n\r\n    .buyCount {\r\n      display: flex;\r\n      padding: 0 20rpx;\r\n      font-size: 24upx;\r\n      justify-content: space-between;\r\n      color: #999;\r\n    }\r\n  }\r\n}\r\n\r\n.discount {\r\n  height: 154rpx;\r\n  border-top: 1px solid #f6f6f6;\r\n  border-bottom: 18rpx solid #f6f6f6;\r\n  background: #f6f6f6;\r\n  overflow: hidden;\r\n  white-space: nowrap;\r\n\r\n  .card-box {\r\n    display: inline-block;\r\n    padding-top: 25rpx;\r\n  }\r\n\r\n  .card {\r\n    width: 324rpx;\r\n    height: 116rpx;\r\n    background: #fff;\r\n    margin-left: 20rpx;\r\n    border-radius: 5px;\r\n    display: flex;\r\n    align-items: center;\r\n\r\n    .money {\r\n      width: 45%;\r\n      color: #fd6466;\r\n      font-weight: 500;\r\n      text-align: center;\r\n\r\n      text {\r\n        font-size: 50rpx;\r\n      }\r\n    }\r\n\r\n    .xian {\r\n      height: 66rpx;\r\n      border: 1px dashed #f6f6f6;\r\n      position: relative;\r\n\r\n      &:before,\r\n      &:after {\r\n        content: \"\";\r\n        width: 22rpx;\r\n        height: 12rpx;\r\n        position: absolute;\r\n        background: #f6f6f6;\r\n      }\r\n\r\n      &:before {\r\n        border-radius: 0 0 22rpx 22rpx;\r\n        top: -30rpx;\r\n        left: -10rpx;\r\n      }\r\n\r\n      &:after {\r\n        border-radius: 22rpx 22rpx 0 0;\r\n        bottom: -30rpx;\r\n        left: -10rpx;\r\n      }\r\n    }\r\n\r\n    .text {\r\n      flex: 1;\r\n      color: $aider-light-color;\r\n      font-size: 24rpx;\r\n      display: flex;\r\n      flex-direction: column;\r\n      margin-left: 14rpx;\r\n\r\n      text:nth-of-type(2) {\r\n        color: #ccc;\r\n      }\r\n\r\n      .cur:nth-of-type(1) {\r\n        color: #ccc;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n.category-item {\r\n  background: #fff;\r\n  padding: 22rpx;\r\n  margin: 20rpx 10rpx;\r\n\r\n  > .flex {\r\n    color: #666;\r\n    justify-content: space-between;\r\n  }\r\n\r\n  > .child-list {\r\n    display: flex;\r\n    margin: 20rpx 0;\r\n    flex-wrap: wrap;\r\n\r\n    > .child {\r\n      justify-content: center;\r\n      margin: 1% 0;\r\n      display: flex;\r\n      width: 48%;\r\n      font-size: 24rpx;\r\n      color: #999;\r\n      margin-right: 1%;\r\n      border: 1rpx solid #ededed;\r\n      box-sizing: border-box;\r\n      height: 70rpx;\r\n      text-align: center;\r\n      line-height: 70rpx;\r\n    }\r\n  }\r\n}\r\n\r\n.kefu {\r\n  background: #f7f7f7;\r\n  height: 70rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin-top: 32rpx;\r\n  border-radius: 10rpx;\r\n  font-size: 24rpx;\r\n  color: #999;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/product/shopPageGoods.vue",
    "content": "<template>\r\n\t<div>\r\n\t\t<u-navbar :title=\"title\"></u-navbar>\r\n\t\t<!-- 商品 -->\r\n\t\t<div class=\"contant\">\r\n\t\t\t<view  v-if=\"!goodsList.length\" class=\"empty\">暂无商品信息</view>\r\n\t\t\t<goodsTemplate  style=\"width: 100%;\" :res='goodsList' :storeName='false' />\r\n\t\t</div>\r\n\t</div>\r\n\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tgetGoodsList\r\n\t} from \"@/api/goods.js\";\r\n\timport goodsTemplate from '@/components/m-goods-list/list'\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\ttitle: \"\",\r\n\t\t\t\trouterVal: \"\",\r\n\t\t\t\tgoodsList: [],\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\tkeyword: \"\",\r\n\t\t\t\t\tstoreCatId: \"\",\r\n\t\t\t\t\tstoreId: \"\",\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomponents: {\r\n\t\t\tgoodsTemplate\r\n\t\t},\r\n\t\tonLoad(options) {\r\n\t\t\tthis.routerVal = options;\r\n\t\t\tthis.params.storeId = options.storeId;\r\n\t\t\tthis.params.storeCatId = options.id;\r\n\t\t\tthis.title = options.title;\r\n\t\t},\r\n\t\tonShow() {\r\n\t\t\tthis.goodsList = []\r\n\t\t\tthis.params.pageNumber = 1;\r\n\t\t\tthis.getGoodsData();\r\n\t\t},\r\n\t\tonReachBottom() {\r\n\t\t\tthis.params.pageNumber++;\r\n\t\t\tthis.getGoodsData();\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tasync getGoodsData() {\r\n\t\t\t\t// #TODO\r\n\t\t\t\tlet goodsList = await getGoodsList(this.params);\r\n\t\t\t\tif (goodsList.data.success) {\r\n\t\t\t\t\tthis.goodsList.push(...goodsList.data.result.records);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t.contant {\r\n\t\tmargin-top: 20rpx;\r\n\t\tdisplay: flex;\r\n\t\tflex-wrap: wrap;\r\n\t\tjustify-content: space-between;\r\n\r\n\t\t>.empty {\r\n\t\t\twidth: 100%;\r\n\t\t\tdisplay: flex;\r\n\t\t\tjustify-content: center;\r\n\t\t\tmargin-top: 40rpx;\r\n\t\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/promotion/bargain/detail.vue",
    "content": "<template>\n  <div class=\"page\">\n    <u-navbar :custom-back=\"back\" back-icon-color=\"#fff\" :background=\"background\" :border-bottom=\"false\">\n    </u-navbar>\n\n    <div class=\"wrapper-box\">\n      <!-- 砍价列表 -->\n      <div class=\"box box1\">\n        <div class=\"bargain\">\n          <div class=\"flex bargain-item\">\n            <div class=\"goods-img\">\n              <u-image width=\"200\" height=\"200\" :src=\"bargainDetail.thumbnail\"></u-image>\n            </div>\n            <div class=\"goods-config\">\n              <div class=\"goods-title wes-2\">\n                {{bargainDetail.goodsName}}\n              </div>\n              <div class=\"flex price-box\">\n                <div class=\"purchase-price\">\n                  当前:<span>￥{{ activityData.surplusPrice == 0 ? this.bargains.purchasePrice :  activityData.surplusPrice | unitPrice}}</span>\n                </div>\n                <div class=\"max-price\">原价:<span>￥{{ bargainDetail.price | unitPrice}}</span>\n\n                </div>\n              </div>\n              <div class=\"tips\">{{bargainDetail.sellingPoint}}</div>\n            </div>\n          </div>\n          <!-- 砍价进度 -->\n          <div class=\"bargain-progress\">\n            <u-line-progress class=\"line\" :active-color=\"lightColor\" striped striped-active :percent=\"totalPercent\">\n            </u-line-progress>\n            <div class=\"flex tips\">\n              <div>已砍{{cutPrice}}元</div>\n              <div>还剩{{activityData.surplusPrice}}元</div>\n            </div>\n          </div>\n          <!-- 参与砍价 -->\n          <div class=\"bargaining\" v-if=\"!activityData.pass && activityData.status!='END'\" @click=\"shareBargain\">\n            邀请砍价\n          </div>\n          <!-- 立即购买 -->\n          <div v-else>\n\n            <div v-if=\"activityData.status!='END'\" class=\"buy\" @click=\"getGoodsDetail\">\n              立即购买\n            </div>\n          </div>\n          <!-- 我要开团 -->\n          <div class=\"start\" v-if=\"activityData.memberId != $options.filters.isLogin().id\" @click=\"startOpenGroup\">我要开团\n          </div>\n        </div>\n      </div>\n      <!-- 帮砍列表 -->\n      <div class=\"box box2\">\n        <div class=\"bargain\">\n          <div class=\"bargain-title\">帮忙砍</div>\n          <div class=\"user-item flex\" v-if=\"logData.length !=0 \" v-for=\"(item,index) in logData\" :key=\"index\">\n            <div>\n              <u-image width=\"75\" shape=\"circle\" height=\"75\" :src=\"item.kanjiaMemberFace\"></u-image>\n            </div>\n            <div class=\"user-config flex\">\n              <div class=\"user-name\">\n                <div>{{item.kanjiaMemberName | noPassByName}}</div>\n                <div>使出吃的奶劲儿</div>\n              </div>\n              <div class=\"save\">砍掉：<span>￥{{item.kanjiaPrice | unitPrice}}</span></div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <!-- 产品详情 -->\n      <div class=\"box box3\">\n        <div class=\"bargain\">\n          <div class=\"bargain-title\">商品详情</div>\n          <view class=\"u-content\">\n            <u-parse :html=\"bargainDetail.mobileIntro\" :tag-style=\"style\"></u-parse>\n          </view>\n\n        </div>\n      </div>\n\n      <!-- 砍价 -->\n      <u-modal title=\"恭喜您砍掉了\" v-model=\"Bargaining\" mask-close-able :show-confirm-button=\"false\"\n        :title-style=\"{color: lightColor}\">\n        <view class=\"slot-content\">\n          <u-count-to :start-val=\"0\" ref=\"uCountTo\" font-size=\"100\" :color=\"lightColor\" :end-val=\"kanjiaPrice\"\n            :decimals=\"2\" :autoplay=\"autoplay\"></u-count-to><span class=\"price\">元</span>\n        </view>\n      </u-modal>\n      <!-- 帮砍 -->\n\n      <u-modal :show-title=\"false\" v-model=\"helpBargainFlage\" :show-confirm-button=\"false\">\n        <view class=\"help-bargain\" @click=\"handleClickHelpBargain\">\n          <u-image width=\"100%\" height=\"600rpx\"\n            src=\"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/91631d5a66c7426bbe3f7d644ee41946.jpeg\"></u-image>\n          <u-image class=\"help\" width=\"300rpx\" height=\"80rpx\" src=\"/pages/promotion/static/help-bargain.png\"></u-image>\n        </view>\n      </u-modal>\n\n      <!-- 分享 -->\n      <shares @close=\"closeShare\" :link=\"share()\" type=\"kanjia\" :thumbnail=\"bargainDetail.thumbnail\"\n        :goodsName=\"bargainDetail.goodsName\" v-if=\"shareFlage \" />\n\n      <!-- 购买 -->\n      <popupGoods ref=\"popupGoods\" :buyMask=\"maskFlag\" @closeBuy=\"closePopupBuy\" :goodsDetail=\"bargainDetail\"\n        :goodsSpec=\"goodsSpec\" v-if=\"bargainDetail.id \" @handleClickSku=\"getGoodsDetail\" />\n\n    </div>\n  </div>\n</template>\n\n<script>\nimport popupGoods from \"@/components/m-buy/goods\"; //购物车商品的模块\nimport {\n  getBargainDetail,\n  getBargainActivity,\n  openBargain,\n  getBargainLog,\n  helpBargain,\n} from \"@/api/promotions\";\nimport shares from \"@/components/m-share/index\";\nimport config from \"@/config/config\";\nexport default {\n  components: {\n    shares,\n    popupGoods,\n  },\n  data() {\n    return {\n      style: {\n        img:\"display:block\"\n      },\n      background: {\n        backgroundColor: \"transparent\",\n      },\n      maskFlag: false, //商品弹框\n      shareFlage: false,\n      lightColor: this.$lightColor,\n      bargains: {},\n      bargainDetail: {}, //砍价商品详情\n      Bargaining: false, //砍价弹出框\n      helpBargainFlage: false, //帮砍弹出框\n      autoplay: false, //砍价金额滚动\n      kanjiaPrice: 0, //砍价金额\n      totalPercent: 0, //砍价半分比\n      activityData: \"\", //砍价活动\n      cutPrice: 0, //已砍金额\n      params: {\n        // id: \"\", //砍价活动ID\n        // kanjiaActivityGoodsId: \"\", //砍价商品SkuID\n        // kanjiaActivityId: \"\", //邀请活动ID，有值说明是被邀请人\n        // status: \"\", //状态\n      },\n\n      logData: [], // 帮砍记录\n      //获取帮砍记录参数\n      logParams: {\n        pageNumber: 1,\n        pageSize: 20,\n        kanJiaActivityId: \"\",\n      },\n\n      goodsDetail: {}, //商品详情\n      goodsSpec: {}, //商品规格\n      selectedGoods: \"\", //选择的商品\n    };\n  },\n  onLoad(options) {\n    this.routerVal = options;\n    if (options.activityId) {\n      this.params.kanjiaActivityId = options.activityId;\n    }\n  },\n\n  // #ifdef MP-WEIXIN\n  onShareAppMessage(res) {\n    return {\n      path: this.share(),\n      title: `请快来帮我砍一刀${this.bargainDetail.goodsName}`,\n      imageUrl: this.bargainDetail.thumbnail || config.logo,\n    };\n  },\n  // #endif\n\n  onShow() {\n    this.init();\n  },\n  watch: {\n    // 砍价弹窗\n    Bargaining(val) {\n      if (val) {\n        this.$nextTick(() => {\n          this.$refs.uCountTo.start();\n        });\n      }\n    },\n    // 监听砍价活动金额\n    activityData: {\n      handler(val) {\n        if (val) {\n          // 计算砍价百分比\n          this.totalPercent =\n            100 -\n            Math.floor((val.surplusPrice / this.bargainDetail.price) * 100);\n          this.cutPrice = (\n            this.bargainDetail.price - this.activityData.surplusPrice\n          ).toFixed(2);\n          // 获取砍价日志\n          this.logParams.kanJiaActivityId = val.id;\n\n          // 判断是否是帮砍\n          if (this.params.kanjiaActivityId && val.help) {\n            this.helpBargainFlage = true;\n          }\n\n          this.getBargainLogList();\n        }\n      },\n      immediate: true,\n    },\n  },\n  methods: {\n    share() {\n      return (\n        \"/pages/promotion/bargain/detail?id=\" +\n        this.routerVal.id +\n        \"&activityId=\" +\n        this.activityData.id\n      );\n    },\n    // 返回上一级\n    back() {\n      // 进行路由栈判定如果当前路由栈是空的就返回拼团列表页面\n      if (getCurrentPages().length > 1) {\n        uni.navigateBack();\n      } else {\n        uni.redirectTo({\n          url: `/pages/promotion/bargain/list`,\n        });\n      }\n    },\n\n    // 跳转选择商品页面\n    startOpenGroup() {\n      uni.redirectTo({\n        url: `/pages/promotion/bargain/list`,\n      });\n    },\n    closePopupBuy(val) {\n      this.maskFlag = false;\n    },\n    closeShare() {\n      this.shareFlage = false;\n    },\n    // 邀请砍价\n    shareBargain() {\n      this.shareFlage = true;\n    },\n\n    // 获取商品详情\n    getGoodsDetail() {\n      uni.showLoading({\n        title: \"加载中\",\n        mask: true,\n      });\n      this.$refs.popupGoods.buy({\n        skuId: this.bargainDetail.id,\n        id: this.routerVal.id,\n        num: 1,\n        cartType: \"KANJIA\",\n      });\n    },\n\n    // 初始化商品以及砍价活动\n    async init() {\n      // 获取商品\n      let res = await getBargainDetail(this.routerVal.id);\n      if (res.data.success) {\n        this.bargainDetail = res.data.result.goodsSku;\n        this.bargains = res.data.result;\n        // 被邀请活动id\n        if (this.params.kanjiaActivityId) {\n        } else {\n          this.params.kanjiaActivityGoodsId = this.routerVal.id;\n        }\n        // 获取砍价活动\n        this.activity();\n      }\n    },\n    // 获取砍价活动\n    async activity() {\n      let res = await getBargainActivity(this.params);\n      // 判断当前是否是第一次进入，如果是第一次进入默认砍一刀\n      res.data.success\n        ? res.data.result.launch\n          ? (this.activityData = res.data.result)\n          : this.openActivity()\n        : \"\";\n    },\n    // 分页获取砍价活动-帮砍记录\n    async getBargainLogList() {\n      let res = await getBargainLog(this.logParams);\n      if (res.data.success) {\n        this.logData = res.data.result.records;\n      }\n    },\n    // 帮忙砍一刀\n    async handleClickHelpBargain() {\n      let res = await helpBargain(this.params.kanjiaActivityId);\n      if (res.data.success) {\n        this.helpBargainFlage = false;\n        this.kanjiaPrice = res.data.result.kanjiaPrice;\n        this.Bargaining = true;\n        // 帮砍完成之后查询帮砍记录\n        this.init();\n      } else {\n        this.helpBargainFlage = false;\n      }\n    },\n    // 发起砍价活动\n    async openActivity(data) {\n      let res = await openBargain({ id: this.routerVal.id });\n      if (res.data.success) {\n        this.kanjiaPrice = res.data.result.kanjiaPrice;\n        this.Bargaining = true;\n        // 查询帮砍记录\n        this.init();\n      }\n    },\n  },\n};\n</script>\n<style lang=\"scss\">\npage {\n  background-color: $light-color !important;\n}\n</style>\n<style lang=\"scss\" scoped>\n.slot-content {\n  display: flex;\n  align-items: flex-end;\n  justify-content: center;\n  margin: 20rpx 0 80rpx 0;\n}\n.price {\n  margin-left: 10rpx;\n  color: $light-color;\n}\n.price-box {\n  align-items: center;\n  padding: 10rpx 0;\n}\n.wrapper-box {\n  background: url(\"https://lili-system.oss-cn-beijing.aliyuncs.com/kanjia.png\");\n  background-repeat: no-repeat;\n  background-size: 100% 100%;\n  height: 506rpx;\n  width: 100%;\n}\n\n.box {\n  background: #fff;\n  border-radius: 20rpx;\n  position: relative;\n  width: 94%;\n  margin: 0 auto;\n  > .bargain {\n    padding: 32rpx;\n  }\n}\n.box1 {\n  top: 560rpx;\n}\n.box2 {\n  top: 580rpx;\n}\n.box3 {\n  top: 600rpx;\n}\n.box4 {\n  top: 620  rpx;\n  height: 200rpx;\n}\n.bargain-item {\n  align-items: center;\n}\n.goods-config {\n  margin-left: 20rpx;\n  > .goods-title {\n    font-weight: bold;\n  }\n}\n.max-price,\n.purchase-price {\n  font-size: 24rpx;\n  color: #999;\n}\n.max-price {\n  margin-left: 10rpx;\n  text-decoration: line-through;\n}\n.purchase-price {\n  color: $main-color;\n  > span {\n    font-size: 32rpx;\n    font-weight: bold;\n  }\n}\n.bargaining,\n.buy,\n.start {\n  font-size: 24rpx;\n\n  width: 80%;\n  margin: 50rpx auto 0 auto;\n  text-align: center;\n\n  font-size: 30rpx;\n  padding: 18rpx;\n  border-radius: 100px;\n}\n.start {\n  border: 1rpx solid $main-color;\n  color: $main-color;\n}\n.bargaining,\n.buy {\n  font-size: 24rpx;\n  color: #fff;\n  width: 80%;\n  margin: 50rpx auto 0 auto;\n  text-align: center;\n  font-size: 30rpx;\n  background-image: linear-gradient(\n    25deg,\n    $main-color,\n    $light-color,\n    $aider-light-color\n  );\n\n  padding: 18rpx;\n  border-radius: 100px;\n  animation: mymove 5s infinite;\n  -webkit-animation: mymove 5s infinite; /*Safari and Chrome*/\n  animation-direction: alternate; /*轮流反向播放动画。*/\n  animation-timing-function: ease-in-out; /*动画的速度曲线*/\n  /* Safari 和 Chrome */\n  -webkit-animation: mymove 5s infinite;\n  -webkit-animation-direction: alternate; /*轮流反向播放动画。*/\n  -webkit-animation-timing-function: ease-in-out; /*动画的速度曲线*/\n}\n\n@keyframes mymove {\n  0% {\n    transform: scale(1); /*开始为原始大小*/\n  }\n  25% {\n    transform: scale(1.1); /*放大1.1倍*/\n  }\n  50% {\n    transform: scale(1);\n  }\n  75% {\n    transform: scale(1.1);\n  }\n}\n.line {\n  margin: 20rpx 0;\n}\n.tips {\n  font-size: 24rpx;\n  color: #999;\n  justify-content: space-between;\n}\n.bargain-progress {\n  margin: 20rpx 0;\n}\n.bargain-title {\n  font-size: 32rpx;\n  font-weight: bold;\n  color: $light-color;\n  text-align: center;\n  margin-bottom: 40rpx;\n}\n.user-item {\n  margin: 40rpx 0;\n  align-items: center;\n}\n.user-config {\n  margin-left: 20rpx;\n  flex: 8;\n  align-items: center;\n  justify-content: space-between;\n  > .user-name {\n    > div:nth-of-type(1) {\n      font-size: 28rpx;\n      max-width: 300rpx;\n      overflow: hidden;\n      word-wrap: normal;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n    > div:nth-last-of-type(1) {\n      font-size: 24rpx;\n      color: #999;\n    }\n  }\n}\n.save {\n  color: $light-color;\n  > span {\n    font-weight: bold;\n  }\n}\n.mobile-intro {\n  overflow: hidden;\n  max-width: 100%;\n}\n\n@keyframes fontMove {\n  0% {\n    transform: scale(1); /*开始为原始大小*/\n  }\n  25% {\n    transform: scale(1.1); /*放大1.1倍*/\n  }\n  50% {\n    transform: scale(1);\n  }\n  75% {\n    transform: scale(1.1);\n  }\n}\n\n.help-bargain {\n  display: flex;\n  justify-content: center;\n  flex-direction: column;\n  align-items: center;\n  > .help {\n    margin-bottom: 40rpx;\n    border-radius: 20rpx;\n\n    margin-top: 40rpx;\n    animation: fontMove 5s infinite;\n    -webkit-animation: fontMove 5s infinite; /*Safari and Chrome*/\n    animation-direction: alternate; /*轮流反向播放动画。*/\n    animation-timing-function: ease-in-out; /*动画的速度曲线*/\n    /* Safari 和 Chrome */\n    -webkit-animation: fontMove 5s infinite;\n    -webkit-animation-direction: alternate; /*轮流反向播放动画。*/\n    -webkit-animation-timing-function: ease-in-out; /*动画的速度曲线*/\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/promotion/bargain/list.vue",
    "content": "<template>\n  <div class=\"page\">\n    <u-navbar :custom-back=\"back\" back-icon-color=\"#fff\" :background=\"background\" :border-bottom=\"false\" >\n    </u-navbar>\n    <div class=\"wrapper\">\n      <!-- 砍价列表 -->\n      <div class=\"box\">\n        <!-- 已砍的商品 -->\n        <goodsTemplate type=\"kanJia\" v-if=\"bargainList.length!=0\" :res=\"bargainList\" />\n        <div class=\"bargain empty\" v-else>\n          <u-empty text=\"暂无活动\" mode=\"list\"></u-empty>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getBargainList } from \"@/api/promotions\";\nimport goodsTemplate from '@/components/m-goods-list/promotion'\nexport default {\n  components:{goodsTemplate},\n  data() {\n    return {\n      background: {\n        backgroundColor: \"transparent\",\n      },\n      params: {\n        promotionStatus: \"START\", //开始/上架\n        pageNumber: 1,\n        pageSize: 20,\n      },\n      bargainList: [], //砍价活动列表\n    };\n  },\n  onShow() {\n    this.params.pageNumber = 1;\n    this.bargainList = [];\n    this.init();\n  },\n  onReachBottom() {\n    this.params.pageNumber++;\n    this.init();\n  },\n  methods: {\n    // 返回上一级\n    back() {\n      uni.switchTab({\n        url: \"/pages/tabbar/home/index\",\n      });\n    },\n    /**\n     * 初始化砍价列表\n     */\n    async init() {\n      let res = await getBargainList(this.params); //砍价列表\n      if (res.data.success) {\n        this.bargainList.push(...res.data.result.records);\n      }\n    },\n\n    // 跳转到砍价详情\n    navigateToBargainDetail(val) {\n      uni.navigateTo({\n        url: `/pages/promotion/bargain/detail?id=${val.id}`,\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\">\npage {\n  background-color: $light-color !important;\n}\n</style>\n<style lang=\"scss\" scoped>\n.wrapper {\n  background: url(\"https://lili-system.oss-cn-beijing.aliyuncs.com/kanjia.png\");\n  background-repeat: no-repeat;\n  background-size: 100% 100%;\n  height: 506rpx;\n  width: 100%;\n}\n\n.box {\n  background: #fff;\n  border-radius: 20rpx;\n  position: relative;\n  top: 560rpx;\n  width: 94%;\n  margin: 0 auto;\n  > .bargain {\n    padding: 32rpx;\n  }\n}\n.bargain-item {\n  align-items: center;\n  border-bottom: 1rpx solid #f6f6f6;\n  padding: 32rpx 0;\n}\n.goods-config {\n  flex: 8;\n  margin-left: 20rpx;\n  > .goods-title {\n    height: 80rpx;\n    font-weight: bold;\n  }\n}\n.max-price {\n  color: $main-color;\n  font-size: 24rpx;\n  > span {\n    font-size: 32rpx;\n    font-weight: bold;\n  }\n}\n.goods-buy {\n  margin: 10rpx 0;\n  align-items: center;\n  justify-content: space-between;\n}\n.bargaining {\n  font-size: 24rpx;\n  color: #fff;\n  background: $light-color;\n  padding: 10rpx 24rpx;\n  border-radius: 100px;\n}\n.empty {\n  height: 400rpx;\n}\n</style>"
  },
  {
    "path": "pages/promotion/bargain/log.vue",
    "content": "<template>\n  <div class=\"box\">\n    <div v-if=\"bargainLog.length != 0\">\n      <div v-for=\"(item,index) in bargainLog\" class=\"flex\" :key=\"index\">\n        <div>\n          <u-image border-radius=\"20\" width='230' height=\"230\" :src=\"item.thumbnail\"></u-image>\n        </div>\n        <div class=\"goods\">\n          <div class=\"wes-2\">\n            {{item.goodsName}}\n          </div>\n          <div>\n            还剩<span class=\"surplusPrice\">{{item.surplusPrice | unitPrice}}元</span>\n          </div>\n\n          <div @click=\"navigateToBargainDetail(item)\" v-if=\"item.status == 'START'\" class=\"buy\">\n            继续免费领\n          </div>\n        </div>\n        <div class=\"tips-box\">\n          <div class=\"tips\" :class=\"[item.status]\">\n            {{statusWay[item.status]}}\n          </div>\n        </div>\n      </div>\n    </div>\n    <div v-else>\n      <u-empty style=\"margin-top:20%;\" text=\"暂无砍价活动\"></u-empty>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getMineBargainLog } from \"@/api/promotions\";\nexport default {\n  data() {\n    return {\n      params: {\n        pageNumber: 1,\n        pageSize: 10,\n      },\n      bargainLog: [],\n      statusWay: {\n        START: \"砍价开始\",\n        FAIL: \"砍价失败\",\n        SUCCESS: \"砍价成功\",\n        END: \"活动结束\",\n      },\n    };\n  },\n  onReachBottom() {\n    this.params.pageNumber++;\n    this.init();\n  },\n  onShow() {\n    this.params.pageNumber = 1;\n    this.bargainLog = [];\n    this.init();\n  },\n  methods: {\n    // 初始化砍价记录\n    async init() {\n      let res = await getMineBargainLog(this.params);\n      if (res.data.success) {\n        this.bargainLog.push(...res.data.result.records);\n      }\n    },\n    // 跳转到砍价详情\n    navigateToBargainDetail(val) {\n      uni.navigateTo({\n        url: `/pages/promotion/bargain/detail?id=${val.kanjiaActivityGoodsId}`,\n      });\n    },\n  },\n};\n</script>\n<style scoped>\npage {\n  background: #fff;\n}\n</style>\n<style scoped lang=\"scss\">\n.box {\n  padding: 0 32rpx;\n  background: #fff;\n}\n.buy {\n  background: $light-color;\n  color: #fff;\n  display: inline;\n  padding: 10rpx 0;\n  border-radius: 100rpx;\n  width: 200rpx;\n  text-align: center;\n  font-size: 24rpx;\n  margin-top: 20rpx;\n}\n.tips-box {\n  flex: 1;\n  justify-content: center;\n  display: flex;\n\n  align-items: center;\n}\n.tips {\n  color: #999;\n\n  margin-top: 20rpx;\n}\n.surplusPrice {\n  font-size: 40rpx;\n  margin-left: 10rpx;\n  font-weight: bold;\n  color: $light-color;\n}\n.goods {\n  margin: 0 20rpx;\n  display: flex;\n  flex: 2;\n  flex-direction: column;\n  justify-content: center;\n}\n.flex {\n  border-bottom: 1rpx solid #f7f7f7;\n\n  padding: 20rpx 0;\n  margin: 10rpx 0;\n}\n.SUCCESS {\n  color: $light-color;\n}\n.START {\n  color: $aider-light-color;\n}\n.END {\n  color: #999;\n}\n.FAIL {\n  color: $main-color;\n}\n</style>"
  },
  {
    "path": "pages/promotion/joinGroup.vue",
    "content": "<template>\r\n\t<view class=\"wrapper\">\r\n\t\t<u-navbar :border-bottom=\"false\"  :title=\"title\">\r\n\t\t\t<!-- 中间 -->\r\n\t\t\t<view class=\"slot-wrap container-wrap\">\r\n\t\t\t\t<view v-if=\"search\">\r\n\t\t\t\t\t<u-search @search=\"searchFun()\" @custom=\"searchFun()\" v-model=\"params.goodsName\"></u-search>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<!-- 右侧 -->\r\n\t\t\t<view slot=\"right\">\r\n\t\t\t\t<view style=\"margin-right: 24rpx;\" @click=\"searchFlag()\">\r\n\t\t\t\t\t<view v-if=\"search\">取消</view>\r\n\t\t\t\t\t<u-icon v-if=\"!search\" size=\"44rpx\" name=\"search\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</u-navbar>\r\n\t\t<!-- 顶部栏 -->\r\n\t\t<div class='header-wraper'>\r\n\t\t\t<image  src=\"/static/join-buy.png\"></image>\r\n\t\t</div>\r\n\t\t<!-- 商品栏 -->\r\n\t\t<div class=\"swiper\">\r\n\t\t\t<goodsTemplate v-if=\"goodsList.length\" :res=\"goodsList\" />\r\n\t\t\t\r\n\t\t\t<u-empty v-else style=\"margin-top:20%\" text=\"暂无拼团活动\" mode=\"data\"></u-empty>\r\n\t\t</div>\r\n\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport * as API_Promotions from \"@/api/promotions\";\r\n\timport * as API_Goods from \"@/api/goods\";\r\n\timport goodsTemplate from '@/components/m-goods-list/promotion.vue'\r\n\texport default {\r\n\t\tcomponents: {\r\n\t\t\tgoodsTemplate\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tis_empty: false,\r\n\t\t\t\tsearch: false,\r\n\t\t\t\ttitle: \"拼团活动\",\r\n\r\n\t\t\t\tempty: false,\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\tcategoryPath: \"\",\r\n\t\t\t\t\tgoodsName: \"\",\r\n\t\t\t\t},\r\n\t\t\t\tgoodsList: [],\r\n\t\t\t};\r\n\t\t},\r\n\t\tmounted() {},\r\n\t\twatch: {\r\n\t\t\tsearch(val) {\r\n\t\t\t\tval ? (this.title = \"\") : (this.title = \"拼团活动\");\r\n\t\t\t},\r\n\t\t},\r\n\t\tonReachBottom() {\r\n\t\t\tthis.loadMore();\r\n\t\t},\r\n\t\t// 点击搜索按钮\r\n\t\tonNavigationBarButtonTap(e) {\r\n\t\t\tthis.popupFlag = !this.popupFlag;\r\n\t\t},\r\n\t\tasync onLoad() {\r\n\t\t\tthis.GET_AssembleGoods();\r\n\t\t},\r\n\r\n\t\tmethods: {\r\n\t\t\tloadMore() {\r\n\t\t\t\tthis.params.pageNumber++;\r\n\t\t\t\tthis.GET_AssembleGoods();\r\n\t\t\t},\r\n\t\t\tsearchFlag() {\r\n\t\t\t\tthis.search = !this.search;\r\n\t\t\t},\r\n\r\n\t\t\ttoHref(goods) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: `/pages/product/goods?id=${goods.skuId}&goodsId=${goods.goodsId}`,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tsearchFun() {\r\n\t\t\t\tthis.goodsList = [];\r\n\t\t\t\tthis.GET_AssembleGoods();\r\n\t\t\t},\r\n\t\t\t// 请求拼团数据\r\n\t\t\tGET_AssembleGoods() {\r\n\r\n\t\t\t\tconst params = JSON.parse(JSON.stringify(this.params));\r\n\t\t\t\tif (params.category_id === 0) delete params.category_id;\r\n\r\n\t\t\t\tAPI_Promotions.getAssembleList(params)\r\n\t\t\t\t\t.then((response) => {\r\n\t\t\t\t\t\tconst data = response.data.result.records;\r\n\r\n\t\t\t\t\t\tif (!data || !data.length) {\r\n\t\t\t\t\t\t\tthis.is_empty = true;\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif (data.length <= this.params.pageSize) {\r\n\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.is_empty = false;\r\n\t\t\t\t\t\t\tthis.goodsList.push(...(data || []));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(() => {});\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t.header-wraper {\r\n\t\tbackground: url('/static/bg.png');\r\n\t\theight: 200rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\t>image{\r\n\t\t\twidth: 188rpx;\r\n\t\t\theight: 60rpx;\r\n\t\t}\r\n\t}\r\n\t\r\n</style>\r\n"
  },
  {
    "path": "pages/promotion/lives.vue",
    "content": "<template>\n  <div class=\"box\">\n    <u-navbar class=\"navbar\">\n      <view class=\"slot-wrap\">\n        <u-search placeholder=\"搜索直播间\" @custom=\"searchLive\" @clear=\"clear\" @search=\"searchLive\" v-model=\"keyword\"></u-search>\n      </view>\n    </u-navbar>\n    <!-- 轮播图 -->\n    <u-swiper @click=\"clickSwiper\" class=\"swiper\" :effect3d=\"true\" :list=\"swiperImg\">\n\n    </u-swiper>\n    <u-tabs :is-scroll=\"false\" @change=\"changeTabs\" :current=\"current\" :active-color=\"activeColor\" inactive-color=\"#606266\" ref=\"tabs\" :list=\"tabs\"></u-tabs>\n\n    <div class=\"wrapper\">\n      <!-- 直播中 全部 直播回放 -->\n      <div class=\"live-item\" :class=\"{'invalid':item.status == 'END'}\" v-for=\"(item,index) in liveList\" :key=\"index\" @click=\"handleLivePlayer(item)\">\n        <div class=\"live-cover-img\">\n          <div class=\"tips\">\n            <div class=\"live-box\">\n              <image class=\"live-gif\" src=\"./static/live.gif\"></image>\n            </div>\n            <span>{{item.status == 'END' ? '已结束' : item.status =='NEW' ? '未开始' : '直播中'}}</span>\n          </div>\n          <div class=\"bg\"></div>\n          <u-image width=\"326\" height=\"354\" :src=\"item.shareImg\" />\n        </div>\n        <div class=\"live-goods\">\n          <div class=\"live-goods-name\">\n            {{item.name}}\n          </div>\n          <div class=\"live-store\">\n            <span class=\"wes\">lilishop</span>\n          </div>\n          <div class=\"live-goods-list\">\n            <div class=\"live-goods-item\">\n              <u-image border-radius=\"20\" :src=\"item.roomGoodsList ? item.roomGoodsList[0] : ''\" height=\"140\"></u-image>\n            </div>\n            <div class=\"live-goods-item\">\n              <u-image border-radius=\"20\" :src=\"item.roomGoodsList ? item.roomGoodsList[1] : ''\" height=\"140\"></u-image>\n            </div>\n          </div>\n        </div>\n      </div>\n      <u-loadmore v-if=\"liveList.length > 10\" bg-color=\"#f8f8f8\" :status=\"status\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getLiveList } from \"@/api/promotions.js\";\nexport default {\n  data() {\n    return {\n      status: \"loadmore\",\n      activeColor: this.$lightColor,\n      current: 0, // 当前tabs索引\n      keyword: \"\", //搜索直播间\n      // 标签栏\n      tabs: [\n        {\n          name: \"直播中\",\n        },\n        {\n          name: \"全部\",\n        },\n      ],\n      // 导航栏的配置\n      background: {\n        background: \"#ff9f28\",\n      },\n      // 直播间params\n      params: [\n        {\n          pageNumber: 1,\n          pageSize: 10,\n          status: \"START\",\n        },\n        {\n          pageNumber: 1,\n          pageSize: 4,\n        },\n      ],\n      // 推荐直播间Params\n      recommendParams: {\n        pageNumber: 1,\n        pageSize: 3,\n        recommend: 0,\n      },\n      // 直播间列表\n      liveList: [],\n      // 推荐直播间列表\n      recommendLiveList: [],\n\n      //轮播图滚动的图片\n      swiperImg: [\n        {\n          image:\n            \"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/48d789cb9c864b7b87c1c0f70996c3e8.jpeg\",\n        },\n      ],\n    };\n  },\n  onShow() {\n    this.params[this.current].pageNumber = 1;\n    this.liveList = [];\n    this.getLives();\n    this.getRecommendLives();\n  },\n  onReachBottom() {\n    this.params[this.current].pageNumber++;\n    this.getLives();\n  },\n  methods: {\n    /**\n     * 点击标签栏切换\n     */\n    changeTabs(index) {\n      this.current = index;\n      this.init();\n    },\n\n    /**\n     * 初始化直播间\n     */\n    init() {\n      this.liveList = [];\n      this.status = \"loadmore\";\n      this.getLives();\n    },\n\n    /**\n     * 清除搜索内容\n     */\n    clear() {\n      delete this.params[this.current].name;\n      this.init();\n    },\n    /**\n     * 点击顶部推荐直播间\n     */\n    clickSwiper(val) {\n      console.log(this.swiperImg[val]);\n      this.handleLivePlayer(this.swiperImg[val]);\n    },\n\n    /**\n     * 搜索直播间\n     */\n    searchLive(val) {\n      this.params[this.current].pageNumber = 1;\n      this.params[this.current].name = val;\n      this.init();\n    },\n    /**\n     * 获取推荐直播间\n     */\n    async getRecommendLives() {\n      this.status = \"loading\";\n      let recommendLives = await getLiveList(this.recommendParams);\n      if (recommendLives.data.success) {\n        // 推荐直播间\n        if (recommendLives.data.result.records.length ) {\n          this.status = \"loadmore\";\n          this.recommendLives = recommendLives.data.result.records;\n        } else {\n          this.status = \"noMore\";\n        }\n\n        /**\n         * 如果推荐直播间没有的情况下\n         * 1.获取直播间第一个图片\n         * 2.如果没有直播间设置一个默认图片\n         */\n\n        if (!this.recommendLives.length) {\n          if (this.liveList[0].shareImg) {\n            this.$set(this, \"swiperImg\", [\n              {\n                image: this.liveList[0].shareImg,\n                roomId: this.liveList[0].roomId,\n              },\n            ]);\n          }\n        } else {\n          this.recommendLives.forEach((item) => {\n            this.$set(this, \"swiperImg\", [\n              { image: item.shareImg, roomId: item.roomId },\n            ]);\n          });\n        }\n      }\n    },\n\n    /**\n     * 获取直播间\n     */\n    async getLives() {\n      this.status = \"loading\";\n      let res = await getLiveList(this.params[this.current]);\n      // 直播间\n      if (res.data.success) {\n        if (res.data.result.records.length ) {\n          this.status = \"loadmore\";\n          this.liveList.push(...res.data.result.records);\n        } else {\n          this.status = \"noMore\";\n        }\n        res.data.result.total >\n        this.params[this.current].pageNumber *\n          this.params[this.current].pageSize\n          ? (this.status = \"loadmore\")\n          : (this.status = \"noMore\");\n\n      \n        this.liveList.forEach((item) => {\n          if (item.roomGoodsList) {\n            item.roomGoodsList = JSON.parse(item.roomGoodsList);\n          }\n        });\n      }\n    },\n\n    /**\n     * 进入直播间\n     */\n    handleLivePlayer(val) {\n      // #ifdef MP-WEIXIN\n      let roomId = val.roomId; // 填写具体的房间号，可通过下面【获取直播房间列表】 API 获取\n      let customParams = encodeURIComponent(\n        JSON.stringify({ path: \"pages/index/index\", pid: 1 })\n      ); // 开发者在直播间页面路径上携带自定义参数，后续可以在分享卡片链接和跳转至商详页时获取，详见【获取自定义参数】、【直播间到商详页面携带参数】章节（上限600个字符，超过部分会被截断）\n      uni.navigateTo({\n        url:\n          \"plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=\" +\n          roomId +\n          \"&custom_params=\" +\n          customParams,\n      });\n      // #endif\n\n      // #ifndef MP-WEIXIN\n      uni.showToast({\n        title: \"请从微信小程序中预览直播功能\",\n        duration: 2000,\n        icon: \"none\",\n      });\n      // #endif\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.slot-wrap {\n  display: flex;\n  align-items: center;\n  /* 如果您想让slot内容占满整个导航栏的宽度 */\n  flex: 1;\n  /* 如果您想让slot内容与导航栏左右有空隙 */\n  /* padding: 0 30rpx; */\n}\n.invalid {\n  filter: grayscale(1);\n}\n.wrapper {\n  padding: 0 24rpx;\n}\n.live-item {\n  display: flex;\n  overflow: hidden;\n  border-radius: 20rpx;\n  flex-wrap: wrap;\n  background: #fff;\n\n  margin: 20rpx 0;\n}\n.live-cover-img {\n  position: relative;\n}\n.swiper {\n  margin: 20rpx 0;\n}\n\n.live-goods {\n  position: relative;\n  flex: 1;\n  padding: 16rpx 24rpx 24rpx;\n}\n.live-goods-name {\n  height: 84rpx;\n  font-weight: bold;\n  font-size: 30rpx;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n}\n.live-store {\n  display: flex;\n  align-items: center;\n  margin: 20rpx 0;\n  overflow: hidden;\n  width: calc(100% - 50rpx);\n}\n.live-gif {\n  width: 20rpx;\n  height: 20rpx;\n}\n.live-box {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 50%;\n  width: 40rpx;\n  margin-right: 10rpx;\n  height: 40rpx;\n  background: linear-gradient(90deg, #ff6b35, #ff9f28, #ffcc03);\n}\n.live-goods-list {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  > .live-goods-item {\n    flex: 1;\n  }\n  > .live-goods-item:nth-of-type(1) {\n    padding-right: 38rpx;\n  }\n}\n\n.live-icon,\n.zan {\n  position: absolute;\n  width: 80rpx;\n  height: 80rpx;\n  z-index: 9;\n}\n.tips {\n  display: flex;\n  position: absolute;\n  z-index: 9;\n\n  align-items: center;\n  top: 20rpx;\n  right: 0;\n  padding: 4rpx 12rpx 4rpx 0;\n  font-size: 24rpx;\n  border-radius: 100px;\n  color: #fff;\n  background: rgba(0, 0, 0, 0.46);\n}\n.live-icon {\n  right: 0;\n  top: 104rpx;\n}\n\n.zan {\n  bottom: 0;\n  right: 0;\n  width: 100rpx;\n  height: 100rpx;\n}\n.bg {\n  position: absolute;\n  bottom: 4rpx;\n  width: 100%;\n  height: 100rpx;\n  z-index: 8;\n  background-image: -webkit-gradient(\n    linear,\n    left bottom,\n    left top,\n    from(rgba(0, 0, 0, 0.25)),\n    color-stop(82%, transparent)\n  );\n  background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.25), transparent 82%);\n  border-bottom-left-radius: 20rpx;\n}\n</style>"
  },
  {
    "path": "pages/promotion/point/detail.vue",
    "content": "<template>\n  <div class=\"page\">\n    <u-navbar :border-bottom=\"false\" title=\"积分商品\"></u-navbar>\n\n    <div class=\"wrapper\">\n      <!-- 积分商品列表 -->\n      <div class=\"box box1\">\n        <div class=\"bargain\">\n          <div class=\"row-title\">商品信息</div>\n          <div class=\"flex row-item\">\n            <div class=\"goods-img\">\n              <u-image width=\"200\" height=\"200\" :src=\"goodsData.thumbnail\"></u-image>\n            </div>\n            <div class=\"goods-config\">\n              <div class=\"goods-title wes-2\">\n                {{goodsData.goodsName}}\n              </div>\n              <div class=\"flex price-box\">\n                <div class=\"purchase-price\">积分:<span>{{ pointDetail.points | unitPrice }}</span>\n                </div>\n                <div class=\"max-price\">原价:<span>￥{{ goodsData.price | unitPrice}}</span>\n\n                </div>\n              </div>\n              <div class=\"tips\">{{goodsData.sellingPoint}}</div>\n            </div>\n          </div>\n\n          <div class=\"buy\" @click=\"getGoodsDetail\">\n            立即购买\n          </div>\n        </div>\n      </div>\n\n      <!-- 产品详情 -->\n      <div class=\"box box3\">\n        <div class=\"bargain\">\n          <div class=\"row-title\">商品详情</div>\n          <view class=\"u-content\">\n            <u-parse :html=\"goodsData.mobileIntro\" :tag-style=\"style\"></u-parse>\n          </view>\n        </div>\n      </div>\n\n      <!-- 购买 -->\n      <popupGoods ref=\"popupGoods\" :goodsSpec=\"goodsSpec\" :buyMask=\"maskFlag\" @closeBuy=\"closePopupBuy\" :goodsDetail=\"goodsData\" v-if=\"goodsData.id \" @handleClickSku=\"getGoodsDetail\" />\n\n      <div class=\"box4\"></div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport popupGoods from \"@/components/m-buy/goods\"; //购物车商品的模块\nimport { getPointsGoodsDetail } from \"@/api/promotions\";\nexport default {\n  components: {\n    popupGoods,\n  },\n  data() {\n    return {\n      style: {\n        img:\"display:block\"\n      },\n      maskFlag: false, //商品弹框\n      lightColor: this.$lightColor,\n      goodsData: {}, //积分商品中商品详情\n      pointDetail: {}, //积分商品详情\n      goodsDetail: {}, //商品详情\n      goodsSpec: {}, //商品规格\n      selectedGoods: {},\n    };\n  },\n  onLoad(options) {\n    this.routerVal = options;\n  },\n  onShow() {\n    this.init();\n  },\n  watch: {},\n  methods: {\n    // 购买积分商品\n    getGoodsDetail() {\n      uni.showLoading({\n        title: \"加载中\",\n        mask: true,\n      });\n      this.$refs.popupGoods.buy({\n        skuId: this.goodsData.id,\n        num: 1,\n        cartType: \"POINTS\",\n      });\n    },\n\n    // 初始化商品\n    async init() {\n      // 获取商品\n      let res = await getPointsGoodsDetail(this.routerVal.id);\n      if (res.data.success) {\n        this.goodsData = res.data.result.goodsSku;\n        this.pointDetail = res.data.result;\n      }\n    },\n  },\n};\n</script>\n<style lang=\"scss\">\n</style>\n<style lang=\"scss\" scoped>\n.page {\n  min-height: 100vh;\n}\n.slot-content {\n  display: flex;\n  align-items: flex-end;\n  justify-content: center;\n  margin: 20rpx 0 80rpx 0;\n}\n.price {\n  margin-left: 10rpx;\n  color: #44a88d;\n}\n.price-box {\n  align-items: center;\n  padding: 10rpx 0;\n}\n\n.box {\n  background: #fff;\n  border-radius: 20rpx;\n  position: relative;\n\n  margin: 40rpx auto;\n  > .bargain {\n    padding: 32rpx;\n  }\n}\n\n.row-item {\n  align-items: center;\n}\n.goods-config {\n  margin-left: 20rpx;\n  > .goods-title {\n    font-weight: bold;\n  }\n}\n.max-price,\n.purchase-price {\n  font-size: 24rpx;\n  color: #999;\n}\n.max-price {\n  margin-left: 10rpx;\n  text-decoration: line-through;\n}\n.purchase-price {\n  color: #44a88d;\n  > span {\n    font-size: 32rpx;\n    font-weight: bold;\n  }\n}\n\n.buy {\n  font-size: 24rpx;\n  color: #fff;\n  width: 80%;\n  margin: 50rpx auto 0 auto;\n  text-align: center;\n  font-size: 30rpx;\n  background-image: linear-gradient(25deg, #00627d, #2d8485, #44a88d, #57ce93);\n\n  padding: 18rpx;\n  border-radius: 100px;\n}\n\n.line {\n  margin: 20rpx 0;\n}\n.tips {\n  font-size: 24rpx;\n  color: #999;\n  justify-content: space-between;\n}\n.row-progress {\n  margin: 20rpx 0;\n}\n.row-title {\n  font-size: 32rpx;\n  font-weight: bold;\n  color: #44a88d;\n  text-align: center;\n  margin-bottom: 40rpx;\n}\n.user-item {\n  margin: 40rpx 0;\n  align-items: center;\n}\n.user-config {\n  margin-left: 20rpx;\n  flex: 8;\n  align-items: center;\n  justify-content: space-between;\n  > .user-name {\n    > div:nth-of-type(1) {\n      font-size: 28rpx;\n    }\n    > div:nth-last-of-type(1) {\n      font-size: 24rpx;\n      color: #999;\n    }\n  }\n}\n\n.mobile-intro {\n  overflow: hidden;\n  max-width: 100%;\n}\n</style>\n"
  },
  {
    "path": "pages/promotion/point/pointList.vue",
    "content": "<template>\r\n  <view class=\"index\">\r\n    <user-point />\r\n    <view class=\"index-head\">\r\n      <scroll-view scroll-x class=\"list-scroll-content\" :scroll-left=\"currentLeft\" scroll-with-animation>\r\n        <view class=\"index-head-navs\">\r\n          <view class=\"index-head-nav\" v-for=\"(ele, index) in categoryIndexData\" :key=\"index\"\r\n            :class=\"{ 'index-head-nav-active': tabIndex == index }\" @click=\"setCat(index)\">\r\n            {{ ele.name }}\r\n          </view>\r\n        </view>\r\n      </scroll-view>\r\n    </view>\r\n    <swiper :current=\"tabIndex\" class=\"swiper-box\" @change=\"ontabchange\" duration=\"300\">\r\n\r\n      <swiper-item v-for=\"(nav, index) in categoryIndexData\" :key=\"index\" class=\"swiper-item\">\r\n\r\n        <scroll-view class=\"scroll-v\" enableBackToTop=\"true\" scroll-with-animation scroll-y @scrolltolower=\"loadMore\">\r\n          <view class=\"index-items\">\r\n            <view class=\"index-item\" v-for=\"(item, key) in nav.goods\" :key=\"key\" @click=\"toGoods(item)\">\r\n              <view class=\"index-item-img\">\r\n                <u-image :src=\"item.thumbnail\" mode=\"aspectFit\">\r\n                  <u-loading slot=\"loading\"></u-loading>\r\n                </u-image>\r\n                <view class=\"index-item-title\">{{ item.goodsName }}</view>\r\n                <view class=\"index-item-price flex flex-a-c flex-j-sb\">\r\n                  <div class=\"point\"><span>{{ item.points }}</span>积分</div> \r\n                  <span class=\"tipsMkt\">¥{{ item.originalPrice | unitPrice }}</span>\r\n                </view>\r\n              </view>\r\n            </view>\r\n          </view>\r\n          <uni-load-more :status=\"nav.loadStatus\"></uni-load-more>\r\n        </scroll-view>\r\n      </swiper-item>\r\n    </swiper>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getPointsCategory, getPointsGoods } from \"@/api/promotions.js\";\r\nimport userPoint from \"./user\";\r\nexport default {\r\n  components: {\r\n    \"user-point\": userPoint,\r\n  },\r\n  data() {\r\n    return {\r\n      headOffSetTop: \"0\",\r\n      tabIndex: 0,\r\n      categoryIndexData: [\r\n        {\r\n          categoryId: 0,\r\n          name: \"全部\",\r\n          loadStatus: \"more\",\r\n          goods: [],\r\n          params: {\r\n            pageNumber: 1,\r\n            pageSize: 10,\r\n            pointsGoodsCategoryId: \"\",\r\n          },\r\n        },\r\n      ],\r\n      currentLeft: 0,\r\n      pageParams: {\r\n        pageNumber: 1,\r\n        pageSize: 10,\r\n        pointsGoodsCategoryId: 0,\r\n      },\r\n      flag: true,\r\n    };\r\n  },\r\n  onLoad() {},\r\n  async onPullDownRefresh() {\r\n    this.categoryIndexData[this.tabIndex].goods = [];\r\n    this.categoryIndexData[this.tabIndex].params.pageNumber = 1;\r\n    this.categoryIndexData[this.tabIndex].loadStatus = \"more\";\r\n    this.loadGoods();\r\n  },\r\n  onPageScroll(e) {\r\n    if (e.scrollTop < -40 && this.flag) {\r\n      this.flag = false;\r\n      this.categoryIndexData[this.tabIndex].goods = [];\r\n      this.categoryIndexData[this.tabIndex].params.pageNumber = 1;\r\n      this.categoryIndexData[this.tabIndex].loadStatus = \"more\";\r\n      uni.startPullDownRefresh();\r\n      this.loadGoods();\r\n    }\r\n  },\r\n  watch: {\r\n    tabIndex(val) {\r\n      if (\r\n        this.categoryIndexData[this.tabIndex].goods.length == 0 &&\r\n        this.categoryIndexData[this.tabIndex].params.pageNumber == 1\r\n      ) {\r\n        this.loadGoods();\r\n      }\r\n    },\r\n  },\r\n  async onShow() {\r\n    //获取顶级分类\r\n    this.categoryIndexData = [\r\n      {\r\n        categoryId: 0,\r\n        name: \"全部\",\r\n        loadStatus: \"more\",\r\n        goods: [],\r\n        params: {\r\n          pageNumber: 1,\r\n          pageSize: 10,\r\n          pointsGoodsCategoryId: \"\",\r\n        },\r\n      },\r\n    ];\r\n\r\n    let response = await getPointsCategory();\r\n\r\n    if (response.data.success) {\r\n      let navData = response.data.result.records;\r\n      navData.forEach((item) => {\r\n        this.categoryIndexData.push({\r\n          categoryId: item.id,\r\n          goods: [],\r\n          loadStatus: \"more\",\r\n          name: item.name,\r\n          params: {\r\n            pageNumber: 1,\r\n            pageSize: 10,\r\n            pointsGoodsCategoryId: item.id,\r\n          },\r\n        });\r\n      });\r\n    }\r\n\r\n    this.loadGoods();\r\n  },\r\n  methods: {\r\n    // 跳转\r\n    navigateTo(url) {\r\n      uni.navigateTo({\r\n        url,\r\n      });\r\n    },\r\n\r\n    toGoods(item) {\r\n      //跳转详情\r\n      uni.navigateTo({\r\n        url: `/pages/promotion/point/detail?id=${item.id}`,\r\n      });\r\n    },\r\n\r\n    async loadGoods() {\r\n      let index = this.tabIndex;\r\n\r\n      //获取商品数据\r\n      let response = await getPointsGoods(this.categoryIndexData[index].params);\r\n      if (response.data.success) {\r\n        this.categoryIndexData[index].goods.push(\r\n          ...response.data.result.records\r\n        );\r\n        if (response.data.result.records.length < 10) {\r\n          this.categoryIndexData[index].loadStatus = \"noMore\";\r\n        }\r\n        let _this = this;\r\n        setTimeout(function () {\r\n          _this.flag = true;\r\n        }, 3000);\r\n      }\r\n\r\n      uni.stopPullDownRefresh();\r\n    },\r\n    setCat(type) {\r\n      this.tabIndex = type;\r\n    },\r\n    ontabchange(e) {\r\n      this.tabIndex = e.detail.current;\r\n      if (e.detail.current > 3) {\r\n        this.currentLeft = (e.detail.current - 3) * 70;\r\n      } else {\r\n        this.currentLeft = 0;\r\n      }\r\n    },\r\n    loadMore() {\r\n      if (this.categoryIndexData[this.tabIndex].loadStatus == \"more\") {\r\n        this.categoryIndexData[this.tabIndex].params.pageNumber++;\r\n        this.loadGoods();\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\npage {\r\n  height: 100%;\r\n}\r\n.tipsMkt {\r\n  color: #c0c4cc;\r\n  font-size: 24rpx !important;\r\n  text-decoration: line-through;\r\n  margin-right: 20rpx !important;\r\n}\r\n\r\n\r\n.index {\r\n  height: 100vh;\r\n  // #ifdef H5\r\n  height: calc(100vh - 44px);\r\n  // #endif\r\n  width: 100%;\r\n  overflow: hidden;\r\n}\r\n\r\n.index-head {\r\n  background: #fff;\r\n}\r\n\r\n.list-scroll-content {\r\n  white-space: nowrap;\r\n  width: 100%;\r\n  height: 100rpx;\r\n  color: #333;\r\n}\r\n\r\n.index-head-navs {\r\n  width: 100%;\r\n  height: 92rpx;\r\n  display: -webkit-box;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.index-head-nav {\r\n  padding-bottom: 8rpx;\r\n  margin: 20rpx;\r\n  text-align: center;\r\n  box-sizing: border-box;\r\n  white-space: nowrap;\r\n  font-size: 30rpx;\r\n  color: #333;\r\n\r\n  display: -webkit-box;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n\r\n  &-active {\r\n    border-bottom: 4rpx solid $light-color;\r\n  }\r\n}\r\n\r\n.swiper-box {\r\n  // #ifdef H5\r\n  height: calc(100vh - (100rpx + 300rpx + 44px));\r\n  // #endif\r\n\r\n  // #ifndef H5\r\n  height: calc(100vh - 400rpx);\r\n  // #endif\r\n\r\n  .scroll-v {\r\n    height: 100%;\r\n  }\r\n}\r\n\r\n.index-items {\r\n  padding-top: 10rpx;\r\n  margin-top: 20rpx;\r\n\r\n  padding-left: 20rpx;\r\n  background-color: #f7f7f7;\r\n  display: -webkit-box;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  align-items: center;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n.index-item {\r\n  width: 346rpx;\r\n  // height: 2100rpx;\r\n  background-color: #fff;\r\n  margin: 0 18rpx 20rpx 0;\r\n  border-radius: 16rpx;\r\n  box-sizing: border-box;\r\n  overflow: hidden;\r\n  height: auto;\r\n  padding-bottom: 20rpx;\r\n}\r\n\r\n.index-item-img {\r\n  /deep/ .u-image {\r\n    width: 346rpx !important;\r\n    height: 320rpx !important;\r\n    border-radius: 10rpx !important;\r\n  }\r\n}\r\n\r\n.index-item-title {\r\n  font-size: 26rpx;\r\n  color: #333333;\r\n  padding: 0 20rpx;\r\n  height: 80rpx;\r\n  box-sizing: border-box;\r\n  max-height: 3em;\r\n  overflow: hidden;\r\n}\r\n\r\n\r\n\r\n.index-item-price {\r\n  font-size: 28rpx;\r\n  overflow: hidden;\r\n  color: $main-color;\r\n  padding: 20rpx 0 0 20rpx;\r\n  >.point{\r\n    >span{\r\n      font-size: 42rpx;\r\n      font-weight: bold;\r\n      margin-right:10rpx;\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/promotion/point/user.vue",
    "content": "<template>\n  <div class=\"user-point\">\n    <!-- <div class=\"point-rule\">积分规则</div> -->\n    <div class=\"point-wrapper\">\n      <u-image shape=\"circle\" :lazy-load=\"true\" width=\"100\" height=\"100\"\n        :src=\"userInfo.face || '/static/missing-face.png'\"></u-image>\n      <div class=\"whether-point\">\n        <div>你的可用积分：<span class=\"point\">{{userInfo.point || 0}}</span></div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\nimport { getUserInfo } from \"@/api/members\";\nexport default {\n  data() {\n    return {\n      userInfo: {},\n    };\n  },\n  mounted() {\n    this.init();\n  },\n  methods: {\n    async init() {\n      let res = await getUserInfo();\n      if (res.data.success) {\n        this.userInfo = res.data.result;\n      }\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.user-point {\n  padding: 0 20rpx;\n  height: 300rpx;\n  background: url(\"/static/point-bg.png\") no-repeat;\n  background-size: 100%;\n}\n.point {\n  font-size: 40rpx;\n}\n.point-rule {\n  color: #fff;\n  display: flex;\n  justify-content: flex-end;\n  padding: 20rpx 0;\n}\n.point-wrapper {\n  padding-top: 80rpx;\n  display: flex;\n}\n.whether-point {\n  color: #fff;\n  margin-left: 30rpx;\n  font-size: 36rpx;\n  font-weight: bold;\n}\n</style>"
  },
  {
    "path": "pages/promotion/seckill.vue",
    "content": "<template>\r\n\t<view class=\"sale\">\r\n\t\t<u-navbar title='限时抢购'></u-navbar>\r\n\t\t<view class=\"header-wraper\">\r\n\t\t\t\t<image mode=\"widthFix\" src=\"/static/seckill.png\"></image>\r\n\t\t</view>\r\n\t\t<scroll-view scroll-x>\r\n\t\t\t<view class=\"index-navs\">\r\n\t\t\t\t<view class=\"index-nav-v\">\r\n\t\t\t\t\t<view class=\"index-nav\" :class=\"{ 'index-nav-active': nav == index }\"\r\n\t\t\t\t\t\t@click=\"clickNavigateTime(index)\" v-for=\"(item, index) in timeLine\" :key=\"index\">\r\n\t\t\t\t\t\t{{ item.timeLine }}:00\r\n\t\t\t\t\t\t<view class=\"index-nav-desc\">{{ index === 0 && item.distanceStartTime === 0 ? '抢购中' : '即将开始' }}\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t</scroll-view>\r\n\t\t<view class=\"sale-items\" v-if=\"goodsList.length > 0\">\r\n\t\t\t<goodsTemplate :res=\"goodsList\" />\r\n\r\n\t\t</view>\r\n\t\t<view v-else>\r\n\t\t\t<view class=\"nodata\">\r\n\t\t\t\t<image style=\"height: 240rpx;width: 320rpx;\" src=\"/static/nodata.png\" alt=\"\" />\r\n\t\t\t\t<div>暂无商品</div>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tgetSeckillTimeLine,\r\n\t\tgetSeckillTimeGoods\r\n\t} from \"@/api/promotions.js\";\r\n\timport Foundation from \"@/utils/Foundation.js\";\r\n\timport goodsTemplate from '@/components/m-goods-list/promotion.vue'\r\n\texport default {\r\n\t\tcomponents: {\r\n\t\t\tgoodsTemplate\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tnav: 0, //默认选择第一个时间\r\n\t\t\t\ttimeLine: \"\", //获取几个点活动\r\n\t\t\t\tresTime: 0, //当前时间\r\n\t\t\t\ttime: 0, //距离下一个活动的时间值\r\n\t\t\t\ttimes: {}, //时间集合\r\n\t\t\t\tonlyOne: \"\", //是否最后一个商品\r\n\t\t\t\tgoodsList: [], //商品集合\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * 显示时间活动\r\n\t\t */\r\n\t\tasync onShow() {\r\n\t\t\tawait this.getTimeLine();\r\n\t\t\tif (!this.timeLine) {\r\n\t\t\t\tawait uni.showToast({\r\n\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\ttitle: \"今天没有活动，明天再来吧\",\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tthis._setTimeInterval = setInterval(() => {\r\n\t\t\t\tif (this.time <= 0) {\r\n\t\t\t\t\tclearInterval(this._setTimeInterval);\r\n\t\t\t\t\tthis.getGoodsList();\r\n\t\t\t\t\tthis.getTimeLine();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.times = Foundation.countTimeDown(this.time);\r\n\t\t\t\t\tthis.time--;\r\n\t\t\t\t}\r\n\t\t\t}, 1000);\r\n\t\t},\r\n\r\n\t\tonUnload() {\r\n\t\t\tthis._setTimeInterval && clearInterval(this._setTimeInterval);\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t/**\r\n\t\t\t * 获取时间线商品\r\n\t\t\t */\r\n\t\t\tasync getTimeLine() {\r\n\t\t\t\tlet res = await getSeckillTimeLine();\r\n\t\t\t\tif (res.data.success && res.data.result.length > 0) {\r\n\t\t\t\t\tlet timeLine = res.data.result.sort(\r\n\t\t\t\t\t\t(x, y) => Number(x.timeLine) - Number(y.timeLine)\r\n\t\t\t\t\t);\r\n\t\t\t\t\tthis.timeLine = timeLine.slice(0, 5);\r\n\t\t\t\t\tthis.resTime = parseInt(new Date().getTime() / 1000);\r\n\t\t\t\t\tthis.onlyOne = res.data.result.length === 1;\r\n\t\t\t\t\tthis.diffTime = parseInt(new Date().getTime() / 1000) - this.resTime;\r\n\r\n\t\t\t\t\tthis.time =\r\n\t\t\t\t\t\tthis.timeLine[this.nav].distanceStartTime ||\r\n\t\t\t\t\t\t(this.timeLine[this.nav + 1] &&\r\n\t\t\t\t\t\t\tthis.timeLine[this.nav + 1].distanceStartTime) ||\r\n\t\t\t\t\t\tFoundation.theNextDayTime() - this.diffTime;\r\n\t\t\t\t\tthis.times = Foundation.countTimeDown(this.time);\r\n\r\n\t\t\t\t\tthis.getGoodsList();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * 获取商品集合\r\n\t\t\t */\r\n\t\t\tasync getGoodsList() {\r\n\t\t\t\tthis.params.timeLine = this.timeLine[this.nav].timeLine;\r\n\t\t\t\tlet res = await getSeckillTimeGoods(this.params.timeLine);\r\n\t\t\t\tif (res.data.success && res.data.result.length != 0) {\r\n\t\t\t\t\tthis.goodsList = res.data.result;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.goodsList = [];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * 单击导航时间\r\n\t\t\t */\r\n\t\t\tclickNavigateTime(type) {\r\n\t\t\t\tthis.nav = type;\r\n\t\t\t\tthis.goodsList = [];\r\n\t\t\t\tthis.diffTime = parseInt(new Date().getTime() / 1000) - this.resTime;\r\n\t\t\t\tthis.time =\r\n\t\t\t\t\tthis.timeLine[this.nav].distanceStartTime ||\r\n\t\t\t\t\t(this.timeLine[this.nav + 1] &&\r\n\t\t\t\t\t\tthis.timeLine[this.nav + 1].distanceStartTime) ||\r\n\t\t\t\t\tFoundation.theNextDayTime() - this.diffTime;\r\n\r\n\t\t\t\tthis.times = Foundation.countTimeDown(this.time);\r\n\t\t\t\tthis.getGoodsList();\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t.sale {\r\n\t\twidth: 100%;\r\n\t\tmin-height: 100vh;\r\n\t\tbackground-color: #f7f7f7;\r\n\t}\r\n\r\n\t.nodata {\r\n\t\tflex-direction: column;\r\n\t\tdisplay: flex;\r\n\t\twidth: 100%;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tmargin-top: 40rpx;\r\n\r\n\t\t>div {\r\n\t\t\tfont-size: 24rpx;\r\n\t\t\tmargin-top: 20rpx;\r\n\t\t\tcolor: #666;\r\n\t\t}\r\n\t}\r\n\r\n\t.header-wraper {\r\n\t\tbackground: url('/static/bg.png');\r\n\t\theight: 200rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\t>image{\r\n\t\t\twidth: 300rpx;\r\n\t\t\theight: 100rpx;\r\n\t\t}\r\n\t}\r\n\r\n\t.sale-items {\r\n\t\tpadding-top: 20rpx;\r\n\t}\r\n\r\n\t.index-navs {\r\n\t\tbackground: #fff;\r\n\t\tbackground-color: #f7f7f7;\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n\r\n\t.index-nav-v {\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.index-nav {\r\n\t\tfont-size: 28rpx;\r\n\t\tdisplay: -webkit-box;\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\twidth: 150rpx;\r\n\t\tflex-direction: column;\r\n\t\tcolor: #bababa;\r\n\t\theight: 115rpx;\r\n\t\tline-height: 1em;\r\n\t\tposition: relative;\r\n\t\tfont-size: 32rpx;\r\n\t\tfont-weight: bold;\r\n\r\n\t\t&-active {\r\n\t\t\tcolor: $main-color;\r\n\t\t\tposition: relative;\r\n\t\t\tz-index: 30;\r\n\t\t\t.index-nav-desc {\r\n\t\t\t\tcolor: #fff;\r\n\t\t\t\tfont-weight: bold;\r\n\t\t\t\tbackground: $main-color;\r\n\t\t\t\tpadding: 6rpx 16rpx;\r\n\t\t\t\tborder-radius: 50px;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t.index-nav-desc {\r\n\t\tmargin-top: 8rpx;\r\n\t\tfont-size: 22rpx;\r\n\t\tcolor: #bababa;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/promotion/style.scss",
    "content": ".view-item {\n\tbackground: #fff;\n\tborder-radius: 0.4em;\n\tmargin: 20rpx 30rpx;\n\tpadding: 20rpx 0;\n}\n\n.nodata {\n\ttext-align: center;\n\tmargin: 40rpx 0 20rpx 0;\n}\n\n.container-wrap {\n\twidth: 100%;\n}\n.white_class {\n\tcolor: #fff;\n\tfont-size: 28rpx;\n}\n\n.popupTips {\n\tfont-size: 22rpx;\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\ttext-align: left;\n\tcolor: #999999;\n\tmargin: 0 20rpx;\n\n\t/deep/ view {\n\t\tline-height: 1.75;\n\t}\n}\n\n.search {\n\tmargin: 30rpx 20rpx !important;\n}\n\n.view-left,\n.view-content,\n.view-right,\n.view-item {\n\tdisplay: flex;\n}\n\n.wrapper {\n\twidth: 100%;\n\toverflow: hidden;\n}\n.view-left {\n\twidth: 226rpx;\n\theight: 100%;\n\toverflow: hidden;\n\tdisplay: flex;\n\tjustify-content: center;\n}\n.view-content {\n\twidth: calc((100% - 240rpx));\n\tpadding-left: 20rpx;\n\tflex-direction: column;\n\tjustify-content: center;\n\n\ttext-align: center;\n}\n.buy-content {\n\tfont-size: 22rpx;\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\tmargin-top: 15rpx;\n\ttext-align: center;\n\tcolor: #999999;\n}\n.view-content-bottom {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n}\n\n.group-wrapper {\n\tpadding: 16rpx 32rpx;\n}\n.view-content-name {\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\ttext-align: left;\n\tcolor: #333333;\n\tfont-size: 28rpx;\n\tdisplay: -webkit-box;\n\t-webkit-box-orient: vertical;\n\t-webkit-line-clamp: 2;\n\toverflow: hidden;\n}\n.view-content-price {\n\tmargin: 10rpx 0;\n\tletter-spacing: 0px;\n\toverflow: hidden;\n\tfont-size: 28rpx;\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\ttext-align: left;\n\tcolor: #ff5a10;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.view-content-original_price {\n\tfont-size: 22rpx;\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\ttext-decoration: line-through;\n\ttext-align: left;\n\tcolor: #999999;\n}\n\n.btn-group {\n\tbackground: $aider-light-color;\n\tborder-radius: 10rpx;\n\tfont-size: 24rpx;\n\tfont-family: PingFang SC, PingFang SC-Regular;\n\tfont-weight: 400;\n\tcolor: #fff;\n\ttext-align: center;\n\tpadding: 6rpx 16rpx;\n}\n/deep/ .empty {\n\tposition: relative;\n\tpadding-top: 20%;\n\t> .empty-content {\n\t\tposition: relative;\n\t\tpadding-top: 20%;\n\t}\n}\n"
  },
  {
    "path": "pages/tabbar/cart/cart.scss",
    "content": ""
  },
  {
    "path": "pages/tabbar/cart/cartList.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <u-navbar :is-back=\"false\" title=\"购物车\">\r\n      <div slot=\"right\">\r\n        <div class=\"light-color edit\" @click=\"isEdit = !isEdit\">{{ !isEdit ? '编辑' : '完成'}}</div>\r\n      </div>\r\n    </u-navbar> \r\n    <!-- 空白页-->\r\n    <view v-if=\"!loading && (cartDetail.cartList == '' || cartDetail.cartList == [] || !cartDetail)\" class=\"empty\">\r\n      <image src=\"/static/emptyCart.png\" mode=\"aspectFit\"></image>\r\n      <view class=\"empty-tips\">\r\n        空空如也\r\n        <navigator class=\"navigator\" url=\"/pages/tabbar/home/index\" open-type=\"switchTab\">随便逛逛></navigator>\r\n      </view>\r\n    </view>\r\n    <!-- 店铺商品信息 -->\r\n    <div class=\"content\">\r\n      <div class=\"box box2\" :class=\"{ invalid: isInvalid(item) }\" v-for=\"(item, index) in cartDetail.cartList\"\r\n        :key=\"index\">\r\n        <view class=\"tab\">\r\n          <view class=\"store-line\">\r\n            <u-checkbox-group class=\"store-line-check\">\r\n              <!-- #ifndef MP-WEIXIN -->\r\n              <u-checkbox shape=\"circle\" :active-color=\"lightColor\" v-model=\"item.checked\"\r\n                @change=\"checkboxChangeDP(item)\"></u-checkbox>\r\n              <!-- #endif -->\r\n              <!-- 微信小程序这里 v-model出现问题，改用:value -->\r\n              <!-- #ifdef MP-WEIXIN -->\r\n              <u-checkbox shape=\"circle\" :active-color=\"lightColor\" :value=\"item.checked\"\r\n                @change=\"checkboxChangeDP(item)\"></u-checkbox>\r\n              <!-- #endif -->\r\n            </u-checkbox-group>\r\n            <span class=\"store-name wes store-line-desc\" @click.stop=\"navigateToStore(item)\">{{\r\n              item.storeName\r\n            }}</span>\r\n            <u-icon @click=\"navigateToStore(item)\"  size=\"24\" style=\"margin-left:10rpx;\"  name=\"arrow-right\"></u-icon>\r\n          </view>\r\n          <view class=\"right-col\" v-if=\"item.canReceiveCoupon\" @click=\"navigateToCoupon(item)\">\r\n            <div class=\"right-line\"></div>\r\n            <span>领劵</span>\r\n          </view>\r\n        </view>\r\n        <u-swipe-action :show=\"skuItem.selected\" @open=\"openAction(skuItem)\" :options=\"options\" bg-color=\"#fff\"\r\n          ref=\"swiperAction\" class=\"cart-item\" v-for=\"(skuItem, i) in item.skuList\" :index=\"i\" :key=\"skuItem.goodsSku.id\"\r\n          @click=\"changeActionTab(skuItem)\" @longpress=\"changeActionTab(skuItem)\">\r\n          <!-- 满减活动 -->\r\n          <div v-if=\"Object.keys(skuItem.promotionMap).length != 0\">\r\n            <div v-if=\"getPromotion(skuItem).includes('FULL_DISCOUNT')\">\r\n              <div class=\"promotion-notice\" v-if=\"item.promotionNotice\">\r\n                <span class=\"tips\">满减</span>\r\n                <span style=\"flex:10;\">{{item.promotionNotice}}</span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <view class=\"goods-row\" :class=\"{ invalid: isInvalid(skuItem) }\">\r\n            <view class=\"goods-config\">\r\n              <view>\r\n                <u-checkbox-group v-if=\"skuItem.invalid == 0 && !skuItem.errorMessage\">\r\n                  <!-- #ifndef MP-WEIXIN -->\r\n                  <u-checkbox shape=\"circle\" :active-color=\"lightColor\" class=\"c-left\" v-model=\"skuItem.checked\"\r\n                    @change=\"checkboxChange(skuItem)\"></u-checkbox>\r\n                  <!-- #endif -->\r\n                  <!-- 微信小程序这里 v-model出现问题，改用:value -->\r\n                  <!-- #ifdef MP-WEIXIN -->\r\n                  <u-checkbox shape=\"circle\" :active-color=\"lightColor\" class=\"c-left\" :value=\"skuItem.checked\"\r\n                    @change=\"checkboxChange(skuItem)\"></u-checkbox>\r\n                  <!-- #endif -->\r\n                </u-checkbox-group>\r\n                <span class=\"invalid\" v-else style=\"font-size: 24rpx\">失效</span>\r\n              </view>\r\n              <u-image border-radius=\"10\" :fade=\"true\" @click=\"navigateToGoods(skuItem)\" width=\"160rpx\" height=\"160rpx\"\r\n                :src=\"skuItem.goodsSku.thumbnail\" />\r\n            </view>\r\n            <view class=\"goods-content\">\r\n              <!-- 商品名称 -->\r\n              <p class=\"sp-name\" @click=\"navigateToGoods(skuItem)\">\r\n                {{ skuItem.goodsSku.goodsName }}\r\n              </p>\r\n              <!-- 规格 -->\r\n              <p class=\"sp-type\" style=\"width:300rpx\">{{skuItem.goodsSku.simpleSpecs}}</p>\r\n              <p class=\"sp-type\" v-if=\"skuItem.goodsSku.salesModel == 'WHOLESALE'\">批发商品</p>\r\n              <p class=\"sp-number\">\r\n                <view class=\"sp-price\">\r\n                  <!-- <div class=\"default-color\" :class=\"{'main-color':Object.keys(skuItem.promotionMap).length ==0  }\"> -->\r\n                  <div class=\"main-color\">\r\n                    ￥<span>{{ $options.filters.goodsFormatPrice(skuItem.goodsSku.price)[0] }}</span>\r\n                    <span>.{{ $options.filters.goodsFormatPrice(skuItem.goodsSku.price)[1] }}</span>\r\n                  </div>\r\n                </view>\r\n                <view>\r\n                  <uni-number-box class=\"uNumber\" :min=\"1\" :max=\"999\"  @change=\"numChange(skuItem)\"\t v-model=\"skuItem.num\"></uni-number-box>\r\n                </view>\r\n                <!-- 如果当有促销并且促销是 限时抢购 -->\r\n                <!-- promotions -->\r\n                <div class=\"promotions-list\" v-if=\"Object.keys(skuItem.promotionMap).length != 0\"\r\n                >\r\n                  <div class=\"promotions-item-seckill\" v-if=\"getPromotion(skuItem).includes('SECKILL')\">\r\n                    距秒杀结束: <u-count-down show-border :hide-zero-day=\"true\" :color=\"$mainColor\" border-color=\"#ededed\"\r\n                      font-size=\"24\" :timestamp=\"getCountDownTime(skuItem)\">\r\n                    </u-count-down>\r\n                  </div>\r\n                </div>\r\n\r\n                <!-- 此处先隐藏 对于预估到手价来说 前端无法真正的计算出来，光靠促销模式进行展示可能有些不妥。所以暂且隐藏 -->\r\n                <!-- 如果有活动 并且是选中的状态,显示预估到手价格 -->\r\n                <!-- <div class=\"priceDetail-flowPrice\" :class=\"{'main-color':skuItem.priceDetailDTO}\"\r\n                  v-if=\"skuItem.priceDetailDTO && skuItem.invalid == 0  && Object.keys(skuItem.promotionMap).length != 0 && skuItem.checked && skuItem.checked\">\r\n                  预估到手价 ￥<span>{{ $options.filters.goodsFormatPrice(skuItem.priceDetailDTO.flowPrice)[0]}}</span>\r\n                  <span>.{{ $options.filters.goodsFormatPrice(skuItem.priceDetailDTO.flowPrice)[1] }} </span>\r\n                </div> -->\r\n                <div style='margin-left: 20rpx;' v-if=\"!skuItem.checked && skuItem.errorMessage\">\r\n                  {{skuItem.errorMessage}}\r\n                </div>\r\n              </p>\r\n              \r\n            </view>\r\n          </view>\r\n        </u-swipe-action>\r\n      </div>\r\n    </div>\r\n    <u-modal v-model=\"deleteShow\" :confirm-style=\"{'color':lightColor}\" @confirm=\"deleteConfirm\" show-cancel-button\r\n      :content=\"deleteContent\" :async-close=\"true\"></u-modal>\r\n    <!-- 结账 -->\r\n    <div class=\"box box6\">\r\n      <view class=\"navL\">\r\n        <u-checkbox shape=\"circle\" :active-color=\"lightColor\" v-model=\"checkout\" @change=\"checkOut()\" label-size=\"24\">全选\r\n        </u-checkbox>\r\n        <span class=\"price\">\r\n          <div class=\"prices\">\r\n            <div class=\"fullPrice\">\r\n              <span class=\"number\" v-if=\"cartDetail && cartDetail.priceDetailDTO\">\r\n                总计:\r\n                <span>¥{{ $options.filters.goodsFormatPrice(cartDetail.priceDetailDTO.flowPrice)[0] }}</span>.<span>{{ $options.filters.goodsFormatPrice(cartDetail.priceDetailDTO.flowPrice)[1] }}</span>\r\n              </span>\r\n              <span class=\"number\" v-else>总计:0.00</span>\r\n            </div>\r\n            <div\r\n              v-if=\"cartDetail.cartList && cartDetail.cartList.length!=0 && cartDetail.priceDetailDTO && cartDetail.priceDetailDTO.discountPrice!=0 \"\r\n              class=\"discountPrice\">\r\n              <span>优惠减:￥{{(cartDetail.priceDetailDTO.goodsPrice - cartDetail.priceDetailDTO.flowPrice) | unitPrice}}\r\n              </span>\r\n              <span class=\"discount-details\" @click=\"discountDetails\">优惠明细</span>\r\n            </div>\r\n          </div>\r\n        </span>\r\n      </view>\r\n      <!-- 优惠详情 -->\r\n      <u-popup z-index=\"3\" close mode=\"bottom\" height=\"50%\" closeable v-model=\"discountDetailsFlag\" border-radius=\"20\">\r\n        <div class=\"discount-list\">\r\n          <view class=\"discount-title\">优惠明细</view>\r\n          <div class=\"discount-way\">\r\n            <div class=\"discount-item\" v-if=\"cartDetail.priceDetailDTO\">\r\n              <span>商品总额</span>\r\n              <span>￥{{cartDetail.priceDetailDTO.goodsPrice | unitPrice}}</span>\r\n\r\n            </div>\r\n            <div class=\"discount-item\" v-if=\"cartDetail.priceDetailDTO\">\r\n              <span>优惠券</span>\r\n              <span>-￥{{cartDetail.priceDetailDTO.couponPrice | unitPrice}}</span>\r\n            </div>\r\n            <div class=\"discount-item\" v-if=\"cartDetail.priceDetailDTO\">\r\n              <span>其他优惠</span>\r\n              <span>-￥{{cartDetail.priceDetailDTO.discountPrice | unitPrice}}</span>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </u-popup>\r\n\r\n      <view v-if=\"isEdit\" @click=\"deleteGoods()\">\r\n        <div class=\"settlement\">删除</div>\r\n      </view>\r\n\r\n      <view v-else @click=\"submitOrder()\">\r\n        <div class=\"settlement\">去结算</div>\r\n      </view>\r\n    </div>\r\n    <u-toast ref=\"uToast\" />\r\n  </div>\r\n</template>\r\n<script>\r\nimport * as API_Trade from \"@/api/trade\";\r\nimport { debounce } from \"@/utils/tools.js\";\r\nimport uniNumberBox from '@/components/uni-number-box'\r\nexport default {\r\n  components:{uniNumberBox}, // 数量加减组件\r\n  data() {\r\n    return {\r\n      loading:false,\r\n      lightColor: this.$lightColor,\r\n      discountDetailsFlag: false, //优惠明细开关\r\n      // 商品栏右侧滑动按钮\r\n      options: [\r\n        {\r\n          text: \"删除\",\r\n          style: {\r\n            backgroundColor: this.$lightColor, //高亮颜色\r\n          },\r\n        },\r\n      ],\r\n      isInvalid(val) {\r\n        //是否无效商品/没库存商品\r\n        if (val.invalid == 1 || (!val.checked && val.errorMessage)) {\r\n          return true;\r\n        } else {\r\n          return false;\r\n        }\r\n      },\r\n      deleteShow: false, //右滑删除\r\n      deleteContent: \"删除该商品？\", //删除显示的信息\r\n      cartDetail: \"\", //购物车详情\r\n      goodsVal: \"\", //单个商品详情\r\n      isEdit: false, // 是否是编辑\r\n      checkout: false, //全选按钮\r\n      WEIXIN_num: \"\", //购物车兼容微信步进器\r\n    };\r\n  },\r\n\r\n  mounted() {\r\n    // #ifdef MP-WEIXIN\r\n    // 小程序默认分享\r\n    uni.showShareMenu({ withShareTicket: true });\r\n    // #endif\r\n  },\r\n  onPullDownRefresh(){\r\n    this.getCardData();\r\n  },\r\n  /**\r\n   * 初始化信息\r\n   */\r\n  onShow() {\r\n    this.deleteShow ? (this.deleteShow = false) : true;\r\n    if (this.$refs.swiperAction) {\r\n      this.$refs.swiperAction.forEach((item, index) => {\r\n        item.show = false;\r\n      });\r\n\r\n      this.getCardData();\r\n    } else {\r\n      this.getCardData();\r\n    }\r\n  },\r\n  methods: {\r\n    /**\r\n\t\t\t * 倒数计时\r\n\t\t\t */\r\n    getCountDownTime(val) {\r\n      if (val.promotionMap) {\r\n        let key = Object.keys(val.promotionMap).find((child, index) => {\r\n          return child.split(\"-\")[0] == 'SECKILL'\r\n        });\r\n        return val.promotionMap[key].endTime / 1000 - (new Date().getTime() / 1000)\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 优惠明细开关\r\n     */\r\n    discountDetails() {\r\n      this.discountDetailsFlag = true;\r\n    },\r\n    /**\r\n     * 左滑打开删除\r\n     */\r\n    openAction(skuItem) {\r\n      /**循环父级有多少个店铺 */\r\n      this.cartDetail.cartList.forEach((cartItem) => {\r\n        if (cartItem.skuList) {\r\n          cartItem.skuList.forEach((sku) => {\r\n            this.$set(sku, \"selected\", false);\r\n          });\r\n        }\r\n      });\r\n      this.$set(skuItem, \"selected\", true);\r\n    },\r\n\r\n    /**\r\n     * 滑动删除\r\n     */\r\n    changeActionTab(val) {\r\n      this.deleteShow = true;\r\n      this.goodsVal = val;\r\n    },\r\n\r\n    /**\r\n     * 点击删除\r\n     */\r\n    deleteConfirm() {\r\n      API_Trade.deleteSkuItem(this.goodsVal.goodsSku.id).then((res) => {\r\n        if (res.statusCode == 200) {\r\n          uni.showToast({\r\n            title: \"此商品删除成功\",\r\n            duration: 2000,\r\n          });\r\n          this.deleteShow = false;\r\n          this.getCardData();\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 删除商品\r\n     */\r\n    deleteGoods() {\r\n      if (this.whetherChecked()) {\r\n        var delGoodsData = [];\r\n        this.cartDetail.cartList.forEach((item) => {\r\n          item.skuList.forEach((goodsItem) => {\r\n            if (goodsItem.checked) {\r\n              delGoodsData.push(goodsItem.goodsSku.id);\r\n            }\r\n          });\r\n        });\r\n        if (delGoodsData && delGoodsData.length > 0) {\r\n          // 执行删除\r\n          API_Trade.deleteSkuItem(delGoodsData).then((res) => {\r\n            if (res.data.success) {\r\n              uni.showToast({\r\n                title: \"删除成功!\",\r\n                icon: \"none\",\r\n              });\r\n              this.getCardData();\r\n            }\r\n          });\r\n        } else {\r\n          uni.showToast({\r\n            title: \"请选择删除商品，如果商品失效，请左滑无效商品删除\",\r\n            icon: \"none\",\r\n          });\r\n        }\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 跳转到店铺\r\n     */\r\n    navigateToStore(val) {\r\n      uni.navigateTo({\r\n        url: \"/pages/product/shopPage?id=\" + val.storeId,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 跳转到优惠券\r\n     */\r\n    navigateToCoupon(val) {\r\n      uni.navigateTo({\r\n        url: \"/pages/cart/coupon/couponCenter?storeId=\" + val.storeId,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 跳转到商品\r\n     */\r\n    navigateToGoods(val) {\r\n      uni.navigateTo({\r\n        url:\r\n          \"/pages/product/goods?id=\" +\r\n          val.goodsSku.id +\r\n          \"&goodsId=\" +\r\n          val.goodsSku.goodsId,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 点击步进器回调\r\n     */\r\n     numChange: debounce(function (val) {\r\n      this.updateSkuNumFun(val.goodsSku.id, val.num);\r\n    }, 1000),\r\n    /**\r\n     * 去结算\r\n     */\r\n    submitOrder() {\r\n      if (this.whetherChecked()) {\r\n        this.navigateTo(\"/pages/order/fillorder?way=CART\");\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 验证是否选中商品\r\n     */\r\n    whetherChecked() {\r\n    this.$options.filters.forceLogin()\r\n\r\n      let canBuy = false;\r\n      this.cartDetail.cartList.forEach((item) => {\r\n        if (item.checked) {\r\n          canBuy = true;\r\n        } else {\r\n          item.skuList.forEach((skuItem) => {\r\n            if (skuItem.checked) {\r\n              canBuy = true;\r\n            }\r\n          });\r\n        }\r\n      });\r\n      if (!canBuy) {\r\n        uni.showToast({\r\n          title: \"您还没有选择商品\",\r\n          duration: 2000,\r\n          icon: \"none\",\r\n        });\r\n        return false;\r\n      } else {\r\n        return true;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * 跳转\r\n     */\r\n    navigateTo(url) {\r\n      uni.navigateTo({\r\n        url,\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 全选\r\n     */\r\n    checkOut() {\r\n      API_Trade.checkAll(this.checkout).then((result) => {\r\n        if (result.data.success) {\r\n          this.getCardData();\r\n          return true;\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 获取店铺选中信息\r\n     */\r\n    checkStoreFun(skuId, num) {\r\n      API_Trade.checkStore(skuId, num).then((result) => {\r\n        if (result.data.success) {\r\n          this.getCardData();\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 店铺点击\r\n     */\r\n    checkboxChangeDP(e) {\r\n      // #ifdef MP-WEIXIN\r\n      e.checked = !e.checked;\r\n      // #endif\r\n      this.checkStoreFun(e.storeId, e.checked);\r\n    },\r\n\r\n    /**\r\n     * 获取购物车选中信息\r\n     */\r\n    updateSkuCheckedFun(skuId, num) {\r\n      API_Trade.updateSkuChecked(skuId, num).then((result) => {\r\n        if (result.data.success) {\r\n          this.getCardData();\r\n        }\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 更新商品购物车数量\r\n     */\r\n    updateSkuNumFun(skuId, num) {\r\n      API_Trade.updateSkuNum(skuId, num).then((result) => {\r\n        if (result.statusCode == 200) {\r\n          this.getCardData();\r\n        } else {\r\n          let _this = this;\r\n          setTimeout(() => {\r\n            _this.getCardData();\r\n          }, 1000);\r\n        }\r\n      });\r\n    },\r\n\r\n    // 数据去重一下\r\n    getPromotion(item) {\r\n        return Object.keys(item.promotionMap).map((child) => {\r\n          return child.split(\"-\")[0]\r\n        });\r\n    },\r\n\r\n    /**\r\n     * 获取购物车数据\r\n     */\r\n    getCardData() {\r\n      if (this.$options.filters.isLogin(\"auth\")) {\r\n        uni.showLoading({\r\n          title: \"加载中\",\r\n        });\r\n        API_Trade.getCarts()\r\n          .then((result) => {\r\n            this.loading = false;\r\n            uni.stopPullDownRefresh();\r\n            if (result.data.success) {\r\n              this.cartDetail = result.data.result;\r\n              let checkOuted = true;\r\n              for (let i = 0; i < this.cartDetail.cartList.length; i++) {\r\n                let item = this.cartDetail.cartList[i];\r\n                console.log(item);\r\n                // 循环出当前商品是否全选\r\n                if (item.checked == 0) {\r\n                  checkOuted = false;\r\n                }\r\n                // 如果有拼团活动顺便删除\r\n                item.skuList &&\r\n                  item.skuList.forEach((sku) => {\r\n                    if (sku.checked == 0) {\r\n                      checkOuted = false;\r\n                    }\r\n                    if(Object.keys(sku.promotionMap).length != 0)\r\n                    {\r\n                      Object.keys(sku.promotionMap).forEach((pro, proIndex) => {\r\n                        pro = pro.split('-')[0]\r\n                        if (pro == \"PINTUAN\" ) {\r\n                           Object.keys(sku.promotionMap).splice(proIndex, 1);\r\n                        }\r\n                      });\r\n                    }\r\n\r\n                  });\r\n              }\r\n              this.checkout = checkOuted;\r\n              uni.stopPullDownRefresh();\r\n            }\r\n          })\r\n          .catch((err) => {this.loading = false;});\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      } else {\r\n         if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n      }\r\n    },\r\n\r\n    /**\r\n     *  选中某个复选框时，由checkbox时触发\r\n     */\r\n    checkboxChange(e) {\r\n      // #ifdef MP-WEIXIN\r\n      e.checked = !e.checked;\r\n      // #endif\r\n      this.updateSkuCheckedFun(e.goodsSku.id, e.checked);\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\npage {\r\n  background: #f2f2f2;\r\n}\r\n</style>\r\n<style scoped lang=\"scss\">\r\n// #ifdef MP-WEIXIN\r\n@import \"./mp-carui.scss\";\r\n// #endif\r\n.u-image {\r\n  box-shadow: 0 4rpx 12rpx 0 rgba(0, 0, 0, 0.05);\r\n}\r\n.edit{\r\n  padding-right: 32rpx;\r\n  font-size: 28rpx;\r\n}\r\n.promotion-notice {\r\n  margin-top: 10px;\r\n  margin-left: 68rpx;\r\n  font-size: 24rpx;\r\n  color: #333;\r\n  font-weight: bold;\r\n  display: flex;\r\n  align-items: center;\r\n  /deep/ .tips {\r\n    margin: 0 8rpx 0 0;\r\n    background: $main-color;\r\n    border-radius: 100px;\r\n    display: block;\r\n    flex: 1;\r\n    padding: 2rpx 12rpx;\r\n    color: #fff;\r\n  }\r\n}\r\n.default-color {\r\n  color: #333;\r\n}\r\n.goods-row {\r\n  padding: 30rpx 0;\r\n\r\n  display: flex;\r\n  align-items: center;\r\n}\r\n\r\n.store-name {\r\n  font-weight: bold;\r\n  font-size: 28rpx;\r\n}\r\n.invalid {\r\n  filter: grayscale(1);\r\n}\r\n\r\n.cart-item {\r\n  border-radius: 0.4em;\r\n  transition: 0.35s;\r\n}\r\n\r\n/* 空白页 */\r\n/deep/ .u-number-input {\r\n  background: #fff !important;\r\n  border: 1px solid #ededed;\r\n  margin: 0 !important;\r\n}\r\n\r\n/deep/ .u-icon-minus,\r\n/deep/ .u-icon-plus {\r\n  background: #ffffff !important;\r\n  border: 1px solid #ededed;\r\n  color: #333 !important;\r\n  width: 40rpx;\r\n}\r\n\r\n.empty {\r\n  position: fixed;\r\n  left: 0;\r\n  top: 0;\r\n  width: 100%;\r\n  height: 100vh;\r\n  z-index: 99;\r\n  padding-bottom: var(--window-bottom);\r\n  display: flex;\r\n  justify-content: center;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  background: #fff;\r\n\r\n  image {\r\n    width: 240rpx;\r\n    height: 160rpx;\r\n    margin-bottom: 30rpx;\r\n  }\r\n\r\n  .empty-tips {\r\n    display: flex;\r\n    font-size: $font-sm + 2rpx;\r\n    color: $font-color-disabled;\r\n\r\n    .navigator {\r\n      color: $uni-color-primary;\r\n      margin-left: 16rpx;\r\n    }\r\n  }\r\n}\r\n\r\n.settlement {\r\n  width: 180rpx;\r\n  height: 70rpx;\r\n  line-height: 70rpx;\r\n  background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);\r\n  border-radius: 900rpx;\r\n  text-align: center;\r\n  color: #fff;\r\n  margin-right: 10rpx;\r\n}\r\n\r\n.price {\r\n  display: flex;\r\n  align-items: center;\r\n\r\n  /deep/ .number {\r\n    line-height: 1;\r\n    font-size: 30rpx;\r\n    > span {\r\n      font-weight: bold;\r\n    }\r\n  }\r\n}\r\n\r\n.box2 {\r\n  border-radius: 20rpx;\r\n  padding: 0 16rpx 0;\r\n  margin: 0 16rpx 20rpx;\r\n  .u-checkbox {\r\n    display: flex;\r\n    align-items: center;\r\n    text-align: center;\r\n  }\r\n  background: #fff;\r\n\r\n}\r\n\r\n.wrapper {\r\n  height: 100%;\r\n}\r\n\r\n/deep/ .u-col {\r\n  padding: 24rpx 0 !important;\r\n}\r\n\r\n.goods-content {\r\n  width: 100%;\r\n  height: 100%;\r\n  overflow: hidden;\r\n  > p {\r\n    padding-left: 20rpx;\r\n  }\r\n}\r\n\r\n.content {\r\n  padding: 20rpx 0 20rpx 0;\r\n  margin-bottom: 80rpx;\r\n}\r\n\r\n.line {\r\n  float: left;\r\n  width: 1px;\r\n  height: 100%;\r\n  border-right: 1px solid $light-color;\r\n}\r\n\r\n.store-line-check,\r\n.store-line-img,\r\n.store-line-desc {\r\n  // #ifdef MP-WEIXIN\r\n  float: left;\r\n  // #endif\r\n}\r\n\r\n.store-line {\r\n  // #ifndef MP-WEIXIN\r\n  display: flex;\r\n  // #endif\r\n  overflow: hidden;\r\n  flex:10;\r\n}\r\n\r\n.goods-config {\r\n  display: flex;\r\n  align-items: center;\r\n  /deep/ .invalid {\r\n    display: block;\r\n    width: 80rpx !important;\r\n  }\r\n}\r\n.tab {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 30rpx 0 0 0;\r\n}\r\n\r\n.right-col {\r\n  flex:2;\r\n  text-align: center;\r\n  width: 100rpx;\r\n  color: $light-color;\r\n  font-size: 26rpx;\r\n\r\n  > span {\r\n    margin-left: 20rpx;\r\n  }\r\n}\r\n\r\n.right-line {\r\n  width: 3px;\r\n  float: left;\r\n  height: 40rpx;\r\n  border-left: 1px solid #eeeeee;\r\n\r\n  /deep/ span {\r\n    margin-left: 20rpx;\r\n  }\r\n}\r\n\r\n.box6 {\r\n  justify-content: space-between;\r\n  position: fixed;\r\n  // #ifdef APP-PLUS || MP-WEIXIN\r\n  bottom: 0;\r\n  // #endif\r\n  // #ifdef H5\r\n  bottom: var(--window-bottom);\r\n  // #endif\r\n  left: 0;\r\n  border-top: 1px solid #ededed;\r\n  display: flex;\r\n  height: 100rpx;\r\n  overflow: hidden;\r\n  align-items: center;\r\n  width: 100%;\r\n  background: rgba(255, 255, 255, 1);\r\n  color: #333;\r\n  z-index: 99;\r\n  > .navL {\r\n    padding: 0 32rpx;\r\n    display: flex;\r\n    align-items: center;\r\n  }\r\n}\r\n\r\n.sp-type {\r\n  color: $u-light-color;\r\n  padding: 10rpx 0;\r\n  font-size: 24rpx;\r\n  overflow: hidden;\r\n\r\n  text-overflow: ellipsis;\r\n\r\n  white-space: nowrap;\r\n}\r\n\r\n\r\n.sp-number {\r\n  font-weight: bold;\r\n\r\n  display: flex;\r\n  justify-content: space-between;\r\n  > .sp-price {\r\n    /deep/ span:nth-of-type(1) {\r\n      font-size: 38rpx;\r\n    }\r\n    /deep/ span:nth-of-type(2) {\r\n      font-size: 24rpx;\r\n    }\r\n  }\r\n}\r\n.priceDetail-flowPrice {\r\n  font-weight: bold;\r\n  padding-left: 20rpx;\r\n  > span:nth-of-type(1) {\r\n    font-size: 38rpx;\r\n  }\r\n}\r\n\r\n.prices {\r\n  display: flex;\r\n  flex-direction: column;\r\n\r\n  > .discountPrice {\r\n    align-items: center;\r\n    display: flex;\r\n    font-size: 24rpx;\r\n    color: rgb(201, 199, 199);\r\n  }\r\n}\r\n.discount-details {\r\n  margin-left: 10px;\r\n  color: #666;\r\n  padding: 4rpx 10rpx;\r\n  border-radius: 100px;\r\n  background: rgba(201, 199, 199, 0.3);\r\n}\r\n.discount-item {\r\n  display: flex;\r\n  margin: 40rpx 0;\r\n  justify-content: space-between;\r\n  > span:nth-of-type(1) {\r\n    color: #666;\r\n  }\r\n  > span:nth-of-type(2) {\r\n    color: #333;\r\n    font-weight: bold;\r\n  }\r\n}\r\n.discount-title {\r\n  font-size: 36rpx;\r\n  margin-top: 20rpx;\r\n  text-align: center;\r\n}\r\n.discount-way {\r\n  width: 94%;\r\n  margin: 0 3%;\r\n}\r\n.discount-list {\r\n  width: 100%;\r\n}\r\n.promotions-list {\r\n  margin-left: 20rpx;\r\n  > .promotions-item-seckill {\r\n    background: rgba($color: $main-color, $alpha: 0.1);\r\n    font-size: 24rpx;\r\n    color: $main-color;\r\n    display: inline;\r\n    padding: 0rpx 10rpx;\r\n    border-radius: 100px;\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/cart/mp-carui.scss",
    "content": ".box2 {\n    padding: 0 16rpx 0;\n  margin: 0 16rpx 20rpx;\n  \n}\n.uNumber{\n    display: flex;\n}"
  },
  {
    "path": "pages/tabbar/category/category.vue",
    "content": "<template>\r\n  <view class=\"category-wrap\">\r\n    <u-navbar class=\"navbar\" :is-back=\"false\">\r\n      <div class=\"title\">商品分类</div>\r\n      <!-- #ifdef H5 -->\r\n      <u-search class=\"nav-search\"  @click.native=\"search\" placeholder=\"搜索商品\" :show-action=\"false\"></u-search>\r\n      <!-- #endif -->\r\n      <!-- #ifndef H5 -->\r\n      <u-search class=\"nav-search\" disabled @click.native=\"search\" placeholder=\"搜索商品\" :show-action=\"false\"></u-search>\r\n      <!-- #endif -->\r\n    </u-navbar>\r\n    <view class=\"content\">\r\n      <scroll-view scroll-y scroll-with-animation class=\"left-aside\">\r\n        <view v-for=\"(item, index) in tabList\" :key=\"item.id\" class=\"f-item b-b\" :class=\"{ active: item.id === currentId }\" @click=\"tabtap(item, index)\">\r\n          {{ item.name }}\r\n        </view>\r\n      </scroll-view>\r\n      <scroll-view scroll-with-animation scroll-y class=\"right-aside\" :upper-threshold=\"-100\" :lower-threshold=\"-100\">\r\n        <!-- 头部图片 -->\r\n        <view class=\"top-img\" id=\"main-top\">\r\n          <u-image width=\"500rpx\" height=\"230rpx\" @click=\"navigateToList(topImg.id,topImg.id)\" :src=\"topImg.image\" mode=\"\">\r\n          </u-image>\r\n        </view>\r\n        <view v-for=\"item in categoryList\" :key=\"item.id\" class=\"s-list\" :id=\"'main-' + item.id\">\r\n          <!-- 分类标题 -->\r\n          <text class=\"s-item\">{{ item.name }}</text>\r\n          <!-- 分类详情 -->\r\n          <view class=\"t-list\">\r\n            <view @click=\"navigateToList(item.id, children.id)\" v-if=\"children.parentId === item.id\" class=\"t-item\" v-for=\"(children, cIndex) in item.children\" :key=\"children.id\"\r\n              :class=\"{ 'margin-right': (cIndex + 1) % 3 == 0 }\">\r\n              <u-image width=\"70px\" height=\"70px\" :src=\"children.image\" :lazy-load=\"true\">\r\n              </u-image>\r\n              <text>{{ children.name }}</text>\r\n            </view>\r\n          </view>\r\n        </view>\r\n      </scroll-view>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { getCategoryList } from \"@/api/goods.js\";\r\nexport default {\r\n  data() {\r\n    return {\r\n      currentId: 0,\r\n      tabList: [], //左侧标题列表\r\n      categoryList: [], //右侧分类数据列表\r\n      topImg: \"\", //顶部图片\r\n    };\r\n  },\r\n  onLoad() {\r\n    this.loadData();\r\n    // #ifdef MP-WEIXIN\r\n    // 小程序默认分享\r\n    uni.showShareMenu({ withShareTicket: true });\r\n    // #endif\r\n  },\r\n  methods: {\r\n    /**\r\n     * 查询\r\n     */\r\n    search() {\r\n      uni.navigateTo({\r\n        url: \"/pages/navigation/search/searchPage\",\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 加载图片\r\n     */\r\n    async loadData() {\r\n      let list = await getCategoryList(0);\r\n      this.tabList = list.data.result;\r\n      this.currentId = list.data.result[0].id;\r\n      this.loadListContent(0);\r\n    },\r\n\r\n    /**\r\n     * 加载列表内容\r\n     */\r\n    loadListContent(index) {\r\n      this.topImg = this.tabList[index];\r\n      this.categoryList = this.tabList[index].children;\r\n    },\r\n    /**\r\n     * 一级分类点击\r\n     */\r\n    tabtap(item, i) {\r\n      if (item.id != this.currentId) {\r\n        this.currentId = item.id;\r\n        this.loadListContent(i);\r\n      }\r\n    },\r\n\r\n    navigateToList(sid, tid) {\r\n      uni.navigateTo({\r\n        url: `/pages/navigation/search/searchPage?category=${tid}`,\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\npage {\r\n  height: 100%;\r\n  background-color: #fdfaff;\r\n}\r\n/* 解决小程序和app滚动条的问题 */\r\n/* #ifdef MP-WEIXIN || APP-PLUS */\r\n::-webkit-scrollbar {\r\n  display: none;\r\n}\r\n/* #endif */\r\n/* 解决H5 的问题 */\r\n/* #ifdef H5 */\r\nuni-scroll-view .uni-scroll-view::-webkit-scrollbar {\r\n  /* 隐藏滚动条，但依旧具备可以滚动的功能 */\r\n  display: none;\r\n}\r\n/* #endif */\r\n.s-list {\r\n  box-shadow: 0 4rpx 12rpx 0 rgba(0, 0, 0, 0.05);\r\n}\r\n.nav-search {\r\n  padding-left: 30rpx !important;\r\n  padding-right: 20rpx !important;\r\n}\r\n.title {\r\n  display: block;\r\n  width: 259rpx;\r\n  text-align: center;\r\n   font-size: 28rpx;\r\n\r\n \r\n}\r\n.category-wrap {\r\n  height: 100%;\r\n  .content {\r\n    height: calc(100vh - 94px);\r\n    display: flex;\r\n    color: #333;\r\n    font-size: 28rpx;\r\n    background: #fff;\r\n  }\r\n  .left-aside {\r\n    flex-shrink: 0;\r\n    width: 200rpx;\r\n    height: 100%;\r\n    background-color: #f7f7f7;\r\n  }\r\n  .f-item {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 100%;\r\n    height: 97rpx;\r\n    position: relative;\r\n    &.active {\r\n      font-weight: bold;\r\n      color: $light-color;\r\n      background: #fff;\r\n    }\r\n  }\r\n  .right-aside {\r\n    flex: 1;\r\n    overflow: hidden;\r\n    padding: 40rpx 0 0 30rpx;\r\n  }\r\n\r\n  .top-img {\r\n    width: 500rpx;\r\n    height: 230rpx;\r\n    border-radius: 8px;\r\n    overflow: hidden;\r\n    image {\r\n      width: 100%;\r\n      height: 100%;\r\n    }\r\n  }\r\n  .s-item {\r\n    display: flex;\r\n    align-items: center;\r\n    height: 70rpx;\r\n    padding-top: 16rpx;\r\n    font-weight: 500;\r\n  }\r\n  .t-list {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    width: 100%;\r\n    padding-top: 12rpx;\r\n  }\r\n  .margin-right {\r\n    margin-right: 0 !important;\r\n  }\r\n  .t-item {\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    flex-direction: column;\r\n    width: 150rpx;\r\n    margin-right: 25rpx;\r\n    font-size: 24rpx;\r\n    padding-bottom: 20rpx;\r\n    image {\r\n      width: 140rpx;\r\n      height: 140rpx;\r\n      border-radius: 8px;\r\n      margin-bottom: 20rpx;\r\n    }\r\n    /deep/ .u-image {\r\n      width: 140rpx !important;\r\n      height: 140rpx !important;\r\n      border-radius: 8px !important;\r\n      margin-bottom: 20rpx !important;\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/index.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <!-- 楼层装修组件 -->\r\n    <tpl ref=\"tpl\" />\r\n  </div>\r\n</template>\r\n<script>\r\nimport tpl from \"@/pages/tabbar/home/views.vue\";\r\n\r\nexport default {\r\n  data() {\r\n    return {\r\n      background: {\r\n        backgroundColor: \"#fff\",\r\n      },\r\n    };\r\n  },\r\n  onShow(){\r\n    setTimeout(()=>{\r\n      this.$refs.tpl.fetchCoupon();\r\n    },1000)\r\n  },\r\n  methods: {\r\n\r\n  },\r\n  onReachBottom(){\r\n    // 给子级监听触底加载\r\n    uni.$emit('onReachBottom',true)\r\n  },\r\n  \r\n  onPullDownRefresh() {\r\n    this.$refs.tpl.init();\r\n\r\n    uni.stopPullDownRefresh();\r\n  },\r\n  components: {\r\n    tpl,\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/template/advertising.scss",
    "content": ".position-box{\n    position: absolute;\n    right: 0;\n    bottom: 0;\n}\n.join-box {\n    display: flex;\n  }\n  .item-price {\n    > span {\n      font-size: 15px;\n      font-weight: 500;\n      color: #e1212b;\n    }\n  }\n  .join-item {\n    flex: 1;\n  }\n  .item-img {\n    width: 75px;\n    height: 75px;\n    margin: 0 auto;\n    display: block;\n  }\n  .item-img-box {\n    position: relative;\n  }\n  .item-line-through {\n    > span {\n      font-size: 10px;\n      font-weight: 400;\n      text-decoration: line-through;\n      color: #999;\n    }\n  }\n  .item-position-tips {\n    position: absolute;\n    right: 0;\n    color: #fff;\n    font-size: 12px;\n    bottom: 0;\n  }\n  .join-title {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    background: #fff;\n    height: 50px;\n    > div:nth-of-type(1) {\n      font-size: 16px;\n      font-weight: bold;\n    }\n    > div:nth-of-type(2) {\n      font-size: 12px;\n      color: #999;\n    }\n  }"
  },
  {
    "path": "pages/tabbar/home/template/fetch_coupon.vue",
    "content": "<template>\n  <div>\n    <u-popup v-model=\"enableShowCoupon\" mode=\"center\" width=\"550rpx\" height=\"400px\">\n      <view style=\"height: 130rpx\">\n        <view\n          style=\"\n            width: 200rpx;\n            height: 120rpx;\n            float: left;\n            line-height: 120rpx;\n            font-size: 35rpx;\n            color: #28a4f2;\n            font-weight: 600;\n            margin-left: 20rpx;\n          \"\n          >优惠券活动</view\n        >\n        <view style=\"width: 120rpx; height: 120rpx; float: right\">\n          <image\n            @click=\"enableShowCoupon = false\"\n            src=\"/static/cpauto1.png\"\n            style=\"width: 100%; height: 100%\"\n          ></image>\n        </view>\n      </view>\n      <scroll-view scroll-y=\"true\" style=\"height: 620rpx\">\n        <!-- {{coupList}} -->\n        <view v-for=\"(item, index) in coupList\" :key=\"index\">\n          <view class=\"grad1\">\n            <view style=\"float: right\">\n              <view v-if=\"item.couponType == 'DISCOUNT'\"\n                >{{ item.discount }}折</view\n              >\n              <view v-else\n                >优惠金额：<span style=\"color: red; font-size: 32rpx\">{{\n                  item.price | unitPrice\n                }}</span\n                >元</view\n              >\n              <view\n                >满<span style=\"color: red; font-size: 32rpx\"\n                  >{{ item.consumeThreshold | unitPrice }}元</span\n                >可用</view\n              >\n              <view v-if=\"item.scopeType == 'ALL' && item.storeId == '0'\"\n                >全平台</view\n              >\n              <view v-if=\"item.scopeType == 'PORTION_GOODS_CATEGORY'\"\n                >仅限品类</view\n              >\n              <view v-else\n                >{{\n                  item.storeName == \"platform\"\n                    ? \"全平台\"\n                    : item.storeName + \"店铺\"\n                }}使用\n              </view>\n              <view v-if=\"item.endTime\"\n                >有效期至：{{ item.endTime.split(\" \")[0] }}</view\n              >\n            </view>\n            <view\n              style=\"\n                color: white;\n                font-size: 28rpx;\n                font-weight: 500;\n                float: left;\n                writing-mode: vertical-rl;\n                flex: auto;\n                height: 100%;\n                display: flex;\n                flex-direction: column;\n                justify-content: center;\n                align-items: center;\n              \"\n              @click=\"enableShowCoupon = false\"\n            >\n              立即使用\n            </view>\n          </view>\n        </view>\n      </scroll-view>\n    </u-popup>\n  </div>\n</template>\n\n<script>\nimport { getAutoCoup } from \"@/api/login\";\nimport storage from \"@/utils/storage.js\";\nexport default {\n  data() {\n    return {\n      storage,\n      enableShowCoupon: false,\n      coupList:[]\n    };\n  },\n  mounted() {\n    this.firstGetAuto();\n  },\n  methods: {\n    firstGetAuto() {\n      if(!this.$options.filters.isLogin('auth')) return false\n      let data = new Date();\n      let now = data.getDate();\n      let hours = data.getHours();\n      let flagCoup = storage.getAutoCp();\n      if (\n        storage.getAutoCp() &&\n        storage.getAutoCp() != \"\" &&\n        storage.getAutoCp() != undefined &&\n        storage.getAutoCp() != null\n      ) {\n        if (Number(now) > Number(flagCoup)) {\n          if (Number(hours) >= 6) {\n            storage.setAutoCp(now);\n            this.getAutoCp();\n          }\n        }\n      } else {\n        this.getAutoCp();\n      }\n    },\n    getAutoCp() {\n      let data = new Date();\n      let now = data.getDate();\n      getAutoCoup().then((res) => {\n        console.log(res);\n        if (res.data.success) {\n          this.coupList.push(...res.data.result);\n          if (this.coupList != \"\") {\n            this.enableShowCoupon = true;\n          } else {\n            this.enableShowCoupon = false;\n          }\n          storage.setAutoCp(now);\n          let objs = {};\n          this.coupList = this.coupList.reduce((cur, next) => {\n            //对象去重\n            if (next.id != undefined) {\n              objs[next.id] ? \"\" : (objs[next.id] = true && cur.push(next));\n            }\n            return cur;\n          }, []);\n        }\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.grad1 {\n  width: 500rpx;\n  height: 200rpx;\n  background: radial-gradient(circle at right top, transparent 20rpx, #ff6b35 0)\n      top left / 120rpx 51% no-repeat,\n    radial-gradient(circle at right bottom, transparent 20rpx, #ff6b35 0) bottom\n      left / 120rpx 51% no-repeat,\n    radial-gradient(circle at left top, transparent 20rpx, #ffffff 0) top right /\n      380rpx 51% no-repeat,\n    radial-gradient(circle at left bottom, transparent 20rpx, #ffffff 0) bottom\n      right / 380rpx 51% no-repeat;\n  filter: drop-shadow(6rpx 6rpx 6rpx rgba(0, 0, 0, 0.3));\n  margin: 30rpx auto;\n  padding-top: 2rpx;\n  padding-bottom: 10rpx;\n  padding-left: 38rpx;\n  padding-right: 30rpx;\n}\n</style>\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl.js",
    "content": "/** 配置楼层模块的跳转 */\nexport function modelNavigateTo(item) {\n\tlet val = item.url || item;\n\t//链接跳转到专题\n\n\tif (val && val.id && val.pageType == \"special\") {\n\t\tuni.navigateTo({\n\t\t\turl: `/pages/tabbar/special/special?id=${val.id}`,\n\t\t});\n\t}\n\tswitch (val.___type || val.type) {\n\t\tcase \"goods\":\n\t\t\tuni.navigateTo({\n\t\t\t\turl: \"/pages/product/goods?id=\" + val.id + \"&goodsId=\" + val.goodsId,\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"category\":\n\t\t\tif (val.id) {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl: `/pages/navigation/search/searchPage?category=${val.id}`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tuni.navigateTo({\n\t\t\t\t\turl: `/pages/navigation/search/searchPage`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"shops\":\n\t\t\tuni.navigateTo({\n\t\t\t\turl: `/pages/product/shopPage?id=${val.id}`,\n\t\t\t});\n\t\t\tbreak;\n\t\t\t// 活动\n\t\tcase \"marketing\":\n\t\t\tswitch (val.___promotion) {\n\t\t\t\t// 积分商品\n\t\t\t\tcase \"POINTS_GOODS\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/point/detail?id=${val.promotionId}`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t// 砍价\n\t\t\t\tcase \"KANJIA\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/bargain/detail?id=${val.promotionId}`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t// 优惠券商品\n\t\t\t\tcase \"COUPON\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: \"/pages/product/goods?id=\" + val.skuId + \"&goodsId=\" + val.goodsId,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t// 满减商品\n\t\t\t\tcase \"FULL_DISCOUNT\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: \"/pages/product/goods?id=\" + val.skuId + \"&goodsId=\" + val.goodsId,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t// 秒杀频道\n\t\t\t\tcase \"SECKILL\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: \"/pages/product/goods?id=\" + val.skuId + \"&goodsId=\" + val.goodsId,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"pages\":\n\t\t\tuni.navigateTo({\n\t\t\t\turl: val.___path + \"?id=\" + val.id + \"&title=\" + val.title,\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"other\":\n\t\t\tswitch (val.title || item.title) {\n\t\t\t\tcase \"首页\":\n\t\t\t\t\tuni.switchTab({\n\t\t\t\t\t\turl: `/pages/tabbar/home/index`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"购物车\":\n\t\t\t\t\tuni.switchTab({\n\t\t\t\t\t\turl: `/pages/tabbar/cart/cartList`,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\tcase \"个人中心\":\n\t\t\t\t\tuni.switchTab({\n\t\t\t\t\t\turl: `/pages/tabbar/user/my`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"收藏商品\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/mine/myCollect`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"我的订单\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/order/myOrder?status=0`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"领券中心\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/cart/coupon/couponCenter`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"签到\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/mine/signIn`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"秒杀频道\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/seckill`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"拼团频道\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/joinGroup`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"小程序直播\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/lives`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"砍价\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/bargain/list`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"积分商城\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/promotion/point/pointList`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"店铺列表\":\n\t\t\t\t\tuni.navigateTo({\n\t\t\t\t\t\turl: `/pages/product/shopList`,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// #ifdef H5\n\t\t\t\t\twindow.location.href = val.url || item.link;\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifdef APP-PLUS\n\t\t\t\t\tplus.runtime.openURL(val.url || item.link) //不需要拼接\\\n\t\t\t\t\t// #endif\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t}\n}\n\n\n\t\n\nimport config from \"@/config/config\";\n\nasync function scan() {\n  // #ifdef APP-PLUS\n  let isIos = plus.os.name == \"iOS\";\n  // 判断是否是Ios\n  if (isIos) {\n    const iosFirstCamera = uni.getStorageSync(\"iosFirstCamera\"); //是不是第一次开启相机\n    if (iosFirstCamera !== \"false\") {\n      uni.setStorageSync(\"iosFirstCamera\", \"false\"); //设为false就代表不是第一次开启相机\n      seacnCode();\n    } else {\n      if (permision.judgeIosPermission(\"camera\")) {\n        seacnCode();\n      } else {\n        // 没有权限提醒是否去申请权限\n        tipsGetSettings();\n      }\n    }\n  } else {\n    /**\n     * TODO 安卓 权限已经授权了，调用api总是显示用户已永久拒绝申请。人傻了\n     * TODO 如果xdm有更好的办法请在 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 提下谢谢\n     */\n    seacnCode();\n  }\n\n  // #endif\n\n  // #ifdef MP-WEIXIN\n  seacnCode();\n  // #endif\n}\n/**\n * 提示获取权限\n */\nfunction tipsGetSettings() {\n  uni.showModal({\n    title: \"提示\",\n    content: \"您已经关闭相机权限,去设置\",\n    success: function (res) {\n      if (res.confirm) {\n        if (isIos) {\n          plus.runtime.openURL(\"app-settings:\");\n        } else {\n          permision.gotoAppPermissionSetting();\n        }\n      }\n    },\n  });\n}\n\nfunction seacnCode() {\n  uni.scanCode({\n    success: function (res) {\n      let path = encodeURIComponent(res.result);\n\n      // WX_CODE 为小程序码\n      if (res.scanType == \"WX_CODE\") {\n        console.log(res);\n        uni.navigateTo({\n          url: `/${res.path}`,\n        });\n      } else {\n        config.scanAuthNavigation.forEach((src) => {\n          if (res.result.indexOf(src) != -1) {\n            uni.navigateTo({\n              url: `/${res.result.substring(src.length)}`,\n            });\n          } else {\n            setTimeout(() => {\n              uni.navigateTo({\n                url: \"/pages/tabbar/home/web-view?src=\" + path,\n              });\n            }, 100);\n          }\n        });\n      }\n    },\n  });\n\t}\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl.scss",
    "content": ".image-mode {\n   width: 100%;\n   height: 100%;\n    display: block;\n    padding: 2rpx;\n}\n.layout {\n    padding: 16rpx;\n    margin: 8rpx 0;\n    background: #fff;\n}\n.layout,\n.view-height-75,\n.view-height-150 {\n    overflow: hidden;\n}\n.view-width-100 {\n    width: 100%;\n}\n.view-height-75 {\n    // height: 150rpx;\n}\n.view-height-150 {\n    // height: 300rpx;\n    flex: 1;\n}\n\n.view-height-85 {\n    height: 170rpx;\n    flex: 1;\n}\n\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_banner.vue",
    "content": "<template>\r\n  <div class=\"layout\">\r\n    <div class=\"box\">\r\n      <u-swiper @click=\"clickSwiper\" interval=\"5000\" duration=\"500\" height=\"350\" v-if=\"res\" name=\"img\" :list=\"res.list\">\r\n        <u-loading slot=\"loading\"></u-loading>\r\n      </u-swiper>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport { modelNavigateTo } from \"./tpl\";\r\nexport default {\r\n  title: \"导航栏\",\r\n  props: [\"res\"],\r\n  watch: {\r\n    res: {\r\n      handler(newValue, oldValue) {\r\n        this.$set(this, \"res\", newValue);\r\n      },\r\n      deep: true,\r\n    },\r\n  },\r\n\r\n  mounted() {\r\n   \r\n  },\r\n  methods: {\r\n    clickSwiper(index) {\r\n      modelNavigateTo(this.res.list[index]);\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@import \"./tpl.scss\";\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_flex_five.vue",
    "content": "\n<template>\n  <div class=\"layout\">\n    <u-image width=\"140rpx\" mode=\"aspectFit\" height=\"140rpx\" @click=\"modelNavigateTo(item)\" class=\"image-mode\" v-for=\"(item,index) in res.list\" :key=\"index\" :src=\"item.img\" alt=\"\">\n      <u-loading slot=\"loading\"></u-loading>\n    </u-image>\n  </div>\n</template>\n\n<script>\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  title: \"五列单行图片模块\",\n  props: [\"res\"],\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n  mounted() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-size: cover;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_flex_four.vue",
    "content": "\n<template>\n  <div class=\"layout\">\n    <u-image height=\"175rpx\" mode=\"aspectFit\" width=\"175rpx\" @click=\"modelNavigateTo(item)\" class=\"image-mode\" :src=\"item.img\" v-for=\"(item,index) in res.list\" :key=\"index\">\n      <u-loading slot=\"loading\"></u-loading>\n    </u-image>\n  </div>\n</template>\n\n<script>\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  title: \"四列单行图片模块\",\n  props: [\"res\"],\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n  mounted() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n \n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-size: cover;\n}\nimg {\n  width: 84px;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_flex_one.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"flex-one\">\n      <u-image v-if=\"res.list[0].zoneInfo == ''\" @click=\"modelNavigateTo(res.list[0])\" width=\"100%\" mode=\"aspectFit\" height=\"280rpx\" :src=\"res.list[0].img\" alt=\"\"></u-image>\n      <hotzone v-else :res=\"res\"></hotzone>\n    </div>\n  </div>\n</template>\n<script>\nimport { modelNavigateTo } from \"./tpl\";\nimport hotzone from \"@/pages/tabbar/home/template/tpl_hot_zone.vue\";\n\nexport default {\n  title: \"单行图片模块\",\n  components: {\n    hotzone,\n  },\n  data() {\n    return {\n      modelNavigateTo\n    };\n  },\n  props: [\"res\"],\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.flex-one {\n  width: 100%;\n  display: block;\n  overflow: hidden;\n  > img {\n    width: 100%;\n    height: 100%;\n  }\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_flex_three.vue",
    "content": "\n<template>\n  <div class=\"layout\">\n    <u-image @click=\"modelNavigateTo(item)\" height=\"240rpx\" width=\"240rpx\" class=\"image-mode\" :src=\"item.img\" v-for=\"(item, index) in res.list\" :key=\"index\">\n      <u-loading slot=\"loading\"></u-loading>\n    </u-image>\n  </div>\n</template>\n\n<script>\nimport { modelNavigateTo } from \"./tpl\";\n\nexport default {\n  title: \"三列单行图片模块\",\n  props: [\"res\"],\n  mounted() {\n   \n  },\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  padding: 0;\n\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-size: cover;\n}\nimg {\n  width: 111px;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_flex_two.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"flex-two\">\n      <div class=\"flex-item\" @click=\"modelNavigateTo(res.list[0])\">\n        <u-image height=\"250rpx\" width=\"100%\" mode=\"scaleToFill\" :src=\"res.list[0].img\" alt>\n          <u-loading slot=\"loading\"></u-loading>\n        </u-image>\n      </div>\n      <div class=\"flex-item\" @click=\"modelNavigateTo(res.list[1])\">\n        <u-image height=\"250rpx\" width=\"100%\" mode=\"scaleToFill\" :src=\"res.list[1].img\" alt>\n          <u-loading slot=\"loading\"></u-loading>\n        </u-image>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\nimport uImage from \"@/uview-ui/components/u-image/u-image.vue\";\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  components: { uImage },\n  title: \"两张横图\",\n  props: [\"res\"],\n  mounted() {\n   \n  },\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.flex-two {\n  width: 100%;\n  display: flex;\n  overflow: hidden;\n}\n.flex-item {\n  width: 50%;\n  > img {\n    display: block;\n    max-width: 100%;\n    height: 100%;\n  }\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_goods.vue",
    "content": "<template>\r\n  <div class=\"layout\">\r\n    <u-sticky>\r\n      <div class=\"goods-cell-title\">\r\n        <div\r\n          class=\"goods-item-title\"\r\n          :class=\"{ 'selected-title': selected.index == index }\"\r\n          @click=\"handleClickTitle(title, index)\"\r\n          v-for=\"(title, index) in res.list[0].titleWay\"\r\n          :key=\"index\"\r\n        >\r\n          <h4 class=\"h4\">{{ title.title }}</h4>\r\n          <div>{{ title.desc }}</div>\r\n        </div>\r\n      </div>\r\n    </u-sticky>\r\n    <div class=\"goods-list\">\r\n      <div\r\n        v-if=\"\r\n          item.___index != undefined\r\n            ? selected.index == item.___index\r\n            : selected.val == item.type\r\n        \"\r\n        @click=\"handleClick(item)\"\r\n        class=\"goods-item\"\r\n        v-for=\"(item, item_index) in res.list[0].listWay\"\r\n        :key=\"item_index\"\r\n      >\r\n        <div class=\"goods-img\">\r\n          <u-image\r\n            :src=\"item.img\"\r\n            height=\"350rpx\"\r\n            mode=\"aspectFit\"\r\n            width=\"100%\"\r\n          >\r\n            <u-loading slot=\"loading\"></u-loading>\r\n          </u-image>\r\n        </div>\r\n        <div class=\"goods-desc\">\r\n          <div class=\"goods-title\">\r\n            {{ item.title }}\r\n          </div>\r\n          <div class=\"goods-bottom\">\r\n            <div class=\"goods-price\">\r\n              ¥<span\r\n                >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span\r\n              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div\r\n        v-if=\"res.list[0].titleWay[selected.index].bindCategory && goodsData.length\"\r\n        v-for=\"(item, index) in goodsData\"\r\n        :key=\"index\"\r\n        class=\"goods-item\"\r\n        @click=\"handleClick(item)\"\r\n      >\r\n        <div class=\"goods-img\">\r\n          <u-image\r\n            :src=\"item.thumbnail\"\r\n            height=\"350rpx\"\r\n            mode=\"aspectFit\"\r\n            width=\"100%\"\r\n          >\r\n            <u-loading slot=\"loading\"></u-loading>\r\n          </u-image>\r\n        </div>\r\n        <div class=\"goods-desc\">\r\n          <div class=\"goods-title\">\r\n            {{ item.goodsName }}\r\n          </div>\r\n          <div class=\"goods-bottom\">\r\n            <div class=\"goods-price\">\r\n              ¥<span\r\n                >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span\r\n              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n<script>\r\nimport { getGoodsList } from \"@/api/goods.js\";\r\nexport default {\r\n  title: \"商品分类以及商品\",\r\n  data() {\r\n    return {\r\n      selected: {\r\n        index: 0,\r\n        val: \"\",\r\n      },\r\n      params: {\r\n        pageNumber: 1,\r\n        pageSize: 100,\r\n        categoryId: \"\",\r\n      },\r\n      goodsData: [], //商品循环内容\r\n      goodsResult:\"\", //es总返回内容\r\n    };\r\n  },\r\n  props: [\"res\",\"enableBottomLoad\"],\r\n  watch: {\r\n    res: {\r\n      handler(val) {\r\n        // 监听父级的值 如果有值将值赋给selected\r\n        if (val) {\r\n          // 如果第一个标签页绑定为商品\r\n          this.selected.val = this.res.list[0].listWay[0] ? this.res.list[0].listWay[0].type: '';\r\n          // 如果第一个标签为绑定为分类\r\n          this.res.list[0].titleWay[0].bindCategory ? this.initGoods(this.res.list[0].titleWay[0]) : ''\r\n        }\r\n      },\r\n      immediate: true,\r\n    },\r\n  },\r\n  mounted() {\r\n    uni.$on('onReachBottom',()=>{\r\n      if(this.enableBottomLoad && this.goodsResult.totalElements >= this.params.pageNumber * this.params.pageSize){\r\n        this.params.pageNumber++\r\n        this.initGoods(this.res.list[0].titleWay[this.selected.index])\r\n      }\r\n      \r\n    })\r\n  },\r\n  destroyed(){\r\n    uni.$off('onReachBottom')\r\n  },\r\n  methods: {\r\n    handleClick(item) {\r\n      uni.navigateTo({\r\n        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,\r\n      });\r\n    },\r\n    closeGoods(val, index) {\r\n      this.res.list[0].listWay.splice(index, 1);\r\n    },\r\n    async initGoods(val) {\r\n      if(this.enableBottomLoad) this.params.pageSize = 20\r\n      val ? this.params.categoryId = val.bindCategory.id : '';\r\n      const res = await getGoodsList(this.params);\r\n      if (res.data.success) {\r\n        this.goodsResult = res.data.result\r\n        const result = res.data.result.records\r\n        this.goodsData.push(...result);\r\n        console.log(this.goodsData)\r\n      }\r\n    },\r\n    handleClickTitle(val, index) {\r\n      this.selected.index = index;\r\n      this.selected.val = val.title;\r\n      if (val.bindCategory) {\r\n        this.params.pageNumber = 1\r\n        this.goodsData = []\r\n        this.initGoods(val);\r\n      }\r\n    },\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n$w_94: 94%;\r\n\r\n.layout {\r\n  padding: 8px 0;\r\n  background: #f9f9f9;\r\n}\r\n\r\n.selected-title {\r\n  > h4 {\r\n    font-size: 30rpx;\r\n    color: #000 !important;\r\n  }\r\n\r\n  > div {\r\n    font-weight: bold;\r\n    color: $main-color !important;\r\n  }\r\n}\r\n\r\n.goods-cell-title {\r\n  background: #f9f9f9;\r\n  padding: 10px;\r\n  transition: 0.35s;\r\n  display: flex;\r\n\r\n  > .goods-item-title {\r\n    flex: 1;\r\n    text-align: center;\r\n\r\n    > h4 {\r\n      font-size: 32rpx;\r\n    }\r\n\r\n    > div {\r\n      color: #999;\r\n      font-size: 24rpx;\r\n    }\r\n  }\r\n}\r\n\r\n.goods-list {\r\n  width: 100%;\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n.goods-item {\r\n  width: 50%;\r\n  margin-bottom: 10px;\r\n  border-radius: 0.4em;\r\n  overflow: hidden;\r\n}\r\n\r\n.goods-img {\r\n  position: relative;\r\n  margin: 0 auto;\r\n  // width: 158px;\r\n  width: $w_94;\r\n  border-top-left-radius: 20rpx;\r\n  border-top-right-radius: 20rpx;\r\n  overflow: hidden;\r\n  > img {\r\n    width: 100%;\r\n    height: 100%;\r\n  }\r\n}\r\n\r\n.goods-desc {\r\n  border-bottom-left-radius: 20rpx;\r\n  border-bottom-right-radius: 20rpx;\r\n  width: $w_94;\r\n  background: #fff;\r\n  padding: 8rpx 0 8rpx 8rpx;\r\n  margin: 0 auto;\r\n  > .goods-title {\r\n    font-size: 24rpx;\r\n    height: 67rpx;\r\n    display: -webkit-box;\r\n    font-weight: 500;\r\n    -webkit-box-orient: vertical;\r\n    -webkit-line-clamp: 2;\r\n    overflow: hidden;\r\n  }\r\n\r\n  > .goods-bottom {\r\n    display: flex;\r\n    font-weight: bold;\r\n    > .goods-price {\r\n      line-height: 2;\r\n      color: $main-color;\r\n      > span {\r\n        font-size: 42rpx;\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_group.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"join-list\">\n      <div class=\"join-title\">\n        <div>{{ res.list[0].title }}</div>\n        <div>更多</div>\n      </div>\n      <div class=\"join-box\">\n        <div class=\"join-item\" @click=\"modelNavigateTo(item)\" v-for=\"item in 4\" :key=\"item\">\n          <div class=\"item-img-box\">\n            <img class=\"item-img\" src=\"https://picsum.photos/id/268/200/200\" alt />\n          </div>\n          <div class=\"item-price\">\n            <span>￥120.00</span>\n          </div>\n          <div class=\"item-line-through\">\n            <span>￥190.00</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\n// TODO 后续版本开发此功能 尽情期待\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  props: [\"res\"],\n  title: \"拼团\",\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n@import \"./advertising.scss\";\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_hot_zone.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"flex-one hot-image\">\n      <image mode=\"widthFix\" :src=\"res.list[0].img\" alt=\"\"></image>\n\n      <image\n        v-for=\"(area, index) in res.list[0].zoneInfo\"\n\t\t\t\t:key=\"index\"\n        @click=\"modelNavigateTo(area)\"\n        mode=\"widthFix\"\n        class=\"hot-area\"\n        :style=\"{\n          left: area.leftPer * 100 + '%',\n          top: area.topPer * 100 + '%',\n          width: area.widthPer * 100 + '%',\n          height: area.heightPer * 100 + '%',\n        }\"\n        :src=\"area.img\"\n        alt=\"\"\n      ></image>\n    </div>\n  </div>\n</template>\n<script>\nimport { modelNavigateTo } from \"./tpl\";\n\nexport default {\n  title: \"热区模块\",\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n  props: [\"res\"],\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.hot-image {\n  position: relative;\n}\n.hot-area {\n  position: absolute;\n  z-index: 99;\n}\n.flex-one {\n  width: 100%;\n  display: block;\n  overflow: hidden;\n  image {\n    width: 100%;\n   \n    min-height: 200rpx;\n    // height: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_integral.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"join-list\">\n      <div class=\"join-title\">\n        <div>{{ res.list[0].title }}</div>\n        <div>更多</div>\n      </div>\n      <div class=\"join-box\">\n        <div class=\"join-item\" v-for=\"item in 4\" :key=\"item\">\n          <div class=\"item-img-box\">\n            <img class=\"item-img\" src=\"https://picsum.photos/id/268/200/200\" alt />\n          </div>\n          <div class=\"item-price\">\n            <span>20积分</span>\n          </div>\n          <div class=\"item-line-through\">\n            <span>30积分</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\n// TODO 后续版本开发此功能 尽情期待\nexport default {\n  title:\"积分商品\",\n  props: [\"res\"],\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.join-box {\n  display: flex;\n}\n.item-price {\n  > span {\n    font-size: 15px;\n    font-weight: 500;\n    color: #e1212b;\n  }\n}\n.join-item {\n  flex: 1;\n}\n.item-img {\n  width: 75px;\n  height: 75px;\n  margin: 0 auto;\n  display: block;\n}\n.item-img-box {\n  position: relative;\n}\n.item-line-through {\n  > span {\n    font-size: 10px;\n    font-weight: 400;\n    text-decoration: line-through;\n    color: #999;\n  }\n}\n.item-position-tips {\n  position: absolute;\n  right: 0;\n  color: #fff;\n  font-size: 12px;\n  bottom: 0;\n}\n.join-title {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  background: #fff;\n  height: 50px;\n  > div:nth-of-type(1) {\n    font-size: 16px;\n    font-weight: bold;\n  }\n  > div:nth-of-type(2) {\n    font-size: 12px;\n    color: #999;\n  }\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_join_group.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"join-list\">\n      <div class=\"join-title\">\n        <div>{{ res.list[0].title }}</div>\n        <div>更多</div>\n      </div>\n      <div class=\"join-box\">\n        <div class=\"join-item\" v-for=\"item in 4\" :key=\"item\">\n          <div class=\"item-img-box\">\n            <img\n              class=\"item-img\"\n              src=\"https://picsum.photos/id/268/200/200\"\n              alt\n            />\n            <div class=\"item-position-tips\">2人团</div>\n          </div>\n          <div class=\"item-price\">\n            <span>￥120.00</span>\n          </div>\n          <div class=\"item-line-through\">\n            <span>￥120.00</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\n// TODO 后续版本开发此功能 尽情期待\nexport default {\n  props: [\"res\"],\n  title:\"团购\"\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.join-box {\n  display: flex;\n}\n.item-price {\n  > span {\n    font-size: 15px;\n    font-weight: 500;\n    color: #e1212b;\n  }\n}\n.join-item {\n  flex: 1;\n}\n.item-img {\n  width: 75px;\n  height: 75px;\n  margin: 0 auto;\n  display: block;\n}\n.item-img-box {\n  position: relative;\n}\n.item-line-through {\n  > span {\n    font-size: 10px;\n    font-weight: 400;\n    text-decoration: line-through;\n    color: #999;\n  }\n}\n.item-position-tips {\n  position: absolute;\n  right: 0;\n  color: #fff;\n  font-size: 12px;\n  bottom: 0;\n}\n.join-title {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  background: #fff;\n  height: 50px;\n  > div:nth-of-type(1) {\n    font-size: 16px;\n    font-weight: bold;\n  }\n  > div:nth-of-type(2) {\n    font-size: 12px;\n    color: #999;\n  }\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_left_one_right_two.vue",
    "content": "\n<template>\n  <div class=\"layout\">\n    <div class=\"view-height-150\" @click=\"modelNavigateTo(res.list[0])\">\n      <u-image width=\"100%\" height=\"340rpx\" class=\"image-mode\" :src=\"res.list[0].img\">\n        <u-loading slot=\"loading\"></u-loading>\n      </u-image>\n    </div>\n    <div class=\"view-height-150\">\n      <div class=\"view-height-75\" @click=\"modelNavigateTo(res.list[1])\">\n        <u-image width=\"100%\" height=\"170rpx\" class=\"image-mode\" :src=\"res.list[1].img\" alt>\n          <u-loading slot=\"loading\"></u-loading>\n        </u-image>\n      </div>\n      <div class=\"view-height-75\" @click=\"modelNavigateTo(res.list[2])\">\n        <u-image width=\"100%\" height=\"170rpx\" class=\"image-mode\" :src=\"res.list[2].img\" alt>\n          <u-loading slot=\"loading\"></u-loading>\n        </u-image>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\n\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  title: \"左一右二\",\n  props: [\"res\"],\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n  mounted() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n\n  background-size: cover;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_left_two_right_one.vue",
    "content": "\n<template>\n  <div class=\"layout \">\n    <div class=\"view-height-150\">\n      <div class=\"view-height-75\"  @click=\"modelNavigateTo(res.list[0])\">\n        <u-image class=\"image-mode\"  width=\"100%\" height=\"150rpx\" :src=\"res.list[0].img\" ></u-image>\n      </div>\n      <div class=\"view-height-75\"  @click=\"modelNavigateTo(res.list[1])\">\n        <u-image class=\"image-mode\" width=\"100%\" height=\"150rpx\"  :src=\"res.list[1].img\" ></u-image>\n      </div>\n    </div>\n    <div class=\"view-height-150\"  @click=\"modelNavigateTo(res.list[2])\">\n      <u-image class=\"image-mode\"  width=\"100%\" height=\"300rpx\"  :src=\"res.list[2].img\" ></u-image>\n    </div>\n  </div>\n</template>\n\n<script>\nimport {modelNavigateTo} from './tpl'\nexport default {\n  title: \"左二右一\",\n  props: [\"res\"],\n   data () {\n    return {\n      modelNavigateTo,\n    }\n  },\n  mounted() {\n   \n  }\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  height: 300rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n\n  background-size: cover;\n}\n\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_menu.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"menu-list\">\n      <div\n        class=\"menu-item\"\n        @click=\"modelNavigateTo(item)\"\n        v-for=\"(item, index) in res.list\"\n        :key=\"index\"\n      >\n        <div>\n          <u-image\n            width=\"88rpx\"\n            height=\"88rpx\"\n            class=\"menu-img\"\n            :src=\"item.img\"\n          >\n            <u-loading slot=\"loading\"></u-loading>\n          </u-image>\n        </div>\n        <div class=\"menu-title\">{{ item.title }}</div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  title: \"五列菜单\",\n  props: [\"res\"],\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.menu-list {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n\n  > .menu-item {\n    text-align: center;\n    width: 20%;\n    // flex: 1;\n    margin: 20rpx 0;\n  }\n}\n.menu-img {\n  display: flex;\n  margin: 0 auto;\n  width: 88rpx;\n  height: 88rpx;\n}\n.menu-title {\n  font-size: 24rpx;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_notice.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"background\">\n      <u-notice-bar mode=\"vertical\" :bg-color=\"res.list[0].bk_color\" :color=\"res.list[0].color\" :list=\"list\"></u-notice-bar>\n    </div>\n  </div>\n</template>\n\n<script>\n  export default {\n    title: \"公告\",\n    props: [\"res\"],\n    data() {\n      return {\n        list: []\n      }\n    },\n    mounted() {\n      this.list = this.res.list[0].title.map(i => i.context);\n    },\n  };\n</script>\n<style lang=\"scss\" scoped>\n  @import \"./tpl.scss\";\n  .background {\n    position: absolute;\n    z-index: 2;\n    width: 100%;\n    height: 84rpx;\n    text-align: left;\n    font-size: 20rpx;\n    background-size: cover;\n  }\n  .layout {\n    text-align: center;\n    position: relative;\n    height: 84rpx;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n\n    background: #ffffff;\n  }\n  .title {\n    line-height: 84rpx;\n    font-size: 20px;\n    font-weight: bold;\n  }\n</style>\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_promotions_detail.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"join-list\">\n      <div\n        v-for=\"(item, index) in res.list\"\n        :key=\"index\"\n        class=\"join-list-item\"\n        @click=\"goToDetail(item.type)\"\n      >\n        <div>\n          <div class=\"join-title\">\n            <div>{{ item.title }}</div>\n            <div\n              class=\"sub\"\n              v-if=\"item.type !== 'SECKILL'\"\n              :style=\"{\n                backgroundColor: item.bk_color,\n                color: item.color1,\n                borderColor: item.bk_color,\n              }\"\n            >\n              {{ item.title1 }}\n            </div>\n            <div class=\"sub-seckill\" v-else>\n              <div class=\"sub-seckill-block flex\">\n                <div class=\"sub-seckill-block-text\">\n                  {{ timeLine[0] ? timeLine[0].timeLine : \"x\" }}点场\n                </div>\n                {{ times.hours == \"00\" ? \"0\" : times.hours }}:{{\n                  times.minutes\n                }}:{{ times.seconds }}\n              </div>\n            </div>\n          </div>\n          <div class=\"join-box\">\n            <div\n              class=\"join-item\"\n              v-for=\"(i, _index) in item.data\"\n              :key=\"_index\"\n            >\n              <div class=\"item-img-box\">\n                <u-image\n                  class=\"item-img\"\n                  width=\"156rpx\"\n                  height=\"156rpx\"\n                  :src=\"i.thumbnail ? i.thumbnail : i.goodsImage\"\n                  alt\n                />\n              </div>\n              <div\n                class=\"ellipsis\"\n                :class=\"{ 'max-width': res.list.length <= 1 }\"\n              >\n                {{ i.goodsName ? i.goodsName : i.name }}\n              </div>\n              <div class=\"item-price\">\n                <span>￥{{ i.price ? i.price : i.originalPrice }}</span>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\nimport * as API_Promotions from \"@/api/promotions\";\nimport Foundation from \"@/utils/Foundation.js\";\nexport default {\n  props: [\"res\"],\n  data() {\n    return {\n      timeLine: \"\", //获取几个点活动\n      resTime: 0, //当前时间\n      time: 0, //距离下一个活动的时间值\n      times: {}, //时间集合\n      onlyOne: \"\", //是否最后一个商品\n    };\n  },\n  mounted() {\n    let params = {\n      pageNumber: 1,\n      pageSize: 2,\n      status: \"START\",\n      promotionStatus: \"START\",\n    };\n    this._setTimeInterval = setInterval(() => {\n      if (this.time <= 0) {\n        clearInterval(this._setTimeInterval);\n      } else {\n        this.times = Foundation.countTimeDown(this.time);\n        this.time--;\n      }\n    }, 1000);\n    this.res.list.forEach((ele) => {\n      switch (ele.type) {\n        case \"PINTUAN\":\n          API_Promotions.getAssembleList(params).then((response) => {\n            const data = response.data.result.records;\n            if (data) {\n              ele.data = data;\n            }\n          });\n          break;\n        case \"SECKILL\":\n          API_Promotions.getSeckillTimeLine().then((response) => {\n            if (response.data.success && response.data.result) {\n              ele.data = response.data.result[0].seckillGoodsList.slice(0, 2);\n              let timeLine = response.data.result.sort(\n                (x, y) => Number(x.timeLine) - Number(y.timeLine)\n              );\n              this.timeLine = timeLine.slice(0, 5);\n              this.resTime = parseInt(new Date().getTime() / 1000);\n              this.onlyOne = response.data.result.length === 1;\n              this.diffTime = parseInt(new Date().getTime() / 1000) - this.resTime;\n\n              this.time =\n                this.timeLine[0].distanceStartTime ||\n                (this.timeLine[1] && this.timeLine[1].distanceStartTime) ||\n                Foundation.theNextDayTime() - this.diffTime;\n              this.times = Foundation.countTimeDown(this.time);\n              console.log(this.timeLine);\n            }\n          });\n          break;\n        case \"LIVE\":\n          API_Promotions.getLiveList(params).then((response) => {\n            if (response.success && response.result.records) {\n              ele.data = response.result.records[0].commodityList.slice(0, 2);\n            }\n          });\n          break;\n        case \"KANJIA\":\n          API_Promotions.getBargainList(params).then((response) => {\n            if (response.success && response.result) {\n              ele.data = response.result.records(0, 2);\n            }\n          });\n          break;\n        default:\n          break;\n      }\n    });\n  },\n  methods: {\n    //跳转详情\n    goToDetail(type) {\n      switch(type) {\n        case \"SECKILL\":\n          uni.navigateTo({\n            url: `/pages/promotion/seckill`,\n          });\n          break;\n        case \"PINTUAN\":\n          uni.navigateTo({\n            url: `/pages/promotion/joinGroup`,\n          });\n          break;\n        case \"LIVE\":\n          uni.navigateTo({\n            url: `/pages/promotion/lives`,\n          });\n          break;\n        case \"KANJIA\":\n          uni.navigateTo({\n            url: `/pages/promotion/bargain/list`,\n          });\n          break;\n      };\n    }\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.join-box {\n  display: flex;\n}\n.join-list {\n  width: 100%;\n  display: flex;\n  overflow: hidden;\n}\n.join-list-item {\n  flex: 1;\n}\n.ellipsis {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  width: 108rpx; // 大于1个活动\n  font-size: 22rpx;\n}\n.max-width {\n  width: 316rpx !important;\n}\n.item-price {\n  > span {\n    font-size: 28rpx;\n    font-weight: 500;\n    color: #e1212b;\n  }\n}\n.join-item {\n  flex: 1;\n}\n.item-img {\n  width: 150rpx;\n  height: 150rpx;\n  margin: 0 auto;\n  display: block;\n}\n.item-img-box {\n  position: relative;\n}\n.item-line-through {\n  > span {\n    font-size: 20rpx;\n    font-weight: 400;\n    text-decoration: line-through;\n    color: #999;\n  }\n}\n.item-position-tips {\n  position: absolute;\n  right: 0;\n  color: #fff;\n  font-size: 24rpx;\n  bottom: 0;\n}\n.join-title {\n  display: flex;\n\n  align-items: center;\n  background: #fff;\n  height: 100rpx;\n  > div:nth-of-type(1) {\n    font-size: 30rpx;\n    font-weight: bold;\n  }\n  > div:nth-of-type(2) {\n    font-size: 20rpx;\n    line-height: 1.75;\n    border-radius: 16rpx;\n    text-align: center;\n    padding: 0 16rpx;\n    margin-left: 20rpx;\n  }\n  .sub {\n    background-color: #e1212b;\n    margin-right: 80rpx;\n  }\n  .sub-seckill {\n    white-space: nowrap;\n    padding: 0 !important;\n  }\n  .sub-seckill-block {\n    background: rgba($main-color, 0.3);\n    border-radius: 100px !important;\n    color: rgba($main-color, 0.7);\n    overflow: hidden;\n    padding-right: 8rpx;\n  }\n  .sub-seckill-block-text {\n    background-color: $main-color;\n    color: #fff;\n    border-top-right-radius: 100px;\n    border-bottom-right-radius: 100px;\n    padding: 0 12rpx !important;\n    margin-right: 12rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_search.vue",
    "content": "<template>\r\n  <div class=\"layout\">\r\n    <div class=\"search\" @click=\"handleSearch\">\r\n      <u-icon name=\"search\"></u-icon>\r\n      {{ res.list[0].title }}\r\n    </div>\r\n    <div slot=\"right\" open-type=\"contact\" class=\"navbar-right message\" @click=\"linkMsgDetail\" style=\"border-style:none;background:rgb(234,234,234);\" >\r\n\t\t  <image style=\"width:53rpx;height:53rpx;margin-top:6rpx;\" src=\"@/static/img/title.png\"></image>\r\n\t  </div>\r\n  </div>\r\n</template>\r\n<script>\r\nexport default {\r\n  title:\"搜索栏\",\r\n  props: [\"res\",\"storeId\"],\r\n  methods: {\r\n    linkMsgDetail(){\r\n      uni.navigateTo({\r\n        url:`/pages/tabbar/home/title`\r\n      })\r\n    },\r\n \r\n    handleSearch() {\r\n      if(this.storeId){\r\n        uni.navigateTo({\r\n        url: `/pages/navigation/search/searchPage?storeId=${this.storeId}`,\r\n      });\r\n      }else{\r\n         uni.navigateTo({\r\n        url: `/pages/navigation/search/searchPage`,\r\n      });\r\n      }\r\n      \r\n    },\r\n  },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@import \"./tpl.scss\";\r\n\r\n.search {\r\n  height: 64rpx;\r\n  border-radius: 10rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  background: #ededed;\r\n}\r\n\r\n.layout {\r\n  background: #fff;\r\n  padding: 0 16rpx;\r\n  position: relative;\r\n}\r\n.navbar-right{\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\t// right: 0;\r\n}\r\n.message{\r\n\tright:40rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_spike.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"join-list\">\n      <div class=\"join-title\">\n        <div>{{ res.list[0].title }}</div>\n        <div>更多</div>\n      </div>\n      <div class=\"join-box\">\n        <div class=\"join-item\" v-for=\"item in 4\" :key=\"item\">\n          <div class=\"item-img-box\">\n            <img\n              class=\"item-img\"\n              src=\"https://picsum.photos/id/268/200/200\"\n              alt\n            />\n          </div>\n          <div class=\"item-price\">\n            <span>￥120.00</span>\n          </div>\n          <div class=\"item-line-through\">\n            <span>￥190.00</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script>\n// TODO 后续版本开发此功能 尽情期待\nexport default {\n  props: [\"res\"],\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n@import './advertising.scss';\n\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_text_picture.vue",
    "content": "\n<template>\n  <div class=\"layout\">\n    <div class=\"view-list\">\n      <div class=\"view-item\" @click=\"modelNavigateTo(res.list[0])\">\n        <div class=\"-item-tilte\">{{res.list[0].title}}</div>\n        <div class=\"-item-image\">\n          <u-image width=\"120rpx\" mode=\"scaleToFill\" height=\"120rpx\" :src=\"res.list[0].img\" alt ></u-image>\n        </div>\n      </div>\n      <div class=\"view-item\" @click=\"modelNavigateTo(res.list[1])\">\n        <div class=\"-item-tilte\">{{res.list[1].title}}</div>\n        <div class=\"-item-image\">\n          <u-image width=\"120rpx\" mode=\"scaleToFill\" height=\"120rpx\"  :src=\"res.list[1].img\" alt ></u-image>\n        </div>\n      </div>\n    </div>\n    <div class=\"view-list\">\n      <div class=\"view-item\" @click=\"modelNavigateTo(res.list[2])\">\n        <div class=\"-item-tilte\">{{res.list[2].title}}</div>\n        <div class=\"-item-image\">\n          <u-image width=\"120rpx\" mode=\"scaleToFill\" height=\"120rpx\"  :src=\"res.list[2].img\" alt ></u-image>\n        </div>\n      </div>\n      <div class=\"view-item\" @click=\"modelNavigateTo(res.list[3])\">\n        <div class=\"-item-tilte\">{{res.list[3].title}}</div>\n        <div class=\"-item-image\">\n          <u-image width=\"120rpx\" mode=\"scaleToFill\" height=\"120rpx\"  :src=\"res.list[3].img\" alt ></u-image>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\n\nimport {modelNavigateTo} from './tpl'\nexport default {\n  title: \"文字图片模板\",\n  props: [\"res\"],\n   data () {\n    return {\n      modelNavigateTo,\n    }\n  },\n  mounted() {\n\n  }\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  display: flex;\n  background: #e8e8e8;\n  align-items: center;\n  justify-content: center;\n  background-size: cover;\n  padding: 0;\n}\n.-item-image{\n     \n     padding: 10px ;\n     >img{\n        \n         width: 100%;\n     }\n}\n.-item-tilte {\n  background: $aider-light-color;\n  height: 60rpx;\n  color: #fff;\n  font-size: 14px;\n  text-align: center;\n  line-height: 30px;\n}\n\n.view-list {\n  width: 48%;\n  margin: 0 auto;\n  display: flex;\n  background: #fff;\n   border-top-left-radius: 0.8em;\n    border-top-right-radius: 0.8em;\n    border: 1px solid #ededed;\n    \n  > .view-item {\n    width: 50%;\n  }\n  > .view-item:nth-of-type(1) {\n    > .-item-tilte {\n      border-top-left-radius: 0.8em;\n    }\n  }\n  > .view-item:nth-of-type(2) {\n    > .-item-tilte {\n      border-top-right-radius: 0.8em;\n    }\n  }\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_title.vue",
    "content": "<template>\r\n  <div class=\"layout\" :style=\"{textAlign: res.list[0].textAlign}\"  @click=\"modelNavigateTo(res.list[0])\" >\r\n    <div class=\"background\" :style=\"{ backgroundColor: res.list[0].bk_color}\">\r\n      <div class=\"title\" :style=\"{ color: res.list[0].color }\">\r\n        {{ res.list[0].title }}\r\n      </div>\r\n      <div style=\"position: absolute;right: 10px;top:2px;color: #fff;line-height: 42px;font-size: 10px\">\r\n        <a  :style=\"{ color: res.list[0].color1 }\" style=\"text-decoration: none\">{{ res.list[0].title1 }}</a>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n\r\n<script>\r\nimport { modelNavigateTo } from \"./tpl\";\r\nexport default {\r\n  title: \"标题栏\",\r\n  props: [\"res\"],\r\n  data() {\r\n    return {\r\n      modelNavigateTo,\r\n    };\r\n  },\r\n  mounted() {},\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@import \"./tpl.scss\";\r\n.background {\r\n  // background: url(\"/static/title.png\") no-repeat;\r\n  position: absolute;\r\n  z-index: 2;\r\n  width: 100%;\r\n  height: 84rpx;\r\n  background-position-x: center;\r\n  background-position-y: center;\r\n  background-size: cover;\r\n}\r\n\r\n.layout {\r\n  text-align: center;\r\n  position: relative;\r\n  height: 84rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n\r\n  background: #ffffff;\r\n}\r\n\r\n.title {\r\n  line-height: 84rpx;\r\n  font-size: 30rpx;\r\n  font-weight: bold;\r\n  margin-left: 8rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/template/tpl_top_one_bottom_two.vue",
    "content": "\n<template>\n  <div class=\"layout\">\n    <div class=\"view-width-100\" @click=\"modelNavigateTo(res.list[0])\">\n      <u-image class=\"image-mode\" width=\"100%\" height=\"200rpx\" :src=\"res.list[0].img\">\n        <u-loading slot=\"loading\"></u-loading>\n      </u-image>\n    </div>\n    <div class=\"view-width-100\" @click=\"modelNavigateTo(res.list[1])\">\n      <div class=\"view-height-85\">\n        <u-image class=\"image-mode\" width=\"100%\" height=\"170rpx\" :src=\"res.list[1].img\">\n          <u-loading slot=\"loading\"></u-loading>\n        </u-image>\n      </div>\n      <div class=\"view-height-85\" @click=\"modelNavigateTo(res.list[2])\">\n        <u-image class=\"image-mode\" width=\"100%\" height=\"170rpx\" :src=\"res.list[2].img\">\n          <u-loading slot=\"loading\"></u-loading>\n        </u-image>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { modelNavigateTo } from \"./tpl\";\nexport default {\n  title: \"上一下二\",\n  props: [\"res\"],\n  data() {\n    return {\n      modelNavigateTo,\n    };\n  },\n  mounted() {},\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-size: cover;\n\n  flex-direction: column;\n}\n// img {\n//   width: 100% !important;\n//   height: 85px !important;\n// }\n.view-width-100 {\n  padding: 1px 0;\n  display: flex;\n  height: 200rpx;\n  width: 100%;\n  > img {\n    width: 100%;\n    height: 100%;\n  }\n}\n.view-height-85 {\n  padding: 0 1px;\n  width: 50%;\n  > img {\n    width: 100%;\n    height: 100%;\n  }\n}\n.image-mode{\n  width: 100%;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/home/template/tpl_top_two_bottom_one.vue",
    "content": "<template>\n  <div class=\"layout\">\n    <div class=\"view-width-100\">\n      <div class=\"view-height-85\" @click=\"modelNavigateTo(res.list[0])\">\n        <u-image\n          class=\"image-mode\"\n          height=\"170rpx\"\n          width=\"100%\"\n          :src=\"res.list[0].img\"\n          alt\n          ><u-loading slot=\"loading\"></u-loading\n        ></u-image>\n      </div>\n      <div class=\"view-height-85\" @click=\"modelNavigateTo(res.list[1])\">\n        <u-image\n          class=\"image-mode\"\n          height=\"170rpx\"\n          width=\"100%\"\n          :src=\"res.list[1].img\"\n          alt\n          ><u-loading slot=\"loading\"></u-loading\n        ></u-image>\n      </div>\n    </div>\n    <div class=\"view-width-100\"  @click=\"modelNavigateTo(res.list[2])\">\n      <u-image\n        class=\"image-mode\"\n        height=\"200rpx\"\n        width=\"100%\"\n        :src=\"res.list[2].img\"\n        ><u-loading slot=\"loading\"></u-loading\n      ></u-image>\n    </div>\n  </div>\n</template>\n\n<script>\nimport {modelNavigateTo} from './tpl'\nexport default {\n  title: \"上二下一\",\n  props: [\"res\"],\n   data () {\n    return {\n      modelNavigateTo,\n    }\n  },\n  mounted() {\n \n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n@import \"./tpl.scss\";\n.layout {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-size: cover;\n  // height: 260rpx;\n  flex-direction: column;\n}\n// img {\n//   width: 100% !important;\n//   height: 85px !important;\n// }\n.view-width-100 {\n  padding: 1px 0;\n  display: flex;\n  height: 200rpx;\n  width: 100%;\n}\n.view-height-85 {\n  padding: 0 1px;\n  width: 50%;\n}\n.image-mode{\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "pages/tabbar/home/title.vue",
    "content": "<template>\n\t<view>\n\t\t<view>\n\t\t\t<u-tabs :list=\"list\" :is-scroll=\"false\" :current=\"current\" @change=\"change\"></u-tabs>\n\t\t\t<view v-if=\"showLoading\" style=\"width:500rpx;margin:0 auto;text-align: center;height:800rpx;line-height: 800rpx;\">\n\t\t\t\t<u-loading mode=\"flower\" ></u-loading>\n\t\t\t\t<text>正在加载中</text>\n\t\t\t</view>\n\t\t\t<u-cell-group v-if=\"current == 0\">\n\t\t\t\t<view v-for=\"(item,index) in lists\" :key=\"index\">\n\t\t\t\t\t<u-cell-item :arrow=\"false\" v-if=\"item.status =='UN_READY'\" style=\"position: relative;\"\n\t\t\t\t\t\t@click=\"linkMsgDetail(item)\">\n\t\t\t\t\t\t<template slot=\"label\">\n\t\t\t\t\t\t\t<view style=\"display: inline-block;\n                width: 100%;\n                height: auto;\n                font-family: Gibson;\n                font-size: 25rpx;\n                word-break: break-all;\n                text-overflow: ellipsis;\n                word-wrap: break-word;\n                white-space: pre-wrap;\">\n\t\t\t\t\t\t\t\t<view style=\"color:black;font-size:30rpx;font-weight:500;\">{{item.title}}</view>\n\t\t\t\t\t\t\t\t<view>{{item.content}}</view>\n\t\t\t\t\t\t\t\t<view style=\"width:400rpx;padding: 10rpx 0;\">{{item.createTime}}</view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<!-- <button  style=\"width:100rpx;height:60rpx;float:right;font-size:20rpx;line-height:60rpx;background:#000000;color:white;\">未读</button> -->\n\t\t\t\t\t</u-cell-item>\n\t\t\t\t</view>\n\n\t\t\t</u-cell-group>\n\t\t\t<u-cell-group v-if=\"current == 1\">\n\t\t\t\t<view v-for=\"(item,index) in lists\" :key=\"index\">\n\t\t\t\t\t<u-cell-item :arrow=\"false\" v-if=\"item.status == 'ALREADY_READY'\" style=\"position: relative;\"\n\t\t\t\t\t\t@click=\"linkMsgDetail(item)\">\n\t\t\t\t\t\t<template slot=\"label\">\n\t\t\t\t\t\t\t<view style=\"display: inline-block;\n\t\t\t\t\t\t\t  width: 100%;\n\t\t\t\t\t\t\t  height: auto;\n\t\t\t\t\t\t\t  font-family: Gibson;\n\t\t\t\t\t\t\t  font-size: 25rpx;\n\t\t\t\t\t\t\t  word-break: break-all;\n\t\t\t\t\t\t\t  text-overflow: ellipsis;\n\t\t\t\t\t\t\t  word-wrap: break-word;\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  white-space: pre-wrap;\">\n\t\t\t\t\t\t\t  <view style=\"color:black;font-size:30rpx;font-weight:500;\">{{item.title}}</view>\n\t\t\t\t\t\t\t  <view>{{item.content}}</view>\n\t\t\t\t\t\t\t  <view style=\"width:400rpx;padding: 10rpx 0;\">{{item.createTime}}</view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<!-- <button  style=\"width:100rpx;height:60rpx;float:right;font-size:20rpx;line-height:60rpx;background:#F3F3FA;color:black;\">已读</button> -->\n\t\t\t\t\t</u-cell-item>\n\t\t\t\t</view>\n\t\t\t</u-cell-group>\n\t\t</view>\n\n\t</view>\n</template>\n\n<script>\n\timport {\n\t\tmessages,\n\t\teditMessages\n\t} from \"@/api/message.js\"\n\texport default {\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tshowLoading:true,\n\t\t\t\tparams: {\n\t\t\t\t\tpageSize: 20,\n\t\t\t\t\tpageNumber: 1,\n\t\t\t\t\tmemberId: \"\",\n\t\t\t\t\tmessageId: \"\",\n\t\t\t\t\tstatus:\"UN_READY\"\n\t\t\t\t},\n\t\t\t\tloadText: {\n\t\t\t\t\tloadmore: '轻轻上拉',\n\t\t\t\t\tloading: '努力加载中',\n\t\t\t\t\tnomore: '实在没有了'\n\t\t\t\t},\n\t\t\t\tlist: [{\n\t\t\t\t\tname: \"未读\"\n\t\t\t\t}, {\n\t\t\t\t\tname: \"已读\"\n\t\t\t\t}],\n\t\t\t\tcurrent: 0,\n\t\t\t\tlists: [],\n\t\t\t\tstatus: \"loadmore\"\n\t\t\t}\n\t\t},\n\t\tonShow() {\n\t\t\tthis.getMessage()\n\t\t},\n\t\tonReachBottom() {\n\t\t\tthis.params.pageNumber++;\n\t\t\tthis.statuss = \"loading\";\n\t\t\tthis.getMessage()\n\t\t},\n\t\tmethods: {\n\t\t\tlinkMsgDetail(v) {\n\n\t\t\t\tif (v.status == 'UN_READY') {\n\t\t\t\t\tlet params = {}\n\t\t\t\t\tparams.messageId = v.memberId\n\t\t\t\t\teditMessages(v.id, params).then(res => {\n\t\t\t\t\t\tif (res.data.success) {\n                            console.log( this.lists)\n                            this.lists.forEach((item,index)=>{\n                                console.log(item)\n                                if(item.id == v.id){\n                                    this.lists.splice(index, 1)\n                                }\n                            })\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// uni.navigateTo({\n\t\t\t\t// \turl:`/pages/tabbar/home/messageDetail?data=${encodeURIComponent(JSON.stringify(v))}`\n\t\t\t\t// })\n\t\t\t\t\n\n\t\t\t},\n\t\t\t/**\n\t\t\t * 返回\n\t\t\t */\n\t\t\tback() {\n\t\t\t\tif (getCurrentPages().length == 1) {\n\t\t\t\t\tuni.switchTab({\n\t\t\t\t\t\turl: \"/pages/tabbar/home/index\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tuni.navigateBack();\n\t\t\t\t}\n\t\t\t},\n\t\t\tchange(e) {\n\t\t\t\tthis.showLoading = true;\n\t\t\t\tconsole.log(e)\n\t\t\t\tthis.current = e;\n\t\t\t\tif (e == 0) {\n\t\t\t\t\tthis.params.status = \"UN_READY\"\n\t\t\t\t\tthis.params.pageNumber = 1;\n\t\t\t\t} else if (e == 1) {\n\t\t\t\t\tthis.params.status = \"ALREADY_READY\"\n\t\t\t\t\tthis.params.pageNumber = 1;\n\t\t\t\t}\n\t\t\t\tthis.lists = []\n\t\t\t\tthis.getMessage()\n\t\t\t},\n\t\t\tgetMessage() {\n\t\t\t\tthis.params.memberId = this.$options.filters.isLogin().id;\n\t\t\t\t\n\t\t\t\tmessages(this.params).then(res => {\n\t\t\t\t\tconsole.log(res)\n\t\t\t\t\tif (res.data.success) {\n\t\t\t\t\t\tthis.showLoading = false\n\t\t\t\t\t\tif (res.data.result.records == '') {\n\t\t\t\t\t\t\tconsole.log(11111)\n\t\t\t\t\t\t\tthis.status = \"nomore\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres.data.result.records.forEach(item => {\n\t\t\t\t\t\t\tthis.lists.push(item)\n\t\t\t\t\t\t\tlet obj = {};\n\t\t\t\t\t\t\tthis.lists = this.lists.reduce(\n\t\t\t\t\t\t\t\t(cur, next) => {\n\t\t\t\t\t\t\t\t\t//对象去重\n\t\t\t\t\t\t\t\t\tif (next.id != undefined) {\n\t\t\t\t\t\t\t\t\t\tobj[next.id] ?\n\t\t\t\t\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\t\t\t\t\t(obj[next.id] = true && cur.push(next));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconsole.log(cur);\n\t\t\t\t\t\t\t\t\treturn cur;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t[]\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t}\n</script>\n<style>\n\t.foot {\n\t\tposition: fixed;\n\t\tbottom: 0;\n\t}\n</style>\n"
  },
  {
    "path": "pages/tabbar/home/views.vue",
    "content": "<template>\r\n  <div class=\"wrapper\">\r\n    <!-- uni 中不能使用 vue component 所以用if判断每个组件 -->\r\n    <div v-for=\"(item, index) in pageData.list\" :key=\"index\">\r\n      <!-- 搜索栏，如果在楼层装修顶部则会自动浮动，否则不浮动 -->\r\n      <u-navbar class=\"navbar\" v-if=\"item.type == 'search'\" :is-back=\"false\" :is-fixed=\"index === 1 ? false : true\">\r\n        <search style=\"width: 100%\" :res=\"item.options\" />\r\n        <!-- #ifndef H5 -->\r\n        <!-- 扫码功能 不兼容h5 详情文档: https://uniapp.dcloud.io/api/system/barcode?id=scancode -->\r\n        <div slot=\"right\" class=\"navbar-right\">\r\n          <u-icon name=\"scan\" @click=\"scan()\" color=\"#666\" size=\"50\"></u-icon>\r\n        </div>\r\n        <!-- #endif -->\r\n      </u-navbar>\r\n      <carousel v-if=\"item.type == 'carousel'\" :res=\"item.options\" />\r\n      <titleLayout v-if=\"item.type == 'title'\" :res=\"item.options\" />\r\n      <leftOneRightTwo v-if=\"item.type == 'leftOneRightTwo'\" :res=\"item.options\" />\r\n      <leftTwoRightOne v-if=\"item.type == 'leftTwoRightOne'\" :res=\"item.options\" />\r\n      <topOneBottomTwo v-if=\"item.type == 'topOneBottomTwo'\" :res=\"item.options\" />\r\n      <topTwoBottomOne v-if=\"item.type == 'topTwoBottomOne'\" :res=\"item.options\" />\r\n      <flexThree v-if=\"item.type == 'flexThree'\" :res=\"item.options\" />\r\n      <flexFive v-if=\"item.type == 'flexFive'\" :res=\"item.options\" />\r\n      <flexFour v-if=\"item.type == 'flexFour'\" :res=\"item.options\" />\r\n      <flexTwo v-if=\"item.type == 'flexTwo'\" :res=\"item.options\" />\r\n      <textPicture v-if=\"item.type == 'textPicture'\" :res=\"item.options\" />\r\n      <menuLayout v-if=\"item.type == 'menu'\" :res=\"item.options\" />\r\n      <flexOne v-if=\"item.type == 'flexOne'\" :res=\"item.options\" />\r\n      <goods :enableBottomLoad=\"enableLoad\" v-if=\"item.type == 'goods'\" :res=\"item.options\" />\r\n      <group v-if=\"item.type == 'group'\" :res=\"item.options\" />\r\n      <notice v-if=\"item.type == 'notice'\" :res=\"item.options\" />\r\n      <promotions v-if=\"item.type == 'promotionDetail'\" :res=\"item.options\" />\r\n      <!-- <joinGroup v-if=\"item.type == 'joinGroup'\" :res=\"item.options\" /> -->\r\n      <!-- <integral v-if=\"item.type == 'integral'\" :res=\"item.options\" /> -->\r\n      <!-- <spike v-if=\"item.type == 'spike'\" :res=\"item.options\" /> -->\r\n    \r\n    </div>\r\n    <fetchCoupon ref='coupon' />\r\n    <u-no-network @retry=\"init\" @isConnected=\"isConnected\"></u-no-network>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\n// 引用组件\r\nimport tpl_banner from \"@/pages/tabbar/home/template/tpl_banner\"; //导航栏模块\r\nimport tpl_title from \"@/pages/tabbar/home/template/tpl_title\"; //标题栏模块\r\nimport tpl_left_one_right_two from \"@/pages/tabbar/home/template/tpl_left_one_right_two\"; //左一右二模块\r\nimport tpl_left_two_right_one from \"@/pages/tabbar/home/template/tpl_left_two_right_one\"; //左二右一模块\r\nimport tpl_top_one_bottom_two from \"@/pages/tabbar/home/template/tpl_top_one_bottom_two\"; //上一下二模块\r\nimport tpl_top_two_bottom_one from \"@/pages/tabbar/home/template/tpl_top_two_bottom_one\"; //上二下一模块\r\nimport tpl_flex_one from \"@/pages/tabbar/home/template/tpl_flex_one\"; //单行图片模块\r\nimport tpl_flex_two from \"@/pages/tabbar/home/template/tpl_flex_two\"; //两张横图模块\r\nimport tpl_flex_three from \"@/pages/tabbar/home/template/tpl_flex_three\"; //三列单行图片模块\r\nimport tpl_flex_five from \"@/pages/tabbar/home/template/tpl_flex_five\"; //五列单行图片模块\r\nimport tpl_flex_four from \"@/pages/tabbar/home/template/tpl_flex_four\"; //四列单行图片模块\r\nimport tpl_text_picture from \"@/pages/tabbar/home/template/tpl_text_picture\"; //文字图片模板\r\nimport tpl_menu from \"@/pages/tabbar/home/template/tpl_menu\"; //五列菜单模块\r\nimport tpl_search from \"@/pages/tabbar/home/template/tpl_search\"; //搜索栏\r\nimport tpl_group from \"@/pages/tabbar/home/template/tpl_group\"; //\r\nimport tpl_goods from \"@/pages/tabbar/home/template/tpl_goods\"; //商品分类以及分类中的商品\r\n// 结束引用组件\r\nimport { getFloorData } from \"@/api/home\"; //获取楼层装修接口\r\nimport permission from \"@/js_sdk/wa-permission/permission.js\"; //权限工具类\r\nimport config from \"@/config/config\";\r\n\r\nimport tpl_notice from \"@/pages/tabbar/home/template/tpl_notice\"; //标题栏模块\r\nimport tpl_promotions from \"@/pages/tabbar/home/template/tpl_promotions_detail\"; //标题栏模块\r\nimport storage from \"@/utils/storage.js\";\r\nimport fetchCoupon from '@/pages/tabbar/home/template/fetch_coupon'\r\n// import {receiveCoupons} from \"@/api/members\"\r\n\r\nexport default {\r\n  data () {\r\n    return {\r\n      config,\r\n      storage,\r\n      showCp:true,\r\n      pageData: \"\", //楼层页面数据\r\n      isIos: \"\",\r\n      enableLoad: false, //触底加载 针对于商品模块\r\n    };\r\n  },\r\n  components: {\r\n    carousel: tpl_banner,\r\n    titleLayout: tpl_title,\r\n    leftOneRightTwo: tpl_left_one_right_two,\r\n    leftTwoRightOne: tpl_left_two_right_one,\r\n    topOneBottomTwo: tpl_top_one_bottom_two,\r\n    topTwoBottomOne: tpl_top_two_bottom_one,\r\n    flexThree: tpl_flex_three,\r\n    flexFive: tpl_flex_five,\r\n    flexFour: tpl_flex_four,\r\n    flexTwo: tpl_flex_two,\r\n    textPicture: tpl_text_picture,\r\n    menuLayout: tpl_menu,\r\n    search: tpl_search,\r\n    flexOne: tpl_flex_one,\r\n    goods: tpl_goods,\r\n    group: tpl_group,\r\n    notice: tpl_notice,\r\n    promotions: tpl_promotions,\r\n    fetchCoupon\r\n  },\r\n\r\n  mounted () {\r\n    this.init();\r\n    // #ifdef MP-WEIXIN\r\n    // 小程序默认分享\r\n    uni.showShareMenu({ withShareTicket: true });\r\n    // #endif\r\n   \r\n  },\r\n  methods: {\r\n    fetchCoupon(){\r\n       this.$refs.coupon.firstGetAuto();\r\n    },\r\n    /**\r\n     * 实例化首页数据楼层\r\n     */\r\n    init () {\r\n      this.pageData = \"\";\r\n      getFloorData().then((res) => {\r\n        if (res.data.success) {\r\n          const result = JSON.parse(res.data.result.pageData)\r\n          this.pageData = result;\r\n          if (result.list.length) {\r\n            // 如果最后一个装修模块是商品模块的话 默认启用自动加载\r\n            result.list[result.list.length - 1] ? result.list[result.list.length - 1].model == 'goods' ? this.enableLoad = true : '' : ''\r\n          }\r\n        }\r\n      });\r\n    },\r\n    // 是否有网络链接\r\n    isConnected (val) {\r\n      val ? this.init() : ''\r\n    },\r\n\r\n    /**\r\n     * TODO 扫码功能后续还会后续增加\r\n     * 应该实现的功能目前计划有：\r\n     * 扫描商品跳转商品页面\r\n     * 扫描活动跳转活动页面\r\n     * 扫描二维码登录\r\n     * 扫描其他站信息 弹出提示，返回首页。\r\n     */\r\n    scanCode () {\r\n      uni.scanCode({\r\n        success: function (res) {\r\n          let path = encodeURIComponent(res.result);\r\n\r\n\r\n\r\n          if (path != undefined && path.indexOf(\"QR_CODE_LOGIN_SESSION\") == 0) {\r\n            console.log(path)\r\n            //app扫码登录\r\n            uni.navigateTo({\r\n              url: \"/pages/passport/scannerCodeLoginConfirm?token=\" + path\r\n            });\r\n            return;\r\n          }\r\n\r\n\r\n          // WX_CODE 为小程序码\r\n          if (res.scanType == \"WX_CODE\") {\r\n            console.log(res);\r\n            uni.navigateTo({\r\n              url: `/${res.path}`,\r\n            });\r\n          } else {\r\n            config.scanAuthNavigation.forEach((src) => {\r\n              if (res.result.indexOf(src) != -1) {\r\n                uni.navigateTo({\r\n                  url: `/${res.result.substring(src.length)}`,\r\n                });\r\n              } else {\r\n                setTimeout(() => {\r\n                  uni.navigateTo({\r\n                    url: \"/pages/tabbar/home/web-view?src=\" + path,\r\n                  });\r\n                }, 100);\r\n              }\r\n            });\r\n          }\r\n        },\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 提示获取权限\r\n     */\r\n    tipsGetSettings () {\r\n      uni.showModal({\r\n        title: \"提示\",\r\n        content: \"您已经关闭相机权限,去设置\",\r\n        success: function (res) {\r\n          if (res.confirm) {\r\n            if (this.isIos) {\r\n              plus.runtime.openURL(\"app-settings:\");\r\n            } else {\r\n              permission.gotoAppPermissionSetting();\r\n            }\r\n          }\r\n        },\r\n      });\r\n    },\r\n\r\n    /**\r\n     * 唤醒客户端扫码\r\n     * 没权限去申请权限，有权限获取扫码功能\r\n     */\r\n    async scan () {\r\n      // #ifdef APP-PLUS\r\n      this.isIos = plus.os.name == \"iOS\";\r\n      // 判断是否是Ios\r\n      if (this.isIos) {\r\n        const iosFirstCamera = uni.getStorageSync(\"iosFirstCamera\"); //是不是第一次开启相机\r\n        if (iosFirstCamera !== \"false\") {\r\n          uni.setStorageSync(\"iosFirstCamera\", \"false\"); //设为false就代表不是第一次开启相机\r\n          this.scanCode();\r\n        } else {\r\n          if (permission.judgeIosPermission(\"camera\")) {\r\n            this.scanCode();\r\n          } else {\r\n            // 没有权限提醒是否去申请权限\r\n            this.tipsGetSettings();\r\n          }\r\n        }\r\n      } else {\r\n        /**\r\n         * TODO 安卓 权限已经授权了，调用api总是显示用户已永久拒绝申请。人傻了\r\n         * TODO 如果xdm有更好的办法请在 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 提下谢谢\r\n         */\r\n        this.scanCode();\r\n      }\r\n\r\n      // #endif\r\n\r\n      // #ifdef MP-WEIXIN\r\n      this.scanCode();\r\n      // #endif\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.navbar-right {\r\n  padding: 0 16rpx 0 0;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/home/web-view.vue",
    "content": "<template>\n  <view class=\"web-view\">\n    <web-view :webview-styles=\"webviewStyles\" :src=\"src\"></web-view>\n  </view>\n</template>\n\n<script>\nimport configs from \"@/config/config\";\nimport storage from \"@/utils/storage\";\nexport default {\n  data() {\n    return {\n      configs,\n      storage,\n      webviewStyles: {\n        progress: {\n          color: this.$lightColor,\n        },\n      },\n      src: \"\",\n    };\n  },\n  onLoad(params) {\n    // params.IM ? (this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}&id=${params.IM}`): (this.src = decodeURIComponent(params.src));\n\tif(params.IM)\n\t{\n\t\tif(params.IM==0)\n\t\t{\n\t\t\tthis.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}`;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}&id=${params.IM}`;\n\t\t}\n\t}\n\telse\n\t{\n\t\tthis.src = decodeURIComponent(params.src);\n\t\tconsole.log(this.src);\n\t}\n    \n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.web-view {\n  /deep/ .web-view {\n    padding: 0;\n    margin: 0;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/tabbar/screen/fullScreen.vue",
    "content": "<template>\n   <u-modal v-model=\"show\" cancelText=\"不同意\" confirmText=\"同意\" showCancelButton title=\"服务协议和隐私政策\" @confirm=\"confirm\" @cancel=\"cancel\">\n    <view class=\"u-update-content\">\n      请您务必审慎阅读,充分理解“服务协议”和“隐私政策”各条款，\n      包括但不限于：为了更好的向你提供服务，我们需要收集你的设备标识,\n      操作日志等信息用于分析，优化应用性能。 您可阅读你可阅读\n      <a @click=\"gotoLink\">《服务协议》</a>\n      和\n      <a @click=\"gotoB\"> 《隐私政策》</a>了解详细信息。\n      如果您同意，请点击下面按钮开始接受我们的服务。\n    </view>\n  </u-modal>\n</template>\n\n<script>\nimport storage from \"@/utils/storage\";\nexport default {\n  created() {\n    //先进入 created\n    // if (storage.getShow()) {\n    //   //展示的话进入  true\n    //   console.log(this.show); //如果上面没读缓存  此时 this.show 为true\n    //   if (!this.show) {\n    //     //如果等于 false 了 就跳到主页\n    //     this.show = storage.getShow(); //这里就为false\n    //     setTimeout(() => {\n    //       //然后这里就跳转到  首页\n    //       uni.reLaunch({\n    //         //跳转到 首页\n    //         url: \"/pages/tabbar/home/index\",\n    //       });\n    //     }, 500);\n    //   }\n    // }\n  },\n  data() {\n    return {\n      show: true, //展示\n      btnShow:true,\n      a: \"\",\n    };\n  },\n  //   onReady() {\n  //     this.show = true;\n  //   },\n  methods: {\n    gotoLink() {\n      uni.navigateTo({\n        //点击跳转到浏览器\n        url:\n          \"/pages/tabbar/home/web-view?src=https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\",\n      });\n    },\n    gotoB() {\n      uni.navigateTo({\n        url:\n          \"/pages/tabbar/home/web-view?src=https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\",\n      });\n    },\n     //取消\n    cancel(){\n      // #ifdef APP-PLUS\n        //  const threadClass = plus.ios.importClass(\"NSThread\");\n        //  const mainThread = plus.ios.invoke(threadClass, \"mainThread\");\n        //  plus.ios.invoke(mainThread, \"exit\")\n       plus.ios.import(\"UIApplication\").sharedApplication().performSelector(\"exit\")\n\t\t // #endif\n    },\n    confirm() {\n      //点击\n      this.show = false; // 让这个框为false\n      storage.setShow(this.show); //存入缓存\n      if (!this.show) {\n        // 他如果 不展示  就跳转到主页\n        setTimeout(() => {\n          uni.reLaunch({\n            //跳转到 首页\n            url: \"/pages/tabbar/home/index\",\n          });\n        }, 500);\n      }\n    },\n  },\n};\n</script>\n\n<style scoped>\n.u-update-content {\n  font-size: 26rpx;\n  padding: 30rpx;\n}\na {\n  text-decoration: blue;\n  color: blue;\n}\n</style>\n"
  },
  {
    "path": "pages/tabbar/special/special.vue",
    "content": "<template>\n  <div class=\"wrapper\">\n    <!-- uni 中不能使用 vue component 所以用if判断每个组件 -->\n    <div v-for=\"(item, index) in pageData.list\" :key=\"index\">\n      <!-- 搜索栏，如果在楼层装修顶部则会自动浮动，否则不浮动 -->\n      <div class=\"navbar\" v-if=\"item.type == 'search'\">\n        <search style=\"width: 100%\" :res=\"item.options\" />\n        <!-- #ifndef H5 -->\n        <!-- 扫码功能 不兼容h5 详情文档: https://uniapp.dcloud.io/api/system/barcode?id=scancode -->\n        <div slot=\"right\" class=\"navbar-right\">\n          <u-icon name=\"scan\" @click=\"scan()\" color=\"#666\" size=\"50\"></u-icon>\n        </div>\n        <!-- #endif -->\n      </div>\n      <carousel v-if=\"item.type == 'carousel'\" :res=\"item.options\" />\n      <titleLayout v-if=\"item.type == 'title'\" :res=\"item.options\" />\n      <leftOneRightTwo\n        v-if=\"item.type == 'leftOneRightTwo'\"\n        :res=\"item.options\"\n      />\n      <leftTwoRightOne\n        v-if=\"item.type == 'leftTwoRightOne'\"\n        :res=\"item.options\"\n      />\n      <topOneBottomTwo\n        v-if=\"item.type == 'topOneBottomTwo'\"\n        :res=\"item.options\"\n      />\n      <topTwoBottomOne\n        v-if=\"item.type == 'topTwoBottomOne'\"\n        :res=\"item.options\"\n      />\n      <flexThree v-if=\"item.type == 'flexThree'\" :res=\"item.options\" />\n      <flexFive v-if=\"item.type == 'flexFive'\" :res=\"item.options\" />\n      <flexFour v-if=\"item.type == 'flexFour'\" :res=\"item.options\" />\n      <flexTwo v-if=\"item.type == 'flexTwo'\" :res=\"item.options\" />\n      <textPicture v-if=\"item.type == 'textPicture'\" :res=\"item.options\" />\n      <menuLayout v-if=\"item.type == 'menu'\" :res=\"item.options\" />\n      <flexOne v-if=\"item.type == 'flexOne'\" :res=\"item.options\" />\n      <goods v-if=\"item.type == 'goods'\" :res=\"item.options\" />\n      <group v-if=\"item.type == 'group'\" :res=\"item.options\" />\n      <notice v-if=\"item.type == 'notice'\" :res=\"item.options\" />\n      <promotions v-if=\"item.type == 'promotionDetail'\" :res=\"item.options\" />\n      <!-- <joinGroup v-if=\"item.type == 'joinGroup'\" :res=\"item.options\" /> -->\n      <!-- <integral v-if=\"item.type == 'integral'\" :res=\"item.options\" /> -->\n      <!-- <spike v-if=\"item.type == 'spike'\" :res=\"item.options\" /> -->\n    </div>\n    <u-no-network></u-no-network>\n  </div>\n</template>\n\n<script>\n// 引用组件\nimport tpl_banner from \"@/pages/tabbar/home/template/tpl_banner\"; //导航栏模块\nimport tpl_title from \"@/pages/tabbar/home/template/tpl_title\"; //标题栏模块\nimport tpl_left_one_right_two from \"@/pages/tabbar/home/template/tpl_left_one_right_two\"; //左一右二模块\nimport tpl_left_two_right_one from \"@/pages/tabbar/home/template/tpl_left_two_right_one\"; //左二右一模块\nimport tpl_top_one_bottom_two from \"@/pages/tabbar/home/template/tpl_top_one_bottom_two\"; //上一下二模块\nimport tpl_top_two_bottom_one from \"@/pages/tabbar/home/template/tpl_top_two_bottom_one\"; //上二下一模块\nimport tpl_flex_one from \"@/pages/tabbar/home/template/tpl_flex_one\"; //单行图片模块\nimport tpl_flex_two from \"@/pages/tabbar/home/template/tpl_flex_two\"; //两张横图模块\nimport tpl_flex_three from \"@/pages/tabbar/home/template/tpl_flex_three\"; //三列单行图片模块\nimport tpl_flex_five from \"@/pages/tabbar/home/template/tpl_flex_five\"; //五列单行图片模块\nimport tpl_flex_four from \"@/pages/tabbar/home/template/tpl_flex_four\"; //四列单行图片模块\nimport tpl_text_picture from \"@/pages/tabbar/home/template/tpl_text_picture\"; //文字图片模板\nimport tpl_menu from \"@/pages/tabbar/home/template/tpl_menu\"; //五列菜单模块\nimport tpl_search from \"@/pages/tabbar/home/template/tpl_search\"; //搜索栏\nimport tpl_group from \"@/pages/tabbar/home/template/tpl_group\"; //\nimport tpl_goods from \"@/pages/tabbar/home/template/tpl_goods\"; //商品分类以及分类中的商品\n// 结束引用组件\nimport { toSpecial, getSpecial } from \"@/api/home\"; //获取楼层装修接口\nimport permision from \"@/js_sdk/wa-permission/permission.js\"; //权限工具类\nimport config from \"@/config/config\";\nimport tpl_notice from \"@/pages/tabbar/home/template/tpl_notice\"; //标题栏模块\nimport tpl_promotions from \"@/pages/tabbar/home/template/tpl_promotions_detail\"; //标题栏模块\n\nexport default {\n  data() {\n    return {\n      id: \"\",\n      config,\n      pageData: \"\", //楼层页面数据\n      bodyParam: \"\",\n      isIos: \"\"\n    };\n  },\n  components: {\n    carousel: tpl_banner,\n    titleLayout: tpl_title,\n    leftOneRightTwo: tpl_left_one_right_two,\n    leftTwoRightOne: tpl_left_two_right_one,\n    topOneBottomTwo: tpl_top_one_bottom_two,\n    topTwoBottomOne: tpl_top_two_bottom_one,\n    flexThree: tpl_flex_three,\n    flexFive: tpl_flex_five,\n    flexFour: tpl_flex_four,\n    flexTwo: tpl_flex_two,\n    textPicture: tpl_text_picture,\n    menuLayout: tpl_menu,\n    search: tpl_search,\n    flexOne: tpl_flex_one,\n    goods: tpl_goods,\n    group: tpl_group,\n    notice: tpl_notice,\n    promotions: tpl_promotions\n  },\n\n  mounted() {\n    this.init();\n    // #ifdef MP-WEIXIN\n    // 小程序默认分享\n    uni.showShareMenu({ withShareTicket: true });\n    // #endif\n  },\n  onLoad(val) {\n    this.id = val.id;\n    this.bodyParam = val.body;\n  },\n\n  methods: {\n    /**\n     * 实例化首页数据楼层\n     */\n    init() {\n      this.pageData = \"\";\n\t  console.log(this.bodyParam);\n      if (this.bodyParam) {\n        toSpecial({body: this.bodyParam}).then(res => {\n          if (res.data.success) {\n            this.pageData = JSON.parse(res.data.result.pageData);\n          }\n        });\n      } else {\n        getSpecial(this.id).then(res => {\n        if (res.data.success) {\n          this.pageData = JSON.parse(res.data.result.pageData);\n        }\n      });\n      }\n    },\n\n    /**\n     * TODO 扫码功能后续还会后续增加\n     * 应该实现的功能目前计划有：\n     * 扫描商品跳转商品页面\n     * 扫描活动跳转活动页面\n     * 扫描二维码登录\n     * 扫描其他站信息 弹出提示，返回首页。\n     */\n    seacnCode() {\n      uni.scanCode({\n        success: function(res) {\n          let path = encodeURIComponent(res.result);\n\n          // WX_CODE 为小程序码\n          if (res.scanType == \"WX_CODE\") {\n            console.log(res);\n            uni.navigateTo({\n              url: `/${res.path}`\n            });\n          } else {\n            config.scanAuthNavigation.forEach(src => {\n              if (res.result.indexOf(src) != -1) {\n                uni.navigateTo({\n                  url: `/${res.result.substring(src.length)}`\n                });\n              } else {\n                setTimeout(() => {\n                  uni.navigateTo({\n                    url: \"/pages/tabbar/home/web-view?src=\" + path\n                  });\n                }, 100);\n              }\n            });\n          }\n        }\n      });\n    },\n\n    /**\n     * 提示获取权限\n     */\n    tipsGetSettings() {\n      uni.showModal({\n        title: \"提示\",\n        content: \"您已经关闭相机权限,去设置\",\n        success: function(res) {\n          if (res.confirm) {\n            if (this.isIos) {\n              plus.runtime.openURL(\"app-settings:\");\n            } else {\n              permision.gotoAppPermissionSetting();\n            }\n          }\n        }\n      });\n    },\n\n    /**\n     * 唤醒客户端扫码\n     * 没权限去申请权限，有权限获取扫码功能\n     */\n    async scan() {\n      // #ifdef APP-PLUS\n      this.isIos = plus.os.name == \"iOS\";\n      // 判断是否是Ios\n      if (this.isIos) {\n        const iosFirstCamera = uni.getStorageSync(\"iosFirstCamera\"); //是不是第一次开启相机\n        if (iosFirstCamera !== \"false\") {\n          uni.setStorageSync(\"iosFirstCamera\", \"false\"); //设为false就代表不是第一次开启相机\n          this.seacnCode();\n        } else {\n          if (permision.judgeIosPermission(\"camera\")) {\n            this.seacnCode();\n          } else {\n            // 没有权限提醒是否去申请权限\n            this.tipsGetSettings();\n          }\n        }\n      } else {\n        /**\n         * TODO 安卓 权限已经授权了，调用api总是显示用户已永久拒绝申请。人傻了\n         * TODO 如果xdm有更好的办法请在 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 提下谢谢\n         */\n        this.seacnCode();\n      }\n\n      // #endif\n\n      // #ifdef MP-WEIXIN\n      this.seacnCode();\n      // #endif\n    }\n  }\n};\n</script>\n\n<style scoped lang=\"scss\">\n.navbar-right {\n  padding: 0 16rpx 0 0;\n}\n\n.navbar {\n  display: flex;\n  align-items: center;\n}\n</style>"
  },
  {
    "path": "pages/tabbar/user/my.vue",
    "content": "<template>\r\n  <view class=\"user\">\r\n    <!-- 个人信息 -->\r\n    <view class=\"status_bar\">\r\n      <!-- 这里是状态栏 -->\r\n    </view>\r\n    <view class=\"header\"  @click=\"userDetail\">\r\n      <view class=\"head-1\">\r\n        <image :src=\"userInfo.face || userImage\"></image>\r\n      </view>\r\n      <view class=\"head-2\" v-if=\"userInfo.id\">\r\n        <view class=\"user-name\">{{ userInfo.nickName }}</view>\r\n      </view>\r\n      <view class=\"head-2\" v-else>\r\n        <view class=\"user-name\">登录/注册</view>\r\n      </view>\r\n      <u-icon style=\"display: flex;align-items: flex-start;\" name=\"arrow-right\"></u-icon>\r\n    </view>\r\n    <!-- 积分，优惠券，关注， -->\r\n    <div class=\"pointBox box\">\r\n      <u-row text-align=\"center\" gutter=\"16\" class=\"point\">\r\n        <u-col text-align=\"center\" span=\"4\" @click=\"navigateTo('/pages/mine/deposit/operation')\">\r\n          <view>预存款</view>\r\n          <view class=\"money\">{{ walletNum | unitPrice }}</view>\r\n        </u-col>\r\n\r\n        <u-col text-align=\"center\" span=\"4\" @click=\"navigateTo('/pages/cart/coupon/myCoupon')\">\r\n          <view>优惠券</view>\r\n          <view>{{ couponNum || 0 }}</view>\r\n        </u-col>\r\n\r\n        <u-col text-align=\"center\" span=\"4\" @click=\"navigateTo('/pages/mine/myTracks')\">\r\n          <view>足迹</view>\r\n          <view>{{ footNum || 0 }}</view>\r\n        </u-col>\r\n      </u-row>\r\n      <!-- 我的订单，代付款 -->\r\n      <view class=\"order\">\r\n        <view class=\"order-item\" @click=\"navigateTo('/pages/order/myOrder?status=1')\">\r\n          <div class=\"bag bag2\">\r\n            <u-icon name=\"bag-fill\" size=\"35\" color=\"#fff\"></u-icon>\r\n          </div>\r\n          <view>待付款</view>\r\n        </view>\r\n        <view class=\"order-item\" @click=\"navigateTo('/pages/order/myOrder?status=3')\">\r\n          <div class=\"bag bag3\">\r\n            <u-icon name=\"car-fill\" size=\"35\" color=\"#fff\"></u-icon>\r\n          </div>\r\n          <view>待收货</view>\r\n        </view>\r\n        <view class=\"order-item\" @click=\"navigateTo('/pages/order/evaluate/myEvaluate')\">\r\n          <div class=\"bag bag4\">\r\n            <u-icon name=\"star-fill\" size=\"35\" color=\"#fff\"></u-icon>\r\n          </div>\r\n          <view>待评价</view>\r\n        </view>\r\n        <view class=\"order-item\" @click=\"navigateTo('/pages/order/afterSales/afterSales')\">\r\n          <div class=\"bag bag5\">\r\n            <u-icon name=\"server-fill\" size=\"35\" color=\"#fff\"></u-icon>\r\n          </div>\r\n          <view>售后</view>\r\n        </view>\r\n        <view class=\"order-item\" @click=\"navigateTo('/pages/order/myOrder?status=0')\">\r\n          <div class=\"bag bag1\">\r\n            <u-icon name=\"order\" size=\"35\" color=\"#fff\"></u-icon>\r\n          </div>\r\n          <view>我的订单</view>\r\n        </view>\r\n      </view>\r\n    </div>\r\n    <!-- 常用工具 -->\r\n\r\n    <tool />\r\n\r\n  </view>\r\n</template>\r\n<script>\r\nimport tool from \"@/pages/tabbar/user/utils/tool.vue\";\r\nimport { getCouponsNum, getFootprintNum } from \"@/api/members.js\";\r\nimport { getUserWallet } from \"@/api/members\";\r\nimport configs from '@/config/config'\r\nexport default {\r\n  components: {\r\n    tool,\r\n  },\r\n  data() {\r\n    return {\r\n      configs,\r\n      userImage:configs.defaultUserPhoto,\r\n      coverTransform: \"translateY(0px)\",\r\n      coverTransition: \"0s\",\r\n      moving: false,\r\n      userInfo: {},\r\n      couponNum: \"\",\r\n      footNum: \"\",\r\n      walletNum: \"\",\r\n    };\r\n  },\r\n  onLoad() { },\r\n  onShow() {\r\n    this.userInfo = this.$options.filters.isLogin() || {};\r\n    if (this.$options.filters.isLogin(\"auth\")) {\r\n      this.getUserOrderNum();\r\n    } else {\r\n      this.walletNum = 0;\r\n      this.couponNum = 0;\r\n      this.footNum = 0;\r\n    }\r\n  },\r\n  onPullDownRefresh() {\r\n    this.getUserOrderNum();\r\n    this.userInfo = this.$options.filters.isLogin();\r\n  },\r\n  // #ifndef MP\r\n  onNavigationBarButtonTap(e) {\r\n    const index = e.index;\r\n    if (index === 0) {\r\n      this.navigateTo(\"/pages/mine/set/setUp\");\r\n    }\r\n  },\r\n  // #endif\r\n\r\n  mounted() { },\r\n  methods: {\r\n    /**\r\n     * 统一跳转接口,拦截未登录路由\r\n     * navigator标签现在默认没有转场动画，所以用view\r\n     */\r\n    navigateTo(url) {\r\n      uni.navigateTo({\r\n        url,\r\n      });\r\n    },\r\n    userDetail() {\r\n      this.userInfo.id\r\n        ? this.navigateTo(\"/pages/mine/set/personMsg\")\r\n        : this.$options.filters.navigateToLogin();;\r\n    },\r\n    async getUserOrderNum() {\r\n      uni.stopPullDownRefresh();\r\n\r\n      Promise.all([\r\n        getCouponsNum(), //优惠券\r\n        getFootprintNum(), //浏览数量\r\n        getUserWallet(), //预存款\r\n      ]).then((res) => {\r\n        this.couponNum = res[0].data.result;\r\n        this.footNum = res[1].data.result;\r\n        this.walletNum = res[2].data.result.memberWallet;\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\nhtml,\r\nbody {\r\n  overflow: auto;\r\n}\r\n\r\n.money {\r\n  overflow: hidden;\r\n\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n\r\n.user {\r\n  .header {\r\n    max-width: 100%;\r\n    padding: calc(50rpx + var(--status-bar-height)) 30rpx 0 6%;\r\n    height: calc(var(--status-bar-height) + 360rpx);\r\n    background-size: cover;\r\n    border-bottom-left-radius: 30rpx;\r\n    border-bottom-right-radius: 30rpx;\r\n    background-image: url(\"/static/img/main-bg.png\");\r\n    background-position: bottom;\r\n    background-repeat: no-repeat;\r\n    color: #ffffff;\r\n    display: flex;\r\n    justify-content: space-between;\r\n\r\n    .head-1 {\r\n      text-align: center;\r\n      width: 152rpx;\r\n      position: relative;\r\n      display: flex;\r\n      align-items: center;\r\n\r\n      image {\r\n        width: 152rpx;\r\n        height: 144rpx;\r\n        border-radius: 50%;\r\n        margin-bottom: 30rpx;\r\n        border: 3px solid #fff;\r\n      }\r\n\r\n      .edti-head {\r\n        position: absolute;\r\n        width: 40rpx;\r\n        height: 40rpx;\r\n        border-radius: 50%;\r\n        background-color: rgba(255, 255, 255, 0.3);\r\n        top: 100rpx;\r\n        right: 0;\r\n\r\n        image {\r\n          width: 100%;\r\n          height: 100%;\r\n        }\r\n      }\r\n    }\r\n\r\n    .head-2 {\r\n      flex: 1;\r\n      margin-left: 30rpx;\r\n      margin-top: 100rpx;\r\n      line-height: 1;\r\n    }\r\n\r\n    /deep/ .u-icon,\r\n    .u-icon {\r\n      margin-top: 106rpx;\r\n    }\r\n  }\r\n\r\n  .pointBox {\r\n    width: 94%;\r\n    margin: 0 3%;\r\n    background: #fff;\r\n    border-radius: 20rpx;\r\n    box-shadow: 0 4rpx 24rpx 0 rgba($color: #f6f6f6, $alpha: 1);\r\n  }\r\n\r\n  .point {\r\n    text-align: center;\r\n    height: 160rpx;\r\n\r\n    font-size: $font-sm;\r\n    // #ifdef MP-WEIXIN\r\n    padding: 24rpx;\r\n\r\n    // #endif\r\n    .u-col {\r\n      view {\r\n        color: $u-main-color;\r\n        font-size: 28rpx;\r\n      }\r\n\r\n      view:last-child {\r\n        margin-top: 8rpx;\r\n        color: $main-color;\r\n        font-size: $font-lg;\r\n      }\r\n    }\r\n  }\r\n\r\n  .order {\r\n    height: 140rpx;\r\n    text-align: center;\r\n    font-size: $font-sm;\r\n    display: flex;\r\n    justify-content: space-around;\r\n    align-items: center;\r\n    padding: 0 3%;\r\n    color: #999;\r\n\r\n    .order-item {\r\n      position: relative;\r\n      line-height: 2em;\r\n      width: 96rpx;\r\n\r\n      :first-child {\r\n        font-size: 48rpx;\r\n        margin-bottom: 10rpx;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n.box {\r\n  transform: translateY(-30rpx);\r\n}\r\n\r\n.user-name {\r\n  font-size: 34rpx;\r\n}\r\n\r\n.bag {\r\n  width: 56rpx;\r\n  height: 56rpx;\r\n  border-radius: 50%;\r\n  margin: 0 auto;\r\n}\r\n\r\n.bag1 {\r\n  background: #ff4a48;\r\n}\r\n\r\n.bag2 {\r\n  background: #ff992f;\r\n}\r\n\r\n.bag3 {\r\n  background: #009ee0;\r\n}\r\n\r\n.bag4 {\r\n  background: #00d5d5;\r\n}\r\n\r\n.bag5 {\r\n  background: #28ccb0;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/user/similarGoods.vue",
    "content": "<template>\r\n\t<view class=\"similar-goods\">\r\n\t\t<view class=\"goods\" @click=\"goDetail(goods.goods_id)\">\r\n\t\t\t<image :src=\"goods.goods_img\" mode=\"\"></image>\r\n\t\t\t<view class=\"goods-intro\">\r\n\t\t\t\t<view>{{goods.goodsName}}</view>\r\n\t\t\t\t<view>{{goods.goods_sn}}</view>\r\n\t\t\t\t<view>¥{{goods.goods_price | unitPrice}}</view>\r\n\t\t\t</view>\r\n\t\t\t<!-- <button>找相似</button> -->\r\n\t\t</view>\r\n\t\t<view class=\"title\">相似好货&nbsp;为您推荐</view>\r\n\t\t<view class=\"scroll-con\">\r\n\t\t\t<view v-if=\"nomsg\">没有相似商品</view>\r\n\t\t\t<view v-else class=\"con\" v-for=\"(item,index) in goodsList\" :key=\"index\" @click=\"goDetail(item)\">\r\n\t\t\t\t<image :src=\"item.thumbnail\" mode=\"\"></image>\r\n\t\t\t\t<view class=\"nowrap\">{{item.name}}</view>\r\n\t\t\t\t<view>\r\n\t\t\t\t\t<text>￥{{item.price | unitPrice}}\r\n\t\t\t\t\t<!-- <text v-if=\"item.point\">+{{item.point || 0}}积分</text> -->\r\n\t\t\t\t\t</text>\r\n\t\t\t\t\t<text>￥{{item.mktprice}}</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view>\r\n\t\t\t\t\t<text>已售{{item.buy_count}}件</text>\r\n\t\t\t\t\t<text>{{item.grade}}%好评</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<uni-load-more :status=\"loadStatus\"></uni-load-more>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport {\r\n\t\tgetGoodsList\r\n\t} from '@/api/goods.js';\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tloadStatus: 'more',\r\n\t\t\t\tparams: {\r\n\t\t\t\t\tpageNumber: 1,\r\n\t\t\t\t\tpageSize: 10,\r\n\t\t\t\t\tkeyword: ''\r\n\t\t\t\t},\r\n\t\t\t\tgoods: {},\r\n\t\t\t\tgoodsList: [],\r\n\t\t\t\tnomsg: false,\r\n\t\t\t};\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tgetList() {\r\n\t\t\t\tuni.showLoading({\r\n\t\t\t\t\ttitle: \"加载中\"\r\n\t\t\t\t})\r\n\t\t\t\tthis.params.keyword = this.goods.goodsName;\r\n\t\t\t\tgetGoodsList(this.params).then(res => {\r\n\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() }\r\n\t\t\t\t\tif (res.statusCode == 200) {\r\n\t\t\t\t\t\tlet data = res.data;\r\n\t\t\t\t\t\tif (data.data_total == 0) {\r\n\t\t\t\t\t\t\t// this.nomsg = true;\r\n\t\t\t\t\t\t\tthis.loadStatus = 'noMore';\r\n\t\t\t\t\t\t} else if (data.data_total < 10) {\r\n\t\t\t\t\t\t\tthis.loadStatus = 'noMore'\r\n\t\t\t\t\t\t\tthis.goodsList.push(...data.data)\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.goodsList.push(...data.data);\r\n\t\t\t\t\t\t\tif (data.data.length < 10) this.loadStatus = 'noMore'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\tgoDetail(item) {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: '/pages/product/goods?id=' + item.id + \"&goodsId=\" +item.goodsId\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\tloadData() {\r\n\t\t\t\tif(this.loadStatus!='noMore'){\r\n\t\t\t\t\tthis.params.pageNumber++;\r\n\t\t\t\t\tthis.getList()\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t\tonLoad(option) {\r\n\t\t\tthis.goods = JSON.parse(decodeURIComponent(option.goods))\r\n\t\t\t\r\n\t\t\tthis.getList()\r\n\t\t},\r\n\t\tonReachBottom() { //触底事件，页面整个滚动使用\r\n\t\t\tthis.loadData()\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import './collect.scss';\r\n\r\n\t.title {\r\n\t\theight: 110rpx;\r\n\t\tline-height: 110rpx;\r\n\t\ttext-align: center;\r\n\t\tcolor: #333;\r\n\t\tbackground-color: #F1F1F1;\r\n\t\tmargin-top: 20rpx;\r\n\t\tfont-size: $font-base;\r\n\t}\r\n\r\n\t.goods {\r\n\t\tpadding: 0 30rpx;\r\n\t}\r\n\r\n\t.scroll-con {\r\n\t\twidth: 750rpx;\r\n\t\tflex-wrap: wrap;\r\n\r\n\t\t.con {\r\n\t\t\twidth: 345rpx;\r\n\t\t\tmargin: 20rpx 0 0 20rpx;\r\n\t\t\tbackground-color: #FFFFFF;\r\n\t\t\tborder-radius: 10rpx;\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\tdisplay: inline-block;\r\n\t\t\tfont-size: $font-sm;\r\n\r\n\t\t\t// line-height: 1.5em;\r\n\t\t\timage {\r\n\t\t\t\twidth: 100%;\r\n\t\t\t\theight: 320rpx;\r\n\t\t\t\tborder-radius: 8rpx 8rpx 0 0;\r\n\t\t\t}\r\n\t\t\tview{\r\n\t\t\t\tpadding: 0 20rpx;\r\n\t\t\t\t&::after{\r\n\t\t\t\t\tcontent: '';\r\n\t\t\t\t\tdisplay: block;\r\n\t\t\t\t\tclear: right;\r\n\t\t\t\t}\r\n\t\t\t\ttext {\r\n\t\t\t\t\tdisplay: inline-block;\r\n\t\t\t\t\tcolor: #999;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\ttext:nth-child(2) {\r\n\t\t\t\t\tfloat: right;\r\n\t\t\t\t\ttext-align: right;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tview:last-child{\r\n\t\t\t\tmargin-bottom: 20rpx;\r\n\t\t\t}\r\n\t\t\t.nowrap {\r\n\t\t\t\tposition: relative;\r\n\t\t\t\tline-height: 1.4em;\r\n\t\t\t\tmax-height: 2.8em; //height是line-height的整数倍，防止文字显示不全\r\n\t\t\t\toverflow: hidden;\r\n\t\t\t}\r\n\r\n\t\t\t\r\n\r\n\t\t\tview:nth-child(2) {\r\n\t\t\t\tfont-size: 26rpx;\r\n\t\t\t}\r\n\r\n\t\t\tview:nth-child(3) {\r\n\t\t\t\tmargin-top: 10rpx;\r\n\t\t\t\tfont-weight: bold;\r\n\r\n\t\t\t\ttext:nth-child(1) {\r\n\t\t\t\t\tcolor: #f56c6c;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttext:nth-child(2) {\r\n\t\t\t\t\tcolor: #d7d7d7;\r\n\t\t\t\t\ttext-decoration: line-through;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tview:nth-child(4) {\r\n\t\t\t\tmargin-top: 10rpx;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "pages/tabbar/user/utils/tool.vue",
    "content": "<template>\r\n  <view>\r\n    <!-- 常用工具 -->\r\n    <view class=\"interact-tools\" style=\"margin-bottom: 15px\">\r\n\r\n      <div class=\"paddingBox\">\r\n        <view class=\"interact-container\">\r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/mine/address/addressManage')\">\r\n\t\t\t  <image src=\"/static/mine/myaddress.png\" mode=\"\"></image>\r\n\t\t\t  <view>地址管理</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/mine/myTracks')\">\r\n\t\t\t  <image src=\"/static/mine/logistics.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的足迹</view>\r\n\t\t\t</view>\r\n\t\t\r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/order/evaluate/myEvaluate')\">\r\n\t\t\t  <image src=\"/static/mine/feedback.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的评价</view>\r\n\t\t\t</view>\r\n\t\t\t<!-- <view class=\"interact-item\" @click=\"linkMsgDetail()\">\r\n\t\t\t  <image src=\"/static/mine/mycommit.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的消息</view>\r\n\t\t\t</view> -->\r\n\t\t\r\n\t\t\r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/mine/myCollect')\">\r\n\t\t\t  <image src=\"/static/mine/myfavorite.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的关注</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/mine/point/myPoint')\">\r\n\t\t\t  <image src=\"/static/mine/mypoint.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的积分</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t<view class=\"interact-item\" @click=\"distribution\">\r\n\t\t\t  <image src=\"/static/mine/distribution.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的分销</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/order/complain/complainList')\">\r\n\t\t\t  <image src=\"/static/mine/shensu.png\" mode=\"\"></image>\r\n\t\t\t  <view>我的投诉</view>\r\n\t\t\t</view>\r\n\t\t\t\t   \r\n\t\t\t<view class=\"interact-item\" @click=\"navigateTo('/pages/cart/coupon/myCoupon')\">\r\n\t\t\t  <image src=\"/static/mine/mycoupon.png\" mode=\"\"></image>\r\n\t\t\t  <view>优惠券</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\r\n\t\t\t        \r\n\t\t\t\t\t\r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/mine/signIn')\">\r\n            <image src=\"/static/mine/sign.png\" mode=\"\"></image>\r\n            <view>每日签到</view>\r\n          </view>\r\n         \r\n         \r\n       \r\n          \r\n\r\n      \r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/cart/coupon/couponCenter')\">\r\n            <image src=\"/static/mine/couponcenter.png\" mode=\"\"></image>\r\n            <view>领券中心</view>\r\n          </view>\r\n          \r\n         \r\n          \r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/promotion/bargain/log')\">\r\n            <image src=\"/static/mine/kanjia.png\" mode=\"\"></image>\r\n            <view>砍价记录</view>\r\n          </view>\r\n\t\t  \r\n\t\t\r\n\t\t  \r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/mine/set/feedBack')\">\r\n            <image src=\"/static/mine/feedback.png\" mode=\"\"></image>\r\n            <view>意见反馈</view>\r\n          </view>\r\n          \r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/mine/set/editionIntro')\">\r\n            <image src=\"/static/mine/pointgift.png\" mode=\"\"></image>\r\n            <view>关于</view>\r\n          </view>\r\n          \r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/passport/entry/seller/index')\">\r\n            <image src=\"/static/mine/feedback.png\" mode=\"\"></image>\r\n            <view>店铺入驻</view>\r\n          </view>\r\n          \r\n          \r\n<!--          <view class=\"interact-item\" @click=\"inviter()\">-->\r\n<!--          \t<image src=\"/static/mine/share.png\" mode=\"\"></image>-->\r\n<!--          \t<view>邀新</view>-->\r\n<!--          </view>-->\r\n          <view class=\"interact-item\" @click=\"navigateTo('/pages/mine/set/setUp')\">\r\n            <image src=\"/static/mine/setting.png\" mode=\"\"></image>\r\n            <view>设置</view>\r\n          </view>\r\n        \r\n\t\t  \r\n        </view>\r\n      </div>\r\n\t  \r\n\t  \t\t\t<template>\r\n\t  \t\t\t\t<u-popup v-model=\"sharingShow\" mode=\"bottom\" border-radius=\"14\">\r\n\t  \t\t\t\t\t<view style=\"margin: 10px; text-align: center;\"> 请邀请用户扫描二维码或者将地址复制转发给其他用户 </view>\r\n\t  \t\t\t\t\t<view class='qrcode'>\r\n\t  \t\t\t\t\t\t<uqrcode ref=\"uqrcode\" canvas-id=\"qrcode\" :value=\"sharingLink\" :options=\"{ margin: 10 }\">\r\n\t  \t\t\t\t\t\t</uqrcode>\r\n\t  \t\t\t\t\t</view>\r\n\t  \r\n\t\t\t\t\t\t  <view class=\"copy-text\" @click=\"getDetail(sharingLink)\">\r\n\t\t\t\t\t\t\t{{sharingLink}}\r\n\t\t\t\t\t\t  </view>\r\n\t  \t\t\t\t\t<view class=\"confrim-btn\">\r\n\t  \t\t\t\t\t\t<u-button @click=\"sharingShow = false;\">关闭</u-button>\r\n\t  \t\t\t\t\t</view>\r\n\t  \t\t\t\t</u-popup>\r\n\t  \t\t\t</template>\r\n    </view>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nimport { distribution } from \"@/api/goods\";\r\nimport configs from \"@/config/config\";\r\nimport storage from \"@/utils/storage\";\r\n\r\nexport default {\r\n  data() {\r\n\treturn {\r\n\t\t\tconfigs,\r\n\t\t\tstorage,\r\n\t\t\trepayingShow: false, //分销清退弹框\r\n\t\t\tsharingShow: false,\r\n\t\t\tsharingLink: \"\"\r\n\t  }\r\n  },\r\n\t\r\n  methods: {\r\n  \thandleNavigate(url) {\r\n\t\t\tuni.navigateTo({\r\n\t\t\t\turl,\r\n\t\t\t});\r\n\t\t},\r\n\t\tinviter() {\r\n\t\t\tif (storage.getUserInfo().id) {\r\n\t\t\t\tthis.sharingLink = this.configs.shareLink + \"?inviter=\" + this.storage.getUserInfo().id\r\n\t\t\t\tthis.sharingShow = true\r\n\t\t\t} else {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: \"请先登录\",\r\n\t\t\t\t\tduration: 2000,\r\n\t\t\t\t\ticon: \"none\",\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n    navigateTo(url) {\r\n      const ignores = [\r\n\t\t\t\t'/pages/mine/set/setUp',\r\n\t\t\t\t'/pages/mine/set/editionIntro',\r\n\t\t\t\t'/pages/mine/set/feedBack'\r\n\t\t\t]\r\n\t\t\tif (!ignores.includes(url)) {\r\n\t\t\t\tif (this.$options.filters.tipsToLogin('normal')) {\r\n\t\t\t\t\tthis.handleNavigate(url)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.handleNavigate(url)\r\n\t\t\t}\r\n    },\r\n\t\r\n\tlinkMsgDetail(){\r\n\t\tuni.navigateTo({\r\n\t\t\t\turl: `/pages/mine/im/list`,\r\n\t\t});\r\n\t},\r\n\t\r\n    distribution() {\r\n      distribution().then((res) => {\r\n        if (res.data.result) {\r\n          let type = res.data.result.distributionStatus;\r\n          if (type == \"PASS\") {\r\n            uni.navigateTo({\r\n              url: \"/pages/mine/distribution/home\",\r\n            });\r\n          } else if (type == \"REFUSE\") {\r\n            uni.navigateTo({\r\n              url: \"/pages/mine/distribution/auth\",\r\n            });\r\n          } else if (type == \"RETREAT\") {\r\n            uni.showToast({\r\n              title: \"您的分销资格已被清退。请联系管理员！\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n          } else {\r\n            uni.showToast({\r\n              title: \"您的信息正在审核\",\r\n              duration: 2000,\r\n              icon: \"none\",\r\n            });\r\n          }\r\n        } else if (!res.data.success && res.data.code == 22000) {\r\n          uni.showToast({\r\n            title: \"分销功能暂未开启\",\r\n            duration: 2000,\r\n            icon: \"none\",\r\n          });\r\n        } else {\r\n          // 没有资格申请 先去实名认证\r\n          uni.navigateTo({\r\n            url: \"/pages/mine/distribution/auth\",\r\n          });\r\n        }\r\n      });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.copy-text {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  margin: 10px;\r\n  line-break: anywhere;\r\n}\r\n\r\n.interact-tools {\r\n\tborder-left: none;\r\n\tborder-right: none;\r\n\r\n\r\n\t.interactBox {\r\n\t\theight: 156rpx;\r\n\t}\r\n\r\n\t.interact-container {\r\n\t\tmargin: 0 20rpx;\r\n\t\tbackground: #fff;\r\n\t\tborder-radius: 20rpx;\r\n\t\tbox-shadow: 0 4rpx 24rpx 0 rgba($color: #f6f6f6, $alpha: 1);\r\n\r\n\t\t.interact-item-img {\r\n\t\t\twidth: 52rpx !important;\r\n\t\t\theight: 52rpx !important;\r\n\t\t\t// margin-bottom:  !important;\r\n\t\t\tmargin: 0 auto 6rpx auto !important;\r\n\t\t}\r\n\r\n\t\timage {\r\n\t\t\twidth: 52rpx;\r\n\t\t\theight: 52rpx;\r\n\t\t\tmargin-bottom: 6rpx;\r\n\t\t}\r\n\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tflex-wrap: wrap;\r\n\t\ttext-align: center;\r\n\r\n\t\t.interact-item {\r\n\t\t\tfont-size: $font-sm;\r\n\t\t\twidth: 25%;\r\n\t\t\theight: 160rpx;\r\n\t\t\tpadding: 30rpx;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n.qrcode {\r\n\tmargin: 0 auto;\r\n\twidth: 200px;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "pages.json",
    "content": "{\r\n\r\n\t\"easycom\": {\r\n\t\t\"^u-(.*)\": \"@/uview-ui/components/u-$1/u-$1.vue\"\r\n\t},\r\n\t\"pages\": [\r\n\t\t\r\n\t\t{\r\n\t\t\t\"path\": \"pages/tabbar/home/index\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationBarTitleText\": \"首页\",\r\n\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\"navigationBarTextStyle\": \"black\",\r\n\t\t\t\t\"enablePullDownRefresh\":true  \r\n\t\t\t}\r\n\t\t}, \r\n\t\t{\r\n\t\t\t\"path\":\"pages/tabbar/screen/fullScreen\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\"app-plus\":{\r\n\t\t\t\t\t\"animationType\": \"fade-in\", // 设置fade-in淡入动画，为最合理的动画类型\r\n\t\t\t\t\t\"background\": \"transparent\", // 背景透明\r\n\t\t\t\t\t\"backgroundColor\": \"rgba(0,0,0,0)\", // 背景透明\r\n\t\t\t\t\t\"popGesture\": \"none\" // 关闭IOS屏幕左边滑动关闭当前页面的功能\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"path\": \"pages/tabbar/home/title\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationBarTitleText\": \"消息\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"path\": \"pages/tabbar/cart/cartList\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationBarTitleText\": \"购物车\",\r\n\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\"navigationBarBackgroundColor\": \"#fff\",\r\n\t\t\t\t\"enablePullDownRefresh\":true    //实现下拉刷新样式\r\n\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"path\": \"pages/tabbar/category/category\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationBarTitleText\": \"分类\",\r\n\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\"navigationBarTextStyle\": \"black\",\r\n\t\t\t\t\"disableScroll\": true,\r\n\t\t\t\t\t\"bounce\": \"none\",\r\n\t\t\t\t\t\"scrollIndicator\": \"none\"\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\t\t\t\t\r\n\t\t{\r\n\t\t\t\"path\": \"pages/navigation/search/searchPage\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationBarTitleText\": \"搜索\",\r\n\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\r\n\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t//app页面不显示滚动条\r\n\t\t\t\t\t\"scrollIndicator\": \"none\",\r\n\t\t\t\t\t\"bottom\": \"0\",\r\n\t\t\t\t\t\"contentAdjust\": \"false\",\r\n\t\t\t\t\t\"bounce\": \"none\",\r\n\t\t\t\t\t\"safearea\": {\r\n\t\t\t\t\t\"bottom\": \"none\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"path\": \"pages/tabbar/user/my\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\"navigationBarTextStyle\": \"white\",\r\n\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t{\r\n\t\t\t\"path\": \"pages/tabbar/home/web-view\",\r\n\t\t\t\"style\": {\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"pages/tabbar/special/special\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\t\"navigationBarTitleText\": \"专题\"\r\n\t\t\t\t\t}\r\n\t\t}\r\n\r\n\t],\r\n\t\"subPackages\": [\r\n\r\n\t\t{\r\n\t\t\t\"root\": \"pages/mine\",\r\n\t\t\t\"pages\": [\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"signIn\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"签到\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"path\": \"myTracks\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"我的足迹\",\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"path\": \"myCollect\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"收藏\",\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true, //下拉刷新\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"scrollIndicator\": \"none\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/list\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"推广分佣\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t//app页面不显示滚动条\r\n\t\t\t\t\t\t\t\"scrollIndicator\": \"none\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/withdrawal\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"提现\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t//app页面不显示滚动条\r\n\t\t\t\t\t\t\t\"scrollIndicator\": \"none\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/join\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"推广资格申请\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"black\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t//app页面不显示滚动条\r\n\t\t\t\t\t\t\t\"scrollIndicator\": \"none\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/history\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"提现历史\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/auth\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"会员实名认证\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/achievement\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"我的分销业绩\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"distribution/home\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"推广分佣\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"deposit/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"deposit/operation\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"deposit/recharge\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"充值金额\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"deposit/withdrawal\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"提现金额\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\r\n\t\t\t{\r\n\t\t\t\t\"path\": \"deposit/info\",\r\n\t\t\t\t\"style\": {\r\n\t\t\t\t\t\"navigationBarTitleText\": \"预存款详情\"\r\n\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\t {\r\n\t\t\t\t\t\"path\": \"address/address\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"地址管理\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"address/storeAddress\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"自提点\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"address/add\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"收货人\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"address/addressManage\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"地址管理\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/versionFunctionList\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"功能介绍\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/fingerLogin\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"指纹登录\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/faceLogin\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"面容登录\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/editPassword\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"修改密码\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/bindMobile\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"绑定手机号\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"im/list\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"im/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/feedBack\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"意见反馈\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/updatePwdTab\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"修改密码\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/editLoginPassword\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"修改密码\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/securityCenter/securityCenter\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"安全中心\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/editionIntro\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"关于我们\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/setUp\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"设置\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"set/personMsg\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"个人信息\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"titleNView\": {\r\n\t\t\t\t\t\t\t\t\"padding-right\": \"12\",\r\n\t\t\t\t\t\t\t\t\"buttons\": [{\r\n\t\t\t\t\t\t\t\t\t\"text\": \"保存\",\r\n\t\t\t\t\t\t\t\t\t\"fontSize\": \"16\",\r\n\t\t\t\t\t\t\t\t\t\"width\": \"auto\",\r\n\t\t\t\t\t\t\t\t\t\"color\": \"#FFFFFF\"\r\n\t\t\t\t\t\t\t\t}]\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"path\": \"help/tips\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"path\": \"point/myPoint\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"我的积分\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t {\r\n\t\t\t\t\t\"path\": \"msgTips/main\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"消息中心\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"msgTips/sysMsg/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"系统消息\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"msgTips/serviceMsg/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"客服记录\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"msgTips/packageMsg/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"物流消息\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"msgTips/packageMsg/logisticsDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"订单跟踪\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t]\r\n\r\n\t\t},\r\n\r\n\r\n\t\t{\r\n\t\t\t\"root\": \"pages/product\",\r\n\t\t\t\"pages\": [{\r\n\t\t\t\t\"path\": \"shopPage\",\r\n\t\t\t\t\"style\": {\r\n\t\t\t\t\t\"navigationBarTitleText\": \"\",\r\n\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t\t}\r\n\t\t\t},{\r\n\t\t\t\t\"path\": \"shopList\",\r\n\t\t\t\t\"style\": {\r\n\t\t\t\t\t\"navigationBarTitleText\": \"\",\r\n\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t\t}\r\n\t\t\t},{\r\n\t\t\t\t\"path\": \"licencePhoto\",\r\n\t\t\t\t\"style\": {\r\n\t\t\t\t\t\"navigationBarTitleText\": \"营业执照\"\r\n\t\t\t\t}\r\n\t\t\t},{\r\n\t\t\t\t\"path\": \"shopPageGoods\",\r\n\t\t\t\t\"style\": {\r\n\t\t\t\t\t\"navigationBarTitleText\": \"\",\r\n\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"goods\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"backgroundColor\": \"#fff\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t// 将回弹属性关掉\r\n\t\t\t\t\t\t\t\"bounce\": \"none\",\r\n\t\t\t\t\t\t\t// 禁止页面滚动\r\n\t\t\t\t\t\t\t\"scrollIndicator\": \"none\",\r\n\t\t\t\t\t\t\t\"safearea\": {\r\n\t\t\t\t\t\t\t\t\"bottom\": {  \r\n\t\t\t\t\t\t\t\t\t  \"offset\": \"none\" \r\n\t\t\t\t\t\t\t\t  }   \r\n\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"askList\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"问答专区\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{ //商品评价\r\n\t\t\t\t\t\"path\": \"comment\",\r\n\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"商品评价\",\r\n\t\t\t\t\t\t//app页面不显示滚动条\r\n\t\t\t\t\t\t\"scrollIndicator\": \"none\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{ // 客服\r\n\t\t\t\t\t\"path\": \"customerservice/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"客服\",\r\n\t\t\t\t\t\t\"usingComponents\": {\r\n\t\t\t\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\t\t\t\t\"chat\": \"plugin://myPlugin/chat\"\r\n\t\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t]\r\n\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"root\": \"pages/floor\",\r\n\t\t\t\"pages\": [{\r\n\t\t\t\t\"path\": \"empty\"\r\n\t\t\t}]\r\n\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"root\": \"pages/passport\",\r\n\t\t\t\"pages\": [{\r\n\t\t\t\t\t\"path\": \"login\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"titleNView\": false,\r\n\t\t\t\t\t\t\t\"animationType\": \"slide-in-bottom\",\r\n\t\t\t\t\t\t\t\"scrollIndicator\": \"none\",\r\n\t\t\t\t\t\t\t\"safearea\": {\r\n\t\t\t\t\t\t\t\t\"bottom\": {  \r\n\t\t\t\t\t\t\t\t\t  \"offset\": \"none\" \r\n\t\t\t\t\t\t\t\t  }   \r\n\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"entry/seller/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"店铺入驻\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"entry/seller/control\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"article\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"文章\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"wechatMPLogin\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"小程序登录\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"black\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"scannerCodeLoginConfirm\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"扫码登录\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"black\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t]\r\n\r\n\t\t},\r\n\r\n\t\t{\r\n\t\t\t\"root\": \"pages/promotion\",\r\n\t\t\t\"pages\": [ {\r\n\t\t\t\t\t\"path\": \"seckill\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"限时抢购\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"black\" ,\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"titleNView\": {\r\n\t\t\t\t\t\t\t\t\"homeButton\":true\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\r\n\t\t\t\t {\r\n\t\t\t\t\t\"path\": \"joinGroup\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"拼团活动\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"black\" ,\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t// 将回弹属性关掉\r\n\t\t\t\t\t\t\t\"bounce\": \"none\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},{\r\n\t\t\t\t\t\"path\": \"lives\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"black\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},{\r\n\t\t\t\t\t\"path\": \"bargain/list\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"white\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},{\r\n\t\t\t\t\t\"path\": \"bargain/detail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"white\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},{\r\n\t\t\t\t\t\"path\": \"bargain/log\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"砍价记录\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},{\r\n\t\t\t\t\t\"path\": \"point/detail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\",\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"white\"\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t},{\r\n\t\t\t\t\t\"path\": \"point/pointList\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"积分商城\"\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t]\r\n\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"root\": \"pages/cart\",\r\n\t\t\t\"pages\": [{\r\n\t\t\t\t\t\"path\": \"coupon/myCoupon\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"我的优惠券\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"bounce\": \"coupon/none\"\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"coupon/couponDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"优惠券详情\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"coupon/index\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"优惠券\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"coupon/couponCenter\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"领券中心\",\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"payment/payOrder\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"支付订单\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"popGesture\": \"none\" //禁止侧滑退出\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"payment/success\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"支付成功\",\r\n\t\t\t\t\t\t\"navigationStyle\": \"custom\", // 隐藏系统导航栏\r\n\t\t\t\t\t\t\"navigationBarTextStyle\": \"white\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"popGesture\": \"none\", //禁止侧滑退出\r\n\t\t\t\t\t\t\t\"titleNView\": false\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"payment/shareOrderGoods\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t]\r\n\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"root\": \"pages/order\",\r\n\t\t\t\"pages\": [{\r\n\t\t\t\t\t\"path\": \"complain/complain\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"订单商品投诉\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"complain/complainInfo\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"投诉详情\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"complain/complainList\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"投诉列表\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"myOrder\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"我的订单\",\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true,\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"bounce\": \"none\"\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"invoice/invoiceDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"发票详情\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"orderDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"订单详情\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"deliverDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"物流详情\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"evaluate/evaluateDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"评价详情\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"evaluate/releaseEvaluate\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"发布评价\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"evaluate/myEvaluate\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"我的评价\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/applyProgress\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"售后服务\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/applyDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"售后服务\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/applySuccess\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"提交成功\",\r\n\t\t\t\t\t\t\"app-plus\": {\r\n\t\t\t\t\t\t\t\"bounce\": \"none\",\r\n\t\t\t\t\t\t\t\"titleNView\": {\r\n\t\t\t\t\t\t\t\t\"titleColor\": \"#FFFFFF\",\r\n\t\t\t\t\t\t\t\t\"buttons\": [{\r\n\t\t\t\t\t\t\t\t\t\"text\": \"完成\",\r\n\t\t\t\t\t\t\t\t\t\"fontSize\": \"14\",\r\n\t\t\t\t\t\t\t\t\t\"color\": \"#FFFFFF\",\r\n\t\t\t\t\t\t\t\t\t\"width\": \"36px\"\r\n\t\t\t\t\t\t\t\t\t// \"background\": \"rgba(0,0,0,0)\"\r\n\t\t\t\t\t\t\t\t}]\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/afterSalesDetailExpress\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/afterSalesSelect\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"申请售后\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/afterSalesDetail\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"申请售后\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"afterSales/afterSales\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"售后管理\",\r\n\t\t\t\t\t\t\"enablePullDownRefresh\": true\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"path\": \"fillorder\",\r\n\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\"navigationBarTitleText\": \"填写订单\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t}\r\n\t],\r\n\t\"globalStyle\": {\r\n\t\t\"navigationBarTextStyle\": \"black\",\r\n\t\t\"navigationBarTitleText\": \"Lili商城\",\r\n\t\t\"titleColor\": \"#303133\",\r\n\t\t\"navigationBarBackgroundColor\": \"#fff\",\r\n\t\t\"backgroundColor\": \"#fff\",\r\n\t\t\"color\": \"#FFFFFF\",\r\n\t\t\"app-plus\": {\r\n\t\t\t// 全局关闭回弹功能\r\n\t\t\t\"bounce\": \"none\"\r\n\r\n\t\t}\r\n\t},\r\n\t\"tabBar\": {\r\n\t\t\"color\": \"#666\",\r\n\t\t\"selectedColor\": \"#ff573e\",\r\n\t\t\"borderStyle\": \"black\",\r\n\t\t\"backgroundColor\": \"#ffffff\",\r\n\t\t\"list\": [{\r\n\t\t\t\t\"pagePath\": \"pages/tabbar/home/index\",\r\n\t\t\t\t\"iconPath\": \"static/tabbar/home.png\",\r\n\t\t\t\t\"selectedIconPath\": \"static/tabbar/home-s.png\",\r\n\t\t\t\t\"text\": \"首页\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"pagePath\": \"pages/tabbar/category/category\",\r\n\t\t\t\t\"iconPath\": \"static/tabbar/category.png\",\r\n\t\t\t\t\"selectedIconPath\": \"static/tabbar/category-s.png\",\r\n\t\t\t\t\"text\": \"分类\"\r\n\t\t\t},\r\n\t\t\r\n\t\t\t{\r\n\t\t\t\t\"pagePath\": \"pages/tabbar/cart/cartList\",\r\n\t\t\t\t\"iconPath\": \"static/tabbar/cart.png\",\r\n\t\t\t\t\"selectedIconPath\": \"static/tabbar/cart-s.png\",\r\n\t\t\t\t\"text\": \"购物车\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"pagePath\": \"pages/tabbar/user/my\",\r\n\t\t\t\t\"iconPath\": \"static/tabbar/mine.png\",\r\n\t\t\t\t\"selectedIconPath\": \"static/tabbar/mine-s.png\",\r\n\t\t\t\t\"text\": \"我的\"\r\n\t\t\t}\r\n\t\t]\r\n\t},\r\n\t// #todo 为什么要注释condition下代码？ \r\n\t// IOS plus.runtime.arguments 添加 condition节点后， 框架会修改 runtime.arguments\r\n\t// 会影响什么功能？\r\n\t//    -在h5中唤醒app会一直返回默认值 {\"name\":\"\",\"path\":\"\",\"query\":\"\",\"id\":0}\r\n\t\"condition\": { //模式配置，仅开发期间生效   \r\n\t\t// \"current\": 0, //当前激活的模式(list 的索引项)\r\n\t\t// \"list\": [{\r\n\t\t// \t\"name\": \"\", //模式名称\r\n\t\t// \t\"path\":\"\", //启动页面，必选\r\n\t\t// \t\"query\": \"\" //启动参数，在页面的onLoad函数里面得到\r\n\t\t// }]\r\n\t}\r\n}\r\n"
  },
  {
    "path": "plugins/APPUpdate/APPUpdate.md",
    "content": "# APP版本更新、强制更新、漂亮的更新界面、IOS更新（跳转IOS store）、wgt更新\n\n### QQ交流群(学习干货多多) 607391225\n![QQ交流群](http://qn.kemean.cn//upload/202004/14/15868301778472k7oubi6.png)\n\n# [点击跳转-插件示例](https://ext.dcloud.net.cn/plugin?id=2009)\n# [点击跳转-5年的web前端开源的uni-app快速开发模板-下载看文档](https://ext.dcloud.net.cn/plugin?id=2009)\n \n### 常见问题\n1.安卓apk下载完成后没有更新APP?\n\n答：问题是因为没有添加APP安装应用的权限，解决方法在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限\n```\n<uses-permission android:name=\\\"android.permission.INSTALL_PACKAGES\\\"/>  \n<uses-permission android:name=\\\"android.permission.REQUEST_INSTALL_PACKAGES\\\"/>\n```\n若还有问题请看[安装apk无法执行的解决方案](https://ask.dcloud.net.cn/article/35703 \"安装apk无法执行的解决方案\")\n\n2.APP更新后版本号没变，还是之前的版本号？\n\n答：可能是更新的安装包没有升级版本号，`manifest.json`文件里面基本设置`应用版本号`和`应用版本名称`需要升高\n\n3.APP更新后没有覆盖之前的APP？\n\n答：可能是更新的安装包`包名`和APP的`包名`不一样\n\n### 第一步配置APP更新接口\n在`APPUpdate.js`里面`getServerNo`函数方法配置更新接口\n```\nlet httpData = {\n\tversion:version\n};\nif (platform == \"android\") {\n\thttpData.type = 1101;\n} else {\n\thttpData.type = 1102;\n}\n/* 接口入参说明\n * version: 应用当前版本号（已自动获取）\n * type：平台（1101是安卓，1102是IOS）\n */ \n// 可以用自己项目的请求方法\n$http.get(\"api/kemean/aid/app_version\", httpData).then(res => {\n\t/*接口出参说明 （res数据说明）\n\t* | 参数名称\t     | 一定返回 \t| 类型\t    | 描述\n\t* | -------------|--------- | --------- | ------------- |\n\t* | versionCode\t | y\t    | int\t    | 版本号        |\n\t* | versionName\t | y\t    | String\t| 版本名称      |\n\t* | versionInfo\t | y\t    | String\t| 版本信息 \\n 换行（例如：1.修改了bug1 \\n 2.修改了bug2 \\n 3.修改了bug3）      |\n\t* | forceUpdate\t | y\t    | boolean\t| 是否强制更新  |\n\t* | downloadUrl\t | y\t    | String\t| 版本下载链接 `IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接` |\n\t*/\n   // 只要callback上面的数据就ok(返回数据就表示接口允许更新)\n   // 示例返回数据\n   callback && callback({\n\t   versionCode: 101,\n\t   versionName: \"1.0.1\",\n\t   versionInfo: \"1.修改了bug1 \\n 2.修改了bug2 \\n 3.修改了bug3\",\n\t   forceUpdate: false,\n\t   downloadUrl: \"http://www.xxx.com/download/123\",\n   });\n});\n```\n\n### 第二步 使用方法\n``` \n// App.vue页面\n\n// #ifdef APP-PLUS\nimport APPUpdate from \"@/plugins/APPUpdate\";\n// #endif\n\nonLaunch: function(e) {\n\t// #ifdef APP-PLUS\n\tAPPUpdate();\n\t// #endif\n}\n```\n\n### 第三步 添加APP安装应用的权限\n在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限\n```\n<uses-permission android:name=\\\"android.permission.INSTALL_PACKAGES\\\"/>  \n<uses-permission android:name=\\\"android.permission.REQUEST_INSTALL_PACKAGES\\\"/>\n```\n\n### 修改弹窗的主题色或弹窗图标\n在`APPUpdate.js`里面上面`$mainColor`常量中定义主题颜色，`$iconUrl`常量中定义图标地址\n\n### 检查APP是否有新版本（一般在设置页面使用）\n```\n// #ifdef APP-PLUS\nimport APPUpdate, { getCurrentNo } from \"@/plugins/APPUpdate\";\n// #endif\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tversion: \"\" // 版本号\n\t\t};\n\t},\n\t//第一次加载\n\tonLoad(e) {\n\t\t// #ifdef APP-PLUS\n\t\tgetCurrentNo(res => {\n\t\t\t// 进页面获取当前APP版本号（用于页面显示）\n\t\t\tthis.version = res.version;\n\t\t});\n\t\t// #endif\n\t},\n\t//方法\n\tmethods: {\n\t\t// 检查APP是否有新版本\n\t\tonAPPUpdate() {\n\t\t\t// true 没有新版本的时候有提示，默认：false\n\t\t\tAPPUpdate(true);\n\t\t}\n\t}\n}\n```"
  },
  {
    "path": "plugins/APPUpdate/index.js",
    "content": "// #ifdef APP-PLUS\r\n/**** 此文件说明请看注释 *****/\r\n// 可以用自己项目的请求方法\r\n// 请求配置说明：https://ext.dcloud.net.cn/plugin?id=822\r\nimport { getAppVersion } from \"@/api/message.js\";\r\n\r\nconst platform = uni.getSystemInfoSync().platform;\r\n// 主颜色\r\nconst $mainColor = \"#1ABC9C\";\r\n// 弹窗图标url\r\nconst $iconUrl =\r\n  \"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/app/upgrade.png\";\r\n\r\n// 获取当前应用的版本号\r\nexport const getCurrentNo = function (callback) {\r\n  // 获取本地应用资源版本号\r\n  plus.runtime.getProperty(plus.runtime.appid, function (inf) {\r\n    callback &&\r\n      callback({\r\n        versionCode: inf.version.replace(/\\./g, \"\"),\r\n        version: inf.version,\r\n      });\r\n  });\r\n};\r\n// 发起ajax请求获取服务端版本号\r\nexport const getServerNo = function (callback) {\r\n  let type;\r\n\r\n  platform == \"android\" ? (type = \"ANDROID\") : (type = \"IOS\");\r\n\r\n  getAppVersion(type).then((res) => {\r\n    if (res.data.success && res.data.result.downloadUrl) {\r\n      let response = res.data.result;\r\n      let result = {};\r\n      result.versionCode = response.version;\r\n      result.versionName = response.versionName;\r\n      result.versionInfo = response.content || \"暂无\";\r\n      result.forceUpdate = response.forceUpdate;\r\n      result.downloadUrl = response.downloadUrl;\r\n      callback && callback(result);\r\n    }\r\n  });\r\n};\r\n// 从服务器下载应用资源包（wgt文件）\r\nexport const getDownload = function (data) {\r\n  let popupData = {\r\n    progress: true,\r\n    buttonNum: 2,\r\n  };\r\n  if (data.forceUpdate) {\r\n    popupData.buttonNum = 0;\r\n    popupData.forceUpdate = data.forceUpdate;\r\n  }\r\n  let dtask;\r\n  let lastProgressValue = 0;\r\n  downloadPopup(\r\n    popupData,\r\n    function (res) {\r\n      dtask = plus.downloader.createDownload(\r\n        data.downloadUrl,\r\n        {\r\n          filename: \"_doc/update/\",\r\n        },\r\n        function (download, status) {\r\n          if (status == 200) {\r\n            res.change({\r\n              progressValue: 100,\r\n              progressTip: \"正在安装文件...\",\r\n              progress: true,\r\n              buttonNum: 0,\r\n            });\r\n            plus.runtime.install(\r\n              download.filename,\r\n              {},\r\n              function () {\r\n                res.change({\r\n                  contentText: \"应用资源更新完成！\",\r\n                  buttonNum: 1,\r\n                  progress: false,\r\n                });\r\n              },\r\n              function (e) {\r\n                res.cancel();\r\n                plus.nativeUI.alert(\r\n                  \"安装文件失败[\" + e.code + \"]：\" + e.message\r\n                );\r\n              }\r\n            );\r\n          } else {\r\n            res.change({\r\n              contentText: \"文件下载失败...\",\r\n              buttonNum: 1,\r\n              progress: false,\r\n            });\r\n          }\r\n        }\r\n      );\r\n      dtask.start();\r\n      dtask.addEventListener(\"statechanged\", function (task, status) {\r\n        switch (task.state) {\r\n          case 1: // 开始\r\n            res.change({\r\n              progressValue: 0,\r\n              progressTip: \"准备下载...\",\r\n              progress: true,\r\n            });\r\n            break;\r\n          case 2: // 已连接到服务器\r\n            res.change({\r\n              progressValue: 0,\r\n              progressTip: \"开始下载...\",\r\n              progress: true,\r\n            });\r\n            break;\r\n          case 3:\r\n            const progress = parseInt(\r\n              (task.downloadedSize / task.totalSize) * 100\r\n            );\r\n            if (progress - lastProgressValue >= 2) {\r\n              lastProgressValue = progress;\r\n              res.change({\r\n                progressValue: progress,\r\n                progressTip: \"已下载\" + progress + \"%\",\r\n                progress: true,\r\n              });\r\n            }\r\n            break;\r\n        }\r\n      });\r\n    },\r\n    function () {\r\n      // 取消下载\r\n      dtask && dtask.abort();\r\n      uni.showToast({\r\n        title: \"已取消下载\",\r\n        icon: \"none\",\r\n      });\r\n    },\r\n    function () {\r\n      // 重启APP\r\n      plus.runtime.restart();\r\n    }\r\n  );\r\n};\r\n// 文字换行\r\nfunction drawtext(text, maxWidth) {\r\n  let textArr = text.split(\"\");\r\n  let len = textArr.length;\r\n\r\n  // 上个节点\r\n  let previousNode = 0;\r\n  // 记录节点宽度\r\n  let nodeWidth = 0;\r\n  // 文本换行数组\r\n  let rowText = [];\r\n\r\n  // 如果是字母，侧保存长度\r\n  let letterWidth = 0;\r\n  // 汉字宽度\r\n  let chineseWidth = 14;\r\n  // otherFont宽度\r\n  let otherWidth = 7;\r\n  for (let i = 0; i < len; i++) {\r\n    if (/[\\u4e00-\\u9fa5]|[\\uFE30-\\uFFA0]/g.test(textArr[i])) {\r\n      if (letterWidth > 0) {\r\n        if (nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth) {\r\n          rowText.push({\r\n            type: \"text\",\r\n            content: text.substring(previousNode, i),\r\n          });\r\n          previousNode = i;\r\n          nodeWidth = chineseWidth;\r\n          letterWidth = 0;\r\n        } else {\r\n          nodeWidth += chineseWidth + letterWidth * otherWidth;\r\n          letterWidth = 0;\r\n        }\r\n      } else {\r\n        if (nodeWidth + chineseWidth > maxWidth) {\r\n          rowText.push({\r\n            type: \"text\",\r\n            content: text.substring(previousNode, i),\r\n          });\r\n          previousNode = i;\r\n          nodeWidth = chineseWidth;\r\n        } else {\r\n          nodeWidth += chineseWidth;\r\n        }\r\n      }\r\n    } else {\r\n      if (/\\n/g.test(textArr[i])) {\r\n        rowText.push({\r\n          type: \"break\",\r\n          content: text.substring(previousNode, i),\r\n        });\r\n        previousNode = i + 1;\r\n        nodeWidth = 0;\r\n        letterWidth = 0;\r\n      } else if (textArr[i] == \"\\\\\" && textArr[i + 1] == \"n\") {\r\n        rowText.push({\r\n          type: \"break\",\r\n          content: text.substring(previousNode, i),\r\n        });\r\n        previousNode = i + 2;\r\n        nodeWidth = 0;\r\n        letterWidth = 0;\r\n      } else if (/[a-zA-Z0-9]/g.test(textArr[i])) {\r\n        letterWidth += 1;\r\n        if (nodeWidth + letterWidth * otherWidth > maxWidth) {\r\n          rowText.push({\r\n            type: \"text\",\r\n            content: text.substring(previousNode, i + 1 - letterWidth),\r\n          });\r\n          previousNode = i + 1 - letterWidth;\r\n          nodeWidth = letterWidth * otherWidth;\r\n          letterWidth = 0;\r\n        }\r\n      } else {\r\n        if (nodeWidth + otherWidth > maxWidth) {\r\n          rowText.push({\r\n            type: \"text\",\r\n            content: text.substring(previousNode, i),\r\n          });\r\n          previousNode = i;\r\n          nodeWidth = otherWidth;\r\n        } else {\r\n          nodeWidth += otherWidth;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  if (previousNode < len) {\r\n    rowText.push({\r\n      type: \"text\",\r\n      content: text.substring(previousNode, len),\r\n    });\r\n  }\r\n\r\n  return rowText;\r\n}\r\n// 是否更新弹窗\r\nfunction updatePopup(data, callback) {\r\n  // 弹窗遮罩层\r\n  let maskLayer = new plus.nativeObj.View(\"maskLayer\", {\r\n    //先创建遮罩层\r\n    top: \"0px\",\r\n    left: \"0px\",\r\n    height: \"100%\",\r\n    width: \"100%\",\r\n    backgroundColor: \"rgba(0,0,0,0.5)\",\r\n  });\r\n  let downloadUrl = data.downloadUrl;\r\n  // 以下为计算菜单的nview绘制布局，为固定算法，使用者无关关心\r\n  const screenWidth = plus.screen.resolutionWidth;\r\n  const screenHeight = plus.screen.resolutionHeight;\r\n  //弹窗容器宽度\r\n  const popupViewWidth = screenWidth * 0.8;\r\n  // 弹窗容器的Padding\r\n  const viewContentPadding = 20;\r\n  // 弹窗容器的宽度\r\n  const viewContentWidth = parseInt(popupViewWidth - viewContentPadding * 5);\r\n  // 描述的列表\r\n  const descriptionList = drawtext(data.versionInfo, viewContentWidth);\r\n\r\n  // 弹窗容器高度\r\n  let popupViewHeight = 400;\r\n  let popupViewContentList = [\r\n    {\r\n      src: $iconUrl,\r\n      id: \"logo\",\r\n      tag: \"img\",\r\n    },\r\n    {\r\n      tag: \"font\",\r\n      id: \"title\",\r\n      text: \"V\" + data.versionCode,\r\n      textStyles: {\r\n        size: \"26px\",\r\n        color: \"#fff\",\r\n        weight: \"700\",\r\n      },\r\n      position: {\r\n        top: \"60px\",\r\n        left: \"64px\",\r\n        height: \"20px\",\r\n      },\r\n    },\r\n    {\r\n      tag: \"font\",\r\n      id: \"welcome\",\r\n      text: \"欢迎体验\",\r\n      textStyles: {\r\n        size: \"16px\",\r\n        color: \"#fff\",\r\n        weight: \"400\",\r\n      },\r\n      position: {\r\n        top: \"85px\",\r\n        left: \"64px\",\r\n        height: \"20px\",\r\n      },\r\n    },\r\n  ];\r\n  const textHeight = 18;\r\n  let contentTop = popupViewHeight / 2 + 16;\r\n\r\n  popupViewContentList.push({\r\n    tag: \"font\",\r\n    id: \"content-title\",\r\n    text: \"新版本特性：\",\r\n    textStyles: {\r\n      size: \"20px\",\r\n      lineSpacing: \"50%\",\r\n      align: \"left\",\r\n    },\r\n    position: {\r\n      top: popupViewHeight / 2 - 24 + \"px\",\r\n      left: viewContentPadding + \"px\",\r\n      width: viewContentWidth + \"px\",\r\n      height: textHeight + \"px\",\r\n    },\r\n  });\r\n  descriptionList.forEach((item, index) => {\r\n    if (index > 0) {\r\n      popupViewHeight += textHeight;\r\n      contentTop += textHeight;\r\n    }\r\n    popupViewContentList.push({\r\n      tag: \"font\",\r\n      id: \"content\" + index + 1,\r\n      text: item.content,\r\n\r\n      textStyles: {\r\n        size: \"14px\",\r\n        color: \"#666\",\r\n        lineSpacing: \"50%\",\r\n        align: \"left\",\r\n      },\r\n\r\n      position: {\r\n        top: contentTop + \"px\",\r\n        left: viewContentPadding + \"px\",\r\n        width: viewContentWidth + \"px\",\r\n        height: textHeight + \"px\",\r\n      },\r\n    });\r\n    if (item.type == \"break\") {\r\n      contentTop += 10;\r\n      popupViewHeight += 10;\r\n    }\r\n  });\r\n  // 弹窗内容\r\n  let popupView = new plus.nativeObj.View(\"popupView\", {\r\n    //创建底部图标菜单\r\n    tag: \"rect\",\r\n    top: (screenHeight - popupViewHeight) / 2 + \"px\",\r\n    left: \"10%\",\r\n    height: popupViewHeight + \"px\",\r\n    width: \"80%\",\r\n  });\r\n  // 绘制白色背景\r\n  popupView.drawRect(\r\n    {\r\n      color: \"#FFFFFF\",\r\n      radius: \"8px\",\r\n    },\r\n    {\r\n      top: \"40px\",\r\n      height: popupViewHeight - 40 + \"px\",\r\n    }\r\n  );\r\n  // 绘制底边按钮\r\n  popupView.drawRect(\r\n    {\r\n      radius: \"3px\",\r\n      borderColor: \"#f1f1f1\",\r\n      borderWidth: \"1px\",\r\n    },\r\n    {\r\n      bottom: viewContentPadding + \"px\",\r\n      left: viewContentPadding + \"px\",\r\n      width: (viewContentWidth - viewContentPadding) / 2 + \"px\",\r\n      height: \"30px\",\r\n    }\r\n  );\r\n  // 绘制底边按钮\r\n  popupView.drawRect(\r\n    {\r\n      radius: \"3px\",\r\n      color: $mainColor,\r\n      borderColor: $mainColor,\r\n    },\r\n    {\r\n      bottom: viewContentPadding + \"px\",\r\n      left:\r\n        (viewContentWidth - viewContentPadding) / 2 +\r\n        viewContentPadding * 2 +\r\n        \"px\",\r\n      width: (viewContentWidth - viewContentPadding) / 2 + \"px\",\r\n      height: \"30px\",\r\n    }\r\n  );\r\n  popupViewContentList.push({\r\n    tag: \"rect\",\r\n    id: \"confimBtn\",\r\n    rectStyles: {\r\n      color: $mainColor,\r\n      radius: \"3px\",\r\n    },\r\n    position: {\r\n      bottom: viewContentPadding + \"px\",\r\n      left: (viewContentWidth - viewContentPadding) / 3 + \"px\",\r\n      width: viewContentWidth - viewContentPadding + \"px\",\r\n      height: \"40px\",\r\n    },\r\n  });\r\n  popupViewContentList.push({\r\n    tag: \"font\",\r\n    id: \"confirmText\",\r\n    text: \"立即更新\",\r\n    textStyles: {\r\n      size: \"18px\",\r\n      color: \"#fff\",\r\n      lineSpacing: \"0%\",\r\n      whiteSpace: \"normal\",\r\n    },\r\n    position: {\r\n      bottom: viewContentPadding + \"px\",\r\n      left: (viewContentWidth - viewContentPadding) / 3 + \"px\",\r\n      width: viewContentWidth - viewContentPadding + \"px\",\r\n      height: \"40px\",\r\n    },\r\n  });\r\n  popupView.draw(popupViewContentList);\r\n  popupView.addEventListener(\"click\", function (e) {\r\n    let maxTop = popupViewHeight - viewContentPadding;\r\n    let maxLeft = popupViewWidth - viewContentPadding;\r\n    let buttonWidth = (viewContentWidth - viewContentPadding) / 2;\r\n    if (e.clientY > maxTop - 30 && e.clientY < maxTop) {\r\n      // 暂不升级\r\n      if (\r\n        e.clientX > viewContentPadding &&\r\n        e.clientX < maxLeft - buttonWidth - viewContentPadding\r\n      ) {\r\n        // 立即升级\r\n        if (platform == \"android\") {\r\n          maskLayer.hide();\r\n          popupView.hide();\r\n          callback && callback();\r\n        } else {\r\n          if (!data.forceUpdate) {\r\n            maskLayer.hide();\r\n            popupView.hide();\r\n          }\r\n          plus.runtime.openURL(downloadUrl);\r\n        }\r\n      } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {\r\n        // 立即升级\r\n        if (platform == \"android\") {\r\n          maskLayer.hide();\r\n          popupView.hide();\r\n          callback && callback();\r\n        } else {\r\n          if (!data.forceUpdate) {\r\n            maskLayer.hide();\r\n            popupView.hide();\r\n          }\r\n          plus.runtime.openURL(downloadUrl);\r\n        }\r\n      }\r\n    }\r\n  });\r\n  // 点击遮罩层\r\n  maskLayer.addEventListener(\"click\", function () {\r\n    //处理遮罩层点击\r\n    if (!data.forceUpdate) {\r\n      maskLayer.hide();\r\n      popupView.hide();\r\n    }\r\n  });\r\n  // 显示弹窗\r\n  maskLayer.show();\r\n  popupView.show();\r\n}\r\n// 文件下载的弹窗绘图\r\nfunction downloadPopupDrawing(data) {\r\n  // 以下为计算菜单的nview绘制布局，为固定算法，使用者无关关心\r\n  const screenWidth = plus.screen.resolutionWidth;\r\n  const screenHeight = plus.screen.resolutionHeight;\r\n  //弹窗容器宽度\r\n  const popupViewWidth = screenWidth * 0.7;\r\n  // 弹窗容器的Padding\r\n  const viewContentPadding = 20;\r\n  // 弹窗容器的宽度\r\n  const viewContentWidth = popupViewWidth - viewContentPadding * 2;\r\n  // 弹窗容器高度\r\n  let popupViewHeight = viewContentPadding * 3 + 60;\r\n  let progressTip = data.progressTip || \"准备下载...\";\r\n  let contentText = data.contentText || \"正在为您更新，请耐心等待\";\r\n  let elementList = [\r\n    {\r\n      tag: \"rect\", //背景色\r\n      color: \"#FFFFFF\",\r\n      rectStyles: {\r\n        radius: \"8px\",\r\n      },\r\n    },\r\n    {\r\n      tag: \"font\",\r\n      id: \"title\",\r\n      text: \"升级APP\",\r\n      textStyles: {\r\n        size: \"16px\",\r\n        color: \"#333\",\r\n        weight: \"bold\",\r\n        verticalAlign: \"middle\",\r\n        whiteSpace: \"normal\",\r\n      },\r\n      position: {\r\n        top: viewContentPadding + \"px\",\r\n        height: \"30px\",\r\n      },\r\n    },\r\n    {\r\n      tag: \"font\",\r\n      id: \"content\",\r\n      text: contentText,\r\n      textStyles: {\r\n        size: \"14px\",\r\n        color: \"#333\",\r\n        verticalAlign: \"middle\",\r\n        whiteSpace: \"normal\",\r\n      },\r\n      position: {\r\n        top: viewContentPadding * 2 + 30 + \"px\",\r\n        height: \"20px\",\r\n      },\r\n    },\r\n  ];\r\n  // 是否有进度条\r\n  if (data.progress) {\r\n    popupViewHeight += viewContentPadding + 40;\r\n    elementList = elementList.concat([\r\n      {\r\n        tag: \"font\",\r\n        id: \"progressValue\",\r\n        text: progressTip,\r\n        textStyles: {\r\n          size: \"14px\",\r\n          color: $mainColor,\r\n          whiteSpace: \"normal\",\r\n        },\r\n        position: {\r\n          top: viewContentPadding * 4 + 20 + \"px\",\r\n          height: \"30px\",\r\n        },\r\n      },\r\n      {\r\n        tag: \"rect\", //绘制进度条背景\r\n        id: \"progressBg\",\r\n        rectStyles: {\r\n          radius: \"4px\",\r\n          borderColor: \"#f1f1f1\",\r\n          borderWidth: \"1px\",\r\n        },\r\n        position: {\r\n          top: viewContentPadding * 4 + 60 + \"px\",\r\n          left: viewContentPadding + \"px\",\r\n          width: viewContentWidth + \"px\",\r\n          height: \"8px\",\r\n        },\r\n      },\r\n    ]);\r\n  }\r\n  if (data.buttonNum == 2) {\r\n    popupViewHeight += viewContentPadding + 30;\r\n    // elementList = elementList.concat([{\r\n    // \ttag: 'rect', //绘制底边按钮\r\n    // \trectStyles: {\r\n    // \t\tradius: \"3px\",\r\n    // \t\tborderColor: \"#f1f1f1\",\r\n    // \t\tborderWidth: \"1px\",\r\n    // \t},\r\n    // \tposition: {\r\n    // \t\tbottom: viewContentPadding + 'px',\r\n    // \t\tleft: viewContentPadding + \"px\",\r\n    // \t\twidth: (viewContentWidth - viewContentPadding) / 2 + \"px\",\r\n    // \t\theight: \"30px\"\r\n    // \t}\r\n    // },\r\n    // {\r\n    // \ttag: 'rect', //绘制底边按钮\r\n    // \trectStyles: {\r\n    // \t\tradius: \"3px\",\r\n    // \t\tcolor: $mainColor\r\n    // \t},\r\n    // \tposition: {\r\n    // \t\tbottom: viewContentPadding + 'px',\r\n    // \t\tleft: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + \"px\",\r\n    // \t\twidth: (viewContentWidth - viewContentPadding) / 2 + \"px\",\r\n    // \t\theight: \"30px\"\r\n    // \t}\r\n    // },\r\n    // {\r\n    // \ttag: 'font',\r\n    // \tid: 'cancelText',\r\n    // \ttext: \"取消下载\",\r\n    // \ttextStyles: {\r\n    // \t\tsize: '14px',\r\n    // \t\tcolor: \"#666\",\r\n    // \t\tlineSpacing: \"0%\",\r\n    // \t\twhiteSpace: \"normal\"\r\n    // \t},\r\n    // \tposition: {\r\n    // \t\tbottom: viewContentPadding + 'px',\r\n    // \t\tleft: viewContentPadding + \"px\",\r\n    // \t\twidth: (viewContentWidth - viewContentPadding) / 2 + \"px\",\r\n    // \t\theight: \"30px\",\r\n    // \t}\r\n    // },\r\n    // {\r\n    // \ttag: 'font',\r\n    // \tid: 'confirmText',\r\n    // \ttext: \"后台下载\",\r\n    // \ttextStyles: {\r\n    // \t\tsize: '14px',\r\n    // \t\tcolor: \"#FFF\",\r\n    // \t\tlineSpacing: \"0%\",\r\n    // \t\twhiteSpace: \"normal\"\r\n    // \t},\r\n    // \tposition: {\r\n    // \t\tbottom: viewContentPadding + 'px',\r\n    // \t\tleft: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + \"px\",\r\n    // \t\twidth: (viewContentWidth - viewContentPadding) / 2 + \"px\",\r\n    // \t\theight: \"30px\",\r\n    // \t}\r\n    // }\r\n    // ]);\r\n  }\r\n  if (data.buttonNum == 1) {\r\n    popupViewHeight += viewContentPadding + 40;\r\n    elementList = elementList.concat([\r\n      {\r\n        tag: \"rect\", //绘制底边按钮\r\n        rectStyles: {\r\n          radius: \"6px\",\r\n          color: $mainColor,\r\n        },\r\n        position: {\r\n          bottom: viewContentPadding + \"px\",\r\n          left: viewContentPadding + \"px\",\r\n          width: viewContentWidth + \"px\",\r\n          height: \"40px\",\r\n        },\r\n      },\r\n      {\r\n        tag: \"font\",\r\n        id: \"confirmText\",\r\n        text: \"关闭\",\r\n        textStyles: {\r\n          size: \"14px\",\r\n          color: \"#FFF\",\r\n          lineSpacing: \"0%\",\r\n        },\r\n        position: {\r\n          bottom: viewContentPadding + \"px\",\r\n          left: viewContentPadding + \"px\",\r\n          width: viewContentWidth + \"px\",\r\n          height: \"40px\",\r\n        },\r\n      },\r\n    ]);\r\n  }\r\n  return {\r\n    popupViewHeight: popupViewHeight,\r\n    popupViewWidth: popupViewWidth,\r\n    screenHeight: screenHeight,\r\n    viewContentWidth: viewContentWidth,\r\n    viewContentPadding: viewContentPadding,\r\n    elementList: elementList,\r\n  };\r\n}\r\n// 文件下载的弹窗\r\nfunction downloadPopup(data, callback, cancelCallback, rebootCallback) {\r\n  // 弹窗遮罩层\r\n  let maskLayer = new plus.nativeObj.View(\"maskLayer\", {\r\n    //先创建遮罩层\r\n    top: \"0px\",\r\n    left: \"0px\",\r\n    height: \"100%\",\r\n    width: \"100%\",\r\n    backgroundColor: \"rgba(0,0,0,0.5)\",\r\n  });\r\n  let popupViewData = downloadPopupDrawing(data);\r\n  // 弹窗内容\r\n  let popupView = new plus.nativeObj.View(\"popupView\", {\r\n    //创建底部图标菜单\r\n    tag: \"rect\",\r\n    top:\r\n      (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + \"px\",\r\n    left: \"15%\",\r\n    height: popupViewData.popupViewHeight + \"px\",\r\n    width: \"70%\",\r\n  });\r\n  let progressValue = 0;\r\n  let progressTip = 0;\r\n  let contentText = 0;\r\n  let buttonNum = 2;\r\n  let forceUpdate = data.forceUpdate;\r\n  if (data.buttonNum >= 0) {\r\n    buttonNum = data.buttonNum;\r\n  }\r\n  popupView.draw(popupViewData.elementList);\r\n  popupView.addEventListener(\"click\", function (e) {\r\n    let maxTop =\r\n      popupViewData.popupViewHeight - popupViewData.viewContentPadding;\r\n    let maxLeft =\r\n      popupViewData.popupViewWidth - popupViewData.viewContentPadding;\r\n    if (e.clientY > maxTop - 40 && e.clientY < maxTop) {\r\n      if (buttonNum == 1) {\r\n        // 单按钮\r\n        if (\r\n          e.clientX > popupViewData.viewContentPadding &&\r\n          e.clientX < maxLeft\r\n        ) {\r\n          maskLayer.hide();\r\n          popupView.hide();\r\n        }\r\n      } else if (buttonNum == 2) {\r\n        // 双按钮\r\n        let buttonWidth =\r\n          (popupViewData.viewContentWidth - popupViewData.viewContentPadding) /\r\n          2;\r\n        if (\r\n          e.clientX > popupViewData.viewContentPadding &&\r\n          e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding\r\n        ) {\r\n          maskLayer.hide();\r\n          popupView.hide();\r\n          //cancelCallback && cancelCallback();\r\n        } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {\r\n          maskLayer.hide();\r\n          popupView.hide();\r\n        }\r\n      }\r\n    }\r\n  });\r\n  // 显示弹窗\r\n  maskLayer.show();\r\n  popupView.show();\r\n  // 改变进度条\r\n  callback({\r\n    change: function (res) {\r\n      let progressElement = [];\r\n      if (res.progressValue) {\r\n        progressValue = res.progressValue;\r\n        // 绘制进度条\r\n        progressElement.push({\r\n          tag: \"rect\", //绘制进度条背景\r\n          id: \"progressValueBg\",\r\n          rectStyles: {\r\n            radius: \"4px\",\r\n            color: $mainColor,\r\n          },\r\n          position: {\r\n            top: popupViewData.viewContentPadding * 4 + 60 + \"px\",\r\n            left: popupViewData.viewContentPadding + \"px\",\r\n            width:\r\n              popupViewData.viewContentWidth * (res.progressValue / 100) + \"px\",\r\n            height: \"8px\",\r\n          },\r\n        });\r\n      }\r\n      if (res.progressTip) {\r\n        progressTip = res.progressTip;\r\n        progressElement.push({\r\n          tag: \"font\",\r\n          id: \"progressValue\",\r\n          text: res.progressTip,\r\n          textStyles: {\r\n            size: \"14px\",\r\n            color: $mainColor,\r\n            whiteSpace: \"normal\",\r\n          },\r\n          position: {\r\n            top: popupViewData.viewContentPadding * 4 + 20 + \"px\",\r\n            height: \"30px\",\r\n          },\r\n        });\r\n      }\r\n      if (res.contentText) {\r\n        contentText = res.contentText;\r\n        progressElement.push({\r\n          tag: \"font\",\r\n          id: \"content\",\r\n          text: res.contentText,\r\n          textStyles: {\r\n            size: \"16px\",\r\n            color: \"#333\",\r\n            whiteSpace: \"normal\",\r\n          },\r\n          position: {\r\n            top: popupViewData.viewContentPadding * 2 + 30 + \"px\",\r\n            height: \"30px\",\r\n          },\r\n        });\r\n      }\r\n      if (res.buttonNum >= 0 && buttonNum != res.buttonNum) {\r\n        buttonNum = res.buttonNum;\r\n        popupView.reset();\r\n        popupViewData = downloadPopupDrawing(\r\n          Object.assign(\r\n            {\r\n              progressValue: progressValue,\r\n              progressTip: progressTip,\r\n              contentText: contentText,\r\n            },\r\n            res\r\n          )\r\n        );\r\n        let newElement = [];\r\n        popupViewData.elementList.map((item, index) => {\r\n          let have = false;\r\n          progressElement.forEach((childItem, childIndex) => {\r\n            if (item.id == childItem.id) {\r\n              have = true;\r\n            }\r\n          });\r\n          if (!have) {\r\n            newElement.push(item);\r\n          }\r\n        });\r\n        progressElement = newElement.concat(progressElement);\r\n        popupView.setStyle({\r\n          tag: \"rect\",\r\n          top:\r\n            (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 +\r\n            \"px\",\r\n          left: \"15%\",\r\n          height: popupViewData.popupViewHeight + \"px\",\r\n          width: \"70%\",\r\n        });\r\n        popupView.draw(progressElement);\r\n      } else {\r\n        popupView.draw(progressElement);\r\n      }\r\n    },\r\n    cancel: function () {\r\n      maskLayer.hide();\r\n      popupView.hide();\r\n    },\r\n  });\r\n}\r\nexport default function (isPrompt = false) {\r\n  getCurrentNo((version) => {\r\n    getServerNo((res) => {\r\n\r\n      if (res.versionCode.replace(/\\./g, \"\") <= version.version.replace(/\\./g, \"\")) {\r\n        return false;\r\n      }\r\n\r\n      if (res.forceUpdate) {\r\n        if (/\\.wgt$/i.test(res.downloadUrl)) {\r\n          getDownload(res);\r\n        } else if (/\\.html$/i.test(res.downloadUrl)) {\r\n          plus.runtime.openURL(res.downloadUrl);\r\n        } else {\r\n          if (platform == \"android\") {\r\n            getDownload(res);\r\n          } else {\r\n            updatePopup(res, function () {\r\n              plus.runtime.openURL(res.downloadUrl);\r\n            });\r\n            // uni.showLoading({\r\n            // \ttitle: \"升级中......\",\r\n            // \tmask: true\r\n            // });\r\n            // plus.runtime.openURL(res.downloadUrl);\r\n            // plus.runtime.restart();\r\n          }\r\n        }\r\n      } else {\r\n        updatePopup(res, function () {\r\n          if (/\\.wgt$/i.test(res.downloadUrl)) {\r\n            getDownload(res);\r\n          } else if (/\\.html$/i.test(res.downloadUrl)) {\r\n            plus.runtime.openURL(res.downloadUrl);\r\n          } else {\r\n            getDownload(res);\r\n            // if (platform == \"android\") {\r\n            // \tgetDownload(res);\r\n            // } else {\r\n            // \tplus.runtime.openURL(res.downloadUrl);\r\n            // }\r\n          }\r\n        });\r\n      }\r\n    });\r\n  });\r\n}\r\n// #endif\r\n"
  },
  {
    "path": "pushGithub.sh",
    "content": "echo '开始推送github'\necho '切换git地址'\ngit remote rm origin\n\ngit remote add origin git@github.com:hongyehuicheng/lilishop-uniapp.git\necho '设置上传代码分支，推送github'\ngit push --set-upstream origin master --force\necho '推送github完成'\ngit remote rm origin\n\ngit remote add origin git@gitee.com:beijing_hongye_huicheng/lilishop-uniapp.git\n\ngit pull origin master\n\necho '切回gitee资源'\ngit branch --set-upstream-to=origin/master master\necho '设置git跟踪资源'\n\n"
  },
  {
    "path": "store/index.js",
    "content": "import Vue from \"vue\";\r\nimport Vuex from \"vuex\";\r\nimport storage from \"@/utils/storage\";\r\n\r\nVue.use(Vuex);\r\n\r\nconst store = new Vuex.Store({\r\n  state: {\r\n    isShowToast:false, // 是否在展示Toast中\r\n    remark:[], //填写订单备注\r\n    shareLink:\"\", //分享链接\r\n    verificationKey: \"\", //获取key表示验证通过\r\n    distributionId:\"\", //分销员Id 如果当前账户从未登录过时记录\r\n    hasLogin: storage.getHasLogin(),\r\n    userInfo: storage.getUserInfo(),\r\n    uuid: storage.getUuid(),\r\n    token: \"\",\r\n  },\r\n  mutations: {\r\n    login(state, userInfo) {\r\n      state.userInfo = userInfo || {};\r\n      state.userName =\r\n        userInfo.Name || userInfo.Nickname || userInfo.Username || \"匿名用户\";\r\n      state.hasLogin = true;\r\n    },\r\n    logout(state) {\r\n      state.userName = \"\";\r\n      state.hasLogin = false;\r\n    },\r\n\r\n    // 设置填写订单中备注\r\n    setRemark(state, remark) {\r\n      state.remark = remark;\r\n    }\r\n  },\r\n  actions: {},\r\n});\r\n\r\nexport default store;\r\n"
  },
  {
    "path": "uni.scss",
    "content": "/* 页面左右间距 */\r\n$page-color-base: #f8f8f8;\r\n@import \"uview-ui/theme.scss\";\r\n\r\n/* 文字尺寸 */\r\n$font-sm: 24rpx;\r\n$font-base: 28rpx;\r\n$font-lg: 32rpx;\r\n$font-sl: 36rpx;\r\n/*文字颜色*/\r\n$font-color-dark: #303133;\r\n$font-color-white: #ffffff;\r\n$font-color-base: #606266;\r\n$font-color-light: #909399;\r\n$font-color-disabled: #c0c4cc;\r\n/* 边框颜色 */\r\n$border-color-dark: #dcdfe6;\r\n$border-color-base: #e4e7ed;\r\n$border-color-light: #ebeef5;\r\n/* 图片加载中颜色 */\r\n$image-bg-color: #eee;\r\n/* 行为相关颜色 */\r\n$uni-color-primary: #fa436a;\r\n$uni-color-success: #4cd964;\r\n$uni-color-warning: #f0ad4e;\r\n$uni-color-error: #dd524d;\r\n\r\n/*主题颜色 具体参考   https://ant.design/docs/spec/colors-cn */\r\n/**微信登录按钮颜色 */\r\n$weChat-color:#00a327;\r\n/**主颜色*/\r\n$main-color: #ff3c2a;\r\n/*用于金钱等颜色 */\r\n$price-color: #ff3c2a;\r\n/*主题高亮颜色*/\r\n$light-color: #ff6b35;\r\n/*辅助高亮颜色*/\r\n$aider-light-color: #ff9f28;\r\n\r\n/*主题高亮背景颜色*/\r\n$main-light-color: #edfcf7;\r\n/*价格红高亮背景颜色*/\r\n$price-light-color: #fcedeb;\r\n\r\n/*辅助色*/\r\n$aider-color-red: #ff6262;\r\n$aider-color-yellow: #ffc71c;\r\n$aider-color-green: #28d094;\r\n$aider-color-blue: #1e9ff2;\r\n// 中性色\r\n$neutral-color: #333333;\r\n//背景色\r\n$bg-color: #f9f9f9;\r\n\r\n// 字体\r\n$font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif,\r\n\t\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\r\n$font-weight-b: 500;\r\n$font-weight: 400;\r\n.light-color {\r\n\tcolor: $light-color;\r\n}\r\n.main-color {\r\n\tcolor: $main-color !important;\r\n}\r\n.bg-light-color {\r\n\tbackground-color: $light-color !important;\r\n\t/deep/ * {\r\n\t\tbackground-color: $light-color !important;\r\n\t}\r\n}\r\n.bg-main-color {\r\n\tbackground-color: $main-color !important;\r\n}\r\n\r\n// 渐变主题颜色\r\n.bg-linear-gradient {\r\n\tbackground-image: linear-gradient(25deg, #fa123b, #ff6b35, #ff9f28, #ffcc03);\r\n}\r\n.uni-tabbar .uni-tabbar__icon {\r\n\twidth: 20px;\r\n\theight: 18px;\r\n}\r\n\r\n.flex {\r\n\tdisplay: flex;\r\n}\r\n\r\n.btn {\r\n\tbackground-color: $light-color;\r\n\tcolor: #ffffff;\r\n\tborder-width: 0px;\r\n\tborder: none;\r\n\tborder-radius: 44px;\r\n\theight: 44px;\r\n\tbox-shadow: none;\r\n\tfont-weight: 400;\r\n\tfont-style: normal;\r\n\tline-height: 44px;\r\n\ttext-align: center;\r\n\t&::after {\r\n\t\tborder: none;\r\n\t}\r\n}\r\n.button-hover {\r\n\topacity: 0.7;\r\n}\r\n\r\n.margin {\r\n\tmargin: 10px;\r\n}\r\n\r\n.tag {\r\n\tbackground-color: rgba(242, 242, 242, 1);\r\n\tcolor: #333333;\r\n\theight: 28px;\r\n\tborder-radius: 28px;\r\n\tbox-shadow: none;\r\n\tfont-family: \"PingFangSC-Regular\", \"PingFang SC\", sans-serif;\r\n\tfont-weight: 400;\r\n\tfont-style: normal;\r\n\tline-height: 28px;\r\n\ttext-align: center;\r\n\twidth: 90px;\r\n}\r\n\r\n.c-content {\r\n\tbackground-color: #ffffff;\r\n\t// margin-top: 30rpx;\r\n\tborder-top: 1px solid $border-color-light;\r\n\tborder-bottom: 1px solid $border-color-light;\r\n}\r\n.mt-30 {\r\n\tmargin-top: 30rpx;\r\n}\r\n.border-top {\r\n\tborder-top: 1px solid $border-color-light;\r\n}\r\n.describe {\r\n\tcolor: $font-color-light;\r\n\tfont-size: $font-sm;\r\n\tpadding: 30rpx;\r\n}\r\n.flex-center {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tflex-direction: column;\r\n}\r\n.flex-a-c{\r\n\talign-items: center;\r\n}\r\n.flex-j-sb{\r\n\tjustify-content: space-between;\r\n}\r\n.relative {\r\n\tposition: relative;\r\n}\r\n\r\n.wes {\r\n\t/* 多出部分用省略号表示 , 用于一行 */\r\n\toverflow: hidden;\r\n\tword-wrap: normal;\r\n\twhite-space: nowrap;\r\n\ttext-overflow: ellipsis;\r\n}\r\n\r\n.wes-2 {\r\n\t/* 适用于webkit内核和移动端 */\r\n\tdisplay: -webkit-box;\r\n\t-webkit-box-orient: vertical;\r\n\t-webkit-line-clamp: 2;\r\n\toverflow: hidden;\r\n}\r\n\r\n.wes-3 {\r\n\t/* 适用于webkit内核和移动端 */\r\n\tdisplay: -webkit-box;\r\n\t-webkit-box-orient: vertical;\r\n\t-webkit-line-clamp: 3;\r\n\toverflow: hidden;\r\n}\r\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/LICENSE.md",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/README.md",
    "content": "# 介绍\n\n`uQRCode`是一款基于`Javascript`环境开发的二维码生成插件，适用所有`Javascript`运行环境的前端应用和`Node.js`应用。\n\n`uQRCode`可扩展性高，它支持自定义渲染二维码，可通过`uQRCode API`得到二维码绘制关键信息后，使用`canvas`、`svg`或`js`操作`dom`的方式绘制二维码图案。还可自定义二维码样式，如随机颜色、圆点、方块、块与块之间的间距等。\n\n欢迎加入群聊【uQRCode交流群】：[695070434](https://jq.qq.com/?_wv=1027&k=JRjzDqiw)。\n\n# 设计器\n\nuQRCode发布了配套的可视化设计器，可根据自己喜好在设计器中设计二维码样式，一键生成配置代码复制到项目中，详情请在微信小程序搜索“柚子二维码”，或扫描下方小程序码体验。\n\n![uQRCode设计器](https://uqrcode.cn/mp_weixin_code.jpg)\n\n## 设计器模板示例\n\n![uQRCode设计器](https://uqrcode.cn/yz_1.png)\n![uQRCode设计器](https://uqrcode.cn/yz_2.png)\n![uQRCode设计器](https://uqrcode.cn/yz_3.png)\n![uQRCode设计器](https://uqrcode.cn/yz_4.png)\n![uQRCode设计器](https://uqrcode.cn/yz_5.png)\n![uQRCode设计器](https://uqrcode.cn/yz_6.png)\n![uQRCode设计器](https://uqrcode.cn/yz_7.png)\n![uQRCode设计器](https://uqrcode.cn/yz_8.png)\n![uQRCode设计器](https://uqrcode.cn/yz_9.png)\n\n# 快速上手\n\n> 在`uni-app`中，我们更推荐使用组件方式来生成二维码，组件方式大大提高了页面的可读性以及避开了一些平台容易出问题的地方，当组件无法满足需求的时候，再考虑切换成原生方式。\n\n官方文档：[https://uqrcode.cn/doc](https://uqrcode.cn/doc)。\n\ngithub地址：[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode)。\n\nnpm地址：[https://www.npmjs.com/package/uqrcodejs](https://www.npmjs.com/package/uqrcodejs)。\n\nuni-app插件市场地址：[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287)。\n\n## 原生方式\n\n原生方式仅需要获取`uqrcode.js`文件便可使用。详细配置请移步到：文档 > [原生](https://uqrcode.cn/doc/document/native.html)。\n\n### 安装\n\n1. 通过`npm`安装，成功后即可使用`import`或`require`进行引用。\n``` bash\n# npm安装\nnpm install uqrcodejs\n# 或者\nnpm install @uqrcode/js\n```\n\n2. 通过项目开源地址获取`uqrcode.js`，下载`uqrcode.js`后，将其复制到您项目指定目录，在页面中引入`uqrcode.js`文件即可开始使用。\n\n### 引入\n\n- 通过`import`引入。\n``` javascript\n// npm安装\nimport UQRCode from 'uqrcodejs'; // npm install uqrcodejs\n// 或者\nimport UQRCode from '@uqrcode/js'; // npm install @uqrcode/js\n```\n\n- `Node.js`通过`require`引入。\n``` javascript\n// npm安装\nconst UQRCode = require('uqrcodejs'); // npm install uqrcodejs\n// 或者\nconst UQRCode = require('@uqrcode/js'); // npm install @uqrcode/js\n```\n\n- 原生浏览器环境，在js脚本加载时添加到`window`。\n``` html\n<script type=\"text/javascript\" src=\"uqrcode.js\"></script>\n<script>\n    var UQRCode = window.UQRCode;\n</script>\n```\n\n### 简单用法\n\n`uQRCode`基于`Canvas API`封装了一套方法，建议开发者使用`canvas`生成，一键调用，非常方便。以下是示例：\n\n- HTML示例\n  - DOM部分\n  ``` html\n  <canvas id=\"qrcode\" width=\"200\" height=\"200\"></canvas>\n  ```\n\n  - JS部分\n  ``` javascript\n  // 获取uQRCode实例\n  var qr = new UQRCode();\n  // 设置二维码内容\n  qr.data = \"https://uqrcode.cn/doc\";\n  // 设置二维码大小，必须与canvas设置的宽高一致\n  qr.size = 200;\n  // 调用制作二维码方法\n  qr.make();\n  // 获取canvas元素\n  var canvas = document.getElementById(\"qrcode\");\n  // 获取canvas上下文\n  var canvasContext = canvas.getContext(\"2d\");\n  // 设置uQRCode实例的canvas上下文\n  qr.canvasContext = canvasContext;\n  // 调用绘制方法将二维码图案绘制到canvas上\n  qr.drawCanvas();\n  ```\n\n- uni-app示例\n  - Template部分\n  ``` html\n  <canvas id=\"qrcode\" canvas-id=\"qrcode\" style=\"width: 200px;height: 200px;\"></canvas>\n  ```\n  \n  - JS部分\n  ``` javascript\n  onReady() {\n    // 获取uQRCode实例\n    var qr = new UQRCode();\n    // 设置二维码内容\n    qr.data = \"https://uqrcode.cn/doc\";\n    // 设置二维码大小，必须与canvas设置的宽高一致\n    qr.size = 200;\n    // 调用制作二维码方法\n    qr.make();\n    // 获取canvas上下文\n    var canvasContext = uni.createCanvasContext('qrcode', this); // 如果是组件，this必须传入\n    // 设置uQRCode实例的canvas上下文\n    qr.canvasContext = canvasContext;\n    // 调用绘制方法将二维码图案绘制到canvas上\n    qr.drawCanvas();\n  }\n  ```\n  \n- 微信小程序，推荐使用Canvas 2D，关于Canvas 2D的使用请参考微信开放文档。\n\n### 高级用法\n\n考虑到部分平台可能不支持`canvas`，所以`uQRCode`并没有强制要求和`canvas`一起使用，您还可以选择其他方式来生成二维码，例如使用`js`操作`dom`进行绘制或是使用`svg`绘制等。以下是示例：\n\n- uni-app v-for+view\n\n```html\n<template>\n  <view>\n    <view class=\"qrcode\">\n      <view v-for=\"(row, rowI) in modules\" :key=\"rowI\" style=\"display: flex;flex-direction: row;\">\n        <view v-for=\"(col, colI) in row\" :key=\"colI\">\n          <view v-if=\"col.isBlack\" style=\"width: 10px;height: 10px;background-color: black;\">\n            <!-- 黑色码点 -->\n          </view>\n          <view v-else style=\"width: 10px;height: 10px;background-color: white;\">\n            <!-- 白色码点 -->\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\n  import UQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/uqrcode/uqrcode.js';\n\n  export default {\n    data() {\n      return {\n        modules: []\n      }\n    },\n    onLoad() {\n      const qr = new UQRCode();\n      qr.data = 'uQRCode';\n      qr.make();\n      this.modules = qr.modules;\n    },\n    methods: {\n\n    }\n  }\n</script>\n```\n\n- js操作dom\n\n``` html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>uQRCode二维码生成</title>\n</head>\n<body>\n    <div id=\"qrcode\" style=\"position: relative;\"></div>\n    <script type=\"text/javascript\" src=\"uqrcode.js\"></script>\n    <script>\n    // 引入uQRCode\n    var UQRCode = window.UQRCode;\n    // 获取uQRCode实例\n    var qr = new UQRCode();\n    // 设置二维码内容\n    qr.data = \"https://uqrcode.cn/doc\";\n    // 设置二维码大小，必须与canvas设置的宽高一致\n    qr.size = 200;\n    // 设置二维码前景图，可以是路径\n    qr.foregroundImageSrc =\n        'data:image/png;base64,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';\n    // 调用制作二维码方法\n    qr.make();\n\n    var drawModules = qr.getDrawModules();\n    // 遍历drawModules创建dom元素\n    var qrHtml = '';\n    for (var i = 0; i < drawModules.length; i++) {\n        var drawModule = drawModules[i];\n        switch (drawModule.type) {\n        case 'tile':\n            /* 绘制小块 */\n            qrHtml += `<div style=\"position: absolute;left: ${drawModule.x}px;top: ${drawModule.y}px;width: ${drawModule.width}px;height: ${drawModule.height}px;background: ${drawModule.color};\"></div>`;\n            break;\n        case 'image':\n            /* 绘制图像 */\n            qrHtml += `<img style=\"position: absolute;left: ${drawModule.x}px;top: ${drawModule.y}px;width: ${drawModule.width}px;height: ${drawModule.height}px;\" src=\"${drawModule.imageSrc}\" />`;\n            break;\n        }\n    }\n    document.getElementById('qrcode').innerHTML = qrHtml;\n    </script>\n</body>\n</html>\n```\n\n- svg\n``` html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>uQRCode二维码生成</title>\n</head>\n<body>\n    <svg id=\"qrcode\" width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\"></svg>\n    <script type=\"text/javascript\" src=\"uqrcode.js\"></script>\n    <script>\n    // 引入uQRCode\n    var UQRCode = window.UQRCode;\n    // 获取uQRCode实例\n    var qr = new UQRCode();\n    // 设置二维码内容\n    qr.data = \"https://uqrcode.cn/doc\";\n    // 设置二维码大小，必须与canvas设置的宽高一致\n    qr.size = 200;\n    // 设置二维码前景图，可以是路径\n    qr.foregroundImageSrc =\n        'data:image/png;base64,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';\n    // 调用制作二维码方法\n    qr.make();\n\n    var drawModules = qr.getDrawModules();\n    // 遍历drawModules创建svg元素\n    var qrHtml = '';\n    for (var i = 0; i < drawModules.length; i++) {\n        var drawModule = drawModules[i];\n        switch (drawModule.type) {\n        case 'tile':\n            /* 绘制小块 */\n            qrHtml += `<rect x=\"${drawModule.x}\" y=\"${drawModule.y}\" width=\"${drawModule.width}\" height=\"${drawModule.height}\" style=\"fill: ${drawModule.color};\" />`;\n            break;\n        case 'image':\n            /* 绘制图像 */\n            qrHtml += `<image href=\"${drawModule.imageSrc}\" x=\"${drawModule.x}\" y=\"${drawModule.y}\" width=\"${drawModule.width}\" height=\"${drawModule.height}\" />`;\n            break;\n        }\n    }\n    document.getElementById('qrcode').innerHTML = qrHtml;\n    </script>\n</body>\n</html>\n```\n\n> 更多用法大家自行探索咯，期待分享哟~\n\n### 导出临时文件路径\n\n原生方式基于`Canvas`的，请自行参阅各平台`Canvas`的导出方式。以下是部分示例：\n\n- uni-app\n```javascript\n// 通过uni.createCanvasContext方式创建绘制上下文的，对应导出API为uni.canvasToTempFilePath\n// 调用完ctx.draw()方法后不能第一时间导出，否则会异常，需要有一定的延时\nsetTimeout(() => {\n    uni.canvasToTempFilePath(\n        {\n            canvasId: this.canvasId,\n            fileType: this.fileType,\n            width: this.canvasWidth,\n            height: this.canvasHeight,\n            success: res => {\n                console.log(res);\n            },\n            fail: err => {\n                console.log(err);\n            }\n        }, \n        // this // 组件内使用必传当前实例\n    );\n}, 300);\n```\n\n- Canvas2D\n```javascript\n// 得到base64\nconsole.log(canvas.toDataURL());\n// 得到buffer\nconsole.log(canvas.toBuffer());\n```\n\n### 保存二维码到本地相册\n\n必须在导出临时文件路径成功后再执行保存。uni-app通用保存方式（H5除外）：\n```javascript\nuni.saveImageToPhotosAlbum({\n    filePath: tempFilePath,\n    success: res => {\n        console.log(res);\n    },\n    fail: err => {\n        console.log(err);\n    }\n});\n```\n\nH5可以通过设置`<a>`标签`href`属性的方式进行保存：\n```javascript\nconst aEle = document.createElement('a');\naEle.download = 'uQRCode'; // 设置下载的文件名，默认是'下载'\naEle.href = tempFilePath;\ndocument.body.appendChild(aEle);\naEle.click();\naEle.remove(); // 下载之后把创建的元素删除\n```\n经过测试，PC端浏览器可以下载，部分安卓自带或第三方浏览器可以下载，安卓微信浏览器不适用，移动端iOS所有浏览器均不适用，差异较大，还是推荐各位导出文件给图片组件显示，然后提示用户通过长按图片进行保存这种方式。\n\n## uni-app组件方式\n\n### 安装\n\n通过uni-app插件市场地址安装：[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287)。详细配置请移步到：文档 > [uni-app组件](https://uqrcode.cn/doc/document/uni-app.html)。\n\n### 引入\n\nuni-app默认为easycom模式，可直接键入`<uqrcode>`标签。\n\n### 简单用法\n\n安装`uqrcode`组件后，在`template`中键入`<uqrcode/>`。设置`ref`属性可使用组件内部方法，`canvas-id`属性为组件内部的canvas组件标识，`value`属性为二维码生成对应内容，`options`为配置选项，可配置二维码样式，绘制Logo等，详见：[options](https://uqrcode.cn/doc/document/uni-app.html#options) 。\n\n``` html\n<uqrcode ref=\"uqrcode\" canvas-id=\"qrcode\" value=\"https://uqrcode.cn/doc\" :options=\"{ margin: 10 }\"></uqrcode>\n```\n\n### 导出临时文件路径\n\n为了保证方法调用成功，请在 [complete](https://uqrcode.cn/doc/document/uni-app.html#complete) 事件返回`success=true`后调用。\n\n```javascript\n// uqrcode为组件的ref名称\nthis.$refs.uqrcode.toTempFilePath({\n  success: res => {\n    console.log(res);\n  }\n});\n```\n\n### 保存二维码到本地相册\n\n为了保证方法调用成功，请在 [complete](https://uqrcode.cn/doc/document/uni-app.html#complete) 事件返回`success=true`后调用。\n\n```javascript\n// uqrcode为组件的ref名称\nthis.$refs.uqrcode.save({\n  success: () => {\n    uni.showToast({\n      icon: 'success',\n      title: '保存成功'\n    });\n  }\n});\n```\n\n## 更多使用说明请前往官方文档查看：[https://uqrcode.cn/doc](https://uqrcode.cn/doc)。"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/changelog.md",
    "content": "## 4.0.6（2022-12-12）\n修复`getDrawModules`，第一次获取结果正常，后续获取`tile`模块不存在的问题；  \n修复安卓type:normal因Canvas API使用了小数或为0的参数导致生成异常的问题（注：安卓非2d Canvas部分API参数不支持携带小数，部分API参数必须大于0）。\n## 4.0.1（2022-11-28）\n优化组件loading属性的表现；  \n新增组件type选项normal，以便于在某些条件编译初始为type=2d时还可以选择使用非2d组件类型；  \n修复组件条件编译在其他编辑器语法提示报错；  \n修复原生对es5的支持。\n## 4.0.0（2022-11-21）\nv4版本源代码全面开放，开源地址：[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode)；  \n\n升级说明：v4为大版本更新，虽然已尽可能兼容上一代版本，但不可避免的还是存在一些细节差异，若更新后出现问题，请参考对照[v3 文档](https://uqrcode.cn/doc/v3)，[v4 文档](https://uqrcode.cn/doc)进行修改。\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/common/cache.js",
    "content": "export const cacheImageList = [];"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/common/queue.js",
    "content": "function Queue() {\n  let waitingQueue = this.waitingQueue = [];\n  let isRunning = this.isRunning = false; // 记录是否有未完成的任务\n\n  function execute(task, resolve, reject) {\n    task()\n      .then((data) => {\n        resolve(data);\n      })\n      .catch((e) => {\n        reject(e);\n      })\n      .finally(() => {\n        // 等待任务队列中如果有任务，则触发它；否则设置isRunning = false,表示无任务状态\n        if (waitingQueue.length) {\n          const next = waitingQueue.shift();\n          execute(next.task, next.resolve, next.reject);\n        } else {\n          isRunning = false;\n        }\n      });\n  }\n  this.exec = function(task) {\n    return new Promise((resolve, reject) => {\n      if (isRunning) {\n        waitingQueue.push({\n          task,\n          resolve,\n          reject\n        });\n      } else {\n        isRunning = true;\n        execute(task, resolve, reject);\n      }\n    });\n  }\n}\n\n/* 队列实例，某些平台一起使用多个组件时需要通过队列逐一绘制，否则部分绘制方法异常，nvue端的iOS gcanvas尤其明显，在不通过队列绘制时会出现图片丢失的情况 */\nexport const queueDraw = new Queue();\nexport const queueLoadImage = new Queue();"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/common/types/cache.d.ts",
    "content": "declare module '*/common/cache' {\n  export const cacheImageList: Array;\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/common/types/queue.d.ts",
    "content": "declare module '*/common/queue' {\n  export const queueDraw: any;\n  export const queueLoadImage: any;\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue",
    "content": "<template>\n  <view class=\"uqrcode\" :class=\"{ 'uqrcode-hide': hide }\" :style=\"{ width: `${templateOptions.width}px`, height: `${templateOptions.height}px` }\">\n    <view class=\"uqrcode-canvas-wrapper\">\n      <!-- 画布 -->\n      <!-- #ifndef APP-NVUE -->\n      <canvas class=\"uqrcode-canvas\" :id=\"canvasId\" :canvas-id=\"canvasId\" :type=\"canvasType\" :style=\"{\n          width: `${templateOptions.canvasWidth}px`,\n          height: `${templateOptions.canvasHeight}px`,\n          transform: templateOptions.canvasTransform\n        }\" v-if=\"templateOptions.canvasDisplay\" @click=\"onClick\"></canvas>\n      <!-- #endif -->\n\n      <!-- nvue用gcanvas -->\n      <!-- #ifdef APP-NVUE -->\n      <gcanvas class=\"uqrcode-canvas\" ref=\"gcanvas\" :style=\"{\n          width: `${templateOptions.canvasWidth}px`,\n          height: `${templateOptions.canvasHeight}px`\n        }\" v-if=\"templateOptions.canvasDisplay\" @click=\"onClick\"></gcanvas>\n      <!-- #endif -->\n    </view>\n\n    <!-- 加载效果 -->\n    <view class=\"uqrcode-makeing\" v-if=\"loading === undefined ? makeing : loading\">\n      <slot name=\"loading\">\n        <image class=\"uqrcode-makeing-image\" :style=\"{ width: `${templateOptions.size / 4}px`, height: `${templateOptions.size / 4}px` }\"\n          src=\"data:image/gif;base64,R0lGODlhAAEAAfIEAOHh4SSsWuDg4N3d3f///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDAyIDc5LjE2NDQ4OCwgMjAyMC8wNy8xMC0yMjowNjo1MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAyODhGMzM4RDEwMTExRUM4MDhCRkVBQkE2QUZDQzkwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAyODhGMzM5RDEwMTExRUM4MDhCRkVBQkE2QUZDQzkwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4OEYzMzZEMTAxMTFFQzgwOEJGRUFCQTZBRkNDOTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDI4OEYzMzdEMTAxMTFFQzgwOEJGRUFCQTZBRkNDOTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQ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\">\n        </image>\n      </slot>\n    </view>\n\n    <!-- 错误处理 -->\n    <view class=\"uqrcode-error\" v-if=\"isError\" @click=\"onClick\">\n      <slot name=\"error\" :error=\"error\">\n        <text class=\"uqrcode-error-message\">{{ error.errMsg }}</text>\n      </slot>\n    </view>\n\n    <!-- H5保存提示 -->\n    <!-- #ifdef H5 -->\n    <view class=\"uqrcode-h5-save\" v-if=\"isH5Save\">\n      <slot name=\"h5save\" :tempFilePath=\"tempFilePath\">\n        <image class=\"uqrcode-h5-save-image\" :src=\"tempFilePath\"></image>\n        <text class=\"uqrcode-h5-save-text\">{{ h5SaveIsDownload ? '若保存失败，' : '' }}请长按二维码进行保存</text>\n      </slot>\n      <view class=\"uqrcode-h5-save-close\" @click.stop=\"isH5Save = false\">\n        <view class=\"uqrcode-h5-save-close-before\"></view>\n        <view class=\"uqrcode-h5-save-close-after\"></view>\n      </view>\n    </view>\n    <!-- #endif -->\n  </view>\n</template>\n\n<script>\n  // #ifdef VUE3\n  import {\n    toRaw\n  } from 'vue';\n  // #endif\n\n  /* 引入uQRCode核心js */\n  import UQRCode from '../../js_sdk/uqrcode/uqrcode';\n\n  /* 引入nvue所需模块 */\n  // #ifdef APP-NVUE\n  import {\n    enable,\n    WeexBridge\n  } from '../../js_sdk/gcanvas';\n  const modal = weex.requireModule('modal');\n  // #endif\n\n  /* 引入队列 */\n  import {\n    queueDraw,\n    queueLoadImage\n  } from '../../common/queue';\n  /* 引入缓存图片 */\n  import {\n    cacheImageList\n  } from '../../common/cache';\n\n  let instance = null;\n\n  export default {\n    name: 'uqrcode',\n    props: {\n      /**\n       * canvas组件id\n       */\n      canvasId: {\n        type: String,\n        required: true // canvasId在微信小程序初始值不能为空，created中赋值也不行，必须给一个值，否则挂载组件后无法绘制。不考虑用随机id，uuid\n      },\n      /**\n       * 二维码内容\n       */\n      value: {\n        type: [String, Number]\n      },\n      /**\n       * 选项\n       */\n      options: {\n        type: Object,\n        default: () => {\n          return {};\n        }\n      },\n      /**\n       * 二维码大小\n       */\n      size: {\n        type: [String, Number],\n        default: 200\n      },\n      /**\n       * 二维码尺寸单位\n       */\n      sizeUnit: {\n        type: String,\n        default: 'px'\n      },\n      /**\n       * 导出的文件类型\n       */\n      fileType: {\n        type: String,\n        default: 'png'\n      },\n      /**\n       * 是否初始化组件后就开始生成\n       */\n      start: {\n        type: Boolean,\n        default: true\n      },\n      /**\n       * 是否数据发生改变自动重绘\n       */\n      auto: {\n        type: Boolean,\n        default: true\n      },\n      /**\n       * 隐藏组件\n       */\n      hide: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * canvas 类型，微信小程序默认使用2d，非2d微信官方已放弃维护，问题比较多\n       * 注意：微信小程序type2d手机上正常，PC上微信内打开小程序toDataURL报错，看后期微信官方团队会不会做兼容，不兼容的话只能在自行判断在PC使用非2d，或者直接提示用户请在手机上操作，微信团队的海报中心小程序就是这么做的\n       */\n      type: {\n        type: String,\n        default: () => {\n          // #ifdef MP-WEIXIN\n          return '2d';\n          // #endif\n          // #ifndef MP-WEIXIN\n          return 'normal';\n          // #endif\n        }\n      },\n      /**\n       * 队列绘制，主要针对NVue端\n       */\n      queue: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * 是否队列加载图片，可减少canvas发起的网络资源请求，节省服务器资源\n       */\n      isQueueLoadImage: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * loading态\n       */\n      loading: {\n        type: Boolean,\n        default: undefined\n      },\n      /**\n       * H5保存即自动下载（在支持的环境下），默认false为仅弹层提示用户需要长按图片保存，不会自动下载\n       */\n      h5SaveIsDownload: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * H5下载名称\n       */\n      h5DownloadName: {\n        type: String,\n        default: 'uQRCode'\n      }\n    },\n    data() {\n      return {\n        canvas: undefined,\n        canvasType: undefined,\n        canvasContext: undefined,\n        makeDelegate: undefined,\n        drawDelegate: undefined,\n        toTempFilePathDelegate: undefined,\n        makeExecuted: false,\n        makeing: false,\n        drawing: false,\n        isError: false,\n        error: undefined,\n        isH5Save: false,\n        tempFilePath: '',\n        templateOptions: {\n          size: 0,\n          width: 0, // 组件宽度\n          height: 0,\n          canvasWidth: 0, // canvas宽度\n          canvasHeight: 0,\n          canvasTransform: '',\n          canvasDisplay: false\n        },\n        uqrcodeOptions: {\n          data: ''\n        },\n        plugins: [],\n        makeingPattern: [\n          [\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true]\n          ],\n          [\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, true, true, true, false, true, true, true],\n            [true, true, true, true, true, true, false, true, true, true],\n            [true, true, true, true, true, true, false, true, true, true]\n          ],\n          [\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, true, true, true, true, false, false, false],\n            [true, true, true, true, true, true, true, false, false, false],\n            [true, true, true, true, true, true, true, false, false, false],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true]\n          ],\n          [\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true]\n          ]\n        ]\n      };\n    },\n    watch: {\n      type: {\n        handler(val) {\n          const types = ['2d'];\n          if (types.includes(val)) {\n            this.canvasType = val;\n          } else {\n            this.canvasType = undefined;\n          }\n        },\n        immediate: true\n      },\n      value: {\n        handler() {\n          if (this.auto) {\n            this.remake();\n          }\n        }\n      },\n      size: {\n        handler() {\n          if (this.auto) {\n            this.remake();\n          }\n        }\n      },\n      options: {\n        handler() {\n          if (this.auto) {\n            this.remake();\n          }\n        },\n        deep: true\n      },\n      makeing: {\n        handler(val) {\n          if (!val) {\n            if (typeof this.toTempFilePathDelegate === 'function') {\n              this.toTempFilePathDelegate();\n            }\n          }\n        }\n      }\n    },\n    mounted() {\n      this.templateOptions.size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size;\n      this.templateOptions.width = this.templateOptions.size;\n      this.templateOptions.height = this.templateOptions.size;\n      this.templateOptions.canvasWidth = this.templateOptions.size;\n      this.templateOptions.canvasHeight = this.templateOptions.size;\n      if (this.canvasType == '2d') {\n        // #ifndef MP-WEIXIN\n        this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n        this.templateOptions.canvasHeight})`;\n        // #endif\n      } else {\n        this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n        this.templateOptions.canvasHeight})`;\n      }\n      if (this.start) {\n        this.make();\n      }\n    },\n    methods: {\n      /**\n       * 获取模板选项\n       */\n      getTemplateOptions() {\n        var size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size;\n        return deepReplace(this.templateOptions, {\n          size,\n          width: size,\n          height: size\n        });\n      },\n      /**\n       * 获取插件选项\n       */\n      getUqrcodeOptions() {\n        return deepReplace(this.options, {\n          data: String(this.value),\n          size: Number(this.templateOptions.size)\n        });\n      },\n      /**\n       * 重置画布\n       */\n      resetCanvas(callback) {\n        this.templateOptions.canvasDisplay = false;\n        this.$nextTick(() => {\n          this.templateOptions.canvasDisplay = true;\n          this.$nextTick(() => {\n            callback && callback();\n          });\n        });\n      },\n      /**\n       * 绘制二维码\n       */\n      async draw(callback = {}, isDrawDelegate = false) {\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        if (this.drawing) {\n          if (!isDrawDelegate) {\n            this.drawDelegate = () => {\n              this.draw(callback, true);\n            };\n            return;\n          }\n        } else {\n          this.drawing = true;\n        }\n\n        if (!this.canvasId) {\n          console.error('[uQRCode]: canvasId must be set!');\n          this.isError = true;\n          this.drawing = false;\n          callback.fail({\n            errMsg: '[uQRCode]: canvasId must be set!'\n          });\n          callback.complete({\n            errMsg: '[uQRCode]: canvasId must be set!'\n          });\n          return;\n        }\n        if (!this.value) {\n          console.error('[uQRCode]: value must be set!');\n          this.isError = true;\n          this.drawing = false;\n          callback.fail({\n            errMsg: '[uQRCode]: value must be set!'\n          });\n          callback.complete({\n            errMsg: '[uQRCode]: value must be set!'\n          });\n          return;\n        }\n\n        /* 组件数据 */\n        this.templateOptions = this.getTemplateOptions();\n        /* uQRCode选项 */\n        this.uqrcodeOptions = this.getUqrcodeOptions();\n        /* 纠错等级兼容字母写法 */\n        if (typeof this.uqrcodeOptions.errorCorrectLevel === 'string') {\n          this.uqrcodeOptions.errorCorrectLevel = UQRCode.errorCorrectLevel[this.uqrcodeOptions.errorCorrectLevel];\n        }\n        /* nvue不支持动态修改gcanvas尺寸，除nvue外，默认使用useDynamicSize */\n        // #ifndef APP-NVUE\n        if (typeof this.options.useDynamicSize === 'undefined') {\n          this.uqrcodeOptions.useDynamicSize = true;\n        }\n        // #endif\n        // #ifdef APP-NVUE\n        if (typeof this.options.useDynamicSize === 'undefined') {\n          this.uqrcodeOptions.useDynamicSize = false;\n        }\n        // if (typeof this.options.drawReserve === 'undefined') {\n        //   this.uqrcodeOptions.drawReserve = true;\n        // }\n        // #endif\n\n        /* 获取uQRCode实例 */\n        const qr = instance = new UQRCode();\n        /* 注册扩展 */\n        this.plugins.forEach(p => qr.register(p.plugin));\n        /* 设置uQRCode选项 */\n        qr.setOptions(this.uqrcodeOptions);\n        /* 调用制作二维码方法 */\n        qr.make();\n\n        /* 获取canvas上下文 */\n        let canvasContext = null;\n        // #ifndef APP-NVUE\n        if (this.canvasType === '2d') {\n          // #ifdef MP-WEIXIN\n          /* 微信小程序获取canvas2d上下文方式 */\n          const canvas = (this.canvas = await new Promise(resolve => {\n            uni\n              .createSelectorQuery()\n              .in(this) // 在组件内使用需要\n              .select(`#${this.canvasId}`)\n              .fields({\n                node: true,\n                size: true\n              })\n              .exec(res => {\n                resolve(res[0].node);\n              });\n          }));\n          canvasContext = this.canvasContext = canvas.getContext('2d');\n          /* 2d的组件设置宽高与实际canvas绘制宽高不是一个，打个比方，组件size=200，canvas.width设置为100，那么绘制出来就是100=200，组件size=400，canvas.width设置为800，绘制大小还是800=400，所以无需理会下方返回的dynamicSize是多少，按dpr重新赋值给canvas即可 */\n          this.templateOptions.canvasWidth = qr.size;\n          this.templateOptions.canvasHeight = qr.size;\n          this.templateOptions.canvasTransform = '';\n          /* 使用dynamicSize+scale，可以解决小块间出现白线问题，dpr可以解决模糊问题 */\n          const dpr = uni.getSystemInfoSync().pixelRatio;\n          canvas.width = qr.dynamicSize * dpr;\n          canvas.height = qr.dynamicSize * dpr;\n          canvasContext.scale(dpr, dpr);\n          /* 微信小程序获取图像方式 */\n          qr.loadImage = this.getLoadImage(function(src) {\n            /* 小程序下获取网络图片信息需先配置download域名白名单才能生效 */\n            return new Promise((resolve, reject) => {\n              const img = canvas.createImage();\n              img.src = src;\n              img.onload = () => {\n                resolve(img);\n              };\n              img.onerror = err => {\n                reject(err);\n              };\n            });\n          });\n          // #endif\n          // #ifndef MP-WEIXIN\n          /* 非微信小程序不支持2d，切换回uniapp获取canvas上下文方式 */\n          canvasContext = this.canvasContext = uni.createCanvasContext(this.canvasId, this);\n          /* 使用dynamicSize，可以解决小块间出现白线问题，再通过scale缩放至size，使其达到所设尺寸 */\n          this.templateOptions.canvasWidth = qr.dynamicSize;\n          this.templateOptions.canvasHeight = qr.dynamicSize;\n          this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n          this.templateOptions.canvasHeight})`;\n          /* uniapp获取图像方式 */\n          qr.loadImage = this.getLoadImage(function(src) {\n            return new Promise((resolve, reject) => {\n              if (src.startsWith('http')) {\n                uni.getImageInfo({\n                  src,\n                  success: res => {\n                    resolve(res.path);\n                  },\n                  fail: err => {\n                    reject(err);\n                  }\n                });\n              } else {\n                if (src.startsWith('.')) {\n                  console.error('[uQRCode]: 本地图片路径仅支持绝对路径！');\n                  throw new Error('[uQRCode]: local image path only supports absolute path!');\n                } else {\n                  resolve(src);\n                }\n              }\n            });\n          });\n          // #endif\n        } else {\n          /* uniapp获取canvas上下文方式 */\n          canvasContext = this.canvasContext = uni.createCanvasContext(this.canvasId, this);\n          /* 使用dynamicSize，可以解决小块间出现白线问题，再通过scale缩放至size，使其达到所设尺寸 */\n          this.templateOptions.canvasWidth = qr.dynamicSize;\n          this.templateOptions.canvasHeight = qr.dynamicSize;\n          this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n          this.templateOptions.canvasHeight})`;\n          /* uniapp获取图像方式 */\n          qr.loadImage = this.getLoadImage(function(src) {\n            return new Promise((resolve, reject) => {\n              /* getImageInfo在微信小程序的bug：本地路径返回路径会把开头的/或../移除，导致路径错误，解决方法：限制只能使用绝对路径 */\n              if (src.startsWith('http')) {\n                uni.getImageInfo({\n                  src,\n                  success: res => {\n                    resolve(res.path);\n                  },\n                  fail: err => {\n                    reject(err);\n                  }\n                });\n              } else {\n                if (src.startsWith('.')) {\n                  console.error('[uQRCode]: 本地图片路径仅支持绝对路径！');\n                  throw new Error('[uQRCode]: local image path only supports absolute path!');\n                } else {\n                  resolve(src);\n                }\n              }\n            });\n          });\n        }\n        // #endif\n        // #ifdef APP-NVUE\n        /* NVue获取canvas上下文方式 */\n        const gcanvas = this.$refs['gcanvas'];\n        const canvas = enable(gcanvas, {\n          bridge: WeexBridge\n        });\n        canvasContext = this.canvasContext = canvas.getContext('2d');\n        /* NVue获取图像方式 */\n        qr.loadImage = this.getLoadImage(function(src) {\n          return new Promise((resolve, reject) => {\n            /* getImageInfo在nvue的bug：获取同一个路径的图片信息，同一时间第一次获取成功，后续失败，猜测是写入本地时产生文件写入冲突，所以没有返回，特别是对于网络资源 --- 已实现队列绘制，已解决此问题 */\n            if (src.startsWith('.')) {\n              console.error('[uQRCode]: 本地图片路径仅支持绝对路径！');\n              throw new Error('[uQRCode]: local image path only supports absolute path!');\n            } else {\n              uni.getImageInfo({\n                src,\n                success: res => {\n                  resolve(res.path);\n                },\n                fail: err => {\n                  reject(err);\n                }\n              });\n            }\n          });\n        });\n        // #endif\n\n        /* 设置uQRCode实例的canvas上下文 */\n        qr.canvasContext = canvasContext;\n        /* 延时等待页面重新绘制完毕 */\n        setTimeout(() => {\n          /* 从插件获取具体要调用哪一个扩展函数 */\n          var plugin = this.plugins.find(p => p.name == qr.style);\n          var drawCanvasName = plugin ? plugin.drawCanvas : 'drawCanvas';\n          /* 虽然qr[drawCanvasName]是直接返回Promise的，但由于js内部this指向问题，故不能直接exec(qr[drawCanvasName])此方式执行，需要改成exec(() => qr[drawCanvasName]())才能正确获取this */\n          var drawCanvas;\n          if (this.queue) {\n            drawCanvas = () => queueDraw.exec(() => qr[drawCanvasName]());\n            // drawCanvas = () => queueDraw.exec(() => new Promise((resolve, reject) => {\n            //   setTimeout(() => {\n            //     qr[drawCanvasName]().then(resolve).catch(reject);\n            //   }, 1000);\n            // }));\n          } else {\n            drawCanvas = () => qr[drawCanvasName]();\n          }\n          /* 调用绘制方法将二维码图案绘制到canvas上 */\n          drawCanvas()\n            .then(() => {\n              if (this.drawDelegate) {\n                /* 高频重绘纠正 */\n                let delegate = this.drawDelegate;\n                this.drawDelegate = undefined;\n                delegate();\n              } else {\n                this.drawing = false;\n                callback.success();\n              }\n            })\n            .catch(err => {\n              console.log(err);\n              if (this.drawDelegate) {\n                /* 高频重绘纠正 */\n                let delegate = this.drawDelegate;\n                this.drawDelegate = undefined;\n                delegate();\n              } else {\n                this.drawing = false;\n                this.isError = true;\n                callback.fail(err);\n              }\n            })\n            .finally(() => {\n              callback.complete();\n            });\n        }, 300);\n      },\n      /**\n       * 生成二维码\n       */\n      make(callback = {}) {\n        this.makeExecuted = true;\n        this.makeing = true;\n        this.isError = false;\n\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        this.resetCanvas(() => {\n          clearTimeout(this.makeDelegate);\n          this.makeDelegate = setTimeout(() => {\n            this.draw({\n              success: () => {\n                setTimeout(() => {\n                  callback.success();\n                  this.complete(true);\n                }, 300);\n              },\n              fail: err => {\n                callback.fail(err);\n                this.error = err;\n                this.complete(false, err.errMsg);\n              },\n              complete: () => {\n                callback.complete();\n                this.makeing = false;\n              }\n            });\n          }, 300);\n        });\n      },\n      /**\n       * 重新生成\n       */\n      remake(callback) {\n        this.$emit('change');\n        this.make(callback);\n      },\n      /**\n       * 生成完成\n       */\n      complete(success = true, errMsg = '') {\n        if (success) {\n          this.$emit('complete', {\n            success\n          });\n        } else {\n          this.$emit('complete', {\n            success,\n            errMsg\n          });\n        }\n      },\n      /**\n       * 导出临时路径\n       */\n      toTempFilePath(callback = {}) {\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        if (!this.makeExecuted) {\n          console.error('[uQRCode]: make() 方法从未调用！请先成功调用 make() 后再进行操作。');\n          var err = {\n            errMsg: '[uQRCode]: make() method has never been executed! please execute make() successfully before operating.'\n          };\n          callback.fail(err);\n          callback.complete(err);\n          return;\n        }\n\n        if (this.isError) {\n          callback.fail(this.error);\n          callback.complete(this.error);\n          return;\n        }\n\n        if (this.makeing) {\n          /* 如果还在生成状态，那当前操作将托管到委托，监听生成完成后再通过委托复调当前方法 */\n          this.toTempFilePathDelegate = () => {\n            this.toTempFilePath(callback);\n          };\n          return;\n        } else {\n          this.toTempFilePathDelegate = null;\n        }\n\n        // #ifndef APP-NVUE\n        if (this.canvasType === '2d') {\n          // #ifdef MP-WEIXIN\n          try {\n            let dataURL = null;\n            // #ifdef VUE3\n            dataURL = toRaw(this.canvas)\n              .toDataURL();\n            // #endif\n            // #ifndef VUE3\n            dataURL = this.canvas.toDataURL();\n            // #endif\n            callback.success({\n              tempFilePath: dataURL\n            });\n            callback.complete({\n              tempFilePath: dataURL\n            });\n          } catch (e) {\n            callback.fail(e);\n            callback.complete(e);\n          }\n          // #endif\n        } else {\n          uni.canvasToTempFilePath({\n              canvasId: this.canvasId,\n              fileType: this.fileType,\n              width: Number(this.templateOptions.canvasWidth),\n              height: Number(this.templateOptions.canvasHeight),\n              destWidth: Number(this.templateOptions.size),\n              destHeight: Number(this.templateOptions.size),\n              success: res => {\n                callback.success(res);\n              },\n              fail: err => {\n                callback.fail(err);\n              },\n              complete: () => {\n                callback.complete();\n              }\n            },\n            this\n          );\n        }\n        // #endif\n        // #ifdef APP-NVUE\n        const dpr = uni.getSystemInfoSync().pixelRatio;\n        this.canvasContext.toTempFilePath(\n          0,\n          0,\n          this.templateOptions.canvasWidth * dpr,\n          this.templateOptions.canvasHeight * dpr,\n          this.templateOptions.size * dpr,\n          this.templateOptions.size * dpr,\n          '',\n          1,\n          res => {\n            callback.success(res);\n            callback.complete(res);\n          }\n        );\n        // #endif\n      },\n      /**\n       * 保存\n       */\n      save(callback = {}) {\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        this.toTempFilePath({\n          success: res => {\n            // #ifndef H5\n            if (this.canvasType === '2d') {\n              // #ifdef MP-WEIXIN\n              /* 需要将 data:image/png;base64, 这段去除 writeFile 才能正常打开文件，否则是损坏文件，无法打开 */\n              const reg = new RegExp('^data:image/png;base64,', 'g');\n              const dataURL = res.tempFilePath.replace(reg, '');\n              const fs = wx.getFileSystemManager();\n              const tempFilePath = `${wx.env.USER_DATA_PATH}/${new Date().getTime()}${\n                Math.random()\n                  .toString()\n                  .split('.')[1]\n              }.png`;\n              fs.writeFile({\n                filePath: tempFilePath, // 要写入的文件路径 (本地路径)\n                data: dataURL, // base64图片\n                encoding: 'base64',\n                success: res1 => {\n                  uni.saveImageToPhotosAlbum({\n                    filePath: tempFilePath,\n                    success: res2 => {\n                      callback.success(res2);\n                    },\n                    fail: err2 => {\n                      callback.fail(err2);\n                    },\n                    complete: () => {\n                      callback.complete();\n                    }\n                  });\n                },\n                fail: err => {\n                  callback.fail(err);\n                },\n                complete: () => {\n                  callback.complete();\n                }\n              });\n              // #endif\n            } else {\n              uni.saveImageToPhotosAlbum({\n                filePath: res.tempFilePath,\n                success: res1 => {\n                  callback.success(res1);\n                },\n                fail: err1 => {\n                  callback.fail(err1);\n                },\n                complete: () => {\n                  callback.complete();\n                }\n              });\n            }\n            // #endif\n\n            // #ifdef H5\n            /* 可以在电脑浏览器下载，移动端iOS不行，安卓微信浏览器不行，安卓外部浏览器可以 */\n            this.isH5Save = true;\n            this.tempFilePath = res.tempFilePath;\n            if (this.h5SaveIsDownload) {\n              const aEle = document.createElement('a');\n              aEle.download = this.h5DownloadName; // 设置下载的文件名，默认是'下载'\n              aEle.href = res.tempFilePath;\n              document.body.appendChild(aEle);\n              aEle.click();\n              aEle.remove(); // 下载之后把创建的元素删除\n            }\n            callback.success({\n              errMsg: 'ok'\n            });\n            callback.complete({\n              errMsg: 'ok'\n            });\n            // #endif\n          },\n          fail: err => {\n            callback.fail(err);\n            callback.complete(err);\n          }\n        });\n      },\n      /**\n       * 注册click事件\n       */\n      onClick(e) {\n        this.$emit('click', e);\n      },\n      /**\n       * 获取实例\n       */\n      getInstance() {\n        return instance;\n      },\n      /**\n       * 注册扩展，组件仅支持注册type为style的drawCanvas扩展\n       * @param {Object} plugin\n       */\n      registerStyle(plugin) {\n        if (plugin.Type != 'style') {\n          console.warn('[uQRCode]: registerStyle 仅支持注册 style 类型的扩展！');\n          return {\n            errMsg: 'registerStyle 仅支持注册 style 类型的扩展！'\n          };\n        }\n        if (typeof plugin === 'function') {\n          this.plugins.push({\n            plugin,\n            name: plugin.Name,\n            drawCanvas: plugin.DrawCanvas\n          });\n        }\n      },\n      getLoadImage(loadImage) {\n        var that = this;\n        if (typeof loadImage == 'function') {\n          return function(src) {\n            /* 判断是否是队列加载图片的 */\n            if (that.isQueueLoadImage) {\n              /* 解决iOS APP||NVUE同时绘制多个二维码导致图片丢失需使用队列 */\n              return queueLoadImage.exec(() => {\n                return new Promise((resolve, reject) => {\n                  setTimeout(() => {\n                    const cache = cacheImageList.find(x => x.src == src);\n                    if (cache) {\n                      resolve(cache.img);\n                    } else {\n                      loadImage(src)\n                        .then(img => {\n                          cacheImageList.push({\n                            src,\n                            img\n                          });\n                          resolve(img);\n                        })\n                        .catch(err => {\n                          reject(err);\n                        });\n                    }\n                  }, 10);\n                });\n              });\n            } else {\n              return loadImage(src);\n            }\n          };\n        } else {\n          return function(src) {\n            return Promise.resolve(src);\n          };\n        }\n      }\n    }\n  };\n\n  /**\n   * 对象属性深度替换\n   * @param {Object} o 原始对象/默认对象/被替换的对象\n   * @param {Object} r 从这个对象里取值替换到o对象里\n   * @return {Object} 替换后的新对象\n   */\n  function deepReplace(o = {}, r = {}, c = false) {\n    let obj;\n    if (c) {\n      // 从源替换\n      obj = o;\n    } else {\n      // 不替换源，copy一份备份来替换\n      obj = {\n        ...o\n      };\n    }\n    for (let k in r) {\n      var vr = r[k];\n      if (vr != undefined) {\n        if (vr.constructor == Object) {\n          obj[k] = this.deepReplace(obj[k], vr);\n        } else if (vr.constructor == String && !vr) {\n          obj[k] = obj[k];\n        } else {\n          obj[k] = vr;\n        }\n      }\n    }\n    return obj;\n  }\n</script>\n\n<style scoped>\n  .uqrcode {\n    position: relative;\n  }\n\n  .uqrcode-hide {\n    position: fixed;\n    left: 7500rpx;\n  }\n\n  .uqrcode-canvas {\n    transform-origin: top left;\n  }\n\n  .uqrcode-makeing {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 10;\n    /* #ifndef APP-NVUE */\n    display: flex;\n    /* #endif */\n    justify-content: center;\n    align-items: center;\n  }\n\n  .uqrcode-makeing-image {\n    /* #ifndef APP-NVUE */\n    display: block;\n    max-width: 120px;\n    max-height: 120px;\n    /* #endif */\n  }\n\n  .uqrcode-error {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    /* #ifndef APP-NVUE */\n    display: flex;\n    /* #endif */\n    justify-content: center;\n    align-items: center;\n  }\n\n  .uqrcode-error-message {\n    font-size: 12px;\n    color: #939291;\n  }\n\n  /* #ifdef H5 */\n  .uqrcode-h5-save {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 100;\n    background-color: rgba(0, 0, 0, 0.68);\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n\n  .uqrcode-h5-save-image {\n    width: 512rpx;\n    height: 512rpx;\n    padding: 32rpx;\n  }\n\n  .uqrcode-h5-save-text {\n    margin-top: 20rpx;\n    font-size: 32rpx;\n    font-weight: 700;\n    color: #ffffff;\n  }\n\n  .uqrcode-h5-save-close {\n    position: relative;\n    margin-top: 72rpx;\n    width: 60rpx;\n    height: 60rpx;\n    border: 2rpx solid #ffffff;\n    border-radius: 60rpx;\n    padding: 10rpx;\n  }\n\n  .uqrcode-h5-save-close-before {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%) rotate(45deg);\n    width: 40rpx;\n    height: 4rpx;\n    background: #ffffff;\n  }\n\n  .uqrcode-h5-save-close-after {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%) rotate(-45deg);\n    width: 40rpx;\n    height: 4rpx;\n    background: #ffffff;\n  }\n\n  /* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/components/uqrcode/uqrcode.vue",
    "content": "<template>\n  <view class=\"uqrcode\" :class=\"{ 'uqrcode-hide': hide }\" :style=\"{ width: `${templateOptions.width}px`, height: `${templateOptions.height}px` }\">\n    <view class=\"uqrcode-canvas-wrapper\">\n      <!-- 画布 -->\n      <!-- #ifndef APP-NVUE -->\n      <canvas class=\"uqrcode-canvas\" :id=\"canvasId\" :canvas-id=\"canvasId\" :type=\"canvasType\" :style=\"{\n          width: `${templateOptions.canvasWidth}px`,\n          height: `${templateOptions.canvasHeight}px`,\n          transform: templateOptions.canvasTransform\n        }\" v-if=\"templateOptions.canvasDisplay\" @click=\"onClick\"></canvas>\n      <!-- #endif -->\n\n      <!-- nvue用gcanvas -->\n      <!-- #ifdef APP-NVUE -->\n      <gcanvas class=\"uqrcode-canvas\" ref=\"gcanvas\" :style=\"{\n          width: `${templateOptions.canvasWidth}px`,\n          height: `${templateOptions.canvasHeight}px`\n        }\" v-if=\"templateOptions.canvasDisplay\" @click=\"onClick\"></gcanvas>\n      <!-- #endif -->\n    </view>\n\n    <!-- 加载效果 -->\n    <view class=\"uqrcode-makeing\" v-if=\"loading === undefined ? makeing : loading\">\n      <slot name=\"loading\">\n        <image class=\"uqrcode-makeing-image\" :style=\"{ width: `${templateOptions.size / 4}px`, height: `${templateOptions.size / 4}px` }\"\n          src=\"data:image/gif;base64,R0lGODlhAAEAAfIEAOHh4SSsWuDg4N3d3f///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDYuMC1jMDAyIDc5LjE2NDQ4OCwgMjAyMC8wNy8xMC0yMjowNjo1MyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjAyODhGMzM4RDEwMTExRUM4MDhCRkVBQkE2QUZDQzkwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjAyODhGMzM5RDEwMTExRUM4MDhCRkVBQkE2QUZDQzkwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4OEYzMzZEMTAxMTFFQzgwOEJGRUFCQTZBRkNDOTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDI4OEYzMzdEMTAxMTFFQzgwOEJGRUFCQTZBRkNDOTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQFFAAEACwAAAAAAAEAAQAD/0i63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2Kx2y+16v+CweEwum8/otHrNbrvf8Lh8Tq/b7/i8fs/v+/+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanigCqq6ytrieusbISAbW2t7i5uru8vb66bLLCrLDDw7S/ycrLzLXBxsLF0LHIzdbXzc/Trybb1BHY4eK92t6r0uaq1ePs4+Xp6PDg7fTh7+bx+PP1/Mz33vkA7utH0Ne/bQERDizIMNfBaQkhLmxIMcBDaBExTqzI8P+isYwfN3Ik6PFYt3TnRI7kVzLaSZQA1q0s2HLWS5QyZ/ar+a0ETHUqdbLjyc3nz5xC6RFtBdIkhKQ01/yMeVPeU6g7pR6tqu8q1npLiXEV6PVru7ApjcJEquyEPa1rxyosm83EWzVTm7qk688uNrRA1eIMatDvNcBUBVt9cJdEYzR55Urku8ztX7iDFXdlfLnE4zORNZPlfNiwNcR6bVJua7ou3q2i55I+3brv67ixJ8927bhzmtAkgDv4HIJ4GeEikDMw/oH5GOUgoCtw3oF6GOkesFvfsP0L9g7afY/o7uU7h/ClPYsHDTt4++Hri8c//j55/eXzm+d/fj96/+n/+1UX4HX/ZVcgeRggyIV5G6BHmycMauAgb5xEmMGEtnViIQYYVvbJhhd0yBqEBYJ34ICUgGiBiMmAomIFLP7iYonnnZiehjQ2aOODOE7l449MERbVai1iBuSRO67EVpG3IenkYvDptKSMRj5pZUhENjRlYU1e6aVqu420JTlVfmlmYGFyNCYviJ2ZWZoVrblLm25uFuVMcgJTZp1X5gmWkGzuyeeTfioF6JyCDopkoWcdqmeXilrJ6FCOOpRopD9O6k6luNCJ6V5wUqSpRZd+mqSYnN7iqalFhaplqrasyqpYWXYEqzOlzmpnA0mNKquuiblqa61kQgrsqWreSqqx/8e+eaeSyqIi7bTUVmvttdhmq+223Hbr7bejCCDuuOSWa+656Kar7rrnSjDAu/DGK++89NZr77340vsru/z2224E+QYs8MAEw7uvvwj3627BDDfM8MEJR5zuwg5XbHG9EEusMbkUX+zxxRlvvHHHH5f8cK4ip+wvySa3HHDIKifMsss0Y4xyzDijO3PNPBt8c85Aj7tzzzzDHPS6QxNNs9FHTwyw0lAPwHTT/0IQNdRTU11u0ld/nLXWQj/dddE/g50y12Nb/LXZaKft8Npgt+32ycyafbTccxMMt9Z45y3w3lT37Xe+qEnGruDxzihxalU/ULHiETNuLuI+k7i44f9Ii013j5Fjri7l70Ius+dOW/32hxpLvrXmBYuOsOocs6436pfndrjsA7u+Muk64/437Z3bnrnpDeuuMO+NO/A48KML/7nvLzP/OvKTQ0+49Ls7X7rjp1sevHu1c1889sdr3zvxm1eYOvWro986+fzCHrb7s3vfPPjfK9895/ePMLL1+DKe3c6Hv/fZb4DPM5++4IfA9hWwfvxrIAH9tz/1STCBD8wdAy8oNfYlboMXlF/oQChBEXbwgByMnQLnJcAUmrCFHDTh4FhYNrZ5cIY2q5sLb4hDGuowhjzs4Qd/GMIgCnGERCyhEY8IOAxS8IgVZE8Kk2cfKI4viQ2UIRPAaxi3JQqxiXcDoBXtVbgVOlB/YzTgb9ZnRhWKL40axCIVQ/A/+sExgFwU1wvFeMchrjF8T8xfA/oYxz8Kko5sfCMh71XGDJZPkYvMoSH7V8VDLiCS15Nj9do4P0hiUl6NDCQlGfBJRoLrlKhMpSpXycpWuvKVsIylLGdJy1ra8pa4zKUud8nLXvryl8AMpjCHScxiGvOYyEymMpfJzGY685nQjKY0p0nNalrzmtjMpja3yc1uevOb4AynOMdJhwQAACH5BAUUAAQALDIAMgCcAJwAAAP/KLrcTjDKSWt0OFsIuv9gKI5kaZ6Ztq1s6iorKs90/apsTt1pbP/AIA+mK16Gj41wyWwan8ikpUmtRp/GaMNn7Xq3WJ2Wwf2arWHxmDg9u6np3JpdeduX8da8fO8j83xXSn6EQ4CDa4GFi2CHO3uIjJJkjo+JkZOTlZZjipmFmxNzAp6ffqESo6Wmd6hHl22sjK4ckLGyoLSqmLh9tAS7t72+urZ1QL+LycacNcuEz528M9HErsHHP9WtxbDZNtt24YbTMuNu5zerJulm7S7rJe9e8zjfzt2n+VrxJPVo+wQJo/GvSsFG9wgGFLeQ3EBqDdFFVFcOxUEnE1/0G3GR/0lHOs0UXss10ltIiCX1peRX8cRHIS83iniJLVRNUcgyfonZkp1Oej/tnTT3K87NSkdfgSuaJukhp8ByMsUCNQ/UIFPDVDXKDKe2rFC6IhWrFB/YIlubkq319awak5uuSnWrB+5Yu2VF0pUpBZXctnt7jhqMl63KhMMIU3z4hm9ixY4xMn6sGENkj4IpVyaVuctlzdImn/kMWiDixp1L/z08VPVm0lhTuw59WqLo2YNhz22NO7dsOL9789ANmLfwwlGhBT8Obzke58wtQ499O/qf6bu9WvddHWj37RqxF9cOHrky8ZvTs/wOkH2IwPDjy59Pv779+/jz69/Pv7////8ABijggAQWaOCBCCao4FQDNOjggxBGKOGEFFZooYQrBKDhhhx26OGHIIYo4ogfXmjiiSim6GCGJLbo4oswaqjijDTSyGKMOOYYY4089ljhjToGKWSJPhZpJJBDJimkkUz2iKSSUO7Y5JQqPhnllSRSqeWJVmLpJZFbhjlhl1+WKaOYaEJIpplfpulmg2uyieWbbsYpZ5R0pmnnnUrmieaefA7pp5iABhrkoGEWamiOiG6p6KJSNjrlo5C+KCmVlFba4qWTbqCpl5w2memnIvLIkwVB6mdqUBh6qqOqNZ5aQar5rbpSiqMGAKuNrEaY664zykoBrfjZ6lesruYIbJX/vaqZLI7L4trsg7/WiuytKFZb7LXH8orqq9Z6222wz8YYbbbTrlgujOdymS6c677YronCTkDsfcbaxO2w4G4rrr7/2tsvvvvGVbAE99qXr8EBIzywwgc7srDDyoZLLrbufluxv6EOUFTC9XWsLi0g0ycyvCQ/HPLJH6tsMsu/lDzfyR7H7PLMMKe8McEit7wzxD3b/PPKQesMrcWh+kxqnzm7sjSeTaPyNJQ0Kz31oVGHcnWSVQu9tY5dG/01jmE7PTbYWW9yNtpFm712pDQ3HMHbZEf8lN0E0A03sxjTG6/eIU4sMd6AW4q3VYQXvunhXMkNgeKLOw6I4I9DPiLlGZMnbnngjKsl+ealdq6V5qB7iDnin5f+YQIAIfkEBRQABAAsMgAyAJwAnAAAA/84utxOMMpJa3Q4Wyi6/2AojmRpnpm2rWzqKisqz3T9qmxO3Wls/8AgD6YrXoaPjXDJbBqfyKSlSa1Gn8Zow2fterdYnZbB/ZqtYfGYOD27qencml1525fx1rx87yPzfFdKfoRDgINrgYWLYIc7e4iMkmSOj4mRk5OVlmOKmYWbE3MDnp9+oRKjpaZ3qEeXbayMrhyQsbKgtKqYuH20BLu3vb66tnVAv4vJxpw1y4TPnbwz0cSuwcc/1a3FsNk223bhhtMy427nN6sm6WbtLusl717zON/O3af5WvEk9Wj7BAmj8a9KwUb3CAYUt5DcQGoN0UVUVw7FQScTX/QbcZH/SUc6zRReyzXSW0iIJfWl5FfxxEchLzeKeIktVE1RyDJ+idmSnU56P+2dNPcrzs1KR1+BK5om6SGnwHIyxQI1D9QgU8NUNcoMp7asULoiFasUH9giW5uSrfX1rBqTm65KdasH7li7ZUXSlSkFldy2e3uOGoyXrcqEwwhTfPiGb2LFjjEyfqwYQ2SPgilXJpW5y2XN0iaf+QxaIOLGnUv/PTxU9WbSWFO7Dn1aoujZg2HPbY07t2w4v3vz0A2Yt/DCUaEFPw5vOR7nzC1Dj307+p/pu71a910daPftGrEX1w4euTLxm9Oz/A6QfYjA8OPLn0+/vv37+PPr38+/v////wAGKOCABBZo4IEIJqjgVAE06OCDEEYo4YQUVmihhMQBoOGGHHbo4YcghsjhhSSWaOKJDmYo4oostqghijDGGKOKLtZo44sy5qgjhTTe6OOKOwYpZAA9/mikh0MmKWORRzYJgJJQnsikk0ZGaeWFU1Lp45VcTpilljZ2KeaDX4Lp4pholmkmi2iOqeaaIrYp5ptwgihnl3TWieSdV+ap54h8WunnnzgGCuWghBoaJaJ/KnooeoTW6KiSjOo5aZKV1pnjL5tCp1+nroBaG4ufLkmLqMaJWOqMp5rqXoerwsipq6OuGCuKs7L6Koe3StmqrrWqmh+qmxCbipG9mpirrP+eDktrKMbmVWOyJS6La7P4RXuItsn5SC2J1vq664bfYvkrs+NqWK6F4SqL7X3c5sHtketW2G6179oXbxzzIusssNA+S56N9fJ47rXpAlCwlweLG2yIC7fJU7aXkhnUhxGnebGHGbu5Maz/Vkzkx7yGXPHE8IrcIMr6qjzySgSbfCnL9bn8sl/+UqwyTZHeaDPPPUvqMtBBt/gzyUVvOTTSSYe5NMxNr3k01FGDOTXOVWv6NNZZS721TV3DaXO/YZu5bxpkl63l2WGkrbaTbGPh9ttHxv3E3HT/aLcReOfts8CV9O230AAXC7i0gxOOLiqCJ87m4dtC3q3jThceuOQElP+YAAAh+QQFFAAEACwyADIAnACcAAAD/xi63E4wyklrdDhbOLr/YCiOZGmKWcpsbEuoMHvOdG17sOruVJ7Kt6Aw6NPwjq/iYzNsOkvKJXIXbQCfWGx1NaVuFdesWPgFd13lQHjMpqXP6PK6TSe94ay7pc6HyvEbehV9hCGCgBOHE4WMHYqIEI8RjYySiJYElIWYeJiahJxwnp98oWejpHSmXaipbKtTra5isEiys1p/kIm6g7hjtUe3v03BPMM0uxTFvcpJX3M1zhLM0NORzYtD1xxDxl7We9vc1Vvcz+ZM49flVefIM+ftUe/Z1OvT80r14b5C8t7sQYJ3AiAZgZcQZsLnTF8RfunE/SMXsJ8zgiYMElHYSf9hE403vsWxqG0iu4oRp2EsAdKGyBYrSbSs8TKPR4bKHPqA6E6dyXwoe16LOWKmG46ibv5sGJQeN6IijM6oGUhpkHMdSe6CGgJrUq0Drd7wegppWbDdlpIFl/KiWBtrY5ll9VZaXGFz5aJdqPZu1b1Z25a86petUJV1kxUeKXhr4niLYaaZTFmKP03RjlbePDkzIc8nOIt+3Ae0idGonUrE7HNj6tc6WlMy7Qe2bcvLSNG2c7v3gt1tgKPw7Vv4GOMgiBeX3Qj5B+W9nWOR7gi6bepOsFu/zpyR9u2vsX/srhn8aPE47x00f578Z/eh2bdfPRv+afmi0fed1BQ/VzH/3/lXmX6E0eeSgAPaV0eACP6XBXaRRSjhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiimQB4OKLMMYo44w01mjjjTMSKMCOPPbo449ABinkkDgWaeSROOpI5JJMNonkk1BGqaSTVFYZ5ZVY3jillVx2meWXSG7p5Zhkgmmmi2KWqeaZbBqZ5ppwtilnjG/GaeecbNZ55554Yqknn4D2eeSfgRYqaI2EGqrooS8muiijkDr6KKSCSjoppXNaeimmeSq46aec2qgpqKH66SmpqJYKwKipqjroqa3yKVWSsP64oaknSVmrj7deOauWu/bYq665QgmhhrgCRexl/1UOayxFy+bGpbNP/ipqsDxSGya0zxropLavFlsttjuC6ya343rbpLlFWosouQKwS6u426rLpLzA0hsus1Tie62+59q7pL/vAtwuvATT6K7CCCPrK7r18vutw9Hm9LDARCacI8T7SmulxjIuvDHGQ4JMJ8cBS7wuxa6GjPK9LLcMo8i2xiwzmi8PbPPNNPO6s8w9C/tzy0FnO7SrRZd7tKpJx7t0qU2bzGjUT4fadKxYn2xw1lwfvHXXYDP8ddhkN5pz2WhfjTbQZ68dttpuM9123De7PDbddZvJatZUk4x3xbsk6/Hfa/atMuGCWww4f4gXPrfYhzferbKTDy554hmBXxz55R0rXvlgnGvO1OJphS665+luTncCADs=\">\n        </image>\n      </slot>\n    </view>\n\n    <!-- 错误处理 -->\n    <view class=\"uqrcode-error\" v-if=\"isError\" @click=\"onClick\">\n      <slot name=\"error\" :error=\"error\">\n        <text class=\"uqrcode-error-message\">{{ error.errMsg }}</text>\n      </slot>\n    </view>\n\n    <!-- H5保存提示 -->\n    <!-- #ifdef H5 -->\n    <view class=\"uqrcode-h5-save\" v-if=\"isH5Save\">\n      <slot name=\"h5save\" :tempFilePath=\"tempFilePath\">\n        <image class=\"uqrcode-h5-save-image\" :src=\"tempFilePath\"></image>\n        <text class=\"uqrcode-h5-save-text\">{{ h5SaveIsDownload ? '若保存失败，' : '' }}请长按二维码进行保存</text>\n      </slot>\n      <view class=\"uqrcode-h5-save-close\" @click.stop=\"isH5Save = false\">\n        <view class=\"uqrcode-h5-save-close-before\"></view>\n        <view class=\"uqrcode-h5-save-close-after\"></view>\n      </view>\n    </view>\n    <!-- #endif -->\n  </view>\n</template>\n\n<script>\n  // #ifdef VUE3\n  import {\n    toRaw\n  } from 'vue';\n  // #endif\n\n  /* 引入uQRCode核心js */\n  import UQRCode from '../../js_sdk/uqrcode/uqrcode';\n\n  /* 引入nvue所需模块 */\n  // #ifdef APP-NVUE\n  import {\n    enable,\n    WeexBridge\n  } from '../../js_sdk/gcanvas';\n  const modal = weex.requireModule('modal');\n  // #endif\n\n  /* 引入队列 */\n  import {\n    queueDraw,\n    queueLoadImage\n  } from '../../common/queue';\n  /* 引入缓存图片 */\n  import {\n    cacheImageList\n  } from '../../common/cache';\n\n  let instance = null;\n\n  export default {\n    name: 'uqrcode',\n    props: {\n      /**\n       * canvas组件id\n       */\n      canvasId: {\n        type: String,\n        required: true // canvasId在微信小程序初始值不能为空，created中赋值也不行，必须给一个值，否则挂载组件后无法绘制。不考虑用随机id，uuid\n      },\n      /**\n       * 二维码内容\n       */\n      value: {\n        type: [String, Number]\n      },\n      /**\n       * 选项\n       */\n      options: {\n        type: Object,\n        default: () => {\n          return {};\n        }\n      },\n      /**\n       * 二维码大小\n       */\n      size: {\n        type: [String, Number],\n        default: 200\n      },\n      /**\n       * 二维码尺寸单位\n       */\n      sizeUnit: {\n        type: String,\n        default: 'px'\n      },\n      /**\n       * 导出的文件类型\n       */\n      fileType: {\n        type: String,\n        default: 'png'\n      },\n      /**\n       * 是否初始化组件后就开始生成\n       */\n      start: {\n        type: Boolean,\n        default: true\n      },\n      /**\n       * 是否数据发生改变自动重绘\n       */\n      auto: {\n        type: Boolean,\n        default: true\n      },\n      /**\n       * 隐藏组件\n       */\n      hide: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * canvas 类型，微信小程序默认使用2d，非2d微信官方已放弃维护，问题比较多\n       * 注意：微信小程序type2d手机上正常，PC上微信内打开小程序toDataURL报错，看后期微信官方团队会不会做兼容，不兼容的话只能在自行判断在PC使用非2d，或者直接提示用户请在手机上操作，微信团队的海报中心小程序就是这么做的\n       */\n      type: {\n        type: String,\n        default: () => {\n          // #ifdef MP-WEIXIN\n          return '2d';\n          // #endif\n          // #ifndef MP-WEIXIN\n          return 'normal';\n          // #endif\n        }\n      },\n      /**\n       * 队列绘制，主要针对NVue端\n       */\n      queue: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * 是否队列加载图片，可减少canvas发起的网络资源请求，节省服务器资源\n       */\n      isQueueLoadImage: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * loading态\n       */\n      loading: {\n        type: Boolean,\n        default: undefined\n      },\n      /**\n       * H5保存即自动下载（在支持的环境下），默认false为仅弹层提示用户需要长按图片保存，不会自动下载\n       */\n      h5SaveIsDownload: {\n        type: Boolean,\n        default: false\n      },\n      /**\n       * H5下载名称\n       */\n      h5DownloadName: {\n        type: String,\n        default: 'uQRCode'\n      }\n    },\n    data() {\n      return {\n        canvas: undefined,\n        canvasType: undefined,\n        canvasContext: undefined,\n        makeDelegate: undefined,\n        drawDelegate: undefined,\n        toTempFilePathDelegate: undefined,\n        makeExecuted: false,\n        makeing: false,\n        drawing: false,\n        isError: false,\n        error: undefined,\n        isH5Save: false,\n        tempFilePath: '',\n        templateOptions: {\n          size: 0,\n          width: 0, // 组件宽度\n          height: 0,\n          canvasWidth: 0, // canvas宽度\n          canvasHeight: 0,\n          canvasTransform: '',\n          canvasDisplay: false\n        },\n        uqrcodeOptions: {\n          data: ''\n        },\n        plugins: [],\n        makeingPattern: [\n          [\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true]\n          ],\n          [\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, true, true, true, false, true, true, true],\n            [true, true, true, true, true, true, false, true, true, true],\n            [true, true, true, true, true, true, false, true, true, true]\n          ],\n          [\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, true, true, true, true, false, false, false],\n            [true, true, true, true, true, true, true, false, false, false],\n            [true, true, true, true, true, true, true, false, false, false],\n            [true, true, true, false, false, false, false, true, true, true],\n            [true, true, true, false, false, false, false, true, true, true]\n          ],\n          [\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, false, false, false, false, false, false, false],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true],\n            [true, true, true, true, true, true, true, true, true, true]\n          ]\n        ]\n      };\n    },\n    watch: {\n      type: {\n        handler(val) {\n          const types = ['2d'];\n          if (types.includes(val)) {\n            this.canvasType = val;\n          } else {\n            this.canvasType = undefined;\n          }\n        },\n        immediate: true\n      },\n      value: {\n        handler() {\n          if (this.auto) {\n            this.remake();\n          }\n        }\n      },\n      size: {\n        handler() {\n          if (this.auto) {\n            this.remake();\n          }\n        }\n      },\n      options: {\n        handler() {\n          if (this.auto) {\n            this.remake();\n          }\n        },\n        deep: true\n      },\n      makeing: {\n        handler(val) {\n          if (!val) {\n            if (typeof this.toTempFilePathDelegate === 'function') {\n              this.toTempFilePathDelegate();\n            }\n          }\n        }\n      }\n    },\n    mounted() {\n      this.templateOptions.size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size;\n      this.templateOptions.width = this.templateOptions.size;\n      this.templateOptions.height = this.templateOptions.size;\n      this.templateOptions.canvasWidth = this.templateOptions.size;\n      this.templateOptions.canvasHeight = this.templateOptions.size;\n      if (this.canvasType == '2d') {\n        // #ifndef MP-WEIXIN\n        this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n        this.templateOptions.canvasHeight})`;\n        // #endif\n      } else {\n        this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n        this.templateOptions.canvasHeight})`;\n      }\n      if (this.start) {\n        this.make();\n      }\n    },\n    methods: {\n      /**\n       * 获取模板选项\n       */\n      getTemplateOptions() {\n        var size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size;\n        return deepReplace(this.templateOptions, {\n          size,\n          width: size,\n          height: size\n        });\n      },\n      /**\n       * 获取插件选项\n       */\n      getUqrcodeOptions() {\n        return deepReplace(this.options, {\n          data: String(this.value),\n          size: Number(this.templateOptions.size)\n        });\n      },\n      /**\n       * 重置画布\n       */\n      resetCanvas(callback) {\n        this.templateOptions.canvasDisplay = false;\n        this.$nextTick(() => {\n          this.templateOptions.canvasDisplay = true;\n          this.$nextTick(() => {\n            callback && callback();\n          });\n        });\n      },\n      /**\n       * 绘制二维码\n       */\n      async draw(callback = {}, isDrawDelegate = false) {\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        if (this.drawing) {\n          if (!isDrawDelegate) {\n            this.drawDelegate = () => {\n              this.draw(callback, true);\n            };\n            return;\n          }\n        } else {\n          this.drawing = true;\n        }\n\n        if (!this.canvasId) {\n          console.error('[uQRCode]: canvasId must be set!');\n          this.isError = true;\n          this.drawing = false;\n          callback.fail({\n            errMsg: '[uQRCode]: canvasId must be set!'\n          });\n          callback.complete({\n            errMsg: '[uQRCode]: canvasId must be set!'\n          });\n          return;\n        }\n        if (!this.value) {\n          console.error('[uQRCode]: value must be set!');\n          this.isError = true;\n          this.drawing = false;\n          callback.fail({\n            errMsg: '[uQRCode]: value must be set!'\n          });\n          callback.complete({\n            errMsg: '[uQRCode]: value must be set!'\n          });\n          return;\n        }\n\n        /* 组件数据 */\n        this.templateOptions = this.getTemplateOptions();\n        /* uQRCode选项 */\n        this.uqrcodeOptions = this.getUqrcodeOptions();\n        /* 纠错等级兼容字母写法 */\n        if (typeof this.uqrcodeOptions.errorCorrectLevel === 'string') {\n          this.uqrcodeOptions.errorCorrectLevel = UQRCode.errorCorrectLevel[this.uqrcodeOptions.errorCorrectLevel];\n        }\n        /* nvue不支持动态修改gcanvas尺寸，除nvue外，默认使用useDynamicSize */\n        // #ifndef APP-NVUE\n        if (typeof this.options.useDynamicSize === 'undefined') {\n          this.uqrcodeOptions.useDynamicSize = true;\n        }\n        // #endif\n        // #ifdef APP-NVUE\n        if (typeof this.options.useDynamicSize === 'undefined') {\n          this.uqrcodeOptions.useDynamicSize = false;\n        }\n        // if (typeof this.options.drawReserve === 'undefined') {\n        //   this.uqrcodeOptions.drawReserve = true;\n        // }\n        // #endif\n\n        /* 获取uQRCode实例 */\n        const qr = instance = new UQRCode();\n        /* 注册扩展 */\n        this.plugins.forEach(p => qr.register(p.plugin));\n        /* 设置uQRCode选项 */\n        qr.setOptions(this.uqrcodeOptions);\n        /* 调用制作二维码方法 */\n        qr.make();\n\n        /* 获取canvas上下文 */\n        let canvasContext = null;\n        // #ifndef APP-NVUE\n        if (this.canvasType === '2d') {\n          // #ifdef MP-WEIXIN\n          /* 微信小程序获取canvas2d上下文方式 */\n          const canvas = (this.canvas = await new Promise(resolve => {\n            uni\n              .createSelectorQuery()\n              .in(this) // 在组件内使用需要\n              .select(`#${this.canvasId}`)\n              .fields({\n                node: true,\n                size: true\n              })\n              .exec(res => {\n                resolve(res[0].node);\n              });\n          }));\n          canvasContext = this.canvasContext = canvas.getContext('2d');\n          /* 2d的组件设置宽高与实际canvas绘制宽高不是一个，打个比方，组件size=200，canvas.width设置为100，那么绘制出来就是100=200，组件size=400，canvas.width设置为800，绘制大小还是800=400，所以无需理会下方返回的dynamicSize是多少，按dpr重新赋值给canvas即可 */\n          this.templateOptions.canvasWidth = qr.size;\n          this.templateOptions.canvasHeight = qr.size;\n          this.templateOptions.canvasTransform = '';\n          /* 使用dynamicSize+scale，可以解决小块间出现白线问题，dpr可以解决模糊问题 */\n          const dpr = uni.getSystemInfoSync().pixelRatio;\n          canvas.width = qr.dynamicSize * dpr;\n          canvas.height = qr.dynamicSize * dpr;\n          canvasContext.scale(dpr, dpr);\n          /* 微信小程序获取图像方式 */\n          qr.loadImage = this.getLoadImage(function(src) {\n            /* 小程序下获取网络图片信息需先配置download域名白名单才能生效 */\n            return new Promise((resolve, reject) => {\n              const img = canvas.createImage();\n              img.src = src;\n              img.onload = () => {\n                resolve(img);\n              };\n              img.onerror = err => {\n                reject(err);\n              };\n            });\n          });\n          // #endif\n          // #ifndef MP-WEIXIN\n          /* 非微信小程序不支持2d，切换回uniapp获取canvas上下文方式 */\n          canvasContext = this.canvasContext = uni.createCanvasContext(this.canvasId, this);\n          /* 使用dynamicSize，可以解决小块间出现白线问题，再通过scale缩放至size，使其达到所设尺寸 */\n          this.templateOptions.canvasWidth = qr.dynamicSize;\n          this.templateOptions.canvasHeight = qr.dynamicSize;\n          this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n          this.templateOptions.canvasHeight})`;\n          /* uniapp获取图像方式 */\n          qr.loadImage = this.getLoadImage(function(src) {\n            return new Promise((resolve, reject) => {\n              if (src.startsWith('http')) {\n                uni.getImageInfo({\n                  src,\n                  success: res => {\n                    resolve(res.path);\n                  },\n                  fail: err => {\n                    reject(err);\n                  }\n                });\n              } else {\n                if (src.startsWith('.')) {\n                  console.error('[uQRCode]: 本地图片路径仅支持绝对路径！');\n                  throw new Error('[uQRCode]: local image path only supports absolute path!');\n                } else {\n                  resolve(src);\n                }\n              }\n            });\n          });\n          // #endif\n        } else {\n          /* uniapp获取canvas上下文方式 */\n          canvasContext = this.canvasContext = uni.createCanvasContext(this.canvasId, this);\n          /* 使用dynamicSize，可以解决小块间出现白线问题，再通过scale缩放至size，使其达到所设尺寸 */\n          this.templateOptions.canvasWidth = qr.dynamicSize;\n          this.templateOptions.canvasHeight = qr.dynamicSize;\n          this.templateOptions.canvasTransform = `scale(${this.templateOptions.size / this.templateOptions.canvasWidth}, ${this.templateOptions.size /\n          this.templateOptions.canvasHeight})`;\n          /* uniapp获取图像方式 */\n          qr.loadImage = this.getLoadImage(function(src) {\n            return new Promise((resolve, reject) => {\n              /* getImageInfo在微信小程序的bug：本地路径返回路径会把开头的/或../移除，导致路径错误，解决方法：限制只能使用绝对路径 */\n              if (src.startsWith('http')) {\n                uni.getImageInfo({\n                  src,\n                  success: res => {\n                    resolve(res.path);\n                  },\n                  fail: err => {\n                    reject(err);\n                  }\n                });\n              } else {\n                if (src.startsWith('.')) {\n                  console.error('[uQRCode]: 本地图片路径仅支持绝对路径！');\n                  throw new Error('[uQRCode]: local image path only supports absolute path!');\n                } else {\n                  resolve(src);\n                }\n              }\n            });\n          });\n        }\n        // #endif\n        // #ifdef APP-NVUE\n        /* NVue获取canvas上下文方式 */\n        const gcanvas = this.$refs['gcanvas'];\n        const canvas = enable(gcanvas, {\n          bridge: WeexBridge\n        });\n        canvasContext = this.canvasContext = canvas.getContext('2d');\n        /* NVue获取图像方式 */\n        qr.loadImage = this.getLoadImage(function(src) {\n          return new Promise((resolve, reject) => {\n            /* getImageInfo在nvue的bug：获取同一个路径的图片信息，同一时间第一次获取成功，后续失败，猜测是写入本地时产生文件写入冲突，所以没有返回，特别是对于网络资源 --- 已实现队列绘制，已解决此问题 */\n            if (src.startsWith('.')) {\n              console.error('[uQRCode]: 本地图片路径仅支持绝对路径！');\n              throw new Error('[uQRCode]: local image path only supports absolute path!');\n            } else {\n              uni.getImageInfo({\n                src,\n                success: res => {\n                  resolve(res.path);\n                },\n                fail: err => {\n                  reject(err);\n                }\n              });\n            }\n          });\n        });\n        // #endif\n\n        /* 设置uQRCode实例的canvas上下文 */\n        qr.canvasContext = canvasContext;\n        /* 延时等待页面重新绘制完毕 */\n        setTimeout(() => {\n          /* 从插件获取具体要调用哪一个扩展函数 */\n          var plugin = this.plugins.find(p => p.name == qr.style);\n          var drawCanvasName = plugin ? plugin.drawCanvas : 'drawCanvas';\n          /* 虽然qr[drawCanvasName]是直接返回Promise的，但由于js内部this指向问题，故不能直接exec(qr[drawCanvasName])此方式执行，需要改成exec(() => qr[drawCanvasName]())才能正确获取this */\n          var drawCanvas;\n          if (this.queue) {\n            drawCanvas = () => queueDraw.exec(() => qr[drawCanvasName]());\n            // drawCanvas = () => queueDraw.exec(() => new Promise((resolve, reject) => {\n            //   setTimeout(() => {\n            //     qr[drawCanvasName]().then(resolve).catch(reject);\n            //   }, 1000);\n            // }));\n          } else {\n            drawCanvas = () => qr[drawCanvasName]();\n          }\n          /* 调用绘制方法将二维码图案绘制到canvas上 */\n          drawCanvas()\n            .then(() => {\n              if (this.drawDelegate) {\n                /* 高频重绘纠正 */\n                let delegate = this.drawDelegate;\n                this.drawDelegate = undefined;\n                delegate();\n              } else {\n                this.drawing = false;\n                callback.success();\n              }\n            })\n            .catch(err => {\n              console.log(err);\n              if (this.drawDelegate) {\n                /* 高频重绘纠正 */\n                let delegate = this.drawDelegate;\n                this.drawDelegate = undefined;\n                delegate();\n              } else {\n                this.drawing = false;\n                this.isError = true;\n                callback.fail(err);\n              }\n            })\n            .finally(() => {\n              callback.complete();\n            });\n        }, 300);\n      },\n      /**\n       * 生成二维码\n       */\n      make(callback = {}) {\n        this.makeExecuted = true;\n        this.makeing = true;\n        this.isError = false;\n\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        this.resetCanvas(() => {\n          clearTimeout(this.makeDelegate);\n          this.makeDelegate = setTimeout(() => {\n            this.draw({\n              success: () => {\n                setTimeout(() => {\n                  callback.success();\n                  this.complete(true);\n                }, 300);\n              },\n              fail: err => {\n                callback.fail(err);\n                this.error = err;\n                this.complete(false, err.errMsg);\n              },\n              complete: () => {\n                callback.complete();\n                this.makeing = false;\n              }\n            });\n          }, 300);\n        });\n      },\n      /**\n       * 重新生成\n       */\n      remake(callback) {\n        this.$emit('change');\n        this.make(callback);\n      },\n      /**\n       * 生成完成\n       */\n      complete(success = true, errMsg = '') {\n        if (success) {\n          this.$emit('complete', {\n            success\n          });\n        } else {\n          this.$emit('complete', {\n            success,\n            errMsg\n          });\n        }\n      },\n      /**\n       * 导出临时路径\n       */\n      toTempFilePath(callback = {}) {\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        if (!this.makeExecuted) {\n          console.error('[uQRCode]: make() 方法从未调用！请先成功调用 make() 后再进行操作。');\n          var err = {\n            errMsg: '[uQRCode]: make() method has never been executed! please execute make() successfully before operating.'\n          };\n          callback.fail(err);\n          callback.complete(err);\n          return;\n        }\n\n        if (this.isError) {\n          callback.fail(this.error);\n          callback.complete(this.error);\n          return;\n        }\n\n        if (this.makeing) {\n          /* 如果还在生成状态，那当前操作将托管到委托，监听生成完成后再通过委托复调当前方法 */\n          this.toTempFilePathDelegate = () => {\n            this.toTempFilePath(callback);\n          };\n          return;\n        } else {\n          this.toTempFilePathDelegate = null;\n        }\n\n        // #ifndef APP-NVUE\n        if (this.canvasType === '2d') {\n          // #ifdef MP-WEIXIN\n          try {\n            let dataURL = null;\n            // #ifdef VUE3\n            dataURL = toRaw(this.canvas)\n              .toDataURL();\n            // #endif\n            // #ifndef VUE3\n            dataURL = this.canvas.toDataURL();\n            // #endif\n            callback.success({\n              tempFilePath: dataURL\n            });\n            callback.complete({\n              tempFilePath: dataURL\n            });\n          } catch (e) {\n            callback.fail(e);\n            callback.complete(e);\n          }\n          // #endif\n        } else {\n          uni.canvasToTempFilePath({\n              canvasId: this.canvasId,\n              fileType: this.fileType,\n              width: Number(this.templateOptions.canvasWidth),\n              height: Number(this.templateOptions.canvasHeight),\n              destWidth: Number(this.templateOptions.size),\n              destHeight: Number(this.templateOptions.size),\n              success: res => {\n                callback.success(res);\n              },\n              fail: err => {\n                callback.fail(err);\n              },\n              complete: () => {\n                callback.complete();\n              }\n            },\n            this\n          );\n        }\n        // #endif\n        // #ifdef APP-NVUE\n        const dpr = uni.getSystemInfoSync().pixelRatio;\n        this.canvasContext.toTempFilePath(\n          0,\n          0,\n          this.templateOptions.canvasWidth * dpr,\n          this.templateOptions.canvasHeight * dpr,\n          this.templateOptions.size * dpr,\n          this.templateOptions.size * dpr,\n          '',\n          1,\n          res => {\n            callback.success(res);\n            callback.complete(res);\n          }\n        );\n        // #endif\n      },\n      /**\n       * 保存\n       */\n      save(callback = {}) {\n        if (typeof callback.success != 'function') {\n          callback.success = () => {};\n        }\n        if (typeof callback.fail != 'function') {\n          callback.fail = () => {};\n        }\n        if (typeof callback.complete != 'function') {\n          callback.complete = () => {};\n        }\n\n        this.toTempFilePath({\n          success: res => {\n            // #ifndef H5\n            if (this.canvasType === '2d') {\n              // #ifdef MP-WEIXIN\n              /* 需要将 data:image/png;base64, 这段去除 writeFile 才能正常打开文件，否则是损坏文件，无法打开 */\n              const reg = new RegExp('^data:image/png;base64,', 'g');\n              const dataURL = res.tempFilePath.replace(reg, '');\n              const fs = wx.getFileSystemManager();\n              const tempFilePath = `${wx.env.USER_DATA_PATH}/${new Date().getTime()}${\n                Math.random()\n                  .toString()\n                  .split('.')[1]\n              }.png`;\n              fs.writeFile({\n                filePath: tempFilePath, // 要写入的文件路径 (本地路径)\n                data: dataURL, // base64图片\n                encoding: 'base64',\n                success: res1 => {\n                  uni.saveImageToPhotosAlbum({\n                    filePath: tempFilePath,\n                    success: res2 => {\n                      callback.success(res2);\n                    },\n                    fail: err2 => {\n                      callback.fail(err2);\n                    },\n                    complete: () => {\n                      callback.complete();\n                    }\n                  });\n                },\n                fail: err => {\n                  callback.fail(err);\n                },\n                complete: () => {\n                  callback.complete();\n                }\n              });\n              // #endif\n            } else {\n              uni.saveImageToPhotosAlbum({\n                filePath: res.tempFilePath,\n                success: res1 => {\n                  callback.success(res1);\n                },\n                fail: err1 => {\n                  callback.fail(err1);\n                },\n                complete: () => {\n                  callback.complete();\n                }\n              });\n            }\n            // #endif\n\n            // #ifdef H5\n            /* 可以在电脑浏览器下载，移动端iOS不行，安卓微信浏览器不行，安卓外部浏览器可以 */\n            this.isH5Save = true;\n            this.tempFilePath = res.tempFilePath;\n            if (this.h5SaveIsDownload) {\n              const aEle = document.createElement('a');\n              aEle.download = this.h5DownloadName; // 设置下载的文件名，默认是'下载'\n              aEle.href = res.tempFilePath;\n              document.body.appendChild(aEle);\n              aEle.click();\n              aEle.remove(); // 下载之后把创建的元素删除\n            }\n            callback.success({\n              errMsg: 'ok'\n            });\n            callback.complete({\n              errMsg: 'ok'\n            });\n            // #endif\n          },\n          fail: err => {\n            callback.fail(err);\n            callback.complete(err);\n          }\n        });\n      },\n      /**\n       * 注册click事件\n       */\n      onClick(e) {\n        this.$emit('click', e);\n      },\n      /**\n       * 获取实例\n       */\n      getInstance() {\n        return instance;\n      },\n      /**\n       * 注册扩展，组件仅支持注册type为style的drawCanvas扩展\n       * @param {Object} plugin\n       */\n      registerStyle(plugin) {\n        if (plugin.Type != 'style') {\n          console.warn('[uQRCode]: registerStyle 仅支持注册 style 类型的扩展！');\n          return {\n            errMsg: 'registerStyle 仅支持注册 style 类型的扩展！'\n          };\n        }\n        if (typeof plugin === 'function') {\n          this.plugins.push({\n            plugin,\n            name: plugin.Name,\n            drawCanvas: plugin.DrawCanvas\n          });\n        }\n      },\n      getLoadImage(loadImage) {\n        var that = this;\n        if (typeof loadImage == 'function') {\n          return function(src) {\n            /* 判断是否是队列加载图片的 */\n            if (that.isQueueLoadImage) {\n              /* 解决iOS APP||NVUE同时绘制多个二维码导致图片丢失需使用队列 */\n              return queueLoadImage.exec(() => {\n                return new Promise((resolve, reject) => {\n                  setTimeout(() => {\n                    const cache = cacheImageList.find(x => x.src == src);\n                    if (cache) {\n                      resolve(cache.img);\n                    } else {\n                      loadImage(src)\n                        .then(img => {\n                          cacheImageList.push({\n                            src,\n                            img\n                          });\n                          resolve(img);\n                        })\n                        .catch(err => {\n                          reject(err);\n                        });\n                    }\n                  }, 10);\n                });\n              });\n            } else {\n              return loadImage(src);\n            }\n          };\n        } else {\n          return function(src) {\n            return Promise.resolve(src);\n          };\n        }\n      }\n    }\n  };\n\n  /**\n   * 对象属性深度替换\n   * @param {Object} o 原始对象/默认对象/被替换的对象\n   * @param {Object} r 从这个对象里取值替换到o对象里\n   * @return {Object} 替换后的新对象\n   */\n  function deepReplace(o = {}, r = {}, c = false) {\n    let obj;\n    if (c) {\n      // 从源替换\n      obj = o;\n    } else {\n      // 不替换源，copy一份备份来替换\n      obj = {\n        ...o\n      };\n    }\n    for (let k in r) {\n      var vr = r[k];\n      if (vr != undefined) {\n        if (vr.constructor == Object) {\n          obj[k] = this.deepReplace(obj[k], vr);\n        } else if (vr.constructor == String && !vr) {\n          obj[k] = obj[k];\n        } else {\n          obj[k] = vr;\n        }\n      }\n    }\n    return obj;\n  }\n</script>\n\n<style scoped>\n  .uqrcode {\n    position: relative;\n  }\n\n  .uqrcode-hide {\n    position: fixed;\n    left: 7500rpx;\n  }\n\n  .uqrcode-canvas {\n    transform-origin: top left;\n  }\n\n  .uqrcode-makeing {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 10;\n    /* #ifndef APP-NVUE */\n    display: flex;\n    /* #endif */\n    justify-content: center;\n    align-items: center;\n  }\n\n  .uqrcode-makeing-image {\n    /* #ifndef APP-NVUE */\n    display: block;\n    max-width: 120px;\n    max-height: 120px;\n    /* #endif */\n  }\n\n  .uqrcode-error {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    /* #ifndef APP-NVUE */\n    display: flex;\n    /* #endif */\n    justify-content: center;\n    align-items: center;\n  }\n\n  .uqrcode-error-message {\n    font-size: 12px;\n    color: #939291;\n  }\n\n  /* #ifdef H5 */\n  .uqrcode-h5-save {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: 100;\n    background-color: rgba(0, 0, 0, 0.68);\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n\n  .uqrcode-h5-save-image {\n    width: 512rpx;\n    height: 512rpx;\n    padding: 32rpx;\n  }\n\n  .uqrcode-h5-save-text {\n    margin-top: 20rpx;\n    font-size: 32rpx;\n    font-weight: 700;\n    color: #ffffff;\n  }\n\n  .uqrcode-h5-save-close {\n    position: relative;\n    margin-top: 72rpx;\n    width: 60rpx;\n    height: 60rpx;\n    border: 2rpx solid #ffffff;\n    border-radius: 60rpx;\n    padding: 10rpx;\n  }\n\n  .uqrcode-h5-save-close-before {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%) rotate(45deg);\n    width: 40rpx;\n    height: 4rpx;\n    background: #ffffff;\n  }\n\n  .uqrcode-h5-save-close-after {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%) rotate(-45deg);\n    width: 40rpx;\n    height: 4rpx;\n    background: #ffffff;\n  }\n\n  /* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/bridge/bridge-weex.js",
    "content": "const isWeex = typeof WXEnvironment !== 'undefined';\nconst isWeexIOS = isWeex && /ios/i.test(WXEnvironment.platform);\nconst isWeexAndroid = isWeex && !isWeexIOS;\n\nimport GLmethod from '../context-webgl/GLmethod';\n\nconst GCanvasModule =\n    (typeof weex !== 'undefined' && weex.requireModule) ? (weex.requireModule('gcanvas')) :\n        (typeof __weex_require__ !== 'undefined') ? (__weex_require__('@weex-module/gcanvas')) : {};\n\nlet isDebugging = false;\n\nlet isComboDisabled = false;\n\nconst logCommand = (function () {\n    const methodQuery = [];\n    Object.keys(GLmethod).forEach(key => {\n        methodQuery[GLmethod[key]] = key;\n    })\n    const queryMethod = (id) => {\n        return methodQuery[parseInt(id)] || 'NotFoundMethod';\n    }\n    const logCommand = (id, cmds) => {\n        const mId = cmds.split(',')[0];\n        const mName = queryMethod(mId);\n        console.log(`=== callNative - componentId:${id}; method: ${mName}; cmds: ${cmds}`);\n    }\n    return logCommand;\n})();\n\nfunction joinArray(arr, sep) {\n    let res = '';\n    for (let i = 0; i < arr.length; i++) {\n        if (i !== 0) {\n            res += sep;\n        }\n        res += arr[i];\n    }\n    return res;\n}\n\nconst commandsCache = {}\n\nconst GBridge = {\n\n    callEnable: (ref, configArray) => {\n\n        commandsCache[ref] = [];\n\n        return GCanvasModule.enable({\n            componentId: ref,\n            config: configArray\n        });\n    },\n\n    callEnableDebug: () => {\n        isDebugging = true;\n    },\n\n    callEnableDisableCombo: () => {\n        isComboDisabled = true;\n    },\n\n    callSetContextType: function (componentId, context_type) {\n        GCanvasModule.setContextType(context_type, componentId);\n    },\n\n    callReset: function(id){\n        GCanvasModule.resetComponent && canvasModule.resetComponent(componentId);\n    },\n\n    render: isWeexIOS ? function (componentId) {\n        return GCanvasModule.extendCallNative({\n            contextId: componentId,\n            type: 0x60000001\n        });\n    } : function (componentId) {\n        return callGCanvasLinkNative(componentId, 0x60000001, 'render');\n    },\n\n    render2d: isWeexIOS ? function (componentId, commands, callback) {\n\n        if (isDebugging) {\n            console.log('>>> >>> render2d ===');\n            console.log('>>> commands: ' + commands);\n        }\n\t\t\n        GCanvasModule.render([commands, callback?true:false], componentId, callback);\n\n    } : function (componentId, commands,callback) {\n\n        if (isDebugging) {\n            console.log('>>> >>> render2d ===');\n            console.log('>>> commands: ' + commands);\n        }\n\n        callGCanvasLinkNative(componentId, 0x20000001, commands);\n\t\tif(callback){\n\t\tcallback();\n\t\t}\n    },\n\n    callExtendCallNative: isWeexIOS ? function (componentId, cmdArgs) {\n\n        throw 'should not be here anymore ' + cmdArgs;\n\n    } : function (componentId, cmdArgs) {\n\n        throw 'should not be here anymore ' + cmdArgs;\n\n    },\n\n\n    flushNative: isWeexIOS ? function (componentId) {\n\n        const cmdArgs = joinArray(commandsCache[componentId], ';');\n        commandsCache[componentId] = [];\n\n        if (isDebugging) {\n            console.log('>>> >>> flush native ===');\n            console.log('>>> commands: ' + cmdArgs);\n        }\n\n        const result = GCanvasModule.extendCallNative({\n            \"contextId\": componentId,\n            \"type\": 0x60000000,\n            \"args\": cmdArgs\n        });\n\n        const res = result && result.result;\n\n        if (isDebugging) {\n            console.log('>>> result: ' + res);\n        }\n\n        return res;\n\n    } : function (componentId) {\n\n        const cmdArgs = joinArray(commandsCache[componentId], ';');\n        commandsCache[componentId] = [];\n\n        if (isDebugging) {\n            console.log('>>> >>> flush native ===');\n            console.log('>>> commands: ' + cmdArgs);\n        }\n\n        const result = callGCanvasLinkNative(componentId, 0x60000000, cmdArgs);\n\n        if (isDebugging) {\n            console.log('>>> result: ' + result);\n        }\n\n        return result;\n    },\n\n    callNative: function (componentId, cmdArgs, cache) {\n\n        if (isDebugging) {\n            logCommand(componentId, cmdArgs);\n        }\n\n        commandsCache[componentId].push(cmdArgs);\n\n        if (!cache || isComboDisabled) {\n            return GBridge.flushNative(componentId);\n        } else {\n            return undefined;\n        }\n    },\n\n    texImage2D(componentId, ...args) {\n        if (isWeexIOS) {\n            if (args.length === 6) {\n                const [target, level, internalformat, format, type, image] = args;\n                GBridge.callNative(\n                    componentId,\n                    GLmethod.texImage2D + ',' + 6 + ',' + target + ',' + level + ',' + internalformat + ',' + format + ',' + type + ',' + image.src\n                )\n            } else if (args.length === 9) {\n                const [target, level, internalformat, width, height, border, format, type, image] = args;\n                GBridge.callNative(\n                    componentId,\n                    GLmethod.texImage2D + ',' + 9 + ',' + target + ',' + level + ',' + internalformat + ',' + width + ',' + height + ',' + border + ',' +\n                    + format + ',' + type + ',' + (image ? image.src : 0)\n                )\n            }\n        } else if (isWeexAndroid) {\n            if (args.length === 6) {\n                const [target, level, internalformat, format, type, image] = args;\n                GCanvasModule.texImage2D(componentId, target, level, internalformat, format, type, image.src);\n            } else if (args.length === 9) {\n                const [target, level, internalformat, width, height, border, format, type, image] = args;\n                GCanvasModule.texImage2D(componentId, target, level, internalformat, width, height, border, format, type, (image ? image.src : 0));\n            }\n        }\n    },\n\n    texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image) {\n        if (isWeexIOS) {\n            if (arguments.length === 8) {\n                GBridge.callNative(\n                    componentId,\n                    GLmethod.texSubImage2D + ',' + 6 + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset, + ',' + format + ',' + type + ',' + image.src\n                )\n            }\n        } else if (isWeexAndroid) {\n            GCanvasModule.texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image.src);\n        }\n    },\n\n    bindImageTexture(componentId, src, imageId) {\n        GCanvasModule.bindImageTexture([src, imageId], componentId);\n    },\n\n    perloadImage([url, id], callback) {\n        GCanvasModule.preLoadImage([url, id], function (image) {\n            image.url = url;\n            image.id = id;\n            callback(image);\n        });\n    },\n\t\n\tmeasureText(text, fontStyle, componentId) {\n\t    return GCanvasModule.measureText([text, fontStyle], componentId);\n\t},\n\t\n\tgetImageData (componentId, x, y, w, h, callback) {\n\t\tGCanvasModule.getImageData([x, y,w,h],componentId,callback);\n\t},\n\t\n\tputImageData (componentId, data, x, y, w, h, callback) {\n\t\tGCanvasModule.putImageData([x, y,w,h,data],componentId,callback);\n\t},\n\t\n\ttoTempFilePath(componentId, x, y, width, height, destWidth, destHeight, fileType, quality, callback){ \n\t\tGCanvasModule.toTempFilePath([x, y, width,height, destWidth, destHeight, fileType, quality], componentId, callback);\n\t}\n}\n\nexport default GBridge;"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStyleLinearGradient.js",
    "content": "class FillStyleLinearGradient {\n\n    constructor(x0, y0, x1, y1) {\n        this._start_pos = { _x: x0, _y: y0 };\n        this._end_pos = { _x: x1, _y: y1 };\n        this._stop_count = 0;\n        this._stops = [0, 0, 0, 0, 0];\n    }\n\n    addColorStop = function (pos, color) {\n        if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {\n            this._stops[this._stop_count] = { _pos: pos, _color: color };\n            this._stop_count++;\n        }\n    }\n}\n\nexport default FillStyleLinearGradient;"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStylePattern.js",
    "content": "class FillStylePattern {\n    constructor(img, pattern) {\n        this._style = pattern;\n        this._img = img;\n    }\n}\n\nexport default FillStylePattern;"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/FillStyleRadialGradient.js",
    "content": "class FillStyleRadialGradient {\n    constructor(x0, y0, r0, x1, y1, r1) {\n        this._start_pos = { _x: x0, _y: y0, _r: r0 };\n        this._end_pos = { _x: x1, _y: y1, _r: r1 };\n        this._stop_count = 0;\n        this._stops = [0, 0, 0, 0, 0];\n    }\n\n    addColorStop(pos, color) {\n        if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {\n            this._stops[this._stop_count] = { _pos: pos, _color: color };\n            this._stop_count++;\n        }\n    }\n}\n\nexport default FillStyleRadialGradient;"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-2d/RenderingContext.js",
    "content": "import FillStylePattern from './FillStylePattern';\nimport FillStyleLinearGradient from './FillStyleLinearGradient';\nimport FillStyleRadialGradient from './FillStyleRadialGradient';\nimport GImage from '../env/image.js';\nimport {\n\tArrayBufferToBase64,\n\tBase64ToUint8ClampedArray\n} from '../env/tool.js';\n\nexport default class CanvasRenderingContext2D {\n\n\t_drawCommands = '';\n\n\t_globalAlpha = 1.0;\n\n\t_fillStyle = 'rgb(0,0,0)';\n\t_strokeStyle = 'rgb(0,0,0)';\n\n\t_lineWidth = 1;\n\t_lineCap = 'butt';\n\t_lineJoin = 'miter';\n\n\t_miterLimit = 10;\n\n\t_globalCompositeOperation = 'source-over';\n\n\t_textAlign = 'start';\n\t_textBaseline = 'alphabetic';\n\n\t_font = '10px sans-serif';\n\n\t_savedGlobalAlpha = [];\n\n\ttimer = null;\n\tcomponentId = null;\n\n\t_notCommitDrawImageCache = [];\n\t_needRedrawImageCache = [];\n\t_redrawCommands = '';\n\t_autoSaveContext = true;\n\t// _imageMap = new GHashMap();\n\t// _textureMap = new GHashMap();\n\n\tconstructor() {\n\t\tthis.className = 'CanvasRenderingContext2D';\n\t\t//this.save()\n\t}\n\n\tsetFillStyle(value) {\n\t\tthis.fillStyle = value;\n\t}\n\n\tset fillStyle(value) {\n\t\tthis._fillStyle = value;\n\n\t\tif (typeof(value) == 'string') {\n\t\t\tthis._drawCommands = this._drawCommands.concat(\"F\" + value + \";\");\n\t\t} else if (value instanceof FillStylePattern) {\n\t\t\tconst image = value._img;\n\t\t\tif (!image.complete) {\n\t\t\t\timage.onload = () => {\n\t\t\t\t\tvar index = this._needRedrawImageCache.indexOf(image);\n\t\t\t\t\tif (index > -1) {\n\t\t\t\t\t\tthis._needRedrawImageCache.splice(index, 1);\n\t\t\t\t\t\tCanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);\n\t\t\t\t\t\tthis._redrawflush(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis._notCommitDrawImageCache.push(image);\n\t\t\t} else {\n\t\t\t\tCanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);\n\t\t\t}\n\n\t\t\t//CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);\n\t\t\tthis._drawCommands = this._drawCommands.concat(\"G\" + image._id + \",\" + value._style + \";\");\n\t\t} else if (value instanceof FillStyleLinearGradient) {\n\t\t\tvar command = \"D\" + value._start_pos._x.toFixed(2) + \",\" + value._start_pos._y.toFixed(2) + \",\" +\n\t\t\t\tvalue._end_pos._x.toFixed(2) + \",\" + value._end_pos._y.toFixed(2) + \",\" +\n\t\t\t\tvalue._stop_count;\n\t\t\tfor (var i = 0; i < value._stop_count; ++i) {\n\t\t\t\tcommand += (\",\" + value._stops[i]._pos + \",\" + value._stops[i]._color);\n\t\t\t}\n\t\t\tthis._drawCommands = this._drawCommands.concat(command + \";\");\n\t\t} else if (value instanceof FillStyleRadialGradient) {\n\t\t\tvar command = \"H\" + value._start_pos._x.toFixed(2) + \",\" + value._start_pos._y.toFixed(2) + \",\" + value._start_pos._r\n\t\t\t\t.toFixed(2) + \",\" +\n\t\t\t\tvalue._end_pos._x.toFixed(2) + \",\" + value._end_pos._y.toFixed(2) + \",\" + value._end_pos._r.toFixed(2) + \",\" +\n\t\t\t\tvalue._stop_count;\n\t\t\tfor (var i = 0; i < value._stop_count; ++i) {\n\t\t\t\tcommand += (\",\" + value._stops[i]._pos + \",\" + value._stops[i]._color);\n\t\t\t}\n\t\t\tthis._drawCommands = this._drawCommands.concat(command + \";\");\n\t\t}\n\t}\n\n\tget fillStyle() {\n\t\treturn this._fillStyle;\n\t}\n\n\tget globalAlpha() {\n\t\treturn this._globalAlpha;\n\t}\n\n\tsetGlobalAlpha(value) {\n\t\tthis.globalAlpha = value;\n\t}\n\n\tset globalAlpha(value) {\n\t\tthis._globalAlpha = value;\n\t\tthis._drawCommands = this._drawCommands.concat(\"a\" + value.toFixed(2) + \";\");\n\t}\n\n\n\tget strokeStyle() {\n\t\treturn this._strokeStyle;\n\t}\n\n\tsetStrokeStyle(value) {\n\t\tthis.strokeStyle = value;\n\t}\n\n\tset strokeStyle(value) {\n\n\t\tthis._strokeStyle = value;\n\n\t\tif (typeof(value) == 'string') {\n\t\t\tthis._drawCommands = this._drawCommands.concat(\"S\" + value + \";\");\n\t\t} else if (value instanceof FillStylePattern) {\n\t\t\tCanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);\n\t\t\tthis._drawCommands = this._drawCommands.concat(\"G\" + image._id + \",\" + value._style + \";\");\n\t\t} else if (value instanceof FillStyleLinearGradient) {\n\t\t\tvar command = \"D\" + value._start_pos._x.toFixed(2) + \",\" + value._start_pos._y.toFixed(2) + \",\" +\n\t\t\t\tvalue._end_pos._x.toFixed(2) + \",\" + value._end_pos._y.toFixed(2) + \",\" +\n\t\t\t\tvalue._stop_count;\n\n\t\t\tfor (var i = 0; i < value._stop_count; ++i) {\n\t\t\t\tcommand += (\",\" + value._stops[i]._pos + \",\" + value._stops[i]._color);\n\t\t\t}\n\t\t\tthis._drawCommands = this._drawCommands.concat(command + \";\");\n\t\t} else if (value instanceof FillStyleRadialGradient) {\n\t\t\tvar command = \"H\" + value._start_pos._x.toFixed(2) + \",\" + value._start_pos._y.toFixed(2) + \",\" + value._start_pos._r\n\t\t\t\t.toFixed(2) + \",\" +\n\t\t\t\tvalue._end_pos._x.toFixed(2) + \",\" + value._end_pos._y + \",\".toFixed(2) + value._end_pos._r.toFixed(2) + \",\" +\n\t\t\t\tvalue._stop_count;\n\n\t\t\tfor (var i = 0; i < value._stop_count; ++i) {\n\t\t\t\tcommand += (\",\" + value._stops[i]._pos + \",\" + value._stops[i]._color);\n\t\t\t}\n\t\t\tthis._drawCommands = this._drawCommands.concat(command + \";\");\n\t\t}\n\t}\n\n\tget lineWidth() {\n\t\treturn this._lineWidth;\n\t}\n\n\tsetLineWidth(value) {\n\t\tthis.lineWidth = value;\n\t}\n\n\tset lineWidth(value) {\n\t\tthis._lineWidth = value;\n\t\tthis._drawCommands = this._drawCommands.concat(\"W\" + value + \";\");\n\t}\n\n\tget lineCap() {\n\t\treturn this._lineCap;\n\t}\n\n\tsetLineCap(value) {\n\t\tthis.lineCap = value;\n\t}\n\n\tset lineCap(value) {\n\t\tthis._lineCap = value;\n\t\tthis._drawCommands = this._drawCommands.concat(\"C\" + value + \";\");\n\t}\n\n\tget lineJoin() {\n\t\treturn this._lineJoin;\n\t}\n\n\tsetLineJoin(value) {\n\t\tthis.lineJoin = value\n\t}\n\n\tset lineJoin(value) {\n\t\tthis._lineJoin = value;\n\t\tthis._drawCommands = this._drawCommands.concat(\"J\" + value + \";\");\n\t}\n\n\tget miterLimit() {\n\t\treturn this._miterLimit;\n\t}\n\n\tsetMiterLimit(value) {\n\t\tthis.miterLimit = value\n\t}\n\n\tset miterLimit(value) {\n\t\tthis._miterLimit = value;\n\t\tthis._drawCommands = this._drawCommands.concat(\"M\" + value + \";\");\n\t}\n\n\tget globalCompositeOperation() {\n\t\treturn this._globalCompositeOperation;\n\t}\n\n\tset globalCompositeOperation(value) {\n\n\t\tthis._globalCompositeOperation = value;\n\t\tlet mode = 0;\n\t\tswitch (value) {\n\t\t\tcase \"source-over\":\n\t\t\t\tmode = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"source-atop\":\n\t\t\t\tmode = 5;\n\t\t\t\tbreak;\n\t\t\tcase \"source-in\":\n\t\t\t\tmode = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"source-out\":\n\t\t\t\tmode = 2;\n\t\t\t\tbreak;\n\t\t\tcase \"destination-over\":\n\t\t\t\tmode = 4;\n\t\t\t\tbreak;\n\t\t\tcase \"destination-atop\":\n\t\t\t\tmode = 4;\n\t\t\t\tbreak;\n\t\t\tcase \"destination-in\":\n\t\t\t\tmode = 4;\n\t\t\t\tbreak;\n\t\t\tcase \"destination-out\":\n\t\t\t\tmode = 3;\n\t\t\t\tbreak;\n\t\t\tcase \"lighter\":\n\t\t\t\tmode = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"copy\":\n\t\t\t\tmode = 2;\n\t\t\t\tbreak;\n\t\t\tcase \"xor\":\n\t\t\t\tmode = 6;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tmode = 0;\n\t\t}\n\n\t\tthis._drawCommands = this._drawCommands.concat(\"B\" + mode + \";\");\n\t}\n\n\tget textAlign() {\n\t\treturn this._textAlign;\n\t}\n\n\tsetTextAlign(value) {\n\t\tthis.textAlign = value\n\t}\n\n\tset textAlign(value) {\n\n\t\tthis._textAlign = value;\n\t\tlet Align = 0;\n\t\tswitch (value) {\n\t\t\tcase \"start\":\n\t\t\t\tAlign = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"end\":\n\t\t\t\tAlign = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"left\":\n\t\t\t\tAlign = 2;\n\t\t\t\tbreak;\n\t\t\tcase \"center\":\n\t\t\t\tAlign = 3;\n\t\t\t\tbreak;\n\t\t\tcase \"right\":\n\t\t\t\tAlign = 4;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tAlign = 0;\n\t\t}\n\n\t\tthis._drawCommands = this._drawCommands.concat(\"A\" + Align + \";\");\n\t}\n\n\tget textBaseline() {\n\t\treturn this._textBaseline;\n\t}\n\n\tsetTextBaseline(value) {\n\t\tthis.textBaseline = value\n\t}\n\n\tset textBaseline(value) {\n\t\tthis._textBaseline = value;\n\t\tlet baseline = 0;\n\t\tswitch (value) {\n\t\t\tcase \"alphabetic\":\n\t\t\t\tbaseline = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"middle\":\n\t\t\t\tbaseline = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"top\":\n\t\t\t\tbaseline = 2;\n\t\t\t\tbreak;\n\t\t\tcase \"hanging\":\n\t\t\t\tbaseline = 3;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tbaseline = 4;\n\t\t\t\tbreak;\n\t\t\tcase \"ideographic\":\n\t\t\t\tbaseline = 5;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbaseline = 0;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis._drawCommands = this._drawCommands.concat(\"E\" + baseline + \";\");\n\t}\n\n\tget font() {\n\t\treturn this._font;\n\t}\n\n\tsetFontSize(size) {\n\t\tvar str = this._font;\n\t\tvar strs = str.trim().split(/\\s+/);\n\t\tfor (var i = 0; i < strs.length; i++) {\n\t\t\tvar values = [\"normal\", \"italic\", \"oblique\", \"normal\", \"small-caps\", \"normal\", \"bold\",\n\t\t\t\t\"bolder\", \"lighter\", \"100\", \"200\", \"300\", \"400\", \"500\", \"600\", \"700\", \"800\", \"900\",\n\t\t\t\t\"normal\", \"ultra-condensed\", \"extra-condensed\", \"condensed\", \"semi-condensed\",\n\t\t\t\t\"semi-expanded\", \"expanded\", \"extra-expanded\", \"ultra-expanded\"\n\t\t\t];\n\n\t\t\tif (-1 == values.indexOf(strs[i].trim())) {\n\t\t\t\tif (typeof size === 'string') {\n\t\t\t\t\tstrs[i] = size;\n\t\t\t\t} else if (typeof size === 'number') {\n\t\t\t\t\tstrs[i] = String(size) + 'px';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.font = strs.join(\" \");\n\t}\n\n\tset font(value) {\n\t\tthis._font = value;\n\t\tthis._drawCommands = this._drawCommands.concat(\"j\" + value + \";\");\n\t}\n\n\tsetTransform(a, b, c, d, tx, ty) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"t\" +\n\t\t\t(a === 1 ? \"1\" : a.toFixed(2)) + \",\" +\n\t\t\t(b === 0 ? \"0\" : b.toFixed(2)) + \",\" +\n\t\t\t(c === 0 ? \"0\" : c.toFixed(2)) + \",\" +\n\t\t\t(d === 1 ? \"1\" : d.toFixed(2)) + \",\" + tx.toFixed(2) + \",\" + ty.toFixed(2) + \";\");\n\t}\n\n\ttransform(a, b, c, d, tx, ty) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"f\" +\n\t\t\t(a === 1 ? \"1\" : a.toFixed(2)) + \",\" +\n\t\t\t(b === 0 ? \"0\" : b.toFixed(2)) + \",\" +\n\t\t\t(c === 0 ? \"0\" : c.toFixed(2)) + \",\" +\n\t\t\t(d === 1 ? \"1\" : d.toFixed(2)) + \",\" + tx + \",\" + ty + \";\");\n\t}\n\n\tresetTransform() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"m;\");\n\t}\n\n\tscale(a, d) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"k\" + a.toFixed(2) + \",\" +\n\t\t\td.toFixed(2) + \";\");\n\t}\n\n\trotate(angle) {\n\t\tthis._drawCommands = this._drawCommands\n\t\t\t.concat(\"r\" + angle.toFixed(6) + \";\");\n\t}\n\n\ttranslate(tx, ty) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"l\" + tx.toFixed(2) + \",\" + ty.toFixed(2) + \";\");\n\t}\n\n\tsave() {\n\t\tthis._savedGlobalAlpha.push(this._globalAlpha);\n\t\tthis._drawCommands = this._drawCommands.concat(\"v;\");\n\t}\n\n\trestore() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"e;\");\n\t\tthis._globalAlpha = this._savedGlobalAlpha.pop();\n\t}\n\n\tcreatePattern(img, pattern) {\n\t\tif (typeof img === 'string') {\n\t\t\tvar imgObj = new GImage();\n\t\t\timgObj.src = img;\n\t\t\timg = imgObj;\n\t\t}\n\t\treturn new FillStylePattern(img, pattern);\n\t}\n\n\tcreateLinearGradient(x0, y0, x1, y1) {\n\t\treturn new FillStyleLinearGradient(x0, y0, x1, y1);\n\t}\n\n\tcreateRadialGradient = function(x0, y0, r0, x1, y1, r1) {\n\t\treturn new FillStyleRadialGradient(x0, y0, r0, x1, y1, r1);\n\t};\n\n\tcreateCircularGradient = function(x0, y0, r0) {\n\t\treturn new FillStyleRadialGradient(x0, y0, 0, x0, y0, r0);\n\t};\n\n\tstrokeRect(x, y, w, h) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"s\" + x + \",\" + y + \",\" + w + \",\" + h + \";\");\n\t}\n\n\n\tclearRect(x, y, w, h) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"c\" + x + \",\" + y + \",\" + w +\n\t\t\t\",\" + h + \";\");\n\t}\n\n\tclip() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"p;\");\n\t}\n\n\tresetClip() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"q;\");\n\t}\n\n\tclosePath() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"o;\");\n\t}\n\n\tmoveTo(x, y) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"g\" + x.toFixed(2) + \",\" + y.toFixed(2) + \";\");\n\t}\n\n\tlineTo(x, y) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"i\" + x.toFixed(2) + \",\" + y.toFixed(2) + \";\");\n\t}\n\n\tquadraticCurveTo = function(cpx, cpy, x, y) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"u\" + cpx + \",\" + cpy + \",\" + x + \",\" + y + \";\");\n\t}\n\n\tbezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, ) {\n\t\tthis._drawCommands = this._drawCommands.concat(\n\t\t\t\"z\" + cp1x.toFixed(2) + \",\" + cp1y.toFixed(2) + \",\" + cp2x.toFixed(2) + \",\" + cp2y.toFixed(2) + \",\" +\n\t\t\tx.toFixed(2) + \",\" + y.toFixed(2) + \";\");\n\t}\n\n\tarcTo(x1, y1, x2, y2, radius) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"h\" + x1 + \",\" + y1 + \",\" + x2 + \",\" + y2 + \",\" + radius + \";\");\n\t}\n\n\tbeginPath() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"b;\");\n\t}\n\n\n\tfillRect(x, y, w, h) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"n\" + x + \",\" + y + \",\" + w +\n\t\t\t\",\" + h + \";\");\n\t}\n\n\trect(x, y, w, h) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"w\" + x + \",\" + y + \",\" + w + \",\" + h + \";\");\n\t}\n\n\tfill() {\n\t\tthis._drawCommands = this._drawCommands.concat(\"L;\");\n\t}\n\n\tstroke(path) {\n\t\tthis._drawCommands = this._drawCommands.concat(\"x;\");\n\t}\n\n\tarc(x, y, radius, startAngle, endAngle, anticlockwise) {\n\n\t\tlet ianticlockwise = 0;\n\t\tif (anticlockwise) {\n\t\t\tianticlockwise = 1;\n\t\t}\n\n\t\tthis._drawCommands = this._drawCommands.concat(\n\t\t\t\"y\" + x.toFixed(2) + \",\" + y.toFixed(2) + \",\" +\n\t\t\tradius.toFixed(2) + \",\" + startAngle + \",\" + endAngle + \",\" + ianticlockwise +\n\t\t\t\";\"\n\t\t);\n\t}\n\n\tfillText(text, x, y) {\n\t\tlet tmptext = text.replace(/!/g, \"!!\");\n\t\ttmptext = tmptext.replace(/,/g, \"!,\");\n\t\ttmptext = tmptext.replace(/;/g, \"!;\");\n\t\tthis._drawCommands = this._drawCommands.concat(\"T\" + tmptext + \",\" + x + \",\" + y + \",0.0;\");\n\t}\n\n\tstrokeText = function(text, x, y) {\n\t\tlet tmptext = text.replace(/!/g, \"!!\");\n\t\ttmptext = tmptext.replace(/,/g, \"!,\");\n\t\ttmptext = tmptext.replace(/;/g, \"!;\");\n\t\tthis._drawCommands = this._drawCommands.concat(\"U\" + tmptext + \",\" + x + \",\" + y + \",0.0;\");\n\t}\n\n\tmeasureText(text) {\n\t\treturn CanvasRenderingContext2D.GBridge.measureText(text, this.font, this.componentId);\n\t}\n\n\tisPointInPath = function(x, y) {\n\t\tthrow new Error('GCanvas not supported yet');\n\t}\n\n\tdrawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t\tif (typeof image === 'string') {\n\t\t\tvar imgObj = new GImage();\n\t\t\timgObj.src = image;\n\t\t\timage = imgObj;\n\t\t}\n\t\tif (image instanceof GImage) {\n\t\t\tif (!image.complete) {\n\t\t\t\timgObj.onload = () => {\n\t\t\t\t\tvar index = this._needRedrawImageCache.indexOf(image);\n\t\t\t\t\tif (index > -1) {\n\t\t\t\t\t\tthis._needRedrawImageCache.splice(index, 1);\n\t\t\t\t\t\tCanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);\n\t\t\t\t\t\tthis._redrawflush(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis._notCommitDrawImageCache.push(image);\n\t\t\t} else {\n\t\t\t\tCanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);\n\t\t\t}\n\t\t\tvar srcArgs = [image, sx, sy, sw, sh, dx, dy, dw, dh];\n\t\t\tvar args = [];\n\t\t\tfor (var arg in srcArgs) {\n\t\t\t\tif (typeof(srcArgs[arg]) != 'undefined') {\n\t\t\t\t\targs.push(srcArgs[arg]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.__drawImage.apply(this, args);\n\t\t\t//this.__drawImage(image,sx, sy, sw, sh, dx, dy, dw, dh);\n\t\t}\n\t}\n\n\t__drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t\tconst numArgs = arguments.length;\n\n\t\tfunction drawImageCommands() {\n\n\t\t\tif (numArgs === 3) {\n\t\t\t\tconst x = parseFloat(sx) || 0.0;\n\t\t\t\tconst y = parseFloat(sy) || 0.0;\n\n\t\t\t\treturn (\"d\" + image._id + \",0,0,\" +\n\t\t\t\t\timage.width + \",\" + image.height + \",\" +\n\t\t\t\t\tx + \",\" + y + \",\" + image.width + \",\" + image.height + \";\");\n\t\t\t} else if (numArgs === 5) {\n\t\t\t\tconst x = parseFloat(sx) || 0.0;\n\t\t\t\tconst y = parseFloat(sy) || 0.0;\n\t\t\t\tconst width = parseInt(sw) || image.width;\n\t\t\t\tconst height = parseInt(sh) || image.height;\n\n\t\t\t\treturn (\"d\" + image._id + \",0,0,\" +\n\t\t\t\t\timage.width + \",\" + image.height + \",\" +\n\t\t\t\t\tx + \",\" + y + \",\" + width + \",\" + height + \";\");\n\t\t\t} else if (numArgs === 9) {\n\t\t\t\tsx = parseFloat(sx) || 0.0;\n\t\t\t\tsy = parseFloat(sy) || 0.0;\n\t\t\t\tsw = parseInt(sw) || image.width;\n\t\t\t\tsh = parseInt(sh) || image.height;\n\t\t\t\tdx = parseFloat(dx) || 0.0;\n\t\t\t\tdy = parseFloat(dy) || 0.0;\n\t\t\t\tdw = parseInt(dw) || image.width;\n\t\t\t\tdh = parseInt(dh) || image.height;\n\n\t\t\t\treturn (\"d\" + image._id + \",\" +\n\t\t\t\t\tsx + \",\" + sy + \",\" + sw + \",\" + sh + \",\" +\n\t\t\t\t\tdx + \",\" + dy + \",\" + dw + \",\" + dh + \";\");\n\t\t\t}\n\t\t}\n\t\tthis._drawCommands += drawImageCommands();\n\t}\n\n\t_flush(reserve, callback) {\n\t\tconst commands = this._drawCommands;\n\t\tthis._drawCommands = '';\n\t\tCanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);\n\t\tthis._needRender = false;\n\t}\n\n\t_redrawflush(reserve, callback) {\n\t\tconst commands = this._redrawCommands;\n\t\tCanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);\n\t\tif (this._needRedrawImageCache.length == 0) {\n\t\t\tthis._redrawCommands = '';\n\t\t}\n\t}\n\n\tdraw(reserve, callback) {\n\t\tif (!reserve) {\n\t\t\tthis._globalAlpha = this._savedGlobalAlpha.pop();\n\t\t\tthis._savedGlobalAlpha.push(this._globalAlpha);\n\t\t\tthis._redrawCommands = this._drawCommands;\n\t\t\tthis._needRedrawImageCache = this._notCommitDrawImageCache;\n\t\t\tif (this._autoSaveContext) {\n\t\t\t\tthis._drawCommands = (\"v;\" + this._drawCommands);\n\t\t\t\tthis._autoSaveContext = false;\n\t\t\t} else {\n\t\t\t\tthis._drawCommands = (\"e;X;v;\" + this._drawCommands);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._needRedrawImageCache = this._needRedrawImageCache.concat(this._notCommitDrawImageCache);\n\t\t\tthis._redrawCommands += this._drawCommands;\n\t\t\tif (this._autoSaveContext) {\n\t\t\t\tthis._drawCommands = (\"v;\" + this._drawCommands);\n\t\t\t\tthis._autoSaveContext = false;\n\t\t\t}\n\t\t}\n\t\tthis._notCommitDrawImageCache = [];\n\t\tif (this._flush) {\n\t\t\tthis._flush(reserve, callback);\n\t\t}\n\t}\n\n\tgetImageData(x, y, w, h, callback) {\n\t\tCanvasRenderingContext2D.GBridge.getImageData(this.componentId, x, y, w, h, function(res) {\n\t\t\tres.data = Base64ToUint8ClampedArray(res.data);\n\t\t\tif (typeof(callback) == 'function') {\n\t\t\t\tcallback(res);\n\t\t\t}\n\t\t});\n\t}\n\n\tputImageData(data, x, y, w, h, callback) {\n\t\tif (data instanceof Uint8ClampedArray) {\n\t\t\tdata = ArrayBufferToBase64(data);\n\t\t\tCanvasRenderingContext2D.GBridge.putImageData(this.componentId, data, x, y, w, h, function(res) {\n\t\t\t\tif (typeof(callback) == 'function') {\n\t\t\t\t\tcallback(res);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\ttoTempFilePath(x, y, width, height, destWidth, destHeight, fileType, quality, callback) {\n\t\tCanvasRenderingContext2D.GBridge.toTempFilePath(this.componentId, x, y, width, height, destWidth, destHeight,\n\t\t\tfileType, quality,\n\t\t\tfunction(res) {\n\t\t\t\tif (typeof(callback) == 'function') {\n\t\t\t\t\tcallback(res);\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/ActiveInfo.js",
    "content": "export default class WebGLActiveInfo {\n    className = 'WebGLActiveInfo';\n\n    constructor({\n        type, name, size\n    }) {\n        this.type = type;\n        this.name = name;\n        this.size = size;\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/Buffer.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLBuffer';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLBuffer {\n    className = name;\n\n    constructor(id) {\n        this.id = id;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/Framebuffer.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLFrameBuffer';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLFramebuffer {\n    className = name;\n\n    constructor(id) {\n        this.id = id;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/GLenum.js",
    "content": "export default {\n    \"DEPTH_BUFFER_BIT\": 256,\n    \"STENCIL_BUFFER_BIT\": 1024,\n    \"COLOR_BUFFER_BIT\": 16384,\n    \"POINTS\": 0,\n    \"LINES\": 1,\n    \"LINE_LOOP\": 2,\n    \"LINE_STRIP\": 3,\n    \"TRIANGLES\": 4,\n    \"TRIANGLE_STRIP\": 5,\n    \"TRIANGLE_FAN\": 6,\n    \"ZERO\": 0,\n    \"ONE\": 1,\n    \"SRC_COLOR\": 768,\n    \"ONE_MINUS_SRC_COLOR\": 769,\n    \"SRC_ALPHA\": 770,\n    \"ONE_MINUS_SRC_ALPHA\": 771,\n    \"DST_ALPHA\": 772,\n    \"ONE_MINUS_DST_ALPHA\": 773,\n    \"DST_COLOR\": 774,\n    \"ONE_MINUS_DST_COLOR\": 775,\n    \"SRC_ALPHA_SATURATE\": 776,\n    \"FUNC_ADD\": 32774,\n    \"BLEND_EQUATION\": 32777,\n    \"BLEND_EQUATION_RGB\": 32777,\n    \"BLEND_EQUATION_ALPHA\": 34877,\n    \"FUNC_SUBTRACT\": 32778,\n    \"FUNC_REVERSE_SUBTRACT\": 32779,\n    \"BLEND_DST_RGB\": 32968,\n    \"BLEND_SRC_RGB\": 32969,\n    \"BLEND_DST_ALPHA\": 32970,\n    \"BLEND_SRC_ALPHA\": 32971,\n    \"CONSTANT_COLOR\": 32769,\n    \"ONE_MINUS_CONSTANT_COLOR\": 32770,\n    \"CONSTANT_ALPHA\": 32771,\n    \"ONE_MINUS_CONSTANT_ALPHA\": 32772,\n    \"BLEND_COLOR\": 32773,\n    \"ARRAY_BUFFER\": 34962,\n    \"ELEMENT_ARRAY_BUFFER\": 34963,\n    \"ARRAY_BUFFER_BINDING\": 34964,\n    \"ELEMENT_ARRAY_BUFFER_BINDING\": 34965,\n    \"STREAM_DRAW\": 35040,\n    \"STATIC_DRAW\": 35044,\n    \"DYNAMIC_DRAW\": 35048,\n    \"BUFFER_SIZE\": 34660,\n    \"BUFFER_USAGE\": 34661,\n    \"CURRENT_VERTEX_ATTRIB\": 34342,\n    \"FRONT\": 1028,\n    \"BACK\": 1029,\n    \"FRONT_AND_BACK\": 1032,\n    \"TEXTURE_2D\": 3553,\n    \"CULL_FACE\": 2884,\n    \"BLEND\": 3042,\n    \"DITHER\": 3024,\n    \"STENCIL_TEST\": 2960,\n    \"DEPTH_TEST\": 2929,\n    \"SCISSOR_TEST\": 3089,\n    \"POLYGON_OFFSET_FILL\": 32823,\n    \"SAMPLE_ALPHA_TO_COVERAGE\": 32926,\n    \"SAMPLE_COVERAGE\": 32928,\n    \"NO_ERROR\": 0,\n    \"INVALID_ENUM\": 1280,\n    \"INVALID_VALUE\": 1281,\n    \"INVALID_OPERATION\": 1282,\n    \"OUT_OF_MEMORY\": 1285,\n    \"CW\": 2304,\n    \"CCW\": 2305,\n    \"LINE_WIDTH\": 2849,\n    \"ALIASED_POINT_SIZE_RANGE\": 33901,\n    \"ALIASED_LINE_WIDTH_RANGE\": 33902,\n    \"CULL_FACE_MODE\": 2885,\n    \"FRONT_FACE\": 2886,\n    \"DEPTH_RANGE\": 2928,\n    \"DEPTH_WRITEMASK\": 2930,\n    \"DEPTH_CLEAR_VALUE\": 2931,\n    \"DEPTH_FUNC\": 2932,\n    \"STENCIL_CLEAR_VALUE\": 2961,\n    \"STENCIL_FUNC\": 2962,\n    \"STENCIL_FAIL\": 2964,\n    \"STENCIL_PASS_DEPTH_FAIL\": 2965,\n    \"STENCIL_PASS_DEPTH_PASS\": 2966,\n    \"STENCIL_REF\": 2967,\n    \"STENCIL_VALUE_MASK\": 2963,\n    \"STENCIL_WRITEMASK\": 2968,\n    \"STENCIL_BACK_FUNC\": 34816,\n    \"STENCIL_BACK_FAIL\": 34817,\n    \"STENCIL_BACK_PASS_DEPTH_FAIL\": 34818,\n    \"STENCIL_BACK_PASS_DEPTH_PASS\": 34819,\n    \"STENCIL_BACK_REF\": 36003,\n    \"STENCIL_BACK_VALUE_MASK\": 36004,\n    \"STENCIL_BACK_WRITEMASK\": 36005,\n    \"VIEWPORT\": 2978,\n    \"SCISSOR_BOX\": 3088,\n    \"COLOR_CLEAR_VALUE\": 3106,\n    \"COLOR_WRITEMASK\": 3107,\n    \"UNPACK_ALIGNMENT\": 3317,\n    \"PACK_ALIGNMENT\": 3333,\n    \"MAX_TEXTURE_SIZE\": 3379,\n    \"MAX_VIEWPORT_DIMS\": 3386,\n    \"SUBPIXEL_BITS\": 3408,\n    \"RED_BITS\": 3410,\n    \"GREEN_BITS\": 3411,\n    \"BLUE_BITS\": 3412,\n    \"ALPHA_BITS\": 3413,\n    \"DEPTH_BITS\": 3414,\n    \"STENCIL_BITS\": 3415,\n    \"POLYGON_OFFSET_UNITS\": 10752,\n    \"POLYGON_OFFSET_FACTOR\": 32824,\n    \"TEXTURE_BINDING_2D\": 32873,\n    \"SAMPLE_BUFFERS\": 32936,\n    \"SAMPLES\": 32937,\n    \"SAMPLE_COVERAGE_VALUE\": 32938,\n    \"SAMPLE_COVERAGE_INVERT\": 32939,\n    \"COMPRESSED_TEXTURE_FORMATS\": 34467,\n    \"DONT_CARE\": 4352,\n    \"FASTEST\": 4353,\n    \"NICEST\": 4354,\n    \"GENERATE_MIPMAP_HINT\": 33170,\n    \"BYTE\": 5120,\n    \"UNSIGNED_BYTE\": 5121,\n    \"SHORT\": 5122,\n    \"UNSIGNED_SHORT\": 5123,\n    \"INT\": 5124,\n    \"UNSIGNED_INT\": 5125,\n    \"FLOAT\": 5126,\n    \"DEPTH_COMPONENT\": 6402,\n    \"ALPHA\": 6406,\n    \"RGB\": 6407,\n    \"RGBA\": 6408,\n    \"LUMINANCE\": 6409,\n    \"LUMINANCE_ALPHA\": 6410,\n    \"UNSIGNED_SHORT_4_4_4_4\": 32819,\n    \"UNSIGNED_SHORT_5_5_5_1\": 32820,\n    \"UNSIGNED_SHORT_5_6_5\": 33635,\n    \"FRAGMENT_SHADER\": 35632,\n    \"VERTEX_SHADER\": 35633,\n    \"MAX_VERTEX_ATTRIBS\": 34921,\n    \"MAX_VERTEX_UNIFORM_VECTORS\": 36347,\n    \"MAX_VARYING_VECTORS\": 36348,\n    \"MAX_COMBINED_TEXTURE_IMAGE_UNITS\": 35661,\n    \"MAX_VERTEX_TEXTURE_IMAGE_UNITS\": 35660,\n    \"MAX_TEXTURE_IMAGE_UNITS\": 34930,\n    \"MAX_FRAGMENT_UNIFORM_VECTORS\": 36349,\n    \"SHADER_TYPE\": 35663,\n    \"DELETE_STATUS\": 35712,\n    \"LINK_STATUS\": 35714,\n    \"VALIDATE_STATUS\": 35715,\n    \"ATTACHED_SHADERS\": 35717,\n    \"ACTIVE_UNIFORMS\": 35718,\n    \"ACTIVE_ATTRIBUTES\": 35721,\n    \"SHADING_LANGUAGE_VERSION\": 35724,\n    \"CURRENT_PROGRAM\": 35725,\n    \"NEVER\": 512,\n    \"LESS\": 513,\n    \"EQUAL\": 514,\n    \"LEQUAL\": 515,\n    \"GREATER\": 516,\n    \"NOTEQUAL\": 517,\n    \"GEQUAL\": 518,\n    \"ALWAYS\": 519,\n    \"KEEP\": 7680,\n    \"REPLACE\": 7681,\n    \"INCR\": 7682,\n    \"DECR\": 7683,\n    \"INVERT\": 5386,\n    \"INCR_WRAP\": 34055,\n    \"DECR_WRAP\": 34056,\n    \"VENDOR\": 7936,\n    \"RENDERER\": 7937,\n    \"VERSION\": 7938,\n    \"NEAREST\": 9728,\n    \"LINEAR\": 9729,\n    \"NEAREST_MIPMAP_NEAREST\": 9984,\n    \"LINEAR_MIPMAP_NEAREST\": 9985,\n    \"NEAREST_MIPMAP_LINEAR\": 9986,\n    \"LINEAR_MIPMAP_LINEAR\": 9987,\n    \"TEXTURE_MAG_FILTER\": 10240,\n    \"TEXTURE_MIN_FILTER\": 10241,\n    \"TEXTURE_WRAP_S\": 10242,\n    \"TEXTURE_WRAP_T\": 10243,\n    \"TEXTURE\": 5890,\n    \"TEXTURE_CUBE_MAP\": 34067,\n    \"TEXTURE_BINDING_CUBE_MAP\": 34068,\n    \"TEXTURE_CUBE_MAP_POSITIVE_X\": 34069,\n    \"TEXTURE_CUBE_MAP_NEGATIVE_X\": 34070,\n    \"TEXTURE_CUBE_MAP_POSITIVE_Y\": 34071,\n    \"TEXTURE_CUBE_MAP_NEGATIVE_Y\": 34072,\n    \"TEXTURE_CUBE_MAP_POSITIVE_Z\": 34073,\n    \"TEXTURE_CUBE_MAP_NEGATIVE_Z\": 34074,\n    \"MAX_CUBE_MAP_TEXTURE_SIZE\": 34076,\n    \"TEXTURE0\": 33984,\n    \"TEXTURE1\": 33985,\n    \"TEXTURE2\": 33986,\n    \"TEXTURE3\": 33987,\n    \"TEXTURE4\": 33988,\n    \"TEXTURE5\": 33989,\n    \"TEXTURE6\": 33990,\n    \"TEXTURE7\": 33991,\n    \"TEXTURE8\": 33992,\n    \"TEXTURE9\": 33993,\n    \"TEXTURE10\": 33994,\n    \"TEXTURE11\": 33995,\n    \"TEXTURE12\": 33996,\n    \"TEXTURE13\": 33997,\n    \"TEXTURE14\": 33998,\n    \"TEXTURE15\": 33999,\n    \"TEXTURE16\": 34000,\n    \"TEXTURE17\": 34001,\n    \"TEXTURE18\": 34002,\n    \"TEXTURE19\": 34003,\n    \"TEXTURE20\": 34004,\n    \"TEXTURE21\": 34005,\n    \"TEXTURE22\": 34006,\n    \"TEXTURE23\": 34007,\n    \"TEXTURE24\": 34008,\n    \"TEXTURE25\": 34009,\n    \"TEXTURE26\": 34010,\n    \"TEXTURE27\": 34011,\n    \"TEXTURE28\": 34012,\n    \"TEXTURE29\": 34013,\n    \"TEXTURE30\": 34014,\n    \"TEXTURE31\": 34015,\n    \"ACTIVE_TEXTURE\": 34016,\n    \"REPEAT\": 10497,\n    \"CLAMP_TO_EDGE\": 33071,\n    \"MIRRORED_REPEAT\": 33648,\n    \"FLOAT_VEC2\": 35664,\n    \"FLOAT_VEC3\": 35665,\n    \"FLOAT_VEC4\": 35666,\n    \"INT_VEC2\": 35667,\n    \"INT_VEC3\": 35668,\n    \"INT_VEC4\": 35669,\n    \"BOOL\": 35670,\n    \"BOOL_VEC2\": 35671,\n    \"BOOL_VEC3\": 35672,\n    \"BOOL_VEC4\": 35673,\n    \"FLOAT_MAT2\": 35674,\n    \"FLOAT_MAT3\": 35675,\n    \"FLOAT_MAT4\": 35676,\n    \"SAMPLER_2D\": 35678,\n    \"SAMPLER_CUBE\": 35680,\n    \"VERTEX_ATTRIB_ARRAY_ENABLED\": 34338,\n    \"VERTEX_ATTRIB_ARRAY_SIZE\": 34339,\n    \"VERTEX_ATTRIB_ARRAY_STRIDE\": 34340,\n    \"VERTEX_ATTRIB_ARRAY_TYPE\": 34341,\n    \"VERTEX_ATTRIB_ARRAY_NORMALIZED\": 34922,\n    \"VERTEX_ATTRIB_ARRAY_POINTER\": 34373,\n    \"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\": 34975,\n    \"IMPLEMENTATION_COLOR_READ_TYPE\": 35738,\n    \"IMPLEMENTATION_COLOR_READ_FORMAT\": 35739,\n    \"COMPILE_STATUS\": 35713,\n    \"LOW_FLOAT\": 36336,\n    \"MEDIUM_FLOAT\": 36337,\n    \"HIGH_FLOAT\": 36338,\n    \"LOW_INT\": 36339,\n    \"MEDIUM_INT\": 36340,\n    \"HIGH_INT\": 36341,\n    \"FRAMEBUFFER\": 36160,\n    \"RENDERBUFFER\": 36161,\n    \"RGBA4\": 32854,\n    \"RGB5_A1\": 32855,\n    \"RGB565\": 36194,\n    \"DEPTH_COMPONENT16\": 33189,\n    \"STENCIL_INDEX8\": 36168,\n    \"DEPTH_STENCIL\": 34041,\n    \"RENDERBUFFER_WIDTH\": 36162,\n    \"RENDERBUFFER_HEIGHT\": 36163,\n    \"RENDERBUFFER_INTERNAL_FORMAT\": 36164,\n    \"RENDERBUFFER_RED_SIZE\": 36176,\n    \"RENDERBUFFER_GREEN_SIZE\": 36177,\n    \"RENDERBUFFER_BLUE_SIZE\": 36178,\n    \"RENDERBUFFER_ALPHA_SIZE\": 36179,\n    \"RENDERBUFFER_DEPTH_SIZE\": 36180,\n    \"RENDERBUFFER_STENCIL_SIZE\": 36181,\n    \"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\": 36048,\n    \"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\": 36049,\n    \"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\": 36050,\n    \"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\": 36051,\n    \"COLOR_ATTACHMENT0\": 36064,\n    \"DEPTH_ATTACHMENT\": 36096,\n    \"STENCIL_ATTACHMENT\": 36128,\n    \"DEPTH_STENCIL_ATTACHMENT\": 33306,\n    \"NONE\": 0,\n    \"FRAMEBUFFER_COMPLETE\": 36053,\n    \"FRAMEBUFFER_INCOMPLETE_ATTACHMENT\": 36054,\n    \"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\": 36055,\n    \"FRAMEBUFFER_INCOMPLETE_DIMENSIONS\": 36057,\n    \"FRAMEBUFFER_UNSUPPORTED\": 36061,\n    \"FRAMEBUFFER_BINDING\": 36006,\n    \"RENDERBUFFER_BINDING\": 36007,\n    \"MAX_RENDERBUFFER_SIZE\": 34024,\n    \"INVALID_FRAMEBUFFER_OPERATION\": 1286,\n    \"UNPACK_FLIP_Y_WEBGL\": 37440,\n    \"UNPACK_PREMULTIPLY_ALPHA_WEBGL\": 37441,\n    \"CONTEXT_LOST_WEBGL\": 37442,\n    \"UNPACK_COLORSPACE_CONVERSION_WEBGL\": 37443,\n    \"BROWSER_DEFAULT_WEBGL\": 37444\n};"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/GLmethod.js",
    "content": "let i = 1;\n\nconst GLmethod = {};\n\nGLmethod.activeTexture = i++;         //1\nGLmethod.attachShader = i++;\nGLmethod.bindAttribLocation = i++;\nGLmethod.bindBuffer = i++;\nGLmethod.bindFramebuffer = i++;\nGLmethod.bindRenderbuffer = i++;\nGLmethod.bindTexture = i++;\nGLmethod.blendColor = i++;\nGLmethod.blendEquation = i++;\nGLmethod.blendEquationSeparate = i++; //10\nGLmethod.blendFunc = i++;\nGLmethod.blendFuncSeparate = i++;\nGLmethod.bufferData = i++;\nGLmethod.bufferSubData = i++;\nGLmethod.checkFramebufferStatus = i++;\nGLmethod.clear = i++;\nGLmethod.clearColor = i++;\nGLmethod.clearDepth = i++;\nGLmethod.clearStencil = i++;\nGLmethod.colorMask = i++;              //20\nGLmethod.compileShader = i++;\nGLmethod.compressedTexImage2D = i++;\nGLmethod.compressedTexSubImage2D = i++;\nGLmethod.copyTexImage2D = i++;\nGLmethod.copyTexSubImage2D = i++;\nGLmethod.createBuffer = i++;\nGLmethod.createFramebuffer = i++;\nGLmethod.createProgram = i++;\nGLmethod.createRenderbuffer = i++;\nGLmethod.createShader = i++;           //30\nGLmethod.createTexture = i++;\nGLmethod.cullFace = i++;\nGLmethod.deleteBuffer = i++;\nGLmethod.deleteFramebuffer = i++;\nGLmethod.deleteProgram = i++;\nGLmethod.deleteRenderbuffer = i++;\nGLmethod.deleteShader = i++;\nGLmethod.deleteTexture = i++;\nGLmethod.depthFunc = i++;\nGLmethod.depthMask = i++;              //40\nGLmethod.depthRange = i++;\nGLmethod.detachShader = i++;\nGLmethod.disable = i++;\nGLmethod.disableVertexAttribArray = i++;\nGLmethod.drawArrays = i++;\nGLmethod.drawArraysInstancedANGLE = i++;\nGLmethod.drawElements = i++;\nGLmethod.drawElementsInstancedANGLE = i++;\nGLmethod.enable = i++;\nGLmethod.enableVertexAttribArray = i++;    //50\nGLmethod.flush = i++;\nGLmethod.framebufferRenderbuffer = i++;\nGLmethod.framebufferTexture2D = i++;\nGLmethod.frontFace = i++;\nGLmethod.generateMipmap = i++;\nGLmethod.getActiveAttrib = i++;\nGLmethod.getActiveUniform = i++;\nGLmethod.getAttachedShaders = i++;\nGLmethod.getAttribLocation = i++;\nGLmethod.getBufferParameter = i++;         //60\nGLmethod.getContextAttributes = i++;\nGLmethod.getError = i++;\nGLmethod.getExtension = i++;\nGLmethod.getFramebufferAttachmentParameter = i++;\nGLmethod.getParameter = i++;\nGLmethod.getProgramInfoLog = i++;\nGLmethod.getProgramParameter = i++;\nGLmethod.getRenderbufferParameter = i++;\nGLmethod.getShaderInfoLog = i++;\nGLmethod.getShaderParameter = i++;         //70\nGLmethod.getShaderPrecisionFormat = i++;\nGLmethod.getShaderSource = i++;\nGLmethod.getSupportedExtensions = i++;\nGLmethod.getTexParameter = i++;\nGLmethod.getUniform = i++;\nGLmethod.getUniformLocation = i++;\nGLmethod.getVertexAttrib = i++;\nGLmethod.getVertexAttribOffset = i++;\nGLmethod.isBuffer = i++;\nGLmethod.isContextLost = i++;              //80\nGLmethod.isEnabled = i++;\nGLmethod.isFramebuffer = i++;\nGLmethod.isProgram = i++;\nGLmethod.isRenderbuffer = i++;\nGLmethod.isShader = i++;\nGLmethod.isTexture = i++;\nGLmethod.lineWidth = i++;\nGLmethod.linkProgram = i++;\nGLmethod.pixelStorei = i++;\nGLmethod.polygonOffset = i++;              //90\nGLmethod.readPixels = i++;\nGLmethod.renderbufferStorage = i++;\nGLmethod.sampleCoverage = i++;\nGLmethod.scissor = i++;\nGLmethod.shaderSource = i++;\nGLmethod.stencilFunc = i++;\nGLmethod.stencilFuncSeparate = i++;\nGLmethod.stencilMask = i++;\nGLmethod.stencilMaskSeparate = i++;\nGLmethod.stencilOp = i++;                  //100\nGLmethod.stencilOpSeparate = i++;\nGLmethod.texImage2D = i++;\nGLmethod.texParameterf = i++;\nGLmethod.texParameteri = i++;\nGLmethod.texSubImage2D = i++;\nGLmethod.uniform1f = i++;\nGLmethod.uniform1fv = i++;\nGLmethod.uniform1i = i++;\nGLmethod.uniform1iv = i++;\nGLmethod.uniform2f = i++;                  //110\nGLmethod.uniform2fv = i++;\nGLmethod.uniform2i = i++;\nGLmethod.uniform2iv = i++;\nGLmethod.uniform3f = i++;\nGLmethod.uniform3fv = i++;\nGLmethod.uniform3i = i++;\nGLmethod.uniform3iv = i++;\nGLmethod.uniform4f = i++;\nGLmethod.uniform4fv = i++;\nGLmethod.uniform4i = i++;                  //120\nGLmethod.uniform4iv = i++;\nGLmethod.uniformMatrix2fv = i++;\nGLmethod.uniformMatrix3fv = i++;\nGLmethod.uniformMatrix4fv = i++;\nGLmethod.useProgram = i++;\nGLmethod.validateProgram = i++;\nGLmethod.vertexAttrib1f = i++; //new\nGLmethod.vertexAttrib2f = i++; //new\nGLmethod.vertexAttrib3f = i++; //new\nGLmethod.vertexAttrib4f = i++; //new       //130\nGLmethod.vertexAttrib1fv = i++; //new\nGLmethod.vertexAttrib2fv = i++; //new\nGLmethod.vertexAttrib3fv = i++; //new\nGLmethod.vertexAttrib4fv = i++; //new\nGLmethod.vertexAttribPointer = i++;\nGLmethod.viewport = i++;\n\nexport default GLmethod;"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/GLtype.js",
    "content": "const GLtype = {};\n\n[\n    \"GLbitfield\",    \n    \"GLboolean\",\n    \"GLbyte\",\n    \"GLclampf\",\n    \"GLenum\",\n    \"GLfloat\",\n    \"GLint\",\n    \"GLintptr\",\n    \"GLsizei\",\n    \"GLsizeiptr\",\n    \"GLshort\",\n    \"GLubyte\",\n    \"GLuint\",\n    \"GLushort\"\n].sort().map((typeName, i) => GLtype[typeName] = 1 >> (i + 1));\n\nexport default GLtype;\n\n\n\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/Program.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLProgram';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLProgram {\n    className = name;\n\n    constructor(id) {\n        this.id = id;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/Renderbuffer.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLRenderBuffer';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLRenderbuffer {\n    className = name;\n\n    constructor(id) {\n        this.id = id;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/RenderingContext.js",
    "content": "import GLenum from './GLenum';\nimport ActiveInfo from './ActiveInfo';\nimport Buffer from './Buffer';\nimport Framebuffer from './Framebuffer';\nimport Renderbuffer from './Renderbuffer';\nimport Texture from './Texture';\nimport Program from './Program';\nimport Shader from './Shader';\nimport ShaderPrecisionFormat from './ShaderPrecisionFormat';\nimport UniformLocation from './UniformLocation';\nimport GLmethod from './GLmethod';\n\nconst processArray = (array, checkArrayType = false) => {\n\n    function joinArray(arr, sep) {\n        let res = '';\n        for (let i = 0; i < arr.length; i++) {\n            if (i !== 0) {\n                res += sep;\n            }\n            res += arr[i];\n        }\n        return res;\n    }\n\n    let type = 'Float32Array';\n    if (checkArrayType) {\n        if (array instanceof Uint8Array) {\n            type = 'Uint8Array'\n        } else if (array instanceof Uint16Array) {\n            type = 'Uint16Array';\n        } else if (array instanceof Uint32Array) {\n            type = 'Uint32Array';\n        } else if (array instanceof Float32Array) {\n            type = 'Float32Array';\n        } else {\n            throw new Error('Check array type failed. Array type is ' + typeof array);\n        }\n    }\n\n    const ArrayTypes = {\n        Uint8Array: 1,\n        Uint16Array: 2,\n        Uint32Array: 4,\n        Float32Array: 14\n    };\n    return ArrayTypes[type] + ',' + btoa(joinArray(array, ','))\n}\n\nexport default class WebGLRenderingContext {\n\n    // static GBridge = null;\n\n    className = 'WebGLRenderingContext';\n\n    constructor(canvas, type, attrs) {\n        this._canvas = canvas;\n        this._type = type;\n        this._version = 'WebGL 1.0';\n        this._attrs = attrs;\n        this._map = new Map();\n\n        Object.keys(GLenum)\n            .forEach(name => Object.defineProperty(this, name, {\n                value: GLenum[name]\n            }));\n    }\n\n    get canvas() {\n        return this._canvas;\n    }\n\n    activeTexture = function (textureUnit) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.activeTexture + ',' + textureUnit,\n            true\n        );\n    }\n\n    attachShader = function (progarm, shader) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.attachShader + ',' + progarm.id + ',' + shader.id,\n            true\n        );\n    }\n\n    bindAttribLocation = function (program, index, name) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bindAttribLocation + ',' + program.id + ',' + index + ',' + name,\n            true\n        )\n    }\n\n    bindBuffer = function (target, buffer) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bindBuffer + ',' + target + ',' + (buffer ? buffer.id : 0),\n            true\n        );\n    }\n\n    bindFramebuffer = function (target, framebuffer) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bindFramebuffer + ',' + target + ',' + (framebuffer ? framebuffer.id : 0),\n            true\n        )\n    }\n\n    bindRenderbuffer = function (target, renderBuffer) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bindRenderbuffer + ',' + target + ',' + (renderBuffer ? renderBuffer.id : 0),\n            true\n        )\n    }\n\n    bindTexture = function (target, texture) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bindTexture + ',' + target + ',' + (texture ? texture.id : 0),\n            true\n        )\n    }\n\n    blendColor = function (r, g, b, a) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.blendColor + ',' + target + ',' + r + ',' + g + ',' + b + ',' + a,\n            true\n        )\n    }\n\n    blendEquation = function (mode) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.blendEquation + ',' + mode,\n            true\n        )\n    }\n\n    blendEquationSeparate = function (modeRGB, modeAlpha) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.blendEquationSeparate + ',' + modeRGB + ',' + modeAlpha,\n            true\n        )\n    }\n\n\n    blendFunc = function (sfactor, dfactor) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.blendFunc + ',' + sfactor + ',' + dfactor,\n            true\n        );\n    }\n\n    blendFuncSeparate = function (srcRGB, dstRGB, srcAlpha, dstAlpha) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.blendFuncSeparate + ',' + srcRGB + ',' + dstRGB + ',' + srcAlpha + ',' + dstAlpha,\n            true\n        );\n    }\n\n    bufferData = function (target, data, usage) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bufferData + ',' + target + ',' + processArray(data, true) + ',' + usage,\n            true\n        )\n    }\n\n    bufferSubData = function (target, offset, data) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.bufferSubData + ',' + target + ',' + offset + ',' + processArray(data, true),\n            true\n        )\n    }\n\n    checkFramebufferStatus = function (target) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.checkFramebufferStatus + ',' + target\n        );\n        return Number(result);\n    }\n\n    clear = function (mask) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.clear + ',' + mask\n        );\n        this._canvas._needRender = true;\n    }\n\n    clearColor = function (r, g, b, a) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.clearColor + ',' + r + ',' + g + ',' + b,\n            true\n        )\n    }\n\n    clearDepth = function (depth) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.clearDepth + ',' + depth,\n            true\n        )\n    }\n\n    clearStencil = function (s) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.clearStencil + ',' + s\n        );\n    }\n\n    colorMask = function (r, g, b, a) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.colorMask + ',' + r + ',' + g + ',' + b + ',' + a\n        )\n    }\n\n    compileShader = function (shader) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.compileShader + ',' + shader.id,\n            true\n        )\n    }\n\n    compressedTexImage2D = function (target, level, internalformat, width, height, border, pixels) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.compressedTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' +\n            width + ',' + height + ',' + border + ',' + processArray(pixels),\n            true\n        )\n    }\n\n    compressedTexSubImage2D = function (target, level, xoffset, yoffset, width, height, format, pixels) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.compressedTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' +\n            width + ',' + height + ',' + format + ',' + processArray(pixels),\n            true\n        )\n    }\n\n\n    copyTexImage2D = function (target, level, internalformat, x, y, width, height, border) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.copyTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + x + ',' + y + ',' +\n            width + ',' + height + ',' + border,\n            true\n        );\n    }\n\n    copyTexSubImage2D = function (target, level, xoffset, yoffset, x, y, width, height) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.copyTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + x + ',' + y + ',' +\n            width + ',' + height\n        );\n    }\n\n    createBuffer = function () {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.createBuffer + ''\n        );\n        const buffer = new Buffer(result);\n        this._map.set(buffer.uuid(), buffer);\n        return buffer;\n    }\n\n    createFramebuffer = function () {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.createFramebuffer + ''\n        );\n        const framebuffer = new Framebuffer(result);\n        this._map.set(framebuffer.uuid(), framebuffer);\n        return framebuffer;\n    }\n\n\n    createProgram = function () {\n        const id = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.createProgram + ''\n        );\n        const program = new Program(id);\n        this._map.set(program.uuid(), program);\n        return program;\n    }\n\n    createRenderbuffer = function () {\n        const id = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.createRenderbuffer + ''\n        )\n        const renderBuffer = new Renderbuffer(id);\n        this._map.set(renderBuffer.uuid(), renderBuffer);\n        return renderBuffer;\n    }\n\n    createShader = function (type) {\n        const id = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.createShader + ',' + type\n        )\n        const shader = new Shader(id, type);\n        this._map.set(shader.uuid(), shader);\n        return shader;\n    }\n\n    createTexture = function () {\n        const id = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.createTexture + ''\n        );\n        const texture = new Texture(id);\n        this._map.set(texture.uuid(), texture);\n        return texture;\n    }\n\n    cullFace = function (mode) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.cullFace + ',' + mode,\n            true\n        )\n    }\n\n\n    deleteBuffer = function (buffer) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.deleteBuffer + ',' + buffer.id,\n            true\n        )\n    }\n\n    deleteFramebuffer = function (framebuffer) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.deleteFramebuffer + ',' + framebuffer.id,\n            true\n        )\n    }\n\n    deleteProgram = function (program) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.deleteProgram + ',' + program.id,\n            true\n        )\n    }\n\n    deleteRenderbuffer = function (renderbuffer) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.deleteRenderbuffer + ',' + renderbuffer.id,\n            true\n        )\n    }\n\n    deleteShader = function (shader) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.deleteShader + ',' + shader.id,\n            true\n        )\n    }\n\n    deleteTexture = function (texture) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.deleteTexture + ',' + texture.id,\n            true\n        )\n    }\n\n    depthFunc = function (func) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.depthFunc + ',' + func\n        )\n    }\n\n    depthMask = function (flag) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.depthMask + ',' + Number(flag),\n            true\n        )\n    }\n\n    depthRange = function (zNear, zFar) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.depthRange + ',' + zNear + ',' + zFar,\n            true\n        )\n    }\n\n    detachShader = function (program, shader) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.detachShader + ',' + program.id + ',' + shader.id,\n            true\n        )\n    }\n\n    disable = function (cap) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.disable + ',' + cap,\n            true\n        )\n    }\n\n    disableVertexAttribArray = function (index) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.disableVertexAttribArray + ',' + index,\n            true\n        );\n    }\n\n    drawArrays = function (mode, first, count) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.drawArrays + ',' + mode + ',' + first + ',' + count\n        )\n        this._canvas._needRender = true;\n    }\n\n    drawElements = function (mode, count, type, offset) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.drawElements + ',' + mode + ',' + count + ',' + type + ',' + offset + ';'\n        );\n        this._canvas._needRender = true;\n    }\n\n    enable = function (cap) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.enable + ',' + cap,\n            true\n        );\n    }\n\n    enableVertexAttribArray = function (index) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.enableVertexAttribArray + ',' + index,\n            true\n        )\n    }\n\n\n    flush = function () {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.flush + ''\n        )\n    }\n\n    framebufferRenderbuffer = function (target, attachment, textarget, texture, level) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.framebufferRenderbuffer + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level,\n            true\n        )\n    }\n\n    framebufferTexture2D = function (target, attachment, textarget, texture, level) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.framebufferTexture2D + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level,\n            true\n        )\n    }\n\n    frontFace = function (mode) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.frontFace + ',' + mode,\n            true\n        )\n    }\n\n    generateMipmap = function (target) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.generateMipmap + ',' + target,\n            true\n        )\n    }\n\n    getActiveAttrib = function (progarm, index) {\n        const resultString = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getActiveAttrib + ',' + progarm.id + ',' + index\n        )\n        const [type, size, name] = resultString.split(',');\n        return new ActiveInfo({\n            type: Number(type),\n            size: Number(size),\n            name\n        });\n    }\n\n    getActiveUniform = function (progarm, index) {\n        const resultString = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getActiveUniform + ',' + progarm.id + ',' + index\n        );\n        const [type, size, name] = resultString.split(',');\n        return new ActiveInfo({\n            type: Number(type),\n            size: Number(size),\n            name\n        })\n    }\n\n    getAttachedShaders = function (progarm) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getAttachedShaders + ',' + progarm.id\n        );\n        const [type, ...ids] = result;\n        return ids.map(id => this._map.get(Shader.uuid(id)));\n    }\n\n    getAttribLocation = function (progarm, name) {\n        return WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getAttribLocation + ',' + progarm.id + ',' + name\n        )\n    }\n\n    getBufferParameter = function (target, pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getBufferParameter + ',' + target + ',' + pname\n        );\n        const [type, res] = getBufferParameter;\n        return res;\n    }\n\n    getError = function () {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getError + ''\n        )\n        return result;\n    }\n\n    getExtension = function (name) {\n        return null;\n    }\n\n    getFramebufferAttachmentParameter = function (target, attachment, pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getFramebufferAttachmentParameter + ',' + target + ',' + attachment + ',' + pname\n        )\n        switch (pname) {\n            case GLenum.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:\n                return this._map.get(Renderbuffer.uuid(result)) || this._map.get(Texture.uuid(result)) || null;\n            default:\n                return result;\n        }\n    }\n\n    getParameter = function (pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getParameter + ',' + pname\n        )\n        switch (pname) {\n            case GLenum.VERSION:\n                return this._version;\n            case GLenum.ARRAY_BUFFER_BINDING: // buffer\n            case GLenum.ELEMENT_ARRAY_BUFFER_BINDING: // buffer\n                return this._map.get(Buffer.uuid(result)) || null;\n            case GLenum.CURRENT_PROGRAM: // program\n                return this._map.get(Program.uuid(result)) || null;\n            case GLenum.FRAMEBUFFER_BINDING: // framebuffer\n                return this._map.get(Framebuffer.uuid(result)) || null;\n            case GLenum.RENDERBUFFER_BINDING: // renderbuffer\n                return this._map.get(Renderbuffer.uuid(result)) || null;\n            case GLenum.TEXTURE_BINDING_2D: // texture\n            case GLenum.TEXTURE_BINDING_CUBE_MAP: // texture\n                return this._map.get(Texture.uuid(result)) || null;\n            case GLenum.ALIASED_LINE_WIDTH_RANGE: // Float32Array\n            case GLenum.ALIASED_POINT_SIZE_RANGE: // Float32Array\n            case GLenum.BLEND_COLOR: // Float32Array\n            case GLenum.COLOR_CLEAR_VALUE: // Float32Array\n            case GLenum.DEPTH_RANGE: // Float32Array\n            case GLenum.MAX_VIEWPORT_DIMS: // Int32Array\n            case GLenum.SCISSOR_BOX: // Int32Array\n            case GLenum.VIEWPORT: // Int32Array            \n            case GLenum.COMPRESSED_TEXTURE_FORMATS: // Uint32Array\n            default:\n                const [type, ...res] = result.split(',');\n                if (res.length === 1) {\n                    return Number(res[0]);\n                } else {\n                    return res.map(Number);\n                }\n        }\n    }\n\n    getProgramInfoLog = function (progarm) {\n        return WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getProgramInfoLog + ',' + progarm.id\n        )\n    }\n\n    getProgramParameter = function (program, pname) {\n        const res = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getProgramParameter + ',' + program.id + ',' + pname\n        );\n\n        const [type, result] = res.split(',').map(i => parseInt(i));\n\n        if (type === 1) {\n            return Boolean(result);\n        } else if (type === 2) {\n            return result;\n        } else {\n            throw new Error('Unrecongized program paramater ' + res + ', type: ' + typeof res);\n        }\n    }\n\n\n    getRenderbufferParameter = function (target, pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getRenderbufferParameter + ',' + target + ',' + pname\n        )\n        return result;\n    }\n\n\n    getShaderInfoLog = function (shader) {\n        return WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getShaderInfoLog + ',' + shader.id\n        );\n    }\n\n    getShaderParameter = function (shader, pname) {\n        return WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getShaderParameter + ',' + shader.id + ',' + pname\n        )\n    }\n\n    getShaderPrecisionFormat = function (shaderType, precisionType) {\n        const [rangeMin, rangeMax, precision] = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getShaderPrecisionFormat + ',' + shaderType + ',' + precisionType\n        );\n        const shaderPrecisionFormat = new ShaderPrecisionFormat({\n            rangeMin: Number(rangeMin),\n            rangeMax: Number(rangeMax),\n            precision: Number(precision)\n        });\n        return shaderPrecisionFormat;\n    }\n\n    getShaderSource = function (shader) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getShaderSource + ',' + shader.id\n        );\n        return result;\n    }\n\n    getSupportedExtensions = function () {\n        return Object.keys({});\n    }\n\n    getTexParameter = function (target, pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getTexParameter + ',' + target + ',' + pname\n        )\n        return result;\n    }\n\n    getUniformLocation = function (program, name) {\n        const id = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getUniformLocation + ',' + program.id + ',' + name\n        );\n        if (id === -1) {\n            return null;\n        } else {\n            return new UniformLocation(Number(id));\n        }\n    }\n\n    getVertexAttrib = function (index, pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getVertexAttrib + ',' + index + ',' + pname\n        );\n        switch (pname) {\n            case GLenum.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:\n                return this._map.get(Buffer.uuid(result)) || null;\n            case GLenum.CURRENT_VERTEX_ATTRIB: // Float32Array\n            default:\n                return result;\n        }\n    }\n\n    getVertexAttribOffset = function (index, pname) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.getVertexAttribOffset + ',' + index + ',' + pname\n        )\n        return Number(result);\n    }\n\n    isBuffer = function (buffer) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isBuffer + ',' + buffer.id\n        )\n        return Boolean(result);\n    }\n\n    isContextLost = function () {\n        return false;\n    }\n\n    isEnabled = function (cap) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isEnabled + ',' + cap\n        )\n        return Boolean(result);\n    }\n\n    isFramebuffer = function (framebuffer) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isFramebuffer + ',' + framebuffer.id\n        )\n        return Boolean(result);\n    }\n\n    isProgram = function (program) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isProgram + ',' + program.id\n        )\n        return Boolean(result);\n    }\n\n    isRenderbuffer = function (renderBuffer) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isRenderbuffer + ',' + renderbuffer.id\n        )\n        return Boolean(result);\n    }\n\n    isShader = function (shader) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isShader + ',' + shader.id\n        )\n        return Boolean(result);\n    }\n\n    isTexture = function (texture) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.isTexture + ',' + texture.id\n        );\n        return Boolean(result);\n    }\n\n    lineWidth = function (width) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.lineWidth + ',' + width,\n            true\n        )\n    }\n\n    linkProgram = function (program) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.linkProgram + ',' + program.id,\n            true\n        );\n    }\n\n\n    pixelStorei = function (pname, param) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.pixelStorei + ',' + pname + ',' + Number(param)\n        )\n    }\n\n    polygonOffset = function (factor, units) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.polygonOffset + ',' + factor + ',' + units\n        )\n    }\n\n    readPixels = function (x, y, width, height, format, type, pixels) {\n        const result = WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.readPixels + ',' + x + ',' + y + ',' + width + ',' + height + ',' + format + ',' + type\n        )\n        return result;\n    }\n\n    renderbufferStorage = function (target, internalFormat, width, height) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.renderbufferStorage + ',' + target + ',' + internalFormat + ',' + width + ',' + height,\n            true\n        )\n    }\n\n    sampleCoverage = function (value, invert) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.sampleCoverage + ',' + value + ',' + Number(invert),\n            true\n        )\n    }\n\n    scissor = function (x, y, width, height) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.scissor + ',' + x + ',' + y + ',' + width + ',' + height,\n            true\n        )\n    }\n\n    shaderSource = function (shader, source) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.shaderSource + ',' + shader.id + ',' + source\n        )\n    }\n\n    stencilFunc = function (func, ref, mask) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.stencilFunc + ',' + func + ',' + ref + ',' + mask,\n            true\n        )\n    }\n\n    stencilFuncSeparate = function (face, func, ref, mask) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.stencilFuncSeparate + ',' + face + ',' + func + ',' + ref + ',' + mask,\n            true\n        )\n    }\n\n    stencilMask = function (mask) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.stencilMask + ',' + mask,\n            true\n        )\n    }\n\n    stencilMaskSeparate = function (face, mask) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.stencilMaskSeparate + ',' + face + ',' + mask,\n            true\n        )\n    }\n\n    stencilOp = function (fail, zfail, zpass) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.stencilOp + ',' + fail + ',' + zfail + ',' + zpass\n        )\n    }\n\n    stencilOpSeparate = function (face, fail, zfail, zpass) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.stencilOp + ',' + face + ',' + fail + ',' + zfail + ',' + zpass,\n            true\n        )\n    }\n\n    texImage2D = function (...args) {\n        WebGLRenderingContext.GBridge.texImage2D(this._canvas.id, ...args);\n    }\n\n\n    texParameterf = function (target, pname, param) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.texParameterf + ',' + target + ',' + pname + ',' + param,\n            true\n        )\n    }\n\n    texParameteri = function (target, pname, param) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.texParameteri + ',' + target + ',' + pname + ',' + param\n        )\n    }\n\n    texSubImage2D = function (...args) {\n        WebGLRenderingContext.GBridge.texSubImage2D(this._canvas.id, ...args);\n    }\n\n    uniform1f = function (location, v0) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform1f + ',' + location.id + ',' + v0\n        )\n    }\n\n    uniform1fv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform1fv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform1i = function (location, v0) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform1i + ',' + location.id + ',' + v0,\n            // true\n        )\n    }\n\n    uniform1iv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform1iv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform2f = function (location, v0, v1) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform2f + ',' + location.id + ',' + v0 + ',' + v1,\n            true\n        )\n    }\n\n    uniform2fv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform2fv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform2i = function (location, v0, v1) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform2i + ',' + location.id + ',' + v0 + ',' + v1,\n            true\n        )\n    }\n\n    uniform2iv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform2iv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform3f = function (location, v0, v1, v2) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform3f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2,\n            true\n        )\n    }\n\n    uniform3fv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform3fv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform3i = function (location, v0, v1, v2) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform3i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2,\n            true\n        )\n    }\n\n    uniform3iv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform3iv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform4f = function (location, v0, v1, v2, v3) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform4f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,\n            true\n        )\n    }\n\n    uniform4fv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform4fv + ',' + location.id + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniform4i = function (location, v0, v1, v2, v3) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform4i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,\n            true\n        )\n    }\n\n    uniform4iv = function (location, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniform4iv + ',' + location.id + ',' + processArray(value, true),\n            true\n        )\n    }\n\n    uniformMatrix2fv = function (location, transpose, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniformMatrix2fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniformMatrix3fv = function (location, transpose, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniformMatrix3fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),\n            true\n        )\n    }\n\n    uniformMatrix4fv = function (location, transpose, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.uniformMatrix4fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),\n            true\n        );\n    }\n\n    useProgram = function (progarm) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.useProgram + ',' + progarm.id + '',\n            true\n        )\n    }\n\n\n    validateProgram = function (program) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.validateProgram + ',' + program.id,\n            true\n        )\n    }\n\n    vertexAttrib1f = function (index, v0) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib1f + ',' + index + ',' + v0,\n            true\n        )\n    }\n\n    vertexAttrib2f = function (index, v0, v1) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib2f + ',' + index + ',' + v0 + ',' + v1,\n            true\n        )\n    }\n\n    vertexAttrib3f = function (index, v0, v1, v2) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib3f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2,\n            true\n        )\n    }\n\n    vertexAttrib4f = function (index, v0, v1, v2, v3) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib4f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,\n            true\n        )\n    }\n\n    vertexAttrib1fv = function (index, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib1fv + ',' + index + ',' + processArray(value),\n            true\n        )\n    }\n\n    vertexAttrib2fv = function (index, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib2fv + ',' + index + ',' + processArray(value),\n            true\n        )\n    }\n\n    vertexAttrib3fv = function (index, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib3fv + ',' + index + ',' + processArray(value),\n            true\n        )\n    }\n\n    vertexAttrib4fv = function (index, value) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttrib4fv + ',' + index + ',' + processArray(value),\n            true\n        )\n    }\n\n    vertexAttribPointer = function (index, size, type, normalized, stride, offset) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.vertexAttribPointer + ',' + index + ',' + size + ',' + type + ',' + Number(normalized) + ',' + stride + ',' + offset,\n            true\n        )\n    }\n\n    viewport = function (x, y, width, height) {\n        WebGLRenderingContext.GBridge.callNative(\n            this._canvas.id,\n            GLmethod.viewport + ',' + x + ',' + y + ',' + width + ',' + height,\n            true\n        )\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/Shader.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLShader';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLShader {\n    className = name;\n\n    constructor(id, type) {\n        this.id = id;\n        this.type = type;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/ShaderPrecisionFormat.js",
    "content": "export default class WebGLShaderPrecisionFormat {\n    className = 'WebGLShaderPrecisionFormat';\n\n    constructor({\n        rangeMin, rangeMax, precision\n    }) {\n        this.rangeMin = rangeMin;\n        this.rangeMax = rangeMax;\n        this.precision = precision;\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/Texture.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLTexture';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLTexture {\n    className = name;\n\n    constructor(id, type) {\n        this.id = id;\n        this.type = type;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/UniformLocation.js",
    "content": "import {getTransferedObjectUUID} from './classUtils';\n\nconst name = 'WebGLUniformLocation';\n\nfunction uuid(id) {\n    return getTransferedObjectUUID(name, id);\n}\n\nexport default class WebGLUniformLocation {\n    className = name;\n\n    constructor(id, type) {\n        this.id = id;\n        this.type = type;\n    }\n\n    static uuid = uuid;\n\n    uuid() {\n        return uuid(this.id);\n    }\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/context-webgl/classUtils.js",
    "content": "export function getTransferedObjectUUID(name, id) {\n    return `${name.toLowerCase()}-${id}`;\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/env/canvas.js",
    "content": "import GContext2D from '../context-2d/RenderingContext';\nimport GContextWebGL from '../context-webgl/RenderingContext';\n\nexport default class GCanvas {\n\n    // static GBridge = null;\n\n    id = null;\n\n    _needRender = true;\n\n    constructor(id, { disableAutoSwap }) {\n        this.id = id;\n\n        this._disableAutoSwap = disableAutoSwap;\n        if (disableAutoSwap) {\n            this._swapBuffers = () => {\n                GCanvas.GBridge.render(this.id);\n            }\n        }\n    }\n\n    getContext(type) {\n\n        let context = null;\n\n        if (type.match(/webgl/i)) {\n            context = new GContextWebGL(this);\n\n            context.componentId = this.id;\n\n            if (!this._disableAutoSwap) {\n                const render = () => {\n                    if (this._needRender) {\n                        GCanvas.GBridge.render(this.id);\n                        this._needRender = false;\n                    }\n                }\n                setInterval(render, 16);\n            }\n\n            GCanvas.GBridge.callSetContextType(this.id, 1); // 0 for 2d; 1 for webgl\n        } else if (type.match(/2d/i)) {\n            context = new GContext2D(this);\n\n            context.componentId = this.id;\n\n//             const render = ( callback ) => {\n// \n//                 const commands = context._drawCommands;\n//                 context._drawCommands = '';\n// \n//                 GCanvas.GBridge.render2d(this.id, commands, callback);\n//                 this._needRender = false;\n//             }\n// \t\t\t//draw方法触发\n// \t\t\tcontext._flush = render;\n//             //setInterval(render, 16);\n\n            GCanvas.GBridge.callSetContextType(this.id, 0);\n        } else {\n            throw new Error('not supported context ' + type);\n        }\n\n        return context;\n\n    }\n\n    reset() {\n        GCanvas.GBridge.callReset(this.id);\n    }\n\n\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/env/image.js",
    "content": "let incId = 1;\n\nconst noop = function () { };\n\nclass GImage {\n\n    static GBridge = null;\n\n    constructor() {\n        this._id = incId++;\n        this._width = 0;\n        this._height = 0;\n        this._src = undefined;\n        this._onload = noop;\n        this._onerror = noop;\n        this.complete = false;\n    }\n\n    get width() {\n        return this._width;\n    }\n    set width(v) {\n        this._width = v;\n    }\n\n    get height() {\n        return this._height;\n    }\n\n    set height(v) {\n        this._height = v;\n    }\n\n    get src() {\n        return this._src;\n    }\n\n    set src(v) {\n\n        if (v.startsWith('//')) {\n            v = 'http:' + v;\n        }\n\n        this._src = v;\n\n        GImage.GBridge.perloadImage([this._src, this._id], (data) => {\n            if (typeof data === 'string') {\n                data = JSON.parse(data);\n            }\n            if (data.error) {\n                var evt = { type: 'error', target: this };\n                this.onerror(evt);\n            } else {\n                this.complete = true;\n                this.width = typeof data.width === 'number' ? data.width : 0;\n                this.height = typeof data.height === 'number' ? data.height : 0;\n                var evt = { type: 'load', target: this };\n                this.onload(evt);\n            }\n        });\n    }\n\n    addEventListener(name, listener) {\n        if (name === 'load') {\n            this.onload = listener;\n        } else if (name === 'error') {\n            this.onerror = listener;\n        }\n    }\n\n    removeEventListener(name, listener) {\n        if (name === 'load') {\n            this.onload = noop;\n        } else if (name === 'error') {\n            this.onerror = noop;\n        }\n    }\n\n    get onload() {\n        return this._onload;\n    }\n\n    set onload(v) {\n        this._onload = v;\n    }\n\n    get onerror() {\n        return this._onerror;\n    }\n\n    set onerror(v) {\n        this._onerror = v;\n    }\n}\n\nexport default GImage;"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/env/tool.js",
    "content": "\nexport function ArrayBufferToBase64 (buffer) {\n    var binary = '';\n    var bytes = new Uint8ClampedArray(buffer);\n    for (var len = bytes.byteLength, i = 0; i < len; i++) {\n        binary += String.fromCharCode(bytes[i]);\n    }\n    return btoa(binary);\n}\n\t\nexport function Base64ToUint8ClampedArray(base64String) {\n\tconst padding = '='.repeat((4 - base64String.length % 4) % 4);\n\tconst base64 = (base64String + padding)\n\t\t.replace(/\\-/g, '+')\n\t\t.replace(/_/g, '/');\n\n\tconst rawData = atob(base64);\n\tconst outputArray = new Uint8ClampedArray(rawData.length);\n\n\tfor (let i = 0; i < rawData.length; ++i) {\n\t\toutputArray[i] = rawData.charCodeAt(i);\n\t}\n\treturn outputArray;\n}"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/gcanvas/index.js",
    "content": "import GCanvas from './env/canvas';\nimport GImage from './env/image';\n\nimport GWebGLRenderingContext from './context-webgl/RenderingContext';\nimport GContext2D from './context-2d/RenderingContext';\n\nimport GBridgeWeex from './bridge/bridge-weex';\n\nexport let Image = GImage;\n\nexport let WeexBridge = GBridgeWeex;\n\nexport function enable(el, { bridge, debug, disableAutoSwap, disableComboCommands } = {}) {\n\n    const GBridge = GImage.GBridge = GCanvas.GBridge = GWebGLRenderingContext.GBridge = GContext2D.GBridge = bridge;\n\n    GBridge.callEnable(el.ref, [\n        0,      // renderMode: 0--RENDERMODE_WHEN_DIRTY, 1--RENDERMODE_CONTINUOUSLY\n        -1,     // hybridLayerType:  0--LAYER_TYPE_NONE 1--LAYER_TYPE_SOFTWARE 2--LAYER_TYPE_HARDWARE\n        false,  // supportScroll\n        false,  // newCanvasMode\n        1,      // compatible\n        'white',// clearColor\n        false   // sameLevel: newCanvasMode = true && true => GCanvasView and Webview is same level\n    ]);\n\n    if (debug === true) {\n        GBridge.callEnableDebug();\n    }\n    if (disableComboCommands) {\n        GBridge.callEnableDisableCombo();\n    }\n\n    var canvas = new GCanvas(el.ref, { disableAutoSwap });\n    canvas.width = el.style.width;\n    canvas.height = el.style.height;\n\n    return canvas;\n};"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/uqrcode/uqrcode.js",
    "content": "//---------------------------------------------------------------------\n// uQRCode二维码生成插件 v4.0.6\n// \n// uQRCode是一款基于Javascript环境开发的二维码生成插件，适用所有Javascript运行环境的前端应用和Node.js。\n// \n// Copyright (c) Sansnn uQRCode All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0.\n//   http://www.apache.org/licenses/LICENSE-2.0\n// \n// github地址：\n//   https://github.com/Sansnn/uQRCode\n// \n// npm地址：\n//   https://www.npmjs.com/package/uqrcodejs\n// \n// uni-app插件市场地址：\n//   https://ext.dcloud.net.cn/plugin?id=1287\n// \n// 复制使用请保留本段注释，感谢支持开源！\n// \n//---------------------------------------------------------------------\n\n//---------------------------------------------------------------------\n// 当前文件格式为 es，将 bundle 保留为 ES 模块文件，适用于其他打包工具以及支持 <script type=module> 标签的浏览器（别名: esm，module）\n// 如需在其他环境使用，请获取环境对应的格式文件\n// 格式说明：\n// amd - 异步模块定义，适用于 RequireJS 等模块加载器\n// cjs - CommonJS，适用于 Node 环境和其他打包工具（别名：commonjs）\n// es - 将 bundle 保留为 ES 模块文件，适用于其他打包工具以及支持 <script type=module> 标签的浏览器（别名: esm，module）\n// umd - 通用模块定义，生成的包同时支持 amd、cjs 和 iife 三种格式\n//---------------------------------------------------------------------\n\nfunction o(o){this.mode=r.MODE_8BIT_BYTE,this.data=o;}function e(o,e){this.typeNumber=o,this.errorCorrectLevel=e,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=new Array;}o.prototype={getLength:function(o){return this.data.length},write:function(o){for(var e=0;e<this.data.length;e++)o.put(this.data.charCodeAt(e),8);}},e.prototype={addData:function(e){var r=new o(e);this.dataList.push(r),this.dataCache=null;},isDark:function(o,e){if(o<0||this.moduleCount<=o||e<0||this.moduleCount<=e)throw new Error(o+\",\"+e);return this.modules[o][e]},getModuleCount:function(){return this.moduleCount},make:function(){if(this.typeNumber<1){var o=1;for(o=1;o<40;o++){for(var e=v.getRSBlocks(o,this.errorCorrectLevel),r=new p,t=0,i=0;i<e.length;i++)t+=e[i].dataCount;for(i=0;i<this.dataList.length;i++){var n=this.dataList[i];r.put(n.mode,4),r.put(n.getLength(),h.getLengthInBits(n.mode,o)),n.write(r);}if(r.getLengthInBits()<=8*t)break}this.typeNumber=o;}this.makeImpl(!1,this.getBestMaskPattern());},makeImpl:function(o,r){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var t=0;t<this.moduleCount;t++){this.modules[t]=new Array(this.moduleCount);for(var i=0;i<this.moduleCount;i++)this.modules[t][i]=null;}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(o,r),this.typeNumber>=7&&this.setupTypeNumber(o),null==this.dataCache&&(this.dataCache=e.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,r);},setupPositionProbePattern:function(o,e){for(var r=-1;r<=7;r++)if(!(o+r<=-1||this.moduleCount<=o+r))for(var t=-1;t<=7;t++)e+t<=-1||this.moduleCount<=e+t||(this.modules[o+r][e+t]=0<=r&&r<=6&&(0==t||6==t)||0<=t&&t<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=t&&t<=4);},getBestMaskPattern:function(){for(var o=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var t=h.getLostPoint(this);(0==r||o>t)&&(o=t,e=r);}return e},createMovieClip:function(o,e,r){var t=o.createEmptyMovieClip(e,r);this.make();for(var i=0;i<this.modules.length;i++)for(var n=1*i,a=0;a<this.modules[i].length;a++){var d=1*a;this.modules[i][a]&&(t.beginFill(0,100),t.moveTo(d,n),t.lineTo(d+1,n),t.lineTo(d+1,n+1),t.lineTo(d,n+1),t.endFill());}return t},setupTimingPattern:function(){for(var o=8;o<this.moduleCount-8;o++)null==this.modules[o][6]&&(this.modules[o][6]=o%2==0);for(var e=8;e<this.moduleCount-8;e++)null==this.modules[6][e]&&(this.modules[6][e]=e%2==0);},setupPositionAdjustPattern:function(){for(var o=h.getPatternPosition(this.typeNumber),e=0;e<o.length;e++)for(var r=0;r<o.length;r++){var t=o[e],i=o[r];if(null==this.modules[t][i])for(var n=-2;n<=2;n++)for(var a=-2;a<=2;a++)this.modules[t+n][i+a]=-2==n||2==n||-2==a||2==a||0==n&&0==a;}},setupTypeNumber:function(o){for(var e=h.getBCHTypeNumber(this.typeNumber),r=0;r<18;r++){var t=!o&&1==(e>>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=t;}for(r=0;r<18;r++){t=!o&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=t;}},setupTypeInfo:function(o,e){for(var r=this.errorCorrectLevel<<3|e,t=h.getBCHTypeInfo(r),i=0;i<15;i++){var n=!o&&1==(t>>i&1);i<6?this.modules[i][8]=n:i<8?this.modules[i+1][8]=n:this.modules[this.moduleCount-15+i][8]=n;}for(i=0;i<15;i++){n=!o&&1==(t>>i&1);i<8?this.modules[8][this.moduleCount-i-1]=n:i<9?this.modules[8][15-i-1+1]=n:this.modules[8][15-i-1]=n;}this.modules[this.moduleCount-8][8]=!o;},mapData:function(o,e){for(var r=-1,t=this.moduleCount-1,i=7,n=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var d=0;d<2;d++)if(null==this.modules[t][a-d]){var u=!1;n<o.length&&(u=1==(o[n]>>>i&1)),h.getMask(e,t,a-d)&&(u=!u),this.modules[t][a-d]=u,-1==--i&&(n++,i=7);}if((t+=r)<0||this.moduleCount<=t){t-=r,r=-r;break}}}},e.PAD0=236,e.PAD1=17,e.createData=function(o,r,t){for(var i=v.getRSBlocks(o,r),n=new p,a=0;a<t.length;a++){var d=t[a];n.put(d.mode,4),n.put(d.getLength(),h.getLengthInBits(d.mode,o)),d.write(n);}var u=0;for(a=0;a<i.length;a++)u+=i[a].dataCount;if(n.getLengthInBits()>8*u)throw new Error(\"code length overflow. (\"+n.getLengthInBits()+\">\"+8*u+\")\");for(n.getLengthInBits()+4<=8*u&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*u||(n.put(e.PAD0,8),n.getLengthInBits()>=8*u));)n.put(e.PAD1,8);return e.createBytes(n,i)},e.createBytes=function(o,e){for(var r=0,t=0,i=0,n=new Array(e.length),a=new Array(e.length),d=0;d<e.length;d++){var u=e[d].dataCount,s=e[d].totalCount-u;t=Math.max(t,u),i=Math.max(i,s),n[d]=new Array(u);for(var g=0;g<n[d].length;g++)n[d][g]=255&o.buffer[g+r];r+=u;var l=h.getErrorCorrectPolynomial(s),c=new f(n[d],l.getLength()-1).mod(l);a[d]=new Array(l.getLength()-1);for(g=0;g<a[d].length;g++){var m=g+c.getLength()-a[d].length;a[d][g]=m>=0?c.get(m):0;}}var v=0;for(g=0;g<e.length;g++)v+=e[g].totalCount;var p=new Array(v),C=0;for(g=0;g<t;g++)for(d=0;d<e.length;d++)g<n[d].length&&(p[C++]=n[d][g]);for(g=0;g<i;g++)for(d=0;d<e.length;d++)g<a[d].length&&(p[C++]=a[d][g]);return p};for(var r={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},t={L:1,M:0,Q:3,H:2},i=0,n=1,a=2,d=3,u=4,s=5,g=6,l=7,h={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(o){for(var e=o<<10;h.getBCHDigit(e)-h.getBCHDigit(h.G15)>=0;)e^=h.G15<<h.getBCHDigit(e)-h.getBCHDigit(h.G15);return (o<<10|e)^h.G15_MASK},getBCHTypeNumber:function(o){for(var e=o<<12;h.getBCHDigit(e)-h.getBCHDigit(h.G18)>=0;)e^=h.G18<<h.getBCHDigit(e)-h.getBCHDigit(h.G18);return o<<12|e},getBCHDigit:function(o){for(var e=0;0!=o;)e++,o>>>=1;return e},getPatternPosition:function(o){return h.PATTERN_POSITION_TABLE[o-1]},getMask:function(o,e,r){switch(o){case i:return (e+r)%2==0;case n:return e%2==0;case a:return r%3==0;case d:return (e+r)%3==0;case u:return (Math.floor(e/2)+Math.floor(r/3))%2==0;case s:return e*r%2+e*r%3==0;case g:return (e*r%2+e*r%3)%2==0;case l:return (e*r%3+(e+r)%2)%2==0;default:throw new Error(\"bad maskPattern:\"+o)}},getErrorCorrectPolynomial:function(o){for(var e=new f([1],0),r=0;r<o;r++)e=e.multiply(new f([1,c.gexp(r)],0));return e},getLengthInBits:function(o,e){if(1<=e&&e<10)switch(o){case r.MODE_NUMBER:return 10;case r.MODE_ALPHA_NUM:return 9;case r.MODE_8BIT_BYTE:case r.MODE_KANJI:return 8;default:throw new Error(\"mode:\"+o)}else if(e<27)switch(o){case r.MODE_NUMBER:return 12;case r.MODE_ALPHA_NUM:return 11;case r.MODE_8BIT_BYTE:return 16;case r.MODE_KANJI:return 10;default:throw new Error(\"mode:\"+o)}else {if(!(e<41))throw new Error(\"type:\"+e);switch(o){case r.MODE_NUMBER:return 14;case r.MODE_ALPHA_NUM:return 13;case r.MODE_8BIT_BYTE:return 16;case r.MODE_KANJI:return 12;default:throw new Error(\"mode:\"+o)}}},getLostPoint:function(o){for(var e=o.getModuleCount(),r=0,t=0;t<e;t++)for(var i=0;i<e;i++){for(var n=0,a=o.isDark(t,i),d=-1;d<=1;d++)if(!(t+d<0||e<=t+d))for(var u=-1;u<=1;u++)i+u<0||e<=i+u||0==d&&0==u||a==o.isDark(t+d,i+u)&&n++;n>5&&(r+=3+n-5);}for(t=0;t<e-1;t++)for(i=0;i<e-1;i++){var s=0;o.isDark(t,i)&&s++,o.isDark(t+1,i)&&s++,o.isDark(t,i+1)&&s++,o.isDark(t+1,i+1)&&s++,0!=s&&4!=s||(r+=3);}for(t=0;t<e;t++)for(i=0;i<e-6;i++)o.isDark(t,i)&&!o.isDark(t,i+1)&&o.isDark(t,i+2)&&o.isDark(t,i+3)&&o.isDark(t,i+4)&&!o.isDark(t,i+5)&&o.isDark(t,i+6)&&(r+=40);for(i=0;i<e;i++)for(t=0;t<e-6;t++)o.isDark(t,i)&&!o.isDark(t+1,i)&&o.isDark(t+2,i)&&o.isDark(t+3,i)&&o.isDark(t+4,i)&&!o.isDark(t+5,i)&&o.isDark(t+6,i)&&(r+=40);var g=0;for(i=0;i<e;i++)for(t=0;t<e;t++)o.isDark(t,i)&&g++;return r+=10*(Math.abs(100*g/e/e-50)/5)}},c={glog:function(o){if(o<1)throw new Error(\"glog(\"+o+\")\");return c.LOG_TABLE[o]},gexp:function(o){for(;o<0;)o+=255;for(;o>=256;)o-=255;return c.EXP_TABLE[o]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},m=0;m<8;m++)c.EXP_TABLE[m]=1<<m;for(m=8;m<256;m++)c.EXP_TABLE[m]=c.EXP_TABLE[m-4]^c.EXP_TABLE[m-5]^c.EXP_TABLE[m-6]^c.EXP_TABLE[m-8];for(m=0;m<255;m++)c.LOG_TABLE[c.EXP_TABLE[m]]=m;function f(o,e){if(null==o.length)throw new Error(o.length+\"/\"+e);for(var r=0;r<o.length&&0==o[r];)r++;this.num=new Array(o.length-r+e);for(var t=0;t<o.length-r;t++)this.num[t]=o[t+r];}function v(o,e){this.totalCount=o,this.dataCount=e;}function p(){this.buffer=new Array,this.length=0;}function C(o){return o.setFillStyle=o.setFillStyle||function(e){o.fillStyle=e;},o.setFontSize=o.setFontSize||function(e){o.font=`${e}px`;},o.setTextAlign=o.setTextAlign||function(e){o.textAlign=e;},o.setTextBaseline=o.setTextBaseline||function(e){o.textBaseline=e;},o.setGlobalAlpha=o.setGlobalAlpha||function(e){o.globalAlpha=e;},o.setStrokeStyle=o.setStrokeStyle||function(e){o.strokeStyle=e;},o.setShadow=o.setShadow||function(e,r,t,i){o.shadowOffsetX=e,o.shadowOffsetY=r,o.shadowBlur=t,o.shadowColor=i;},o.draw=o.draw||function(o,e){e&&e();},o.clearRect=o.clearRect||function(e,r,t,i){o.draw(!1);},o}function b(o,e){var r=this.data=\"\",t=this.size=200;this.useDynamicSize=!1,this.dynamicSize=t;var i=this.typeNumber=-1;this.errorCorrectLevel=b.errorCorrectLevel.H;var n=this.margin=0;this.areaColor=\"#FFFFFF\",this.backgroundColor=\"rgba(255,255,255,0)\",this.backgroundImageSrc=void 0;var a=this.backgroundImageWidth=void 0,d=this.backgroundImageHeight=void 0,u=this.backgroundImageX=void 0,s=this.backgroundImageY=void 0;this.backgroundImageAlpha=1,this.backgroundImageBorderRadius=0;var g=this.backgroundPadding=0;this.foregroundColor=\"#000000\",this.foregroundImageSrc=void 0;var l=this.foregroundImageWidth=void 0,h=this.foregroundImageHeight=void 0,c=this.foregroundImageX=void 0,m=this.foregroundImageY=void 0,f=this.foregroundImagePadding=0;this.foregroundImageBackgroundColor=\"#FFFFFF\";var v=this.foregroundImageBorderRadius=0,p=this.foregroundImageShadowOffsetX=0,k=this.foregroundImageShadowOffsetY=0,y=this.foregroundImageShadowBlur=0;this.foregroundImageShadowColor=\"#808080\";var w=this.foregroundPadding=0,I=this.positionProbeBackgroundColor=void 0,B=this.positionProbeForegroundColor=void 0,S=this.separatorColor=void 0,P=this.positionAdjustBackgroundColor=void 0,L=this.positionAdjustForegroundColor=void 0,D=this.timingBackgroundColor=void 0,A=this.timingForegroundColor=void 0,E=this.typeNumberBackgroundColor=void 0,T=this.typeNumberForegroundColor=void 0,N=this.darkBlockColor=void 0;this.base=void 0,this.modules=[],this.moduleCount=0,this.drawModules=[];var M=this.canvasContext=void 0;this.loadImage,this.drawReserve=!1,this.isMaked=!1,Object.defineProperties(this,{data:{get(){if(\"\"===r||void 0===r)throw console.error(\"[uQRCode]: data must be set!\"),new b.Error(\"data must be set!\");return r},set(o){r=String(o);}},size:{get:()=>t,set(o){t=Number(o);}},typeNumber:{get:()=>i,set(o){i=Number(o);}},margin:{get:()=>n,set(o){n=Number(o);}},backgroundImageWidth:{get(){return void 0===a?this.dynamicSize:this.useDynamicSize?this.dynamicSize/this.size*a:a},set(o){a=Number(o);}},backgroundImageHeight:{get(){return void 0===d?this.dynamicSize:this.useDynamicSize?this.dynamicSize/this.size*d:d},set(o){d=Number(o);}},backgroundImageX:{get(){return void 0===u?0:this.useDynamicSize?this.dynamicSize/this.size*u:u},set(o){u=Number(o);}},backgroundImageY:{get(){return void 0===s?0:this.useDynamicSize?this.dynamicSize/this.size*s:s},set(o){s=Number(o);}},backgroundPadding:{get:()=>g,set(o){g=o>1?1:o<0?0:o;}},foregroundImageWidth:{get(){return void 0===l?(this.dynamicSize-2*this.margin)/4:this.useDynamicSize?this.dynamicSize/this.size*l:l},set(o){l=Number(o);}},foregroundImageHeight:{get(){return void 0===h?(this.dynamicSize-2*this.margin)/4:this.useDynamicSize?this.dynamicSize/this.size*h:h},set(o){h=Number(o);}},foregroundImageX:{get(){return void 0===c?this.dynamicSize/2-this.foregroundImageWidth/2:this.useDynamicSize?this.dynamicSize/this.size*c:c},set(o){c=Number(o);}},foregroundImageY:{get(){return void 0===m?this.dynamicSize/2-this.foregroundImageHeight/2:this.useDynamicSize?this.dynamicSize/this.size*m:m},set(o){m=Number(o);}},foregroundImagePadding:{get(){return this.useDynamicSize?this.dynamicSize/this.size*f:f},set(o){f=Number(o);}},foregroundImageBorderRadius:{get(){return this.useDynamicSize?this.dynamicSize/this.size*v:v},set(o){v=Number(o);}},foregroundImageShadowOffsetX:{get(){return this.useDynamicSize?this.dynamicSize/this.size*p:p},set(o){p=Number(o);}},foregroundImageShadowOffsetY:{get(){return this.useDynamicSize?this.dynamicSize/this.size*k:k},set(o){k=Number(o);}},foregroundImageShadowBlur:{get(){return this.useDynamicSize?this.dynamicSize/this.size*y:y},set(o){y=Number(o);}},foregroundPadding:{get:()=>w,set(o){w=o>1?1:o<0?0:o;}},positionProbeBackgroundColor:{get(){return I||this.backgroundColor},set(o){I=o;}},positionProbeForegroundColor:{get(){return B||this.foregroundColor},set(o){B=o;}},separatorColor:{get(){return S||this.backgroundColor},set(o){S=o;}},positionAdjustBackgroundColor:{get(){return P||this.backgroundColor},set(o){P=o;}},positionAdjustForegroundColor:{get(){return L||this.foregroundColor},set(o){L=o;}},timingBackgroundColor:{get(){return D||this.backgroundColor},set(o){D=o;}},timingForegroundColor:{get(){return A||this.foregroundColor},set(o){A=o;}},typeNumberBackgroundColor:{get(){return E||this.backgroundColor},set(o){E=o;}},typeNumberForegroundColor:{get(){return T||this.foregroundColor},set(o){T=o;}},darkBlockColor:{get(){return N||this.foregroundColor},set(o){N=o;}},canvasContext:{get(){if(void 0===M)throw console.error(\"[uQRCode]: use drawCanvas, you need to set the canvasContext!\"),new b.Error(\"use drawCanvas, you need to set the canvasContext!\");return M},set(o){M=C(o);}}}),b.plugins.forEach((o=>o(b,this,!1))),o&&this.setOptions(o),e&&(this.canvasContext=C(e));}f.prototype={get:function(o){return this.num[o]},getLength:function(){return this.num.length},multiply:function(o){for(var e=new Array(this.getLength()+o.getLength()-1),r=0;r<this.getLength();r++)for(var t=0;t<o.getLength();t++)e[r+t]^=c.gexp(c.glog(this.get(r))+c.glog(o.get(t)));return new f(e,0)},mod:function(o){if(this.getLength()-o.getLength()<0)return this;for(var e=c.glog(this.get(0))-c.glog(o.get(0)),r=new Array(this.getLength()),t=0;t<this.getLength();t++)r[t]=this.get(t);for(t=0;t<o.getLength();t++)r[t]^=c.gexp(c.glog(o.get(t))+e);return new f(r,0).mod(o)}},v.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],v.getRSBlocks=function(o,e){var r=v.getRsBlockTable(o,e);if(null==r)throw new Error(\"bad rs block @ typeNumber:\"+o+\"/errorCorrectLevel:\"+e);for(var t=r.length/3,i=new Array,n=0;n<t;n++)for(var a=r[3*n+0],d=r[3*n+1],u=r[3*n+2],s=0;s<a;s++)i.push(new v(d,u));return i},v.getRsBlockTable=function(o,e){switch(e){case t.L:return v.RS_BLOCK_TABLE[4*(o-1)+0];case t.M:return v.RS_BLOCK_TABLE[4*(o-1)+1];case t.Q:return v.RS_BLOCK_TABLE[4*(o-1)+2];case t.H:return v.RS_BLOCK_TABLE[4*(o-1)+3];default:return}},p.prototype={get:function(o){var e=Math.floor(o/8);return 1==(this.buffer[e]>>>7-o%8&1)},put:function(o,e){for(var r=0;r<e;r++)this.putBit(1==(o>>>e-r-1&1));},getLengthInBits:function(){return this.length},putBit:function(o){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),o&&(this.buffer[e]|=128>>>this.length%8),this.length++;}},e.errorCorrectLevel=t,b.errorCorrectLevel=e.errorCorrectLevel,b.Error=function(o){this.errMsg=\"[uQRCode]: \"+o;},b.plugins=[],b.use=function(o){\"function\"==typeof o&&b.plugins.push(o);},b.prototype.loadImage=function(o){return Promise.resolve(o)},b.prototype.setOptions=function(o){var e,r,t,i,n,a,d,u,s,g,l,h,c,m,f,v,p,C,b,k,y,w,I,B,S,P,L,D,A,E,T,N,M,z,R,_,O,F,x,H,X,Y,j,W,G,K,Q,U,$,J,q,V,Z,oo,eo,ro;o&&(Object.keys(o).forEach((e=>{this[e]=o[e];})),function(o={},e={},r=!1){let t;t=r?o:{...o};for(let o in e){var i=e[o];null!=i&&(i.constructor==Object?t[o]=this.deepReplace(t[o],i):i.constructor!=String||i?t[o]=i:t[o]=t[o]);}}(this,{data:o.data||o.text,size:o.size,useDynamicSize:o.useDynamicSize,typeNumber:o.typeNumber,errorCorrectLevel:o.errorCorrectLevel,margin:o.margin,areaColor:o.areaColor,backgroundColor:o.backgroundColor||(null===(e=o.background)||void 0===e?void 0:e.color),backgroundImageSrc:o.backgroundImageSrc||(null===(r=o.background)||void 0===r||null===(t=r.image)||void 0===t?void 0:t.src),backgroundImageWidth:o.backgroundImageWidth||(null===(i=o.background)||void 0===i||null===(n=i.image)||void 0===n?void 0:n.width),backgroundImageHeight:o.backgroundImageHeight||(null===(a=o.background)||void 0===a||null===(d=a.image)||void 0===d?void 0:d.height),backgroundImageX:o.backgroundImageX||(null===(u=o.background)||void 0===u||null===(s=u.image)||void 0===s?void 0:s.x),backgroundImageY:o.backgroundImageY||(null===(g=o.background)||void 0===g||null===(l=g.image)||void 0===l?void 0:l.y),backgroundImageAlpha:o.backgroundImageAlpha||(null===(h=o.background)||void 0===h||null===(c=h.image)||void 0===c?void 0:c.alpha),backgroundImageBorderRadius:o.backgroundImageBorderRadius||(null===(m=o.background)||void 0===m||null===(f=m.image)||void 0===f?void 0:f.borderRadius),backgroundPadding:o.backgroundPadding,foregroundColor:o.foregroundColor||(null===(v=o.foreground)||void 0===v?void 0:v.color),foregroundImageSrc:o.foregroundImageSrc||(null===(p=o.foreground)||void 0===p||null===(C=p.image)||void 0===C?void 0:C.src),foregroundImageWidth:o.foregroundImageWidth||(null===(b=o.foreground)||void 0===b||null===(k=b.image)||void 0===k?void 0:k.width),foregroundImageHeight:o.foregroundImageHeight||(null===(y=o.foreground)||void 0===y||null===(w=y.image)||void 0===w?void 0:w.height),foregroundImageX:o.foregroundImageX||(null===(I=o.foreground)||void 0===I||null===(B=I.image)||void 0===B?void 0:B.x),foregroundImageY:o.foregroundImageY||(null===(S=o.foreground)||void 0===S||null===(P=S.image)||void 0===P?void 0:P.y),foregroundImagePadding:o.foregroundImagePadding||(null===(L=o.foreground)||void 0===L||null===(D=L.image)||void 0===D?void 0:D.padding),foregroundImageBackgroundColor:o.foregroundImageBackgroundColor||(null===(A=o.foreground)||void 0===A||null===(E=A.image)||void 0===E?void 0:E.backgroundColor),foregroundImageBorderRadius:o.foregroundImageBorderRadius||(null===(T=o.foreground)||void 0===T||null===(N=T.image)||void 0===N?void 0:N.borderRadius),foregroundImageShadowOffsetX:o.foregroundImageShadowOffsetX||(null===(M=o.foreground)||void 0===M||null===(z=M.image)||void 0===z?void 0:z.shadowOffsetX),foregroundImageShadowOffsetY:o.foregroundImageShadowOffsetY||(null===(R=o.foreground)||void 0===R||null===(_=R.image)||void 0===_?void 0:_.shadowOffsetY),foregroundImageShadowBlur:o.foregroundImageShadowBlur||(null===(O=o.foreground)||void 0===O||null===(F=O.image)||void 0===F?void 0:F.shadowBlur),foregroundImageShadowColor:o.foregroundImageShadowColor||(null===(x=o.foreground)||void 0===x||null===(H=x.image)||void 0===H?void 0:H.shadowColor),foregroundPadding:o.foregroundPadding,positionProbeBackgroundColor:o.positionProbeBackgroundColor||(null===(X=o.positionProbe)||void 0===X?void 0:X.backgroundColor)||(null===(Y=o.positionDetection)||void 0===Y?void 0:Y.backgroundColor),positionProbeForegroundColor:o.positionProbeForegroundColor||(null===(j=o.positionProbe)||void 0===j?void 0:j.foregroundColor)||(null===(W=o.positionDetection)||void 0===W?void 0:W.foregroundColor),separatorColor:o.separatorColor||(null===(G=o.separator)||void 0===G?void 0:G.color),positionAdjustBackgroundColor:o.positionAdjustBackgroundColor||(null===(K=o.positionAdjust)||void 0===K?void 0:K.backgroundColor)||(null===(Q=o.alignment)||void 0===Q?void 0:Q.backgroundColor),positionAdjustForegroundColor:o.positionAdjustForegroundColor||(null===(U=o.positionAdjust)||void 0===U?void 0:U.foregroundColor)||(null===($=o.alignment)||void 0===$?void 0:$.foregroundColor),timingBackgroundColor:o.timingBackgroundColor||(null===(J=o.timing)||void 0===J?void 0:J.backgroundColor),timingForegroundColor:o.timingForegroundColor||(null===(q=o.timing)||void 0===q?void 0:q.foregroundColor),typeNumberBackgroundColor:o.typeNumberBackgroundColor||(null===(V=o.typeNumber)||void 0===V?void 0:V.backgroundColor)||(null===(Z=o.versionInformation)||void 0===Z?void 0:Z.backgroundColor),typeNumberForegroundColor:o.typeNumberForegroundColor||(null===(oo=o.typeNumber)||void 0===oo?void 0:oo.foregroundColor)||(null===(eo=o.versionInformation)||void 0===eo?void 0:eo.foregroundColor),darkBlockColor:o.darkBlockColor||(null===(ro=o.darkBlock)||void 0===ro?void 0:ro.color)},!0));},b.prototype.make=function(){let{foregroundColor:o,backgroundColor:r,typeNumber:t,errorCorrectLevel:i,data:n,size:a,margin:d,useDynamicSize:u}=this;if(o===r)throw console.error(\"[uQRCode]: foregroundColor and backgroundColor cannot be the same!\"),new b.Error(\"foregroundColor and backgroundColor cannot be the same!\");var s=new e(t,i);s.addData(function(o){o=o.toString();for(var e,r=\"\",t=0;t<o.length;t++)(e=o.charCodeAt(t))>=1&&e<=127?r+=o.charAt(t):e>2047?(r+=String.fromCharCode(224|e>>12&15),r+=String.fromCharCode(128|e>>6&63),r+=String.fromCharCode(128|e>>0&63)):(r+=String.fromCharCode(192|e>>6&31),r+=String.fromCharCode(128|e>>0&63));return r}(n)),s.make(),this.base=s,this.typeNumber=s.typeNumber,this.modules=s.modules,this.moduleCount=s.moduleCount,this.dynamicSize=u?Math.ceil((a-2*d)/s.moduleCount)*s.moduleCount+2*d:a,function(o){let{dynamicSize:e,margin:r,backgroundColor:t,backgroundPadding:i,foregroundColor:n,foregroundPadding:a,modules:d,moduleCount:u}=o,s=(e-2*r)/u,g=s,l=0;i>0&&(l=g*i/2,g-=2*l);let h=s,c=0;a>0&&(c=h*a/2,h-=2*c);for(var m=0;m<u;m++)for(var f=0;f<u;f++){var v=f*s+r,p=m*s+r;if(d[m][f]){var C=c,b=v+c,k=p+c,y=h,w=h;d[m][f]={type:[\"foreground\"],color:n,isBlack:!0,isDrawn:!1,destX:v,destY:p,destWidth:s,destHeight:s,x:b,y:k,width:y,height:w,paddingTop:C,paddingRight:C,paddingBottom:C,paddingLeft:C};}else C=l,b=v+l,k=p+l,y=g,w=g,d[m][f]={type:[\"background\"],color:t,isBlack:!1,isDrawn:!1,destX:v,destY:p,destWidth:s,destHeight:s,x:b,y:k,width:y,height:w,paddingTop:C,paddingRight:C,paddingBottom:C,paddingLeft:C};}}(this),function(o){let{modules:e,moduleCount:r,positionProbeBackgroundColor:t,positionProbeForegroundColor:i}=o,n=r-7;[[0,0,1],[1,0,1],[2,0,1],[3,0,1],[4,0,1],[5,0,1],[6,0,1],[0,1,1],[1,1,0],[2,1,0],[3,1,0],[4,1,0],[5,1,0],[6,1,1],[0,2,1],[1,2,0],[2,2,1],[3,2,1],[4,2,1],[5,2,0],[6,2,1],[0,3,1],[1,3,0],[2,3,1],[3,3,1],[4,3,1],[5,3,0],[6,3,1],[0,4,1],[1,4,0],[2,4,1],[3,4,1],[4,4,1],[5,4,0],[6,4,1],[0,5,1],[1,5,0],[2,5,0],[3,5,0],[4,5,0],[5,5,0],[6,5,1],[0,6,1],[1,6,1],[2,6,1],[3,6,1],[4,6,1],[5,6,1],[6,6,1]].forEach((o=>{var r=e[o[0]][o[1]],a=e[o[0]+n][o[1]],d=e[o[0]][o[1]+n];d.type.push(\"positionProbe\"),a.type.push(\"positionProbe\"),r.type.push(\"positionProbe\"),r.color=1==o[2]?i:t,a.color=1==o[2]?i:t,d.color=1==o[2]?i:t;}));}(this),function(o){let{modules:e,moduleCount:r,separatorColor:t}=o;[[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7],[0,7],[1,7],[2,7],[3,7],[4,7],[5,7],[6,7]].forEach((o=>{var i=e[o[0]][o[1]],n=e[r-o[0]-1][o[1]],a=e[o[0]][r-o[1]-1];a.type.push(\"separator\"),n.type.push(\"separator\"),i.type.push(\"separator\"),i.color=t,n.color=t,a.color=t;}));}(this),function(o){let{typeNumber:e,modules:r,moduleCount:t,foregroundColor:i,backgroundColor:n,positionAdjustForegroundColor:a,positionAdjustBackgroundColor:d,timingForegroundColor:u,timingBackgroundColor:s}=o;const g=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]][e-1];if(g){const o=[[-2,-2,1],[-1,-2,1],[0,-2,1],[1,-2,1],[2,-2,1],[-2,-1,1],[-1,-1,0],[0,-1,0],[1,-1,0],[2,-1,1],[-2,0,1],[-1,0,0],[0,0,1],[1,0,0],[2,0,1],[-2,1,1],[-1,1,0],[0,1,0],[1,1,0],[2,1,1],[-2,2,1],[-1,2,1],[0,2,1],[1,2,1],[2,2,1]],e=g.length;for(let l=0;l<e;l++)for(let h=0;h<e;h++){let{x:e,y:c}={x:g[l],y:g[h]};e<9&&c<9||e>t-9-1&&c<9||c>t-9-1&&e<9||o.forEach((o=>{var t=r[e+o[0]][c+o[1]];t.type.push(\"positionAdjust\"),t.type.includes(\"timing\")?1==o[2]?t.color=a==i?u:a:t.color=a==i&&d==n?s:d:t.color=1==o[2]?a:d;}));}}}(this),function(o){let{modules:e,moduleCount:r,timingForegroundColor:t,timingBackgroundColor:i}=o,n=r-16;for(let o=0;o<n;o++){var a=e[6][8+o],d=e[8+o][6];a.type.push(\"timing\"),d.type.push(\"timing\"),a.color=1&o^1?t:i,d.color=1&o^1?t:i;}}(this),function(o){let{modules:e,moduleCount:r,darkBlockColor:t}=o;var i=e[r-7-1][8];i.type.push(\"darkBlock\"),i.color=t;}(this),function(o){let{typeNumber:e,modules:r,moduleCount:t,typeNumberBackgroundColor:i,typeNumberForegroundColor:n}=o;if(e<7)return r;const a=[0,0,0,0,0,0,0,\"000111110010010100\",\"001000010110111100\",\"001001101010011001\",\"001010010011010011\",\"001011101111110110\",\"001100011101100010\",\"001101100001000111\",\"001110011000001101\",\"001111100100101000\",\"010000101101111000\",\"010001010001011101\",\"010010101000010111\",\"010011010100110010\",\"010100100110100110\",\"010101011010000011\",\"010110100011001001\",\"010111011111101100\",\"011000111011000100\",\"011001000111100001\",\"011010111110101011\",\"011011000010001110\",\"011100110000011010\",\"011101001100111111\",\"011110110101110101\",\"011111001001010000\",\"100000100111010101\",\"100001011011110000\",\"100010100010111010\",\"100011011110011111\",\"100100101100001011\",\"100101010000101110\",\"100110101001100100\",\"100111010101000001\",\"101000110001101001\"];let d=a[e]+a[e],u=[t-11,t-10,t-9];[[5,u[2]],[5,u[1]],[5,u[0]],[4,u[2]],[4,u[1]],[4,u[0]],[3,u[2]],[3,u[1]],[3,u[0]],[2,u[2]],[2,u[1]],[2,u[0]],[1,u[2]],[1,u[1]],[1,u[0]],[0,u[2]],[0,u[1]],[0,u[0]],[u[2],5],[u[1],5],[u[0],5],[u[2],4],[u[1],4],[u[0],4],[u[2],3],[u[1],3],[u[0],3],[u[2],2],[u[1],2],[u[0],2],[u[2],1],[u[1],1],[u[0],1],[u[2],0],[u[1],0],[u[0],0]].forEach(((o,e)=>{var t=r[o[0]][o[1]];t.type.push(\"typeNumber\"),t.color=\"1\"==d[e]?n:i;}));}(this),this.isMaked=!0,this.drawModules=[];},b.prototype.getDrawModules=function(){if(this.drawModules&&this.drawModules.length>0)return this.drawModules;let o=this.drawModules=[],{modules:e,moduleCount:r,dynamicSize:t,areaColor:i,backgroundImageSrc:n,backgroundImageX:a,backgroundImageY:d,backgroundImageWidth:u,backgroundImageHeight:s,backgroundImageAlpha:g,backgroundImageBorderRadius:l,foregroundImageSrc:h,foregroundImageX:c,foregroundImageY:m,foregroundImageWidth:f,foregroundImageHeight:v,foregroundImagePadding:p,foregroundImageBackgroundColor:C,foregroundImageBorderRadius:b,foregroundImageShadowOffsetX:k,foregroundImageShadowOffsetY:y,foregroundImageShadowBlur:w,foregroundImageShadowColor:I}=this;i&&o.push({name:\"area\",type:\"area\",color:i,x:0,y:0,width:t,height:t}),n&&o.push({name:\"backgroundImage\",type:\"image\",imageSrc:n,mappingName:\"backgroundImageSrc\",x:a,y:d,width:u,height:s,alpha:g,borderRadius:l});for(var B=0;B<r;B++)for(var S=0;S<r;S++){var P=e[B][S];P.isDrawn||(P.type.includes(\"foreground\")?o.push({name:\"foreground\",type:\"tile\",color:P.color,destX:P.destX,destY:P.destY,destWidth:P.destWidth,destHeight:P.destHeight,x:P.x,y:P.y,width:P.width,height:P.height,paddingTop:P.paddingTop,paddingRight:P.paddingRight,paddingBottom:P.paddingBottom,paddingLeft:P.paddingLeft,rowIndex:B,colIndex:S}):o.push({name:\"background\",type:\"tile\",color:P.color,destX:P.destX,destY:P.destY,destWidth:P.destWidth,destHeight:P.destHeight,x:P.x,y:P.y,width:P.width,height:P.height,paddingTop:P.paddingTop,paddingRight:P.paddingRight,paddingBottom:P.paddingBottom,paddingLeft:P.paddingLeft,rowIndex:B,colIndex:S}),P.isDrawn=!0);}return h&&o.push({name:\"foregroundImage\",type:\"image\",imageSrc:h,mappingName:\"foregroundImageSrc\",x:c,y:m,width:f,height:v,padding:p,backgroundColor:C,borderRadius:b,shadowOffsetX:k,shadowOffsetY:y,shadowBlur:w,shadowColor:I}),o},b.prototype.isBlack=function(o,e){var r=this.moduleCount;return !(0>o||0>e||o>=r||e>=r)&&this.modules[o][e].isBlack},b.prototype.drawCanvas=function(){let{isMaked:o,canvasContext:e,useDynamicSize:r,dynamicSize:t,foregroundColor:i,foregroundPadding:n,backgroundColor:a,backgroundPadding:d,drawReserve:u,margin:s}=this;if(!o)return console.error(\"[uQRCode]: please execute the make method first!\"),Promise.reject(new b.Error(\"please execute the make method first!\"));let g=this.getDrawModules(),l=async(o,r)=>{try{e.clearRect(0,0,t,t),e.draw(!1);for(var i=0;i<g.length;i++){var n=g[i];switch(e.save(),n.type){case\"area\":e.setFillStyle(n.color),e.fillRect(n.x,n.y,n.width,n.height);break;case\"tile\":var a=n.x,d=n.y,s=n.width,l=n.height;e.setFillStyle(n.color),e.fillRect(a,d,s,l);break;case\"image\":if(\"backgroundImage\"===n.name){a=Math.round(n.x),d=Math.round(n.y),s=Math.round(n.width),l=Math.round(n.height);s<2*(c=Math.round(n.borderRadius))&&(c=s/2),l<2*c&&(c=l/2),e.setGlobalAlpha(n.alpha),c>0&&(e.beginPath(),e.moveTo(a+c,d),e.arcTo(a+s,d,a+s,d+l,c),e.arcTo(a+s,d+l,a,d+l,c),e.arcTo(a,d+l,a,d,c),e.arcTo(a,d,a+s,d,c),e.closePath(),e.setStrokeStyle(\"rgba(0,0,0,0)\"),e.stroke(),e.clip());try{var h=await this.loadImage(n.imageSrc);e.drawImage(h,a,d,s,l);}catch(o){throw console.error(`[uQRCode]: ${n.mappingName} invalid!`),new b.Error(`${n.mappingName} invalid!`)}}else if(\"foregroundImage\"===n.name){a=Math.round(n.x),d=Math.round(n.y),s=Math.round(n.width),l=Math.round(n.height);var c,m=Math.round(n.padding);s<2*(c=Math.round(n.borderRadius))&&(c=s/2),l<2*c&&(c=l/2);var f=a-m,v=d-m,p=s+2*m,C=l+2*m,k=Math.round(p/s*c);p<2*k&&(k=p/2),C<2*k&&(k=C/2),e.save(),e.setShadow(n.shadowOffsetX,n.shadowOffsetY,n.shadowBlur,n.shadowColor),k>0?(e.beginPath(),e.moveTo(f+k,v),e.arcTo(f+p,v,f+p,v+C,k),e.arcTo(f+p,v+C,f,v+C,k),e.arcTo(f,v+C,f,v,k),e.arcTo(f,v,f+p,v,k),e.closePath(),e.setFillStyle(n.backgroundColor),e.fill()):(e.setFillStyle(n.backgroundColor),e.fillRect(f,v,p,C)),e.restore(),e.save(),k>0?(e.beginPath(),e.moveTo(f+k,v),e.arcTo(f+p,v,f+p,v+C,k),e.arcTo(f+p,v+C,f,v+C,k),e.arcTo(f,v+C,f,v,k),e.arcTo(f,v,f+p,v,k),e.closePath(),e.setFillStyle(m>0?n.backgroundColor:\"rgba(0,0,0,0)\"),e.fill()):(e.setFillStyle(m>0?n.backgroundColor:\"rgba(0,0,0,0)\"),e.fillRect(f,v,p,C)),e.restore(),c>0&&(e.beginPath(),e.moveTo(a+c,d),e.arcTo(a+s,d,a+s,d+l,c),e.arcTo(a+s,d+l,a,d+l,c),e.arcTo(a,d+l,a,d,c),e.arcTo(a,d,a+s,d,c),e.closePath(),e.setStrokeStyle(\"rgba(0,0,0,0)\"),e.stroke(),e.clip());try{h=await this.loadImage(n.imageSrc);e.drawImage(h,a,d,s,l);}catch(o){throw console.error(`[uQRCode]: ${n.mappingName} invalid!`),new b.Error(`${n.mappingName} invalid!`)}}}u&&e.draw(!0),e.restore();}e.draw(!0),setTimeout(o,150);}catch(o){if(!(o instanceof b.Error))throw o;r(o);}};return new Promise(((o,e)=>{l(o,e);}))},b.prototype.draw=function(){return this.drawCanvas()},b.prototype.register=function(o){o&&o(b,this,!0);};export{b as default};"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/package.json",
    "content": "{\n  \"id\": \"Sansnn-uQRCode\",\n  \"displayName\": \"uQRCode 全端二维码生成插件 支持nvue 支持nodejs服务端\",\n  \"version\": \"4.0.6\",\n  \"description\": \"uQRCode是一款基于Javascript环境开发的二维码生成插件，适用所有Javascript运行环境的前端应用和Node.js。\",\n  \"keywords\": [\n    \"二维码\",\n    \"uQRCode\",\n    \"qrcode\",\n    \"qr\"\n],\n  \"repository\": \"https://github.com/Sansnn/uQRCode\",\n  \"engines\": {\n    \"HBuilderX\": \"^3.1.0\"\n  },\n\"dcloudext\": {\n    \"sale\": {\n      \"regular\": {\n        \"price\": \"0.00\"\n      },\n      \"sourcecode\": {\n        \"price\": \"0.00\"\n      }\n    },\n    \"contact\": {\n      \"qq\": \"\"\n    },\n    \"declaration\": {\n      \"ads\": \"无\",\n      \"data\": \"无\",\n      \"permissions\": \"无\"\n    },\n    \"npmurl\": \"https://www.npmjs.com/package/uqrcodejs\",\n    \"type\": \"sdk-js\"\n  },\n  \"uni_modules\": {\n    \"dependencies\": [],\n    \"encrypt\": [],\n    \"platforms\": {\n      \"cloud\": {\n        \"tcb\": \"y\",\n        \"aliyun\": \"y\"\n      },\n      \"client\": {\n        \"App\": {\n          \"app-vue\": \"y\",\n          \"app-nvue\": \"y\"\n        },\n        \"H5-mobile\": {\n          \"Safari\": \"y\",\n          \"Android Browser\": \"y\",\n          \"微信浏览器(Android)\": \"y\",\n          \"QQ浏览器(Android)\": \"y\"\n        },\n        \"H5-pc\": {\n          \"Chrome\": \"y\",\n          \"IE\": \"y\",\n          \"Edge\": \"y\",\n          \"Firefox\": \"y\",\n          \"Safari\": \"y\"\n        },\n        \"小程序\": {\n          \"微信\": \"y\",\n          \"阿里\": \"y\",\n          \"百度\": \"y\",\n          \"字节跳动\": \"y\",\n          \"QQ\": \"y\"\n        },\n        \"快应用\": {\n          \"华为\": \"y\",\n          \"联盟\": \"y\"\n        },\n        \"Vue\": {\n          \"vue2\": \"y\",\n          \"vue3\": \"y\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "uni_modules/okingtz-cropper/changelog.md",
    "content": "## 1.0.10（2023-06-13）\n优化浏览器的环境下，裁剪框裁剪时，与滚动的冲突\n## 1.0.9（2023-03-13）\n1、canMove：是否可以移动裁剪框（默认true,可以移动）；\n2、canScale：是否可以放缩裁剪框（默认true，可以放缩）；\n## 1.0.8（2022-02-18）\n1、提高保存图片的质量；\n2、解决部分安卓、IOS手机图片无法保存的问题；\n3、新年快乐\n## 1.0.7（2021-09-24）\n## 1.0.7（2021-09-24）\n适配APP，解决APP无法获取到图片问题\n## 1.0.6（2021-09-01）\n解决上传大尺寸大图，绘制失败的问题\n## 1.0.5（2021-08-20）\n解决图片高大于宽，规定宽高比例 [5,2]，裁切时实际比例变成了[2,5]，不能实现按照比例来裁切\n## 1.0.4（2021-08-19）\n增加image图片地址watch，组件外更改图片地址时实时变更，非常感谢大佬（330***@163.com）的支持\n## 1.0.3（2021-08-18）\n增加属性original （默认值true） 是否按照原始大小裁切图片\n## 1.0.2（2021-08-17）\n新增属性\n1. fileType 目标文件的类型，只支持 'jpg' 或 'png'。默认为 'jpg'；\n2. quality 图片的质量，取值范围为 (0, 1]，不在范围内时当作1.0处理（微信小程序：目前仅对 jpg 有效）。默认为 1；\n## 1.0.1（2021-08-17）\n1. 增加image属性，首次打开可以使用默认图\n2. 增加maxCropper属性，打开时是否展示最大裁剪框\n## 1.0.0（2021-08-03）\n方便后期使用，发布头像上传裁切组件，不定时更新\n"
  },
  {
    "path": "uni_modules/okingtz-cropper/components/okingtz-cropper/okingtz-cropper.vue",
    "content": "<template>\n\t<view class=\"container\">\n\t\t<view class=\"page-body uni-content-info\">\n\t\t\t<view class='cropper-content'>\n\t\t\t\t<view v-if=\"isShowImg\" class=\"uni-corpper\" :style=\"'width:'+cropperInitW+'px;height:'+cropperInitH+'px;'\">\n\t\t\t\t\t<view class=\"cropper-modal\" :style=\"'width:'+cropperInitW+'px;height:'+cropperInitH+'px;'\"></view>\n\t\t\t\t\t<view class=\"uni-corpper-content\" :style=\"'width:'+cropperW+'px;height:'+cropperH+'px;left:'+cropperL+'px;top:'+cropperT+'px'\">\n\t\t\t\t\t\t<image :src=\"imageSrc\" :style=\"'width:'+cropperW+'px;height:'+cropperH+'px'\"></image>\n\t\t\t\t\t\t<view class=\"cropper-modal-box\" :style=\"'left:'+cutL+'px;top:'+cutT+'px;right:'+cutR+'px;bottom:'+cutB+'px'\">\n\t\t\t\t\t\t\t<img  :src=\"imageSrc\" :style=\"'width:'+cropperW+'px;height:'+cropperH+'px;transform:translate3d('+cutL*-1+'px, '+cutT*-1+'px, 0px) '\"  />\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<view class=\"uni-corpper-crop-box\" @touchstart.stop=\"contentStartMove\" @touchmove.stop=\"contentMoveing\" @touchend.stop=\"contentTouchEnd\"\n\t\t\t\t\t\t    :style=\"'left:'+cutL+'px;top:'+cutT+'px;right:'+cutR+'px;bottom:'+cutB+'px'\">\n\t\t\t\t\t\t\t<view class=\"uni-cropper-view-box\">\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-dashed-h\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-dashed-v\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-line-t\" data-drag=\"top\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-line-r\" data-drag=\"right\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-line-b\" data-drag=\"bottom\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-line-l\" data-drag=\"left\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-t\" data-drag=\"top\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-tr\" data-drag=\"topTight\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-r\" data-drag=\"right\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-rb\" data-drag=\"rightBottom\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-b\" data-drag=\"bottom\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-bl\" data-drag=\"bottomLeft\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-l\" data-drag=\"left\" @touchstart.stop=\"dragStart\" @touchmove.stop=\"dragMove\"></view>\n\t\t\t\t\t\t\t\t<view class=\"uni-cropper-point point-lt\" data-drag=\"leftTop\"></view>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view v-else style=\"text-align: center; margin: 20rpx 0;\">暂未选择图片</view>\n\t\t\t</view>\n\t\t\t<view class='cropper-config'>\n\t\t\t\t<!-- <view class=\"cropper-choose\" :style=\"'background-color: '+selectButtonBackgroundColor+';color: '+selectButtonColor+';'\" @click=\"getImage\">{{ selectButtonText }}</view>-->\n\t\t\t\t<view class=\"cropper-confirm btn\"   @click=\"getImageInfo\">{{ saveButtonText }}</view> \n\t\t\t</view>\n\t\t\t<canvas canvas-id=\"myCanvas\" v-if=\"originalW>0 && originalH>0\" :style=\"'position:absolute;border: 1px solid red; width:'+(original?originalW:imageW)+'px;height:'+(original?originalH:imageH)+'px;top:-9999px;left:-9999px;'\"></canvas>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\tlet sysInfo = uni.getSystemInfoSync();\n\tlet SCREEN_WIDTH = sysInfo.screenWidth\n\tlet PAGE_X, // 手按下的x位置\n\t\tPAGE_Y, // 手按下y的位置 \n\t\tPR = sysInfo.pixelRatio, // dpi\n\t\tT_PAGE_X, // 手移动的时候x的位置\n\t\tT_PAGE_Y, // 手移动的时候Y的位置\n\t\tCUT_L, // 初始化拖拽元素的left值\n\t\tCUT_T, // 初始化拖拽元素的top值\n\t\tCUT_R, // 初始化拖拽元素的\n\t\tCUT_B, // 初始化拖拽元素的\n\t\tCUT_W, // 初始化拖拽元素的宽度\n\t\tCUT_H, //  初始化拖拽元素的高度\n\t\tIMG_RATIO, // 图片比例\n\t\tIMG_REAL_W, // 图片实际的宽度\n\t\tIMG_REAL_H, // 图片实际的高度\n\t\tDRAFG_MOVE_RATIO = 1, //移动时候的比例,\n\t\tINIT_DRAG_POSITION = 200, // 初始化屏幕宽度和裁剪区域的宽度之差，用于设置初始化裁剪的宽度\n\t\tORIGINAL_W, //原始图片宽度\n\t\tORIGINAL_H, //原始图片高度\n\t\tDRAW_IMAGE_W = sysInfo.screenWidth // 设置生成的图片宽度\n\t\t\n\texport default {\n\t\tname:'OkingtzCropper',\n\t\tprops:{\n\t\t\toriginal:{\n\t\t\t\t// 是否按照原始大小返回\n\t\t\t\ttype:Boolean,\n\t\t\t\tdefault:true\n\t\t\t},\n\t\t\tfixed:{\n\t\t\t\t// 优先级比较\n\t\t\t\ttype:Boolean,\n\t\t\t\tdefault:true\n\t\t\t},\n\t\t\tfixedNumber:{\n\t\t\t\ttype:Array,\n\t\t\t\tdefault:function(){\n\t\t\t\t\treturn [1,1]\n\t\t\t\t}\n\t\t\t},\n\t\t\tcropWidth:{\n\t\t\t\ttype:Number,\n\t\t\t\tdefault:200,\n\t\t\t},\n\t\t\tcropHeight:{\n\t\t\t\ttype:Number,\n\t\t\t\tdefault:200,\n\t\t\t},\n\t\t\tminHeight:{\n\t\t\t\ttype:Number,\n\t\t\t\tdefault:20,\n\t\t\t},\n\t\t\tminWidth:{\n\t\t\t\ttype:Number,\n\t\t\t\tdefault:20,\n\t\t\t},\n\t\t\tsaveLoading:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'图片生成中...'\n\t\t\t},\n\t\t\tselectButtonText:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'选择照片'\n\t\t\t},\n\t\t\tselectButtonColor:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'#FFFFFF'\n\t\t\t},\n\t\t\tselectButtonBackgroundColor:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'#FF2E80'\n\t\t\t},\n\t\t\tsaveButtonText:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'上传'\n\t\t\t},\n\t\t\tsaveButtonColor:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'#FFFFFF'\n\t\t\t},\n\t\t\tsaveButtonBackgroundColor:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'#FF2E80'\n\t\t\t},\n\t\t\timage:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:''\n\t\t\t},\n\t\t\tmaxCropper:{\n\t\t\t\ttype:Boolean,\n\t\t\t\tdefault:false\n\t\t\t},\n\t\t\tfileType:{\n\t\t\t\ttype:String,\n\t\t\t\tdefault:'jpg'\n\t\t\t},\n\t\t\tquality:{\n\t\t\t\ttype:Number,\n\t\t\t\tdefault:1\n\t\t\t},\n\t\t\t/**\n\t\t\t * 是否可以移动\n\t\t\t */\n\t\t\tcanMove:{\n\t\t\t\ttype:Boolean,\n\t\t\t\tdefault:true\n\t\t\t},\n\t\t\t/**\n\t\t\t * 是否可以放缩\n\t\t\t */\n\t\t\tcanScale:{\n\t\t\t\ttype:Boolean,\n\t\t\t\tdefault:true\n\t\t\t},\n\t\t},\n\t\t/**\n\t\t * 页面的初始数据\n\t\t */\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\timageSrc: '',\n\t\t\t\tisShowImg: false,\n\t\t\t\t// 初始化的宽高\n\t\t\t\tcropperInitW: SCREEN_WIDTH,\n\t\t\t\tcropperInitH: SCREEN_WIDTH,\n\t\t\t\t// 动态的宽高\n\t\t\t\tcropperW: SCREEN_WIDTH,\n\t\t\t\tcropperH: SCREEN_WIDTH,\n\t\t\t\t// 动态的left top值\n\t\t\t\tcropperL: 0,\n\t\t\t\tcropperT: 0,\n\n\t\t\t\ttransL: 0,\n\t\t\t\ttransT: 0,\n\n\t\t\t\t// 图片缩放值\n\t\t\t\tscaleP: 0,\n\t\t\t\timageW: 200,\n\t\t\t\timageH: 200,\n\n\t\t\t\t// 裁剪框 宽高\n\t\t\t\tcutL: 0,\n\t\t\t\tcutT: 0,\n\t\t\t\tcutB: SCREEN_WIDTH,\n\t\t\t\tcutR: '100%',\n\t\t\t\tqualityWidth: DRAW_IMAGE_W,\n\t\t\t\tinnerAspectRadio: DRAFG_MOVE_RATIO,\n\t\t\t\t\n\t\t\t\t// 图片原始尺寸\n\t\t\t\toriginalW: 0,\n\t\t\t\toriginalH: 0,\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * 生命周期函数--监听页面加载\n\t\t */\n\t\tonLoad: function (options) {},\n\t\t/**\n\t\t * 生命周期函数--监听页面初次渲染完成\n\t\t */\n\t\tonReady: function () {\n\t\t\t\n\t\t},\n\t\tmounted:function(){\n\t\t\tconst _this = this\n\t\t\t_this.imageSrc = _this.image\n\t\t\t_this.loadImage();\n\t\t},\n\t\twatch:{\n\t\t\timage:function (){\n\t\t\t\tvar _this = this; \n\t\t\t\t_this.imageSrc = _this.image; \n\t\t\t\t_this.loadImage(); \n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tsetData: function (obj) {\n\t\t\t\tlet that = this;\n\t\t\t\tObject.keys(obj).forEach(function (key) {\n\t\t\t\t\tthat.$set(that.$data, key, obj[key])\n\t\t\t\t});\n\t\t\t},\n\t\t\tgetImage: function () {\n\t\t\t\tvar _this = this\n\t\t\t\tuni.showActionSheet({\n\t\t\t\t\titemList: ['拍照', '选择一张照片'],\n\t\t\t\t\tsuccess: function(res) {\n\t\t\t\t\t\t_this.chooseImage(res.tapIndex)\n\t\t\t\t\t},\n\t\t\t\t\tfail: function(res) {\n\t\t\t\t\t\tconsole.log(res.errMsg);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tchooseImage: function(index) {\n\t\t\t\tconst _this = this\n\t\t\t\t// 从相册/相机选择\n\t\t\t\t// 如需直接开相机或直接选相册，请只使用一个选项\n\t\t\t\tconst sourceType = index === 0 ? ['camera'] : ['album']\n\t\t\t\tuni.chooseImage({\n\t\t\t\t\tcount: 1, //默认9\n\t\t\t\t\tsizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有\n\t\t\t\t\tsourceType: sourceType,\n\t\t\t\t\tsuccess: function(res) {\n\t\t\t\t\t\t// TODO 真是上传照片\n\t\t\t\t\t\t_this.setData({\n\t\t\t\t\t\t\timageSrc: res.tempFilePaths[0],\n\t\t\t\t\t\t})\n\t\t\t\t\t\t_this.loadImage();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tgetImageInfoEx:function(imageUrl,callBack){\n\t\t\t\t// #ifdef APP-PLUS\n\t\t\t\tplus.io.getImageInfo({\n\t\t\t\t\tsrc: imageUrl,\n\t\t\t\t\tsuccess: function success(res) {\n\t\t\t\t\t\tcallBack && callBack(res)\n\t\t\t\t\t},\n\t\t\t\t\tfail:function(err){\n\t\t\t\t\t\tconsole.log('err-->',err)\n\t\t\t\t\t\tuni.hideLoading()\n\t\t\t\t\t}\n\t\t\t\t });\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef H5 || MP\n\t\t\t\tuni.getImageInfo({\n\t\t\t\t\tsrc: imageUrl,\n\t\t\t\t\tsuccess: function success(res) {\n\t\t\t\t\t\tcallBack && callBack(res)\n\t\t\t\t\t},\n\t\t\t\t\tfail:function(err){\n\t\t\t\t\t\tconsole.log('err-->',err)\n\t\t\t\t\t\tuni.hideLoading()\n\t\t\t\t\t}\n\t\t\t\t });\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tloadImage: function (img) {\n\t\t\t\timg ? this.imageSrc = img : ''\n\t\t\t\tvar _this = this\n\t\t\t\tif(!_this.imageSrc){\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tuni.showLoading({\n\t\t\t\t\ttitle: '图片加载中...',\n\t\t\t\t})\n\n\t\t\t\t_this.getImageInfoEx(_this.imageSrc,function(res){\n\t\t\t\t\t\tIMG_RATIO = res.width / res.height\n\t\t\t\t\t\t\n\t\t\t\t\t\tORIGINAL_W = res.width\n\t\t\t\t\t\tORIGINAL_H = res.height\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(ORIGINAL_W>1000){\n\t\t\t\t\t\t\tORIGINAL_W = 999\n\t\t\t\t\t\t\tORIGINAL_H = ORIGINAL_W/IMG_RATIO\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(ORIGINAL_H>1000){\n\t\t\t\t\t\t\tORIGINAL_H = 999\n\t\t\t\t\t\t\tORIGINAL_W = ORIGINAL_H*IMG_RATIO\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (IMG_RATIO >= 1) {\n\t\t\t\t\t\t\tIMG_REAL_W = SCREEN_WIDTH\n\t\t\t\t\t\t\tIMG_REAL_H = SCREEN_WIDTH / IMG_RATIO\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tIMG_REAL_W = SCREEN_WIDTH * IMG_RATIO\n\t\t\t\t\t\t\tIMG_REAL_H = SCREEN_WIDTH\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet minRange = IMG_REAL_W > IMG_REAL_H ? IMG_REAL_W : IMG_REAL_H\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet cutWidth = 0, cutHeight=0\n\t\t\t\t\t\tif(_this.fixed){\n\t\t\t\t\t\t\t// 固定比例\n\t\t\t\t\t\t\tcutWidth = _this.cropWidth > IMG_REAL_W?IMG_REAL_W:_this.cropWidth\n\t\t\t\t\t\t\tcutHeight = cutWidth / _this.fixedNumber[0] * _this.fixedNumber[1]\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(cutHeight > IMG_REAL_H){\n\t\t\t\t\t\t\t\tcutHeight = IMG_REAL_H\n\t\t\t\t\t\t\t\tcutWidth = cutHeight / _this.fixedNumber[1] * _this.fixedNumber[0]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t// 非固定比例，按照给定的尺寸来\n\t\t\t\t\t\t\tcutWidth = _this.cropWidth > IMG_REAL_W ? IMG_REAL_W : _this.cropWidth\n\t\t\t\t\t\t\tcutHeight = _this.cropHeight > IMG_REAL_H ? IMG_REAL_H : _this.cropHeight\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// 最大尺度裁切\n\t\t\t\t\t\tif(_this.maxCropper){\n\t\t\t\t\t\t\tif(_this.fixed){\n\t\t\t\t\t\t\t\tcutWidth = IMG_REAL_H > IMG_REAL_W?IMG_REAL_W:IMG_REAL_H\n\t\t\t\t\t\t\t\tcutHeight = cutWidth\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tcutWidth = IMG_REAL_W\n\t\t\t\t\t\t\t\tcutHeight = IMG_REAL_H\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tINIT_DRAG_POSITION = minRange > INIT_DRAG_POSITION ? INIT_DRAG_POSITION : minRange\n\t\t\t\t\t\t\n\t\t\t\t\t\t// 根据图片的宽高显示不同的效果   保证图片可以正常显示\n\t\t\t\t\t\tif (IMG_RATIO >= 1) {\n\t\t\t\t\t\t\t// let cutT = Math.ceil((SCREEN_WIDTH / IMG_RATIO - (SCREEN_WIDTH / IMG_RATIO - INIT_DRAG_POSITION)) / 2);\n\t\t\t\t\t\t\tlet cutT = Math.ceil((SCREEN_WIDTH / IMG_RATIO - cutHeight) / 2);\n\t\t\t\t\t\t\tlet cutB = cutT;\n\t\t\t\t\t\t\tlet cutL = Math.ceil((SCREEN_WIDTH - cutWidth) / 2);\n\t\t\t\t\t\t\tlet cutR = cutL;\n\t\t\t\t\t\t\t_this.setData({\n\t\t\t\t\t\t\t\tcropperW: SCREEN_WIDTH,\n\t\t\t\t\t\t\t\tcropperH: SCREEN_WIDTH / IMG_RATIO,\n\t\t\t\t\t\t\t\t// 初始化left right\n\t\t\t\t\t\t\t\tcropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),\n\t\t\t\t\t\t\t\tcropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH / IMG_RATIO) / 2),\n\t\t\t\t\t\t\t\tcutL: cutL,\n\t\t\t\t\t\t\t\tcutT: cutT,\n\t\t\t\t\t\t\t\tcutR: cutR,\n\t\t\t\t\t\t\t\tcutB: cutB,\n\t\t\t\t\t\t\t\t// 图片缩放值\n\t\t\t\t\t\t\t\timageW: IMG_REAL_W,\n\t\t\t\t\t\t\t\timageH: IMG_REAL_H,\n\t\t\t\t\t\t\t\t// 图片原始尺寸\n\t\t\t\t\t\t\t\toriginalW: ORIGINAL_W,\n\t\t\t\t\t\t\t\toriginalH: ORIGINAL_H,\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tscaleP: IMG_REAL_W / SCREEN_WIDTH,\n\t\t\t\t\t\t\t\tqualityWidth: DRAW_IMAGE_W,\n\t\t\t\t\t\t\t\tinnerAspectRadio: IMG_RATIO\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet cutL = Math.ceil((SCREEN_WIDTH * IMG_RATIO - cutWidth) / 2);\n\t\t\t\t\t\t\tlet cutR = cutL;\n\t\t\t\t\t\t\tlet cutT = Math.ceil((SCREEN_WIDTH - cutHeight) / 2);\n\t\t\t\t\t\t\tlet cutB = cutT;\n\t\t\t\t\t\t\t_this.setData({\n\t\t\t\t\t\t\t\tcropperW: SCREEN_WIDTH * IMG_RATIO,\n\t\t\t\t\t\t\t\tcropperH: SCREEN_WIDTH,\n\t\t\t\t\t\t\t\t// 初始化left right\n\t\t\t\t\t\t\t\tcropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH * IMG_RATIO) / 2),\n\t\t\t\t\t\t\t\tcropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),\n\t\t\t\t\t\n\t\t\t\t\t\t\t\tcutL: cutL,\n\t\t\t\t\t\t\t\tcutT: cutT,\n\t\t\t\t\t\t\t\tcutR: cutR,\n\t\t\t\t\t\t\t\tcutB: cutB,\n\t\t\t\t\t\t\t\t// 图片缩放值\n\t\t\t\t\t\t\t\timageW: IMG_REAL_W,\n\t\t\t\t\t\t\t\timageH: IMG_REAL_H,\n\t\t\t\t\t\t\t\t// 图片原始尺寸\n\t\t\t\t\t\t\t\toriginalW: ORIGINAL_W,\n\t\t\t\t\t\t\t\toriginalH: ORIGINAL_H,\n\t\t\t\t\t\t\t\tscaleP: IMG_REAL_W / SCREEN_WIDTH,\n\t\t\t\t\t\t\t\tqualityWidth: DRAW_IMAGE_W,\n\t\t\t\t\t\t\t\tinnerAspectRadio: IMG_RATIO\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_this.setData({\n\t\t\t\t\t\t\tisShowImg: true\n\t\t\t\t\t\t})\n\t\t\t\t\t\tuni.hideLoading()\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 拖动时候触发的touchStart事件\n\t\t\tcontentStartMove(e) {\n\t\t\t\tPAGE_X = e.touches[0].pageX\n\t\t\t\tPAGE_Y = e.touches[0].pageY\n\t\t\t},\n\n\t\t\t// 拖动时候触发的touchMove事件\n\t\t\tcontentMoveing(e) {\n\t\t\t\tif(!this.canMove){\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvar _this = this\n\t\t\t\tvar dragLengthX = (PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO\n\t\t\t\tvar dragLengthY = (PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO\n\t\t\t\t// 左移\n\t\t\t\tif (dragLengthX > 0) {\n\t\t\t\t\tif (this.cutL - dragLengthX < 0) dragLengthX = this.cutL\n\t\t\t\t} else {\n\t\t\t\t\tif (this.cutR + dragLengthX < 0) dragLengthX = -this.cutR\n\t\t\t\t}\n\n\t\t\t\tif (dragLengthY > 0) {\n\t\t\t\t\tif (this.cutT - dragLengthY < 0) dragLengthY = this.cutT\n\t\t\t\t} else {\n\t\t\t\t\tif (this.cutB + dragLengthY < 0) dragLengthY = -this.cutB\n\t\t\t\t}\n\t\t\t\tthis.setData({\n\t\t\t\t\tcutL: this.cutL - dragLengthX,\n\t\t\t\t\tcutT: this.cutT - dragLengthY,\n\t\t\t\t\tcutR: this.cutR + dragLengthX,\n\t\t\t\t\tcutB: this.cutB + dragLengthY\n\t\t\t\t})\n\n\t\t\t\tPAGE_X = e.touches[0].pageX\n\t\t\t\tPAGE_Y = e.touches[0].pageY\n\t\t\t},\n\n\t\t\tcontentTouchEnd() {\n\n\t\t\t},\n\t\t\tgetLocalFilePath(path) {\n\t\t\t    if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {\n\t\t\t        return path\n\t\t\t    }\n\t\t\t    if (path.indexOf('file://') === 0) {\n\t\t\t        return path\n\t\t\t    }\n\t\t\t    if (path.indexOf('/storage/emulated/0/') === 0) {\n\t\t\t        return path\n\t\t\t    }\n\t\t\t    if (path.indexOf('/') === 0) {\n\t\t\t        var localFilePath = plus.io.convertAbsoluteFileSystem(path)\n\t\t\t        if (localFilePath !== path) {\n\t\t\t            return localFilePath\n\t\t\t        } else {\n\t\t\t            path = path.substr(1)\n\t\t\t        }\n\t\t\t    }\n\t\t\t    return '_www/' + path\n\t\t\t},\n\t\t\tpathToBase64(path) {\n\t\t\t\tconst _this = this\n\t\t\t\treturn new Promise(function(resolve, reject) {\n\t\t\t\t\tif (typeof window === 'object' && 'document' in window) {\n\t\t\t\t\t\tif (typeof FileReader === 'function') {\n\t\t\t\t\t\t\tvar xhr = new XMLHttpRequest()\n\t\t\t\t\t\t\txhr.open('GET', path, true)\n\t\t\t\t\t\t\txhr.responseType = 'blob'\n\t\t\t\t\t\t\txhr.onload = function() {\n\t\t\t\t\t\t\t\tif (this.status === 200) {\n\t\t\t\t\t\t\t\t\tlet fileReader = new FileReader()\n\t\t\t\t\t\t\t\t\tfileReader.onload = function(e) {\n\t\t\t\t\t\t\t\t\t\tresolve(e.target.result)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tfileReader.onerror = reject\n\t\t\t\t\t\t\t\t\tfileReader.readAsDataURL(this.response)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\txhr.onerror = reject\n\t\t\t\t\t\t\txhr.send()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar canvas = document.createElement('canvas')\n\t\t\t\t\t\tvar c2x = canvas.getContext('2d')\n\t\t\t\t\t\tvar img = new Image\n\t\t\t\t\t\timg.onload = function() {\n\t\t\t\t\t\t\tcanvas.width = img.width\n\t\t\t\t\t\t\tcanvas.height = img.height\n\t\t\t\t\t\t\tc2x.drawImage(img, 0, 0)\n\t\t\t\t\t\t\tresolve(canvas.toDataURL())\n\t\t\t\t\t\t\tcanvas.height = canvas.width = 0\n\t\t\t\t\t\t}\n\t\t\t\t\t\timg.onerror = reject\n\t\t\t\t\t\timg.src = path\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof plus === 'object') {\n\t\t\t\t\t\tplus.io.resolveLocalFileSystemURL(_this.getLocalFilePath(path), function(entry) {\n\t\t\t\t\t\t\tentry.file(function(file) {\n\t\t\t\t\t\t\t\tvar fileReader = new plus.io.FileReader()\n\t\t\t\t\t\t\t\tfileReader.onload = function(data) {\n\t\t\t\t\t\t\t\t\tresolve(data.target.result)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfileReader.onerror = function(error) {\n\t\t\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfileReader.readAsDataURL(file)\n\t\t\t\t\t\t\t}, function(error) {\n\t\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, function(error) {\n\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {\n\t\t\t\t\t\twx.getFileSystemManager().readFile({\n\t\t\t\t\t\t\tfilePath: path,\n\t\t\t\t\t\t\tencoding: 'base64',\n\t\t\t\t\t\t\tsuccess: function(res) {\n\t\t\t\t\t\t\t\tresolve('data:image/jpeg;base64,' + res.data)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfail: function(error) {\n\t\t\t\t\t\t\t\treject(error)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\treject(new Error('not support'))\n\t\t\t\t})\n\t\t\t},\n\t\t\t\n\t\t\t// 获取图片\n\t\t\tgetImageInfo() {\n\t\t\t\tvar _this = this;\n\t\t\t\tif(!_this.isShowImg){\n\t\t\t\t\tuni.showToast({\n\t\t\t\t\t    title: '请先选择照片',\n\t\t\t\t\t    duration: 1000,\n\t\t\t\t\t\ticon:'none'\n\t\t\t\t\t});\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tuni.showLoading({\n\t\t\t\t\ttitle: _this.saveLoading,\n\t\t\t\t});\n\t\t\t\t// #ifdef APP-PLUS || H5\n\t\t\t\t_this.pathToBase64(_this.imageSrc).then(base64_avatar => {\n\t\t\t\t\t// 将图片写入画布\n\t\t\t\t\t_this.writeImage(base64_avatar)\n\t\t\t\t}).catch(err=>{\n\t\t\t\t\tconsole.log('转换64抱错',err)\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef MP\n\t\t\t\t_this.writeImage(_this.imageSrc)\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\twriteImage(path){\n\t\t\t\tconst _this = this \n\t\t\t\t// 将图片写入画布\n\t\t\t\tconst ctx = uni.createCanvasContext('myCanvas',_this);\n\t\t\t\tctx.drawImage(path, 0, 0, _this.original?ORIGINAL_W:IMG_REAL_W, _this.original?ORIGINAL_H:IMG_REAL_H);\n\t\t\t\tctx.draw(true, () => {\n\t\t\t\t\t// 获取画布要裁剪的位置和宽度   均为百分比 * 画布中图片的宽度    \n\t\t\t\t\t// 保证了在微信小程序中裁剪的图片模糊  位置不对的问题 canvasT = (_this.cutT / _this.cropperH) * (_this.imageH / pixelRatio)\n\t\t\t\t\tvar canvasW = ((_this.cropperW - _this.cutL - _this.cutR) / _this.cropperW) * (_this.original?ORIGINAL_W:IMG_REAL_W);\n\t\t\t\t\tvar canvasH = ((_this.cropperH - _this.cutT - _this.cutB) / _this.cropperH) * (_this.original?ORIGINAL_H:IMG_REAL_H);\n\t\t\t\t\tvar canvasL = (_this.cutL / _this.cropperW) * (_this.original?ORIGINAL_W:IMG_REAL_W);\n\t\t\t\t\tvar canvasT = (_this.cutT / _this.cropperH) * (_this.original?ORIGINAL_H:IMG_REAL_H);\n\t\t\t\t\tuni.canvasToTempFilePath({\n\t\t\t\t\t\tx: canvasL,\n\t\t\t\t\t\ty: canvasT,\n\t\t\t\t\t\twidth: canvasW,\n\t\t\t\t\t\theight: canvasH,\n\t\t\t\t\t\tdestWidth: canvasW,\n\t\t\t\t\t\tdestHeight: canvasH,\n\t\t\t\t\t\tquality: _this.quality || 1,\n\t\t\t\t\t\tfileType: _this.fileType || 'jpg',\n\t\t\t\t\t\tcanvasId: 'myCanvas',\n\t\t\t\t\t\tsuccess: function (res) {\n\t\t\t\t\t\t\tuni.hideLoading()\n\t\t\t\t\t\t\t_this.$emit('uploadSuccess',res.tempFilePath)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfail:function(err){\n\t\t\t\t\t\t\tconsole.log('绘制图像抱错->',err)\n\t\t\t\t\t\t}\n\t\t\t\t\t},_this);\n\t\t\t\t});\n\t\t\t},\n\t\t\t// 设置大小的时候触发的touchStart事件\n\t\t\tdragStart(e) {\n\t\t\t\tT_PAGE_X = e.touches[0].pageX\n\t\t\t\tT_PAGE_Y = e.touches[0].pageY\n\t\t\t\tCUT_L = this.cutL\n\t\t\t\tCUT_R = this.cutR\n\t\t\t\tCUT_B = this.cutB\n\t\t\t\tCUT_T = this.cutT\n\t\t\t},\n\n\t\t\t// 设置大小的时候触发的touchMove事件\n\t\t\tdragMove(e) {\n\t\t\t\tif(!this.canScale){\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvar _this = this\n\t\t\t\tvar dragType = e.target.dataset.drag\n\t\t\t\tswitch (dragType) {\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\t_this.dragMoveBottomAndRight(e,'right')\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'left':\n\t\t\t\t\t\t_this.dragMoveLeftAndBottom(e)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'top':\n\t\t\t\t\t\t_this.dragMoveTopAndRight(e)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\t_this.dragMoveBottomAndRight(e)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'rightBottom':\n\t\t\t\t\t\t_this.dragMoveBottomAndRight(e)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 上移动\n\t\t\tdragMoveTopAndRight(e){\n\t\t\t\tconst _this = this\n\t\t\t\tif(_this.fixed){\n\t\t\t\t\t\n\t\t\t\t\tvar dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO\n\t\t\t\t\tif (CUT_T - dragLengthY < 0) dragLengthY = CUT_T\n\t\t\t\t\tif ((CUT_T - dragLengthY) > (_this.cropperH - _this.cutB)) dragLengthY = CUT_T - (_this.cropperH - _this.cutB)\n\t\t\t\t\t\n\t\t\t\t\tvar dragLengthX = dragLengthY/_this.fixedNumber[1]*_this.fixedNumber[0]\n\t\t\t\t\t\n\t\t\t\t\tif (CUT_R - dragLengthX < 0) dragLengthX = CUT_R\n\t\t\t\t\t\n\t\t\t\t\tif(CUT_T - dragLengthY <= 0){\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif(CUT_R - dragLengthX <= 0){\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet cutR = CUT_R - dragLengthX\n\t\t\t\t\tlet cutT = CUT_T - dragLengthY\n\t\t\t\t\t\n\t\t\t\t\t// calc min height and width\n\t\t\t\t\tif(_this.cropperH - cutT - _this.cutB < _this.minHeight){\n\t\t\t\t\t\tcutT = _this.cropperH - _this.cutB - _this.minHeight\n\t\t\t\t\t\tcutR = _this.cropperW - _this.cutL - _this.minHeight / _this.fixedNumber[1]*_this.fixedNumber[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(_this.cropperW - _this.cutL - cutR < _this.minWidth){\n\t\t\t\t\t\tcutR = _this.cropperW - _this.cutL - _this.minWidth\n\t\t\t\t\t\tcutT = _this.cropperH - _this.cutB - _this.minWidth / _this.fixedNumber[0]*_this.fixedNumber[1]\n\t\t\t\t\t}\n\t\t\t\t\tthis.setData({\n\t\t\t\t\t\tcutR: cutR,\n\t\t\t\t\t\tcutT: cutT,\n\t\t\t\t\t})\n\t\t\t\t}else{\n\t\t\t\t\tvar dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO\n\t\t\t\t\tif (CUT_T - dragLength < 0) dragLength = CUT_T\n\t\t\t\t\tif ((CUT_T - dragLength) > (this.cropperH - this.cutB)) dragLength = CUT_T - (this.cropperH - this.cutB)\n\t\t\t\t\t\n\t\t\t\t\tlet cutT = CUT_T - dragLength\n\t\t\t\t\t\n\t\t\t\t\tif(_this.cropperH- _this.cutB - cutT < _this.minHeight){\n\t\t\t\t\t\tcutT = _this.cropperH - _this.cutB - _this.minHeight\n\t\t\t\t\t}\n\t\t\t\t\tthis.setData({\n\t\t\t\t\t\tcutT: cutT\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 左移动\n\t\t\tdragMoveLeftAndBottom(e){\n\t\t\t\tconst _this = this\n\t\t\t\tif(_this.fixed){\n\t\t\t\t\tvar dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO\n\t\t\t\t\tif (CUT_L - dragLengthX < 0) dragLengthX = CUT_L\n\t\t\t\t\t\n\t\t\t\t\tif ((CUT_L - dragLengthX) > (_this.cropperW - _this.cutR)) dragLengthX = CUT_L - (_this.cropperW - _this.cutR)\n\t\t\t\t\t\n\t\t\t\t\tvar dragLengthY = dragLengthX/_this.fixedNumber[0]*_this.fixedNumber[1]\n\t\t\t\t\tif (CUT_B - dragLengthY < 0) dragLengthY = CUT_B\n\t\t\t\t\t\n\t\t\t\t\tif(CUT_L - dragLengthX <= 0){\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif(CUT_B - dragLengthY <= 0){\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet cutL = CUT_L - dragLengthX\n\t\t\t\t\tlet cutB = CUT_B - dragLengthY\n\t\t\t\t\t\n\t\t\t\t\t// calc min height and width\n\t\t\t\t\tif(_this.cropperH - cutB - _this.cutT < _this.minHeight){\n\t\t\t\t\t\tcutB = _this.cropperH - _this.cutT - _this.minHeight\n\t\t\t\t\t\tcutL = _this.cropperW - _this.cutR - _this.minHeight / _this.fixedNumber[1]*_this.fixedNumber[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(_this.cropperW - _this.cutR - cutL < _this.minWidth){\n\t\t\t\t\t\tcutL = _this.cropperW - _this.cutR - _this.minWidth\n\t\t\t\t\t\tcutB = _this.cropperH - _this.cutT - _this.minWidth / _this.fixedNumber[0]*_this.fixedNumber[1]\n\t\t\t\t\t}\n\t\t\t\t\tthis.setData({\n\t\t\t\t\t\tcutL: cutL,\n\t\t\t\t\t\tcutB: cutB,\n\t\t\t\t\t})\n\t\t\t\t}else{\n\t\t\t\t\tvar dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO\n\t\t\t\t\tif (CUT_L - dragLength < 0) dragLength = CUT_L\n\t\t\t\t\tif ((CUT_L - dragLength) > (this.cropperW - this.cutR)) dragLength = CUT_L - (this.cropperW - this.cutR)\n\t\t\t\t\t\n\t\t\t\t\tlet cutL = CUT_L - dragLength\n\t\t\t\t\t\n\t\t\t\t\tif(_this.cropperW - _this.cutR - cutL < _this.minWidth){\n\t\t\t\t\t\tcutL = _this.cropperW - _this.cutR - _this.minWidth\n\t\t\t\t\t}\n\t\t\t\t\tthis.setData({\n\t\t\t\t\t\tcutL: cutL\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 下移动 、下移动\n\t\t\tdragMoveBottomAndRight(e,x){\n\t\t\t\tconst _this = this\n\t\t\t\tlet cutB = 0,cutR=0,cutL=0,cutT=0\n\t\t\t\tif(_this.fixed){\n\t\t\t\t\tif(x && e.touches[0].pageX > 0){\n\t\t\t\t\t\tvar dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO\n\t\t\t\t\t\tvar dragLengthY = dragLengthX/_this.fixedNumber[0]*_this.fixedNumber[1]\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B\n\t\t\t\t\t\tif (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R\n\t\t\t\t\t\t\n\t\t\t\t\t\tif((CUT_R + dragLengthX===0)){\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif((CUT_B + dragLengthY===0)){\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcutB = CUT_B + dragLengthY;\n\t\t\t\t\t\tcutR = CUT_R + dragLengthX;\n\t\t\t\t\t}\n\t\t\t\t\tif(!x && e.touches[0].pageY > 0){\n\t\t\t\t\t\tvar dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO\n\t\t\t\t\t\tvar dragLengthX = dragLengthY/_this.fixedNumber[1]*_this.fixedNumber[0]\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B\n\t\t\t\t\t\tif (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R\n\t\t\t\t\t\t// 固定比利时如果一边超出范围直接返回\n\t\t\t\t\t\tif((CUT_R + dragLengthX===0)){\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif((CUT_B + dragLengthY===0)){\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcutB = CUT_B + dragLengthY;\n\t\t\t\t\t\tcutR = CUT_R + dragLengthX;\n\t\t\t\t\t}\n\t\t\t\t\t// calc min height and width\n\t\t\t\t\tif(_this.cropperH - cutB - _this.cutT < _this.minHeight){\n\t\t\t\t\t\tcutB = _this.cropperH - _this.cutT - _this.minHeight\n\t\t\t\t\t\tcutR = _this.cropperW - _this.cutL - _this.minHeight / _this.fixedNumber[1]*_this.fixedNumber[0]\n\t\t\t\t\t}\n\t\t\t\t\tif(_this.cropperW - cutR - _this.cutL < _this.minWidth){\n\t\t\t\t\t\tcutR = _this.cropperW - _this.cutL - _this.minWidth\n\t\t\t\t\t\tcutB = _this.cropperH - _this.cutT - _this.minWidth / _this.fixedNumber[0]*_this.fixedNumber[1]\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tvar dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO\n\t\t\t\t\tvar dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO\n\t\t\t\t\t\n\t\t\t\t\tif (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B\n\t\t\t\t\tif (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R\n\t\t\t\t\tcutB = CUT_B + dragLengthY;\n\t\t\t\t\tcutR = CUT_R + dragLengthX;\n\t\t\t\t\t\n\t\t\t\t\t// calc min height and width\n\t\t\t\t\tif(_this.cropperH - cutB - _this.cutT < _this.minHeight){\n\t\t\t\t\t\tcutB = _this.cropperH - _this.cutT - _this.minHeight\n\t\t\t\t\t\tcutR = _this.cropperW - _this.cutL - _this.minWidth\n\t\t\t\t\t}\n\t\t\t\t\tif(_this.cropperW - cutR - _this.cutL < _this.minWidth){\n\t\t\t\t\t\tcutB = _this.cropperH - _this.cutT - _this.minHeight\n\t\t\t\t\t\tcutR = _this.cropperW - _this.cutL - _this.minWidth\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.setData({\n\t\t\t\t\tcutB: cutB,\n\t\t\t\t\tcutR: cutR\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style>\n\t.cropper-config {\n\t\tpadding: 50rpx 40rpx;\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t}\n\n\t.cropper-choose,.cropper-confirm{\n\t\t\n\t\theight: 80rpx;\n\t\tline-height: 80rpx;\n\t\tborder-radius: 8rpx;\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t\tfont-size: 30rpx;\n\t\tfont-weight: 600;\n\t}\n\t\n\t.page-body{\n\t\twidth: calc(100vw);\n\t}\n\n\t.cropper-content {\n\t\twidth: 100%;\n\t\ttouch-action: none;\n\t}\n\n\t.uni-corpper {\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\t-webkit-user-select: none;\n\t\t-moz-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\t-webkit-tap-highlight-color: transparent;\n\t\t-webkit-touch-callout: none;\n\t\tbox-sizing: border-box;\n\t\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC);\n\t}\n\n\t.uni-corpper-content {\n\t\tposition: relative;\n\t}\n\n\t.uni-corpper-content image {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmin-width: 0 !important;\n\t\tmax-width: none !important;\n\t\theight: 100%;\n\t\tmin-height: 0 !important;\n\t\tmax-height: none !important;\n\t\timage-orientation: 0deg !important;\n\t\tmargin: 0 auto;\n\t}\n\t/* 移动图片效果 */\n\n\t.uni-cropper-drag-box {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tcursor: move;\n\t\tbackground: rgba(0, 0, 0, 0.6);\n\t\tz-index: 1;\n\t}\n\t/* 内部的信息 */\n\t\n\t.cropper-modal{\n\t\tbackground: rgba(0, 0, 0, 0.5);\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tuser-select: none;\n\t\tz-index: 1;\n\t}\n\t.cropper-modal-box{\n\t\tposition: absolute;\n\t\toverflow:hidden;\n\t\tz-index:99;\n\t}\n\n\t.uni-corpper-crop-box {\n\t\tposition: absolute;\n\t\tbackground: rgba(255, 255, 255, 0);\n\t\tz-index: 99;\n\t}\n\n\t.uni-corpper-crop-box .uni-cropper-view-box {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: visible;\n\t\toutline: 1rpx solid #69f;\n\t\toutline-color: rgba(102, 153, 255, .75)\n\t}\n\t/* 横向虚线 */\n\n\t.uni-cropper-dashed-h {\n\t\tposition: absolute;\n\t\ttop: 33.33333333%;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 33.33333333%;\n\t\tborder-top: 1rpx dashed rgba(255, 255, 255, 0.5);\n\t\tborder-bottom: 1rpx dashed rgba(255, 255, 255, 0.5);\n\t}\n\t/* 纵向虚线 */\n\n\t.uni-cropper-dashed-v {\n\t\tposition: absolute;\n\t\tleft: 33.33333333%;\n\t\ttop: 0;\n\t\twidth: 33.33333333%;\n\t\theight: 100%;\n\t\tborder-left: 1rpx dashed rgba(255, 255, 255, 0.5);\n\t\tborder-right: 1rpx dashed rgba(255, 255, 255, 0.5);\n\t}\n\t/* 四个方向的线  为了之后的拖动事件*/\n\t.uni-cropper-line-t {\n\t\tposition: absolute;\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tbackground-color: #69f;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\theight: 1rpx;\n\t\topacity: 0.1;\n\t\tcursor: n-resize;\n\t}\n\n\t.uni-cropper-line-t::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tright: 0rpx;\n\t\twidth: 100%;\n\t\t-webkit-transform: translate3d(0, -50%, 0);\n\t\ttransform: translate3d(0, -50%, 0);\n\t\tbottom: 0;\n\t\theight: 41rpx;\n\t\tbackground: transparent;\n\t\tz-index: 11;\n\t}\n\n\t.uni-cropper-line-r {\n\t\tposition: absolute;\n\t\tdisplay: block;\n\t\tbackground-color: #69f;\n\t\ttop: 0;\n\t\tright: 0rpx;\n\t\twidth: 1rpx;\n\t\topacity: 0.1;\n\t\theight: 100%;\n\t\tcursor: e-resize;\n\t}\n\n\t.uni-cropper-line-r::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 50%;\n\t\twidth: 41rpx;\n\t\t-webkit-transform: translate3d(-50%, 0, 0);\n\t\ttransform: translate3d(-50%, 0, 0);\n\t\tbottom: 0;\n\t\theight: 100%;\n\t\tbackground: transparent;\n\t\tz-index: 11;\n\t}\n\n\t.uni-cropper-line-b {\n\t\tposition: absolute;\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tbackground-color: #69f;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\theight: 1rpx;\n\t\topacity: 0.1;\n\t\tcursor: s-resize;\n\t}\n\n\t.uni-cropper-line-b::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tright: 0rpx;\n\t\twidth: 100%;\n\t\t-webkit-transform: translate3d(0, -50%, 0);\n\t\ttransform: translate3d(0, -50%, 0);\n\t\tbottom: 0;\n\t\theight: 41rpx;\n\t\tbackground: transparent;\n\t\tz-index: 11;\n\t}\n\n\t.uni-cropper-line-l {\n\t\tposition: absolute;\n\t\tdisplay: block;\n\t\tbackground-color: #69f;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 1rpx;\n\t\topacity: 0.1;\n\t\theight: 100%;\n\t\tcursor: w-resize;\n\t}\n\n\t.uni-cropper-line-l::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 50%;\n\t\twidth: 41rpx;\n\t\t-webkit-transform: translate3d(-50%, 0, 0);\n\t\ttransform: translate3d(-50%, 0, 0);\n\t\tbottom: 0;\n\t\theight: 100%;\n\t\tbackground: transparent;\n\t\tz-index: 11;\n\t}\n\n\t.uni-cropper-point {\n\t\twidth: 5rpx;\n\t\theight: 5rpx;\n\t\tbackground-color: #69f;\n\t\topacity: .75;\n\t\tposition: absolute;\n\t\tz-index: 3;\n\t}\n\n\t.point-t {\n\t\ttop: -3rpx;\n\t\tleft: 50%;\n\t\tmargin-left: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\n\t.point-tr {\n\t\ttop: -3rpx;\n\t\tleft: 100%;\n\t\tmargin-left: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\n\t.point-r {\n\t\ttop: 50%;\n\t\tleft: 100%;\n\t\tmargin-left: -3rpx;\n\t\tmargin-top: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\n\t.point-rb {\n\t\tleft: 100%;\n\t\ttop: 100%;\n\t\t-webkit-transform: translate3d(-50%, -50%, 0);\n\t\ttransform: translate3d(-50%, -50%, 0);\n\t\tcursor: n-resize;\n\t\twidth: 36rpx;\n\t\theight: 36rpx;\n\t\tbackground-color: #69f;\n\t\tposition: absolute;\n\t\tz-index: 1112;\n\t\topacity: 1;\n\t}\n\n\t.point-b {\n\t\tleft: 50%;\n\t\ttop: 100%;\n\t\tmargin-left: -3rpx;\n\t\tmargin-top: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\n\t.point-bl {\n\t\tleft: 0%;\n\t\ttop: 100%;\n\t\tmargin-left: -3rpx;\n\t\tmargin-top: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\n\t.point-l {\n\t\tleft: 0%;\n\t\ttop: 50%;\n\t\tmargin-left: -3rpx;\n\t\tmargin-top: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\n\t.point-lt {\n\t\tleft: 0%;\n\t\ttop: 0%;\n\t\tmargin-left: -3rpx;\n\t\tmargin-top: -3rpx;\n\t\tcursor: n-resize;\n\t}\n\t/* 裁剪框预览内容 */\n\n\t.uni-cropper-viewer {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\toverflow: hidden;\n\t}\n\n\t.uni-cropper-viewer image {\n\t\tposition: absolute;\n\t\tz-index: 2;\n\t}\n\t\n\t.show-crop-img{\n\t\tposition: absolute;\n\t\ttop: -100rpx;\n\t\tleft: 0;\n\t\tright: 0;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/okingtz-cropper/package.json",
    "content": "{\n  \"id\": \"okingtz-cropper\",\n  \"displayName\": \"image-cropper\",\n  \"version\": \"1.0.10\",\n  \"description\": \"头像上传裁切组件\",\n  \"keywords\": [\n    \"小程序\",\n    \"图片裁切\",\n    \"头像剪切\",\n    \"图片剪切\",\n    \"cropper\"\n],\n  \"repository\": \"https://gitee.com/okingt/cropper\",\n  \"engines\": {\n    \"HBuilderX\": \"^3.1.0\"\n  },\n\"dcloudext\": {\n    \"sale\": {\n      \"regular\": {\n        \"price\": \"0.00\"\n      },\n      \"sourcecode\": {\n        \"price\": \"0.00\"\n      }\n    },\n    \"contact\": {\n      \"qq\": \"\"\n    },\n    \"declaration\": {\n      \"ads\": \"无\",\n      \"data\": \"插件不采集任何数据\",\n      \"permissions\": \"无\"\n    },\n    \"npmurl\": \"\",\n    \"type\": \"component-vue\"\n  },\n  \"uni_modules\": {\n    \"dependencies\": [],\n    \"encrypt\": [],\n    \"platforms\": {\n      \"cloud\": {\n        \"tcb\": \"y\",\n        \"aliyun\": \"y\"\n      },\n      \"client\": {\n        \"App\": {\n          \"app-vue\": \"u\",\n          \"app-nvue\": \"u\"\n        },\n        \"H5-mobile\": {\n          \"Safari\": \"y\",\n          \"Android Browser\": \"y\",\n          \"微信浏览器(Android)\": \"y\",\n          \"QQ浏览器(Android)\": \"y\"\n        },\n        \"H5-pc\": {\n          \"Chrome\": \"y\",\n          \"IE\": \"y\",\n          \"Edge\": \"y\",\n          \"Firefox\": \"y\",\n          \"Safari\": \"y\"\n        },\n        \"小程序\": {\n          \"微信\": \"y\",\n          \"阿里\": \"u\",\n          \"百度\": \"u\",\n          \"字节跳动\": \"u\",\n          \"QQ\": \"u\"\n        },\n        \"快应用\": {\n          \"华为\": \"u\",\n          \"联盟\": \"u\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "uni_modules/okingtz-cropper/readme.md",
    "content": "### 组件说明\n\n- 此组件是根据官方组件（hello-uniapp/pages/template/crop/crop.vue）优化而成，组件化；\n- 目的是为了方便之后的使用；\n- 希望此项目可以给各位老板提供一些思路，或者直接使用；\n- 欢迎各位老板评论、收藏，指教；如果有问题会不定时更新；\n- 长期更新。\n\n### 参数说明\n|            参数             |    类型     | 必填 | 默认值        | 说明                                             |\n| :-------------------------: | :---------: | :--: | ------------- | ------------------------------------------------ |\n|            fixed            |   Boolean   |  否  | true          | 固定比例（优先级高于cropWidth、cropHeight，如果设置固定比例则直接使用比例计算）|\n|         fixedNumber         |    Array    |  否  | [1,1]         | [宽:高]比例数组（优先级高于cropWidth、cropHeight，如果设置固定比例则直接使用比例计算）|\n|          cropWidth          |   Number    |  否  | 200           | 裁剪框初始化宽度（px）                           |\n|         cropHeight          |   Number    |  否  | 200           | 裁剪框初始化高度（px）                           |\n|          minWidth           |   Number    |  否  | 20            | 最小宽度（px）                                   |\n|          minHeight          |   Number    |  否  | 20            | 最小高度（px）                                   |\n|         saveLoading         |   String    |  否  | 图片生成中...   | 生成/上传图片时的loading文字                     |\n|      selectButtonText       |   String    |  否  | 选择照片        | 选择照片的按钮文字                               |\n|      selectButtonColor      |   String    |  否  | #FFFFFF       | 选择照片的按钮文字颜色                           |\n| selectButtonBackgroundColor |   String    |  否  | #FF2E80       | 选择照片的按钮背景颜色                           |\n|       saveButtonText        |   String    |  否  | 上传           | 上传的按钮文字                                   |\n|       saveButtonColor       |   String    |  否  | #FFFFFF       | 上传的按钮文字颜色                               |\n|  saveButtonBackgroundColor  |   String    |  否  | #FF2E80       | 上传的按钮背景颜色                               |\n|  image  \t\t\t\t\t  |   String    |  否  | ''            | 默认图片                               |\n|  maxCropper  \t\t\t\t  |   Boolean   |  否  | false         | 打开时是够默认最大尺度展示裁剪框           |\n|  fileType  \t\t\t      |   String    |  否  | 'jpg'         | 目标文件的类型，只支持 'jpg' 或 'png'。默认为 'jpg'|\n|  quality  \t\t\t\t  |   Number    |  否  | 1             | 图片的质量，取值范围为 (0, 1]，不在范围内时当作1.0处理（微信小程序：目前仅对 jpg 有效）|\n|  original  \t\t\t\t  |   Boolean   |  否  | true          | 是否按照原始大小返回|\n|       canMove        | Boolean |  否  | true            | 是否可以移动 |\n|       canScale        | Boolean |  否  | true           | 是否可以放缩 |\n\n### 使用方法\n\n#### 导入插件\n\n使用 HBuilderX 导入插件\n\n#### 代码使用\n\n```vue\n<template>\n\t<view>\n\t\t<okingtz-cropper @uploadSuccess=\"uploadSuccess\"></okingtz-cropper>\n\t</view>\n</template>\n\n<script>\n  //  1.引入项目\n  import OkingtzCropper from '@/uni_modules/okingtz-cropper/components/okingtz-cropper/okingtz-cropper'\n  export default {\n\t\tcomponents:{\n\t\t\t//2.使用组件\n\t\t\tOkingtzCropper\n\t\t},\n\t\tmethods: {\n\t\t\t// 3.定义自己的回调函数\n\t\t\tuploadSuccess(tempFilePath){\n\t\t\t\tuni.showToast({\n\t\t\t\t\ttitle:'保存成功'\n\t\t\t\t})\n\t\t\t\t// 4.根据自己的业务场景处理tempFilePath ;接口保存，或者上传至云空间\n\t\t\t\tconsole.log('tempFilePath_->',tempFilePath)\n\t\t\t}\n\t\t}\n\t}\n</script>\n```\n\n\n\n\n"
  },
  {
    "path": "utils/Foundation.js",
    "content": "/**\r\n * 一些常用的基础方法\r\n * whetherNavigate 登录后跳转判断\r\n * unixToDate    将unix时间戳转换为指定格式\r\n * dateToUnix    将时间转unix时间戳\r\n * deepClone     对一个对象进行深拷贝\r\n * formatPrice   货币格式化\r\n * secrecyMobile 手机号隐私保护\r\n * randomString  随机生成指定长度的字符串\r\n */\r\n\r\n/**\r\n * 验证银行卡号\r\n */\r\nexport function checkBankno(bankno) {\r\n  var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位（与luhm进行比较）\r\n  var first15Num = bankno.substr(0, bankno.length - 1); //前15或18位\r\n  var newArr = [];\r\n\r\n  for (var i = first15Num.length - 1; i > -1; i--) {\r\n    //前15或18位倒序存进数组\r\n    newArr.push(first15Num.substr(i, 1));\r\n  }\r\n\r\n  var arrJiShu = []; //奇数位*2的积 <9\r\n  var arrJiShu2 = []; //奇数位*2的积 >9\r\n  var arrOuShu = []; //偶数位数组\r\n  for (var j = 0; j < newArr.length; j++) {\r\n    if ((j + 1) % 2 == 1) {\r\n      //奇数位\r\n      if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2);\r\n      else arrJiShu2.push(parseInt(newArr[j]) * 2);\r\n    } //偶数位\r\n    else arrOuShu.push(newArr[j]);\r\n  }\r\n\r\n  var jishu_child1 = []; //奇数位*2 >9 的分割之后的数组个位数\r\n  var jishu_child2 = []; //奇数位*2 >9 的分割之后的数组十位数\r\n  for (var h = 0; h < arrJiShu2.length; h++) {\r\n    jishu_child1.push(parseInt(arrJiShu2[h]) % 10);\r\n    jishu_child2.push(parseInt(arrJiShu2[h]) / 10);\r\n  }\r\n\r\n  var sumJiShu = 0; //奇数位*2 < 9 的数组之和\r\n  var sumOuShu = 0; //偶数位数组之和\r\n  var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和\r\n  var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和\r\n  var sumTotal = 0;\r\n  for (var m = 0; m < arrJiShu.length; m++) {\r\n    sumJiShu = sumJiShu + parseInt(arrJiShu[m]);\r\n  }\r\n  for (var n = 0; n < arrOuShu.length; n++) {\r\n    sumOuShu = sumOuShu + parseInt(arrOuShu[n]);\r\n  }\r\n  for (var p = 0; p < jishu_child1.length; p++) {\r\n    sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]);\r\n    sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]);\r\n  }\r\n  //计算总和\r\n  sumTotal =\r\n    parseInt(sumJiShu) +\r\n    parseInt(sumOuShu) +\r\n    parseInt(sumJiShuChild1) +\r\n    parseInt(sumJiShuChild2);\r\n  //计算Luhm值\r\n  var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;\r\n  var luhm = 10 - k;\r\n  if (lastNum == luhm) {\r\n    return true;\r\n  } else {\r\n    return false;\r\n  }\r\n}\r\n\r\n/**\r\n * 登录后跳转判断\r\n * 计算出当前router路径\r\n * 1.如果跳转的链接为登录页面或跳转的链接为空页面。则会重新跳转到首页\r\n * 2.都不满足返回跳转页面\r\n * @param type  'default' || 'wx'  //返回地址会做判断默认为default\r\n */\r\n\r\nexport function whetherNavigate(type = \"default\") {\r\n  let navigation = getCurrentPages()[getCurrentPages().length - (getCurrentPages().length ) ];\r\n  if (getCurrentPages().length > 1) {\r\n    console.log(navigation, getCurrentPages());\r\n    if (navigation.route == \"pages/passport/login\") {\r\n      navigationToBack(type);\r\n    } else {\r\n      if (!navigation.route || navigation.route == \"undefined\") {\r\n        navigationToBack(type);\r\n      } else {\r\n        uni.navigateBack({\r\n          delta: getCurrentPages().length-1,\r\n        });\r\n      }\r\n    }\r\n  } else {\r\n    uni.switchTab({\r\n      url: \"/pages/tabbar/home/index\",\r\n    });\r\n  }\r\n}\r\n\r\n/**\r\n * 将unix时间戳转换为指定格式\r\n * @param unix   时间戳【秒】\r\n * @param format 转换格式\r\n * @returns {*|string}\r\n */\r\nexport function unixToDate(unix, format) {\r\n  if (!unix) return unix;\r\n  let _format = format || \"yyyy-MM-dd hh:mm:ss\";\r\n  const d = new Date(unix);\r\n  const o = {\r\n    \"M+\": d.getMonth() + 1,\r\n    \"d+\": d.getDate(),\r\n    \"h+\": d.getHours(),\r\n    \"m+\": d.getMinutes(),\r\n    \"s+\": d.getSeconds(),\r\n    \"q+\": Math.floor((d.getMonth() + 3) / 3),\r\n    S: d.getMilliseconds(),\r\n  };\r\n  if (/(y+)/.test(_format))\r\n    _format = _format.replace(\r\n      RegExp.$1,\r\n      (d.getFullYear() + \"\").substr(4 - RegExp.$1.length)\r\n    );\r\n  for (const k in o)\r\n    if (new RegExp(\"(\" + k + \")\").test(_format))\r\n      _format = _format.replace(\r\n        RegExp.$1,\r\n        RegExp.$1.length === 1 ? o[k] : (\"00\" + o[k]).substr((\"\" + o[k]).length)\r\n      );\r\n  return _format;\r\n}\r\n\r\n/**\r\n * 将时间转unix时间戳\r\n * @param date\r\n * @returns {number} 【秒】\r\n */\r\nexport function dateToUnix(date) {\r\n  let newStr = date.replace(/:/g, \"-\");\r\n  newStr = newStr.replace(/ /g, \"-\");\r\n  const arr = newStr.split(\"-\");\r\n  const datum = new Date(\r\n    Date.UTC(\r\n      arr[0],\r\n      arr[1] - 1,\r\n      arr[2],\r\n      arr[3] - 8 || -8,\r\n      arr[4] || 0,\r\n      arr[5] || 0\r\n    )\r\n  );\r\n  return parseInt(datum.getTime() / 1000);\r\n}\r\n\r\n/**\r\n * 货币格式化\r\n * @param price\r\n * @returns {string}\r\n */\r\nexport function formatPrice(price) {\r\n  if (typeof price !== \"number\") return price;\r\n  return String(Number(price).toFixed(2)).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n}\r\n\r\n/**\r\n * 手机号隐私保护\r\n * 隐藏中间四位数字\r\n * @param mobile\r\n * @returns {*}\r\n */\r\nexport function secrecyMobile(mobile) {\r\n  mobile = String(mobile);\r\n  if (!/\\d{11}/.test(mobile)) {\r\n    return mobile;\r\n  }\r\n  return mobile.replace(/(\\d{3})(\\d{4})(\\d{4})/, \"$1****$3\");\r\n}\r\n\r\n/**\r\n * 随机生成指定长度的字符串\r\n * @param length\r\n * @returns {string}\r\n */\r\nexport function randomString(length = 32) {\r\n  const chars =\r\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\r\n  const maxPos = chars.length;\r\n  let _string = \"\";\r\n  for (let i = 0; i < length; i++) {\r\n    _string += chars.charAt(Math.floor(Math.random() * maxPos));\r\n  }\r\n  return _string;\r\n}\r\n\r\n/**\r\n * 计算传秒数的倒计时【天、时、分、秒】\r\n * @param seconds\r\n * @returns {{day : *, hours : *, minutes : *, seconds : *}}\r\n */\r\n\r\nexport function countTimeDown(seconds) {\r\n  const leftTime = (time) => {\r\n    if (time < 10) time = \"0\" + time;\r\n    return time + \"\";\r\n  };\r\n  return {\r\n    day: leftTime(parseInt(seconds / 60 / 60 / 24, 10)),\r\n    hours: leftTime(parseInt((seconds / 60 / 60) % 24, 10)),\r\n    minutes: leftTime(parseInt((seconds / 60) % 60, 10)),\r\n    seconds: leftTime(parseInt(seconds % 60, 10)),\r\n  };\r\n}\r\n\r\nfunction navigationToBack(type) {\r\n  if (type == \"wx\") {\r\n    // console.log(getCurrentPages().length - 3)\r\n    uni.navigateBack({\r\n      delta: getCurrentPages().length,\r\n    });\r\n  } else {\r\n    uni.switchTab({\r\n      url: \"/pages/tabbar/home/index\",\r\n    });\r\n  }\r\n}\r\n\r\n/**\r\n * 计算当前时间到第二天0点的倒计时[秒]\r\n * @returns {number}\r\n */\r\nexport function theNextDayTime() {\r\n  const nowDate = new Date();\r\n  const time =\r\n    new Date(\r\n      nowDate.getFullYear(),\r\n      nowDate.getMonth(),\r\n      nowDate.getDate() + 1,\r\n      0,\r\n      0,\r\n      0\r\n    ).getTime() - nowDate.getTime();\r\n  return parseInt(time / 1000);\r\n}\r\nmodule.exports = {\r\n  unixToDate,\r\n  dateToUnix,\r\n  formatPrice,\r\n  secrecyMobile,\r\n  randomString,\r\n  countTimeDown,\r\n  theNextDayTime,\r\n  whetherNavigate,\r\n  checkBankno,\r\n};\r\n"
  },
  {
    "path": "utils/RegExp.js",
    "content": "/**\r\n * 各种正则表达式\r\n * mobile   手机号\r\n * email    电子邮箱\r\n * password 密码【6-20位】\r\n * integer  正整数【不包含0】\r\n * money    金钱\r\n * TINumber 纳税识别号\r\n * IDCard   身份证\r\n * userName 账户名称【汉字、字母、数字、“-”、“_”的组合】\r\n * URL      URL\r\n * TEL      固定电话\r\n */\r\n\r\n// 手机号\r\nexport const mobile = /^0?(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])[0-9]{8}$/\r\n\r\n// 电子邮箱\r\nexport const email = /^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/\r\n\r\n// 密码【6-20位】\r\nexport const password = /^[@A-Za-z0-9!#$%^&*.~,]{6,20}$/\r\n\r\n// 正整数【不包含0】\r\nexport const integer = /^[1-9]\\d*$/\r\n\r\n// 正整数【包含0】\r\nexport const Integer = /^[0-9]\\d*$/\r\n\r\n// 金钱\r\nexport const money = /(^[1-9]([0-9]+)?(\\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\\.[0-9]([0-9])?$)/\r\n\r\n// 纳税识别号\r\nexport const TINumber = /^((\\d{6}[0-9A-Z]{9})|([0-9A-Za-z]{2}\\d{6}[0-9A-Za-z]{10,12}))$/\r\n\r\n// 身份证\r\nexport const IDCard = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/\r\n\r\n// 账户名称【汉字、字母、数字、“-”、“_”的组合】\r\nexport const userName = /[A-Za-z0-9_\\-\\u4e00-\\u9fa5]$/\r\n\r\n// URL\r\nexport const URL =\r\n\t/^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/\r\n\r\n// 固话\r\nexport const TEL = /0\\d{2,3}-\\d{7,8}/\r\n\r\n\r\n// 营业执照号\r\nexport const licenseNum = /(^(?:(?![IOZSV])[\\dA-Z]){2}\\d{6}(?:(?![IOZSV])[\\dA-Z]){10}$)|(^\\d{15}$)/;\r\n"
  },
  {
    "path": "utils/emojis.js",
    "content": "/**\n * 动态表情\n */\nconst emojis = {\n  \"[微笑]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/0.gif'>\",\n  \"[撇嘴]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/1.gif'>\",\n  \"[色]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/2.gif'>\",\n  \"[发呆]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/3.gif'>\",\n  \"[得意]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/4.gif'>\",\n  \"[流泪]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/5.gif'>\",\n  \"[害羞]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/6.gif'>\",\n  \"[闭嘴]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/7.gif'>\",\n  \"[睡]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/8.gif'>\",\n  \"[大哭]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/9.gif'>\",\n  \"[尴尬]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/10.gif'>\",\n  \"[发怒]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/11.gif'>\",\n  \"[调皮]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/12.gif'>\",\n  \"[呲牙]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/13.gif'>\",\n  \"[惊讶]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/14.gif'>\",\n  \"[难过]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/15.gif'>\",\n  \"[酷]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/16.gif'>\",\n  \"[冷汗]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/17.gif'>\",\n  \"[抓狂]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/18.gif'>\",\n  \"[吐]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/19.gif'>\",\n  \"[偷笑]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/20.gif'>\",\n  \"[可爱]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/21.gif'>\",\n  \"[白眼]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/22.gif'>\",\n  \"[傲慢]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/23.gif'>\",\n  \"[饥饿]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/24.gif'>\",\n  \"[困]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/25.gif'>\",\n  \"[惊恐]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/26.gif'>\",\n  \"[流汗]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/27.gif'>\",\n  \"[憨笑]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/28.gif'>\",\n  \"[大兵]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/29.gif'>\",\n  \"[奋斗]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/30.gif'>\",\n  \"[咒骂]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/31.gif'>\",\n  \"[疑问]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/32.gif'>\",\n  \"[嘘]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/33.gif'>\",\n  \"[晕]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/34.gif'>\",\n  \"[折磨]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/35.gif'>\",\n  \"[衰]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/36.gif'>\",\n  \"[骷髅]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/37.gif'>\",\n  \"[敲打]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/38.gif'>\",\n  \"[再见]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/39.gif'>\",\n  \"[擦汗]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/40.gif'>\",\n  \"[抠鼻]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/41.gif'>\",\n  \"[鼓掌]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/42.gif'>\",\n  \"[糗大了]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/43.gif'>\",\n  \"[坏笑]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/44.gif'>\",\n  \"[左哼哼]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/45.gif'>\",\n  \"[右哼哼]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/46.gif'>\",\n  \"[哈欠]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/47.gif'>\",\n  \"[鄙视]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/48.gif'>\",\n  \"[委屈]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/49.gif'>\",\n  \"[快哭了]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/50.gif'>\",\n  \"[阴险]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/51.gif'>\",\n  \"[亲亲]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/52.gif'>\",\n  \"[吓]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/53.gif'>\",\n  \"[可怜]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/54.gif'>\",\n  \"[菜刀]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/55.gif'>\",\n  \"[西瓜]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/56.gif'>\",\n  \"[啤酒]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/57.gif'>\",\n  \"[篮球]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/58.gif'>\",\n  \"[乒乓]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/59.gif'>\",\n  \"[咖啡]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/60.gif'>\",\n  \"[饭]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/61.gif'>\",\n  \"[猪头]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/62.gif'>\",\n  \"[玫瑰]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/63.gif'>\",\n  \"[凋谢]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/64.gif'>\",\n  \"[示爱]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/65.gif'>\",\n  \"[爱心]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/66.gif'>\",\n  \"[心碎]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/67.gif'>\",\n  \"[蛋糕]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/68.gif'>\",\n  \"[闪电]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/69.gif'>\",\n  \"[炸弹]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/70.gif'>\",\n  \"[刀]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/71.gif'>\",\n  \"[足球]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/72.gif'>\",\n  \"[瓢虫]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/73.gif'>\",\n  \"[便便]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/74.gif'>\",\n  \"[月亮]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/75.gif'>\",\n  \"[太阳]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/76.gif'>\",\n  \"[礼物]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/77.gif'>\",\n  \"[拥抱]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/78.gif'>\",\n  \"[强]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/79.gif'>\",\n  \"[弱]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/80.gif'>\",\n  \"[握手]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/81.gif'>\",\n  \"[胜利]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/82.gif'>\",\n  \"[抱拳]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/83.gif'>\",\n  \"[勾引]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/84.gif'>\",\n  \"[拳头]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/85.gif'>\",\n  \"[差劲]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/86.gif'>\",\n  \"[爱你]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/87.gif'>\",\n  \"[NO]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/88.gif'>\",\n  \"[OK]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/89.gif'>\",\n  \"[爱情]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/90.gif'>\",\n  \"[飞吻]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/91.gif'>\",\n  \"[跳跳]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/92.gif'>\",\n  \"[发抖]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/93.gif'>\",\n  \"[怄火]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/94.gif'>\",\n  \"[转圈]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/95.gif'>\",\n  \"[磕头]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/96.gif'>\",\n  \"[回头]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/97.gif'>\",\n  \"[跳绳]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/98.gif'>\",\n  \"[挥手]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/99.gif'>\",\n  \"[激动]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/100.gif'>\",\n  \"[街舞]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/101.gif'>\",\n  \"[献吻]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/102.gif'>\",\n  \"[左太极]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/103.gif'>\",\n  \"[右太极]\": \"<img src='https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/104.gif'>\",\n};\n\n/**\n* 符号表情\n*/\nconst symbol = [\n  \"😠\", \"😩\", \"😲\", \"😞\", \"😵\", \"😰\", \"😒\", \"😍\", \"😤\", \"😜\", \"😝\", \"😋\", \"😘\", \"😚\", \"😷\",\n  \"😳\", \"😃\", \"😅\", \"😆\", \"😁\", \"😂\", \"😊\", \"☺\", \"😄\", \"😢\",\n  \"😭\", \"😨\", \"😣\", \"😡\", \"😌\", \"😖\", \"😔\", \"😱\", \"😪\", \"😏\", \"😓\", \"😥\", \"😫\", \"😉\",\n  \"✊\", \"✋\", \"✌\", \"👊\", \"👍\", \"☝\", \"👆\", \"👇\", \"👈\", \"👉\",\n  \"👋\", \"👏\", \"👌\", \"👎\"\n];\n\nconst emojisKeys = Object.keys(emojis);\n\nexport const emojiList = {\n  symbol,\n  emojis\n}\n\nconst regEmoji = emojisKeys.map((value) => '|\\\\' + value).join('').replace('|', '')\n\n/**\n* 替换表情文字\n* \n* @param {String} content 需要替换的字符串\n*/\nexport function textReplaceEmoji (content) {\n  if (!content) {\n    return \"\"\n  }\n  return content.replace(new RegExp(`(${regEmoji})`, 'gi'), ($0, $1) => {\n    return emojis[$1];\n  });\n}\nexport const emojistwo = Object.keys(emojis)"
  },
  {
    "path": "utils/filters.js",
    "content": "import { logout, logoffConfirm } from \"@/api/login\";\r\nimport { getUserInfo } from \"@/api/members\";\r\nimport storage from \"@/utils/storage.js\";\r\nimport Vue from \"vue\";\r\nimport Foundation from \"./Foundation.js\";\r\n/**\r\n * 金钱单位置换  2999 --> 2,999.00\r\n * @param val\r\n * @param unit\r\n * @param location\r\n * @returns {*}\r\n */\r\nexport function unitPrice (val, unit, location) {\r\n  if (!val) val = 0;\r\n  let price = Foundation.formatPrice(val);\r\n  if (location === \"before\") {\r\n    return price.substr(0, price.length - 3);\r\n  }\r\n  if (location === \"after\") {\r\n    return price.substr(-2);\r\n  }\r\n  return (unit || \"\") + price;\r\n}\r\n\r\n/**\r\n * 格式化价格  1999 --> [1999,00]\r\n * @param {*} val\r\n * @returns\r\n */\r\nexport function goodsFormatPrice (val) {\r\n  if (typeof val == \"undefined\") {\r\n    return val;\r\n  }\r\n  let valNum = new Number(val);\r\n  return valNum.toFixed(2).split(\".\");\r\n}\r\n\r\n\r\n/**\r\n * 将内容复制到粘贴板\r\n */\r\nimport { h5Copy } from \"@/js_sdk/h5-copy/h5-copy.js\";\r\nexport function setClipboard (val) {\r\n  // #ifdef H5\r\n  if (val === null || val === undefined) {\r\n    val = \"\";\r\n  } else val = val + \"\";\r\n  const result = h5Copy(val);\r\n  if (result === false) {\r\n    uni.showToast({\r\n      title: \"不支持\",\r\n    });\r\n  } else {\r\n    uni.showToast({\r\n      title: \"复制成功\",\r\n      icon: \"none\",\r\n    });\r\n  }\r\n  // #endif\r\n\r\n  // #ifndef H5\r\n  uni.setClipboardData({\r\n    data: val,\r\n    success: function () {\r\n      uni.showToast({\r\n        title: \"复制成功!\",\r\n        duration: 2000,\r\n        icon: \"none\",\r\n      });\r\n    },\r\n  });\r\n  // #endif\r\n}\r\n\r\n/**\r\n * 拨打电话\r\n */\r\n\r\nexport function callPhone (phoneNumber) {\r\n  uni.makePhoneCall({\r\n    phoneNumber: phoneNumber,\r\n  });\r\n}\r\n\r\n/**\r\n * 脱敏姓名\r\n */\r\n\r\nexport function noPassByName (str) {\r\n  if (null != str && str != undefined) {\r\n    if (str.length <= 3) {\r\n      return \"*\" + str.substring(1, str.length);\r\n    } else if (str.length > 3 && str.length <= 6) {\r\n      return \"**\" + str.substring(2, str.length);\r\n    } else if (str.length > 6) {\r\n      return str.substring(0, 2) + \"****\" + str.substring(6, str.length);\r\n    }\r\n  } else {\r\n    return \"\";\r\n  }\r\n}\r\n\r\n/**\r\n * 处理unix时间戳，转换为可阅读时间格式\r\n * @param unix\r\n * @param format\r\n * @returns {*|string}\r\n */\r\nexport function unixToDate (unix, format) {\r\n  let _format = format || \"yyyy-MM-dd hh:mm:ss\";\r\n  const d = new Date(unix * 1000);\r\n  const o = {\r\n    \"M+\": d.getMonth() + 1,\r\n    \"d+\": d.getDate(),\r\n    \"h+\": d.getHours(),\r\n    \"m+\": d.getMinutes(),\r\n    \"s+\": d.getSeconds(),\r\n    \"q+\": Math.floor((d.getMonth() + 3) / 3),\r\n    S: d.getMilliseconds(),\r\n  };\r\n  if (/(y+)/.test(_format))\r\n    _format = _format.replace(\r\n      RegExp.$1,\r\n      (d.getFullYear() + \"\").substr(4 - RegExp.$1.length)\r\n    );\r\n  for (const k in o)\r\n    if (new RegExp(\"(\" + k + \")\").test(_format))\r\n      _format = _format.replace(\r\n        RegExp.$1,\r\n        RegExp.$1.length === 1 ? o[k] : (\"00\" + o[k]).substr((\"\" + o[k]).length)\r\n      );\r\n  return _format;\r\n}\r\n\r\n/**\r\n * 人性化显示时间\r\n *\r\n * @param {Object} datetime\r\n */\r\nexport function beautifyTime (datetime = \"\") {\r\n  if (datetime == null || datetime == undefined || !datetime) {\r\n    return \"\";\r\n  }\r\n  datetime = timestampToTime(datetime).replace(/-/g, \"/\");\r\n\r\n  let time = new Date();\r\n  let outTime = new Date(datetime);\r\n  if (/^[1-9]\\d*$/.test(datetime)) {\r\n    outTime = new Date(parseInt(datetime) * 1000);\r\n  }\r\n\r\n  if (time.getTime() < outTime.getTime()) {\r\n    return parseTime(outTime, \"{y}/{m}/{d}\");\r\n  }\r\n\r\n  if (time.getFullYear() != outTime.getFullYear()) {\r\n    return parseTime(outTime, \"{y}/{m}/{d}\");\r\n  }\r\n\r\n  if (time.getMonth() != outTime.getMonth()) {\r\n    return parseTime(outTime, \"{m}/{d}\");\r\n  }\r\n\r\n  if (time.getDate() != outTime.getDate()) {\r\n    let day = outTime.getDate() - time.getDate();\r\n    if (day == -1) {\r\n      return parseTime(outTime, \"昨天 {h}:{i}\");\r\n    }\r\n\r\n    if (day == -2) {\r\n      return parseTime(outTime, \"前天 {h}:{i}\");\r\n    }\r\n\r\n    return parseTime(outTime, \"{m}-{d}\");\r\n  }\r\n\r\n  if (time.getHours() != outTime.getHours()) {\r\n    return parseTime(outTime, \"{h}:{i}\");\r\n  }\r\n\r\n  let minutes = outTime.getMinutes() - time.getMinutes();\r\n  if (minutes == 0) {\r\n    return \"刚刚\";\r\n  }\r\n\r\n  minutes = Math.abs(minutes);\r\n  return `${minutes}分钟前`;\r\n}\r\n// 时间转换\r\nfunction timestampToTime (timestamp) {\r\n  var date = new Date(timestamp);//时间戳为10位需*1000，时间戳为13位的话不需乘1000\r\n  var Y = date.getFullYear() + '-';\r\n  var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';\r\n  var D = date.getDate() + ' ';\r\n  var h = date.getHours() + ':';\r\n  var m = date.getMinutes() + ':';\r\n  var s = date.getSeconds();\r\n  return Y + M + D + h + m + s;\r\n}\r\n\r\n/**\r\n * 13888888888 -> 138****8888\r\n * @param mobile\r\n * @returns {*}\r\n */\r\nexport function secrecyMobile (mobile) {\r\n  mobile = String(mobile);\r\n  if (!/\\d{11}/.test(mobile)) {\r\n    return mobile;\r\n  }\r\n  return mobile.replace(/(\\d{3})(\\d{4})(\\d{4})/, \"$1****$3\");\r\n}\r\n\r\n/**\r\n * 人性化时间显示\r\n *\r\n * @param {Object} datetime\r\n */\r\nexport function formatTime (datetime) {\r\n  if (datetime == null) return \"\";\r\n\r\n  datetime = datetime.replace(/-/g, \"/\");\r\n\r\n  let time = new Date();\r\n  let outTime = new Date(datetime);\r\n  if (/^[1-9]\\d*$/.test(datetime)) {\r\n    outTime = new Date(parseInt(datetime) * 1000);\r\n  }\r\n\r\n  if (\r\n    time.getTime() < outTime.getTime() ||\r\n    time.getFullYear() != outTime.getFullYear()\r\n  ) {\r\n    return parseTime(outTime, \"{y}-{m}-{d} {h}:{i}\");\r\n  }\r\n\r\n  if (time.getMonth() != outTime.getMonth()) {\r\n    return parseTime(outTime, \"{m}-{d} {h}:{i}\");\r\n  }\r\n\r\n  if (time.getDate() != outTime.getDate()) {\r\n    let day = outTime.getDate() - time.getDate();\r\n    if (day == -1) {\r\n      return parseTime(outTime, \"昨天 {h}:{i}\");\r\n    }\r\n\r\n    if (day == -2) {\r\n      return parseTime(outTime, \"前天 {h}:{i}\");\r\n    }\r\n\r\n    return parseTime(outTime, \"{m}-{d} {h}:{i}\");\r\n  }\r\n\r\n  if (time.getHours() != outTime.getHours()) {\r\n    return parseTime(outTime, \"{h}:{i}\");\r\n  }\r\n\r\n  let minutes = outTime.getMinutes() - time.getMinutes();\r\n  if (minutes == 0) {\r\n    return \"刚刚\";\r\n  }\r\n\r\n  minutes = Math.abs(minutes);\r\n  return `${minutes}分钟前`;\r\n}\r\n\r\n/**\r\n * 时间格式化方法\r\n *\r\n * @param {(Object|string|number)} time\r\n * @param {String} cFormat\r\n * @returns {String | null}\r\n */\r\nexport function parseTime (time, cFormat) {\r\n  if (arguments.length === 0) {\r\n    return null;\r\n  }\r\n\r\n  let date;\r\n  const format = cFormat || \"{y}-{m}-{d} {h}:{i}:{s}\";\r\n\r\n  if (typeof time === \"object\") {\r\n    date = time;\r\n  } else {\r\n    if (typeof time === \"string\" && /^[0-9]+$/.test(time)) {\r\n      time = parseInt(time);\r\n    }\r\n    if (typeof time === \"number\" && time.toString().length === 10) {\r\n      time = time * 1000;\r\n      console.log(\"时间判断为number\");\r\n    }\r\n\r\n    date = new Date(time.replace(/-/g, \"/\"));\r\n  }\r\n\r\n  const formatObj = {\r\n    y: date.getFullYear(),\r\n    m: date.getMonth() + 1,\r\n    d: date.getDate(),\r\n    h: date.getHours(),\r\n    i: date.getMinutes(),\r\n    s: date.getSeconds(),\r\n    a: date.getDay(),\r\n  };\r\n\r\n  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {\r\n    const value = formatObj[key];\r\n    // Note: getDay() returns 0 on Sunday\r\n    if (key === \"a\") {\r\n      return [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"][value];\r\n    }\r\n\r\n    return value.toString().padStart(2, \"0\");\r\n  });\r\n\r\n  return time_str;\r\n}\r\n\r\n/**\r\n * 清除逗号\r\n *\r\n */\r\nexport function clearStrComma (str) {\r\n  str = str.replace(/,/g, \"\"); //取消字符串中出现的所有逗号\r\n  return str;\r\n}\r\n\r\n/**\r\n * 判断用户是否登录\r\n * @param val  如果为auth则判断是否登录\r\n * 如果传入 auth 则为判断是否登录\r\n */\r\nexport function isLogin (val) {\r\n  let userInfo = storage.getUserInfo();\r\n  if (val == \"auth\") {\r\n    return userInfo && userInfo.id ? true : false;\r\n  } else {\r\n    return storage.getUserInfo();\r\n  }\r\n}\r\n\r\n/**\r\n * 退出登录\r\n *\r\n */\r\nexport function quiteLoginOut () {\r\n  uni.showModal({\r\n    title: \"提示\",\r\n    content: \"是否退出登录？\",\r\n    confirmColor: Vue.prototype.$mainColor,\r\n    async success (res) {\r\n      if (res.confirm) {\r\n        storage.setAccessToken(\"\");\r\n        storage.setRefreshToken(\"\");\r\n        storage.setUserInfo({});\r\n        storage.setHasLogin(false)\r\n        navigateToLogin(\"redirectTo\");\r\n        await logout();\r\n      }\r\n    },\r\n  });\r\n}\r\n\r\n/**\r\n * 用户注销\r\n *\r\n */\r\nexport function logoff () {\r\n  uni.showModal({\r\n    title: \"提示\",\r\n    content: \"确认注销用户么？注销用户将无法再次登录并失去当前数据。\",\r\n    confirmColor: Vue.prototype.$mainColor,\r\n    async success (res) {\r\n      if (res.confirm) {\r\n        await logoffConfirm();\r\n        storage.setAccessToken(\"\");\r\n        storage.setRefreshToken(\"\");\r\n        storage.setUserInfo({});\r\n        navigateToLogin(\"redirectTo\");\r\n      }\r\n    },\r\n  });\r\n}\r\n\r\n\r\n/**\r\n * 跳转im\r\n */\r\nexport function talkIm (storeId, goodsId, id) {\r\n  if (isLogin('auth')) {\r\n    let url = `/pages/mine/im/index?userId=${storeId}`\r\n    if(goodsId && id) url = `/pages/mine/im/index?userId=${storeId}&goodsid=${goodsId}&skuid=${id}`\r\n    uni.navigateTo({\r\n      url\r\n    });\r\n  }\r\n  else {\r\n    tipsToLogin()\r\n  }\r\n}\r\n\r\nexport function tipsToLogin (type) {\r\n  if (!isLogin(\"auth\")) {\r\n    uni.showModal({\r\n      title: \"提示\",\r\n      content: \"当前用户未登录是否登录？\",\r\n      confirmText: \"确定\",\r\n      cancelText: \"取消\",\r\n      confirmColor: Vue.prototype.$mainColor,\r\n      success: (res) => {\r\n        if (res.confirm) {\r\n          navigateToLogin();\r\n        } else if (res.cancel) {\r\n          if(type !== 'normal'){\r\n            uni.navigateBack();\r\n          }\r\n          \r\n        }\r\n      },\r\n    });\r\n    return false;\r\n  }\r\n  return true;\r\n}\r\n\r\n/**\r\n * 获取用户信息并重新添加到缓存里面\r\n */\r\nexport async function userInfo () {\r\n  let res = await getUserInfo();\r\n  if (res.data.success) {\r\n    storage.setUserInfo(res.data.result);\r\n    return res.data.result;\r\n  }\r\n}\r\n\r\n/**\r\n * 验证是否登录如果没登录则去登录\r\n * @param {*} val\r\n * @returns\r\n */\r\n\r\nexport function forceLogin () {\r\n  let userInfo = storage.getUserInfo();\r\n  if (!userInfo || !userInfo.id) {\r\n    // #ifdef MP-WEIXIN\r\n\r\n    uni.navigateTo({\r\n      url: \"/pages/passport/wechatMPLogin\",\r\n    });\r\n\r\n    // #endif\r\n\r\n    // #ifndef MP-WEIXIN\r\n\r\n    uni.navigateTo({\r\n      url: \"/pages/passport/login\",\r\n    });\r\n\r\n    //  #endif\r\n  }\r\n}\r\n\r\n/**\r\n * 获取当前加载的页面对象\r\n * @param val\r\n */\r\nexport function getPages (val) {\r\n  const pages = getCurrentPages(); //获取加载的页面\r\n  const currentPage = pages[pages.length - 1]; //获取当前页面的对象\r\n  const url = currentPage.route; //当前页面url\r\n\r\n  return val ? currentPage : url;\r\n}\r\n\r\n/**\r\n * 跳转到登录页面\r\n */\r\nexport function navigateToLogin (type = \"navigateTo\") {\r\n  /**\r\n   * 此处进行条件编译判断\r\n   * 微信小程序跳转到微信小程序登录页面\r\n   * H5/App跳转到普通登录页面\r\n   */\r\n  // #ifdef MP-WEIXIN\r\n  uni[type]({\r\n    url: \"/pages/passport/wechatMPLogin\",\r\n  });\r\n  // #endif\r\n  // #ifndef MP-WEIXIN\r\n  uni[type]({\r\n    url: \"/pages/passport/login\",\r\n  });\r\n  //  #endif\r\n}\r\n\r\n/**\r\n * 服务状态列表\r\n */\r\nexport function serviceStatusList (val) {\r\n  let statusList = {\r\n    APPLY: \"申请售后\",\r\n    PASS: \"通过售后\",\r\n    REFUSE: \"拒绝售后\",\r\n    BUYER_RETURN: \"买家退货，待卖家收货\",\r\n    SELLER_RE_DELIVERY: \"商家换货/补发\",\r\n    SELLER_CONFIRM: \"卖家确认收货\",\r\n    SELLER_TERMINATION: \"卖家终止售后\",\r\n    BUYER_CONFIRM: \"买家确认收货\",\r\n    BUYER_CANCEL: \"买家取消售后\",\r\n    WAIT_REFUND: \"等待平台退款\",\r\n    COMPLETE: \"完成售后\",\r\n  };\r\n  return statusList[val];\r\n}\r\n\r\n/**\r\n * 订单状态列表\r\n */\r\nexport function orderStatusList (val) {\r\n  let orderStatusList = {\r\n    UNDELIVERED: \"待发货\",\r\n    UNPAID: \"未付款\",\r\n    PAID: \"已付款\",\r\n    PARTS_DELIVERED: \"部分发货\",\r\n    DELIVERED: \"已发货\",\r\n    CANCELLED: \"已取消\",\r\n    COMPLETED: \"已完成\",\r\n    COMPLETE: \"已完成\",\r\n    TAKE: \"待核验\",\r\n    STAY_PICKED_UP: \"待自提\",\r\n  };\r\n  return orderStatusList[val];\r\n}\r\n"
  },
  {
    "path": "utils/md5.js",
    "content": "/*\r\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\r\n * Digest Algorithm, as defined in RFC 1321.\r\n * Version 1.1 Copyright (C) Paul Johnston 1999 - 2002.\r\n * Code also contributed by Greg Holt\r\n * See http://pajhome.org.uk/site/legal.html for details.\r\n */\r\n\r\n/*\r\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\r\n * to work around bugs in some JS interpreters.\r\n */\r\nfunction safe_add(x, y) {\r\n\tvar lsw = (x & 0xFFFF) + (y & 0xFFFF)\r\n\tvar msw = (x >> 16) + (y >> 16) + (lsw >> 16)\r\n\treturn (msw << 16) | (lsw & 0xFFFF)\r\n}\r\n\r\n/*\r\n * Bitwise rotate a 32-bit number to the left.\r\n */\r\nfunction rol(num, cnt) {\r\n\treturn (num << cnt) | (num >>> (32 - cnt))\r\n}\r\n\r\n/*\r\n * These functions implement the four basic operations the algorithm uses.\r\n */\r\nfunction cmn(q, a, b, x, s, t) {\r\n\treturn safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b)\r\n}\r\n\r\nfunction ff(a, b, c, d, x, s, t) {\r\n\treturn cmn((b & c) | ((~b) & d), a, b, x, s, t)\r\n}\r\n\r\nfunction gg(a, b, c, d, x, s, t) {\r\n\treturn cmn((b & d) | (c & (~d)), a, b, x, s, t)\r\n}\r\n\r\nfunction hh(a, b, c, d, x, s, t) {\r\n\treturn cmn(b ^ c ^ d, a, b, x, s, t)\r\n}\r\n\r\nfunction ii(a, b, c, d, x, s, t) {\r\n\treturn cmn(c ^ (b | (~d)), a, b, x, s, t)\r\n}\r\n\r\n/*\r\n * Calculate the MD5 of an array of little-endian words, producing an array\r\n * of little-endian words.\r\n */\r\nfunction coreMD5(x) {\r\n\tvar a = 1732584193\r\n\tvar b = -271733879\r\n\tvar c = -1732584194\r\n\tvar d = 271733878\r\n\r\n\tfor (var i = 0; i < x.length; i += 16) {\r\n\t\tvar olda = a\r\n\t\tvar oldb = b\r\n\t\tvar oldc = c\r\n\t\tvar oldd = d\r\n\r\n\t\ta = ff(a, b, c, d, x[i + 0], 7, -680876936)\r\n\t\td = ff(d, a, b, c, x[i + 1], 12, -389564586)\r\n\t\tc = ff(c, d, a, b, x[i + 2], 17, 606105819)\r\n\t\tb = ff(b, c, d, a, x[i + 3], 22, -1044525330)\r\n\t\ta = ff(a, b, c, d, x[i + 4], 7, -176418897)\r\n\t\td = ff(d, a, b, c, x[i + 5], 12, 1200080426)\r\n\t\tc = ff(c, d, a, b, x[i + 6], 17, -1473231341)\r\n\t\tb = ff(b, c, d, a, x[i + 7], 22, -45705983)\r\n\t\ta = ff(a, b, c, d, x[i + 8], 7, 1770035416)\r\n\t\td = ff(d, a, b, c, x[i + 9], 12, -1958414417)\r\n\t\tc = ff(c, d, a, b, x[i + 10], 17, -42063)\r\n\t\tb = ff(b, c, d, a, x[i + 11], 22, -1990404162)\r\n\t\ta = ff(a, b, c, d, x[i + 12], 7, 1804603682)\r\n\t\td = ff(d, a, b, c, x[i + 13], 12, -40341101)\r\n\t\tc = ff(c, d, a, b, x[i + 14], 17, -1502002290)\r\n\t\tb = ff(b, c, d, a, x[i + 15], 22, 1236535329)\r\n\r\n\t\ta = gg(a, b, c, d, x[i + 1], 5, -165796510)\r\n\t\td = gg(d, a, b, c, x[i + 6], 9, -1069501632)\r\n\t\tc = gg(c, d, a, b, x[i + 11], 14, 643717713)\r\n\t\tb = gg(b, c, d, a, x[i + 0], 20, -373897302)\r\n\t\ta = gg(a, b, c, d, x[i + 5], 5, -701558691)\r\n\t\td = gg(d, a, b, c, x[i + 10], 9, 38016083)\r\n\t\tc = gg(c, d, a, b, x[i + 15], 14, -660478335)\r\n\t\tb = gg(b, c, d, a, x[i + 4], 20, -405537848)\r\n\t\ta = gg(a, b, c, d, x[i + 9], 5, 568446438)\r\n\t\td = gg(d, a, b, c, x[i + 14], 9, -1019803690)\r\n\t\tc = gg(c, d, a, b, x[i + 3], 14, -187363961)\r\n\t\tb = gg(b, c, d, a, x[i + 8], 20, 1163531501)\r\n\t\ta = gg(a, b, c, d, x[i + 13], 5, -1444681467)\r\n\t\td = gg(d, a, b, c, x[i + 2], 9, -51403784)\r\n\t\tc = gg(c, d, a, b, x[i + 7], 14, 1735328473)\r\n\t\tb = gg(b, c, d, a, x[i + 12], 20, -1926607734)\r\n\r\n\t\ta = hh(a, b, c, d, x[i + 5], 4, -378558)\r\n\t\td = hh(d, a, b, c, x[i + 8], 11, -2022574463)\r\n\t\tc = hh(c, d, a, b, x[i + 11], 16, 1839030562)\r\n\t\tb = hh(b, c, d, a, x[i + 14], 23, -35309556)\r\n\t\ta = hh(a, b, c, d, x[i + 1], 4, -1530992060)\r\n\t\td = hh(d, a, b, c, x[i + 4], 11, 1272893353)\r\n\t\tc = hh(c, d, a, b, x[i + 7], 16, -155497632)\r\n\t\tb = hh(b, c, d, a, x[i + 10], 23, -1094730640)\r\n\t\ta = hh(a, b, c, d, x[i + 13], 4, 681279174)\r\n\t\td = hh(d, a, b, c, x[i + 0], 11, -358537222)\r\n\t\tc = hh(c, d, a, b, x[i + 3], 16, -722521979)\r\n\t\tb = hh(b, c, d, a, x[i + 6], 23, 76029189)\r\n\t\ta = hh(a, b, c, d, x[i + 9], 4, -640364487)\r\n\t\td = hh(d, a, b, c, x[i + 12], 11, -421815835)\r\n\t\tc = hh(c, d, a, b, x[i + 15], 16, 530742520)\r\n\t\tb = hh(b, c, d, a, x[i + 2], 23, -995338651)\r\n\r\n\t\ta = ii(a, b, c, d, x[i + 0], 6, -198630844)\r\n\t\td = ii(d, a, b, c, x[i + 7], 10, 1126891415)\r\n\t\tc = ii(c, d, a, b, x[i + 14], 15, -1416354905)\r\n\t\tb = ii(b, c, d, a, x[i + 5], 21, -57434055)\r\n\t\ta = ii(a, b, c, d, x[i + 12], 6, 1700485571)\r\n\t\td = ii(d, a, b, c, x[i + 3], 10, -1894986606)\r\n\t\tc = ii(c, d, a, b, x[i + 10], 15, -1051523)\r\n\t\tb = ii(b, c, d, a, x[i + 1], 21, -2054922799)\r\n\t\ta = ii(a, b, c, d, x[i + 8], 6, 1873313359)\r\n\t\td = ii(d, a, b, c, x[i + 15], 10, -30611744)\r\n\t\tc = ii(c, d, a, b, x[i + 6], 15, -1560198380)\r\n\t\tb = ii(b, c, d, a, x[i + 13], 21, 1309151649)\r\n\t\ta = ii(a, b, c, d, x[i + 4], 6, -145523070)\r\n\t\td = ii(d, a, b, c, x[i + 11], 10, -1120210379)\r\n\t\tc = ii(c, d, a, b, x[i + 2], 15, 718787259)\r\n\t\tb = ii(b, c, d, a, x[i + 9], 21, -343485551)\r\n\r\n\t\ta = safe_add(a, olda)\r\n\t\tb = safe_add(b, oldb)\r\n\t\tc = safe_add(c, oldc)\r\n\t\td = safe_add(d, oldd)\r\n\t}\r\n\treturn [a, b, c, d]\r\n}\r\n\r\n/*\r\n * Convert an array of little-endian words to a hex string.\r\n */\r\nfunction binl2hex(binarray) {\r\n\tvar hex_tab = \"0123456789abcdef\"\r\n\tvar str = \"\"\r\n\tfor (var i = 0; i < binarray.length * 4; i++) {\r\n\t\tstr += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +\r\n\t\t\thex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF)\r\n\t}\r\n\treturn str\r\n}\r\n\r\n/*\r\n * Convert an array of little-endian words to a base64 encoded string.\r\n */\r\nfunction binl2b64(binarray) {\r\n\tvar tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\r\n\tvar str = \"\"\r\n\tfor (var i = 0; i < binarray.length * 32; i += 6) {\r\n\t\tstr += tab.charAt(((binarray[i >> 5] << (i % 32)) & 0x3F) |\r\n\t\t\t((binarray[i >> 5 + 1] >> (32 - i % 32)) & 0x3F))\r\n\t}\r\n\treturn str\r\n}\r\n\r\n/*\r\n * Convert an 8-bit character string to a sequence of 16-word blocks, stored\r\n * as an array, and append appropriate padding for MD4/5 calculation.\r\n * If any of the characters are >255, the high byte is silently ignored.\r\n */\r\nfunction str2binl(str) {\r\n\tvar nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks\r\n\tvar blks = new Array(nblk * 16)\r\n\tfor (var i = 0; i < nblk * 16; i++) blks[i] = 0\r\n\tfor (var i = 0; i < str.length; i++)\r\n\t\tblks[i >> 2] |= (str.charCodeAt(i) & 0xFF) << ((i % 4) * 8)\r\n\tblks[i >> 2] |= 0x80 << ((i % 4) * 8)\r\n\tblks[nblk * 16 - 2] = str.length * 8\r\n\treturn blks\r\n}\r\n\r\n/*\r\n * Convert a wide-character string to a sequence of 16-word blocks, stored as\r\n * an array, and append appropriate padding for MD4/5 calculation.\r\n */\r\nfunction strw2binl(str) {\r\n\tvar nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks\r\n\tvar blks = new Array(nblk * 16)\r\n\tfor (var i = 0; i < nblk * 16; i++) blks[i] = 0\r\n\tfor (var i = 0; i < str.length; i++)\r\n\t\tblks[i >> 1] |= str.charCodeAt(i) << ((i % 2) * 16)\r\n\tblks[i >> 1] |= 0x80 << ((i % 2) * 16)\r\n\tblks[nblk * 16 - 2] = str.length * 16\r\n\treturn blks\r\n}\r\n\r\n/*\r\n * External interface\r\n */\r\nfunction hexMD5(str) {\r\n\treturn binl2hex(coreMD5(str2binl(str)))\r\n}\r\n\r\nfunction hexMD5w(str) {\r\n\treturn binl2hex(coreMD5(strw2binl(str)))\r\n}\r\n\r\nfunction b64MD5(str) {\r\n\treturn binl2b64(coreMD5(str2binl(str)))\r\n}\r\n\r\nfunction b64MD5w(str) {\r\n\treturn binl2b64(coreMD5(strw2binl(str)))\r\n}\r\n/* Backward compatibility */\r\nfunction calcMD5(str) {\r\n\treturn binl2hex(coreMD5(str2binl(str)))\r\n}\n\r\nmodule.exports = {\r\n\tmd5: hexMD5\r\n}\n"
  },
  {
    "path": "utils/request.js",
    "content": "import {\n\trefreshTokenFn\n} from \"@/api/login.js\";\nimport api from \"@/config/api.js\";\nimport Request from \"@/lib/request/index.js\";\nimport Foundation from \"@/utils/Foundation.js\";\nimport {\n\tmd5\n} from \"@/utils/md5.js\";\nimport storage from \"@/utils/storage.js\";\n\nimport jwt from '@/js_sdk/t-jwt/jwt.js';\nimport uuid from \"@/utils/uuid.modified.js\";\nimport store from \"../store\";\n\n\nlet isNavigateTo = false\n\nfunction cleanStorage() {\n\tuni.showToast({\n\t\ttitle: \"你的登录状态已过期，请重新登录\",\n\t\ticon: \"none\",\n\t\tduration: 1500,\n\t});\n\tif (uni.showLoading()) {\n\t\tuni.hideLoading();\n\t}\n\n\tstorage.setHasLogin(false);\n\tstorage.setAccessToken(\"\");\n\tstorage.setRefreshToken(\"\");\n\tconsole.log(\"清空token\");\n\tstorage.setUuid(\"\");\n\tstorage.setUserInfo({});\n\n\n\tif (!isNavigateTo) {\n\t\tisNavigateTo = true\n\t\t// 防抖处理跳转\n\t\t// #ifdef MP-WEIXIN\n\t\tuni.navigateTo({\n\t\t\turl: \"/pages/passport/wechatMPLogin\",\n\t\t});\n\t\t// #endif\n\t\t// #ifndef MP-WEIXIN\n\t\tuni.navigateTo({\n\t\t\turl: \"/pages/passport/login\",\n\t\t});\n\t\t//  #endif\n\t}\n}\n\nlet http = new Request();\n\n\n/**\n * 创建uuid方法\n */\nconst createUuid = () => {\n\tif (!storage.getUuid()) {\n\t\tstorage.setUuid(uuid.v1());\n\t\tconsole.log(\"uuid\", storage.getUuid());\n\t}\n}\n\n\nhttp.setConfig((config) => {\n\tcreateUuid();\n\t/* 设置全局配置 */\n\tconfig.baseURL = api.buyer;\n\tconfig.header = {\n\t\t...config.header,\n\t};\n\tconfig.validateStatus = (statusCode) => {\n\t\t// 不论什么状态,统一在正确中处理\n\t\treturn true;\n\t};\n\treturn config;\n});\n\nhttp.interceptors.request.use(\n\t(config) => {\n\t\t/* 请求之前拦截器。可以使用async await 做异步操作 */\n\t\tlet accessToken = storage.getAccessToken();\n\t\tif(storage.getInviter()){\n\t\t\tconfig.header.inviter = storage.getInviter();\n\t\t}\n\t\tif (accessToken) {\n\t\t\t/**\n\t\t\t * 使用JWT解析\n\t\t\t * 小于当前时间将当前token清除\n\t\t\t */\n\t\t\tconst decodeJwt = jwt(accessToken);\n\t\t\tconst timing = new Date().getTime() / 1000\n\t\t\tif (decodeJwt.exp <= timing) {\n\t\t\t\taccessToken = \"\"\n\t\t\t\tstorage.setAccessToken('')\n\t\t\t}\n\t\t\t\n\n\t\t\tconst nonce = Foundation.randomString(6);\n\t\t\tconst timestamp = parseInt(new Date().getTime() / 1000);\n\t\t\tconst sign = md5(nonce + timestamp + accessToken);\n\t\t\tconst _params = {\n\t\t\t\tnonce,\n\t\t\t\ttimestamp,\n\t\t\t\tsign,\n\t\t\t};\n\t\t\tlet params = config.params || {};\n\t\t\tparams = {\n\t\t\t\t...params,\n\t\t\t\t..._params\n\t\t\t};\n\n\t\t\tconfig.params = params;\n\t\t\tconfig.header.accessToken = accessToken;\n\n\n\t\t}\n\t\tcreateUuid();\n\t\tconfig.header = {\n\t\t\t...config.header,\n\t\t\tuuid: storage.getUuid()\n\t\t};\n\t\treturn config;\n\t},\n\t(config) => {\n\t\treturn Promise.reject(config);\n\t}\n);\n\n\n// 是否正在刷新的标记\nlet isRefreshing = false;\n//重试队列\nlet requests = [];\n// 必须使用异步函数，注意\nhttp.interceptors.response.use(\n\tasync (response) => {\n\t\tisNavigateTo = false\n\t\t/* 请求之后拦截器。可以使用async await 做异步操作  */\n\t\t// token存在并且token过期\n\t\t// if (isRefreshing && response.statusCode === 403) {\n\t\t//   cleanStorage();\n\t\t//   isRefreshing = false;\n\t\t// }\n\t\tuni.showLoading() ? uni.hideLoading() : ''\n\t\tlet token = storage.getAccessToken();\n\t\tif (\n\t\t\t(token && response.statusCode === 403) ||\n\t\t\tresponse.data.status === 403\n\t\t) {\n\t\t\tif (!isRefreshing) {\n\t\t\t\tconsole.log('旧token', token)\n\t\t\t\tisRefreshing = true;\n\t\t\t\tstorage.setAccessToken('')\n\t\t\t\tlet oldRefreshToken = storage.getRefreshToken();\n\t\t\t\t//调用刷新token的接口\n\t\t\t\treturn refreshTokenFn(oldRefreshToken)\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\tlet {\n\t\t\t\t\t\t\taccessToken,\n\t\t\t\t\t\t\trefreshToken\n\t\t\t\t\t\t} = res.data.result;\n\t\t\t\t\t\tstorage.setAccessToken(accessToken);\n\t\t\t\t\t\tstorage.setRefreshToken(refreshToken);\n\n\t\t\t\t\t\tresponse.header.accessToken = `${accessToken}`;\n\t\t\t\t\t\t// token 刷新后将数组的方法重新执行\n\t\t\t\t\t\tconsole.log('接口队列', requests, '新token', accessToken)\n\t\t\t\t\t\trequests.forEach((cb) => cb(accessToken));\n\t\t\t\t\t\trequests = []; // 重新请求完清空\n\t\t\t\t\t\treturn http.request(response.config);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tconsole.log('刷新token报错' + oldRefreshToken, err)\n\t\t\t\t\t\tcleanStorage();\n\t\t\t\t\t\treturn Promise.reject(err);\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tisRefreshing = false;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// 返回未执行 resolve 的 Promise\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t// 用函数形式将 resolve 存入，等待刷新后再执行\n\t\t\t\t\trequests.push((token) => {\n\t\t\t\t\t\tresponse.header.accessToken = `${token}`;\n\t\t\t\t\t\tresolve(http.request(response.config));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 如果当前返回没登录\n\t\t} else if (\n\t\t\t(!token && !storage.getRefreshToken() && response.statusCode === 403) ||\n\t\t\tresponse.data.code === 403\n\t\t) {\n\t\t\tconsole.log('没有token 以及刷新token 内容', token, storage.getRefreshToken())\n\t\t\tcleanStorage();\n\n\t\t\t// 如果当前状态码为正常但是success为不正常时\n\t\t} else if (\n\t\t\t(response.statusCode == 200 && !response.data.success) ||\n\t\t\tresponse.statusCode == 400\n\t\t) {\n\t\t\tif (response.data.message) {\n\t\t\t\tuni.showToast({\n\t\t\t\t\ttitle: response.data.message,\n\t\t\t\t\ticon: \"none\",\n\t\t\t\t\tduration: 1500,\n\t\t\t\t\tsuccess: function () {\n\t\t\t\t\t\tstore.state.isShowToast = true;\n\t\t\t\t\t},\n\t\t\t\t\tfail: function () {\n\t\t\t\t\t\tstore.state.isShowToast = false;\n\t\t\t\t\t},\n\t\t\t\t\tcomplete: function () {\n\t\t\t\t\t\tstore.state.isShowToast = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn response;\n\t},\n\t(error) => {\n\t\treturn error;\n\t}\n);\n\nexport {\n\thttp\n};\n\nexport const Method = {\n\tGET: \"GET\",\n\tPOST: \"POST\",\n\tPUT: \"PUT\",\n\tDELETE: \"DELETE\",\n};\n"
  },
  {
    "path": "utils/socket_service.js",
    "content": "import store from '@/store/index'\nimport config from '@/config/config.js'\nimport storage from './storage';\nexport default class SocketService {\n  /**\n   * 单例\n   */\n  static instance = null;\n  static get Instance () {\n    if (!this.instance) {\n      this.instance = new SocketService();\n    }\n    return this.instance;\n  }\n\n  // 和服务端连接的socket对象\n  ws = null;\n\n  // 存储回调函数\n  callBackMapping = {};\n\n  // 标识是否连接成功\n  connected = false;\n\n  // 记录重试的次数\n  sendRetryCount = 0;\n\n  // 重新连接尝试的次数\n  connectRetryCount = 0;\n\n  //  定义连接服务器的方法\n  connect () {\n    // 连接服务器\n    if (!window.WebSocket) {\n      return console.log(\"您的浏览器不支持WebSocket\");\n    }\n    this.ws = new WebSocket(config.baseWsUrl + '/' + storage.getAccessToken());\n    // 连接成功的事件\n    this.ws.onopen = () => {\n      console.log(\"连接服务端成功\");\n      this.connected = true;\n      // 重置重新连接的次数\n      this.connectRetryCount = 0;\n    };\n    //  1.连接服务端失败\n    //   2.当连接成功之后, 服务器关闭的情况(连接失败重连)\n    this.ws.onclose = () => {\n      console.log(\"连接服务端失败\");\n      this.connected = false;\n      this.connectRetryCount++;\n      setTimeout(() => {\n        this.connect();\n      }, 500 * this.connectRetryCount);\n    };\n    // 得到服务端发送过来的数据\n    this.ws.onmessage = (msg) => {\n      // console.log(msg.data)\n      this.registerCallBack(msg.data);\n    };\n  }\n  // 回调函数的注册\n  registerCallBack (callBack) {\n    // console.log(\"回调函数的注册\", callBack);\n    this.callBackMapping = callBack;\n  }\n\n  // 取消某一个回调函数\n  unRegisterCallBack (callBack) {\n    console.log(\"取消某一个回调函数\", callBack);\n    this.callBackMapping = null;\n  }\n\n  // 发送数据的方法\n  send (data) {\n    // 判断此时此刻有没有连接成功\n    if (this.connected) {\n      this.sendRetryCount = 0;\n      this.ws.send(data);\n    } else {\n      this.sendRetryCount++;\n      setTimeout(() => {\n        this.send(data);\n      }, this.sendRetryCount * 500);\n    }\n  }\n}\n"
  },
  {
    "path": "utils/storage.js",
    "content": "let isDev = process.env.NODE_ENV === \"development\";\r\n\r\nconst UUID = isDev ? \"uuid_key_dev\" : \"uuid_key\";\r\nconst HAS_LOGIN = isDev ? \"has_login_key_dev\" : \"has_login_key\";\r\nconst ACCESS_TOKEN = isDev ? \"access_token_key_dev\" : \"access_token_key\";\r\nconst REFRESH_TOKEN = isDev ? \"refresh_token_key_dev\" : \"refresh_token_key\";\r\nconst USER_INFO = isDev ? \"user_info_obj_dev\" : \"user_info_obj\";\r\nconst FACE_LOGIN = isDev ? \"face_login_dev\" : \"face_login\";\r\nconst FINGER_LOGIN = isDev ? \"finger_login_dev\" : \"finger_login\";\r\nconst CART_BACKBTN = isDev ? \"cart_backbtn_dev\" : \"cart_backbtn\";\r\nconst AFTERSALE_DATA = isDev ? \"aftersale_data_dev\" : \"aftersale_data\";\r\nexport default {\n\tsetInviter(val){\n\t\tuni.setStorageSync('inviter', val)\n\t},\n\tgetInviter(){\n\t\treturn uni.getStorageSync('inviter');\n\t},\n\r\n  //写入自动发券\r\n  setAutoCp(val){\r\n    uni.setStorageSync('autoCp', val)\r\n  },\r\n  //获取自动发券时间\r\n  getAutoCp(){\r\n    return uni.getStorageSync('autoCp');\r\n  },\r\n  // 写入热门搜索时间戳\r\n  setHotWords(val) {\r\n    uni.setStorageSync(\"hotWords\", val);\r\n  },\r\n  // 获取热门搜索时间戳\r\n  getHotWords() {\r\n    return uni.getStorageSync(`hotWords`);\r\n  },\r\n  //写入 展示还是不展示\r\n  setShow(val) {\r\n    uni.setStorageSync(\"show\", val);\r\n  },\r\n  getShow() {\r\n    if (uni.getStorageSync(`show`) === \"\" || uni.getStorageSync(`show`) === undefined) {\r\n      return true;\r\n    }\r\n    return uni.getStorageSync(`show`);\r\n  },\r\n  // 获取face id登录\r\n  getFaceLogin() {\r\n    return uni.getStorageSync(FACE_LOGIN);\r\n  },\r\n  // 写入face id\r\n  setFaceLogin(val) {\r\n    uni.setStorageSync(FACE_LOGIN, val);\r\n  },\r\n  // 获取指纹登录\r\n  getFingerLogin() {\r\n    return uni.getStorageSync(FINGER_LOGIN);\r\n  },\r\n  // 写入指纹登录\r\n  setFingerLogin(val) {\r\n    uni.setStorageSync(FINGER_LOGIN, val);\r\n  },\r\n  // 写入用户信息\r\n  setUserInfo(val) {\r\n    uni.setStorageSync(USER_INFO, val);\r\n  },\r\n  // 获取用户信息\r\n  getUserInfo() {\r\n    return uni.getStorageSync(USER_INFO);\r\n  },\r\n  setTalkToUser(val){\r\n    uni.setStorageSync(\"TALK_TO_USER\", val);\r\n  },\r\n  getTalkToUser(){\r\n    return uni.getStorageSync(\"TALK_TO_USER\");\r\n  },\r\n  // 写入uuid\r\n  setUuid(val) {\r\n    uni.setStorageSync(UUID, val);\r\n  },\r\n  // 获取uuid\r\n  getUuid() {\r\n    return uni.getStorageSync(UUID);\r\n  },\r\n  // 写入登录\r\n  setHasLogin(val) {\r\n    uni.setStorageSync(HAS_LOGIN, val);\r\n  },\r\n  // 获取是否登录\r\n  getHasLogin() {\r\n    return uni.getStorageSync(HAS_LOGIN);\r\n  },\r\n  // 删除uuid\r\n  removeUuid() {\r\n    uni.removeStorageSync(UUID);\r\n  },\r\n  // 写入accessToken\r\n  setAccessToken(val) {\r\n    uni.setStorageSync(ACCESS_TOKEN, val);\r\n  },\r\n  // 获取accessToken\r\n  getAccessToken() {\r\n    return uni.getStorageSync(ACCESS_TOKEN);\r\n  },\r\n  // 后退购物车\r\n  setCartBackbtn(val) {\r\n    uni.setStorageSync(CART_BACKBTN, val);\r\n  },\r\n\r\n  // 删除token\r\n  removeAccessToken() {\r\n    uni.removeStorageSync(ACCESS_TOKEN);\r\n  },\r\n  // 写入刷新token\r\n  setRefreshToken(val) {\r\n    uni.setStorageSync(REFRESH_TOKEN, val);\r\n  },\r\n  // 获取刷新token\r\n  getRefreshToken() {\r\n    return uni.getStorageSync(REFRESH_TOKEN);\r\n  },\r\n  // 删除token\r\n  removeRefreshToken() {\r\n    uni.removeStorageSync(REFRESH_TOKEN);\r\n  },\r\n\r\n  setAfterSaleData(val) {\r\n    uni.setStorageSync(AFTERSALE_DATA, val);\r\n  },\r\n\r\n  getAfterSaleData() {\r\n    return uni.getStorageSync(AFTERSALE_DATA);\r\n  },\r\n  // 删除token\r\n  removeAfterSaleData() {\r\n    uni.removeStorageSync(AFTERSALE_DATA);\r\n  },\r\n  // 是否发送商品连接记录\r\n  setImGoodsLink(val) {\r\n    uni.setStorageSync('imGoodId', val);\r\n  },\r\n  getImGoodsLink() {\r\n  return  uni.getStorageSync('imGoodId');\r\n  },\r\n};\r\n"
  },
  {
    "path": "utils/tools.js",
    "content": "/**\r\n * 解析url参数\r\n * @example ?id=12345&a=b\r\n * @return Object {id:12345,a:b}\r\n */\r\nfunction urlParse(url) {\r\n  let obj = {};\r\n  let reg = /[?&][^?&]+=[^?&]+/g;\r\n  let arr = url.match(reg);\r\n  if (arr) {\r\n    arr.forEach(item => {\r\n      let tempArr = item.substring(1).split(\"=\");\r\n      let key = decodeURIComponent(tempArr[0]);\r\n      let val = decodeURIComponent(tempArr.splice(1).join(\"=\"));\r\n      obj[key] = val;\r\n    });\r\n  }\r\n  return obj;\r\n}\r\n\r\nconst getNetworkType = () => {\r\n  uni.getNetworkType({\r\n    success: res => {\r\n      if (res.networkType === \"none\") {\r\n        uni.showToast({\r\n          title: \"网络好像有点问题,请检查后重试！\",\r\n          duration: 2000,\r\n          icon: \"none\"\r\n        });\r\n        let pages = getCurrentPages();\r\n        if (pages.length) {\r\n          let route = pages[pages.length - 1].route;\r\n          if (route !== \"pages/empty/empty\") {\r\n            uni.navigateTo({\r\n              url: `/pages/empty/empty?type=wifi`\r\n            });\r\n          }\r\n        } else {\r\n          uni.navigateTo({\r\n            url: `/pages/empty/empty?type=wifi`\r\n          });\r\n        }\r\n      }\r\n    }\r\n  });\r\n};\r\n\r\nconst throttle = (fn, that, gapTime) => {\r\n  // export function throttle(fn, gapTime) {\r\n  if (gapTime == null || gapTime == undefined) {\r\n    gapTime = 1800;\r\n  }\r\n  let _lastTime = that.lastTime;\r\n  let _nowTime = +new Date();\r\n  if (_nowTime - _lastTime > gapTime || !_lastTime) {\r\n    fn.apply(that, arguments); //将this和参数传给原函数\r\n    that.lastTime = _nowTime;\r\n  }\r\n};\r\n\r\n/**\r\n * 计算传秒数的倒计时【天、时、分、秒】\r\n * @param seconds\r\n * @returns {{day : *, hours : *, minutes : *, seconds : *}}\r\n */\r\nconst countTimeDown = seconds => {\r\n  const leftTime = time => {\r\n    if (time < 10) time = \"0\" + time;\r\n    return time + \"\";\r\n  };\r\n  return {\r\n    day: leftTime(parseInt(seconds / 60 / 60 / 24, 10)),\r\n    hours: leftTime(parseInt((seconds / 60 / 60) % 24, 10)),\r\n    minutes: leftTime(parseInt((seconds / 60) % 60, 10)),\r\n    seconds: leftTime(parseInt(seconds % 60, 10))\r\n  };\r\n};\r\n\r\n/**\r\n * 计算当前时间到第二天0点的倒计时[秒]\r\n * @returns {number}\r\n */\r\nconst theNextDayTime = () => {\r\n  const nowDate = new Date();\r\n  const time =\r\n    new Date(\r\n      nowDate.getFullYear(),\r\n      nowDate.getMonth(),\r\n      nowDate.getDate() + 1,\r\n      0,\r\n      0,\r\n      0\r\n    ).getTime() - nowDate.getTime();\r\n  return parseInt(time / 1000);\r\n};\r\n// 防抖\r\nconst debounce = (fn, delay) => {\r\n  // 时间期限\r\n  var delays = delay || 200;\r\n  var timer;\r\n  // 闭包\r\n  return function() {\r\n    // 考虑作用域，上下文环境，apply需要用到this对象\r\n    var th = this;\r\n    // 接收的参数用 ES6 中的 rest 参数统一存储到变量 args 中。arguments就是传入的参数数组,而且个数可以不确定的传回给fn（不确定函数到底有多少个参数，用arguments来接收）\r\n    var args = arguments;\r\n    // 判断还在定时，说明当前正在一个计时过程中，并且又触发了相同事件。所以要取消当前的计时，重新开始计时\r\n    if (timer) {\r\n      clearTimeout(timer);\r\n    }\r\n    timer = setTimeout(function() {\r\n      timer = null;\r\n      // 执行方法\r\n      fn.apply(th, args);\r\n    }, delays);\r\n  };\r\n};\r\nexport { getNetworkType, throttle, countTimeDown, theNextDayTime, debounce };\r\n"
  },
  {
    "path": "utils/uuid.modified.js",
    "content": "//     uuid.js\n//\n//     Copyright (c) 2010-2012 Robert Kieffer\n//     MIT License - http://opensource.org/licenses/mit-license.php\n\n/*global window, require, define */\n(function(_window) {\n  'use strict';\n\n\n\n  // Unique ID creation requires a high quality random # generator.  We feature\n  // detect to determine the best RNG source, normalizing to a function that\n  // returns 128-bits of randomness, since that's what's usually required\n  var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot;\n\n  function setupBrowser() {\n    // Allow for MSIE11 msCrypto\n    //var _crypto = _window.crypto || _window.msCrypto;\n    var crypto = {}\n    var _crypto = crypto || _window.crypto || _window.msCrypto;\n\n    if (!_rng && _crypto && _crypto.getRandomValues) {\n      // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto\n      //\n      // Moderately fast, high quality\n      try {\n        var _rnds8 = new Uint8Array(16);\n        _whatwgRNG = _rng = function whatwgRNG() {\n          _crypto.getRandomValues(_rnds8);\n          return _rnds8;\n        };\n\n        _rng();\n      } catch (e) {}\n    }\n\n    if (!_rng) {\n      // Math.random()-based (RNG)\n      //\n      // If all else fails, use Math.random().  It's fast, but is of unspecified\n      // quality.\n      var _rnds = new Array(16);\n      _mathRNG = _rng = function() {\n        for (var i = 0, r; i < 16; i++) {\n          if ((i & 0x03) === 0) { r = Math.random() * 0x100000000; }\n          _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n        }\n\n        return _rnds;\n      };\n      if ('undefined' !== typeof console && console.warn) {\n        // console.warn(\"[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()\");\n      }\n    }\n  }\n\n  setupBrowser();\n\n  // Buffer class to use\n  var BufferClass = ('function' === typeof Buffer) ? Buffer : Array;\n\n  // Maps for number <-> hex string conversion\n  var _byteToHex = [];\n  var _hexToByte = {};\n  for (var i = 0; i < 256; i++) {\n    _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n    _hexToByte[_byteToHex[i]] = i;\n  }\n\n  // **`parse()` - Parse a UUID into it's component bytes**\n  function parse(s, buf, offset) {\n    var i = (buf && offset) || 0,\n      ii = 0;\n\n    buf = buf || [];\n    s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {\n      if (ii < 16) { // Don't overflow!\n        buf[i + ii++] = _hexToByte[oct];\n      }\n    });\n\n    // Zero out remaining bytes if string was short\n    while (ii < 16) {\n      buf[i + ii++] = 0;\n    }\n\n    return buf;\n  }\n\n  // **`unparse()` - Convert UUID byte array (ala parse()) into a string**\n  function unparse(buf, offset) {\n    var i = offset || 0,\n      bth = _byteToHex;\n    return bth[buf[i++]] + bth[buf[i++]] +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] + '-' +\n      bth[buf[i++]] + bth[buf[i++]] +\n      bth[buf[i++]] + bth[buf[i++]] +\n      bth[buf[i++]] + bth[buf[i++]];\n  }\n\n  // **`v1()` - Generate time-based UUID**\n  //\n  // Inspired by https://github.com/LiosK/UUID.js\n  // and http://docs.python.org/library/uuid.html\n\n  // random #'s we need to init node and clockseq\n  var _seedBytes = _rng();\n\n  // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n  var _nodeId = [\n    _seedBytes[0] | 0x01,\n    _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]\n  ];\n\n  // Per 4.2.2, randomize (14 bit) clockseq\n  var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;\n\n  // Previous uuid creation time\n  var _lastMSecs = 0,\n    _lastNSecs = 0;\n\n  // See https://github.com/broofa/node-uuid for API details\n  function v1(options, buf, offset) {\n    var i = buf && offset || 0;\n    var b = buf || [];\n\n    options = options || {};\n\n    var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq;\n\n    // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n    // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n    // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n    // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n    var msecs = (options.msecs != null) ? options.msecs : new Date().getTime();\n\n    // Per 4.2.1.2, use count of uuid's generated during the current clock\n    // cycle to simulate higher resolution clock\n    var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1;\n\n    // Time since last uuid creation (in msecs)\n    var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs) / 10000;\n\n    // Per 4.2.1.2, Bump clockseq on clock regression\n    if (dt < 0 && options.clockseq == null) {\n      clockseq = clockseq + 1 & 0x3fff;\n    }\n\n    // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n    // time interval\n    if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {\n      nsecs = 0;\n    }\n\n    // Per 4.2.1.2 Throw error if too many uuids are requested\n    if (nsecs >= 10000) {\n      throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n    }\n\n    _lastMSecs = msecs;\n    _lastNSecs = nsecs;\n    _clockseq = clockseq;\n\n    // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n    msecs += 12219292800000;\n\n    // `time_low`\n    var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n    b[i++] = tl >>> 24 & 0xff;\n    b[i++] = tl >>> 16 & 0xff;\n    b[i++] = tl >>> 8 & 0xff;\n    b[i++] = tl & 0xff;\n\n    // `time_mid`\n    var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n    b[i++] = tmh >>> 8 & 0xff;\n    b[i++] = tmh & 0xff;\n\n    // `time_high_and_version`\n    b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n    b[i++] = tmh >>> 16 & 0xff;\n\n    // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n    b[i++] = clockseq >>> 8 | 0x80;\n\n    // `clock_seq_low`\n    b[i++] = clockseq & 0xff;\n\n    // `node`\n    var node = options.node || _nodeId;\n    for (var n = 0; n < 6; n++) {\n      b[i + n] = node[n];\n    }\n\n    return buf ? buf : unparse(b);\n  }\n\n  // **`v4()` - Generate random UUID**\n\n  // See https://github.com/broofa/node-uuid for API details\n  function v4(options, buf, offset) {\n    // Deprecated - 'format' argument, as supported in v1.2\n    var i = buf && offset || 0;\n\n    if (typeof(options) === 'string') {\n      buf = (options === 'binary') ? new BufferClass(16) : null;\n      options = null;\n    }\n    options = options || {};\n\n    var rnds = options.random || (options.rng || _rng)();\n\n    // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n    // Copy bytes to buffer, if provided\n    if (buf) {\n      for (var ii = 0; ii < 16; ii++) {\n        buf[i + ii] = rnds[ii];\n      }\n    }\n\n    return buf || unparse(rnds);\n  }\n\n  // Export public API\n  var uuid = v4;\n  uuid.v1 = v1;\n  uuid.v4 = v4;\n  uuid.parse = parse;\n  uuid.unparse = unparse;\n  uuid.BufferClass = BufferClass;\n  uuid._rng = _rng;\n  uuid._mathRNG = _mathRNG;\n  uuid._nodeRNG = _nodeRNG;\n  uuid._whatwgRNG = _whatwgRNG;\n\n\n  if (('undefined' !== typeof module) && module.exports) {\n    // Publish as node.js module\n    module.exports = uuid;\n  } else if (typeof define === 'function' && define.amd) {\n    // Publish as AMD module\n    define(function() { return uuid; });\n  } else {\n    // Publish as global (in browsers)\n    _previousRoot = _window.uuid;\n\n    // **`noConflict()` - (browser only) to reset global 'uuid' var**\n    uuid.noConflict = function() {\n      _window.uuid = _previousRoot;\n      return uuid;\n    };\n\n    _window.uuid = uuid;\n  }\n})('undefined' !== typeof window ? window : null);"
  },
  {
    "path": "uview-ui/LICENSE",
    "content": "MIT License\r\n\r\nCopyright (c) 2020 www.uviewui.com\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE."
  },
  {
    "path": "uview-ui/components/u-action-sheet/u-action-sheet.vue",
    "content": "<template>\r\n\t<u-popup mode=\"bottom\" :border-radius=\"borderRadius\" :popup=\"false\" v-model=\"value\" :maskCloseAble=\"maskCloseAble\"\r\n\t    length=\"auto\" :safeAreaInsetBottom=\"safeAreaInsetBottom\" @close=\"popupClose\" :z-index=\"uZIndex\">\r\n\t\t<view class=\"u-tips u-border-bottom\" v-if=\"tips.text\" :style=\"[tipsStyle]\">\r\n\t\t\t{{tips.text}}\r\n\t\t</view>\r\n\t\t<block v-for=\"(item, index) in list\" :key=\"index\">\r\n\t\t\t<view \r\n\t\t\t\t@touchmove.stop.prevent \r\n\t\t\t\t@tap=\"itemClick(index)\" \r\n\t\t\t\t:style=\"[itemStyle(index)]\" \r\n\t\t\t\tclass=\"u-action-sheet-item\" \r\n\t\t\t\t:class=\"[index < list.length - 1 ? 'u-border-bottom' : '']\"\r\n\t\t\t\t:hover-stay-time=\"150\"\r\n\t\t\t>\r\n\t\t\t\t{{item.text}}\r\n\t\t\t</view>\r\n\t\t</block>\r\n\t\t<view class=\"u-gab\" v-if=\"cancelBtn\">\r\n\t\t</view>\r\n\t\t<view @touchmove.stop.prevent class=\"u-actionsheet-cancel u-action-sheet-item\" hover-class=\"u-hover-class\"\r\n\t\t    :hover-stay-time=\"150\" v-if=\"cancelBtn\" @tap=\"close\">{{cancelText}}</view>\r\n\t</u-popup>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * actionSheet 操作菜单\r\n\t * @description 本组件用于从底部弹出一个操作菜单，供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI，配置更加灵活，所有平台都表现一致。\r\n\t * @tutorial https://www.uviewui.com/components/actionSheet.html\r\n\t * @property {Array<Object>} list 按钮的文字数组，见官方文档示例\r\n\t * @property {Object} tips 顶部的提示文字，见官方文档示例\r\n\t * @property {String} cancel-text 取消按钮的提示文字\r\n\t * @property {Boolean} cancel-btn 是否显示底部的取消按钮（默认true）\r\n\t * @property {Number String} border-radius 弹出部分顶部左右的圆角值，单位rpx（默认0）\r\n\t * @property {Boolean} mask-close-able 点击遮罩是否可以关闭（默认true）\r\n\t * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配（默认false）\r\n\t * @property {Number String} z-index z-index值（默认1075）\r\n\t * @property {String} cancel-text 取消按钮的提示文字\r\n\t * @event {Function} click 点击ActionSheet列表项时触发\r\n\t * @event {Function} close 点击取消按钮时触发\r\n\t * @example <u-action-sheet :list=\"list\" @click=\"click\" v-model=\"show\"></u-action-sheet>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-action-sheet\",\r\n\t\tprops: {\r\n\t\t\t// 点击遮罩是否可以关闭actionsheet\r\n\t\t\tmaskCloseAble: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 按钮的文字数组，可以自定义颜色和字体大小，字体单位为rpx\r\n\t\t\tlist: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\t// 如下\r\n\t\t\t\t\t// return [{\r\n\t\t\t\t\t// \ttext: '确定',\r\n\t\t\t\t\t// \tcolor: '',\r\n\t\t\t\t\t// \tfontSize: ''\r\n\t\t\t\t\t// }]\r\n\t\t\t\t\treturn [];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 顶部的提示文字\r\n\t\t\ttips: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttext: '',\r\n\t\t\t\t\t\tcolor: '',\r\n\t\t\t\t\t\tfontSize: '26'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 底部的取消按钮\r\n\t\t\tcancelBtn: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否开启底部安全区适配，开启的话，会在iPhoneX机型底部添加一定的内边距\r\n\t\t\tsafeAreaInsetBottom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 通过双向绑定控制组件的弹出与收起\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 弹出的顶部圆角值\r\n\t\t\tborderRadius: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 弹出的z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 取消按钮的文字提示\r\n\t\t\tcancelText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '取消'\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 顶部提示的样式\r\n\t\t\ttipsStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif (this.tips.color) style.color = this.tips.color;\r\n\t\t\t\tif (this.tips.fontSize) style.fontSize = this.tips.fontSize + 'rpx';\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 操作项目的样式\r\n\t\t\titemStyle() {\r\n\t\t\t\treturn (index) => {\r\n\t\t\t\t\tlet style = {};\r\n\t\t\t\t\tif (this.list[index].color) style.color = this.list[index].color;\r\n\t\t\t\t\tif (this.list[index].fontSize) style.fontSize = this.list[index].fontSize + 'rpx';\r\n\t\t\t\t\t// 选项被禁用的样式\r\n\t\t\t\t\tif (this.list[index].disabled) style.color = '#c0c4cc';\r\n\t\t\t\t\treturn style;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tuZIndex() {\r\n\t\t\t\t// 如果用户有传递z-index值，优先使用\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 点击取消按钮\r\n\t\t\tclose() {\r\n\t\t\t\t// 发送input事件，并不会作用于父组件，而是要设置组件内部通过props传递的value参数\r\n\t\t\t\t// 这是一个vue发送事件的特殊用法\r\n\t\t\t\tthis.popupClose();\r\n\t\t\t\tthis.$emit('close');\r\n\t\t\t},\r\n\t\t\t// 弹窗关闭\r\n\t\t\tpopupClose() {\r\n\t\t\t\tthis.$emit('input', false);\r\n\t\t\t},\r\n\t\t\t// 点击某一个item\r\n\t\t\titemClick(index) {\r\n\t\t\t\t// disabled的项禁止点击\r\n\t\t\t\tif(this.list[index].disabled) return;\r\n\t\t\t\tthis.$emit('click', index);\r\n\t\t\t\tthis.$emit('input', false);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-tips {\r\n\t\tfont-size: 26rpx;\r\n\t\ttext-align: center;\r\n\t\tpadding: 34rpx 0;\r\n\t\tline-height: 1;\r\n\t\tcolor: $u-tips-color;\r\n\t}\r\n\r\n\t.u-action-sheet-item {\r\n\t\tdisplay: flex;\r\n\t\tline-height: 1;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tfont-size: 34rpx;\r\n\t\tpadding: 34rpx 0;\r\n\t}\r\n\r\n\t.u-gab {\r\n\t\theight: 12rpx;\r\n\t\tbackground-color: rgb(234, 234, 236);\r\n\t}\r\n\r\n\t.u-actionsheet-cancel {\r\n\t\tcolor: $u-main-color;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-alert-tips/u-alert-tips.vue",
    "content": "<template>\r\n\t<view class=\"u-alert-tips\" v-if=\"show\" :class=\"[\r\n\t\t!show ? 'u-close-alert-tips': '',\r\n\t\ttype ? 'u-alert-tips--bg--' + type + '-light' : '',\r\n\t\ttype ? 'u-alert-tips--border--' + type + '-disabled' : '',\r\n\t]\" :style=\"{\r\n\t\tbackgroundColor: bgColor,\r\n\t\tborderColor: borderColor\r\n\t}\">\r\n\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t<u-icon v-if=\"showIcon\" :name=\"uIcon\" :size=\"description ? 40 : 32\" class=\"u-icon\" :color=\"uIconType\" :custom-style=\"iconStyle\"></u-icon>\r\n\t\t</view>\r\n\t\t<view class=\"u-alert-content\" @tap.stop=\"click\">\r\n\t\t\t<view class=\"u-alert-title\" :style=\"[uTitleStyle]\">\r\n\t\t\t\t{{title}}\r\n\t\t\t</view>\r\n\t\t\t<view v-if=\"description\" class=\"u-alert-desc\" :style=\"[descStyle]\">\r\n\t\t\t\t{{description}}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t<u-icon @click=\"close\" v-if=\"closeAble && !closeText\" hoverClass=\"u-type-error-hover-color\" name=\"close\" color=\"#c0c4cc\"\r\n\t\t\t :size=\"22\" class=\"u-close-icon\" :style=\"{\r\n\t\t\t\ttop: description ? '18rpx' : '24rpx'\r\n\t\t\t}\"></u-icon>\r\n\t\t</view>\r\n\t\t<text v-if=\"closeAble && closeText\" class=\"u-close-text\" :style=\"{\r\n\t\t\ttop: description ? '18rpx' : '24rpx'\r\n\t\t}\">{{closeText}}</text>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * alertTips 警告提示\r\n\t * @description 警告提示，展现需要关注的信息\r\n\t * @tutorial https://uviewui.com/components/alertTips.html\r\n\t * @property {String} title 显示的标题文字\r\n\t * @property {String} description 辅助性文字，颜色比title浅一点，字号也小一点，可选\r\n\t * @property {String} type 关闭按钮(默认为叉号icon图标)\r\n\t * @property {String} icon 图标名称\r\n\t * @property {Object} icon-style 图标的样式，对象形式\r\n\t * @property {Object} title-style 标题的样式，对象形式\r\n\t * @property {Object} desc-style 描述的样式，对象形式\r\n\t * @property {String} close-able 用文字替代关闭图标，close-able为true时有效\r\n\t * @property {Boolean} show-icon 是否显示左边的辅助图标\r\n\t * @property {Boolean} show 显示或隐藏组件\r\n\t * @event {Function} click 点击组件时触发\r\n\t * @event {Function} close 点击关闭按钮时触发\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-alert-tips',\r\n\t\tprops: {\r\n\t\t\t// 显示文字\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 主题，success/warning/info/error\r\n\t\t\ttype: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'warning'\r\n\t\t\t},\r\n\t\t\t// 辅助性文字\r\n\t\t\tdescription: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否可关闭\r\n\t\t\tcloseAble: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 关闭按钮自定义文本\r\n\t\t\tcloseText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否显示图标\r\n\t\t\tshowIcon: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 文字颜色，如果定义了color值，icon会失效\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 边框颜色\r\n\t\t\tborderColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否显示\r\n\t\t\tshow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 左边显示的icon\r\n\t\t\ticon: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// icon的样式\r\n\t\t\ticonStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 标题的样式\r\n\t\t\ttitleStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 描述文字的样式\r\n\t\t\tdescStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tuTitleStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\t// 如果有描述文字的话，标题进行加粗\r\n\t\t\t\tstyle.fontWeight = this.description ? 500 : 'normal';\r\n\t\t\t\t// 将用户传入样式对象和style合并，传入的优先级比style高，同属性会被覆盖\r\n\t\t\t\treturn this.$u.deepMerge(style, this.titleStyle);\r\n\t\t\t},\r\n\t\t\tuIcon() {\r\n\t\t\t\t// 如果有设置icon名称就使用，否则根据type主题，推定一个默认的图标\r\n\t\t\t\treturn this.icon ? this.icon : this.$u.type2icon(this.type);\r\n\t\t\t},\r\n\t\t\tuIconType() {\r\n\t\t\t\t// 如果有设置图标的样式，优先使用，没有的话，则用type的样式\r\n\t\t\t\treturn Object.keys(this.iconStyle).length ? '' : this.type;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 点击内容\r\n\t\t\tclick() {\r\n\t\t\t\tthis.$emit('click');\r\n\t\t\t},\r\n\t\t\t// 点击关闭按钮\r\n\t\t\tclose() {\r\n\t\t\t\tthis.$emit('close');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-alert-tips {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tpadding: 16rpx 30rpx;\r\n\t\tborder-radius: 8rpx;\r\n\t\tposition: relative;\r\n\t\ttransition: all 0.3s linear;\r\n\t\tborder: 1px solid #fff;\r\n\t\t\r\n\t\t&--bg--primary-light {\r\n\t\t\tbackground-color: $u-type-primary-light;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--info-light {\r\n\t\t\tbackground-color: $u-type-info-light;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--success-light {\r\n\t\t\tbackground-color: $u-type-success-light;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--warning-light {\r\n\t\t\tbackground-color: $u-type-warning-light;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--error-light {\r\n\t\t\tbackground-color: $u-type-error-light;\r\n\t\t}\r\n\t\t\r\n\t\t&--border--primary-disabled {\r\n\t\t\tborder-color: $u-type-primary-disabled;\r\n\t\t}\r\n\t\t\r\n\t\t&--border--success-disabled {\r\n\t\t\tborder-color: $u-type-success-disabled;\r\n\t\t}\r\n\t\t\r\n\t\t&--border--error-disabled {\r\n\t\t\tborder-color: $u-type-error-disabled;\r\n\t\t}\r\n\t\t\r\n\t\t&--border--warning-disabled {\r\n\t\t\tborder-color: $u-type-warning-disabled;\r\n\t\t}\r\n\t\t\r\n\t\t&--border--info-disabled {\r\n\t\t\tborder-color: $u-type-info-disabled;\r\n\t\t}\r\n\t}\r\n\r\n\t.u-close-alert-tips {\r\n\t\topacity: 0;\r\n\t\tvisibility: hidden;\r\n\t}\r\n\r\n\t.u-icon {\r\n\t\tmargin-right: 16rpx;\r\n\t}\r\n\r\n\t.u-alert-title {\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-main-color;\r\n\t}\r\n\r\n\t.u-alert-desc {\r\n\t\tfont-size: 26rpx;\r\n\t\ttext-align: left;\r\n\t\tcolor: $u-content-color;\r\n\t}\r\n\r\n\t.u-close-icon {\r\n\t\tposition: absolute;\r\n\t\ttop: 20rpx;\r\n\t\tright: 20rpx;\r\n\t}\r\n\r\n\t.u-close-hover {\r\n\t\tcolor: red;\r\n\t}\r\n\t\r\n\t.u-close-text {\r\n\t\tfont-size: 24rpx;\r\n\t\tcolor: $u-tips-color;\r\n\t\tposition: absolute;\r\n\t\ttop: 20rpx;\r\n\t\tright: 20rpx;\r\n\t\tline-height: 1;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-avatar/u-avatar.vue",
    "content": "<template>\r\n\t<view class=\"u-avatar\" :style=\"[wrapStyle]\" @tap=\"click\">\r\n\t\t<image\r\n\t\t\t@error=\"loadError\"\r\n\t\t\t:style=\"[imgStyle]\"\r\n\t\t\tclass=\"u-avatar__img\"\r\n\t\t\tv-if=\"!uText && avatar\"\r\n\t\t\t:src=\"avatar\" \r\n\t\t\t:mode=\"mode\"\r\n\t\t></image>\r\n\t\t<text class=\"u-line-1\" v-else-if=\"uText\" :style=\"{\r\n\t\t\tfontSize: '38rpx'\r\n\t\t}\">{{uText}}</text>\r\n\t\t<slot v-else></slot>\r\n\t\t<view class=\"u-avatar__sex\" v-if=\"showSex\" :class=\"['u-avatar__sex--' + sexIcon]\" :style=\"[uSexStyle]\">\r\n\t\t\t<u-icon :name=\"sexIcon\" size=\"20\"></u-icon>\r\n\t\t</view>\r\n\t\t<view class=\"u-avatar__level\" v-if=\"showLevel\" :style=\"[uLevelStyle]\">\r\n\t\t\t<u-icon :name=\"levelIcon\" size=\"20\"></u-icon>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\tlet base64Avatar = \"data:image/png;base64,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\";\r\n\t/**\r\n\t * avatar 头像\r\n\t * @description 本组件一般用于展示头像的地方，如个人中心，或者评论列表页的用户头像展示等场所。\r\n\t * @tutorial https://www.uviewui.com/components/avatar.html\r\n\t * @property {String} bg-color 背景颜色，一般显示文字时用（默认#ffffff）\r\n\t * @property {String} src 头像路径，如加载失败，将会显示默认头像\r\n\t * @property {String Number} size 头像尺寸，可以为指定字符串(large, default, mini)，或者数值，单位rpx（默认default）\r\n\t * @property {String} mode 显示类型，见上方说明（默认circle）\r\n\t * @property {String} sex-icon 性别图标，man-男，woman-女（默认man）\r\n\t * @property {String} level-icon 等级图标（默认level）\r\n\t * @property {String} sex-bg-color 性别图标背景颜色\r\n\t * @property {String} level-bg-color 等级图标背景颜色\r\n\t * @property {String} show-sex 是否显示性别图标（默认false）\r\n\t * @property {String} show-level 是否显示等级图标（默认false）\r\n\t * @property {String} img-mode 头像图片的裁剪类型，与uni的image组件的mode参数一致，如效果达不到需求，可尝试传widthFix值（默认aspectFill）\r\n\t * @property {String} index 用户传递的标识符值，如果是列表循环，可穿v-for的index值\r\n\t * @event {Function} click 头像被点击\r\n\t * @example <u-avatar :src=\"src\"></u-avatar>\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-avatar',\r\n\t\tprops: {\r\n\t\t\t// 背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'transparent'\r\n\t\t\t},\r\n\t\t\t// 头像路径\r\n\t\t\tsrc: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 尺寸，large-大，default-中等，mini-小，如果为数值，则单位为rpx\r\n\t\t\t// 宽度等于高度\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 'default'\r\n\t\t\t},\r\n\t\t\t// 头像模型，square-带圆角方形，circle-圆形\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'circle'\r\n\t\t\t},\r\n\t\t\t// 文字内容\r\n\t\t\ttext: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 图片的裁剪模型\r\n\t\t\timgMode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'aspectFill'\r\n\t\t\t},\r\n\t\t\t// 标识符\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 右上角性别角标，man-男，woman-女\r\n\t\t\tsexIcon: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'man'\r\n\t\t\t},\r\n\t\t\t// 右下角的等级图标\r\n\t\t\tlevelIcon: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'level'\r\n\t\t\t},\r\n\t\t\t// 右下角等级图标背景颜色\r\n\t\t\tlevelBgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 右上角性别图标的背景颜色\r\n\t\t\tsexBgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否显示性别图标\r\n\t\t\tshowSex: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否显示等级图标\r\n\t\t\tshowLevel: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\terror: false,\r\n\t\t\t\t// 头像的地址，因为如果加载错误，需要赋值为默认图片，props值无法修改，所以需要一个中间值\r\n                avatar: this.src ? this.src : base64Avatar, \r\n\t\t\t}\r\n\t\t},\r\n        watch: {\r\n            src(n) {\r\n                // 用户可能会在头像加载失败时，再次修改头像值，所以需要重新赋值\r\n                if(!n) {\n\t\t\t\t\t// 如果传入null或者''，或者undefined，显示默认头像\n\t\t\t\t\tthis.error = true;\n\t\t\t\t} else {\n\t\t\t\t\tthis.avatar = n;\n\t\t\t\t\tthis.error = false;\n\t\t\t\t}\r\n            }\r\n        },\r\n\t\tcomputed: {\r\n\t\t\twrapStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.height = this.size == 'large' ? '120rpx' : this.size == 'default' ?\r\n\t\t\t\t'90rpx' : this.size == 'mini' ? '70rpx' : this.size + 'rpx';\r\n\t\t\t\tstyle.width = style.height;\r\n\t\t\t\tstyle.flex = `0 0 ${style.height}`;\r\n\t\t\t\tstyle.backgroundColor = this.bgColor;\r\n\t\t\t\tstyle.borderRadius = this.mode == 'circle' ? '500px' : '5px';\r\n\t\t\t\tif(this.text) style.padding = `0 6rpx`;\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\timgStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.borderRadius = this.mode == 'circle' ? '500px' : '5px';\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 取字符串的第一个字符\r\n\t\t\tuText() {\r\n\t\t\t\treturn String(this.text)[0];\r\n\t\t\t},\r\n\t\t\t// 性别图标的自定义样式\r\n\t\t\tuSexStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif(this.sexBgColor) style.backgroundColor = this.sexBgColor;\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 等级图标的自定义样式\r\n\t\t\tuLevelStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif(this.levelBgColor) style.backgroundColor = this.levelBgColor;\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 图片加载错误时，显示默认头像\r\n\t\t\tloadError() {\r\n\t\t\t\tthis.error = true;\r\n                this.avatar = base64Avatar;\r\n\t\t\t},\r\n\t\t\tclick() {\r\n\t\t\t\tthis.$emit('click', this.index);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-avatar {\r\n\t\tdisplay: inline-flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-content-color;\r\n\t\tborder-radius: 10px;\r\n\t\tposition: relative;\r\n\t\t\r\n\t\t&__img {\r\n\t\t\twidth: 100%;\r\n\t\t\theight: 100%;\r\n\t\t}\r\n\t\t\r\n\t\t&__sex {\r\n\t\t\tposition: absolute;\r\n\t\t\twidth: 32rpx;\r\n\t\t\tcolor: #ffffff;\r\n\t\t\theight: 32rpx;\r\n\t\t\tdisplay: flex;\r\n\t\t\tjustify-content: center;\r\n\t\t\talign-items: center;\r\n\t\t\tborder-radius: 100rpx;\r\n\t\t\ttop: 5%;\r\n\t\t\tz-index: 1;\r\n\t\t\tright: -7%;\r\n\t\t\tborder: 1px #ffffff solid;\r\n\t\t\t\r\n\t\t\t&--man {\r\n\t\t\t\tbackground-color: $u-type-primary;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--woman {\r\n\t\t\t\tbackground-color: $u-type-error;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--none {\r\n\t\t\t\tbackground-color: $u-type-warning;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t&__level {\r\n\t\t\tposition: absolute;\r\n\t\t\twidth: 32rpx;\r\n\t\t\tcolor: #ffffff;\r\n\t\t\theight: 32rpx;\r\n\t\t\tdisplay: flex;\r\n\t\t\tjustify-content: center;\r\n\t\t\talign-items: center;\r\n\t\t\tborder-radius: 100rpx;\r\n\t\t\tbottom: 5%; \r\n\t\t\tz-index: 1;\r\n\t\t\tright: -7%;\r\n\t\t\tborder: 1px #ffffff solid;\r\n\t\t\tbackground-color: $u-type-warning;\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue",
    "content": "<template>\r\n\t<view class=\"content\">\r\n\t\t<view class=\"cropper-wrapper\" :style=\"{ height: cropperOpt.height + 'px' }\">\r\n\t\t\t<canvas\r\n\t\t\t\tclass=\"cropper\"\r\n\t\t\t\t:disable-scroll=\"true\"\r\n\t\t\t\t@touchstart=\"touchStart\"\r\n\t\t\t\t@touchmove=\"touchMove\"\r\n\t\t\t\t@touchend=\"touchEnd\"\r\n\t\t\t\t:style=\"{ width: cropperOpt.width, height: cropperOpt.height, backgroundColor: 'rgba(0, 0, 0, 0.8)' }\"\r\n\t\t\t\tcanvas-id=\"cropper\"\r\n\t\t\t\tid=\"cropper\"\r\n\t\t\t></canvas>\r\n\t\t\t<canvas\r\n\t\t\t\tclass=\"cropper\"\r\n\t\t\t\t:disable-scroll=\"true\"\r\n\t\t\t\t:style=\"{\r\n\t\t\t\t\tposition: 'fixed',\r\n\t\t\t\t\ttop: `-${cropperOpt.width * cropperOpt.pixelRatio}px`,\r\n\t\t\t\t\tleft: `-${cropperOpt.height * cropperOpt.pixelRatio}px`,\r\n\t\t\t\t\twidth: `${cropperOpt.width * cropperOpt.pixelRatio}px`,\r\n\t\t\t\t\theight: `${cropperOpt.height * cropperOpt.pixelRatio}`\r\n\t\t\t\t}\"\r\n\t\t\t\tcanvas-id=\"targetId\"\r\n\t\t\t\tid=\"targetId\"\r\n\t\t\t></canvas>\r\n\t\t</view>\r\n\t\t<view class=\"cropper-buttons safe-area-padding\" :style=\"{ height: bottomNavHeight + 'px' }\">\r\n\t\t\t<!-- #ifdef H5 -->\r\n\t\t\t<view class=\"upload\" @tap=\"uploadTap\">选择图片</view>\r\n\t\t\t<!-- #endif -->\r\n\t\t\t<!-- #ifndef H5 -->\r\n\t\t\t<view class=\"upload\" @tap=\"uploadTap\">重新选择</view>\r\n\t\t\t<!-- #endif -->\r\n\t\t\t<view class=\"getCropperImage\" @tap=\"getCropperImage(false)\">确定</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\nimport WeCropper from './weCropper.js';\r\nexport default {\r\n\tprops: {\r\n\t\t// 裁剪矩形框的样式，其中可包含的属性为lineWidth-边框宽度(单位rpx)，color: 边框颜色，\r\n\t\t// mask-遮罩颜色，一般设置为一个rgba的透明度，如\"rgba(0, 0, 0, 0.35)\"\r\n\t\tboundStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tlineWidth: 4,\r\n\t\t\t\t\tborderColor: 'rgb(245, 245, 245)',\r\n\t\t\t\t\tmask: 'rgba(0, 0, 0, 0.35)'\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t\t// // 裁剪框宽度，单位rpx\r\n\t\t// rectWidth: {\r\n\t\t// \ttype: [String, Number],\r\n\t\t// \tdefault: 400\r\n\t\t// },\r\n\t\t// // 裁剪框高度，单位rpx\r\n\t\t// rectHeight: {\r\n\t\t// \ttype: [String, Number],\r\n\t\t// \tdefault: 400\r\n\t\t// },\r\n\t\t// // 输出图片宽度，单位rpx\r\n\t\t// destWidth: {\r\n\t\t// \ttype: [String, Number],\r\n\t\t// \tdefault: 400\r\n\t\t// },\r\n\t\t// // 输出图片高度，单位rpx\r\n\t\t// destHeight: {\r\n\t\t// \ttype: [String, Number],\r\n\t\t// \tdefault: 400\r\n\t\t// },\r\n\t\t// // 输出的图片类型，如果发现裁剪的图片很大，可能是因为设置为了\"png\"，改成\"jpg\"即可\r\n\t\t// fileType: {\r\n\t\t// \ttype: String,\r\n\t\t// \tdefault: 'jpg',\r\n\t\t// },\r\n\t\t// // 生成的图片质量\r\n\t\t// // H5上无效，目前不考虑使用此参数\r\n\t\t// quality: {\r\n\t\t// \ttype: [Number, String],\r\n\t\t// \tdefault: 1\r\n\t\t// }\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\t// 底部导航的高度\r\n\t\t\tbottomNavHeight: 50,\r\n\t\t\toriginWidth: 200,\r\n\t\t\twidth: 0,\r\n\t\t\theight: 0,\r\n\t\t\tcropperOpt: {\r\n\t\t\t\tid: 'cropper',\r\n\t\t\t\ttargetId: 'targetCropper',\r\n\t\t\t\tpixelRatio: 1,\r\n\t\t\t\twidth: 0,\r\n\t\t\t\theight: 0,\r\n\t\t\t\tscale: 2.5,\r\n\t\t\t\tzoom: 8,\r\n\t\t\t\tcut: {\r\n\t\t\t\t\tx: (this.width - this.originWidth) / 2,\r\n\t\t\t\t\ty: (this.height - this.originWidth) / 2,\r\n\t\t\t\t\twidth: this.originWidth,\r\n\t\t\t\t\theight: this.originWidth\r\n\t\t\t\t},\r\n\t\t\t\tboundStyle: {\r\n\t\t\t\t\tlineWidth: uni.upx2px(this.boundStyle.lineWidth),\r\n\t\t\t\t\tmask: this.boundStyle.mask,\r\n\t\t\t\t\tcolor: this.boundStyle.borderColor\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 裁剪框和输出图片的尺寸，高度默认等于宽度\r\n\t\t\t// 输出图片宽度，单位px\r\n\t\t\tdestWidth: 200,\r\n\t\t\t// 裁剪框宽度，单位px\r\n\t\t\trectWidth: 200,\r\n\t\t\t// 输出的图片类型，如果'png'类型发现裁剪的图片太大，改成\"jpg\"即可\r\n\t\t\tfileType: 'jpg',\r\n\t\t\tsrc: '', // 选择的图片路径，用于在点击确定时，判断是否选择了图片\r\n\t\t};\r\n\t},\r\n\tonLoad(option) {\r\n\t\tlet rectInfo = uni.getSystemInfoSync();\r\n\t\tthis.width = rectInfo.windowWidth;\r\n\t\tthis.height = rectInfo.windowHeight - this.bottomNavHeight;\r\n\t\tthis.cropperOpt.width = this.width;\r\n\t\tthis.cropperOpt.height = this.height;\r\n\t\tthis.cropperOpt.pixelRatio = rectInfo.pixelRatio;\r\n\r\n\t\tif (option.destWidth) this.destWidth = option.destWidth;\r\n\t\tif (option.rectWidth) {\r\n\t\t\tlet rectWidth = Number(option.rectWidth);\r\n\t\t\tthis.cropperOpt.cut = {\r\n\t\t\t\tx: (this.width - rectWidth) / 2,\r\n\t\t\t\ty: (this.height - rectWidth) / 2,\r\n\t\t\t\twidth: rectWidth,\r\n\t\t\t\theight: rectWidth\r\n\t\t\t};\r\n\t\t}\r\n\t\tthis.rectWidth = option.rectWidth;\r\n\t\tif (option.fileType) this.fileType = option.fileType;\r\n\t\t// 初始化\r\n\t\tthis.cropper = new WeCropper(this.cropperOpt)\r\n\t\t\t.on('ready', ctx => {\r\n\t\t\t\t// wecropper is ready for work!\r\n\t\t\t})\r\n\t\t\t.on('beforeImageLoad', ctx => {\r\n\t\t\t\t// before picture loaded, i can do something\r\n\t\t\t})\r\n\t\t\t.on('imageLoad', ctx => {\r\n\t\t\t\t// picture loaded\r\n\t\t\t})\r\n\t\t\t.on('beforeDraw', (ctx, instance) => {\r\n\t\t\t\t// before canvas draw,i can do something\r\n\t\t\t});\r\n\t\t// 设置导航栏样式，以免用户在page.json中没有设置为黑色背景\r\n\t\tuni.setNavigationBarColor({\r\n\t\t\tfrontColor: '#ffffff',\r\n\t\t\tbackgroundColor: '#000000'\r\n\t\t});\r\n\t\tuni.chooseImage({\r\n\t\t\tcount: 1, // 默认9\r\n\t\t\tsizeType: ['compressed'], // 可以指定是原图还是压缩图，默认二者都有\r\n\t\t\tsourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有\r\n\t\t\tsuccess: res => {\r\n\t\t\t\tthis.src = res.tempFilePaths[0];\r\n\t\t\t\t//  获取裁剪图片资源后，给data添加src属性及其值\r\n\t\t\t\tthis.cropper.pushOrign(this.src);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tmethods: {\r\n\t\ttouchStart(e) {\r\n\t\t\tthis.cropper.touchStart(e);\r\n\t\t},\r\n\t\ttouchMove(e) {\r\n\t\t\tthis.cropper.touchMove(e);\r\n\t\t},\r\n\t\ttouchEnd(e) {\r\n\t\t\tthis.cropper.touchEnd(e);\r\n\t\t},\r\n\t\tgetCropperImage(isPre = false) {\r\n\t\t\tif(!this.src) return this.$u.toast('请先选择图片再裁剪');\r\n\r\n\t\t\tlet cropper_opt = {\r\n\t\t\t\tdestHeight: Number(this.destWidth), // uni.canvasToTempFilePath要求这些参数为数值\r\n\t\t\t\tdestWidth: Number(this.destWidth),\r\n\t\t\t\tfileType: this.fileType\r\n\t\t\t};\r\n\t\t\tthis.cropper.getCropperImage(cropper_opt, (path, err) => {\r\n\t\t\t\tif (err) {\r\n\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\ttitle: '温馨提示',\r\n\t\t\t\t\t\tcontent: err.message\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (isPre) {\r\n\t\t\t\t\t\tuni.previewImage({\r\n\t\t\t\t\t\t\tcurrent: '', // 当前显示图片的 http 链接\r\n\t\t\t\t\t\t\turls: [path] // 需要预览的图片 http 链接列表\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tuni.$emit('uAvatarCropper', path);\r\n\t\t\t\t\t\tthis.$u.route({\r\n\t\t\t\t\t\t\ttype: 'back'\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\tuploadTap() {\r\n\t\t\tconst self = this;\r\n\t\t\tuni.chooseImage({\r\n\t\t\t\tcount: 1, // 默认9\r\n\t\t\t\tsizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有\r\n\t\t\t\tsourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有\r\n\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\tself.src = res.tempFilePaths[0];\r\n\t\t\t\t\t//  获取裁剪图片资源后，给data添加src属性及其值\r\n\r\n\t\t\t\t\tself.cropper.pushOrign(this.src);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n@import '../../libs/css/style.components.scss';\r\n\r\n.content {\r\n\tbackground: rgba(255, 255, 255, 1);\r\n}\r\n\r\n.cropper {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tz-index: 11;\r\n}\r\n\r\n.cropper-buttons {\r\n\tbackground-color: #000000;\r\n\tcolor: #eee;\r\n}\r\n\r\n.cropper-wrapper {\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\twidth: 100%;\r\n\tbackground-color: #000;\r\n}\r\n\r\n.cropper-buttons {\r\n\twidth: 100vw;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tposition: fixed;\r\n\tbottom: 0;\r\n\tleft: 0;\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.cropper-buttons .upload,\r\n.cropper-buttons .getCropperImage {\r\n\twidth: 50%;\r\n\ttext-align: center;\r\n}\r\n\r\n.cropper-buttons .upload {\r\n\ttext-align: left;\r\n\tpadding-left: 50rpx;\r\n}\r\n\r\n.cropper-buttons .getCropperImage {\r\n\ttext-align: right;\r\n\tpadding-right: 50rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-avatar-cropper/weCropper.js",
    "content": "/**\r\n * we-cropper v1.3.9\r\n * (c) 2020 dlhandsome\r\n * @license MIT\r\n */\r\n(function(global, factory) {\r\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n\t\ttypeof define === 'function' && define.amd ? define(factory) :\r\n\t\t(global.WeCropper = factory());\r\n}(this, (function() {\r\n\t'use strict';\r\n\r\n\tvar device = void 0;\r\n\tvar TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended'];\r\n\r\n\tfunction firstLetterUpper(str) {\r\n\t\treturn str.charAt(0).toUpperCase() + str.slice(1)\r\n\t}\r\n\r\n\tfunction setTouchState(instance) {\r\n\t\tvar arg = [],\r\n\t\t\tlen = arguments.length - 1;\r\n\t\twhile (len-- > 0) arg[len] = arguments[len + 1];\r\n\r\n\t\tTOUCH_STATE.forEach(function(key, i) {\r\n\t\t\tif (arg[i] !== undefined) {\r\n\t\t\t\tinstance[key] = arg[i];\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction validator(instance, o) {\r\n\t\tObject.defineProperties(instance, o);\r\n\t}\r\n\r\n\tfunction getDevice() {\r\n\t\tif (!device) {\r\n\t\t\tdevice = uni.getSystemInfoSync();\r\n\t\t}\r\n\t\treturn device\r\n\t}\r\n\r\n\tvar tmp = {};\r\n\r\n\tvar ref = getDevice();\r\n\tvar pixelRatio = ref.pixelRatio;\r\n\r\n\tvar DEFAULT = {\r\n\t\tid: {\r\n\t\t\tdefault: 'cropper',\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.id\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'string') {\r\n\t\t\t\t\tconsole.error((\"id：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.id = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\twidth: {\r\n\t\t\tdefault: 750,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.width\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'number') {\r\n\t\t\t\t\tconsole.error((\"width：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.width = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\theight: {\r\n\t\t\tdefault: 750,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.height\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'number') {\r\n\t\t\t\t\tconsole.error((\"height：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.height = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tpixelRatio: {\r\n\t\t\tdefault: pixelRatio,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.pixelRatio\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'number') {\r\n\t\t\t\t\tconsole.error((\"pixelRatio：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.pixelRatio = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tscale: {\r\n\t\t\tdefault: 2.5,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.scale\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'number') {\r\n\t\t\t\t\tconsole.error((\"scale：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.scale = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tzoom: {\r\n\t\t\tdefault: 5,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.zoom\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'number') {\r\n\t\t\t\t\tconsole.error((\"zoom：\" + value + \" is invalid\"));\r\n\t\t\t\t} else if (value < 0 || value > 10) {\r\n\t\t\t\t\tconsole.error(\"zoom should be ranged in 0 ~ 10\");\r\n\t\t\t\t}\r\n\t\t\t\ttmp.zoom = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tsrc: {\r\n\t\t\tdefault: '',\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.src\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'string') {\r\n\t\t\t\t\tconsole.error((\"src：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.src = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tcut: {\r\n\t\t\tdefault: {},\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.cut\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'object') {\r\n\t\t\t\t\tconsole.error((\"cut：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.cut = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tboundStyle: {\r\n\t\t\tdefault: {},\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.boundStyle\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\tif (typeof(value) !== 'object') {\r\n\t\t\t\t\tconsole.error((\"boundStyle：\" + value + \" is invalid\"));\r\n\t\t\t\t}\r\n\t\t\t\ttmp.boundStyle = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tonReady: {\r\n\t\t\tdefault: null,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.ready\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\ttmp.ready = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tonBeforeImageLoad: {\r\n\t\t\tdefault: null,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.beforeImageLoad\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\ttmp.beforeImageLoad = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tonImageLoad: {\r\n\t\t\tdefault: null,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.imageLoad\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\ttmp.imageLoad = value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tonBeforeDraw: {\r\n\t\t\tdefault: null,\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn tmp.beforeDraw\r\n\t\t\t},\r\n\t\t\tset: function set(value) {\r\n\t\t\t\ttmp.beforeDraw = value;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar ref$1 = getDevice();\r\n\tvar windowWidth = ref$1.windowWidth;\r\n\r\n\tfunction prepare() {\r\n\t\tvar self = this;\r\n\r\n\t\t// v1.4.0 版本中将不再自动绑定we-cropper实例\r\n\t\tself.attachPage = function() {\r\n\t\t\tvar pages = getCurrentPages();\r\n\t\t\t// 获取到当前page上下文\r\n\t\t\tvar pageContext = pages[pages.length - 1];\r\n\t\t\t// 把this依附在Page上下文的wecropper属性上，便于在page钩子函数中访问\r\n\t\t\tObject.defineProperty(pageContext, 'wecropper', {\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\tconsole.warn(\r\n\t\t\t\t\t\t'Instance will not be automatically bound to the page after v1.4.0\\n\\n' +\r\n\t\t\t\t\t\t'Please use a custom instance name instead\\n\\n' +\r\n\t\t\t\t\t\t'Example: \\n' +\r\n\t\t\t\t\t\t'this.mycropper = new WeCropper(options)\\n\\n' +\r\n\t\t\t\t\t\t'// ...\\n' +\r\n\t\t\t\t\t\t'this.mycropper.getCropperImage()'\r\n\t\t\t\t\t);\r\n\t\t\t\t\treturn self\r\n\t\t\t\t},\r\n\t\t\t\tconfigurable: true\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tself.createCtx = function() {\r\n\t\t\tvar id = self.id;\r\n\t\t\tvar targetId = self.targetId;\r\n\r\n\t\t\tif (id) {\r\n\t\t\t\tself.ctx = self.ctx || uni.createCanvasContext(id);\r\n\t\t\t\tself.targetCtx = self.targetCtx || uni.createCanvasContext(targetId);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error(\"constructor: create canvas context failed, 'id' must be valuable\");\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tself.deviceRadio = windowWidth / 750;\r\n\t}\r\n\r\n\tvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !==\r\n\t\t'undefined' ? self : {};\r\n\r\n\r\n\r\n\r\n\r\n\tfunction createCommonjsModule(fn, module) {\r\n\t\treturn module = {\r\n\t\t\texports: {}\r\n\t\t}, fn(module, module.exports), module.exports;\r\n\t}\r\n\r\n\tvar tools = createCommonjsModule(function(module, exports) {\r\n\t\t/**\r\n\t\t * String type check\r\n\t\t */\r\n\t\texports.isStr = function(v) {\r\n\t\t\treturn typeof v === 'string';\r\n\t\t};\r\n\t\t/**\r\n\t\t * Number type check\r\n\t\t */\r\n\t\texports.isNum = function(v) {\r\n\t\t\treturn typeof v === 'number';\r\n\t\t};\r\n\t\t/**\r\n\t\t * Array type check\r\n\t\t */\r\n\t\texports.isArr = Array.isArray;\r\n\t\t/**\r\n\t\t * undefined type check\r\n\t\t */\r\n\t\texports.isUndef = function(v) {\r\n\t\t\treturn v === undefined;\r\n\t\t};\r\n\r\n\t\texports.isTrue = function(v) {\r\n\t\t\treturn v === true;\r\n\t\t};\r\n\r\n\t\texports.isFalse = function(v) {\r\n\t\t\treturn v === false;\r\n\t\t};\r\n\t\t/**\r\n\t\t * Function type check\r\n\t\t */\r\n\t\texports.isFunc = function(v) {\r\n\t\t\treturn typeof v === 'function';\r\n\t\t};\r\n\t\t/**\r\n\t\t * Quick object check - this is primarily used to tell\r\n\t\t * Objects from primitive values when we know the value\r\n\t\t * is a JSON-compliant type.\r\n\t\t */\r\n\t\texports.isObj = exports.isObject = function(obj) {\r\n\t\t\treturn obj !== null && typeof obj === 'object'\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Strict object type check. Only returns true\r\n\t\t * for plain JavaScript objects.\r\n\t\t */\r\n\t\tvar _toString = Object.prototype.toString;\r\n\t\texports.isPlainObject = function(obj) {\r\n\t\t\treturn _toString.call(obj) === '[object Object]'\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Check whether the object has the property.\r\n\t\t */\r\n\t\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\t\texports.hasOwn = function(obj, key) {\r\n\t\t\treturn hasOwnProperty.call(obj, key)\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Perform no operation.\r\n\t\t * Stubbing args to make Flow happy without leaving useless transpiled code\r\n\t\t * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)\r\n\t\t */\r\n\t\texports.noop = function(a, b, c) {};\r\n\r\n\t\t/**\r\n\t\t * Check if val is a valid array index.\r\n\t\t */\r\n\t\texports.isValidArrayIndex = function(val) {\r\n\t\t\tvar n = parseFloat(String(val));\r\n\t\t\treturn n >= 0 && Math.floor(n) === n && isFinite(val)\r\n\t\t};\r\n\t});\r\n\r\n\tvar tools_7 = tools.isFunc;\r\n\tvar tools_10 = tools.isPlainObject;\r\n\r\n\tvar EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad'];\r\n\r\n\tfunction observer() {\r\n\t\tvar self = this;\r\n\r\n\t\tself.on = function(event, fn) {\r\n\t\t\tif (EVENT_TYPE.indexOf(event) > -1) {\r\n\t\t\t\tif (tools_7(fn)) {\r\n\t\t\t\t\tevent === 'ready' ?\r\n\t\t\t\t\t\tfn(self) :\r\n\t\t\t\t\t\tself[(\"on\" + (firstLetterUpper(event)))] = fn;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error((\"event: \" + event + \" is invalid\"));\r\n\t\t\t}\r\n\t\t\treturn self\r\n\t\t};\r\n\t}\r\n\r\n\tfunction wxPromise(fn) {\r\n\t\treturn function(obj) {\r\n\t\t\tvar args = [],\r\n\t\t\t\tlen = arguments.length - 1;\r\n\t\t\twhile (len-- > 0) args[len] = arguments[len + 1];\r\n\r\n\t\t\tif (obj === void 0) obj = {};\r\n\t\t\treturn new Promise(function(resolve, reject) {\r\n\t\t\t\tobj.success = function(res) {\r\n\t\t\t\t\tresolve(res);\r\n\t\t\t\t};\r\n\t\t\t\tobj.fail = function(err) {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t};\r\n\t\t\t\tfn.apply(void 0, [obj].concat(args));\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tfunction draw(ctx, reserve) {\r\n\t\tif (reserve === void 0) reserve = false;\r\n\r\n\t\treturn new Promise(function(resolve) {\r\n\t\t\tctx.draw(reserve, resolve);\r\n\t\t})\r\n\t}\r\n\r\n\tvar getImageInfo = wxPromise(uni.getImageInfo);\r\n\r\n\tvar canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath);\r\n\r\n\tvar base64 = createCommonjsModule(function(module, exports) {\r\n\t\t/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */\r\n\t\t(function(root) {\r\n\r\n\t\t\t// Detect free variables `exports`.\r\n\t\t\tvar freeExports = 'object' == 'object' && exports;\r\n\r\n\t\t\t// Detect free variable `module`.\r\n\t\t\tvar freeModule = 'object' == 'object' && module &&\r\n\t\t\t\tmodule.exports == freeExports && module;\r\n\r\n\t\t\t// Detect free variable `global`, from Node.js or Browserified code, and use\r\n\t\t\t// it as `root`.\r\n\t\t\tvar freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;\r\n\t\t\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\r\n\t\t\t\troot = freeGlobal;\r\n\t\t\t}\r\n\r\n\t\t\t/*--------------------------------------------------------------------------*/\r\n\r\n\t\t\tvar InvalidCharacterError = function(message) {\r\n\t\t\t\tthis.message = message;\r\n\t\t\t};\r\n\t\t\tInvalidCharacterError.prototype = new Error;\r\n\t\t\tInvalidCharacterError.prototype.name = 'InvalidCharacterError';\r\n\r\n\t\t\tvar error = function(message) {\r\n\t\t\t\t// Note: the error messages used throughout this file match those used by\r\n\t\t\t\t// the native `atob`/`btoa` implementation in Chromium.\r\n\t\t\t\tthrow new InvalidCharacterError(message);\r\n\t\t\t};\r\n\r\n\t\t\tvar TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n\t\t\t// http://whatwg.org/html/common-microsyntaxes.html#space-character\r\n\t\t\tvar REGEX_SPACE_CHARACTERS = /[\\t\\n\\f\\r ]/g;\r\n\r\n\t\t\t// `decode` is designed to be fully compatible with `atob` as described in the\r\n\t\t\t// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob\r\n\t\t\t// The optimized base64-decoding algorithm used is based on @atk’s excellent\r\n\t\t\t// implementation. https://gist.github.com/atk/1020396\r\n\t\t\tvar decode = function(input) {\r\n\t\t\t\tinput = String(input)\r\n\t\t\t\t\t.replace(REGEX_SPACE_CHARACTERS, '');\r\n\t\t\t\tvar length = input.length;\r\n\t\t\t\tif (length % 4 == 0) {\r\n\t\t\t\t\tinput = input.replace(/==?$/, '');\r\n\t\t\t\t\tlength = input.length;\r\n\t\t\t\t}\r\n\t\t\t\tif (\r\n\t\t\t\t\tlength % 4 == 1 ||\r\n\t\t\t\t\t// http://whatwg.org/C#alphanumeric-ascii-characters\r\n\t\t\t\t\t/[^+a-zA-Z0-9/]/.test(input)\r\n\t\t\t\t) {\r\n\t\t\t\t\terror(\r\n\t\t\t\t\t\t'Invalid character: the string to be decoded is not correctly encoded.'\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tvar bitCounter = 0;\r\n\t\t\t\tvar bitStorage;\r\n\t\t\t\tvar buffer;\r\n\t\t\t\tvar output = '';\r\n\t\t\t\tvar position = -1;\r\n\t\t\t\twhile (++position < length) {\r\n\t\t\t\t\tbuffer = TABLE.indexOf(input.charAt(position));\r\n\t\t\t\t\tbitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;\r\n\t\t\t\t\t// Unless this is the first of a group of 4 characters…\r\n\t\t\t\t\tif (bitCounter++ % 4) {\r\n\t\t\t\t\t\t// …convert the first 8 bits to a single ASCII character.\r\n\t\t\t\t\t\toutput += String.fromCharCode(\r\n\t\t\t\t\t\t\t0xFF & bitStorage >> (-2 * bitCounter & 6)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn output;\r\n\t\t\t};\r\n\r\n\t\t\t// `encode` is designed to be fully compatible with `btoa` as described in the\r\n\t\t\t// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa\r\n\t\t\tvar encode = function(input) {\r\n\t\t\t\tinput = String(input);\r\n\t\t\t\tif (/[^\\0-\\xFF]/.test(input)) {\r\n\t\t\t\t\t// Note: no need to special-case astral symbols here, as surrogates are\r\n\t\t\t\t\t// matched, and the input is supposed to only contain ASCII anyway.\r\n\t\t\t\t\terror(\r\n\t\t\t\t\t\t'The string to be encoded contains characters outside of the ' +\r\n\t\t\t\t\t\t'Latin1 range.'\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tvar padding = input.length % 3;\r\n\t\t\t\tvar output = '';\r\n\t\t\t\tvar position = -1;\r\n\t\t\t\tvar a;\r\n\t\t\t\tvar b;\r\n\t\t\t\tvar c;\r\n\t\t\t\tvar buffer;\r\n\t\t\t\t// Make sure any padding is handled outside of the loop.\r\n\t\t\t\tvar length = input.length - padding;\r\n\r\n\t\t\t\twhile (++position < length) {\r\n\t\t\t\t\t// Read three bytes, i.e. 24 bits.\r\n\t\t\t\t\ta = input.charCodeAt(position) << 16;\r\n\t\t\t\t\tb = input.charCodeAt(++position) << 8;\r\n\t\t\t\t\tc = input.charCodeAt(++position);\r\n\t\t\t\t\tbuffer = a + b + c;\r\n\t\t\t\t\t// Turn the 24 bits into four chunks of 6 bits each, and append the\r\n\t\t\t\t\t// matching character for each of them to the output.\r\n\t\t\t\t\toutput += (\r\n\t\t\t\t\t\tTABLE.charAt(buffer >> 18 & 0x3F) +\r\n\t\t\t\t\t\tTABLE.charAt(buffer >> 12 & 0x3F) +\r\n\t\t\t\t\t\tTABLE.charAt(buffer >> 6 & 0x3F) +\r\n\t\t\t\t\t\tTABLE.charAt(buffer & 0x3F)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (padding == 2) {\r\n\t\t\t\t\ta = input.charCodeAt(position) << 8;\r\n\t\t\t\t\tb = input.charCodeAt(++position);\r\n\t\t\t\t\tbuffer = a + b;\r\n\t\t\t\t\toutput += (\r\n\t\t\t\t\t\tTABLE.charAt(buffer >> 10) +\r\n\t\t\t\t\t\tTABLE.charAt((buffer >> 4) & 0x3F) +\r\n\t\t\t\t\t\tTABLE.charAt((buffer << 2) & 0x3F) +\r\n\t\t\t\t\t\t'='\r\n\t\t\t\t\t);\r\n\t\t\t\t} else if (padding == 1) {\r\n\t\t\t\t\tbuffer = input.charCodeAt(position);\r\n\t\t\t\t\toutput += (\r\n\t\t\t\t\t\tTABLE.charAt(buffer >> 2) +\r\n\t\t\t\t\t\tTABLE.charAt((buffer << 4) & 0x3F) +\r\n\t\t\t\t\t\t'=='\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn output;\r\n\t\t\t};\r\n\r\n\t\t\tvar base64 = {\r\n\t\t\t\t'encode': encode,\r\n\t\t\t\t'decode': decode,\r\n\t\t\t\t'version': '0.1.0'\r\n\t\t\t};\r\n\r\n\t\t\t// Some AMD build optimizers, like r.js, check for specific condition patterns\r\n\t\t\t// like the following:\r\n\t\t\tif (\r\n\t\t\t\ttypeof undefined == 'function' &&\r\n\t\t\t\ttypeof undefined.amd == 'object' &&\r\n\t\t\t\tundefined.amd\r\n\t\t\t) {\r\n\t\t\t\tundefined(function() {\r\n\t\t\t\t\treturn base64;\r\n\t\t\t\t});\r\n\t\t\t} else if (freeExports && !freeExports.nodeType) {\r\n\t\t\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\r\n\t\t\t\t\tfreeModule.exports = base64;\r\n\t\t\t\t} else { // in Narwhal or RingoJS v0.7.0-\r\n\t\t\t\t\tfor (var key in base64) {\r\n\t\t\t\t\t\tbase64.hasOwnProperty(key) && (freeExports[key] = base64[key]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else { // in Rhino or a web browser\r\n\t\t\t\troot.base64 = base64;\r\n\t\t\t}\r\n\r\n\t\t}(commonjsGlobal));\r\n\t});\r\n\r\n\tfunction makeURI(strData, type) {\r\n\t\treturn 'data:' + type + ';base64,' + strData\r\n\t}\r\n\r\n\tfunction fixType(type) {\r\n\t\ttype = type.toLowerCase().replace(/jpg/i, 'jpeg');\r\n\t\tvar r = type.match(/png|jpeg|bmp|gif/)[0];\r\n\t\treturn 'image/' + r\r\n\t}\r\n\r\n\tfunction encodeData(data) {\r\n\t\tvar str = '';\r\n\t\tif (typeof data === 'string') {\r\n\t\t\tstr = data;\r\n\t\t} else {\r\n\t\t\tfor (var i = 0; i < data.length; i++) {\r\n\t\t\t\tstr += String.fromCharCode(data[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn base64.encode(str)\r\n\t}\r\n\r\n\t/**\r\n\t * 获取图像区域隐含的像素数据\r\n\t * @param canvasId canvas标识\r\n\t * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标\r\n\t * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标\r\n\t * @param width 将要被提取的图像数据矩形区域的宽度\r\n\t * @param height 将要被提取的图像数据矩形区域的高度\r\n\t * @param done 完成回调\r\n\t */\r\n\tfunction getImageData(canvasId, x, y, width, height, done) {\r\n\t\tuni.canvasGetImageData({\r\n\t\t\tcanvasId: canvasId,\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\twidth: width,\r\n\t\t\theight: height,\r\n\t\t\tsuccess: function success(res) {\r\n\t\t\t\tdone(res, null);\r\n\t\t\t},\r\n\t\t\tfail: function fail(res) {\r\n\t\t\t\tdone(null, res);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 生成bmp格式图片\r\n\t * 按照规则生成图片响应头和响应体\r\n\t * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData\r\n\t * @returns {*} base64字符串\r\n\t */\r\n\tfunction genBitmapImage(oData) {\r\n\t\t//\r\n\t\t// BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx\r\n\t\t// BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx\r\n\t\t//\r\n\t\tvar biWidth = oData.width;\r\n\t\tvar biHeight = oData.height;\r\n\t\tvar biSizeImage = biWidth * biHeight * 3;\r\n\t\tvar bfSize = biSizeImage + 54; // total header size = 54 bytes\r\n\r\n\t\t//\r\n\t\t//  typedef struct tagBITMAPFILEHEADER {\r\n\t\t//  \tWORD bfType;\r\n\t\t//  \tDWORD bfSize;\r\n\t\t//  \tWORD bfReserved1;\r\n\t\t//  \tWORD bfReserved2;\r\n\t\t//  \tDWORD bfOffBits;\r\n\t\t//  } BITMAPFILEHEADER;\r\n\t\t//\r\n\t\tvar BITMAPFILEHEADER = [\r\n\t\t\t// WORD bfType -- The file type signature; must be \"BM\"\r\n\t\t\t0x42, 0x4D,\r\n\t\t\t// DWORD bfSize -- The size, in bytes, of the bitmap file\r\n\t\t\tbfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff,\r\n\t\t\t// WORD bfReserved1 -- Reserved; must be zero\r\n\t\t\t0, 0,\r\n\t\t\t// WORD bfReserved2 -- Reserved; must be zero\r\n\t\t\t0, 0,\r\n\t\t\t// DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.\r\n\t\t\t54, 0, 0, 0\r\n\t\t];\r\n\r\n\t\t//\r\n\t\t//  typedef struct tagBITMAPINFOHEADER {\r\n\t\t//  \tDWORD biSize;\r\n\t\t//  \tLONG  biWidth;\r\n\t\t//  \tLONG  biHeight;\r\n\t\t//  \tWORD  biPlanes;\r\n\t\t//  \tWORD  biBitCount;\r\n\t\t//  \tDWORD biCompression;\r\n\t\t//  \tDWORD biSizeImage;\r\n\t\t//  \tLONG  biXPelsPerMeter;\r\n\t\t//  \tLONG  biYPelsPerMeter;\r\n\t\t//  \tDWORD biClrUsed;\r\n\t\t//  \tDWORD biClrImportant;\r\n\t\t//  } BITMAPINFOHEADER, *PBITMAPINFOHEADER;\r\n\t\t//\r\n\t\tvar BITMAPINFOHEADER = [\r\n\t\t\t// DWORD biSize -- The number of bytes required by the structure\r\n\t\t\t40, 0, 0, 0,\r\n\t\t\t// LONG biWidth -- The width of the bitmap, in pixels\r\n\t\t\tbiWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff,\r\n\t\t\t// LONG biHeight -- The height of the bitmap, in pixels\r\n\t\t\tbiHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff,\r\n\t\t\t// WORD biPlanes -- The number of planes for the target device. This value must be set to 1\r\n\t\t\t1, 0,\r\n\t\t\t// WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap\r\n\t\t\t// has a maximum of 2^24 colors (16777216, Truecolor)\r\n\t\t\t24, 0,\r\n\t\t\t// DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed\r\n\t\t\t0, 0, 0, 0,\r\n\t\t\t// DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps\r\n\t\t\tbiSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff,\r\n\t\t\t// LONG biXPelsPerMeter, unused\r\n\t\t\t0, 0, 0, 0,\r\n\t\t\t// LONG biYPelsPerMeter, unused\r\n\t\t\t0, 0, 0, 0,\r\n\t\t\t// DWORD biClrUsed, the number of color indexes of palette, unused\r\n\t\t\t0, 0, 0, 0,\r\n\t\t\t// DWORD biClrImportant, unused\r\n\t\t\t0, 0, 0, 0\r\n\t\t];\r\n\r\n\t\tvar iPadding = (4 - ((biWidth * 3) % 4)) % 4;\r\n\r\n\t\tvar aImgData = oData.data;\r\n\r\n\t\tvar strPixelData = '';\r\n\t\tvar biWidth4 = biWidth << 2;\r\n\t\tvar y = biHeight;\r\n\t\tvar fromCharCode = String.fromCharCode;\r\n\r\n\t\tdo {\r\n\t\t\tvar iOffsetY = biWidth4 * (y - 1);\r\n\t\t\tvar strPixelRow = '';\r\n\t\t\tfor (var x = 0; x < biWidth; x++) {\r\n\t\t\t\tvar iOffsetX = x << 2;\r\n\t\t\t\tstrPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +\r\n\t\t\t\t\tfromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +\r\n\t\t\t\t\tfromCharCode(aImgData[iOffsetY + iOffsetX]);\r\n\t\t\t}\r\n\r\n\t\t\tfor (var c = 0; c < iPadding; c++) {\r\n\t\t\t\tstrPixelRow += String.fromCharCode(0);\r\n\t\t\t}\r\n\r\n\t\t\tstrPixelData += strPixelRow;\r\n\t\t} while (--y)\r\n\r\n\t\tvar strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData);\r\n\r\n\t\treturn strEncoded\r\n\t}\r\n\r\n\t/**\r\n\t * 转换为图片base64\r\n\t * @param canvasId canvas标识\r\n\t * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标\r\n\t * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标\r\n\t * @param width 将要被提取的图像数据矩形区域的宽度\r\n\t * @param height 将要被提取的图像数据矩形区域的高度\r\n\t * @param type 转换图片类型\r\n\t * @param done 完成回调\r\n\t */\r\n\tfunction convertToImage(canvasId, x, y, width, height, type, done) {\r\n\t\tif (done === void 0) done = function() {};\r\n\r\n\t\tif (type === undefined) {\r\n\t\t\ttype = 'png';\r\n\t\t}\r\n\t\ttype = fixType(type);\r\n\t\tif (/bmp/.test(type)) {\r\n\t\t\tgetImageData(canvasId, x, y, width, height, function(data, err) {\r\n\t\t\t\tvar strData = genBitmapImage(data);\r\n\t\t\t\ttools_7(done) && done(makeURI(strData, 'image/' + type), err);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tconsole.error('暂不支持生成\\'' + type + '\\'类型的base64图片');\r\n\t\t}\r\n\t}\r\n\r\n\tvar CanvasToBase64 = {\r\n\t\tconvertToImage: convertToImage,\r\n\t\t// convertToPNG: function (width, height, done) {\r\n\t\t//   return convertToImage(width, height, 'png', done)\r\n\t\t// },\r\n\t\t// convertToJPEG: function (width, height, done) {\r\n\t\t//   return convertToImage(width, height, 'jpeg', done)\r\n\t\t// },\r\n\t\t// convertToGIF: function (width, height, done) {\r\n\t\t//   return convertToImage(width, height, 'gif', done)\r\n\t\t// },\r\n\t\tconvertToBMP: function(ref, done) {\r\n\t\t\tif (ref === void 0) ref = {};\r\n\t\t\tvar canvasId = ref.canvasId;\r\n\t\t\tvar x = ref.x;\r\n\t\t\tvar y = ref.y;\r\n\t\t\tvar width = ref.width;\r\n\t\t\tvar height = ref.height;\r\n\t\t\tif (done === void 0) done = function() {};\r\n\r\n\t\t\treturn convertToImage(canvasId, x, y, width, height, 'bmp', done)\r\n\t\t}\r\n\t};\r\n\r\n\tfunction methods() {\r\n\t\tvar self = this;\r\n\r\n\t\tvar boundWidth = self.width; // 裁剪框默认宽度，即整个画布宽度\r\n\t\tvar boundHeight = self.height; // 裁剪框默认高度，即整个画布高度\r\n\r\n\t\tvar id = self.id;\r\n\t\tvar targetId = self.targetId;\r\n\t\tvar pixelRatio = self.pixelRatio;\r\n\r\n\t\tvar ref = self.cut;\r\n\t\tvar x = ref.x;\r\n\t\tif (x === void 0) x = 0;\r\n\t\tvar y = ref.y;\r\n\t\tif (y === void 0) y = 0;\r\n\t\tvar width = ref.width;\r\n\t\tif (width === void 0) width = boundWidth;\r\n\t\tvar height = ref.height;\r\n\t\tif (height === void 0) height = boundHeight;\r\n\r\n\t\tself.updateCanvas = function(done) {\r\n\t\t\tif (self.croperTarget) {\r\n\t\t\t\t//  画布绘制图片\r\n\t\t\t\tself.ctx.drawImage(\r\n\t\t\t\t\tself.croperTarget,\r\n\t\t\t\t\tself.imgLeft,\r\n\t\t\t\t\tself.imgTop,\r\n\t\t\t\t\tself.scaleWidth,\r\n\t\t\t\t\tself.scaleHeight\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\ttools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self);\r\n\r\n\t\t\tself.setBoundStyle(self.boundStyle); //\t设置边界样式\r\n\r\n\t\t\tself.ctx.draw(false, done);\r\n\t\t\treturn self\r\n\t\t};\r\n\r\n\t\tself.pushOrigin = self.pushOrign = function(src) {\r\n\t\t\tself.src = src;\r\n\r\n\t\t\ttools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self);\r\n\r\n\t\t\treturn getImageInfo({\r\n\t\t\t\t\tsrc: src\r\n\t\t\t\t})\r\n\t\t\t\t.then(function(res) {\r\n\t\t\t\t\tvar innerAspectRadio = res.width / res.height;\r\n\t\t\t\t\tvar customAspectRadio = width / height;\r\n\r\n\t\t\t\t\tself.croperTarget = res.path;\r\n\r\n\t\t\t\t\tif (innerAspectRadio < customAspectRadio) {\r\n\t\t\t\t\t\tself.rectX = x;\r\n\t\t\t\t\t\tself.baseWidth = width;\r\n\t\t\t\t\t\tself.baseHeight = width / innerAspectRadio;\r\n\t\t\t\t\t\tself.rectY = y - Math.abs((height - self.baseHeight) / 2);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tself.rectY = y;\r\n\t\t\t\t\t\tself.baseWidth = height * innerAspectRadio;\r\n\t\t\t\t\t\tself.baseHeight = height;\r\n\t\t\t\t\t\tself.rectX = x - Math.abs((width - self.baseWidth) / 2);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tself.imgLeft = self.rectX;\r\n\t\t\t\t\tself.imgTop = self.rectY;\r\n\t\t\t\t\tself.scaleWidth = self.baseWidth;\r\n\t\t\t\t\tself.scaleHeight = self.baseHeight;\r\n\r\n\t\t\t\t\tself.update();\r\n\r\n\t\t\t\t\treturn new Promise(function(resolve) {\r\n\t\t\t\t\t\tself.updateCanvas(resolve);\r\n\t\t\t\t\t})\r\n\t\t\t\t})\r\n\t\t\t\t.then(function() {\r\n\t\t\t\t\ttools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self);\r\n\t\t\t\t})\r\n\t\t};\r\n\r\n\t\tself.removeImage = function() {\r\n\t\t\tself.src = '';\r\n\t\t\tself.croperTarget = '';\r\n\t\t\treturn draw(self.ctx)\r\n\t\t};\r\n\r\n\t\tself.getCropperBase64 = function(done) {\r\n\t\t\tif (done === void 0) done = function() {};\r\n\r\n\t\t\tCanvasToBase64.convertToBMP({\r\n\t\t\t\tcanvasId: id,\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t}, done);\r\n\t\t};\r\n\r\n\t\tself.getCropperImage = function(opt, fn) {\r\n\t\t\tvar customOptions = opt;\r\n\r\n\t\t\tvar canvasOptions = {\r\n\t\t\t\tcanvasId: id,\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t};\r\n\r\n\t\t\tvar task = function() {\r\n\t\t\t\treturn Promise.resolve();\r\n\t\t\t};\r\n\r\n\t\t\tif (\r\n\t\t\t\ttools_10(customOptions) &&\r\n\t\t\t\tcustomOptions.original\r\n\t\t\t) {\r\n\t\t\t\t// original mode\r\n\t\t\t\ttask = function() {\r\n\t\t\t\t\tself.targetCtx.drawImage(\r\n\t\t\t\t\t\tself.croperTarget,\r\n\t\t\t\t\t\tself.imgLeft * pixelRatio,\r\n\t\t\t\t\t\tself.imgTop * pixelRatio,\r\n\t\t\t\t\t\tself.scaleWidth * pixelRatio,\r\n\t\t\t\t\t\tself.scaleHeight * pixelRatio\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tcanvasOptions = {\r\n\t\t\t\t\t\tcanvasId: targetId,\r\n\t\t\t\t\t\tx: x * pixelRatio,\r\n\t\t\t\t\t\ty: y * pixelRatio,\r\n\t\t\t\t\t\twidth: width * pixelRatio,\r\n\t\t\t\t\t\theight: height * pixelRatio\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\treturn draw(self.targetCtx)\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\treturn task()\r\n\t\t\t\t.then(function() {\r\n\t\t\t\t\tif (tools_10(customOptions)) {\r\n\t\t\t\t\t\tcanvasOptions = Object.assign({}, canvasOptions, customOptions);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tools_7(customOptions)) {\r\n\t\t\t\t\t\tfn = customOptions;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar arg = canvasOptions.componentContext ?\r\n\t\t\t\t\t\t[canvasOptions, canvasOptions.componentContext] :\r\n\t\t\t\t\t\t[canvasOptions];\r\n\r\n\t\t\t\t\treturn canvasToTempFilePath.apply(null, arg)\r\n\t\t\t\t})\r\n\t\t\t\t.then(function(res) {\r\n\t\t\t\t\tvar tempFilePath = res.tempFilePath;\r\n\r\n\t\t\t\t\treturn tools_7(fn) ?\r\n\t\t\t\t\t\tfn.call(self, tempFilePath, null) :\r\n\t\t\t\t\t\ttempFilePath\r\n\t\t\t\t})\r\n\t\t\t\t.catch(function(err) {\r\n\t\t\t\t\tif (tools_7(fn)) {\r\n\t\t\t\t\t\tfn.call(self, null, err);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthrow err\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * 获取最新缩放值\r\n\t * @param oldScale 上一次触摸结束后的缩放值\r\n\t * @param oldDistance 上一次触摸结束后的双指距离\r\n\t * @param zoom 缩放系数\r\n\t * @param touch0 第一指touch对象\r\n\t * @param touch1 第二指touch对象\r\n\t * @returns {*}\r\n\t */\r\n\tvar getNewScale = function(oldScale, oldDistance, zoom, touch0, touch1) {\r\n\t\tvar xMove, yMove, newDistance;\r\n\t\t// 计算二指最新距离\r\n\t\txMove = Math.round(touch1.x - touch0.x);\r\n\t\tyMove = Math.round(touch1.y - touch0.y);\r\n\t\tnewDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));\r\n\r\n\t\treturn oldScale + 0.001 * zoom * (newDistance - oldDistance)\r\n\t};\r\n\r\n\tfunction update() {\r\n\t\tvar self = this;\r\n\r\n\t\tif (!self.src) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tself.__oneTouchStart = function(touch) {\r\n\t\t\tself.touchX0 = Math.round(touch.x);\r\n\t\t\tself.touchY0 = Math.round(touch.y);\r\n\t\t};\r\n\r\n\t\tself.__oneTouchMove = function(touch) {\r\n\t\t\tvar xMove, yMove;\r\n\t\t\t// 计算单指移动的距离\r\n\t\t\tif (self.touchended) {\r\n\t\t\t\treturn self.updateCanvas()\r\n\t\t\t}\r\n\t\t\txMove = Math.round(touch.x - self.touchX0);\r\n\t\t\tyMove = Math.round(touch.y - self.touchY0);\r\n\r\n\t\t\tvar imgLeft = Math.round(self.rectX + xMove);\r\n\t\t\tvar imgTop = Math.round(self.rectY + yMove);\r\n\r\n\t\t\tself.outsideBound(imgLeft, imgTop);\r\n\r\n\t\t\tself.updateCanvas();\r\n\t\t};\r\n\r\n\t\tself.__twoTouchStart = function(touch0, touch1) {\r\n\t\t\tvar xMove, yMove, oldDistance;\r\n\r\n\t\t\tself.touchX1 = Math.round(self.rectX + self.scaleWidth / 2);\r\n\t\t\tself.touchY1 = Math.round(self.rectY + self.scaleHeight / 2);\r\n\r\n\t\t\t// 计算两指距离\r\n\t\t\txMove = Math.round(touch1.x - touch0.x);\r\n\t\t\tyMove = Math.round(touch1.y - touch0.y);\r\n\t\t\toldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));\r\n\r\n\t\t\tself.oldDistance = oldDistance;\r\n\t\t};\r\n\r\n\t\tself.__twoTouchMove = function(touch0, touch1) {\r\n\t\t\tvar oldScale = self.oldScale;\r\n\t\t\tvar oldDistance = self.oldDistance;\r\n\t\t\tvar scale = self.scale;\r\n\t\t\tvar zoom = self.zoom;\r\n\r\n\t\t\tself.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1);\r\n\r\n\t\t\t//  设定缩放范围\r\n\t\t\tself.newScale <= 1 && (self.newScale = 1);\r\n\t\t\tself.newScale >= scale && (self.newScale = scale);\r\n\r\n\t\t\tself.scaleWidth = Math.round(self.newScale * self.baseWidth);\r\n\t\t\tself.scaleHeight = Math.round(self.newScale * self.baseHeight);\r\n\t\t\tvar imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2);\r\n\t\t\tvar imgTop = Math.round(self.touchY1 - self.scaleHeight / 2);\r\n\r\n\t\t\tself.outsideBound(imgLeft, imgTop);\r\n\r\n\t\t\tself.updateCanvas();\r\n\t\t};\r\n\r\n\t\tself.__xtouchEnd = function() {\r\n\t\t\tself.oldScale = self.newScale;\r\n\t\t\tself.rectX = self.imgLeft;\r\n\t\t\tself.rectY = self.imgTop;\r\n\t\t};\r\n\t}\r\n\r\n\tvar handle = {\r\n\t\t//  图片手势初始监测\r\n\t\ttouchStart: function touchStart(e) {\r\n\t\t\tvar self = this;\r\n\t\t\tvar ref = e.touches;\r\n\t\t\tvar touch0 = ref[0];\r\n\t\t\tvar touch1 = ref[1];\r\n\r\n\t\t\tif (!self.src) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tsetTouchState(self, true, null, null);\r\n\r\n\t\t\t// 计算第一个触摸点的位置，并参照改点进行缩放\r\n\t\t\tself.__oneTouchStart(touch0);\r\n\r\n\t\t\t// 两指手势触发\r\n\t\t\tif (e.touches.length >= 2) {\r\n\t\t\t\tself.__twoTouchStart(touch0, touch1);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t//  图片手势动态缩放\r\n\t\ttouchMove: function touchMove(e) {\r\n\t\t\tvar self = this;\r\n\t\t\tvar ref = e.touches;\r\n\t\t\tvar touch0 = ref[0];\r\n\t\t\tvar touch1 = ref[1];\r\n\r\n\t\t\tif (!self.src) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tsetTouchState(self, null, true);\r\n\r\n\t\t\t// 单指手势时触发\r\n\t\t\tif (e.touches.length === 1) {\r\n\t\t\t\tself.__oneTouchMove(touch0);\r\n\t\t\t}\r\n\t\t\t// 两指手势触发\r\n\t\t\tif (e.touches.length >= 2) {\r\n\t\t\t\tself.__twoTouchMove(touch0, touch1);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttouchEnd: function touchEnd(e) {\r\n\t\t\tvar self = this;\r\n\r\n\t\t\tif (!self.src) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tsetTouchState(self, false, false, true);\r\n\t\t\tself.__xtouchEnd();\r\n\t\t}\r\n\t};\r\n\r\n\tfunction cut() {\r\n\t\tvar self = this;\r\n\t\tvar boundWidth = self.width; // 裁剪框默认宽度，即整个画布宽度\r\n\t\tvar boundHeight = self.height;\r\n\t\t// 裁剪框默认高度，即整个画布高度\r\n\t\tvar ref = self.cut;\r\n\t\tvar x = ref.x;\r\n\t\tif (x === void 0) x = 0;\r\n\t\tvar y = ref.y;\r\n\t\tif (y === void 0) y = 0;\r\n\t\tvar width = ref.width;\r\n\t\tif (width === void 0) width = boundWidth;\r\n\t\tvar height = ref.height;\r\n\t\tif (height === void 0) height = boundHeight;\r\n\r\n\t\t/**\r\n\t\t * 设置边界\r\n\t\t * @param imgLeft 图片左上角横坐标值\r\n\t\t * @param imgTop 图片左上角纵坐标值\r\n\t\t */\r\n\t\tself.outsideBound = function(imgLeft, imgTop) {\r\n\t\t\tself.imgLeft = imgLeft >= x ?\r\n\t\t\t\tx :\r\n\t\t\t\tself.scaleWidth + imgLeft - x <= width ?\r\n\t\t\t\tx + width - self.scaleWidth :\r\n\t\t\t\timgLeft;\r\n\r\n\t\t\tself.imgTop = imgTop >= y ?\r\n\t\t\t\ty :\r\n\t\t\t\tself.scaleHeight + imgTop - y <= height ?\r\n\t\t\t\ty + height - self.scaleHeight :\r\n\t\t\t\timgTop;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * 设置边界样式\r\n\t\t * @param color\t边界颜色\r\n\t\t */\r\n\t\tself.setBoundStyle = function(ref) {\r\n\t\t\tif (ref === void 0) ref = {};\r\n\t\t\tvar color = ref.color;\r\n\t\t\tif (color === void 0) color = '#04b00f';\r\n\t\t\tvar mask = ref.mask;\r\n\t\t\tif (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)';\r\n\t\t\tvar lineWidth = ref.lineWidth;\r\n\t\t\tif (lineWidth === void 0) lineWidth = 1;\r\n\r\n\t\t\tvar half = lineWidth / 2;\r\n\t\t\tvar boundOption = [{\r\n\t\t\t\t\tstart: {\r\n\t\t\t\t\t\tx: x - half,\r\n\t\t\t\t\t\ty: y + 10 - half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep1: {\r\n\t\t\t\t\t\tx: x - half,\r\n\t\t\t\t\t\ty: y - half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep2: {\r\n\t\t\t\t\t\tx: x + 10 - half,\r\n\t\t\t\t\t\ty: y - half\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tstart: {\r\n\t\t\t\t\t\tx: x - half,\r\n\t\t\t\t\t\ty: y + height - 10 + half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep1: {\r\n\t\t\t\t\t\tx: x - half,\r\n\t\t\t\t\t\ty: y + height + half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep2: {\r\n\t\t\t\t\t\tx: x + 10 - half,\r\n\t\t\t\t\t\ty: y + height + half\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tstart: {\r\n\t\t\t\t\t\tx: x + width - 10 + half,\r\n\t\t\t\t\t\ty: y - half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep1: {\r\n\t\t\t\t\t\tx: x + width + half,\r\n\t\t\t\t\t\ty: y - half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep2: {\r\n\t\t\t\t\t\tx: x + width + half,\r\n\t\t\t\t\t\ty: y + 10 - half\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tstart: {\r\n\t\t\t\t\t\tx: x + width + half,\r\n\t\t\t\t\t\ty: y + height - 10 + half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep1: {\r\n\t\t\t\t\t\tx: x + width + half,\r\n\t\t\t\t\t\ty: y + height + half\r\n\t\t\t\t\t},\r\n\t\t\t\t\tstep2: {\r\n\t\t\t\t\t\tx: x + width - 10 + half,\r\n\t\t\t\t\t\ty: y + height + half\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t];\r\n\r\n\t\t\t// 绘制半透明层\r\n\t\t\tself.ctx.beginPath();\r\n\t\t\tself.ctx.setFillStyle(mask);\r\n\t\t\tself.ctx.fillRect(0, 0, x, boundHeight);\r\n\t\t\tself.ctx.fillRect(x, 0, width, y);\r\n\t\t\tself.ctx.fillRect(x, y + height, width, boundHeight - y - height);\r\n\t\t\tself.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight);\r\n\t\t\tself.ctx.fill();\r\n\r\n\t\t\tboundOption.forEach(function(op) {\r\n\t\t\t\tself.ctx.beginPath();\r\n\t\t\t\tself.ctx.setStrokeStyle(color);\r\n\t\t\t\tself.ctx.setLineWidth(lineWidth);\r\n\t\t\t\tself.ctx.moveTo(op.start.x, op.start.y);\r\n\t\t\t\tself.ctx.lineTo(op.step1.x, op.step1.y);\r\n\t\t\t\tself.ctx.lineTo(op.step2.x, op.step2.y);\r\n\t\t\t\tself.ctx.stroke();\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\tvar version = \"1.3.9\";\r\n\r\n\tvar WeCropper = function WeCropper(params) {\r\n\t\tvar self = this;\r\n\t\tvar _default = {};\r\n\r\n\t\tvalidator(self, DEFAULT);\r\n\r\n\t\tObject.keys(DEFAULT).forEach(function(key) {\r\n\t\t\t_default[key] = DEFAULT[key].default;\r\n\t\t});\r\n\t\tObject.assign(self, _default, params);\r\n\r\n\t\tself.prepare();\r\n\t\tself.attachPage();\r\n\t\tself.createCtx();\r\n\t\tself.observer();\r\n\t\tself.cutt();\r\n\t\tself.methods();\r\n\t\tself.init();\r\n\t\tself.update();\r\n\r\n\t\treturn self\r\n\t};\r\n\r\n\tWeCropper.prototype.init = function init() {\r\n\t\tvar self = this;\r\n\t\tvar src = self.src;\r\n\r\n\t\tself.version = version;\r\n\r\n\t\ttypeof self.onReady === 'function' && self.onReady(self.ctx, self);\r\n\r\n\t\tif (src) {\r\n\t\t\tself.pushOrign(src);\r\n\t\t} else {\r\n\t\t\tself.updateCanvas();\r\n\t\t}\r\n\t\tsetTouchState(self, false, false, false);\r\n\r\n\t\tself.oldScale = 1;\r\n\t\tself.newScale = 1;\r\n\r\n\t\treturn self\r\n\t};\r\n\r\n\tObject.assign(WeCropper.prototype, handle);\r\n\r\n\tWeCropper.prototype.prepare = prepare;\r\n\tWeCropper.prototype.observer = observer;\r\n\tWeCropper.prototype.methods = methods;\r\n\tWeCropper.prototype.cutt = cut;\r\n\tWeCropper.prototype.update = update;\r\n\r\n\treturn WeCropper;\r\n\r\n})));\r\n"
  },
  {
    "path": "uview-ui/components/u-back-top/u-back-top.vue",
    "content": "<template>\r\n\t<view @tap=\"backToTop\" class=\"u-back-top\" :class=\"['u-back-top--mode--' + mode]\" :style=\"[{\r\n\t\tbottom: bottom + 'rpx',\r\n\t\tright: right + 'rpx',\r\n\t\tborderRadius: mode == 'circle' ? '10000rpx' : '8rpx',\r\n\t\tzIndex: uZIndex,\r\n\t\topacity: opacity\r\n\t}, customStyle]\">\r\n\t\t<view class=\"u-back-top__content\" v-if=\"!$slots.default\">\r\n\t\t\t<u-icon @click=\"backToTop\" :name=\"icon\" :custom-style=\"iconStyle\"></u-icon>\r\n\t\t\t<view class=\"u-back-top__content__tips\">\r\n\t\t\t\t{{tips}}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<slot v-else />\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tname: 'u-back-top',\r\n\t\tprops: {\r\n\t\t\t// 返回顶部的形状，circle-圆形，square-方形\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'circle'\r\n\t\t\t},\r\n\t\t\t// 自定义图标\r\n\t\t\ticon: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'arrow-upward'\r\n\t\t\t},\r\n\t\t\t// 提示文字\r\n\t\t\ttips: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 返回顶部滚动时间\r\n\t\t\tduration: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 100\r\n\t\t\t},\r\n\t\t\t// 滚动距离\r\n\t\t\tscrollTop: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 距离顶部多少距离显示，单位rpx\r\n\t\t\ttop: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 400\r\n\t\t\t},\r\n\t\t\t// 返回顶部按钮到底部的距离，单位rpx\r\n\t\t\tbottom: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 200\r\n\t\t\t},\r\n\t\t\t// 返回顶部按钮到右边的距离，单位rpx\r\n\t\t\tright: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 40\r\n\t\t\t},\r\n\t\t\t// 层级\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: '9'\r\n\t\t\t},\r\n\t\t\t// 图标的样式，对象形式\r\n\t\t\ticonStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tcolor: '#909399',\r\n\t\t\t\t\t\tfontSize: '38rpx'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 整个组件的样式\r\n\t\t\tcustomStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tshowBackTop(nVal, oVal) {\r\n\t\t\t\t// 当组件的显示与隐藏状态发生跳变时，修改组件的层级和不透明度\r\n\t\t\t\t// 让组件有显示和消失的动画效果，如果用v-if控制组件状态，将无设置动画效果\r\n\t\t\t\tif(nVal) {\r\n\t\t\t\t\tthis.uZIndex = this.zIndex;\r\n\t\t\t\t\tthis.opacity = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.uZIndex = -1;\r\n\t\t\t\t\tthis.opacity = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tshowBackTop() {\r\n\t\t\t\t// 由于scrollTop为页面的滚动距离，默认为px单位，这里将用于传入的top(rpx)值\r\n\t\t\t\t// 转为px用于比较，如果滚动条到顶的距离大于设定的距离，就显示返回顶部的按钮\r\n\t\t\t\treturn this.scrollTop > uni.upx2px(this.top);\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t// 不透明度，为了让组件有一个显示和隐藏的过渡动画\r\n\t\t\t\topacity: 0,\r\n\t\t\t\t// 组件的z-index值，隐藏时设置为-1，就会看不到\r\n\t\t\t\tuZIndex: -1\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tbackToTop() {\r\n\t\t\t\tuni.pageScrollTo({\r\n\t\t\t\t\tscrollTop: 0,\r\n\t\t\t\t\tduration: this.duration\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-back-top {\r\n\t\twidth: 80rpx;\r\n\t\theight: 80rpx;\r\n\t\tposition: fixed;\r\n\t\tz-index: 9;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tjustify-content: center;\r\n\t\tbackground-color: #E1E1E1;\r\n\t\tcolor: $u-content-color;\r\n\t\talign-items: center;\r\n\t\ttransition: opacity 0.4s;\r\n\t\t\r\n\t\t&__content {\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-direction: column;\r\n\t\t\talign-items: center;\r\n\t\t\t\r\n\t\t\t&__tips {\r\n\t\t\t\tfont-size: 24rpx;\r\n\t\t\t\ttransform: scale(0.8);\r\n\t\t\t\tline-height: 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-badge/u-badge.vue",
    "content": "<template>\r\n\t<view v-if=\"show\" class=\"u-badge\" :class=\"[\r\n\t\t\tisDot ? 'u-badge-dot' : '', \r\n\t\t\tsize == 'mini' ? 'u-badge-mini' : '',\r\n\t\t\ttype ? 'u-badge--bg--' + type : ''\r\n\t\t]\" :style=\"[{\r\n\t\t\ttop: offset[0] + 'rpx',\r\n\t\t\tright: offset[1] + 'rpx',\r\n\t\t\tfontSize: fontSize + 'rpx',\r\n\t\t\tposition: absolute ? 'absolute' : 'static',\r\n\t\t\tcolor: color,\r\n\t\t\tbackgroundColor: bgColor\r\n\t\t}, boxStyle]\"\r\n\t>\r\n\t\t{{showText}}\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * badge 角标\r\n\t * @description 本组件一般用于展示头像的地方，如个人中心，或者评论列表页的用户头像展示等场所。\r\n\t * @tutorial https://www.uviewui.com/components/badge.html\r\n\t * @property {String Number} count 展示的数字，大于 overflowCount 时显示为 ${overflowCount}+，为0且show-zero为false时隐藏\r\n\t * @property {Boolean} is-dot 不展示数字，只有一个小点（默认false）\r\n\t * @property {Boolean} absolute 组件是否绝对定位，为true时，offset参数才有效（默认true）\r\n\t * @property {String Number} overflow-count 展示封顶的数字值（默认99）\r\n\t * @property {String} type 使用预设的背景颜色（默认error）\r\n\t * @property {Boolean} show-zero 当数值为 0 时，是否展示 Badge（默认false）\r\n\t * @property {String} size Badge的尺寸，设为mini会得到小一号的Badge（默认default）\r\n\t * @property {Array} offset 设置badge的位置偏移，格式为 [x, y]，也即设置的为top和right的值，单位rpx。absolute为true时有效（默认[20, 20]）\r\n\t * @property {String} color 字体颜色（默认#ffffff）\r\n\t * @property {String} bgColor 背景颜色，优先级比type高，如设置，type参数会失效\r\n\t * @property {Boolean} is-center 组件中心点是否和父组件右上角重合，优先级比offset高，如设置，offset参数会失效（默认false）\r\n\t * @example <u-badge type=\"error\" count=\"7\"></u-badge>\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-badge',\r\n\t\tprops: {\r\n\t\t\t// primary,warning,success,error,info\r\n\t\t\ttype: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'error'\r\n\t\t\t},\r\n\t\t\t// default, mini\r\n\t\t\tsize: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'default'\r\n\t\t\t},\r\n\t\t\t//是否是圆点\r\n\t\t\tisDot: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 显示的数值内容\r\n\t\t\tcount: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t},\r\n\t\t\t// 展示封顶的数字值\r\n\t\t\toverflowCount: {\r\n\t\t\t\ttype: Number,\r\n\t\t\t\tdefault: 99\r\n\t\t\t},\r\n\t\t\t// 当数值为 0 时，是否展示 Badge\r\n\t\t\tshowZero: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 位置偏移\r\n\t\t\toffset: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault: () => {\r\n\t\t\t\t\treturn [20, 20]\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否开启绝对定位，开启了offset才会起作用\r\n\t\t\tabsolute: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 字体大小\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: '24'\r\n\t\t\t},\r\n\t\t\t// 字体演示\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// badge的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否让badge组件的中心点和父组件右上角重合，配置的话，offset将会失效\r\n\t\t\tisCenter: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 是否将badge中心与父组件右上角重合\r\n\t\t\tboxStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif(this.isCenter) {\r\n\t\t\t\t\tstyle.top = 0;\r\n\t\t\t\t\tstyle.right = 0;\r\n\t\t\t\t\t// Y轴-50%，意味着badge向上移动了badge自身高度一半，X轴50%，意味着向右移动了自身宽度一半\r\n\t\t\t\t\tstyle.transform = \"translateY(-50%) translateX(50%)\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstyle.top = this.offset[0] + 'rpx';\r\n\t\t\t\t\tstyle.right = this.offset[1] + 'rpx';\r\n\t\t\t\t\tstyle.transform = \"translateY(0) translateX(0)\";\r\n\t\t\t\t}\r\n\t\t\t\t// 如果尺寸为mini，后接上scal()\r\n\t\t\t\tif(this.size == 'mini') {\r\n\t\t\t\t\tstyle.transform = style.transform + \" scale(0.8)\";\r\n\t\t\t\t}\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// isDot类型时，不显示文字\r\n\t\t\tshowText() {\r\n\t\t\t\tif(this.isDot) return '';\r\n\t\t\t\telse {\r\n\t\t\t\t\tif(this.count > this.overflowCount) return `${this.overflowCount}+`;\r\n\t\t\t\t\telse return this.count;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否显示组件\r\n\t\t\tshow() {\r\n\t\t\t\t// 如果count的值为0，并且showZero设置为false，不显示组件\r\n\t\t\t\tif(this.count == 0 && this.showZero == false) return false;\r\n\t\t\t\telse return true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-badge {\r\n\t\tdisplay: inline-flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tline-height: 24rpx;\r\n\t\tpadding: 4rpx 8rpx;\r\n\t\tborder-radius: 100rpx;\r\n\t\t\r\n\t\t&--bg--primary {\r\n\t\t\tbackground-color: $u-type-primary;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--error {\r\n\t\t\tbackground-color: $u-type-error;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--success {\r\n\t\t\tbackground-color: $u-type-success;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--info {\r\n\t\t\tbackground-color: $u-type-info;\r\n\t\t}\r\n\t\t\r\n\t\t&--bg--warning {\r\n\t\t\tbackground-color: $u-type-warning;\r\n\t\t}\r\n\t}\r\n\t\r\n\t.u-badge-dot {\r\n\t\theight: 16rpx;\r\n\t\twidth: 16rpx;\r\n\t\tborder-radius: 100rpx;\r\n\t\tline-height: 1;\r\n\t}\r\n\t\r\n\t.u-badge-mini {\r\n\t\ttransform: scale(0.8);\r\n\t\ttransform-origin: center center;\r\n\t}\r\n\t\r\n\t// .u-primary {\r\n\t// \tbackground: $u-type-primary;\r\n\t// \tcolor: #fff;\r\n\t// }\r\n\t\r\n\t// .u-error {\r\n\t// \tbackground: $u-type-error;\r\n\t// \tcolor: #fff;\r\n\t// }\r\n\t\r\n\t// .u-warning {\r\n\t// \tbackground: $u-type-warning;\r\n\t// \tcolor: #fff;\r\n\t// }\r\n\t\r\n\t// .u-success {\r\n\t// \tbackground: $u-type-success;\r\n\t// \tcolor: #fff;\r\n\t// }\r\n\t\r\n\t// .u-black {\r\n\t// \tbackground: #585858;\r\n\t// \tcolor: #fff;\r\n\t// }\r\n\t\r\n\t.u-info {\r\n\t\tbackground: $u-type-info;\r\n\t\tcolor: #fff;\r\n\t}\r\n</style>"
  },
  {
    "path": "uview-ui/components/u-button/u-button.vue",
    "content": "<template>\r\n\t<button\r\n\t\tid=\"u-wave-btn\"\r\n\t\tclass=\"u-btn u-line-1 u-fix-ios-appearance\"\r\n\t\t:class=\"[\r\n\t\t\t'u-size-' + size,\r\n\t\t\tplain ? 'u-btn--' + type + '--plain' : '',\r\n\t\t\tloading ? 'u-loading' : '',\r\n\t\t\tshape == 'circle' ? 'u-round-circle' : '',\r\n\t\t\thairLine ? showHairLineBorder : 'u-btn--bold-border',\r\n\t\t\t'u-btn--' + type,\r\n\t\t\tdisabled ? `u-btn--${type}--disabled` : '',\r\n\t\t\t\r\n\t\t]\"\r\n\t\t:disabled=\"disabled\"\r\n\t\t:form-type=\"formType\"\r\n\t\t:open-type=\"openType\"\r\n\t\t:app-parameter=\"appParameter\"\r\n\t\t:hover-stop-propagation=\"hoverStopPropagation\"\r\n\t\t:send-message-title=\"sendMessageTitle\"\r\n\t\tsend-message-path=\"sendMessagePath\"\r\n\t\t:lang=\"lang\"\r\n\t\t:data-name=\"dataName\"\r\n\t\t:session-from=\"sessionFrom\"\r\n\t\t:send-message-img=\"sendMessageImg\"\r\n\t\t:show-message-card=\"showMessageCard\"\r\n\t\t@getphonenumber=\"getphonenumber\"\r\n\t\t@getuserinfo=\"getuserinfo\"\r\n\t\t@error=\"error\"\r\n\t\t@opensetting=\"opensetting\"\r\n\t\t@launchapp=\"launchapp\"\r\n\t\t:style=\"[customStyle]\"\r\n\t\t@tap.stop=\"click($event)\"\r\n\t\t:hover-class=\"getHoverClass\"\r\n\t\t:loading=\"loading\"\r\n\t>\r\n\t\t<slot></slot>\r\n\t\t<view\r\n\t\t\tv-if=\"ripple\"\r\n\t\t\tclass=\"u-wave-ripple\"\r\n\t\t\t:class=\"[waveActive ? 'u-wave-active' : '']\"\r\n\t\t\t:style=\"{\r\n\t\t\t\ttop: rippleTop + 'px',\r\n\t\t\t\tleft: rippleLeft + 'px',\r\n\t\t\t\twidth: fields.targetWidth + 'px',\r\n\t\t\t\theight: fields.targetWidth + 'px',\r\n\t\t\t\t'background-color': rippleBgColor || 'rgba(0, 0, 0, 0.15)'\r\n\t\t\t}\"\r\n\t\t></view>\r\n\t</button>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * button 按钮\r\n * @description Button 按钮\r\n * @tutorial https://www.uviewui.com/components/button.html\r\n * @property {String} size 按钮的大小\r\n * @property {Boolean} ripple 是否开启点击水波纹效果\r\n * @property {String} ripple-bg-color 水波纹的背景色，ripple为true时有效\r\n * @property {String} type 按钮的样式类型\r\n * @property {Boolean} plain 按钮是否镂空，背景色透明\r\n * @property {Boolean} disabled 是否禁用\r\n * @property {Boolean} hair-line 是否显示按钮的细边框(默认true)\r\n * @property {Boolean} shape 按钮外观形状，见文档说明\r\n * @property {Boolean} loading 按钮名称前是否带 loading 图标(App-nvue 平台，在 ios 上为雪花，Android上为圆圈)\r\n * @property {String} form-type 用于 <form> 组件，点击分别会触发 <form> 组件的 submit/reset 事件\r\n * @property {String} open-type 开放能力\r\n * @property {String} data-name 额外传参参数，用于小程序的data-xxx属性，通过target.dataset.name获取\r\n * @property {String} hover-class 指定按钮按下去的样式类。当 hover-class=\"none\" 时，没有点击态效果(App-nvue 平台暂不支持)\r\n * @property {Number} hover-start-time 按住后多久出现点击态，单位毫秒\r\n * @property {Number} hover-stay-time 手指松开后点击态保留时间，单位毫秒\r\n * @property {Object} custom-style 对按钮的自定义样式，对象形式，见文档说明\r\n * @event {Function} click 按钮点击\r\n * @event {Function} getphonenumber open-type=\"getPhoneNumber\"时有效\r\n * @event {Function} getuserinfo 用户点击该按钮时，会返回获取到的用户信息，从返回参数的detail中获取到的值同uni.getUserInfo\r\n * @event {Function} error 当使用开放能力时，发生错误的回调\r\n * @event {Function} opensetting 在打开授权设置页并关闭后回调\r\n * @event {Function} launchapp 打开 APP 成功的回调\r\n * @example <u-button>月落</u-button>\r\n */\r\nexport default {\r\n\tname: 'u-button',\r\n\tprops: {\r\n\t\t// 是否细边框\r\n\t\thairLine: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 按钮的预置样式，default，primary，error，warning，success\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'default'\r\n\t\t},\r\n\t\t// 按钮尺寸，default，medium，mini\r\n\t\tsize: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'default'\r\n\t\t},\r\n\t\t// 按钮形状，circle（两边为半圆），square（带圆角）\r\n\t\tshape: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'square'\r\n\t\t},\r\n\t\t// 按钮是否镂空\r\n\t\tplain: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否禁止状态\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否加载中\r\n\t\tloading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 开放能力，具体请看uniapp稳定关于button组件部分说明\r\n\t\t// https://uniapp.dcloud.io/component/button\r\n\t\topenType: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 用于 <form> 组件，点击分别会触发 <form> 组件的 submit/reset 事件\r\n\t\t// 取值为submit（提交表单），reset（重置表单）\r\n\t\tformType: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 打开 APP 时，向 APP 传递的参数，open-type=launchApp时有效\r\n\t\t// 只微信小程序、QQ小程序有效\r\n\t\tappParameter: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 指定是否阻止本节点的祖先节点出现点击态，微信小程序有效\r\n\t\thoverStopPropagation: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 指定返回用户信息的语言，zh_CN 简体中文，zh_TW 繁体中文，en 英文。只微信小程序有效\r\n\t\tlang: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'en'\r\n\t\t},\r\n\t\t// 会话来源，open-type=\"contact\"时有效。只微信小程序有效\r\n\t\tsessionFrom: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 会话内消息卡片标题，open-type=\"contact\"时有效\r\n\t\t// 默认当前标题，只微信小程序有效\r\n\t\tsendMessageTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 会话内消息卡片点击跳转小程序路径，open-type=\"contact\"时有效\r\n\t\t// 默认当前分享路径，只微信小程序有效\r\n\t\tsendMessagePath: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 会话内消息卡片图片，open-type=\"contact\"时有效\r\n\t\t// 默认当前页面截图，只微信小程序有效\r\n\t\tsendMessageImg: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否显示会话内消息卡片，设置此参数为 true，用户进入客服会话会在右下角显示\"可能要发送的小程序\"提示，\r\n\t\t// 用户点击后可以快速发送小程序消息，open-type=\"contact\"时有效\r\n\t\tshowMessageCard: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 手指按（触摸）按钮时按钮时的背景颜色\r\n\t\thoverBgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 水波纹的背景颜色\r\n\t\trippleBgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否开启水波纹效果\r\n\t\tripple: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 按下的类名\r\n\t\thoverClass: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 自定义样式，对象形式\r\n\t\tcustomStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 额外传参参数，用于小程序的data-xxx属性，通过target.dataset.name获取\r\n\t\tdataName: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 节流，一定时间内只能触发一次\r\n\t\tthrottleTime: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 1000\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\t// 当没有传bgColor变量时，按钮按下去的颜色类名\r\n\t\tgetHoverClass() {\r\n\t\t\t// 如果开启水波纹效果，则不启用hover-class效果\r\n\t\t\tif (this.loading || this.disabled || this.ripple || this.hoverClass) return '';\r\n\t\t\tlet hoverClass = '';\r\n\t\t\thoverClass = this.plain ? 'u-' + this.type + '-plain-hover' : 'u-' + this.type + '-hover';\r\n\t\t\treturn hoverClass;\r\n\t\t},\r\n\t\t// 在'primary', 'success', 'error', 'warning'类型下，不显示边框，否则会造成四角有毛刺现象\r\n\t\tshowHairLineBorder() {\r\n\t\t\tif (['primary', 'success', 'error', 'warning'].indexOf(this.type) >= 0 && !this.plain) {\r\n\t\t\t\treturn '';\r\n\t\t\t} else {\r\n\t\t\t\treturn 'u-hairline-border';\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\trippleTop: 0, // 水波纹的起点Y坐标到按钮上边界的距离\r\n\t\t\trippleLeft: 0, // 水波纹起点X坐标到按钮左边界的距离\r\n\t\t\tfields: {}, // 波纹按钮节点信息\r\n\t\t\twaveActive: false // 激活水波纹\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\t// 按钮点击\r\n\t\tclick(e) {\r\n\t\t\t// 进行节流控制，每this.throttle毫秒内，只在开始处执行\r\n\t\t\tthis.$u.throttle(() => {\r\n\t\t\t\t// 如果按钮时disabled和loading状态，不触发水波纹效果\r\n\t\t\t\tif (this.loading === true || this.disabled === true) return;\r\n\t\t\t\t// 是否开启水波纹效果\r\n\t\t\t\tif (this.ripple) {\r\n\t\t\t\t\t// 每次点击时，移除上一次的类，再次添加，才能触发动画效果\r\n\t\t\t\t\tthis.waveActive = false;\r\n\t\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\t\tthis.getWaveQuery(e);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tthis.$emit('click', e);\r\n\t\t\t}, this.throttleTime);\r\n\t\t},\r\n\t\t// 查询按钮的节点信息\r\n\t\tgetWaveQuery(e) {\r\n\t\t\tthis.getElQuery().then(res => {\r\n\t\t\t\t// 查询返回的是一个数组节点\r\n\t\t\t\tlet data = res[0];\r\n\t\t\t\t// 查询不到节点信息，不操作\r\n\t\t\t\tif (!data.width || !data.width) return;\r\n\t\t\t\t// 水波纹的最终形态是一个正方形(通过border-radius让其变为一个圆形)，这里要保证正方形的边长等于按钮的最长边\r\n\t\t\t\t// 最终的方形（变换后的圆形）才能覆盖整个按钮\r\n\t\t\t\tdata.targetWidth = data.height > data.width ? data.height : data.width;\r\n\t\t\t\tif (!data.targetWidth) return;\r\n\t\t\t\tthis.fields = data;\r\n\t\t\t\tlet touchesX = '',\r\n\t\t\t\t\ttouchesY = '';\r\n\t\t\t\t// #ifdef MP-BAIDU\r\n\t\t\t\ttouchesX = e.changedTouches[0].clientX;\r\n\t\t\t\ttouchesY = e.changedTouches[0].clientY;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef MP-ALIPAY\r\n\t\t\t\ttouchesX = e.detail.clientX;\r\n\t\t\t\ttouchesY = e.detail.clientY;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef MP-BAIDU || MP-ALIPAY\r\n\t\t\t\ttouchesX = e.touches[0].clientX;\r\n\t\t\t\ttouchesY = e.touches[0].clientY;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// 获取触摸点相对于按钮上边和左边的x和y坐标，原理是通过屏幕的触摸点（touchesY），减去按钮的上边界data.top\r\n\t\t\t\t// 但是由于`transform-origin`默认是center，所以这里再减去半径才是水波纹view应该的位置\r\n\t\t\t\t// 总的来说，就是把水波纹的矩形（变换后的圆形）的中心点，移动到我们的触摸点位置\r\n\t\t\t\tthis.rippleTop = touchesY - data.top - data.targetWidth / 2;\r\n\t\t\t\tthis.rippleLeft = touchesX - data.left - data.targetWidth / 2;\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.waveActive = true;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 获取节点信息\r\n\t\tgetElQuery() {\r\n\t\t\treturn new Promise(resolve => {\r\n\t\t\t\tlet queryInfo = '';\r\n\t\t\t\t// 获取元素节点信息，请查看uniapp相关文档\r\n\t\t\t\t// https://uniapp.dcloud.io/api/ui/nodes-info?id=nodesrefboundingclientrect\r\n\t\t\t\tqueryInfo = uni.createSelectorQuery().in(this);\r\n\t\t\t\t//#ifdef MP-ALIPAY\r\n\t\t\t\tqueryInfo = uni.createSelectorQuery();\r\n\t\t\t\t//#endif\r\n\t\t\t\tqueryInfo.select('.u-btn').boundingClientRect();\r\n\t\t\t\tqueryInfo.exec(data => {\r\n\t\t\t\t\tresolve(data);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 下面为对接uniapp官方按钮开放能力事件回调的对接\r\n\t\tgetphonenumber(res) {\r\n\t\t\tthis.$emit('getphonenumber', res);\r\n\t\t},\r\n\t\tgetuserinfo(res) {\r\n\t\t\tthis.$emit('getuserinfo', res);\r\n\t\t},\r\n\t\terror(res) {\r\n\t\t\tthis.$emit('error', res);\r\n\t\t},\r\n\t\topensetting(res) {\r\n\t\t\tthis.$emit('opensetting', res);\r\n\t\t},\r\n\t\tlaunchapp(res) {\r\n\t\t\tthis.$emit('launchapp', res);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import '../../libs/css/style.components.scss';\r\n.u-btn::after {\r\n\tborder: none;\r\n}\r\n\r\n.u-btn {\r\n\tposition: relative;\r\n\tborder: 0;\r\n\t//border-radius: 10rpx;\r\n\tdisplay: inline-block;\r\n\toverflow: hidden;\r\n\tline-height: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tcursor: pointer;\r\n\tpadding: 0 40rpx;\r\n\tz-index: 1;\r\n\tbox-sizing: border-box;\r\n\ttransition: all 0.15s;\r\n\t\r\n\t&--bold-border {\r\n\t\tborder: 1px solid #ffffff;\r\n\t}\r\n\t\r\n\t&--default {\r\n\t\tcolor: $u-content-color;\r\n\t\tborder-color: #c0c4cc;\r\n\t\tbackground-color: #ffffff;\r\n\t}\r\n\t\r\n\t&--primary {\r\n\t\tcolor: #ffffff;\r\n\t\tborder-color: $u-type-primary;\r\n\t\tbackground-color: $u-type-primary;\r\n\t}\r\n\t\r\n\t&--success {\r\n\t\tcolor: #ffffff;\r\n\t\tborder-color: $u-type-success;\r\n\t\tbackground-color: $u-type-success;\r\n\t}\r\n\t\r\n\t&--error {\r\n\t\tcolor: #ffffff;\r\n\t\tborder-color: $u-type-error;\r\n\t\tbackground-color: $u-type-error;\r\n\t}\r\n\t\r\n\t&--warning {\r\n\t\tcolor: #ffffff;\r\n\t\tborder-color: $u-type-warning;\r\n\t\tbackground-color: $u-type-warning;\r\n\t}\r\n\t\r\n\t&--default--disabled {\r\n\t\tcolor: #ffffff;\r\n\t\tborder-color: #e4e7ed;\r\n\t\tbackground-color: #ffffff;\r\n\t}\r\n\t\r\n\t&--primary--disabled {\r\n\t\tcolor: #ffffff!important;\r\n\t\tborder-color: $u-type-primary-disabled!important;\r\n\t\tbackground-color: $u-type-primary-disabled!important;\r\n\t}\r\n\t\r\n\t&--success--disabled {\r\n\t\tcolor: #ffffff!important;\r\n\t\tborder-color: $u-type-success-disabled!important;\r\n\t\tbackground-color: $u-type-success-disabled!important;\r\n\t}\r\n\t\r\n\t&--error--disabled {\r\n\t\tcolor: #ffffff!important;\r\n\t\tborder-color: $u-type-error-disabled!important;\r\n\t\tbackground-color: $u-type-error-disabled!important;\r\n\t}\r\n\t\r\n\t&--warning--disabled {\r\n\t\tcolor: #ffffff!important;\r\n\t\tborder-color: $u-type-warning-disabled!important;\r\n\t\tbackground-color: $u-type-warning-disabled!important;\r\n\t}\r\n\t\r\n\t&--primary--plain {\r\n\t\tcolor: $u-type-primary!important;\r\n\t\tborder-color: $u-type-primary-disabled!important;\r\n\t\tbackground-color: $u-type-primary-light!important;\r\n\t}\r\n\t\r\n\t&--success--plain {\r\n\t\tcolor: $u-type-success!important;\r\n\t\tborder-color: $u-type-success-disabled!important;\r\n\t\tbackground-color: $u-type-success-light!important;\r\n\t}\r\n\t\r\n\t&--error--plain {\r\n\t\tcolor: $u-type-error!important;\r\n\t\tborder-color: $u-type-error-disabled!important;\r\n\t\tbackground-color: $u-type-error-light!important;\r\n\t}\r\n\t\r\n\t&--warning--plain {\r\n\t\tcolor: $u-type-warning!important;\r\n\t\tborder-color: $u-type-warning-disabled!important;\r\n\t\tbackground-color: $u-type-warning-light!important;\r\n\t}\r\n}\r\n\r\n.u-hairline-border:after {\r\n\tcontent: ' ';\r\n\tposition: absolute;\r\n\tpointer-events: none;\r\n\t// 设置为border-box，意味着下面的scale缩小为0.5，实际上缩小的是伪元素的内容（border-box意味着内容不含border）\r\n\tbox-sizing: border-box;\r\n\t// 中心点作为变形(scale())的原点\r\n\t-webkit-transform-origin: 0 0;\r\n\ttransform-origin: 0 0;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\twidth: 199.8%;\r\n\theight: 199.7%;\r\n\t-webkit-transform: scale(0.5, 0.5);\r\n\ttransform: scale(0.5, 0.5);\r\n\tborder: 1px solid currentColor;\r\n\tz-index: 1;\r\n}\r\n\r\n.u-wave-ripple {\r\n\tz-index: 0;\r\n\tposition: absolute;\r\n\tborder-radius: 100%;\r\n\tbackground-clip: padding-box;\r\n\tpointer-events: none;\r\n\tuser-select: none;\r\n\ttransform: scale(0);\r\n\topacity: 1;\r\n\ttransform-origin: center;\r\n}\r\n\r\n.u-wave-ripple.u-wave-active {\r\n\topacity: 0;\r\n\ttransform: scale(2);\r\n\ttransition: opacity 1s linear, transform 0.4s linear;\r\n}\r\n\r\n.u-round-circle {\r\n\tborder-radius: 100rpx;\r\n}\r\n\r\n.u-round-circle::after {\r\n\tborder-radius: 100rpx;\r\n}\r\n\r\n.u-loading::after {\r\n\tbackground-color: hsla(0, 0%, 100%, 0.35);\r\n}\r\n\r\n.u-size-default {\r\n\tfont-size: 30rpx;\r\n\theight: 80rpx;\r\n\tline-height: 80rpx;\r\n}\r\n\r\n.u-size-medium {\r\n\tdisplay: inline-flex;\r\n\twidth: auto;\r\n\tfont-size: 26rpx;\r\n\theight: 70rpx;\r\n\tline-height: 70rpx;\r\n\tpadding: 0 80rpx;\r\n}\r\n\r\n.u-size-mini {\r\n\tdisplay: inline-flex;\r\n\twidth: auto;\r\n\tfont-size: 22rpx;\r\n\tpadding-top: 1px;\r\n\theight: 50rpx;\r\n\tline-height: 50rpx;\r\n\tpadding: 0 20rpx;\r\n}\r\n\r\n.u-primary-plain-hover {\r\n\tcolor: #ffffff !important;\r\n\tbackground: $u-type-primary-dark !important;\r\n}\r\n\r\n.u-default-plain-hover {\r\n\tcolor: $u-type-primary-dark !important;\r\n\tbackground: $u-type-primary-light !important;\r\n}\r\n\r\n.u-success-plain-hover {\r\n\tcolor: #ffffff !important;\r\n\tbackground: $u-type-success-dark !important;\r\n}\r\n\r\n.u-warning-plain-hover {\r\n\tcolor: #ffffff !important;\r\n\tbackground: $u-type-warning-dark !important;\r\n}\r\n\r\n.u-error-plain-hover {\r\n\tcolor: #ffffff !important;\r\n\tbackground: $u-type-error-dark !important;\r\n}\r\n\r\n.u-info-plain-hover {\r\n\tcolor: #ffffff !important;\r\n\tbackground: $u-type-info-dark !important;\r\n}\r\n\r\n.u-default-hover {\r\n\tcolor: $u-type-primary-dark !important;\r\n\tborder-color: $u-type-primary-dark !important;\r\n\tbackground-color: $u-type-primary-light !important;\r\n}\r\n\r\n.u-primary-hover {\r\n\tbackground: $u-type-primary-dark !important;\r\n\tcolor: #fff;\r\n}\r\n\r\n.u-success-hover {\r\n\tbackground: $u-type-success-dark !important;\r\n\tcolor: #fff;\r\n}\r\n\r\n.u-info-hover {\r\n\tbackground: $u-type-info-dark !important;\r\n\tcolor: #fff;\r\n}\r\n\r\n.u-warning-hover {\r\n\tbackground: $u-type-warning-dark !important;\r\n\tcolor: #fff;\r\n}\r\n\r\n.u-error-hover {\r\n\tbackground: $u-type-error-dark !important;\r\n\tcolor: #fff;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-calendar/u-calendar.vue",
    "content": "<template>\r\n\t<u-popup closeable :maskCloseAble=\"maskCloseAble\" mode=\"bottom\" :popup=\"false\" v-model=\"value\" length=\"auto\"\r\n\t :safeAreaInsetBottom=\"safeAreaInsetBottom\" @close=\"close\" :z-index=\"uZIndex\" :border-radius=\"borderRadius\" :closeable=\"closeable\">\r\n\t\t<view class=\"u-calendar\">\r\n\t\t\t<view class=\"u-calendar__header\">\r\n\t\t\t\t<view class=\"u-calendar__header__text\" v-if=\"!$slots['tooltip']\">\r\n\t\t\t\t\t{{toolTip}}\r\n\t\t\t\t</view>\r\n\t\t\t\t<slot v-else name=\"tooltip\" />\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-calendar__action u-flex u-row-center\">\r\n\t\t\t\t<view class=\"u-calendar__action__icon\">\r\n\t\t\t\t\t<u-icon v-if=\"changeYear\" name=\"arrow-left-double\" :color=\"yearArrowColor\" @click=\"changeYearHandler(0)\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-calendar__action__icon\">\r\n\t\t\t\t\t<u-icon v-if=\"changeMonth\" name=\"arrow-left\" :color=\"monthArrowColor\" @click=\"changeMonthHandler(0)\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-calendar__action__text\">{{ showTitle }}</view>\r\n\t\t\t\t<view class=\"u-calendar__action__icon\">\r\n\t\t\t\t\t<u-icon v-if=\"changeMonth\" name=\"arrow-right\" :color=\"monthArrowColor\" @click=\"changeMonthHandler(1)\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-calendar__action__icon\">\r\n\t\t\t\t\t<u-icon v-if=\"changeYear\" name=\"arrow-right-double\" :color=\"yearArrowColor\" @click=\"changeYearHandler(1)\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-calendar__week-day\">\r\n\t\t\t\t<view class=\"u-calendar__week-day__text\" v-for=\"(item, index) in weekDayZh\" :key=\"index\">{{item}}</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-calendar__content\">\r\n\t\t\t\t<!-- 前置空白部分 -->\r\n\t\t\t\t<block v-for=\"(item, index) in weekdayArr\" :key=\"index\">\r\n\t\t\t\t\t<view class=\"u-calendar__content__item\"></view>\r\n\t\t\t\t</block>\r\n\t\t\t\t<view class=\"u-calendar__content__item\" :class=\"{\r\n\t\t\t\t\t'u-hover-class':openDisAbled(year,month,index+1),\r\n\t\t\t\t\t'u-calendar__content--start-date': (mode == 'range' && startDate==`${year}-${month}-${index+1}`) || mode== 'date',\r\n\t\t\t\t\t'u-calendar__content--end-date':(mode== 'range' && endDate==`${year}-${month}-${index+1}`) || mode == 'date'\r\n\t\t\t\t}\" :style=\"{backgroundColor: getColor(index,1)}\" v-for=\"(item, index) in daysArr\" :key=\"index\"\r\n\t\t\t\t @tap=\"dateClick(index)\">\r\n\t\t\t\t\t<view class=\"u-calendar__content__item__inner\" :style=\"{color: getColor(index,2)}\">\r\n\t\t\t\t\t\t<view>{{ index + 1 }}</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"u-calendar__content__item__tips\" :style=\"{color:activeColor}\" v-if=\"mode== 'range' && startDate==`${year}-${month}-${index+1}` && startDate!=endDate\">{{startText}}</view>\r\n\t\t\t\t\t<view class=\"u-calendar__content__item__tips\" :style=\"{color:activeColor}\" v-if=\"mode== 'range' && endDate==`${year}-${month}-${index+1}`\">{{endText}}</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-calendar__content__bg-month\">{{month}}</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-calendar__bottom\">\r\n\t\t\t\t<view class=\"u-calendar__bottom__choose\">\r\n\t\t\t\t\t<text>{{mode == 'date' ? activeDate : startDate}}</text>\r\n\t\t\t\t\t<text v-if=\"endDate\">至{{endDate}}</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-calendar__bottom__btn\">\r\n\t\t\t\t\t<u-button :type=\"btnType\" shape=\"circle\" size=\"default\" @click=\"btnFix(false)\">确定</u-button>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</u-popup>\r\n</template>\r\n<script>\r\n\t/**\r\n\t * calendar 日历\r\n\t * @description 此组件用于单个选择日期，范围选择日期等，日历被包裹在底部弹起的容器中。\r\n\t * @tutorial http://uviewui.com/components/calendar.html\r\n\t * @property {String} mode 选择日期的模式，date-为单个日期，range-为选择日期范围\r\n\t * @property {Boolean} v-model 布尔值变量，用于控制日历的弹出与收起\r\n\t * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false)\r\n\t * @property {Boolean} change-year 是否显示顶部的切换年份方向的按钮(默认true)\r\n\t * @property {Boolean} change-month 是否显示顶部的切换月份方向的按钮(默认true)\r\n\t * @property {String Number} max-year 可切换的最大年份(默认2050)\r\n\t * @property {String Number} min-year 最小可选日期(默认1950)\r\n\t * @property {String Number} min-date 可切换的最小年份(默认1950-01-01)\r\n\t * @property {String Number} max-date 最大可选日期(默认当前日期)\r\n\t * @property {String Number} 弹窗顶部左右两边的圆角值，单位rpx(默认20)\r\n\t * @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭日历(默认true)\r\n\t * @property {String} month-arrow-color 月份切换按钮箭头颜色(默认#606266)\r\n\t * @property {String} year-arrow-color 年份切换按钮箭头颜色(默认#909399)\r\n\t * @property {String} color 日期字体的默认颜色(默认#303133)\r\n\t * @property {String} active-bg-color 起始/结束日期按钮的背景色(默认#2979ff)\r\n\t * @property {String Number} z-index 弹出时的z-index值(默认10075)\r\n\t * @property {String} active-color 起始/结束日期按钮的字体颜色(默认#ffffff)\r\n\t * @property {String} range-bg-color 起始/结束日期之间的区域的背景颜色(默认rgba(41,121,255,0.13))\r\n\t * @property {String} range-color 选择范围内字体颜色(默认#2979ff)\r\n\t * @property {String} start-text 起始日期底部的提示文字(默认 '开始')\r\n\t * @property {String} end-text 结束日期底部的提示文字(默认 '结束')\r\n\t * @property {String} btn-type 底部确定按钮的主题(默认 'primary')\r\n\t * @property {String} toolTip 顶部提示文字，如设置名为tooltip的slot，此参数将失效(默认 '选择日期')\r\n\t * @property {Boolean} closeable 是否显示右上角的关闭图标(默认true)\r\n\t * @example <u-calendar v-model=\"show\" :mode=\"mode\"></u-calendar>\r\n\t */\r\n\t\r\n\texport default {\r\n\t\tname: 'u-calendar',\r\n\t\tprops: {\r\n\t\t\tsafeAreaInsetBottom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否允许通过点击遮罩关闭Picker\r\n\t\t\tmaskCloseAble: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 通过双向绑定控制组件的弹出与收起\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 弹出的z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 是否允许切换年份\r\n\t\t\tchangeYear: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否允许切换月份\r\n\t\t\tchangeMonth: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// date-单个日期选择，range-开始日期+结束日期选择\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'date'\r\n\t\t\t},\r\n\t\t\t// 可切换的最大年份\r\n\t\t\tmaxYear: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 2050\r\n\t\t\t},\r\n\t\t\t// 可切换的最小年份\r\n\t\t\tminYear: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 1950\r\n\t\t\t},\r\n\t\t\t// 最小可选日期(不在范围内日期禁用不可选)\r\n\t\t\tminDate: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: '1950-01-01'\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * 最大可选日期\r\n\t\t\t * 默认最大值为今天，之后的日期不可选\r\n\t\t\t * 2030-12-31\r\n\t\t\t * */\r\n\t\t\tmaxDate: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 弹窗顶部左右两边的圆角值\r\n\t\t\tborderRadius: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 20\r\n\t\t\t},\r\n\t\t\t// 月份切换按钮箭头颜色\r\n\t\t\tmonthArrowColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 年份切换按钮箭头颜色\r\n\t\t\tyearArrowColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#909399'\r\n\t\t\t},\r\n\t\t\t// 默认日期字体颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#303133'\r\n\t\t\t},\r\n\t\t\t// 选中|起始结束日期背景色\r\n\t\t\tactiveBgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 选中|起始结束日期字体颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 范围内日期背景色\r\n\t\t\trangeBgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'rgba(41,121,255,0.13)'\r\n\t\t\t}, \r\n\t\t\t// 范围内日期字体颜色\r\n\t\t\trangeColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// mode=range时生效，起始日期自定义文案\r\n\t\t\tstartText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '开始'\r\n\t\t\t},\r\n\t\t\t// mode=range时生效，结束日期自定义文案\r\n\t\t\tendText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '结束'\r\n\t\t\t},\r\n\t\t\t//按钮样式类型\r\n\t\t\tbtnType: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'primary'\r\n\t\t\t},\r\n\t\t\t// 当前选中日期带选中效果\r\n\t\t\tisActiveCurrent: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 切换年月是否触发事件 mode=date时生效\r\n\t\t\tisChange: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否显示右上角的关闭图标\r\n\t\t\tcloseable: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 顶部的提示文字\r\n\t\t\ttoolTip: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '选择日期'\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t// 星期几,值为1-7\r\n\t\t\t\tweekday: 1, \r\n\t\t\t\tweekdayArr:[],\r\n\t\t\t\t// 当前月有多少天\r\n\t\t\t\tdays: 0, \r\n\t\t\t\tdaysArr:[],\r\n\t\t\t\tshowTitle: '',\r\n\t\t\t\tyear: 2020,\r\n\t\t\t\tmonth: 0,\r\n\t\t\t\tday: 0,\r\n\t\t\t\tstartYear: 0,\r\n\t\t\t\tstartMonth: 0,\r\n\t\t\t\tstartDay: 0,\r\n\t\t\t\tendYear: 0,\r\n\t\t\t\tendMonth: 0,\r\n\t\t\t\tendDay: 0,\r\n\t\t\t\ttoday: '',\r\n\t\t\t\tactiveDate: '',\r\n\t\t\t\tstartDate: '',\r\n\t\t\t\tendDate: '',\r\n\t\t\t\tisStart: true,\r\n\t\t\t\tmin: null,\r\n\t\t\t\tmax: null,\r\n\t\t\t\tweekDayZh: ['日', '一', '二', '三', '四', '五', '六']\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tdataChange() {\r\n\t\t\t\treturn `${this.mode}-${this.minDate}-${this.maxDate}`;\r\n\t\t\t},\r\n\t\t\tuZIndex() {\r\n\t\t\t\t// 如果用户有传递z-index值，优先使用\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tdataChange(val) {\r\n\t\t\t\tthis.init()\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\tthis.init()\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tgetColor(index, type) {\r\n\t\t\t\tlet color = type == 1 ? '' : this.color;\r\n\t\t\t\tlet day = index + 1\r\n\t\t\t\tlet date = `${this.year}-${this.month}-${day}`\r\n\t\t\t\tlet timestamp = new Date(date.replace(/\\-/g, '/')).getTime();\r\n\t\t\t\tlet start = this.startDate.replace(/\\-/g, '/')\r\n\t\t\t\tlet end = this.endDate.replace(/\\-/g, '/')\r\n\t\t\t\tif ((this.isActiveCurrent && this.activeDate == date) || this.startDate == date || this.endDate == date) {\r\n\t\t\t\t\tcolor = type == 1 ? this.activeBgColor : this.activeColor;\r\n\t\t\t\t} else if (this.endDate && timestamp > new Date(start).getTime() && timestamp < new Date(end).getTime()) {\r\n\t\t\t\t\tcolor = type == 1 ? this.rangeBgColor : this.rangeColor;\r\n\t\t\t\t}\r\n\t\t\t\treturn color;\r\n\t\t\t},\r\n\t\t\tinit() {\r\n\t\t\t\tlet now = new Date();\r\n\t\t\t\tthis.year = now.getFullYear();\r\n\t\t\t\tthis.month = now.getMonth() + 1;\r\n\t\t\t\tthis.day = now.getDate();\r\n\t\t\t\tthis.today = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;\r\n\t\t\t\tthis.activeDate = this.today;\r\n\t\t\t\tthis.min = this.initDate(this.minDate);\r\n\t\t\t\tthis.max = this.initDate(this.maxDate || this.today);\r\n\t\t\t\tthis.startDate = \"\";\r\n\t\t\t\tthis.startYear = 0;\r\n\t\t\t\tthis.startMonth = 0;\r\n\t\t\t\tthis.startDay = 0;\r\n\t\t\t\tthis.endYear = 0;\r\n\t\t\t\tthis.endMonth = 0;\r\n\t\t\t\tthis.endDay = 0;\r\n\t\t\t\tthis.endDate = \"\";\r\n\t\t\t\tthis.isStart = true;\r\n\t\t\t\tthis.changeData();\r\n\t\t\t},\r\n\t\t\t//日期处理\r\n\t\t\tinitDate(date) {\r\n\t\t\t\tlet fdate = date.split('-');\r\n\t\t\t\treturn {\r\n\t\t\t\t\tyear: Number(fdate[0] || 1920),\r\n\t\t\t\t\tmonth: Number(fdate[1] || 1),\r\n\t\t\t\t\tday: Number(fdate[2] || 1)\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\topenDisAbled: function(year, month, day) {\r\n\t\t\t\tlet bool = true;\r\n\t\t\t\tlet date = `${year}/${month}/${day}`;\r\n\t\t\t\t// let today = this.today.replace(/\\-/g, '/');\r\n\t\t\t\tlet min = `${this.min.year}/${this.min.month}/${this.min.day}`;\r\n\t\t\t\tlet max = `${this.max.year}/${this.max.month}/${this.max.day}`;\r\n\t\t\t\tlet timestamp = new Date(date).getTime();\r\n\t\t\t\tif (timestamp >= new Date(min).getTime() && timestamp <= new Date(max).getTime()) {\r\n\t\t\t\t\tbool = false;\r\n\t\t\t\t}\r\n\t\t\t\treturn bool;\r\n\t\t\t},\r\n\t\t\tgenerateArray: function(start, end) {\r\n\t\t\t\treturn Array.from(new Array(end + 1).keys()).slice(start);\r\n\t\t\t},\r\n\t\t\tformatNum: function(num) {\r\n\t\t\t\treturn num < 10 ? '0' + num : num + '';\r\n\t\t\t},\r\n\t\t\t//一个月有多少天\r\n\t\t\tgetMonthDay(year, month) {\r\n\t\t\t\tlet days = new Date(year, month, 0).getDate();\r\n\t\t\t\treturn days;\r\n\t\t\t},\r\n\t\t\tgetWeekday(year, month) {\r\n\t\t\t\tlet date = new Date(`${year}/${month}/01 00:00:00`);\r\n\t\t\t\treturn date.getDay();\r\n\t\t\t},\r\n\t\t\tcheckRange(year) {\r\n\t\t\t\tlet overstep = false;\r\n\t\t\t\tif (year < this.minYear || year > this.maxYear) {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: \"日期超出范围啦~\",\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t})\r\n\t\t\t\t\toverstep = true;\r\n\t\t\t\t}\r\n\t\t\t\treturn overstep;\r\n\t\t\t},\r\n\t\t\tchangeMonthHandler(isAdd) {\r\n\t\t\t\tif (isAdd) {\r\n\t\t\t\t\tlet month = this.month + 1;\r\n\t\t\t\t\tlet year = month > 12 ? this.year + 1 : this.year;\r\n\t\t\t\t\tif (!this.checkRange(year)) {\r\n\t\t\t\t\t\tthis.month = month > 12 ? 1 : month;\r\n\t\t\t\t\t\tthis.year = year;\r\n\t\t\t\t\t\tthis.changeData();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlet month = this.month - 1;\r\n\t\t\t\t\tlet year = month < 1 ? this.year - 1 : this.year;\r\n\t\t\t\t\tif (!this.checkRange(year)) {\r\n\t\t\t\t\t\tthis.month = month < 1 ? 12 : month;\r\n\t\t\t\t\t\tthis.year = year;\r\n\t\t\t\t\t\tthis.changeData();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tchangeYearHandler(isAdd) {\r\n\t\t\t\tlet year = isAdd ? this.year + 1 : this.year - 1;\r\n\t\t\t\tif (!this.checkRange(year)) {\r\n\t\t\t\t\tthis.year = year;\r\n\t\t\t\t\tthis.changeData();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tchangeData() {\r\n\t\t\t\tthis.days = this.getMonthDay(this.year, this.month);\r\n\t\t\t\tthis.daysArr=this.generateArray(1,this.days)\r\n\t\t\t\tthis.weekday = this.getWeekday(this.year, this.month);\r\n\t\t\t\tthis.weekdayArr=this.generateArray(1,this.weekday)\r\n\t\t\t\tthis.showTitle = `${this.year}年${this.month}月`;\r\n\t\t\t\tif (this.isChange && this.mode == 'date') {\r\n\t\t\t\t\tthis.btnFix(true);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tdateClick: function(day) {\r\n\t\t\t\tday += 1;\r\n\t\t\t\tif (!this.openDisAbled(this.year, this.month, day)) {\r\n\t\t\t\t\tthis.day = day;\r\n\t\t\t\t\tlet date = `${this.year}-${this.month}-${day}`;\r\n\t\t\t\t\tif (this.mode == 'date') {\r\n\t\t\t\t\t\tthis.activeDate = date;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tlet compare = new Date(date.replace(/\\-/g, '/')).getTime() < new Date(this.startDate.replace(/\\-/g, '/')).getTime()\r\n\t\t\t\t\t\tif (this.isStart || compare) {\r\n\t\t\t\t\t\t\tthis.startDate = date;\r\n\t\t\t\t\t\t\tthis.startYear = this.year;\r\n\t\t\t\t\t\t\tthis.startMonth = this.month;\r\n\t\t\t\t\t\t\tthis.startDay = this.day;\r\n\t\t\t\t\t\t\tthis.endYear = 0;\r\n\t\t\t\t\t\t\tthis.endMonth = 0;\r\n\t\t\t\t\t\t\tthis.endDay = 0;\r\n\t\t\t\t\t\t\tthis.endDate = \"\";\r\n\t\t\t\t\t\t\tthis.activeDate = \"\";\r\n\t\t\t\t\t\t\tthis.isStart = false;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.endDate = date;\r\n\t\t\t\t\t\t\tthis.endYear = this.year;\r\n\t\t\t\t\t\t\tthis.endMonth = this.month;\r\n\t\t\t\t\t\t\tthis.endDay = this.day;\r\n\t\t\t\t\t\t\tthis.isStart = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tclose() {\r\n\t\t\t\t// 修改通过v-model绑定的父组件变量的值为false，从而隐藏日历弹窗\r\n\t\t\t\tthis.$emit('input', false);\r\n\t\t\t},\r\n\t\t\tgetWeekText(date) {\r\n\t\t\t\tdate = new Date(`${date.replace(/\\-/g, '/')} 00:00:00`);\r\n\t\t\t\tlet week = date.getDay();\r\n\t\t\t\treturn '星期' + ['日', '一', '二', '三', '四', '五', '六'][week];\r\n\t\t\t},\r\n\t\t\tbtnFix(show) {\r\n\t\t\t\tif (!show) {\r\n\t\t\t\t\tthis.close();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.mode == 'date') {\r\n\t\t\t\t\tlet arr = this.activeDate.split('-')\r\n\t\t\t\t\tlet year = this.isChange ? this.year : Number(arr[0]);\r\n\t\t\t\t\tlet month = this.isChange ? this.month : Number(arr[1]);\r\n\t\t\t\t\tlet day = this.isChange ? this.day : Number(arr[2]);\r\n\t\t\t\t\t//当前月有多少天\r\n\t\t\t\t\tlet days = this.getMonthDay(year, month);\r\n\t\t\t\t\tlet result = `${year}-${this.formatNum(month)}-${this.formatNum(day)}`;\r\n\t\t\t\t\tlet weekText = this.getWeekText(result);\r\n\t\t\t\t\tlet isToday = false;\r\n\t\t\t\t\tif (`${year}-${month}-${day}` == this.today) {\r\n\t\t\t\t\t\t//今天\r\n\t\t\t\t\t\tisToday = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.$emit('change', {\r\n\t\t\t\t\t\tyear: year,\r\n\t\t\t\t\t\tmonth: month,\r\n\t\t\t\t\t\tday: day,\r\n\t\t\t\t\t\tdays: days,\r\n\t\t\t\t\t\tresult: result,\r\n\t\t\t\t\t\tweek: weekText,\r\n\t\t\t\t\t\tisToday: isToday,\r\n\t\t\t\t\t\t// switch: show //是否是切换年月操作\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (!this.startDate || !this.endDate) return;\r\n\t\t\t\t\tlet startMonth = this.formatNum(this.startMonth);\r\n\t\t\t\t\tlet startDay = this.formatNum(this.startDay);\r\n\t\t\t\t\tlet startDate = `${this.startYear}-${startMonth}-${startDay}`;\r\n\t\t\t\t\tlet startWeek = this.getWeekText(startDate)\r\n\r\n\t\t\t\t\tlet endMonth = this.formatNum(this.endMonth);\r\n\t\t\t\t\tlet endDay = this.formatNum(this.endDay);\r\n\t\t\t\t\tlet endDate = `${this.endYear}-${endMonth}-${endDay}`;\r\n\t\t\t\t\tlet endWeek = this.getWeekText(endDate);\r\n\t\t\t\t\tthis.$emit('change', {\r\n\t\t\t\t\t\tstartYear: this.startYear,\r\n\t\t\t\t\t\tstartMonth: this.startMonth,\r\n\t\t\t\t\t\tstartDay: this.startDay,\r\n\t\t\t\t\t\tstartDate: startDate,\r\n\t\t\t\t\t\tstartWeek: startWeek,\r\n\t\t\t\t\t\tendYear: this.endYear,\r\n\t\t\t\t\t\tendMonth: this.endMonth,\r\n\t\t\t\t\t\tendDay: this.endDay,\r\n\t\t\t\t\t\tendDate: endDate,\r\n\t\t\t\t\t\tendWeek: endWeek\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-calendar {\r\n\t\tcolor: $u-content-color;\r\n\t\t\r\n\t\t&__header {\r\n\t\t\twidth: 100%;\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\tfont-size: 30rpx;\r\n\t\t\tbackground-color: #fff;\r\n\t\t\tcolor: $u-main-color;\r\n\t\t\t\r\n\t\t\t&__text {\r\n\t\t\t\tmargin-top: 30rpx;\r\n\t\t\t\tpadding: 0 60rpx;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\tjustify-content: center;\r\n\t\t\t\talign-items: center;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t&__action {\r\n\t\t\tpadding: 40rpx 0 40rpx 0;\r\n\t\t\t\r\n\t\t\t&__icon {\r\n\t\t\t\tmargin: 0 16rpx;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&__text {\r\n\t\t\t\tpadding: 0 16rpx;\r\n\t\t\t\tcolor: $u-main-color;\r\n\t\t\t\tfont-size: 32rpx;\r\n\t\t\t\tline-height: 32rpx;\r\n\t\t\t\tfont-weight: bold;\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t&__week-day {\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tjustify-content: center;\r\n\t\t\tpadding: 6px 0;\r\n\t\t\toverflow: hidden;\r\n\t\t\t\r\n\t\t\t&__text {\r\n\t\t\t\tflex: 1;\r\n\t\t\t\ttext-align: center;\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t&__content {\r\n\t\t\twidth: 100%;\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-wrap: wrap;\r\n\t\t\tpadding: 6px 0;\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\tbackground-color: #fff;\r\n\t\t\tposition: relative;\r\n\t\t\t\r\n\t\t\t&--end-date {\r\n\t\t\t\tborder-top-right-radius: 8rpx;\r\n\t\t\t\tborder-bottom-right-radius: 8rpx;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--start-date {\r\n\t\t\t\tborder-top-left-radius: 8rpx;\r\n\t\t\t\tborder-bottom-left-radius: 8rpx;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&__item {\r\n\t\t\t\twidth: 14.2857%;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tjustify-content: center;\r\n\t\t\t\tpadding: 6px 0;\r\n\t\t\t\toverflow: hidden;\r\n\t\t\t\tposition: relative;\r\n\t\t\t\tz-index: 2;\r\n\t\t\t\t\r\n\t\t\t\t&__inner {\r\n\t\t\t\t\theight: 84rpx;\r\n\t\t\t\t\tdisplay: -webkit-box;\r\n\t\t\t\t\tdisplay: -webkit-flex;\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\tjustify-content: center;\r\n\t\t\t\t\tflex-direction: column;\r\n\t\t\t\t\tfont-size: 32rpx;\r\n\t\t\t\t\tposition: relative;\r\n\t\t\t\t\tborder-radius: 50%;\r\n\t\t\t\t\t\r\n\t\t\t\t\t&__desc {\r\n\t\t\t\t\t\twidth: 100%;\r\n\t\t\t\t\t\tfont-size: 24rpx;\r\n\t\t\t\t\t\tline-height: 24rpx;\r\n\t\t\t\t\t\ttransform: scale(0.75);\r\n\t\t\t\t\t\ttransform-origin: center center;\r\n\t\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\t\tleft: 0;\r\n\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\tbottom: 2rpx;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t&__tips {\r\n\t\t\t\t\twidth: 100%;\r\n\t\t\t\t\tfont-size: 24rpx;\r\n\t\t\t\t\tline-height: 24rpx;\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tleft: 0;\r\n\t\t\t\t\ttransform: scale(0.8);\r\n\t\t\t\t\ttransform-origin: center center;\r\n\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\tbottom: 8rpx;\r\n\t\t\t\t\tz-index: 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&__bg-month {\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\tfont-size: 130px;\r\n\t\t\t\tline-height: 130px;\r\n\t\t\t\tleft: 50%;\r\n\t\t\t\ttop: 50%;\r\n\t\t\t\ttransform: translate(-50%, -50%);\r\n\t\t\t\tcolor: #e4e7ed;\r\n\t\t\t\tz-index: 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t&__bottom {\r\n\t\t\twidth: 100%;\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tjustify-content: center;\r\n\t\t\tflex-direction: column;\r\n\t\t\tbackground-color: #fff;\r\n\t\t\tpadding: 0 40rpx 30rpx;\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\tfont-size: 24rpx;\r\n\t\t\tcolor: $u-tips-color;\r\n\t\t\t\r\n\t\t\t&__choose {\r\n\t\t\t\theight: 50rpx;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&__btn {\r\n\t\t\t\twidth: 100%;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>"
  },
  {
    "path": "uview-ui/components/u-car-keyboard/u-car-keyboard.vue",
    "content": "<template>\r\n\t<view class=\"u-keyboard\" @touchmove.stop.prevent>\r\n\t\t<view class=\"u-keyboard-grids\">\r\n\t\t\t<block>\r\n\t\t\t\t<view class=\"u-keyboard-grids-item\" v-for=\"(group, i) in abc ? EngKeyBoardList : areaList\" :key=\"i\">\r\n\t\t\t\t\t<view :hover-stay-time=\"100\" @tap=\"carInputClick(i, j)\" hover-class=\"u-carinput-hover\" class=\"u-keyboard-grids-btn\"\r\n\t\t\t\t\t v-for=\"(item, j) in group\" :key=\"j\">\r\n\t\t\t\t\t\t{{ item }}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view @touchstart=\"backspaceClick\" @touchend=\"clearTimer\" :hover-stay-time=\"100\" class=\"u-keyboard-back\"\r\n\t\t\t\t hover-class=\"u-hover-class\">\r\n\t\t\t\t\t<u-icon :size=\"38\" name=\"backspace\" :bold=\"true\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view :hover-stay-time=\"100\" class=\"u-keyboard-change\" hover-class=\"u-carinput-hover\" @tap=\"changeCarInputMode\">\r\n\t\t\t\t\t<text class=\"zh\" :class=\"[!abc ? 'active' : 'inactive']\">中</text>\r\n\t\t\t\t\t/\r\n\t\t\t\t\t<text class=\"en\" :class=\"[abc ? 'active' : 'inactive']\">英</text>\r\n\t\t\t\t</view>\r\n\t\t\t</block>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tname: \"u-keyboard\",\r\n\t\tprops: {\r\n\t\t\t// 是否打乱键盘按键的顺序\r\n\t\t\trandom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t// 车牌输入时，abc=true为输入车牌号码，bac=false为输入省份中文简称\r\n\t\t\t\tabc: false\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tareaList() {\r\n\t\t\t\tlet data = [\r\n\t\t\t\t\t'京',\r\n\t\t\t\t\t'沪',\r\n\t\t\t\t\t'粤',\r\n\t\t\t\t\t'津',\r\n\t\t\t\t\t'冀',\r\n\t\t\t\t\t'豫',\r\n\t\t\t\t\t'云',\r\n\t\t\t\t\t'辽',\r\n\t\t\t\t\t'黑',\r\n\t\t\t\t\t'湘',\r\n\t\t\t\t\t'皖',\r\n\t\t\t\t\t'鲁',\r\n\t\t\t\t\t'苏',\r\n\t\t\t\t\t'浙',\r\n\t\t\t\t\t'赣',\r\n\t\t\t\t\t'鄂',\r\n\t\t\t\t\t'桂',\r\n\t\t\t\t\t'甘',\r\n\t\t\t\t\t'晋',\r\n\t\t\t\t\t'陕',\r\n\t\t\t\t\t'蒙',\r\n\t\t\t\t\t'吉',\r\n\t\t\t\t\t'闽',\r\n\t\t\t\t\t'贵',\r\n\t\t\t\t\t'渝',\r\n\t\t\t\t\t'川',\r\n\t\t\t\t\t'青',\r\n\t\t\t\t\t'琼',\r\n\t\t\t\t\t'宁',\r\n\t\t\t\t\t'挂',\r\n\t\t\t\t\t'藏',\r\n\t\t\t\t\t'港',\r\n\t\t\t\t\t'澳',\r\n\t\t\t\t\t'新',\r\n\t\t\t\t\t'使',\r\n\t\t\t\t\t'学'\r\n\t\t\t\t];\r\n\t\t\t\tlet tmp = [];\r\n\t\t\t\t// 打乱顺序\r\n\t\t\t\tif (this.random) data = this.$u.randomArray(data);\r\n\t\t\t\t// 切割成二维数组\r\n\t\t\t\ttmp[0] = data.slice(0, 10);\r\n\t\t\t\ttmp[1] = data.slice(10, 20);\r\n\t\t\t\ttmp[2] = data.slice(20, 30);\r\n\t\t\t\ttmp[3] = data.slice(30, 36);\r\n\t\t\t\treturn tmp;\r\n\t\t\t},\r\n\t\t\tEngKeyBoardList() {\r\n\t\t\t\tlet data = [\r\n\t\t\t\t\t1,\r\n\t\t\t\t\t2,\r\n\t\t\t\t\t3,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\t5,\r\n\t\t\t\t\t6,\r\n\t\t\t\t\t7,\r\n\t\t\t\t\t8,\r\n\t\t\t\t\t9,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\t'Q',\r\n\t\t\t\t\t'W',\r\n\t\t\t\t\t'E',\r\n\t\t\t\t\t'R',\r\n\t\t\t\t\t'T',\r\n\t\t\t\t\t'Y',\r\n\t\t\t\t\t'U',\r\n\t\t\t\t\t'I',\r\n\t\t\t\t\t'O',\r\n\t\t\t\t\t'P',\r\n\t\t\t\t\t'A',\r\n\t\t\t\t\t'S',\r\n\t\t\t\t\t'D',\r\n\t\t\t\t\t'F',\r\n\t\t\t\t\t'G',\r\n\t\t\t\t\t'H',\r\n\t\t\t\t\t'J',\r\n\t\t\t\t\t'K',\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\t'Z',\r\n\t\t\t\t\t'X',\r\n\t\t\t\t\t'C',\r\n\t\t\t\t\t'V',\r\n\t\t\t\t\t'B',\r\n\t\t\t\t\t'N',\r\n\t\t\t\t\t'M'\r\n\t\t\t\t];\r\n\t\t\t\tlet tmp = [];\r\n\t\t\t\tif (this.random) data = this.$u.randomArray(data);\r\n\t\t\t\ttmp[0] = data.slice(0, 10);\r\n\t\t\t\ttmp[1] = data.slice(10, 20);\r\n\t\t\t\ttmp[2] = data.slice(20, 30);\r\n\t\t\t\ttmp[3] = data.slice(30, 36);\r\n\t\t\t\treturn tmp;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 点击键盘按钮\r\n\t\t\tcarInputClick(i, j) {\r\n\t\t\t\tlet value = '';\r\n\t\t\t\t// 不同模式，获取不同数组的值\r\n\t\t\t\tif (this.abc) value = this.EngKeyBoardList[i][j];\r\n\t\t\t\telse value = this.areaList[i][j];\r\n\t\t\t\tthis.$emit('change', value);\r\n\t\t\t},\r\n\t\t\t// 修改汽车牌键盘的输入模式，中文|英文\r\n\t\t\tchangeCarInputMode() {\r\n\t\t\t\tthis.abc = !this.abc;\r\n\t\t\t},\r\n\t\t\t// 点击退格键\r\n\t\t\tbackspaceClick() {\r\n\t\t\t\tthis.$emit('backspace');\r\n\t\t\t\tclearInterval(this.timer); //再次清空定时器，防止重复注册定时器\r\n\t\t\t\tthis.timer = null;\r\n\t\t\t\tthis.timer = setInterval(() => {\r\n\t\t\t\t\tthis.$emit('backspace');\r\n\t\t\t\t}, 250);\r\n\t\t\t},\r\n\t\t\tclearTimer() {\r\n\t\t\t\tclearInterval(this.timer);\r\n\t\t\t\tthis.timer = null;\r\n\t\t\t},\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-keyboard-grids {\r\n\t\tbackground: rgb(215, 215, 217);\r\n\t\tpadding: 24rpx 0;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-keyboard-grids-item {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t.u-keyboard-grids-btn {\r\n\t\ttext-decoration: none;\r\n\t\twidth: 62rpx;\r\n\t\tflex: 0 0 64rpx;\r\n\t\theight: 80rpx;\r\n\t\tdisplay: inline-block;\r\n\t\tfont-size: 36rpx;\r\n\t\ttext-align: center;\r\n\t\tline-height: 80rpx;\r\n\t\tbackground-color: #fff;\r\n\t\tmargin: 8rpx 5rpx;\r\n\t\tborder-radius: 8rpx;\r\n\t\tbox-shadow: 0 2rpx 0rpx #888992;\r\n\t\tfont-weight: 500;\r\n\t}\r\n\r\n\t.u-carinput-hover {\r\n\t\tbackground-color: rgb(185, 188, 195) !important;\r\n\t}\r\n\r\n\t.u-keyboard-back {\r\n\t\tposition: absolute;\r\n\t\twidth: 96rpx;\r\n\t\tright: 22rpx;\r\n\t\tbottom: 32rpx;\r\n\t\theight: 80rpx;\r\n\t\tbackground-color: rgb(185, 188, 195);\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tborder-radius: 8rpx;\r\n\t\tjustify-content: center;\r\n\t\tbox-shadow: 0 2rpx 0rpx #888992;\r\n\t}\r\n\r\n\t.u-keyboard-change {\r\n\t\tfont-size: 24rpx;\r\n\t\tbox-shadow: 0 2rpx 0rpx #888992;\r\n\t\tposition: absolute;\r\n\t\twidth: 96rpx;\r\n\t\tleft: 22rpx;\r\n\t\tline-height: 1;\r\n\t\tbottom: 32rpx;\r\n\t\theight: 80rpx;\r\n\t\tbackground-color: #ffffff;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tborder-radius: 8rpx;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t.u-keyboard-change .inactive.zh {\r\n\t\ttransform: scale(0.85) translateY(-10rpx);\r\n\t}\r\n\r\n\t.u-keyboard-change .inactive.en {\r\n\t\ttransform: scale(0.85) translateY(10rpx);\r\n\t}\r\n\r\n\t.u-keyboard-change .active {\r\n\t\tcolor: rgb(237, 112, 64);\r\n\t\tfont-size: 30rpx;\r\n\t}\r\n\r\n\t.u-keyboard-change .zh {\r\n\t\ttransform: translateY(-10rpx);\r\n\t}\r\n\r\n\t.u-keyboard-change .en {\r\n\t\ttransform: translateY(10rpx);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-card/u-card.vue",
    "content": "<template>\r\n\t<view\r\n\t\tclass=\"u-card\"\r\n\t\t@tap.stop=\"click\"\r\n\t\t:class=\"{ 'u-border': border, 'u-card-full': full, 'u-card--border': borderRadius > 0 }\"\r\n\t\t:style=\"{\r\n\t\t\tborderRadius: borderRadius + 'rpx',\r\n\t\t\tmargin: margin\r\n\t\t}\"\r\n\t>\r\n\t\t<view\r\n\t\t\tv-if=\"showHead\"\r\n\t\t\tclass=\"u-card__head\"\r\n\t\t\t:style=\"[{padding: padding + 'rpx'}, headStyle]\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t'u-border-bottom': headBorderBottom\r\n\t\t\t}\"\r\n\t\t\t@tap=\"headClick\"\r\n\t\t>\r\n\t\t\t<view v-if=\"!$slots.head\" class=\"u-flex u-row-between\">\r\n\t\t\t\t<view class=\"u-card__head--left u-flex u-line-1\" v-if=\"title\">\r\n\t\t\t\t\t<image\r\n\t\t\t\t\t\t:src=\"thumb\"\r\n\t\t\t\t\t\tclass=\"u-card__head--left__thumb\"\r\n\t\t\t\t\t\tmode=\"aspectfull\"\r\n\t\t\t\t\t\tv-if=\"thumb\"\r\n\t\t\t\t\t\t:style=\"{ \r\n\t\t\t\t\t\t\theight: thumbWidth + 'rpx', \r\n\t\t\t\t\t\t\twidth: thumbWidth + 'rpx', \r\n\t\t\t\t\t\t\tborderRadius: thumbCircle ? '100rpx' : '6rpx' \r\n\t\t\t\t\t\t}\"\r\n\t\t\t\t\t></image>\r\n\t\t\t\t\t<text\r\n\t\t\t\t\t\tclass=\"u-card__head--left__title u-line-1\"\r\n\t\t\t\t\t\t:style=\"{\r\n\t\t\t\t\t\t\tfontSize: titleSize + 'rpx',\r\n\t\t\t\t\t\t\tcolor: titleColor\r\n\t\t\t\t\t\t}\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ title }}\r\n\t\t\t\t\t</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-card__head--right u-line-1\" v-if=\"subTitle\">\r\n\t\t\t\t\t<text\r\n\t\t\t\t\t\tclass=\"u-card__head__title__text\"\r\n\t\t\t\t\t\t:style=\"{\r\n\t\t\t\t\t\t\tfontSize: subTitleSize + 'rpx',\r\n\t\t\t\t\t\t\tcolor: subTitleColor\r\n\t\t\t\t\t\t}\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ subTitle }}\r\n\t\t\t\t\t</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<slot name=\"head\" v-else />\r\n\t\t</view>\r\n\t\t<view @tap=\"bodyClick\" class=\"u-card__body\" :style=\"[{padding: padding + 'rpx'}, bodyStyle]\"><slot name=\"body\" /></view>\r\n\t\t<view\r\n\t\t\tv-if=\"showFoot\"\r\n\t\t\tclass=\"u-card__foot\"\r\n\t\t\t @tap=\"footClick\"\r\n\t\t\t:style=\"[{padding: $slots.foot ? padding + 'rpx' : 0}, footStyle]\"\r\n\t\t\t:class=\"{\r\n\t\t\t\t'u-border-top': footBorderTop\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<slot name=\"foot\" />\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * card 卡片\r\n * @description 卡片组件一般用于多个列表条目，且风格统一的场景\r\n * @tutorial https://www.uviewui.com/components/line.html\r\n * @property {Boolean} full 卡片与屏幕两侧是否留空隙（默认false）\r\n * @property {String} title 头部左边的标题\r\n * @property {String} title-color 标题颜色（默认#303133）\r\n * @property {String | Number} title-size 标题字体大小，单位rpx（默认30）\r\n * @property {String} sub-title 头部右边的副标题\r\n * @property {String} sub-title-color 副标题颜色（默认#909399）\r\n * @property {String | Number} sub-title-size 副标题字体大小（默认26）\r\n * @property {Boolean} border 是否显示边框（默认true）\r\n * @property {String | Number} index 用于标识点击了第几个卡片\r\n * @property {String} margin 卡片与屏幕两边和上下元素的间距，需带单位，如\"30rpx 20rpx\"（默认30rpx）\r\n * @property {String | Number} border-radius 卡片整体的圆角值，单位rpx（默认16）\r\n * @property {Object} head-style 头部自定义样式，对象形式\r\n * @property {Object} body-style 中部自定义样式，对象形式\r\n * @property {Object} foot-style 底部自定义样式，对象形式\r\n * @property {Boolean} head-border-bottom 是否显示头部的下边框（默认true）\r\n * @property {Boolean} foot-border-top 是否显示底部的上边框（默认true）\r\n * @property {Boolean} show-head 是否显示头部（默认true）\r\n * @property {Boolean} show-head 是否显示尾部（默认true）\r\n * @property {String} thumb 缩略图路径，如设置将显示在标题的左边，不建议使用相对路径\r\n * @property {String | Number} thumb-width 缩略图的宽度，高等于宽，单位rpx（默认60）\r\n * @property {Boolean} thumb-circle 缩略图是否为圆形（默认false）\r\n * @event {Function} click 整个卡片任意位置被点击时触发\r\n * @event {Function} head-click 卡片头部被点击时触发\r\n * @event {Function} body-click 卡片主体部分被点击时触发\r\n * @event {Function} foot-click 卡片底部部分被点击时触发\r\n * @example <u-card padding=\"30\" title=\"card\"></u-card>\r\n */\r\nexport default {\r\n\tname: 'u-card',\r\n\tprops: {\r\n\t\t// 与屏幕两侧是否留空隙\r\n\t\tfull: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 标题\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 标题颜色\r\n\t\ttitleColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#303133'\r\n\t\t},\r\n\t\t// 标题字体大小，单位rpx\r\n\t\ttitleSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '30'\r\n\t\t},\r\n\t\t// 副标题\r\n\t\tsubTitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 副标题颜色\r\n\t\tsubTitleColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#909399'\r\n\t\t},\r\n\t\t// 副标题字体大小，单位rpx\r\n\t\tsubTitleSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '26'\r\n\t\t},\r\n\t\t// 是否显示外部边框，只对full=false时有效(卡片与边框有空隙时)\r\n\t\tborder: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 用于标识点击了第几个\r\n\t\tindex: {\r\n\t\t\ttype: [Number, String, Object],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 用于隔开上下左右的边距，带单位的写法，如：\"30rpx 30rpx\"，\"20rpx 20rpx 30rpx 30rpx\"\r\n\t\tmargin: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '30rpx'\r\n\t\t},\r\n\t\t// card卡片的圆角\r\n\t\tborderRadius: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '16'\r\n\t\t},\r\n\t\t// 头部自定义样式，对象形式\r\n\t\theadStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 主体自定义样式，对象形式\r\n\t\tbodyStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 底部自定义样式，对象形式\r\n\t\tfootStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 头部是否下边框\r\n\t\theadBorderBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 底部是否有上边框\r\n\t\tfootBorderTop: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 标题左边的缩略图\r\n\t\tthumb: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 缩略图宽高，单位rpx\r\n\t\tthumbWidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '60'\r\n\t\t},\r\n\t\t// 缩略图是否为圆形\r\n\t\tthumbCircle: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 给head，body，foot的内边距\r\n\t\tpadding: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '30'\r\n\t\t},\r\n\t\t// 是否显示头部\r\n\t\tshowHead: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示尾部\r\n\t\tshowFoot: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {};\r\n\t},\r\n\tmethods: {\r\n\t\tclick() {\r\n\t\t\tthis.$emit('click', this.index);\r\n\t\t},\r\n\t\theadClick() {\r\n\t\t\tthis.$emit('head-click', this.index);\r\n\t\t},\r\n\t\tbodyClick() {\r\n\t\t\tthis.$emit('body-click', this.index);\r\n\t\t},\r\n\t\tfootClick() {\r\n\t\t\tthis.$emit('foot-click', this.index);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\t\r\n.u-card {\r\n\tposition: relative;\r\n\toverflow: hidden;\r\n\tfont-size: 28rpx;\r\n\tbackground-color: #ffffff;\r\n\tbox-sizing: border-box;\r\n\t\r\n\t&-full {\r\n\t\t// 如果是与屏幕之间不留空隙，应该设置左右边距为0\r\n\t\tmargin-left: 0 !important;\r\n\t\tmargin-right: 0 !important;\r\n\t}\r\n\t\r\n\t&--border:after {\r\n\t\tborder-radius: 16rpx;\r\n\t}\r\n\r\n\t&__head {\r\n\t\t&--left {\r\n\t\t\tcolor: $u-main-color;\r\n\t\t\t\r\n\t\t\t&__thumb {\r\n\t\t\t\tmargin-right: 16rpx;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&__title {\r\n\t\t\t\tmax-width: 400rpx;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t&--right {\r\n\t\t\tcolor: $u-tips-color;\r\n\t\t\tmargin-left: 6rpx;\r\n\t\t}\r\n\t}\r\n\r\n\t&__body {\r\n\t\tcolor: $u-content-color;\r\n\t}\r\n\r\n\t&__foot {\r\n\t\tcolor: $u-tips-color;\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-cell-group/u-cell-group.vue",
    "content": "<template>\r\n\t<view class=\"u-cell-box\">\r\n\t\t<view class=\"u-cell-title\" v-if=\"title\" :style=\"[titleStyle]\">\r\n\t\t\t{{title}}\r\n\t\t</view>\r\n\t\t<view class=\"u-cell-item-box\" :class=\"{'u-border-bottom u-border-top': border}\">\r\n\t\t\t<slot />\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * cellGroup 单元格父组件Group\r\n\t * @description cell单元格一般用于一组列表的情况，比如个人中心页，设置页等。搭配u-cell-item\r\n\t * @tutorial https://www.uviewui.com/components/cell.html\r\n\t * @property {String} title 分组标题\r\n\t * @property {Boolean} border 是否显示外边框（默认true）\r\n\t * @property {Object} title-style 分组标题的的样式，对象形式，如{'font-size': '24rpx'} 或 {'fontSize': '24rpx'}\r\n\t * @example <u-cell-group title=\"设置喜好\">\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-cell-group\",\r\n\t\tprops: {\r\n\t\t\t// 分组标题\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否显示分组list上下边框\r\n\t\t\tborder: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 分组标题的样式，对象形式，注意驼峰属性写法\r\n\t\t\t// 类似 {'font-size': '24rpx'} 和 {'fontSize': '24rpx'}\r\n\t\t\ttitleStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tindex: 0,\r\n\t\t\t}\r\n\t\t},\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-cell-box {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.u-cell-title {\r\n\t\tpadding: 30rpx 32rpx 10rpx 32rpx;\r\n\t\tfont-size: 30rpx;\r\n\t\ttext-align: left;\r\n\t\tcolor: $u-tips-color;\r\n\t}\r\n\r\n\t.u-cell-item-box {\r\n\t\tbackground-color: #FFFFFF;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-cell-item/u-cell-item.vue",
    "content": "<template>\r\n\t<view\r\n\t\t@tap=\"click\"\r\n\t\tclass=\"u-cell\"\r\n\t\t:class=\"{ 'u-border-bottom': borderBottom, 'u-border-top': borderTop, 'u-col-center': center, 'u-cell--required': required }\"\r\n\t\thover-stay-time=\"150\"\r\n\t\t:hover-class=\"hoverClass\"\r\n\t\t:style=\"{\r\n\t\t\tbackgroundColor: bgColor\r\n\t\t}\"\r\n\t>\r\n\t\t<u-icon :size=\"iconSize\" :name=\"icon\" v-if=\"icon\" :custom-style=\"iconStyle\" class=\"u-cell__left-icon-wrap\"></u-icon>\r\n\t\t<view class=\"u-flex\" v-else>\r\n\t\t\t<slot name=\"icon\"></slot>\r\n\t\t</view>\r\n\t\t<view\r\n\t\t\tclass=\"u-cell_title\"\r\n\t\t\t:style=\"[\r\n\t\t\t\t{\r\n\t\t\t\t\twidth: titleWidth ? titleWidth + 'rpx' : 'auto'\r\n\t\t\t\t},\r\n\t\t\t\ttitleStyle\r\n\t\t\t]\"\r\n\t\t>\r\n\t\t\t<block v-if=\"title\">{{ title }}</block>\r\n\t\t\t<slot name=\"title\" v-else></slot>\r\n\r\n\t\t\t<view class=\"u-cell__label\" v-if=\"label || $slots.label\" :style=\"[labelStyle]\">\r\n\t\t\t\t<block v-if=\"label\">{{ label }}</block>\r\n\t\t\t\t<slot name=\"label\" v-else></slot>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<view class=\"u-cell__value\" :style=\"[valueStyle]\">\r\n\t\t\t<block class=\"u-cell__value\" v-if=\"value\">{{ value }}</block>\r\n\t\t\t<slot v-else></slot>\r\n\t\t</view>\r\n\t\t<u-icon v-if=\"arrow\" name=\"arrow-right\" :style=\"[arrowStyle]\" class=\"u-icon-wrap u-cell__right-icon-wrap\"></u-icon>\r\n\t\t<view class=\"u-flex\" v-if=\"$slots['right-icon']\">\r\n\t\t\t<slot name=\"right-icon\"></slot>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * cellItem 单元格Item\r\n * @description cell单元格一般用于一组列表的情况，比如个人中心页，设置页等。搭配u-cell-group使用\r\n * @tutorial https://www.uviewui.com/components/cell.html\r\n * @property {String} title 左侧标题\r\n * @property {String} icon 左侧图标名，只支持uView内置图标，见Icon 图标\r\n * @property {Object} icon-style 左边图标的样式，对象形式\r\n * @property {String} value 右侧内容\r\n * @property {String} label 标题下方的描述信息\r\n * @property {Boolean} border-bottom 是否显示cell的下边框（默认true）\r\n * @property {Boolean} border-top 是否显示cell的上边框（默认false）\r\n * @property {Boolean} center 是否使内容垂直居中（默认false）\r\n * @property {String} hover-class 是否开启点击反馈，none为无效果（默认true）\r\n * // @property {Boolean} border-gap border-bottom为true时，Cell列表中间的条目的下边框是否与左边有一个间隔（默认true）\r\n * @property {Boolean} arrow 是否显示右侧箭头（默认true）\r\n * @property {Boolean} required 箭头方向，可选值（默认right）\r\n * @property {Boolean} arrow-direction 是否显示左边表示必填的星号（默认false）\r\n * @property {Object} title-style 标题样式，对象形式\r\n * @property {Object} value-style 右侧内容样式，对象形式\r\n * @property {Object} label-style 标题下方描述信息的样式，对象形式\r\n * @property {String} bg-color 背景颜色（默认transparent）\r\n * @property {String Number} index 用于在click事件回调中返回，标识当前是第几个Item\r\n * @property {String Number} title-width 标题的宽度，单位rpx\r\n * @example <u-cell-item icon=\"integral-fill\" title=\"会员等级\" value=\"新版本\"></u-cell-item>\r\n */\r\nexport default {\r\n\tname: 'u-cell-item',\r\n\tprops: {\r\n\t\t// 左侧图标名称(只能uView内置图标)，或者图标src\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 左侧标题\r\n\t\ttitle: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 右侧内容\r\n\t\tvalue: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 标题下方的描述信息\r\n\t\tlabel: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否显示下边框\r\n\t\tborderBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示上边框\r\n\t\tborderTop: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 多个cell中，中间的cell显示下划线时，下划线是否给一个到左边的距离\r\n\t\t// 1.4.0版本废除此参数，默认边框由border-top和border-bottom提供，此参数会造成干扰\r\n\t\t// borderGap: {\r\n\t\t// \ttype: Boolean,\r\n\t\t// \tdefault: true\r\n\t\t// },\r\n\t\t// 是否开启点击反馈，即点击时cell背景为灰色，none为无效果\r\n\t\thoverClass: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'u-cell-hover'\r\n\t\t},\r\n\t\t// 是否显示右侧箭头\r\n\t\tarrow: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 内容是否垂直居中\r\n\t\tcenter: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否显示左边表示必填的星号\r\n\t\trequired: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 标题的宽度，单位rpx\r\n\t\ttitleWidth: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 右侧箭头方向，可选值：right|up|down，默认为right\r\n\t\tarrowDirection: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'right'\r\n\t\t},\r\n\t\t// 控制标题的样式\r\n\t\ttitleStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 右侧显示内容的样式\r\n\t\tvalueStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 描述信息的样式\r\n\t\tlabelStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'transparent'\r\n\t\t},\r\n\t\t// 用于识别被点击的是第几个cell\r\n\t\tindex: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否使用lable插槽\r\n\t\tuseLabelSlot: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 左边图标的大小，单位rpx，只对传入icon字段时有效\r\n\t\ticonSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 34\r\n\t\t},\r\n\t\t// 左边图标的样式，对象形式\r\n\t\ticonStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\r\n\t\t};\r\n\t},\r\n\tcomputed: {\r\n\t\tarrowStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif (this.arrowDirection == 'up') style.transform = 'rotate(-90deg)';\r\n\t\t\telse if (this.arrowDirection == 'down') style.transform = 'rotate(90deg)';\r\n\t\t\telse style.transform = 'rotate(0deg)';\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tclick() {\r\n\t\t\tthis.$emit('click', this.index);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n.u-cell {\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\tbox-sizing: border-box;\r\n\twidth: 100%;\r\n\tpadding: 26rpx 32rpx;\r\n\tfont-size: 28rpx;\r\n\tline-height: 54rpx;\r\n\tcolor: $u-content-color;\r\n\tbackground-color: #fff;\r\n\ttext-align: left;\r\n}\r\n\r\n.u-cell_title {\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.u-cell__left-icon-wrap {\r\n\tmargin-right: 10rpx;\r\n\tfont-size: 32rpx;\r\n}\r\n\r\n.u-cell__right-icon-wrap {\r\n\tmargin-left: 10rpx;\r\n\tcolor: #969799;\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.u-cell__left-icon-wrap,\r\n.u-cell__right-icon-wrap {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\theight: 48rpx;\r\n}\r\n\r\n.u-cell-border:after {\r\n\tposition: absolute;\r\n\tbox-sizing: border-box;\r\n\tcontent: ' ';\r\n\tpointer-events: none;\r\n\tright: 0;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tborder-bottom: 1px solid $u-border-color;\r\n\t-webkit-transform: scaleY(0.5);\r\n\ttransform: scaleY(0.5);\r\n}\r\n\r\n.u-cell-border {\r\n\tposition: relative;\r\n}\r\n\r\n.u-cell__label {\r\n\tmargin-top: 6rpx;\r\n\tfont-size: 26rpx;\r\n\tline-height: 36rpx;\r\n\tcolor: $u-tips-color;\r\n\tword-wrap: break-word;\r\n}\r\n\r\n.u-cell__value {\r\n\toverflow: hidden;\r\n\ttext-align: right;\r\n\tvertical-align: middle;\r\n\tcolor: $u-tips-color;\r\n\tfont-size: 26rpx;\r\n}\r\n\r\n.u-cell__title,\r\n.u-cell__value {\r\n\tflex: 1;\r\n}\r\n\r\n.u-cell--required {\r\n\toverflow: visible;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-cell--required:before {\r\n\tposition: absolute;\r\n\tcontent: '*';\r\n\tleft: 8px;\r\n\tmargin-top: 4rpx;\r\n\tfont-size: 14px;\r\n\tcolor: $u-type-error;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-checkbox/u-checkbox.vue",
    "content": "<template>\r\n\t<view class=\"u-checkbox\" :style=\"[checkboxStyle]\">\r\n\t\t<view class=\"u-checkbox__icon-wrap\" @tap=\"toggle\" :class=\"[iconClass]\" :style=\"[iconStyle]\">\r\n\t\t\t<u-icon name=\"checkbox-mark\" :size=\"checkboxIconSize\" :color=\"iconColor\"/>\r\n\t\t</view>\r\n\t\t<view class=\"u-checkbox__label\" @tap=\"onClickLabel\" :style=\"{\r\n\t\t\tfontSize: $u.addUnit(labelSize)\r\n\t\t}\">\r\n\t\t\t<slot />\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * checkbox 复选框\r\n\t * @description 该组件需要搭配checkboxGroup组件使用，以便用户进行操作时，获得当前复选框组的选中情况。\r\n\t * @tutorial https://www.uviewui.com/components/checkbox.html\r\n\t * @property {String Number} icon-size 图标大小，单位rpx（默认20）\r\n\t * @property {String Number} label-size label字体大小，单位rpx（默认28）\r\n\t * @property {String Number} name checkbox组件的标示符\r\n\t * @property {String} shape 形状，见官网说明（默认circle）\r\n\t * @property {Boolean} disabled 是否禁用\r\n\t * @property {Boolean} label-disabled 是否禁止点击文本操作checkbox\r\n\t * @property {String} active-color 选中时的颜色，如设置CheckboxGroup的active-color将失效\r\n\t * @event {Function} change 某个checkbox状态发生变化时触发，回调为一个对象\r\n\t * @example <u-checkbox v-model=\"checked\" :disabled=\"false\">天涯</u-checkbox>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-checkbox\",\r\n\t\tprops: {\r\n\t\t\t// checkbox的名称\r\n\t\t\tname: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 形状，square为方形，circle为原型\r\n\t\t\tshape: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否为选中状态\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否禁用\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: [String, Boolean],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否禁止点击提示语选中复选框\r\n\t\t\tlabelDisabled: {\r\n\t\t\t\ttype: [String, Boolean],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 选中状态下的颜色，如设置此值，将会覆盖checkboxGroup的activeColor值\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 图标的大小，单位rpx\r\n\t\t\ticonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// label的字体大小，rpx单位\r\n\t\t\tlabelSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 组件的整体大小\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tparentDisabled: false,\r\n\t\t\t\tnewParams: {},\r\n\t\t\t};\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环应用\r\n\t\t\tthis.parent = this.$u.$parent.call(this, 'u-checkbox-group');\r\n\t\t\t// 如果存在u-checkbox-group，将本组件的this塞进父组件的children中\r\n\t\t\tthis.parent && this.parent.children.push(this);\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 是否禁用，如果父组件u-checkbox-group禁用的话，将会忽略子组件的配置\r\n\t\t\tisDisabled() {\r\n\t\t\t\treturn this.disabled !== '' ? this.disabled : this.parent ? this.parent.disabled : false;\r\n\t\t\t},\r\n\t\t\t// 是否禁用label点击\r\n\t\t\tisLabelDisabled() {\r\n\t\t\t\treturn this.labelDisabled !== '' ? this.labelDisabled : this.parent ? this.parent.labelDisabled : false;\r\n\t\t\t},\r\n\t\t\t// 组件尺寸，对应size的值，默认值为34rpx\r\n\t\t\tcheckboxSize() {\r\n\t\t\t\treturn this.size ? this.size : (this.parent ? this.parent.size : 34);\r\n\t\t\t},\r\n\t\t\t// 组件的勾选图标的尺寸，默认20\r\n\t\t\tcheckboxIconSize() {\r\n\t\t\t\treturn this.iconSize ? this.iconSize : (this.parent ? this.parent.iconSize : 20);\r\n\t\t\t},\r\n\t\t\t// 组件选中激活时的颜色\r\n\t\t\telActiveColor() {\r\n\t\t\t\treturn this.activeColor ? this.activeColor : (this.parent ? this.parent.activeColor : 'primary');\r\n\t\t\t},\r\n\t\t\t// 组件的形状\r\n\t\t\telShape() {\r\n\t\t\t\treturn this.shape ? this.shape : (this.parent ? this.parent.shape : 'square');\r\n\t\t\t},\r\n\t\t\ticonStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\t// 既要判断是否手动禁用，还要判断用户v-model绑定的值，如果绑定为false，那么也无法选中\r\n\t\t\t\tif (this.elActiveColor && this.value && !this.isDisabled) {\r\n\t\t\t\t\tstyle.borderColor = this.elActiveColor; \r\n\t\t\t\t\tstyle.backgroundColor = this.elActiveColor;\r\n\t\t\t\t}\r\n\t\t\t\tstyle.width = this.$u.addUnit(this.checkboxSize);\r\n\t\t\t\tstyle.height = this.$u.addUnit(this.checkboxSize);\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// checkbox内部的勾选图标，如果选中状态，为白色，否则为透明色即可\r\n\t\t\ticonColor() {\r\n\t\t\t\treturn this.value ? '#ffffff' : 'transparent';\r\n\t\t\t},\r\n\t\t\ticonClass() {\r\n\t\t\t\tlet classes = [];\r\n\t\t\t\tclasses.push('u-checkbox__icon-wrap--' + this.elShape);\r\n\t\t\t\tif (this.value == true) classes.push('u-checkbox__icon-wrap--checked');\r\n\t\t\t\tif (this.isDisabled) classes.push('u-checkbox__icon-wrap--disabled');\r\n\t\t\t\tif (this.value && this.isDisabled) classes.push('u-checkbox__icon-wrap--disabled--checked');\r\n\t\t\t\t// 支付宝小程序无法动态绑定一个数组类名，否则解析出来的结果会带有\",\"，而导致失效\r\n\t\t\t\treturn classes.join(' ');\r\n\t\t\t},\r\n\t\t\tcheckboxStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif(this.parent && this.parent.width) {\r\n\t\t\t\t\tstyle.width = this.parent.width;\r\n\t\t\t\t\t// #ifdef MP\r\n\t\t\t\t\t// 各家小程序因为它们特殊的编译结构，使用float布局\r\n\t\t\t\t\tstyle.float = 'left';\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\t// #ifndef MP\r\n\t\t\t\t\t// H5和APP使用flex布局\r\n\t\t\t\t\tstyle.flex = `0 0 ${this.parent.width}`;\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t\tif(this.parent && this.parent.wrap) {\r\n\t\t\t\t\tstyle.width = '100%';\r\n\t\t\t\t\t// #ifndef MP\r\n\t\t\t\t\t// H5和APP使用flex布局，将宽度设置100%，即可自动换行\r\n\t\t\t\t\tstyle.flex = '0 0 100%';\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tonClickLabel() {\r\n\t\t\t\tif (!this.isLabelDisabled && !this.isDisabled) {\r\n\t\t\t\t\tthis.setValue();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\ttoggle() {\r\n\t\t\t\tif (!this.isDisabled) {\r\n\t\t\t\t\tthis.setValue();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\temitEvent() {\r\n\t\t\t\tthis.$emit('change', {\r\n\t\t\t\t\tvalue: this.value,\r\n\t\t\t\t\tname: this.name\r\n\t\t\t\t})\r\n\t\t\t\t// 执行父组件u-checkbox-group的事件方法\r\n\t\t\t\tif(this.parent && this.parent.emitEvent) this.parent.emitEvent();\r\n\t\t\t},\r\n\t\t\t// 设置input的值，这里通过input事件，设置通过v-model绑定的组件的值\r\n\t\t\tsetValue() {\r\n\t\t\t\t// 判断是否超过了可选的最大数量\r\n\t\t\t\tlet checkedNum = 0;\r\n\t\t\t\tif(this.parent && this.parent.children) {\r\n\t\t\t\t\t// 只要父组件的某一个子元素的value为true，就加1(已有的选中数量)\r\n\t\t\t\t\tthis.parent.children.map(val => {\r\n\t\t\t\t\t\tif (val.value) checkedNum++;\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\t// 如果原来为选中状态，那么可以取消\r\n\t\t\t\tif (this.value == true) {\r\n\t\t\t\t\tthis.$emit('input', !this.value);\r\n\t\t\t\t\t// 等待下一个周期再执行，因为this.$emit('input')作用于父组件，再反馈到子组件内部，需要时间\r\n\t\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\t\tthis.emitEvent();\r\n\t\t\t\t\t})\r\n\t\t\t\t} else if ((this.parent && checkedNum < this.parent.max) || !this.parent) {\r\n\t\t\t\t\t// 如果原来为未选中状态，需要选中的数量少于父组件中设置的max值，才可以选中\r\n\t\t\t\t\tthis.$emit('input', !this.value);\r\n\t\t\t\t\t// 等待下一个周期再执行，因为this.$emit('input')作用于父组件，再反馈到子组件内部，需要时间\r\n\t\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\t\tthis.emitEvent();\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-checkbox {\r\n\t\tdisplay: inline-flex;\r\n\t\talign-items: center;\r\n\t\toverflow: hidden;\r\n\t\tuser-select: none;\r\n\t\tline-height: 1.8;\r\n\t\t\r\n\t\t&__icon-wrap {\r\n\t\t\tcolor: $u-content-color;\r\n\t\t\tflex: none;\r\n\t\t\tdisplay: -webkit-flex;\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tjustify-content: center;\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\twidth: 42rpx;\r\n\t\t\theight: 42rpx;\r\n\t\t\tcolor: transparent;\r\n\t\t\ttext-align: center;\r\n\t\t\ttransition-property: color, border-color, background-color;\r\n\t\t\tfont-size: 20px;\r\n\t\t\tborder: 1px solid #c8c9cc;\r\n\t\t\ttransition-duration: 0.2s;\r\n\t\t\t\r\n\t\t\t&--circle {\r\n\t\t\t\tborder-radius: 100%;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--square {\r\n\t\t\t\tborder-radius: 6rpx;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--checked {\r\n\t\t\t\tcolor: #fff;\r\n\t\t\t\tbackground-color: $u-type-primary;\r\n\t\t\t\tborder-color: $u-type-primary;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--disabled {\r\n\t\t\t\tbackground-color: #ebedf0;\r\n\t\t\t\tborder-color: #c8c9cc;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--disabled--checked {\r\n\t\t\t\tcolor: #c8c9cc !important;\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t&__label {\r\n\t\t\tword-wrap: break-word;\r\n\t\t\tmargin-left: 10rpx;\r\n\t\t\tmargin-right: 24rpx;\r\n\t\t\tcolor: $u-content-color;\r\n\t\t\tfont-size: 30rpx;\r\n\t\t\t\r\n\t\t\t&--disabled {\r\n\t\t\t\tcolor: #c8c9cc;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-checkbox-group/u-checkbox-group.vue",
    "content": "<template>\r\n\t<view class=\"u-checkbox-group u-clearfix\">\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport Emitter from '../../libs/util/emitter.js';\r\n\t/**\r\n\t * checkboxGroup 开关选择器父组件Group\r\n\t * @description 复选框组件一般用于需要多个选择的场景，该组件功能完整，使用方便\r\n\t * @tutorial https://www.uviewui.com/components/checkbox.html\r\n\t * @property {String Number} max 最多能选中多少个checkbox（默认999）\r\n\t * @property {String Number} size 组件整体的大小，单位rpx（默认40）\r\n\t * @property {Boolean} disabled 是否禁用所有checkbox（默认false）\r\n\t * @property {String Number} icon-size 图标大小，单位rpx（默认20）\r\n\t * @property {Boolean} label-disabled 是否禁止点击文本操作checkbox(默认false)\r\n\t * @property {String} width 宽度，需带单位\r\n\t * @property {String} width 宽度，需带单位\r\n\t * @property {String} shape 外观形状，shape-方形，circle-圆形(默认circle)\r\n\t * @property {Boolean} wrap 是否每个checkbox都换行（默认false）\r\n\t * @property {String} active-color 选中时的颜色，应用到所有子Checkbox组件（默认#2979ff）\r\n\t * @event {Function} change 任一个checkbox状态发生变化时触发，回调为一个对象\r\n\t * @example <u-checkbox-group></u-checkbox-group>\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-checkbox-group',\r\n\t\tmixins: [Emitter],\r\n\t\tprops: {\r\n\t\t\t// 最多能选中多少个checkbox\r\n\t\t\tmax: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 999\r\n\t\t\t},\r\n\t\t\t// 所有选中项的 name\r\n\t\t\t// value: {\r\n\t\t\t// \tdefault: Array,\r\n\t\t\t// \tdefault() {\r\n\t\t\t// \t\treturn []\r\n\t\t\t// \t}\r\n\t\t\t// },\r\n\t\t\t// 是否禁用所有复选框\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 在表单内提交时的标识符\r\n\t\t\tname: {\r\n\t\t\t\ttype: [Boolean, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否禁止点击提示语选中复选框\r\n\t\t\tlabelDisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 形状，square为方形，circle为原型\r\n\t\t\tshape: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'square'\r\n\t\t\t},\r\n\t\t\t// 选中状态下的颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 组件的整体大小\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 34\r\n\t\t\t},\r\n\t\t\t// 每个checkbox占u-checkbox-group的宽度\r\n\t\t\twidth: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'auto'\r\n\t\t\t},\r\n\t\t\t// 是否每个checkbox都换行\r\n\t\t\twrap: { \r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 图标的大小，单位rpx\r\n\t\t\ticonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 20\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 如果将children定义在data中，在微信小程序会造成循环引用而报错\r\n\t\t\tthis.children = [];\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\temitEvent() {\r\n\t\t\t\tlet values = [];\r\n\t\t\t\tthis.children.map(val => {\r\n\t\t\t\t\tif(val.value) values.push(val.name);\r\n\t\t\t\t})\r\n\t\t\t\tthis.$emit('change', values);\r\n\t\t\t\t// 发出事件，用于在表单组件中嵌入checkbox的情况，进行验证\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t// 将当前的值发送到 u-form-item 进行校验\r\n\t\t\t\t\tthis.dispatch('u-form-item', 'on-form-change', values);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-checkbox-group {\r\n\t\t/* #ifndef MP */\r\n\t\tdisplay: inline-flex;\r\n\t\tflex-wrap: wrap;\r\n\t\t/* #endif */\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-circle-progress/u-circle-progress.vue",
    "content": "<template>\r\n\t<view\r\n\t\tclass=\"u-circle-progress\"\r\n\t\t:style=\"{\r\n\t\t\twidth: widthPx + 'px',\r\n\t\t\theight: widthPx + 'px',\r\n\t\t\tbackgroundColor: bgColor\r\n\t\t}\"\r\n\t>\r\n\t\t<!-- 支付宝小程序不支持canvas-id属性，必须用id属性 -->\r\n\t\t<canvas\r\n\t\t\tclass=\"u-canvas-bg\"\r\n\t\t\t:canvas-id=\"elBgId\"\r\n\t\t\t:id=\"elBgId\"\r\n\t\t\t:style=\"{\r\n\t\t\t\twidth: widthPx + 'px',\r\n\t\t\t\theight: widthPx + 'px'\r\n\t\t\t}\"\r\n\t\t></canvas>\r\n\t\t<canvas\r\n\t\t\tclass=\"u-canvas\"\r\n\t\t\t:canvas-id=\"elId\"\r\n\t\t\t:id=\"elId\"\r\n\t\t\t:style=\"{\r\n\t\t\t\twidth: widthPx + 'px',\r\n\t\t\t\theight: widthPx + 'px'\r\n\t\t\t}\"\r\n\t\t></canvas>\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * circleProgress 环形进度条\r\n * @description 展示操作或任务的当前进度，比如上传文件，是一个圆形的进度条。注意：此组件的percent值只能动态增加，不能动态减少。\r\n * @tutorial https://www.uviewui.com/components/circleProgress.html\r\n * @property {String Number} percent 圆环进度百分比值，为数值类型，0-100\r\n * @property {String} inactive-color 圆环的底色，默认为灰色(该值无法动态变更)（默认#ececec）\r\n * @property {String} active-color 圆环激活部分的颜色(该值无法动态变更)（默认#19be6b）\r\n * @property {String Number} width 整个圆环组件的宽度，高度默认等于宽度值，单位rpx（默认200）\r\n * @property {String Number} border-width 圆环的边框宽度，单位rpx（默认14）\r\n * @property {String Number} duration 整个圆环执行一圈的时间，单位ms（默认呢1500）\r\n * @property {String} type 如设置，active-color值将会失效\r\n * @property {String} bg-color 整个组件背景颜色，默认为白色\r\n * @example <u-circle-progress active-color=\"#2979ff\" :percent=\"80\"></u-circle-progress>\r\n */\r\nexport default {\r\n\tname: 'u-circle-progress',\r\n\tprops: {\r\n\t\t// 圆环进度百分比值\r\n\t\tpercent: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 0,\r\n\t\t\t// 限制值在0到100之间\r\n\t\t\tvalidator: val => {\r\n\t\t\t\treturn val >= 0 && val <= 100;\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 底部圆环的颜色（灰色的圆环）\r\n\t\tinactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#ececec'\r\n\t\t},\r\n\t\t// 圆环激活部分的颜色\r\n\t\tactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#19be6b'\r\n\t\t},\r\n\t\t// 圆环线条的宽度，单位rpx\r\n\t\tborderWidth: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 14\r\n\t\t},\r\n\t\t// 整个圆形的宽度，单位rpx\r\n\t\twidth: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 200\r\n\t\t},\r\n\t\t// 整个圆环执行一圈的时间，单位ms\r\n\t\tduration: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 1500\r\n\t\t},\r\n\t\t// 主题类型\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 整个圆环进度区域的背景色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#ffffff'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\telBgId: 'uCircleProgressBgId', // 微信小程序中不能使用this.$u.guid()形式动态生成id值，否则会报错\r\n\t\t\telId: 'uCircleProgressElId',\r\n\t\t\t// #endif\r\n\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\telBgId: this.$u.guid(), // 非微信端的时候，需用动态的id，否则一个页面多个圆形进度条组件数据会混乱\r\n\t\t\telId: this.$u.guid(),\r\n\t\t\t// #endif\r\n\t\t\twidthPx: uni.upx2px(this.width), // 转成px后的整个组件的背景宽度\r\n\t\t\tborderWidthPx: uni.upx2px(this.borderWidth), // 转成px后的圆环的宽度\r\n\t\t\tstartAngle: -Math.PI / 2, // canvas画圆的起始角度，默认为3点钟方向，定位到12点钟方向\r\n\t\t\tprogressContext: null, // 活动圆的canvas上下文\r\n\t\t\tnewPercent: 0, // 当动态修改进度值的时候，保存进度值的变化前后值，用于比较用\r\n\t\t\toldPercent: 0 // 当动态修改进度值的时候，保存进度值的变化前后值，用于比较用\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tpercent(nVal, oVal = 0) {\r\n\t\t\tif (nVal > 100) nVal = 100;\r\n\t\t\tif (nVal < 0) oVal = 0;\r\n\t\t\t// 此值其实等于this.percent，命名一个新\r\n\t\t\tthis.newPercent = nVal;\r\n\t\t\tthis.oldPercent = oVal;\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t// 无论是百分比值增加还是减少，需要操作还是原来的旧的百分比值\r\n\t\t\t\t// 将此值减少或者新增到新的百分比值\r\n\t\t\t\tthis.drawCircleByProgress(oVal);\r\n\t\t\t}, 50);\r\n\t\t}\r\n\t},\r\n\tcreated() {\r\n\t\t// 赋值，用于加载后第一个画圆使用\r\n\t\tthis.newPercent = this.percent;\r\n\t\tthis.oldPercent = 0;\r\n\t},\r\n\tcomputed: {\r\n\t\t// 有type主题时，优先起作用\r\n\t\tcircleColor() {\r\n\t\t\tif (['success', 'error', 'info', 'primary', 'warning'].indexOf(this.type) >= 0) return this.$u.color[this.type];\r\n\t\t\telse return this.activeColor;\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\t// 在h5端，必须要做一点延时才起作用，this.$nextTick()无效(HX2.4.7)\r\n\t\tsetTimeout(() => {\r\n\t\t\tthis.drawProgressBg();\r\n\t\t\tthis.drawCircleByProgress(this.oldPercent);\r\n\t\t}, 50);\r\n\t},\r\n\tmethods: {\r\n\t\tdrawProgressBg() {\r\n\t\t\tlet ctx = uni.createCanvasContext(this.elBgId, this);\r\n\t\t\tctx.setLineWidth(this.borderWidthPx); // 设置圆环宽度\r\n\t\t\tctx.setStrokeStyle(this.inactiveColor); // 线条颜色\r\n\t\t\tctx.beginPath(); // 开始描绘路径\r\n\t\t\t// 设置一个原点(110,110)，半径为100的圆的路径到当前路径\r\n\t\t\tlet radius = this.widthPx / 2;\r\n\t\t\tctx.arc(radius, radius, radius - this.borderWidthPx, 0, 2 * Math.PI, false);\r\n\t\t\tctx.stroke(); // 对路径进行描绘\r\n\t\t\tctx.draw();\r\n\t\t},\r\n\t\tdrawCircleByProgress(progress) {\r\n\t\t\t// 第一次操作进度环时将上下文保存到了this.data中，直接使用即可\r\n\t\t\tlet ctx = this.progressContext;\r\n\t\t\tif (!ctx) {\r\n\t\t\t\tctx = uni.createCanvasContext(this.elId, this);\r\n\t\t\t\tthis.progressContext = ctx;\r\n\t\t\t}\r\n\t\t\t// 表示进度的两端为圆形\r\n\t\t\tctx.setLineCap('round');\r\n\t\t\t// 设置线条的宽度和颜色\r\n\t\t\tctx.setLineWidth(this.borderWidthPx);\r\n\t\t\tctx.setStrokeStyle(this.circleColor);\r\n\t\t\t// 将总过渡时间除以100，得出每修改百分之一进度所需的时间\r\n\t\t\tlet time = Math.floor(this.duration / 100);\r\n\t\t\t// 结束角的计算依据为：将2π分为100份，乘以当前的进度值，得出终止点的弧度值，加起始角，为整个圆从默认的\r\n\t\t\t// 3点钟方向开始画图，转为更好理解的12点钟方向开始作图，这需要起始角和终止角同时加上this.startAngle值\r\n\t\t\tlet endAngle = ((2 * Math.PI) / 100) * progress + this.startAngle;\r\n\t\t\tctx.beginPath();\r\n\t\t\t// 半径为整个canvas宽度的一半\r\n\t\t\tlet radius = this.widthPx / 2;\r\n\t\t\tctx.arc(radius, radius, radius - this.borderWidthPx, this.startAngle, endAngle, false);\r\n\t\t\tctx.stroke();\r\n\t\t\tctx.draw();\r\n\t\t\t// 如果变更后新值大于旧值，意味着增大了百分比\r\n\t\t\tif (this.newPercent > this.oldPercent) {\r\n\t\t\t\t// 每次递增百分之一\r\n\t\t\t\tprogress++;\r\n\t\t\t\t// 如果新增后的值，大于需要设置的值百分比值，停止继续增加\r\n\t\t\t\tif (progress > this.newPercent) return;\r\n\t\t\t} else {\r\n\t\t\t\t// 同理于上面\r\n\t\t\t\tprogress--;\r\n\t\t\t\tif (progress < this.newPercent) return;\r\n\t\t\t}\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t// 定时器，每次操作间隔为time值，为了让进度条有动画效果\r\n\t\t\t\tthis.drawCircleByProgress(progress);\r\n\t\t\t}, time);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n.u-circle-progress {\r\n\tposition: relative;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.u-canvas-bg {\r\n\tposition: absolute;\r\n}\r\n\r\n.u-canvas {\r\n\tposition: absolute;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-col/u-col.vue",
    "content": "<template>\r\n\t<view class=\"u-col\" :class=\"[\r\n\t\t'u-col-' + span\r\n\t]\" :style=\"{\r\n\t\tpadding: `0 ${Number(gutter)/2 + 'rpx'}`,\r\n\t\tmarginLeft: 100 / 12 * offset + '%',\r\n\t\tflex: `0 0 ${100 / 12 * span}%`,\r\n\t\talignItems: uAlignItem,\r\n\t\tjustifyContent: uJustify,\r\n\t\ttextAlign: textAlign\r\n\t}\" @tap=\"click\">\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * col 布局单元格\r\n\t * @description 通过基础的 12 分栏，迅速简便地创建布局（搭配<u-row>使用）\r\n\t * @tutorial https://www.uviewui.com/components/layout.html\r\n\t * @property {String Number} span 栅格占据的列数，总12等分（默认0）\r\n\t * @property {String} text-align 文字水平对齐方式（默认left）\r\n\t * @property {String Number} offset 分栏左边偏移，计算方式与span相同（默认0）\r\n\t * @example <u-col span=\"3\"><view class=\"demo-layout bg-purple\"></view></u-col>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-col\",\r\n\t\tprops: {\r\n\t\t\t// 占父容器宽度的多少等分，总分为12份\r\n\t\t\tspan: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 12\r\n\t\t\t},\r\n\t\t\t// 指定栅格左侧的间隔数(总12栏)\r\n\t\t\toffset: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 水平排列方式，可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)\r\n\t\t\tjustify: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'start'\r\n\t\t\t},\r\n\t\t\t// 垂直对齐方式，可选值为top、center、bottom\r\n\t\t\talign: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'center'\r\n\t\t\t},\r\n\t\t\t// 文字对齐方式\r\n\t\t\ttextAlign: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'left'\r\n\t\t\t}\r\n\t\t},\r\n\t\tinject: ['gutter'],\r\n\t\tcomputed: {\r\n\t\t\tuJustify() {\r\n\t\t\t\tif (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify;\r\n\t\t\t\telse if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify;\r\n\t\t\t\telse return this.justify;\r\n\t\t\t},\r\n\t\t\tuAlignItem() {\r\n\t\t\t\tif (this.align == 'top') return 'flex-start';\r\n\t\t\t\tif (this.align == 'bottom') return 'flex-end';\r\n\t\t\t\telse return this.align;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tclick() {\r\n\t\t\t\tthis.$emit('click');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t.u-col {\r\n\t\t/* #ifdef MP-WEIXIN */\r\n\t\tfloat: left;\r\n\t\t/* #endif */\r\n\t}\r\n\r\n\t.u-col-0 {\r\n\t\twidth: 0;\r\n\t}\r\n\r\n\t.u-col-1 {\r\n\t\twidth: calc(100%/12);\r\n\t}\r\n\r\n\t.u-col-2 {\r\n\t\twidth: calc(100%/12 * 2);\r\n\t}\r\n\r\n\t.u-col-3 {\r\n\t\twidth: calc(100%/12 * 3);\r\n\t}\r\n\r\n\t.u-col-4 {\r\n\t\twidth: calc(100%/12 * 4);\r\n\t}\r\n\r\n\t.u-col-5 {\r\n\t\twidth: calc(100%/12 * 5);\r\n\t}\r\n\r\n\t.u-col-6 {\r\n\t\twidth: calc(100%/12 * 6);\r\n\t}\r\n\r\n\t.u-col-7 {\r\n\t\twidth: calc(100%/12 * 7);\r\n\t}\r\n\r\n\t.u-col-8 {\r\n\t\twidth: calc(100%/12 * 8);\r\n\t}\r\n\r\n\t.u-col-9 {\r\n\t\twidth: calc(100%/12 * 9);\r\n\t}\r\n\r\n\t.u-col-10 {\r\n\t\twidth: calc(100%/12 * 10);\r\n\t}\r\n\r\n\t.u-col-11 {\r\n\t\twidth: calc(100%/12 * 11);\r\n\t}\r\n\r\n\t.u-col-12 {\r\n\t\twidth: calc(100%/12 * 12);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-collapse/u-collapse.vue",
    "content": "<template>\r\n\t<view class=\"u-collapse\">\r\n\t\t<slot />\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * collapse 手风琴\r\n\t * @description 通过折叠面板收纳内容区域\r\n\t * @tutorial https://www.uviewui.com/components/collapse.html\r\n\t * @property {Boolean} accordion 是否手风琴模式（默认true）\r\n\t * @property {Boolean} arrow 是否显示标题右侧的箭头（默认true）\r\n\t * @property {String} arrow-color 标题右侧箭头的颜色（默认#909399）\r\n\t * @property {Object} head-style 标题自定义样式，对象形式\r\n\t * @property {Object} body-style 主体自定义样式，对象形式\r\n\t * @property {String} hover-class 样式类名，按下时有效（默认u-hover-class）\r\n\t * @event {Function} change 当前激活面板展开时触发(如果是手风琴模式，参数activeNames类型为String，否则为Array)\r\n\t * @example <u-collapse></u-collapse>\r\n\t */\r\n\texport default {\r\n\t\tname:\"u-collapse\",\r\n\t\tprops: {\r\n\t\t\t// 是否手风琴模式\r\n\t\t\taccordion: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 头部的样式\r\n\t\t\theadStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 主体的样式\r\n\t\t\tbodyStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 每一个item的样式\r\n\t\t\titemStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否显示右侧的箭头\r\n\t\t\tarrow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 箭头的颜色\r\n\t\t\tarrowColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#909399'\r\n\t\t\t},\r\n\t\t\t// 标题部分按压时的样式类，\"none\"为无效果\r\n\t\t\thoverClass: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'u-hover-class'\r\n\t\t\t}\r\n\t\t},\r\n\t\tprovide() {\r\n\t\t\treturn {\r\n\t\t\t\tuCollapse: this\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\tthis.childrens = []\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 重新初始化一次内部的所有子元素的高度计算，用于异步获取数据渲染的情况\r\n\t\t\tinit() {\r\n\t\t\t\tthis.childrens.forEach((vm, index) => {\r\n\t\t\t\t\tvm.init();\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// collapse item被点击，由collapse item调用父组件方法\r\n\t\t\tonChange() {\r\n\t\t\t\tlet activeItem = [];\r\n\t\t\t\tthis.childrens.forEach((vm, index) => {\r\n\t\t\t\t\tif (vm.isShow) {\r\n\t\t\t\t\t\tactiveItem.push(vm.nameSync);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t// 如果是手风琴模式，只有一个匹配结果，也即activeItem长度为1，将其转为字符串\r\n\t\t\t\tif (this.accordion) activeItem = activeItem.join('');\r\n\t\t\t\tthis.$emit('change', activeItem);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-collapse-item/u-collapse-item.vue",
    "content": "<template>\r\n\t<view class=\"u-collapse-item\" :style=\"[itemStyle]\">\r\n\t\t<view :hover-stay-time=\"200\" class=\"u-collapse-head\" @tap.stop=\"headClick\" :hover-class=\"hoverClass\" :style=\"[headStyle]\">\r\n\t\t\t<block v-if=\"!$slots['title-all']\">\r\n\t\t\t\t<view v-if=\"!$slots['title']\" class=\"u-collapse-title u-line-1\" :style=\"[{ textAlign: align ? align : 'left' },\r\n\t\t\t\t\tisShow && activeStyle && !arrow ? activeStyle : '']\">\r\n\t\t\t\t\t{{ title }}\r\n\t\t\t\t</view>\r\n\t\t\t\t<slot v-else name=\"title\" />\r\n\t\t\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t\t\t<u-icon v-if=\"arrow\" :color=\"arrowColor\" :class=\"{ 'u-arrow-down-icon-active': isShow }\"\r\n\t\t\t\t\t class=\"u-arrow-down-icon\" name=\"arrow-down\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t</block>\r\n\t\t\t<slot v-else name=\"title-all\" />\r\n\t\t</view>\r\n\t\t<view class=\"u-collapse-body\" :style=\"[{\r\n\t\t\t\theight: isShow ? height + 'px' : '0'\r\n\t\t\t}]\">\r\n\t\t\t<view class=\"u-collapse-content\" :id=\"elId\" :style=\"[bodyStyle]\">\r\n\t\t\t\t<slot></slot>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * collapseItem 手风琴Item\r\n\t * @description 通过折叠面板收纳内容区域（搭配u-collapse使用）\r\n\t * @tutorial https://www.uviewui.com/components/collapse.html\r\n\t * @property {String} title 面板标题\r\n\t * @property {String Number} index 主要用于事件的回调，标识那个Item被点击\r\n\t * @property {Boolean} disabled 面板是否可以打开或收起（默认false）\r\n\t * @property {Boolean} open 设置某个面板的初始状态是否打开（默认false）\r\n\t * @property {String Number} name 唯一标识符，如不设置，默认用当前collapse-item的索引值\r\n\t * @property {String} align 标题的对齐方式（默认left）\r\n\t * @property {Object} active-style 不显示箭头时，可以添加当前选择的collapse-item活动样式，对象形式\r\n\t * @event {Function} change 某个item被打开或者收起时触发\r\n\t * @example <u-collapse-item :title=\"item.head\" v-for=\"(item, index) in itemList\" :key=\"index\">{{item.body}}</u-collapse-item>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-collapse-item\",\r\n\t\tprops: {\r\n\t\t\t// 标题\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 标题的对齐方式\r\n\t\t\talign: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'left'\r\n\t\t\t},\r\n\t\t\t// 是否可以点击收起\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// collapse显示与否\r\n\t\t\topen: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 唯一标识符\r\n\t\t\tname: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t//活动样式\r\n\t\t\tactiveStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 标识当前为第几个\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tinject: ['uCollapse'],\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tisShow: false,\r\n\t\t\t\telId: this.$u.guid(),\r\n\t\t\t\theight: 0, // body内容的高度\r\n\t\t\t\theadStyle: {}, // 头部样式，对象形式\r\n\t\t\t\tbodyStyle: {}, // 主体部分样式\r\n\t\t\t\t//itemStyle: {}, // 每个item的整体样式\r\n\t\t\t\tarrowColor: '', // 箭头的颜色\r\n\t\t\t\thoverClass: '', // 头部按下时的效果样式类\r\n\t\t\t};\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.init();\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\topen(val) {\r\n\t\t\t\tthis.isShow = val;\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tarrow() {\r\n\t\t\t\treturn this.uCollapse.arrow;\r\n\t\t\t},\r\n\t\t\titemStyle() {\r\n\t\t\t\treturn this.uCollapse.itemStyle;\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 获取u-collapse的信息，放在u-collapse是为了方便，不用每个u-collapse-item写一遍\r\n\t\t\tthis.isShow = this.open;\r\n\t\t\tthis.nameSync = this.name ? this.name : this.uCollapse.childrens.length;\r\n\t\t\tthis.uCollapse.childrens.push(this);\r\n\t\t\t//this.itemStyle = this.uCollapse.itemStyle;\r\n\t\t\tthis.headStyle = this.uCollapse.headStyle;\r\n\t\t\tthis.bodyStyle = this.uCollapse.bodyStyle;\r\n\t\t\tthis.arrowColor = this.uCollapse.arrowColor;\r\n\t\t\tthis.hoverClass = this.uCollapse.hoverClass;\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 异步获取内容，或者动态修改了内容时，需要重新初始化\r\n\t\t\tinit() {\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.queryRect();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t// 点击collapsehead头部\r\n\t\t\theadClick() {\r\n\t\t\t\tif (this.disabled) return;\r\n\t\t\t\tif (this.uCollapse.accordion == true) {\r\n\t\t\t\t\tthis.uCollapse.childrens.map(val => {\r\n\t\t\t\t\t\t// 自身不设置为false，因为后面有this.isShow = !this.isShow;处理了\r\n\t\t\t\t\t\tif (this != val) {\r\n\t\t\t\t\t\t\tval.isShow = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.isShow = !this.isShow;\r\n\t\t\t\t// 触发本组件的事件\r\n\t\t\t\tthis.$emit('change', {\r\n\t\t\t\t\tindex: this.index,\r\n\t\t\t\t\tshow: this.isShow\r\n\t\t\t\t})\r\n\t\t\t\t// 只有在打开时才发出事件\r\n\t\t\t\tif (this.isShow) this.uCollapse.onChange();\r\n\t\t\t\tthis.$forceUpdate();\r\n\t\t\t},\r\n\t\t\t// 查询内容高度\r\n\t\t\tqueryRect() {\r\n\t\t\t\t// $uGetRect为uView自带的节点查询简化方法，详见文档介绍：https://www.uviewui.com/js/getRect.html\r\n\t\t\t\t// 组件内部一般用this.$uGetRect，对外的为this.$u.getRect，二者功能一致，名称不同\r\n\t\t\t\tthis.$uGetRect('#' + this.elId).then(res => {\r\n\t\t\t\t\tthis.height = res.height;\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-collapse-head {\r\n\t\tposition: relative;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tcolor: $u-main-color;\r\n\t\tfont-size: 30rpx;\r\n\t\tline-height: 1;\r\n\t\tpadding: 24rpx 0;\r\n\t\ttext-align: left;\r\n\t}\r\n\r\n\t.u-collapse-title {\r\n\t\tflex: 1;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t.u-arrow-down-icon {\r\n\t\ttransition: all 0.3s;\r\n\t\tmargin-right: 20rpx;\r\n\t\tmargin-left: 14rpx;\r\n\t}\r\n\r\n\t.u-arrow-down-icon-active {\r\n\t\ttransform: rotate(180deg);\r\n\t\ttransform-origin: center center;\r\n\t}\r\n\r\n\t.u-collapse-body {\r\n\t\toverflow: hidden;\r\n\t\ttransition: all 0.3s;\r\n\t}\r\n\r\n\t.u-collapse-content {\r\n\t\toverflow: hidden;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-tips-color;\r\n\t\ttext-align: left;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-column-notice/u-column-notice.vue",
    "content": "<template>\r\n\t<view\r\n\t\tclass=\"u-notice-bar\"\r\n\t\t:style=\"{\r\n\t\t\tbackground: computeBgColor,\r\n\t\t\tpadding: padding\r\n\t\t}\"\r\n\t\t:class=\"[\r\n\t\t\ttype ? `u-type-${type}-light-bg` : ''\r\n\t\t]\"\r\n\t>\r\n\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t<u-icon class=\"u-left-icon\" v-if=\"volumeIcon\" name=\"volume-fill\" :size=\"volumeSize\" :color=\"computeColor\"></u-icon>\r\n\t\t</view>\r\n\t\t<swiper :disable-touch=\"disableTouch\" @change=\"change\" :autoplay=\"autoplay && playState == 'play'\" :vertical=\"vertical\" circular :interval=\"duration\" class=\"u-swiper\">\r\n\t\t\t<swiper-item v-for=\"(item, index) in list\" :key=\"index\" class=\"u-swiper-item\">\r\n\t\t\t\t<view\r\n\t\t\t\t\tclass=\"u-news-item u-line-1\"\r\n\t\t\t\t\t:style=\"[textStyle]\"\r\n\t\t\t\t\t@tap=\"click(index)\"\r\n\t\t\t\t\t:class=\"['u-type-' + type]\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{ item }}\r\n\t\t\t\t</view>\r\n\t\t\t</swiper-item>\r\n\t\t</swiper>\r\n\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t<u-icon @click=\"getMore\" class=\"u-right-icon\" v-if=\"moreIcon\" name=\"arrow-right\" :size=\"26\" :color=\"computeColor\"></u-icon>\r\n\t\t\t<u-icon @click=\"close\" class=\"u-right-icon\" v-if=\"closeIcon\" name=\"close\" :size=\"24\" :color=\"computeColor\"></u-icon>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n\tprops: {\r\n\t\t// 显示的内容，数组\r\n\t\tlist: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 显示的主题，success|error|primary|info|warning\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'warning'\r\n\t\t},\r\n\t\t// 是否显示左侧的音量图标\r\n\t\tvolumeIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示右侧的右箭头图标\r\n\t\tmoreIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否显示右侧的关闭图标\r\n\t\tcloseIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否自动播放\r\n\t\tautoplay: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 文字颜色，各图标也会使用文字颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 滚动方向，row-水平滚动，column-垂直滚动\r\n\t\tdirection: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'row'\r\n\t\t},\r\n\t\t// 是否显示\r\n\t\tshow: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 字体大小，单位rpx\r\n\t\tfontSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 26\r\n\t\t},\r\n\t\t// 滚动一个周期的时间长，单位ms\r\n\t\tduration: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 2000\r\n\t\t},\r\n\t\t// 音量喇叭的大小\r\n\t\tvolumeSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 34\r\n\t\t},\r\n\t\t// 水平滚动时的滚动速度，即每秒滚动多少rpx，这有利于控制文字无论多少时，都能有一个恒定的速度\r\n\t\tspeed: {\r\n\t\t\ttype: Number,\r\n\t\t\tdefault: 160\r\n\t\t},\r\n\t\t// 水平滚动时，是否采用衔接形式滚动\r\n\t\tisCircular: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 滚动方向，horizontal-水平滚动，vertical-垂直滚动\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'horizontal'\r\n\t\t},\r\n\t\t// 播放状态，play-播放，paused-暂停\r\n\t\tplayState: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'play'\r\n\t\t},\r\n\t\t// 是否禁止用手滑动切换\r\n\t\t// 目前HX2.6.11，只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序\r\n\t\tdisableTouch: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 通知的边距\r\n\t\tpadding: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '18rpx 24rpx'\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\t// 计算字体颜色，如果没有自定义的，就用uview主题颜色\r\n\t\tcomputeColor() {\r\n\t\t\tif (this.color) return this.color;\r\n\t\t\t// 如果是无主题，就默认使用content-color\r\n\t\t\telse if(this.type == 'none') return '#606266';\r\n\t\t\telse return this.type;\r\n\t\t},\r\n\t\t// 文字内容的样式\r\n\t\ttextStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif (this.color) style.color = this.color;\r\n\t\t\telse if(this.type == 'none') style.color = '#606266';\r\n\t\t\tstyle.fontSize = this.fontSize + 'rpx';\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// 垂直或者水平滚动\r\n\t\tvertical() {\r\n\t\t\tif(this.mode == 'horizontal') return false;\r\n\t\t\telse return true;\r\n\t\t},\r\n\t\t// 计算背景颜色\r\n\t\tcomputeBgColor() {\r\n\t\t\tif (this.bgColor) return this.bgColor;\r\n\t\t\telse if(this.type == 'none') return 'transparent';\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\t// animation: false\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\t// 点击通告栏\r\n\t\tclick(index) {\r\n\t\t\tthis.$emit('click', index);\r\n\t\t},\r\n\t\t// 点击关闭按钮\r\n\t\tclose() {\r\n\t\t\tthis.$emit('close');\r\n\t\t},\r\n\t\t// 点击更多箭头按钮\r\n\t\tgetMore() {\r\n\t\t\tthis.$emit('getMore');\r\n\t\t},\r\n\t\tchange(e) {\r\n\t\t\tlet index = e.detail.current;\r\n\t\t\tif(index == this.list.length - 1) {\r\n\t\t\t\tthis.$emit('end');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-notice-bar {\r\n\twidth: 100%;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tflex-wrap: nowrap;\r\n\tpadding: 18rpx 24rpx;\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-swiper {\r\n\tfont-size: 26rpx;\r\n\theight: 32rpx;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tflex: 1;\r\n\tmargin-left: 12rpx;\r\n}\r\n\r\n.u-swiper-item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-news-item {\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-right-icon {\r\n\tmargin-left: 12rpx;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-left-icon {\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-count-down/u-count-down.vue",
    "content": "<template>\r\n\t<view class=\"u-countdown\">\r\n\t\t<view class=\"u-countdown-item\" :style=\"[itemStyle]\" v-if=\"showDays && (hideZeroDay || (!hideZeroDay && d != '0'))\">\r\n\t\t\t<view class=\"u-countdown-time\" :style=\"[letterStyle]\">\r\n\t\t\t\t{{ d }}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view\r\n\t\t\tclass=\"u-countdown-colon\"\r\n\t\t\t:style=\"{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}\"\r\n\t\t\tv-if=\"showDays && (hideZeroDay || (!hideZeroDay && d != '0'))\"\r\n\t\t>\r\n\t\t\t{{ separator == 'colon' ? ':' : '天' }}\r\n\t\t</view>\r\n\t\t<view class=\"u-countdown-item\" :style=\"[itemStyle]\" v-if=\"showHours\">\r\n\t\t\t<view class=\"u-countdown-time\" :style=\"{ fontSize: fontSize + 'rpx', color: color}\">\r\n\t\t\t\t{{ h }}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view\r\n\t\t\tclass=\"u-countdown-colon\"\r\n\t\t\t:style=\"{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}\"\r\n\t\t\tv-if=\"showHours\"\r\n\t\t>\r\n\t\t\t{{ separator == 'colon' ? ':' : '时' }}\r\n\t\t</view>\r\n\t\t<view class=\"u-countdown-item\" :style=\"[itemStyle]\" v-if=\"showMinutes\">\r\n\t\t\t<view class=\"u-countdown-time\" :style=\"{ fontSize: fontSize + 'rpx', color: color}\">\r\n\t\t\t\t{{ i }}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view\r\n\t\t\tclass=\"u-countdown-colon\"\r\n\t\t\t:style=\"{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}\"\r\n\t\t\tv-if=\"showMinutes\"\r\n\t\t>\r\n\t\t\t{{ separator == 'colon' ? ':' : '分' }}\r\n\t\t</view>\r\n\t\t<view class=\"u-countdown-item\" :style=\"[itemStyle]\" v-if=\"showSeconds\">\r\n\t\t\t<view class=\"u-countdown-time\" :style=\"{ fontSize: fontSize + 'rpx', color: color}\">\r\n\t\t\t\t{{ s }}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view\r\n\t\t\tclass=\"u-countdown-colon\"\r\n\t\t\t:style=\"{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}\"\r\n\t\t\tv-if=\"showSeconds && separator == 'zh'\"\r\n\t\t>\r\n\t\t\t秒\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * countDown 倒计时\r\n * @description 该组件一般使用于某个活动的截止时间上，通过数字的变化，给用户明确的时间感受，提示用户进行某一个行为操作。\r\n * @tutorial https://www.uviewui.com/components/countDown.html\r\n * @property {String Number} timestamp 倒计时，单位为秒\r\n * @property {Boolean} autoplay 是否自动开始倒计时，如果为false，需手动调用开始方法。见官网说明（默认true）\r\n * @property {String} separator 分隔符，colon为英文冒号，zh为中文（默认colon）\r\n * @property {String Number} separator-size 分隔符的字体大小，单位rpx（默认30）\r\n * @property {String} separator-color 分隔符的颜色（默认#303133）\r\n * @property {String Number} font-size 倒计时字体大小，单位rpx（默认30）\r\n * @property {Boolean} show-border 是否显示倒计时数字的边框（默认false）\r\n * @property {Boolean} hide-zero-day 当\"天\"的部分为0时，隐藏该字段 （默认true）\r\n * @property {String} border-color 数字边框的颜色（默认#303133）\r\n * @property {String} bg-color 倒计时数字的背景颜色（默认#ffffff）\r\n * @property {String} color 倒计时数字的颜色（默认#303133）\r\n * @property {String} height 数字高度值(宽度等同此值)，设置边框时看情况是否需要设置此值，单位rpx（默认auto）\r\n * @property {Boolean} show-days 是否显示倒计时的\"天\"部分（默认true）\r\n * @property {Boolean} show-hours 是否显示倒计时的\"时\"部分（默认true）\r\n * @property {Boolean} show-minutes 是否显示倒计时的\"分\"部分（默认true）\r\n * @property {Boolean} show-seconds 是否显示倒计时的\"秒\"部分（默认true）\r\n * @event {Function} end 倒计时结束\r\n * @event {Function} change 每秒触发一次，回调为当前剩余的倒计秒数\r\n * @example <u-count-down ref=\"uCountDown\" :timestamp=\"86400\" :autoplay=\"false\"></u-count-down>\r\n */\r\nexport default {\r\n\tname: 'u-count-down',\r\n\tprops: {\r\n\t\t// 倒计时的时间，秒为单位\r\n\t\ttimestamp: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否自动开始倒计时\r\n\t\tautoplay: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 用英文冒号(colon)或者中文(zh)当做分隔符，false的时候为中文，如：\"11:22\"或\"11时22秒\"\r\n\t\tseparator: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'colon'\r\n\t\t},\r\n\t\t// 分隔符的大小，单位rpx\r\n\t\tseparatorSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 30\r\n\t\t},\r\n\t\t// 分隔符颜色\r\n\t\tseparatorColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: \"#303133\"\r\n\t\t},\r\n\t\t// 字体颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#303133'\r\n\t\t},\r\n\t\t// 字体大小，单位rpx\r\n\t\tfontSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 30\r\n\t\t},\r\n\t\t// 背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#fff'\r\n\t\t},\r\n\t\t// 数字框高度，单位rpx\r\n\t\theight: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 'auto'\r\n\t\t},\r\n\t\t// 是否显示数字框\r\n\t\tshowBorder: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 边框颜色\r\n\t\tborderColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#303133'\r\n\t\t},\r\n\t\t// 是否显示秒\r\n\t\tshowSeconds: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示分钟\r\n\t\tshowMinutes: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示小时\r\n\t\tshowHours: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示“天”\r\n\t\tshowDays: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 当\"天\"的部分为0时，不显示\r\n\t\thideZeroDay: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\t// 监听时间戳的变化\r\n\t\ttimestamp(newVal, oldVal) {\r\n\t\t\t// 如果倒计时间发生变化，清除定时器，重新开始倒计时\r\n\t\t\tclearInterval(this.timer);\r\n\t\t\tthis.start();\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\td: '00', // 天的默认值\r\n\t\t\th: '00', // 小时的默认值\r\n\t\t\ti: '00', // 分钟的默认值\r\n\t\t\ts: '00', // 秒的默认值\r\n\t\t\ttimer: null ,// 定时器\r\n\t\t\tseconds: 0, // 记录不停倒计过程中变化的秒数\r\n\t\t};\r\n\t},\r\n\tcomputed: {\r\n\t\t// 倒计时item的样式，item为分别的时分秒部分的数字\r\n\t\titemStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif(this.height) {\r\n\t\t\t\tstyle.height = this.height + 'rpx';\r\n\t\t\t\tstyle.width = this.height + 'rpx';\r\n\t\t\t}\r\n\t\t\tif(this.showBorder) {\r\n\t\t\t\tstyle.borderStyle = 'solid';\r\n\t\t\t\tstyle.borderColor = this.borderColor;\r\n\t\t\t\tstyle.borderWidth = '1px';\r\n\t\t\t}\r\n\t\t\tif(this.bgColor) {\r\n\t\t\t\tstyle.backgroundColor = this.bgColor;\r\n\t\t\t}\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// 倒计时数字的样式\r\n\t\tletterStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif(this.fontSize) style.fontSize = this.fontSize +  'rpx';\r\n\t\t\tif(this.color) style.color = this.color;\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\t// 如果自动倒计时\r\n\t\tthis.autoplay && this.timestamp && this.start();\r\n\t},\r\n\tmethods: {\r\n\t\t// 倒计时\r\n\t\tstart() {\r\n\t\t\tif (this.timestamp <= 0) return;\r\n\t\t\tthis.seconds = Number(this.timestamp);\r\n\t\t\tthis.formatTime(this.seconds);\r\n\t\t\tthis.timer = setInterval(() => {\r\n\t\t\t\tthis.seconds--;\r\n\t\t\t\t// 发出change事件\r\n\t\t\t\tthis.$emit('change', this.seconds);\r\n\t\t\t\tif (this.seconds < 0) {\r\n\t\t\t\t\treturn this.end();\r\n\t\t\t\t}\r\n\t\t\t\tthis.formatTime(this.seconds);\r\n\t\t\t}, 1000);\r\n\t\t},\r\n\t\t// 格式化时间\r\n\t\tformatTime(seconds) {\r\n\t\t\t// 小于等于0的话，结束倒计时\r\n\t\t\tseconds <= 0 && this.end();\r\n\t\t\tlet [day, hour, minute, second] = [0, 0, 0, 0];\r\n\t\t\tday = Math.floor(seconds / (60 * 60 * 24));\r\n\t\t\t// 判断是否显示“天”参数，如果不显示，将天部分的值，加入到小时中\r\n\t\t\t// hour为给后面计算秒和分等用的(基于显示天的前提下计算)\r\n\t\t\thour = Math.floor(seconds / (60 * 60)) - day * 24;\r\n\t\t\t// showHour为需要显示的小时\r\n\t\t\tlet showHour = null;\r\n\t\t\tif(this.showDays) {\r\n\t\t\t\tshowHour = hour;\r\n\t\t\t} else {\r\n\t\t\t\t// 如果不显示天数，将“天”部分的时间折算到小时中去\r\n\t\t\t\tshowHour = Math.floor(seconds / (60 * 60));\r\n\t\t\t}\r\n\t\t\tminute = Math.floor(seconds / 60) - hour * 60 - day * 24 * 60;\r\n\t\t\tsecond = Math.floor(seconds) - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60;\r\n\t\t\t// 如果小于10，在前面补上一个\"0\"\r\n\t\t\tshowHour = showHour < 10 ? '0' + showHour : showHour;\r\n\t\t\tminute = minute < 10 ? '0' + minute : minute;\r\n\t\t\tsecond = second < 10 ? '0' + second : second;\r\n\t\t\tthis.d = day;\r\n\t\t\tthis.h = showHour;\r\n\t\t\tthis.i = minute;\r\n\t\t\tthis.s = second;\r\n\t\t},\r\n\t\t// 停止倒计时\r\n\t\tend() {\r\n\t\t\t// 清除定时器\r\n\t\t\tclearInterval(this.timer);\r\n\t\t\tthis.timer = null;\r\n\t\t\tthis.$emit('end', {});\r\n\t\t}\r\n\t},\r\n\tbeforeDestroy() {\r\n\t\tclearInterval(this.timer);\r\n\t\tthis.timer = null;\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-countdown {\r\n\t\tdisplay: inline-flex;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.u-countdown-item {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tpadding: 2rpx;\r\n\t\tborder-radius: 6rpx;\r\n\t\twhite-space: nowrap;\r\n\t\ttransform: translateZ(0);\r\n\t}\r\n\r\n\t.u-countdown-time {\r\n\t\tmargin: 0;\r\n\t\tpadding: 0;\r\n\t\tline-height: 1;\r\n\t}\r\n\r\n\t.u-countdown-colon {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\tpadding: 0 5rpx;\r\n\t\tline-height: 1;\r\n\t\talign-items: center;\r\n\t\tpadding-bottom: 4rpx;\r\n\t}\r\n\r\n\t.u-countdown-scale {\r\n\t\ttransform: scale(0.9);\r\n\t\ttransform-origin: center center;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-count-to/u-count-to.vue",
    "content": "<template>\r\n\t<view\r\n\t\tclass=\"u-count-num\"\r\n\t\t:style=\"{\r\n\t\t\tfontSize: fontSize + 'rpx',\r\n\t\t\tfontWeight: bold ? 'bold' : 'normal',\r\n\t\t\tcolor: color\r\n\t\t}\"\r\n\t>\r\n\t\t{{ displayValue }}\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * countTo 数字滚动\r\n * @description 该组件一般用于需要滚动数字到某一个值的场景，目标要求是一个递增的值。\r\n * @tutorial https://www.uviewui.com/components/countTo.html\r\n * @property {String Number} start-val 开始值\r\n * @property {String Number} end-val 结束值\r\n * @property {String Number} duration 滚动过程所需的时间，单位ms（默认2000）\r\n * @property {Boolean} autoplay 是否自动开始滚动（默认true）\r\n * @property {String Number} decimals 要显示的小数位数，见官网说明（默认0）\r\n * @property {Boolean} use-easing 滚动结束时，是否缓动结尾，见官网说明（默认true）\r\n * @property {String} separator 千位分隔符，见官网说明\r\n * @property {String} color 字体颜色（默认#303133）\r\n * @property {String Number} font-size 字体大小，单位rpx（默认50）\r\n * @property {Boolean} bold 字体是否加粗（默认false）\r\n * @event {Function} end 数值滚动到目标值时触发\r\n * @example <u-count-to ref=\"uCountTo\" :end-val=\"endVal\" :autoplay=\"autoplay\"></u-count-to>\r\n */\r\nexport default {\r\n\tname: 'u-count-to',\r\n\tprops: {\r\n\t\t// 开始的数值，默认从0增长到某一个数\r\n\t\tstartVal: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 要滚动的目标数值，必须\r\n\t\tendVal: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0,\r\n\t\t\trequired: true\r\n\t\t},\r\n\t\t// 滚动到目标数值的动画持续时间，单位为毫秒（ms）\r\n\t\tduration: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 2000\r\n\t\t},\r\n\t\t// 设置数值后是否自动开始滚动\r\n\t\tautoplay: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 要显示的小数位数\r\n\t\tdecimals: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否在即将到达目标数值的时候，使用缓慢滚动的效果\r\n\t\tuseEasing: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 十进制分割\r\n\t\tdecimal: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '.'\r\n\t\t},\r\n\t\t// 字体颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#303133'\r\n\t\t},\r\n\t\t// 字体大小\r\n\t\tfontSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 50\r\n\t\t},\r\n\t\t// 是否加粗字体\r\n\t\tbold: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 千位分隔符，类似金额的分割(￥23,321.05中的\",\")\r\n\t\tseparator: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tlocalStartVal: this.startVal,\r\n\t\t\tdisplayValue: this.formatNumber(this.startVal),\r\n\t\t\tprintVal: null,\r\n\t\t\tpaused: false, // 是否暂停\r\n\t\t\tlocalDuration: Number(this.duration),\r\n\t\t\tstartTime: null, // 开始的时间\r\n\t\t\ttimestamp: null, // 时间戳\r\n\t\t\tremaining: null, // 停留的时间\r\n\t\t\trAF: null,\r\n\t\t\tlastTime: 0 // 上一次的时间\r\n\t\t};\r\n\t},\r\n\tcomputed: {\r\n\t\tcountDown() {\r\n\t\t\treturn this.startVal > this.endVal;\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tstartVal() {\r\n\t\t\tthis.autoplay && this.start();\r\n\t\t},\r\n\t\tendVal() {\r\n\t\t\tthis.autoplay && this.start();\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.autoplay && this.start();\r\n\t},\r\n\tmethods: {\r\n\t\teasingFn(t, b, c, d) {\r\n\t\t\treturn (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;\r\n\t\t},\r\n\t\trequestAnimationFrame(callback) {\r\n\t\t\tconst currTime = new Date().getTime();\r\n\t\t\t// 为了使setTimteout的尽可能的接近每秒60帧的效果\r\n\t\t\tconst timeToCall = Math.max(0, 16 - (currTime - this.lastTime));\r\n\t\t\tconst id = setTimeout(() => {\r\n\t\t\t\tcallback(currTime + timeToCall);\r\n\t\t\t}, timeToCall);\r\n\t\t\tthis.lastTime = currTime + timeToCall;\r\n\t\t\treturn id;\r\n\t\t},\r\n\r\n\t\tcancelAnimationFrame(id) {\r\n\t\t\tclearTimeout(id);\r\n\t\t},\r\n\t\t// 开始滚动数字\r\n\t\tstart() {\r\n\t\t\tthis.localStartVal = this.startVal;\r\n\t\t\tthis.startTime = null;\r\n\t\t\tthis.localDuration = this.duration;\r\n\t\t\tthis.paused = false;\r\n\t\t\tthis.rAF = this.requestAnimationFrame(this.count);\r\n\t\t},\r\n\t\t// 暂定状态，重新再开始滚动；或者滚动状态下，暂停\r\n\t\treStart() {\r\n\t\t\tif (this.paused) {\r\n\t\t\t\tthis.resume();\r\n\t\t\t\tthis.paused = false;\r\n\t\t\t} else {\r\n\t\t\t\tthis.stop();\r\n\t\t\t\tthis.paused = true;\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 暂停\r\n\t\tstop() {\r\n\t\t\tthis.cancelAnimationFrame(this.rAF);\r\n\t\t},\r\n\t\t// 重新开始(暂停的情况下)\r\n\t\tresume() {\r\n\t\t\tthis.startTime = null;\r\n\t\t\tthis.localDuration = this.remaining;\r\n\t\t\tthis.localStartVal = this.printVal;\r\n\t\t\tthis.requestAnimationFrame(this.count);\r\n\t\t},\r\n\t\t// 重置\r\n\t\treset() {\r\n\t\t\tthis.startTime = null;\r\n\t\t\tthis.cancelAnimationFrame(this.rAF);\r\n\t\t\tthis.displayValue = this.formatNumber(this.startVal);\r\n\t\t},\r\n\t\tcount(timestamp) {\r\n\t\t\tif (!this.startTime) this.startTime = timestamp;\r\n\t\t\tthis.timestamp = timestamp;\r\n\t\t\tconst progress = timestamp - this.startTime;\r\n\t\t\tthis.remaining = this.localDuration - progress;\r\n\t\t\tif (this.useEasing) {\r\n\t\t\t\tif (this.countDown) {\r\n\t\t\t\t\tthis.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (this.countDown) {\r\n\t\t\t\t\tthis.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (this.countDown) {\r\n\t\t\t\tthis.printVal = this.printVal < this.endVal ? this.endVal : this.printVal;\r\n\t\t\t} else {\r\n\t\t\t\tthis.printVal = this.printVal > this.endVal ? this.endVal : this.printVal;\r\n\t\t\t}\r\n\t\t\tthis.displayValue = this.formatNumber(this.printVal);\r\n\t\t\tif (progress < this.localDuration) {\r\n\t\t\t\tthis.rAF = this.requestAnimationFrame(this.count);\r\n\t\t\t} else {\r\n\t\t\t\tthis.$emit('end');\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 判断是否数字\r\n\t\tisNumber(val) {\r\n\t\t\treturn !isNaN(parseFloat(val));\r\n\t\t},\r\n\t\tformatNumber(num) {\r\n\t\t\t// 将num转为Number类型，因为其值可能为字符串数值，调用toFixed会报错\r\n\t\t\tnum = Number(num);\r\n\t\t\tnum = num.toFixed(Number(this.decimals));\r\n\t\t\tnum += '';\r\n\t\t\tconst x = num.split('.');\r\n\t\t\tlet x1 = x[0];\r\n\t\t\tconst x2 = x.length > 1 ? this.decimal + x[1] : '';\r\n\t\t\tconst rgx = /(\\d+)(\\d{3})/;\r\n\t\t\tif (this.separator && !this.isNumber(this.separator)) {\r\n\t\t\t\twhile (rgx.test(x1)) {\r\n\t\t\t\t\tx1 = x1.replace(rgx, '$1' + this.separator + '$2');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn x1 + x2;\r\n\t\t},\r\n\t\tdestroyed() {\r\n\t\t\tthis.cancelAnimationFrame(this.rAF);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-count-num {\r\n\tdisplay: inline-block;\r\n\ttext-align: center;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-divider/u-divider.vue",
    "content": "<template>\r\n\t<view class=\"u-divider\" :style=\"{\r\n\t\theight: height == 'auto' ? 'auto' : height + 'rpx',\r\n\t\tbackgroundColor: bgColor,\r\n\t\tmarginBottom: marginBottom + 'rpx',\r\n\t\tmarginTop: marginTop + 'rpx'\r\n\t}\" @tap=\"click\">\r\n\t\t<view class=\"u-divider-line\" :class=\"[type ? 'u-divider-line--bordercolor--' + type : '']\" :style=\"[lineStyle]\"></view>\r\n\t\t<view v-if=\"useSlot\" class=\"u-divider-text\" :style=\"{\r\n\t\t\tcolor: color,\r\n\t\t\tfontSize: fontSize + 'rpx'\r\n\t\t}\"><slot /></view>\r\n\t\t<view class=\"u-divider-line\" :class=\"[type ? 'u-divider-line--bordercolor--' + type : '']\" :style=\"[lineStyle]\"></view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * divider 分割线\r\n * @description 区隔内容的分割线，一般用于页面底部\"没有更多\"的提示。\r\n * @tutorial https://www.uviewui.com/components/divider.html\r\n * @property {String Number} half-width 文字左或右边线条宽度，数值或百分比，数值时单位为rpx\r\n * @property {String} border-color 线条颜色，优先级高于type（默认#dcdfe6）\r\n * @property {String} color 文字颜色（默认#909399）\r\n * @property {String Number} fontSize 字体大小，单位rpx（默认26）\r\n * @property {String} bg-color 整个divider的背景颜色（默认呢#ffffff）\r\n * @property {String Number} height 整个divider的高度，单位rpx（默认40）\r\n * @property {String} type 将线条设置主题色（默认primary）\r\n * @property {Boolean} useSlot 是否使用slot传入内容，如果不传入，中间不会有空隙（默认true）\r\n * @property {String Number} margin-top 与前一个组件的距离，单位rpx（默认0）\r\n * @property {String Number} margin-bottom 与后一个组件的距离，单位rpx（0）\r\n * @event {Function} click divider组件被点击时触发\r\n * @example <u-divider color=\"#fa3534\">长河落日圆</u-divider>\r\n */\r\nexport default {\r\n\tname: 'u-divider',\r\n\tprops: {\r\n\t\t// 单一边divider横线的宽度(数值)，单位rpx。或者百分比\r\n\t\thalfWidth: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 150\r\n\t\t},\r\n\t\t// divider横线的颜色，如设置，\r\n\t\tborderColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#dcdfe6'\r\n\t\t},\r\n\t\t// 主题色，可以是primary|info|success|warning|error之一值\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'primary'\r\n\t\t},\r\n\t\t// 文字颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#909399'\r\n\t\t},\r\n\t\t// 文字大小，单位rpx\r\n\t\tfontSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 26\r\n\t\t},\r\n\t\t// 整个divider的背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#ffffff'\r\n\t\t},\r\n\t\t// 整个divider的高度单位rpx\r\n\t\theight: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 'auto'\r\n\t\t},\r\n\t\t// 上边距\r\n\t\tmarginTop: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 下边距\r\n\t\tmarginBottom: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否使用slot传入内容，如果不用slot传入内容，先的中间就不会有空隙\r\n\t\tuseSlot: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\tlineStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif(String(this.halfWidth).indexOf('%') != -1) style.width = this.halfWidth;\r\n\t\t\telse style.width = this.halfWidth + 'rpx';\r\n\t\t\t// borderColor优先级高于type值\r\n\t\t\tif(this.borderColor) style.borderColor = this.borderColor;\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tclick() {\r\n\t\t\tthis.$emit('click');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n.u-divider {\r\n\twidth: 100%;\r\n\tposition: relative;\r\n\ttext-align: center;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n\toverflow: hidden;\r\n\tflex-direction: row;\r\n}\r\n\r\n.u-divider-line {\r\n\tborder-bottom: 1px solid $u-border-color;\r\n\ttransform: scale(1, 0.5);\r\n\ttransform-origin: center;\r\n\t\r\n\t&--bordercolor--primary {\r\n\t\tborder-color: $u-type-primary;\r\n\t}\r\n\t\r\n\t&--bordercolor--success {\r\n\t\tborder-color: $u-type-success;\r\n\t}\r\n\t\r\n\t&--bordercolor--error {\r\n\t\tborder-color: $u-type-primary;\r\n\t}\r\n\t\r\n\t&--bordercolor--info {\r\n\t\tborder-color: $u-type-info;\r\n\t}\r\n\t\r\n\t&--bordercolor--warning {\r\n\t\tborder-color: $u-type-warning;\r\n\t}\r\n}\r\n\r\n.u-divider-text {\r\n\twhite-space: nowrap;\r\n\tpadding: 0 16rpx;\r\n\tdisplay: inline-flex;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-dropdown-list/u-dropdown-list.vue",
    "content": "<template>\r\n  <view class=\"dropdown-list-wapper u-flex u-flex-1\">\r\n    <view\r\n      v-for=\"(drop, index) in dropdownListFromFather\"\r\n      :key=\"drop.name\"\r\n      :show=\"drop.show\"\r\n      class=\"u-selected-class u-dropdown-list\"\r\n      :style=\"{ zIndex: zIndex + 1 }\"\r\n    >\r\n      <slot name=\"selectionbox\">\r\n        <view\r\n          :style=\"{ height: top + 'rpx' }\"\r\n          class=\"drop-item u-flex u-justify-center\"\r\n          @click=\"handleDropClick(drop)\"\r\n        >\r\n          <text :style=\"{ color: drop.show ? activeColor : '#999' }\">\r\n            {{ getTitle(drop.options) }}\r\n          </text>\r\n          <view\r\n            class=\"u-animation\"\r\n            :class=\"[drop.show ? 'u-animation-show' : '']\"\r\n          >\r\n            <u-icon\r\n              v-if=\"drop.show\"\r\n              name=\"arrow-up-fill\"\r\n              :size=\"18\"\r\n              :color=\"activeColor\"\r\n            ></u-icon>\r\n            <u-icon v-else name=\"arrow-down-fill\" :size=\"18\"></u-icon>\r\n          </view>\r\n        </view>\r\n      </slot>\r\n      <view\r\n        class=\"u-dropdown-view\"\r\n        :class=\"[drop.show ? 'u-dropdownlist-show' : '']\"\r\n        :style=\"{\r\n          background: bgcolor,\r\n          height: drop.show ? 'auto' : 0,\r\n          top: top + 'rpx'\r\n        }\"\r\n      >\r\n        <slot name=\"dropdownbox\">\r\n          <view class=\"u-selected-list\">\r\n            <view\r\n              class=\"select-item u-flex u-align-center u-border-bottom u-align-between\"\r\n              :style=\"{ color: select.select ? activeColor : '#666666' }\"\r\n              @tap=\"handleSelected(select, drop.options)\"\r\n              v-for=\"(select, n) in drop.options\"\r\n              :key=\"n\"\r\n            >\r\n              <text>{{ select.text }}</text>\r\n              <u-icon\r\n                v-if=\"select.select\"\r\n                class=\"select-icon\"\r\n                :color=\"activeColor\"\r\n                size=\"35\"\r\n                name=\"checkmark\"\r\n              ></u-icon>\r\n            </view>\r\n          </view>\r\n        </slot>\r\n      </view>\r\n    </view>\r\n    <u-mask\r\n      duration=\"100\"\r\n      :show=\"dropdownShow\"\r\n      @click=\"closeMask\"\r\n      :z-index=\"zIndex\"\r\n    ></u-mask>\r\n  </view>\r\n</template>\r\n\r\n<script>\r\nconst dropdownOption1 = [\r\n  { id: 0, text: '类型', value: '', select: false },\r\n  { id: 1, text: '全场券', value: 1, select: false },\r\n  { id: 2, text: '品类券', value: 2, select: false },\r\n  { id: 3, text: '单品券', value: 3, select: false },\r\n  { id: 4, text: '业务券', value: 4, select: false }\r\n]\r\nconst dropdownOption2 = [\r\n  { id: 5, text: '状态', value: '', select: false },\r\n  { id: 6, text: '可使用', value: 1, select: false },\r\n  { id: 7, text: '已过期', value: 2, select: false }\r\n]\r\nconst dropdownOption3 = [\r\n  { id: 8, text: '优惠力度', value: '', select: false },\r\n  { id: 9, text: '满100-20', value: 1, select: false },\r\n  { id: 10, text: '满100-50', value: 2, select: false }\r\n]\r\n\r\nexport default {\r\n  props: {\r\n    // 下拉框数据\r\n    dropdownList: {\r\n      type: Array,\r\n      default: () => [\r\n        { show: false, options: dropdownOption1 },\r\n        { show: false, options: dropdownOption2 },\r\n        { show: false, options: dropdownOption3 }\r\n      ],\r\n      required: true,\r\n      validator: value =>\r\n        value.every(item => Array.isArray(item.options) && item.options.length)\r\n    },\r\n    //背景颜色\r\n    bgcolor: {\r\n      type: String,\r\n      default: 'none'\r\n    },\r\n    //top rpx 选择框高度也用这个值\r\n    top: {\r\n      type: Number,\r\n      default: 90\r\n    },\r\n    // 菜单标题和选项的选中态颜色\r\n    activeColor: {\r\n      type: String,\r\n      default: '#e7141a'\r\n    },\r\n    // mask和下拉列表的z-index\r\n    zIndex: {\r\n      type: [String, Number],\r\n      default: 21\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      dropdownShow: false,\r\n      dropdownListFromFather: this.dropdownList\r\n    }\r\n  },\r\n  computed: {},\r\n  methods: {\r\n    getTitle(item = []) {\r\n      const obj = item.find(v => v.select) || {}\r\n      if (obj.select) {\r\n        return obj.text\r\n      } else {\r\n        if (item[0]) {\r\n          item[0].select = true\r\n          return item[0].text\r\n        }\r\n      }\r\n      return ''\r\n    },\r\n    handleDropClick(item) {\r\n      if (item.show) {\r\n        item.show = false\r\n        this.dropdownShow = false\r\n        return\r\n      }\r\n      this.dropdownListFromFather.map(item => {\r\n        item.show = false\r\n      })\r\n      const t = setTimeout(() => {\r\n        item.show = true\r\n        this.dropdownShow = true\r\n        clearTimeout(t)\r\n      }, 100)\r\n    },\r\n    closeMask() {\r\n      this.dropdownShow = false\r\n      this.dropdownListFromFather.map(item => {\r\n        item.show = false\r\n      })\r\n    },\r\n    handleSelected(select, options) {\r\n      options.map(item => {\r\n        item.select = false\r\n      })\r\n      select.select = true\r\n      this.closeMask()\r\n      // 返回选中对象和下拉列表数组\r\n      this.$emit('change', select, options)\r\n    }\r\n  },\r\n  watch: {\r\n    dropdownList: {\r\n      handler(v) {\r\n        this.dropdownListFromFather = v\r\n      },\r\n      deep: true\r\n    }\r\n  }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n.dropdown-list-wapper {\r\n  position: relative;\r\n}\r\n.u-dropdown-view {\r\n  width: 100%;\r\n  overflow: hidden;\r\n  position: absolute;\r\n  z-index: 9999;\r\n  left: 0;\r\n  right: 0;\r\n  /* opacity: 0; */\r\n  visibility: hidden;\r\n  transition: height 0.5s ease-in-out;\r\n  .u-selected-list {\r\n    background-color: #fff;\r\n    .select-item {\r\n      color: #666666;\r\n      font-size: 28rpx;\r\n      padding: 30rpx 54rpx 30rpx 30rpx;\r\n      margin-left: 30rpx;\r\n    }\r\n    .select-item.selectActive {\r\n      color: #e7141a;\r\n    }\r\n  }\r\n}\r\n\r\n.u-dropdownlist-show {\r\n  /* opacity: 1; */\r\n  visibility: visible;\r\n}\r\n.u-dropdown-list {\r\n  flex: 1;\r\n  // z-index: 22;\r\n  background: #fff;\r\n  position: static;\r\n}\r\n.drop-item {\r\n  justify-content: center;\r\n  color: #999999;\r\n  font-size: 30rpx;\r\n  > text {\r\n    margin-right: 10rpx;\r\n  }\r\n  /deep/ {\r\n    .uicon {\r\n      position: relative;\r\n      top: -2rpx;\r\n    }\r\n  }\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-empty/u-empty.vue",
    "content": "<template>\r\n\t<view class=\"u-empty\" v-if=\"show\" :style=\"{\r\n\t\tmarginTop: marginTop + 'rpx'\r\n\t}\">\r\n\t\t<u-icon\r\n\t\t\t:name=\"src ? src : 'empty-' + mode\"\r\n\t\t\t:custom-style=\"iconStyle\"\r\n\t\t\t:label=\"text ? text : icons[mode]\"\r\n\t\t\tlabel-pos=\"bottom\"\r\n\t\t\t:label-color=\"color\"\r\n\t\t\t:label-size=\"fontSize\"\r\n\t\t\t:size=\"iconSize\"\r\n\t\t\t:color=\"iconColor\"\r\n\t\t\tmargin-top=\"14\"\r\n\t\t></u-icon>\r\n\t\t<view class=\"u-slot-wrap\">\r\n\t\t\t<slot name=\"bottom\"></slot>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * empty 内容为空\r\n\t * @description 该组件用于需要加载内容，但是加载的第一页数据就为空，提示一个\"没有内容\"的场景， 我们精心挑选了十几个场景的图标，方便您使用。\r\n\t * @tutorial https://www.uviewui.com/components/empty.html\r\n\t * @property {String} color 文字颜色（默认#c0c4cc）\r\n\t * @property {String} text 文字提示（默认“无内容”）\r\n\t * @property {String} src 自定义图标路径，如定义，mode参数会失效\r\n\t * @property {String Number} font-size 提示文字的大小，单位rpx（默认28）\r\n\t * @property {String} mode 内置的图标，见官网说明（默认data）\r\n\t * @property {String Number} img-width 图标的宽度，单位rpx（默认240）\r\n\t * @property {String} img-height 图标的高度，单位rpx（默认auto）\r\n\t * @property {String Number} margin-top 组件距离上一个元素之间的距离（默认0）\r\n\t * @property {Boolean} show 是否显示组件（默认true）\r\n\t * @event {Function} click 点击组件时触发\r\n\t * @event {Function} close 点击关闭按钮时触发\r\n\t * @example <u-empty text=\"所谓伊人，在水一方\" mode=\"list\"></u-empty>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-empty\",\r\n\t\tprops: {\r\n\t\t\t// 图标路径\r\n\t\t\tsrc: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 提示文字\r\n\t\t\ttext: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 文字颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#c0c4cc'\r\n\t\t\t},\r\n\t\t\t// 图标的颜色\r\n\t\t\ticonColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#c0c4cc'\r\n\t\t\t},\r\n\t\t\t// 图标的大小\r\n\t\t\ticonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 120\r\n\t\t\t},\r\n\t\t\t// 文字大小，单位rpx\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 26\r\n\t\t\t},\r\n\t\t\t// 选择预置的图标类型\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'data'\r\n\t\t\t},\r\n\t\t\t//  图标宽度，单位rpx\r\n\t\t\timgWidth: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 120\r\n\t\t\t},\r\n\t\t\t// 图标高度，单位rpx\r\n\t\t\timgHeight: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 'auto'\r\n\t\t\t},\r\n\t\t\t// 是否显示组件\r\n\t\t\tshow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 组件距离上一个元素之间的距离\r\n\t\t\tmarginTop: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\ticonStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\ticons: {\r\n\t\t\t\t\tcar: '购物车为空',\r\n\t\t\t\t\tpage: '页面不存在',\r\n\t\t\t\t\tsearch: '没有搜索结果',\r\n\t\t\t\t\taddress: '没有收货地址',\r\n\t\t\t\t\twifi: '没有WiFi',\r\n\t\t\t\t\torder: '订单为空',\r\n\t\t\t\t\tcoupon: '没有优惠券',\r\n\t\t\t\t\tfavor: '暂无收藏',\r\n\t\t\t\t\tpermission: '无权限',\r\n\t\t\t\t\thistory: '无历史记录',\r\n\t\t\t\t\tnews: '无新闻列表',\r\n\t\t\t\t\tmessage: '消息列表为空',\r\n\t\t\t\t\tlist: '列表为空',\r\n\t\t\t\t\tdata: '数据为空'\r\n\t\t\t\t},\r\n\t\t\t\t// icons: [{\r\n\t\t\t\t// \ticon: 'car',\r\n\t\t\t\t// \ttext: '购物车为空'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'page',\r\n\t\t\t\t// \ttext: '页面不存在'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'search',\r\n\t\t\t\t// \ttext: '没有搜索结果'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'address',\r\n\t\t\t\t// \ttext: '没有收货地址'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'wifi',\r\n\t\t\t\t// \ttext: '没有WiFi'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'order',\r\n\t\t\t\t// \ttext: '订单为空'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'coupon',\r\n\t\t\t\t// \ttext: '没有优惠券'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'favor',\r\n\t\t\t\t// \ttext: '暂无收藏'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'permission',\r\n\t\t\t\t// \ttext: '无权限'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'history',\r\n\t\t\t\t// \ttext: '无历史记录'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'news',\r\n\t\t\t\t// \ttext: '无新闻列表'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'message',\r\n\t\t\t\t// \ttext: '消息列表为空'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'list',\r\n\t\t\t\t// \ttext: '列表为空'\r\n\t\t\t\t// },{\r\n\t\t\t\t// \ticon: 'data',\r\n\t\t\t\t// \ttext: '数据为空'\r\n\t\t\t\t// }],\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-empty {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t.u-image {\r\n\t\tmargin-bottom: 20rpx;\r\n\t}\r\n\r\n\t.u-slot-wrap {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tmargin-top: 20rpx;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-field/u-field.vue",
    "content": "<template>\r\n\t<view class=\"u-field\" :class=\"{'u-border-top': borderTop, 'u-border-bottom': borderBottom }\">\r\n\t\t<view class=\"u-field-inner\" :class=\"[type == 'textarea' ? 'u-textarea-inner' : '', 'u-label-postion-' + labelPosition]\">\r\n\t\t\t<view class=\"u-label\" :class=\"[required ? 'u-required' : '']\" :style=\"{\r\n\t\t\t\tjustifyContent: justifyContent, \r\n\t\t\t\tflex: labelPosition == 'left' ? `0 0 ${labelWidth}rpx` : '1'\r\n\t\t\t}\">\r\n\t\t\t\t<view class=\"u-icon-wrap\" v-if=\"icon\">\r\n\t\t\t\t\t<u-icon size=\"32\" :custom-style=\"iconStyle\" :name=\"icon\" :color=\"iconColor\" class=\"u-icon\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t\t<slot name=\"icon\"></slot>\r\n\t\t\t\t<text class=\"u-label-text\" :class=\"[this.$slots.icon || icon ? 'u-label-left-gap' : '']\">{{ label }}</text>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"fild-body\">\r\n\t\t\t\t<view class=\"u-flex-1 u-flex\" :style=\"[inputWrapStyle]\">\r\n\t\t\t\t\t<textarea v-if=\"type == 'textarea'\" class=\"u-flex-1 u-textarea-class\" :style=\"[fieldStyle]\" :value=\"value\"\r\n\t\t\t\t\t :placeholder=\"placeholder\" :placeholderStyle=\"placeholderStyle\" :disabled=\"disabled\" :maxlength=\"inputMaxlength\"\r\n\t\t\t\t\t :focus=\"focus\" :autoHeight=\"autoHeight\" :fixed=\"fixed\" @input=\"onInput\" @blur=\"onBlur\" @focus=\"onFocus\" @confirm=\"onConfirm\"\r\n\t\t\t\t\t @tap=\"fieldClick\" />\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\tv-else\r\n\t\t\t\t\t\t:style=\"[fieldStyle]\"\r\n\t\t\t\t\t\t:type=\"type\"\r\n\t\t\t\t\t\tclass=\"u-flex-1 u-field__input-wrap\"\r\n\t\t\t\t\t\t:value=\"value\"\r\n\t\t\t\t\t\t:password=\"password || this.type === 'password'\"\r\n\t\t\t\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t\t\t\t:placeholderStyle=\"placeholderStyle\"\r\n\t\t\t\t\t\t:disabled=\"disabled\"\r\n\t\t\t\t\t\t:maxlength=\"inputMaxlength\"\r\n\t\t\t\t\t\t:focus=\"focus\"\r\n\t\t\t\t\t\t:confirmType=\"confirmType\"\r\n\t\t\t\t\t\t@focus=\"onFocus\"\r\n\t\t\t\t\t\t@blur=\"onBlur\"\r\n\t\t\t\t\t\t@input=\"onInput\"\r\n\t\t\t\t\t\t@confirm=\"onConfirm\"\r\n\t\t\t\t\t\t@tap=\"fieldClick\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</view>\r\n\t\t\t\t<u-icon :size=\"clearSize\" v-if=\"clearable && value != '' && focused\" name=\"close-circle-fill\" color=\"#c0c4cc\" class=\"u-clear-icon\" @touchstart=\"onClear\"/>\r\n\t\t\t\t<view class=\"u-button-wrap\"><slot name=\"right\" /></view>\r\n\t\t\t\t<u-icon v-if=\"rightIcon\" @click=\"rightIconClick\" :name=\"rightIcon\" color=\"#c0c4cc\" :style=\"[rightIconStyle]\" size=\"26\" class=\"u-arror-right\" />\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view v-if=\"errorMessage !== false && errorMessage != ''\" class=\"u-error-message\" :style=\"{\r\n\t\t\tpaddingLeft: labelWidth + 'rpx'\r\n\t\t}\">{{ errorMessage }}</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * field 输入框\r\n * @description 借助此组件，可以实现表单的输入， 有\"text\"和\"textarea\"类型的，此外，借助uView的picker和actionSheet组件可以快速实现上拉菜单，时间，地区选择等， 为表单解决方案的利器。\r\n * @tutorial https://www.uviewui.com/components/field.html\r\n * @property {String} type 输入框的类型（默认text）\r\n * @property {String} icon label左边的图标，限uView的图标名称\r\n * @property {Object} icon-style 左边图标的样式，对象形式\r\n * @property {Boolean} right-icon 输入框右边的图标名称，限uView的图标名称（默认false）\r\n * @property {Boolean} required 是否必填，左边您显示红色\"*\"号（默认false）\r\n * @property {String} label 输入框左边的文字提示\r\n * @property {Boolean} password 是否密码输入方式(用点替换文字)，type为text时有效（默认false）\r\n * @property {Boolean} clearable 是否显示右侧清空内容的图标控件(输入框有内容，且获得焦点时才显示)，点击可清空输入框内容（默认true）\r\n * @property {Number String} label-width label的宽度，单位rpx（默认130）\r\n * @property {String} label-align label的文字对齐方式（默认left）\r\n * @property {Object} field-style 自定义输入框的样式，对象形式\r\n * @property {Number | String} clear-size 清除图标的大小，单位rpx（默认30）\r\n * @property {String} input-align 输入框内容对齐方式（默认left）\r\n * @property {Boolean} border-bottom 是否显示field的下边框（默认true）\r\n * @property {Boolean} border-top 是否显示field的上边框（默认false）\r\n * @property {String} icon-color 左边通过icon配置的图标的颜色（默认#606266）\r\n * @property {Boolean} auto-height 是否自动增高输入区域，type为textarea时有效（默认true）\r\n * @property {String Boolean} error-message 显示的错误提示内容，如果为空字符串或者false，则不显示错误信息\r\n * @property {String} placeholder 输入框的提示文字\r\n * @property {String} placeholder-style placeholder的样式(内联样式，字符串)，如\"color: #ddd\"\r\n * @property {Boolean} focus 是否自动获得焦点（默认false）\r\n * @property {Boolean} fixed 如果type为textarea，且在一个\"position:fixed\"的区域，需要指明为true（默认false）\r\n * @property {Boolean} disabled 是否不可输入（默认false）\r\n * @property {Number String} maxlength 最大输入长度，设置为 -1 的时候不限制最大长度（默认140）\r\n * @property {String} confirm-type 设置键盘右下角按钮的文字，仅在type=\"text\"时生效（默认done）\r\n * @event {Function} input 输入框内容发生变化时触发\r\n * @event {Function} focus 输入框获得焦点时触发\r\n * @event {Function} blur 输入框失去焦点时触发\r\n * @event {Function} confirm 点击完成按钮时触发\r\n * @event {Function} right-icon-click 通过right-icon生成的图标被点击时触发\r\n * @event {Function} click 输入框被点击或者通过right-icon生成的图标被点击时触发，这样设计是考虑到传递右边的图标，一般都为需要弹出\"picker\"等操作时的场景，点击倒三角图标，理应发出此事件，见上方说明\r\n * @example <u-field v-model=\"mobile\" label=\"手机号\" required :error-message=\"errorMessage\"></u-field>\r\n */\r\nexport default {\r\n\tname:\"u-field\",\r\n\tprops: {\r\n\t\ticon: String,\r\n\t\trightIcon: String,\r\n\t\t// arrowDirection: {\r\n\t\t// \ttype: String,\r\n\t\t// \tdefault: 'right'\r\n\t\t// },\r\n\t\trequired: Boolean,\r\n\t\tlabel: String,\r\n\t\tpassword: Boolean,\r\n\t\tclearable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 左边标题的宽度单位rpx\r\n\t\tlabelWidth: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 130\r\n\t\t},\r\n\t\t// 对齐方式，left|center|right\r\n\t\tlabelAlign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\tinputAlign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\ticonColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#606266'\r\n\t\t},\r\n\t\tautoHeight: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\terrorMessage: {\r\n\t\t\ttype: [String, Boolean],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\tplaceholder: String,\r\n\t\tplaceholderStyle: String,\r\n\t\tfocus: Boolean,\r\n\t\tfixed: Boolean,\r\n\t\tvalue: [Number, String],\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'text'\r\n\t\t},\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\tmaxlength: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 140\r\n\t\t},\r\n\t\tconfirmType: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'done'\r\n\t\t},\r\n\t\t// lable的位置，可选为 left-左边，top-上边\r\n\t\tlabelPosition: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\t// 输入框的自定义样式\r\n\t\tfieldStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 清除按钮的大小\r\n\t\tclearSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 30\r\n\t\t},\r\n\t\t// lable左边的图标样式，对象形式\r\n\t\ticonStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 是否显示上边框\r\n\t\tborderTop: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否显示下边框\r\n\t\tborderBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否自动去除两端的空格\r\n\t\ttrim: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tfocused: false,\r\n\t\t\titemIndex: 0,\r\n\t\t};\r\n\t},\r\n\tcomputed: {\r\n\t\tinputWrapStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tstyle.textAlign = this.inputAlign;\r\n\t\t\t// 判断lable的位置，如果是left的话，让input左边两边有间隙\r\n\t\t\tif(this.labelPosition == 'left') {\r\n\t\t\t\tstyle.margin = `0 8rpx`;\r\n\t\t\t} else {\r\n\t\t\t\t// 如果lable是top的，input的左边就没必要有间隙了\r\n\t\t\t\tstyle.marginRight = `8rpx`;\r\n\t\t\t}\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\trightIconStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif (this.arrowDirection == 'top') style.transform = 'roate(-90deg)';\r\n\t\t\tif (this.arrowDirection == 'bottom') style.transform = 'roate(90deg)';\r\n\t\t\telse style.transform = 'roate(0deg)';\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\tlabelStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif(this.labelAlign == 'left') style.justifyContent = 'flext-start';\r\n\t\t\tif(this.labelAlign == 'center') style.justifyContent = 'center';\r\n\t\t\tif(this.labelAlign == 'right') style.justifyContent = 'flext-end';\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// uni不支持在computed中写style.justifyContent = 'center'的形式，故用此方法\r\n\t\tjustifyContent() {\r\n\t\t\tif(this.labelAlign == 'left') return 'flex-start';\r\n\t\t\tif(this.labelAlign == 'center') return 'center';\r\n\t\t\tif(this.labelAlign == 'right') return 'flex-end';\r\n\t\t},\r\n\t\t// 因为uniapp的input组件的maxlength组件必须要数值，这里转为数值，给用户可以传入字符串数值\r\n\t\tinputMaxlength() {\r\n\t\t\treturn Number(this.maxlength)\r\n\t\t},\r\n\t\t// label的位置\r\n\t\tfieldInnerStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif(this.labelPosition == 'left') {\r\n\t\t\t\tstyle.flexDirection = 'row';\r\n\t\t\t} else {\r\n\t\t\t\tstyle.flexDirection = 'column';\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tonInput(event) {\r\n\t\t\tlet value = event.detail.value;\r\n\t\t\t// 判断是否去除空格\r\n\t\t\tif(this.trim) value = this.$u.trim(value);\r\n\t\t\tthis.$emit('input', value);\r\n\t\t},\r\n\t\tonFocus(event) {\r\n\t\t\tthis.focused = true;\r\n\t\t\tthis.$emit('focus', event);\r\n\t\t},\r\n\t\tonBlur(event) {\r\n\t\t\tthis.focused = false;\r\n\t\t\tthis.$emit('blur', event);\r\n\t\t},\r\n\t\tonConfirm(e) {\r\n\t\t\tthis.$emit('confirm', e.detail.value);\r\n\t\t},\r\n\t\tonClear(event) {\r\n\t\t\tthis.$emit('input', '');\r\n\t\t},\r\n\t\trightIconClick() {\r\n\t\t\tthis.$emit('right-icon-click');\r\n\t\t\tthis.$emit('click');\r\n\t\t},\r\n\t\tfieldClick() {\r\n\t\t\tthis.$emit('click');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\t\r\n.u-field {\r\n\tfont-size: 28rpx;\r\n\tpadding: 20rpx 28rpx;\r\n\ttext-align: left;\r\n\tposition: relative;\r\n\tcolor: $u-main-color;\r\n}\r\n\r\n.u-field-inner {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-textarea-inner {\r\n\talign-items: flex-start;\r\n}\r\n\r\n.u-textarea-class {\r\n\tmin-height: 96rpx;\r\n\twidth: auto;\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.fild-body {\r\n\tdisplay: flex;\r\n\tflex: 1;\r\n\talign-items: center;\r\n}\r\n\r\n.u-arror-right {\r\n\tmargin-left: 8rpx;\r\n}\r\n\r\n.u-label-text {\r\n\tdisplay: inline-block;\r\n}\r\n\r\n.u-label-left-gap {\r\n\tmargin-left: 6rpx;\r\n}\r\n\r\n.u-label-postion-top {\r\n\tflex-direction: column;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.u-label {\r\n\twidth: 130rpx;\r\n\tflex: 1 1 130rpx;\r\n\ttext-align: left;\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-required::before {\r\n\tcontent: '*';\r\n\tposition: absolute;\r\n\tleft: -16rpx;\r\n\tfont-size: 14px;\r\n\tcolor: $u-type-error;\r\n\theight: 9px;\r\n\tline-height: 1;\r\n}\r\n\r\n.u-field__input-wrap {\r\n\tposition: relative;\r\n\toverflow: hidden;\r\n\tfont-size: 28rpx;\r\n\theight: 48rpx;\r\n\tflex: 1;\r\n\twidth: auto;\r\n}\r\n\r\n.u-clear-icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-error-message {\r\n\tcolor: $u-type-error;\r\n\tfont-size: 26rpx;\r\n\ttext-align: left;\r\n}\r\n\r\n.placeholder-style {\r\n\tcolor: rgb(150, 151, 153);\r\n}\r\n\r\n.u-input-class {\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.u-button-wrap {\r\n\tmargin-left: 8rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-form/u-form.vue",
    "content": "<template>\r\n\t<view class=\"u-form\"><slot /></view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * form 表单\r\n\t * @description 此组件一般用于表单场景，可以配置Input输入框，Select弹出框，进行表单验证等。\r\n\t * @tutorial http://uviewui.com/components/form.html\r\n\t * @property {Object} model 表单数据对象\r\n\t * @property {Boolean} border-bottom 是否显示表单域的下划线边框\r\n\t * @property {String} label-position 表单域提示文字的位置，left-左侧，top-上方\r\n\t * @property {String Number} label-width 提示文字的宽度，单位rpx（默认90）\r\n\t * @property {Object} label-style lable的样式，对象形式\r\n\t * @property {String} label-align lable的对齐方式\r\n\t * @property {Object} rules 通过ref设置，见官网说明\r\n\t * @property {Array} error-type 错误的提示方式，数组形式，见上方说明(默认['message'])\r\n\t * @example <u-form :model=\"form\" ref=\"uForm\"></u-form>\r\n\t */\r\n\r\nexport default {\r\n\tname: 'u-form',\r\n\tprops: {\r\n\t\t// 当前form的需要验证字段的集合\r\n\t\tmodel: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 验证规则\r\n\t\t// rules: {\r\n\t\t// \ttype: [Object, Function, Array],\r\n\t\t// \tdefault() {\r\n\t\t// \t\treturn {};\r\n\t\t// \t}\r\n\t\t// },\r\n\t\t// 有错误时的提示方式，message-提示信息，border-如果input设置了边框，变成呈红色，\r\n\t\t// border-bottom-下边框呈现红色，none-无提示\r\n\t\terrorType: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn ['message', 'toast']\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 是否显示表单域的下划线边框\r\n\t\tborderBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// label的位置，left-左边，top-上边\r\n\t\tlabelPosition: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\t// label的宽度，单位rpx\r\n\t\tlabelWidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 90\r\n\t\t},\r\n\t\t// lable字体的对齐方式\r\n\t\tlabelAlign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\t// lable的样式，对象形式\r\n\t\tlabelStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tprovide() {\r\n\t\treturn {\r\n\t\t\tuForm: this\r\n\t\t};\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\trules: {}\r\n\t\t};\r\n\t},\r\n\tcreated() {\r\n\t\t// 存储当前form下的所有u-form-item的实例\r\n\t\t// 不能定义在data中，否则微信小程序会造成循环引用而报错\r\n\t\tthis.fields = [];\r\n\t\t// 存当前实例\r\n\t\tlet that = this;\r\n\t\t// 监听on-form-item-add事件，将子组件添加到fields中\r\n\t\tthis.$on('on-form-item-add', item => {\r\n\t\t\tif (item) {\r\n\t\t\t\tthat.fields.push(item);\r\n\t\t\t}\r\n\t\t});\r\n\t\t// 删除当前有的实例\r\n\t\tthis.$on('on-form-item-remove', item => {\r\n\t\t\t// 如果当前没有prop的话表示当前不要进行删除（因为没有注入）\r\n\t\t\tif (item.prop) {\r\n\t\t\t\tthat.fields.splice(that.fields.indexOf(item), 1);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tmethods: {\r\n\t\tsetRules(rules) {\r\n\t\t\tthis.rules = rules;\r\n\t\t},\r\n\t\t// 清空所有u-form-item组件的内容，本质上是调用了u-form-item组件中的resetField()方法\r\n\t\tresetFields() {\r\n\t\t\tthis.fields.map(field => {\r\n\t\t\t\tfield.resetField();\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 校验全部数据\r\n\t\tvalidate(callback) {\r\n\t\t\treturn new Promise(resolve => {\r\n\t\t\t\t// 对所有的u-form-item进行校验\r\n\t\t\t\tlet valid = true; // 默认通过\r\n\t\t\t\tlet count = 0; // 用于标记是否检查完毕\r\n\t\t\t\tlet errorArr = []; // 存放错误信息\r\n\t\t\t\tthis.fields.map(field => {\r\n\t\t\t\t\t// 调用每一个u-form-item实例的validation的校验方法\r\n\t\t\t\t\tfield.validation('', error => {\r\n\t\t\t\t\t\t// 如果任意一个u-form-item校验不通过，就意味着整个表单不通过\r\n\t\t\t\t\t\tif (error) {\r\n\t\t\t\t\t\t\tvalid = false;\r\n\t\t\t\t\t\t\terrorArr.push(error);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// 当历遍了所有的u-form-item时，调用promise的then方法\r\n\t\t\t\t\t\tif (++count === this.fields.length) {\r\n\t\t\t\t\t\t\tresolve(valid); // 进入promise的then方法\r\n\t\t\t\t\t\t\t// 判断是否设置了toast的提示方式，只提示最前面的表单域的第一个错误信息\r\n\t\t\t\t\t\t\tif(this.errorType.indexOf('none') === -1 && this.errorType.indexOf('toast') >= 0 && errorArr.length) {\r\n\t\t\t\t\t\t\t\tthis.$u.toast(errorArr[0]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// 调用回调方法\r\n\t\t\t\t\t\t\tif (typeof callback == 'function') callback(valid);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-form-item/u-form-item.vue",
    "content": "<template>\r\n\t<view class=\"u-form-item\" :class=\"{'u-border-bottom': elBorderBottom, 'u-form-item__border-bottom--error': validateState === 'error' && showError('border-bottom')}\">\r\n\t\t<view class=\"u-form-item__body\" :style=\"{\r\n\t\t\tflexDirection: elLabelPosition == 'left' ? 'row' : 'column'\r\n\t\t}\">\r\n\t\t\t<!-- 微信小程序中，将一个参数设置空字符串，结果会变成字符串\"true\" -->\r\n\t\t\t<view class=\"u-form-item--left\" :style=\"{\r\n\t\t\t\twidth: uLabelWidth,\r\n\t\t\t\tflex: `0 0 ${uLabelWidth}`,\r\n\t\t\t\tmarginBottom: elLabelPosition == 'left' ? 0 : '10rpx',\r\n\t\t\t}\">\r\n\t\t\t\t<!-- 为了块对齐 -->\r\n\t\t\t\t<view class=\"u-form-item--left__content\">\r\n\t\t\t\t\t<!-- nvue不支持伪元素before -->\r\n\t\t\t\t\t<text v-if=\"required\" class=\"u-form-item--left__content--required\">*</text>\r\n\t\t\t\t\t<view class=\"u-form-item--left__content__icon\" v-if=\"leftIcon\">\r\n\t\t\t\t\t\t<u-icon :name=\"leftIcon\" :custom-style=\"leftIconStyle\"></u-icon>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"u-form-item--left__content__label\" :style=\"[elLabelStyle, {\r\n\t\t\t\t\t\t'justify-content': elLabelAlign == 'left' ? 'flex-start' : elLabelAlign == 'center' ? 'center' : 'flex-end'\r\n\t\t\t\t\t}]\">\r\n\t\t\t\t\t\t{{label}}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-form-item--right u-flex\">\r\n\t\t\t\t<view class=\"u-form-item--right__content\">\r\n\t\t\t\t\t<view class=\"u-form-item--right__content__slot \">\r\n\t\t\t\t\t\t<slot />\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"u-form-item--right__content__icon u-flex\" v-if=\"$slots.right || rightIcon\">\r\n\t\t\t\t\t\t<u-icon :custom-style=\"rightIconStyle\" v-if=\"rightIcon\" :name=\"rightIcon\"></u-icon>\r\n\t\t\t\t\t\t<slot name=\"right\" />\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view class=\"u-form-item__message\" v-if=\"validateState === 'error' && showError('message')\" :style=\"{\r\n\t\t\tpaddingLeft: elLabelPosition == 'left' ? $u.addUnit(elLabelWidth) : '0',\r\n\t\t}\">{{validateMessage}}</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\nimport Emitter from '../../libs/util/emitter.js';\r\nimport schema from '../../libs/util/async-validator';\r\n// 去除警告信息\r\nschema.warning = function(){};\r\n\r\n\t/**\r\n\t * form-item 表单item\r\n\t * @description 此组件一般用于表单场景，可以配置Input输入框，Select弹出框，进行表单验证等。\r\n\t * @tutorial http://uviewui.com/components/form.html\r\n\t * @property {String} label 左侧提示文字\r\n\t * @property {Object} prop 表单域model对象的属性名，在使用 validate、resetFields 方法的情况下，该属性是必填的\r\n\t * @property {Boolean} border-bottom 是否显示表单域的下划线边框\r\n\t * @property {String} label-position 表单域提示文字的位置，left-左侧，top-上方\r\n\t * @property {String Number} label-width 提示文字的宽度，单位rpx（默认90）\r\n\t * @property {Object} label-style lable的样式，对象形式\r\n\t * @property {String} label-align lable的对齐方式\r\n\t * @property {String} right-icon 右侧自定义字体图标(限uView内置图标)或图片地址\r\n\t * @property {String} left-icon 左侧自定义字体图标(限uView内置图标)或图片地址\r\n\t * @property {Object} left-icon-style 左侧图标的样式，对象形式\r\n\t * @property {Object} right-icon-style 右侧图标的样式，对象形式\r\n\t * @property {Boolean} required 是否显示左边的\"*\"号，这里仅起展示作用，如需校验必填，请通过rules配置必填规则(默认false)\r\n\t * @example <u-form-item label=\"姓名\"><u-input v-model=\"form.name\" /></u-form-item>\r\n\t */\r\n\r\nexport default {\r\n\tname: 'u-form-item',\r\n\tmixins: [Emitter],\r\n\tinject: {\r\n\t\tuForm: {\r\n\t\t\tdefault() {\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tprops: {\r\n\t\t// input的label提示语\r\n\t\tlabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 绑定的值\r\n\t\tprop: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否显示表单域的下划线边框\r\n\t\tborderBottom: {\r\n\t\t\ttype: [String, Boolean],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// label的位置，left-左边，top-上边\r\n\t\tlabelPosition: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// label的宽度，单位rpx\r\n\t\tlabelWidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// lable的样式，对象形式\r\n\t\tlabelStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// lable字体的对齐方式\r\n\t\tlabelAlign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 右侧图标\r\n\t\trightIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 左侧图标\r\n\t\tleftIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 左侧图标的样式\r\n\t\tleftIconStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 左侧图标的样式\r\n\t\trightIconStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 是否显示左边的必填星号，只作显示用，具体校验必填的逻辑，请在rules中配置\r\n\t\trequired: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tinitialValue: '', // 存储的默认值\r\n\t\t\t// isRequired: false, // 是否必填，由于人性化考虑，必填\"*\"号通过props的required配置，不再通过rules的规则自动生成\r\n\t\t\tvalidateState: '', // 是否校验成功\r\n\t\t\tvalidateMessage: '' ,// 校验失败的提示语\r\n\t\t\t// 有错误时的提示方式，message-提示信息，border-如果input设置了边框，变成呈红色，\r\n\t\t\terrorType: ['message'],\r\n\t\t};\r\n\t},\r\n\tcreated() {\r\n\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环应用\r\n\t\tthis.parent = this.$u.$parent.call(this, 'u-form');\r\n\t},\r\n\twatch: {\r\n\t\tvalidateState(val) {\r\n\t\t\tthis.broadcastInputError();\r\n\t\t},\r\n\t\t// 监听u-form组件的errorType的变化\r\n\t\t\"uForm.errorType\"(val) {\r\n\t\t\tthis.errorType = val;\r\n\t\t\tthis.broadcastInputError();\r\n\t\t},\r\n\t},\r\n\tcomputed: {\n\t\t// 计算后的label宽度，由于需要多个判断，故放到computed中\n\t\tuLabelWidth() {\n\t\t\t// 如果用户设置label为空字符串(微信小程序空字符串最终会变成字符串的'true')，意味着要将label的位置宽度设置为auto\n\t\t\treturn this.elLabelPosition == 'left' ? (this.label === 'true' || this.label === '' ? 'auto' : this.$u.addUnit(this.elLabelWidth)) : '100%';\n\t\t},\r\n\t\tfieldValue() {\r\n\t\t\treturn this.uForm.model[this.prop];\r\n\t\t},\r\n\t\tshowError() {\r\n\t\t\treturn type => {\r\n\t\t\t\t// 如果errorType数组中含有none，或者toast提示类型\r\n\t\t\t\tif(this.errorType.indexOf('none') >= 0) return false;\r\n\t\t\t\telse if(this.errorType.indexOf(type) >= 0) return true;\r\n\t\t\t\telse return false;\r\n\t\t\t}\r\n\t\t},\r\n\t\t// label的宽度\r\n\t\telLabelWidth() {\r\n\t\t\t// label默认宽度为90，优先使用本组件的值，如果没有(如果设置为0，也算是配置了值，依然起效)，则用u-form的值\r\n\t\t\treturn (this.labelWidth != 0 || this.labelWidth != '') ? this.labelWidth : (this.parent ? this.parent.labelWidth : 90);\r\n\t\t},\r\n\t\t// label的样式\r\n\t\telLabelStyle() {\r\n\t\t\treturn Object.keys(this.labelStyle).length ? this.labelStyle : (this.parent ? this.parent.labelStyle : {});\r\n\t\t},\r\n\t\t// label的位置，左侧或者上方\r\n\t\telLabelPosition() {\r\n\t\t\treturn this.labelPosition ? this.labelPosition : (this.parent ? this.parent.labelPosition : 'left');\r\n\t\t}, \r\n\t\t// label的对齐方式\r\n\t\telLabelAlign() {\r\n\t\t\treturn this.labelAlign ? this.labelAlign : (this.parent ? this.parent.labelAlign : 'left');\r\n\t\t},\r\n\t\t// label的下划线\r\n\t\telBorderBottom() {\r\n\t\t\t// 子组件的borderBottom默认为空字符串，如果不等于空字符串，意味着子组件设置了值，优先使用子组件的值\r\n\t\t\treturn this.borderBottom !== '' ? this.borderBottom : this.parent ? this.parent.borderBottom : true;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tbroadcastInputError() {\r\n\t\t\t// 子组件发出事件，第三个参数为true或者false，true代表有错误\r\n\t\t\tthis.broadcast('u-input', 'on-form-item-error', this.validateState === 'error' && this.showError('border'));\r\n\t\t},\r\n\t\t// 判断是否需要required校验\r\n\t\tsetRules() {\r\n\t\t\tlet that = this;\r\n\t\t\t// 由于人性化考虑，必填\"*\"号通过props的required配置，不再通过rules的规则自动生成\r\n\t\t\t// 从父组件u-form拿到当前u-form-item需要验证 的规则\r\n\t\t\t// let rules = this.getRules();\r\n\t\t\t// if (rules.length) {\r\n\t\t\t// \tthis.isRequired = rules.some(rule => {\r\n\t\t\t// \t\t// 如果有必填项，就返回，没有的话，就是undefined\r\n\t\t\t// \t\treturn rule.required;\r\n\t\t\t// \t});\r\n\t\t\t// }\r\n\r\n\t\t\t// blur事件\r\n\t\t\tthis.$on('on-form-blur', that.onFieldBlur);\r\n\t\t\t// change事件\r\n\t\t\tthis.$on('on-form-change', that.onFieldChange);\r\n\t\t},\r\n\r\n\t\t// 从u-form的rules属性中，取出当前u-form-item的校验规则\r\n\t\tgetRules() {\r\n\t\t\t// 父组件的所有规则\r\n\t\t\tlet rules = this.uForm.rules;\r\n\t\t\trules = rules ? rules[this.prop] : [];\r\n\t\t\t// 保证返回的是一个数组形式\r\n\t\t\treturn [].concat(rules || []);\r\n\t\t},\r\n\r\n\t\t// blur事件时进行表单校验\r\n\t\tonFieldBlur() {\r\n\t\t\tthis.validation('blur');\r\n\t\t},\r\n\r\n\t\t// change事件进行表单校验\r\n\t\tonFieldChange() {\r\n\t\t\tthis.validation('change');\r\n\t\t},\r\n\r\n\t\t// 过滤出符合要求的rule规则\r\n\t\tgetFilteredRule(triggerType = '') {\r\n\t\t\tlet rules = this.getRules();\r\n\t\t\t// 整体验证表单时，triggerType为空字符串，此时返回所有规则进行验证\r\n\t\t\tif(!triggerType) return rules;\r\n\t\t\t// 历遍判断规则是否有对应的事件，比如blur，change触发等的事件\r\n\t\t\t// 使用indexOf判断，是因为某些时候设置的验证规则的trigger属性可能为多个，比如['blur','change']\r\n\t\t\t// 某些场景可能的判断规则，可能不存在trigger属性，故先判断是否存在此属性\r\n\t\t\treturn rules.filter(res => res.trigger && res.trigger.indexOf(triggerType) !== -1);\r\n\t\t},\r\n\r\n\t\t// 校验数据\r\n\t\tvalidation(trigger, callback = () => {}) {\r\n\t\t\t// blur和change是否有当前方式的校验规则\r\n\t\t\tlet rules = this.getFilteredRule(trigger);\r\n\t\t\t// 判断是否有验证规则，如果没有规则，也调用回调方法，否则父组件u-form会因为\r\n\t\t\t// 对count变量的统计错误而无法进入上一层的回调\r\n\t\t\tif (!rules || rules.length === 0) {\r\n\t\t\t\treturn callback('');\r\n\t\t\t}\r\n\t\t\t// 设置当前的装填，标识为校验中\r\n\t\t\tthis.validateState = 'validating';\r\n\t\t\t// 调用async-validator的方法\r\n\t\t\tlet validator = new schema({ [this.prop]: rules });\r\n\t\t\tvalidator.validate({ [this.prop]: this.fieldValue }, { firstFields: true }, (errors, fields) => {\r\n\t\t\t\t// 记录状态和报错信息\r\n\t\t\t\tthis.validateState = !errors ? 'success' : 'error';\r\n\t\t\t\tthis.validateMessage = errors ? errors[0].message : '';\r\n\t\t\t\t// 调用回调方法\r\n\t\t\t\tcallback(this.validateMessage);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\t// 清空当前的u-form-item\r\n\t\tresetField() {\r\n\t\t\tthis.uForm.model[this.prop] = this.initialValue;\r\n\t\t\t// 设置为`success`状态，只是为了清空错误标记\r\n\t\t\tthis.validateState = 'success';\r\n\t\t}\r\n\t},\r\n\r\n\t// 组件创建完成时，将当前实例保存到u-form中\r\n\tmounted() {\r\n\t\t// 如果没有传入prop，或者uForm为空(如果u-form-input单独使用，就不会有uForm注入)，就不进行校验\r\n\t\tif (!this.prop || this.uForm === null) return;\r\n\t\t// 发出事件，让父组件将本实例加入到管理数组中\r\n\t\tthis.dispatch('u-form', 'on-form-item-add', this);\r\n\t\tthis.errorType = this.uForm.errorType;\r\n\t\t// 设置初始值\r\n\t\tthis.initialValue = this.fieldValue;\r\n\t\t// 添加表单校验，这里必须要写在$nextTick中，因为u-form的rules是通过ref手动传入的\r\n\t\t// 不在$nextTick中的话，可能会造成执行此处代码时，父组件还没通过ref把规则给u-form，导致规则为空\r\n\t\tthis.$nextTick(() =>{\r\n\t\t\tthis.setRules();\r\n\t\t})\r\n\t},\r\n\r\n\t// 组件销毁前，将实例从 Form 的缓存中移除\r\n\tbeforeDestroy() {\r\n\t\tthis.dispatch('u-form', 'on-form-item-remove', this);\r\n\t},\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-form-item {\r\n\t\tdisplay: flex;\r\n\t\t// align-items: flex-start;\r\n\t\tpadding: 20rpx 0;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-main-color;\r\n\t\tbox-sizing: border-box;\r\n\t\tline-height: $u-form-item-height;\r\n\t\tflex-direction: column;\r\n\r\n\t\t&__border-bottom--error:after {\r\n\t\t\tborder-color: $u-type-error;\r\n\t\t}\r\n\r\n\t\t&__body {\r\n\t\t\tdisplay: flex;\r\n\t\t}\r\n\r\n\t\t&--left {\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\r\n\t\t\t&__content {\r\n\t\t\t\tposition: relative;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tpadding-right: 10rpx;\r\n\t\t\t\tflex: 1;\r\n\r\n\t\t\t\t&__icon {\r\n\t\t\t\t\tmargin-right: 8rpx;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t&--required {\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tleft: -16rpx;\r\n\t\t\t\t\tvertical-align: middle;\r\n\t\t\t\t\tcolor: $u-type-error;\r\n\t\t\t\t\tpadding-top: 6rpx;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t&__label {\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\tflex: 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t&--right {\r\n\t\t\tflex: 1;\r\n\r\n\t\t\t&__content {\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tflex: 1;\r\n\r\n\t\t\t\t&__slot {\r\n\t\t\t\t\tflex: 1;\r\n\t\t\t\t\t/* #ifndef MP */\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t/* #endif */\r\n\t\t\t\t}\r\n\r\n\t\t\t\t&__icon {\r\n\t\t\t\t\tmargin-left: 10rpx;\r\n\t\t\t\t\tcolor: $u-light-color;\r\n\t\t\t\t\tfont-size: 30rpx;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t&__message {\r\n\t\t\tfont-size: 24rpx;\r\n\t\t\tline-height: 24rpx;\r\n\t\t\tcolor: $u-type-error;\r\n\t\t\tmargin-top: 12rpx;\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-full-screen/u-full-screen.vue",
    "content": "<template>\r\n\t<u-modal v-model=\"show\" :show-cancel-button=\"true\" confirm-text=\"升级\" title=\"发现新版本\" @cancel=\"cancel\" @confirm=\"confirm\">\r\n\t\t<view class=\"u-update-content\">\r\n\t\t\t<rich-text :nodes=\"content\"></rich-text>\r\n\t\t</view>\r\n\t</u-modal>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tshow: false,\r\n\t\t\t\tcontent: `\r\n\t\t\t\t\t1. 修复badge组件的size参数无效问题<br>\r\n\t\t\t\t\t2. 新增Modal模态框组件<br>\r\n\t\t\t\t\t3. 新增压窗屏组件，可以在APP上以弹窗的形式遮盖导航栏和底部tabbar<br>\r\n\t\t\t\t\t4. 修复键盘组件在微信小程序上遮罩无效的问题\r\n\t\t\t\t`,\r\n\t\t\t}\r\n\t\t},\r\n\t\tonReady() {\r\n\t\t\tthis.show = true;\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tcancel() {\r\n\t\t\t\tthis.closeModal();\r\n\t\t\t},\r\n\t\t\tconfirm() {\r\n\t\t\t\tthis.closeModal();\r\n\t\t\t},\r\n\t\t\tcloseModal() {\r\n\t\t\t\tuni.navigateBack();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-full-content {\r\n\t\tbackground-color: #00C777;\r\n\t}\r\n\t\r\n\t.u-update-content {\r\n\t\tfont-size: 26rpx;\r\n\t\tcolor: $u-content-color;\r\n\t\tline-height: 1.7;\r\n\t\tpadding: 30rpx;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-gap/u-gap.vue",
    "content": "<template>\r\n\t<view class=\"u-gap\" :style=\"[gapStyle]\"></view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * gap 间隔槽\r\n * @description 该组件一般用于内容块之间的用一个灰色块隔开的场景，方便用户风格统一，减少工作量\r\n * @tutorial https://www.uviewui.com/components/gap.html\r\n * @property {String} bg-color 背景颜色（默认#f3f4f6）\r\n * @property {String Number} height 分割槽高度，单位rpx（默认30）\r\n * @property {String Number} margin-top 与前一个组件的距离，单位rpx（默认0）\r\n * @property {String Number} margin-bottom 与后一个组件的距离，单位rpx（0）\r\n * @example <u-gap height=\"80\" bg-color=\"#bbb\"></u-gap>\r\n */\r\nexport default {\r\n\tname: \"u-gap\",\r\n\tprops: {\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'transparent ' // 背景透明\r\n\t\t},\r\n\t\t// 高度\r\n\t\theight: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 30\r\n\t\t},\r\n\t\t// 与上一个组件的距离\r\n\t\tmarginTop: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 与下一个组件的距离\r\n\t\tmarginBottom: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t},\r\n\tcomputed: {\r\n\t\tgapStyle() {\r\n\t\t\treturn {\r\n\t\t\t\tbackgroundColor: this.bgColor,\r\n\t\t\t\theight: this.height + 'rpx',\r\n\t\t\t\tmarginTop: this.marginTop + 'rpx',\r\n\t\t\t\tmarginBottom: this.marginBottom + 'rpx'\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-grid/u-grid.vue",
    "content": "<template>\r\n\t<view class=\"u-grid\" :class=\"{'u-border-top u-border-left': border}\" :style=\"[gridStyle]\"><slot /></view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * grid 宫格布局\r\n * @description 宫格组件一般用于同时展示多个同类项目的场景，可以给宫格的项目设置徽标组件(badge)，或者图标等，也可以扩展为左右滑动的轮播形式。\r\n * @tutorial https://www.uviewui.com/components/grid.html\r\n * @property {String Number} col 宫格的列数（默认3）\r\n * @property {Boolean} border 是否显示宫格的边框（默认true）\r\n * @property {Boolean} hover-class 点击宫格的时候，是否显示按下的灰色背景（默认false）\r\n * @event {Function} click 点击宫格触发\r\n * @example <u-grid :col=\"3\" @click=\"click\"></u-grid>\r\n */\r\nexport default {\r\n\tname: 'u-grid',\r\n\tprops: {\r\n\t\t// 分成几列\r\n\t\tcol: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 3\r\n\t\t},\r\n\t\t// 是否显示边框\r\n\t\tborder: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 宫格对齐方式，表现为数量少的时候，靠左，居中，还是靠右\r\n\t\talign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\t// 宫格按压时的样式类，\"none\"为无效果\r\n\t\thoverClass: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'u-hover-class'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tindex: 0,\r\n\t\t}\r\n\t},\r\n\tprovide() {\r\n\t\treturn {\r\n\t\t\tuGrid: this\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\t// 宫格对齐方式\r\n\t\tgridStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tswitch(this.align) {\r\n\t\t\t\tcase 'left':\r\n\t\t\t\t\tstyle.justifyContent = 'flex-start';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'center':\r\n\t\t\t\t\tstyle.justifyContent = 'center';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'right':\r\n\t\t\t\t\tstyle.justifyContent = 'flex-end';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault: style.justifyContent = 'flex-start';\r\n\t\t\t};\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tclick(index) {\r\n\t\t\tthis.$emit('click', index);\r\n\t\t}\r\n\t}\r\n\t\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-grid {\r\n\twidth: 100%;\r\n\t/* #ifdef MP */\r\n\tposition: relative;\r\n\tbox-sizing: border-box;\r\n\toverflow: hidden;\r\n\t/* #endif */\r\n\t\r\n\t/* #ifndef MP */\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\talign-items: center;\r\n\t/* #endif */\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-grid-item/u-grid-item.vue",
    "content": "<template>\r\n\t<view class=\"u-grid-item\" :hover-class=\"hoverClass\"\r\n\t :hover-stay-time=\"200\" @tap=\"click\" :style=\"{\r\n\t\t\tbackground: bgColor,\r\n\t\t\twidth: width,\r\n\t\t}\">\r\n\t\t<view class=\"u-grid-item-box\" :class=\"[showBorder ? 'u-border-right u-border-bottom' : '']\">\r\n\t\t\t<slot />\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * gridItem 提示\r\n\t * @description 宫格组件一般用于同时展示多个同类项目的场景，可以给宫格的项目设置徽标组件(badge)，或者图标等，也可以扩展为左右滑动的轮播形式。搭配u-grid使用\r\n\t * @tutorial https://www.uviewui.com/components/grid.html\r\n\t * @property {String} bg-color 宫格的背景颜色（默认#ffffff）\r\n\t * @property {String Number} index 点击宫格时，返回的值\r\n\t * @event {Function} click 点击宫格触发\r\n\t * @example <u-grid-item></u-grid-item>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-grid-item\",\r\n\t\tprops: {\r\n\t\t\t// 背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 点击时返回的index\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t},\r\n\t\t// 父组件通过provide传递过来的整个this\r\n\t\tinject: ['uGrid'],\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\thoverClass: '', // 按下去的时候，是否显示背景灰色\r\n\t\t\t};\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\tthis.hoverClass = this.uGrid.hoverClass;\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 小于2，显示2列；大于12，显示12列\r\n\t\t\tcolNum() {\r\n\t\t\t\treturn this.col < 2 ? 2 : this.col > 12 ? 12 : this.col;\r\n\t\t\t},\r\n\t\t\t// 每个grid-item的宽度\r\n\t\t\twidth() {\r\n\t\t\t\treturn 100 / Number(this.uGrid.col) + '%';\r\n\t\t\t},\r\n\t\t\t// 是否显示边框\r\n\t\t\t// 为了迎合演示的需要，从created生命周期移到此，以为演示中可能需要动态修改有无边框\r\n\t\t\tshowBorder() {\r\n\t\t\t\treturn this.uGrid.border;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tclick() {\r\n\t\t\t\tthis.$emit('click', this.index);\r\n\t\t\t\tthis.uGrid.click(this.index);\r\n\t\t\t}\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-grid-item {\r\n\t\tbox-sizing: border-box;\r\n\t\tbackground: #fff;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tposition: relative;\r\n\t\tflex-direction: column;\r\n\t\t\r\n\t\t/* #ifdef MP */\r\n\t\tposition: relative;\r\n\t\tfloat: left;\r\n\t\t/* #endif */\r\n\t}\r\n\r\n\t.u-grid-item-hover {\r\n\t\tbackground: #f7f7f7 !important;\r\n\t}\r\n\r\n\t.u-grid-marker-box {\r\n\t\tposition: absolute;\r\n\t\tdisplay: inline-block;\r\n\t\tline-height: 0;\r\n\t}\r\n\r\n\t.u-grid-marker-wrap {\r\n\t\tposition: absolute;\r\n\t}\r\n\r\n\t.u-grid-item-box {\r\n\t\tpadding: 30rpx 0;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tflex-direction: column;\r\n\t\tflex: 1;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-icon/u-icon.vue",
    "content": "<template>\r\n\t<view :style=\"[customStyle]\" class=\"u-icon\" @tap=\"click\" :class=\"['u-icon--' + labelPos]\">\r\n\t\t<image class=\"u-icon__img\" v-if=\"isImg\" :src=\"name\" :mode=\"imgMode\" :style=\"[imgStyle]\"></image>\r\n\t\t<text v-else class=\"u-icon__icon\" :class=\"customClass\" :style=\"[iconStyle]\" :hover-class=\"hoverClass\" @touchstart=\"touchstart\"></text>\r\n\t\t<text v-if=\"label\" class=\"u-icon__label\" :style=\"{\r\n\t\t\tcolor: labelColor,\r\n\t\t\tfontSize: $u.addUnit(labelSize),\r\n\t\t\tmarginLeft: labelPos == 'right' ? $u.addUnit(marginLeft) : 0,\r\n\t\t\tmarginTop: labelPos == 'bottom' ? $u.addUnit(marginTop) : 0,\r\n\t\t\tmarginRight: labelPos == 'left' ? $u.addUnit(marginRight) : 0,\r\n\t\t\tmarginBottom: labelPos == 'top' ? $u.addUnit(marginBottom) : 0,\r\n\t\t}\">{{label}}</text>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * icon 图标\r\n * @description 基于字体的图标集，包含了大多数常见场景的图标。\r\n * @tutorial https://www.uviewui.com/components/icon.html\r\n * @property {String} name 图标名称，见示例图标集\r\n * @property {String} color 图标颜色（默认inherit）\r\n * @property {String | Number} size 图标字体大小，单位rpx（默认32）\r\n * @property {String | Number} label-size label字体大小，单位rpx（默认28）\r\n * @property {String} label 图标右侧的label文字（默认28）\r\n * @property {String} label-pos label文字相对于图标的位置，只能right或bottom（默认right）\r\n * @property {String} label-color label字体颜色（默认#606266）\r\n * @property {Object} custom-style icon的样式，对象形式\r\n * @property {String} custom-prefix 自定义字体图标库时，需要写上此值\r\n * @property {String | Number} margin-left label在右侧时与图标的距离，单位rpx（默认6）\r\n * @property {String | Number} margin-top label在下方时与图标的距离，单位rpx（默认6）\r\n * @property {String | Number} margin-bottom label在上方时与图标的距离，单位rpx（默认6）\r\n * @property {String | Number} margin-right label在左侧时与图标的距离，单位rpx（默认6）\r\n * @property {String} label-pos label相对于图标的位置，只能right或bottom（默认right）\r\n * @property {String} index 一个用于区分多个图标的值，点击图标时通过click事件传出\r\n * @property {String} hover-class 图标按下去的样式类，用法同uni的view组件的hover-class参数，详情见官网\r\n * @property {String} width 显示图片小图标时的宽度\r\n * @property {String} height 显示图片小图标时的高度\r\n * @property {String} top 图标在垂直方向上的定位\r\n * @event {Function} click 点击图标时触发\r\n * @example <u-icon name=\"photo\" color=\"#2979ff\" size=\"28\"></u-icon>\r\n */\r\nexport default {\r\n\tname: 'u-icon',\r\n\tprops: {\r\n\t\t// 图标类名\r\n\t\tname: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 图标颜色，可接受主题色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 字体大小，单位rpx\r\n\t\tsize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 'inherit'\r\n\t\t},\r\n\t\t// 是否显示粗体\r\n\t\tbold: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 点击图标的时候传递事件出去的index（用于区分点击了哪一个）\r\n\t\tindex: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 触摸图标时的类名\r\n\t\thoverClass: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 自定义扩展前缀，方便用户扩展自己的图标库\r\n\t\tcustomPrefix: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'uicon'\r\n\t\t},\r\n\t\t// 图标右边或者下面的文字\r\n\t\tlabel: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// label的位置，只能右边或者下边\r\n\t\tlabelPos: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'right'\r\n\t\t},\r\n\t\t// label的大小\r\n\t\tlabelSize: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '28'\r\n\t\t},\r\n\t\t// label的颜色\r\n\t\tlabelColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#606266'\r\n\t\t},\r\n\t\t// label与图标的距离(横向排列)\r\n\t\tmarginLeft: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '6'\r\n\t\t},\r\n\t\t// label与图标的距离(竖向排列)\r\n\t\tmarginTop: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '6'\r\n\t\t},\r\n\t\t// label与图标的距离(竖向排列)\r\n\t\tmarginRight: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '6'\r\n\t\t},\r\n\t\t// label与图标的距离(竖向排列)\r\n\t\tmarginBottom: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '6'\r\n\t\t},\r\n\t\t// 图片的mode\r\n\t\timgMode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'widthFix'\r\n\t\t},\r\n\t\t// 自定义样式\r\n\t\tcustomStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 用于显示图片小图标时，图片的宽度\r\n\t\twidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 用于显示图片小图标时，图片的高度\r\n\t\theight: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 用于解决某些情况下，让图标垂直居中的用途\r\n\t\ttop: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\tcustomClass() {\r\n\t\t\tlet classes = [];\r\n\t\t\tclasses.push(this.customPrefix + '-' + this.name);\r\n\t\t\t// uView的自定义图标类名为u-iconfont\r\n\t\t\tif (this.customPrefix == 'uicon') classes.push('u-iconfont');\r\n\t\t\telse classes.push(this.customPrefix);\r\n\t\t\t// 主题色，通过类配置\r\n\t\t\tif (this.color && this.$u.config.type.includes(this.color)) classes.push('u-icon__icon--' + this.color);\r\n\t\t\t// 阿里，头条，百度小程序通过数组绑定类名时，无法直接使用[a, b, c]的形式，否则无法识别\r\n\t\t\t// 故需将其拆成一个字符串的形式，通过空格隔开各个类名\r\n\t\t\t//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU\r\n\t\t\tclasses = classes.join(' ');\r\n\t\t\t//#endif\r\n\t\t\treturn classes;\r\n\t\t},\r\n\t\ticonStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tstyle = {\r\n\t\t\t\tfontSize: this.size == 'inherit' ? 'inherit' : this.$u.addUnit(this.size),\r\n\t\t\t\tfontWeight: this.bold ? 'bold' : 'normal',\r\n\t\t\t\t// 某些特殊情况需要设置一个到顶部的距离，才能更好的垂直居中\r\n\t\t\t\ttop: this.$u.addUnit(this.top)\r\n\t\t\t};\r\n\t\t\t// 非主题色值时，才当作颜色值\r\n\t\t\tif (this.color && !this.$u.config.type.includes(this.color)) style.color = this.color;\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// 判断传入的name属性，是否图片路径，只要带有\"/\"均认为是图片形式\r\n\t\tisImg() {\r\n\t\t\treturn this.name.indexOf('/') !== -1;\r\n\t\t},\r\n\t\timgStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\t// 如果设置width和height属性，则优先使用，否则使用size属性\r\n\t\t\tstyle.width = this.width ? this.$u.addUnit(this.width) : this.$u.addUnit(this.size);\r\n\t\t\tstyle.height = this.height ? this.$u.addUnit(this.height) : this.$u.addUnit(this.size);\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tclick() {\r\n\t\t\tthis.$emit('click', this.index);\r\n\t\t},\r\n\t\ttouchstart() {\r\n\t\t\tthis.$emit('touchstart', this.index);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n@import '../../iconfont.css';\r\n\r\n.u-icon {\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n\r\n\t&--left {\r\n\t\tflex-direction: row-reverse;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t&--right {\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t&--top {\r\n\t\tflex-direction: column-reverse;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t&--bottom {\r\n\t\tflex-direction: column;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t&__icon {\r\n\t\tposition: relative;\r\n\t\t\r\n\t\t&--primary {\r\n\t\t\tcolor: $u-type-primary;\r\n\t\t}\r\n\r\n\t\t&--success {\r\n\t\t\tcolor: $u-type-success;\r\n\t\t}\r\n\r\n\t\t&--error {\r\n\t\t\tcolor: $u-type-error;\r\n\t\t}\r\n\r\n\t\t&--warning {\r\n\t\t\tcolor: $u-type-warning;\r\n\t\t}\r\n\r\n\t\t&--info {\r\n\t\t\tcolor: $u-type-info;\r\n\t\t}\r\n\t}\r\n\r\n\t&__img {\r\n\t\theight: auto;\r\n\t\twill-change: transform;\r\n\t}\r\n\r\n\t&__label {\r\n\t\tline-height: 1;\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-image/u-image.vue",
    "content": "<template>\r\n\t<view class=\"u-image\" @tap=\"onClick\" :style=\"[wrapStyle, backgroundStyle]\">\r\n\t\t<image\r\n\t\t\tv-if=\"!isError\"\r\n\t\t\t:src=\"src\"\r\n\t\t\t:mode=\"mode\"\r\n\t\t\t@error=\"onErrorHandler\"\r\n\t\t\t@load=\"onLoadHandler\"\r\n\t\t\t:lazy-load=\"lazyLoad\"\r\n\t\t\tclass=\"u-image__image\"\r\n\t\t\t:style=\"{\r\n\t\t\t\tborderRadius: shape == 'circle' ? '50%' : $u.addUnit(borderRadius)\r\n\t\t\t}\"\r\n\t\t></image>\r\n\t\t<view\r\n\t\t\tv-if=\"showLoading && loading\"\r\n\t\t\tclass=\"u-image__loading\"\r\n\t\t\t:style=\"{\r\n\t\t\t\tborderRadius: shape == 'circle' ? '50%' : $u.addUnit(borderRadius),\r\n\t\t\t\tbackgroundColor: this.bgColor\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<slot v-if=\"$slots.loading\" name=\"loading\" />\r\n\t\t\t<u-icon v-else :name=\"loadingIcon\" :width=\"width\" :height=\"height\"></u-icon>\r\n\t\t</view>\r\n\t\t<view\r\n\t\t\tv-if=\"showError && isError && !loading\"\r\n\t\t\tclass=\"u-image__error\"\r\n\t\t\t:style=\"{\r\n\t\t\t\tborderRadius: shape == 'circle' ? '50%' : $u.addUnit(borderRadius)\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<slot v-if=\"$slots.error\" name=\"error\" />\r\n\t\t\t<u-icon v-else :name=\"errorIcon\" :width=\"width\" :height=\"height\"></u-icon>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * Image 图片\r\n * @description 此组件为uni-app的image组件的加强版，在继承了原有功能外，还支持淡入动画、加载中、加载失败提示、圆角值和形状等。\r\n * @tutorial https://uviewui.com/components/image.html\r\n * @property {String} src 图片地址\r\n * @property {String} mode 裁剪模式，见官网说明\r\n * @property {String | Number} width 宽度，单位任意，如果为数值，则为rpx单位（默认100%）\r\n * @property {String | Number} height 高度，单位任意，如果为数值，则为rpx单位（默认 auto）\r\n * @property {String} shape 图片形状，circle-圆形，square-方形（默认square）\r\n * @property {String | Number} border-radius 圆角值，单位任意，如果为数值，则为rpx单位（默认 0）\r\n * @property {Boolean} lazy-load 是否懒加载，仅微信小程序、App、百度小程序、字节跳动小程序有效（默认 true）\r\n * @property {Boolean} show-menu-by-longpress 是否开启长按图片显示识别小程序码菜单，仅微信小程序有效（默认 false）\r\n * @property {String} loading-icon 加载中的图标，或者小图片（默认 photo）\r\n * @property {String} error-icon 加载失败的图标，或者小图片（默认 error-circle）\r\n * @property {Boolean} show-loading 是否显示加载中的图标或者自定义的slot（默认 true）\r\n * @property {Boolean} show-error 是否显示加载错误的图标或者自定义的slot（默认 true）\r\n * @property {Boolean} fade 是否需要淡入效果（默认 true）\r\n * @property {String Number} width 传入图片路径时图片的宽度\r\n * @property {String Number} height 传入图片路径时图片的高度\r\n * @property {Boolean} webp 只支持网络资源，只对微信小程序有效（默认 false）\r\n * @property {String | Number} duration 搭配fade参数的过渡时间，单位ms（默认 500）\r\n * @event {Function} click 点击图片时触发\r\n * @event {Function} error 图片加载失败时触发\r\n * @event {Function} load 图片加载成功时触发\r\n * @example <u-image width=\"100%\" height=\"300rpx\" :src=\"src\"></u-image>\r\n */\r\nexport default {\r\n\tname: 'u-image',\r\n\tprops: {\r\n\t\t// 图片地址\r\n\t\tsrc: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 裁剪模式\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'aspectFill'\r\n\t\t},\r\n\t\t// 宽度，单位任意\r\n\t\twidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '100%'\r\n\t\t},\r\n\t\t// 高度，单位任意\r\n\t\theight: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 'auto'\r\n\t\t},\r\n\t\t// 图片形状，circle-圆形，square-方形\r\n\t\tshape: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'square'\r\n\t\t},\r\n\t\t// 圆角，单位任意\r\n\t\tborderRadius: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否懒加载，微信小程序、App、百度小程序、字节跳动小程序\r\n\t\tlazyLoad: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 开启长按图片显示识别微信小程序码菜单\r\n\t\tshowMenuByLongpress: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 加载中的图标，或者小图片\r\n\t\tloadingIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'photo'\r\n\t\t},\r\n\t\t// 加载失败的图标，或者小图片\r\n\t\terrorIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'error-circle'\r\n\t\t},\r\n\t\t// 是否显示加载中的图标或者自定义的slot\r\n\t\tshowLoading: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示加载错误的图标或者自定义的slot\r\n\t\tshowError: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否需要淡入效果\r\n\t\tfade: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 只支持网络资源，只对微信小程序有效\r\n\t\twebp: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 过渡时间，单位ms\r\n\t\tduration: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 500\r\n\t\t},\r\n\t\t// 背景颜色，用于深色页面加载图片时，为了和背景色融合\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#f3f4f6'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\t// 图片是否加载错误，如果是，则显示错误占位图\r\n\t\t\tisError: false,\r\n\t\t\t// 初始化组件时，默认为加载中状态\r\n\t\t\tloading: true,\r\n\t\t\t// 不透明度，为了实现淡入淡出的效果\r\n\t\t\topacity: 1,\r\n\t\t\t// 过渡时间，因为props的值无法修改，故需要一个中间值\r\n\t\t\tdurationTime: this.duration,\r\n\t\t\t// 图片加载完成时，去掉背景颜色，因为如果是png图片，就会显示灰色的背景\r\n\t\t\tbackgroundStyle: {}\r\n\t\t};\r\n\t},\n\twatch: {\n\t\tsrc(n) {\n\t\t\tif(!n) {\n\t\t\t\t// 如果传入null或者''，或者false，或者undefined，标记为错误状态\n\t\t\t\tthis.isError = true;\n\t\t\t} else {\n\t\t\t\tthis.isError = false;\n\t\t\t}\n\t\t}\n\t},\r\n\tcomputed: {\r\n\t\twrapStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\t// 通过调用addUnit()方法，如果有单位，如百分比，px单位等，直接返回，如果是纯粹的数值，则加上rpx单位\r\n\t\t\tstyle.width = this.$u.addUnit(this.width);\r\n\t\t\tstyle.height = this.$u.addUnit(this.height);\r\n\t\t\t// 如果是配置了圆形，设置50%的圆角，否则按照默认的配置值\r\n\t\t\tstyle.borderRadius = this.shape == 'circle' ? '50%' : this.$u.addUnit(this.borderRadius);\r\n\t\t\t// 如果设置圆角，必须要有hidden，否则可能圆角无效\r\n\t\t\tstyle.overflow = this.borderRadius > 0 ? 'hidden' : 'visible';\r\n\t\t\tif (this.fade) {\r\n\t\t\t\tstyle.opacity = this.opacity;\r\n\t\t\t\tstyle.transition = `opacity ${Number(this.durationTime) / 1000}s ease-in-out`;\r\n\t\t\t}\r\n\t\t\treturn style;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t// 点击图片\r\n\t\tonClick() {\r\n\t\t\tthis.$emit('click');\r\n\t\t},\r\n\t\t// 图片加载失败\r\n\t\tonErrorHandler() {\r\n\t\t\tthis.loading = false;\r\n\t\t\tthis.isError = true;\r\n\t\t\tthis.$emit('error');\r\n\t\t},\r\n\t\t// 图片加载完成，标记loading结束\r\n\t\tonLoadHandler() {\r\n\t\t\tthis.loading = false;\r\n\t\t\tthis.isError = false;\r\n\t\t\tthis.$emit('load');\r\n\t\t\t// 如果不需要动画效果，就不执行下方代码，同时移除加载时的背景颜色\r\n\t\t\t// 否则无需fade效果时，png图片依然能看到下方的背景色\r\n\t\t\tif (!this.fade) return this.removeBgColor();\r\n\t\t\t// 原来opacity为1(不透明，是为了显示占位图)，改成0(透明，意味着该元素显示的是背景颜色，默认的灰色)，再改成1，是为了获得过渡效果\r\n\t\t\tthis.opacity = 0;\r\n\t\t\t// 这里设置为0，是为了图片展示到背景全透明这个过程时间为0，延时之后延时之后重新设置为duration，是为了获得背景透明(灰色)\r\n\t\t\t// 到图片展示的过程中的淡入效果\r\n\t\t\tthis.durationTime = 0;\r\n\t\t\t// 延时50ms，否则在浏览器H5，过渡效果无效\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.durationTime = this.duration;\r\n\t\t\t\tthis.opacity = 1;\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.removeBgColor();\r\n\t\t\t\t}, this.durationTime);\r\n\t\t\t}, 50);\r\n\t\t},\r\n\t\t// 移除图片的背景色\r\n\t\tremoveBgColor() {\r\n\t\t\t// 淡入动画过渡完成后，将背景设置为透明色，否则png图片会看到灰色的背景\r\n\t\t\tthis.backgroundStyle = {\r\n\t\t\t\tbackgroundColor: 'transparent'\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import '../../libs/css/style.components.scss';\r\n\r\n.u-image {\r\n\tposition: relative;\r\n\ttransition: opacity 0.5s ease-in-out;\r\n\r\n\t&__image {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t&__loading,\r\n\t&__error {\r\n\t\tposition: absolute;\r\n\t\ttop: 0;\r\n\t\tleft: 0;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tbackground-color: $u-bg-color;\r\n\t\tcolor: $u-tips-color;\r\n\t\tfont-size: 46rpx;\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-index-anchor/u-index-anchor.vue",
    "content": "<template>\r\n\t<!-- 支付宝小程序使用$u.getRect()获取组件的根元素尺寸，所以在外面套一个\"壳\" -->\r\n\t<view>\r\n\t\t<view class=\"u-index-anchor-wrapper\" :id=\"$u.guid()\" :style=\"[wrapperStyle]\">\r\n\t\t\t<view class=\"u-index-anchor \" :class=\"[active ? 'u-index-anchor--active' : '']\" :style=\"[customAnchorStyle]\">\r\n\t\t\t\t<slot v-if=\"useSlot\" />\r\n\t\t\t\t<block v-else>\r\n\t\t\t\t\t<text>{{ index }}</text>\r\n\t\t\t\t</block>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * indexAnchor 索引列表锚点\r\n\t * @description 通过折叠面板收纳内容区域,搭配<u-index-anchor>使用\r\n\t * @tutorial https://www.uviewui.com/components/indexList.html#indexanchor-props\r\n\t * @property {Boolean} use-slot 是否使用自定义内容的插槽（默认false）\r\n\t * @property {String Number} index 索引字符，如果定义了use-slot，此参数自动失效\r\n\t * @property {Object} custStyle 自定义样式，对象形式，如\"{color: 'red'}\"\r\n\t * @event {Function} default 锚点位置显示内容，默认为索引字符\r\n\t * @example <u-index-anchor :index=\"item\" />\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-index-anchor\",\r\n\t\tprops: {\r\n\t\t\tuseSlot: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\tindex: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\tcustomStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tactive: false,\r\n\t\t\t\twrapperStyle: {},\r\n\t\t\t\tanchorStyle: {}\r\n\t\t\t}\r\n\t\t},\r\n\t\tinject: ['UIndexList'],\r\n\t\tmounted() {\r\n\t\t\tthis.UIndexList.children.push(this);\r\n\t\t\tthis.UIndexList.updateData();\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tcustomAnchorStyle() {\r\n\t\t\t\treturn Object.assign(this.anchorStyle, this.customStyle);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-index-anchor {\r\n\t\tbox-sizing: border-box;\r\n\t\tpadding: 14rpx 24rpx;\r\n\t\tcolor: #606266;\r\n\t\twidth: 100%;\r\n\t\tfont-weight: 500;\r\n\t\tfont-size: 28rpx;\r\n\t\tline-height: 1.2;\r\n\t\tbackground-color: rgb(245, 245, 245);\r\n\t}\r\n\r\n\t.u-index-anchor--active {\r\n\t\tright: 0;\r\n\t\tleft: 0;\r\n\t\tcolor: #2979ff;\r\n\t\tbackground-color: #fff;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-index-list/u-index-list.vue",
    "content": "<template>\r\n\t<!-- 支付宝小程序使用$u.getRect()获取组件的根元素尺寸，所以在外面套一个\"壳\" -->\r\n\t<view>\r\n\t\t<view class=\"u-index-bar\">\r\n\t\t\t<slot />\r\n\t\t\t<view v-if=\"showSidebar\" class=\"u-index-bar__sidebar\" @touchstart.stop.prevent=\"onTouchMove\" @touchmove.stop.prevent=\"onTouchMove\"\r\n\t\t\t @touchend.stop.prevent=\"onTouchStop\" @touchcancel.stop.prevent=\"onTouchStop\">\r\n\t\t\t\t<view v-for=\"(item, index) in indexList\" :key=\"index\" class=\"u-index-bar__index\" :style=\"{zIndex: zIndex + 1, color: activeAnchorIndex === index ? activeColor : ''}\"\r\n\t\t\t\t :data-index=\"index\">\r\n\t\t\t\t\t{{ item }}\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-indexed-list-alert\" v-if=\"touchmove && indexList[touchmoveIndex]\" :style=\"{\r\n\t\t\t\tzIndex: alertZIndex\r\n\t\t\t}\">\r\n\t\t\t\t<text>{{indexList[touchmoveIndex]}}</text>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\tvar indexList = function() {\r\n\t\tvar indexList = [];\r\n\t\tvar charCodeOfA = 'A'.charCodeAt(0);\r\n\t\tfor (var i = 0; i < 26; i++) {\r\n\t\t\tindexList.push(String.fromCharCode(charCodeOfA + i));\r\n\t\t}\r\n\t\treturn indexList;\r\n\t};\r\n\r\n\t/**\r\n\t * indexList 索引列表\r\n\t * @description 通过折叠面板收纳内容区域,搭配<u-index-anchor>使用\r\n\t * @tutorial https://www.uviewui.com/components/indexList.html#indexanchor-props\r\n\t * @property {Number String} scroll-top 当前滚动高度，自定义组件无法获得滚动条事件，所以依赖接入方传入\r\n\t * @property {Array} index-list 索引字符列表，数组（默认A-Z）\r\n\t * @property {Number String} z-index 锚点吸顶时的层级（默认965）\r\n\t * @property {Boolean} sticky 是否开启锚点自动吸顶（默认true）\r\n\t * @property {Number String} offset-top 锚点自动吸顶时与顶部的距离（默认0）\r\n\t * @property {String} highlight-color 锚点和右边索引字符高亮颜色（默认#2979ff）\r\n\t * @event {Function} select 选中右边索引字符时触发\r\n\t * @example <u-index-list :scrollTop=\"scrollTop\"></u-index-list>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-index-list\",\r\n\t\tprops: {\r\n\t\t\tsticky: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\tscrollTop: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0,\r\n\t\t\t},\r\n\t\t\toffsetTop: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\tindexList: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn indexList()\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// #ifdef H5\r\n\t\t\tthis.stickyOffsetTop = this.offsetTop ? uni.upx2px(this.offsetTop) : 44;\r\n\t\t\t// #endif\r\n\t\t\t// #ifndef H5\r\n\t\t\tthis.stickyOffsetTop = this.offsetTop ? uni.upx2px(this.offsetTop) : 0;\r\n\t\t\t// #endif\r\n\t\t\t// 只能在created生命周期定义children，如果在data定义，会因为在子组件中通过provide/inject\r\n\t\t\t// 进行push时而导致的莫名其妙的错误\r\n\t\t\tthis.children = [];\r\n\t\t},\r\n\t\tprovide() {\r\n\t\t\treturn {\r\n\t\t\t\tUIndexList: this\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tactiveAnchorIndex: 0,\r\n\t\t\t\tshowSidebar: true,\r\n\t\t\t\t// children: [],\r\n\t\t\t\ttouchmove: false,\r\n\t\t\t\ttouchmoveIndex: 0,\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tscrollTop() {\r\n\t\t\t\tthis.updateData()\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 弹出toast的z-index值\r\n\t\t\talertZIndex() {\r\n\t\t\t\treturn this.$u.zIndex.toast;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tupdateData() {\r\n\t\t\t\tthis.timer && clearTimeout(this.timer);\r\n\t\t\t\tthis.timer = setTimeout(() => {\r\n\t\t\t\t\tthis.showSidebar = !!this.children.length;\r\n\t\t\t\t\tthis.setRect().then(() => {\r\n\t\t\t\t\t\tthis.onScroll();\r\n\t\t\t\t\t});\r\n\t\t\t\t}, 0);\r\n\t\t\t},\r\n\t\t\tsetRect() {\r\n\t\t\t\treturn Promise.all([\r\n\t\t\t\t\tthis.setAnchorsRect(),\r\n\t\t\t\t\tthis.setListRect(),\r\n\t\t\t\t\tthis.setSiderbarRect()\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\t\t\tsetAnchorsRect() {\r\n\t\t\t\treturn Promise.all(this.children.map((anchor, index) => anchor\r\n\t\t\t\t\t.$uGetRect('.u-index-anchor-wrapper')\r\n\t\t\t\t\t.then((rect) => {\r\n\t\t\t\t\t\tObject.assign(anchor, {\r\n\t\t\t\t\t\t\theight: rect.height,\r\n\t\t\t\t\t\t\ttop: rect.top\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t})));\r\n\t\t\t},\r\n\t\t\tsetListRect() {\r\n\t\t\t\treturn this.$uGetRect('.u-index-bar').then((rect) => {\r\n\t\t\t\t\tObject.assign(this, {\r\n\t\t\t\t\t\theight: rect.height,\r\n\t\t\t\t\t\ttop: rect.top + this.scrollTop\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tsetSiderbarRect() {\r\n\t\t\t\treturn this.$uGetRect('.u-index-bar__sidebar').then(rect => {\r\n\t\t\t\t\tthis.sidebar = {\r\n\t\t\t\t\t\theight: rect.height,\r\n\t\t\t\t\t\ttop: rect.top\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tgetActiveAnchorIndex() {\r\n\t\t\t\tconst {\r\n\t\t\t\t\tchildren\r\n\t\t\t\t} = this;\r\n\t\t\t\tconst {\r\n\t\t\t\t\tsticky\r\n\t\t\t\t} = this;\r\n\t\t\t\tfor (let i = this.children.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tconst preAnchorHeight = i > 0 ? children[i - 1].height : 0;\r\n\t\t\t\t\tconst reachTop = sticky ? preAnchorHeight : 0;\r\n\t\t\t\t\tif (reachTop >= children[i].top) {\r\n\t\t\t\t\t\treturn i;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn -1;\r\n\t\t\t},\r\n\t\t\tonScroll() {\r\n\t\t\t\tconst {\r\n\t\t\t\t\tchildren = []\r\n\t\t\t\t} = this;\r\n\t\t\t\tif (!children.length) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst {\r\n\t\t\t\t\tsticky,\r\n\t\t\t\t\tstickyOffsetTop,\r\n\t\t\t\t\tzIndex,\r\n\t\t\t\t\tscrollTop,\r\n\t\t\t\t\tactiveColor\r\n\t\t\t\t} = this;\r\n\t\t\t\tconst active = this.getActiveAnchorIndex();\r\n\t\t\t\tthis.activeAnchorIndex = active;\r\n\t\t\t\tif (sticky) {\r\n\t\t\t\t\tlet isActiveAnchorSticky = false;\r\n\t\t\t\t\tif (active !== -1) {\r\n\t\t\t\t\t\tisActiveAnchorSticky =\r\n\t\t\t\t\t\t\tchildren[active].top <= 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchildren.forEach((item, index) => {\r\n\t\t\t\t\t\tif (index === active) {\r\n\t\t\t\t\t\t\tlet wrapperStyle = '';\r\n\t\t\t\t\t\t\tlet anchorStyle = {\r\n\t\t\t\t\t\t\t\tcolor: `${activeColor}`\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tif (isActiveAnchorSticky) {\r\n\t\t\t\t\t\t\t\twrapperStyle = {\r\n\t\t\t\t\t\t\t\t\theight: `${children[index].height}px`\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\tanchorStyle = {\r\n\t\t\t\t\t\t\t\t\tposition: 'fixed',\r\n\t\t\t\t\t\t\t\t\ttop: `${stickyOffsetTop}px`,\r\n\t\t\t\t\t\t\t\t\tzIndex: `${zIndex ? zIndex : this.$u.zIndex.indexListSticky}`,\r\n\t\t\t\t\t\t\t\t\tcolor: `${activeColor}`\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\titem.active = active;\r\n\t\t\t\t\t\t\titem.wrapperStyle = wrapperStyle;\r\n\t\t\t\t\t\t\titem.anchorStyle = anchorStyle;\r\n\t\t\t\t\t\t} else if (index === active - 1) {\r\n\t\t\t\t\t\t\tconst currentAnchor = children[index];\r\n\t\t\t\t\t\t\tconst currentOffsetTop = currentAnchor.top;\r\n\t\t\t\t\t\t\tconst targetOffsetTop = index === children.length - 1 ?\r\n\t\t\t\t\t\t\t\tthis.top :\r\n\t\t\t\t\t\t\t\tchildren[index + 1].top;\r\n\t\t\t\t\t\t\tconst parentOffsetHeight = targetOffsetTop - currentOffsetTop;\r\n\t\t\t\t\t\t\tconst translateY = parentOffsetHeight - currentAnchor.height;\r\n\t\t\t\t\t\t\tconst anchorStyle = {\r\n\t\t\t\t\t\t\t\tposition: 'relative',\r\n\t\t\t\t\t\t\t\ttransform: `translate3d(0, ${translateY}px, 0)`,\r\n\t\t\t\t\t\t\t\tzIndex: `${zIndex ? zIndex : this.$u.zIndex.indexListSticky}`,\r\n\t\t\t\t\t\t\t\tcolor: `${activeColor}`\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\titem.active = active;\r\n\t\t\t\t\t\t\titem.anchorStyle = anchorStyle;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\titem.active = false;\r\n\t\t\t\t\t\t\titem.anchorStyle = '';\r\n\t\t\t\t\t\t\titem.wrapperStyle = '';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonTouchMove(event) {\r\n\t\t\t\tthis.touchmove = true;\r\n\t\t\t\tconst sidebarLength = this.children.length;\r\n\t\t\t\tconst touch = event.touches[0];\r\n\t\t\t\tconst itemHeight = this.sidebar.height / sidebarLength;\r\n\t\t\t\tlet clientY = 0;\r\n\t\t\t\tclientY = touch.clientY;\r\n\t\t\t\tlet index = Math.floor((clientY - this.sidebar.top) / itemHeight);\r\n\t\t\t\tif (index < 0) {\r\n\t\t\t\t\tindex = 0;\r\n\t\t\t\t} else if (index > sidebarLength - 1) {\r\n\t\t\t\t\tindex = sidebarLength - 1;\r\n\t\t\t\t}\r\n\t\t\t\tthis.touchmoveIndex = index;\r\n\t\t\t\tthis.scrollToAnchor(index);\r\n\t\t\t},\r\n\t\t\tonTouchStop() {\r\n\t\t\t\tthis.touchmove = false;\r\n\t\t\t\tthis.scrollToAnchorIndex = null;\r\n\t\t\t},\r\n\t\t\tscrollToAnchor(index) {\r\n\t\t\t\tif (this.scrollToAnchorIndex === index) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.scrollToAnchorIndex = index;\r\n\t\t\t\tconst anchor = this.children.find((item) => item.index === this.indexList[index]);\r\n\t\t\t\tif (anchor) {\r\n\t\t\t\t\tthis.$emit('select', anchor.index);\r\n\t\t\t\t\tuni.pageScrollTo({\r\n\t\t\t\t\t\tduration: 0,\r\n\t\t\t\t\t\tscrollTop: anchor.top + this.scrollTop\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-index-bar {\r\n\t\tposition: relative\r\n\t}\r\n\r\n\t.u-index-bar__sidebar {\r\n\t\tposition: fixed;\r\n\t\ttop: 50%;\r\n\t\tright: 0;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\ttext-align: center;\r\n\t\ttransform: translateY(-50%);\r\n\t\tuser-select: none;\r\n\t\tz-index: 99;\r\n\t}\r\n\r\n\t.u-index-bar__index {\r\n\t\tfont-weight: 500;\r\n\t\tpadding: 8rpx 18rpx;\r\n\t\tfont-size: 22rpx;\r\n\t\tline-height: 1\r\n\t}\r\n\r\n\t.u-indexed-list-alert {\r\n\t\tposition: fixed;\r\n\t\twidth: 120rpx;\r\n\t\theight: 120rpx;\r\n\t\tright: 90rpx;\r\n\t\ttop: 50%;\r\n\t\tmargin-top: -60rpx;\r\n\t\tborder-radius: 24rpx;\r\n\t\tfont-size: 50rpx;\r\n\t\tcolor: #fff;\r\n\t\tbackground-color: rgba(0, 0, 0, 0.65);\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tpadding: 0;\r\n\t\tz-index: 9999999;\r\n\t}\r\n\r\n\t.u-indexed-list-alert text {\r\n\t\tline-height: 50rpx;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-input/u-input.vue",
    "content": "<template>\r\n\t<view\r\n\t\tclass=\"u-input\"\r\n\t\t:class=\"{\r\n\t\t\t'u-input--border': border,\r\n\t\t\t'u-input--error': validateState\r\n\t\t}\"\r\n\t\t:style=\"{\r\n\t\t\tpadding: `0 ${border ? 20 : 0}rpx`,\r\n\t\t\tborderColor: borderColor,\r\n\t\t\ttextAlign: inputAlign\r\n\t\t}\"\r\n\t\t@tap.stop=\"inputClick\"\r\n\t>\r\n\t\t<textarea\r\n\t\t\tv-if=\"type == 'textarea'\"\r\n\t\t\tclass=\"u-input__input u-input__textarea\"\r\n\t\t\t:style=\"[getStyle]\"\r\n\t\t\t:value=\"defaultValue\"\r\n\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t:placeholderStyle=\"placeholderStyle\"\r\n\t\t\t:disabled=\"disabled\"\r\n\t\t\t:maxlength=\"inputMaxlength\"\r\n\t\t\t:fixed=\"fixed\"\r\n\t\t\t:focus=\"focus\"\r\n\t\t\t:autoHeight=\"autoHeight\"\r\n\t\t\t:selection-end=\"uSelectionEnd\"\r\n\t\t\t:selection-start=\"uSelectionStart\"\r\n\t\t\t:cursor-spacing=\"getCursorSpacing\"\r\n\t\t\t@input=\"handleInput\"\r\n\t\t\t@blur=\"handleBlur\"\r\n\t\t\t@focus=\"onFocus\"\r\n\t\t\t@confirm=\"onConfirm\"\r\n\t\t/>\r\n\t\t<input\r\n\t\t\tv-else\r\n\t\t\tclass=\"u-input__input\"\r\n\t\t\t:type=\"type == 'password' ? 'text' : type\"\r\n\t\t\t:style=\"[getStyle]\"\r\n\t\t\t:value=\"defaultValue\"\r\n\t\t\t:password=\"type == 'password' && !showPassword\"\r\n\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t:placeholderStyle=\"placeholderStyle\"\r\n\t\t\t:disabled=\"disabled || type === 'select'\"\r\n\t\t\t:maxlength=\"inputMaxlength\"\r\n\t\t\t:focus=\"focus\"\r\n\t\t\t:confirmType=\"confirmType\"\r\n\t\t\t:cursor-spacing=\"getCursorSpacing\"\r\n\t\t\t:selection-end=\"uSelectionEnd\"\r\n\t\t\t:selection-start=\"uSelectionStart\"\r\n\t\t\t@focus=\"onFocus\"\r\n\t\t\t@blur=\"handleBlur\"\r\n\t\t\t@input=\"handleInput\"\r\n\t\t\t@confirm=\"onConfirm\"\r\n\t\t/>\r\n\t\t<view class=\"u-input__right-icon u-flex\">\r\n\t\t\t<view class=\"u-input__right-icon__clear u-input__right-icon__item\" v-if=\"clearable && value != '' && focused\">\r\n\t\t\t\t<u-icon size=\"32\" name=\"close-circle-fill\" color=\"#c0c4cc\" @touchstart=\"onClear\"/>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-input__right-icon__clear u-input__right-icon__item\" v-if=\"passwordIcon && type == 'password'\">\r\n\t\t\t\t<u-icon size=\"32\" :name=\"!showPassword ? 'eye' : 'eye-fill'\" color=\"#c0c4cc\" @click=\"showPassword = !showPassword\"/>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-input__right-icon--select u-input__right-icon__item\" v-if=\"type == 'select'\" :class=\"{\r\n\t\t\t\t'u-input__right-icon--select--reverse': selectOpen\r\n\t\t\t}\">\r\n\t\t\t\t<u-icon name=\"arrow-down-fill\" size=\"26\" color=\"#c0c4cc\"></u-icon>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\nimport Emitter from '../../libs/util/emitter.js';\r\n\r\n/**\r\n * input 输入框\r\n * @description 此组件为一个输入框，默认没有边框和样式，是专门为配合表单组件u-form而设计的，利用它可以快速实现表单验证，输入内容，下拉选择等功能。\r\n * @tutorial http://uviewui.com/components/input.html\r\n * @property {String} type 模式选择，见官网说明\r\n * @property {Boolean} clearable 是否显示右侧的清除图标(默认true)\r\n * @property {} v-model 用于双向绑定输入框的值\r\n * @property {String} input-align 输入框文字的对齐方式(默认left)\r\n * @property {String} placeholder placeholder显示值(默认 '请输入内容')\r\n * @property {Boolean} disabled 是否禁用输入框(默认false)\r\n * @property {String Number} maxlength 输入框的最大可输入长度(默认140)\r\n * @property {String Number} selection-start 光标起始位置，自动聚焦时有效，需与selection-end搭配使用（默认-1）\r\n * @property {String Number} maxlength 光标结束位置，自动聚焦时有效，需与selection-start搭配使用（默认-1）\r\n * @property {String Number} cursor-spacing 指定光标与键盘的距离，单位px(默认0)\r\n * @property {String} placeholderStyle placeholder的样式，字符串形式，如\"color: red;\"(默认 \"color: #c0c4cc;\")\r\n * @property {String} confirm-type 设置键盘右下角按钮的文字，仅在type为text时生效(默认done)\r\n * @property {Object} custom-style 自定义输入框的样式，对象形式\r\n * @property {Boolean} focus 是否自动获得焦点(默认false)\r\n * @property {Boolean} fixed 如果type为textarea，且在一个\"position:fixed\"的区域，需要指明为true(默认false)\r\n * @property {Boolean} password-icon type为password时，是否显示右侧的密码查看图标(默认true)\r\n * @property {Boolean} border 是否显示边框(默认false)\r\n * @property {String} border-color 输入框的边框颜色(默认#dcdfe6)\r\n * @property {Boolean} auto-height 是否自动增高输入区域，type为textarea时有效(默认true)\r\n * @property {String Number} height 高度，单位rpx(text类型时为70，textarea时为100)\r\n * @example <u-input v-model=\"value\" :type=\"type\" :border=\"border\" />\r\n */\r\nexport default {\r\n\tname: 'u-input',\r\n\tmixins: [Emitter],\r\n\tprops: {\r\n\t\tvalue: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 输入框的类型，textarea，text，number\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'text'\r\n\t\t},\r\n\t\tinputAlign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\tplaceholder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '请输入内容'\r\n\t\t},\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\tmaxlength: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 140\r\n\t\t},\r\n\t\tplaceholderStyle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'color: #c0c4cc;'\r\n\t\t},\r\n\t\tconfirmType: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'done'\r\n\t\t},\r\n\t\t// 输入框的自定义样式\r\n\t\tcustomStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 如果 textarea 是在一个 position:fixed 的区域，需要显示指定属性 fixed 为 true\r\n\t\tfixed: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否自动获得焦点\r\n\t\tfocus: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 密码类型时，是否显示右侧的密码图标\r\n\t\tpasswordIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// input|textarea是否显示边框\r\n\t\tborder: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 输入框的边框颜色\r\n\t\tborderColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#dcdfe6'\r\n\t\t},\r\n\t\tautoHeight: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// type=select时，旋转右侧的图标，标识当前处于打开还是关闭select的状态\r\n\t\t// open-打开，close-关闭\r\n\t\tselectOpen: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 高度，单位rpx\r\n\t\theight: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否可清空\r\n\t\tclearable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 指定光标与键盘的距离，单位 px\r\n\t\tcursorSpacing: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 光标起始位置，自动聚焦时有效，需与selection-end搭配使用\r\n\t\tselectionStart: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: -1\r\n\t\t},\r\n\t\t// 光标结束位置，自动聚焦时有效，需与selection-start搭配使用\r\n\t\tselectionEnd: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: -1\r\n\t\t},\r\n\t\t// 是否自动去除两端的空格\r\n\t\ttrim: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tdefaultValue: this.value,\r\n\t\t\tinputHeight: 70, // input的高度\r\n\t\t\ttextareaHeight: 100, // textarea的高度\r\n\t\t\tvalidateState: false, // 当前input的验证状态，用于错误时，边框是否改为红色\r\n\t\t\tfocused: false, // 当前是否处于获得焦点的状态\r\n\t\t\tshowPassword: false, // 是否预览密码\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tvalue(nVal, oVal) {\r\n\t\t\tthis.defaultValue = nVal;\r\n\t\t\t// 当值发生变化，且为select类型时(此时input被设置为disabled，不会触发@input事件)，模拟触发@input事件\r\n\t\t\tif(nVal != oVal && this.type == 'select') this.handleInput({\r\n\t\t\t\tdetail: {\r\n\t\t\t\t\tvalue: nVal\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t},\r\n\t},\r\n\tcomputed: {\r\n\t\t// 因为uniapp的input组件的maxlength组件必须要数值，这里转为数值，给用户可以传入字符串数值\r\n\t\tinputMaxlength() {\r\n\t\t\treturn Number(this.maxlength);\r\n\t\t},\r\n\t\tgetStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\t// 如果没有自定义高度，就根据type为input还是textare来分配一个默认的高度\r\n\t\t\tstyle.minHeight = this.height ? this.height + 'rpx' : this.type == 'textarea' ?\r\n\t\t\t\tthis.textareaHeight + 'rpx' : this.inputHeight + 'rpx';\r\n\t\t\tstyle = Object.assign(style, this.customStyle);\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t//\r\n\t\tgetCursorSpacing() {\r\n\t\t\treturn Number(this.cursorSpacing);\r\n\t\t},\r\n\t\t// 光标起始位置\r\n\t\tuSelectionStart() {\r\n\t\t\treturn String(this.selectionStart);\r\n\t\t},\r\n\t\t// 光标结束位置\r\n\t\tuSelectionEnd() {\r\n\t\t\treturn String(this.selectionEnd);\r\n\t\t}\r\n\t},\r\n\tcreated() {\r\n\t\t// 监听u-form-item发出的错误事件，将输入框边框变红色\r\n\t\tthis.$on('on-form-item-error', this.onFormItemError);\r\n\t},\r\n\tmethods: {\r\n\t\t/**\r\n\t\t * change 事件\r\n\t\t * @param event\r\n\t\t */\r\n\t\thandleInput(event) {\r\n\t\t\tlet value = event.detail.value;\r\n\t\t\t// 判断是否去除空格\r\n\t\t\tif(this.trim) value = this.$u.trim(value);\r\n\t\t\t// 当前model 赋值\r\n\t\t\tthis.defaultValue = value;\r\n\t\t\t// vue 原生的方法 return 出去\r\n\t\t\tthis.$emit('input', value);\r\n\t\t\t// 过一个生命周期再发送事件给u-form-item，否则this.$emit('input')更新了父组件的值，但是微信小程序上\r\n\t\t\t// 尚未更新到u-form-item，导致获取的值为空，从而校验混论\r\n\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t// 将当前的值发送到 u-form-item 进行校验\r\n\t\t\t\tthis.dispatch('u-form-item', 'on-form-change', value);\r\n\t\t\t});\r\n\t\t},\r\n\t\t/**\r\n\t\t * blur 事件\r\n\t\t * @param event\r\n\t\t */\r\n\t\thandleBlur(event) {\r\n\t\t\tthis.focused = false;\r\n\t\t\t// vue 原生的方法 return 出去\r\n\t\t\tthis.$emit('blur', event.detail.value);\r\n\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t// 将当前的值发送到 u-form-item 进行校验\r\n\t\t\t\tthis.dispatch('u-form-item', 'on-form-blur', event.detail.value);\r\n\t\t\t});\r\n\t\t},\r\n\t\tonFormItemError(status) {\r\n\t\t\tthis.validateState = status;\r\n\t\t},\r\n\t\tonFocus(event) {\r\n\t\t\tthis.focused = true;\r\n\t\t\tthis.$emit('focus');\r\n\t\t},\r\n\t\tonConfirm(e) {\r\n\t\t\tthis.$emit('confirm', e.detail.value);\r\n\t\t},\r\n\t\tonClear(event) {\r\n\t\t\tthis.$emit('input', '');\r\n\t\t},\r\n\t\tinputClick() {\r\n\t\t\tthis.$emit('click');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.u-input {\r\n\tposition: relative;\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\r\n\t&__input {\r\n\t\t//height: $u-form-item-height;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-main-color;\r\n\t\tflex: 1;\r\n\t}\r\n\r\n\t&__textarea {\r\n\t\twidth: auto;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-main-color;\r\n\t\tpadding: 10rpx 0;\r\n\t\tline-height: normal;\r\n\t\tflex: 1;\r\n\t}\r\n\r\n\t&--border {\r\n\t\tborder-radius: 6rpx;\r\n\t\tborder-radius: 4px;\r\n\t\tborder: 1px solid $u-form-item-border-color;\r\n\t}\r\n\r\n\t&--error {\r\n\t\tborder-color: $u-type-error!important;\r\n\t}\r\n\r\n\t&__right-icon {\r\n\r\n\t\t&__item {\r\n\t\t\tmargin-left: 10rpx;\r\n\t\t}\r\n\r\n\t\t&--select {\r\n\t\t\ttransition: transform .4s;\r\n\r\n\t\t\t&--reverse {\r\n\t\t\t\ttransform: rotate(-180deg);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-keyboard/u-keyboard.vue",
    "content": "<template>\r\n\t<u-popup class=\"\" :mask=\"mask\" :maskCloseAble=\"maskCloseAble\" mode=\"bottom\" :popup=\"false\" v-model=\"value\" length=\"auto\"\r\n\t :safeAreaInsetBottom=\"safeAreaInsetBottom\" @close=\"popupClose\" :zIndex=\"uZIndex\">\r\n\t\t<slot />\r\n\t\t<view class=\"u-tooltip\" v-if=\"tooltip\">\r\n\t\t\t<view class=\"u-tooltip-item u-tooltip-cancel\" hover-class=\"u-tooltip-cancel-hover\" @tap=\"onCancel\">\r\n\t\t\t\t{{cancelBtn ? cancelText : ''}}\r\n\t\t\t</view>\r\n\t\t\t<view v-if=\"showTips\" class=\"u-tooltip-item u-tooltip-tips\">\r\n\t\t\t\t{{tips ? tips : mode == 'number' ? '数字键盘' : mode == 'card' ? '身份证键盘' : '车牌号键盘'}}\r\n\t\t\t</view>\r\n\t\t\t<view v-if=\"confirmBtn\" @tap=\"onConfirm\" class=\"u-tooltip-item u-tooltips-submit\" hover-class=\"u-tooltips-submit-hover\">\r\n\t\t\t\t{{confirmBtn ? confirmText : ''}}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<block v-if=\"mode == 'number' || mode == 'card'\">\r\n\t\t\t<u-number-keyboard :random=\"random\" @backspace=\"backspace\" @change=\"change\" :mode=\"mode\" :dotEnabled=\"dotEnabled\"></u-number-keyboard>\r\n\t\t</block>\r\n\t\t<block v-else>\r\n\t\t\t<u-car-keyboard :random=\"random\" @backspace=\"backspace\" @change=\"change\"></u-car-keyboard>\r\n\t\t</block>\r\n\t</u-popup>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * keyboard 键盘\r\n\t * @description 此为uViw自定义的键盘面板，内含了数字键盘，车牌号键，身份证号键盘3中模式，都有可以打乱按键顺序的选项。\r\n\t * @tutorial https://www.uviewui.com/components/keyboard.html\r\n\t * @property {String} mode 键盘类型，见官网基本使用的说明（默认number）\r\n\t * @property {Boolean} dot-enabled 是否显示\".\"按键，只在mode=number时有效（默认true）\r\n\t * @property {Boolean} tooltip 是否显示键盘顶部工具条（默认true）\r\n\t * @property {String} tips 工具条中间的提示文字，见上方基本使用的说明，如不需要，请传\"\"空字符\r\n\t * @property {Boolean} cancel-btn 是否显示工具条左边的\"取消\"按钮（默认true）\r\n\t * @property {Boolean} confirm-btn 是否显示工具条右边的\"完成\"按钮（默认true）\r\n\t * @property {Boolean} mask 是否显示遮罩（默认true）\r\n\t * @property {String} confirm-text 确认按钮的文字\r\n\t * @property {String} cancel-text 取消按钮的文字\r\n\t * @property {Number String} z-index 弹出键盘的z-index值（默认1075）\r\n\t * @property {Boolean} random 是否打乱键盘按键的顺序（默认false）\r\n\t * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配（默认false）\r\n\t * @property {Boolean} mask-close-able 是否允许点击遮罩收起键盘（默认true）\r\n\t * @event {Function} change 按键被点击(不包含退格键被点击)\r\n\t * @event {Function} cancel 键盘顶部工具条左边的\"取消\"按钮被点击\r\n\t * @event {Function} confirm 键盘顶部工具条右边的\"完成\"按钮被点击\r\n\t * @event {Function} backspace 键盘退格键被点击\r\n\t * @example <u-keyboard mode=\"number\" v-model=\"show\"></u-keyboard> \r\n\t */\r\n\texport default {\r\n\t\tname: \"u-keyboard\",\r\n\t\tprops: {\r\n\t\t\t// 键盘的类型，number-数字键盘，card-身份证键盘，car-车牌号键盘\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'number'\r\n\t\t\t},\r\n\t\t\t// 是否显示键盘的\".\"符号\r\n\t\t\tdotEnabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否显示顶部工具条\r\n\t\t\ttooltip: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否显示工具条中间的提示\r\n\t\t\tshowTips: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 工具条中间的提示文字\r\n\t\t\ttips: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否显示工具条左边的\"取消\"按钮\r\n\t\t\tcancelBtn: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否显示工具条右边的\"完成\"按钮\r\n\t\t\tconfirmBtn: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否打乱键盘按键的顺序\r\n\t\t\trandom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否开启底部安全区适配，开启的话，会在iPhoneX机型底部添加一定的内边距\r\n\t\t\tsafeAreaInsetBottom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否允许通过点击遮罩关闭键盘\r\n\t\t\tmaskCloseAble: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 通过双向绑定控制键盘的弹出与收起\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否显示遮罩，某些时候数字键盘时，用户希望看到自己的数值，所以可能不想要遮罩\r\n\t\t\tmask: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 取消按钮的文字\r\n\t\t\tcancelText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '取消'\r\n\t\t\t},\r\n\t\t\t// 确认按钮的文字\r\n\t\t\tconfirmText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '确认'\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t//show: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tuZIndex() {\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tchange(e) {\r\n\t\t\t\tthis.$emit('change', e);\r\n\t\t\t},\r\n\t\t\t// 键盘关闭\r\n\t\t\tpopupClose() {\r\n\t\t\t\t// 通过发送input这个特殊的事件名，可以修改父组件传给props的value的变量，也即双向绑定\r\n\t\t\t\tthis.$emit('input', false);\r\n\t\t\t},\r\n\t\t\t// 输入完成\r\n\t\t\tonConfirm() {\r\n\t\t\t\tthis.popupClose();\r\n\t\t\t\tthis.$emit('confirm');\r\n\t\t\t},\r\n\t\t\t// 取消输入\r\n\t\t\tonCancel() {\r\n\t\t\t\tthis.popupClose();\r\n\t\t\t\tthis.$emit('cancel');\r\n\t\t\t},\r\n\t\t\t// 退格键\r\n\t\t\tbackspace() {\r\n\t\t\t\tthis.$emit('backspace');\r\n\t\t\t},\r\n\t\t\t// 关闭键盘\r\n\t\t\t// close() {\r\n\t\t\t// \tthis.show = false;\r\n\t\t\t// },\r\n\t\t\t// // 打开键盘\r\n\t\t\t// open() {\r\n\t\t\t// \tthis.show = true;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-keyboard {\r\n\t\tposition: relative;\r\n\t\tz-index: 1003;\r\n\t}\r\n\r\n\t.u-tooltip {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n\r\n\t.u-tooltip-item {\r\n\t\tcolor: #333333;\r\n\t\tflex: 0 0 33.333333%;\r\n\t\ttext-align: center;\r\n\t\tpadding: 20rpx 10rpx;\r\n\t\tfont-size: 28rpx;\r\n\t}\r\n\r\n\t.u-tooltips-submit {\r\n\t\ttext-align: right;\r\n\t\tflex-grow: 1;\r\n\t\tflex-wrap: 0;\r\n\t\tpadding-right: 40rpx;\r\n\t\tcolor: $u-type-primary;\r\n\t}\r\n\r\n\t.u-tooltip-cancel {\r\n\t\ttext-align: left;\r\n\t\tflex-grow: 1;\r\n\t\tflex-wrap: 0;\r\n\t\tpadding-left: 40rpx;\r\n\t\tcolor: #888888;\r\n\t}\r\n\r\n\t.u-tooltips-submit-hover {\r\n\t\tcolor: $u-type-success;\r\n\t}\r\n\r\n\t.u-tooltip-cancel-hover {\r\n\t\tcolor: #333333;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-lazy-load/u-lazy-load.vue",
    "content": "<template>\r\n\t<view class=\"u-wrap\" :style=\"{\r\n\t\t\t  opacity: Number(opacity),\r\n\t\t\t  borderRadius: borderRadius + 'rpx',\r\n\t\t\t  // 因为time值需要改变,所以不直接用duration值(不能改变父组件prop传过来的值)\r\n\t\t\t  transition: `opacity ${time / 1000}s ease-in-out`\r\n\t\t   }\"\r\n\t :class=\"'u-lazy-item-' + elIndex\">\r\n\t\t<view :class=\"'u-lazy-item-' + elIndex\">\r\n\t\t\t<image :style=\"{borderRadius: borderRadius + 'rpx', height: imgHeight}\" v-if=\"!isError\" class=\"u-lazy-item\"\r\n\t\t\t :src=\"isShow ? image : loadingImg\" :mode=\"imgMode\" @load=\"imgLoaded\" @error=\"loadError\" @tap=\"clickImg\"></image>\r\n\t\t\t<image :style=\"{borderRadius: borderRadius + 'rpx', height: imgHeight}\" class=\"u-lazy-item error\" v-else :src=\"errorImg\"\r\n\t\t\t :mode=\"imgMode\" @load=\"errorImgLoaded\" @tap=\"clickImg\"></image>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * lazyLoad 懒加载\r\n\t * @description 懒加载使用的场景为：页面有很多图片时，APP会同时加载所有的图片，导致页面卡顿，各个位置的图片出现前后不一致等.\r\n\t * @tutorial https://www.uviewui.com/components/lazyLoad.html\r\n\t * @property {String Number} index 用户自定义值，在事件触发时回调，用以区分是哪个图片\r\n\t * @property {String} image 图片路径\r\n\t * @property {String} loading-img 预加载时的占位图\r\n\t * @property {String} error-img 图片加载出错时的占位图\r\n\t * @property {String} threshold 触发加载时的位置，见上方说明，单位 rpx（默认300）\r\n\t * @property {String Number} duration 图片加载成功时，淡入淡出时间，单位ms（默认）\r\n\t * @property {String} effect 图片加载成功时，淡入淡出的css动画效果（默认ease-in-out）\r\n\t * @property {Boolean} is-effect 图片加载成功时，是否启用淡入淡出效果（默认true）\r\n\t * @property {String Number} border-radius 图片圆角值，单位rpx（默认0）\r\n\t * @property {String Number} height 图片高度，注意：实际高度可能受img-mode参数影响（默认450）\r\n\t * @property {String Number} mg-mode 图片的裁剪模式，详见image组件裁剪模式（默认widthFix）\r\n\t * @event {Function} click 点击图片时触发\r\n\t * @event {Function} load 图片加载成功时触发\r\n\t * @event {Function} error 图片加载失败时触发\r\n\t * @example <u-lazy-load :image=\"image\" :loading-img=\"loadingImg\" :error-img=\"errorImg\"></u-lazy-load>\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-lazy-load',\r\n\t\tprops: {\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [Number, String]\r\n\t\t\t},\r\n\t\t\t// 要显示的图片\r\n\t\t\timage: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 图片裁剪模式\r\n\t\t\timgMode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'widthFix'\r\n\t\t\t},\r\n\t\t\t// 占位图片路径\r\n\t\t\tloadingImg: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM0QjNBQjkyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM0QjNBQkEyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzRCM0FCNzJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzRCM0FCODJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtRHfPcAAAAzUExURZWVldfX18PDw62trZubm9zc3Li4uKGhoebm5tLS0uHh4c3Nzaenp729vcjIyLKysuvr6141L40AAAcXSURBVHja7NzZlqpGAEBR5lG0//9rIw7IJKJi4or7PGTdtN10wr5SVAEGf/qqArsAiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAg+nmQFMi5Jis+sIniED23jSzIgLTtg2D//iYme/8QBM/9lQ+CAEhbNLM3N9hEHAThX7GPCiBfAxK1b51kD+R7QMLjXg7iCsgWIPUh7pfVozG791oeBPngm48G583uW5GkBvI+SBaM2xXDn1oqum423bX/mgF5FySc2cv93Voug9TdZotsggnkBZB2NzbhrSY5HnoG07jei8dvzsJB/c3W60SALILE46+WCztsbhPR7R2VJq0ukEcT49nyy8QhaKcRa3fYHZD4+ufqOJAcgDz8/59vtw1I3QP5K6JsOG0vm3hce4I8LQp/BaRZGJC3AAn7IKOKXbC+7EdA5vdmmVwOLksgRThqOqiH4XEGsht+peoPUE8U/jJIO5OLH4GEwUslV5G0PTBG5Uiw/Y2jyigO3l9HAHKv9PYb82LloH74dZBoBUgar+l48NsNvtD0fkez9iwrAvIYZDRCl+Xs149Hm/KZmQ+QjUCiO1ei4ru7EsgnQYrkznlQb7thCuRfAzlOAPN72427P4VA/i2Q/DKT/Ls/VR8fvIBsDZIuz7TPF6TCbnk4GJkB2RokejTjuE7/unlgCuSTIO0Cy+Plp6vDfnQlBchy8QtjSHVd3EgmK1bHLm+H6+nXYbz2DuQRSPnqoL7vvq0u70on4zvxgCyWD3b9UyDVdW24PaWaiGTnFZJwPIQAebDpIKheBIm7n124ZthMJipAlkqHO+IZkP1tbfzOJark/A7MgKyvvl60fRqkvXfhuow+t9+q00+0/yyBrK8ZngOtBzldhw2X9tvpNGty0gvkmbPeJ0Cy/r09s/stbmfo0yMWkEdjevgKyOn2t2pxv7UXoibTdCDLje9/Ww1ymqzn87dbp92242ZmMRjI8hASvwKSLq4udqN6ksw8nxXN3tszD9L8Gkg+2mFrQYql5az4tvFj5xOx4VwnSdeBtGdyPwUytxK77pBVlNHdO7OK3rh/eTPUvdutT3fO52tuHMqD4N7llv8pyOQQ//w19YVDfX27+Sfuby9/6nau4pdA8vEdOZuChEH/quHt0Jg+IRJ/5+PrHwKZXfjbDiS73Zo7mu5UkzX7uTsXe0e/7nC3ePf1O69+BUg2XDfZCqSqOu7rGVf8cHBe8zhC2b61dtUHXv0OkGo6ZL4JkpbRYXdUaFevivx2M/1GIOctNh949TtAoumQ+TpIHMX54CJu+8BDd8FkE5BqcZh/59XvAClmTvKfB0nDqIlHo3T70SftyW1eX9dXtgQJqs1f/Q6QaOa/7wmQKtxH8eiGoCRuovODIO3VxOMmruZbHrLyD7z6DSDtGyT7ew1kf9hNn07c986JTovzzem0Id9wUG+Vk/IDr34DSNR7huZJkMFT6vEhqrPx/j5cnlZML8N6/PAzh9Y99Flm5Yde/c9BquDOkvkKkMP58dA4qi9vivE8JOvGz/j8FokfPpr288+pH2ZPOZrLmeGD+7KOh6dqYWJ48ki7yUg0tz0go/fv/LLddfV3sgOLJyaGPY/zrSlh1a36Arkzoue9CyG35ze6E6/dzO2Ga0EGHqdRJIkfn9/8OEjTW8Vq91ZWh39FeehWA7Nu9ft8CpUEk1WWOyDF0OPyEU2Pnzf/bZC0P6IPzmAvu7KauQBVrgKpJ0tG2arHzX8e5Pb3PezNs/PrX+3JMyCLn9XXf37tPFHvt09WfCDDjx+yyn1/p1V11j7GnB/q3leLuVva79S/tzed+db08YpF4uOZtmz/9oXWMq6BCAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiAALELvqt/BBgACqVeUBXxcCkAAAAASUVORK5CYII='\r\n\t\t\t},\r\n\t\t\t// 加载失败的错误占位图\r\n\t\t\terrorImg: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODdDMjhENDYyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODdDMjhENDcyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4N0MyOEQ0NDJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4N0MyOEQ0NTJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhLwhikAAAAzUExURZWVldfX162t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'\r\n\t\t\t},\r\n\t\t\t// 图片进入可见区域前多少像素时，单位rpx，开始加载图片\r\n\t\t\t// 负数为图片超出屏幕底部多少距离后触发懒加载，正数为图片顶部距离屏幕底部多少距离时触发(图片还没出现在屏幕上)\r\n\t\t\tthreshold: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 100\r\n\t\t\t},\r\n\t\t\t// 淡入淡出动画的过渡时间\r\n\t\t\tduration: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 500\r\n\t\t\t},\r\n\t\t\t// 渡效果的速度曲线，各个之间差别不大，因为这是淡入淡出，且时间很短，不是那些变形或者移动的情况，会明显\r\n\t\t\t// linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);\r\n\t\t\teffect: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'ease-in-out'\r\n\t\t\t},\r\n\t\t\t// 是否使用过渡效果\r\n\t\t\tisEffect: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 圆角值\r\n\t\t\tborderRadius: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 图片高度，单位rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: '450'\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tisShow: false,\r\n\t\t\t\topacity: 1,\r\n\t\t\t\ttime: this.duration,\r\n\t\t\t\tloadStatus: '', // 默认是懒加载中的状态\r\n\t\t\t\tisError: false, // 图片加载失败\r\n\t\t\t\telIndex: this.$u.guid()\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 将threshold从rpx转为px\r\n\t\t\tgetThreshold() {\r\n\t\t\t\t// 先取绝对值，因为threshold可能是负数，最后根据this.threshold是正数或者负数，重新还原\r\n\t\t\t\tlet thresholdPx = uni.upx2px(Math.abs(this.threshold));\r\n\t\t\t\treturn this.threshold < 0 ? -thresholdPx : thresholdPx;\r\n\t\t\t},\r\n\t\t\t// 计算图片的高度，可能为auto，带%，或者直接数值\r\n\t\t\timgHeight() {\r\n\t\t\t\treturn this.$u.addUnit(this.height);\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 由于一些特殊原因，不能将此变量放到data中定义\r\n\t\t\tthis.observer = {};\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tisShow(nVal) {\r\n\t\t\t\t// 如果是不开启过渡效果，直接返回\r\n\t\t\t\tif (!this.isEffect) return;\r\n\t\t\t\tthis.time = 0;\r\n\t\t\t\t// 原来opacity为1(不透明，是为了显示占位图)，改成0(透明，意味着该元素显示的是背景颜色，默认的白色)，再改成1，是为了获得过渡效果\r\n\t\t\t\tthis.opacity = 0;\r\n\t\t\t\t// 延时30ms，否则在浏览器H5，过渡效果无效\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.time = this.duration;\r\n\t\t\t\t\tthis.opacity = 1;\r\n\t\t\t\t}, 30)\r\n\t\t\t},\r\n\t\t\t// 图片路径发生变化时，需要重新标记一些变量，否则会一直卡在某一个状态，比如isError\r\n\t\t\timage(n) {\r\n\t\t\t\tif(!n) {\r\n\t\t\t\t\t// 如果传入null或者''，或者undefined，标记为错误状态\r\n\t\t\t\t\tthis.isError = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.init();\r\n\t\t\t\t\tthis.isError = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 用于重新初始化\r\n\t\t\tinit() {\r\n\t\t\t\tthis.isError = false;\r\n\t\t\t\tthis.loadStatus = '';\r\n\t\t\t},\r\n\t\t\t// 点击图片触发的事件,loadlazy-还是懒加载中状态，loading-图片正在加载，loaded-图片加加载完成\r\n\t\t\tclickImg() {\r\n\t\t\t\tlet whichImg = '';\r\n\t\t\t\t// 如果isShow为false，意味着图片还没开始加载，点击的只能是最开始的占位图\r\n\t\t\t\tif (this.isShow == false) whichImg = 'lazyImg';\r\n\t\t\t\t// 如果isError为true，意味着图片加载失败，这是只剩下错误的占位图，所以点击的只能是错误占位图\r\n\t\t\t\t// 当然，也可以给错误的占位图元素绑定点击事件，看你喜欢~\r\n\t\t\t\telse if (this.isError == true) whichImg = 'errorImg';\r\n\t\t\t\t// 总共三张图片，除了两个占位图，剩下的只能是正常的那张图片了\r\n\t\t\t\telse whichImg = 'realImg';\r\n\t\t\t\t// 只通知当前图片的index\r\n\t\t\t\tthis.$emit('click', this.index);\r\n\t\t\t},\r\n\t\t\t// 图片加载完成事件，可能是加载占位图时触发，也可能是加载真正的图片完成时触发，通过isShow区分\r\n\t\t\timgLoaded() {\r\n\t\t\t\t// 占位图加载完成\r\n\t\t\t\tif (this.loadStatus == '') {\r\n\t\t\t\t\tthis.loadStatus = 'lazyed';\r\n\t\t\t\t}\r\n\t\t\t\t// 真正的图片加载完成 \r\n\t\t\t\telse if (this.loadStatus == 'lazyed') {\r\n\t\t\t\t\tthis.loadStatus = 'loaded';\r\n\t\t\t\t\tthis.$emit('load', this.index);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 错误的图片加载完成\r\n\t\t\terrorImgLoaded() {\r\n\t\t\t\tthis.$emit('error', this.index);\r\n\t\t\t},\r\n\t\t\t// 图片加载失败\r\n\t\t\tloadError() {\r\n\t\t\t\tthis.isError = true;\r\n\t\t\t},\r\n\t\t\tdisconnectObserver(observerName) {\r\n\t\t\t\tconst observer = this[observerName];\r\n\t\t\t\tobserver && observer.disconnect();\r\n\t\t\t},\r\n\t\t},\r\n\t\tbeforeDestroy() {\r\n\t\t\t// 销毁页面时，可能还没触发某张很底部的懒加载图片，所以把这个事件给去掉\r\n\t\t\t//observer.disconnect();\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\t// 此uOnReachBottom事件由mixin.js发出，目的是让页面到底时，保证所有图片都进行加载，做到绝对稳定且可靠\r\n\t\t\tthis.$nextTick(() => {\r\n\t\t\t\tuni.$once('uOnReachBottom', () => {\r\n\t\t\t\t\tif (!this.isShow) this.isShow = true;\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t\t// mounted的时候，不一定挂载了这个元素，延时30ms，否则会报错或者不报错，但是也没有效果\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t// 这里是组件内获取布局状态，不能用uni.createIntersectionObserver，而必须用this.createIntersectionObserver\r\n\t\t\t\tthis.disconnectObserver('contentObserver');\r\n\t\t\t\tconst contentObserver = uni.createIntersectionObserver(this);\r\n\t\t\t\t// 要理解这里怎么计算的，请看这个：\r\n\t\t\t\t// https://blog.csdn.net/qq_25324335/article/details/83687695\r\n\t\t\t\tcontentObserver.relativeToViewport({\r\n\t\t\t\t\tbottom: this.getThreshold,\r\n\t\t\t\t}).observe('.u-lazy-item-' + this.elIndex, (res) => {\r\n\t\t\t\t\tif (res.intersectionRatio > 0) {\r\n\t\t\t\t\t\t// 懒加载状态改变\r\n\t\t\t\t\t\tthis.isShow = true;\r\n\t\t\t\t\t\t// 如果图片已经加载，去掉监听，减少性能的消耗\r\n\t\t\t\t\t\tthis.disconnectObserver('contentObserver');\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\tthis.contentObserver = contentObserver;\r\n\t\t\t}, 30)\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-wrap {\r\n\t\tbackground-color: #eee;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t.u-lazy-item {\r\n\t\twidth: 100%;\r\n\t\t// 骗系统开启硬件加速\r\n\t\ttransform: transition3d(0, 0, 0);\r\n\t\t// 防止图片加载“闪一下”\r\n\t\twill-change: transform;\r\n\t\tdisplay: block;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-line/u-line.vue",
    "content": "<template>\r\n\t<view class=\"u-line\" :style=\"[lineStyle]\">\r\n\t\t\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * line 线条\r\n\t * @description 此组件一般用于显示一根线条，用于分隔内容块，有横向和竖向两种模式，且能设置0.5px线条，使用也很简单\r\n\t * @tutorial https://www.uviewui.com/components/line.html\r\n\t * @property {String} color 线条的颜色(默认#e4e7ed)\r\n\t * @property {String} length 长度，竖向时表现为高度，横向时表现为长度，可以为百分比，带rpx单位的值等\r\n\t * @property {String} direction 线条的方向，row-横向，col-竖向(默认row)\r\n\t * @property {String} border-style 线条的类型，solid-实线，dashed-方形虚线，dotted-圆点虚线(默认solid)\r\n\t * @property {Boolean} hair-line 是否显示细线条(默认true)\r\n\t * @property {String} margin 线条与上下左右元素的间距，字符串形式，如\"30rpx\"\r\n\t * @example <u-line color=\"red\"></u-line>\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-line',\r\n\t\tprops: {\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#e4e7ed'\r\n\t\t\t},\r\n\t\t\t// 长度，竖向时表现为高度，横向时表现为长度，可以为百分比，带rpx单位的值等\r\n\t\t\tlength: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '100%'\r\n\t\t\t},\r\n\t\t\t// 线条方向，col-竖向，row-横向\r\n\t\t\tdirection: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'row'\r\n\t\t\t},\r\n\t\t\t// 是否显示细边框\r\n\t\t\thairLine: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 线条与上下左右元素的间距，字符串形式，如\"30rpx\"、\"20rpx 30rpx\"\r\n\t\t\tmargin: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '0'\r\n\t\t\t},\r\n\t\t\t// 线条的类型，solid-实线，dashed-方形虚线，dotted-圆点虚线\r\n\t\t\tborderStyle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'solid'\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tlineStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.margin = this.margin;\r\n\t\t\t\t// 如果是水平线条，边框高度为1px，再通过transform缩小一半，就是0.5px了\r\n\t\t\t\tif(this.direction == 'row') {\r\n\t\t\t\t\t// 此处采用兼容分开写，兼容nvue的写法\r\n\t\t\t\t\tstyle.borderBottomWidth = '1px';\r\n\t\t\t\t\tstyle.borderBottomStyle = this.borderStyle;\r\n\t\t\t\t\tstyle.width = this.$u.addUnit(this.length);\r\n\t\t\t\t\tif(this.hairLine) style.transform = 'scaleY(0.5)';\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 如果是竖向线条，边框宽度为1px，再通过transform缩小一半，就是0.5px了\r\n\t\t\t\t\tstyle.borderLeftWidth = '1px';\r\n\t\t\t\t\tstyle.borderLeftStyle = this.borderStyle;\r\n\t\t\t\t\tstyle.height = this.$u.addUnit(this.length);\r\n\t\t\t\t\tif(this.hairLine) style.transform = 'scaleX(0.5)';\r\n\t\t\t\t}\r\n\t\t\t\tstyle.borderColor = this.color;\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-line {\r\n\t\tvertical-align: middle;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-line-progress/u-line-progress.vue",
    "content": "<template>\r\n\t<view class=\"u-progress\" :style=\"{\r\n\t\tborderRadius: round ? '100rpx' : 0,\r\n\t\theight: height + 'rpx',\r\n\t\tbackgroundColor: inactiveColor\r\n\t}\">\r\n\t\t<view :class=\"[\r\n\t\t\ttype ? `u-type-${type}-bg` : '',\r\n\t\t\tstriped ? 'u-striped' : '',\r\n\t\t\tstriped && stripedActive ? 'u-striped-active' : ''\r\n\t\t]\" class=\"u-active\" :style=\"[progressStyle]\">\r\n\t\t\t<slot v-if=\"$slots.default\" />\r\n\t\t\t<block v-else-if=\"showPercent\">\r\n\t\t\t\t{{percent + '%'}}\r\n\t\t\t</block>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * lineProgress 线型进度条\r\n\t * @description 展示操作或任务的当前进度，比如上传文件，是一个线形的进度条。\r\n\t * @tutorial https://www.uviewui.com/components/lineProgress.html\r\n\t * @property {String Number} percent 进度条百分比值，为数值类型，0-100\r\n\t * @property {Boolean} round 进度条两端是否为半圆（默认true）\r\n\t * @property {String} type 如设置，active-color值将会失效\r\n\t * @property {String} active-color 进度条激活部分的颜色（默认#19be6b）\r\n\t * @property {String} inactive-color 进度条的底色（默认#ececec）\r\n\t * @property {Boolean} show-percent 是否在进度条内部显示当前的百分比值数值（默认true）\r\n\t * @property {String Number} height 进度条的高度，单位rpx（默认28）\r\n\t * @property {Boolean} striped 是否显示进度条激活部分的条纹（默认false）\r\n\t * @property {Boolean} striped-active 条纹是否具有动态效果（默认false）\r\n\t * @example <u-line-progress :percent=\"70\" :show-percent=\"true\"></u-line-progress>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-line-progress\",\r\n\t\tprops: {\r\n\t\t\t// 两端是否显示半圆形\r\n\t\t\tround: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 主题颜色\r\n\t\t\ttype: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 激活部分的颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#19be6b'\r\n\t\t\t},\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ececec'\r\n\t\t\t},\r\n\t\t\t// 进度百分比，数值\r\n\t\t\tpercent: {\r\n\t\t\t\ttype: Number,\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 是否在进度条内部显示百分比的值\r\n\t\t\tshowPercent: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 进度条的高度，单位rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 28\r\n\t\t\t},\r\n\t\t\t// 是否显示条纹\r\n\t\t\tstriped: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 条纹是否显示活动状态\r\n\t\t\tstripedActive: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tprogressStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.width = this.percent + '%';\r\n\t\t\t\tif(this.activeColor) style.backgroundColor = this.activeColor;\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-progress {\r\n\t\toverflow: hidden;\r\n\t\theight: 15px;\r\n\t\tdisplay: inline-flex;\r\n\t\talign-items: center;\r\n\t\twidth: 100%;\r\n\t\tborder-radius: 100rpx;\r\n\t}\r\n\r\n\t.u-active {\r\n\t\twidth: 0;\r\n\t\theight: 100%;\r\n\t\talign-items: center;\r\n\t\tdisplay: flex;\r\n\t\tjustify-items: flex-end;\r\n\t\tjustify-content: space-around;\r\n\t\tfont-size: 20rpx;\r\n\t\tcolor: #ffffff;\r\n\t\ttransition: all 0.4s ease;\r\n\t}\r\n\r\n\t.u-striped {\r\n\t\tbackground-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\r\n\t\tbackground-size: 39px 39px;\r\n\t}\r\n\r\n\t.u-striped-active {\r\n\t\tanimation: progress-stripes 2s linear infinite;\r\n\t}\r\n\r\n\t@keyframes progress-stripes {\r\n\t\t0% {\r\n\t\t\tbackground-position: 0 0;\r\n\t\t}\r\n\r\n\t\t100% {\r\n\t\t\tbackground-position: 39px 0;\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-link/u-link.vue",
    "content": "<template>\r\n\t<text class=\"u-link\" @tap.stop=\"openLink\" :style=\"{\r\n\t\tcolor: color,\r\n\t\tfontSize: fontSize + 'rpx',\r\n\t\tborderBottom: underLine ? `1px solid ${lineColor ? lineColor : color}` : 'none',\r\n\t\tpaddingBottom: underLine ? '0rpx' : '0'\r\n\t}\">\r\n\t\t<slot></slot>\r\n\t</text>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * link 超链接\r\n\t * @description 该组件为超链接组件，在不同平台有不同表现形式：在APP平台会通过plus环境打开内置浏览器，在小程序中把链接复制到粘贴板，同时提示信息，在H5中通过window.open打开链接。\r\n\t * @tutorial https://www.uviewui.com/components/link.html\r\n\t * @property {String} color 文字颜色（默认#606266）\r\n\t * @property {String Number} font-size 字体大小，单位rpx（默认28）\r\n\t * @property {Boolean} under-line 是否显示下划线（默认false）\r\n\t * @property {String} href 跳转的链接，要带上http(s)\r\n\t * @property {String} line-color 下划线颜色，默认同color参数颜色 \r\n\t * @property {String} mp-tips 各个小程序平台把链接复制到粘贴板后的提示语（默认“链接已复制，请在浏览器打开”）\r\n\t * @example <u-link href=\"http://www.uviewui.com\">蜀道难，难于上青天</u-link>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-link\",\r\n\t\tprops: {\r\n\t\t\t// 文字颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 字体大小，单位rpx\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 28\r\n\t\t\t},\r\n\t\t\t// 是否显示下划线\r\n\t\t\tunderLine: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 要跳转的链接\r\n\t\t\thref: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 小程序中复制到粘贴板的提示语\r\n\t\t\tmpTips: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '链接已复制，请在浏览器打开'\r\n\t\t\t},\r\n\t\t\t// 下划线颜色\r\n\t\t\tlineColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\topenLink() {\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\tplus.runtime.openURL(this.href)\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef H5\r\n\t\t\t\twindow.open(this.href)\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef MP\r\n\t\t\t\tuni.setClipboardData({\r\n\t\t\t\t\tdata: this.href,\r\n\t\t\t\t\tsuccess() {\r\n\t\t\t\t\t\tuni.hideToast();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.$u.toast(this.mpTips);\r\n\t\t\t\t})\r\n\t\t\t\t// #endif\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-link {\r\n\t\tline-height: 1;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-loading/u-loading.vue",
    "content": "<template>\r\n\t<view v-if=\"show\" class=\"u-loading\" :class=\"mode == 'circle' ? 'u-loading-circle' : 'u-loading-flower'\" :style=\"[cricleStyle]\">\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * loading 加载动画\r\n\t * @description 警此组件为一个小动画，目前用在uView的loadmore加载更多和switch开关等组件的正在加载状态场景。\r\n\t * @tutorial https://www.uviewui.com/components/loading.html\r\n\t * @property {String} mode 模式选择，见官网说明（默认circle）\r\n\t * @property {String} color 动画活动区域的颜色，只对 mode = flower 模式有效（默认#c7c7c7）\r\n\t * @property {String Number} size 加载图标的大小，单位rpx（默认34）\r\n\t * @property {Boolean} show 是否显示动画（默认true）\r\n\t * @example <u-loading mode=\"circle\"></u-loading>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-loading\",\r\n\t\tprops: {\r\n\t\t\t// 动画的类型\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'circle'\r\n\t\t\t},\r\n\t\t\t// 动画的颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#c7c7c7'\r\n\t\t\t},\r\n\t\t\t// 加载图标的大小，单位rpx\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: '34'\r\n\t\t\t},\r\n\t\t\t// 是否显示动画\r\n\t\t\tshow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 加载中圆圈动画的样式\r\n\t\t\tcricleStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.width = this.size + 'rpx';\r\n\t\t\t\tstyle.height = this.size + 'rpx';\r\n\t\t\t\tif (this.mode == 'circle') style.borderColor = `#e4e4e4 #e4e4e4 #e4e4e4 ${this.color ? this.color : '#c7c7c7'}`;\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-loading-circle {\r\n\t\tdisplay: inline-block;\r\n\t\tvertical-align: middle;\r\n\t\twidth: 28rpx;\r\n\t\theight: 28rpx;\r\n\t\tbackground: 0 0;\r\n\t\tborder-radius: 50%;\r\n\t\tborder: 2px solid;\r\n\t\tborder-color: #e5e5e5 #e5e5e5 #e5e5e5 #8f8d8e;\r\n\t\tanimation: u-circle 1s linear infinite;\r\n\t}\r\n\r\n\t.u-loading-flower {\r\n\t\twidth: 20px;\r\n\t\theight: 20px;\r\n\t\tdisplay: inline-block;\r\n\t\tvertical-align: middle;\r\n\t\t-webkit-animation: a 1s steps(12) infinite;\r\n\t\tanimation: u-flower 1s steps(12) infinite;\r\n\t\tbackground: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;\r\n\t\tbackground-size: 100%;\r\n\t}\r\n\r\n\t@keyframes u-flower {\r\n\t\t0% {\r\n\t\t\t-webkit-transform: rotate(0deg);\r\n\t\t\ttransform: rotate(0deg);\r\n\t\t}\r\n\r\n\t\tto {\r\n\t\t\t-webkit-transform: rotate(1turn);\r\n\t\t\ttransform: rotate(1turn);\r\n\t\t}\r\n\t}\r\n\r\n\t@-webkit-keyframes u-circle {\r\n\t\t0% {\r\n\t\t\ttransform: rotate(0);\r\n\t\t}\r\n\r\n\t\t100% {\r\n\t\t\ttransform: rotate(360deg);\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-loading-page/u-loading-page.vue",
    "content": "<template>\r\n\t<view class=\"u-loading-page\">\r\n\t\t\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tprops: {\r\n\t\t\t\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-loadmore/u-loadmore.vue",
    "content": "<template>\r\n\t<view class=\"u-load-more-wrap\" :style=\"{\r\n\t\tbackgroundColor: bgColor,\r\n\t\tmarginBottom: marginBottom + 'rpx',\r\n\t\tmarginTop: marginTop + 'rpx',\r\n\t\theight: $u.addUnit(height)\r\n\t}\">\r\n\t\t<!-- 加载中和没有更多的状态才显示两边的横线 -->\r\n\t\t<view :class=\"status == 'loadmore' || status == 'nomore' ? 'u-more' : ''\" class=\"u-load-more-inner\">\r\n\t\t\t<u-loading class=\"u-loadmore-icon\" :color=\"iconColor\" :mode=\"iconType == 'circle' ? 'circle' : 'flower'\" :show=\"status == 'loading' && icon\"></u-loading>\r\n\t\t\t<!-- 如果没有更多的状态下，显示内容为dot（粗点），加载特定样式 -->\r\n\t\t\t<view :style=\"[loadTextStyle]\" :class=\"[(status == 'nomore' && isDot == true) ? 'u-dot-text' : 'u-more-text']\" @tap=\"loadMore\">\r\n\t\t\t\t{{ showText }}\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * loadmore 加载更多\r\n\t * @description 此组件一般用于标识页面底部加载数据时的状态。\r\n\t * @tutorial https://www.uviewui.com/components/loadMore.html\r\n\t * @property {String} status 组件状态（默认loadmore）\r\n\t * @property {String} bg-color 组件背景颜色，在页面是非白色时会用到（默认#ffffff）\r\n\t * @property {Boolean} icon 加载中时是否显示图标（默认true）\r\n\t * @property {String} icon-type 加载中时的图标类型（默认circle）\r\n\t * @property {String} icon-color icon-type为circle时有效，加载中的动画图标的颜色（默认#b7b7b7）\r\n\t * @property {Boolean} is-dot status为nomore时，内容显示为一个\"●\"（默认false）\r\n\t * @property {String} color 字体颜色（默认#606266）\r\n\t * @property {String Number} margin-top 到上一个相邻元素的距离\r\n\t * @property {String Number} margin-bottom 到下一个相邻元素的距离\r\n\t * @property {Object} load-text 自定义显示的文字，见上方说明示例\r\n\t * @event {Function} loadmore status为loadmore时，点击组件会发出此事件\r\n\t * @example <u-loadmore :status=\"status\" icon-type=\"iconType\" load-text=\"loadText\" />\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-loadmore\",\r\n\t\tprops: {\r\n\t\t\t//当前页面背景颜色，如果背景为非白色的时候，需要把此值设置为背景的颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 是否显示加载中的图标\r\n\t\t\ticon: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 字体大小\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '28'\r\n\t\t\t},\r\n\t\t\t// 字体颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String, \r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 组件状态，loadmore-加载前的状态，loading-加载中的状态，nomore-没有更多的状态\r\n\t\t\tstatus: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'loadmore'\r\n\t\t\t},\r\n\t\t\t// 加载中状态的图标，flower-花朵状图标，circle-圆圈状图标\r\n\t\t\ticonType: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'circle'\r\n\t\t\t},\r\n\t\t\t// 显示的文字\r\n\t\t\tloadText: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tloadmore: '加载更多',\r\n\t\t\t\t\t\tloading: '正在加载...',\r\n\t\t\t\t\t\tnomore: '没有更多了'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 在“没有更多”状态下，是否显示粗点\r\n\t\t\tisDot: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 加载中显示圆圈动画时，动画的颜色\r\n\t\t\ticonColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#b7b7b7'\r\n\t\t\t},\r\n\t\t\t// 上边距\r\n\t\t\tmarginTop: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 下边距\r\n\t\t\tmarginBottom: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 高度，单位rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 'auto'\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t// 粗点\r\n\t\t\t\tdotText: \"●\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 加载的文字显示的样式\r\n\t\t\tloadTextStyle() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcolor: this.color,\r\n\t\t\t\t\tfontSize: this.fontSize + 'rpx',\r\n\t\t\t\t\tposition: 'relative',\r\n\t\t\t\t\tzIndex: 1,\r\n\t\t\t\t\tbackgroundColor: this.bgColor,\r\n\t\t\t\t\t// 如果是加载中状态，动画和文字需要距离近一点\r\n\t\t\t\t\tpadding: this.status == 'loading' ? '0 8px' : '0 12px',\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 加载中圆圈动画的样式\r\n\t\t\tcricleStyle() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tborderColor: `#e5e5e5 #e5e5e5 #e5e5e5 ${this.circleColor}`\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 加载中花朵动画形式\r\n\t\t\t// 动画由base64图片生成，暂不支持修改\r\n\t\t\tflowerStyle() {\r\n\t\t\t\treturn {\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 显示的提示文字\r\n\t\t\tshowText() {\r\n\t\t\t\tlet text = '';\r\n\t\t\t\tif(this.status == 'loadmore') text = this.loadText.loadmore;\r\n\t\t\t\telse if(this.status == 'loading') text = this.loadText.loading;\r\n\t\t\t\telse if(this.status == 'nomore' && this.isDot) text = this.dotText;\r\n\t\t\t\telse text = this.loadText.nomore;\r\n\t\t\t\treturn text;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tloadMore() {\r\n\t\t\t\t// 只有在“加载更多”的状态下才发送点击事件，内容不满一屏时无法触发底部上拉事件，所以需要点击来触发\r\n\t\t\t\tif(this.status == 'loadmore') this.$emit('loadmore');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-load-more-wrap {\r\n\t\twidth: 100%;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t}\r\n\t\r\n\t.u-load-more-inner {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t}\r\n\t\r\n\t.u-more {\r\n\t\twidth: 60%;\r\n\t\tposition: relative;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t}\r\n\t\r\n\t.u-more::before {\r\n\t\tcontent: ' ';\r\n\t\tposition: absolute;\r\n\t\tborder-bottom: 1px solid #d4d4d4;\r\n\t\t-webkit-transform: scaleY(0.5);\r\n\t\ttransform: scaleY(0.5);\r\n\t\twidth: 100%;\r\n\t\ttop: 50%;\r\n\t\tleft: 0;\r\n\t}\r\n\t\r\n\t.u-dot-text {\r\n\t\tfont-size: 28rpx;\r\n\t}\r\n\t\r\n\t.u-loadmore-icon {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-mask/u-mask.vue",
    "content": "<template>\r\n\t<view class=\"u-mask\" hover-stop-propagation :style=\"[maskStyle, zoomStyle]\" @tap=\"click\" @touchmove.stop.prevent :class=\"{\r\n\t\t'u-mask-zoom': zoom,\r\n\t\t'u-mask-show': show\r\n\t}\">\r\n\t\t<slot />\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * mask 遮罩\r\n\t * @description 创建一个遮罩层，用于强调特定的页面元素，并阻止用户对遮罩下层的内容进行操作，一般用于弹窗场景\r\n\t * @tutorial https://www.uviewui.com/components/mask.html\r\n\t * @property {Boolean} show 是否显示遮罩（默认false）\r\n\t * @property {String Number} z-index z-index 层级（默认1070）\r\n\t * @property {Object} custom-style 自定义样式对象，见上方说明\r\n\t * @property {String Number} duration 动画时长，单位毫秒（默认300）\r\n\t * @property {Boolean} zoom 是否使用scale对这招进行缩放（默认true）\r\n\t * @property {Boolean} mask-click-able 遮罩是否可点击，为false时点击不会发送click事件（默认true）\r\n\t * @event {Function} click mask-click-able为true时，点击遮罩发送此事件\r\n\t * @example <u-mask :show=\"show\" @click=\"show = false\"></u-mask>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-mask\",\r\n\t\tprops: {\r\n\t\t\t// 是否显示遮罩\r\n\t\t\tshow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 层级z-index\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 用户自定义样式\r\n\t\t\tcustomStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 遮罩的动画样式， 是否使用使用zoom进行scale进行缩放\r\n\t\t\tzoom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 遮罩的过渡时间，单位为ms\r\n\t\t\tduration: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 300\r\n\t\t\t},\r\n\t\t\t// 是否可以通过点击遮罩进行关闭\r\n\t\t\tmaskClickAble: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tzoomStyle: {\r\n\t\t\t\t\ttransform: ''\r\n\t\t\t\t},\r\n\t\t\t\tscale: 'scale(1.2, 1.2)'\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tshow(n) {\r\n\t\t\t\tif(n && this.zoom) {\r\n\t\t\t\t\t// 当展示遮罩的时候，设置scale为1，达到缩小(原来为1.2)的效果\r\n\t\t\t\t\tthis.zoomStyle.transform = 'scale(1, 1)';\r\n\t\t\t\t} else if(!n && this.zoom) {\r\n\t\t\t\t\t// 当隐藏遮罩的时候，设置scale为1.2，达到放大(因为显示遮罩时已重置为1)的效果\r\n\t\t\t\t\tthis.zoomStyle.transform = this.scale;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tmaskStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.backgroundColor = \"rgba(0, 0, 0, 0.6)\";\r\n\t\t\t\tif(this.show) style.zIndex = this.zIndex ? this.zIndex : this.$u.zIndex.mask;\r\n\t\t\t\telse style.zIndex = -1;\r\n\t\t\t\tstyle.transition = `all ${this.duration / 1000}s ease-in-out`;\r\n\t\t\t\t// 判断用户传递的对象是否为空，不为空就进行合并\r\n\t\t\t\tif (Object.keys(this.customStyle).length) style = { ...style,\r\n\t\t\t\t\t...this.customStyle\r\n\t\t\t\t};\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tclick() {\r\n\t\t\t\tif (!this.maskClickAble) return;\r\n\t\t\t\tthis.$emit('click');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-mask {\r\n\t\tposition: fixed;\r\n\t\ttop: 0;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\tbottom: 0;\r\n\t\topacity: 0;\r\n\t\ttransition: transform 0.3s;\r\n\t}\r\n\r\n\t.u-mask-show {\r\n\t\topacity: 1;\r\n\t}\r\n\t\r\n\t.u-mask-zoom {\r\n\t\ttransform: scale(1.2, 1.2);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-message-input/u-message-input.vue",
    "content": "<template>\r\n\t<view class=\"u-char-box\">\r\n\t\t<view class=\"u-char-flex\">\r\n\t\t\t<input :disabled=\"disabledKeyboard\" :value=\"valueModel\" type=\"number\" :focus=\"focus\" :maxlength=\"maxlength\" class=\"u-input\" @input=\"getVal\"/>\r\n\t\t\t<view v-for=\"(item, index) in maxlength\" :key=\"index\">\r\n\t\t\t\t<view :class=\"[breathe && charArrLength == index ? 'u-breathe' : '', 'u-char-item',\r\n\t\t\t\tcharArrLength === index && mode == 'box' ? 'u-box-active' : '',\r\n\t\t\t\tmode === 'box' ? 'u-box' : '']\" :style=\"{\r\n\t\t\t\t\tfontWeight: bold ? 'bold' : 'normal',\r\n\t\t\t\t\tfontSize: fontSize + 'rpx',\r\n\t\t\t\t\twidth: width + 'rpx',\r\n\t\t\t\t\theight: width + 'rpx',\r\n\t\t\t\t\tcolor: inactiveColor\r\n\t\t\t\t}\">\r\n\t\t\t\t\t<view class=\"u-placeholder-line\" :style=\"{\r\n\t\t\t\t\t\t\tdisplay: charArrLength === index ? 'block' : 'none',\r\n\t\t\t\t\t\t\theight: width * 0.5 +'rpx'\r\n\t\t\t\t\t\t}\"\r\n\t\t\t\t\t\tv-if=\"mode !== 'middleLine'\"\r\n\t\t\t\t\t></view>\r\n\t\t\t\t\t<view v-if=\"mode === 'middleLine' && charArrLength <= index\" :class=\"[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-middle-line-active' : '']\"\r\n\t\t\t\t\t class=\"u-middle-line\" :style=\"{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}\"></view>\r\n\t\t\t\t\t<view v-if=\"mode === 'bottomLine'\" :class=\"[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-buttom-line-active' : '']\"\r\n\t\t\t\t\t class=\"u-bottom-line\" :style=\"{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}\"></view>\r\n\t\t\t\t\t<block v-if=\"!dotFill\"> {{ charArr[index] ? charArr[index] : ''}}</block>\r\n\t\t\t\t\t<block v-else>\r\n\t\t\t\t\t\t<text class=\"u-dot\">{{ charArr[index] ? '●' : ''}}</text>\r\n\t\t\t\t\t</block>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * messageInput 验证码输入框\r\n\t * @description 该组件一般用于验证用户短信验证码的场景，也可以结合uView的键盘组件使用\r\n\t * @tutorial https://www.uviewui.com/components/messageInput.html\r\n\t * @property {String Number} maxlength 输入字符个数（默认4）\r\n\t * @property {Boolean} dot-fill 是否用圆点填充（默认false）\r\n\t * @property {String} mode 模式选择，见上方\"基本使用\"说明（默认box）\r\n\t * @property {String Number} value 预置值\r\n\t * @property {Boolean} breathe 是否开启呼吸效果，见上方说明（默认true）\r\n\t * @property {Boolean} focus 是否自动获取焦点（默认false）\r\n\t * @property {Boolean} bold 字体和输入横线是否加粗（默认true）\r\n\t * @property {String Number} font-size 字体大小，单位rpx（默认60）\r\n\t * @property {String} active-color 当前激活输入框的样式（默认#2979ff）\r\n\t * @property {String} inactive-color 非激活输入框的样式，文字颜色同此值（默认#606266）\r\n\t * @property {String | Number} width 输入框宽度，单位rpx，高等于宽（默认80）\r\n\t * @property {Boolean} disabled-keyboard 禁止点击输入框唤起系统键盘（默认false）\r\n\t * @event {Function} change 输入内容发生改变时触发，具体见官网说明\r\n\t * @event {Function} finish 输入字符个数达maxlength值时触发，见官网说明\r\n\t * @example <u-message-input mode=\"bottomLine\"></u-message-input>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-message-input\",\r\n\t\tprops: {\r\n\t\t\t// 最大输入长度\r\n\t\t\tmaxlength: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 4\r\n\t\t\t},\r\n\t\t\t// 是否用圆点填充\r\n\t\t\tdotFill: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 显示模式，box-盒子模式，bottomLine-横线在底部模式，middleLine-横线在中部模式\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: \"box\"\r\n\t\t\t},\r\n\t\t\t// 预置值\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 当前激活输入item，是否带有呼吸效果\r\n\t\t\tbreathe: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否自动获取焦点\r\n\t\t\tfocus: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 字体是否加粗\r\n\t\t\tbold: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 字体大小\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 60\r\n\t\t\t},\r\n\t\t\t// 激活样式\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 未激活的样式\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 输入框的大小，单位rpx，宽等于高\r\n\t\t\twidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: '80'\r\n\t\t\t},\r\n\t\t\t// 是否隐藏原生键盘，如果想用自定义键盘的话，需设置此参数为true\r\n\t\t\tdisabledKeyboard: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tmaxlength: {\r\n\t\t\t\t// 此值设置为true，会在组件加载后无需maxlength变化就会执行一次本监听函数，无需再created生命周期中处理\r\n\t\t\t\timmediate: true,\r\n\t\t\t\thandler(val) {\r\n\t\t\t\t\tthis.maxlength = Number(val);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tvalue: {\r\n\t\t\t\timmediate: true,\r\n\t\t\t\thandler(val) {\r\n\t\t\t\t\t// 转为字符串\r\n\t\t\t\t\tval = String(val);\r\n\t\t\t\t\t// 超出部分截掉\r\n\t\t\t\t\tthis.valueModel = val.substring(0, this.maxlength);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tvalueModel: \"\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 是否显示呼吸灯效果\r\n\t\t\tanimationClass() {\r\n\t\t\t\treturn (index) => {\r\n\t\t\t\t\tif (this.breathe && this.charArr.length == index) return 'u-breathe';\r\n\t\t\t\t\telse return '';\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 用于显示字符\r\n\t\t\tcharArr() {\r\n\t\t\t\treturn this.valueModel.split('');\r\n\t\t\t},\r\n\t\t\tcharArrLength() {\r\n\t\t\t\treturn this.charArr.length;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tgetVal(e) {\r\n\t\t\t\tlet {\r\n\t\t\t\t\tvalue\r\n\t\t\t\t} = e.detail\r\n\t\t\t\tthis.valueModel = value;\r\n\t\t\t\t// 判断长度是否超出了maxlength值，理论上不会发生，因为input组件设置了maxlength属性值\r\n\t\t\t\tif (String(value).length > this.maxlength) return;\r\n\t\t\t\t// 未达到maxlength之前，发送change事件，达到后发送finish事件\r\n\t\t\t\tthis.$emit('change', value);\r\n\t\t\t\tif (String(value).length == this.maxlength) {\r\n\t\t\t\t\tthis.$emit('finish', value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t@keyframes breathe {\r\n\t\t0% {\r\n\t\t\topacity: 0.3;\r\n\t\t}\r\n\r\n\t\t50% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\r\n\t\t100% {\r\n\t\t\topacity: 0.3;\r\n\t\t}\r\n\t}\r\n\r\n\t.u-char-box {\r\n\t\ttext-align: center;\r\n\t}\r\n\r\n\t.u-char-flex {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\tflex-wrap: wrap;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-input {\r\n\t\tposition: absolute;\r\n\t\ttop: 0;\r\n\t\tleft: -100%;\r\n\t\twidth: 200%;\r\n\t\theight: 100%;\r\n\t\ttext-align: left;\r\n\t\tz-index: 9;\r\n\t\topacity: 0;\r\n\t\tbackground: none;\r\n\t}\r\n\r\n\t.u-char-item {\r\n\t\tposition: relative;\r\n\t\twidth: 90rpx;\r\n\t\theight: 90rpx;\r\n\t\tmargin: 10rpx 10rpx;\r\n\t\tfont-size: 60rpx;\r\n\t\tfont-weight: bold;\r\n\t\tcolor: $u-main-color;\r\n\t\tline-height: 90rpx;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.u-middle-line {\r\n\t\tborder: none;\r\n\t}\r\n\r\n\t.u-box {\r\n\t\tbox-sizing: border-box;\r\n\t\tborder: 2rpx solid #cccccc;\r\n\t\tborder-radius: 6rpx;\r\n\t}\r\n\r\n\t.u-box-active {\r\n\t\toverflow: hidden;\r\n\t\tanimation-timing-function: ease-in-out;\r\n\t\tanimation-duration: 1500ms;\r\n\t\tanimation-iteration-count: infinite;\r\n\t\tanimation-direction: alternate;\r\n\t\tborder: 2rpx solid $u-type-primary;\r\n\t}\r\n\r\n\t.u-middle-line-active {\r\n\t\tbackground: $u-type-primary;\r\n\t}\r\n\r\n\t.u-breathe {\r\n\t\tanimation: breathe 2s infinite ease;\r\n\t}\r\n\r\n\t.u-placeholder-line {\r\n\t\tdisplay: none;\r\n\t\tposition: absolute;\r\n\t\tleft: 50%;\r\n\t\ttop: 50%;\r\n\t\ttransform: translate(-50%, -50%);\r\n\t\twidth: 2rpx;\r\n\t\theight: 40rpx;\r\n\t\tbackground: #333333;\r\n\t\tanimation: twinkling 1.5s infinite ease;\r\n\t}\r\n\r\n\t.u-animation-breathe {\r\n\t\tanimation-name: breathe;\r\n\t}\r\n\r\n\t.u-dot {\r\n\t\tfont-size: 34rpx;\r\n\t\tline-height: 34rpx;\r\n\t}\r\n\r\n\t.u-middle-line {\r\n\t\theight: 4px;\r\n\t\tbackground: #000000;\r\n\t\twidth: 80%;\r\n\t\tposition: absolute;\r\n\t\tborder-radius: 2px;\r\n\t\ttop: 50%;\r\n\t\tleft: 50%;\r\n\t\ttransform: translate(-50%, -50%);\r\n\t}\r\n\r\n\t.u-buttom-line-active {\r\n\t\tbackground: $u-type-primary;\r\n\t}\r\n\r\n\t.u-bottom-line {\r\n\t\theight: 4px;\r\n\t\tbackground: #000000;\r\n\t\twidth: 80%;\r\n\t\tposition: absolute;\r\n\t\tborder-radius: 2px;\r\n\t\tbottom: 0;\r\n\t\tleft: 50%;\r\n\t\ttransform: translate(-50%);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-modal/u-modal.vue",
    "content": "<template>\r\n\t<view>\r\n\t\t<u-popup :zoom=\"zoom\" mode=\"center\" :popup=\"false\" :z-index=\"uZIndex\" v-model=\"value\" :length=\"width\"\r\n\t\t :mask-close-able=\"maskCloseAble\" :border-radius=\"borderRadius\" @close=\"popupClose\" :negative-top=\"negativeTop\">\r\n\t\t\t<view class=\"u-model\">\r\n\t\t\t\t<view v-if=\"showTitle\" class=\"u-model__title u-line-1\" :style=\"[titleStyle]\">{{ title }}</view>\r\n\t\t\t\t<view class=\"u-model__content\">\r\n\t\t\t\t\t<view :style=\"[contentStyle]\" v-if=\"$slots.default\">\r\n\t\t\t\t\t\t<slot />\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view v-else class=\"u-model__content__message\" :style=\"[contentStyle]\">{{ content }}</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-model__footer u-border-top\" v-if=\"showCancelButton || showConfirmButton\">\r\n\t\t\t\t\t<view v-if=\"showCancelButton\" :hover-stay-time=\"100\" hover-class=\"u-model__btn--hover\" class=\"u-model__footer__button\"\r\n\t\t\t\t\t :style=\"[cancelBtnStyle]\" @tap=\"cancel\">\r\n\t\t\t\t\t\t{{cancelText}}\r\n\t\t\t\t\t</view>\n\t\t\t\t\t<view v-if=\"showConfirmButton || $slots['confirm-button']\" :hover-stay-time=\"100\" :hover-class=\"asyncClose ? 'none' : 'u-model__btn--hover'\"\r\n\t\t\t\t\t class=\"u-model__footer__button hairline-left\" :style=\"[confirmBtnStyle]\" @tap=\"confirm\">\n\t\t\t\t\t\t<slot v-if=\"$slots['confirm-button']\" name=\"confirm-button\"></slot>\r\n\t\t\t\t\t\t<block v-else>\n\t\t\t\t\t\t\t<u-loading mode=\"circle\" :color=\"confirmColor\" v-if=\"loading\"></u-loading>\n\t\t\t\t\t\t\t<block v-else>\n\t\t\t\t\t\t\t\t{{confirmText}}\n\t\t\t\t\t\t\t</block>\n\t\t\t\t\t\t</block>\r\n\t\t\t\t\t</view>\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</u-popup>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * modal 模态框\r\n\t * @description 弹出模态框，常用于消息提示、消息确认、在当前页面内完成特定的交互操作\r\n\t * @tutorial https://www.uviewui.com/components/modal.html\r\n\t * @property {Boolean} value 是否显示模态框\r\n\t * @property {String | Number} z-index 层级\r\n\t * @property {String} title 模态框标题（默认\"提示\"）\r\n\t * @property {String | Number} width 模态框宽度（默认600）\r\n\t * @property {String} content 模态框内容（默认\"内容\"）\r\n\t * @property {Boolean} show-title 是否显示标题（默认true）\r\n\t * @property {Boolean} async-close 是否异步关闭，只对确定按钮有效（默认false）\r\n\t * @property {Boolean} show-confirm-button 是否显示确认按钮（默认true）\r\n\t * @property {Stringr | Number} negative-top modal往上偏移的值\r\n\t * @property {Boolean} show-cancel-button 是否显示取消按钮（默认false）\r\n\t * @property {Boolean} mask-close-able 是否允许点击遮罩关闭modal（默认false）\r\n\t * @property {String} confirm-text 确认按钮的文字内容（默认\"确认\"）\r\n\t * @property {String} cancel-text 取消按钮的文字内容（默认\"取消\"）\r\n\t * @property {String} cancel-color 取消按钮的颜色（默认\"#606266\"）\r\n\t * @property {String} confirm-color 确认按钮的文字内容（默认\"#2979ff\"）\r\n\t * @property {String | Number} border-radius 模态框圆角值，单位rpx（默认16）\r\n\t * @property {Object} title-style 自定义标题样式，对象形式\r\n\t * @property {Object} content-style 自定义内容样式，对象形式\r\n\t * @property {Object} cancel-style 自定义取消按钮样式，对象形式\r\n\t * @property {Object} confirm-style 自定义确认按钮样式，对象形式\r\n\t * @property {Boolean} zoom 是否开启缩放模式（默认true）\r\n\t * @event {Function} confirm 确认按钮被点击\r\n\t * @event {Function} cancel 取消按钮被点击\r\n\t * @example <u-modal :src=\"title\" :content=\"content\"></u-modal>\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-modal',\r\n\t\tprops: {\r\n\t\t\t// 是否显示Modal\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 层级z-index\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 标题\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: [String],\r\n\t\t\t\tdefault: '提示'\r\n\t\t\t},\r\n\t\t\t// 弹窗宽度，可以是数值(rpx)，百分比，auto等\r\n\t\t\twidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 600\r\n\t\t\t},\r\n\t\t\t// 弹窗内容\r\n\t\t\tcontent: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '内容'\r\n\t\t\t},\r\n\t\t\t// 是否显示标题\r\n\t\t\tshowTitle: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否显示确认按钮\r\n\t\t\tshowConfirmButton: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否显示取消按钮\r\n\t\t\tshowCancelButton: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 确认文案\r\n\t\t\tconfirmText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '确认'\r\n\t\t\t},\r\n\t\t\t// 取消文案\r\n\t\t\tcancelText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '取消'\r\n\t\t\t},\r\n\t\t\t// 确认按钮颜色\r\n\t\t\tconfirmColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 取消文字颜色\r\n\t\t\tcancelColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 圆角值\r\n\t\t\tborderRadius: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 16\r\n\t\t\t},\r\n\t\t\t// 标题的样式\r\n\t\t\ttitleStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 内容的样式\r\n\t\t\tcontentStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 取消按钮的样式\r\n\t\t\tcancelStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 确定按钮的样式\r\n\t\t\tconfirmStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否开启缩放效果\r\n\t\t\tzoom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否异步关闭，只对确定按钮有效\r\n\t\t\tasyncClose: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否允许点击遮罩关闭modal\r\n\t\t\tmaskCloseAble: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 给一个负的margin-top，往上偏移，避免和键盘重合的情况\r\n\t\t\tnegativeTop: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tloading: false, // 确认按钮是否正在加载中\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tcancelBtnStyle() {\r\n\t\t\t\treturn Object.assign({\r\n\t\t\t\t\tcolor: this.cancelColor\r\n\t\t\t\t}, this.cancelStyle);\r\n\t\t\t},\r\n\t\t\tconfirmBtnStyle() {\r\n\t\t\t\treturn Object.assign({\r\n\t\t\t\t\tcolor: this.confirmColor\r\n\t\t\t\t}, this.confirmStyle);\r\n\t\t\t},\r\n\t\t\tuZIndex() {\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\t// 如果是异步关闭时，外部修改v-model的值为false时，重置内部的loading状态\r\n\t\t\t// 避免下次打开的时候，状态混乱\r\n\t\t\tvalue(n) {\r\n\t\t\t\tif (n === true) this.loading = false;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tconfirm() {\r\n\t\t\t\t// 异步关闭\r\n\t\t\t\tif (this.asyncClose) {\r\n\t\t\t\t\tthis.loading = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.$emit('input', false);\r\n\t\t\t\t}\r\n\t\t\t\tthis.$emit('confirm');\r\n\t\t\t},\r\n\t\t\tcancel() {\r\n\t\t\t\tthis.$emit('cancel');\r\n\t\t\t\tthis.$emit('input', false);\r\n\t\t\t\t// 目前popup弹窗关闭有一个延时操作，此处做一个延时\r\n\t\t\t\t// 避免确认按钮文字变成了\"确定\"字样，modal还没消失，造成视觉不好的效果\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.loading = false;\r\n\t\t\t\t}, 300);\r\n\t\t\t},\r\n\t\t\t// 点击遮罩关闭modal，设置v-model的值为false，否则无法第二次弹起modal\r\n\t\t\tpopupClose() {\r\n\t\t\t\tthis.$emit('input', false);\r\n\t\t\t},\r\n\t\t\t// 清除加载中的状态\r\n\t\t\tclearLoading() {\r\n\t\t\t\tthis.loading = false;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-model {\r\n\t\theight: auto;\r\n\t\toverflow: hidden;\r\n\t\tfont-size: 32rpx;\r\n\t\tbackground-color: #fff;\r\n\r\n\t\t&__btn--hover {\r\n\t\t\tbackground-color: rgb(230, 230, 230);\r\n\t\t}\r\n\r\n\t\t&__title {\r\n\t\t\tpadding-top: 48rpx;\r\n\t\t\tfont-weight: 500;\r\n\t\t\ttext-align: center;\r\n\t\t\tcolor: $u-main-color;\r\n\t\t}\r\n\r\n\t\t&__content {\r\n\t\t\t&__message {\r\n\t\t\t\tpadding: 48rpx;\r\n\t\t\t\tfont-size: 30rpx;\r\n\t\t\t\ttext-align: center;\r\n\t\t\t\tcolor: $u-content-color;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t&__footer {\r\n\t\t\tdisplay: flex;\r\n\r\n\t\t\t&__button {\r\n\t\t\t\tflex: 1;\r\n\t\t\t\theight: 100rpx;\r\n\t\t\t\tline-height: 100rpx;\r\n\t\t\t\tfont-size: 32rpx;\r\n\t\t\t\tbox-sizing: border-box;\r\n\t\t\t\tcursor: pointer;\r\n\t\t\t\ttext-align: center;\r\n\t\t\t\tborder-radius: 4rpx;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-navbar/u-navbar.vue",
    "content": "<template>\r\n\t<view class=\"\">\r\n\t\t<view class=\"u-navbar\" :style=\"[navbarStyle]\" :class=\"{ 'u-navbar-fixed': isFixed, 'u-border-bottom': borderBottom }\">\r\n\t\t\t<view class=\"u-status-bar\" :style=\"{ height: statusBarHeight + 'px' }\"></view>\r\n\t\t\t<view class=\"u-navbar-inner\" :style=\"[navbarInnerStyle]\">\r\n\t\t\t\t<view class=\"u-back-wrap\" v-if=\"isBack\" @tap=\"goBack\">\r\n\t\t\t\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t\t\t\t<u-icon :name=\"backIconName\" :color=\"backIconColor\" :size=\"backIconSize\"></u-icon>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"u-icon-wrap u-back-text u-line-1\" v-if=\"backText\" :style=\"[backTextStyle]\">{{ backText }}</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-navbar-content-title\" v-if=\"title\" :style=\"[titleStyle]\">\r\n\t\t\t\t\t<view\r\n\t\t\t\t\t    class=\"u-title u-line-1\"\r\n\t\t\t\t\t    :style=\"{\r\n\t\t\t\t\t\t\tcolor: titleColor,\r\n\t\t\t\t\t\t\tfontSize: titleSize + 'rpx'\r\n\t\t\t\t\t\t}\">\r\n\t\t\t\t\t\t{{ title }}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-slot-content\">\r\n\t\t\t\t\t<slot></slot>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-slot-right\">\r\n\t\t\t\t\t<slot name=\"right\"></slot>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<!-- 解决fixed定位后导航栏塌陷的问题 -->\r\n\t\t<view class=\"u-navbar-placeholder\" v-if=\"isFixed && !immersive\" :style=\"{ width: '100%', height: Number(navbarHeight) + statusBarHeight + 'px' }\"></view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t// 获取系统状态栏的高度\r\n\tlet systemInfo = uni.getSystemInfoSync();\r\n\tlet menuButtonInfo = {};\r\n\t// 如果是小程序，获取右上角胶囊的尺寸信息，避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API，尚未兼容)\r\n\t// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ\r\n\tmenuButtonInfo = uni.getMenuButtonBoundingClientRect();\r\n\t// #endif\r\n\t/**\r\n\t * navbar 自定义导航栏\r\n\t * @description 此组件一般用于在特殊情况下，需要自定义导航栏的时候用到，一般建议使用uniapp自带的导航栏。\r\n\t * @tutorial https://www.uviewui.com/components/navbar.html\r\n\t * @property {String Number} height 导航栏高度(不包括状态栏高度在内，内部自动加上)，注意这里的单位是px（默认44）\r\n\t * @property {String} back-icon-color 左边返回图标的颜色（默认#606266）\r\n\t * @property {String} back-icon-name 左边返回图标的名称，只能为uView自带的图标（默认arrow-left）\r\n\t * @property {String Number} back-icon-size 左边返回图标的大小，单位rpx（默认30）\r\n\t * @property {String} back-text 返回图标右边的辅助提示文字\r\n\t * @property {Object} back-text-style 返回图标右边的辅助提示文字的样式，对象形式（默认{ color: '#606266' }）\r\n\t * @property {String} title 导航栏标题，如设置为空字符，将会隐藏标题占位区域\r\n\t * @property {String Number} title-width 导航栏标题的最大宽度，内容超出会以省略号隐藏，单位rpx（默认250）\r\n\t * @property {String} title-color 标题的颜色（默认#606266）\r\n\t * @property {String Number} title-size 导航栏标题字体大小，单位rpx（默认32）\r\n\t * @property {Function} custom-back 自定义返回逻辑方法\r\n\t * @property {String Number} z-index 固定在顶部时的z-index值（默认980）\r\n\t * @property {Boolean} is-back 是否显示导航栏左边返回图标和辅助文字（默认true）\r\n\t * @property {Object} background 导航栏背景设置，见官网说明（默认{ background: '#ffffff' }）\r\n\t * @property {Boolean} is-fixed 导航栏是否固定在顶部（默认true）\r\n\t * @property {Boolean} immersive 沉浸式，允许fixed定位后导航栏塌陷，仅fixed定位下生效（默认false）\r\n\t * @property {Boolean} border-bottom 导航栏底部是否显示下边框，如定义了较深的背景颜色，可取消此值（默认true）\r\n\t * @example <u-navbar back-text=\"返回\" title=\"剑未配妥，出门已是江湖\"></u-navbar>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-navbar\",\r\n\t\tprops: {\r\n\t\t\t// 导航栏高度，单位px，非rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 返回箭头的颜色\r\n\t\t\tbackIconColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 左边返回的图标\r\n\t\t\tbackIconName: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'nav-back'\r\n\t\t\t},\r\n\t\t\t// 左边返回图标的大小，rpx\r\n\t\t\tbackIconSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: '44'\r\n\t\t\t},\r\n\t\t\t// 返回的文字提示\r\n\t\t\tbackText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 返回的文字的 样式\r\n\t\t\tbackTextStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tcolor: '#606266'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 导航栏标题\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 标题的宽度，如果需要自定义右侧内容，且右侧内容很多时，可能需要减少这个宽度，单位rpx\r\n\t\t\ttitleWidth: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: '250'\r\n\t\t\t},\r\n\t\t\t// 标题的颜色\r\n\t\t\ttitleColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 标题的字体大小\r\n\t\t\ttitleSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 32\r\n\t\t\t},\r\n\t\t\tisBack: {\r\n\t\t\t\ttype: [Boolean, String],\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 对象形式，因为用户可能定义一个纯色，或者线性渐变的颜色\r\n\t\t\tbackground: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tbackground: '#ffffff'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 导航栏是否固定在顶部\r\n\t\t\tisFixed: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否沉浸式，允许fixed定位后导航栏塌陷，仅fixed定位下生效\r\n\t\t\timmersive: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否显示导航栏的下边框\r\n\t\t\tborderBottom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 自定义返回逻辑\r\n\t\t\tcustomBack: {\r\n\t\t\t\ttype: Function,\r\n\t\t\t\tdefault: null\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tmenuButtonInfo: menuButtonInfo,\r\n\t\t\t\tstatusBarHeight: systemInfo.statusBarHeight\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 导航栏内部盒子的样式\r\n\t\t\tnavbarInnerStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\t// 导航栏宽度，如果在小程序下，导航栏宽度为胶囊的左边到屏幕左边的距离\r\n\t\t\t\tstyle.height = this.navbarHeight + 'px';\r\n\t\t\t\t// // 如果是各家小程序，导航栏内部的宽度需要减少右边胶囊的宽度\r\n\t\t\t\t// #ifdef MP\r\n\t\t\t\tlet rightButtonWidth = systemInfo.windowWidth - menuButtonInfo.left;\r\n\t\t\t\tstyle.marginRight = rightButtonWidth + 'px';\r\n\t\t\t\t// #endif\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 整个导航栏的样式\r\n\t\t\tnavbarStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.zIndex = this.zIndex ? this.zIndex : this.$u.zIndex.navbar;\r\n\t\t\t\t// 合并用户传递的背景色对象\r\n\t\t\t\tObject.assign(style, this.background);\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 导航中间的标题的样式\r\n\t\t\ttitleStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\t// #ifndef MP\r\n\t\t\t\tstyle.left = (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + 'px';\r\n\t\t\t\tstyle.right = (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + 'px';\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef MP\r\n\t\t\t\t// 此处是为了让标题显示区域即使在小程序有右侧胶囊的情况下也能处于屏幕的中间，是通过绝对定位实现的\r\n\t\t\t\tlet rightButtonWidth = systemInfo.windowWidth - menuButtonInfo.left;\r\n\t\t\t\tstyle.left = (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + 'px';\r\n\t\t\t\tstyle.right = rightButtonWidth - (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + rightButtonWidth +\r\n\t\t\t\t\t'px';\r\n\t\t\t\t// #endif\r\n\t\t\t\tstyle.width = uni.upx2px(this.titleWidth) + 'px';\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 转换字符数值为真正的数值\r\n\t\t\tnavbarHeight() {\r\n\t\t\t\t// #ifdef APP-PLUS || H5\r\n\t\t\t\treturn this.height ? this.height : 44;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef MP\r\n\t\t\t\t// 小程序特别处理，让导航栏高度 = 胶囊高度 + 两倍胶囊顶部与状态栏底部的距离之差(相当于同时获得了导航栏底部与胶囊底部的距离)\r\n\t\t\t\t// 此方法有缺陷，暂不用(会导致少了几个px)，采用直接固定值的方式\r\n\t\t\t\t// return menuButtonInfo.height + (menuButtonInfo.top - this.statusBarHeight) * 2;//导航高度\r\n\t\t\t\tlet height = systemInfo.platform == 'ios' ? 44 : 44;\r\n\t\t\t\treturn this.height ? this.height : height;\r\n\t\t\t\t// #endif\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {},\r\n\t\tmethods: {\r\n\t\t\tgoBack() {\r\n\t\t\t\t// 如果自定义了点击返回按钮的函数，则执行，否则执行返回逻辑\r\n\t\t\t\tif (typeof this.customBack === 'function') {\r\n\t\t\t\t\t// 在微信，支付宝等环境(H5正常)，会导致父组件定义的customBack()函数体中的this变成子组件的this\r\n\t\t\t\t\t// 通过bind()方法，绑定父组件的this，让this.customBack()的this为父组件的上下文\r\n\t\t\t\t\tthis.customBack.bind(this.$u.$parent.call(this))();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tuni.navigateBack();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-navbar {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.u-navbar-fixed {\r\n\t\tposition: fixed;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\ttop: 0;\r\n\t\tz-index: 991;\r\n\t}\r\n\r\n\t.u-status-bar {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.u-navbar-inner {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\tposition: relative;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.u-back-wrap {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tflex: 1;\r\n\t\tflex-grow: 0;\r\n\t\tpadding: 14rpx 14rpx 14rpx 24rpx;\r\n\t}\r\n\r\n\t.u-back-text {\r\n\t\tpadding-left: 4rpx;\r\n\t\tfont-size: 30rpx;\r\n\t}\r\n\r\n\t.u-navbar-content-title {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tflex: 1;\r\n\t\tposition: absolute;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\theight: 60rpx;\r\n\t\ttext-align: center;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.u-navbar-centent-slot {\r\n\t\tflex: 1;\r\n\t}\r\n\r\n\t.u-title {\r\n\t\tline-height: 60rpx;\r\n\t\tfont-size: 32rpx;\r\n\t\tflex: 1;\r\n\t}\r\n\r\n\t.u-navbar-right {\r\n\t\tflex: 1;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: flex-end;\r\n\t}\r\n\r\n\t.u-slot-content {\r\n\t\tflex: 1;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-no-network/u-no-network.vue",
    "content": "<template>\r\n\t<view class=\"u-no-network\" v-if=\"!isConnected\" :style=\"{'z-index': uZIndex}\" @touchmove.stop.prevent=\"\">\r\n\t\t<view class=\"u-inner\">\r\n\t\t\t<image class=\"u-error-icon\" :src=\"image\" mode=\"widthFix\"></image>\r\n\t\t\t<view class=\"u-tips\">\r\n\t\t\t\t{{tips}}\r\n\t\t\t</view>\r\n\t\t\t<!-- 只有APP平台，才能跳转设置页，因为需要调用plus环境 -->\r\n\t\t\t<!-- #ifdef APP-PLUS -->\r\n\t\t\t<view class=\"u-to-setting\">\r\n\t\t\t\t请检查网络，或前往<text class=\"u-setting-btn\" @tap=\"openSettings\">设置</text>\r\n\t\t\t</view>\r\n\t\t\t<!-- #endif -->\r\n\t\t\t<view class=\"u-retry\" :hover-stay-time=\"150\" @tap=\"retry\" hover-class=\"u-retry-hover\">\r\n\t\t\t\t重试\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * noNetwork 无网络提示\r\n\t * @description 该组件无需任何配置，引入即可，内部自动处理所有功能和事件。\r\n\t * @tutorial https://www.uviewui.com/components/noNetwork.html\r\n\t * @property {String} tips 没有网络时的提示语（默认哎呀，网络信号丢失）\r\n\t * @property {String Number} zIndex 组件的z-index值（默认1080）\r\n\t * @property {String} image 无网络的图片提示，可用的src地址或base64图片\r\n\t * @event {Function} retry 用户点击页面的\"重试\"按钮时触发\r\n\t * @example <u-no-network></u-no-network>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-no-network\",\r\n\t\tprops: {\r\n\t\t\t// 页面文字提示\r\n\t\t\ttips: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '哎呀，网络信号丢失'\r\n\t\t\t},\r\n\t\t\t// 一个z-index值，用于设置没有网络这个组件的层次，因为页面可能会有其他定位的元素层级过高，导致此组件被覆盖\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// image 没有网络的图片提示\r\n\t\t\timage: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEYCAMAAABFglBLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0U3MjVFMzQwNEY1MTFFQUE4MTNDOUEzMTVBREMxQjIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0U3MjVFMzUwNEY1MTFFQUE4MTNDOUEzMTVBREMxQjIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozRTcyNUUzMjA0RjUxMUVBQTgxM0M5QTMxNUFEQzFCMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozRTcyNUUzMzA0RjUxMUVBQTgxM0M5QTMxNUFEQzFCMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkHIU9QAAAMAUExURdHW2OWiou7u7tve4dnc3/vw8N3g4sPCwvjn5+jo6M7Q0u6+vtyEhPXY2Li+wuikpPXW1uXo6dba3Pbg4Na5u+qurqqyt/HJydjb3fjo6LrAxO7Bwey1td6MjOrs7fbc3OTn6Maytf7+/vz19eqqqrzCxvzz87a8wLO6vuqxsf78/PDFxenr7L/FyNTY26+2u/z09MjMzqy0udnZ2dvb27G4vMjN0O7v8P339+Ll5u3v8NDS1ODj5frt7bC3vP76+u24uOKamtTW2MTIy9zc3N7e3vPQ0OCTk8DGyfDDw9LR0c7S1LussNbY2fPOztLU1cLHyrK6vvji4vrv78bKzPX29/np6crP0vjk5Ozu78bLzuepqczR1MHFyMDEyOq1tfTS0vP09cLIy9DU173Ex8bGxvHy88/U18vO0LK4vM7OzsTKzcPJzPLMzM/T1sbMz8HJy+7FxbW8wNTW18XKzvb3+MjLzczP0d3e3+Dh4r3Dxtna29zd3rK5vdPU1cfM0Prq6uOenuPm58HGyfHz8/ro6Lq/w8nO0bzCxcrKytjZ2uXm5vTU1LvBxbW7v+rp6eefn/39/eLi4u3t7Ozs7Pj4+Pr6+vX19fHx8erq6vPz8+Xl5ff39+fn5/v7+/z8/PLx8fX09Pb29ri4uOTk5PHw8OPj4/Py8ubm5vn5+e3s7Pb19fTz8/f29tfX1+7t7cvQ0+zr6/Ly8u3t7fr5+efm5quzuOvq6vT19uvr6/j5+a61uuy6uvb39/T09Ojn5+jq6621uvn6+t/i5KyzuPn4+Le+wvv6+s3S1fj4+fDw8OHk5vv7/Pr7++Xk5LS7v7y8vObl5fz9/ff4+OTj48DEx8XJy+Hk5euysu/x8re9wfn5+v38/Pv8/Pr6++vt7uLi4+Pi4ubl5uXk5dPV1tbV1fHMzNPX2e7u7ejn6PT19fX19PDw7/b29f39/vnr6+Hh4a+3u+7t7q61uePi48PHyf35+enp6fLz9PPz8qmxtuDg4N/f3/Dv7////////1cfN/UAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAlqElEQVR42uydCXwUVZrAk5CEJBAQshACCGyjIRwBJR0It6JBGZZBkRtm5PBgFXAXHBghqAMz6LjGTrd9n7lvwn0JQhARxYNxVJTMwcwOM+7uzK6Z3VXcrnTXVr2q6q7urrvfq26c+n4egXTSVfXv993veym4JkklKdoj0IBoogHRgGiiAdGAaKIB0YBoogHRgGiiAdFEA6IBUVuwx+vqet/v1YAkhxwmcNT9gvjnsAYkGcT7eN1TtThe+1TdL2o1IEkg+rrvUV90MF9oQBIqv6ijF4a3d51XA5J4jVVXx3z587ojGpDEm/QwkO9pQJJB2CvksAYk8fJUXT31xZG63ppRTwI5QgcgR35Rd1MDkgxSX1f31P33P1V3i3u936HUyc3edWSsjuEakKRRW3r9kVv+JrRsrwbklpKTnXs+z0wfONOtAUm8rJu55oqfkZ0TOzUgCZS3Zh7s54+S5RqQhNGYMsnPISkakCSiQcjkNzUgasvUDaVsBF1fb9GXd//B0ziliPzjEA2IujLqGRaMST+cawgLNpn4q30aEDV1Va+dYRqzNy00RMoYUmdpQNTzcb8sCtuKH8w9Z4iWLuIbVzQgapmOBedDOO6c0WjgENK2vKwBUUUmvBSiUbrqxwZuOU18d5MGhEe/dI6a2WvIxA0HX1hfvH7V8gUpA9Mz3x/VuVTRLxvwdAhH5aJjBj4hv39QAxIl743ITHm6azBPnOCfVLwlc6pR3upYFbLjvIuDlEUqRYZo38JYS4gVt5rNZhMQO46byksoMeG4w8QIjtvMpJA/wP1EdZ0bKvkitkh555mBA3zSLnBlSFnNnlJvEJJ95ItW3pJAamvtZhy3m/T0g7fhthJGiG+EviYgmEJ/wHFP6GsbnlZSoicoucxmGwHVguPTBz543C9LHky/Jnql1w5KxWGo8KsThsAFYneYMOb5mlnP11ZCrwOPjfgGI8RqsZuZtUOsFmbllFhZP+zEbc8vGcqzMibv7qos3rd7Mg+TrQv2vCVkiLYc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\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tisConnected: true, // 是否有网络连接\r\n\t\t\t\tnetworkType: \"none\", // 网络类型\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tuZIndex() {\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.noNetwork;\r\n\t\t\t}\r\n\t\t},\n\t\twatch:{\n\t\t\tisConnected(val){\n\t\t\t\t\tthis.$emit('isConnected',val)\n\t\t\t}\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.isIOS = (uni.getSystemInfoSync().platform === 'ios');\r\n\t\t\tuni.onNetworkStatusChange((res) => {\r\n\t\t\t\tthis.isConnected = res.isConnected;\r\n\t\t\t\tthis.networkType = res.networkType;\r\n\t\t\t});\r\n\t\t\tuni.getNetworkType({\r\n\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\tthis.networkType = res.networkType;\r\n\t\t\t\t\tif (res.networkType == 'none') {\r\n\t\t\t\t\t\tthis.isConnected = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.isConnected = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tretry() {\r\n\t\t\t\t// 重新检查网络\r\n\t\t\t\tuni.getNetworkType({\r\n\t\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\t\tthis.networkType = res.networkType;\r\n\t\t\t\t\t\tif (res.networkType == 'none') {\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ttitle: '无网络连接',\r\n\t\t\t\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\t\t\t\tposition: 'top'\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\tthis.isConnected = false;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\ttitle: '网络已连接',\r\n\t\t\t\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\t\t\t\tposition: 'top'\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\tthis.isConnected = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tthis.$emit('retry');\r\n\t\t\t},\r\n\t\t\tasync openSettings() {\r\n\t\t\t\tif (this.networkType == \"none\") {\r\n\t\t\t\t\tthis.openSystemSettings();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\topenAppSettings() {\r\n\t\t\t\tthis.gotoAppSetting();\r\n\t\t\t},\r\n\t\t\topenSystemSettings() {\r\n\t\t\t\t// 以下方法来自5+范畴，如需深究，请自行查阅相关文档\r\n\t\t\t\t// https://ask.dcloud.net.cn/docs/\r\n\t\t\t\tif (this.isIOS) {\r\n\t\t\t\t\tthis.gotoiOSSetting();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.gotoAndroidSetting();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tnetwork() {\r\n\t\t\t\tvar result = null;\r\n\t\t\t\tvar cellularData = plus.ios.newObject(\"CTCellularData\");\r\n\t\t\t\tvar state = cellularData.plusGetAttribute(\"restrictedState\");\r\n\t\t\t\tif (state == 0) {\r\n\t\t\t\t\tresult = null;\r\n\t\t\t\t} else if (state == 2) {\r\n\t\t\t\t\tresult = 1;\r\n\t\t\t\t} else if (state == 1) {\r\n\t\t\t\t\tresult = 2;\r\n\t\t\t\t}\r\n\t\t\t\tplus.ios.deleteObject(cellularData);\r\n\t\t\t\treturn result;\r\n\t\t\t},\r\n\t\t\tgotoAppSetting() {\r\n\t\t\t\tif (this.isIOS) {\r\n\t\t\t\t\tvar UIApplication = plus.ios.import(\"UIApplication\");\r\n\t\t\t\t\tvar application2 = UIApplication.sharedApplication();\r\n\t\t\t\t\tvar NSURL2 = plus.ios.import(\"NSURL\");\r\n\t\t\t\t\tvar setting2 = NSURL2.URLWithString(\"app-settings:\");\r\n\t\t\t\t\tapplication2.openURL(setting2);\r\n\t\t\t\t\tplus.ios.deleteObject(setting2);\r\n\t\t\t\t\tplus.ios.deleteObject(NSURL2);\r\n\t\t\t\t\tplus.ios.deleteObject(application2);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar Intent = plus.android.importClass(\"android.content.Intent\");\r\n\t\t\t\t\tvar Settings = plus.android.importClass(\"android.provider.Settings\");\r\n\t\t\t\t\tvar Uri = plus.android.importClass(\"android.net.Uri\");\r\n\t\t\t\t\tvar mainActivity = plus.android.runtimeMainActivity();\r\n\t\t\t\t\tvar intent = new Intent();\r\n\t\t\t\t\tintent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);\r\n\t\t\t\t\tvar uri = Uri.fromParts(\"package\", mainActivity.getPackageName(), null);\r\n\t\t\t\t\tintent.setData(uri);\r\n\t\t\t\t\tmainActivity.startActivity(intent);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tgotoiOSSetting() {\r\n\t\t\t\tvar UIApplication = plus.ios.import(\"UIApplication\");\r\n\t\t\t\tvar application2 = UIApplication.sharedApplication();\r\n\t\t\t\tvar NSURL2 = plus.ios.import(\"NSURL\");\r\n\t\t\t\tvar setting2 = NSURL2.URLWithString(\"App-prefs:root=General\");\r\n\t\t\t\tapplication2.openURL(setting2);\r\n\t\t\t\tplus.ios.deleteObject(setting2);\r\n\t\t\t\tplus.ios.deleteObject(NSURL2);\r\n\t\t\t\tplus.ios.deleteObject(application2);\r\n\t\t\t},\r\n\t\t\tgotoAndroidSetting() {\r\n\t\t\t\tvar Intent = plus.android.importClass(\"android.content.Intent\");\r\n\t\t\t\tvar Settings = plus.android.importClass(\"android.provider.Settings\");\r\n\t\t\t\tvar mainActivity = plus.android.runtimeMainActivity();\r\n\t\t\t\tvar intent = new Intent(Settings.ACTION_SETTINGS);\r\n\t\t\t\tmainActivity.startActivity(intent);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-no-network {\r\n\t\tbackground-color: #fff;\r\n\t\tposition: fixed;\r\n\t\ttop: 0;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\tbottom: 0;\r\n\t}\r\n\r\n\t.u-inner {\r\n\t\theight: 100vh;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tmargin-top: -15%;\r\n\t}\r\n\r\n\t.u-tips {\r\n\t\tcolor: $u-tips-color;\r\n\t\tfont-size: 28rpx;\r\n\t\tpadding: 30rpx 0;\r\n\t}\r\n\r\n\t.u-error-icon {\r\n\t\twidth: 300rpx;\r\n\t}\r\n\r\n\t.u-to-setting {\r\n\t\tcolor: $u-light-color;\r\n\t\tfont-size: 26rpx;\r\n\t}\r\n\r\n\t.u-setting-btn {\r\n\t\tfont-size: 26rpx;\r\n\t\tcolor: $u-type-primary;\r\n\t}\r\n\r\n\t.u-retry {\r\n\t\tmargin-top: 30rpx;\r\n\t\tborder: 1px solid $u-tips-color;\r\n\t\tcolor: $u-tips-color;\r\n\t\tfont-size: 28rpx;\r\n\t\tpadding: 6rpx 30rpx;\r\n\t\tborder-radius: 3px;\r\n\t}\r\n\r\n\t.u-retry-hover {\r\n\t\tcolor: #fff;\r\n\t\tbackground-color: $u-tips-color;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-notice-bar/u-notice-bar.vue",
    "content": "<template>\r\n\t<view class=\"u-notice-bar-wrap\" v-if=\"isShow\" :style=\"{\r\n\t\tborderRadius: borderRadius + 'rpx',\r\n\t}\">\r\n\t\t<block v-if=\"mode == 'horizontal' && isCircular\">\r\n\t\t\t<u-row-notice\r\n\t\t\t\t:type=\"type\"\r\n\t\t\t\t:color=\"color\"\r\n\t\t\t\t:bgColor=\"bgColor\"\r\n\t\t\t\t:list=\"list\"\r\n\t\t\t\t:volumeIcon=\"volumeIcon\"\r\n\t\t\t\t:moreIcon=\"moreIcon\"\r\n\t\t\t\t:volumeSize=\"volumeSize\"\r\n\t\t\t\t:closeIcon=\"closeIcon\"\r\n\t\t\t\t:mode=\"mode\"\r\n\t\t\t\t:fontSize=\"fontSize\"\r\n\t\t\t\t:speed=\"speed\"\r\n\t\t\t\t:playState=\"playState\"\r\n\t\t\t\t:padding=\"padding\"\r\n\t\t\t\t@getMore=\"getMore\"\r\n\t\t\t\t@close=\"close\"\r\n\t\t\t\t@click=\"click\"\r\n\t\t\t></u-row-notice>\r\n\t\t</block>\r\n\t\t<block v-if=\"mode == 'vertical' || (mode == 'horizontal' && !isCircular)\">\r\n\t\t\t<u-column-notice\r\n\t\t\t\t:type=\"type\"\r\n\t\t\t\t:color=\"color\"\r\n\t\t\t\t:bgColor=\"bgColor\"\r\n\t\t\t\t:list=\"list\"\r\n\t\t\t\t:volumeIcon=\"volumeIcon\"\r\n\t\t\t\t:moreIcon=\"moreIcon\"\r\n\t\t\t\t:closeIcon=\"closeIcon\"\r\n\t\t\t\t:mode=\"mode\"\r\n\t\t\t\t:volumeSize=\"volumeSize\"\r\n\t\t\t\t:disable-touch=\"disableTouch\"\r\n\t\t\t\t:fontSize=\"fontSize\"\r\n\t\t\t\t:duration=\"duration\"\r\n\t\t\t\t:playState=\"playState\"\r\n\t\t\t\t:padding=\"padding\"\r\n\t\t\t\t@getMore=\"getMore\"\r\n\t\t\t\t@close=\"close\"\r\n\t\t\t\t@click=\"click\"\r\n\t\t\t\t@end=\"end\"\r\n\t\t\t></u-column-notice>\r\n\t\t</block>\r\n\t</view>\r\n</template>\r\n<script>\r\n/**\r\n * noticeBar 滚动通知\r\n * @description 该组件用于滚动通告场景，有多种模式可供选择\r\n * @tutorial https://www.uviewui.com/components/noticeBar.html\r\n * @property {Array} list 滚动内容，数组形式，见上方说明\r\n * @property {String} type 显示的主题（默认warning）\r\n * @property {Boolean} volume-icon 是否显示小喇叭图标（默认true）\r\n * @property {Boolean} more-icon 是否显示右边的向右箭头（默认false）\r\n * @property {Boolean} close-icon 是否显示关闭图标（默认false）\r\n * @property {Boolean} autoplay 是否自动播放（默认true）\r\n * @property {String} color 文字颜色\r\n * @property {String Number} bg-color 背景颜色\r\n * @property {String} mode 滚动模式（默认horizontal）\r\n * @property {Boolean} show 是否显示（默认true）\r\n * @property {String Number} font-size 字体大小，单位rpx（默认28）\r\n * @property {String Number} volume-size 左边喇叭的大小（默认34）\r\n * @property {String Number} duration 滚动周期时长，只对步进模式有效，横向衔接模式无效，单位ms（默认2000）\r\n * @property {String Number} speed 水平滚动时的滚动速度，即每秒移动多少距离，只对水平衔接方式有效，单位rpx（默认160）\r\n * @property {String Number} font-size 字体大小，单位rpx（默认28）\r\n * @property {Boolean} is-circular mode为horizontal时，指明是否水平衔接滚动（默认true）\r\n * @property {String} play-state 播放状态，play - 播放，paused - 暂停（默认play）\r\n * @property {String Nubmer} border-radius 通知栏圆角（默认为0）\r\n * @property {String Nubmer} padding 内边距，字符串，与普通的内边距css写法一直（默认\"18rpx 24rpx\"）\r\n * @property {Boolean} no-list-hidden 列表为空时，是否显示组件（默认false）\r\n * @property {Boolean} disable-touch 是否禁止通过手动滑动切换通知，只有mode = vertical，或者mode = horizontal且is-circular = false时有效（默认true）\r\n * @event {Function} click 点击通告文字触发，只有mode = vertical，或者mode = horizontal且is-circular = false时有效\r\n * @event {Function} close 点击右侧关闭图标触发\r\n * @event {Function} getMore 点击右侧向右图标触发\r\n * @event {Function} end 列表的消息每次被播放一个周期时触发，只有mode = vertical，或者mode = horizontal且is-circular = false时有效\r\n * @example <u-notice-bar :more-icon=\"true\" :list=\"list\"></u-notice-bar>\r\n */\r\nexport default {\r\n\tname: \"u-notice-bar\",\r\n\tprops: {\r\n\t\t// 显示的内容，数组\r\n\t\tlist: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 显示的主题，success|error|primary|info|warning\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'warning'\r\n\t\t},\r\n\t\t// 是否显示左侧的音量图标\r\n\t\tvolumeIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 音量喇叭的大小\r\n\t\tvolumeSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 34\r\n\t\t},\r\n\t\t// 是否显示右侧的右箭头图标\r\n\t\tmoreIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否显示右侧的关闭图标\r\n\t\tcloseIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否自动播放\r\n\t\tautoplay: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 文字颜色，各图标也会使用文字颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 滚动方向，horizontal-水平滚动，vertical-垂直滚动\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'horizontal'\r\n\t\t},\r\n\t\t// 是否显示\r\n\t\tshow: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 字体大小，单位rpx\r\n\t\tfontSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 28\r\n\t\t},\r\n\t\t// 滚动一个周期的时间长，单位ms\r\n\t\tduration: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 2000\r\n\t\t},\r\n\t\t// 水平滚动时的滚动速度，即每秒滚动多少rpx，这有利于控制文字无论多少时，都能有一个恒定的速度\r\n\t\tspeed: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 160\r\n\t\t},\r\n\t\t// 水平滚动时，是否采用衔接形式滚动\r\n\t\t// 水平衔接模式，采用的是swiper组件，水平滚动\r\n\t\tisCircular: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 播放状态，play-播放，paused-暂停\r\n\t\tplayState: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'play'\r\n\t\t},\r\n\t\t// 是否禁止用手滑动切换\r\n\t\t// 目前HX2.6.11，只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序\r\n\t\tdisableTouch: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 滚动通知设置圆角\r\n\t\tborderRadius: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 通知的边距\r\n\t\tpadding: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '18rpx 24rpx'\r\n\t\t},\r\n\t\t// list列表为空时，是否显示组件\r\n\t\tnoListHidden: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\t// 如果设置show为false，或者设置了noListHidden为true，且list长度又为零的话，隐藏组件\r\n\t\tisShow() {\r\n\t\t\tif(this.show == false || (this.noListHidden == true && this.list.length == 0)) return false;\r\n\t\t\telse return true;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t// 点击通告栏\r\n\t\tclick(index) {\r\n\t\t\tthis.$emit('click', index);\r\n\t\t},\r\n\t\t// 点击关闭按钮\r\n\t\tclose() {\r\n\t\t\tthis.$emit('close');\r\n\t\t},\r\n\t\t// 点击更多箭头按钮\r\n\t\tgetMore() {\r\n\t\t\tthis.$emit('getMore');\r\n\t\t},\r\n\t\t// 滚动一个周期结束，只对垂直，或者水平步进形式有效\r\n\t\tend() {\r\n\t\t\tthis.$emit('end');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-notice-bar-wrap {\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-notice-bar {\r\n\tpadding: 18rpx 24rpx;\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-direction-row {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n}\r\n\r\n.u-left-icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-notice-box {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\toverflow: hidden;\r\n\tmargin-left: 12rpx;\r\n}\r\n\r\n.u-right-icon {\r\n\tmargin-left: 12rpx;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-notice-content {\r\n\tline-height: 1;\r\n\twhite-space: nowrap;\r\n\tfont-size: 26rpx;\r\n\tanimation: u-loop-animation 10s linear infinite both;\r\n\ttext-align: right;\r\n\t// 这一句很重要，为了能让滚动左右连接起来\r\n\tpadding-left: 100%;\r\n}\r\n\r\n@keyframes u-loop-animation {\r\n\t0% {\r\n\t\ttransform: translate3d(0, 0, 0);\r\n\t}\r\n\r\n\t100% {\r\n\t\ttransform: translate3d(-100%, 0, 0);\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-number-box/u-number-box.vue",
    "content": "<template>\r\n\t<view class=\"u-numberbox\">\r\n\t\t<view class=\"u-icon-minus\" @touchstart.stop.prevent=\"btnTouchStart('minus')\" @touchend.stop.prevent=\"clearTimer\" :class=\"{ 'u-icon-disabled': disabled || inputVal <= min }\"\r\n\t\t    :style=\"{\r\n\t\t\t\tbackground: bgColor,\r\n\t\t\t\theight: inputHeight + 'rpx',\r\n\t\t\t\tcolor: color\r\n\t\t\t}\">\r\n\t\t\t<u-icon name=\"minus\" :size=\"size\"></u-icon>\r\n\t\t</view>\r\n\t\t<input :disabled=\"disabledInput || disabled\" :cursor-spacing=\"getCursorSpacing\" :class=\"{ 'u-input-disabled': disabled }\"\r\n\t\t    v-model=\"inputVal\" class=\"u-number-input\" @blur=\"onBlur\"\r\n\t\t    type=\"number\" :style=\"{\r\n\t\t\t\tcolor: color,\r\n\t\t\t\tfontSize: size + 'rpx',\r\n\t\t\t\tbackground: bgColor,\r\n\t\t\t\theight: inputHeight + 'rpx',\r\n\t\t\t\twidth: inputWidth + 'rpx'\r\n\t\t\t}\" />\r\n\t\t<view class=\"u-icon-plus\" @touchstart.stop.prevent=\"btnTouchStart('plus')\" @touchend.stop.prevent=\"clearTimer\" :class=\"{ 'u-icon-disabled': disabled || inputVal >= max }\"\r\n\t\t    :style=\"{\r\n\t\t\t\tbackground: bgColor,\r\n\t\t\t\theight: inputHeight + 'rpx',\r\n\t\t\t\tcolor: color\r\n\t\t\t}\">\r\n\t\t\t<u-icon name=\"plus\" :size=\"size\"></u-icon>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * numberBox 步进器\r\n\t * @description 该组件一般用于商城购物选择物品数量的场景。注意：该输入框只能输入大于或等于0的整数，不支持小数输入\r\n\t * @tutorial https://www.uviewui.com/components/numberBox.html\r\n\t * @property {Number} value 输入框初始值（默认1）\r\n\t * @property {String} bg-color 输入框和按钮的背景颜色（默认#F2F3F5）\r\n\t * @property {Number} min 用户可输入的最小值（默认0）\r\n\t * @property {Number} max 用户可输入的最大值（默认99999）\r\n\t * @property {Number} step 步长，每次加或减的值（默认1）\r\n\t * @property {Boolean} disabled 是否禁用操作，禁用后无法加减或手动修改输入框的值（默认false）\r\n\t * @property {Boolean} disabled-input 是否禁止输入框手动输入值（默认false）\r\n\t * @property {Boolean} positive-integer 是否只能输入正整数（默认true）\r\n\t * @property {String | Number} size 输入框文字和按钮字体大小，单位rpx（默认26）\r\n\t * @property {String} color 输入框文字和加减按钮图标的颜色（默认#323233）\r\n\t * @property {String | Number} input-width 输入框宽度，单位rpx（默认80）\r\n\t * @property {String | Number} input-height 输入框和按钮的高度，单位rpx（默认50）\r\n\t * @property {String | Number} index 事件回调时用以区分当前发生变化的是哪个输入框\r\n\t * @property {Boolean} long-press 是否开启长按连续递增或递减(默认true)\r\n\t * @property {String | Number} press-time 开启长按触发后，每触发一次需要多久，单位ms(默认250)\r\n\t * @property {String | Number} cursor-spacing 指定光标于键盘的距离，避免键盘遮挡输入框，单位rpx（默认200）\r\n\t * @event {Function} change 输入框内容发生变化时触发，对象形式\r\n\t * @event {Function} blur 输入框失去焦点时触发，对象形式\r\n\t * @event {Function} minus 点击减少按钮时触发(按钮可点击情况下)，对象形式\r\n\t * @event {Function} plus 点击增加按钮时触发(按钮可点击情况下)，对象形式\r\n\t * @example <u-number-box :min=\"1\" :max=\"100\"></u-number-box>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-number-box\",\r\n\t\tprops: {\r\n\t\t\t// 预显示的数字\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Number,\r\n\t\t\t\tdefault: 1\r\n\t\t\t},\r\n\t\t\t// 背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#F2F3F5'\r\n\t\t\t},\r\n\t\t\t// 最小值\r\n\t\t\tmin: {\r\n\t\t\t\ttype: Number,\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 最大值\r\n\t\t\tmax: {\r\n\t\t\t\ttype: Number,\r\n\t\t\t\tdefault: 99999\r\n\t\t\t},\r\n\t\t\t// 步进值，每次加或减的值\r\n\t\t\tstep: {\r\n\t\t\t\ttype: Number,\r\n\t\t\t\tdefault: 1\r\n\t\t\t},\r\n\t\t\t// 是否禁用加减操作\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// input的字体大小，单位rpx\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 26\r\n\t\t\t},\r\n\t\t\t// 加减图标的颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#323233'\r\n\t\t\t},\r\n\t\t\t// input宽度，单位rpx\r\n\t\t\tinputWidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 80\r\n\t\t\t},\r\n\t\t\t// input高度，单位rpx\r\n\t\t\tinputHeight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 50\r\n\t\t\t},\r\n\t\t\t// index索引，用于列表中使用，让用户知道是哪个numberbox发生了变化，一般使用for循环出来的index值即可\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否禁用输入框，与disabled作用于输入框时，为OR的关系，即想要禁用输入框，又可以加减的话\r\n\t\t\t// 设置disabled为false，disabledInput为true即可\r\n\t\t\tdisabledInput: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 输入框于键盘之间的距离\r\n\t\t\tcursorSpacing: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 100\r\n\t\t\t},\r\n\t\t\t// 是否开启长按连续递增或递减\r\n\t\t\tlongPress: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 开启长按触发后，每触发一次需要多久\r\n\t\t\tpressTime: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 250\r\n\t\t\t},\r\n\t\t\t// 是否只能输入大于或等于0的整数(正整数)\r\n\t\t\tpositiveInteger: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tskuItem:{\r\n\t\t\t\ttype:null,\r\n\t\t\t\tdefault: \"\"\r\n\t\t\t},\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tvalue: {\r\n\t\t\t\thandler(v1,v2){\r\n\t\t\t\t\tthis.inputVal = v1\r\n\t\t\t\t\t// 只有value的改变是来自外部的时候，才去同步inputVal的值，否则会造成循环错误\r\n\t\t\t\t\t// if(!this.changeFromInner) {\r\n\t\t\t\t\r\n\t\t\t\t\t// \tthis.inputVal = v1;\r\n\t\t\t\t\t// \t// 因为inputVal变化后，会触发this.handleChange()，在其中changeFromInner会再次被设置为true，\r\n\t\t\t\t\t// \t// 造成外面修改值，也导致被认为是内部修改的混乱，这里进行this.$nextTick延时，保证在运行周期的最后处\r\n\t\t\t\t\t// \t// 将changeFromInner设置为false\r\n\t\t\t\t\t// \tthis.$nextTick(function(){\r\n\t\t\t\t\t// \t\tthis.changeFromInner = false;\r\n\t\t\t\t\t// \t})\r\n\t\t\t\t\t// }\r\n\t\t\t\t},\r\n\t\t\t\timmediate: true\r\n\t\t\t},\r\n\t\t\tinputVal(v1, v2) {\r\n\t\t\t\r\n\t\t\t\t// 为了让用户能够删除所有输入值，重新输入内容，删除所有值后，内容为空字符串\r\n\t\t\t\tif (v1 == '') return;\r\n\t\t\t\tlet value = 0;\r\n\t\t\t\t// 首先判断是否数值，并且在min和max之间，如果不是，使用原来值\r\n\t\t\t\tlet tmp = this.$u.test.number(v1);\r\n\t\t\t\tif (tmp && v1 >= this.min && v1 <= this.max) value = v1;\r\n\t\t\t\telse value = v2;\r\n\t\t\t\t// 判断是否只能输入大于等于0的整数\r\n\t\t\t\tif(this.positiveInteger) {\r\n\t\t\t\t\t// 小于0，或者带有小数点，\r\n\t\t\t\t\tif(v1 < 0 || String(v1).indexOf('.') !== -1) {\r\n\t\t\t\t\t\tvalue = v2;\r\n\t\t\t\t\t\t// 双向绑定input的值，必须要使用$nextTick修改显示的值\r\n\t\t\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t\t\tthis.inputVal = v2;\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// 发出change事件\r\n\t\t\t\tthis.handleChange(value, 'change');\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tinputVal: 1, // 输入框中的值，不能直接使用props中的value，因为应该改变props的状态\r\n\t\t\t\ttimer: null, // 用作长按的定时器\r\n\t\t\t\tchangeFromInner: false, // 值发生变化，是来自内部还是外部\r\n\t\t\t};\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\tthis.inputVal = Number(this.value);\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tgetCursorSpacing() {\r\n\t\t\t\t// 先将值转为px单位，再转为数值\r\n\t\t\t\treturn Number(uni.upx2px(this.cursorSpacing));\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 点击退格键\r\n\t\t\tbtnTouchStart(callback) {\r\n\t\t\t\t// 先执行一遍方法，否则会造成松开手时，就执行了clearTimer，导致无法实现功能\r\n\t\t\t\tthis[callback]();\r\n\t\t\t\t// 如果没开启长按功能，直接返回\r\n\t\t\t\tif (!this.longPress) return;\r\n\t\t\t\tclearInterval(this.timer); //再次清空定时器，防止重复注册定时器\r\n\t\t\t\tthis.timer = null;\r\n\t\t\t\tthis.timer = setInterval(() => {\r\n\t\t\t\t\t// 执行加或减函数\r\n\t\t\t\t\tthis[callback]();\r\n\t\t\t\t}, this.pressTime);\r\n\t\t\t},\r\n\t\t\tclearTimer() {\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tclearInterval(this.timer);\r\n\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\tminus() {\r\n\t\t\t\tthis.computeVal('minus');\r\n\t\t\t},\r\n\t\t\tplus() {\r\n\t\t\t\tthis.computeVal('plus');\r\n\t\t\t},\r\n\t\t\t// 为了保证小数相加减出现精度溢出的问题\r\n\t\t\tcalcPlus(num1, num2) {\r\n\t\t\t\tlet baseNum, baseNum1, baseNum2;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tbaseNum1 = num1.toString().split('.')[1].length;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tbaseNum1 = 0;\r\n\t\t\t\t}\r\n\t\t\t\ttry {\r\n\t\t\t\t\tbaseNum2 = num2.toString().split('.')[1].length;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tbaseNum2 = 0;\r\n\t\t\t\t}\r\n\t\t\t\tbaseNum = Math.pow(10, Math.max(baseNum1, baseNum2));\r\n\t\t\t\tlet precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2; //精度\r\n\t\t\t\treturn ((num1 * baseNum + num2 * baseNum) / baseNum).toFixed(precision);\r\n\t\t\t},\r\n\t\t\t// 为了保证小数相加减出现精度溢出的问题\r\n\t\t\tcalcMinus(num1, num2) {\r\n\t\t\t\tlet baseNum, baseNum1, baseNum2;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tbaseNum1 = num1.toString().split('.')[1].length;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tbaseNum1 = 0;\r\n\t\t\t\t}\r\n\t\t\t\ttry {\r\n\t\t\t\t\tbaseNum2 = num2.toString().split('.')[1].length;\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tbaseNum2 = 0;\r\n\t\t\t\t}\r\n\t\t\t\tbaseNum = Math.pow(10, Math.max(baseNum1, baseNum2));\r\n\t\t\t\tlet precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2;\r\n\t\t\t\treturn ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);\r\n\t\t\t},\r\n\t\t\tcomputeVal(type) {\r\n\t\t\t\tuni.hideKeyboard();\r\n\t\t\t\tif (this.disabled) return;\r\n\t\t\t\tlet value = 0;\r\n\t\t\t\t// 减\r\n\t\t\t\tif (type === 'minus') {\r\n\t\t\t\t\tvalue = this.calcMinus(this.inputVal, this.step);\r\n\t\t\t\t} else if (type === 'plus') {\r\n\t\t\t\t\tvalue = this.calcPlus(this.inputVal, this.step);\r\n\t\t\t\t}\r\n\t\t\t\t// 判断是否小于最小值和大于最大值\r\n\t\t\t\tif (value < this.min || value > this.max) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.inputVal = value;\r\n\t\t\t\tthis.handleChange(value, type);\r\n\t\t\t},\r\n\t\t\t// 处理用户手动输入的情况\r\n\t\t\tonBlur(event) {\r\n\t\t\t\tlet val = 0;\r\n\t\t\t\tlet value = event.detail.value;\r\n\t\t\t\t// 如果为非0-9数字组成，或者其第一位数值为0，直接让其等于min值\r\n\t\t\t\t// 这里不直接判断是否正整数，是因为用户传递的props min值可能为0\r\n\t\t\t\tif (!/(^\\d+$)/.test(value) || value[0] == 0) val = this.min;\r\n\t\t\t\tval = +value;\r\n\t\t\t\tif (val > this.max) {\r\n\t\t\t\t\tval = this.max;\r\n\t\t\t\t} else if (val < this.min) {\r\n\t\t\t\t\tval = this.min;\r\n\t\t\t\t}\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.inputVal = val;\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\thandleChange(value, type) {\r\n\t\t\t\tif (this.disabled) return;\r\n\t\t\t\t// 发出input事件，修改通过v-model绑定的值，达到双向绑定的效果\r\n\t\t\t\tthis.changeFromInner = true;\r\n\t\t\t\r\n\t\t\t\tthis.$emit('input', Number(value));\r\n\t\t\t\tthis.$emit(type, {\r\n\t\t\t\t\t// 转为Number类型\r\n\t\t\t\t\tvalue: Number(value),\r\n\t\t\t\t\tindex: this.index,\r\n\t\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\t\tdata:this.skuItem,\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t},)\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-numberbox {\r\n\t\tdisplay: inline-flex;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.u-number-input {\r\n\t\tposition: relative;\r\n\t\ttext-align: center;\r\n\t\tpadding: 0;\r\n\t\tmargin: 0 6rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t.u-icon-plus,\r\n\t.u-icon-minus {\r\n\t\twidth: 60rpx;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.u-icon-plus {\r\n\t\tborder-radius: 0 8rpx 8rpx 0;\r\n\t}\r\n\r\n\t.u-icon-minus {\r\n\t\tborder-radius: 8rpx 0 0 8rpx;\r\n\t}\r\n\r\n\t.u-icon-disabled {\r\n\t\tcolor: #c8c9cc !important;\r\n\t\tbackground: #f7f8fa !important;\r\n\t}\r\n\r\n\t.u-input-disabled {\r\n\t\tcolor: #c8c9cc !important;\r\n\t\tbackground-color: #f2f3f5 !important;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-number-keyboard/u-number-keyboard.vue",
    "content": "<template>\r\n\t<view class=\"u-keyboard\" @touchmove.stop.prevent>\r\n\t\t<view class=\"u-keyboard-grids\">\r\n\t\t\t<view\r\n\t\t\t    class=\"u-keyboard-grids-item\"\r\n\t\t\t    :class=\"[btnBgGray(index) ? 'u-bg-gray' : '', index <= 2 ? 'u-border-top' : '', index < 9 ? 'u-border-bottom' : '', (index + 1) % 3 != 0 ? 'u-border-right' : '']\"\r\n\t\t\t    :style=\"[itemStyle(index)]\"\r\n\t\t\t    v-for=\"(item, index) in numList\"\r\n\t\t\t    :key=\"index\"\r\n\t\t\t    :hover-class=\"hoverClass(index)\"\r\n\t\t\t    :hover-stay-time=\"100\"\r\n\t\t\t    @tap=\"keyboardClick(item)\">\r\n\t\t\t\t<view class=\"u-keyboard-grids-btn\">{{ item }}</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-keyboard-grids-item u-bg-gray\" hover-class=\"u-hover-class\" :hover-stay-time=\"100\" @touchstart.stop=\"backspaceClick\"\r\n\t\t\t    @touchend=\"clearTimer\">\r\n\t\t\t\t<view class=\"u-keyboard-back u-keyboard-grids-btn\">\r\n\t\t\t\t\t<u-icon name=\"backspace\" :size=\"38\" :bold=\"true\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tprops: {\r\n\t\t\t// 键盘的类型，number-数字键盘，card-身份证键盘\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'number'\r\n\t\t\t},\r\n\t\t\t// 是否显示键盘的\".\"符号\r\n\t\t\tdotEnabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否打乱键盘按键的顺序\r\n\t\t\trandom: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tbackspace: 'backspace', // 退格键内容\r\n\t\t\t\tdot: '.', // 点\r\n\t\t\t\ttimer: null, // 长按多次删除的事件监听\r\n\t\t\t\tcardX: 'X' // 身份证的X符号\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 键盘需要显示的内容\r\n\t\t\tnumList() {\r\n\t\t\t\tlet tmp = [];\r\n\t\t\t\tif (!this.dotEnabled && this.mode == 'number') {\r\n\t\t\t\t\tif (!this.random) {\r\n\t\t\t\t\t\treturn [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn this.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (this.dotEnabled && this.mode == 'number') {\r\n\t\t\t\t\tif (!this.random) {\r\n\t\t\t\t\t\treturn [1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn this.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (this.mode == 'card') {\r\n\t\t\t\t\tif (!this.random) {\r\n\t\t\t\t\t\treturn [1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn this.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 按键的样式，在非乱序&&数字键盘&&不显示点按钮时，index为9时，按键占位两个空间\r\n\t\t\titemStyle() {\r\n\t\t\t\treturn index => {\r\n\t\t\t\t\tlet style = {};\r\n\t\t\t\t\tif (this.mode == 'number' && !this.dotEnabled && index == 9) style.flex = '0 0 66.6666666666%';\r\n\t\t\t\t\treturn style;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t// 是否让按键显示灰色，只在非乱序&&数字键盘&&且允许点按键的时候\r\n\t\t\tbtnBgGray() {\r\n\t\t\t\treturn index => {\r\n\t\t\t\t\tif (!this.random && index == 9 && (this.mode != 'number' || (this.mode == 'number' && this.dotEnabled))) return true;\r\n\t\t\t\t\telse return false;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\thoverClass() {\r\n\t\t\t\treturn index => {\r\n\t\t\t\t\tif (!this.random && index == 9 && (this.mode == 'number' && this.dotEnabled || this.mode == 'card')) return 'u-hover-class';\r\n\t\t\t\t\telse return 'u-keyboard-hover';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 点击退格键\r\n\t\t\tbackspaceClick() {\r\n\t\t\t\tthis.$emit('backspace');\r\n\t\t\t\tclearInterval(this.timer); //再次清空定时器，防止重复注册定时器\r\n\t\t\t\tthis.timer = null;\r\n\t\t\t\tthis.timer = setInterval(() => {\r\n\t\t\t\t\tthis.$emit('backspace');\r\n\t\t\t\t}, 250);\r\n\t\t\t},\r\n\t\t\tclearTimer() {\r\n\t\t\t\tclearInterval(this.timer);\r\n\t\t\t\tthis.timer = null;\r\n\t\t\t},\r\n\t\t\t// 获取键盘显示的内容\r\n\t\t\tkeyboardClick(val) {\r\n\t\t\t\t// 允许键盘显示点模式和触发非点按键时，将内容转为数字类型\r\n\t\t\t\tif (this.dotEnabled && val != this.dot && val != this.cardX) val = Number(val);\r\n\t\t\t\tthis.$emit('change', val);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-keyboard {\r\n\t\tposition: relative;\r\n\t\tz-index: 1003;\r\n\t}\r\n\r\n\t.u-keyboard-grids {\r\n\t\tdisplay: flex;\r\n\t\tflex-wrap: wrap;\r\n\t}\r\n\r\n\t.u-keyboard-grids-item {\r\n\t\tflex: 0 0 33.3333333333%;\r\n\t\ttext-align: center;\r\n\t\tfont-size: 50rpx;\r\n\t\tcolor: #333;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\theight: 110rpx;\r\n\t\tfont-weight: 500;\r\n\t}\r\n\r\n\t.u-bg-gray {\r\n\t\tbackground-color: #e7e6eb;\r\n\t}\r\n\r\n\t.u-keyboard-back {\r\n\t\tfont-size: 36rpx;\r\n\t}\r\n\r\n\t.u-keyboard-hover {\r\n\t\tbackground-color: #e7e6eb;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-parse/libs/CssHandler.js",
    "content": "const cfg = require('./config.js'),\r\n\tisLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\r\n\r\nfunction CssHandler(tagStyle) {\r\n\tvar styles = Object.assign(Object.create(null), cfg.userAgentStyles);\r\n\tfor (var item in tagStyle)\r\n\t\tstyles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];\r\n\tthis.styles = styles;\r\n}\r\nCssHandler.prototype.getStyle = function(data) {\r\n\tthis.styles = new parser(data, this.styles).parse();\r\n}\r\nCssHandler.prototype.match = function(name, attrs) {\r\n\tvar tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';\r\n\tif (attrs.class) {\r\n\t\tvar items = attrs.class.split(' ');\r\n\t\tfor (var i = 0, item; item = items[i]; i++)\r\n\t\t\tif (tmp = this.styles['.' + item])\r\n\t\t\t\tmatched += tmp + ';';\r\n\t}\r\n\tif (tmp = this.styles['#' + attrs.id])\r\n\t\tmatched += tmp + ';';\r\n\treturn matched;\r\n}\r\nmodule.exports = CssHandler;\r\n\r\nfunction parser(data, init) {\r\n\tthis.data = data;\r\n\tthis.floor = 0;\r\n\tthis.i = 0;\r\n\tthis.list = [];\r\n\tthis.res = init;\r\n\tthis.state = this.Space;\r\n}\r\nparser.prototype.parse = function() {\r\n\tfor (var c; c = this.data[this.i]; this.i++)\r\n\t\tthis.state(c);\r\n\treturn this.res;\r\n}\r\nparser.prototype.section = function() {\r\n\treturn this.data.substring(this.start, this.i);\r\n}\r\n// 状态机\r\nparser.prototype.Space = function(c) {\r\n\tif (c == '.' || c == '#' || isLetter(c)) {\r\n\t\tthis.start = this.i;\r\n\t\tthis.state = this.Name;\r\n\t} else if (c == '/' && this.data[this.i + 1] == '*')\r\n\t\tthis.Comment();\r\n\telse if (!cfg.blankChar[c] && c != ';')\r\n\t\tthis.state = this.Ignore;\r\n}\r\nparser.prototype.Comment = function() {\r\n\tthis.i = this.data.indexOf('*/', this.i) + 1;\r\n\tif (!this.i) this.i = this.data.length;\r\n\tthis.state = this.Space;\r\n}\r\nparser.prototype.Ignore = function(c) {\r\n\tif (c == '{') this.floor++;\r\n\telse if (c == '}' && !--this.floor) this.state = this.Space;\r\n}\r\nparser.prototype.Name = function(c) {\r\n\tif (cfg.blankChar[c]) {\r\n\t\tthis.list.push(this.section());\r\n\t\tthis.state = this.NameSpace;\r\n\t} else if (c == '{') {\r\n\t\tthis.list.push(this.section());\r\n\t\tthis.Content();\r\n\t} else if (c == ',') {\r\n\t\tthis.list.push(this.section());\r\n\t\tthis.Comma();\r\n\t} else if (!isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')\r\n\t\tthis.state = this.Ignore;\r\n}\r\nparser.prototype.NameSpace = function(c) {\r\n\tif (c == '{') this.Content();\r\n\telse if (c == ',') this.Comma();\r\n\telse if (!cfg.blankChar[c]) this.state = this.Ignore;\r\n}\r\nparser.prototype.Comma = function() {\r\n\twhile (cfg.blankChar[this.data[++this.i]]);\r\n\tif (this.data[this.i] == '{') this.Content();\r\n\telse {\r\n\t\tthis.start = this.i--;\r\n\t\tthis.state = this.Name;\r\n\t}\r\n}\r\nparser.prototype.Content = function() {\r\n\tthis.start = ++this.i;\r\n\tif ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;\r\n\tvar content = this.section();\r\n\tfor (var i = 0, item; item = this.list[i++];)\r\n\t\tif (this.res[item]) this.res[item] += ';' + content;\r\n\t\telse this.res[item] = content;\r\n\tthis.list = [];\r\n\tthis.state = this.Space;\r\n}\n"
  },
  {
    "path": "uview-ui/components/u-parse/libs/MpHtmlParser.js",
    "content": "/**\r\n * html 解析器\r\n * @tutorial https://github.com/jin-yufeng/Parser\r\n * @version 20200728\r\n * @author JinYufeng\r\n * @listens MIT\r\n */\r\nconst cfg = require('./config.js'),\r\n\tblankChar = cfg.blankChar,\r\n\tCssHandler = require('./CssHandler.js'),\r\n\twindowWidth = uni.getSystemInfoSync().windowWidth;\r\nvar emoji;\r\n\r\nfunction MpHtmlParser(data, options = {}) {\r\n\tthis.attrs = {};\r\n\tthis.CssHandler = new CssHandler(options.tagStyle, windowWidth);\r\n\tthis.data = data;\r\n\tthis.domain = options.domain;\r\n\tthis.DOM = [];\r\n\tthis.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;\r\n\toptions.prot = (this.domain || '').includes('://') ? this.domain.split('://')[0] : 'http';\r\n\tthis.options = options;\r\n\tthis.state = this.Text;\r\n\tthis.STACK = [];\r\n\t// 工具函数\r\n\tthis.bubble = () => {\r\n\t\tfor (var i = this.STACK.length, item; item = this.STACK[--i];) {\r\n\t\t\tif (cfg.richOnlyTags[item.name]) {\r\n\t\t\t\tif (item.name == 'table' && !Object.hasOwnProperty.call(item, 'c')) item.c = 1;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\titem.c = 1;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\tthis.decode = (val, amp) => {\r\n\t\tvar i = -1,\r\n\t\t\tj, en;\r\n\t\twhile (1) {\r\n\t\t\tif ((i = val.indexOf('&', i + 1)) == -1) break;\r\n\t\t\tif ((j = val.indexOf(';', i + 2)) == -1) break;\r\n\t\t\tif (val[i + 1] == '#') {\r\n\t\t\t\ten = parseInt((val[i + 2] == 'x' ? '0' : '') + val.substring(i + 2, j));\r\n\t\t\t\tif (!isNaN(en)) val = val.substr(0, i) + String.fromCharCode(en) + val.substr(j + 1);\r\n\t\t\t} else {\r\n\t\t\t\ten = val.substring(i + 1, j);\r\n\t\t\t\tif (cfg.entities[en] || en == amp)\r\n\t\t\t\t\tval = val.substr(0, i) + (cfg.entities[en] || '&') + val.substr(j + 1);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn val;\r\n\t}\r\n\tthis.getUrl = url => {\r\n\t\tif (url[0] == '/') {\r\n\t\t\tif (url[1] == '/') url = this.options.prot + ':' + url;\r\n\t\t\telse if (this.domain) url = this.domain + url;\r\n\t\t} else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))\r\n\t\t\turl = this.domain + '/' + url;\r\n\t\treturn url;\r\n\t}\r\n\tthis.isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');\r\n\tthis.section = () => this.data.substring(this.start, this.i);\r\n\tthis.parent = () => this.STACK[this.STACK.length - 1];\r\n\tthis.siblings = () => this.STACK.length ? this.parent().children : this.DOM;\r\n}\r\nMpHtmlParser.prototype.parse = function() {\r\n\tif (emoji) this.data = emoji.parseEmoji(this.data);\r\n\tfor (var c; c = this.data[this.i]; this.i++)\r\n\t\tthis.state(c);\r\n\tif (this.state == this.Text) this.setText();\r\n\twhile (this.STACK.length) this.popNode(this.STACK.pop());\r\n\treturn this.DOM;\r\n}\r\n// 设置属性\r\nMpHtmlParser.prototype.setAttr = function() {\r\n\tvar name = this.attrName.toLowerCase(),\r\n\t\tval = this.attrVal;\r\n\tif (cfg.boolAttrs[name]) this.attrs[name] = 'T';\r\n\telse if (val) {\r\n\t\tif (name == 'src' || (name == 'data-src' && !this.attrs.src)) this.attrs.src = this.getUrl(this.decode(val, 'amp'));\r\n\t\telse if (name == 'href' || name == 'style') this.attrs[name] = this.decode(val, 'amp');\r\n\t\telse if (name.substr(0, 5) != 'data-') this.attrs[name] = val;\r\n\t}\r\n\tthis.attrVal = '';\r\n\twhile (blankChar[this.data[this.i]]) this.i++;\r\n\tif (this.isClose()) this.setNode();\r\n\telse {\r\n\t\tthis.start = this.i;\r\n\t\tthis.state = this.AttrName;\r\n\t}\r\n}\r\n// 设置文本节点\r\nMpHtmlParser.prototype.setText = function() {\r\n\tvar back, text = this.section();\r\n\tif (!text) return;\r\n\ttext = (cfg.onText && cfg.onText(text, () => back = true)) || text;\r\n\tif (back) {\r\n\t\tthis.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);\r\n\t\tlet j = this.start + text.length;\r\n\t\tfor (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);\r\n\t\treturn;\r\n\t}\r\n\tif (!this.pre) {\r\n\t\t// 合并空白符\r\n\t\tvar flag, tmp = [];\r\n\t\tfor (let i = text.length, c; c = text[--i];)\r\n\t\t\tif (!blankChar[c]) {\r\n\t\t\t\ttmp.unshift(c);\r\n\t\t\t\tif (!flag) flag = 1;\r\n\t\t\t} else {\r\n\t\t\t\tif (tmp[0] != ' ') tmp.unshift(' ');\r\n\t\t\t\tif (c == '\\n' && flag == void 0) flag = 0;\r\n\t\t\t}\r\n\t\tif (flag == 0) return;\r\n\t\ttext = tmp.join('');\r\n\t}\r\n\tthis.siblings().push({\r\n\t\ttype: 'text',\r\n\t\ttext: this.decode(text)\r\n\t});\r\n}\r\n// 设置元素节点\r\nMpHtmlParser.prototype.setNode = function() {\r\n\tvar node = {\r\n\t\t\tname: this.tagName.toLowerCase(),\r\n\t\t\tattrs: this.attrs\r\n\t\t},\r\n\t\tclose = cfg.selfClosingTags[node.name];\r\n\tif (this.options.nodes.length) node.type = 'node';\r\n\tthis.attrs = {};\r\n\tif (!cfg.ignoreTags[node.name]) {\r\n\t\t// 处理属性\r\n\t\tvar attrs = node.attrs,\r\n\t\t\tstyle = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''),\r\n\t\t\tstyleObj = {};\r\n\t\tif (attrs.id) {\r\n\t\t\tif (this.options.compress & 1) attrs.id = void 0;\r\n\t\t\telse if (this.options.useAnchor) this.bubble();\r\n\t\t}\r\n\t\tif ((this.options.compress & 2) && attrs.class) attrs.class = void 0;\r\n\t\tswitch (node.name) {\r\n\t\t\tcase 'a':\r\n\t\t\tcase 'ad': // #ifdef APP-PLUS\r\n\t\t\tcase 'iframe':\r\n\t\t\t\t// #endif\r\n\t\t\t\tthis.bubble();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'font':\r\n\t\t\t\tif (attrs.color) {\r\n\t\t\t\t\tstyleObj['color'] = attrs.color;\r\n\t\t\t\t\tattrs.color = void 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (attrs.face) {\r\n\t\t\t\t\tstyleObj['font-family'] = attrs.face;\r\n\t\t\t\t\tattrs.face = void 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (attrs.size) {\r\n\t\t\t\t\tvar size = parseInt(attrs.size);\r\n\t\t\t\t\tif (size < 1) size = 1;\r\n\t\t\t\t\telse if (size > 7) size = 7;\r\n\t\t\t\t\tvar map = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];\r\n\t\t\t\t\tstyleObj['font-size'] = map[size - 1];\r\n\t\t\t\t\tattrs.size = void 0;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'embed':\r\n\t\t\t\t// #ifndef APP-PLUS\r\n\t\t\t\tvar src = node.attrs.src || '',\r\n\t\t\t\t\ttype = node.attrs.type || '';\r\n\t\t\t\tif (type.includes('video') || src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8'))\r\n\t\t\t\t\tnode.name = 'video';\r\n\t\t\t\telse if (type.includes('audio') || src.includes('.m4a') || src.includes('.wav') || src.includes('.mp3') || src.includes(\r\n\t\t\t\t\t\t'.aac'))\r\n\t\t\t\t\tnode.name = 'audio';\r\n\t\t\t\telse break;\r\n\t\t\t\tif (node.attrs.autostart)\r\n\t\t\t\t\tnode.attrs.autoplay = 'T';\r\n\t\t\t\tnode.attrs.controls = 'T';\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\tthis.bubble();\r\n\t\t\t\tbreak;\r\n\t\t\t\t// #endif\r\n\t\t\tcase 'video':\r\n\t\t\tcase 'audio':\r\n\t\t\t\tif (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]);\r\n\t\t\t\telse this[`${node.name}Num`]++;\r\n\t\t\t\tif (node.name == 'video') {\r\n\t\t\t\t\tif (this.videoNum > 3)\r\n\t\t\t\t\t\tnode.lazyLoad = 1;\r\n\t\t\t\t\tif (attrs.width) {\r\n\t\t\t\t\t\tstyleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px');\r\n\t\t\t\t\t\tattrs.width = void 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (attrs.height) {\r\n\t\t\t\t\t\tstyleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px');\r\n\t\t\t\t\t\tattrs.height = void 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!attrs.controls && !attrs.autoplay) attrs.controls = 'T';\r\n\t\t\t\tattrs.source = [];\r\n\t\t\t\tif (attrs.src) {\r\n\t\t\t\t\tattrs.source.push(attrs.src);\r\n\t\t\t\t\tattrs.src = void 0;\r\n\t\t\t\t}\r\n\t\t\t\tthis.bubble();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'td':\r\n\t\t\tcase 'th':\r\n\t\t\t\tif (attrs.colspan || attrs.rowspan)\r\n\t\t\t\t\tfor (var k = this.STACK.length, item; item = this.STACK[--k];)\r\n\t\t\t\t\t\tif (item.name == 'table') {\r\n\t\t\t\t\t\t\titem.c = void 0;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t}\r\n\t\tif (attrs.align) {\r\n\t\t\tstyleObj['text-align'] = attrs.align;\r\n\t\t\tattrs.align = void 0;\r\n\t\t}\r\n\t\t// 压缩 style\r\n\t\tvar styles = style.split(';');\r\n\t\tstyle = '';\r\n\t\tfor (var i = 0, len = styles.length; i < len; i++) {\r\n\t\t\tvar info = styles[i].split(':');\r\n\t\t\tif (info.length < 2) continue;\r\n\t\t\tlet key = info[0].trim().toLowerCase(),\r\n\t\t\t\tvalue = info.slice(1).join(':').trim();\r\n\t\t\tif (value[0] == '-' || value.includes('safe'))\r\n\t\t\t\tstyle += `;${key}:${value}`;\r\n\t\t\telse if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import'))\r\n\t\t\t\tstyleObj[key] = value;\r\n\t\t}\r\n\t\tif (node.name == 'img') {\r\n\t\t\tif (attrs.src && !attrs.ignore) {\r\n\t\t\t\tif (this.bubble())\r\n\t\t\t\t\tattrs.i = (this.imgNum++).toString();\r\n\t\t\t\telse attrs.ignore = 'T';\r\n\t\t\t}\r\n\t\t\tif (attrs.ignore) {\r\n\t\t\t\tstyle += ';-webkit-touch-callout:none';\r\n\t\t\t\tstyleObj['max-width'] = '100%';\r\n\t\t\t}\r\n\t\t\tvar width;\r\n\t\t\tif (styleObj.width) width = styleObj.width;\r\n\t\t\telse if (attrs.width) width = attrs.width.includes('%') ? attrs.width : attrs.width + 'px';\r\n\t\t\tif (width) {\r\n\t\t\t\tstyleObj.width = width;\r\n\t\t\t\tattrs.width = '100%';\r\n\t\t\t\tif (parseInt(width) > windowWidth) {\r\n\t\t\t\t\tstyleObj.height = '';\r\n\t\t\t\t\tif (attrs.height) attrs.height = void 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (styleObj.height) {\r\n\t\t\t\tattrs.height = styleObj.height;\r\n\t\t\t\tstyleObj.height = '';\r\n\t\t\t} else if (attrs.height && !attrs.height.includes('%'))\r\n\t\t\t\tattrs.height += 'px';\r\n\t\t}\r\n\t\tfor (var key in styleObj) {\r\n\t\t\tvar value = styleObj[key];\r\n\t\t\tif (!value) continue;\r\n\t\t\tif (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1;\r\n\t\t\t// 填充链接\r\n\t\t\tif (value.includes('url')) {\r\n\t\t\t\tvar j = value.indexOf('(');\r\n\t\t\t\tif (j++ != -1) {\r\n\t\t\t\t\twhile (value[j] == '\"' || value[j] == \"'\" || blankChar[value[j]]) j++;\r\n\t\t\t\t\tvalue = value.substr(0, j) + this.getUrl(value.substr(j));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// 转换 rpx\r\n\t\t\telse if (value.includes('rpx'))\r\n\t\t\t\tvalue = value.replace(/[0-9.]+\\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px');\r\n\t\t\telse if (key == 'white-space' && value.includes('pre') && !close)\r\n\t\t\t\tthis.pre = node.pre = true;\r\n\t\t\tstyle += `;${key}:${value}`;\r\n\t\t}\r\n\t\tstyle = style.substr(1);\r\n\t\tif (style) attrs.style = style;\r\n\t\tif (!close) {\r\n\t\t\tnode.children = [];\r\n\t\t\tif (node.name == 'pre' && cfg.highlight) {\r\n\t\t\t\tthis.remove(node);\r\n\t\t\t\tthis.pre = node.pre = true;\r\n\t\t\t}\r\n\t\t\tthis.siblings().push(node);\r\n\t\t\tthis.STACK.push(node);\r\n\t\t} else if (!cfg.filter || cfg.filter(node, this) != false)\r\n\t\t\tthis.siblings().push(node);\r\n\t} else {\r\n\t\tif (!close) this.remove(node);\r\n\t\telse if (node.name == 'source') {\r\n\t\t\tvar parent = this.parent();\r\n\t\t\tif (parent && (parent.name == 'video' || parent.name == 'audio') && node.attrs.src)\r\n\t\t\t\tparent.attrs.source.push(node.attrs.src);\r\n\t\t} else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;\r\n\t}\r\n\tif (this.data[this.i] == '/') this.i++;\r\n\tthis.start = this.i + 1;\r\n\tthis.state = this.Text;\r\n}\r\n// 移除标签\r\nMpHtmlParser.prototype.remove = function(node) {\r\n\tvar name = node.name,\r\n\t\tj = this.i;\r\n\t// 处理 svg\r\n\tvar handleSvg = () => {\r\n\t\tvar src = this.data.substring(j, this.i + 1);\r\n\t\tif (!node.attrs.xmlns) src = ' xmlns=\"http://www.w3.org/2000/svg\"' + src;\r\n\t\tvar i = j;\r\n\t\twhile (this.data[j] != '<') j--;\r\n\t\tsrc = this.data.substring(j, i).replace(\"viewbox\", \"viewBox\") + src;\r\n\t\tvar parent = this.parent();\r\n\t\tif (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline'))\r\n\t\t\tparent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style;\r\n\t\tthis.siblings().push({\r\n\t\t\tname: 'img',\r\n\t\t\tattrs: {\r\n\t\t\t\tsrc: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),\r\n\t\t\t\tstyle: (/vertical[^;]+/.exec(node.attrs.style) || []).shift(),\r\n\t\t\t\tignore: 'T'\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\tif (node.name == 'svg' && this.data[j] == '/') return handleSvg(this.i++);\r\n\twhile (1) {\r\n\t\tif ((this.i = this.data.indexOf('</', this.i + 1)) == -1) {\r\n\t\t\tif (name == 'pre' || name == 'svg') this.i = j;\r\n\t\t\telse this.i = this.data.length;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.start = (this.i += 2);\r\n\t\twhile (!blankChar[this.data[this.i]] && !this.isClose()) this.i++;\r\n\t\tif (this.section().toLowerCase() == name) {\r\n\t\t\t// 代码块高亮\r\n\t\t\tif (name == 'pre') {\r\n\t\t\t\tthis.data = this.data.substr(0, j + 1) + cfg.highlight(this.data.substring(j + 1, this.i - 5), node.attrs) + this.data\r\n\t\t\t\t\t.substr(this.i - 5);\r\n\t\t\t\treturn this.i = j;\r\n\t\t\t} else if (name == 'style')\r\n\t\t\t\tthis.CssHandler.getStyle(this.data.substring(j + 1, this.i - 7));\r\n\t\t\telse if (name == 'title')\r\n\t\t\t\tthis.DOM.title = this.data.substring(j + 1, this.i - 7);\r\n\t\t\tif ((this.i = this.data.indexOf('>', this.i)) == -1) this.i = this.data.length;\r\n\t\t\tif (name == 'svg') handleSvg();\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n// 节点出栈处理\r\nMpHtmlParser.prototype.popNode = function(node) {\r\n\t// 空白符处理\r\n\tif (node.pre) {\r\n\t\tnode.pre = this.pre = void 0;\r\n\t\tfor (let i = this.STACK.length; i--;)\r\n\t\t\tif (this.STACK[i].pre)\r\n\t\t\t\tthis.pre = true;\r\n\t}\r\n\tvar siblings = this.siblings(),\r\n\t\tlen = siblings.length,\r\n\t\tchilds = node.children;\r\n\tif (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false))\r\n\t\treturn siblings.pop();\r\n\tvar attrs = node.attrs;\r\n\t// 替换一些标签名\r\n\tif (cfg.blockTags[node.name]) node.name = 'div';\r\n\telse if (!cfg.trustTags[node.name]) node.name = 'span';\r\n\t// 处理列表\r\n\tif (node.c && (node.name == 'ul' || node.name == 'ol')) {\r\n\t\tif ((node.attrs.style || '').includes('list-style:none')) {\r\n\t\t\tfor (let i = 0, child; child = childs[i++];)\r\n\t\t\t\tif (child.name == 'li')\r\n\t\t\t\t\tchild.name = 'div';\r\n\t\t} else if (node.name == 'ul') {\r\n\t\t\tvar floor = 1;\r\n\t\t\tfor (let i = this.STACK.length; i--;)\r\n\t\t\t\tif (this.STACK[i].name == 'ul') floor++;\r\n\t\t\tif (floor != 1)\r\n\t\t\t\tfor (let i = childs.length; i--;)\r\n\t\t\t\t\tchilds[i].floor = floor;\r\n\t\t} else {\r\n\t\t\tfor (let i = 0, num = 1, child; child = childs[i++];)\r\n\t\t\t\tif (child.name == 'li') {\r\n\t\t\t\t\tchild.type = 'ol';\r\n\t\t\t\t\tchild.num = ((num, type) => {\r\n\t\t\t\t\t\tif (type == 'a') return String.fromCharCode(97 + (num - 1) % 26);\r\n\t\t\t\t\t\tif (type == 'A') return String.fromCharCode(65 + (num - 1) % 26);\r\n\t\t\t\t\t\tif (type == 'i' || type == 'I') {\r\n\t\t\t\t\t\t\tnum = (num - 1) % 99 + 1;\r\n\t\t\t\t\t\t\tvar one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],\r\n\t\t\t\t\t\t\t\tten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],\r\n\t\t\t\t\t\t\t\tres = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || '');\r\n\t\t\t\t\t\t\tif (type == 'i') return res.toLowerCase();\r\n\t\t\t\t\t\t\treturn res;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn num;\r\n\t\t\t\t\t})(num++, attrs.type) + '.';\r\n\t\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// 处理表格的边框\r\n\tif (node.name == 'table') {\r\n\t\tvar padding = attrs.cellpadding,\r\n\t\t\tspacing = attrs.cellspacing,\r\n\t\t\tborder = attrs.border;\r\n\t\tif (node.c) {\r\n\t\t\tthis.bubble();\r\n\t\t\tattrs.style = (attrs.style || '') + ';display:table';\r\n\t\t\tif (!padding) padding = 2;\r\n\t\t\tif (!spacing) spacing = 2;\r\n\t\t}\r\n\t\tif (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`;\r\n\t\tif (spacing) attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`;\r\n\t\tif (border || padding || node.c)\r\n\t\t\t(function f(ns) {\r\n\t\t\t\tfor (var i = 0, n; n = ns[i]; i++) {\r\n\t\t\t\t\tif (n.type == 'text') continue;\r\n\t\t\t\t\tvar style = n.attrs.style || '';\r\n\t\t\t\t\tif (node.c && n.name[0] == 't') {\r\n\t\t\t\t\t\tn.c = 1;\r\n\t\t\t\t\t\tstyle += ';display:table-' + (n.name == 'th' || n.name == 'td' ? 'cell' : (n.name == 'tr' ? 'row' : 'row-group'));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n.name == 'th' || n.name == 'td') {\r\n\t\t\t\t\t\tif (border) style = `border:${border}px solid gray;${style}`;\r\n\t\t\t\t\t\tif (padding) style = `padding:${padding}px;${style}`;\r\n\t\t\t\t\t} else f(n.children || []);\r\n\t\t\t\t\tif (style) n.attrs.style = style;\r\n\t\t\t\t}\r\n\t\t\t})(childs)\r\n\t\tif (this.options.autoscroll) {\r\n\t\t\tvar table = Object.assign({}, node);\r\n\t\t\tnode.name = 'div';\r\n\t\t\tnode.attrs = {\r\n\t\t\t\tstyle: 'overflow:scroll'\r\n\t\t\t}\r\n\t\t\tnode.children = [table];\r\n\t\t}\r\n\t}\r\n\tthis.CssHandler.pop && this.CssHandler.pop(node);\r\n\t// 自动压缩\r\n\tif (node.name == 'div' && !Object.keys(attrs).length && childs.length == 1 && childs[0].name == 'div')\r\n\t\tsiblings[len - 1] = childs[0];\r\n}\r\n// 状态机\r\nMpHtmlParser.prototype.Text = function(c) {\r\n\tif (c == '<') {\r\n\t\tvar next = this.data[this.i + 1],\r\n\t\t\tisLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\r\n\t\tif (isLetter(next)) {\r\n\t\t\tthis.setText();\r\n\t\t\tthis.start = this.i + 1;\r\n\t\t\tthis.state = this.TagName;\r\n\t\t} else if (next == '/') {\r\n\t\t\tthis.setText();\r\n\t\t\tif (isLetter(this.data[++this.i + 1])) {\r\n\t\t\t\tthis.start = this.i + 1;\r\n\t\t\t\tthis.state = this.EndTag;\r\n\t\t\t} else this.Comment();\r\n\t\t} else if (next == '!' || next == '?') {\r\n\t\t\tthis.setText();\r\n\t\t\tthis.Comment();\r\n\t\t}\r\n\t}\r\n}\r\nMpHtmlParser.prototype.Comment = function() {\r\n\tvar key;\r\n\tif (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->';\r\n\telse if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>';\r\n\telse key = '>';\r\n\tif ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length;\r\n\telse this.i += key.length - 1;\r\n\tthis.start = this.i + 1;\r\n\tthis.state = this.Text;\r\n}\r\nMpHtmlParser.prototype.TagName = function(c) {\r\n\tif (blankChar[c]) {\r\n\t\tthis.tagName = this.section();\r\n\t\twhile (blankChar[this.data[this.i]]) this.i++;\r\n\t\tif (this.isClose()) this.setNode();\r\n\t\telse {\r\n\t\t\tthis.start = this.i;\r\n\t\t\tthis.state = this.AttrName;\r\n\t\t}\r\n\t} else if (this.isClose()) {\r\n\t\tthis.tagName = this.section();\r\n\t\tthis.setNode();\r\n\t}\r\n}\r\nMpHtmlParser.prototype.AttrName = function(c) {\r\n\tif (c == '=' || blankChar[c] || this.isClose()) {\r\n\t\tthis.attrName = this.section();\r\n\t\tif (blankChar[c])\r\n\t\t\twhile (blankChar[this.data[++this.i]]);\r\n\t\tif (this.data[this.i] == '=') {\r\n\t\t\twhile (blankChar[this.data[++this.i]]);\r\n\t\t\tthis.start = this.i--;\r\n\t\t\tthis.state = this.AttrValue;\r\n\t\t} else this.setAttr();\r\n\t}\r\n}\r\nMpHtmlParser.prototype.AttrValue = function(c) {\r\n\tif (c == '\"' || c == \"'\") {\r\n\t\tthis.start++;\r\n\t\tif ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length;\r\n\t\tthis.attrVal = this.section();\r\n\t\tthis.i++;\r\n\t} else {\r\n\t\tfor (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++);\r\n\t\tthis.attrVal = this.section();\r\n\t}\r\n\tthis.setAttr();\r\n}\r\nMpHtmlParser.prototype.EndTag = function(c) {\r\n\tif (blankChar[c] || c == '>' || c == '/') {\r\n\t\tvar name = this.section().toLowerCase();\r\n\t\tfor (var i = this.STACK.length; i--;)\r\n\t\t\tif (this.STACK[i].name == name) break;\r\n\t\tif (i != -1) {\r\n\t\t\tvar node;\r\n\t\t\twhile ((node = this.STACK.pop()).name != name) this.popNode(node);\r\n\t\t\tthis.popNode(node);\r\n\t\t} else if (name == 'p' || name == 'br')\r\n\t\t\tthis.siblings().push({\r\n\t\t\t\tname,\r\n\t\t\t\tattrs: {}\r\n\t\t\t});\r\n\t\tthis.i = this.data.indexOf('>', this.i);\r\n\t\tthis.start = this.i + 1;\r\n\t\tif (this.i == -1) this.i = this.data.length;\r\n\t\telse this.state = this.Text;\r\n\t}\r\n}\r\nmodule.exports = MpHtmlParser;\r\n"
  },
  {
    "path": "uview-ui/components/u-parse/libs/config.js",
    "content": "/* 配置文件 */\r\nvar cfg = {\r\n\t// 出错占位图\r\n\terrorImg: null,\r\n\t// 过滤器函数\r\n\tfilter: null,\r\n\t// 代码高亮函数\r\n\thighlight: null,\r\n\t// 文本处理函数\r\n\tonText: null,\r\n\t// 实体编码列表\r\n\tentities: {\r\n\t\tquot: '\"',\r\n\t\tapos: \"'\",\r\n\t\tsemi: ';',\r\n\t\tnbsp: '\\xA0',\r\n\t\tensp: '\\u2002',\r\n\t\temsp: '\\u2003',\r\n\t\tndash: '–',\r\n\t\tmdash: '—',\r\n\t\tmiddot: '·',\r\n\t\tlsquo: '‘',\r\n\t\trsquo: '’',\r\n\t\tldquo: '“',\r\n\t\trdquo: '”',\r\n\t\tbull: '•',\r\n\t\thellip: '…'\r\n\t},\r\n\tblankChar: makeMap(' ,\\xA0,\\t,\\r,\\n,\\f'),\r\n\tboolAttrs: makeMap('allowfullscreen,autoplay,autostart,controls,ignore,loop,muted'),\r\n\t// 块级标签，将被转为 div\r\n\tblockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),\r\n\t// 将被移除的标签\r\n\tignoreTags: makeMap('area,base,canvas,frame,iframe,input,link,map,meta,param,script,source,style,svg,textarea,title,track,wbr'),\r\n\t// 只能被 rich-text 显示的标签\r\n\trichOnlyTags: makeMap('a,colgroup,fieldset,legend,table'),\r\n\t// 自闭合的标签\r\n\tselfClosingTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),\r\n\t// 信任的标签\r\n\ttrustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),\r\n\t// 默认的标签样式\r\n\tuserAgentStyles: {\r\n\t\taddress: 'font-style:italic',\r\n\t\tbig: 'display:inline;font-size:1.2em',\r\n\t\tblockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px',\r\n\t\tcaption: 'display:table-caption;text-align:center',\r\n\t\tcenter: 'text-align:center',\r\n\t\tcite: 'font-style:italic',\r\n\t\tdd: 'margin-left:40px',\r\n\t\tmark: 'background-color:yellow',\r\n\t\tpre: 'font-family:monospace;white-space:pre;overflow:scroll',\r\n\t\ts: 'text-decoration:line-through',\r\n\t\tsmall: 'display:inline;font-size:0.8em',\r\n\t\tu: 'text-decoration:underline'\r\n\t}\r\n}\r\n\r\nfunction makeMap(str) {\r\n\tvar map = Object.create(null),\r\n\t\tlist = str.split(',');\r\n\tfor (var i = list.length; i--;)\r\n\t\tmap[list[i]] = true;\r\n\treturn map;\r\n}\r\n\r\n// #ifdef MP-WEIXIN\r\nif (wx.canIUse('editor')) {\r\n\tcfg.blockTags.pre = void 0;\r\n\tcfg.ignoreTags.rp = true;\r\n\tObject.assign(cfg.richOnlyTags, makeMap('bdi,bdo,caption,rt,ruby'));\r\n\tObject.assign(cfg.trustTags, makeMap('bdi,bdo,caption,pre,rt,ruby'));\r\n}\r\n// #endif\r\n\r\n// #ifdef APP-PLUS\r\ncfg.ignoreTags.iframe = void 0;\r\nObject.assign(cfg.trustTags, makeMap('embed,iframe'));\r\n// #endif\r\n\r\nmodule.exports = cfg;\r\n"
  },
  {
    "path": "uview-ui/components/u-parse/libs/handler.wxs",
    "content": "var inline = {\r\n\tabbr: 1,\r\n\tb: 1,\r\n\tbig: 1,\r\n\tcode: 1,\r\n\tdel: 1,\r\n\tem: 1,\r\n\ti: 1,\r\n\tins: 1,\r\n\tlabel: 1,\r\n\tq: 1,\r\n\tsmall: 1,\r\n\tspan: 1,\r\n\tstrong: 1,\r\n\tsub: 1,\r\n\tsup: 1\r\n}\r\nmodule.exports = {\r\n\tuse: function(item) {\r\n\t\treturn !item.c && !inline[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1\r\n\t}\r\n}\n"
  },
  {
    "path": "uview-ui/components/u-parse/libs/trees.vue",
    "content": "<template>\r\n\t<view :class=\"'interlayer '+(c||'')\" :style=\"s\">\r\n\t\t<block v-for=\"(n, i) in nodes\" v-bind:key=\"i\">\r\n\t\t\t<!--图片-->\r\n\t\t\t<view v-if=\"n.name=='img'\" :class=\"'_img '+n.attrs.class\" :style=\"n.attrs.style\" :data-attrs=\"n.attrs\" @tap=\"imgtap\">\r\n\t\t\t\t<rich-text v-if=\"ctrl[i]!=0\" :nodes=\"[{attrs:{src:loading&&(ctrl[i]||0)<2?loading:(lazyLoad&&!ctrl[i]?placeholder:(ctrl[i]==3?errorImg: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'}]\" />\r\n\t\t\t\t<image class=\"_image\" :src=\"lazyLoad&&!ctrl[i]?placeholder:n.attrs.src\" :lazy-load=\"lazyLoad\"\r\n\t\t\t\t :show-menu-by-longpress=\"!n.attrs.ignore\" :data-i=\"i\" :data-index=\"n.attrs.i\" data-source=\"img\" @load=\"loadImg\"\r\n\t\t\t\t @error=\"error\" />\r\n\t\t\t</view>\r\n\t\t\t<!--文本-->\r\n\t\t\t<text v-else-if=\"n.type=='text'\" decode>{{n.text}}</text>\r\n\t\t\t<!--#ifndef MP-BAIDU-->\r\n\t\t\t<text v-else-if=\"n.name=='br'\">\\n</text>\r\n\t\t\t<!--#endif-->\r\n\t\t\t<!--视频-->\r\n\t\t\t<view v-else-if=\"((n.lazyLoad&&!n.attrs.autoplay)||(n.name=='video'&&!loadVideo))&&ctrl[i]==undefined\" :id=\"n.attrs.id\" :class=\"'_video '+(n.attrs.class||'')\"\r\n\t\t\t :style=\"n.attrs.style\" :data-i=\"i\" @tap=\"_loadVideo\" />\r\n\t\t\t<video v-else-if=\"n.name=='video'\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :autoplay=\"n.attrs.autoplay||ctrl[i]==0\"\r\n\t\t\t :controls=\"n.attrs.controls\" :loop=\"n.attrs.loop\" :muted=\"n.attrs.muted\" :poster=\"n.attrs.poster\" :src=\"n.attrs.source[ctrl[i]||0]\"\r\n\t\t\t :unit-id=\"n.attrs['unit-id']\" :data-id=\"n.attrs.id\" :data-i=\"i\" data-source=\"video\" @error=\"error\" @play=\"play\" />\r\n\t\t\t<!--音频-->\r\n\t\t\t<audio v-else-if=\"n.name=='audio'\" :ref=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :author=\"n.attrs.author\"\r\n\t\t\t :autoplay=\"n.attrs.autoplay\" :controls=\"n.attrs.controls\" :loop=\"n.attrs.loop\" :name=\"n.attrs.name\" :poster=\"n.attrs.poster\"\r\n\t\t\t :src=\"n.attrs.source[ctrl[i]||0]\" :data-i=\"i\" :data-id=\"n.attrs.id\" data-source=\"audio\"\r\n\t\t\t @error.native=\"error\" @play.native=\"play\" />\r\n\t\t\t<!--链接-->\r\n\t\t\t<view v-else-if=\"n.name=='a'\" :id=\"n.attrs.id\" :class=\"'_a '+(n.attrs.class||'')\" hover-class=\"_hover\" :style=\"n.attrs.style\"\r\n\t\t\t :data-attrs=\"n.attrs\" @tap=\"linkpress\">\r\n\t\t\t\t<trees class=\"_span\" c=\"_span\" :nodes=\"n.children\" />\r\n\t\t\t</view>\r\n\t\t\t<!--广告-->\r\n\t\t\t<!--<ad v-else-if=\"n.name=='ad'\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :unit-id=\"n.attrs['unit-id']\" :appid=\"n.attrs.appid\" :apid=\"n.attrs.apid\" :type=\"n.attrs.type\" :adpid=\"n.attrs.adpid\" data-source=\"ad\" @error=\"error\" />-->\r\n\t\t\t<!--列表-->\r\n\t\t\t<view v-else-if=\"n.name=='li'\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"(n.attrs.style||'')+';display:flex;flex-direction:row'\">\r\n\t\t\t\t<view v-if=\"n.type=='ol'\" class=\"_ol-bef\">{{n.num}}</view>\r\n\t\t\t\t<view v-else class=\"_ul-bef\">\r\n\t\t\t\t\t<view v-if=\"n.floor%3==0\" class=\"_ul-p1\">█</view>\r\n\t\t\t\t\t<view v-else-if=\"n.floor%3==2\" class=\"_ul-p2\" />\r\n\t\t\t\t\t<view v-else class=\"_ul-p1\" style=\"border-radius:50%\">█</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<trees class=\"_li\" c=\"_li\" :nodes=\"n.children\" :lazyLoad=\"lazyLoad\" :loading=\"loading\" />\r\n\t\t\t</view>\r\n\t\t\t<!--表格-->\r\n\t\t\t<view v-else-if=\"n.name=='table'&&n.c\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"(n.attrs.style||'')+';display:table'\">\r\n\t\t\t\t<view v-for=\"(tbody, o) in n.children\" v-bind:key=\"o\" :class=\"tbody.attrs.class\" :style=\"(tbody.attrs.style||'')+(tbody.name[0]=='t'?';display:table-'+(tbody.name=='tr'?'row':'row-group'):'')\">\r\n\t\t\t\t\t<view v-for=\"(tr, p) in tbody.children\" v-bind:key=\"p\" :class=\"tr.attrs.class\" :style=\"(tr.attrs.style||'')+(tr.name[0]=='t'?';display:table-'+(tr.name=='tr'?'row':'cell'):'')\">\r\n\t\t\t\t\t\t<trees v-if=\"tr.name=='td'\" :nodes=\"tr.children\" />\r\n\t\t\t\t\t\t<trees v-else v-for=\"(td, q) in tr.children\" v-bind:key=\"q\" :class=\"td.attrs.class\" :c=\"td.attrs.class\" :style=\"(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')\"\r\n\t\t\t\t\t\t :s=\"(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')\" :nodes=\"td.children\" />\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<!--#ifdef APP-PLUS-->\r\n\t\t\t<iframe v-else-if=\"n.name=='iframe'\" :style=\"n.attrs.style\" :allowfullscreen=\"n.attrs.allowfullscreen\" :frameborder=\"n.attrs.frameborder\"\r\n\t\t\t :width=\"n.attrs.width\" :height=\"n.attrs.height\" :src=\"n.attrs.src\" />\r\n\t\t\t<embed v-else-if=\"n.name=='embed'\" :style=\"n.attrs.style\" :width=\"n.attrs.width\" :height=\"n.attrs.height\" :src=\"n.attrs.src\" />\r\n\t\t\t<!--#endif-->\r\n\t\t\t<!--富文本-->\r\n\t\t\t<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->\r\n\t\t\t<rich-text v-else-if=\"handler.use(n)\" :id=\"n.attrs.id\" :class=\"'_p __'+n.name\" :nodes=\"[n]\" />\r\n\t\t\t<!--#endif-->\r\n\t\t\t<!--#ifndef MP-WEIXIN || MP-QQ || APP-PLUS-->\r\n\t\t\t<rich-text v-else-if=\"!n.c\" :id=\"n.attrs.id\" :nodes=\"[n]\" style=\"display:inline\" />\r\n\t\t\t<!--#endif-->\r\n\t\t\t<trees v-else :class=\"(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')\" :c=\"(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')\"\r\n\t\t\t :style=\"n.attrs.style\" :s=\"n.attrs.style\" :nodes=\"n.children\" :lazyLoad=\"lazyLoad\" :loading=\"loading\" />\r\n\t\t</block>\r\n\t</view>\r\n</template>\r\n<script module=\"handler\" lang=\"wxs\" src=\"./handler.wxs\"></script>\r\n<script>\r\n\tglobal.Parser = {};\r\n\timport trees from './trees'\r\n\tconst errorImg = require('../libs/config.js').errorImg;\r\n\texport default {\r\n\t\tcomponents: {\r\n\t\t\ttrees\r\n\t\t},\r\n\t\tname: 'trees',\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tctrl: [],\r\n\t\t\t\tplaceholder: 'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"300\" height=\"225\"/>',\r\n\t\t\t\terrorImg,\r\n\t\t\t\tloadVideo: typeof plus == 'undefined',\r\n\t\t\t\t// #ifndef MP-ALIPAY\r\n\t\t\t\tc: '',\r\n\t\t\t\ts: ''\r\n\t\t\t\t// #endif\r\n\t\t\t}\r\n\t\t},\r\n\t\tprops: {\r\n\t\t\tnodes: Array,\r\n\t\t\tlazyLoad: Boolean,\r\n\t\t\tloading: String,\r\n\t\t\t// #ifdef MP-ALIPAY\r\n\t\t\tc: String,\r\n\t\t\ts: String\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tfor (this.top = this.$parent; this.top.$options.name != 'parser'; this.top = this.top.$parent);\r\n\t\t\tthis.init();\r\n\t\t},\r\n\t\t// #ifdef APP-PLUS\r\n\t\tbeforeDestroy() {\r\n\t\t\tthis.observer && this.observer.disconnect();\r\n\t\t},\r\n\t\t// #endif\r\n\t\tmethods: {\r\n\t\t\tinit() {\r\n\t\t\t\tfor (var i = this.nodes.length, n; n = this.nodes[--i];) {\r\n\t\t\t\t\tif (n.name == 'img') {\r\n\t\t\t\t\t\tthis.top.imgList.setItem(n.attrs.i, n.attrs.src);\r\n\t\t\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\t\t\tif (this.lazyLoad && !this.observer) {\r\n\t\t\t\t\t\t\tthis.observer = uni.createIntersectionObserver(this).relativeToViewport({\r\n\t\t\t\t\t\t\t\ttop: 500,\r\n\t\t\t\t\t\t\t\tbottom: 500\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\t\tthis.observer.observe('._img', res => {\r\n\t\t\t\t\t\t\t\t\tif (res.intersectionRatio) {\r\n\t\t\t\t\t\t\t\t\t\tfor (var j = this.nodes.length; j--;)\r\n\t\t\t\t\t\t\t\t\t\t\tif (this.nodes[j].name == 'img')\r\n\t\t\t\t\t\t\t\t\t\t\t\tthis.$set(this.ctrl, j, 1);\r\n\t\t\t\t\t\t\t\t\t\tthis.observer.disconnect();\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}, 0)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t} else if (n.name == 'video' || n.name == 'audio') {\r\n\t\t\t\t\t\tvar ctx;\r\n\t\t\t\t\t\tif (n.name == 'video') {\r\n\t\t\t\t\t\t\tctx = uni.createVideoContext(n.attrs.id\r\n\t\t\t\t\t\t\t\t// #ifndef MP-BAIDU\r\n\t\t\t\t\t\t\t\t, this\r\n\t\t\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t} else if (this.$refs[n.attrs.id])\r\n\t\t\t\t\t\t\tctx = this.$refs[n.attrs.id][0];\r\n\t\t\t\t\t\tif (ctx) {\r\n\t\t\t\t\t\t\tctx.id = n.attrs.id;\r\n\t\t\t\t\t\t\tthis.top.videoContexts.push(ctx);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\t// APP 上避免 video 错位需要延时渲染\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.loadVideo = true;\r\n\t\t\t\t}, 1000)\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t\tplay(e) {\r\n\t\t\t\tvar contexts = this.top.videoContexts;\r\n\t\t\t\tif (contexts.length > 1 && this.top.autopause)\r\n\t\t\t\t\tfor (var i = contexts.length; i--;)\r\n\t\t\t\t\t\tif (contexts[i].id != e.currentTarget.dataset.id)\r\n\t\t\t\t\t\t\tcontexts[i].pause();\r\n\t\t\t},\r\n\t\t\timgtap(e) {\r\n\t\t\t\tvar attrs = e.currentTarget.dataset.attrs;\r\n\t\t\t\tif (!attrs.ignore) {\r\n\t\t\t\t\tvar preview = true,\r\n\t\t\t\t\t\tdata = {\r\n\t\t\t\t\t\t\tid: e.target.id,\r\n\t\t\t\t\t\t\tsrc: attrs.src,\r\n\t\t\t\t\t\t\tignore: () => preview = false\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\tglobal.Parser.onImgtap && global.Parser.onImgtap(data);\r\n\t\t\t\t\tthis.top.$emit('imgtap', data);\r\n\t\t\t\t\tif (preview) {\r\n\t\t\t\t\t\tvar urls = this.top.imgList,\r\n\t\t\t\t\t\t\tcurrent = urls[attrs.i] ? parseInt(attrs.i) : (urls = [attrs.src], 0);\r\n\t\t\t\t\t\tuni.previewImage({\r\n\t\t\t\t\t\t\tcurrent,\r\n\t\t\t\t\t\t\turls\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tloadImg(e) {\r\n\t\t\t\tvar i = e.currentTarget.dataset.i;\r\n\t\t\t\tif (this.lazyLoad && !this.ctrl[i]) {\r\n\t\t\t\t\t// #ifdef QUICKAPP-WEBVIEW\r\n\t\t\t\t\tthis.$set(this.ctrl, i, 0);\r\n\t\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t// #ifndef APP-PLUS\r\n\t\t\t\t\t\tthis.$set(this.ctrl, i, 1);\r\n\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t// #ifdef QUICKAPP-WEBVIEW\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t} else if (this.loading && this.ctrl[i] != 2) {\r\n\t\t\t\t\t// #ifdef QUICKAPP-WEBVIEW\r\n\t\t\t\t\tthis.$set(this.ctrl, i, 0);\r\n\t\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\tthis.$set(this.ctrl, i, 2);\r\n\t\t\t\t\t\t// #ifdef QUICKAPP-WEBVIEW\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tlinkpress(e) {\r\n\t\t\t\tvar jump = true,\r\n\t\t\t\t\tattrs = e.currentTarget.dataset.attrs;\r\n\t\t\t\tattrs.ignore = () => jump = false;\r\n\t\t\t\tglobal.Parser.onLinkpress && global.Parser.onLinkpress(attrs);\r\n\t\t\t\tthis.top.$emit('linkpress', attrs);\r\n\t\t\t\tif (jump) {\r\n\t\t\t\t\t// #ifdef MP\r\n\t\t\t\t\tif (attrs['app-id']) {\r\n\t\t\t\t\t\treturn uni.navigateToMiniProgram({\r\n\t\t\t\t\t\t\tappId: attrs['app-id'],\r\n\t\t\t\t\t\t\tpath: attrs.path\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\tif (attrs.href) {\r\n\t\t\t\t\t\tif (attrs.href[0] == '#') {\r\n\t\t\t\t\t\t\tif (this.top.useAnchor)\r\n\t\t\t\t\t\t\t\tthis.top.navigateTo({\r\n\t\t\t\t\t\t\t\t\tid: attrs.href.substring(1)\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t} else if (attrs.href.indexOf('http') == 0 || attrs.href.indexOf('//') == 0) {\r\n\t\t\t\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\t\t\t\tplus.runtime.openWeb(attrs.href);\r\n\t\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t\t// #ifndef APP-PLUS\r\n\t\t\t\t\t\t\tuni.setClipboardData({\r\n\t\t\t\t\t\t\t\tdata: attrs.href,\r\n\t\t\t\t\t\t\t\tsuccess: () =>\r\n\t\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\t\ttitle: '链接已复制'\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t} else\r\n\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\turl: attrs.href,\r\n\t\t\t\t\t\t\t\tfail() {\r\n\t\t\t\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\t\t\t\turl: attrs.href,\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\terror(e) {\r\n\t\t\t\tvar target = e.currentTarget,\r\n\t\t\t\t\tsource = target.dataset.source,\r\n\t\t\t\t\ti = target.dataset.i;\r\n\t\t\t\tif (source == 'video' || source == 'audio') {\r\n\t\t\t\t\t// 加载其他 source\r\n\t\t\t\t\tvar index = this.ctrl[i] ? this.ctrl[i].i + 1 : 1;\r\n\t\t\t\t\tif (index < this.nodes[i].attrs.source.length)\r\n\t\t\t\t\t\tthis.$set(this.ctrl, i, index);\r\n\t\t\t\t\tif (e.detail.__args__)\r\n\t\t\t\t\t\te.detail = e.detail.__args__[0];\r\n\t\t\t\t} else if (errorImg && source == 'img') {\r\n\t\t\t\t\tthis.top.imgList.setItem(target.dataset.index, errorImg);\r\n\t\t\t\t\tthis.$set(this.ctrl, i, 3);\r\n\t\t\t\t}\r\n\t\t\t\tthis.top && this.top.$emit('error', {\r\n\t\t\t\t\tsource,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\terrMsg: e.detail.errMsg\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t_loadVideo(e) {\r\n\t\t\t\tthis.$set(this.ctrl, e.target.dataset.i, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style>\r\n\t/* 在这里引入自定义样式 */\r\n\r\n\t/* 链接和图片效果 */\r\n\t._a {\r\n\t\tdisplay: inline;\r\n\t\tpadding: 1.5px 0 1.5px 0;\r\n\t\tcolor: #366092;\r\n\t\tword-break: break-all;\r\n\t}\r\n\r\n\t._hover {\r\n\t\ttext-decoration: underline;\r\n\t\topacity: 0.7;\r\n\t}\r\n\r\n\t._img {\r\n\t\tdisplay: inline-block;\r\n\t\tmax-width: 100%;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* #ifdef MP-WEIXIN */\r\n\t:host {\r\n\t\tdisplay: inline;\r\n\t}\r\n\r\n\t/* #endif */\r\n\r\n\t/* #ifndef MP-ALIPAY || APP-PLUS */\r\n\t.interlayer {\r\n\t\tdisplay: inherit;\r\n\t\tflex-direction: inherit;\r\n\t\tflex-wrap: inherit;\r\n\t\talign-content: inherit;\r\n\t\talign-items: inherit;\r\n\t\tjustify-content: inherit;\r\n\t\twidth: 100%;\r\n\t\twhite-space: inherit;\r\n\t}\r\n\r\n\t/* #endif */\r\n\r\n\t._b,\r\n\t._strong {\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t/* #ifndef MP-ALIPAY */\r\n\t._blockquote,\r\n\t._div,\r\n\t._p,\r\n\t._ol,\r\n\t._ul,\r\n\t._li {\r\n\t\tdisplay: block;\r\n\t}\r\n\t\r\n\t/* #endif */\r\n\r\n\t._code {\r\n\t\tfont-family: monospace;\r\n\t}\r\n\r\n\t._del {\r\n\t\ttext-decoration: line-through;\r\n\t}\r\n\r\n\t._em,\r\n\t._i {\r\n\t\tfont-style: italic;\r\n\t}\r\n\r\n\t._h1 {\r\n\t\tfont-size: 2em;\r\n\t}\r\n\r\n\t._h2 {\r\n\t\tfont-size: 1.5em;\r\n\t}\r\n\r\n\t._h3 {\r\n\t\tfont-size: 1.17em;\r\n\t}\r\n\r\n\t._h5 {\r\n\t\tfont-size: 0.83em;\r\n\t}\r\n\r\n\t._h6 {\r\n\t\tfont-size: 0.67em;\r\n\t}\r\n\r\n\t._h1,\r\n\t._h2,\r\n\t._h3,\r\n\t._h4,\r\n\t._h5,\r\n\t._h6 {\r\n\t\tdisplay: block;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t._image {\r\n\t\tdisplay: block;\r\n\t\twidth: 100%;\r\n\t\theight: 360px;\r\n\t\tmargin-top: -360px;\r\n\t\topacity: 0;\r\n\t}\r\n\r\n\t._ins {\r\n\t\ttext-decoration: underline;\r\n\t}\r\n\r\n\t._li {\r\n\t\tflex: 1;\r\n\t\twidth: 0;\r\n\t}\r\n\r\n\t._ol-bef {\r\n\t\twidth: 36px;\r\n\t\tmargin-right: 5px;\r\n\t\ttext-align: right;\r\n\t}\r\n\r\n\t._ul-bef {\r\n\t\tdisplay: block;\r\n\t\tmargin: 0 12px 0 23px;\r\n\t\tline-height: normal;\r\n\t}\r\n\r\n\t._ol-bef,\r\n\t._ul-bef {\r\n\t\tflex: none;\r\n\t\tuser-select: none;\r\n\t}\r\n\r\n\t._ul-p1 {\r\n\t\tdisplay: inline-block;\r\n\t\twidth: 0.3em;\r\n\t\theight: 0.3em;\r\n\t\toverflow: hidden;\r\n\t\tline-height: 0.3em;\r\n\t}\r\n\r\n\t._ul-p2 {\r\n\t\tdisplay: inline-block;\r\n\t\twidth: 0.23em;\r\n\t\theight: 0.23em;\r\n\t\tborder: 0.05em solid black;\r\n\t\tborder-radius: 50%;\r\n\t}\r\n\r\n\t._q::before {\r\n\t\tcontent: '\"';\r\n\t}\r\n\r\n\t._q::after {\r\n\t\tcontent: '\"';\r\n\t}\r\n\r\n\t._sub {\r\n\t\tfont-size: smaller;\r\n\t\tvertical-align: sub;\r\n\t}\r\n\r\n\t._sup {\r\n\t\tfont-size: smaller;\r\n\t\tvertical-align: super;\r\n\t}\r\n\r\n\t/* #ifdef MP-ALIPAY || APP-PLUS || QUICKAPP-WEBVIEW */\r\n\t._abbr,\r\n\t._b,\r\n\t._code,\r\n\t._del,\r\n\t._em,\r\n\t._i,\r\n\t._ins,\r\n\t._label,\r\n\t._q,\r\n\t._span,\r\n\t._strong,\r\n\t._sub,\r\n\t._sup {\r\n\t\tdisplay: inline;\r\n\t}\r\n\r\n\t/* #endif */\r\n\r\n\t/* #ifdef MP-WEIXIN || MP-QQ */\r\n\t.__bdo,\r\n\t.__bdi,\r\n\t.__ruby,\r\n\t.__rt {\r\n\t\tdisplay: inline-block;\r\n\t}\r\n\r\n\t/* #endif */\r\n\t._video {\r\n\t\tposition: relative;\r\n\t\tdisplay: inline-block;\r\n\t\twidth: 300px;\r\n\t\theight: 225px;\r\n\t\tbackground-color: black;\r\n\t}\r\n\r\n\t._video::after {\r\n\t\tposition: absolute;\r\n\t\ttop: 50%;\r\n\t\tleft: 50%;\r\n\t\tmargin: -15px 0 0 -15px;\r\n\t\tcontent: '';\r\n\t\tborder-color: transparent transparent transparent white;\r\n\t\tborder-style: solid;\r\n\t\tborder-width: 15px 0 15px 30px;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-parse/u-parse.vue",
    "content": "<template>\r\n\t<view>\r\n\t\t<slot v-if=\"!nodes.length\" />\r\n\t\t<!--#ifdef APP-PLUS-NVUE-->\r\n\t\t<web-view id=\"_top\" ref=\"web\" :style=\"'margin-top:-2px;height:'+height+'px'\" @onPostMessage=\"_message\" />\r\n\t\t<!--#endif-->\r\n\t\t<!--#ifndef APP-PLUS-NVUE-->\r\n\t\t<view id=\"_top\" :style=\"showAm+(selectable?';user-select:text;-webkit-user-select:text':'')\">\r\n\t\t\t<!--#ifdef H5 || MP-360-->\r\n\t\t\t<div :id=\"'rtf'+uid\"></div>\r\n\t\t\t<!--#endif-->\r\n\t\t\t<!--#ifndef H5 || MP-360-->\r\n\t\t\t<trees :nodes=\"nodes\" :lazyLoad=\"lazyLoad\" :loading=\"loadingImg\" />\r\n\t\t\t<!--#endif-->\r\n\t\t</view>\r\n\t\t<!--#endif-->\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t// #ifndef H5 || APP-PLUS-NVUE || MP-360\r\n\timport trees from './libs/trees';\r\n\tvar cache = {},\r\n\t\t// #ifdef MP-WEIXIN || MP-TOUTIAO\r\n\t\tfs = uni.getFileSystemManager ? uni.getFileSystemManager() : null,\r\n\t\t// #endif\r\n\t\tParser = require('./libs/MpHtmlParser.js');\r\n\tvar dom;\r\n\t// 计算 cache 的 key\r\n\tfunction hash(str) {\r\n\t\tfor (var i = str.length, val = 5381; i--;)\r\n\t\t\tval += (val << 5) + str.charCodeAt(i);\r\n\t\treturn val;\r\n\t}\r\n\t// #endif\r\n\t// #ifdef H5 || APP-PLUS-NVUE || MP-360\r\n\tvar windowWidth = uni.getSystemInfoSync().windowWidth,\r\n\t\tcfg = require('./libs/config.js');\r\n\t// #endif\r\n\t// #ifdef APP-PLUS-NVUE\r\n\tvar weexDom = weex.requireModule('dom');\r\n\t// #endif\r\n\t/**\r\n\t * Parser 富文本组件\r\n\t * @tutorial https://github.com/jin-yufeng/Parser\r\n\t * @property {String} html 富文本数据\r\n\t * @property {Boolean} autopause 是否在播放一个视频时自动暂停其他视频\r\n\t * @property {Boolean} autoscroll 是否自动给所有表格添加一个滚动层\r\n\t * @property {Boolean} autosetTitle 是否自动将 title 标签中的内容设置到页面标题\r\n\t * @property {Number} compress 压缩等级\r\n\t * @property {String} domain 图片、视频等链接的主域名\r\n\t * @property {Boolean} lazyLoad 是否开启图片懒加载\r\n\t * @property {String} loadingImg 图片加载完成前的占位图\r\n\t * @property {Boolean} selectable 是否开启长按复制\r\n\t * @property {Object} tagStyle 标签的默认样式\r\n\t * @property {Boolean} showWithAnimation 是否使用渐显动画\r\n\t * @property {Boolean} useAnchor 是否使用锚点\r\n\t * @property {Boolean} useCache 是否缓存解析结果\r\n\t * @event {Function} parse 解析完成事件\r\n\t * @event {Function} load dom 加载完成事件\r\n\t * @event {Function} ready 所有图片加载完毕事件\r\n\t * @event {Function} error 错误事件\r\n\t * @event {Function} imgtap 图片点击事件\r\n\t * @event {Function} linkpress 链接点击事件\r\n\t * @author JinYufeng\r\n\t * @version 20200728\r\n\t * @listens MIT\r\n\t */\r\n\texport default {\r\n\t\tname: 'parser',\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t// #ifdef H5 || MP-360\r\n\t\t\t\tuid: this._uid,\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\t\theight: 1,\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef APP-PLUS-NVUE\r\n\t\t\t\tshowAm: '',\r\n\t\t\t\t// #endif\r\n\t\t\t\tnodes: []\r\n\t\t\t}\r\n\t\t},\r\n\t\t// #ifndef H5 || APP-PLUS-NVUE || MP-360\r\n\t\tcomponents: {\r\n\t\t\ttrees\r\n\t\t},\r\n\t\t// #endif\r\n\t\tprops: {\r\n\t\t\thtml: String,\r\n\t\t\tautopause: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\tautoscroll: Boolean,\r\n\t\t\tautosetTitle: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// #ifndef H5 || APP-PLUS-NVUE || MP-360\r\n\t\t\tcompress: Number,\r\n\t\t\tloadingImg: String,\r\n\t\t\tuseCache: Boolean,\r\n\t\t\t// #endif\r\n\t\t\tdomain: String,\r\n\t\t\tlazyLoad: Boolean,\r\n\t\t\tselectable: Boolean,\r\n\t\t\ttagStyle: Object,\r\n\t\t\tshowWithAnimation: Boolean,\r\n\t\t\tuseAnchor: Boolean\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\thtml(html) {\r\n\t\t\t\tthis.setContent(html);\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 图片数组\r\n\t\t\tthis.imgList = [];\r\n\t\t\tthis.imgList.each = function(f) {\r\n\t\t\t\tfor (var i = 0, len = this.length; i < len; i++)\r\n\t\t\t\t\tthis.setItem(i, f(this[i], i, this));\r\n\t\t\t}\r\n\t\t\tthis.imgList.setItem = function(i, src) {\r\n\t\t\t\tif (i == void 0 || !src) return;\r\n\t\t\t\t// #ifndef MP-ALIPAY || APP-PLUS\r\n\t\t\t\t// 去重\r\n\t\t\t\tif (src.indexOf('http') == 0 && this.includes(src)) {\r\n\t\t\t\t\tvar newSrc = src.split('://')[0];\r\n\t\t\t\t\tfor (var j = newSrc.length, c; c = src[j]; j++) {\r\n\t\t\t\t\t\tif (c == '/' && src[j - 1] != '/' && src[j + 1] != '/') break;\r\n\t\t\t\t\t\tnewSrc += Math.random() > 0.5 ? c.toUpperCase() : c;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnewSrc += src.substr(j);\r\n\t\t\t\t\treturn this[i] = newSrc;\r\n\t\t\t\t}\r\n\t\t\t\t// #endif\r\n\t\t\t\tthis[i] = src;\r\n\t\t\t\t// 暂存 data src\r\n\t\t\t\tif (src.includes('data:image')) {\r\n\t\t\t\t\tvar filePath, info = src.match(/data:image\\/(\\S+?);(\\S+?),(.+)/);\r\n\t\t\t\t\tif (!info) return;\r\n\t\t\t\t\t// #ifdef MP-WEIXIN || MP-TOUTIAO\r\n\t\t\t\t\tfilePath = `${wx.env.USER_DATA_PATH}/${Date.now()}.${info[1]}`;\r\n\t\t\t\t\tfs && fs.writeFile({\r\n\t\t\t\t\t\tfilePath,\r\n\t\t\t\t\t\tdata: info[3],\r\n\t\t\t\t\t\tencoding: info[2],\r\n\t\t\t\t\t\tsuccess: () => this[i] = filePath\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\t\tfilePath = `_doc/parser_tmp/${Date.now()}.${info[1]}`;\r\n\t\t\t\t\tvar bitmap = new plus.nativeObj.Bitmap();\r\n\t\t\t\t\tbitmap.loadBase64Data(src, () => {\r\n\t\t\t\t\t\tbitmap.save(filePath, {}, () => {\r\n\t\t\t\t\t\t\tbitmap.clear()\r\n\t\t\t\t\t\t\tthis[i] = filePath;\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\t// #ifdef H5 || MP-360\r\n\t\t\tthis.document = document.getElementById('rtf' + this._uid);\r\n\t\t\t// #endif\r\n\t\t\t// #ifndef H5 || APP-PLUS-NVUE || MP-360\r\n\t\t\tif (dom) this.document = new dom(this);\r\n\t\t\t// #endif\r\n\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\tthis.document = this.$refs.web;\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t// #endif\r\n\t\t\t\tif (this.html) this.setContent(this.html);\r\n\t\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\t}, 30)\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\tbeforeDestroy() {\r\n\t\t\t// #ifdef H5 || MP-360\r\n\t\t\tif (this._observer) this._observer.disconnect();\r\n\t\t\t// #endif\r\n\t\t\tthis.imgList.each(src => {\r\n\t\t\t\t// #ifdef APP-PLUS\r\n\t\t\t\tif (src && src.includes('_doc')) {\r\n\t\t\t\t\tplus.io.resolveLocalFileSystemURL(src, entry => {\r\n\t\t\t\t\t\tentry.remove();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef MP-WEIXIN || MP-TOUTIAO\r\n\t\t\t\tif (src && src.includes(uni.env.USER_DATA_PATH))\r\n\t\t\t\t\tfs && fs.unlink({\r\n\t\t\t\t\t\tfilePath: src\r\n\t\t\t\t\t})\r\n\t\t\t\t// #endif\r\n\t\t\t})\r\n\t\t\tclearInterval(this._timer);\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 设置富文本内容\r\n\t\t\tsetContent(html, append) {\r\n\t\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\t\tif (!html)\r\n\t\t\t\t\treturn this.height = 1;\r\n\t\t\t\tif (append)\r\n\t\t\t\t\tthis.$refs.web.evalJs(\"var b=document.createElement('div');b.innerHTML='\" + html.replace(/'/g, \"\\\\'\") +\r\n\t\t\t\t\t\t\"';document.getElementById('parser').appendChild(b)\");\r\n\t\t\t\telse {\r\n\t\t\t\t\thtml =\r\n\t\t\t\t\t\t'<meta charset=\"utf-8\" /><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no\"><style>html,body{width:100%;height:100%;overflow:hidden}body{margin:0}</style><base href=\"' +\r\n\t\t\t\t\t\tthis.domain + '\"><div id=\"parser\"' + (this.selectable ? '>' : ' style=\"user-select:none\">') + this._handleHtml(html).replace(/\\n/g, '\\\\n') +\r\n\t\t\t\t\t\t'</div><script>\"use strict\";function e(e){if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){var t={data:[e]};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(t):window.__dcloud_weex_.postMessage(JSON.stringify(t))}}document.body.onclick=function(){e({action:\"click\"})},' +\r\n\t\t\t\t\t\t(this.showWithAnimation ? 'document.body.style.animation=\"_show .5s\",' : '') +\r\n\t\t\t\t\t\t'setTimeout(function(){e({action:\"load\",text:document.body.innerText,height:document.getElementById(\"parser\").scrollHeight})},50);\\x3c/script>';\r\n\t\t\t\t\tthis.$refs.web.evalJs(\"document.write('\" + html.replace(/'/g, \"\\\\'\") + \"');document.close()\");\r\n\t\t\t\t}\r\n\t\t\t\tthis.$refs.web.evalJs(\r\n\t\t\t\t\t'var t=document.getElementsByTagName(\"title\");t.length&&e({action:\"getTitle\",title:t[0].innerText});for(var o,n=document.getElementsByTagName(\"style\"),r=1;o=n[r++];)o.innerHTML=o.innerHTML.replace(/body/g,\"#parser\");for(var a,c=document.getElementsByTagName(\"img\"),s=[],i=0==c.length,d=0,l=0,g=0;a=c[l];l++)parseInt(a.style.width||a.getAttribute(\"width\"))>' +\r\n\t\t\t\t\twindowWidth + '&&(a.style.height=\"auto\"),a.onload=function(){++d==c.length&&(i=!0)},a.onerror=function(){++d==c.length&&(i=!0),' + (cfg.errorImg ? 'this.src=\"' + cfg.errorImg + '\",' : '') +\r\n\t\t\t\t\t'e({action:\"error\",source:\"img\",target:this})},a.hasAttribute(\"ignore\")||\"A\"==a.parentElement.nodeName||(a.i=g++,s.push(a.src),a.onclick=function(){e({action:\"preview\",img:{i:this.i,src:this.src}})});e({action:\"getImgList\",imgList:s});for(var u,m=document.getElementsByTagName(\"a\"),f=0;u=m[f];f++)u.onclick=function(){var t,o=this.getAttribute(\"href\");if(\"#\"==o[0]){var n=document.getElementById(o.substr(1));n&&(t=n.offsetTop)}return e({action:\"linkpress\",href:o,offset:t}),!1};for(var h,y=document.getElementsByTagName(\"video\"),v=0;h=y[v];v++)h.style.maxWidth=\"100%\",h.onerror=function(){e({action:\"error\",source:\"video\",target:this})}' +\r\n\t\t\t\t\t(this.autopause ? ',h.onplay=function(){for(var e,t=0;e=y[t];t++)e!=this&&e.pause()}' : '') +\r\n\t\t\t\t\t';for(var _,p=document.getElementsByTagName(\"audio\"),w=0;_=p[w];w++)_.onerror=function(){e({action:\"error\",source:\"audio\",target:this})};' +\r\n\t\t\t\t\t(this.autoscroll ? 'for(var T,E=document.getElementsByTagName(\"table\"),B=0;T=E[B];B++){var N=document.createElement(\"div\");N.style.overflow=\"scroll\",T.parentNode.replaceChild(N,T),N.appendChild(T)}' : '') +\r\n\t\t\t\t\t'var x=document.getElementById(\"parser\");clearInterval(window.timer),window.timer=setInterval(function(){i&&clearInterval(window.timer),e({action:\"ready\",ready:i,height:x.scrollHeight})},350)'\r\n\t\t\t\t)\r\n\t\t\t\tthis.nodes = [1];\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef H5 || MP-360\r\n\t\t\t\tif (!html) {\r\n\t\t\t\t\tif (this.rtf && !append) this.rtf.parentNode.removeChild(this.rtf);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar div = document.createElement('div');\r\n\t\t\t\tif (!append) {\r\n\t\t\t\t\tif (this.rtf) this.rtf.parentNode.removeChild(this.rtf);\r\n\t\t\t\t\tthis.rtf = div;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (!this.rtf) this.rtf = div;\r\n\t\t\t\t\telse this.rtf.appendChild(div);\r\n\t\t\t\t}\r\n\t\t\t\tdiv.innerHTML = this._handleHtml(html, append);\r\n\t\t\t\tfor (var styles = this.rtf.getElementsByTagName('style'), i = 0, style; style = styles[i++];) {\r\n\t\t\t\t\tstyle.innerHTML = style.innerHTML.replace(/body/g, '#rtf' + this._uid);\r\n\t\t\t\t\tstyle.setAttribute('scoped', 'true');\r\n\t\t\t\t}\r\n\t\t\t\t// 懒加载\r\n\t\t\t\tif (!this._observer && this.lazyLoad && IntersectionObserver) {\r\n\t\t\t\t\tthis._observer = new IntersectionObserver(changes => {\r\n\t\t\t\t\t\tfor (let item, i = 0; item = changes[i++];) {\r\n\t\t\t\t\t\t\tif (item.isIntersecting) {\r\n\t\t\t\t\t\t\t\titem.target.src = item.target.getAttribute('data-src');\r\n\t\t\t\t\t\t\t\titem.target.removeAttribute('data-src');\r\n\t\t\t\t\t\t\t\tthis._observer.unobserve(item.target);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\trootMargin: '500px 0px 500px 0px'\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\tvar _ts = this;\r\n\t\t\t\t// 获取标题\r\n\t\t\t\tvar title = this.rtf.getElementsByTagName('title');\r\n\t\t\t\tif (title.length && this.autosetTitle)\r\n\t\t\t\t\tuni.setNavigationBarTitle({\r\n\t\t\t\t\t\ttitle: title[0].innerText\r\n\t\t\t\t\t})\r\n\t\t\t\t// 图片处理\r\n\t\t\t\tthis.imgList.length = 0;\r\n\t\t\t\tvar imgs = this.rtf.getElementsByTagName('img');\r\n\t\t\t\tfor (let i = 0, j = 0, img; img = imgs[i]; i++) {\r\n\t\t\t\t\tif (parseInt(img.style.width || img.getAttribute('width')) > windowWidth)\r\n\t\t\t\t\t\timg.style.height = 'auto';\r\n\t\t\t\t\tvar src = img.getAttribute('src');\r\n\t\t\t\t\tif (this.domain && src) {\r\n\t\t\t\t\t\tif (src[0] == '/') {\r\n\t\t\t\t\t\t\tif (src[1] == '/')\r\n\t\t\t\t\t\t\t\timg.src = (this.domain.includes('://') ? this.domain.split('://')[0] : '') + ':' + src;\r\n\t\t\t\t\t\t\telse img.src = this.domain + src;\r\n\t\t\t\t\t\t} else if (!src.includes('://')) img.src = this.domain + '/' + src;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!img.hasAttribute('ignore') && img.parentElement.nodeName != 'A') {\r\n\t\t\t\t\t\timg.i = j++;\r\n\t\t\t\t\t\t_ts.imgList.push(img.src || img.getAttribute('data-src'));\r\n\t\t\t\t\t\timg.onclick = function() {\r\n\t\t\t\t\t\t\tvar preview = true;\r\n\t\t\t\t\t\t\tthis.ignore = () => preview = false;\r\n\t\t\t\t\t\t\t_ts.$emit('imgtap', this);\r\n\t\t\t\t\t\t\tif (preview) {\r\n\t\t\t\t\t\t\t\tuni.previewImage({\r\n\t\t\t\t\t\t\t\t\tcurrent: this.i,\r\n\t\t\t\t\t\t\t\t\turls: _ts.imgList\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\timg.onerror = function() {\r\n\t\t\t\t\t\tif (cfg.errorImg)\r\n\t\t\t\t\t\t\t_ts.imgList[this.i] = this.src = cfg.errorImg;\r\n\t\t\t\t\t\t_ts.$emit('error', {\r\n\t\t\t\t\t\t\tsource: 'img',\r\n\t\t\t\t\t\t\ttarget: this\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (_ts.lazyLoad && this._observer && img.src && img.i != 0) {\r\n\t\t\t\t\t\timg.setAttribute('data-src', img.src);\r\n\t\t\t\t\t\timg.removeAttribute('src');\r\n\t\t\t\t\t\tthis._observer.observe(img);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// 链接处理\r\n\t\t\t\tvar links = this.rtf.getElementsByTagName('a');\r\n\t\t\t\tfor (var link of links) {\r\n\t\t\t\t\tlink.onclick = function() {\r\n\t\t\t\t\t\tvar jump = true,\r\n\t\t\t\t\t\t\thref = this.getAttribute('href');\r\n\t\t\t\t\t\t_ts.$emit('linkpress', {\r\n\t\t\t\t\t\t\thref,\r\n\t\t\t\t\t\t\tignore: () => jump = false\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif (jump && href) {\r\n\t\t\t\t\t\t\tif (href[0] == '#') {\r\n\t\t\t\t\t\t\t\tif (_ts.useAnchor) {\r\n\t\t\t\t\t\t\t\t\t_ts.navigateTo({\r\n\t\t\t\t\t\t\t\t\t\tid: href.substr(1)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else if (href.indexOf('http') == 0 || href.indexOf('//') == 0)\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\t\turl: href\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// 视频处理\r\n\t\t\t\tvar videos = this.rtf.getElementsByTagName('video');\r\n\t\t\t\t_ts.videoContexts = videos;\r\n\t\t\t\tfor (let video, i = 0; video = videos[i++];) {\r\n\t\t\t\t\tvideo.style.maxWidth = '100%';\r\n\t\t\t\t\tvideo.onerror = function() {\r\n\t\t\t\t\t\t_ts.$emit('error', {\r\n\t\t\t\t\t\t\tsource: 'video',\r\n\t\t\t\t\t\t\ttarget: this\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvideo.onplay = function() {\r\n\t\t\t\t\t\tif (_ts.autopause)\r\n\t\t\t\t\t\t\tfor (let item, i = 0; item = _ts.videoContexts[i++];)\r\n\t\t\t\t\t\t\t\tif (item != this) item.pause();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// 音频处理\r\n\t\t\t\tvar audios = this.rtf.getElementsByTagName('audio');\r\n\t\t\t\tfor (var audio of audios)\r\n\t\t\t\t\taudio.onerror = function() {\r\n\t\t\t\t\t\t_ts.$emit('error', {\r\n\t\t\t\t\t\t\tsource: 'audio',\r\n\t\t\t\t\t\t\ttarget: this\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t// 表格处理\r\n\t\t\t\tif (this.autoscroll) {\r\n\t\t\t\t\tvar tables = this.rtf.getElementsByTagName('table');\r\n\t\t\t\t\tfor (var table of tables) {\r\n\t\t\t\t\t\tlet div = document.createElement('div');\r\n\t\t\t\t\t\tdiv.style.overflow = 'scroll';\r\n\t\t\t\t\t\ttable.parentNode.replaceChild(div, table);\r\n\t\t\t\t\t\tdiv.appendChild(table);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!append) this.document.appendChild(this.rtf);\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.nodes = [1];\r\n\t\t\t\t\tthis.$emit('load');\r\n\t\t\t\t});\r\n\t\t\t\tsetTimeout(() => this.showAm = '', 500);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef APP-PLUS-NVUE\r\n\t\t\t\t// #ifndef H5 || MP-360\r\n\t\t\t\tvar nodes;\r\n\t\t\t\tif (!html) return this.nodes = [];\r\n\t\t\t\tvar parser = new Parser(html, this);\r\n\t\t\t\t// 缓存读取\r\n\t\t\t\tif (this.useCache) {\r\n\t\t\t\t\tvar hashVal = hash(html);\r\n\t\t\t\t\tif (cache[hashVal])\r\n\t\t\t\t\t\tnodes = cache[hashVal];\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tnodes = parser.parse();\r\n\t\t\t\t\t\tcache[hashVal] = nodes;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else nodes = parser.parse();\r\n\t\t\t\tthis.$emit('parse', nodes);\r\n\t\t\t\tif (append) this.nodes = this.nodes.concat(nodes);\r\n\t\t\t\telse this.nodes = nodes;\r\n\t\t\t\tif (nodes.length && nodes.title && this.autosetTitle)\r\n\t\t\t\t\tuni.setNavigationBarTitle({\r\n\t\t\t\t\t\ttitle: nodes.title\r\n\t\t\t\t\t})\r\n\t\t\t\tif (this.imgList) this.imgList.length = 0;\r\n\t\t\t\tthis.videoContexts = [];\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t(function f(cs) {\r\n\t\t\t\t\t\tfor (var i = cs.length; i--;) {\r\n\t\t\t\t\t\t\tif (cs[i].top) {\r\n\t\t\t\t\t\t\t\tcs[i].controls = [];\r\n\t\t\t\t\t\t\t\tcs[i].init();\r\n\t\t\t\t\t\t\t\tf(cs[i].$children);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})(this.$children)\r\n\t\t\t\t\tthis.$emit('load');\r\n\t\t\t\t})\r\n\t\t\t\t// #endif\r\n\t\t\t\tvar height;\r\n\t\t\t\tclearInterval(this._timer);\r\n\t\t\t\tthis._timer = setInterval(() => {\r\n\t\t\t\t\t// #ifdef H5 || MP-360\r\n\t\t\t\t\tthis.rect = this.rtf.getBoundingClientRect();\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\t// #ifndef H5 || MP-360\r\n\t\t\t\t\tuni.createSelectorQuery().in(this)\r\n\t\t\t\t\t\t.select('#_top').boundingClientRect().exec(res => {\r\n\t\t\t\t\t\t\tif (!res) return;\r\n\t\t\t\t\t\t\tthis.rect = res[0];\r\n\t\t\t\t\t\t\t// #endif\r\n\t\t\t\t\t\t\tif (this.rect.height == height) {\r\n\t\t\t\t\t\t\t\tthis.$emit('ready', this.rect)\r\n\t\t\t\t\t\t\t\tclearInterval(this._timer);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\theight = this.rect.height;\r\n\t\t\t\t\t\t\t// #ifndef H5 || MP-360\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}, 350);\r\n\t\t\t\tif (this.showWithAnimation && !append) this.showAm = 'animation:_show .5s';\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t\t// 获取文本内容\r\n\t\t\tgetText(ns = this.nodes) {\r\n\t\t\t\tvar txt = '';\r\n\t\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\t\ttxt = this._text;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef H5 || MP-360\r\n\t\t\t\ttxt = this.rtf.innerText;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef H5 || APP-PLUS-NVUE || MP-360\r\n\t\t\t\tfor (var i = 0, n; n = ns[i++];) {\r\n\t\t\t\t\tif (n.type == 'text') txt += n.text.replace(/&nbsp;/g, '\\u00A0').replace(/&lt;/g, '<').replace(/&gt;/g, '>')\r\n\t\t\t\t\t\t.replace(/&amp;/g, '&');\r\n\t\t\t\t\telse if (n.type == 'br') txt += '\\n';\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t// 块级标签前后加换行\r\n\t\t\t\t\t\tvar block = n.name == 'p' || n.name == 'div' || n.name == 'tr' || n.name == 'li' || (n.name[0] == 'h' && n.name[1] >\r\n\t\t\t\t\t\t\t'0' && n.name[1] < '7');\r\n\t\t\t\t\t\tif (block && txt && txt[txt.length - 1] != '\\n') txt += '\\n';\r\n\t\t\t\t\t\tif (n.children) txt += this.getText(n.children);\r\n\t\t\t\t\t\tif (block && txt[txt.length - 1] != '\\n') txt += '\\n';\r\n\t\t\t\t\t\telse if (n.name == 'td' || n.name == 'th') txt += '\\t';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// #endif\r\n\t\t\t\treturn txt;\r\n\t\t\t},\r\n\t\t\t// 锚点跳转\r\n\t\t\tin (obj) {\r\n\t\t\t\tif (obj.page && obj.selector && obj.scrollTop) this._in = obj;\r\n\t\t\t},\r\n\t\t\tnavigateTo(obj) {\r\n\t\t\t\tif (!this.useAnchor) return obj.fail && obj.fail('Anchor is disabled');\r\n\t\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\t\tif (!obj.id)\r\n\t\t\t\t\tweexDom.scrollToElement(this.$refs.web);\r\n\t\t\t\telse\r\n\t\t\t\t\tthis.$refs.web.evalJs('var pos=document.getElementById(\"' + obj.id +\r\n\t\t\t\t\t\t'\");if(pos)post({action:\"linkpress\",href:\"#\",offset:pos.offsetTop+' + (obj.offset || 0) + '})');\r\n\t\t\t\tobj.success && obj.success();\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef APP-PLUS-NVUE\r\n\t\t\t\tvar d = ' ';\r\n\t\t\t\t// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO\r\n\t\t\t\td = '>>>';\r\n\t\t\t\t// #endif\r\n\t\t\t\tvar selector = uni.createSelectorQuery().in(this._in ? this._in.page : this).select((this._in ? this._in.selector :\r\n\t\t\t\t\t'#_top') + (obj.id ? `${d}#${obj.id},${this._in?this._in.selector:'#_top'}${d}.${obj.id}` : '')).boundingClientRect();\r\n\t\t\t\tif (this._in) selector.select(this._in.selector).scrollOffset().select(this._in.selector).boundingClientRect();\r\n\t\t\t\telse selector.selectViewport().scrollOffset();\r\n\t\t\t\tselector.exec(res => {\r\n\t\t\t\t\tif (!res[0]) return obj.fail && obj.fail('Label not found')\r\n\t\t\t\t\tvar scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + (obj.offset || 0);\r\n\t\t\t\t\tif (this._in) this._in.page[this._in.scrollTop] = scrollTop;\r\n\t\t\t\t\telse uni.pageScrollTo({\r\n\t\t\t\t\t\tscrollTop,\r\n\t\t\t\t\t\tduration: 300\r\n\t\t\t\t\t})\r\n\t\t\t\t\tobj.success && obj.success();\r\n\t\t\t\t})\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t\t// 获取视频对象\r\n\t\t\tgetVideoContext(id) {\r\n\t\t\t\t// #ifndef APP-PLUS-NVUE\r\n\t\t\t\tif (!id) return this.videoContexts;\r\n\t\t\t\telse\r\n\t\t\t\t\tfor (var i = this.videoContexts.length; i--;)\r\n\t\t\t\t\t\tif (this.videoContexts[i].id == id) return this.videoContexts[i];\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t\t// #ifdef H5 || APP-PLUS-NVUE || MP-360\r\n\t\t\t_handleHtml(html, append) {\r\n\t\t\t\tif (!append) {\r\n\t\t\t\t\t// 处理 tag-style 和 userAgentStyles\r\n\t\t\t\t\tvar style = '<style>@keyframes _show{0%{opacity:0}100%{opacity:1}}img{max-width:100%}';\r\n\t\t\t\t\tfor (var item in cfg.userAgentStyles)\r\n\t\t\t\t\t\tstyle += `${item}{${cfg.userAgentStyles[item]}}`;\r\n\t\t\t\t\tfor (item in this.tagStyle)\r\n\t\t\t\t\t\tstyle += `${item}{${this.tagStyle[item]}}`;\r\n\t\t\t\t\tstyle += '</style>';\r\n\t\t\t\t\thtml = style + html;\r\n\t\t\t\t}\r\n\t\t\t\t// 处理 rpx\r\n\t\t\t\tif (html.includes('rpx'))\r\n\t\t\t\t\thtml = html.replace(/[0-9.]+\\s*rpx/g, $ => (parseFloat($) * windowWidth / 750) + 'px');\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\t\t\t// #endif\r\n\t\t\t// #ifdef APP-PLUS-NVUE\r\n\t\t\t_message(e) {\r\n\t\t\t\t// 接收 web-view 消息\r\n\t\t\t\tvar d = e.detail.data[0];\r\n\t\t\t\tswitch (d.action) {\r\n\t\t\t\t\tcase 'load':\r\n\t\t\t\t\t\tthis.$emit('load');\r\n\t\t\t\t\t\tthis.height = d.height;\r\n\t\t\t\t\t\tthis._text = d.text;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'getTitle':\r\n\t\t\t\t\t\tif (this.autosetTitle)\r\n\t\t\t\t\t\t\tuni.setNavigationBarTitle({\r\n\t\t\t\t\t\t\t\ttitle: d.title\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'getImgList':\r\n\t\t\t\t\t\tthis.imgList.length = 0;\r\n\t\t\t\t\t\tfor (var i = d.imgList.length; i--;)\r\n\t\t\t\t\t\t\tthis.imgList.setItem(i, d.imgList[i]);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'preview':\r\n\t\t\t\t\t\tvar preview = true;\r\n\t\t\t\t\t\td.img.ignore = () => preview = false;\r\n\t\t\t\t\t\tthis.$emit('imgtap', d.img);\r\n\t\t\t\t\t\tif (preview)\r\n\t\t\t\t\t\t\tuni.previewImage({\r\n\t\t\t\t\t\t\t\tcurrent: d.img.i,\r\n\t\t\t\t\t\t\t\turls: this.imgList\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'linkpress':\r\n\t\t\t\t\t\tvar jump = true,\r\n\t\t\t\t\t\t\thref = d.href;\r\n\t\t\t\t\t\tthis.$emit('linkpress', {\r\n\t\t\t\t\t\t\thref,\r\n\t\t\t\t\t\t\tignore: () => jump = false\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tif (jump && href) {\r\n\t\t\t\t\t\t\tif (href[0] == '#') {\r\n\t\t\t\t\t\t\t\tif (this.useAnchor)\r\n\t\t\t\t\t\t\t\t\tweexDom.scrollToElement(this.$refs.web, {\r\n\t\t\t\t\t\t\t\t\t\toffset: d.offset\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t} else if (href.includes('://'))\r\n\t\t\t\t\t\t\t\tplus.runtime.openWeb(href);\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\t\t\turl: href\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'error':\r\n\t\t\t\t\t\tif (d.source == 'img' && cfg.errorImg)\r\n\t\t\t\t\t\t\tthis.imgList.setItem(d.target.i, cfg.errorImg);\r\n\t\t\t\t\t\tthis.$emit('error', {\r\n\t\t\t\t\t\t\tsource: d.source,\r\n\t\t\t\t\t\t\ttarget: d.target\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'ready':\r\n\t\t\t\t\t\tthis.height = d.height;\r\n\t\t\t\t\t\tif (d.ready) uni.createSelectorQuery().in(this).select('#_top').boundingClientRect().exec(res => {\r\n\t\t\t\t\t\t\tthis.rect = res[0];\r\n\t\t\t\t\t\t\tthis.$emit('ready', res[0]);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'click':\r\n\t\t\t\t\t\tthis.$emit('click');\r\n\t\t\t\t\t\tthis.$emit('tap');\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// #endif\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style>\r\n\t@keyframes _show {\r\n\t\t0% {\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\r\n\t\t100% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\r\n\t/* #ifdef MP-WEIXIN */\r\n\t:host {\r\n\t\tdisplay: block;\r\n\t\toverflow: scroll;\r\n\t\t-webkit-overflow-scrolling: touch;\r\n\t}\r\n\r\n\t/* #endif */\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-picker/u-picker.vue",
    "content": "<template>\r\n\t<u-popup :maskCloseAble=\"maskCloseAble\" mode=\"bottom\" :popup=\"false\" v-model=\"value\" length=\"auto\" :safeAreaInsetBottom=\"safeAreaInsetBottom\" @close=\"close\" :z-index=\"uZIndex\">\r\n\t\t<view class=\"u-datetime-picker\">\r\n\t\t\t<view class=\"u-picker-header\" @touchmove.stop.prevent=\"\">\r\n\t\t\t\t<view class=\"u-btn-picker u-btn-picker--tips\" \r\n\t\t\t\t\t:style=\"{ color: cancelColor }\" \r\n\t\t\t\t\thover-class=\"u-opacity\" \r\n\t\t\t\t\t:hover-stay-time=\"150\" \r\n\t\t\t\t\t@tap=\"getResult('cancel')\"\r\n\t\t\t\t>{{cancelText}}</view>\r\n\t\t\t\t<view class=\"u-picker__title\">{{ title }}</view>\r\n\t\t\t\t<view\r\n\t\t\t\t\tclass=\"u-btn-picker u-btn-picker--primary\"\r\n\t\t\t\t\t:style=\"{ color: moving ? cancelColor : confirmColor }\"\r\n\t\t\t\t\thover-class=\"u-opacity\"\r\n\t\t\t\t\t:hover-stay-time=\"150\"\r\n\t\t\t\t\t@touchmove.stop=\"\"\r\n\t\t\t\t\t@tap.stop=\"getResult('confirm')\"\r\n\t\t\t\t>\r\n\t\t\t\t\t{{confirmText}}\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-picker-body\">\r\n\t\t\t\t<picker-view v-if=\"mode == 'region'\" :value=\"valueArr\" @change=\"change\" class=\"u-picker-view\" @pickstart=\"pickstart\" @pickend=\"pickend\">\r\n\t\t\t\t\t<picker-view-column v-if=\"params.province\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in provinces\" :key=\"index\">\r\n\t\t\t\t\t\t\t<view class=\"u-line-1\">{{ item.label }}</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.city\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in citys\" :key=\"index\">\r\n\t\t\t\t\t\t\t<view class=\"u-line-1\">{{ item.label }}</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.area\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in areas\" :key=\"index\">\r\n\t\t\t\t\t\t\t<view class=\"u-line-1\">{{ item.label }}</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t</picker-view>\r\n\t\t\t\t<picker-view v-else-if=\"mode == 'time'\" :value=\"valueArr\" @change=\"change\" class=\"u-picker-view\" @pickstart=\"pickstart\" @pickend=\"pickend\">\r\n\t\t\t\t\t<picker-view-column v-if=\"params.year\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in years\" :key=\"index\">\r\n\t\t\t\t\t\t\t{{ item }}\r\n\t\t\t\t\t\t\t<text class=\"u-text\" v-if=\"showTimeTag\">年</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.month\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in months\" :key=\"index\">\r\n\t\t\t\t\t\t\t{{ formatNumber(item) }}\r\n\t\t\t\t\t\t\t<text class=\"u-text\" v-if=\"showTimeTag\">月</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.day\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in days\" :key=\"index\">\r\n\t\t\t\t\t\t\t{{ formatNumber(item) }}\r\n\t\t\t\t\t\t\t<text class=\"u-text\" v-if=\"showTimeTag\">日</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.hour\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in hours\" :key=\"index\">\r\n\t\t\t\t\t\t\t{{ formatNumber(item) }}\r\n\t\t\t\t\t\t\t<text class=\"u-text\" v-if=\"showTimeTag\">时</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.minute\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in minutes\" :key=\"index\">\r\n\t\t\t\t\t\t\t{{ formatNumber(item) }}\r\n\t\t\t\t\t\t\t<text class=\"u-text\" v-if=\"showTimeTag\">分</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t<picker-view-column v-if=\"params.second\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in seconds\" :key=\"index\">\r\n\t\t\t\t\t\t\t{{ formatNumber(item) }}\r\n\t\t\t\t\t\t\t<text class=\"u-text\" v-if=\"showTimeTag\">秒</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t</picker-view>\r\n\t\t\t\t<picker-view v-else-if=\"mode == 'selector'\" :value=\"valueArr\" @change=\"change\" class=\"u-picker-view\" @pickstart=\"pickstart\" @pickend=\"pickend\">\r\n\t\t\t\t\t<picker-view-column>\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item, index) in range\" :key=\"index\">\r\n\t\t\t\t\t\t\t<view class=\"u-line-1\">{{ getItemValue(item, 'selector') }}</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t</picker-view>\r\n\t\t\t\t<picker-view v-else-if=\"mode == 'multiSelector'\" :value=\"valueArr\" @change=\"change\" class=\"u-picker-view\" @pickstart=\"pickstart\" @pickend=\"pickend\">\r\n\t\t\t\t\t<picker-view-column v-for=\"(item, index) in range\" :key=\"index\">\r\n\t\t\t\t\t\t<view class=\"u-column-item\" v-for=\"(item1, index1) in item\" :key=\"index1\">\r\n\t\t\t\t\t\t\t<view class=\"u-line-1\">{{ getItemValue(item1, 'multiSelector') }}</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t</picker-view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</u-popup>\r\n</template>\r\n\r\n<script>\r\nimport provinces from '../../libs/util/province.js';\r\nimport citys from '../../libs/util/city.js';\r\nimport areas from '../../libs/util/area.js';\r\n\r\n/**\r\n * picker picker弹出选择器\r\n * @description 此选择器有两种弹出模式：一是时间模式，可以配置年，日，月，时，分，秒参数 二是地区模式，可以配置省，市，区参数\r\n * @tutorial https://www.uviewui.com/components/picker.html\r\n * @property {Object} params 需要显示的参数，见官网说明\r\n * @property {String} mode 模式选择，region-地区类型，time-时间类型（默认time）\r\n * @property {String Number} start-year 可选的开始年份，mode=time时有效（默认1950）\r\n * @property {String Number} end-year 可选的结束年份，mode=time时有效（默认2050）\r\n * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配（默认false）\r\n * @property {Boolean} show-time-tag 时间模式时，是否显示后面的年月日中文提示\r\n * @property {String} cancel-color 取消按钮的颜色（默认#606266）\r\n * @property {String} confirm-color 确认按钮的颜色（默认#2979ff）\r\n * @property {String} default-time 默认选中的时间，mode=time时有效\r\n * @property {String} confirm-text 确认按钮的文字\r\n * @property {String} cancel-text 取消按钮的文字\r\n * @property {String} default-region 默认选中的地区，中文形式，mode=region时有效\r\n * @property {String} default-code 默认选中的地区，编号形式，mode=region时有效\r\n * @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭Picker（默认true）\r\n * @property {String Number} z-index 弹出时的z-index值（默认1075）\r\n * @property {Array} default-selector 数组形式，其中每一项表示选择了range对应项中的第几个\r\n * @property {Array} range 自定义选择的数据，mode=selector或mode=multiSelector时有效\r\n * @property {String} range-key 当range参数的元素为对象时，指定Object中的哪个key的值作为选择器显示内容\r\n * @event {Function} confirm 点击确定按钮，返回当前选择的值\r\n * @event {Function} cancel 点击取消按钮，返回当前选择的值\r\n * @example <u-picker v-model=\"show\" mode=\"time\"></u-picker>\r\n */\r\nexport default {\r\n\tname: 'u-picker',\r\n\tprops: {\r\n\t\t// picker中需要显示的参数\r\n\t\tparams: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tyear: true,\r\n\t\t\t\t\tmonth: true,\r\n\t\t\t\t\tday: true,\r\n\t\t\t\t\thour: false,\r\n\t\t\t\t\tminute: false,\r\n\t\t\t\t\tsecond: false,\r\n\t\t\t\t\tprovince: true,\r\n\t\t\t\t\tcity: true,\r\n\t\t\t\t\tarea: true,\r\n\t\t\t\t\ttimestamp: true,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 当mode=selector或者mode=multiSelector时，提供的数组\r\n\t\trange: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 当mode=selector或者mode=multiSelector时，提供的默认选中的下标\r\n\t\tdefaultSelector: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [0];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 当 range 是一个 Array＜Object＞ 时，通过 range-key 来指定 Object 中 key 的值作为选择器显示内容\r\n\t\trangeKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 模式选择，region-地区类型，time-时间类型，selector-单列模式，multiSelector-多列模式\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'time'\r\n\t\t},\r\n\t\t// 年份开始时间\r\n\t\tstartYear: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 1950\r\n\t\t},\r\n\t\t// 年份结束时间\r\n\t\tendYear: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 2050\r\n\t\t},\r\n\t\t// \"取消\"按钮的颜色\r\n\t\tcancelColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#606266'\r\n\t\t},\r\n\t\t// \"确定\"按钮的颜色\r\n\t\tconfirmColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#2979ff'\r\n\t\t},\r\n\t\t// 默认显示的时间，2025-07-02 || 2025-07-02 13:01:00 || 2025/07/02\r\n\t\tdefaultTime: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 默认显示的地区，可传类似[\"河北省\", \"秦皇岛市\", \"北戴河区\"]\r\n\t\tdefaultRegion: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 时间模式时，是否显示后面的年月日中文提示\r\n\t\tshowTimeTag: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 默认显示地区的编码，defaultRegion和areaCode同时存在，areaCode优先，可传类似[\"13\", \"1303\", \"130304\"]\r\n\t\tareaCode: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\tsafeAreaInsetBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否允许通过点击遮罩关闭Picker\r\n\t\tmaskCloseAble: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 通过双向绑定控制组件的弹出与收起\r\n\t\tvalue: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 弹出的z-index值\r\n\t\tzIndex: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 顶部标题\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 取消按钮的文字\r\n\t\tcancelText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '取消'\r\n\t\t},\r\n\t\t// 确认按钮的文字\r\n\t\tconfirmText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '确认'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tyears: [],\r\n\t\t\tmonths: [],\r\n\t\t\tdays: [],\r\n\t\t\thours: [],\r\n\t\t\tminutes: [],\r\n\t\t\tseconds: [],\r\n\t\t\tyear: 0,\r\n\t\t\tmonth: 0,\r\n\t\t\tday: 0,\r\n\t\t\thour: 0,\r\n\t\t\tminute: 0,\r\n\t\t\tsecond: 0,\r\n\t\t\tstartDate: '',\r\n\t\t\tendDate: '',\r\n\t\t\tvalueArr: [],\r\n\t\t\tprovinces: provinces,\r\n\t\t\tcitys: citys[0],\r\n\t\t\tareas: areas[0][0],\r\n\t\t\tprovince: 0,\r\n\t\t\tcity: 0,\r\n\t\t\tarea: 0,\r\n\t\t\tmoving: false // 列是否还在滑动中，微信小程序如果在滑动中就点确定，结果可能不准确\r\n\t\t};\r\n\t},\r\n\tmounted() {\r\n\t\tthis.init();\r\n\t},\r\n\tcomputed: {\r\n\t\tpropsChange() {\r\n\t\t\t// 引用这几个变量，是为了监听其变化\r\n\t\t\treturn `${this.mode}-${this.defaultTime}-${this.startYear}-${this.endYear}-${this.defaultRegion}-${this.areaCode}`;\r\n\t\t},\r\n\t\tregionChange() {\r\n\t\t\t// 引用这几个变量，是为了监听其变化\r\n\t\t\treturn `${this.province}-${this.city}`;\r\n\t\t},\r\n\t\tyearAndMonth() {\r\n\t\t\treturn `${this.year}-${this.month}`;\r\n\t\t},\r\n\t\tuZIndex() {\r\n\t\t\t// 如果用户有传递z-index值，优先使用\r\n\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tpropsChange() {\r\n\t\t\tsetTimeout(() => this.init(), 10);\r\n\t\t},\r\n\t\t// 如果地区发生变化，为了让picker联动起来，必须重置this.citys和this.areas\r\n\t\tregionChange(val) {\r\n\t\t\tthis.citys = citys[this.province];\r\n\t\t\tthis.areas = areas[this.province][this.city];\r\n\t\t},\r\n\t\t// watch监听月份的变化，实时变更日的天数，因为不同月份，天数不一样\r\n\t\t// 一个月可能有30，31天，甚至闰年2月的29天，平年2月28天\r\n\t\tyearAndMonth(val) {\r\n\t\t\tif (this.params.year) this.setDays();\r\n\t\t},\r\n\t\t// 微信和QQ小程序由于一些奇怪的原因(故同时对所有平台均初始化一遍)，需要重新初始化才能显示正确的值\r\n\t\tvalue(n) {\r\n\t\t\tif (n) {\r\n\t\t\t\tsetTimeout(() => this.init(), 10);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t// 标识滑动开始，只有微信小程序才有这样的事件\r\n\t\tpickstart() {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.moving = true;\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\t// 标识滑动结束\r\n\t\tpickend() {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.moving = false;\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\t// 对单列和多列形式的判断是否有传入变量的情况\r\n\t\tgetItemValue(item, mode) {\r\n\t\t\t// 目前(2020-05-25)uni-app对微信小程序编译有错误，导致v-if为false中的内容也执行，错误导致\r\n\t\t\t// 单列模式或者多列模式中的getItemValue同时被执行，故在这里再加一层判断\r\n\t\t\tif (this.mode == mode) {\r\n\t\t\t\treturn typeof item == 'object' ? item[this.rangeKey] : item;\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 小于10前面补0，用于月份，日期，时分秒等\r\n\t\tformatNumber(num) {\r\n\t\t\treturn +num < 10 ? '0' + num : String(num);\r\n\t\t},\r\n\t\t// 生成递进的数组\r\n\t\tgenerateArray: function(start, end) {\r\n\t\t\t// 转为数值格式，否则用户给end-year等传递字符串值时，下面的end+1会导致字符串拼接，而不是相加\r\n\t\t\tstart = Number(start);\r\n\t\t\tend = Number(end);\r\n\t\t\tend = end > start ? end : start;\r\n\t\t\t// 生成数组，获取其中的索引，并剪出来\r\n\t\t\treturn [...Array(end + 1).keys()].slice(start);\r\n\t\t},\r\n\t\tgetIndex: function(arr, val) {\r\n\t\t\tlet index = arr.indexOf(val);\r\n\t\t\t// 如果index为-1(即找不到index值)，~(-1)=-(-1)-1=0，导致条件不成立\r\n\t\t\treturn ~index ? index : 0;\r\n\t\t},\r\n\t\t//日期时间处理\r\n\t\tinitTimeValue() {\r\n\t\t\t// 格式化时间，在IE浏览器(uni不存在此情况)，无法识别日期间的\"-\"间隔符号\r\n\t\t\tlet fdate = this.defaultTime.replace(/\\-/g, '/');\r\n\t\t\tfdate = fdate && fdate.indexOf('/') == -1 ? `2020/01/01 ${fdate}` : fdate;\r\n\t\t\tlet time = null;\r\n\t\t\tif (fdate) time = new Date(fdate);\r\n\t\t\telse time = new Date();\r\n\t\t\t// 获取年日月时分秒\r\n\t\t\tthis.year = time.getFullYear();\r\n\t\t\tthis.month = Number(time.getMonth()) + 1;\r\n\t\t\tthis.day = time.getDate();\r\n\t\t\tthis.hour = time.getHours();\r\n\t\t\tthis.minute = time.getMinutes();\r\n\t\t\tthis.second = time.getSeconds();\r\n\t\t},\r\n\t\tinit() {\r\n\t\t\tthis.valueArr = [];\r\n\t\t\tif (this.mode == 'time') {\r\n\t\t\t\tthis.initTimeValue();\r\n\t\t\t\tif (this.params.year) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setYears();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.month) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setMonths();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.day) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setDays();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.hour) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setHours();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.minute) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setMinutes();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.second) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setSeconds();\r\n\t\t\t\t}\r\n\t\t\t} else if (this.mode == 'region') {\r\n\t\t\t\tif (this.params.province) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setProvinces();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.city) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setCitys();\r\n\t\t\t\t}\r\n\t\t\t\tif (this.params.area) {\r\n\t\t\t\t\tthis.valueArr.push(0);\r\n\t\t\t\t\tthis.setAreas();\r\n\t\t\t\t}\r\n\t\t\t} else if (this.mode == 'selector') {\r\n\t\t\t\tthis.valueArr = this.defaultSelector;\r\n\t\t\t} else if (this.mode == 'multiSelector') {\r\n\t\t\t\tthis.valueArr = this.defaultSelector;\r\n\t\t\t\tthis.multiSelectorValue = this.defaultSelector;\r\n\t\t\t}\r\n\t\t\tthis.$forceUpdate();\r\n\t\t},\r\n\t\t// 设置picker的某一列值\r\n\t\tsetYears() {\r\n\t\t\t// 获取年份集合\r\n\t\t\tthis.years = this.generateArray(this.startYear, this.endYear);\r\n\t\t\t// 设置this.valueArr某一项的值，是为了让picker预选中某一个值\r\n\t\t\tthis.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.years, this.year));\r\n\t\t},\r\n\t\tsetMonths() {\r\n\t\t\tthis.months = this.generateArray(1, 12);\r\n\t\t\tthis.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.months, this.month));\r\n\t\t},\r\n\t\tsetDays() {\r\n\t\t\tlet totalDays = new Date(this.year, this.month, 0).getDate();\r\n\t\t\tthis.days = this.generateArray(1, totalDays);\r\n\t\t\tlet index = 0;\r\n\t\t\t// 这里不能使用类似setMonths()中的this.valueArr.splice(this.valueArr.length - 1, xxx)做法\r\n\t\t\t// 因为this.month和this.year变化时，会触发watch中的this.setDays()，导致this.valueArr.length计算有误\r\n\t\t\tif (this.params.year && this.params.month) index = 2;\r\n\t\t\telse if (this.params.month) index = 1;\r\n\t\t\telse if (this.params.year) index = 1;\r\n\t\t\telse index = 0;\n\t\t\t// 当月份变化时，会导致日期的天数也会变化，如果原来选的天数大于变化后的天数，则重置为变化后的最大值\n\t\t\t// 比如原来选中3月31日，调整为2月后，日期变为最大29，这时如果day值继续为31显然不合理，于是将其置为29(picker-column从1开始)\n\t\t\tif(this.day > this.days.length) this.day = this.days.length;\r\n\t\t\tthis.valueArr.splice(index, 1, this.getIndex(this.days, this.day));\r\n\t\t},\r\n\t\tsetHours() {\r\n\t\t\tthis.hours = this.generateArray(0, 23);\r\n\t\t\tthis.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.hours, this.hour));\r\n\t\t},\r\n\t\tsetMinutes() {\r\n\t\t\tthis.minutes = this.generateArray(0, 59);\r\n\t\t\tthis.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.minutes, this.minute));\r\n\t\t},\r\n\t\tsetSeconds() {\r\n\t\t\tthis.seconds = this.generateArray(0, 59);\r\n\t\t\tthis.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.seconds, this.second));\r\n\t\t},\r\n\t\tsetProvinces() {\r\n\t\t\t// 判断是否需要province参数\r\n\t\t\tif (!this.params.province) return;\r\n\t\t\tlet tmp = '';\r\n\t\t\tlet useCode = false;\r\n\t\t\t// 如果同时配置了defaultRegion和areaCode，优先使用areaCode参数\r\n\t\t\tif (this.areaCode.length) {\r\n\t\t\t\ttmp = this.areaCode[0];\r\n\t\t\t\tuseCode = true;\r\n\t\t\t} else if (this.defaultRegion.length) tmp = this.defaultRegion[0];\r\n\t\t\telse tmp = 0;\r\n\t\t\t// 历遍省份数组匹配\r\n\t\t\tprovinces.map((v, k) => {\r\n\t\t\t\tif (useCode ? v.value == tmp : v.label == tmp) {\r\n\t\t\t\t\ttmp = k;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.province = tmp;\r\n\t\t\tthis.provinces = provinces;\r\n\t\t\t// 设置默认省份的值\r\n\t\t\tthis.valueArr.splice(0, 1, this.province);\r\n\t\t},\r\n\t\tsetCitys() {\r\n\t\t\tif (!this.params.city) return;\r\n\t\t\tlet tmp = '';\r\n\t\t\tlet useCode = false;\r\n\t\t\tif (this.areaCode.length) {\r\n\t\t\t\ttmp = this.areaCode[1];\r\n\t\t\t\tuseCode = true;\r\n\t\t\t} else if (this.defaultRegion.length) tmp = this.defaultRegion[1];\r\n\t\t\telse tmp = 0;\r\n\t\t\tcitys[this.province].map((v, k) => {\r\n\t\t\t\tif (useCode ? v.value == tmp : v.label == tmp) {\r\n\t\t\t\t\ttmp = k;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.city = tmp;\r\n\t\t\tthis.citys = citys[this.province];\r\n\t\t\tthis.valueArr.splice(1, 1, this.city);\r\n\t\t},\r\n\t\tsetAreas() {\r\n\t\t\tif (!this.params.area) return;\r\n\t\t\tlet tmp = '';\r\n\t\t\tlet useCode = false;\r\n\t\t\tif (this.areaCode.length) {\r\n\t\t\t\ttmp = this.areaCode[2];\r\n\t\t\t\tuseCode = true;\r\n\t\t\t} else if (this.defaultRegion.length) tmp = this.defaultRegion[2];\r\n\t\t\telse tmp = 0;\r\n\t\t\tareas[this.province][this.city].map((v, k) => {\r\n\t\t\t\tif (useCode ? v.value == tmp : v.label == tmp) {\r\n\t\t\t\t\ttmp = k;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.area = tmp;\r\n\t\t\tthis.areas = areas[this.province][this.city];\r\n\t\t\tthis.valueArr.splice(2, 1, this.area);\r\n\t\t},\r\n\t\tclose() {\r\n\t\t\tthis.$emit('input', false);\r\n\t\t},\r\n\t\t// 用户更改picker的列选项\r\n\t\tchange(e) {\r\n\t\t\tthis.valueArr = e.detail.value;\r\n\t\t\tlet i = 0;\r\n\t\t\tif (this.mode == 'time') {\r\n\t\t\t\t// 这里使用i++，是因为this.valueArr数组的长度是不确定长度的，它根据this.params的值来配置长度\r\n\t\t\t\t// 进入if规则，i会加1，保证了能获取准确的值\r\n\t\t\t\tif (this.params.year) this.year = this.years[this.valueArr[i++]];\r\n\t\t\t\tif (this.params.month) this.month = this.months[this.valueArr[i++]];\r\n\t\t\t\tif (this.params.day) this.day = this.days[this.valueArr[i++]];\r\n\t\t\t\tif (this.params.hour) this.hour = this.hours[this.valueArr[i++]];\r\n\t\t\t\tif (this.params.minute) this.minute = this.minutes[this.valueArr[i++]];\r\n\t\t\t\tif (this.params.second) this.second = this.seconds[this.valueArr[i++]];\r\n\t\t\t} else if (this.mode == 'region') {\r\n\t\t\t\tif (this.params.province) this.province = this.valueArr[i++];\r\n\t\t\t\tif (this.params.city) this.city = this.valueArr[i++];\r\n\t\t\t\tif (this.params.area) this.area = this.valueArr[i++];\r\n\t\t\t} else if (this.mode == 'multiSelector') {\r\n\t\t\t\tlet index = null;\r\n\t\t\t\t// 对比前后两个数组，寻找变更的是哪一列，如果某一个元素不同，即可判定该列发生了变化\r\n\t\t\t\tthis.defaultSelector.map((val, idx) => {\r\n\t\t\t\t\tif (val != e.detail.value[idx]) index = idx;\r\n\t\t\t\t});\r\n\t\t\t\t// 为了让用户对多列变化时，对动态设置其他列的变更\r\n\t\t\t\tif (index != null) {\r\n\t\t\t\t\tthis.$emit('columnchange', {\r\n\t\t\t\t\t\tcolumn: index,\r\n\t\t\t\t\t\tindex: e.detail.value[index]\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 用户点击确定按钮\r\n\t\tgetResult(event = null) {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tif (this.moving) return;\r\n\t\t\t// #endif\r\n\t\t\tlet result = {};\r\n\t\t\t// 只返回用户在this.params中配置了为true的字段\r\n\t\t\tif (this.mode == 'time') {\r\n\t\t\t\tif (this.params.year) result.year = this.formatNumber(this.year || 0);\r\n\t\t\t\tif (this.params.month) result.month = this.formatNumber(this.month || 0);\r\n\t\t\t\tif (this.params.day) result.day = this.formatNumber(this.day || 0);\r\n\t\t\t\tif (this.params.hour) result.hour = this.formatNumber(this.hour || 0);\r\n\t\t\t\tif (this.params.minute) result.minute = this.formatNumber(this.minute || 0);\r\n\t\t\t\tif (this.params.second) result.second = this.formatNumber(this.second || 0);\r\n\t\t\t\tif (this.params.timestamp) result.timestamp = this.getTimestamp();\r\n\t\t\t} else if (this.mode == 'region') {\r\n\t\t\t\tif (this.params.province) result.province = provinces[this.province];\r\n\t\t\t\tif (this.params.city) result.city = citys[this.province][this.city];\r\n\t\t\t\tif (this.params.area) result.area = areas[this.province][this.city][this.area];\r\n\t\t\t} else if (this.mode == 'selector') {\r\n\t\t\t\tresult = this.valueArr;\r\n\t\t\t} else if (this.mode == 'multiSelector') {\r\n\t\t\t\tresult = this.valueArr;\r\n\t\t\t}\r\n\t\t\tif (event) this.$emit(event, result);\r\n\t\t\tthis.close();\r\n\t\t},\r\n\t\t// 获取时间戳\r\n\t\tgetTimestamp() {\r\n\t\t\t// yyyy-mm-dd为安卓写法，不支持iOS，需要使用\"/\"分隔，才能二者兼容\r\n\t\t\tlet time = this.year + '/' + this.month + '/' + this.day + ' ' + this.hour + ':' + this.minute + ':' + this.second;\r\n\t\t\treturn new Date(time).getTime() / 1000;\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import '../../libs/css/style.components.scss';\r\n\r\n.u-datetime-picker {\r\n\tposition: relative;\r\n\tz-index: 999;\r\n}\r\n\r\n.u-picker-view {\r\n\theight: 100%;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n.u-picker-header {\r\n\twidth: 100%;\r\n\theight: 90rpx;\r\n\tpadding: 0 40rpx;\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tbox-sizing: border-box;\r\n\tfont-size: 30rpx;\r\n\tbackground: #fff;\r\n\tposition: relative;\r\n}\r\n\r\n.u-picker-header::after {\r\n\tcontent: '';\r\n\tposition: absolute;\r\n\tborder-bottom: 1rpx solid #eaeef1;\r\n\t-webkit-transform: scaleY(0.5);\r\n\ttransform: scaleY(0.5);\r\n\tbottom: 0;\r\n\tright: 0;\r\n\tleft: 0;\r\n}\r\n\r\n.u-picker__title {\r\n\tcolor: $u-content-color;\r\n}\r\n\r\n.u-picker-body {\r\n\twidth: 100%;\r\n\theight: 500rpx;\r\n\toverflow: hidden;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.u-column-item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tfont-size: 32rpx;\r\n\tcolor: $u-main-color;\r\n\tpadding: 0 8rpx;\r\n}\r\n\r\n.u-text {\r\n\tfont-size: 24rpx;\r\n\tpadding-left: 8rpx;\r\n}\r\n\r\n.u-btn-picker {\r\n\tpadding: 16rpx;\r\n\tbox-sizing: border-box;\r\n\ttext-align: center;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.u-opacity {\r\n\topacity: 0.5;\r\n}\r\n\r\n.u-btn-picker--primary {\r\n\tcolor: $u-type-primary;\r\n}\r\n\r\n.u-btn-picker--tips {\r\n\tcolor: $u-tips-color;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-popup/u-popup.vue",
    "content": "<template>\r\n\t<view v-if=\"visibleSync\" :style=\"[customStyle, {\r\n\t\tzIndex: uZindex - 1\r\n\t}]\" :class=\"{ 'u-drawer-visible': showDrawer }\" class=\"u-drawer\" hover-stop-propagation>\r\n\t\t<u-mask :custom-style=\"maskCustomStyle\" :maskClickAble=\"maskCloseAble\" :z-index=\"uZindex - 2\" :show=\"showDrawer && mask\" @click=\"maskClick\"></u-mask>\r\n\t\t<view\r\n\t\t\tclass=\"u-drawer-content\"\r\n\t\t\t@tap=\"modeCenterClose(mode)\"\r\n\t\t\t:class=\"[\r\n\t\t\t\tsafeAreaInsetBottom ? 'safe-area-inset-bottom' : '',\r\n\t\t\t\t'u-drawer-' + mode,\r\n\t\t\t\tshowDrawer ? 'u-drawer-content-visible' : '',\r\n\t\t\t\tzoom && mode == 'center' ? 'u-animation-zoom' : ''\r\n\t\t\t]\"\r\n\t\t\t@touchmove.stop.prevent\r\n\t\t\t@tap.stop.prevent\r\n\t\t\t:style=\"[style]\"\r\n\t\t>\r\n\t\t\t<view class=\"u-mode-center-box\" @tap.stop.prevent @touchmove.stop.prevent v-if=\"mode == 'center'\" :style=\"[centerStyle]\">\r\n\t\t\t\t<u-icon\r\n\t\t\t\t\t@click=\"close\"\r\n\t\t\t\t\tv-if=\"closeable\"\r\n\t\t\t\t\tclass=\"u-close\"\r\n\t\t\t\t\t:class=\"['u-close--' + closeIconPos]\"\r\n\t\t\t\t\t:name=\"closeIcon\"\r\n\t\t\t\t\t:color=\"closeIconColor\"\r\n\t\t\t\t\t:size=\"closeIconSize\"\r\n\t\t\t\t></u-icon>\r\n\t\t\t\t<scroll-view class=\"u-drawer__scroll-view\" scroll-y=\"true\">\r\n\t\t\t\t\t<slot />\r\n\t\t\t\t</scroll-view>\r\n\t\t\t</view>\r\n\t\t\t<scroll-view class=\"u-drawer__scroll-view\" scroll-y=\"true\" v-else>\r\n\t\t\t\t<slot />\r\n\t\t\t</scroll-view>\r\n\t\t\t<view @tap=\"close\" class=\"u-close\" :class=\"['u-close--' + closeIconPos]\">\r\n\t\t\t\t<u-icon\r\n\t\t\t\t\tv-if=\"mode != 'center' && closeable\"\r\n\t\t\t\t\t:name=\"closeIcon\"\r\n\t\t\t\t\t:color=\"closeIconColor\"\r\n\t\t\t\t\t:size=\"closeIconSize\"\r\n\t\t\t\t></u-icon>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * popup 弹窗\r\n * @description 弹出层容器，用于展示弹窗、信息提示等内容，支持上、下、左、右和中部弹出。组件只提供容器，内部内容由用户自定义\r\n * @tutorial https://www.uviewui.com/components/popup.html\r\n * @property {String} mode 弹出方向（默认left）\r\n * @property {Boolean} mask 是否显示遮罩（默认true）\r\n * @property {Stringr | Number} length mode=left | 见官网说明（默认auto）\r\n * @property {Boolean} zoom 是否开启缩放动画，只在mode为center时有效（默认true）\r\n * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配（默认false）\r\n * @property {Boolean} mask-close-able 点击遮罩是否可以关闭弹出层（默认true）\r\n * @property {Object} custom-style 用户自定义样式\r\n * @property {Stringr | Number} negative-top 中部弹出时，往上偏移的值\r\n * @property {Numberr | String} border-radius 弹窗圆角值（默认0）\r\n * @property {Numberr | String} z-index 弹出内容的z-index值（默认1075）\r\n * @property {Boolean} closeable 是否显示关闭图标（默认false）\r\n * @property {String} close-icon 关闭图标的名称，只能uView的内置图标\r\n * @property {String} close-icon-pos 自定义关闭图标位置（默认top-right）\r\n * @property {String} close-icon-color 关闭图标的颜色（默认#909399）\r\n * @property {Number | String} close-icon-size 关闭图标的大小，单位rpx（默认30）\r\n * @event {Function} open 弹出层打开\r\n * @event {Function} close 弹出层收起\r\n * @example <u-popup v-model=\"show\"><view>出淤泥而不染，濯清涟而不妖</view></u-popup>\r\n */\r\nexport default {\r\n\tname: 'u-popup',\r\n\tprops: {\r\n\t\t/**\r\n\t\t * 显示状态\r\n\t\t */\r\n\t\tshow: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t/**\r\n\t\t * 弹出方向，left|right|top|bottom|center\r\n\t\t */\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\t/**\r\n\t\t * 是否显示遮罩\r\n\t\t */\r\n\t\tmask: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 抽屉的宽度(mode=left|right)，或者高度(mode=top|bottom)，单位rpx，或者\"auto\"\r\n\t\t// 或者百分比\"50%\"，表示由内容撑开高度或者宽度\r\n\t\tlength: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 'auto'\r\n\t\t},\r\n\t\t// 是否开启缩放动画，只在mode=center时有效\r\n\t\tzoom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否开启底部安全区适配，开启的话，会在iPhoneX机型底部添加一定的内边距\r\n\t\tsafeAreaInsetBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否可以通过点击遮罩进行关闭\r\n\t\tmaskCloseAble: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 用户自定义样式\r\n\t\tcustomStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\tvalue: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 此为内部参数，不在文档对外使用，为了解决Picker和keyboard等融合了弹窗的组件\r\n\t\t// 对v-model双向绑定多层调用造成报错不能修改props值的问题\r\n\t\tpopup: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 显示显示弹窗的圆角，单位rpx\r\n\t\tborderRadius: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\tzIndex: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否显示关闭图标\r\n\t\tcloseable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 关闭图标的名称，只能uView的内置图标\r\n\t\tcloseIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'close'\r\n\t\t},\r\n\t\t// 自定义关闭图标位置，top-left为左上角，top-right为右上角，bottom-left为左下角，bottom-right为右下角\r\n\t\tcloseIconPos: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'top-right'\r\n\t\t},\r\n\t\t// 关闭图标的颜色\r\n\t\tcloseIconColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#909399'\r\n\t\t},\r\n\t\t// 关闭图标的大小，单位rpx\r\n\t\tcloseIconSize: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: '30'\r\n\t\t},\r\n\t\t// 宽度，只对左，右，中部弹出时起作用，单位rpx，或者\"auto\"\r\n\t\t// 或者百分比\"50%\"，表示由内容撑开高度或者宽度，优先级高于length参数\r\n\t\twidth: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 高度，只对上，下，中部弹出时起作用，单位rpx，或者\"auto\"\r\n\t\t// 或者百分比\"50%\"，表示由内容撑开高度或者宽度，优先级高于length参数\r\n\t\theight: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 给一个负的margin-top，往上偏移，避免和键盘重合的情况，仅在mode=center时有效\r\n\t\tnegativeTop: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 遮罩的样式，一般用于修改遮罩的透明度\r\n\t\tmaskCustomStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tvisibleSync: false,\r\n\t\t\tshowDrawer: false,\r\n\t\t\ttimer: null,\r\n\t\t\tcloseFromInner: false, // value的值改变，是发生在内部还是外部\r\n\t\t};\r\n\t},\r\n\tcomputed: {\r\n\t\t// 根据mode的位置，设定其弹窗的宽度(mode = left|right)，或者高度(mode = top|bottom)\r\n\t\tstyle() {\r\n\t\t\tlet style = {};\r\n\t\t\t// 如果是左边或者上边弹出时，需要给translate设置为负值，用于隐藏\r\n\t\t\tif (this.mode == 'left' || this.mode == 'right') {\r\n\t\t\t\tstyle = {\r\n\t\t\t\t\twidth: this.width ? this.getUnitValue(this.width) : this.getUnitValue(this.length),\r\n\t\t\t\t\theight: '100%',\r\n\t\t\t\t\ttransform: `translate3D(${this.mode == 'left' ? '-100%' : '100%'},0px,0px)`\r\n\t\t\t\t};\r\n\t\t\t} else if (this.mode == 'top' || this.mode == 'bottom') {\r\n\t\t\t\tstyle = {\r\n\t\t\t\t\twidth: '100%',\r\n\t\t\t\t\theight: this.height ? this.getUnitValue(this.height) : this.getUnitValue(this.length),\r\n\t\t\t\t\ttransform: `translate3D(0px,${this.mode == 'top' ? '-100%' : '100%'},0px)`\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tstyle.zIndex = this.uZindex;\r\n\t\t\t// 如果用户设置了borderRadius值，添加弹窗的圆角\r\n\t\t\tif (this.borderRadius) {\r\n\t\t\t\tswitch (this.mode) {\r\n\t\t\t\t\tcase 'left':\r\n\t\t\t\t\t\tstyle.borderRadius = `0 ${this.borderRadius}rpx ${this.borderRadius}rpx 0`;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'top':\r\n\t\t\t\t\t\tstyle.borderRadius = `0 0 ${this.borderRadius}rpx ${this.borderRadius}rpx`;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'right':\r\n\t\t\t\t\t\tstyle.borderRadius = `${this.borderRadius}rpx 0 0 ${this.borderRadius}rpx`;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'bottom':\r\n\t\t\t\t\t\tstyle.borderRadius = `${this.borderRadius}rpx ${this.borderRadius}rpx 0 0`;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t}\r\n\t\t\t\t// 不加可能圆角无效\r\n\t\t\t\tstyle.overflow = 'hidden';\r\n\t\t\t}\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// 中部弹窗的特有样式\r\n\t\tcenterStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tstyle.width = this.width ? this.getUnitValue(this.width) : this.getUnitValue(this.length);\r\n\t\t\t// 中部弹出的模式，如果没有设置高度，就用auto值，由内容撑开高度\r\n\t\t\tstyle.height = this.height ? this.getUnitValue(this.height) : 'auto';\r\n\t\t\tstyle.zIndex = this.uZindex;\r\n\t\t\tstyle.marginTop = `-${this.$u.addUnit(this.negativeTop)}`;\r\n\t\t\tif (this.borderRadius) {\r\n\t\t\t\tstyle.borderRadius = `${this.borderRadius}rpx`;\r\n\t\t\t\t// 不加可能圆角无效\r\n\t\t\t\tstyle.overflow = 'hidden';\r\n\t\t\t}\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// 计算整理后的z-index值\r\n\t\tuZindex() {\r\n\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tvalue(val) {\r\n\t\t\tif (val) {\r\n\t\t\t\tthis.open();\r\n\t\t\t} else if(!this.closeFromInner) {\r\n\t\t\t\tthis.close();\r\n\t\t\t}\r\n\t\t\tthis.closeFromInner = false;\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\t// 组件渲染完成时，检查value是否为true，如果是，弹出popup\r\n\t\tthis.value && this.open();\r\n\t},\r\n    methods: {\r\n\t\t// 判断传入的值，是否带有单位，如果没有，就默认用rpx单位\r\n\t\tgetUnitValue(val) {\r\n\t\t\tif(/(%|px|rpx|auto)$/.test(val)) return val;\r\n\t\t\telse return val + 'rpx'\r\n\t\t},\r\n\t\t// 遮罩被点击\r\n\t\tmaskClick() {\r\n\t\t\tthis.close();\r\n\t\t},\r\n\t\tclose() {\r\n\t\t\t// 标记关闭是内部发生的，否则修改了value值，导致watch中对value检测，导致再执行一遍close\r\n\t\t\t// 造成@close事件触发两次\r\n\t\t\tthis.closeFromInner = true;\r\n\t\t\tthis.change('showDrawer', 'visibleSync', false);\r\n\t\t},\r\n\t\t// 中部弹出时，需要.u-drawer-content将居中内容，此元素会铺满屏幕，点击需要关闭弹窗\r\n\t\t// 让其只在mode=center时起作用\r\n\t\tmodeCenterClose(mode) {\r\n\t\t\tif (mode != 'center' || !this.maskCloseAble) return;\r\n\t\t\tthis.close();\r\n\t\t},\r\n\t\topen() {\r\n\t\t\tthis.change('visibleSync', 'showDrawer', true);\r\n\t\t},\r\n\t\t// 此处的原理是，关闭时先通过动画隐藏弹窗和遮罩，再移除整个组件\r\n\t\t// 打开时，先渲染组件，延时一定时间再让遮罩和弹窗的动画起作用\r\n\t\tchange(param1, param2, status) {\r\n\t\t\t// 如果this.popup为false，意味着为picker，actionsheet等组件调用了popup组件\r\n\t\t\tif (this.popup == true) {\r\n\t\t\t\tthis.$emit('input', status);\r\n\t\t\t}\r\n\t\t\tthis[param1] = status;\r\n\t\t\tif(status) {\r\n\t\t\t\t// #ifdef H5 || MP\r\n\t\t\t\tthis.timer = setTimeout(() => {\r\n\t\t\t\t\tthis[param2] = status;\r\n\t\t\t\t\tthis.$emit(status ? 'open' : 'close');\r\n\t\t\t\t}, 50);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef H5 || MP\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis[param2] = status;\r\n\t\t\t\t\tthis.$emit(status ? 'open' : 'close');\r\n\t\t\t\t})\r\n\t\t\t\t// #endif\r\n\t\t\t} else {\r\n\t\t\t\tthis.timer = setTimeout(() => {\r\n\t\t\t\t\tthis[param2] = status;\r\n\t\t\t\t\tthis.$emit(status ? 'open' : 'close');\r\n\t\t\t\t}, 300);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-drawer {\r\n\t/* #ifndef APP-NVUE */\r\n\tdisplay: block;\r\n\t/* #endif */\r\n\tposition: fixed;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-drawer-content {\r\n\t/* #ifndef APP-NVUE */\r\n\tdisplay: block;\r\n\t/* #endif */\r\n\tposition: absolute;\r\n\tz-index: 1003;\r\n\ttransition: all 0.3s linear;\r\n}\r\n\r\n.u-drawer__scroll-view {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.u-drawer-left {\r\n\ttop: 0;\r\n\tbottom: 0;\r\n\tleft: 0;\r\n\tbackground-color: #ffffff;\r\n}\r\n\r\n.u-drawer-right {\r\n\tright: 0;\r\n\ttop: 0;\r\n\tbottom: 0;\r\n\tbackground-color: #ffffff;\r\n}\r\n\r\n.u-drawer-top {\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbackground-color: #ffffff;\r\n}\r\n\r\n.u-drawer-bottom {\r\n\tbottom: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbackground-color: #ffffff;\r\n}\r\n\r\n.u-drawer-center {\r\n\t/* #ifndef APP-NVUE */\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\t/* #endif */\r\n\tbottom: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\ttop: 0;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n\topacity: 0;\r\n\tz-index: 99999;\r\n}\r\n\r\n.u-mode-center-box {\r\n\tmin-width: 100rpx;\r\n\tmin-height: 100rpx;\r\n\t/* #ifndef APP-NVUE */\r\n\tdisplay: block;\r\n\t/* #endif */\r\n\tposition: relative;\r\n\tbackground-color: #ffffff;\r\n}\r\n\r\n.u-drawer-content-visible.u-drawer-center {\r\n\ttransform: scale(1);\r\n\topacity: 1;\r\n}\r\n\r\n.u-animation-zoom {\r\n\ttransform: scale(1.15);\r\n}\r\n\r\n.u-drawer-content-visible {\r\n\ttransform: translate3D(0px, 0px, 0px) !important;\r\n}\r\n\r\n.u-close {\r\n\tposition: absolute;\r\n\tz-index: 3;\r\n}\r\n\r\n.u-close--top-left {\r\n\ttop: 30rpx;\r\n\tleft: 30rpx;\r\n}\r\n\r\n.u-close--top-right {\r\n\ttop: 30rpx;\r\n\tright: 30rpx;\r\n}\r\n\r\n.u-close--bottom-left {\r\n\tbottom: 30rpx;\r\n\tleft: 30rpx;\r\n}\r\n\r\n.u-close--bottom-right {\r\n\tright: 30rpx;\r\n\tbottom: 30rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-radio/u-radio.vue",
    "content": "<template>\r\n\t<view class=\"u-radio\" :style=\"[radioStyle]\">\r\n\t\t<view class=\"u-radio__icon-wrap\" @tap=\"toggle\" :class=\"[iconClass]\" :style=\"[iconStyle]\">\r\n\t\t\t<u-icon\r\n\t\t\t    name=\"checkbox-mark\"\r\n\t\t\t    :size=\"elIconSize\" \r\n\t\t\t\t:color=\"iconColor\"/>\r\n\t\t</view>\r\n\t\t<view class=\"u-radio__label\" @tap=\"onClickLabel\" :style=\"{\r\n\t\t\tfontSize: $u.addUnit(labelSize)\r\n\t\t}\">\r\n\t\t\t<slot />\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * radio 单选框\r\n\t * @description 单选框用于有一个选择，用户只能选择其中一个的场景。搭配u-radio-group使用\r\n\t * @tutorial https://www.uviewui.com/components/radio.html\r\n\t * @property {String Number} icon-size 图标大小，单位rpx（默认24）\r\n\t * @property {String Number} label-size label字体大小，单位rpx（默认28）\r\n\t * @property {String Number} name radio组件的标示符\r\n\t * @property {String} shape 形状，见上方说明（默认circle）\r\n\t * @property {Boolean} disabled 是否禁用（默认false）\r\n\t * @property {Boolean} label-disabled 点击文本是否可以操作radio（默认true）\r\n\t * @property {String} active-color 选中时的颜色，如设置parent的active-color将失效\r\n\t * @event {Function} change 某个radio状态发生变化时触发(选中状态)\r\n\t * @example <u-radio :label-disabled=\"false\">门掩黄昏，无计留春住</u-radio>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-radio\",\r\n\t\tprops: {\r\n\t\t\t// radio的名称\r\n\t\t\tname: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 形状，square为方形，circle为原型\r\n\t\t\tshape: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否禁用\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: [String, Boolean],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否禁止点击提示语选中复选框\r\n\t\t\tlabelDisabled: {\r\n\t\t\t\ttype: [String, Boolean],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 图标的大小，单位rpx\r\n\t\t\ticonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// label的字体大小，rpx单位\r\n\t\t\tlabelSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tparentDisabled: false\r\n\t\t\t};\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// this.parentDisabled = this.parent.disabled;\r\n\t\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环应用\r\n\t\t\tthis.parent = this.$u.$parent.call(this, 'u-radio-group');\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 是否禁用，如果父组件u-raios-group禁用的话，将会忽略子组件的配置\r\n\t\t\telDisabled() {\r\n\t\t\t\treturn this.disabled !== '' ? this.disabled : this.parent ? this.parent.disabled : false;\r\n\t\t\t},\r\n\t\t\t// 是否禁用label点击\r\n\t\t\telLabelDisabled() {\r\n\t\t\t\treturn this.labelDisabled !== '' ? this.labelDisabled : this.parent ? this.parent.labelDisabled : false;\r\n\t\t\t},\r\n\t\t\t// 组件尺寸，对应size的值，默认值为34rpx\r\n\t\t\telSize() {\r\n\t\t\t\treturn this.size ? this.size : (this.parent ? this.parent.size : 34);\r\n\t\t\t},\r\n\t\t\t// 组件的勾选图标的尺寸，默认20\r\n\t\t\telIconSize() {\r\n\t\t\t\treturn this.iconSize ? this.iconSize : (this.parent ? this.parent.iconSize : 20);\r\n\t\t\t},\r\n\t\t\t// 组件选中激活时的颜色\r\n\t\t\telActiveColor() {\r\n\t\t\t\treturn this.activeColor ? this.activeColor : (this.parent ? this.parent.activeColor : 'primary');\r\n\t\t\t},\r\n\t\t\t// 组件的形状\r\n\t\t\telShape() {\r\n\t\t\t\treturn this.shape ? this.shape : (this.parent ? this.parent.shape : 'circle');\r\n\t\t\t},\r\n\t\t\t// 设置radio的状态，要求radio的name等于parent的value时才为选中状态\r\n\t\t\ticonStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif (this.elActiveColor && this.name == this.parent.value && !this.elDisabled) {\r\n\t\t\t\t\tstyle.borderColor = this.elActiveColor;\r\n\t\t\t\t\tstyle.backgroundColor = this.elActiveColor;\r\n\t\t\t\t}\r\n\t\t\t\tstyle.width = this.$u.addUnit(this.elSize);\r\n\t\t\t\tstyle.height = this.$u.addUnit(this.elSize);\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\ticonColor() {\r\n\t\t\t\treturn this.name == this.parent.value ? '#ffffff' : 'transparent';\r\n\t\t\t},\r\n\t\t\ticonClass() {\r\n\t\t\t\tlet classes = [];\r\n\t\t\t\tclasses.push('u-radio__icon-wrap--' + this.elShape);\r\n\t\t\t\tif (this.name == this.parent.value) classes.push('u-radio__icon-wrap--checked');\r\n\t\t\t\tif (this.elDisabled) classes.push('u-radio__icon-wrap--disabled');\r\n\t\t\t\tif (this.name == this.parent.value && this.elDisabled) classes.push(\r\n\t\t\t\t\t'u-radio__icon-wrap--disabled--checked');\r\n\t\t\t\t// 支付宝小程序无法动态绑定一个数组类名，否则解析出来的结果会带有\",\"，而导致失效\r\n\t\t\t\treturn classes.join(' ');\r\n\t\t\t},\r\n\t\t\tradioStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif (this.parent.width) {\r\n\t\t\t\t\tstyle.width = this.parent.width;\r\n\t\t\t\t\t// #ifdef MP\r\n\t\t\t\t\t// 各家小程序因为它们特殊的编译结构，使用float布局\r\n\t\t\t\t\tstyle.float = 'left';\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t\t// #ifndef MP\r\n\t\t\t\t\t// H5和APP使用flex布局\r\n\t\t\t\t\tstyle.flex = `0 0 ${this.parent.width}`;\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t\tif (this.parent.wrap) {\r\n\t\t\t\t\tstyle.width = '100%';\r\n\t\t\t\t\t// #ifndef MP\r\n\t\t\t\t\t// H5和APP使用flex布局，将宽度设置100%，即可自动换行\r\n\t\t\t\t\tstyle.flex = '0 0 100%';\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tonClickLabel() {\r\n\t\t\t\tif (!this.elLabelDisabled && !this.elDisabled) {\r\n\t\t\t\t\tthis.parent.setValue(this.name);\r\n\t\t\t\t\tthis.emitEvent();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\ttoggle() {\r\n\t\t\t\tif (!this.elDisabled) {\r\n\t\t\t\t\tthis.parent.setValue(this.name);\r\n\t\t\t\t\tthis.emitEvent();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\temitEvent() {\r\n\t\t\t\t// u-radio的name不等于父组件的v-model的值时(意味着未选中)，才发出事件，避免多次点击触发事件\r\n\t\t\t\tif(this.parent.value != this.name) this.$emit('change', this.name);\r\n\t\t\t},\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-radio {\r\n\t\tdisplay: -webkit-flex;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\toverflow: hidden;\r\n\t\tuser-select: none;\r\n\t\tline-height: 1.8;\r\n\t\t\r\n\t\t&__icon-wrap {\r\n\t\t\tcolor: $u-content-color;\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex: none;\r\n\t\t\talign-items: center;\r\n\t\t\tjustify-content: center;\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\twidth: 42rpx;\r\n\t\t\theight: 42rpx;\r\n\t\t\tcolor: transparent;\r\n\t\t\ttext-align: center;\r\n\t\t\ttransition-property: color, border-color, background-color;\r\n\t\t\tfont-size: 20px;\r\n\t\t\tborder: 1px solid #c8c9cc;\r\n\t\t\ttransition-duration: 0.2s;\r\n\t\t\t\r\n\t\t\t&--circle {\r\n\t\t\t\tborder-radius: 100%;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--square {\r\n\t\t\t\tborder-radius: 3px;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--checked {\r\n\t\t\t\tcolor: #fff;\r\n\t\t\t\tbackground-color: #2979ff;\r\n\t\t\t\tborder-color: #2979ff;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--disabled {\r\n\t\t\t\tbackground-color: #ebedf0;\r\n\t\t\t\tborder-color: #c8c9cc;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&--disabled--checked {\r\n\t\t\t\tcolor: #c8c9cc !important;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t&__label {\r\n\t\t\tword-wrap: break-word;\r\n\t\t\tmargin-left: 10rpx;\r\n\t\t\tmargin-right: 24rpx;\r\n\t\t\tcolor: $u-content-color;\r\n\t\t\tfont-size: 30rpx;\r\n\t\t\t\r\n\t\t\t&--disabled {\r\n\t\t\t\tcolor: #c8c9cc;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-radio-group/u-radio-group.vue",
    "content": "<template>\r\n\t<view class=\"u-radio-group u-clearfix\">\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport Emitter from '../../libs/util/emitter.js';\r\n\t/**\r\n\t * radioRroup 单选框父组件\r\n\t * @description 单选框用于有一个选择，用户只能选择其中一个的场景。搭配u-radio使用\r\n\t * @tutorial https://www.uviewui.com/components/radio.html\r\n\t * @property {Boolean} disabled 是否禁用所有radio（默认false）\r\n\t * @property {String Number} size 组件整体的大小，单位rpx（默认40）\r\n\t * @property {String} active-color 选中时的颜色，应用到所有子Radio组件（默认#2979ff）\r\n\t * @property {String Number} icon-size 图标大小，单位rpx（默认20）\r\n\t * @property {String} shape 外观形状，shape-方形，circle-圆形(默认circle)\r\n\t * @property {Boolean} label-disabled 是否禁止点击文本操作checkbox(默认false)\r\n\t * @property {String} width 宽度，需带单位\r\n\t * @property {Boolean} wrap 是否每个radio都换行（默认false）\r\n\t * @event {Function} change 任一个radio状态发生变化时触发\r\n\t * @example <u-radio-group v-model=\"value\"></u-radio-group>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-radio-group\",\r\n\t\tmixins: [Emitter],\r\n\t\tprops: {\r\n\t\t\t// 是否禁用所有单选框\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 匹配某一个radio组件，如果某个radio的name值等于此值，那么这个radio就被会选中\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 选中状态下的颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 组件的整体大小\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 34\r\n\t\t\t},\r\n\t\t\t// 是否禁止点击提示语选中复选框\r\n\t\t\tlabelDisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 形状，square为方形，circle为原型\r\n\t\t\tshape: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'circle'\r\n\t\t\t},\r\n\t\t\t// 图标的大小，单位rpx\r\n\t\t\ticonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 20\r\n\t\t\t},\r\n\t\t\t// 每个checkbox占u-checkbox-group的宽度\r\n\t\t\twidth: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'auto'\r\n\t\t\t},\r\n\t\t\t// 是否每个checkbox都换行\r\n\t\t\twrap: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tprovide() {\r\n\t\t\treturn {\r\n\t\t\t\tradioGroup: this\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 该方法有子组件radio调用，当一个radio被选中的时候，给父组件设置value值(props传递的value)\r\n\t\t\tsetValue(val) {\r\n\t\t\t\t// 通过emit事件，设置父组件通过v-model双向绑定的值\r\n\t\t\t\tthis.$emit('input', val);\r\n\t\t\t\t// 等待下一个周期再执行，因为this.$emit('input')作用于父组件，再反馈到子组件内部，需要时间\r\n\t\t\t\tthis.$nextTick(function() {\r\n\t\t\t\t\tthis.$emit('change', val);\r\n\t\t\t\t\t// 发出事件，用于在表单组件中嵌入radio的情况，进行验证\r\n\t\t\t\t\t// 将当前的值发送到 u-form-item 进行校验\r\n\t\t\t\t\tthis.dispatch('u-form-item', 'on-form-change', val);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-radio-group {\r\n\t\t/* #ifndef MP */\r\n\t\tdisplay: inline-flex;\r\n\t\tflex-wrap: wrap;\r\n\t\t/* #endif */\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-rate/u-rate.vue",
    "content": "<template>\r\n\t<view class=\"u-rate\" :id=\"elId\" @touchmove.stop.prevent=\"touchMove\">\r\n\t\t<view class=\"u-star-wrap\" v-for=\"(item, index) in count\" :key=\"index\" :class=\"[elClass]\">\r\n\t\t\t<u-icon\r\n\t\t\t\t:name=\"activeIndex > index ? activeIcon : inactiveIcon\"\r\n\t\t\t\t@click=\"click(index + 1, $event)\"\r\n\t\t\t\t:color=\"activeIndex > index ? activeColor : inactiveColor\"\r\n\t\t\t\t:style=\"{\r\n\t\t\t\t\tfontSize: size + 'rpx',\r\n\t\t\t\t\tpadding: `0 ${gutter / 2 + 'rpx'}`\r\n\t\t\t\t}\"\r\n\t\t\t></u-icon>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * rate 评分\r\n * @description 该组件一般用于满意度调查，星型评分的场景\r\n * @tutorial https://www.uviewui.com/components/rate.html\r\n * @property {String Number} count 最多可选的星星数量（默认5）\r\n * @property {String Number} current 默认选中的星星数量（默认0）\r\n * @property {Boolean} disabled 是否禁止用户操作（默认false）\r\n * @property {String Number} size 星星的大小，单位rpx（默认32）\r\n * @property {String} inactive-color 未选中星星的颜色（默认#b2b2b2）\r\n * @property {String} active-color 选中的星星颜色（默认#FA3534）\r\n * @property {String} active-icon 选中时的图标名，只能为uView的内置图标（默认star-fill）\r\n * @property {String} inactive-icon 未选中时的图标名，只能为uView的内置图标（默认star）\r\n * @property {String} gutter 星星之间的距离（默认10）\r\n * @property {String Number} min-count 最少选中星星的个数（默认0）\r\n * @property {Boolean} allow-half 是否允许半星选择（默认false）\r\n * @event {Function} change 选中的星星发生变化时触发\r\n * @example <u-rate :count=\"count\" :current=\"2\"></u-rate>\r\n */\r\nexport default {\r\n\tname: 'u-rate',\r\n\tprops: {\r\n\t\t// 用于v-model双向绑定选中的星星数量\r\n\t\t// 1.4.5版新增\r\n\t\tvalue: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: -1\r\n\t\t},\r\n\t\t// 要显示的星星数量\r\n\t\tcount: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 5\r\n\t\t},\r\n\t\t// 当前需要默认选中的星星(选中的个数)\r\n\t\t// 1.4.5后通过value双向绑定，不再建议使用此参数\r\n\t\tcurrent: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否不可选中\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 星星的大小，单位rpx\r\n\t\tsize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 32\r\n\t\t},\r\n\t\t// 未选中时的颜色\r\n\t\tinactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#b2b2b2'\r\n\t\t},\r\n\t\t// 选中的颜色\r\n\t\tactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#FA3534'\r\n\t\t},\r\n\t\t// 星星之间的间距，单位rpx\r\n\t\tgutter: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 10\r\n\t\t},\r\n\t\t// 最少能选择的星星个数\r\n\t\tminCount: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否允许半星(功能尚未实现)\r\n\t\tallowHalf: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 选中时的图标(星星)\r\n\t\tactiveIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'star-fill'\r\n\t\t},\r\n\t\t// 未选中时的图标(星星)\r\n\t\tinactiveIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'star'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\t// 生成一个唯一id，否则一个页面多个评分组件，会造成冲突\r\n\t\t\telId: this.$u.guid(),\r\n\t\t\telClass: this.$u.guid(),\r\n\t\t\tstarBoxLeft: 0, // 评分盒子左边到屏幕左边的距离，用于滑动选择时计算距离\r\n\t\t\t// 当前激活的星星的index，如果存在value，优先使用value，因为它可以双向绑定(1.4.5新增)\r\n\t\t\tactiveIndex: this.value != -1 ? this.value : this.current,\r\n\t\t\tstarWidth: 0, // 每个星星的宽度\r\n\t\t\tstarWidthArr: [] //每个星星最右边到组件盒子最左边的距离\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tcurrent(val) {\r\n\t\t\tthis.activeIndex = val;\r\n\t\t},\r\n\t\tvalue(val) {\r\n\t\t\tthis.activeIndex = val;\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t// 获取评分组件盒子的布局信息\r\n\t\tgetElRectById() {\r\n\t\t\t// uView封装的获取节点的方法，详见文档\r\n\t\t\tthis.$u.getRect('#' + this.elId).then(res => {\r\n\t\t\t\tthis.starBoxLeft = res.left;\r\n\t\t\t})\r\n\t\t},\r\n\t\t// 获取单个星星的尺寸\r\n\t\tgetElRectByClass() {\r\n\t\t\t// uView封装的获取节点的方法，详见文档\r\n\t\t\tthis.$u.getRect('.' + this.elClass).then(res => {\r\n\t\t\t\tthis.starWidth = res.width;\r\n\t\t\t\t// 把每个星星右边到组件盒子左边的距离放入数组中\r\n\t\t\t\tfor (let i = 0; i < this.count; i++) {\r\n\t\t\t\t\tthis.starWidthArr[i] = (i + 1) * this.starWidth;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t},\r\n\t\t// 手指滑动\r\n\t\ttouchMove(e) {\r\n\t\t\tif (this.disabled) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!e.changedTouches[0]) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst movePageX = e.changedTouches[0].pageX;\r\n\t\t\t// 滑动点相对于评分盒子左边的距离\r\n\t\t\tconst distance = movePageX - this.starBoxLeft;\r\n\r\n\t\t\t// 如果滑动到了评分盒子的左边界，就设置为0星\r\n\t\t\tif (distance <= 0) {\r\n\t\t\t\tthis.activeIndex = 0;\r\n\t\t\t}\r\n\t\t\t// 滑动的距离，相当于多少颗星星\r\n\t\t\tlet index = Math.ceil(distance / this.starWidth);\r\n\t\t\tthis.activeIndex = index > this.count ? this.count : index;\r\n\t\t\t// 对最少颗星星的限制\r\n\t\t\tif (this.activeIndex < this.minCount) this.activeIndex = this.minCount;\r\n\t\t\tthis.emitEvent();\r\n\t\t},\r\n\t\t// 通过点击，直接选中\r\n\t\tclick(index, e) {\r\n\t\t\tif (this.disabled) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// 半星选择，尚未实现\r\n\t\t\tif (this.allowHalf) {\r\n\t\t\t}\r\n\t\t\t// 对第一个星星特殊处理，只有一个的时候，点击可以取消，否则无法作0星评价\r\n\t\t\tif (index == 1) {\r\n\t\t\t\tif (this.activeIndex == 1) this.activeIndex = 0;\r\n\t\t\t\telse this.activeIndex = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.activeIndex = index;\r\n\t\t\t}\r\n\t\t\t// 对最少颗星星的限制\r\n\t\t\tif (this.activeIndex < this.minCount) this.activeIndex = this.minCount;\r\n\t\t\tthis.emitEvent();\r\n\t\t},\r\n\t\t// 发出事件\r\n\t\temitEvent() {\r\n\t\t\t// 发出change事件\r\n\t\t\tthis.$emit('change', this.activeIndex);\r\n\t\t\t// 同时修改双向绑定的value的值\r\n\t\t\tif(this.value != -1) {\r\n\t\t\t\tthis.$emit('input', this.activeIndex);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.getElRectById();\r\n\t\tthis.getElRectByClass();\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-rate {\r\n\tdisplay: -webkit-inline-flex;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.u-icon {\r\n\tbox-sizing: border-box;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-read-more/u-read-more.vue",
    "content": "<template>\r\n\t<view class=\"\">\r\n\t\t<view class=\"u-content\" :class=\"[elId]\" :style=\"{ \r\n\t\t\theight: isLongContent && !showMore ? showHeight + 'rpx' : 'auto',\r\n\t\t\ttextIndent: this.textIndent\r\n\t\t}\">\r\n\t\t\t<slot></slot>\r\n\t\t</view>\r\n\t\t<view @tap=\"toggleReadMore\" v-if=\"isLongContent\" class=\"u-content__showmore-wrap\"\r\n\t\t    :class=\"{ 'u-content__show-more': showMore }\"\r\n\t\t    :style=\"[innerShadowStyle]\">\r\n\t\t\t<text class=\"u-content__showmore-wrap__readmore-btn\" :style=\"{\r\n\t\t\t\tfontSize: fontSize + 'rpx',\r\n\t\t\t\tcolor: color\r\n\t\t\t}\">\r\n\t\t\t\t{{ showMore ? openText : closeText }}\r\n\t\t\t</text>\r\n\t\t\t<view class=\"u-content__showmore-wrap__readmore-btn__icon u-flex\">\r\n\t\t\t\t<u-icon :color=\"color\" :size=\"fontSize\" :name=\"showMore ? 'arrow-up' : 'arrow-down'\"></u-icon>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * readMore 阅读更多\r\n\t * @description 该组件一般用于内容较长，预先收起一部分，点击展开全部内容的场景。\r\n\t * @tutorial https://www.uviewui.com/components/readMore.html\r\n\t * @property {String Number} show-height 内容超出此高度才会显示展开全文按钮，单位rpx（默认400）\r\n\t * @property {Boolean} toggle 展开后是否显示收起按钮（默认false）\r\n\t * @property {String} close-text 关闭时的提示文字（默认“展开阅读全文”）\r\n\t * @property {String Number} font-size 提示文字的大小，单位rpx（默认28）\r\n\t * @property {String} text-indent 段落首行缩进的字符个数（默认2em）\r\n\t * @property {String} open-text 展开时的提示文字（默认“收起”）\r\n\t * @property {String} color 提示文字的颜色（默认#2979ff）\r\n\t * @example <u-read-more><rich-text :nodes=\"content\"></rich-text></u-read-more>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-read-more\",\r\n\t\tprops: {\r\n\t\t\t// 默认的显示占位高度，单位为rpx\r\n\t\t\tshowHeight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 400\r\n\t\t\t},\r\n\t\t\t// 展开后是否显示\"收起\"按钮\r\n\t\t\ttoggle: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 关闭时的提示文字\r\n\t\t\tcloseText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '展开阅读全文'\r\n\t\t\t},\r\n\t\t\t// 展开时的提示文字\r\n\t\t\topenText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '收起'\r\n\t\t\t},\r\n\t\t\t// 提示的文字颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 提示文字的大小\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 28\r\n\t\t\t},\r\n\t\t\t// 是否显示阴影\r\n\t\t\tshadowStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tbackgroundImage: \"linear-gradient(-180deg, rgba(255, 255, 255, 0) 0%, #fff 80%)\",\r\n\t\t\t\t\t\tpaddingTop: \"300rpx\",\r\n\t\t\t\t\t\tmarginTop: \"-300rpx\"\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 段落首行缩进的字符个数\r\n\t\t\ttextIndent: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '2em'\r\n\t\t\t},\r\n\t\t\t// open和close事件时，将此参数返回在回调参数中\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tparamsChange(val) {\r\n\t\t\t\tthis.init();\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tparamsChange() {\r\n\t\t\t\treturn `${this.toggle}-${this.showHeight}`;\r\n\t\t\t},\r\n\t\t\t// 展开后无需阴影，收起时才需要阴影样式\r\n\t\t\tinnerShadowStyle() {\r\n\t\t\t\tif (this.showMore) return {};\r\n\t\t\t\telse return this.shadowStyle\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tisLongContent: false, // 是否需要隐藏一部分内容\r\n\t\t\t\tshowMore: false, // 当前隐藏与显示的状态，true-显示，false-收起\r\n\t\t\t\telId: this.$u.guid(), // 生成唯一class\r\n\t\t\t};\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.$nextTick(function() {\r\n\t\t\t\tthis.init();\r\n\t\t\t})\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tinit() {\r\n\t\t\t\tthis.$uGetRect('.' + this.elId).then(res => {\r\n\t\t\t\t\t// 判断高度，如果真实内容高度大于占位高度，则显示收起与展开的控制按钮\r\n\t\t\t\t\tif (res.height > uni.upx2px(this.showHeight)) {\r\n\t\t\t\t\t\tthis.isLongContent = true;\r\n\t\t\t\t\t\tthis.showMore = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// 展开或者收起\r\n\t\t\ttoggleReadMore() {\r\n\t\t\t\tthis.showMore = !this.showMore;\r\n\t\t\t\t// 如果toggle为false，隐藏\"收起\"部分的内容\r\n\t\t\t\tif (this.toggle == false) this.isLongContent = false;\r\n\t\t\t\t// 发出打开或者收齐的事件\r\n\t\t\t\tthis.$emit(this.showMore ? 'open' : 'close', this.index);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-content {\r\n\t\tfont-size: 30rpx;\r\n\t\tcolor: $u-content-color;\r\n\t\tline-height: 1.8;\r\n\t\ttext-align: left;\r\n\t\toverflow: hidden;\r\n\r\n\t\t&__show-more {\r\n\t\t\tpadding-top: 0;\r\n\t\t\tbackground: none;\r\n\t\t\tmargin-top: 20rpx;\r\n\t\t}\r\n\r\n\t\t&__showmore-wrap {\r\n\t\t\tposition: relative;\r\n\t\t\twidth: 100%;\r\n\t\t\tpadding-bottom: 26rpx;\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tjustify-content: center;\r\n\r\n\t\t\t&__readmore-btn {\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tjustify-content: center;\r\n\t\t\t\tline-height: 1;\r\n\r\n\t\t\t\t&__icon {\r\n\t\t\t\t\tmargin-left: 14rpx;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-row/u-row.vue",
    "content": "<template>\r\n\t<view class=\"u-row\" :style=\"{\r\n\t\t\talignItems: uAlignItem,\r\n\t\t\tjustifyContent: uJustify\r\n\t\t}\"\r\n\t\t@tap.stop.prevent=\"click\"\r\n\t>\r\n\t\t<slot />\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * row 行布局\r\n\t * @description 通过基础的 12 分栏，迅速简便地创建布局。\r\n\t * @tutorial https://www.uviewui.com/components/layout.html#row-props\r\n\t * @property {String Number} gutter 栅格间隔，左右各为此值的一半，单位rpx（默认0）\r\n\t * @property {String} justify 水平排列方式(微信小程序暂不支持)默认（start(或flex-start)）\r\n\t * @property {String} align 垂直排列方式（默认center）\r\n\t * @example <u-row gutter=\"16\"></u-row>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-row\",\r\n\t\tprops: {\r\n\t\t\t// 给col添加间距，左右边距各占一半\r\n\t\t\tgutter: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 20\r\n\t\t\t},\r\n\t\t\t// 水平排列方式，可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)\r\n\t\t\tjustify: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'start'\r\n\t\t\t},\r\n\t\t\t// 垂直对齐方式，可选值为top、center、bottom\r\n\t\t\talign: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'center'\r\n\t\t\t}\r\n\t\t},\r\n\t\tprovide() {\r\n\t\t\treturn {\r\n\t\t\t\tgutter: this.gutter\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tuJustify() {\r\n\t\t\t\tif (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify;\r\n\t\t\t\telse if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify;\r\n\t\t\t\telse return this.justify;\r\n\t\t\t},\r\n\t\t\tuAlignItem() {\r\n\t\t\t\tif (this.align == 'top') return 'flex-start';\r\n\t\t\t\tif (this.align == 'bottom') return 'flex-end';\r\n\t\t\t\telse return this.align;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tclick() {\r\n\t\t\t\tthis.$emit('click');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\t.u-row {\r\n\t\t// 由于微信小程序编译后奇怪的页面结构，只能使用float布局实现，flex无法实现\r\n\t\t/* #ifndef MP-WEIXIN */\r\n\t\tdisplay: flex;\r\n\t\t/* #endif */\r\n\t\tflex-wrap: wrap;\r\n\t}\r\n\r\n\t.u-row:after {\r\n\t\t/* #ifdef MP-WEIXIN */\r\n\t\tdisplay: table;\r\n\t\tclear: both;\r\n\t\tcontent: \"\";\r\n\t\t/* #endif */\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-row-notice/u-row-notice.vue",
    "content": "<template>\r\n\t<view\r\n\t\tv-if=\"show\"\r\n\t\tclass=\"u-notice-bar\"\r\n\t\t:style=\"{\r\n\t\t\tbackground: computeBgColor,\r\n\t\t\tpadding: padding\r\n\t\t}\"\r\n\t\t:class=\"[\r\n\t\t\ttype ? `u-type-${type}-light-bg` : ''\r\n\t\t]\"\r\n\t>\r\n\t\t<view class=\"u-direction-row\">\r\n\t\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t\t<u-icon class=\"u-left-icon\" v-if=\"volumeIcon\" name=\"volume-fill\" :size=\"volumeSize\" :color=\"computeColor\"></u-icon>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-notice-box\" id=\"u-notice-box\">\r\n\t\t\t\t<view\r\n\t\t\t\t\tclass=\"u-notice-content\"\r\n\t\t\t\t\tid=\"u-notice-content\"\r\n\t\t\t\t\t:style=\"{\r\n\t\t\t\t\t\tanimationDuration: animationDuration,\r\n\t\t\t\t\t\tanimationPlayState: animationPlayState,\r\n\t\t\t\t\t}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<text class=\"u-notice-text\" @tap=\"click\" :style=\"[textStyle]\"\r\n\t\t\t\t\t:class=\"['u-type-' + type]\">{{showText}}</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t\t<u-icon @click=\"getMore\" class=\"u-right-icon\" v-if=\"moreIcon\" name=\"arrow-right\" :size=\"26\" :color=\"computeColor\"></u-icon>\r\n\t\t\t\t<u-icon @click=\"close\" class=\"u-right-icon\" v-if=\"closeIcon\" name=\"close\" :size=\"24\" :color=\"computeColor\"></u-icon>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n<script>\r\nexport default {\r\n\tprops: {\r\n\t\t// 显示的内容，数组\r\n\t\tlist: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 显示的主题，success|error|primary|info|warning|none\r\n\t\t// none主题默认为透明背景，黑色(contentColor)字体\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'warning'\r\n\t\t},\r\n\t\t// 是否显示左侧的音量图标\r\n\t\tvolumeIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示右侧的右箭头图标\r\n\t\tmoreIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否显示右侧的关闭图标\r\n\t\tcloseIcon: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否自动播放\r\n\t\tautoplay: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 文字颜色，各图标也会使用文字颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 是否显示\r\n\t\tshow: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 字体大小，单位rpx\r\n\t\tfontSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 26\r\n\t\t},\r\n\t\t// 音量喇叭的大小\r\n\t\tvolumeSize: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 34\r\n\t\t},\r\n\t\t// 水平滚动时的滚动速度，即每秒滚动多少rpx，这有利于控制文字无论多少时，都能有一个恒定的速度\r\n\t\tspeed: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 160\r\n\t\t},\r\n\t\t// 播放状态，play-播放，paused-暂停\r\n\t\tplayState: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'play'\r\n\t\t},\r\n\t\t// 通知的边距\r\n\t\tpadding: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: '18rpx 24rpx'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\ttextWidth: 0, // 滚动的文字宽度\r\n\t\t\tboxWidth: 0, // 供文字滚动的父盒子的宽度，和前者一起为了计算滚动速度\r\n\t\t\tanimationDuration: '10s', // 动画执行时间\r\n\t\t\tanimationPlayState: 'paused', // 动画的开始和结束执行\r\n\t\t\tshowText: '' // 显示的文本\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tlist: {\r\n\t\t\timmediate: true,\r\n\t\t\thandler(val) {\r\n\t\t\t\tthis.showText = val.join('，');\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.initSize();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tplayState(val) {\r\n\t\t\tif(val == 'play') this.animationPlayState = 'running';\r\n\t\t\telse this.animationPlayState = 'paused';\r\n\t\t},\r\n\t\tspeed(val) {\r\n\t\t\tthis.initSize();\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\t// 计算字体颜色，如果没有自定义的，就用uview主题颜色\r\n\t\tcomputeColor() {\r\n\t\t\tif (this.color) return this.color;\r\n\t\t\t// 如果是无主题，就默认使用content-color\r\n\t\t\telse if(this.type == 'none') return '#606266';\r\n\t\t\telse return this.type;\r\n\t\t},\r\n\t\t// 文字内容的样式\r\n\t\ttextStyle() {\r\n\t\t\tlet style = {};\r\n\t\t\tif (this.color) style.color = this.color;\r\n\t\t\telse if(this.type == 'none') style.color = '#606266';\r\n\t\t\tstyle.fontSize = this.fontSize + 'rpx';\r\n\t\t\treturn style;\r\n\t\t},\r\n\t\t// 计算背景颜色\r\n\t\tcomputeBgColor() {\r\n\t\t\tif (this.bgColor) return this.bgColor;\r\n\t\t\telse if(this.type == 'none') return 'transparent';\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.$nextTick(() => {\r\n\t\t\tthis.initSize();\r\n\t\t});\r\n\t},\r\n\tmethods: {\r\n\t\tinitSize() {\r\n\t\t\tlet query = [],\r\n\t\t\t\tboxWidth = 0,\r\n\t\t\t\ttextWidth = 0;\r\n\t\t\tlet textQuery = new Promise((resolve, reject) => {\r\n\t\t\t\tuni.createSelectorQuery()\r\n\t\t\t\t\t.in(this)\r\n\t\t\t\t\t.select(`#u-notice-content`)\r\n\t\t\t\t\t.boundingClientRect()\r\n\t\t\t\t\t.exec(ret => {\r\n\t\t\t\t\t\tthis.textWidth = ret[0].width;\r\n\t\t\t\t\t\tresolve();\r\n\t\t\t\t\t});\r\n\t\t\t});\r\n\t\t\tquery.push(textQuery);\r\n\t\t\tPromise.all(query).then(() => {\r\n\t\t\t\t// 根据t=s/v(时间=路程/速度)，这里为何不需要加上#u-notice-box的宽度，因为中设置了.u-notice-content样式中设置了padding-left: 100%\r\n\t\t\t\t// 恰巧计算出来的结果中已经包含了#u-notice-box的宽度\r\n\t\t\t\tthis.animationDuration = `${this.textWidth / uni.upx2px(this.speed)}s`;\r\n\t\t\t\t// 这里必须这样开始动画，否则在APP上动画速度不会改变(HX版本2.4.6，IOS13)\r\n\t\t\t\tthis.animationPlayState = 'paused';\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tif(this.playState == 'play' && this.autoplay) this.animationPlayState = 'running';\r\n\t\t\t\t}, 10);\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 点击通告栏\r\n\t\tclick(index) {\r\n\t\t\tthis.$emit('click');\r\n\t\t},\r\n\t\t// 点击关闭按钮\r\n\t\tclose() {\r\n\t\t\tthis.$emit('close');\r\n\t\t},\r\n\t\t// 点击更多箭头按钮\r\n\t\tgetMore() {\r\n\t\t\tthis.$emit('getMore');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\t\r\n.u-notice-bar {\r\n\tpadding: 18rpx 24rpx;\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-direction-row {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n}\r\n\r\n.u-left-icon {\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-notice-box {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\toverflow: hidden;\r\n\tmargin-left: 12rpx;\r\n}\r\n\r\n.u-right-icon {\r\n\tmargin-left: 12rpx;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-notice-content {\r\n\tanimation: u-loop-animation 10s linear infinite both;\r\n\ttext-align: right;\r\n\t// 这一句很重要，为了能让滚动左右连接起来\r\n\tpadding-left: 100%;\r\n\tdisplay: flex;\r\n\tflex-wrap: nowrap;\r\n}\r\n\r\n.u-notice-text {\r\n\tfont-size: 26rpx;\r\n\tword-break: keep-all;\r\n\twhite-space: nowrap\r\n}\r\n\r\n@keyframes u-loop-animation {\r\n\t0% {\r\n\t\ttransform: translate3d(0, 0, 0);\r\n\t}\r\n\r\n\t100% {\r\n\t\ttransform: translate3d(-100%, 0, 0);\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-search/u-search.vue",
    "content": "<template>\r\n\t<view class=\"u-search\" @tap=\"clickHandler\" :style=\"{\r\n\t\tmargin: margin,\r\n\t}\">\r\n\t\t<view\r\n\t\t\tclass=\"u-content\"\r\n\t\t\t:style=\"{\r\n\t\t\t\tbackgroundColor: bgColor,\r\n\t\t\t\tborderRadius: shape == 'round' ? '100rpx' : '10rpx',\r\n\t\t\t\tborder: borderStyle,\r\n\t\t\t\theight: height + 'rpx'\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t\t<u-icon class=\"u-clear-icon\" :size=\"30\" :name=\"searchIcon\" :color=\"searchIconColor ? searchIconColor : color\"></u-icon>\r\n\t\t\t</view>\r\n\t\t\t<input\r\n\t\t\t\tconfirm-type=\"search\"\r\n\t\t\t\t@blur=\"blur\"\r\n\t\t\t\t:value=\"value\"\r\n\t\t\t\t@confirm=\"search\"\r\n\t\t\t\t@input=\"inputChange\"\r\n\t\t\t\t:disabled=\"disabled\"\r\n\t\t\t\t@focus=\"getFocus\"\r\n\t\t\t\t:maxlength=\"getMaxlength\"\r\n\t\t\t\t:focus=\"focus\"\r\n\t\t\t\tplaceholder-class=\"u-placeholder-class\"\r\n\t\t\t\t:placeholder=\"placeholder\"\r\n\t\t\t\t:placeholder-style=\"`color: ${placeholderColor}`\"\r\n\t\t\t\tclass=\"u-input\"\r\n\t\t\t\ttype=\"text\"\r\n\t\t\t\t:style=\"[{\r\n\t\t\t\t\ttextAlign: inputAlign,\r\n\t\t\t\t\tcolor: color,\r\n\t\t\t\t\tbackgroundColor: bgColor,\r\n\t\t\t\t}, inputStyle]\"\r\n\t\t\t/>\r\n\t\t\t<view class=\"u-close-wrap\" v-if=\"keyword && clearabled && focused\" @touchstart=\"clear\">\r\n\t\t\t\t<u-icon class=\"u-clear-icon\" name=\"close-circle-fill\" size=\"34\" color=\"#c0c4cc\"></u-icon>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<view :style=\"[actionStyle]\" class=\"u-action\" \r\n\t\t\t:class=\"[showActionBtn || show ? 'u-action-active' : '']\" \r\n\t\t\t@touchstart.stop.prevent=\"custom\"\r\n\t\t>{{ actionText }}</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * search 搜索框\r\n * @description 搜索组件，集成了常见搜索框所需功能，用户可以一键引入，开箱即用。\r\n * @tutorial https://www.uviewui.com/components/search.html\r\n * @property {String} shape 搜索框形状，round-圆形，square-方形（默认round）\r\n * @property {String} bg-color 搜索框背景颜色（默认#f2f2f2）\r\n * @property {String} border-color 边框颜色，配置了颜色，才会有边框\r\n * @property {String} placeholder 占位文字内容（默认“请输入关键字”）\r\n * @property {Boolean} clearabled 是否启用清除控件（默认true）\r\n * @property {Boolean} focus 是否自动获得焦点（默认false）\r\n * @property {Boolean} show-action 是否显示右侧控件（默认true）\r\n * @property {String} action-text 右侧控件文字（默认“搜索”）\r\n * @property {Object} action-style 右侧控件的样式，对象形式\r\n * @property {String} input-align 输入框内容水平对齐方式（默认left）\r\n * @property {Object} input-style 自定义输入框样式，对象形式\r\n * @property {Boolean} disabled 是否启用输入框（默认false）\r\n * @property {String} search-icon-color 搜索图标的颜色，默认同输入框字体颜色\r\n * @property {String} color 输入框字体颜色（默认#606266）\r\n * @property {String} placeholder-color placeholder的颜色（默认#909399）\r\n * @property {String} search-icon 输入框左边的图标，可以为uView图标名称或图片路径\r\n * @property {String} margin 组件与其他上下左右元素之间的距离，带单位的字符串形式，如\"30rpx\"\r\n * @property {Boolean} animation 是否开启动画，见上方说明（默认false）\r\n * @property {String} value 输入框初始值\r\n * @property {String | Number} maxlength 输入框最大能输入的长度，-1为不限制长度\r\n * @property {Boolean} input-style input输入框的样式，可以定义文字颜色，大小等，对象形式\r\n * @property {String | Number} height 输入框高度，单位rpx（默认64）\r\n * @event {Function} change 输入框内容发生变化时触发\r\n * @event {Function} search 用户确定搜索时触发，用户按回车键，或者手机键盘右下角的\"搜索\"键时触发\r\n * @event {Function} custom 用户点击右侧控件时触发\r\n * @event {Function} clear 用户点击清除按钮时触发\r\n * @example <u-search placeholder=\"日照香炉生紫烟\" v-model=\"keyword\"></u-search>\r\n */\r\nexport default {\r\n\tname: \"u-search\",\r\n\tprops: {\r\n\t\t// 搜索框形状，round-圆形，square-方形\r\n\t\tshape: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'round'\r\n\t\t},\r\n\t\t// 搜索框背景色，默认值#f2f2f2\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#f2f2f2'\r\n\t\t},\r\n\t\t// 占位提示文字\r\n\t\tplaceholder: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '请输入关键字'\r\n\t\t},\r\n\t\t// 是否启用清除控件\r\n\t\tclearabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否自动聚焦\r\n\t\tfocus: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否在搜索框右侧显示取消按钮\r\n\t\tshowAction: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 右边控件的样式\r\n\t\tactionStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 取消按钮文字\r\n\t\tactionText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '搜索'\r\n\t\t},\r\n\t\t// 输入框内容对齐方式，可选值为 left|center|right\r\n\t\tinputAlign: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'left'\r\n\t\t},\r\n\t\t// 是否启用输入框\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 开启showAction时，是否在input获取焦点时才显示\r\n\t\tanimation: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 边框颜色，只要配置了颜色，才会有边框\r\n\t\tborderColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'none'\r\n\t\t},\r\n\t\t// 输入框的初始化内容\r\n\t\tvalue: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 搜索框高度，单位rpx\r\n\t\theight: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 64\r\n\t\t},\r\n\t\t// input输入框的样式，可以定义文字颜色，大小等，对象形式\r\n\t\tinputStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 输入框最大能输入的长度，-1为不限制长度(来自uniapp文档)\r\n\t\tmaxlength: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: -1\r\n\t\t},\r\n\t\t// 搜索图标的颜色，默认同输入框字体颜色\r\n\t\tsearchIconColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 输入框字体颜色\r\n\t\tcolor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#606266'\r\n\t\t},\r\n\t\t// placeholder的颜色\r\n\t\tplaceholderColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#909399'\r\n\t\t},\r\n\t\t// 组件与其他上下左右元素之间的距离，带单位的字符串形式，如\"30rpx\"、\"30rpx 20rpx\"等写法\r\n\t\tmargin: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '0'\r\n\t\t},\r\n\t\t// 左边输入框的图标，可以为uView图标名称或图片路径\r\n\t\tsearchIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'search'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tkeyword: '',\r\n\t\t\tshowClear: false, // 是否显示右边的清除图标\r\n\t\t\tshow: false,\r\n\t\t\t// 标记input当前状态是否处于聚焦中，如果是，才会显示右侧的清除控件\r\n\t\t\tfocused: this.focus\r\n\t\t\t// 绑定输入框的值\r\n\t\t\t// inputValue: this.value\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tkeyword(nVal) {\r\n\t\t\t// 双向绑定值，让v-model绑定的值双向变化\r\n\t\t\tthis.$emit('input', nVal);\r\n\t\t\t// 触发change事件，事件效果和v-model双向绑定的效果一样，让用户多一个选择\r\n\t\t\tthis.$emit('change', nVal);\r\n\t\t},\r\n\t\tvalue: {\r\n\t\t\timmediate: true,\r\n\t\t\thandler(nVal) {\r\n\t\t\t\tthis.keyword = nVal;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tcomputed: {\r\n\t\tshowActionBtn() {\r\n\t\t\tif (!this.animation && this.showAction) return true;\r\n\t\t\telse return false;\r\n\t\t},\r\n\t\t// 样式，根据用户传入的颜色值生成，如果不传入，默认为none\r\n\t\tborderStyle() {\r\n\t\t\tif (this.borderColor) return `1px solid ${this.borderColor}`;\r\n\t\t\telse return 'none';\r\n\t\t},\r\n\t\t// 将maxlength转为数值\r\n\t\tgetMaxlength() {\r\n\t\t\treturn Number(this.maxlength);\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t// 目前HX2.6.9 v-model双向绑定无效，故监听input事件获取输入框内容的变化\r\n\t\tinputChange(e) {\r\n\t\t\tthis.keyword = e.detail.value;\r\n\t\t},\r\n\t\t// 清空输入\r\n\t\t// 也可以作为用户通过this.$refs形式调用清空输入框内容\r\n\t\tclear() {\r\n\t\t\tthis.keyword = '';\r\n\t\t\t// 延后发出事件，避免在父组件监听clear事件时，value为更新前的值(不为空)\r\n\t\t\tthis.$nextTick(() => {\r\n\t\t\t\tthis.$emit('clear');\r\n\t\t\t})\r\n\t\t},\r\n\t\t// 确定搜索\r\n\t\tsearch(e) {\r\n\t\t\tthis.$emit('search', e.detail.value);\r\n\t\t\t// 收起键盘\r\n\t\t\tuni.hideKeyboard();\r\n\t\t},\r\n\t\t// 点击右边自定义按钮的事件\r\n\t\tcustom() {\r\n\t\t\tthis.$emit('custom', this.keyword);\r\n\t\t\t// 收起键盘\r\n\t\t\tuni.hideKeyboard();\r\n\t\t},\r\n\t\t// 获取焦点\r\n\t\tgetFocus() {\r\n\t\t\tthis.focused = true;\r\n\t\t\t// 开启右侧搜索按钮展开的动画效果\r\n\t\t\tif (this.animation && this.showAction) this.show = true;\r\n\t\t\tthis.$emit('focus', this.keyword);\r\n\t\t},\r\n\t\t// 失去焦点\r\n\t\tblur() {\r\n\t\t\tthis.focused = false;\r\n\t\t\tthis.show = false;\r\n\t\t\tthis.$emit('blur', this.keyword);\r\n\t\t},\r\n\t\t// 点击搜索框，只有disabled=true时才发出事件，因为禁止了输入，意味着是想跳转真正的搜索页\r\n\t\tclickHandler() {\r\n\t\t\tif(this.disabled) this.$emit('click');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-search {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tflex: 1;\r\n}\r\n\r\n.u-content {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tpadding: 0 18rpx;\r\n\tflex: 1;\r\n}\r\n\r\n.u-clear-icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.u-input {\r\n\tflex: 1;\r\n\tfont-size: 28rpx;\r\n\tline-height: 1;\r\n\tmargin: 0 10rpx;\r\n\tcolor: $u-tips-color;\r\n}\r\n\r\n.u-close-wrap {\r\n\twidth: 40rpx;\r\n\theight: 100%;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder-radius: 50%;\r\n}\r\n\r\n.u-placeholder-class {\r\n\tcolor: $u-tips-color;\r\n}\r\n\r\n.u-action {\r\n\tfont-size: 28rpx;\r\n\tcolor: $u-main-color;\r\n\twidth: 0;\r\n\toverflow: hidden;\r\n\ttransition: all 0.3s;\r\n\twhite-space: nowrap;\r\n\ttext-align: center;\r\n}\r\n\r\n.u-action-active {\r\n\twidth: 80rpx;\r\n\tmargin-left: 10rpx;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-section/u-section.vue",
    "content": "<template>\r\n\t<view class=\"u-section\">\r\n\t\t<view class=\"u-section__title\" :style=\"{\r\n\t\t\tfontWeight: bold ? 'bold' : 'normal',\r\n\t\t\tcolor: color,\r\n\t\t\tfontSize: fontSize + 'rpx',\r\n\t\t\tpaddingLeft: showLine ? (fontSize * 0.7) + 'rpx' : 0\r\n\t\t}\" :class=\"{\r\n\t\t\t'u-section--line': showLine\r\n\t\t}\">\r\n\t\t\t<view class=\"u-section__title__icon-wrap u-flex\" :style=\"[lineStyle]\" v-if=\"showLine\">\r\n\t\t\t\t<u-icon top=\"0\" name=\"column-line\" :size=\"fontSize * 1.25\" bold :color=\"lineColor ? lineColor : color\"></u-icon>\r\n\t\t\t</view>\r\n\t\t\t<text class=\"u-flex u-section__title__text\">{{title}}</text>\r\n\t\t</view>\r\n\t\t<view class=\"u-section__right-info\" v-if=\"right || $slots.right\" :style=\"{\r\n\t\t\tcolor: subColor\r\n\t\t}\" @tap=\"rightClick\"> \n\t\t\t<slot name=\"right\" v-if=\"$slots.right\" />\r\n\t\t\t<block v-else>\n\t\t\t\t{{subTitle}}\n\t\t\t\t<view class=\"u-section__right-info__icon-arrow u-flex\">\n\t\t\t\t\t<u-icon name=\"arrow-right\" size=\"24\" :color=\"subColor\"></u-icon>\n\t\t\t\t</view>\n\t\t\t</block>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * section 查看更多\r\n\t * @description 该组件一般用于分类信息有很多，但是限于篇幅只能列出一部分，让用户通过\"查看更多\"获得更多信息的场景，实际效果见演示。\r\n\t * @tutorial https://www.uviewui.com/components/section.html\r\n\t * @property {String} title 左边主标题\r\n\t * @property {String} sub-title 右边副标题（默认更多）\r\n\t * @property {Boolean} right 是否显示右边的内容（默认true）\r\n\t * @property {Boolean} showLine 是否显示左边的竖条（默认true）\r\n\t * @property {String Number} font-size 主标题的字体大小（默认28）\r\n\t * @property {Boolean} bold 主标题是否加粗（默认true）\r\n\t * @property {String} color 主标题颜色（默认#303133）\r\n\t * @event {Function} click 组件右侧的内容被点击时触发，用于跳转\"更多\"\r\n\t * @example <u-section title=\"今日热门\" :right=\"false\"></u-section>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-section\",\r\n\t\tprops: {\r\n\t\t\t// 标题信息\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 右边副标题内容\r\n\t\t\tsubTitle: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '更多'\r\n\t\t\t},\r\n\t\t\t// 是否显示右边的内容\r\n\t\t\tright: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 28\r\n\t\t\t},\r\n\t\t\t// 主标题是否加粗\r\n\t\t\tbold: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 主标题的颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#303133'\r\n\t\t\t},\r\n\t\t\t// 右边副标题的颜色\r\n\t\t\tsubColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#909399'\r\n\t\t\t},\r\n\t\t\t// 是否显示左边的竖条\r\n\t\t\tshowLine: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 左边竖线的颜色\r\n\t\t\tlineColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 左边竖条的样式\r\n\t\t\tlineStyle() {\r\n\t\t\t\t// 由于安卓和iOS的，需要稍微调整绝对定位的top值，才能让左边的竖线和右边的文字垂直居中\r\n\t\t\t\treturn {\r\n\t\t\t\t\t// 由于竖线为字体图标，具有比实际线宽更宽的宽度，所以也需要根据字体打下动态调整\r\n\t\t\t\t\tleft: -(Number(this.fontSize) * 0.9) + 'rpx',\r\n\t\t\t\t\ttop: -(Number(this.fontSize) * (this.$u.os() == 'ios' ? 0.14 : 0.15)) + 'rpx',\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\trightClick() {\r\n\t\t\t\tthis.$emit('click');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-section {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\twidth: 100%;\r\n\t\t\r\n\t\t&__title {\r\n\t\t\tposition: relative;\r\n\t\t\tfont-size: 28rpx;\r\n\t\t\tpadding-left: 20rpx;\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\t\r\n\t\t\t&__icon-wrap {\r\n\t\t\t\tposition: absolute;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t&__text {\r\n\t\t\t\tline-height: 1;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t&__right-info {\r\n\t\t\tcolor: $u-tips-color;\r\n\t\t\tfont-size: 26rpx;\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\t\r\n\t\t\t&__icon-arrow {\r\n\t\t\t\tmargin-left: 6rpx;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-select/u-select.vue",
    "content": "<template>\r\n\t<view class=\"u-select\">\r\n\t\t<!-- <view class=\"u-select__action\" :class=\"{\r\n\t\t\t'u-select--border': border\r\n\t\t}\" @tap.stop=\"selectHandler\">\r\n\t\t\t<view class=\"u-select__action__icon\" :class=\"{\r\n\t\t\t\t'u-select__action__icon--reverse': value == true\r\n\t\t\t}\">\r\n\t\t\t\t<u-icon name=\"arrow-down-fill\" size=\"26\" color=\"#c0c4cc\"></u-icon>\r\n\t\t\t</view>\r\n\t\t</view> -->\r\n\t\t<u-popup :maskCloseAble=\"maskCloseAble\" mode=\"bottom\" :popup=\"false\" v-model=\"value\" length=\"auto\" :safeAreaInsetBottom=\"safeAreaInsetBottom\" @close=\"close\" :z-index=\"uZIndex\">\r\n\t\t\t<view class=\"u-select\">\r\n\t\t\t\t<view class=\"u-select__header\" @touchmove.stop.prevent=\"\">\r\n\t\t\t\t\t<view\r\n\t\t\t\t\t\tclass=\"u-select__header__cancel u-select__header__btn\"\r\n\t\t\t\t\t\t:style=\"{ color: cancelColor }\"\r\n\t\t\t\t\t\thover-class=\"u-hover-class\"\r\n\t\t\t\t\t\t:hover-stay-time=\"150\"\r\n\t\t\t\t\t\t@tap=\"getResult('cancel')\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{cancelText}}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"u-select__header__title\">\r\n\t\t\t\t\t\t{{title}}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view\r\n\t\t\t\t\t\tclass=\"u-select__header__confirm u-select__header__btn\"\r\n\t\t\t\t\t\t:style=\"{ color: moving ? cancelColor : confirmColor }\"\r\n\t\t\t\t\t\thover-class=\"u-hover-class\"\r\n\t\t\t\t\t\t:hover-stay-time=\"150\"\r\n\t\t\t\t\t\t@touchmove.stop=\"\"\r\n\t\t\t\t\t\t@tap.stop=\"getResult('confirm')\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{confirmText}}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-select__body\">\r\n\t\t\t\t\t<picker-view @change=\"columnChange\" class=\"u-select__body__picker-view\" :value=\"defaultSelector\" @pickstart=\"pickstart\" @pickend=\"pickend\">\r\n\t\t\t\t\t\t<picker-view-column v-for=\"(item, index) in columnData\" :key=\"index\">\r\n\t\t\t\t\t\t\t<view class=\"u-select__body__picker-view__item\" v-for=\"(item1, index1) in item\" :key=\"index1\">\r\n\t\t\t\t\t\t\t\t<view class=\"u-line-1\">{{ item1[labelName] }}</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</picker-view-column>\r\n\t\t\t\t\t</picker-view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</u-popup>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * select 列选择器\r\n\t * @description 此选择器用于单列，多列，多列联动的选择场景。(从1.3.0版本起，不建议使用Picker组件的单列和多列模式，Select组件是专门为列选择而构造的组件，更简单易用。)\r\n\t * @tutorial http://uviewui.com/components/select.html\r\n\t * @property {String} mode 模式选择，\"single-column\"-单列模式，\"mutil-column\"-多列模式，\"mutil-column-auto\"-多列联动模式\r\n\t * @property {Array} list 列数据，数组形式，见官网说明\r\n\t * @property {Boolean} v-model 布尔值变量，用于控制选择器的弹出与收起\r\n\t * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false)\r\n\t * @property {String} cancel-color 取消按钮的颜色（默认#606266）\r\n\t * @property {String} confirm-color 确认按钮的颜色(默认#2979ff)\r\n\t * @property {String} confirm-text 确认按钮的文字\r\n\t * @property {String} cancel-text 取消按钮的文字\r\n\t * @property {String} default-value 提供的默认选中的下标，见官网说明\r\n\t * @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭Picker(默认true)\r\n\t * @property {String Number} z-index 弹出时的z-index值(默认10075)\r\n\t * @property {String} value-name 自定义list数据的value属性名 1.3.6\r\n\t * @property {String} label-name 自定义list数据的label属性名 1.3.6\r\n\t * @property {String} child-name 自定义list数据的children属性名，只对多列联动模式有效 1.3.7\r\n\t * @event {Function} confirm 点击确定按钮，返回当前选择的值\r\n\t * @example <u-select v-model=\"show\" :list=\"list\"></u-select>\r\n\t */\r\n\r\nexport default {\r\n\tprops: {\r\n\t\t// 列数据\r\n\t\tlist: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 是否显示边框\r\n\t\tborder: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 通过双向绑定控制组件的弹出与收起\r\n\t\tvalue: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// \"取消\"按钮的颜色\r\n\t\tcancelColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#606266'\r\n\t\t},\r\n\t\t// \"确定\"按钮的颜色\r\n\t\tconfirmColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#2979ff'\r\n\t\t},\r\n\t\t// 弹出的z-index值\r\n\t\tzIndex: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\tsafeAreaInsetBottom: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 是否允许通过点击遮罩关闭Picker\r\n\t\tmaskCloseAble: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 提供的默认选中的下标\r\n\t\tdefaultValue: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [0];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 模式选择，single-column-单列，mutil-column-多列，mutil-column-auto-多列联动\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'single-column'\r\n\t\t},\r\n\t\t// 自定义value属性名\r\n\t\tvalueName: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'value'\r\n\t\t},\r\n\t\t// 自定义label属性名\r\n\t\tlabelName: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'label'\r\n\t\t},\r\n\t\t// 自定义多列联动模式的children属性名\r\n\t\tchildName: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'children'\r\n\t\t},\r\n\t\t// 顶部标题\r\n\t\ttitle: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 取消按钮的文字\r\n\t\tcancelText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '取消'\r\n\t\t},\r\n\t\t// 确认按钮的文字\r\n\t\tconfirmText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '确认'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\t// 用于列改变时，保存当前的索引，下一次变化时比较得出是哪一列发生了变化\r\n\t\t\tdefaultSelector: [0],\r\n\t\t\t// picker-view的数据\r\n\t\t\tcolumnData: [],\r\n\t\t\t// 每次队列发生变化时，保存选择的结果\r\n\t\t\tselectValue: [],\r\n\t\t\t// 上一次列变化时的index\r\n\t\t\tlastSelectIndex: [],\r\n\t\t\t// 列数\r\n\t\t\tcolumnNum: 0,\r\n\t\t\t// 列是否还在滑动中，微信小程序如果在滑动中就点确定，结果可能不准确\r\n\t\t\tmoving: false\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\t// 在select弹起的时候，重新初始化所有数据\r\n\t\tvalue: {\r\n\t\t\timmediate: true,\r\n\t\t\thandler(val) {\r\n\t\t\t\tif(val) setTimeout(() => this.init(), 10);\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tcomputed: {\r\n\t\tuZIndex() {\r\n\t\t\t// 如果用户有传递z-index值，优先使用\r\n\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.popup;\r\n\t\t},\r\n\t},\r\n\tmethods: {\r\n\t\t// 标识滑动开始，只有微信小程序才有这样的事件\r\n\t\tpickstart() {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.moving = true;\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\t// 标识滑动结束\r\n\t\tpickend() {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tthis.moving = false;\r\n\t\t\t// #endif\r\n\t\t},\r\n\t\tinit() {\r\n\t\t\tthis.setColumnNum();\r\n\t\t\tthis.setDefaultSelector();\r\n\t\t\tthis.setColumnData();\r\n\t\t\tthis.setSelectValue();\r\n\t\t},\r\n\t\t// 获取默认选中列下标\r\n\t\tsetDefaultSelector() {\r\n\t\t\t// 如果没有传入默认选中的值，生成长度为columnNum，用0填充的数组\r\n\t\t\tthis.defaultSelector = this.defaultValue.length == this.columnNum ? this.defaultValue : Array(this.columnNum).fill(0);\r\n\t\t\tthis.lastSelectIndex = this.$u.deepClone(this.defaultSelector);\r\n\t\t},\r\n\t\t// 计算列数\r\n\t\tsetColumnNum() {\r\n\t\t\t// 单列的列数为1\r\n\t\t\tif(this.mode == 'single-column') this.columnNum = 1;\r\n\t\t\t// 多列时，this.list数组长度就是列数\r\n\t\t\telse if(this.mode == 'mutil-column') this.columnNum = this.list.length;\r\n\t\t\t// 多列联动时，通过历遍this.list的第一个元素，得出有多少列\r\n\t\t\telse if(this.mode == 'mutil-column-auto') {\r\n\t\t\t\tlet num = 1;\r\n\t\t\t\tlet column = this.list;\r\n\t\t\t\t// 只要有元素并且第一个元素有children属性，继续历遍\r\n\t\t\t\twhile(column[0][this.childName]) {\r\n\t\t\t\t\tcolumn = column[0] ? column[0][this.childName] : {};\r\n\t\t\t\t\tnum ++;\r\n\t\t\t\t}\r\n\t\t\t\tthis.columnNum = num;\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 获取需要展示在picker中的列数据\r\n\t\tsetColumnData() {\r\n\t\t\tlet data = [];\r\n\t\t\tthis.selectValue = [];\r\n\t\t\tif(this.mode == 'mutil-column-auto') {\r\n\t\t\t\t// 获得所有数据中的第一个元素\r\n\t\t\t\tlet column = this.list[this.defaultSelector.length ? this.defaultSelector[0] : 0];\r\n\t\t\t\t// 通过循环所有的列数，再根据设定列的数组，得出当前需要渲染的整个列数组\r\n\t\t\t\tfor (let i = 0; i < this.columnNum; i++) {\r\n\t\t\t\t\t// 第一列默认为整个list数组\r\n\t\t\t\t\tif (i == 0) {\r\n\t\t\t\t\t\tdata[i] = this.list;\r\n\t\t\t\t\t\tcolumn = column[this.childName];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 大于第一列时，判断是否有默认选中的，如果没有就用该列的第一项\r\n\t\t\t\t\t\tdata[i] = column;\r\n\t\t\t\t\t\tcolumn = column[this.defaultSelector[i]][this.childName];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if(this.mode == 'single-column') {\r\n\t\t\t\tdata[0] = this.list;\r\n\t\t\t} else {\r\n\t\t\t\tdata = this.list;\r\n\t\t\t}\r\n\t\t\tthis.columnData = data;\r\n\t\t},\r\n\t\t// 获取默认选中的值，如果没有设置defaultValue，就默认选中每列的第一个\r\n\t\tsetSelectValue() {\r\n\t\t\tlet tmp = null;\r\n\t\t\tfor(let i = 0; i < this.columnNum; i++) {\r\n\t\t\t\ttmp = this.columnData[i][this.defaultSelector[i]];\r\n\t\t\t\tlet data = {\r\n\t\t\t\t\tvalue: tmp ? tmp[this.valueName] : null,\r\n\t\t\t\t\tlabel: tmp ? tmp[this.labelName] : null\r\n\t\t\t\t};\r\n\t\t\t\t// 判断是否存在额外的参数，如果存在，就返回\r\n\t\t\t\tif(tmp && tmp.extra) data.extra = tmp.extra;\r\n\t\t\t\tthis.selectValue.push(data)\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 列选项\r\n\t\tcolumnChange(e) {\r\n\t\t\tlet index = null;\r\n\t\t\tlet columnIndex = e.detail.value;\r\n\t\t\t// 由于后面是需要push进数组的，所以需要先清空数组\r\n\t\t\tthis.selectValue = [];\r\n\t\t\tif(this.mode == 'mutil-column-auto') {\r\n\t\t\t\t// 对比前后两个数组，寻找变更的是哪一列，如果某一个元素不同，即可判定该列发生了变化\r\n\t\t\t\tthis.lastSelectIndex.map((val, idx) => {\r\n\t\t\t\t\tif (val != columnIndex[idx]) index = idx;\r\n\t\t\t\t});\r\n\t\t\t\tthis.defaultSelector = columnIndex;\r\n\t\t\t\tfor (let i = index + 1; i < this.columnNum; i++) {\r\n\t\t\t\t\t// 当前变化列的下一列的数据，需要获取上一列的数据，同时需要指定是上一列的第几个的children，再往后的\r\n\t\t\t\t\t// 默认是队列的第一个为默认选项\r\n\t\t\t\t\tthis.columnData[i] = this.columnData[i - 1][i - 1 == index ? columnIndex[index] : 0][this.childName];\r\n\t\t\t\t\t// 改变的列之后的所有列，默认选中第一个\r\n\t\t\t\t\tthis.defaultSelector[i] = 0;\r\n\t\t\t\t}\r\n\t\t\t\t// 在历遍的过程中，可能由于上一步修改this.columnData，导致产生连锁反应，程序触发columnChange，会有多次调用\r\n\t\t\t\t// 只有在最后一次数据稳定后的结果是正确的，此前的历遍中，可能会产生undefined，故需要判断\r\n\t\t\t\tcolumnIndex.map((item, index) => {\r\n\t\t\t\t\tlet data = this.columnData[index][columnIndex[index]];\r\n\t\t\t\t\tlet tmp = {\r\n\t\t\t\t\t\tvalue: data ? data[this.valueName] : null,\r\n\t\t\t\t\t\tlabel: data ? data[this.labelName] : null,\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// 判断是否有需要额外携带的参数\r\n\t\t\t\t\tif(data && data.extra) tmp.extra = data.extra;\r\n\t\t\t\t\tthis.selectValue.push(tmp);\r\n\r\n\t\t\t\t})\r\n\t\t\t\t// 保存这一次的结果，用于下次列发生变化时作比较\r\n\t\t\t\tthis.lastSelectIndex = columnIndex;\r\n\t\t\t} else if(this.mode == 'single-column') {\r\n\t\t\t\tlet data = this.columnData[0][columnIndex[0]];\r\n\t\t\t\t// 初始默认选中值\r\n\t\t\t\tlet tmp = {\r\n\t\t\t\t\tvalue: data ? data[this.valueName] : null,\r\n\t\t\t\t\tlabel: data ? data[this.labelName] : null,\r\n\t\t\t\t};\r\n\t\t\t\t// 判断是否有需要额外携带的参数\r\n\t\t\t\tif(data && data.extra) tmp.extra = data.extra;\r\n\t\t\t\tthis.selectValue.push(tmp);\r\n\t\t\t} else if(this.mode == 'mutil-column') {\r\n\t\t\t\t// 初始默认选中值\r\n\t\t\t\tcolumnIndex.map((item, index) => {\r\n\t\t\t\t\tlet data = this.columnData[index][columnIndex[index]];\r\n\t\t\t\t\t// 初始默认选中值\r\n\t\t\t\t\tlet tmp = {\r\n\t\t\t\t\t\tvalue: data ? data[this.valueName] : null,\r\n\t\t\t\t\t\tlabel: data ? data[this.labelName] : null,\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// 判断是否有需要额外携带的参数\r\n\t\t\t\t\tif(data && data.extra) tmp.extra = data.extra;\r\n\t\t\t\t\tthis.selectValue.push(tmp);\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t},\r\n\t\tclose() {\r\n\t\t\tthis.$emit('input', false);\r\n\t\t},\r\n\t\t// 点击确定或者取消\r\n\t\tgetResult(event = null) {\r\n\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\tif (this.moving) return;\r\n\t\t\t// #endif\r\n\t\t\tif (event) this.$emit(event, this.selectValue);\r\n\t\t\tthis.close();\r\n\t\t},\r\n\t\tselectHandler() {\r\n\t\t\tthis.$emit('click');\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-select {\r\n\r\n\t&__action {\r\n\t\tposition: relative;\r\n\t\tline-height: $u-form-item-height;\r\n\t\theight: $u-form-item-height;\r\n\r\n\t\t&__icon {\r\n\t\t\tposition: absolute;\r\n\t\t\tright: 20rpx;\r\n\t\t\ttop: 50%;\r\n\t\t\ttransition: transform .4s;\r\n\t\t\ttransform: translateY(-50%);\r\n\t\t\tz-index: 1;\r\n\r\n\t\t\t&--reverse {\r\n\t\t\t\ttransform: rotate(-180deg) translateY(50%);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&__hader {\r\n\t\t&__title {\r\n\t\t\tcolor: $u-content-color;\r\n\t\t}\r\n\t}\r\n\r\n\t&--border {\r\n\t\tborder-radius: 6rpx;\r\n\t\tborder-radius: 4px;\r\n\t\tborder: 1px solid $u-form-item-border-color;\r\n\t}\r\n\r\n\t&__header {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t\theight: 80rpx;\r\n\t\tpadding: 0 40rpx;\r\n\t}\r\n\r\n\t&__body {\r\n\t\twidth: 100%;\r\n\t\theight: 500rpx;\r\n\t\toverflow: hidden;\r\n\t\tbackground-color: #fff;\r\n\r\n\t\t&__picker-view {\r\n\t\t\theight: 100%;\r\n\t\t\tbox-sizing: border-box;\r\n\r\n\t\t\t&__item {\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tjustify-content: center;\r\n\t\t\t\tfont-size: 32rpx;\r\n\t\t\t\tcolor: $u-main-color;\r\n\t\t\t\tpadding: 0 8rpx;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-skeleton/u-skeleton.vue",
    "content": "<template>\r\n\t<view v-if=\"loading\" :style=\"{\r\n\t\twidth: windowWinth + 'px', \r\n\t\theight: windowHeight + 'px', \r\n\t\tbackgroundColor: bgColor, \r\n\t\tposition: 'absolute', \r\n\t\tleft: left + 'px', \r\n\t\ttop: top + 'px', \r\n\t\tzIndex: 9998, \r\n\t\toverflow: 'hidden'\r\n\t}\"\r\n\t @touchmove.stop.prevent>\r\n\t\t<view v-for=\"(item, index) in RectNodes\" :key=\"$u.guid()\" :class=\"[animation ? 'skeleton-fade' : '']\" :style=\"{\r\n\t\t\twidth: item.width + 'px', \r\n\t\t\theight: item.height + 'px', \r\n\t\t\tbackgroundColor: elColor, \r\n\t\t\tposition: 'absolute', \r\n\t\t\tleft: (item.left - left) + 'px', \r\n\t\t\ttop: (item.top - top) + 'px'\r\n\t\t}\"></view>\r\n\t\t<view v-for=\"(item, index) in circleNodes\" :key=\"$u.guid()\" :class=\"animation ? 'skeleton-fade' : ''\" :style=\"{\r\n\t\t\twidth: item.width + 'px', \r\n\t\t\theight: item.height + 'px', \r\n\t\t\tbackgroundColor: elColor, \r\n\t\t\tborderRadius: item.width/2 + 'px', \r\n\t\t\tposition: 'absolute', \r\n\t\t\tleft: (item.left - left) + 'px',\r\n\t\t\ttop: (item.top - top) + 'px'\r\n\t\t}\"></view>\r\n\t\t<view v-for=\"(item, index) in filletNodes\" :key=\"$u.guid()\" :class=\"animation ? 'skeleton-fade' : ''\" :style=\"{\r\n\t\t\twidth: item.width + 'px', \r\n\t\t\theight: item.height + 'px', \r\n\t\t\tbackgroundColor: elColor, \r\n\t\t\tborderRadius: borderRadius + 'rpx', \r\n\t\t\tposition: 'absolute', \r\n\t\t\tleft: (item.left - left) + 'px',\r\n\t\t\ttop: (item.top - top) + 'px'\r\n\t\t}\"></view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * skeleton 骨架屏\r\n\t * @description 骨架屏一般用于页面在请求远程数据尚未完成时，页面用灰色块预显示本来的页面结构，给用户更好的体验。\r\n\t * @tutorial https://www.uviewui.com/components/skeleton.html\r\n\t * @property {String} el-color 骨架块状元素的背景颜色（默认#e5e5e5）\r\n\t * @property {String} bg-color 骨架组件背景颜色（默认#ffffff）\r\n\t * @property {Boolean} animation 骨架块是否显示动画效果（默认false）\r\n\t * @property {String Number} border-radius u-skeleton-fillet类名元素，对应的骨架块的圆角大小，单位rpx（默认10）\r\n\t * @property {Boolean} loading 是否显示骨架组件，请求完成后，将此值设置为false（默认true）\r\n\t * @example <u-skeleton :loading=\"true\" :animation=\"true\"></u-skeleton>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-skeleton\",\r\n\t\tprops: {\r\n\t\t\t// 需要渲染的元素背景颜色，十六进制或者rgb等都可以\r\n\t\t\telColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#e5e5e5'\r\n\t\t\t},\r\n\t\t\t// 整个骨架屏页面的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 是否显示加载动画\r\n\t\t\tanimation: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 圆角值，只对类名为u-skeleton-fillet的元素生效，为数值，不带单位\r\n\t\t\tborderRadius: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: \"10\"\r\n\t\t\t},\r\n\t\t\t// 是否显示骨架，true-显示，false-隐藏\r\n\t\t\tloading: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\twindowWinth: 750, // 骨架屏宽度\r\n\t\t\t\twindowHeight: 1500, // 骨架屏高度\r\n\t\t\t\tfilletNodes: [], // 圆角元素\r\n\t\t\t\tcircleNodes: [], // 圆形元素\r\n\t\t\t\tRectNodes: [], // 矩形元素\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: 0,\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 查询各节点的信息\r\n\t\t\tselecterQueryInfo() {\r\n\t\t\t\t// 获取整个父组件容器的高度，当做骨架屏的高度 \r\n\t\t\t\t// 在微信小程序中，如果把骨架屏放入组件中使用的话，需要调in(this)上下文为父组件才有效\r\n\t\t\t\tlet query = '';\r\n\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery().in(this.$parent);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery()\r\n\t\t\t\t// #endif\r\n\t\t\t\tquery.selectAll('.u-skeleton').boundingClientRect().exec((res) => {\r\n\t\t\t\t\tthis.windowHeight = res[0][0].height;\r\n\t\t\t\t\tthis.windowWinth = res[0][0].width;\r\n\t\t\t\t\tthis.top = res[0][0].bottom - res[0][0].height;\r\n\t\t\t\t\tthis.left = res[0][0].left;\r\n\t\t\t\t});\r\n\t\t\t\t// 矩形骨架元素\r\n\t\t\t\tthis.getRectEls();\r\n\t\t\t\t// 圆形骨架元素\r\n\t\t\t\tthis.getCircleEls();\r\n\t\t\t\t// 圆角骨架元素\r\n\t\t\t\tthis.getFilletEls();\r\n\t\t\t},\r\n\t\t\t// 矩形元素列表\r\n\t\t\tgetRectEls() {\r\n\t\t\t\tlet query = '';\r\n\t\t\t\t// 在微信小程序中，如果把骨架屏放入组件中使用的话，需要调in(this)上下文为父组件才有效\r\n\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery().in(this.$parent);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery()\r\n\t\t\t\t// #endif\r\n\t\t\t\tquery.selectAll('.u-skeleton-rect').boundingClientRect().exec((res) => {\r\n\t\t\t\t\tthis.RectNodes = res[0];\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t// 圆角元素列表\r\n\t\t\tgetFilletEls() {\r\n\t\t\t\tlet query = '';\r\n\t\t\t\t// 在微信小程序中，如果把骨架屏放入组件中使用的话，需要调in(this)上下文为父组件才有效\r\n\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery().in(this.$parent);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery()\r\n\t\t\t\t// #endif\r\n\t\t\t\tquery.selectAll('.u-skeleton-fillet').boundingClientRect().exec((res) => {\r\n\t\t\t\t\tthis.filletNodes = res[0];\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t// 圆形元素列表\r\n\t\t\tgetCircleEls() {\r\n\t\t\t\tlet query = '';\r\n\t\t\t\t// 在微信小程序中，如果把骨架屏放入组件中使用的话，需要调in(this)上下文为父组件才有效\r\n\t\t\t\t// #ifdef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery().in(this.$parent);\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef MP-WEIXIN\r\n\t\t\t\tquery = uni.createSelectorQuery()\r\n\t\t\t\t// #endif\r\n\t\t\t\tquery.selectAll('.u-skeleton-circle').boundingClientRect().exec((res) => {\r\n\t\t\t\t\tthis.circleNodes = res[0];\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 组件被挂载\r\n\t\tmounted() {\r\n\t\t\t// 获取系统信息\r\n\t\t\tlet systemInfo = uni.getSystemInfoSync();\r\n\t\t\tthis.windowHeight = systemInfo.windowHeight;\r\n\t\t\tthis.windowWinth = systemInfo.windowWidth;\r\n\t\t\tthis.selecterQueryInfo();\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.skeleton-fade {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tbackground: rgb(194, 207, 214);\r\n\t\tanimation-duration: 1.5s;\r\n\t\tanimation-name: blink;\r\n\t\tanimation-timing-function: ease-in-out;\r\n\t\tanimation-iteration-count: infinite;\r\n\t}\r\n\r\n\t@keyframes blink {\r\n\t\t0% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\r\n\t\t50% {\r\n\t\t\topacity: 0.4;\r\n\t\t}\r\n\r\n\t\t100% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-slider/u-slider.vue",
    "content": "<template>\r\n\t<view class=\"u-slider\" @tap=\"onClick\" :class=\"[disabled ? 'u-slider--disabled' : '']\" :style=\"{\r\n\t\tbackgroundColor: inactiveColor\r\n\t}\">\r\n\t\t<view\r\n\t\t\tclass=\"u-slider__gap\"\r\n\t\t\t:style=\"[\r\n\t\t\t\tbarStyle,\r\n\t\t\t\t{\r\n\t\t\t\t\theight: height + 'rpx',\r\n\t\t\t\t\tbackgroundColor: activeColor\r\n\t\t\t\t}\r\n\t\t\t]\"\r\n\t\t>\r\n\t\t\t<view class=\"u-slider__button-wrap\" @touchstart=\"onTouchStart\" \r\n\t\t\t\t@touchmove=\"onTouchMove\" @touchend=\"onTouchEnd\" \r\n\t\t\t\t@touchcancel=\"onTouchEnd\">\r\n\t\t\t\t<slot v-if=\"$slots.default\"/>\r\n\t\t\t\t<view v-else class=\"u-slider__button\" :style=\"[blockStyle, {\r\n\t\t\t\t\theight: blockWidth + 'rpx',\r\n\t\t\t\t\twidth: blockWidth + 'rpx',\r\n\t\t\t\t\tbackgroundColor: blockColor\r\n\t\t\t\t}]\"></view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * slider 滑块选择器\r\n * @tutorial https://uviewui.com/components/slider.html\r\n * @property {Number | String} value 滑块默认值（默认0）\r\n * @property {Number | String} min 最小值（默认0）\r\n * @property {Number | String} max 最大值（默认100）\r\n * @property {Number | String} step 步长（默认1）\r\n * @property {Number | String} blockWidth 滑块宽度，高等于宽（30）\r\n * @property {Number | String} height 滑块条高度，单位rpx（默认6）\r\n * @property {String} inactiveColor 底部条背景颜色（默认#c0c4cc）\r\n * @property {String} activeColor 底部选择部分的背景颜色（默认#2979ff）\r\n * @property {String} blockColor 滑块颜色（默认#ffffff）\r\n * @property {Object} blockStyle 给滑块自定义样式，对象形式\r\n * @property {Boolean} disabled 是否禁用滑块(默认为false)\r\n * @event {Function} start 滑动触发\r\n * @event {Function} moving 正在滑动中\r\n * @event {Function} end 滑动结束\r\n * @example <u-slider v-model=\"value\" />\r\n */\r\nexport default {\r\n\tname: 'u-slider',\r\n\tprops: {\r\n\t\t// 当前进度百分比值，范围0-100\r\n\t\tvalue: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 是否禁用滑块\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 滑块宽度，高等于宽，单位rpx\r\n\t\tblockWidth: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 30\r\n\t\t},\r\n\t\t// 最小值\r\n\t\tmin: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 最大值\r\n\t\tmax: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 100\r\n\t\t},\r\n\t\t// 步进值\r\n\t\tstep: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 1\r\n\t\t},\r\n\t\t// 滑块条高度，单位rpx\r\n\t\theight: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 6\r\n\t\t},\r\n\t\t// 进度条的激活部分颜色\r\n\t\tactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#2979ff'\r\n\t\t},\r\n\t\t// 进度条的背景颜色\r\n\t\tinactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#c0c4cc'\r\n\t\t},\r\n\t\t// 滑块的背景颜色\r\n\t\tblockColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#ffffff'\r\n\t\t},\r\n\t\t// 用户对滑块的自定义颜色\r\n\t\tblockStyle: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tstartX: 0,\r\n\t\t\tstatus: 'end',\r\n\t\t\tnewValue: 0,\r\n\t\t\tdistanceX: 0,\r\n\t\t\tstartValue: 0,\r\n\t\t\tbarStyle: {},\r\n\t\t\tsliderRect: {\r\n\t\t\t\tleft: 0,\r\n\t\t\t\twidth: 0\r\n\t\t\t}\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tvalue(n) {\r\n\t\t\t// 只有在非滑动状态时，才可以通过value更新滑块值，这里监听，是为了让用户触发\r\n\t\t\tif(this.status == 'end') this.updateValue(this.value, false);\r\n\t\t}\r\n\t},\r\n\tcreated() {\r\n\t\tthis.updateValue(this.value, false);\r\n\t},\r\n\tmounted() {\r\n\t\t// 获取滑块条的尺寸信息\r\n\t\tthis.$uGetRect('.u-slider').then(rect => {\r\n\t\t\tthis.sliderRect = rect;\r\n\t\t});\r\n\t},\r\n\tmethods: {\r\n\t\tonTouchStart(event) {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\tthis.startX = 0;\r\n\t\t\t// 触摸点集\r\n\t\t\tlet touches = event.touches[0];\r\n\t\t\t// 触摸点到屏幕左边的距离\r\n\t\t\tthis.startX = touches.clientX;\r\n\t\t\t// 此处的this.value虽为props值，但是通过$emit('input')进行了修改\r\n\t\t\tthis.startValue = this.format(this.value);\r\n\t\t\t// 标示当前的状态为开始触摸滑动\r\n\t\t\tthis.status = 'start';\r\n\t\t},\r\n\t\tonTouchMove(event) {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\t// 连续触摸的过程会一直触发本方法，但只有手指触发且移动了才被认为是拖动了，才发出事件\r\n\t\t\t// 触摸后第一次移动已经将status设置为moving状态，故触摸第二次移动不会触发本事件\r\n\t\t\tif (this.status == 'start') this.$emit('start');\r\n\t\t\tlet touches = event.touches[0];\r\n\t\t\t// 滑块的左边不一定跟屏幕左边接壤，所以需要减去最外层父元素的左边值\r\n\t\t\tthis.distanceX = touches.clientX - this.sliderRect.left;\r\n\t\t\t// 获得移动距离对整个滑块的百分比值，此为带有多位小数的值，不能用此更新视图\r\n\t\t\t// 否则造成通信阻塞，需要每改变一个step值时修改一次视图\r\n\t\t\tthis.newValue = (this.distanceX / this.sliderRect.width) * 100;\r\n\t\t\tthis.status = 'moving';\r\n\t\t\t// 发出moving事件\r\n\t\t\tthis.$emit('moving');\r\n\t\t\tthis.updateValue(this.newValue, true);\r\n\t\t},\r\n\t\tonTouchEnd() {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\tif (this.status === 'moving') {\r\n\t\t\t\tthis.updateValue(this.newValue, false);\r\n\t\t\t\tthis.$emit('end');\r\n\t\t\t}\r\n\t\t\tthis.status = 'end';\r\n\t\t},\r\n\t\tupdateValue(value, drag) {\r\n\t\t\t// 去掉小数部分，同时也是对step步进的处理\r\n\t\t\tconst width = this.format(value);\r\n\t\t\t// 设置移动的百分比值\r\n\t\t\tlet barStyle = {\r\n\t\t\t\twidth: width + '%'\r\n\t\t\t};\r\n\t\t\t// 移动期间无需过渡动画\r\n\t\t\tif (drag == true) {\r\n\t\t\t\tbarStyle.transition = 'none';\r\n\t\t\t} else {\r\n\t\t\t\t// 非移动期间，删掉对过渡为空的声明，让css中的声明起效\r\n\t\t\t\tdelete barStyle.transition;\r\n\t\t\t}\r\n\t\t\t// 修改value值\r\n\t\t\tthis.$emit('input', width);\r\n\t\t\tthis.barStyle = barStyle;\r\n\t\t},\r\n\t\tformat(value) {\r\n\t\t\t// 将小数变成整数，为了减少对视图的更新，造成视图层与逻辑层的阻塞\r\n\t\t\treturn Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step;\r\n\t\t},\r\n\t\tonClick(event) {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\t// 直接点击滑块的情况，计算方式与onTouchMove方法相同\r\n\t\t\tconst value = ((event.detail.x - this.sliderRect.left) / this.sliderRect.width) * 100;\r\n\t\t\tthis.updateValue(value, false);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-slider {\r\n\tposition: relative;\r\n\tborder-radius: 999px;\r\n\tborder-radius: 999px;\r\n\tbackground-color: #ebedf0;\r\n}\r\n\r\n.u-slider:before {\r\n\tposition: absolute;\r\n\tright: 0;\r\n\tleft: 0;\r\n\tcontent: '';\r\n\ttop: -8px;\r\n\tbottom: -8px;\r\n\tz-index: -1;\r\n}\r\n\r\n.u-slider__gap {\r\n\tposition: relative;\r\n\tborder-radius: inherit;\r\n\ttransition: width 0.2s;\r\n\ttransition: width 0.2s;\r\n\tbackground-color: #1989fa;\r\n}\r\n\r\n.u-slider__button {\r\n\twidth: 24px;\r\n\theight: 24px;\r\n\tborder-radius: 50%;\r\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);\r\n\tbackground-color: #fff;\r\n\tcursor: pointer;\r\n}\r\n\r\n.u-slider__button-wrap {\r\n\tposition: absolute;\r\n\ttop: 50%;\r\n\tright: 0;\r\n\ttransform: translate3d(50%, -50%, 0);\r\n}\r\n\r\n.u-slider--disabled {\r\n\topacity: 0.5;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-steps/u-steps.vue",
    "content": "<template>\r\n\t<view class=\"\">\r\n\t\t<view\r\n\t\t\tclass=\"u-steps\"\r\n\t\t\t:style=\"{\r\n\t\t\t\tflexDirection: direction\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<view class=\"u-steps__item\" \r\n\t\t\t\t:class=\"['u-steps__item--' + direction]\" \r\n\t\t\t\tv-for=\"(item, index) in list\" :key=\"index\"\r\n\t\t\t>\r\n\t\t\t\t<view\r\n\t\t\t\t\tclass=\"u-steps__item__num\"\r\n\t\t\t\t\tv-if=\"mode == 'number'\"\r\n\t\t\t\t\t:style=\"{\r\n\t\t\t\t\t\tbackgroundColor: current < index ? 'transparent' : activeColor,\r\n\t\t\t\t\t\tborderColor: current < index ? unActiveColor : activeColor\r\n\t\t\t\t\t}\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<text v-if=\"current < index\" :style=\"{\r\n\t\t\t\t\t\tcolor: current < index ? unActiveColor : activeColor,\r\n\t\t\t\t\t}\">\r\n\t\t\t\t\t\t{{ index + 1 }}\r\n\t\t\t\t\t</text>\r\n\t\t\t\t\t<u-icon v-else size=\"22\" color=\"#ffffff\" :name=\"icon\"></u-icon>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-steps__item__dot\" v-if=\"mode == 'dot'\" :style=\"{ \r\n\t\t\t\t\tbackgroundColor: index <= current ? activeColor : unActiveColor \r\n\t\t\t\t}\"></view>\r\n\t\t\t\t<text :style=\"{ \r\n\t\t\t\t\tcolor: index <= current ? activeColor : unActiveColor,\r\n\t\t\t\t}\" :class=\"['u-steps__item__text--' + direction]\">\r\n\t\t\t\t\t{{ item.name }}\r\n\t\t\t\t</text>\r\n\t\t\t\t<view class=\"u-steps__item__line\" :class=\"['u-steps__item__line--' + mode]\" v-if=\"index < list.length - 1\">\r\n\t\t\t\t\t<u-line :direction=\"direction\" length=\"100%\" :hair-line=\"false\" :color=\"unActiveColor\"></u-line>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * steps 步骤条\r\n * @description 该组件一般用于完成一个任务要分几个步骤，标识目前处于第几步的场景。\r\n * @tutorial https://www.uviewui.com/components/steps.html\r\n * @property {String} mode 设置模式（默认dot）\r\n * @property {Array} list 数轴条数据，数组。具体见上方示例\r\n * @property {String} type type主题（默认primary）\r\n * @property {String} direction row-横向，column-竖向（默认row）\r\n * @property {Number String} current 设置当前处于第几步\r\n * @property {String} active-color 已完成步骤的激活颜色，如设置，type值会失效\r\n * @property {String} un-active-color 未激活的颜色，用于表示未完成步骤的颜色（默认#606266）\r\n * @example <u-steps :list=\"numList\" active-color=\"#fa3534\"></u-steps>\r\n */\r\nexport default {\r\n\tname: 'u-steps',\r\n\tprops: {\r\n\t\t// 步骤条的类型，dot|number\r\n\t\tmode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'dot'\r\n\t\t},\r\n\t\t// 步骤条的数据\r\n\t\tlist: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 主题类型, primary|success|info|warning|error\r\n\t\ttype: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'primary'\r\n\t\t},\r\n\t\t// 当前哪一步是激活的\r\n\t\tcurrent: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 0\r\n\t\t},\r\n\t\t// 激活步骤的颜色\r\n\t\tactiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#2979ff'\r\n\t\t},\r\n\t\t// 未激活的颜色\r\n\t\tunActiveColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#909399'\r\n\t\t},\r\n\t\t// 自定义图标\r\n\t\ticon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'checkmark'\r\n\t\t},\r\n\t\t// step的排列方向，row-横向，column-竖向\r\n\t\tdirection: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'row'\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {};\r\n\t},\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import '../../libs/css/style.components.scss';\r\n\r\n$u-steps-item-number-width: 44rpx;\r\n$u-steps-item-dot-width: 20rpx;\r\n\r\n.u-steps {\r\n\tdisplay: flex;\r\n\t\r\n\t.u-steps__item {\r\n\t\tflex: 1;\r\n\t\ttext-align: center;\r\n\t\tposition: relative;\r\n\t\tmin-width: 100rpx;\r\n\t\tfont-size: 26rpx;\r\n\t\tcolor: #8799a3;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\tflex-direction: column;\r\n\t\talign-items: center;\r\n\t\t\r\n\t\t&--row {\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-direction: column;\r\n\t\t\t\r\n\t\t\t.u-steps__item__line {\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\tz-index: 0;\r\n\t\t\t\tleft: 75%;\r\n\t\t\t\twidth: 50%;\r\n\t\t\t\t\r\n\t\t\t\t&--dot {\r\n\t\t\t\t\ttop: calc(#{$u-steps-item-dot-width} / 2);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t&--number {\r\n\t\t\t\t\ttop: calc(#{$u-steps-item-number-width} / 2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t&--column {\r\n\t\t\tdisplay: flex;\r\n\t\t\tflex-direction: row;\r\n\t\t\tjustify-content: flex-start;\r\n\t\t\tmin-height: 120rpx;\r\n\t\t\t\r\n\t\t\t.u-steps__item__line {\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\tz-index: 0;\r\n\t\t\t\theight: 50%;\r\n\t\t\t\ttop: 75%;\r\n\t\t\t\t\r\n\t\t\t\t&--dot {\r\n\t\t\t\t\tleft: calc(#{$u-steps-item-dot-width} / 2);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t&--number {\r\n\t\t\t\t\tleft: calc(#{$u-steps-item-number-width} / 2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t&__num {\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tjustify-content: center;\r\n\t\t\twidth: $u-steps-item-number-width;\r\n\t\t\theight: $u-steps-item-number-width;\r\n\t\t\tborder: 1px solid #8799a3;\r\n\t\t\tborder-radius: 50%;\r\n\t\t\toverflow: hidden;\r\n\t\t}\r\n\t\t\r\n\t\t&__dot {\r\n\t\t\twidth: $u-steps-item-dot-width;\r\n\t\t\theight: $u-steps-item-dot-width;\r\n\t\t\tdisplay: flex;\r\n\t\t\tborder-radius: 50%;\r\n\t\t}\r\n\t\t\r\n\t\t&__text--row {\r\n\t\t\tmargin-top: 14rpx;\r\n\t\t}\r\n\t\t\r\n\t\t&__text--column {\r\n\t\t\tmargin-left: 14rpx;\r\n\t\t}\r\n\t}\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-sticky/u-sticky.vue",
    "content": "<template>\r\n\t<view class=\"\">\r\n\t\t<view class=\"u-sticky-wrap\" :class=\"[elClass]\" :style=\"{\r\n\t\t\theight: fixed ? height + 'px' : 'auto',\r\n\t\t\tbackgroundColor: bgColor\r\n\t\t}\">\r\n\t\t\t<view class=\"u-sticky\" :style=\"{\r\n\t\t\t\tposition: fixed ? 'fixed' : 'static',\r\n\t\t\t\ttop: stickyTop + 'px',\r\n\t\t\t\tleft: left + 'px',\r\n\t\t\t\twidth: width == 'auto' ? 'auto' : width + 'px',\r\n\t\t\t\tzIndex: uZIndex\r\n\t\t\t}\">\r\n\t\t\t\t<slot></slot>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * sticky 吸顶\r\n\t * @description 该组件与CSS中position: sticky属性实现的效果一致，当组件达到预设的到顶部距离时， 就会固定在指定位置，组件位置大于预设的顶部距离时，会重新按照正常的布局排列。\r\n\t * @tutorial https://www.uviewui.com/components/sticky.html\r\n\t * @property {String Number} offset-top 吸顶时与顶部的距离，单位rpx（默认0）\r\n\t * @property {String Number} index 自定义标识，用于区分是哪一个组件\r\n\t * @property {Boolean} enable 是否开启吸顶功能（默认true）\r\n\t * @property {String} bg-color 组件背景颜色（默认#ffffff）\r\n\t * @property {String Number} z-index 吸顶时的z-index值（默认970）\r\n\t * @property {String Number} h5-nav-height 导航栏高度，自定义导航栏时(无导航栏时需设置为0)，需要传入此值，单位px（默认44）\r\n\t * @event {Function} fixed 组件吸顶时触发\r\n\t * @event {Function} unfixed 组件取消吸顶时触发\r\n\t * @example <u-sticky offset-top=\"200\"><view>塞下秋来风景异，衡阳雁去无留意</view></u-sticky>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-sticky\",\r\n\t\tprops: {\r\n\t\t\t// 吸顶容器到顶部某个距离的时候，进行吸顶，在H5平台，NavigationBar为44px\r\n\t\t\toffsetTop: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t//列表中的索引值\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 是否开启吸顶功能\r\n\t\t\tenable: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// h5顶部导航栏的高度\r\n\t\t\th5NavHeight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 44\r\n\t\t\t},\r\n\t\t\t// 吸顶区域的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tfixed: false,\r\n\t\t\t\theight: 'auto',\r\n\t\t\t\tstickyTop: 0,\r\n\t\t\t\telClass: this.$u.guid(),\r\n\t\t\t\tleft: 0,\r\n\t\t\t\twidth: 'auto',\r\n\t\t\t};\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\toffsetTop(val) {\r\n\t\t\t\tthis.initObserver();\r\n\t\t\t},\r\n\t\t\tenable(val) {\r\n\t\t\t\tif (val == false) {\r\n\t\t\t\t\tthis.fixed = false;\r\n\t\t\t\t\tthis.disconnectObserver('contentObserver');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.initObserver();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tuZIndex() {\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.sticky;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.initObserver();\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tinitObserver() {\r\n\t\t\t\tif (!this.enable) return;\r\n\t\t\t\t// #ifdef H5\r\n\t\t\t\tthis.stickyTop = this.offsetTop != 0 ? uni.upx2px(this.offsetTop) + this.h5NavHeight : this.h5NavHeight;\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifndef H5\r\n\t\t\t\tthis.stickyTop = this.offsetTop != 0 ? uni.upx2px(this.offsetTop) : 0;\r\n\t\t\t\t// #endif\r\n\r\n\t\t\t\tthis.disconnectObserver('contentObserver');\r\n\t\t\t\tthis.$uGetRect('.' + this.elClass).then((res) => {\r\n\t\t\t\t\tthis.height = res.height;\r\n\t\t\t\t\tthis.left = res.left;\r\n\t\t\t\t\tthis.width = res.width;\r\n\t\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t\tthis.observeContent();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tobserveContent() {\r\n\t\t\t\tthis.disconnectObserver('contentObserver');\r\n\t\t\t\tconst contentObserver = this.createIntersectionObserver({\r\n\t\t\t\t\tthresholds: [0.95, 0.98, 1]\r\n\t\t\t\t});\r\n\t\t\t\tcontentObserver.relativeToViewport({\r\n\t\t\t\t\ttop: -this.stickyTop\r\n\t\t\t\t});\r\n\t\t\t\tcontentObserver.observe('.' + this.elClass, res => {\r\n\t\t\t\t\tif (!this.enable) return;\r\n\t\t\t\t\tthis.setFixed(res.boundingClientRect.top);\r\n\t\t\t\t});\r\n\t\t\t\tthis.contentObserver = contentObserver;\r\n\t\t\t},\r\n\t\t\tsetFixed(top) {\r\n\t\t\t\tconst fixed = top < this.stickyTop;\r\n\t\t\t\tif (fixed) this.$emit('fixed', this.index);\r\n\t\t\t\telse if(this.fixed) this.$emit('unfixed', this.index);\r\n\t\t\t\tthis.fixed = fixed;\r\n\t\t\t},\r\n\t\t\tdisconnectObserver(observerName) {\r\n\t\t\t\tconst observer = this[observerName];\r\n\t\t\t\tobserver && observer.disconnect();\r\n\t\t\t},\r\n\t\t},\r\n\t\tbeforeDestroy() {\r\n\t\t\tthis.disconnectObserver('contentObserver');\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-sticky {\r\n\t\tz-index: 9999999999;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-subsection/u-subsection.vue",
    "content": "<template>\r\n\t<view class=\"u-subsection\" :style=\"[subsectionStyle]\">\r\n\t\t<view class=\"u-item u-line-1\" :style=\"[itemStyle(index)]\" @tap=\"click(index)\" :class=\"[noBorderRight(index), 'u-item-' + index]\"\r\n\t\t v-for=\"(item, index) in listInfo\" :key=\"index\">\r\n\t\t\t<view :style=\"[textStyle(index)]\" class=\"u-item-text u-line-1\">{{ item.name }}</view>\r\n\t\t</view>\r\n\t\t<view class=\"u-item-bg\" :style=\"[itemBarStyle]\"></view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * subsection 分段器\r\n\t * @description 该分段器一般用于用户从几个选项中选择某一个的场景\r\n\t * @tutorial https://www.uviewui.com/components/subsection.html\r\n\t * @property {Array} list 选项的数组，形式见上方\"基本使用\"\r\n\t * @property {String Number} current 初始化时默认选中的选项索引值（默认0）\r\n\t * @property {String} active-color 激活时的颜色，mode为subsection时固定为白色（默认#303133）\r\n\t * @property {String} inactive-color 未激活时字体的颜色，mode为subsection时无效（默认#606266）\r\n\t * @property {String} mode 模式选择，见官网\"模式选择\"说明（默认button）\r\n\t * @property {String Number} font-size 字体大小，单位rpx（默认28）\r\n\t * @property {String Number} height 组件高度，单位rpx（默认70）\r\n\t * @property {Boolean} animation 是否开启动画效果，见上方说明（默认true）\r\n\t * @property {Boolean} bold 激活选项的字体是否加粗（默认true）\r\n\t * @property {String} bg-color 组件背景颜色，mode为button时有效（默认#eeeeef）\r\n\t * @property {String} button-color 按钮背景颜色，mode为button时有效（默认#ffffff）\r\n\t * @event {Function} change 分段器选项发生改变时触发\r\n\t * @example <u-subsection active-color=\"#ff9900\"></u-subsection>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-subsection\",\r\n\t\tprops: {\r\n\t\t\t// tab的数据\r\n\t\t\tlist: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn [];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 当前活动的tab的index\r\n\t\t\tcurrent: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 激活的颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#303133'\r\n\t\t\t},\r\n\t\t\t// 未激活的颜色\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 模式选择，mode=button为按钮形式，mode=subsection时为分段模式\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'button'\r\n\t\t\t},\r\n\t\t\t// 字体大小，单位rpx\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 28\r\n\t\t\t},\r\n\t\t\t// 是否开启动画效果\r\n\t\t\tanimation: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 组件的高度，单位rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 70\r\n\t\t\t},\r\n\t\t\t// 激活tab的字体是否加粗\r\n\t\t\tbold: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// mode=button时，组件背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#eeeeef'\r\n\t\t\t},\r\n\t\t\t// mode = button时，滑块背景颜色\r\n\t\t\tbuttonColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 在切换分段器的时候，是否让设备震一下\r\n\t\t\tvibrateShort: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tlistInfo: [],\r\n\t\t\t\titemBgStyle: {\r\n\t\t\t\t\twidth: 0,\r\n\t\t\t\t\tleft: 0,\r\n\t\t\t\t\tbackgroundColor: '#ffffff',\r\n\t\t\t\t\theight: '100%',\r\n\t\t\t\t\ttransition: ''\r\n\t\t\t\t},\r\n\t\t\t\tcurrentIndex: this.current,\r\n\t\t\t\tbuttonPadding: 3, // mode = button 时，组件的内边距\r\n\t\t\t\tborderRadius: 5, // 圆角值\r\n\t\t\t\tfirstTimeVibrateShort: true // 组件初始化时，会触发current变化，此时不应震动\r\n\t\t\t};\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tcurrent: {\r\n\t\t\t\timmediate: true,\r\n\t\t\t\thandler(nVal) {\r\n\t\t\t\t\tthis.currentIndex = nVal;\r\n\t\t\t\t\tthis.changeSectionStatus(nVal);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 将list的数据，传入listInfo数组，因为不能修改props传递的list值\r\n\t\t\t// 可以接受直接数组形式，或者数组元素为对象的形式，如：['简介', '评论'],或者[{name: '简介'}, {name: '评论'}]\r\n\t\t\tthis.listInfo = this.list.map((val, index) => {\r\n\t\t\t\tif (typeof val != 'object') {\r\n\t\t\t\t\tlet obj = {\r\n\t\t\t\t\t\twidth: 0,\r\n\t\t\t\t\t\tname: val\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn obj;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tval.width = 0;\r\n\t\t\t\t\treturn val;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 设置mode=subsection时，滑块特有的样式\r\n\t\t\tnoBorderRight() {\r\n\t\t\t\treturn index => {\r\n\t\t\t\t\tif (this.mode != 'subsection') return;\r\n\t\t\t\t\tlet classs = '';\r\n\t\t\t\t\t// 不显示右边的边框\r\n\t\t\t\t\tif (index < this.list.length - 1) classs += ' u-none-border-right';\r\n\t\t\t\t\t// 显示整个组件的左右边圆角\r\n\t\t\t\t\tif (index == 0) classs += ' u-item-first';\r\n\t\t\t\t\tif (index == this.list.length - 1) classs += ' u-item-last';\r\n\t\t\t\t\treturn classs;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t// 文字的样式\r\n\t\t\ttextStyle() {\r\n\t\t\t\treturn index => {\r\n\t\t\t\t\tlet style = {};\r\n\t\t\t\t\t// 设置字体颜色\r\n\t\t\t\t\tif (this.mode == 'subsection') {\r\n\t\t\t\t\t\tif (index == this.currentIndex) {\r\n\t\t\t\t\t\t\tstyle.color = '#ffffff';\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tstyle.color = this.activeColor;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (index == this.currentIndex) {\r\n\t\t\t\t\t\t\tstyle.color = this.activeColor;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tstyle.color = this.inactiveColor;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 字体加粗\r\n\t\t\t\t\tif (index == this.currentIndex && this.bold) style.fontWeight = 'bold';\r\n\t\t\t\t\t// 文字大小\r\n\t\t\t\t\tstyle.fontSize = this.fontSize + 'rpx';\r\n\t\t\t\t\treturn style;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t// 每个分段器item的样式\r\n\t\t\titemStyle() {\r\n\t\t\t\treturn index => {\r\n\t\t\t\t\tlet style = {};\r\n\t\t\t\t\tif (this.mode == 'subsection') {\r\n\t\t\t\t\t\t// 设置border的样式\r\n\t\t\t\t\t\tstyle.borderColor = this.activeColor;\r\n\t\t\t\t\t\tstyle.borderWidth = '1px';\r\n\t\t\t\t\t\tstyle.borderStyle = 'solid';\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn style;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t// mode=button时，外层view的样式\r\n\t\t\tsubsectionStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.height = uni.upx2px(this.height) + 'px';\r\n\t\t\t\tif (this.mode == 'button') {\r\n\t\t\t\t\tstyle.backgroundColor = this.bgColor;\r\n\t\t\t\t\tstyle.padding = `${this.buttonPadding}px`;\r\n\t\t\t\t\tstyle.borderRadius = `${this.borderRadius}px`;\r\n\t\t\t\t}\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 滑块的样式\r\n\t\t\titemBarStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.backgroundColor = this.activeColor;\r\n\t\t\t\tstyle.zIndex = 1;\r\n\t\t\t\tif (this.mode == 'button') {\r\n\t\t\t\t\tstyle.backgroundColor = this.buttonColor;\r\n\t\t\t\t\tstyle.borderRadius = `${this.borderRadius}px`;\r\n\t\t\t\t\tstyle.bottom = `${this.buttonPadding}px`;\r\n\t\t\t\t\tstyle.height = uni.upx2px(this.height) - this.buttonPadding * 2 + 'px';\r\n\t\t\t\t\tstyle.zIndex = 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn Object.assign(this.itemBgStyle, style);\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tthis.getTabsInfo();\r\n\t\t\t}, 10);\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 改变滑块的样式\r\n\t\t\tchangeSectionStatus(nVal) {\r\n\t\t\t\tif (this.mode == 'subsection') {\r\n\t\t\t\t\t// 根据滑块在最左边和最右边时，显示左边和右边的圆角\r\n\t\t\t\t\tif (nVal == this.list.length - 1) {\r\n\t\t\t\t\t\tthis.itemBgStyle.borderRadius = `0 ${this.buttonPadding}px ${this.buttonPadding}px 0`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (nVal == 0) {\r\n\t\t\t\t\t\tthis.itemBgStyle.borderRadius = `${this.buttonPadding}px 0 0 ${this.buttonPadding}px`;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (nVal > 0 && nVal < this.list.length - 1) {\r\n\t\t\t\t\t\tthis.itemBgStyle.borderRadius = '0';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// 更新滑块的位置\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.itemBgLeft();\r\n\t\t\t\t}, 10);\r\n\t\t\t\tif (this.vibrateShort && !this.firstTimeVibrateShort) {\r\n\t\t\t\t\t// 使手机产生短促震动，微信小程序有效，APP(HX 2.6.8)和H5无效\r\n\t\t\t\t\t// #ifndef H5\r\n\t\t\t\t\tuni.vibrateShort();\r\n\t\t\t\t\t// #endif\r\n\t\t\t\t}\r\n\t\t\t\t// 第一次过后，设置firstTimeVibrateShort为false，让其下一次可以震动(如果允许震动的话)\r\n\t\t\t\tthis.firstTimeVibrateShort = false;\r\n\t\t\t},\r\n\t\t\tclick(index) {\r\n\t\t\t\t// 不允许点击当前激活选项\r\n\t\t\t\tif (index == this.currentIndex) return;\r\n\t\t\t\tthis.currentIndex = index;\r\n\t\t\t\tthis.changeSectionStatus(index);\r\n\t\t\t\tthis.$emit('change', Number(index));\r\n\t\t\t},\r\n\t\t\t// 获取各个tab的节点信息\r\n\t\t\tgetTabsInfo() {\r\n\t\t\t\tlet view = uni.createSelectorQuery().in(this);\r\n\t\t\t\tfor (let i = 0; i < this.list.length; i++) {\r\n\t\t\t\t\tview.select('.u-item-' + i).boundingClientRect();\r\n\t\t\t\t}\r\n\t\t\t\tview.exec(res => {\r\n\t\t\t\t\tif (!res.length) {\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tthis.getTabsInfo();\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}, 10);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 将分段器每个item的宽度，放入listInfo数组\r\n\t\t\t\t\tres.map((val, index) => {\r\n\t\t\t\t\t\tthis.listInfo[index].width = val.width;\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// 初始化滑块的宽度\r\n\t\t\t\t\tif (this.mode == 'subsection') {\r\n\t\t\t\t\t\tthis.itemBgStyle.width = this.listInfo[0].width + 'px';\r\n\t\t\t\t\t} else if (this.mode == 'button') {\r\n\t\t\t\t\t\tthis.itemBgStyle.width = this.listInfo[0].width + 'px';\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 初始化滑块的位置\r\n\t\t\t\t\tthis.itemBgLeft();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\titemBgLeft() {\r\n\t\t\t\t// 根据是否开启动画效果，\r\n\t\t\t\tif (this.animation) {\r\n\t\t\t\t\tthis.itemBgStyle.transition = 'all 0.35s';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.itemBgStyle.transition = 'all 0s';\r\n\t\t\t\t}\r\n\t\t\t\tlet left = 0;\r\n\t\t\t\t// 计算当前活跃item到组件左边的距离\r\n\t\t\t\tthis.listInfo.map((val, index) => {\r\n\t\t\t\t\tif (index < this.currentIndex) left += val.width;\r\n\t\t\t\t});\r\n\t\t\t\t// 根据mode不同模式，计算滑块需要移动的距离\r\n\t\t\t\tif (this.mode == 'subsection') {\r\n\t\t\t\t\tthis.itemBgStyle.left = left + 'px';\r\n\t\t\t\t} else if (this.mode == 'button') {\r\n\t\t\t\t\tthis.itemBgStyle.left = left + this.buttonPadding + 'px';\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-subsection {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\toverflow: hidden;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-item {\r\n\t\tflex: 1;\r\n\t\ttext-align: center;\r\n\t\tfont-size: 26rpx;\r\n\t\theight: 100%;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tcolor: $u-main-color;\r\n\t\tdisplay: inline-flex;\r\n\t\tpadding: 0 6rpx;\r\n\t}\r\n\r\n\t.u-item-bg {\r\n\t\tbackground-color: $u-type-primary;\r\n\t\tposition: absolute;\r\n\t\tz-index: -1;\r\n\t}\r\n\r\n\t.u-none-border-right {\r\n\t\tborder-right: none !important;\r\n\t}\r\n\r\n\t.u-item-first {\r\n\t\tborder-top-left-radius: 8rpx;\r\n\t\tborder-bottom-left-radius: 8rpx;\r\n\t}\r\n\r\n\t.u-item-last {\r\n\t\tborder-top-right-radius: 8rpx;\r\n\t\tborder-bottom-right-radius: 8rpx;\r\n\t}\r\n\r\n\t.u-item-text {\r\n\t\ttransition: all 0.35s;\r\n\t\tcolor: $u-main-color;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tposition: relative;\r\n\t\tz-index: 3;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-swipe-action/u-swipe-action.vue",
    "content": "<template>\r\n\t<view class=\"\">\r\n\t\t<movable-area class=\"u-swipe-action\" :style=\"{ backgroundColor: bgColor }\">\r\n\t\t\t<movable-view\r\n\t\t\t\tclass=\"u-swipe-view\"\r\n\t\t\t\t@change=\"change\"\r\n\t\t\t\t@touchend=\"touchend\"\r\n\t\t\t\t@touchstart=\"touchstart\"\r\n\t\t\t\tdirection=\"horizontal\"\r\n\t\t\t\t:disabled=\"disabled\"\r\n\t\t\t\t:x=\"moveX\"\r\n\t\t\t\t:style=\"{\r\n\t\t\t\t\twidth: movableViewWidth ? movableViewWidth : '100%'\r\n\t\t\t\t}\"\r\n\t\t\t>\r\n\t\t\t\t<view\r\n\t\t\t\t\tclass=\"u-swipe-content\"\r\n\t\t\t\t\t@tap.stop=\"contentClick\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<slot></slot>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-swipe-del\" v-if=\"showBtn\" @tap.stop=\"btnClick(index)\" :style=\"[btnStyle(item.style)]\" v-for=\"(item, index) in options\" :key=\"index\">\r\n\t\t\t\t\t<view class=\"u-btn-text\">{{ item.text }}</view>\r\n\t\t\t\t</view>\r\n\t\t\t</movable-view>\r\n\t\t</movable-area>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * swipeAction 左滑单元格\r\n * @description 该组件一般用于左滑唤出操作菜单的场景，用的最多的是左滑删除操作。\r\n * @tutorial https://www.uviewui.com/components/swipeAction.html\r\n * @property {String} bg-color 整个组件背景颜色（默认#ffffff）\r\n * @property {Array} options 数组形式，可以配置背景颜色和文字\r\n * @property {String Number} index 标识符，点击时候用于区分点击了哪一个，用v-for循环时的index即可\r\n * @property {String Number} btn-width 按钮宽度，单位rpx（默认180）\r\n * @property {Boolean} disabled 是否禁止某个swipeAction滑动（默认false）\r\n * @property {Boolean} show 打开或者关闭某个组件（默认false）\r\n * @event {Function} click 点击组件时触发\r\n * @event {Function} close 组件触发关闭状态时\r\n * @event {Function} content-click 点击内容时触发\r\n * @event {Function} open 组件触发打开状态时\r\n * @example <u-swipe-action btn-text=\"收藏\">...</u-swipe-action>\r\n */\r\nexport default {\r\n\tname: 'u-swipe-action',\r\n\tprops: {\r\n\t\t// index值，用于得知点击删除的是哪个按钮\r\n\t\tindex: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 滑动按钮的宽度，单位为rpx\r\n\t\tbtnWidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 180\r\n\t\t},\r\n\t\t// 是否禁止某个action滑动\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 打开或者关闭组件\r\n\t\tshow: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 组件背景颜色\r\n\t\tbgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#ffffff'\r\n\t\t},\r\n\t\t// 是否使手机发生短促震动，目前只在iOS的微信小程序有效(2020-05-06)\r\n\t\tvibrateShort: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 按钮操作参数\r\n\t\toptions: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tshow: {\r\n\t\t\timmediate: true,\r\n\t\t\thandler(nVal, oVal) {\r\n\t\t\t\tif (nVal) {\r\n\t\t\t\t\tthis.open();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.close();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tmoveX: 0, // movable-view元素在x轴上需要移动的目标移动距离，用于展开或收起滑动的按钮\r\n\t\t\tscrollX: 0, // movable-view移动过程中产生的change事件中的x轴移动值\r\n\t\t\tstatus: false, // 滑动的状态，表示当前是展开还是关闭按钮的状态\r\n\t\t\tmovableAreaWidth: 0, // 滑动区域\r\n\t\t\telId: this.$u.guid(), // id，用于通知另外组件关闭时的识别\r\n\t\t\tshowBtn: false, // 刚开始渲染视图时不显示右边的按钮，避免视图闪动\r\n\t\t};\r\n\t},\r\n\tcomputed: {\r\n\t\tmovableViewWidth() {\r\n\t\t\treturn this.movableAreaWidth + this.allBtnWidth + 'px';\r\n\t\t},\r\n\t\tinnerBtnWidth() {\r\n\t\t\treturn uni.upx2px(this.btnWidth);\r\n\t\t},\r\n\t\tallBtnWidth() {\r\n\t\t\treturn uni.upx2px(this.btnWidth) * this.options.length;\r\n\t\t},\r\n\t\tbtnStyle() {\r\n\t\t\treturn style => {\r\n\t\t\t\tlet css = {};\r\n\t\t\t\tstyle.width = this.btnWidth + 'rpx';\r\n\t\t\t\treturn style;\r\n\t\t\t};\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.getActionRect();\r\n\t},\r\n\tmethods: {\r\n\t\t// 点击按钮\r\n\t\tbtnClick(index) {\r\n\t\t\tthis.status = false;\r\n\t\t\t// this.index为点击的几个组件，index为点击某个组件的第几个按钮(options数组的索引)\r\n\t\t\tthis.$emit('click', this.index, index);\r\n\t\t},\r\n\t\t// movable-view元素移动事件\r\n\t\tchange(e) {\r\n\t\t\tthis.scrollX = e.detail.x;\r\n\t\t},\r\n\t\t// 关闭按钮状态\r\n\t\tclose() {\r\n\t\t\tthis.moveX = 0;\r\n\t\t\tthis.status = false;\r\n\t\t},\r\n\t\t// 打开按钮的状态\r\n\t\topen() {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\tthis.moveX = -this.allBtnWidth;\r\n\t\t\tthis.status = true;\r\n\t\t},\r\n\t\t// 用户手指离开movable-view元素，停止触摸\r\n\t\ttouchend() {\r\n\t\t\tthis.moveX = this.scrollX;\r\n\t\t\t// 停止触摸时候，判断当前是展开还是关闭状态\r\n\t\t\t// 关闭状态\r\n\t\t\t// 这一步很重要，需要先给this.moveX一个变化的随机值，否则因为前后设置的为同一个值\r\n\t\t\t// props单向数据流的原因，导致movable-view元素不会发生变化，切记，详见文档：\r\n\t\t\t// https://uniapp.dcloud.io/use?id=%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98\r\n\t\t\tthis.$nextTick(function() {\r\n\t\t\t\tif (this.status == false) {\r\n\t\t\t\t\t// 关闭状态左滑，产生的x轴位移为负值，也就是说滑动的距离大于按钮的四分之一宽度，自动展开按钮\r\n\t\t\t\t\tif (this.scrollX <= -this.allBtnWidth / 4) {\r\n\t\t\t\t\t\tthis.moveX = -this.allBtnWidth; // 按钮宽度的负值，即为展开状态movable-view元素左滑的距离\r\n\t\t\t\t\t\tthis.status = true; // 标志当前为展开状态\r\n\t\t\t\t\t\tthis.emitOpenEvent();\r\n\t\t\t\t\t\t// 产生震动效果\r\n\t\t\t\t\t\tif (this.vibrateShort) uni.vibrateShort();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.moveX = 0; // 如果距离没有按钮宽度的四分之一，自动收起\r\n\t\t\t\t\t\tthis.status = false;\r\n\t\t\t\t\t\tthis.emitCloseEvent();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 如果在打开的状态下，右滑动的距离X轴偏移超过按钮的四分之一(负值反过来的四分之三)，自动收起按钮\r\n\t\t\t\t\tif (this.scrollX > (-this.allBtnWidth * 3) / 4) {\r\n\t\t\t\t\t\tthis.moveX = 0;\r\n\t\t\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t\t\tthis.moveX = 101;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.status = false;\r\n\t\t\t\t\t\tthis.emitCloseEvent();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.moveX = -this.allBtnWidth;\r\n\t\t\t\t\t\tthis.status = true;\r\n\t\t\t\t\t\tthis.emitOpenEvent();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\temitOpenEvent() {\r\n\t\t\tthis.$emit('open', this.index);\r\n\t\t},\r\n\t\temitCloseEvent() {\r\n\t\t\tthis.$emit('close', this.index);\r\n\t\t},\r\n\t\t// 开始触摸\r\n\t\ttouchstart() {},\r\n\t\tgetActionRect() {\r\n\t\t\tthis.$uGetRect('.u-swipe-action').then(res => {\r\n\t\t\t\tthis.movableAreaWidth = res.width;\r\n\t\t\t\t// 等视图更新完后，再显示右边的可滑动按钮，防止这些按钮会\"闪一下\"\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.showBtn = true;\r\n\t\t\t\t})\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 点击内容触发事件\r\n\t\tcontentClick() {\r\n\t\t\t// 点击内容时，如果当前为打开状态，收起组件\r\n\t\t\tif (this.status == true) {\r\n\t\t\t\tthis.status = 'close';\r\n\t\t\t\tthis.moveX = 0;\r\n\t\t\t}\r\n\t\t\tthis.$emit('content-click', this.index);\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../libs/css/style.components.scss\";\r\n\t\r\n.u-swipe-action {\r\n\twidth: auto;\r\n\theight: initial;\r\n\tposition: relative;\r\n\toverflow: hidden;\r\n}\r\n\r\n.u-swipe-view {\r\n\tdisplay: flex;\r\n\theight: initial;\r\n\tposition: relative;\r\n\t/* 这一句很关键，覆盖默认的绝对定位 */\r\n}\r\n\r\n.u-swipe-content {\r\n\tflex: 1;\r\n}\r\n\r\n.u-swipe-del {\r\n\tposition: relative;\r\n\tfont-size: 30rpx;\r\n\tcolor: #ffffff;\r\n}\r\n\r\n.u-btn-text {\r\n\tposition: absolute;\r\n\ttop: 50%;\r\n\tleft: 50%;\r\n\ttransform: translate(-50%, -50%);\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-swiper/u-swiper.vue",
    "content": "<template>\r\n\t<view class=\"u-swiper-wrap\" :style=\"{\r\n\t\tborderRadius: `${borderRadius}rpx`\r\n\t}\">\r\n\t\t<swiper @change=\"change\" @animationfinish=\"animationfinish\" :interval=\"interval\" :circular=\"circular\" :duration=\"duration\" :autoplay=\"autoplay\"\r\n\t\t :previous-margin=\"effect3d ? effect3dPreviousMargin + 'rpx' : '0'\" :next-margin=\"effect3d ? effect3dPreviousMargin + 'rpx' : '0'\"\r\n\t\t :style=\"{\r\n\t\t\t\theight: height + 'rpx'\r\n\t\t\t}\">\r\n\t\t\t<swiper-item class=\"u-swiper-item\" v-for=\"(item, index) in list\" :key=\"index\">\r\n\t\t\t\t<view class=\"u-list-image-wrap\" @tap.stop.prevent=\"listClick(index)\" :class=\"[current != index ? 'u-list-scale' : '']\" :style=\"{\r\n\t\t\t\t\t\tborderRadius: `${borderRadius}rpx`,\r\n\t\t\t\t\t\ttransform: effect3d && current != index ? 'scaleY(0.9)' : 'scaleY(1)',\r\n\t\t\t\t\t\tmargin: effect3d && current != index ? '0 20rpx' : 0,\r\n\t\t\t\t\t\tbackgroundColor: bgColor\r\n\t\t\t\t\t}\">\r\n\t\t\t\t\t<image class=\"u-swiper-image\" :src=\"item[name]\" :mode=\"imgMode\"></image>\r\n\t\t\t\t\t<view v-if=\"title\" class=\"u-swiper-title u-line-1\" :style=\"{\r\n\t\t\t\t\t\t\t'padding-bottom': titlePaddingBottom\r\n\t\t\t\t\t\t}\">\r\n\t\t\t\t\t\t{{ item.title }}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</swiper-item>\r\n\t\t</swiper>\r\n\t\t<view class=\"u-swiper-indicator\" :style=\"{\r\n\t\t\t\ttop: indicatorPos == 'topLeft' || indicatorPos == 'topCenter' || indicatorPos == 'topRight' ? '12rpx' : 'auto',\r\n\t\t\t\tbottom: indicatorPos == 'bottomLeft' || indicatorPos == 'bottomCenter' || indicatorPos == 'bottomRight' ? '12rpx' : 'auto',\r\n\t\t\t\tjustifyContent: justifyContent,\r\n\t\t\t\tpadding: `0 ${effect3d ? '74rpx' : '24rpx'}`\r\n\t\t\t}\">\r\n\t\t\t<block v-if=\"mode == 'rect'\">\r\n\t\t\t\t<view class=\"u-indicator-item-rect\" :class=\"{ 'u-indicator-item-rect-active': index == current }\" v-for=\"(item, index) in list\"\r\n\t\t\t\t :key=\"index\"></view>\r\n\t\t\t</block>\r\n\t\t\t<block v-if=\"mode == 'dot'\">\r\n\t\t\t\t<view class=\"u-indicator-item-dot\" :class=\"{ 'u-indicator-item-dot-active': index == current }\" v-for=\"(item, index) in list\"\r\n\t\t\t\t :key=\"index\"></view>\r\n\t\t\t</block>\r\n\t\t\t<block v-if=\"mode == 'round'\">\r\n\t\t\t\t<view class=\"u-indicator-item-round\" :class=\"{ 'u-indicator-item-round-active': index == current }\" v-for=\"(item, index) in list\"\r\n\t\t\t\t :key=\"index\"></view>\r\n\t\t\t</block>\r\n\t\t\t<block v-if=\"mode == 'number'\">\r\n\t\t\t\t<view class=\"u-indicator-item-number\">{{ current + 1 }}/{{ list.length }}</view>\r\n\t\t\t</block>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * swiper 轮播图\r\n\t * @description 该组件一般用于导航轮播，广告展示等场景,可开箱即用\r\n\t * @tutorial https://www.uviewui.com/components/swiper.html\r\n\t * @property {Array} list 轮播图数据，见官网\"基本使用\"说明\r\n\t * @property {Boolean} title 是否显示标题文字，需要配合list参数，见官网说明（默认false）\r\n\t * @property {String} mode 指示器模式，见官网说明（默认round）\r\n\t * @property {String Number} height 轮播图组件高度，单位rpx（默认250）\r\n\t * @property {String} indicator-pos 指示器的位置（默认bottomCenter）\r\n\t * @property {Boolean} effect3d 是否开启3D效果（默认false）\r\n\t * @property {Boolean} autoplay 是否自动播放（默认true）\r\n\t * @property {String Number} interval 自动轮播时间间隔，单位ms（默认2500）\r\n\t * @property {Boolean} circular 是否衔接播放，见官网说明（默认true）\r\n\t * @property {String} bg-color 背景颜色（默认#f3f4f6）\r\n\t * @property {String Number} border-radius 轮播图圆角值，单位rpx（默认8）\r\n\t * @property {Object} title-style 自定义标题样式\r\n\t * @property {String Number} effect3d-previous-margin mode = true模式的情况下，激活项与前后项之间的距离，单位rpx（默认50）\r\n\t * @property {String} img-mode 图片的裁剪模式，详见image组件裁剪模式（默认aspectFill）\r\n\t * @event {Function} click 点击轮播图时触发\r\n\t * @example <u-swiper :list=\"list\" mode=\"dot\" indicator-pos=\"bottomRight\"></u-swiper>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-swiper\",\r\n\t\tprops: {\r\n\t\t\t// 轮播图的数据,格式如：[{image: 'xxxx', title: 'xxxx'}，{image: 'yyyy', title: 'yyyy'}]，其中title字段可选\r\n\t\t\tlist: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn [];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否显示title标题\r\n\t\t\ttitle: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 用户自定义的指示器的样式\r\n\t\t\tindicator: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {};\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 圆角值\r\n\t\t\tborderRadius: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 8\r\n\t\t\t},\r\n\t\t\t// 隔多久自动切换\r\n\t\t\tinterval: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 3000\r\n\t\t\t},\r\n\t\t\t// 指示器的模式，rect|dot|number|round\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'round'\r\n\t\t\t},\r\n\t\t\t// list的高度，单位rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 250\r\n\t\t\t},\r\n\t\t\t// 指示器的位置，topLeft|topCenter|topRight|bottomLeft|bottomCenter|bottomRight\r\n\t\t\tindicatorPos: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'bottomCenter'\r\n\t\t\t},\r\n\t\t\t// 是否开启缩放效果\r\n\t\t\teffect3d: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 3D模式的情况下，激活item与前后item之间的距离，单位rpx\r\n\t\t\teffect3dPreviousMargin: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 50\r\n\t\t\t},\r\n\t\t\t// 是否自动播放\r\n\t\t\tautoplay: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 自动轮播时间间隔，单位ms\r\n\t\t\tduration: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 500\r\n\t\t\t},\r\n\t\t\t// 是否衔接滑动，即到最后一张时接着滑动，是否自动切换到第一张\r\n\t\t\tcircular: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 图片的裁剪模式 \r\n\t\t\timgMode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'aspectFill'\r\n\t\t\t},\r\n\t\t\t// 从list数组中读取的图片的属性名\r\n\t\t\tname: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'image'\r\n\t\t\t},\r\n\t\t\t// 背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#f3f4f6'\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\t// 如果外部的list发生变化，判断长度是否被修改，如果前后长度不一致，重置current值，避免溢出\r\n\t\t\tlist(nVal, oVal) {\r\n\t\t\t\tif(nVal.length !== oVal.length) this.current = 0;\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tcurrent: 0 // 当前活跃的swiper-item的index\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tjustifyContent() {\r\n\t\t\t\tif (this.indicatorPos == 'topLeft' || this.indicatorPos == 'bottomLeft') return 'flex-start';\r\n\t\t\t\tif (this.indicatorPos == 'topCenter' || this.indicatorPos == 'bottomCenter') return 'center';\r\n\t\t\t\tif (this.indicatorPos == 'topRight' || this.indicatorPos == 'bottomRight') return 'flex-end';\r\n\t\t\t},\r\n\t\t\ttitlePaddingBottom() {\r\n\t\t\t\tlet tmp = 0;\r\n\t\t\t\tif (this.mode == 'none') return '12rpx';\r\n\t\t\t\tif (['bottomLeft', 'bottomCenter', 'bottomRight'].indexOf(this.indicatorPos) >= 0 && this.mode == 'number') {\r\n\t\t\t\t\ttmp = '60rpx';\r\n\t\t\t\t} else if (['bottomLeft', 'bottomCenter', 'bottomRight'].indexOf(this.indicatorPos) >= 0 && this.mode != 'number') {\r\n\t\t\t\t\ttmp = '40rpx';\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttmp = '12rpx';\r\n\t\t\t\t}\r\n\t\t\t\treturn tmp;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tlistClick(index) {\r\n\t\t\t\tthis.$emit('click', index);\r\n\t\t\t},\r\n\t\t\tchange(e) {\r\n\t\t\t\tlet current = e.detail.current;\r\n\t\t\t\tthis.current = current;\r\n\t\t\t\t// 发出change事件，表示当前自动切换的index，从0开始\r\n\t\t\t\tthis.$emit('change', current);\r\n\t\t\t},\r\n\t\t\t// 头条小程序不支持animationfinish事件，改由change事件\r\n\t\t\t// 暂不监听此事件，因为不再给swiper绑定current属性\r\n\t\t\tanimationfinish(e) {\r\n\t\t\t\t// #ifndef MP-TOUTIAO\r\n\t\t\t\t// this.current = e.detail.current;\r\n\t\t\t\t// #endif\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-swiper-wrap {\r\n\t\tposition: relative;\r\n\t\toverflow: hidden;\r\n\t\ttransform: translateY(0);\r\n\t}\r\n\r\n\t.u-swiper-image {\r\n\t\twidth: 100%;\r\n\t\twill-change: transform;\r\n\t\theight: 100%;\r\n\t\tdisplay: block;\r\n\t\t/* #ifdef H5 */\r\n\t\tpointer-events: none;\r\n\t\t/* #endif */\r\n\t}\r\n\r\n\t.u-swiper-indicator {\r\n\t\tpadding: 0 24rpx;\r\n\t\tposition: absolute;\r\n\t\tdisplay: flex;\r\n\t\twidth: 100%;\r\n\t\tz-index: 1;\r\n\t}\r\n\r\n\t.u-indicator-item-rect {\r\n\t\twidth: 26rpx;\r\n\t\theight: 8rpx;\r\n\t\tmargin: 0 6rpx;\r\n\t\ttransition: all 0.5s;\r\n\t\tbackground-color: rgba(0, 0, 0, 0.3);\r\n\t}\r\n\r\n\t.u-indicator-item-rect-active {\r\n\t\tbackground-color: rgba(255, 255, 255, 0.8);\r\n\t}\r\n\r\n\t.u-indicator-item-dot {\r\n\t\twidth: 14rpx;\r\n\t\theight: 14rpx;\r\n\t\tmargin: 0 6rpx;\r\n\t\tborder-radius: 20rpx;\r\n\t\ttransition: all 0.5s;\r\n\t\tbackground-color: rgba(0, 0, 0, 0.3);\r\n\t}\r\n\r\n\t.u-indicator-item-dot-active {\r\n\t\tbackground-color: rgba(255, 255, 255, 0.8);\r\n\t}\r\n\r\n\t.u-indicator-item-round {\r\n\t\twidth: 14rpx;\r\n\t\theight: 14rpx;\r\n\t\tmargin: 0 6rpx;\r\n\t\tborder-radius: 20rpx;\r\n\t\ttransition: all 0.5s;\r\n\t\tbackground-color: rgba(0, 0, 0, 0.3);\r\n\t}\r\n\r\n\t.u-indicator-item-round-active {\r\n\t\twidth: 34rpx;\r\n\t\tbackground-color: rgba(255, 255, 255, 0.8);\r\n\t}\r\n\r\n\t.u-indicator-item-number {\r\n\t\tpadding: 6rpx 16rpx;\r\n\t\tline-height: 1;\r\n\t\tbackground-color: rgba(0, 0, 0, 0.3);\r\n\t\tborder-radius: 100rpx;\r\n\t\tfont-size: 26rpx;\r\n\t\tcolor: rgba(255, 255, 255, 0.8);\r\n\t}\r\n\r\n\t.u-list-scale {\r\n\t\ttransform-origin: center center;\r\n\t}\r\n\r\n\t.u-list-image-wrap {\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tflex: 1;\r\n\t\ttransition: all 0.5s;\r\n\t\toverflow: hidden;\r\n\t\tbox-sizing: content-box;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-swiper-title {\r\n\t\tposition: absolute;\r\n\t\tbackground-color: rgba(0, 0, 0, 0.3);\r\n\t\tbottom: 0;\r\n\t\tleft: 0;\r\n\t\twidth: 100%;\r\n\t\tfont-size: 28rpx;\r\n\t\tpadding: 12rpx 24rpx;\r\n\t\tcolor: rgba(255, 255, 255, 0.9);\r\n\t}\r\n\r\n\t.u-swiper-item {\r\n\t\tdisplay: flex;\r\n\t\toverflow: hidden;\r\n\t\talign-items: center;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-switch/u-switch.vue",
    "content": "<template>\r\n\t<view class=\"u-switch\" :class=\"[value == true ? 'u-switch--on' : '', disabled ? 'u-switch--disabled' : '']\" @tap=\"onClick\"\r\n\t :style=\"[switchStyle]\">\r\n\t\t<view class=\"u-switch__node node-class\" :style=\"{\r\n\t\t\twidth: $u.addUnit(this.size),\r\n\t\t\theight: $u.addUnit(this.size)\r\n\t\t}\">\r\n\t\t\t<u-loading :show=\"loading\" class=\"u-switch__loading\" :size=\"size * 0.6\" :color=\"loadingColor\" />\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * switch 开关选择器\r\n\t * @description 选择开关一般用于只有两个选择，且只能选其一的场景。\r\n\t * @tutorial https://www.uviewui.com/components/switch.html\r\n\t * @property {Boolean} loading 是否处于加载中（默认false）\r\n\t * @property {Boolean} disabled 是否禁用（默认false）\r\n\t * @property {String Number} size 开关尺寸，单位rpx（默认50）\r\n\t * @property {String} active-color 打开时的背景色（默认#2979ff）\r\n\t * @property {Boolean} inactive-color 关闭时的背景色（默认#ffffff）\r\n\t * @property {Boolean | Number | String} active-value 打开选择器时通过change事件发出的值（默认true）\r\n\t * @property {Boolean | Number | String} inactive-value 关闭选择器时通过change事件发出的值（默认false）\r\n\t * @event {Function} change 在switch打开或关闭时触发\r\n\t * @example <u-switch v-model=\"checked\" active-color=\"red\" inactive-color=\"#eee\"></u-switch>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-switch\",\r\n\t\tprops: {\r\n\t\t\t// 是否为加载中状态\r\n\t\t\tloading: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否为禁用装填\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 开关尺寸，单位rpx\r\n\t\t\tsize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 50\r\n\t\t\t},\r\n\t\t\t// 打开时的背景颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 关闭时的背景颜色\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 通过v-model双向绑定的值\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否使手机发生短促震动，目前只在iOS的微信小程序有效(2020-05-06)\r\n\t\t\tvibrateShort: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 打开选择器时的值\r\n\t\t\tactiveValue: {\r\n\t\t\t\ttype: [Number, String, Boolean],\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 关闭选择器时的值\r\n\t\t\tinactiveValue: {\r\n\t\t\t\ttype: [Number, String, Boolean],\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tswitchStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.fontSize = this.size + 'rpx';\r\n\t\t\t\tstyle.backgroundColor = this.value ? this.activeColor : this.inactiveColor;\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\tloadingColor() {\r\n\t\t\t\treturn this.value ? this.activeColor : null;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tonClick() {\r\n\t\t\t\tif (!this.disabled && !this.loading) {\r\n\t\t\t\t\t// 使手机产生短促震动，微信小程序有效，APP(HX 2.6.8)和H5无效\r\n\t\t\t\t\tif(this.vibrateShort) uni.vibrateShort();\r\n\t\t\t\t\tthis.$emit('input', !this.value);\r\n\t\t\t\t\t// 放到下一个生命周期，因为双向绑定的value修改父组件状态需要时间，且是异步的\r\n\t\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t\tthis.$emit('change', this.value ? this.activeValue : this.inactiveValue);\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-switch {\r\n\t\tposition: relative;\r\n\t\tdisplay: inline-block;\r\n\t\tbox-sizing: initial;\r\n\t\twidth: 2em;\r\n\t\theight: 1em;\r\n\t\tbackground-color: #fff;\r\n\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\r\n\t\tborder-radius: 1em;\r\n\t\ttransition: background-color 0.3s;\r\n\t\tfont-size: 50rpx;\r\n\t}\r\n\r\n\t.u-switch__node {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tposition: absolute;\r\n\t\ttop: 0;\r\n\t\tleft: 0;\r\n\t\tborder-radius: 100%;\r\n\t\tz-index: 1;\r\n\t\tbackground-color: #fff;\r\n\t\tbackground-color: #fff;\r\n\t\tbox-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);\r\n\t\tbox-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);\r\n\t\ttransition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);\r\n\t\ttransition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05), -webkit-transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);\r\n\t\ttransition: transform cubic-bezier(0.3, 1.05, 0.4, 1.05);\r\n\t\ttransition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05)\r\n\t}\r\n\r\n\t.u-switch__loading {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t}\r\n\r\n\t.u-switch--on {\r\n\t\tbackground-color: #1989fa;\r\n\t}\r\n\r\n\t.u-switch--on .u-switch__node {\r\n\t\ttransform: translateX(100%);\r\n\t}\r\n\r\n\t.u-switch--disabled {\r\n\t\topacity: 0.4;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-tabbar/u-tabbar.vue",
    "content": "<template>\r\n\t<view v-if=\"show\" class=\"u-tabbar\" @touchmove.stop.prevent>\r\n\t\t<view class=\"u-tabbar__content safe-area-inset-bottom\" :style=\"{\r\n\t\t\theight: $u.addUnit(height),\r\n\t\t\tbackgroundColor: bgColor,\r\n\t\t}\" :class=\"{\r\n\t\t\t'u-border-top': borderTop\r\n\t\t}\">\r\n\t\t\t<view class=\"u-tabbar__content__item\" v-for=\"(item, index) in list\" :key=\"index\" :class=\"{\r\n\t\t\t\t'u-tabbar__content__circle': midButton &&item.midButton\r\n\t\t\t}\" @tap.stop=\"clickHandler(index)\" :style=\"{\r\n\t\t\t\tbackgroundColor: bgColor\r\n\t\t\t}\">\r\n\t\t\t\t<view :class=\"[\r\n\t\t\t\t\tmidButton && item.midButton ? 'u-tabbar__content__circle__button' : 'u-tabbar__content__item__button'\r\n\t\t\t\t]\">\r\n\t\t\t\t\t<u-icon\r\n\t\t\t\t\t\t:size=\"midButton && item.midButton ? midButtonSize : iconSize\"\r\n\t\t\t\t\t\t:name=\"elIconPath(index)\"\r\n\t\t\t\t\t\timg-mode=\"scaleToFill\"\r\n\t\t\t\t\t\t:color=\"elColor(index)\"\r\n\t\t\t\t\t\t:custom-prefix=\"item.customIcon ? 'custom-icon' : 'uicon'\"\r\n\t\t\t\t\t></u-icon>\r\n\t\t\t\t\t<u-badge :count=\"item.count\" :is-dot=\"item.isDot\" \r\n\t\t\t\t\t\tv-if=\"item.count > 0\"\r\n\t\t\t\t\t\t:offset=\"[-2, getOffsetRight(item.count, item.isDot)]\"\r\n\t\t\t\t\t></u-badge>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"u-tabbar__content__item__text\" :style=\"{\r\n\t\t\t\t\tcolor: elColor(index)\r\n\t\t\t\t}\">\r\n\t\t\t\t\t<text class=\"u-line-1\">{{item.text}}</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t<view v-if=\"midButton\" class=\"u-tabbar__content__circle__border\" :class=\"{\r\n\t\t\t\t'u-border': borderTop,\r\n\t\t\t}\" :style=\"{\r\n\t\t\t\tbackgroundColor: bgColor,\r\n\t\t\t\tleft: midButtonLeft\r\n\t\t\t}\">\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t\t<!-- 这里加上一个48rpx的高度,是为了增高有凸起按钮时的防塌陷高度(也即按钮凸出来部分的高度) -->\r\n\t\t<view class=\"u-fixed-placeholder safe-area-inset-bottom\" :style=\"{ \r\n\t\t\t\theight: `calc(${$u.addUnit(height)} + ${midButton ? 48 : 0}rpx)`,\r\n\t\t\t}\"></view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\texport default {\r\n\t\tprops: {\r\n\t\t\t// 显示与否\r\n\t\t\tshow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 通过v-model绑定current值\r\n\t\t\tvalue: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 整个tabbar的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// tabbar的高度，默认50px，单位任意，如果为数值，则为rpx单位\r\n\t\t\theight: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: '50px'\r\n\t\t\t},\r\n\t\t\t// 非凸起图标的大小，单位任意，数值默认rpx\r\n\t\t\ticonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 40\r\n\t\t\t},\r\n\t\t\t// 凸起的图标的大小，单位任意，数值默认rpx\r\n\t\t\tmidButtonSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 90\r\n\t\t\t},\r\n\t\t\t// 激活时的演示，包括字体图标，提示文字等的演示\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#303133'\r\n\t\t\t},\r\n\t\t\t// 未激活时的颜色\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// 是否显示中部的凸起按钮\r\n\t\t\tmidButton: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 配置参数\r\n\t\t\tlist: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn []\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 切换前的回调\r\n\t\t\tbeforeSwitch: {\r\n\t\t\t\ttype: Function,\r\n\t\t\t\tdefault: null\r\n\t\t\t},\r\n\t\t\t// 是否显示顶部的横线\r\n\t\t\tborderTop: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 是否隐藏原生tabbar\r\n\t\t\thideTabBar: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t// 由于安卓太菜了，通过css居中凸起按钮的外层元素有误差，故通过js计算将其其中\r\n\t\t\t\tmidButtonLeft: '50%', \r\n\t\t\t\tpageUrl: '', // 当前\r\n\t\t\t}\r\n\t\t},\r\n\t\tcreated() {\r\n\t\t\t// 是否隐藏原生tabbar\r\n\t\t\tif(this.hideTabBar) uni.hideTabBar();\r\n\t\t\t// 获取引入了u-tabbar页面的路由地址，该地址没有路径前面的\"/\"\r\n\t\t\tlet pages = getCurrentPages();\r\n\t\t\t// 页面栈中的最后一个即为项为当前页面，route属性为页面路径\r\n\t\t\tthis.pageUrl = pages[pages.length - 1].route;\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\telIconPath() {\r\n\t\t\t\treturn (index) => {\r\n\t\t\t\t\t// 历遍u-tabbar的每一项item时，判断是否传入了pagePath参数，如果传入了\r\n\t\t\t\t\t// 和data中的pageUrl参数对比，如果相等，即可判断当前的item对应当前的tabbar页面，设置高亮图标\r\n\t\t\t\t\t// 采用这个方法，可以无需使用v-model绑定的value值\r\n\t\t\t\t\tlet pagePath = this.list[index].pagePath;\r\n\t\t\t\t\t// 如果定义了pagePath属性，意味着使用系统自带tabbar方案，否则使用一个页面用几个组件模拟tabbar页面的方案\r\n\t\t\t\t\t// 这两个方案对处理tabbar item的激活与否方式不一样\r\n\t\t\t\t\tif(pagePath) {\r\n\t\t\t\t\t\tif(pagePath == this.pageUrl || pagePath == '/' + this.pageUrl) {\r\n\t\t\t\t\t\t\treturn this.list[index].selectedIconPath;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\treturn this.list[index].iconPath;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 普通方案中，索引等于v-model值时，即为激活项\r\n\t\t\t\t\t\treturn index == this.value ? this.list[index].selectedIconPath : this.list[index].iconPath\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\telColor() {\r\n\t\t\t\treturn (index) => {\r\n\t\t\t\t\t// 判断方法同理于elIconPath\r\n\t\t\t\t\tlet pagePath = this.list[index].pagePath;\r\n\t\t\t\t\tif(pagePath) {\r\n\t\t\t\t\t\tif(pagePath == this.pageUrl || pagePath == '/' + this.pageUrl) return this.activeColor;\r\n\t\t\t\t\t\telse return this.inactiveColor;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn index == this.value ? this.activeColor : this.inactiveColor;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.midButton && this.getMidButtonLeft();\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tasync clickHandler(index) {\r\n\t\t\t\tif(this.beforeSwitch && typeof(this.beforeSwitch) === 'function') {\r\n\t\t\t\t\t// 执行回调，同时传入索引当作参数\r\n\t\t\t\t\t// 在微信，支付宝等环境(H5正常)，会导致父组件定义的customBack()函数体中的this变成子组件的this\r\n\t\t\t\t\t// 通过bind()方法，绑定父组件的this，让this.customBack()的this为父组件的上下文\r\n\t\t\t\t\tlet beforeSwitch = this.beforeSwitch.bind(this.$u.$parent.call(this))(index);\r\n\t\t\t\t\t// 判断是否返回了promise\r\n\t\t\t\t\tif (!!beforeSwitch && typeof beforeSwitch.then === 'function') {\r\n\t\t\t\t\t\tawait beforeSwitch.then(res => {\r\n\t\t\t\t\t\t\t// promise返回成功，\r\n\t\t\t\t\t\t\tthis.switchTab(index);\r\n\t\t\t\t\t\t}).catch(err => {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else if(beforeSwitch === true) {\r\n\t\t\t\t\t\t// 如果返回true\r\n\t\t\t\t\t\tthis.switchTab(index);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.switchTab(index);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 切换tab\r\n\t\t\tswitchTab(index) {\r\n\t\t\t\t// 发出事件和修改v-model绑定的值\r\n\t\t\t\tthis.$emit('change', index);\r\n\t\t\t\t// 如果有配置pagePath属性，使用uni.switchTab进行跳转\r\n\t\t\t\tif(this.list[index].pagePath) {\r\n\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\turl: this.list[index].pagePath\r\n\t\t\t\t\t})\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 如果配置了papgePath属性，将不会双向绑定v-model传入的value值\r\n\t\t\t\t\t// 因为这个模式下，不再需要v-model绑定的value值了，而是通过getCurrentPages()适配\r\n\t\t\t\t\tthis.$emit('input', index);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 计算角标的right值\r\n\t\t\tgetOffsetRight(count, isDot) {\r\n\t\t\t\t// 点类型，count大于9(两位数)，分别设置不同的right值，避免位置太挤\r\n\t\t\t\tif(isDot) {\r\n\t\t\t\t\treturn -20;\r\n\t\t\t\t} else if(count > 9) {\r\n\t\t\t\t\treturn -40;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn -30;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 获取凸起按钮外层元素的left值，让其水平居中\r\n\t\t\tgetMidButtonLeft() {\r\n\t\t\t\tlet windowWidth = this.$u.sys().windowWidth;\r\n\t\t\t\t// 由于安卓中css计算left: 50%的结果不准确，故用js计算\r\n\t\t\t\tthis.midButtonLeft = (windowWidth / 2) + 'px';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t.u-fixed-placeholder {\r\n\t\tbox-sizing: content-box;\r\n\t}\r\n\r\n\t.u-tabbar {\r\n\r\n\t\t&__content {\r\n\t\t\tdisplay: flex;\r\n\t\t\talign-items: center;\r\n\t\t\tposition: relative;\r\n\t\t\tposition: fixed;\r\n\t\t\tbottom: 0;\r\n\t\t\tleft: 0;\r\n\t\t\twidth: 100%;\r\n\t\t\tz-index: 998;\r\n\t\t\tbox-sizing: content-box;\r\n\r\n\t\t\t&__circle__border {\r\n\t\t\t\tborder-radius: 100%;\r\n\t\t\t\twidth: 110rpx;\r\n\t\t\t\theight: 110rpx;\r\n\t\t\t\ttop: -48rpx;\r\n\t\t\t\tposition: absolute;\r\n\t\t\t\tz-index: 4;\r\n\t\t\t\tbackground-color: #ffffff;\r\n\t\t\t\t// 由于安卓的无能，导致只有3个tabbar item时，此css计算方式有误差\r\n\t\t\t\t// 故使用js计算的形式来定位，此处不注释，是因为js计算有延后，避免出现位置闪动\r\n\t\t\t\tleft: 50%;\r\n\t\t\t\ttransform: translateX(-50%);\r\n\t\t\t\t\r\n\t\t\t\t&:after {\r\n\t\t\t\t\tborder-radius: 100px;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t&__item {\r\n\t\t\t\tflex: 1;\r\n\t\t\t\tjustify-content: center;\r\n\t\t\t\theight: 100%;\r\n\t\t\t\tpadding: 12rpx 0;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\tflex-direction: column;\r\n\t\t\t\talign-items: center;\r\n\t\t\t\tposition: relative;\r\n\r\n\t\t\t\t&__button {\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\ttop: 10rpx;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t&__text {\r\n\t\t\t\t\tcolor: $u-content-color;\r\n\t\t\t\t\tfont-size: 26rpx;\r\n\t\t\t\t\tline-height: 28rpx;\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tbottom: 12rpx;\r\n\t\t\t\t\tleft: 50%;\r\n\t\t\t\t\ttransform: translateX(-50%);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t&__circle {\r\n\t\t\t\tposition: relative;\r\n\t\t\t\tdisplay: flex;\r\n\t\t\t\tflex-direction: column;\r\n\t\t\t\tjustify-content: space-between;\r\n\t\t\t\tz-index: 10;\r\n\t\t\t\theight: calc(100% - 1px);\r\n\r\n\t\t\t\t&__button {\r\n\t\t\t\t\twidth: 90rpx;\r\n\t\t\t\t\theight: 90rpx;\r\n\t\t\t\t\tborder-radius: 100%;\r\n\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\tjustify-content: center;\r\n\t\t\t\t\talign-items: center;\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tbackground-color: #ffffff;\r\n\t\t\t\t\ttop: -40rpx;\r\n\t\t\t\t\tleft: 50%;\r\n\t\t\t\t\tz-index: 6;\r\n\t\t\t\t\ttransform: translateX(-50%);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-table/u-table.vue",
    "content": "<template>\r\n\t<view class=\"u-table\" :style=\"[tableStyle]\">\r\n\t\t<slot />\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * table 表格\r\n\t * @description 表格组件一般用于展示大量结构化数据的场景\r\n\t * @tutorial https://www.uviewui.com/components/table.html\r\n\t * @property {String} border-color 表格边框的颜色（默认#e4e7ed）\r\n\t * @property {String} bg-color 表格的背景颜色（默认#ffffff）\r\n\t * @property {String} align 单元格的内容对齐方式，作用类似css的text-align（默认center）\r\n\t * @property {String} padding 单元格的内边距，同css的padding写法（默认10rpx 0）\r\n\t * @property {String Number} font-size 单元格字体大小，单位rpx（默认28）\r\n\t * @property {String} color 单元格字体颜色（默认#606266）\r\n\t * @property {Object} th-style th单元格的样式，对象形式(将th所需参数放在table组件，是为了避免每一个th组件要写一遍）\r\n\t * @event {Function} click 点击组件时触发\r\n\t * @event {Function} close 点击关闭按钮时触发\r\n\t * @example <u-table></u-table>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-table\",\r\n\t\tprops: {\r\n\t\t\tborderColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#e4e7ed'\r\n\t\t\t},\r\n\t\t\talign: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'center'\r\n\t\t\t},\r\n\t\t\t// td的内边距\r\n\t\t\tpadding: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '10rpx 6rpx'\r\n\t\t\t},\r\n\t\t\t// 字体大小\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 28\r\n\t\t\t},\r\n\t\t\t// 字体颜色\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#606266'\r\n\t\t\t},\r\n\t\t\t// th的自定义样式\r\n\t\t\tthStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// table的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t}\r\n\t\t},\r\n\t\tprovide() {\r\n\t\t\treturn {\r\n\t\t\t\tuTable: this,\r\n\t\t\t};\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\ttableStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tstyle.borderLeft = `solid 1px ${this.borderColor}`;\r\n\t\t\t\tstyle.borderTop = `solid 1px ${this.borderColor}`;\r\n\t\t\t\tstyle.backgroundColor = this.bgColor;;\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-table {\r\n\t\twidth: 100%;\r\n\t\tbox-sizing: border-box;\r\n\t}\r\n\r\n\t/* #ifdef MP */\r\n\t.u-table /deep/ t-tr {\r\n\t\tdisplay: flex;\r\n\t}\r\n\t/* #endif */\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-tabs/u-tabs.vue",
    "content": "<template>\r\n\t<view class=\"u-tabs\" :style=\"{\r\n\t\tbackground: bgColor\r\n\t}\">\r\n\t\t<!-- $u.getRect()对组件根节点无效，因为写了.in(this)，故这里获取内层接点尺寸 -->\r\n\t\t<view :id=\"id\">\r\n\t\t\t<scroll-view scroll-x class=\"u-scroll-view\" :scroll-left=\"scrollLeft\" scroll-with-animation>\r\n\t\t\t\t<view class=\"u-scroll-box\" :class=\"{'u-tabs-scorll-flex': !isScroll}\">\r\n\t\t\t\t\t<view class=\"u-tab-item u-line-1\" :id=\"'u-tab-item-' + index\" v-for=\"(item, index) in list\" :key=\"index\" @tap=\"clickTab(index)\"\r\n\t\t\t\t\t :style=\"[tabItemStyle(index)]\">\r\n\t\t\t\t\t\t{{ item[name] || item['name']}}\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view v-if=\"showBar\" class=\"u-tab-bar\" :style=\"[tabBarStyle]\"></view>\r\n\t\t\t\t</view>\r\n\t\t\t</scroll-view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * tabs 标签\r\n\t * @description 该组件，是一个tabs标签组件，在标签多的时候，可以配置为左右滑动，标签少的时候，可以禁止滑动。 该组件的一个特点是配置为滚动模式时，激活的tab会自动移动到组件的中间位置。 \r\n\t * @tutorial https://www.uviewui.com/components/tabs.html\r\n\t * @property {Boolean} is-scroll tabs是否可以左右拖动（默认true）\r\n\t * @property {Array} list 标签数组，元素为对象，如[{name: '推荐'}]\r\n\t * @property {String Number} current 指定哪个tab为激活状态（默认0）\r\n\t * @property {String Number} height 导航栏的高度，单位rpx（默认80）\r\n\t * @property {String Number} font-size tab文字大小，单位rpx（默认30）\r\n\t * @property {String Number} duration 滑块移动一次所需的时间，单位秒（默认0.5）\r\n\t * @property {String} active-color 滑块和激活tab文字的颜色（默认#2979ff）\r\n\t * @property {String} inactive-color tabs文字颜色（默认#303133）\r\n\t * @property {String Number} bar-width 滑块宽度，单位rpx（默认40）\r\n\t * @property {Object} active-item-style 活动tabs item的样式，对象形式\r\n\t * @property {Object} bar-style 底部滑块的样式，对象形式\r\n\t * @property {Boolean} show-bar 是否显示底部的滑块（默认true）\r\n\t * @property {String Number} bar-height 滑块高度，单位rpx（默认6）\r\n\t * @property {String Number} item-width 标签的宽度（默认auto）\r\n\t * @property {String Number} gutter 单个tab标签的左右内边距之和，单位rpx（默认40）\r\n\t * @property {String} bg-color tabs导航栏的背景颜色（默认#ffffff）\r\n\t * @property {String} name 组件内部读取的list参数中的属性名，见官网说明（默认name）\r\n\t * @property {Boolean} bold 激活选项的字体是否加粗（默认true）\r\n\t * @event {Function} change 点击标签时触发\r\n\t * @example <u-tabs ref=\"tabs\" :list=\"list\" :is-scroll=\"false\"></u-tabs>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-tabs\",\r\n\t\tprops: {\r\n\t\t\t// 导航菜单是否需要滚动，如只有2或者3个的时候，就不需要滚动了，此时使用flex平分tab的宽度\r\n\t\t\tisScroll: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t//需循环的标签列表\r\n\t\t\tlist: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn [];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 当前活动tab的索引\r\n\t\t\tcurrent: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 导航栏的高度和行高\r\n\t\t\theight: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 80\r\n\t\t\t},\r\n\t\t\t// 字体大小\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 30\r\n\t\t\t},\r\n\t\t\t// 过渡动画时长, 单位ms\r\n\t\t\tduration: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 0.5\r\n\t\t\t},\r\n\t\t\t// 选中项的主题颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 未选中项的颜色\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#303133'\r\n\t\t\t},\r\n\t\t\t// 菜单底部移动的bar的宽度，单位rpx\r\n\t\t\tbarWidth: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 40\r\n\t\t\t},\r\n\t\t\t// 移动bar的高度\r\n\t\t\tbarHeight: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 6\r\n\t\t\t},\r\n\t\t\t// 单个tab的左或有内边距（左右相同）\r\n\t\t\tgutter: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 30\r\n\t\t\t},\r\n\t\t\t// 导航栏的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t// 读取传入的数组对象的属性\r\n\t\t\tname: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'name'\r\n\t\t\t},\r\n\t\t\t// 活动tab字体是否加粗\r\n\t\t\tbold: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 当前活动tab item的样式\r\n\t\t\tactiveItemStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否显示底部的滑块\r\n\t\t\tshowBar: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 底部滑块的自定义样式\r\n\t\t\tbarStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 标签的宽度\r\n\t\t\titemWidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 'auto'\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tscrollLeft: 0, // 滚动scroll-view的左边滚动距离\r\n\t\t\t\ttabQueryInfo: [], // 存放对tab菜单查询后的节点信息\r\n\t\t\t\tcomponentWidth: 0, // 屏幕宽度，单位为px\r\n\t\t\t\tscrollBarLeft: 0, // 移动bar需要通过translateX()移动的距离\r\n\t\t\t\tparentLeft: 0, // 父元素(tabs组件)到屏幕左边的距离\r\n\t\t\t\tid: this.$u.guid(), // id值\r\n\t\t\t\tcurrentIndex: this.current,\r\n\t\t\t\tbarFirstTimeMove: true, // 滑块第一次移动时(页面刚生成时)，无需动画，否则给人怪异的感觉\r\n\t\t\t};\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\t// 监听tab的变化，重新计算tab菜单的布局信息，因为实际使用中菜单可能是通过\r\n\t\t\t// 后台获取的（如新闻app顶部的菜单），获取返回需要一定时间，所以list变化时，重新获取布局信息\r\n\t\t\tlist(n, o) {\r\n\t\t\t\t// list变动时，重制内部索引，否则可能导致超出数组边界的情况\r\n\t\t\t\tif(n.length !== o.length) this.currentIndex = 0;\r\n\t\t\t\t// 用$nextTick等待视图更新完毕后再计算tab的局部信息，否则可能因为tab还没生成就获取，就会有问题\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.init();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tcurrent: {\r\n\t\t\t\timmediate: true,\r\n\t\t\t\thandler(nVal, oVal) {\r\n\t\t\t\t\t// 视图更新后再执行移动操作\r\n\t\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\t\tthis.currentIndex = nVal;\r\n\t\t\t\t\t\tthis.scrollByIndex();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 移动bar的样式\r\n\t\t\ttabBarStyle() {\r\n\t\t\t\tlet style = {\r\n\t\t\t\t\twidth: this.barWidth + 'rpx',\r\n\t\t\t\t\ttransform: `translate(${this.scrollBarLeft}px, -100%)`,\r\n\t\t\t\t\t// 滑块在页面渲染后第一次滑动时，无需动画效果\r\n\t\t\t\t\t'transition-duration': `${this.barFirstTimeMove ? 0 : this.duration }s`,\r\n\t\t\t\t\t'background-color': this.activeColor,\r\n\t\t\t\t\theight: this.barHeight + 'rpx',\r\n\t\t\t\t\t// 设置一个很大的值，它会自动取能用的最大值，不用高度的一半，是因为高度可能是单数，会有小数出现\r\n\t\t\t\t\t'border-radius': `${this.barHeight / 2}px`\r\n\t\t\t\t};\r\n\t\t\t\tObject.assign(style, this.barStyle);\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// tab的样式\r\n\t\t\ttabItemStyle() {\r\n\t\t\t\treturn (index) => {\r\n\t\t\t\t\tlet style = {\r\n\t\t\t\t\t\theight: this.height + 'rpx',\r\n\t\t\t\t\t\t'line-height': this.height + 'rpx',\r\n\t\t\t\t\t\t'font-size': this.fontSize + 'rpx',\r\n\t\t\t\t\t\t'transition-duration': `${this.duration}s`,\r\n\t\t\t\t\t\tpadding: this.isScroll ? `0 ${this.gutter}rpx` : '',\r\n\t\t\t\t\t\tflex: this.isScroll ? 'auto' : '1',\r\n\t\t\t\t\t\twidth: this.$u.addUnit(this.itemWidth)\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// 字体加粗\r\n\t\t\t\t\tif (index == this.currentIndex && this.bold) style.fontWeight = 'bold';\r\n\t\t\t\t\tif (index == this.currentIndex) {\r\n\t\t\t\t\t\tstyle.color = this.activeColor;\r\n\t\t\t\t\t\t// 给选中的tab item添加外部自定义的样式\r\n\t\t\t\t\t\tstyle = Object.assign(style, this.activeItemStyle);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstyle.color = this.inactiveColor;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn style;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 设置一个init方法，方便多处调用\r\n\t\t\tasync init() {\r\n\t\t\t\t// 获取tabs组件的尺寸信息\r\n\t\t\t\tlet tabRect = await this.$uGetRect('#' + this.id);\r\n\t\t\t\t// tabs组件距离屏幕左边的宽度\r\n\t\t\t\tthis.parentLeft = tabRect.left;\r\n\t\t\t\t// tabs组件的宽度\r\n\t\t\t\tthis.componentWidth = tabRect.width;\r\n\t\t\t\tthis.getTabRect();\r\n\t\t\t},\r\n\t\t\t// 点击某一个tab菜单\r\n\t\t\tclickTab(index) {\r\n\t\t\t\t// 点击当前活动tab，不触发事件\r\n\t\t\t\tif(index == this.currentIndex) return ;\r\n\t\t\t\t// 发送事件给父组件\r\n\t\t\t\tthis.$emit('change', index);\r\n\t\t\t},\r\n\t\t\t// 查询tab的布局信息\r\n\t\t\tgetTabRect() {\r\n\t\t\t\t// 创建节点查询\r\n\t\t\t\tlet query = uni.createSelectorQuery().in(this);\r\n\t\t\t\t// 历遍所有tab，这里是执行了查询，最终使用exec()会一次性返回查询的数组结果\r\n\t\t\t\tfor (let i = 0; i < this.list.length; i++) {\r\n\t\t\t\t\t// 只要size和rect两个参数\r\n\t\t\t\t\tquery.select(`#u-tab-item-${i}`).fields({\r\n\t\t\t\t\t\tsize: true,\r\n\t\t\t\t\t\trect: true\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t// 执行查询，一次性获取多个结果\r\n\t\t\t\tquery.exec(\r\n\t\t\t\t\tfunction(res) {\r\n\t\t\t\t\t\tthis.tabQueryInfo = res;\r\n\t\t\t\t\t\t// 初始化滚动条和移动bar的位置\r\n\t\t\t\t\t\tthis.scrollByIndex();\r\n\t\t\t\t\t}.bind(this)\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\t// 滚动scroll-view，让活动的tab处于屏幕的中间位置\r\n\t\t\tscrollByIndex() {\r\n\t\t\t\t// 当前活动tab的布局信息，有tab菜单的width和left(为元素左边界到父元素左边界的距离)等信息\r\n\t\t\t\tlet tabInfo = this.tabQueryInfo[this.currentIndex];\r\n\t\t\t\tif (!tabInfo) return;\r\n\t\t\t\t// 活动tab的宽度\r\n\t\t\t\tlet tabWidth = tabInfo.width;\r\n\t\t\t\t// 活动item的左边到tabs组件左边的距离，用item的left减去tabs的left\r\n\t\t\t\tlet offsetLeft = tabInfo.left - this.parentLeft;\r\n\t\t\t\t// 将活动的tabs-item移动到屏幕正中间，实际上是对scroll-view的移动\r\n\t\t\t\tlet scrollLeft = offsetLeft - (this.componentWidth - tabWidth) / 2;\r\n\t\t\t\tthis.scrollLeft = scrollLeft < 0 ? 0 : scrollLeft;\r\n\t\t\t\t// 当前活动item的中点点到左边的距离减去滑块宽度的一半，即可得到滑块所需的移动距离\r\n\t\t\t\tlet left = tabInfo.left + tabInfo.width / 2 - this.parentLeft;\r\n\t\t\t\t// 计算当前活跃item到组件左边的距离\r\n\t\t\t\tthis.scrollBarLeft = left - uni.upx2px(this.barWidth) / 2;\r\n\t\t\t\t// 第一次移动滑块的时候，barFirstTimeMove为true，放到延时中将其设置false\r\n\t\t\t\t// 延时是因为scrollBarLeft作用于computed计算时，需要一个过程需，否则导致出错\r\n\t\t\t\tif(this.barFirstTimeMove == true) {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tthis.barFirstTimeMove = false;\r\n\t\t\t\t\t}, 100)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.init();\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\tview,\r\n\tscroll-view {\r\n\t\tbox-sizing: border-box;\r\n\t}\r\n\r\n\t::-webkit-scrollbar,\r\n\t::-webkit-scrollbar,\r\n\t::-webkit-scrollbar {\r\n\t\tdisplay: none;\r\n\t\twidth: 0 !important;\r\n\t\theight: 0 !important;\r\n\t\t-webkit-appearance: none;\r\n\t\tbackground: transparent;\r\n\t}\r\n\r\n\t.u-scroll-box {\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t/* #ifdef H5 */\r\n\t// 通过样式穿透，隐藏H5下，scroll-view下的滚动条\r\n\tscroll-view /deep/ ::-webkit-scrollbar {\r\n\t\tdisplay: none;\r\n\t\twidth: 0 !important;\r\n\t\theight: 0 !important;\r\n\t\t-webkit-appearance: none;\r\n\t\tbackground: transparent;\r\n\t}\r\n\r\n\t/* #endif */\r\n\r\n\t.u-scroll-view {\r\n\t\twidth: 100%;\r\n\t\twhite-space: nowrap;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-tab-item {\r\n\t\tposition: relative;\r\n\t\tdisplay: inline-block;\r\n\t\ttext-align: center;\r\n\t\ttransition-property: background-color, color;\r\n\t}\r\n\r\n\t.u-tab-bar {\r\n\t\tposition: absolute;\r\n\t\tbottom: 0;\r\n\t}\r\n\r\n\t.u-tabs-scorll-flex {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue",
    "content": "<template>\r\n\t<view class=\"u-tabs\" :style=\"{\r\n\t\t\tzIndex: zIndex,\r\n\t\t\tbackground: bgColor\r\n\t\t}\">\r\n\t\t<scroll-view scroll-x class=\"u-scroll-view\" :scroll-left=\"scrollLeft\" scroll-with-animation :style=\"{ zIndex: zIndex + 1 }\">\r\n\t\t\t<view class=\"u-tabs-scroll-box\" :class=\"{'u-tabs-scorll-flex': !isScroll}\">\r\n\t\t\t\t<view class=\"u-tabs-item\" :style=\"[tabItemStyle(index)]\"\r\n\t\t\t\t v-for=\"(item, index) in getTabs\" :key=\"index\" :class=\"[preId + index]\" @tap=\"emit(index)\">\r\n\t\t\t\t\t{{ item[name] || item['name']}}\r\n\t\t\t\t</view>\r\n\t\t\t\t<view v-if=\"showBar\" class=\"u-scroll-bar\" :style=\"[tabBarStyle]\"></view>\r\n\t\t\t</view>\r\n\t\t</scroll-view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\timport colorGradient from '../../libs/function/colorGradient';\r\n\tlet color = colorGradient;\r\n\tconst {\r\n\t\twindowWidth\r\n\t} = uni.getSystemInfoSync();\r\n\tconst preId = 'UEl_';\r\n\r\n\t/**\r\n\t * tabsSwiper 全屏选项卡\r\n\t * @description 该组件内部实现主要依托于uniapp的scroll-view和swiper组件，主要特色是切换过程中，tabsSwiper文字的颜色可以渐变，底部滑块可以 跟随式滑动，活动tab滚动居中等。应用场景可以用于需要左右切换页面，比如商城的订单中心(待收货-待付款-待评价-已退货)等应用场景。\r\n\t * @tutorial https://www.uviewui.com/components/tabsSwiper.html\r\n\t * @property {Boolean} is-scroll tabs是否可以左右拖动（默认true）\r\n\t * @property {Array} list 标签数组，元素为对象，如[{name: '推荐'}]\r\n\t * @property {String Number} current 指定哪个tab为激活状态（默认0）\r\n\t * @property {String Number} height 导航栏的高度，单位rpx（默认80）\r\n\t * @property {String Number} font-size tab文字大小，单位rpx（默认30）\r\n\t * @property {String Number} swiper-width tabs组件外部swiper的宽度，默认为屏幕宽度，单位rpx（默认750）\r\n\t * @property {String} active-color 滑块和激活tab文字的颜色（默认#2979ff）\r\n\t * @property {String} inactive-color tabs文字颜色（默认#303133）\r\n\t * @property {String Number} bar-width 滑块宽度，单位rpx（默认40）\r\n\t * @property {String Number} bar-height 滑块高度，单位rpx（默认6）\r\n\t * @property {Object} bar-style 底部滑块的样式，对象形式\r\n\t * @property {Object} active-item-style 活动tabs item的样式，对象形式\r\n\t * @property {Boolean} show-bar 是否显示底部的滑块（默认true）\r\n\t * @property {String Number} gutter 单个tab标签的左右内边距之和，单位rpx（默认40）\r\n\t * @property {String} bg-color tabs导航栏的背景颜色（默认#ffffff）\r\n\t * @property {String} name 组件内部读取的list参数中的属性名，见官网说明（默认name）\r\n\t * @property {Boolean} bold 激活选项的字体是否加粗（默认true）\r\n\t * @event {Function} change 点击标签时触发\r\n\t * @example <u-tabs-swiper ref=\"tabs\" :list=\"list\" :is-scroll=\"false\"></u-tabs-swiper>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-tabs-swiper\",\r\n\t\tprops: {\r\n\t\t\t// 导航菜单是否需要滚动，如只有2或者3个的时候，就不需要滚动了，此时使用flex平分tab的宽度\r\n\t\t\tisScroll: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t//需循环的标签列表\r\n\t\t\tlist: {\r\n\t\t\t\ttype: Array,\r\n\t\t\t\tdefault () {\r\n\t\t\t\t\treturn [];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 当前活动tab的索引\r\n\t\t\tcurrent: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 0\r\n\t\t\t},\r\n\t\t\t// 导航栏的高度和行高，单位rpx\r\n\t\t\theight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 80\r\n\t\t\t},\r\n\t\t\t// 字体大小，单位rpx\r\n\t\t\tfontSize: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 30\r\n\t\t\t},\r\n\t\t\t// 过渡动画时长, 单位s\r\n\t\t\t// duration: {\r\n\t\t\t// \ttype: [Number, String],\r\n\t\t\t// \tdefault: 0.5\r\n\t\t\t// },\r\n\t\t\tswiperWidth: {\r\n\t\t\t\t//line3生效, 外部swiper的宽度, 单位rpx\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 750\r\n\t\t\t},\r\n\t\t\t// 选中项的主题颜色\r\n\t\t\tactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#2979ff'\r\n\t\t\t},\r\n\t\t\t// 未选中项的颜色\r\n\t\t\tinactiveColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#303133'\r\n\t\t\t},\r\n\t\t\t// 菜单底部移动的bar的宽度，单位rpx\r\n\t\t\tbarWidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 40\r\n\t\t\t},\r\n\t\t\t// 移动bar的高度\r\n\t\t\tbarHeight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 6\r\n\t\t\t},\r\n\t\t\t// 单个tab的左或右内边距（各占一半），单位rpx\r\n\t\t\tgutter: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 40\r\n\t\t\t},\r\n\t\t\t// 如果是绝对定位，添加z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 1\r\n\t\t\t},\r\n\t\t\t// 导航栏的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '#ffffff'\r\n\t\t\t},\r\n\t\t\t//滚动至中心目标类型\r\n\t\t\tautoCenterMode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'window'\r\n\t\t\t},\r\n\t\t\t// 读取传入的数组对象的属性\r\n\t\t\tname: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'name'\r\n\t\t\t},\r\n\t\t\t// 活动tab字体是否加粗\r\n\t\t\tbold: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 当前活动tab item的样式\r\n\t\t\tactiveItemStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 是否显示底部的滑块\r\n\t\t\tshowBar: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t},\r\n\t\t\t// 底部滑块的自定义样式\r\n\t\t\tbarStyle: {\r\n\t\t\t\ttype: Object,\r\n\t\t\t\tdefault() {\r\n\t\t\t\t\treturn {}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tscrollLeft: 0, // 滚动scroll-view的左边滚动距离\r\n\t\t\t\ttabQueryInfo: [], // 存放对tab菜单查询后的节点信息\r\n\t\t\t\twindowWidth: 0, // 屏幕宽度，单位为px\r\n\t\t\t\t//scrollBarLeft: 0, // 移动bar需要通过translateX()移动的距离\r\n\t\t\t\tanimationFinishCurrent: this.current,\r\n\t\t\t\tcomponentsWidth: 0,\r\n\t\t\t\tline3AddDx: 0,\r\n\t\t\t\tline3Dx: 0,\r\n\t\t\t\tpreId,\r\n\t\t\t\tsW: 0,\r\n\t\t\t\ttabsInfo: [],\r\n\t\t\t\tcolorGradientArr: [],\r\n\t\t\t\tcolorStep: 100 // 两个颜色之间的渐变等分\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\t// 获取当前活跃的current值\r\n\t\t\tgetCurrent() {\r\n\t\t\t\tconst current = Number(this.current);\r\n\t\t\t\t// 判断是否超出边界\r\n\t\t\t\tif (current > this.getTabs.length - 1) {\r\n\t\t\t\t\treturn this.getTabs.length - 1;\r\n\t\t\t\t}\r\n\t\t\t\tif (current < 0) return 0;\r\n\t\t\t\treturn current;\r\n\t\t\t},\r\n\t\t\tgetTabs() {\r\n\t\t\t\treturn this.list;\r\n\t\t\t},\r\n\t\t\t// 滑块需要移动的距离\r\n\t\t\tscrollBarLeft() {\r\n\t\t\t\treturn Number(this.line3Dx) + Number(this.line3AddDx);\r\n\t\t\t},\r\n\t\t\t// 滑块的宽度转为px单位\r\n\t\t\tbarWidthPx() {\r\n\t\t\t\treturn uni.upx2px(this.barWidth);\r\n\t\t\t},\r\n\t\t\t// tab的样式\r\n\t\t\ttabItemStyle() {\r\n\t\t\t\treturn (index) => {\r\n\t\t\t\t\tlet style = {\r\n\t\t\t\t\t\theight: this.height + 'rpx',\r\n\t\t\t\t\t\tlineHeight: this.height + 'rpx',\r\n\t\t\t\t\t\tpadding: `0 ${this.gutter / 2}rpx`,\r\n\t\t\t\t\t\tcolor: this.tabsInfo.length > 0 ? (this.tabsInfo[index] ? this.tabsInfo[index].color : this.activeColor) : this.inactiveColor,\r\n\t\t\t\t\t\tfontSize: this.fontSize + 'rpx',\r\n\t\t\t\t\t\tzIndex: this.zIndex + 2,\r\n\t\t\t\t\t\tfontWeight: (index == this.getCurrent && this.bold) ? 'bold' : 'normal'\r\n\t\t\t\t\t};\r\n\t\t\t\t\tif(index == this.getCurrent) {\r\n\t\t\t\t\t\t// 给选中的tab item添加外部自定义的样式\r\n\t\t\t\t\t\tstyle = Object.assign(style, this.activeItemStyle);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn style;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 底部滑块的样式\r\n\t\t\ttabBarStyle() {\r\n\t\t\t\tlet style = {\r\n\t\t\t\t\twidth: this.barWidthPx + 'px',\r\n\t\t\t\t\theight: this.barHeight + 'rpx',\r\n\t\t\t\t\tborderRadius: '100px',\r\n\t\t\t\t\tbackgroundColor: this.activeColor,\r\n\t\t\t\t\tleft: this.scrollBarLeft + 'px'\r\n\t\t\t\t};\r\n\t\t\t\treturn Object.assign(style, this.barStyle);\r\n\t\t\t}\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tcurrent(n, o) {\r\n\t\t\t\tthis.change(n);\r\n\t\t\t\tthis.setFinishCurrent(n);\r\n\t\t\t},\r\n\t\t\tlist() {\r\n\t\t\t\tthis.$nextTick(() => {\r\n\t\t\t\t\tthis.init();\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.init();\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tasync init() {\r\n\t\t\t\tthis.countPx();\r\n\t\t\t\tawait this.getTabsInfo();\r\n\t\t\t\tthis.countLine3Dx();\r\n\t\t\t\tthis.getQuery(() => {\r\n\t\t\t\t\tthis.setScrollViewToCenter();\r\n\t\t\t\t});\r\n\t\t\t\t// 颜色渐变过程数组\r\n\t\t\t\tthis.colorGradientArr = color.colorGradient(this.inactiveColor, this.activeColor, this.colorStep);\r\n\t\t\t},\r\n\t\t\t// 获取各个tab的节点信息\r\n\t\t\tgetTabsInfo() {\r\n\t\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\t\tlet view = uni.createSelectorQuery().in(this);\r\n\t\t\t\t\tfor (let i = 0; i < this.list.length; i++) {\r\n\t\t\t\t\t\tview.select('.' + preId + i).boundingClientRect();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tview.exec(res => {\r\n\t\t\t\t\t\tconst arr = [];\r\n\t\t\t\t\t\tfor (let i = 0; i < res.length; i++) {\r\n\t\t\t\t\t\t\t// 给每个tab添加其文字颜色属性\r\n\t\t\t\t\t\t\tres[i].color = this.inactiveColor;\r\n\t\t\t\t\t\t\t// 当前tab直接赋予activeColor\r\n\t\t\t\t\t\t\tif (i == this.getCurrent) res[i].color = this.activeColor;\r\n\t\t\t\t\t\t\tarr.push(res[i]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.tabsInfo = arr;\r\n\t\t\t\t\t\tresolve();\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\t// 当swiper滑动结束，计算滑块最终要停留的位置\r\n\t\t\tcountLine3Dx() {\r\n\t\t\t\tconst tab = this.tabsInfo[this.animationFinishCurrent];\r\n\t\t\t\t// 让滑块中心点和当前tab中心重合\r\n\t\t\t\tif (tab) this.line3Dx = tab.left + tab.width / 2 - this.barWidthPx / 2 - this.tabsInfo[0].left;\r\n\t\t\t},\r\n\t\t\tcountPx() {\r\n\t\t\t\t// swiper宽度由rpx转为px单位，因为dx等，都是px单位\r\n\t\t\t\tthis.sW = uni.upx2px(Number(this.swiperWidth));\r\n\t\t\t},\r\n\t\t\temit(index) {\r\n\t\t\t\tthis.$emit('change', index);\r\n\t\t\t},\r\n\t\t\tchange() {\r\n\t\t\t\tthis.setScrollViewToCenter();\r\n\t\t\t},\r\n\t\t\tgetQuery(cb) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tlet view = uni.createSelectorQuery().in(this).select('.u-tabs');\r\n\t\t\t\t\tview.fields({\r\n\t\t\t\t\t\t\tsize: true\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tdata => {\r\n\t\t\t\t\t\t\tif (data) {\r\n\t\t\t\t\t\t\t\tthis.componentsWidth = data.width;\r\n\t\t\t\t\t\t\t\tif (cb && typeof cb === 'function') cb(data);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tthis.getQuery(cb);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t).exec();\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tthis.componentsWidth = windowWidth;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 把活动tab移动到屏幕中心点\r\n\t\t\tsetScrollViewToCenter() {\r\n\t\t\t\tlet tab;\r\n\t\t\t\ttab = this.tabsInfo[this.animationFinishCurrent];\r\n\t\t\t\tif (tab) {\r\n\t\t\t\t\tlet tabCenter = tab.left + tab.width / 2;\r\n\t\t\t\t\tlet fatherWidth;\r\n\t\t\t\t\t// 活动tab移动到中心时，以屏幕还是tab组件为宽度为基准\r\n\t\t\t\t\tif (this.autoCenterMode === 'window') {\r\n\t\t\t\t\t\tfatherWidth = windowWidth;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfatherWidth = this.componentsWidth;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.scrollLeft = tabCenter - fatherWidth / 2;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tsetDx(dx) {\r\n\t\t\t\tlet nextTabIndex = dx > 0 ? this.animationFinishCurrent + 1 : this.animationFinishCurrent - 1;\r\n\t\t\t\t// 判断索引是否超出边界\r\n\t\t\t\tnextTabIndex = nextTabIndex <= 0 ? 0 : nextTabIndex;\r\n\t\t\t\tnextTabIndex = nextTabIndex >= this.list.length ? this.list.length - 1 : nextTabIndex;\r\n\t\t\t\tconst tab = this.tabsInfo[nextTabIndex];\r\n\t\t\t\t// 当前tab中心点x轴坐标\r\n\t\t\t\tlet nowTab = this.tabsInfo[this.animationFinishCurrent];\r\n\t\t\t\tlet nowTabX = nowTab.left + nowTab.width / 2;\r\n\t\t\t\t// 下一个tab\r\n\t\t\t\tlet nextTab = this.tabsInfo[nextTabIndex];\r\n\t\t\t\tlet nextTabX = nextTab.left + nextTab.width / 2;\r\n\t\t\t\t// 两个tab之间的距离，因为下一个tab可能在当前tab的左边或者右边，取绝对值即可\r\n\t\t\t\tlet distanceX = Math.abs(nextTabX - nowTabX);\r\n\t\t\t\tthis.line3AddDx = (dx / this.sW) * distanceX;\r\n\t\t\t\tthis.setTabColor(this.animationFinishCurrent, nextTabIndex, dx);\r\n\t\t\t},\r\n\t\t\t// 设置tab的颜色\r\n\t\t\tsetTabColor(nowTabIndex, nextTabIndex, dx) {\r\n\t\t\t\tlet colorIndex = Math.abs(Math.ceil((dx / this.sW) * 100));\r\n\t\t\t\tlet colorLength = this.colorGradientArr.length;\r\n\t\t\t\t// 处理超出索引边界的情况\r\n\t\t\t\tcolorIndex = colorIndex >= colorLength ? colorLength - 1 : colorIndex <= 0 ? 0 : colorIndex;\r\n\t\t\t\t// 设置下一个tab的颜色\r\n\t\t\t\tthis.tabsInfo[nextTabIndex].color = this.colorGradientArr[colorIndex];\r\n\t\t\t\t// 设置当前tab的颜色\r\n\t\t\t\tthis.tabsInfo[nowTabIndex].color = this.colorGradientArr[colorLength - 1 - colorIndex];\r\n\t\t\t},\r\n\t\t\t// swiper结束滑动\r\n\t\t\tsetFinishCurrent(current) {\r\n\t\t\t\t// 如果滑动的索引不一致，修改tab颜色变化，因为可能会有直接点击tab的情况\r\n\t\t\t\tthis.tabsInfo.map((val, index) => {\r\n\t\t\t\t\tif (current == index) val.color = this.activeColor;\r\n\t\t\t\t\telse val.color = this.inactiveColor;\r\n\t\t\t\t\treturn val;\r\n\t\t\t\t});\r\n\t\t\t\tthis.line3AddDx = 0;\r\n\t\t\t\tthis.animationFinishCurrent = current;\r\n\t\t\t\tthis.countLine3Dx();\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\r\n\tview,\r\n\tscroll-view {\r\n\t\tbox-sizing: border-box;\r\n\t}\r\n\r\n\t.u-tabs {\r\n\t\twidth: 100%;\r\n\t\ttransition-property: background-color, color;\r\n\t}\r\n\r\n\t::-webkit-scrollbar,\r\n\t::-webkit-scrollbar,\r\n\t::-webkit-scrollbar {\r\n\t\tdisplay: none;\r\n\t\twidth: 0 !important;\r\n\t\theight: 0 !important;\r\n\t\t-webkit-appearance: none;\r\n\t\tbackground: transparent;\r\n\t}\r\n\r\n\t/* #ifdef H5 */\r\n\t// 通过样式穿透，隐藏H5下，scroll-view下的滚动条\r\n\tscroll-view /deep/ ::-webkit-scrollbar {\r\n\t\tdisplay: none;\r\n\t\twidth: 0 !important;\r\n\t\theight: 0 !important;\r\n\t\t-webkit-appearance: none;\r\n\t\tbackground: transparent;\r\n\t}\r\n\r\n\t/* #endif */\r\n\r\n\t.u-scroll-view {\r\n\t\twidth: 100%;\r\n\t\twhite-space: nowrap;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-tabs-scroll-box {\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-tabs-scorll-flex {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t}\r\n\r\n\t.u-tabs-scorll-flex .u-tabs-item {\r\n\t\tflex: 1;\r\n\t}\r\n\r\n\t.u-tabs-item {\r\n\t\tposition: relative;\r\n\t\tdisplay: inline-block;\r\n\t\ttext-align: center;\r\n\t\ttransition-property: background-color, color, font-weight;\r\n\t}\r\n\r\n\t.content {\r\n\t\toverflow: hidden;\r\n\t\twhite-space: nowrap;\r\n\t\ttext-overflow: ellipsis;\r\n\t}\r\n\r\n\t.boxStyle {\r\n\t\tpointer-events: none;\r\n\t\tposition: absolute;\r\n\t\ttransition-property: all;\r\n\t}\r\n\r\n\t.boxStyle2 {\r\n\t\tpointer-events: none;\r\n\t\tposition: absolute;\r\n\t\tbottom: 0;\r\n\t\ttransition-property: all;\r\n\t\ttransform: translateY(-100%);\r\n\t}\r\n\r\n\t.itemBackgroundBox {\r\n\t\tpointer-events: none;\r\n\t\tposition: absolute;\r\n\t\ttop: 0;\r\n\t\ttransition-property: left, background-color;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.itemBackground {\r\n\t\theight: 100%;\r\n\t\twidth: 100%;\r\n\t\ttransition-property: all;\r\n\t}\r\n\r\n\t.u-scroll-bar {\r\n\t\tposition: absolute;\r\n\t\tbottom: 4rpx;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-tag/u-tag.vue",
    "content": "<template>\r\n\t<view v-if=\"show\" :class=\"[\r\n\t\tdisabled ? 'u-disabled' : '',\r\n\t\t'u-size-' + size,\r\n\t\t'u-shape-' + shape,\r\n\t\t'u-mode-' + mode + '-' + type\r\n\t]\"\r\n\t class=\"u-tag\" :style=\"[customStyle]\" @tap=\"clickTag\">\r\n\t\t{{text}}\r\n\t\t<view class=\"u-icon-wrap\" @tap.stop>\r\n\t\t\t<u-icon @click=\"close\" size=\"22\" v-if=\"closeable\" :color=\"closeIconColor\" \r\n\t\t\tname=\"close\" class=\"u-close-icon\" :style=\"[iconStyle]\"></u-icon>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * tag 提示\r\n\t * @description 该组件一般用于标记和选择\r\n\t * @tutorial https://www.uviewui.com/components/tag.html\r\n\t * @property {String} type 主题类型（默认primary）\r\n\t * @property {String} size 标签大小（默认default）\r\n\t * @property {String} shape 标签形状（默认square）\r\n\t * @property {String} text 标签的文字内容\r\n\t * @property {String} bg-color 自定义标签的背景颜色\r\n\t * @property {String} border-color 标签的边框颜色\r\n\t * @property {String} close-color 关闭按钮的颜色\r\n\t * @property {String Number} index 点击标签时，会通过click事件返回该值\r\n\t * @property {String} mode 模式选择，见官网说明（默认light）\r\n\t * @property {Boolean} closeable 是否可关闭，设置为true，文字右边会出现一个关闭图标（默认false）\r\n\t * @property {Boolean} show 标签显示与否（默认true）\r\n\t * @event {Function} click 点击标签触发\r\n\t * @event {Function} close closeable为true时，点击标签关闭按钮触发\r\n\t * @example <u-tag text=\"雪月夜\" type=\"success\" />\r\n\t */\r\n\texport default {\r\n\t\tname: 'u-tag',\r\n\t\t// 是否禁用这个标签，禁用的话，会屏蔽点击事件\r\n\t\tprops: {\r\n\t\t\t// 标签类型info、primary、success、warning、error\r\n\t\t\ttype: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'primary'\r\n\t\t\t},\r\n\t\t\tdisabled: {\r\n\t\t\t\ttype: [Boolean, String],\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 标签的大小，分为default（默认），mini（较小）\r\n\t\t\tsize: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'default'\r\n\t\t\t},\r\n\t\t\t// tag的形状，circle（两边半圆形）, square（方形，带圆角），circleLeft（左边是半圆），circleRight（右边是半圆）\r\n\t\t\tshape: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'square'\r\n\t\t\t},\r\n\t\t\t// 标签文字\r\n\t\t\ttext: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 背景颜色，默认为空字符串，即不处理\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 标签字体颜色，默认为空字符串，即不处理\r\n\t\t\tcolor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 镂空形式标签的边框颜色\r\n\t\t\tborderColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 关闭按钮图标的颜色\r\n\t\t\tcloseColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 点击时返回的索引值，用于区分例遍的数组哪个元素被点击了\r\n\t\t\tindex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t\t// 模式选择，dark|light|plain\r\n\t\t\tmode: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'light'\r\n\t\t\t},\r\n\t\t\t// 是否可关闭\r\n\t\t\tcloseable: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 是否显示\r\n\t\t\tshow: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: true\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tcustomStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\t// 文字颜色（如果有此值，会覆盖type值的颜色）\r\n\t\t\t\tif(this.color) style.color = this.color+\"!important\";\r\n\t\t\t\t// tag的背景颜色（如果有此值，会覆盖type值的颜色）\r\n\t\t\t\tif(this.bgColor) style.backgroundColor = this.bgColor+\"!important\";\r\n\t\t\t\t// 如果是镂空型tag，没有传递边框颜色（borderColor）的话，使用文字的颜色（color属性）\r\n\t\t\t\tif(this.mode == 'plain' && this.color && !this.borderColor) style.borderColor = this.color;\r\n\t\t\t\telse style.borderColor = this.borderColor;\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\ticonStyle() {\r\n\t\t\t\tif(!this.closeable) return ;\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif(this.size == 'mini') style.fontSize = '20rpx';\r\n\t\t\t\telse style.fontSize = '22rpx';\r\n\t\t\t\tif(this.mode == 'plain' || this.mode == 'light') style.color = this.type;\r\n\t\t\t\telse if(this.mode == 'dark')  style.color = \"#ffffff\";\r\n\t\t\t\tif(this.closeColor) style.color = this.closeColor;\r\n\t\t\t\treturn style;\r\n\t\t\t},\r\n\t\t\t// 关闭图标的颜色\r\n\t\t\tcloseIconColor() {\r\n\t\t\t\t// 如果定义了关闭图标的颜色，就用此值，否则用字体颜色的值\r\n\t\t\t\t// 如果上面的二者都没有，如果是dark深色模式，图标就为白色\r\n\t\t\t\t// 最后如果上面的三者都不合适，就返回type值给图标获取颜色\r\n\t\t\t\tlet color = '';\r\n\t\t\t\tif(this.closeColor) return this.closeColor;\r\n\t\t\t\telse if(this.color) return this.color;\r\n\t\t\t\telse if(this.mode == 'dark') return '#ffffff';\r\n\t\t\t\telse return this.type;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 标签被点击\r\n\t\t\tclickTag() {\r\n\t\t\t\t// 如果是disabled状态，不发送点击事件\r\n\t\t\t\tif(this.disabled) return ;\r\n\t\t\t\tthis.$emit('click', this.index);\r\n\t\t\t},\r\n\t\t\t// 点击标签关闭按钮\r\n\t\t\tclose() {\r\n\t\t\t\tthis.$emit('close', this.index);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-tag {\r\n\t\tbox-sizing: border-box;\r\n\t\talign-items: center;\r\n\t\tborder-radius: 6rpx;\r\n\t\tdisplay: inline-block;\r\n\t\tline-height: 1;\r\n\t}\r\n\t\r\n\t.u-size-default {\r\n\t\tfont-size: 22rpx;\r\n\t\tpadding: 12rpx 22rpx;\r\n\t}\r\n\t\r\n\t.u-size-mini {\r\n\t\tfont-size: 20rpx;\r\n\t\tpadding: 6rpx 12rpx;\r\n\t}\r\n\r\n\t.u-mode-light-primary {\r\n\t\tbackground-color: $u-type-primary-light;\r\n\t\tcolor: $u-type-primary;\r\n\t\tborder: 1px solid $u-type-primary-disabled;\r\n\t}\r\n\t\r\n\t.u-mode-light-success {\r\n\t\tbackground-color: $u-type-success-light;\r\n\t\tcolor: $u-type-success;\r\n\t\tborder: 1px solid $u-type-success-disabled;\r\n\t}\r\n\t\r\n\t.u-mode-light-error {\r\n\t\tbackground-color: $u-type-error-light;\r\n\t\tcolor: $u-type-error;\r\n\t\tborder: 1px solid $u-type-error-disabled;\r\n\t}\r\n\t\r\n\t.u-mode-light-warning {\r\n\t\tbackground-color: $u-type-warning-light;\r\n\t\tcolor: $u-type-warning;\r\n\t\tborder: 1px solid $u-type-warning-disabled;\r\n\t}\r\n\t\r\n\t.u-mode-light-info {\r\n\t\tbackground-color: $u-type-info-light;\r\n\t\tcolor: $u-type-info;\r\n\t\tborder: 1px solid $u-type-info-disabled;\r\n\t}\r\n\t\r\n\t.u-mode-dark-primary {\r\n\t\tbackground-color: $u-type-primary;\r\n\t\tcolor: #FFFFFF;\r\n\t}\r\n\t\r\n\t.u-mode-dark-success {\r\n\t\tbackground-color: $u-type-success;\r\n\t\tcolor: #FFFFFF;\r\n\t}\r\n\t\r\n\t.u-mode-dark-error {\r\n\t\tbackground-color: $u-type-error;\r\n\t\tcolor: #FFFFFF;\r\n\t}\r\n\t\r\n\t.u-mode-dark-warning {\r\n\t\tbackground-color: $u-type-warning;\r\n\t\tcolor: #FFFFFF;\r\n\t}\r\n\t\r\n\t.u-mode-dark-info {\r\n\t\tbackground-color: $u-type-info;\r\n\t\tcolor: #FFFFFF;\r\n\t}\r\n\t\r\n\t.u-mode-plain-primary {\r\n\t\tbackground-color: #FFFFFF;\r\n\t\tcolor: $u-type-primary;\r\n\t\tborder: 1px solid $u-type-primary;\r\n\t}\r\n\t\r\n\t.u-mode-plain-success {\r\n\t\tbackground-color: #FFFFFF;\r\n\t\tcolor: $u-type-success;\r\n\t\tborder: 1px solid $u-type-success;\r\n\t}\r\n\t\r\n\t.u-mode-plain-error {\r\n\t\tbackground-color: #FFFFFF;\r\n\t\tcolor: $u-type-error;\r\n\t\tborder: 1px solid $u-type-error;\r\n\t}\r\n\t\r\n\t.u-mode-plain-warning {\r\n\t\tbackground-color: #FFFFFF;\r\n\t\tcolor: $u-type-warning;\r\n\t\tborder: 1px solid $u-type-warning;\r\n\t}\r\n\t\r\n\t.u-mode-plain-info {\r\n\t\tbackground-color: #FFFFFF;\r\n\t\tcolor: $u-type-info;\r\n\t\tborder: 1px solid $u-type-info;\r\n\t}\r\n\t\r\n\t.u-disabled {\r\n\t\topacity: 0.55;\r\n\t}\r\n\r\n\t.u-shape-circle {\r\n\t\tborder-radius: 100rpx;\r\n\t}\r\n\t\r\n\t.u-shape-circleRight {\r\n\t\tborder-radius:  0 100rpx 100rpx 0;\r\n\t}\r\n\r\n\t.u-shape-circleLeft {\r\n\t\tborder-radius: 100rpx 0 0 100rpx;\r\n\t}\r\n\t\r\n\t.u-close-icon {\r\n\t\tmargin-left: 14rpx;\r\n\t\tfont-size: 22rpx;\r\n\t\tcolor: $u-type-success;\r\n\t}\r\n\t\r\n\t.u-icon-wrap {\r\n\t\tdisplay: inline-flex;\r\n\t\ttransform: scale(0.86);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-td/u-td.vue",
    "content": "<template>\r\n\t<view class=\"u-td\" :style=\"[tdStyle]\">\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * td td单元格\r\n\t * @description 表格组件一般用于展示大量结构化数据的场景（搭配u-table使用）\r\n\t * @tutorial https://www.uviewui.com/components/table.html#td-props\r\n\t * @property {String Number} width 单元格宽度百分比或者具体带单位的值，如30%， 200rpx等，一般使用百分比，单元格宽度默认为均分tr的长度（默认auto）\r\n\t * @example <u-td>二年级</u-td>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-td\",\r\n\t\tprops: {\r\n\t\t\t// 宽度，百分比或者具体带单位的值，如30%， 200rpx等，一般使用百分比\r\n\t\t\twidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: 'auto'\r\n\t\t\t}\r\n\t\t},\r\n\t\tinject: ['uTable'],\r\n\t\tcomputed: {\r\n\t\t\ttdStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif (this.width != \"auto\") style.flex = `0 0 ${this.width}`;\r\n\t\t\t\tstyle.textAlign = this.uTable.align;\r\n\t\t\t\tstyle.fontSize = this.uTable.fontSize + 'rpx';\r\n\t\t\t\tstyle.padding = this.uTable.padding;\r\n\t\t\t\tstyle.borderBottom = `solid 1px ${this.uTable.borderColor}`;\r\n\t\t\t\tstyle.borderRight = `solid 1px ${this.uTable.borderColor}`;\r\n\t\t\t\tstyle.color = this.uTable.color;\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t},\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-td {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tflex: 1;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-content-color;\r\n\t\talign-self: stretch;\r\n\t\tbox-sizing: border-box;\r\n\t}\r\n\r\n\t.u-col-1 {\r\n\t\tflex: 0 0 calc(100%/12);\r\n\t}\r\n\r\n\t.u-col-2 {\r\n\t\tflex: 0 0 calc(100%/12 * 2);\r\n\t}\r\n\r\n\t.u-col-3 {\r\n\t\tflex: 0 0 calc(100%/12 * 3);\r\n\t}\r\n\r\n\t.u-col-4 {\r\n\t\tflex: 0 0 calc(100%/12 * 4);\r\n\t}\r\n\r\n\t.u-col-5 {\r\n\t\tflex: 0 0 calc(100%/12 * 5);\r\n\t}\r\n\r\n\t.u-col-6 {\r\n\t\tflex: 0 0 calc(100%/12 * 6);\r\n\t}\r\n\r\n\t.u-col-7 {\r\n\t\tflex: 0 0 calc(100%/12 * 7);\r\n\t}\r\n\r\n\t.u-col-8 {\r\n\t\tflex: 0 0 calc(100%/12 * 8);\r\n\t}\r\n\r\n\t.u-col-9 {\r\n\t\tflex: 0 0 calc(100%/12 * 9);\r\n\t}\r\n\r\n\t.u-col-10 {\r\n\t\tflex: 0 0 calc(100%/12 * 10);\r\n\t}\r\n\r\n\t.u-col-11 {\r\n\t\tflex: 0 0 calc(100%/12 * 11);\r\n\t}\r\n\r\n\t.u-col-12 {\r\n\t\tflex: 0 0 calc(100%/12 * 12);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-th/u-th.vue",
    "content": "<template>\r\n\t<view class=\"u-th\" :style=\"[thStyle]\">\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * th th单元格\r\n\t * @description 表格组件一般用于展示大量结构化数据的场景（搭配u-table使用）\r\n\t * @tutorial https://www.uviewui.com/components/table.html#td-props\r\n\t * @property {String Number} width 标题单元格宽度百分比或者具体带单位的值，如30%，200rpx等，一般使用百分比，单元格宽度默认为均分tr的长度\r\n\t * @example 暂无示例\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-th\",\r\n\t\tprops: {\r\n\t\t\t// 宽度，百分比或者具体带单位的值，如30%， 200rpx等，一般使用百分比\r\n\t\t\twidth: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tinject: ['uTable'],\r\n\t\tcomputed: {\r\n\t\t\tthStyle() {\r\n\t\t\t\tlet style = {};\r\n\t\t\t\tif (this.width) style.flex = `0 0 ${this.width}`;\r\n\t\t\t\tstyle.textAlign = this.uTable.align;\r\n\t\t\t\tstyle.padding = this.uTable.padding;\r\n\t\t\t\tstyle.borderBottom = `solid 1px ${this.uTable.borderColor}`;\r\n\t\t\t\tstyle.borderRight = `solid 1px ${this.uTable.borderColor}`;\r\n\t\t\t\tObject.assign(style, this.uTable.thStyle);\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-th {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tflex: 1;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 28rpx;\r\n\t\tcolor: $u-main-color;\r\n\t\tfont-weight: bold;\r\n\t\tbackground-color: rgb(245, 246, 248);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-time-line/u-time-line.vue",
    "content": "<template>\r\n\t<view class=\"u-time-axis\">\r\n\t\t<slot />\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * timeLine 时间轴\r\n\t * @description 时间轴组件一般用于物流信息展示，各种跟时间相关的记录等场景。\r\n\t * @tutorial https://www.uviewui.com/components/timeLine.html\r\n\t * @example <u-time-line></u-time-line>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-time-line\",\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-time-axis {\r\n\t\tpadding-left: 40rpx;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\t.u-time-axis::before {\r\n\t\tcontent: \" \";\r\n\t\tposition: absolute;\r\n\t\tleft: 0;\r\n\t\ttop: 12rpx;\r\n\t\twidth: 1px;\r\n\t\tbottom: 0;\r\n\t\tborder-left: 1px solid #ddd;\r\n\t\ttransform-origin: 0 0;\r\n\t\ttransform: scaleX(0.5);\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-time-line-item/u-time-line-item.vue",
    "content": "<template>\r\n\t<view class=\"u-time-axis-item\">\r\n\t\t<slot name=\"content\" />\r\n\t\t<view class=\"u-time-axis-node\" :style=\"[nodeStyle]\">\r\n\t\t\t<slot name=\"node\">\r\n\t\t\t\t<view class=\"u-dot\">\r\n\t\t\t\t</view>\r\n\t\t\t</slot>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * timeLineItem 时间轴Item\r\n\t * @description 时间轴组件一般用于物流信息展示，各种跟时间相关的记录等场景。(搭配u-time-line使用)\r\n\t * @tutorial https://www.uviewui.com/components/timeLine.html\r\n\t * @property {String} bg-color 左边节点的背景颜色，一般通过slot内容自定义背景颜色即可（默认#ffffff）\r\n\t * @property {String Number} node-top 节点左边图标绝对定位的top值，单位rpx\r\n\t * @example <u-time-line-item node-top=\"2\">...</u-time-line-item>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-time-line-item\",\r\n\t\tprops: {\r\n\t\t\t// 节点的背景颜色\r\n\t\t\tbgColor: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t// 节点左边图标绝对定位的top值\r\n\t\t\tnodeTop: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: \"\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\r\n\t\t\t}\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tnodeStyle() {\r\n\t\t\t\tlet style = {\r\n\t\t\t\t\tbackgroundColor: this.bgColor,\r\n\t\t\t\t};\r\n\t\t\t\tif (this.nodeTop != \"\") style.top = this.nodeTop + 'rpx';\r\n\t\t\t\treturn style;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-time-axis-item {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\twidth: 100%;\r\n\t\tposition: relative;\r\n\t\tmargin-bottom: 32rpx;\r\n\t}\r\n\r\n\t.u-time-axis-node {\r\n\t\tposition: absolute;\r\n\t\ttop: 12rpx;\r\n\t\tleft: -40rpx;\r\n\t\ttransform-origin: 0;\r\n\t\ttransform: translateX(-50%);\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tz-index: 1;\r\n\t\tfont-size: 24rpx;\r\n\t}\r\n\r\n\t.u-dot {\r\n\t\theight: 16rpx;\r\n\t\twidth: 16rpx;\r\n\t\tborder-radius: 100rpx;\r\n\t\tbackground: #ddd;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-toast/u-toast.vue",
    "content": "<template>\r\n\t<view class=\"u-toast\" :class=\"[isShow ? 'u-show' : '', 'u-type-' + config.type, 'u-position-' + config.position]\" :style=\"{\r\n\t\tzIndex: uZIndex\r\n\t}\">\r\n\t\t<view class=\"u-icon-wrap\">\r\n\t\t\t<u-icon v-if=\"config.icon\" class=\"u-icon\" :name=\"iconName\" :size=\"30\" :color=\"config.type\"></u-icon>\r\n\t\t</view>\r\n\t\t<text class=\"u-text\">{{config.title}}</text>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * toast 消息提示\r\n\t * @description 此组件表现形式类似uni的uni.showToastAPI，但也有不同的地方。\r\n\t * @tutorial https://www.uviewui.com/components/toast.html\r\n\t * @property {String} z-index toast展示时的z-index值\r\n\t * @event {Function} show 显示toast，如需一进入页面就显示toast，请在onReady生命周期调用\r\n\t * @example <u-toast ref=\"uToast\" />\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-toast\",\r\n\t\tprops: {\r\n\t\t\t// z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t},\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tisShow: false,\r\n\t\t\t\ttimer: null, // 定时器\r\n\t\t\t\tconfig: {\r\n\t\t\t\t\tparams: {}, // URL跳转的参数，对象\r\n\t\t\t\t\ttitle: '', // 显示文本\r\n\t\t\t\t\ttype: '', // 主题类型，primary，success，error，warning，black\r\n\t\t\t\t\tduration: 2000, // 显示的时间，毫秒\r\n\t\t\t\t\tisTab: false, // 是否跳转tab页面\r\n\t\t\t\t\turl: '', // toast消失后是否跳转页面，有则跳转，优先级高于back参数\r\n\t\t\t\t\ticon: true, // 显示的图标\r\n\t\t\t\t\tposition: 'center', // toast出现的位置\r\n\t\t\t\t\tcallback: null, // 执行完后的回调函数\r\n\t\t\t\t\tback: false, // 结束toast是否自动返回上一页\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\ticonName() {\r\n\t\t\t\t// 只有不为none，并且type为error|warning|succes|info时候，才显示图标\r\n\t\t\t\tif (['error', 'warning', 'success', 'info'].indexOf(this.config.type) >= 0 && this.config.icon) {\r\n\t\t\t\t\tlet icon = this.$u.type2icon(this.config.type);\r\n\t\t\t\t\treturn icon;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tuZIndex() {\r\n\t\t\t\t// 显示toast时候，如果用户有传递z-index值，有限使用\r\n\t\t\t\treturn this.isShow ? (this.zIndex ? this.zIndex : this.$u.zIndex.toast) : '999999';\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\t// 显示toast组件，由父组件通过this.$refs.xxx.show(options)形式调用\r\n\t\t\tshow(options) {\r\n\t\t\t\tthis.config = this.$u.deepMerge(this.config, options);\r\n\t\t\t\tif (this.timer) {\r\n\t\t\t\t\t// 清除定时器\r\n\t\t\t\t\tclearTimeout(this.timer);\r\n\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t}\r\n\t\t\t\tthis.isShow = true;\r\n\t\t\t\tthis.timer = setTimeout(() => {\r\n\t\t\t\t\t// 倒计时结束，清除定时器，隐藏toast组件\r\n\t\t\t\t\tthis.isShow = false;\r\n\t\t\t\t\tclearTimeout(this.timer);\r\n\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t\t// 判断是否存在callback方法，如果存在就执行\r\n\t\t\t\t\ttypeof(this.config.callback) === 'function' && this.config.callback();\r\n\t\t\t\t\tthis.timeEnd();\r\n\t\t\t\t}, this.config.duration);\r\n\t\t\t},\r\n\t\t\t// 隐藏toast组件，由父组件通过this.$refs.xxx.hide()形式调用\r\n\t\t\thide() {\r\n\t\t\t\tthis.isShow = false;\r\n\t\t\t\tif (this.timer) {\r\n\t\t\t\t\t// 清除定时器\r\n\t\t\t\t\tclearTimeout(this.timer);\r\n\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 倒计时结束之后，进行的一些操作\r\n\t\t\ttimeEnd() {\r\n\t\t\t\t// 如果带有url值，根据isTab为true或者false进行跳转\r\n\t\t\t\tif (this.config.url) {\r\n\t\t\t\t\t// 如果url没有\"/\"开头，添加上，因为uni的路由跳转需要\"/\"开头\r\n\t\t\t\t\tif (this.config.url[0] != '/') this.config.url = '/' + this.config.url;\r\n\t\t\t\t\t// 判断是否有传递显式的参数\r\n\t\t\t\t\tif (Object.keys(this.config.params).length) {\r\n\t\t\t\t\t\t// 判断用户传递的url中，是否带有参数\r\n\t\t\t\t\t\t// 使用正则匹配，主要依据是判断是否有\"/\",\"?\",\"=\"等，如“/page/index/index?name=mary\"\r\n\t\t\t\t\t\t// 如果有params参数，转换后无需带上\"?\"\r\n\t\t\t\t\t\tlet query = '';\r\n\t\t\t\t\t\tif (/.*\\/.*\\?.*=.*/.test(this.config.url)) {\r\n\t\t\t\t\t\t\t// object对象转为get类型的参数\r\n\t\t\t\t\t\t\tquery = this.$u.queryParams(this.config.params, false);\r\n\t\t\t\t\t\t\tthis.config.url = this.config.url + \"&\" + query;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tquery = this.$u.queryParams(this.config.params);\r\n\t\t\t\t\t\t\tthis.config.url += query;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// 如果是跳转tab页面，就使用uni.switchTab\r\n\t\t\t\t\tif (this.config.isTab) {\r\n\t\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\t\turl: this.config.url\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\t\t\turl: this.config.url\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if(this.config.back) {\r\n\t\t\t\t\t// 回退到上一页\r\n\t\t\t\t\tthis.$u.route({\r\n\t\t\t\t\t\ttype: 'back'\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-toast {\r\n\t\tposition: fixed;\r\n\t\tz-index: -1;\r\n\t\ttransition: opacity 0.3s;\r\n\t\ttext-align: center;\r\n\t\tcolor: #fff;\r\n\t\tborder-radius: 8rpx;\r\n\t\tbackground: #585858;\r\n\t\theight: 80rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\tfont-size: 28rpx;\r\n\t\topacity: 0;\r\n\t\tpointer-events: none;\r\n\t\tpadding:0 40rpx;\r\n\t}\r\n\r\n\t.u-toast.u-show {\r\n\t\topacity: 1;\r\n\t}\r\n\r\n\t.u-text {\r\n\t\tword-break: keep-all;\r\n\t\twhite-space: nowrap;\r\n\t\tline-height: normal;\r\n\t}\r\n\r\n\t.u-icon {\r\n\t\tmargin-right: 10rpx;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tline-height: normal;\r\n\t}\r\n\r\n\t.u-position-center {\r\n\t\tleft: 50%;\r\n\t\ttop: 50%;\r\n\t\ttransform: translateX(-50%) translateY(-50%);\r\n\t}\r\n\r\n\t.u-position-top {\r\n\t\tleft: 50%;\r\n\t\ttop: 20%;\r\n\t\ttransform: translateX(-50%) translateY(-50%);\r\n\t}\r\n\r\n\t.u-position-bottom {\r\n\t\tleft: 50%;\r\n\t\tbottom: 20%;\r\n\t\ttransform: translateX(-50%) translateY(-50%);\r\n\t}\r\n\r\n\t.u-type-primary {\r\n\t\tcolor: $u-type-primary;\r\n\t\tbackground-color: $u-type-primary-light;\r\n\t\tborder: 1px solid rgb(215, 234, 254);\r\n\t}\r\n\r\n\t.u-type-success {\r\n\t\tcolor: $u-type-success;\r\n\t\tbackground-color: $u-type-success-light;\r\n\t\tborder: 1px solid #BEF5C8;\r\n\t}\r\n\r\n\t.u-type-error {\r\n\t\tcolor: $u-type-error;\r\n\t\tbackground-color: $u-type-error-light;\r\n\t\tborder: 1px solid #fde2e2;\r\n\t}\r\n\r\n\t.u-type-warning {\r\n\t\tcolor: $u-type-warning;\r\n\t\tbackground-color: $u-type-warning-light;\r\n\t\tborder: 1px solid #faecd8;\r\n\t}\r\n\r\n\t.u-type-info {\r\n\t\tcolor: $u-type-info;\r\n\t\tbackground-color: $u-type-info-light;\r\n\t\tborder: 1px solid #ebeef5;\r\n\t}\r\n\r\n\t.u-type-default {\r\n\t\tcolor: #fff;\r\n\t\tbackground-color: #585858;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-top-tips/u-top-tips.vue",
    "content": "<template>\r\n\t<view class=\"u-tips\" :class=\"['u-' + type, isShow ? 'u-tip-show' : '']\" :style=\"{\r\n\t\ttop: navbarHeight + 'px',\r\n\t\tzIndex: uZIndex\r\n\t}\">{{ title }}</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * topTips 顶部提示\r\n\t * @description 该组件一般用于页面顶部向下滑出一个提示，尔后自动收起的场景。\r\n\t * @tutorial https://www.uviewui.com/components/topTips.html\r\n\t * @property {String Number} navbar-height 导航栏高度(包含状态栏高度在内)，单位PX\r\n\t * @property {String Number} z-index z-index值（默认975）\r\n\t * @example <u-top-tips ref=\"uTips\"></u-top-tips>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-top-tips\",\r\n\t\tprops: {\r\n\t\t\t// 导航栏高度，用于提示的初始化\r\n\t\t\tnavbarHeight: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\t// #ifndef H5\r\n\t\t\t\tdefault: 0,\r\n\t\t\t\t// #endif\r\n\t\t\t\t// #ifdef H5\r\n\t\t\t\tdefault: 44,\r\n\t\t\t\t// #endif\r\n\t\t\t},\r\n\t\t\t// z-index值\r\n\t\t\tzIndex: {\r\n\t\t\t\ttype: [Number, String],\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\ttimer: null, // 定时器\r\n\t\t\t\tisShow: false, // 是否显示消息组件\r\n\t\t\t\ttitle: '', // 组件中显示的消息内容\r\n\t\t\t\ttype: 'primary', // 消息的类型（颜色不同），primary，success，error，warning，info\r\n\t\t\t\tduration: 2000, // 组件显示的时间，单位为毫秒\r\n\t\t\t};\r\n\t\t},\r\n\t\tcomputed: {\r\n\t\t\tuZIndex() {\r\n\t\t\t\treturn this.zIndex ? this.zIndex : this.$u.zIndex.topTips;\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tshow(config = {}) {\r\n\t\t\t\t// 先清除定时器（可能是上一次定义的，需要清除了再开始新的）\r\n\t\t\t\tclearTimeout(this.timer);\r\n\t\t\t\t// 时间，内容，类型主题(type)等参数\r\n\t\t\t\tif (config.duration) this.duration = config.duration;\r\n\t\t\t\tif (config.type) this.type = config.type;\r\n\t\t\t\tthis.title = config.title;\r\n\t\t\t\tthis.isShow = true;\r\n\t\t\t\t// 倒计时\r\n\t\t\t\tthis.timer = setTimeout(() => {\r\n\t\t\t\t\tthis.isShow = false;\r\n\t\t\t\t\tclearTimeout(this.timer);\r\n\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t}, this.duration);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\tview {\r\n\t\tbox-sizing: border-box;\r\n\t}\r\n\r\n\t// 顶部弹出类型样式\r\n\t.u-tips {\r\n\t\twidth: 100%;\r\n\t\tposition: fixed;\r\n\t\tz-index: 1;\r\n\t\tpadding: 20rpx 30rpx;\r\n\t\tcolor: #FFFFFF;\r\n\t\tfont-size: 28rpx;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\topacity: 0;\r\n\t\t// 此处为最核心点，translateY(-100%)意味着将其从Y轴隐藏（隐藏到顶部(h5)或者说导航栏(app)下面）\r\n\t\ttransform: translateY(-100%);\r\n\t\ttransition: all 0.35s linear;\r\n\t}\r\n\r\n\t.u-tip-show {\r\n\t\ttransform: translateY(0);\r\n\t\topacity: 1;\r\n\t\tz-index: 99;\r\n\t}\r\n\r\n\t.u-primary {\r\n\t\tbackground: $u-type-primary;\r\n\t}\r\n\r\n\t.u-success {\r\n\t\tbackground: $u-type-success;\r\n\t}\r\n\r\n\t.u-warning {\r\n\t\tbackground: $u-type-warning;\r\n\t}\r\n\r\n\t.u-error {\r\n\t\tbackground: $u-type-error;\r\n\t}\r\n\r\n\t.u-info {\r\n\t\tbackground: $u-type-info;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-tr/u-tr.vue",
    "content": "<template>\r\n\t<view class=\"u-tr\">\r\n\t\t<slot></slot>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * tr 表格行标签\r\n\t * @description 表格组件一般用于展示大量结构化数据的场景（搭配<u-table>使用）\r\n\t * @tutorial https://www.uviewui.com/components/table.html\r\n\t * @example <u-tr></u-tr>\r\n\t */\r\n\texport default {\r\n\t\tname: \"u-tr\",\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-tr {\r\n\t\tdisplay: flex;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-upload/u-upload.vue",
    "content": "<template>\r\n\t<view class=\"u-upload\" v-if=\"!disabled\">\r\n\t\t<view\r\n\t\t\tv-if=\"showUploadList\"\r\n\t\t\tclass=\"u-list-item u-preview-wrap\"\r\n\t\t\tv-for=\"(item, index) in lists\"\r\n\t\t\t:key=\"index\"\r\n\t\t\t:style=\"{\r\n\t\t\t\twidth: width + 'rpx',\r\n\t\t\t\theight: width + 'rpx'\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<view\r\n\t\t\t\tv-if=\"deletable\"\r\n\t\t\t\tclass=\"u-delete-icon\"\r\n\t\t\t\t@tap.stop=\"deleteItem(index)\"\r\n\t\t\t\t:style=\"{\r\n\t\t\t\t\tbackground: delBgColor\r\n\t\t\t\t}\"\r\n\t\t\t>\r\n\t\t\t\t<u-icon class=\"u-icon\" :name=\"delIcon\" size=\"20\" :color=\"delColor\"></u-icon>\r\n\t\t\t</view>\r\n\t\t\t<u-line-progress\r\n\t\t\t\tv-if=\"showProgress && item.progress > 0 && !item.error\"\r\n\t\t\t\t:show-percent=\"false\"\r\n\t\t\t\theight=\"16\"\r\n\t\t\t\tclass=\"u-progress\"\r\n\t\t\t\t:percent=\"item.progress\"\r\n\t\t\t></u-line-progress>\r\n\t\t\t<view @tap.stop=\"retry(index)\" v-if=\"item.error\" class=\"u-error-btn\">点击重试</view>\r\n\t\t\t<image @tap.stop=\"doPreviewImage(item.url || item.path, index)\" class=\"u-preview-image\" v-if=\"!item.isImage\" :src=\"item.url || item.path\" :mode=\"imageMode\"></image>\r\n\t\t</view>\r\n\t\t<slot name=\"file\" :file=\"lists\"></slot>\r\n\t\t<view style=\"display: inline-block;\" @tap=\"selectFile\" v-if=\"maxCount > lists.length\">\r\n\t\t\t<slot name=\"addBtn\"></slot>\r\n\t\t\t<view\r\n\t\t\t\tv-if=\"!customBtn\"\r\n\t\t\t\tclass=\"u-list-item u-add-wrap\"\r\n\t\t\t\thover-class=\"u-add-wrap__hover\"\r\n\t\t\t\thover-stay-time=\"150\"\r\n\t\t\t\t:style=\"{\r\n\t\t\t\t\twidth: width + 'rpx',\r\n\t\t\t\t\theight: width + 'rpx'\r\n\t\t\t\t}\"\r\n\t\t\t>\r\n\t\t\t\t<u-icon name=\"plus\" class=\"u-add-btn\" size=\"40\"></u-icon>\r\n\t\t\t\t<view class=\"u-add-tips\">{{ uploadText }}</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * upload 图片上传\r\n * @description 该组件用于上传图片场景\r\n * @tutorial https://www.uviewui.com/components/upload.html\r\n * @property {String} action 服务器上传地址\r\n * @property {String Number} max-count 最大选择图片的数量（默认99）\r\n * @property {Boolean} custom-btn 如果需要自定义选择图片的按钮，设置为true（默认false）\r\n * @property {Boolean} show-progress 是否显示进度条（默认true）\r\n * @property {Boolean} disabled 是否启用(显示/移仓)组件（默认false）\r\n * @property {String} image-mode 预览图片等显示模式，可选值为uni的image的mode属性值（默认aspectFill）\r\n * @property {String} del-icon 右上角删除图标名称，只能为uView内置图标\r\n * @property {String} del-bg-color 右上角关闭按钮的背景颜色\r\n * @property {String} del-color 右上角关闭按钮图标的颜色\r\n * @property {Object} header 上传携带的头信息，对象形式\r\n * @property {Object} form-data 上传额外携带的参数\r\n * @property {String} name 上传文件的字段名，供后端获取使用（默认file）\r\n * @property {Array<String>} size-type original 原图，compressed 压缩图，默认二者都有（默认['original', 'compressed']）\r\n * @property {Array<String>} source-type 选择图片的来源，album-从相册选图，camera-使用相机，默认二者都有（默认['album', 'camera']）\r\n * @property {Boolean} preview-full-image\t是否可以通过uni.previewImage预览已选择的图片（默认true）\r\n * @property {Boolean} multiple\t是否开启图片多选，部分安卓机型不支持（默认true）\r\n * @property {Boolean} deletable 是否显示删除图片的按钮（默认true）\r\n * @property {String Number} max-size 选择单个文件的最大大小，单位B(byte)，默认不限制（默认Number.MAX_VALUE）\r\n * @property {Array<Object>} file-list 默认显示的图片列表，数组元素为对象，必须提供url属性\r\n * @property {Boolean} upload-text 选择图片按钮的提示文字（默认“选择图片”）\r\n * @property {Boolean} auto-upload 选择完图片是否自动上传，见上方说明（默认true）\r\n * @property {Boolean} show-tips 特殊情况下是否自动提示toast，见上方说明（默认true）\r\n * @property {Boolean} show-upload-list 是否显示组件内部的图片预览（默认true）\r\n * @event {Function} on-oversize 图片大小超出最大允许大小\r\n * @event {Function} on-preview 全屏预览图片时触发\r\n * @event {Function} on-remove 移除图片时触发\r\n * @event {Function} on-success 图片上传成功时触发\r\n * @event {Function} on-change 图片上传后，无论成功或者失败都会触发\r\n * @event {Function} on-error 图片上传失败时触发\r\n * @event {Function} on-progress 图片上传过程中的进度变化过程触发\r\n * @event {Function} on-uploaded 所有图片上传完毕触发\r\n * @event {Function} on-choose-complete 每次选择图片后触发，只是让外部可以得知每次选择后，内部的文件列表\r\n * @example <u-upload :action=\"action\" :file-list=\"fileList\" ></u-upload>\r\n */\r\nexport default {\r\n\tname: 'u-upload',\r\n\tprops: {\r\n\t\t//是否显示组件自带的图片预览功能\r\n\t\tshowUploadList: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 后端地址\r\n\t\taction: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: ''\r\n\t\t},\r\n\t\t// 最大上传数量\r\n\t\tmaxCount: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 52\r\n\t\t},\r\n\t\t//  是否显示进度条\r\n\t\tshowProgress: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否启用\r\n\t\tdisabled: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 预览上传的图片时的裁剪模式，和image组件mode属性一致\r\n\t\timageMode: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'aspectFill'\r\n\t\t},\r\n\t\t// 头部信息\r\n\t\theader: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 额外携带的参数\r\n\t\tformData: {\r\n\t\t\ttype: Object,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 上传的文件字段名\r\n\t\tname: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'file'\r\n\t\t},\r\n\t\t// 所选的图片的尺寸, 可选值为original compressed\r\n\t\tsizeType: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn ['original', 'compressed'];\r\n\t\t\t}\r\n\t\t},\r\n\t\tsourceType: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn ['album', 'camera'];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 是否在点击预览图后展示全屏图片预览\r\n\t\tpreviewFullImage: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否开启图片多选，部分安卓机型不支持\r\n\t\tmultiple: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否展示删除按钮\r\n\t\tdeletable: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 文件大小限制，单位为byte\r\n\t\tmaxSize: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: Number.MAX_VALUE\r\n\t\t},\r\n\t\t// 显示已上传的文件列表\r\n\t\tfileList: {\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 上传区域的提示文字\r\n\t\tuploadText: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '选择图片'\r\n\t\t},\r\n\t\t// 是否自动上传\r\n\t\tautoUpload: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否显示toast消息提示\r\n\t\tshowTips: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 是否通过slot自定义传入选择图标的按钮\r\n\t\tcustomBtn: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: false\r\n\t\t},\r\n\t\t// 内部预览图片区域和选择图片按钮的区域宽度，高等于宽\r\n\t\twidth: {\r\n\t\t\ttype: [String, Number],\r\n\t\t\tdefault: 200\r\n\t\t},\r\n\t\t// 右上角关闭按钮的背景颜色\r\n\t\tdelBgColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#fa3534'\r\n\t\t},\r\n\t\t// 右上角关闭按钮的叉号图标的颜色\r\n\t\tdelColor: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: '#ffffff'\r\n\t\t},\r\n\t\t// 右上角删除图标名称，只能为uView内置图标\r\n\t\tdelIcon: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'close'\r\n\t\t},\r\n\t\t// 如果上传后的返回值为json字符串，是否自动转json\r\n\t\ttoJson: {\r\n\t\t\ttype: Boolean,\r\n\t\t\tdefault: true\r\n\t\t},\r\n\t\t// 上传前的钩子，每个文件上传前都会执行\r\n\t\tbeforeUpload: {\r\n\t\t\ttype: Function,\r\n\t\t\tdefault: null\r\n\t\t},\r\n\t\t// 允许上传的图片后缀\r\n\t\tlimitType:{\r\n\t\t\ttype: Array,\r\n\t\t\tdefault() {\r\n\t\t\t\treturn ['png', 'jpg', 'jpeg', 'webp', 'gif'];\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tmounted() {},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tlists: [],\r\n\t\t\tisInCount: true,\r\n\t\t\tuploading: false\r\n\t\t};\r\n\t},\r\n\twatch: {\r\n\t\tfileList: {\r\n\t\t\timmediate: true,\r\n\t\t\thandler(val) {\r\n\t\t\t\tval.map(value => {\r\n\t\t\t\t\t// 首先检查内部是否已经添加过这张图片，因为外部绑定了一个对象给fileList的话(对象引用)，进行修改外部fileList\r\n\t\t\t\t\t// 时，会触发watch，导致重新把原来的图片再次添加到this.lists\r\n\t\t\t\t\t// 数组的some方法意思是，只要数组元素有任意一个元素条件符合，就返回true，而另一个数组的every方法的意思是数组所有元素都符合条件才返回true\r\n\t\t\t\t\tlet tmp = this.lists.some(val => {\r\n\t\t\t\t\t\treturn val.url == value.url;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t// 如果内部没有这个图片(tmp为false)，则添加到内部\r\n\t\t\t\t\t!tmp && this.lists.push({ url: value.url, error: false, progress: 100 });\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 监听lists的变化，发出事件\r\n\t\tlists(n) {\r\n\t\t\tthis.$emit('on-list-change', n);\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\t// 清除列表\r\n\t\tclear() {\r\n\t\t\tthis.lists = [];\r\n\t\t},\r\n\t\t// 重新上传队列中上传失败的所有文件\r\n\t\treUpload() {\r\n\t\t\tthis.uploadFile();\r\n\t\t},\r\n\t\t// 选择图片\r\n\t\tselectFile() {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\tconst { name = '', maxCount, multiple, maxSize, sizeType, lists, camera, compressed, maxDuration, sourceType } = this;\r\n\t\t\tlet chooseFile = null;\r\n\t\t\tconst newMaxCount = maxCount - lists.length;\r\n\t\t\t// 设置为只选择图片的时候使用 chooseImage 来实现\r\n\t\t\tchooseFile = new Promise((resolve, reject) => {\r\n\t\t\t\tuni.chooseImage({\r\n\t\t\t\t\tcount: multiple ? (newMaxCount > 9 ? 9 : newMaxCount) : 1,\r\n\t\t\t\t\tsourceType: sourceType,\r\n\t\t\t\t\tsizeType,\r\n\t\t\t\t\tsuccess: resolve,\r\n\t\t\t\t\tfail: reject\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\tchooseFile\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tlet file = null;\r\n\t\t\t\t\tlet listOldLength = this.lists.length;\r\n\t\t\t\t\tres.tempFiles.map((val, index) => {\r\n\t\t\t\t\t\t// 检查文件后缀是否允许，如果不在this.limitType内，就会返回false\r\n\t\t\t\t\t\tif(!this.checkFileExt(val)) return ;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// 如果是非多选，index大于等于1或者超出最大限制数量时，不处理\r\n\t\t\t\t\t\tif (!multiple && index >= 1) return;\r\n\t\t\t\t\t\tif (val.size > maxSize) {\r\n\t\t\t\t\t\t\tthis.$emit('on-oversize', val, this.lists);\r\n\t\t\t\t\t\t\tthis.showToast('超出允许的文件大小');\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif (maxCount <= lists.length) {\r\n\t\t\t\t\t\t\t\tthis.$emit('on-exceed', val, this.lists);\r\n\t\t\t\t\t\t\t\tthis.showToast('超出最大允许的文件个数');\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlists.push({\r\n\t\t\t\t\t\t\t\turl: val.path,\r\n\t\t\t\t\t\t\t\tprogress: 0,\r\n\t\t\t\t\t\t\t\terror: false\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// 每次图片选择完，抛出一个事件，并将当前内部选择的图片数组抛出去\r\n\t\t\t\t\tthis.$emit('on-choose-complete', this.lists);\r\n\t\t\t\t\tif (this.autoUpload) this.uploadFile(listOldLength);\r\n\t\t\t\t})\r\n\t\t\t\t.catch(error => {\r\n\t\t\t\t\t// this.$emit('on-error', error);\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t// 提示用户消息\r\n\t\tshowToast(message, force = false) {\r\n\t\t\tif (this.showTips || force) {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: message,\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 该方法供用户通过ref调用，手动上传\r\n\t\tupload() {\r\n\t\t\tthis.uploadFile();\r\n\t\t},\r\n\t\t// 对失败的图片重新上传\r\n\t\tretry(index) {\r\n\t\t\tthis.lists[index].progress = 0;\r\n\t\t\tthis.lists[index].error = false;\r\n\t\t\tthis.lists[index].response = null;\r\n\t\t\tuni.showLoading({\r\n\t\t\t\ttitle: '重新上传'\r\n\t\t\t});\r\n\t\t\tthis.uploadFile(index);\r\n\t\t},\r\n\t\t// 上传图片\r\n\t\tasync uploadFile(index = 0) {\r\n\t\t\tif (this.disabled) return;\r\n\t\t\tif (this.uploading) return;\r\n\t\t\t// 全部上传完成\r\n\t\t\tif (index >= this.lists.length) {\r\n\t\t\t\tthis.$emit('on-uploaded', this.lists);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// 检查是否是已上传或者正在上传中\r\n\t\t\tif (this.lists[index].progress == 100) {\r\n\t\t\t\tif (this.autoUpload == false) this.uploadFile(index + 1);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// 执行before-upload钩子\r\n\t\t\tif(this.beforeUpload && typeof(this.beforeUpload) === 'function') {\r\n\t\t\t\t// 执行回调，同时传入索引和文件列表当作参数\r\n\t\t\t\t// 在微信，支付宝等环境(H5正常)，会导致父组件定义的customBack()函数体中的this变成子组件的this\r\n\t\t\t\t// 通过bind()方法，绑定父组件的this，让this.customBack()的this为父组件的上下文\r\n\t\t\t\t// 因为upload组件可能会被嵌套在其他组件内，比如u-form，这时this.$parent其实为u-form的this，\r\n\t\t\t\t// 非页面的this，所以这里需要往上历遍，一直寻找到最顶端的$parent，这里用了this.$u.$parent.call(this)\r\n\t\t\t\t// 明白意思即可，无需纠结this.$u.$parent.call(this)的细节\r\n\t\t\t\tlet beforeResponse = this.beforeUpload.bind(this.$u.$parent.call(this))(index, this.lists);\r\n\t\t\t\t// 判断是否返回了promise\r\n\t\t\t\tif (!!beforeResponse && typeof beforeResponse.then === 'function') {\r\n\t\t\t\t\tawait beforeResponse.then(res => {\r\n\t\t\t\t\t\t// promise返回成功，不进行动作，继续上传\r\n\t\t\t\t\t}).catch(err => {\r\n\t\t\t\t\t\t// 进入catch回调的话，继续下一张\r\n\t\t\t\t\t\treturn this.uploadFile(index + 1);\r\n\t\t\t\t\t})\r\n\t\t\t\t} else if(beforeResponse === false) {\r\n\t\t\t\t\t // 如果返回false，继续下一张图片的上传\r\n\t\t\t\t\treturn this.uploadFile(index + 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// 检查上传地址\r\n\t\t\tif (!this.action) {\r\n\t\t\t\tthis.showToast('请配置上传地址', true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis.lists[index].error = false;\r\n\t\t\tthis.uploading = true;\r\n\t\t\t// 创建上传对象\r\n\t\t\tconst task = uni.uploadFile({\r\n\t\t\t\turl: this.action,\r\n\t\t\t\tfilePath: this.lists[index].url,\r\n\t\t\t\tname: this.name,\r\n\t\t\t\tformData: this.formData,\r\n\t\t\t\theader: this.header,\r\n\t\t\t\tsuccess: res => {\r\n\t\t\t\t\t// 判断是否json字符串，将其转为json格式\r\n\t\t\t\t\tlet data = this.toJson && this.$u.test.jsonString(res.data) ? JSON.parse(res.data) : res.data;\r\n\t\t\t\t\tif (![200, 201, 204].includes(res.statusCode)) {\r\n\t\t\t\t\t\tthis.uploadError(index, data);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 上传成功\r\n\t\t\t\t\t\tthis.lists[index].response = data;\r\n\t\t\t\t\t\tthis.lists[index].progress = 100;\r\n\t\t\t\t\t\tthis.lists[index].error = false;\r\n\t\t\t\t\t\tthis.$emit('on-success', data, index, this.lists);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tfail: e => {\r\n\t\t\t\t\tthis.uploadError(index, e);\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: res => {\r\n\t\t\t\t\t if (this.$store.state.isShowToast){ uni.hideLoading() };\r\n\t\t\t\t\tthis.uploading = false;\r\n\t\t\t\t\tthis.uploadFile(index + 1);\r\n\t\t\t\t\tthis.$emit('on-change', res, index, this.lists);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\ttask.onProgressUpdate(res => {\r\n\t\t\t\tif (res.progress > 0) {\r\n\t\t\t\t\tthis.lists[index].progress = res.progress;\r\n\t\t\t\t\tthis.$emit('on-progress', res, index, this.lists);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 上传失败\r\n\t\tuploadError(index, err) {\r\n\t\t\tthis.lists[index].progress = 0;\r\n\t\t\tthis.lists[index].error = true;\r\n\t\t\tthis.lists[index].response = null;\r\n\t\t\tthis.$emit('on-error', err, index, this.lists);\r\n\t\t\tthis.showToast('上传失败，请重试');\r\n\t\t},\r\n\t\t// 删除一个图片\r\n\t\tdeleteItem(index) {\r\n\t\t\tuni.showModal({\r\n\t\t\t\ttitle: '提示',\r\n\t\t\t\tcontent: '您确定要删除此项吗？',\r\n\t\t\t\tsuccess: res => {\r\n\t\t\t\t\tif (res.confirm) {\r\n\t\t\t\t\t\tif (this.lists[index].process < 100 && this.lists[index].process > 0) {\r\n\t\t\t\t\t\t\ttypeof this.lists[index].uploadTask != 'undefined' && this.lists[index].uploadTask.abort();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.lists.splice(index, 1);\r\n\t\t\t\t\t\tthis.$forceUpdate();\r\n\t\t\t\t\t\tthis.$emit('on-remove', index, this.lists);\r\n\t\t\t\t\t\tthis.showToast('移除成功');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 用户通过ref手动的形式，移除一张图片\r\n\t\tremove(index) {\r\n\t\t\t// 判断索引的合法范围\r\n\t\t\tif (index >= 0 && index < this.lists.length) {\r\n\t\t\t\tthis.lists.splice(index, 1);\r\n\t\t\t\tthis.$emit('on-list-change', this.lists);\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 预览图片\r\n\t\tdoPreviewImage(url, index) {\r\n\t\t\tif (!this.previewFullImage) return;\r\n\t\t\tconst images = this.lists.map(item => item.url || item.path);\r\n\t\t\tuni.previewImage({\r\n\t\t\t\turls: images,\r\n\t\t\t\tcurrent: url,\r\n\t\t\t\tsuccess: () => {\r\n\t\t\t\t\tthis.$emit('on-preview', url, this.lists);\r\n\t\t\t\t},\r\n\t\t\t\tfail: () => {\r\n\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\ttitle: '预览图片失败',\r\n\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\t\t// 判断文件后缀是否允许\r\n\t\tcheckFileExt(file) {\r\n\t\t\t// 检查是否在允许的后缀中\r\n\t\t\tlet noArrowExt = false;\r\n\t\t\t// 获取后缀名\r\n\t\t\tlet fileExt = '';\r\n\t\t\tconst reg = /.+\\./;\r\n\t\t\t// 如果是H5，需要从name中判断\r\n\t\t\t// #ifdef H5\r\n\t\t\tfileExt = file.name.replace(reg, \"\").toLowerCase();\r\n\t\t\t// #endif\r\n\t\t\t// 非H5，需要从path中读取后缀\r\n\t\t\t// #ifndef H5\r\n\t\t\tfileExt = file.path.replace(reg, \"\").toLowerCase();\r\n\t\t\t// #endif\r\n\t\t\t// 使用数组的some方法，只要符合limitType中的一个，就返回true\r\n\t\t\tnoArrowExt = this.limitType.some(ext => {\r\n\t\t\t\t// 转为小写\r\n\t\t\t\treturn ext.toLowerCase() === fileExt;\r\n\t\t\t})\r\n\t\t\tif(!noArrowExt) this.showToast(`不允许选择${fileExt}格式的文件`);\r\n\t\t\treturn noArrowExt;\r\n\t\t}\r\n\t}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import '../../libs/css/style.components.scss';\r\n\r\n.u-upload {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\talign-items: center;\r\n}\r\n\r\n.u-list-item {\r\n\twidth: 200rpx;\r\n\theight: 200rpx;\r\n\toverflow: hidden;\r\n\tmargin: 10rpx;\r\n\tbackground: rgb(244, 245, 246);\r\n\tposition: relative;\r\n\tborder-radius: 10rpx;\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.u-preview-wrap {\r\n\tborder: 1px solid rgb(235, 236, 238);\r\n}\r\n\r\n.u-add-wrap {\r\n\tflex-direction: column;\r\n\tcolor: $u-content-color;\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.u-add-tips {\r\n\tmargin-top: 20rpx;\r\n\tline-height: 40rpx;\r\n}\r\n\r\n.u-add-wrap__hover {\r\n\tbackground-color: rgb(235, 236, 238);\r\n}\r\n\r\n.u-preview-image {\r\n\tdisplay: block;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tborder-radius: 10rpx;\r\n}\r\n\r\n.u-delete-icon {\r\n\tposition: absolute;\r\n\ttop: 10rpx;\r\n\tright: 10rpx;\r\n\tz-index: 10;\r\n\tbackground-color: $u-type-error;\r\n\tborder-radius: 100rpx;\r\n\twidth: 44rpx;\r\n\theight: 44rpx;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.u-icon {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.u-progress {\r\n\tposition: absolute;\r\n\tbottom: 10rpx;\r\n\tleft: 8rpx;\r\n\tright: 8rpx;\r\n\tz-index: 9;\r\n\twidth: auto;\r\n}\r\n\r\n.u-error-btn {\r\n\tcolor: #ffffff;\r\n\tbackground-color: $u-type-error;\r\n\tfont-size: 20rpx;\r\n\tpadding: 4px 0;\r\n\ttext-align: center;\r\n\tposition: absolute;\r\n\tbottom: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tz-index: 9;\r\n\tline-height: 1;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-verification-code/u-verification-code.vue",
    "content": "<template>\r\n\t<view class=\"u-code-wrap\">\r\n\t\t<!-- 此组件功能由js完成，无需写html逻辑 -->\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n\t/**\r\n\t * verificationCode 验证码输入框\r\n\t * @description 考虑到用户实际发送验证码的场景，可能是一个按钮，也可能是一段文字，提示语各有不同，所以本组件 不提供界面显示，只提供提示语，由用户将提示语嵌入到具体的场景\r\n\t * @tutorial https://www.uviewui.com/components/verificationCode.html\r\n\t * @property {Number String} seconds 倒计时所需的秒数（默认60）\r\n\t * @property {String} start-text 开始前的提示语，见官网说明（默认获取验证码）\r\n\t * @property {String} change-text 倒计时期间的提示语，必须带有字母\"x\"，见官网说明（默认X秒重新获取）\r\n\t * @property {String} end-text 倒计结束的提示语，见官网说明（默认重新获取）\r\n\t * @property {Boolean} keep-running 是否在H5刷新或各端返回再进入时继续倒计时（默认false）\r\n\t * @event {Function} change 倒计时期间，每秒触发一次\r\n\t * @event {Function} start 开始倒计时触发\r\n\t * @event {Function} end 结束倒计时触发\r\n\t * @example <u-verification-code :seconds=\"seconds\" @end=\"end\" @start=\"start\" ref=\"uCode\" \r\n\t */\r\n\texport default {\r\n\t\tname: \"u-verification-code\",\r\n\t\tprops: {\r\n\t\t\t// 倒计时总秒数\r\n\t\t\tseconds: {\r\n\t\t\t\ttype: [String, Number],\r\n\t\t\t\tdefault: 60\r\n\t\t\t},\r\n\t\t\t// 尚未开始时提示\r\n\t\t\tstartText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '获取验证码'\r\n\t\t\t},\r\n\t\t\t// 正在倒计时中的提示\r\n\t\t\tchangeText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: 'X秒重新获取'\r\n\t\t\t},\r\n\t\t\t// 倒计时结束时的提示\r\n\t\t\tendText: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: '重新获取'\r\n\t\t\t},\r\n\t\t\t// 是否在H5刷新或各端返回再进入时继续倒计时\r\n\t\t\tkeepRunning: {\r\n\t\t\t\ttype: Boolean,\r\n\t\t\t\tdefault: false\r\n\t\t\t},\r\n\t\t\t// 为了区分多个页面，或者一个页面多个倒计时组件本地存储的继续倒计时变了\r\n\t\t\tuniqueKey: {\r\n\t\t\t\ttype: String,\r\n\t\t\t\tdefault: ''\r\n\t\t\t}\r\n\t\t},\r\n\t\tdata() {\r\n\t\t\treturn {\r\n\t\t\t\tsecNum: this.seconds,\r\n\t\t\t\ttimer: null,\r\n\t\t\t\tcanGetCode: true, // 是否可以执行验证码操作\r\n\t\t\t}\r\n\t\t},\r\n\t\tmounted() {\r\n\t\t\tthis.checkKeepRunning();\r\n\t\t},\r\n\t\twatch: {\r\n\t\t\tseconds: {\r\n\t\t\t\timmediate: true,\r\n\t\t\t\thandler(n) {\r\n\t\t\t\t\tthis.secNum = n;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tmethods: {\r\n\t\t\tcheckKeepRunning() {\r\n\t\t\t\t// 获取上一次退出页面(H5还包括刷新)时的时间戳，如果没有上次的保存，此值可能为空\r\n\t\t\t\tlet lastTimestamp = Number(uni.getStorageSync(this.uniqueKey + '_$uCountDownTimestamp'));\r\n\t\t\t\tif(!lastTimestamp) return this.changeEvent(this.startText);\r\n\t\t\t\t// 当前秒的时间戳\r\n\t\t\t\tlet nowTimestamp = Math.floor((+ new Date()) / 1000);\r\n\t\t\t\t// 判断当前的时间戳，是否小于上一次的本该按设定结束，却提前结束的时间戳\r\n\t\t\t\tif(this.keepRunning && lastTimestamp && lastTimestamp > nowTimestamp) {\r\n\t\t\t\t\t// 剩余尚未执行完的倒计秒数\r\n\t\t\t\t\tthis.secNum = lastTimestamp - nowTimestamp;\r\n\t\t\t\t\t// 清除本地保存的变量\r\n\t\t\t\t\tuni.removeStorageSync(this.uniqueKey + '_$uCountDownTimestamp');\r\n\t\t\t\t\t// 开始倒计时\r\n\t\t\t\t\tthis.start();\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 如果不存在需要继续上一次的倒计时，执行正常的逻辑\r\n\t\t\t\t\tthis.changeEvent(this.startText);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// 开始倒计时\r\n\t\t\tstart() {\r\n\t\t\t\t// 防止快速点击获取验证码的按钮而导致内部产生多个定时器导致混乱\r\n\t\t\t\tif(this.timer) {\r\n\t\t\t\t\tclearInterval(this.timer);\r\n\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t}\r\n\t\t\t\tthis.$emit('start');\r\n\t\t\t\tthis.canGetCode = false;\r\n\t\t\t\t// 这里放这句，是为了一开始时就提示，否则要等setInterval的1秒后才会有提示\r\n\t\t\t\tthis.changeEvent(this.changeText.replace(/x|X/, this.secNum));\r\n\t\t\t\tthis.setTimeToStorage();\r\n\t\t\t\tthis.timer = setInterval(() => {\r\n\t\t\t\t\tif (--this.secNum) {\r\n\t\t\t\t\t\t// 用当前倒计时的秒数替换提示字符串中的\"x\"字母\r\n\t\t\t\t\t\tthis.changeEvent(this.changeText.replace(/x|X/, this.secNum));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclearInterval(this.timer);\r\n\t\t\t\t\t\tthis.timer = null;\r\n\t\t\t\t\t\tthis.changeEvent(this.endText);\r\n\t\t\t\t\t\tthis.secNum = this.seconds;\r\n\t\t\t\t\t\tthis.$emit('end');\r\n\t\t\t\t\t\tthis.canGetCode = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 1000);\r\n\t\t\t},\r\n\t\t\t// 重置，可以让用户再次获取验证码\r\n\t\t\treset() {\r\n\t\t\t\tthis.canGetCode = true;\r\n\t\t\t\tclearInterval(this.timer);\r\n\t\t\t\tthis.secNum = this.seconds;\r\n\t\t\t\tthis.changeEvent(this.endText);\r\n\t\t\t},\r\n\t\t\tchangeEvent(text) {\r\n\t\t\t\tthis.$emit('change', text);\r\n\t\t\t},\r\n\t\t\t// 保存时间戳，为了防止倒计时尚未结束，H5刷新或者各端的右上角返回上一页再进来\r\n\t\t\tsetTimeToStorage() {\r\n\t\t\t\tif(!this.keepRunning || !this.timer) return;\r\n\t\t\t\t// 记录当前的时间戳，为了下次进入页面，如果还在倒计时内的话，继续倒计时\r\n\t\t\t\t// 倒计时尚未结束，结果大于0；倒计时已经开始，就会小于初始值，如果等于初始值，说明没有开始倒计时，无需处理\r\n\t\t\t\tif(this.secNum > 0 && this.secNum <= this.seconds) {\r\n\t\t\t\t\t// 获取当前时间戳(+ new Date()为特殊写法)，除以1000变成秒，再去除小数部分\r\n\t\t\t\t\tlet nowTimestamp = Math.floor((+ new Date()) / 1000);\r\n\t\t\t\t\t// 将本该结束时候的时间戳保存起来 => 当前时间戳 + 剩余的秒数\r\n\t\t\t\t\tuni.setStorage({\r\n\t\t\t\t\t\tkey: this.uniqueKey + '_$uCountDownTimestamp',\r\n\t\t\t\t\t\tdata: nowTimestamp + Number(this.secNum)\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 组件销毁的时候，清除定时器，否则定时器会继续存在，系统不会自动清除\r\n\t\tbeforeDestroy() {\r\n\t\t\tthis.setTimeToStorage();\r\n\t\t\tclearTimeout(this.timer);\r\n\t\t\tthis.timer = null;\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\t@import \"../../libs/css/style.components.scss\";\r\n\t\r\n\t.u-code-wrap {\r\n\t\twidth: 0;\r\n\t\theight: 0;\r\n\t\tposition: fixed;\r\n\t\tz-index: -1;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/components/u-waterfall/u-waterfall.vue",
    "content": "<template>\r\n\t<view class=\"u-waterfall\">\r\n\t\t<view id=\"u-left-column\" class=\"u-column\"><slot name=\"left\" :leftList=\"leftList\"></slot></view>\r\n\t\t<view id=\"u-right-column\" class=\"u-column\"><slot name=\"right\" :rightList=\"rightList\"></slot></view>\r\n\t</view>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * waterfall 瀑布流\r\n * @description 这是一个瀑布流形式的组件，内容分为左右两列，结合uView的懒加载组件效果更佳。相较于某些只是奇偶数左右分别，或者没有利用vue作用域插槽的做法，uView的瀑布流实现了真正的 组件化，搭配LazyLoad 懒加载和loadMore 加载更多组件，让您开箱即用，眼前一亮。\r\n * @tutorial https://www.uviewui.com/components/waterfall.html\r\n * @property {Array} flow-list 用于渲染的数据\r\n * @property {String Number} add-time 单条数据添加到队列的时间间隔，单位ms，见上方注意事项说明（默认200）\r\n * @example <u-waterfall :flowList=\"flowList\"></u-waterfall>\r\n */\r\nexport default {\r\n\tname: \"u-waterfall\",\r\n\tprops: {\r\n\t\tvalue: {\r\n\t\t\t// 瀑布流数据\r\n\t\t\ttype: Array,\r\n\t\t\trequired: true,\r\n\t\t\tdefault: function() {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 每次向结构插入数据的时间间隔，间隔越长，越能保证两列高度相近，但是对用户体验越不好\r\n\t\t// 单位ms\r\n\t\taddTime: {\r\n\t\t\ttype: [Number, String],\r\n\t\t\tdefault: 200\r\n\t\t},\r\n\t\t// id值，用于清除某一条数据时，根据此idKey名称找到并移除，如数据为{idx: 22, name: 'lisa'}\r\n\t\t// 那么该把idKey设置为idx\r\n\t\tidKey: {\r\n\t\t\ttype: String,\r\n\t\t\tdefault: 'id'\r\n\t\t}\r\n\t},\r\n\tprovide() {\r\n\t\treturn {\r\n\t\t\tuWaterfall: this\r\n\t\t}\r\n\t},\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tleftList: [],\r\n\t\t\trightList: [],\r\n\t\t\ttempList: [],\r\n\t\t\tchildren: []\r\n\t\t}\r\n\t},\r\n\twatch: {\r\n\t\tcopyFlowList(nVal, oVal) {\r\n\t\t\t// 取差值，即这一次数组变化新增的部分\r\n\t\t\tlet startIndex = Array.isArray(oVal) && oVal.length > 0 ? oVal.length : 0;\r\n\t\t\t// 拼接上原有数据\r\n\t\t\tthis.tempList = this.tempList.concat(this.cloneData(nVal.slice(startIndex)));\r\n\t\t\tthis.splitData();\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.tempList = this.cloneData(this.copyFlowList);\r\n\t\tthis.splitData();\r\n\t},\r\n\tcomputed: {\r\n\t\t// 破坏flowList变量的引用，否则watch的结果新旧值是一样的\r\n\t\tcopyFlowList() {\r\n\t\t\treturn this.cloneData(this.value);\r\n\t\t}\r\n\t},\r\n\tmethods: {\r\n\t\tasync splitData() {\r\n\t\t\tif (!this.tempList.length) return;\r\n\t\t\tlet leftRect = await this.$uGetRect('#u-left-column');\r\n\t\t\tlet rightRect = await this.$uGetRect('#u-right-column');\r\n\t\t\t// 如果左边小于或等于右边，就添加到左边，否则添加到右边\r\n\t\t\tlet item = this.tempList[0];\r\n\t\t\t// 解决多次快速上拉后，可能数据会乱的问题，因为经过上面的两个await节点查询阻塞一定时间，加上后面的定时器干扰\r\n\t\t\t// 数组可能变成[]，导致此item值可能为undefined\r\n\t\t\tif(!item) return ;\r\n\t\t\tif (leftRect.height < rightRect.height) {\r\n\t\t\t\tthis.leftList.push(item);\r\n\t\t\t} else if (leftRect.height > rightRect.height) {\r\n\t\t\t\tthis.rightList.push(item);\r\n\t\t\t} else {\r\n\t\t\t\t// 这里是为了保证第一和第二张添加时，左右都能有内容\r\n\t\t\t\t// 因为添加第一张，实际队列的高度可能还是0，这时需要根据队列元素长度判断下一个该放哪边\r\n\t\t\t\tif (this.leftList.length <= this.rightList.length) {\r\n\t\t\t\t\tthis.leftList.push(item);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.rightList.push(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// 移除临时列表的第一项\r\n\t\t\tthis.tempList.splice(0, 1);\r\n\t\t\t// 如果临时数组还有数据，继续循环\r\n\t\t\tif (this.tempList.length) {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tthis.splitData();\r\n\t\t\t\t}, this.addTime)\r\n\t\t\t}\r\n\t\t},\r\n\t\t// 复制而不是引用对象和数组\r\n\t\tcloneData(data) {\r\n\t\t\treturn JSON.parse(JSON.stringify(data));\r\n\t\t},\r\n\t\t// 清空数据列表\r\n\t\tclear() {\r\n\t\t\tthis.leftList = [];\r\n\t\t\tthis.rightList = [];\r\n\t\t\t// 同时清除父组件列表中的数据\r\n\t\t\tthis.$emit('input', []);\r\n\t\t},\r\n\t\t// 清除某一条指定的数据，根据id实现\r\n\t\tremove(id) {\r\n\t\t\t// 如果findIndex找不到合适的条件，就会返回-1\r\n\t\t\tlet index = -1;\r\n\t\t\tindex = this.leftList.findIndex(val => val[this.idKey] == id);\r\n\t\t\tif(index != -1) {\r\n\t\t\t\t// 如果index不等于-1，说明已经找到了要找的id，根据index索引删除这一条数据\r\n\t\t\t\tthis.leftList.splice(index, 1);\r\n\t\t\t} else {\r\n\t\t\t\t// 同理于上方面的方法\r\n\t\t\t\tindex = this.rightList.findIndex(val => val[this.idKey] == id);\r\n\t\t\t\tif(index != -1) this.rightList.splice(index, 1);\r\n\t\t\t}\r\n\t\t\t// 同时清除父组件的数据中的对应id的条目\r\n\t\t\tindex = this.value.findIndex(val => val[this.idKey] == id);\r\n\t\t\tif(index != -1) this.$emit('input', this.value.splice(index, 1));\r\n\t\t},\r\n\t\t// 修改某条数据的某个属性\r\n\t\tmodify(id, key, value) {\r\n\t\t\t// 如果findIndex找不到合适的条件，就会返回-1\r\n\t\t\tlet index = -1;\r\n\t\t\tindex = this.leftList.findIndex(val => val[this.idKey] == id);\r\n\t\t\tif(index != -1) {\r\n\t\t\t\t// 如果index不等于-1，说明已经找到了要找的id，修改对应key的值\r\n\t\t\t\tthis.leftList[index][key] = value;\r\n\t\t\t} else {\r\n\t\t\t\t// 同理于上方面的方法\r\n\t\t\t\tindex = this.rightList.findIndex(val => val[this.idKey] == id);\r\n\t\t\t\tif(index != -1) this.rightList[index][key] = value;\r\n\t\t\t}\r\n\t\t\t// 修改父组件的数据中的对应id的条目\r\n\t\t\tindex = this.value.findIndex(val => val[this.idKey] == id);\r\n\t\t\tif(index != -1) {\r\n\t\t\t\t// 首先复制一份value的数据\r\n\t\t\t\tlet data = this.cloneData(this.value);\r\n\t\t\t\t// 修改对应索引的key属性的值为value\r\n\t\t\t\tdata[index][key] = value;\r\n\t\t\t\t// 修改父组件通过v-model绑定的变量的值\r\n\t\t\t\tthis.$emit('input', data);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import \"../../libs/css/style.components.scss\";\r\n\r\n.u-waterfall {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: flex-start;\r\n}\r\n\r\n.u-column {\r\n\tdisplay: flex;\r\n\tflex: 1;\r\n\tflex-direction: column;\r\n\theight: auto;\r\n}\r\n\r\n.u-image {\r\n\twidth: 100%;\r\n}\r\n</style>\r\n"
  },
  {
    "path": "uview-ui/iconfont.css",
    "content": "/* #ifdef APP-PLUS */\r\n@font-face {\r\n\tfont-family: \"uicon-iconfont\";\r\n\tfont-weight: normal;\r\n\tfont-style: normal;\r\n\tfont-display: auto;\r\n\tsrc: url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2');\r\n}\r\n\r\n/* #endif */\r\n\r\n/* 支付宝，百度，头条小程序目前读取大的本地字体文件，导致无法显示图标，故用在线加载的方式-2020-05-12 */\r\n/* #ifndef APP-PLUS */\r\n@font-face {font-family: \"uicon-iconfont\";\r\n  src: url('//at.alicdn.com/t/font_1529455_adug8z8qzbi.eot?t=1595859460686'); /* IE9 */\r\n  src: url('//at.alicdn.com/t/font_1529455_adug8z8qzbi.eot?t=1595859460686#iefix') format('embedded-opentype'), /* IE6-IE8 */\r\n  url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),\r\n  url('//at.alicdn.com/t/font_1529455_adug8z8qzbi.woff?t=1595859460686') format('woff'),\r\n  url('//at.alicdn.com/t/font_1529455_adug8z8qzbi.ttf?t=1595859460686') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */\r\n  url('//at.alicdn.com/t/font_1529455_adug8z8qzbi.svg?t=1595859460686#iconfont') format('svg'); /* iOS 4.1- */\r\n}\r\n/* #endif */\r\n\r\n.u-iconfont {\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\tfont: normal normal normal 14px/1 \"uicon-iconfont\";\r\n\tfont-size: inherit;\r\n\ttext-rendering: auto;\r\n\t-webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n.u-iconfont::before {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n\r\n.uicon-level:before {\r\n\tcontent: \"\\e693\";\r\n}\r\n\r\n.uicon-woman:before {\r\n\tcontent: \"\\e69c\";\r\n}\r\n\r\n.uicon-man:before {\r\n\tcontent: \"\\e697\";\r\n}\r\n\r\n.uicon-column-line:before {\r\n\tcontent: \"\\e68e\";\r\n}\r\n\r\n.uicon-empty-page:before {\r\n\tcontent: \"\\e627\";\r\n}\r\n\r\n.uicon-empty-data:before {\r\n\tcontent: \"\\e62f\";\r\n}\r\n\r\n.uicon-empty-car:before {\r\n\tcontent: \"\\e602\";\r\n}\r\n\r\n.uicon-empty-order:before {\r\n\tcontent: \"\\e639\";\r\n}\r\n\r\n.uicon-empty-address:before {\r\n\tcontent: \"\\e646\";\r\n}\r\n\r\n.uicon-empty-message:before {\r\n\tcontent: \"\\e6a9\";\r\n}\r\n\r\n.uicon-empty-search:before {\r\n\tcontent: \"\\e664\";\r\n}\r\n\r\n.uicon-empty-favor:before {\r\n\tcontent: \"\\e67c\";\r\n}\r\n\r\n.uicon-empty-coupon:before {\r\n\tcontent: \"\\e682\";\r\n}\r\n\r\n.uicon-empty-history:before {\r\n\tcontent: \"\\e684\";\r\n}\r\n\r\n.uicon-empty-permission:before {\r\n\tcontent: \"\\e686\";\r\n}\r\n\r\n.uicon-empty-news:before {\r\n\tcontent: \"\\e687\";\r\n}\r\n\r\n.uicon-empty-wifi:before {\r\n\tcontent: \"\\e688\";\r\n}\r\n\r\n.uicon-empty-list:before {\r\n\tcontent: \"\\e68b\";\r\n}\r\n\r\n.uicon-arrow-left-double:before {\r\n\tcontent: \"\\e68c\";\r\n}\r\n\r\n.uicon-arrow-right-double:before {\r\n\tcontent: \"\\e68d\";\r\n}\r\n\r\n.uicon-red-packet:before {\r\n\tcontent: \"\\e691\";\r\n}\r\n\r\n.uicon-red-packet-fill:before {\r\n\tcontent: \"\\e690\";\r\n}\r\n\r\n.uicon-order:before {\r\n\tcontent: \"\\e68f\";\r\n}\r\n\r\n.uicon-nav-back-arrow:before {\r\n\tcontent: \"\\e67f\";\r\n}\r\n\r\n.uicon-nav-back:before {\r\n\tcontent: \"\\e683\";\r\n}\r\n\r\n.uicon-checkbox-mark:before {\r\n\tcontent: \"\\e6a8\";\r\n}\r\n\r\n.uicon-arrow-up-fill:before {\r\n\tcontent: \"\\e6b0\";\r\n}\r\n\r\n.uicon-arrow-down-fill:before {\r\n\tcontent: \"\\e600\";\r\n}\r\n\r\n.uicon-backspace:before {\r\n\tcontent: \"\\e67b\";\r\n}\r\n\r\n.uicon-android-circle-fill:before {\r\n\tcontent: \"\\e67e\";\r\n}\r\n\r\n.uicon-android-fill:before {\r\n\tcontent: \"\\e67d\";\r\n}\r\n\r\n.uicon-question:before {\r\n\tcontent: \"\\e715\";\r\n}\r\n\r\n.uicon-pause:before {\r\n\tcontent: \"\\e8fa\";\r\n}\r\n\r\n.uicon-close:before {\r\n\tcontent: \"\\e685\";\r\n}\r\n\r\n.uicon-volume-up:before {\r\n\tcontent: \"\\e633\";\r\n}\r\n\r\n.uicon-volume-off:before {\r\n\tcontent: \"\\e644\";\r\n}\r\n\r\n.uicon-info:before {\r\n\tcontent: \"\\e653\";\r\n}\r\n\r\n.uicon-error:before {\r\n\tcontent: \"\\e6d3\";\r\n}\r\n\r\n.uicon-lock-opened-fill:before {\r\n\tcontent: \"\\e974\";\r\n}\r\n\r\n.uicon-lock-fill:before {\r\n\tcontent: \"\\e979\";\r\n}\r\n\r\n.uicon-lock:before {\r\n\tcontent: \"\\e97a\";\r\n}\r\n\r\n.uicon-photo-fill:before {\r\n\tcontent: \"\\e98b\";\r\n}\r\n\r\n.uicon-photo:before {\r\n\tcontent: \"\\e98d\";\r\n}\r\n\r\n.uicon-account-fill:before {\r\n\tcontent: \"\\e614\";\r\n}\r\n\r\n.uicon-minus-people-fill:before {\r\n\tcontent: \"\\e615\";\r\n}\r\n\r\n.uicon-plus-people-fill:before {\r\n\tcontent: \"\\e626\";\r\n}\r\n\r\n.uicon-account:before {\r\n\tcontent: \"\\e628\";\r\n}\r\n\r\n.uicon-thumb-down-fill:before {\r\n\tcontent: \"\\e726\";\r\n}\r\n\r\n.uicon-thumb-down:before {\r\n\tcontent: \"\\e727\";\r\n}\r\n\r\n.uicon-thumb-up-fill:before {\r\n\tcontent: \"\\e72f\";\r\n}\r\n\r\n.uicon-thumb-up:before {\r\n\tcontent: \"\\e733\";\r\n}\r\n\r\n.uicon-person-delete-fill:before {\r\n\tcontent: \"\\e66a\";\r\n}\r\n\r\n.uicon-cut:before {\r\n\tcontent: \"\\e948\";\r\n}\r\n\r\n.uicon-fingerprint:before {\r\n\tcontent: \"\\e955\";\r\n}\r\n\r\n.uicon-home-fill:before {\r\n\tcontent: \"\\e964\";\r\n}\r\n\r\n.uicon-home:before {\r\n\tcontent: \"\\e965\";\r\n}\r\n\r\n.uicon-hourglass-half-fill:before {\r\n\tcontent: \"\\e966\";\r\n}\r\n\r\n.uicon-hourglass:before {\r\n\tcontent: \"\\e967\";\r\n}\r\n\r\n.uicon-lock-open:before {\r\n\tcontent: \"\\e973\";\r\n}\r\n\r\n.uicon-integral-fill:before {\r\n\tcontent: \"\\e703\";\r\n}\r\n\r\n.uicon-integral:before {\r\n\tcontent: \"\\e704\";\r\n}\r\n\r\n.uicon-coupon:before {\r\n\tcontent: \"\\e8ae\";\r\n}\r\n\r\n.uicon-coupon-fill:before {\r\n\tcontent: \"\\e8c4\";\r\n}\r\n\r\n.uicon-kefu-ermai:before {\r\n\tcontent: \"\\e656\";\r\n}\r\n\r\n.uicon-scan:before {\r\n\tcontent: \"\\e662\";\r\n}\r\n\r\n.uicon-rmb:before {\r\n\tcontent: \"\\e608\";\r\n}\r\n\r\n.uicon-rmb-circle-fill:before {\r\n\tcontent: \"\\e657\";\r\n}\r\n\r\n.uicon-rmb-circle:before {\r\n\tcontent: \"\\e677\";\r\n}\r\n\r\n.uicon-gift:before {\r\n\tcontent: \"\\e65b\";\r\n}\r\n\r\n.uicon-gift-fill:before {\r\n\tcontent: \"\\e65c\";\r\n}\r\n\r\n.uicon-bookmark-fill:before {\r\n\tcontent: \"\\e63b\";\r\n}\r\n\r\n.uicon-zhuanfa:before {\r\n\tcontent: \"\\e60b\";\r\n}\r\n\r\n.uicon-eye-off-outline:before {\r\n\tcontent: \"\\e62b\";\r\n}\r\n\r\n.uicon-eye-off:before {\r\n\tcontent: \"\\e648\";\r\n}\r\n\r\n.uicon-pause-circle:before {\r\n\tcontent: \"\\e643\";\r\n}\r\n\r\n.uicon-play-circle:before {\r\n\tcontent: \"\\e647\";\r\n}\r\n\r\n.uicon-pause-circle-fill:before {\r\n\tcontent: \"\\e654\";\r\n}\r\n\r\n.uicon-play-circle-fill:before {\r\n\tcontent: \"\\e655\";\r\n}\r\n\r\n.uicon-grid:before {\r\n\tcontent: \"\\e673\";\r\n}\r\n\r\n.uicon-play-right:before {\r\n\tcontent: \"\\e610\";\r\n}\r\n\r\n.uicon-play-left:before {\r\n\tcontent: \"\\e66d\";\r\n}\r\n\r\n.uicon-calendar:before {\r\n\tcontent: \"\\e66e\";\r\n}\r\n\r\n.uicon-rewind-right:before {\r\n\tcontent: \"\\e66f\";\r\n}\r\n\r\n.uicon-rewind-left:before {\r\n\tcontent: \"\\e671\";\r\n}\r\n\r\n.uicon-skip-forward-right:before {\r\n\tcontent: \"\\e672\";\r\n}\r\n\r\n.uicon-skip-back-left:before {\r\n\tcontent: \"\\e674\";\r\n}\r\n\r\n.uicon-play-left-fill:before {\r\n\tcontent: \"\\e675\";\r\n}\r\n\r\n.uicon-play-right-fill:before {\r\n\tcontent: \"\\e676\";\r\n}\r\n\r\n.uicon-grid-fill:before {\r\n\tcontent: \"\\e678\";\r\n}\r\n\r\n.uicon-rewind-left-fill:before {\r\n\tcontent: \"\\e679\";\r\n}\r\n\r\n.uicon-rewind-right-fill:before {\r\n\tcontent: \"\\e67a\";\r\n}\r\n\r\n.uicon-pushpin:before {\r\n\tcontent: \"\\e7e3\";\r\n}\r\n\r\n.uicon-star:before {\r\n\tcontent: \"\\e65f\";\r\n}\r\n\r\n.uicon-star-fill:before {\r\n\tcontent: \"\\e669\";\r\n}\r\n\r\n.uicon-server-fill:before {\r\n\tcontent: \"\\e751\";\r\n}\r\n\r\n.uicon-server-man:before {\r\n\tcontent: \"\\e6bc\";\r\n}\r\n\r\n.uicon-edit-pen:before {\r\n\tcontent: \"\\e612\";\r\n}\r\n\r\n.uicon-edit-pen-fill:before {\r\n\tcontent: \"\\e66b\";\r\n}\r\n\r\n.uicon-wifi:before {\r\n\tcontent: \"\\e667\";\r\n}\r\n\r\n.uicon-wifi-off:before {\r\n\tcontent: \"\\e668\";\r\n}\r\n\r\n.uicon-file-text:before {\r\n\tcontent: \"\\e663\";\r\n}\r\n\r\n.uicon-file-text-fill:before {\r\n\tcontent: \"\\e665\";\r\n}\r\n\r\n.uicon-more-dot-fill:before {\r\n\tcontent: \"\\e630\";\r\n}\r\n\r\n.uicon-minus:before {\r\n\tcontent: \"\\e618\";\r\n}\r\n\r\n.uicon-minus-circle:before {\r\n\tcontent: \"\\e61b\";\r\n}\r\n\r\n.uicon-plus:before {\r\n\tcontent: \"\\e62d\";\r\n}\r\n\r\n.uicon-plus-circle:before {\r\n\tcontent: \"\\e62e\";\r\n}\r\n\r\n.uicon-minus-circle-fill:before {\r\n\tcontent: \"\\e652\";\r\n}\r\n\r\n.uicon-plus-circle-fill:before {\r\n\tcontent: \"\\e661\";\r\n}\r\n\r\n.uicon-email:before {\r\n\tcontent: \"\\e611\";\r\n}\r\n\r\n.uicon-email-fill:before {\r\n\tcontent: \"\\e642\";\r\n}\r\n\r\n.uicon-phone:before {\r\n\tcontent: \"\\e622\";\r\n}\r\n\r\n.uicon-phone-fill:before {\r\n\tcontent: \"\\e64f\";\r\n}\r\n\r\n.uicon-clock:before {\r\n\tcontent: \"\\e60f\";\r\n}\r\n\r\n.uicon-car:before {\r\n\tcontent: \"\\e60c\";\r\n}\r\n\r\n.uicon-car-fill:before {\r\n\tcontent: \"\\e636\";\r\n}\r\n\r\n.uicon-warning:before {\r\n\tcontent: \"\\e694\";\r\n}\r\n\r\n.uicon-warning-fill:before {\r\n\tcontent: \"\\e64d\";\r\n}\r\n\r\n.uicon-search:before {\r\n\tcontent: \"\\e62a\";\r\n}\r\n\r\n.uicon-baidu-circle-fill:before {\r\n\tcontent: \"\\e680\";\r\n}\r\n\r\n.uicon-baidu:before {\r\n\tcontent: \"\\e681\";\r\n}\r\n\r\n.uicon-facebook:before {\r\n\tcontent: \"\\e689\";\r\n}\r\n\r\n.uicon-facebook-circle-fill:before {\r\n\tcontent: \"\\e68a\";\r\n}\r\n\r\n.uicon-qzone:before {\r\n\tcontent: \"\\e695\";\r\n}\r\n\r\n.uicon-qzone-circle-fill:before {\r\n\tcontent: \"\\e696\";\r\n}\r\n\r\n.uicon-moments-circel-fill:before {\r\n\tcontent: \"\\e69a\";\r\n}\r\n\r\n.uicon-moments:before {\r\n\tcontent: \"\\e69b\";\r\n}\r\n\r\n.uicon-qq-circle-fill:before {\r\n\tcontent: \"\\e6a0\";\r\n}\r\n\r\n.uicon-qq-fill:before {\r\n\tcontent: \"\\e6a1\";\r\n}\r\n\r\n.uicon-weibo:before {\r\n\tcontent: \"\\e6a4\";\r\n}\r\n\r\n.uicon-weibo-circle-fill:before {\r\n\tcontent: \"\\e6a5\";\r\n}\r\n\r\n.uicon-taobao:before {\r\n\tcontent: \"\\e6a6\";\r\n}\r\n\r\n.uicon-taobao-circle-fill:before {\r\n\tcontent: \"\\e6a7\";\r\n}\r\n\r\n.uicon-twitter:before {\r\n\tcontent: \"\\e6aa\";\r\n}\r\n\r\n.uicon-twitter-circle-fill:before {\r\n\tcontent: \"\\e6ab\";\r\n}\r\n\r\n.uicon-weixin-circle-fill:before {\r\n\tcontent: \"\\e6b1\";\r\n}\r\n\r\n.uicon-weixin-fill:before {\r\n\tcontent: \"\\e6b2\";\r\n}\r\n\r\n.uicon-zhifubao-circle-fill:before {\r\n\tcontent: \"\\e6b8\";\r\n}\r\n\r\n.uicon-zhifubao:before {\r\n\tcontent: \"\\e6b9\";\r\n}\r\n\r\n.uicon-zhihu:before {\r\n\tcontent: \"\\e6ba\";\r\n}\r\n\r\n.uicon-zhihu-circle-fill:before {\r\n\tcontent: \"\\e709\";\r\n}\r\n\r\n.uicon-list:before {\r\n\tcontent: \"\\e650\";\r\n}\r\n\r\n.uicon-list-dot:before {\r\n\tcontent: \"\\e616\";\r\n}\r\n\r\n.uicon-setting:before {\r\n\tcontent: \"\\e61f\";\r\n}\r\n\r\n.uicon-bell:before {\r\n\tcontent: \"\\e609\";\r\n}\r\n\r\n.uicon-bell-fill:before {\r\n\tcontent: \"\\e640\";\r\n}\r\n\r\n.uicon-attach:before {\r\n\tcontent: \"\\e632\";\r\n}\r\n\r\n.uicon-storeping-cart:before {\r\n\tcontent: \"\\e621\";\r\n}\r\n\r\n.uicon-storeping-cart-fill:before {\r\n\tcontent: \"\\e65d\";\r\n}\r\n\r\n.uicon-tags:before {\r\n\tcontent: \"\\e629\";\r\n}\r\n\r\n.uicon-share:before {\r\n\tcontent: \"\\e631\";\r\n}\r\n\r\n.uicon-question-circle-fill:before {\r\n\tcontent: \"\\e666\";\r\n}\r\n\r\n.uicon-question-circle:before {\r\n\tcontent: \"\\e625\";\r\n}\r\n\r\n.uicon-error-circle:before {\r\n\tcontent: \"\\e624\";\r\n}\r\n\r\n.uicon-checkmark-circle:before {\r\n\tcontent: \"\\e63d\";\r\n}\r\n\r\n.uicon-close-circle:before {\r\n\tcontent: \"\\e63f\";\r\n}\r\n\r\n.uicon-info-circle:before {\r\n\tcontent: \"\\e660\";\r\n}\r\n\r\n.uicon-md-person-add:before {\r\n\tcontent: \"\\e6e4\";\r\n}\r\n\r\n.uicon-md-person-fill:before {\r\n\tcontent: \"\\e6ea\";\r\n}\r\n\r\n.uicon-bag-fill:before {\r\n\tcontent: \"\\e617\";\r\n}\r\n\r\n.uicon-bag:before {\r\n\tcontent: \"\\e619\";\r\n}\r\n\r\n.uicon-chat-fill:before {\r\n\tcontent: \"\\e61e\";\r\n}\r\n\r\n.uicon-chat:before {\r\n\tcontent: \"\\e620\";\r\n}\r\n\r\n.uicon-more-circle:before {\r\n\tcontent: \"\\e63e\";\r\n}\r\n\r\n.uicon-more-circle-fill:before {\r\n\tcontent: \"\\e645\";\r\n}\r\n\r\n.uicon-volume:before {\r\n\tcontent: \"\\e66c\";\r\n}\r\n\r\n.uicon-volume-fill:before {\r\n\tcontent: \"\\e670\";\r\n}\r\n\r\n.uicon-reload:before {\r\n\tcontent: \"\\e788\";\r\n}\r\n\r\n.uicon-camera:before {\r\n\tcontent: \"\\e7d7\";\r\n}\r\n\r\n.uicon-heart:before {\r\n\tcontent: \"\\e7df\";\r\n}\r\n\r\n.uicon-heart-fill:before {\r\n\tcontent: \"\\e851\";\r\n}\r\n\r\n.uicon-minus-square-fill:before {\r\n\tcontent: \"\\e855\";\r\n}\r\n\r\n.uicon-plus-square-fill:before {\r\n\tcontent: \"\\e856\";\r\n}\r\n\r\n.uicon-pushpin-fill:before {\r\n\tcontent: \"\\e86e\";\r\n}\r\n\r\n.uicon-camera-fill:before {\r\n\tcontent: \"\\e870\";\r\n}\r\n\r\n.uicon-setting-fill:before {\r\n\tcontent: \"\\e872\";\r\n}\r\n\r\n.uicon-google:before {\r\n\tcontent: \"\\e87a\";\r\n}\r\n\r\n.uicon-ie:before {\r\n\tcontent: \"\\e87b\";\r\n}\r\n\r\n.uicon-apple-fill:before {\r\n\tcontent: \"\\e881\";\r\n}\r\n\r\n.uicon-chrome-circle-fill:before {\r\n\tcontent: \"\\e885\";\r\n}\r\n\r\n.uicon-github-circle-fill:before {\r\n\tcontent: \"\\e887\";\r\n}\r\n\r\n.uicon-IE-circle-fill:before {\r\n\tcontent: \"\\e889\";\r\n}\r\n\r\n.uicon-google-circle-fill:before {\r\n\tcontent: \"\\e88a\";\r\n}\r\n\r\n.uicon-arrow-down:before {\r\n\tcontent: \"\\e60d\";\r\n}\r\n\r\n.uicon-arrow-left:before {\r\n\tcontent: \"\\e60e\";\r\n}\r\n\r\n.uicon-map:before {\r\n\tcontent: \"\\e61d\";\r\n}\r\n\r\n.uicon-man-add-fill:before {\r\n\tcontent: \"\\e64c\";\r\n}\r\n\r\n.uicon-tags-fill:before {\r\n\tcontent: \"\\e651\";\r\n}\r\n\r\n.uicon-arrow-leftward:before {\r\n\tcontent: \"\\e601\";\r\n}\r\n\r\n.uicon-arrow-rightward:before {\r\n\tcontent: \"\\e603\";\r\n}\r\n\r\n.uicon-arrow-downward:before {\r\n\tcontent: \"\\e604\";\r\n}\r\n\r\n.uicon-arrow-right:before {\r\n\tcontent: \"\\e605\";\r\n}\r\n\r\n.uicon-arrow-up:before {\r\n\tcontent: \"\\e606\";\r\n}\r\n\r\n.uicon-arrow-upward:before {\r\n\tcontent: \"\\e607\";\r\n}\r\n\r\n.uicon-bookmark:before {\r\n\tcontent: \"\\e60a\";\r\n}\r\n\r\n.uicon-eye:before {\r\n\tcontent: \"\\e613\";\r\n}\r\n\r\n.uicon-man-delete:before {\r\n\tcontent: \"\\e61a\";\r\n}\r\n\r\n.uicon-man-add:before {\r\n\tcontent: \"\\e61c\";\r\n}\r\n\r\n.uicon-trash:before {\r\n\tcontent: \"\\e623\";\r\n}\r\n\r\n.uicon-error-circle-fill:before {\r\n\tcontent: \"\\e62c\";\r\n}\r\n\r\n.uicon-calendar-fill:before {\r\n\tcontent: \"\\e634\";\r\n}\r\n\r\n.uicon-checkmark-circle-fill:before {\r\n\tcontent: \"\\e635\";\r\n}\r\n\r\n.uicon-close-circle-fill:before {\r\n\tcontent: \"\\e637\";\r\n}\r\n\r\n.uicon-clock-fill:before {\r\n\tcontent: \"\\e638\";\r\n}\r\n\r\n.uicon-checkmark:before {\r\n\tcontent: \"\\e63a\";\r\n}\r\n\r\n.uicon-download:before {\r\n\tcontent: \"\\e63c\";\r\n}\r\n\r\n.uicon-eye-fill:before {\r\n\tcontent: \"\\e641\";\r\n}\r\n\r\n.uicon-mic-off:before {\r\n\tcontent: \"\\e649\";\r\n}\r\n\r\n.uicon-mic:before {\r\n\tcontent: \"\\e64a\";\r\n}\r\n\r\n.uicon-info-circle-fill:before {\r\n\tcontent: \"\\e64b\";\r\n}\r\n\r\n.uicon-map-fill:before {\r\n\tcontent: \"\\e64e\";\r\n}\r\n\r\n.uicon-trash-fill:before {\r\n\tcontent: \"\\e658\";\r\n}\r\n\r\n.uicon-volume-off-fill:before {\r\n\tcontent: \"\\e659\";\r\n}\r\n\r\n.uicon-volume-up-fill:before {\r\n\tcontent: \"\\e65a\";\r\n}\r\n\r\n.uicon-share-fill:before {\r\n\tcontent: \"\\e65e\";\r\n}\r\n"
  },
  {
    "path": "uview-ui/index.js",
    "content": "// 引入全局mixin\r\nimport mixin from './libs/mixin/mixin.js'\r\n// 引入关于是否mixin集成小程序分享的配置\r\n// import wxshare from './libs/mixin/mpShare.js'\r\n// 全局挂载引入http相关请求拦截插件\r\nimport http from './libs/request'\r\n\r\nfunction wranning(str) {\r\n\t// 开发环境进行信息输出,主要是一些报错信息\r\n\t// 这个环境的来由是在程序编写时候,点击hx编辑器运行调试代码的时候,详见:\r\n\t// \thttps://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83\r\n\tif (process.env.NODE_ENV === 'development') {\r\n\t\tconsole.warn(str)\r\n\t}\r\n}\r\n\r\n// 尝试判断在根目录的/store中是否有$u.mixin.js，此文件uView默认为需要挂在到全局的vuex的state变量\r\n// HX2.6.11版本,放到try中,控制台依然会警告,暂时不用此方式，\r\n// let vuexStore = {};\r\n// try {\r\n// \tvuexStore = require(\"@/store/$u.mixin.js\");\r\n// } catch (e) {\r\n// \t//TODO handle the exception\r\n// }\r\n\r\n// post类型对象参数转为get类型url参数\r\nimport queryParams from './libs/function/queryParams.js'\r\n// 路由封装\r\nimport route from './libs/function/route.js'\r\n// 时间格式化\r\nimport timeFormat from './libs/function/timeFormat.js'\r\n// 时间戳格式化,返回多久之前\r\nimport timeFrom from './libs/function/timeFrom.js'\r\n// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制\r\nimport colorGradient from './libs/function/colorGradient.js'\r\n// 生成全局唯一guid字符串\r\nimport guid from './libs/function/guid.js'\r\n// 主题相关颜色,info|success|warning|primary|default|error,此颜色已在uview.scss中定义,但是为js中也能使用,故也定义一份\r\nimport color from './libs/function/color.js'\r\n// 根据type获取图标名称\r\nimport type2icon from './libs/function/type2icon.js'\r\n// 打乱数组的顺序\r\nimport randomArray from './libs/function/randomArray.js'\r\n// 对象和数组的深度克隆\r\nimport deepClone from './libs/function/deepClone.js'\r\n// 对象深度拷贝\r\nimport deepMerge from './libs/function/deepMerge.js'\r\n// 添加单位\r\nimport addUnit from './libs/function/addUnit.js'\r\n\r\n// 规则检验\r\nimport test from './libs/function/test.js'\r\n// 随机数\r\nimport random from './libs/function/random.js'\r\n// 去除空格\r\nimport trim from './libs/function/trim.js'\r\n// toast提示，对uni.showToast的封装\r\nimport toast from './libs/function/toast.js'\r\n// 获取父组件参数\r\nimport getParent from './libs/function/getParent.js'\r\n// 获取整个父组件\r\nimport $parent from './libs/function/$parent.js'\r\n// 获取sys()和os()工具方法\r\n// 获取设备信息，挂载到$u的sys()(system的缩写)属性中，\r\n// 同时把安卓和ios平台的名称\"ios\"和\"android\"挂到$u.os()中，方便取用\r\nimport {sys, os} from './libs/function/sys.js'\r\n// 防抖方法\r\nimport debounce from './libs/function/debounce.js'\r\n// 节流方法\r\nimport throttle from './libs/function/throttle.js'\r\n\r\n\r\n// 配置信息\r\nimport config from './libs/config/config.js'\r\n// 各个需要fixed的地方的z-index配置文件\r\nimport zIndex from './libs/config/zIndex.js'\r\n\r\nconst $u = {\r\n\tqueryParams: queryParams,\r\n\troute: route,\r\n\ttimeFormat: timeFormat,\r\n\tdate: timeFormat, // 另名date\r\n\ttimeFrom,\r\n\tcolorGradient: colorGradient.colorGradient,\r\n\tguid,\r\n\tcolor,\r\n\tsys,\r\n\tos,\r\n\ttype2icon,\r\n\trandomArray,\r\n\twranning,\r\n\tget: http.get,\r\n\tpost: http.post,\r\n\tput: http.put,\r\n\t'delete': http.delete,\r\n\thexToRgb: colorGradient.hexToRgb,\r\n\trgbToHex: colorGradient.rgbToHex,\r\n\ttest,\r\n\trandom,\r\n\tdeepClone,\r\n\tdeepMerge,\r\n\tgetParent,\r\n\t$parent,\r\n\taddUnit,\r\n\ttrim,\r\n\ttype: ['primary', 'success', 'error', 'warning', 'info'],\r\n\thttp,\r\n\ttoast,\r\n\tconfig, // uView配置信息相关，比如版本号\r\n\tzIndex,\r\n\tdebounce,\r\n\tthrottle,\r\n}\r\n\r\nconst install = Vue => {\r\n\tVue.mixin(mixin)\r\n\tif (Vue.prototype.openShare) {\r\n\t\tVue.mixin(mpShare);\r\n\t}\r\n\t// Vue.mixin(vuexStore);\r\n\t// 时间格式化，同时两个名称，date和timeFormat\r\n\tVue.filter('timeFormat', (timestamp, format) => {\r\n\t\treturn timeFormat(timestamp, format)\r\n\t})\r\n\tVue.filter('date', (timestamp, format) => {\r\n\t\treturn timeFormat(timestamp, format)\r\n\t})\r\n\t// 将多久以前的方法，注入到全局过滤器\r\n\tVue.filter('timeFrom', (timestamp, format) => {\r\n\t\treturn timeFrom(timestamp, format)\r\n\t})\r\n\tVue.prototype.$u = $u\r\n}\r\n\r\nexport default {\r\n\tinstall\r\n}"
  },
  {
    "path": "uview-ui/index.scss",
    "content": "// 引入公共基础类\r\n@import \"./libs/css/common.scss\";\r\n@import \"./libs/css/color.scss\";\r\n\r\n// 非nvue的样式\r\n/* #ifndef APP-NVUE */\r\n@import \"./libs/css/style.vue.scss\";\r\n/* #endif */\r\n\r\n// nvue的特有样式\r\n/* #ifdef APP-NVUE */\r\n@import \"./libs/css/style.nvue.scss\";\r\n/* #endif */\r\n\r\n// 小程序特有的样式\r\n/* #ifdef MP */\r\n@import \"./libs/css/style.mp.scss\";\r\n/* #endif */\r\n\r\n// H5特有的样式\r\n/* #ifdef H5 */\r\n@import \"./libs/css/style.h5.scss\";\r\n/* #endif */"
  },
  {
    "path": "uview-ui/libs/config/config.js",
    "content": "// 此版本发布于2020-08-06\r\nlet version = '1.6.0';\r\n\r\nexport default {\r\n\tv: version,\r\n\tversion: version,\r\n\t// 主题名称\r\n\ttype: [\r\n\t\t'primary',\r\n\t\t'success',\r\n\t\t'info',\r\n\t\t'error',\r\n\t\t'warning'\r\n\t]\r\n}"
  },
  {
    "path": "uview-ui/libs/config/zIndex.js",
    "content": "// uniapp在H5中各API的z-index值如下：\r\n/**\r\n * actionsheet: 999\r\n * modal: 999\r\n * navigate: 998\r\n * tabbar: 998\r\n * toast: 999\r\n */\r\n\r\nexport default {\r\n\ttoast: 10090,\r\n\tnoNetwork: 10080,\r\n\t// popup包含popup，actionsheet，keyboard，picker的值\r\n\tpopup: 10075,\r\n\tmask: 10070,\r\n\tnavbar: 980,\r\n\ttopTips: 975,\r\n\tsticky: 970,\r\n\tindexListSticky: 965,\r\n}"
  },
  {
    "path": "uview-ui/libs/css/color.scss",
    "content": ".u-type-primary-light {\r\n\tcolor: $u-type-primary-light;\r\n}\r\n\r\n.u-type-warning-light {\r\n\tcolor: $u-type-warning-light;\r\n}\r\n\r\n.u-type-success-light {\r\n\tcolor: $u-type-success-light;\r\n}\r\n\r\n.u-type-error-light {\r\n\tcolor: $u-type-error-light;\r\n}\r\n\r\n.u-type-info-light {\r\n\tcolor: $u-type-info-light;\r\n}\r\n\r\n.u-type-primary-light-bg {\r\n\tbackground-color: $u-type-primary-light;\r\n}\r\n\r\n.u-type-warning-light-bg {\r\n\tbackground-color: $u-type-warning-light;\r\n}\r\n\r\n.u-type-success-light-bg {\r\n\tbackground-color: $u-type-success-light;\r\n}\r\n\r\n.u-type-error-light-bg {\r\n\tbackground-color: $u-type-error-light;\r\n}\r\n\r\n.u-type-info-light-bg {\r\n\tbackground-color: $u-type-info-light;\r\n}\r\n\r\n.u-type-primary-dark {\r\n\tcolor: $u-type-primary-dark;\r\n}\r\n\r\n.u-type-warning-dark {\r\n\tcolor: $u-type-warning-dark;\r\n}\r\n\r\n.u-type-success-dark {\r\n\tcolor: $u-type-success-dark;\r\n}\r\n\r\n.u-type-error-dark {\r\n\tcolor: $u-type-error-dark;\r\n}\r\n\r\n.u-type-info-dark {\r\n\tcolor: $u-type-info-dark;\r\n}\r\n\r\n.u-type-primary-dark-bg {\r\n\tbackground-color: $u-type-primary-dark;\r\n}\r\n\r\n.u-type-warning-dark-bg {\r\n\tbackground-color: $u-type-warning-dark;\r\n}\r\n\r\n.u-type-success-dark-bg {\r\n\tbackground-color: $u-type-success-dark;\r\n}\r\n\r\n.u-type-error-dark-bg {\r\n\tbackground-color: $u-type-error-dark;\r\n}\r\n\r\n.u-type-info-dark-bg {\r\n\tbackground-color: $u-type-info-dark;\r\n}\r\n\r\n.u-type-primary-disabled {\r\n\tcolor: $u-type-primary-disabled;\r\n}\r\n\r\n.u-type-warning-disabled {\r\n\tcolor: $u-type-warning-disabled;\r\n}\r\n\r\n.u-type-success-disabled {\r\n\tcolor: $u-type-success-disabled;\r\n}\r\n\r\n.u-type-error-disabled {\r\n\tcolor: $u-type-error-disabled;\r\n}\r\n\r\n.u-type-info-disabled {\r\n\tcolor: $u-type-info-disabled;\r\n}\r\n\r\n.u-type-primary {\r\n\tcolor: $u-type-primary;\r\n}\r\n\r\n.u-type-warning {\r\n\tcolor: $u-type-warning;\r\n}\r\n\r\n.u-type-success {\r\n\tcolor: $u-type-success;\r\n}\r\n\r\n.u-type-error {\r\n\tcolor: $u-type-error;\r\n}\r\n\r\n.u-type-info {\r\n\tcolor: $u-type-info;\r\n}\r\n\r\n.u-type-primary-bg {\r\n\tbackground-color: $u-type-primary;\r\n}\r\n\r\n.u-type-warning-bg {\r\n\tbackground-color: $u-type-warning;\r\n}\r\n\r\n.u-type-success-bg {\r\n\tbackground-color: $u-type-success;\r\n}\r\n\r\n.u-type-error-bg {\r\n\tbackground-color: $u-type-error;\r\n}\r\n\r\n.u-type-info-bg {\r\n\tbackground-color: $u-type-info;\r\n}\r\n\r\n.u-main-color {\r\n\tcolor: $u-main-color;\r\n}\r\n\r\n.u-content-color {\r\n\tcolor: $u-content-color;\r\n}\r\n\r\n.u-tips-color {\r\n\tcolor: $u-tips-color;\r\n}\r\n\r\n.u-light-color {\r\n\tcolor: $u-light-color;\r\n}\r\n"
  },
  {
    "path": "uview-ui/libs/css/common.scss",
    "content": ".u-relative,\r\n.u-rela {\r\n\tposition: relative;\r\n}\r\n\r\n.u-absolute,\r\n.u-abso {\r\n\tposition: absolute;\r\n}\r\n\r\n// nvue不能用标签命名样式，不能放在微信组件中，否则微信开发工具会报警告，无法使用标签名当做选择器\r\n/* #ifndef APP-NVUE */\r\nimage {\r\n\tdisplay: inline-block;\r\n}\r\n\r\n// 在weex，也即nvue中，所有元素默认为border-box\r\nview,\r\ntext {\r\n\tbox-sizing: border-box;\r\n}\r\n/* #endif */\r\n\r\n.u-font-xs {\r\n\tfont-size: 22rpx;\r\n}\r\n\r\n.u-font-sm {\r\n\tfont-size: 26rpx;\r\n}\r\n\r\n.u-font-md {\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n.u-font-lg {\r\n\tfont-size: 30rpx;\r\n}\r\n\r\n.u-font-xl {\r\n\tfont-size: 34rpx;\r\n}\r\n\r\n.u-flex {\r\n\t/* #ifndef APP-NVUE */\r\n\tdisplay: flex;\r\n\t/* #endif */\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n}\r\n\r\n.u-flex-wrap {\r\n\tflex-wrap: wrap;\r\n}\r\n\r\n.u-flex-nowrap {\r\n\tflex-wrap: nowrap;\r\n}\r\n\r\n.u-col-center {\r\n\talign-items: center;\r\n}\r\n\r\n.u-col-top {\r\n\talign-items: flex-start;\r\n}\r\n\r\n.u-col-bottom {\r\n\talign-items: flex-end;\r\n}\r\n\r\n.u-row-center {\r\n\tjustify-content: center;\r\n}\r\n\r\n.u-row-left {\r\n\tjustify-content: flex-start;\r\n}\r\n\r\n.u-row-right {\r\n\tjustify-content: flex-end;\r\n}\r\n\r\n.u-row-between {\r\n\tjustify-content: space-between;\r\n}\r\n\r\n.u-row-around {\r\n\tjustify-content: space-around;\r\n}\r\n\r\n.u-text-left {\r\n\ttext-align: left;\r\n}\r\n\r\n.u-text-center {\r\n\ttext-align: center;\r\n}\r\n\r\n.u-text-right {\r\n\ttext-align: right;\r\n}\r\n\r\n.u-flex-col {\r\n\t/* #ifndef APP-NVUE */\r\n\tdisplay: flex;\r\n\t/* #endif */\r\n\tflex-direction: column;\r\n}\r\n\r\n// 定义flex等分\r\n// @for $i from 0 through 12 {\r\n// \t.u-flex-#{$i} {\r\n// \t\tflex: $i;\r\n// \t}\r\n// }\r\n\r\n// // 定义字体(px)单位，小于20都为px单位字体\r\n// @for $i from 9 to 20 {\r\n// \t.u-font-#{$i} {\r\n// \t\tfont-size: $i + px;\r\n// \t}\r\n// }\r\n\r\n// // 定义字体(rpx)单位，大于或等于20的都为rpx单位字体\r\n// @for $i from 20 through 40 {\r\n// \t.u-font-#{$i} {\r\n// \t\tfont-size: $i + rpx;\r\n// \t}\r\n// }\r\n\r\n// // 定义内外边距，历遍1-80\r\n// @for $i from 0 through 80 {\r\n// \t// 只要双数和能被5除尽的数\r\n// \t@if $i % 2 == 0 or $i % 5 == 0 {\r\n// \t\t// 得出：u-margin-30或者u-m-30\r\n// \t\t.u-margin-#{$i}, .u-m-#{$i} {\r\n// \t\t\tmargin: $i + rpx!important;\r\n// \t\t}\r\n\t\t\r\n// \t\t// 得出：u-padding-30或者u-p-30\r\n// \t\t.u-padding-#{$i}, .u-p-#{$i} {\r\n// \t\t\tpadding: $i + rpx!important;\r\n// \t\t}\r\n\t\t\r\n// \t\t@each $short, $long in l left, t top, r right, b bottom {\r\n// \t\t\t// 缩写版，结果如： u-m-l-30\r\n// \t\t\t// 定义外边距\r\n// \t\t\t.u-m-#{$short}-#{$i} {\r\n// \t\t\t\tmargin-#{$long}: $i + rpx!important;\r\n// \t\t\t}\r\n\t\t\t\r\n// \t\t\t// 定义内边距\r\n// \t\t\t.u-p-#{$short}-#{$i} {\r\n// \t\t\t\tpadding-#{$long}: $i + rpx!important;\r\n// \t\t\t}\r\n\t\t\t\r\n// \t\t\t// 完整版，结果如：u-margin-left-30\r\n// \t\t\t// 定义外边距\r\n// \t\t\t.u-margin-#{$long}-#{$i} {\r\n// \t\t\t\tmargin-#{$long}: $i + rpx!important;\r\n// \t\t\t}\r\n\t\t\t\r\n// \t\t\t// 定义内边距\r\n// \t\t\t.u-padding-#{$long}-#{$i} {\r\n// \t\t\t\tpadding-#{$long}: $i + rpx!important;\r\n// \t\t\t}\r\n// \t\t}\r\n// \t}\r\n// }\r\n\r\n"
  },
  {
    "path": "uview-ui/libs/css/style.components.scss",
    "content": ".demo {\r\n\t\r\n}"
  },
  {
    "path": "uview-ui/libs/css/style.h5.scss",
    "content": "/* H5的时候，隐藏滚动条 */\r\n::-webkit-scrollbar {\r\n\tdisplay: none;  \r\n\twidth: 0 !important;  \r\n\theight: 0 !important;  \r\n\t-webkit-appearance: none;  \r\n\tbackground: transparent;  \r\n}\r\n"
  },
  {
    "path": "uview-ui/libs/css/style.mp.scss",
    "content": "/* start--微信小程序编译后页面有组件名的元素，特别处理--start */\r\n/* #ifdef MP-WEIXIN */\r\nu-td, u-th {\r\n\tflex: 1;\r\n\talign-self: stretch;\r\n}\r\n\r\n.u-td {\r\n\theight: 100%;\r\n}\r\n\r\nu-icon {\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\r\n\r\n// 各家小程序宫格组件外层设置为100%，避免受到父元素display: flex;的影响\r\nu-grid {\r\n\twidth: 100%;\r\n\tflex: 0 0 100%;\r\n}\r\n\r\n// 避免小程序线条组件因为父组件display: flex;而失效\r\nu-line {\r\n\tflex: 1;\r\n}\r\n\r\nu-switch {\r\n\tdisplay: inline-flex;\r\n\talign-items: center;\r\n}\n/* #endif */\r\n/* end-微信小程序编译后页面有组件名的元素，特别处理--end */"
  },
  {
    "path": "uview-ui/libs/css/style.nvue.scss",
    "content": ".nvue {\r\n\tfont-size: 24rpx;\r\n}"
  },
  {
    "path": "uview-ui/libs/css/style.vue.scss",
    "content": "page {\r\n\tcolor: $u-main-color;\r\n\tfont-size: 28rpx;\r\n}\r\n\r\n/* start--去除webkit的默认样式--start */\r\n.u-fix-ios-appearance {\r\n\t-webkit-appearance:none;\r\n}\r\n/* end--去除webkit的默认样式--end */\r\n\r\n/* start--icon图标外层套一个view，让其达到更好的垂直居中的效果--start */\r\n.u-icon-wrap {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n}\r\n/* end-icon图标外层套一个view，让其达到更好的垂直居中的效果--end */\r\n\r\n/* start--iPhoneX底部安全区定义--start */\r\n.safe-area-inset-bottom {\r\n  padding-bottom: 0;  \r\n  padding-bottom: constant(safe-area-inset-bottom);  \r\n  padding-bottom: env(safe-area-inset-bottom);  \r\n} \r\n/* end-iPhoneX底部安全区定义--end */\r\n\r\n/* start--各种hover点击反馈相关的类名-start */\r\n.u-hover-class {\r\n\t// background-color: #f7f8f9!important;\r\n\topacity: 0.6;\r\n}\r\n\r\n.u-cell-hover {\r\n\tbackground-color: #f7f8f9!important;\r\n}\r\n/* end--各种hover点击反馈相关的类名--end */\r\n\r\n/* start--文本行数限制--start */\r\n.u-line-1 {\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n    text-overflow: ellipsis;\r\n}\r\n\r\n.u-line-2 {\r\n    -webkit-line-clamp: 2;\r\n}\r\n\r\n.u-line-3 {\r\n    -webkit-line-clamp: 3;\r\n}\r\n\r\n.u-line-4 {\r\n    -webkit-line-clamp: 4;\r\n}\r\n\r\n.u-line-5 {\r\n    -webkit-line-clamp: 5;\r\n}\r\n\r\n.u-line-2, .u-line-3, .u-line-4, .u-line-5 {\r\n    overflow: hidden;\r\n\tword-break: break-all;\r\n    text-overflow: ellipsis; \r\n    display: -webkit-box; // 弹性伸缩盒\r\n    -webkit-box-orient: vertical; // 设置伸缩盒子元素排列方式\r\n}\r\n\r\n/* end--文本行数限制--end */\r\n\r\n\r\n/* start--Retina 屏幕下的 1px 边框--start */\r\n.u-border,\r\n.u-border-bottom,\r\n.u-border-left,\r\n.u-border-right,\r\n.u-border-top,\r\n.u-border-top-bottom {\r\n\tposition: relative\r\n}\r\n\r\n.u-border-bottom:after,\r\n.u-border-left:after,\r\n.u-border-right:after,\r\n.u-border-top-bottom:after,\r\n.u-border-top:after,\r\n.u-border:after {\r\n\t/* #ifndef APP-NVUE */\r\n\tcontent: ' ';\r\n\t/* #endif */\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tpointer-events: none;\r\n\tbox-sizing: border-box;\r\n\t-webkit-transform-origin: 0 0;\r\n\ttransform-origin: 0 0;\r\n\t// 多加0.1%，能解决有时候边框缺失的问题\r\n\twidth: 199.8%;\r\n\theight: 199.7%;\r\n\ttransform: scale(0.5, 0.5);\r\n\tborder: 0 solid $u-border-color;\r\n\tz-index: 2;\r\n}\r\n\r\n.u-border-top:after {\r\n\tborder-top-width: 1px\r\n}\r\n\r\n.u-border-left:after {\r\n\tborder-left-width: 1px\r\n}\r\n\r\n.u-border-right:after {\r\n\tborder-right-width: 1px\r\n}\r\n\r\n.u-border-bottom:after {\r\n\tborder-bottom-width: 1px\r\n}\r\n\r\n.u-border-top-bottom:after {\r\n\tborder-width: 1px 0\r\n}\r\n\r\n.u-border:after {\r\n\tborder-width: 1px\r\n}\r\n/* end--Retina 屏幕下的 1px 边框--end */\r\n\r\n\r\n/* start--clearfix--start */\r\n.u-clearfix:after,\r\n.clearfix:after {\r\n\t/* #ifndef APP-NVUE */\r\n\tcontent: '';\r\n\t/* #endif */\r\n\tdisplay: table;\r\n\tclear: both\r\n}\r\n/* end--clearfix--end */\r\n\r\n/* start--高斯模糊tabbar底部处理--start */\r\n.u-blur-effect-inset {\r\n\twidth: 750rpx;  \r\n\theight: var(--window-bottom);   \r\n\tbackground-color: #FFFFFF;  \r\n}\r\n/* end--高斯模糊tabbar底部处理--end */\r\n\r\n/* start--提升H5端uni.toast()的层级，避免被uView的modal等遮盖--start */\r\n/* #ifdef H5 */\r\nuni-toast {\r\n    z-index: 10090;\r\n}\r\nuni-toast .uni-toast {\r\n   z-index: 10090;\r\n}\r\n/* #endif */\r\n/* end--提升H5端uni.toast()的层级，避免被uView的modal等遮盖--end */"
  },
  {
    "path": "uview-ui/libs/function/$parent.js",
    "content": "// 获取父组件的参数，因为支付宝小程序不支持provide/inject的写法\r\n// this.$parent在非H5中，可以准确获取到父组件，但是在H5中，需要多次this.$parent.$parent.xxx\r\n// 这里默认值等于undefined有它的含义，因为最顶层元素(组件)的$parent就是undefined，意味着不传name\r\n// 值(默认为undefined)，就是查找最顶层的$parent\r\nexport default function $parent(name = undefined) {\r\n\tlet parent = this.$parent;\r\n\t// 通过while历遍，这里主要是为了H5需要多层解析的问题\r\n\twhile (parent) {\r\n\t\t// 父组件\r\n\t\tif (parent.$options && parent.$options.name !== name) {\r\n\t\t\t// 如果组件的name不相等，继续上一级寻找\r\n\t\t\tparent = parent.$parent;\r\n\t\t} else {\r\n\t\t\treturn parent;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}"
  },
  {
    "path": "uview-ui/libs/function/addUnit.js",
    "content": "import validation from './test.js';\r\n\r\n// 添加单位，如果有rpx，%，px等单位结尾或者值为auto，直接返回，否则加上rpx单位结尾\r\nexport default function addUnit(value = 'auto', unit = 'rpx') {\r\n    value = String(value);\r\n\t// 用uView内置验证规则中的number判断是否为数值\r\n    return validation.number(value) ? `${value}${unit}` : value;\r\n}"
  },
  {
    "path": "uview-ui/libs/function/bem.js",
    "content": "function bem(name, conf) {\r\n  \r\n}\r\n\r\nmodule.exports.bem = bem;\r\n"
  },
  {
    "path": "uview-ui/libs/function/color.js",
    "content": "// 为了让用户能够自定义主题，会逐步弃用此文件，各颜色通过css提供\r\n// 为了给某些特殊场景使用和向后兼容，无需删除此文件(2020-06-20)\r\nlet color = {\r\n\tprimary: \"#2979ff\",\r\n\tprimaryDark: \"#2b85e4\",\r\n\tprimaryDisabled: \"#a0cfff\",\r\n\tprimaryLight: \"#ecf5ff\",\r\n\tbgColor: \"#f3f4f6\",\r\n\t\r\n\tinfo: \"#909399\",\r\n\tinfoDark: \"#82848a\",\r\n\tinfoDisabled: \"#c8c9cc\",\r\n\tinfoLight: \"#f4f4f5\",\r\n\t\r\n\twarning: \"#ff9900\",\r\n\twarningDark: \"#f29100\",\r\n\twarningDisabled: \"#fcbd71\",\r\n\twarningLight: \"#fdf6ec\",\r\n\t\r\n\terror: \"#fa3534\",\r\n\terrorDark: \"#dd6161\",\r\n\terrorDisabled: \"#fab6b6\",\r\n\terrorLight: \"#fef0f0\",\r\n\t\r\n\tsuccess: \"#19be6b\",\r\n\tsuccessDark: \"#18b566\",\r\n\tsuccessDisabled: \"#71d5a1\",\r\n\tsuccessLight: \"#dbf1e1\",\r\n\t\r\n\tmainColor: \"#303133\",\r\n\tcontentColor: \"#606266\",\r\n\ttipsColor: \"#909399\",\r\n\tlightColor: \"#c0c4cc\",\r\n\tborderColor: \"#e4e7ed\"\r\n}\r\n\r\nexport default color;"
  },
  {
    "path": "uview-ui/libs/function/colorGradient.js",
    "content": "/**\n * 求两个颜色之间的渐变值\n * @param {string} startColor 开始的颜色\n * @param {string} endColor 结束的颜色\n * @param {number} step 颜色等分的份额\n * */\nfunction colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {\n\tlet startRGB = hexToRgb(startColor, false); //转换为rgb数组模式\n\tlet startR = startRGB[0];\n\tlet startG = startRGB[1];\n\tlet startB = startRGB[2];\n\n\tlet endRGB = hexToRgb(endColor, false);\n\tlet endR = endRGB[0];\n\tlet endG = endRGB[1];\n\tlet endB = endRGB[2];\n\n\tlet sR = (endR - startR) / step; //总差值\n\tlet sG = (endG - startG) / step;\n\tlet sB = (endB - startB) / step;\n\tlet colorArr = [];\n\tfor (let i = 0; i < step; i++) {\n\t\t//计算每一步的hex值 \n\t\tlet hex = rgbToHex('rgb(' + Math.round((sR * i + startR)) + ',' + Math.round((sG * i + startG)) + ',' + Math.round((sB *\n\t\t\ti + startB)) + ')');\n\t\tcolorArr.push(hex);\n\t}\n\treturn colorArr;\n}\n\n// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)\nfunction hexToRgb(sColor, str = true) {\n\tlet reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;\n\tsColor = sColor.toLowerCase();\n\tif (sColor && reg.test(sColor)) {\n\t\tif (sColor.length === 4) {\n\t\t\tlet sColorNew = \"#\";\n\t\t\tfor (let i = 1; i < 4; i += 1) {\n\t\t\t\tsColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));\n\t\t\t}\n\t\t\tsColor = sColorNew;\n\t\t}\n\t\t//处理六位的颜色值\n\t\tlet sColorChange = [];\n\t\tfor (let i = 1; i < 7; i += 2) {\n\t\t\tsColorChange.push(parseInt(\"0x\" + sColor.slice(i, i + 2)));\n\t\t}\n\t\tif(!str) {\n\t\t\treturn sColorChange;\n\t\t} else {\n\t\t\treturn `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`;\n\t\t}\n\t} else if (/^(rgb|RGB)/.test(sColor)) {\n\t\tlet arr = sColor.replace(/(?:\\(|\\)|rgb|RGB)*/g, \"\").split(\",\")\n\t\treturn arr.map(val => Number(val));\n\t} else {\n\t\treturn sColor;\n\t}\n};\n\n// 将rgb表示方式转换为hex表示方式\nfunction rgbToHex(rgb) {\n\tlet _this = rgb;\n\tlet reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;\n\tif (/^(rgb|RGB)/.test(_this)) {\n\t\tlet aColor = _this.replace(/(?:\\(|\\)|rgb|RGB)*/g, \"\").split(\",\");\n\t\tlet strHex = \"#\";\n\t\tfor (let i = 0; i < aColor.length; i++) {\n\t\t\tlet hex = Number(aColor[i]).toString(16);\n\t\t\thex = String(hex).length == 1 ? 0 + '' + hex : hex; // 保证每个rgb的值为2位\n\t\t\tif (hex === \"0\") {\n\t\t\t\thex += hex;\n\t\t\t}\n\t\t\tstrHex += hex;\n\t\t}\n\t\tif (strHex.length !== 7) {\n\t\t\tstrHex = _this;\n\t\t}\n\t\treturn strHex;\n\t} else if (reg.test(_this)) {\n\t\tlet aNum = _this.replace(/#/, \"\").split(\"\");\n\t\tif (aNum.length === 6) {\n\t\t\treturn _this;\n\t\t} else if (aNum.length === 3) {\n\t\t\tlet numHex = \"#\";\n\t\t\tfor (let i = 0; i < aNum.length; i += 1) {\n\t\t\t\tnumHex += (aNum[i] + aNum[i]);\n\t\t\t}\n\t\t\treturn numHex;\n\t\t}\n\t} else {\n\t\treturn _this;\n\t}\n}\n\nexport default {\n\tcolorGradient,\n\thexToRgb,\n\trgbToHex\n}"
  },
  {
    "path": "uview-ui/libs/function/debounce.js",
    "content": "let timeout = null;\r\n\r\n/**\r\n * 防抖原理：一定时间内，只有最后一次操作，再过wait毫秒后才执行函数\r\n * \r\n * @param {Function} func 要执行的回调函数 \r\n * @param {Number} wait 延时的时间\r\n * @param {Boolean} immediate 是否立即执行 \r\n * @return null\r\n */\r\nfunction debounce(func, wait = 500, immediate = false) {\r\n\t// 清除定时器\r\n\tif (timeout !== null) clearTimeout(timeout);\r\n\t// 立即执行，此类情况一般用不到\r\n\tif (immediate) {\r\n\t\tvar callNow = !timeout;\r\n\t\ttimeout = setTimeout(function() {\r\n\t\t\ttimeout = null;\r\n\t\t}, wait);\r\n\t\tif (callNow) typeof func === 'function' && func();\r\n\t} else {\r\n\t\t// 设置定时器，当最后一次操作后，timeout不会再被清除，所以在延时wait毫秒后执行func回调方法\r\n\t\ttimeout = setTimeout(function() {\r\n\t\t\ttypeof func === 'function' && func();\r\n\t\t}, wait);\r\n\t}\r\n}\r\n\r\nexport default debounce\r\n"
  },
  {
    "path": "uview-ui/libs/function/deepClone.js",
    "content": "// 判断arr是否为一个数组，返回一个bool值\r\nfunction isArray (arr) {\r\n    return Object.prototype.toString.call(arr) === '[object Array]';\r\n}\r\n\r\n// 深度克隆\r\nfunction deepClone (obj) {\r\n\t// 对常见的“非”值，直接返回原来值\r\n\tif([null, undefined, NaN, false].includes(obj)) return obj;\r\n    if(typeof obj !== \"object\" && typeof obj !== 'function') {\r\n\t\t//原始类型直接返回\r\n        return obj;\r\n    }\r\n    var o = isArray(obj) ? [] : {};\r\n    for(let i in obj) {\r\n        if(obj.hasOwnProperty(i)){\r\n            o[i] = typeof obj[i] === \"object\" ? deepClone(obj[i]) : obj[i];\r\n        }\r\n    }\r\n    return o;\r\n}\r\n\r\nexport default deepClone;\r\n"
  },
  {
    "path": "uview-ui/libs/function/deepMerge.js",
    "content": "import deepClone from \"./deepClone\";\r\n\r\n// JS对象深度合并\r\nfunction deepMerge(target = {}, source = {}) {\r\n\ttarget = deepClone(target);\r\n\tif (typeof target !== 'object' || typeof source !== 'object') return false;\r\n\tfor (var prop in source) {\r\n\t\tif (!source.hasOwnProperty(prop)) continue;\r\n\t\tif (prop in target) {\r\n\t\t\tif (typeof target[prop] !== 'object') {\r\n\t\t\t\ttarget[prop] = source[prop];\r\n\t\t\t} else {\r\n\t\t\t\tif (typeof source[prop] !== 'object') {\r\n\t\t\t\t\ttarget[prop] = source[prop];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (target[prop].concat && source[prop].concat) {\r\n\t\t\t\t\t\ttarget[prop] = target[prop].concat(source[prop]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttarget[prop] = deepMerge(target[prop], source[prop]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttarget[prop] = source[prop];\r\n\t\t}\r\n\t}\r\n\treturn target;\r\n}\r\n\r\nexport default deepMerge;"
  },
  {
    "path": "uview-ui/libs/function/getParent.js",
    "content": "// 获取父组件的参数，因为支付宝小程序不支持provide/inject的写法\r\n// this.$parent在非H5中，可以准确获取到父组件，但是在H5中，需要多次this.$parent.$parent.xxx\r\nexport default function getParent(name, keys) {\r\n\tlet parent = this.$parent;\r\n\t// 通过while历遍，这里主要是为了H5需要多层解析的问题\r\n\twhile (parent) {\r\n\t\t// 父组件\r\n\t\tif (parent.$options.name !== name) {\r\n\t\t\t// 如果组件的name不相等，继续上一级寻找\r\n\t\t\tparent = parent.$parent;\r\n\t\t} else {\r\n\t\t\tlet data = {};\r\n\t\t\t// 判断keys是否数组，如果传过来的是一个数组，那么直接使用数组元素值当做键值去父组件寻找\r\n\t\t\tif(Array.isArray(keys)) {\r\n\t\t\t\tkeys.map(val => {\r\n\t\t\t\t\tdata[val] = parent[val] ? parent[val] : '';\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// 历遍传过来的对象参数\r\n\t\t\t\tfor(let i in keys) {\r\n\t\t\t\t\t// 如果子组件有此值则用，无此值则用父组件的值\r\n\t\t\t\t\t// 判断是否空数组，如果是，则用父组件的值，否则用子组件的值\r\n\t\t\t\t\tif(Array.isArray(keys[i])) {\r\n\t\t\t\t\t\tif(keys[i].length) {\r\n\t\t\t\t\t\t\tdata[i] = keys[i];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdata[i] = parent[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if(keys[i].constructor === Object) {\r\n\t\t\t\t\t\t// 判断是否对象，如果是对象，且有属性，那么使用子组件的值，否则使用父组件的值\r\n\t\t\t\t\t\tif(Object.keys(keys[i]).length) {\r\n\t\t\t\t\t\t\tdata[i] = keys[i];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdata[i] = parent[i];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 只要子组件有传值，即使是false值，也是“传值”了，也需要覆盖父组件的同名参数\r\n\t\t\t\t\t\tdata[i] = (keys[i] || keys[i] === false) ? keys[i] : parent[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn data;\r\n\t\t}\r\n\t}\r\n\r\n\treturn {};\r\n}"
  },
  {
    "path": "uview-ui/libs/function/guid.js",
    "content": "/**\r\n * 本算法来源于简书开源代码，详见：https://www.jianshu.com/p/fdbf293d0a85\r\n * 全局唯一标识符（uuid，Globally Unique Identifier）,也称作 uuid(Universally Unique IDentifier) \r\n * 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题\r\n * 最可能的情况是左滑删除item或者对某条信息流\"不喜欢\"并去掉它的时候,会导致组件内的数据可能出现错乱\r\n * v-for的时候,推荐使用后端返回的id而不是循环的index\r\n * @param {Number} len uuid的长度\r\n * @param {Boolean} firstU 将返回的首字母置为\"u\"\r\n * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制\r\n */\r\nfunction guid(len = 32, firstU = true, radix = null) {\r\n\tlet chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\r\n\tlet uuid = [];\r\n\tradix = radix || chars.length;\r\n\r\n\tif (len) {\r\n\t\t// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位\r\n\t\tfor (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];\r\n\t} else {\r\n\t\tlet r;\r\n\t\t// rfc4122标准要求返回的uuid中,某些位为固定的字符\r\n\t\tuuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\r\n\t\tuuid[14] = '4';\r\n\r\n\t\tfor (let i = 0; i < 36; i++) {\r\n\t\t\tif (!uuid[i]) {\r\n\t\t\t\tr = 0 | Math.random() * 16;\r\n\t\t\t\tuuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class\r\n\tif (firstU) {\r\n\t\tuuid.shift();\r\n\t\treturn 'u' + uuid.join('');\r\n\t} else {\r\n\t\treturn uuid.join('');\r\n\t}\r\n}\r\n\r\nexport default guid;\n"
  },
  {
    "path": "uview-ui/libs/function/md5.js",
    "content": "/*\r\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\r\n * Digest Algorithm, as defined in RFC 1321.\r\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\r\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r\n * Distributed under the BSD License\r\n * See http://pajhome.org.uk/crypt/md5 for more info.\r\n */\r\n\r\n/*\r\n * Configurable variables. You may need to tweak these to be compatible with\r\n * the server-side, but the defaults work in most cases.\r\n */\r\nvar hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */\r\nvar b64pad  = \"\";  /* base-64 pad character. \"=\" for strict RFC compliance   */\r\n\r\n/*\r\n * These are the functions you'll usually want to call\r\n * They take string arguments and return either hex or base-64 encoded strings\r\n */\r\nfunction hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }\r\nfunction b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }\r\nfunction any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }\r\nfunction hex_hmac_md5(k, d)\r\n  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }\r\nfunction b64_hmac_md5(k, d)\r\n  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }\r\nfunction any_hmac_md5(k, d, e)\r\n  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }\r\n\r\n/*\r\n * Perform a simple self-test to see if the VM is working\r\n */\r\nfunction md5_vm_test()\r\n{\r\n  return hex_md5(\"abc\").toLowerCase() == \"900150983cd24fb0d6963f7d28e17f72\";\r\n}\r\n\r\n/*\r\n * Calculate the MD5 of a raw string\r\n */\r\nfunction rstr_md5(s)\r\n{\r\n  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));\r\n}\r\n\r\n/*\r\n * Calculate the HMAC-MD5, of a key and some data (raw strings)\r\n */\r\nfunction rstr_hmac_md5(key, data)\r\n{\r\n  var bkey = rstr2binl(key);\r\n  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);\r\n\r\n  var ipad = Array(16), opad = Array(16);\r\n  for(var i = 0; i < 16; i++)\r\n  {\r\n    ipad[i] = bkey[i] ^ 0x36363636;\r\n    opad[i] = bkey[i] ^ 0x5C5C5C5C;\r\n  }\r\n\r\n  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\r\n  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));\r\n}\r\n\r\n/*\r\n * Convert a raw string to a hex string\r\n */\r\nfunction rstr2hex(input)\r\n{\r\n  try { hexcase } catch(e) { hexcase=0; }\r\n  var hex_tab = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\r\n  var output = \"\";\r\n  var x;\r\n  for(var i = 0; i < input.length; i++)\r\n  {\r\n    x = input.charCodeAt(i);\r\n    output += hex_tab.charAt((x >>> 4) & 0x0F)\r\n           +  hex_tab.charAt( x        & 0x0F);\r\n  }\r\n  return output;\r\n}\r\n\r\n/*\r\n * Convert a raw string to a base-64 string\r\n */\r\nfunction rstr2b64(input)\r\n{\r\n  try { b64pad } catch(e) { b64pad=''; }\r\n  var tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\r\n  var output = \"\";\r\n  var len = input.length;\r\n  for(var i = 0; i < len; i += 3)\r\n  {\r\n    var triplet = (input.charCodeAt(i) << 16)\r\n                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)\r\n                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);\r\n    for(var j = 0; j < 4; j++)\r\n    {\r\n      if(i * 8 + j * 6 > input.length * 8) output += b64pad;\r\n      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);\r\n    }\r\n  }\r\n  return output;\r\n}\r\n\r\n/*\r\n * Convert a raw string to an arbitrary string encoding\r\n */\r\nfunction rstr2any(input, encoding)\r\n{\r\n  var divisor = encoding.length;\r\n  var i, j, q, x, quotient;\r\n\r\n  /* Convert to an array of 16-bit big-endian values, forming the dividend */\r\n  var dividend = Array(Math.ceil(input.length / 2));\r\n  for(i = 0; i < dividend.length; i++)\r\n  {\r\n    dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);\r\n  }\r\n\r\n  /*\r\n   * Repeatedly perform a long division. The binary array forms the dividend,\r\n   * the length of the encoding is the divisor. Once computed, the quotient\r\n   * forms the dividend for the next step. All remainders are stored for later\r\n   * use.\r\n   */\r\n  var full_length = Math.ceil(input.length * 8 /\r\n                                    (Math.log(encoding.length) / Math.log(2)));\r\n  var remainders = Array(full_length);\r\n  for(j = 0; j < full_length; j++)\r\n  {\r\n    quotient = Array();\r\n    x = 0;\r\n    for(i = 0; i < dividend.length; i++)\r\n    {\r\n      x = (x << 16) + dividend[i];\r\n      q = Math.floor(x / divisor);\r\n      x -= q * divisor;\r\n      if(quotient.length > 0 || q > 0)\r\n        quotient[quotient.length] = q;\r\n    }\r\n    remainders[j] = x;\r\n    dividend = quotient;\r\n  }\r\n\r\n  /* Convert the remainders to the output string */\r\n  var output = \"\";\r\n  for(i = remainders.length - 1; i >= 0; i--)\r\n    output += encoding.charAt(remainders[i]);\r\n\r\n  return output;\r\n}\r\n\r\n/*\r\n * Encode a string as utf-8.\r\n * For efficiency, this assumes the input is valid utf-16.\r\n */\r\nfunction str2rstr_utf8(input)\r\n{\r\n  var output = \"\";\r\n  var i = -1;\r\n  var x, y;\r\n\r\n  while(++i < input.length)\r\n  {\r\n    /* Decode utf-16 surrogate pairs */\r\n    x = input.charCodeAt(i);\r\n    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;\r\n    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)\r\n    {\r\n      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);\r\n      i++;\r\n    }\r\n\r\n    /* Encode output as utf-8 */\r\n    if(x <= 0x7F)\r\n      output += String.fromCharCode(x);\r\n    else if(x <= 0x7FF)\r\n      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),\r\n                                    0x80 | ( x         & 0x3F));\r\n    else if(x <= 0xFFFF)\r\n      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),\r\n                                    0x80 | ((x >>> 6 ) & 0x3F),\r\n                                    0x80 | ( x         & 0x3F));\r\n    else if(x <= 0x1FFFFF)\r\n      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),\r\n                                    0x80 | ((x >>> 12) & 0x3F),\r\n                                    0x80 | ((x >>> 6 ) & 0x3F),\r\n                                    0x80 | ( x         & 0x3F));\r\n  }\r\n  return output;\r\n}\r\n\r\n/*\r\n * Encode a string as utf-16\r\n */\r\nfunction str2rstr_utf16le(input)\r\n{\r\n  var output = \"\";\r\n  for(var i = 0; i < input.length; i++)\r\n    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,\r\n                                  (input.charCodeAt(i) >>> 8) & 0xFF);\r\n  return output;\r\n}\r\n\r\nfunction str2rstr_utf16be(input)\r\n{\r\n  var output = \"\";\r\n  for(var i = 0; i < input.length; i++)\r\n    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,\r\n                                   input.charCodeAt(i)        & 0xFF);\r\n  return output;\r\n}\r\n\r\n/*\r\n * Convert a raw string to an array of little-endian words\r\n * Characters >255 have their high-byte silently ignored.\r\n */\r\nfunction rstr2binl(input)\r\n{\r\n  var output = Array(input.length >> 2);\r\n  for(var i = 0; i < output.length; i++)\r\n    output[i] = 0;\r\n  for(var i = 0; i < input.length * 8; i += 8)\r\n    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);\r\n  return output;\r\n}\r\n\r\n/*\r\n * Convert an array of little-endian words to a string\r\n */\r\nfunction binl2rstr(input)\r\n{\r\n  var output = \"\";\r\n  for(var i = 0; i < input.length * 32; i += 8)\r\n    output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);\r\n  return output;\r\n}\r\n\r\n/*\r\n * Calculate the MD5 of an array of little-endian words, and a bit length.\r\n */\r\nfunction binl_md5(x, len)\r\n{\r\n  /* append padding */\r\n  x[len >> 5] |= 0x80 << ((len) % 32);\r\n  x[(((len + 64) >>> 9) << 4) + 14] = len;\r\n\r\n  var a =  1732584193;\r\n  var b = -271733879;\r\n  var c = -1732584194;\r\n  var d =  271733878;\r\n\r\n  for(var i = 0; i < x.length; i += 16)\r\n  {\r\n    var olda = a;\r\n    var oldb = b;\r\n    var oldc = c;\r\n    var oldd = d;\r\n\r\n    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);\r\n    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);\r\n    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);\r\n    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);\r\n    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);\r\n    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);\r\n    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);\r\n    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);\r\n    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);\r\n    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);\r\n    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);\r\n    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);\r\n    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);\r\n    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);\r\n    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);\r\n    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);\r\n\r\n    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);\r\n    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);\r\n    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);\r\n    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);\r\n    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);\r\n    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);\r\n    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);\r\n    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);\r\n    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);\r\n    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);\r\n    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);\r\n    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);\r\n    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);\r\n    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);\r\n    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);\r\n    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);\r\n\r\n    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);\r\n    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);\r\n    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);\r\n    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);\r\n    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);\r\n    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);\r\n    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);\r\n    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);\r\n    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);\r\n    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);\r\n    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);\r\n    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);\r\n    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);\r\n    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);\r\n    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);\r\n    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);\r\n\r\n    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);\r\n    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);\r\n    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);\r\n    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);\r\n    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);\r\n    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);\r\n    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);\r\n    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);\r\n    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);\r\n    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);\r\n    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);\r\n    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);\r\n    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);\r\n    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);\r\n    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);\r\n    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);\r\n\r\n    a = safe_add(a, olda);\r\n    b = safe_add(b, oldb);\r\n    c = safe_add(c, oldc);\r\n    d = safe_add(d, oldd);\r\n  }\r\n  return Array(a, b, c, d);\r\n}\r\n\r\n/*\r\n * These functions implement the four basic operations the algorithm uses.\r\n */\r\nfunction md5_cmn(q, a, b, x, s, t)\r\n{\r\n  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);\r\n}\r\nfunction md5_ff(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\r\n}\r\nfunction md5_gg(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\r\n}\r\nfunction md5_hh(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn(b ^ c ^ d, a, b, x, s, t);\r\n}\r\nfunction md5_ii(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\r\n}\r\n\r\n/*\r\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\r\n * to work around bugs in some JS interpreters.\r\n */\r\nfunction safe_add(x, y)\r\n{\r\n  var lsw = (x & 0xFFFF) + (y & 0xFFFF);\r\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\r\n  return (msw << 16) | (lsw & 0xFFFF);\r\n}\r\n\r\n/*\r\n * Bitwise rotate a 32-bit number to the left.\r\n */\r\nfunction bit_rol(num, cnt)\r\n{\r\n  return (num << cnt) | (num >>> (32 - cnt));\r\n}\r\n\r\nmodule.exports = {\r\n\tmd5 : function(str){\r\n\t\treturn hex_md5(str);\r\n\t}\r\n}"
  },
  {
    "path": "uview-ui/libs/function/queryParams.js",
    "content": "/**\r\n * 对象转url参数\r\n * @param {*} data,对象\r\n * @param {*} isPrefix,是否自动加上\"?\"\r\n */\r\nfunction queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {\r\n\tlet prefix = isPrefix ? '?' : ''\r\n\tlet _result = []\r\n\tif (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets';\r\n\tfor (let key in data) {\r\n\t\tlet value = data[key]\r\n\t\t// 去掉为空的参数\r\n\t\tif (['', undefined, null].indexOf(value) >= 0) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\t// 如果值为数组，另行处理\r\n\t\tif (value.constructor === Array) {\r\n\t\t\t// e.g. {ids: [1, 2, 3]}\r\n\t\t\tswitch (arrayFormat) {\r\n\t\t\t\tcase 'indices':\r\n\t\t\t\t\t// 结果: ids[0]=1&ids[1]=2&ids[2]=3\r\n\t\t\t\t\tfor (let i = 0; i < value.length; i++) {\r\n\t\t\t\t\t\t_result.push(key + '[' + i + ']=' + value[i])\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'brackets':\r\n\t\t\t\t\t// 结果: ids[]=1&ids[]=2&ids[]=3\r\n\t\t\t\t\tvalue.forEach(_value => {\r\n\t\t\t\t\t\t_result.push(key + '[]=' + _value)\r\n\t\t\t\t\t})\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'repeat':\r\n\t\t\t\t\t// 结果: ids=1&ids=2&ids=3\r\n\t\t\t\t\tvalue.forEach(_value => {\r\n\t\t\t\t\t\t_result.push(key + '=' + _value)\r\n\t\t\t\t\t})\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'comma':\r\n\t\t\t\t\t// 结果: ids=1,2,3\r\n\t\t\t\t\tlet commaStr = \"\";\r\n\t\t\t\t\tvalue.forEach(_value => {\r\n\t\t\t\t\t\tcommaStr += (commaStr ? \",\" : \"\") + _value;\r\n\t\t\t\t\t})\r\n\t\t\t\t\t_result.push(key + '=' + commaStr)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tvalue.forEach(_value => {\r\n\t\t\t\t\t\t_result.push(key + '[]=' + _value)\r\n\t\t\t\t\t})\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t_result.push(key + '=' + value)\r\n\t\t}\r\n\t}\r\n\treturn _result.length ? prefix + _result.join('&') : ''\r\n}\r\n\r\nexport default queryParams;\r\n"
  },
  {
    "path": "uview-ui/libs/function/random.js",
    "content": "function random(min, max) {\r\n\tif (min >= 0 && max > 0 && max >= min) {\r\n\t\tlet gab = max - min + 1;\r\n\t\treturn Math.floor(Math.random() * gab + min);\r\n\t} else {\r\n\t\treturn 0;\r\n\t}\r\n}\r\n\r\nexport default random;\n"
  },
  {
    "path": "uview-ui/libs/function/randomArray.js",
    "content": "// 打乱数组\r\nfunction randomArray(array = []) {\r\n\t// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0\r\n\treturn array.sort(() => Math.random() - 0.5);\r\n}\r\n\r\nexport default randomArray\n"
  },
  {
    "path": "uview-ui/libs/function/route.js",
    "content": "import queryParams from '../../libs/function/queryParams.js';\r\n/**\r\n * 路由跳转\r\n * 注意:本方法没有对跳转的回调函数进行封装\r\n */\r\nfunction route(options = {}, params = false) {\r\n\tlet config = {\r\n\t\ttype: 'navigateTo',\r\n\t\turl: '',\r\n\t\tdelta: 1, // navigateBack页面后退时,回退的层数\r\n\t\tparams: {}, // 传递的参数\r\n\t\tanimationType: 'pop-in', // 窗口动画,只在APP有效\r\n\t\tanimationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效\r\n\t};\r\n\tconfig = Object.assign(config, options);\r\n\t// 如果url没有\"/\"开头，添加上，因为uni的路由跳转需要\"/\"开头\r\n\tif (config.url[0] != '/') config.url = '/' + config.url;\r\n\t// 判断是否有传递显式的参数,Object.keys转为数组并判断长度,switchTab类型时不能携带参数\r\n\tif (Object.keys(config.params).length && config.type != 'switchTab') {\r\n\t\t// 判断用户传递的url中，是否带有参数\r\n\t\t// 使用正则匹配，主要依据是判断是否有\"/\",\"?\",\"=\"等，如“/page/index/index?name=mary\"\r\n\t\t// 如果有url中有get参数，转换后无需带上\"?\"\r\n\t\tlet query = '';\r\n\t\tif (/.*\\/.*\\?.*=.*/.test(config.url)) {\r\n\t\t\t// object对象转为get类型的参数\r\n\t\t\tquery = queryParams(config.params, false);\r\n\t\t\t// 因为已有get参数,所以后面拼接的参数需要带上\"&\"隔开\r\n\t\t\tconfig.url += \"&\" + query;\r\n\t\t} else {\r\n\t\t\tquery = queryParams(config.params);\r\n\t\t\tconfig.url += query;\r\n\t\t}\r\n\t}\r\n\t// 简写形式，把url和参数拼接起来\r\n\tif (typeof options === 'string' && typeof params == 'object') {\r\n\t\tlet query = '';\r\n\t\tif (/.*\\/.*\\?.*=.*/.test(options)) {\r\n\t\t\t// object对象转为get类型的参数\r\n\t\t\tquery = queryParams(params, false);\r\n\t\t\t// 因为已有get参数,所以后面拼接的参数需要带上\"&\"隔开\r\n\t\t\toptions += \"&\" + query;\r\n\t\t} else {\r\n\t\t\tquery = queryParams(params);\r\n\t\t\toptions += query;\r\n\t\t}\r\n\t}\r\n\t// 判断是否一个字符串，如果是，直接跳转(简写法)\r\n\t// 如果是中情形，默认第二个参数为对象形式的参数\r\n\tif (typeof options === 'string') {\r\n\t\tif (options[0] != '/') options = '/' + options;\r\n\t\treturn uni.navigateTo({\r\n\t\t\turl: options\r\n\t\t});\r\n\t}\r\n\t// navigateTo类型的跳转\r\n\tif (config.type == 'navigateTo' || config.type == 'to') {\r\n\t\treturn uni.navigateTo({\r\n\t\t\turl: config.url,\r\n\t\t\tanimationType: config.animationType,\r\n\t\t\tanimationDuration: config.animationDuration,\r\n\t\t});\r\n\t}\r\n\tif (config.type == 'redirectTo' || config.type == 'redirect') {\r\n\t\treturn uni.redirectTo({\r\n\t\t\turl: config.url,\r\n\t\t});\r\n\t}\r\n\tif (config.type == 'switchTab' || config.type == 'tab') {\r\n\t\treturn uni.switchTab({\r\n\t\t\turl: config.url,\r\n\t\t});\r\n\t}\r\n\tif (config.type == 'reLaunch') {\r\n\t\treturn uni.reLaunch({\r\n\t\t\turl: config.url\r\n\t\t});\r\n\t}\r\n\tif (config.type == 'navigateBack' || config.type == 'back') {\r\n\t\treturn uni.navigateBack({\r\n\t\t\tdelta: parseInt(config.delta ? config.delta : this.delta)\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport default route;\r\n"
  },
  {
    "path": "uview-ui/libs/function/sys.js",
    "content": "export function os() {\r\n\treturn uni.getSystemInfoSync().platform;\r\n};\r\n\r\nexport function sys() {\r\n\treturn uni.getSystemInfoSync();\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "uview-ui/libs/function/test.js",
    "content": "/**\r\n * 验证电子邮箱格式\r\n */\r\nfunction email(value) {\r\n\treturn /^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/.test(value);\r\n}\r\n\r\n/**\r\n * 验证手机格式\r\n */\r\nfunction mobile(value) {\r\n\treturn /^1[23456789]\\d{9}$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证URL格式\r\n */\r\nfunction url(value) {\r\n\treturn /^((https|http|ftp|rtsp|mms):\\/\\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\\/?)|(\\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\\/?)$/\r\n\t\t.test(value)\r\n}\r\n\r\n/**\r\n * 验证日期格式\r\n */\r\nfunction date(value) {\r\n\treturn !/Invalid|NaN/.test(new Date(value).toString())\r\n}\r\n\r\n/**\r\n * 验证ISO类型的日期格式\r\n */\r\nfunction dateISO(value) {\r\n\treturn /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证十进制数字\r\n */\r\nfunction number(value) {\r\n\treturn /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证整数\r\n */\r\nfunction digits(value) {\r\n\treturn /^\\d+$/.test(value)\r\n}\r\n\r\n/**\r\n * 验证身份证号码\r\n */\r\nfunction idCard(value) {\r\n\treturn /^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$/.test(\r\n\t\tvalue)\r\n}\r\n\r\n/**\r\n * 是否车牌号\r\n */\r\nfunction carNo(value) {\r\n\t// 新能源车牌\r\n\tconst xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;\r\n\t// 旧车牌\r\n\tconst creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;\r\n\tif (value.length === 7) {\r\n\t\treturn creg.test(value);\r\n\t} else if (value.length === 8) {\r\n\t\treturn xreg.test(value);\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n/**\r\n * 金额,只允许2位小数\r\n */\r\nfunction amount(value) {\r\n\t//金额，只允许保留两位小数\r\n\treturn /^[1-9]\\d*(,\\d{3})*(\\.\\d{1,2})?$|^0\\.\\d{1,2}$/.test(value);\r\n}\r\n\r\n/**\r\n * 中文\r\n */\r\nfunction chinese(value) {\r\n\tlet reg = /^[\\u4e00-\\u9fa5]+$/gi;\r\n\treturn reg.test(value);\r\n}\r\n\r\n/**\r\n * 只能输入字母\r\n */\r\nfunction letter(value) {\r\n\treturn /^[a-zA-Z]*$/.test(value);\r\n}\r\n\r\n/**\r\n * 只能是字母或者数字\r\n */\r\nfunction enOrNum(value) {\r\n\t//英文或者数字\r\n\tlet reg = /^[0-9a-zA-Z]*$/g;\r\n\treturn reg.test(value);\r\n}\r\n\r\n/**\r\n * 验证是否包含某个值\r\n */\r\nfunction contains(value, param) {\r\n\treturn value.indexOf(param) >= 0\r\n}\r\n\r\n/**\r\n * 验证一个值范围[min, max]\r\n */\r\nfunction range(value, param) {\r\n\treturn value >= param[0] && value <= param[1]\r\n}\r\n\r\n/**\r\n * 验证一个长度范围[min, max]\r\n */\r\nfunction rangeLength(value, param) {\r\n\treturn value.length >= param[0] && value.length <= param[1]\r\n}\r\n\r\n/**\r\n * 是否固定电话\r\n */\r\nfunction landline(value) {\r\n\tlet reg = /^\\d{3,4}-\\d{7,8}(-\\d{3,4})?$/;\r\n\treturn reg.test(value);\r\n}\r\n\r\n/**\r\n * 判断是否为空\r\n */\r\nfunction empty(value) {\r\n\tswitch (typeof value) {\r\n\t\tcase 'undefined':\r\n\t\t\treturn true;\r\n\t\tcase 'string':\r\n\t\t\tif (value.replace(/(^[ \\t\\n\\r]*)|([ \\t\\n\\r]*$)/g, '').length == 0) return true;\r\n\t\t\tbreak;\r\n\t\tcase 'boolean':\r\n\t\t\tif (!value) return true;\r\n\t\t\tbreak;\r\n\t\tcase 'number':\r\n\t\t\tif (0 === value || isNaN(value)) return true;\r\n\t\t\tbreak;\r\n\t\tcase 'object':\r\n\t\t\tif (null === value || value.length === 0) return true;\r\n\t\t\tfor (var i in value) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * 是否json字符串\r\n */\r\nfunction jsonString(value) {\r\n\tif (typeof value == 'string') {\r\n\t\ttry {\r\n\t\t\tvar obj = JSON.parse(value);\r\n\t\t\tif (typeof obj == 'object' && obj) {\r\n\t\t\t\treturn true;\r\n\t\t\t} else {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n\r\n/**\r\n * 是否数组\r\n */\r\nfunction array(value) {\r\n\tif (typeof Array.isArray === \"function\") {\r\n\t\treturn Array.isArray(value);\r\n\t} else {\r\n\t\treturn Object.prototype.toString.call(value) === \"[object Array]\";\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * 是否对象\r\n */\r\nfunction object(value) {\r\n\treturn Object.prototype.toString.call(value) === '[object Object]';\r\n}\r\n\r\n\r\nexport default {\r\n\temail,\r\n\tmobile,\r\n\turl,\r\n\tdate,\r\n\tdateISO,\r\n\tnumber,\r\n\tdigits,\r\n\tidCard,\r\n\tcarNo,\r\n\tamount,\r\n\tchinese,\r\n\tletter,\r\n\tenOrNum,\r\n\tcontains,\r\n\trange,\r\n\trangeLength,\r\n\tempty,\r\n\tisEmpty: empty,\r\n\tjsonString,\r\n\tlandline,\r\n\tobject,\r\n\tarray\r\n}\r\n"
  },
  {
    "path": "uview-ui/libs/function/throttle.js",
    "content": "let timer, flag;\r\n/**\r\n * 节流原理：在一定时间内，只能触发一次\r\n * \r\n * @param {Function} func 要执行的回调函数 \r\n * @param {Number} wait 延时的时间\r\n * @param {Boolean} immediate 是否立即执行\r\n * @return null\r\n */\r\nfunction throttle(func, wait = 500, immediate = true) {\r\n\tif (immediate) {\r\n\t\tif (!flag) {\r\n\t\t\tflag = true;\r\n\t\t\t// 如果是立即执行，则在wait毫秒内开始时执行\r\n\t\t\ttypeof func === 'function' && func();\r\n\t\t\ttimer = setTimeout(() => {\r\n\t\t\t\tflag = false;\r\n\t\t\t}, wait);\r\n\t\t}\r\n\t} else {\r\n\t\tif (!flag) {\r\n\t\t\tflag = true\r\n\t\t\t// 如果是非立即执行，则在wait毫秒内的结束处执行\r\n\t\t\ttimer = setTimeout(() => {\r\n\t\t\t\tflag = false\r\n\t\t\t\ttypeof func === 'function' && func();\r\n\t\t\t}, wait);\r\n\t\t}\r\n\t\t\r\n\t}\r\n};\r\nexport default throttle\r\n"
  },
  {
    "path": "uview-ui/libs/function/timeFormat.js",
    "content": "// padStart 的 polyfill，因为某些机型或情况，还无法支持es7的padStart，比如电脑版的微信小程序\r\n// 所以这里做一个兼容polyfill的兼容处理\r\nif (!String.prototype.padStart) {\r\n\t// 为了方便表示这里 fillString 用了ES6 的默认参数，不影响理解\r\n\tString.prototype.padStart = function(maxLength, fillString = ' ') {\r\n\t\tif (Object.prototype.toString.call(fillString) !== \"[object String]\") throw new TypeError(\r\n\t\t\t'fillString must be String')\r\n\t\tlet str = this\r\n\t\t// 返回 String(str) 这里是为了使返回的值是字符串字面量，在控制台中更符合直觉\r\n\t\tif (str.length >= maxLength) return String(str)\r\n\r\n\t\tlet fillLength = maxLength - str.length,\r\n\t\t\ttimes = Math.ceil(fillLength / fillString.length)\r\n\t\twhile (times >>= 1) {\r\n\t\t\tfillString += fillString\r\n\t\t\tif (times === 1) {\r\n\t\t\t\tfillString += fillString\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn fillString.slice(0, fillLength) + str;\r\n\t}\r\n}\r\n\r\nfunction timeFormat(timestamp = null, fmt = 'yyyy-mm-dd') {\r\n\t// 其他更多是格式化有如下:\r\n\t// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合\r\n\ttimestamp = parseInt(timestamp);\r\n\t// 如果为null,则格式化当前时间\r\n\tif (!timestamp) timestamp = Number(new Date());\r\n\t// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)\r\n\tif (timestamp.toString().length == 10) timestamp *= 1000;\r\n\tlet date = new Date(timestamp);\r\n\tlet ret;\r\n\tlet opt = {\r\n\t\t\"y+\": date.getFullYear().toString(), // 年\r\n\t\t\"m+\": (date.getMonth() + 1).toString(), // 月\r\n\t\t\"d+\": date.getDate().toString(), // 日\r\n\t\t\"h+\": date.getHours().toString(), // 时\r\n\t\t\"M+\": date.getMinutes().toString(), // 分\r\n\t\t\"s+\": date.getSeconds().toString() // 秒\r\n\t\t// 有其他格式化字符需求可以继续添加，必须转化成字符串\r\n\t};\r\n\tfor (let k in opt) {\r\n\t\tret = new RegExp(\"(\" + k + \")\").exec(fmt);\r\n\t\tif (ret) {\r\n\t\t\tfmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, \"0\")))\r\n\t\t};\r\n\t};\r\n\treturn fmt;\r\n}\r\n\r\nexport default timeFormat\n"
  },
  {
    "path": "uview-ui/libs/function/timeFrom.js",
    "content": "import timeFormat from '../../libs/function/timeFormat.js';\r\n\r\n/**\r\n * 时间戳转为多久之前\r\n * @param String timestamp 时间戳\r\n * @param String | Boolean format 如果为时间格式字符串，超出一定时间范围，返回固定的时间格式；\r\n * 如果为布尔值false，无论什么时间，都返回多久以前的格式\r\n */\r\nfunction timeFrom(timestamp = null, format = 'yyyy-mm-dd') {\r\n\tif (timestamp == null) timestamp = Number(new Date());\r\n\ttimestamp = parseInt(timestamp);\r\n\t// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)\r\n\tif (timestamp.toString().length == 10) timestamp *= 1000;\r\n\tvar timer = (new Date()).getTime() - timestamp;\r\n\ttimer = parseInt(timer / 1000);\r\n\t// 如果小于5分钟,则返回\"刚刚\",其他以此类推\r\n\tlet tips = '';\r\n\tswitch (true) {\r\n\t\tcase timer < 300:\r\n\t\t\ttips = '刚刚';\r\n\t\t\tbreak;\r\n\t\tcase timer >= 300 && timer < 3600:\r\n\t\t\ttips = parseInt(timer / 60) + '分钟前';\r\n\t\t\tbreak;\r\n\t\tcase timer >= 3600 && timer < 86400:\r\n\t\t\ttips = parseInt(timer / 3600) + '小时前';\r\n\t\t\tbreak;\r\n\t\tcase timer >= 86400 && timer < 2592000:\r\n\t\t\ttips = parseInt(timer / 86400) + '天前';\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\t// 如果format为false，则无论什么时间戳，都显示xx之前\r\n\t\t\tif(format === false) {\r\n\t\t\t\tif(timer >= 2592000 && timer < 365 * 86400) {\r\n\t\t\t\t\ttips = parseInt(timer / (86400 * 30)) + '个月前';\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttips = parseInt(timer / (86400 * 365)) + '年前';\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\ttips = timeFormat(timestamp, format);\r\n\t\t\t}\r\n\t}\r\n\treturn tips;\r\n}\r\n\r\nexport default timeFrom;\r\n"
  },
  {
    "path": "uview-ui/libs/function/toast.js",
    "content": "function toast(title, duration = 1500) {\r\n\tuni.showToast({\r\n\t\ttitle: title,\r\n\t\ticon: 'none',\r\n\t\tduration: duration\r\n\t})\r\n}\r\n\r\nexport default toast\n"
  },
  {
    "path": "uview-ui/libs/function/trim.js",
    "content": "function trim(str, pos = 'both') {\r\n\tif (pos == 'both') {\r\n\t\treturn str.replace(/^\\s+|\\s+$/g, \"\");\r\n\t} else if (pos == \"left\") {\r\n\t\treturn str.replace(/^\\s*/, '');\r\n\t} else if (pos == 'right') {\r\n\t\treturn str.replace(/(\\s*$)/g, \"\");\r\n\t} else if (pos == 'all') {\r\n\t\treturn str.replace(/\\s+/g, \"\");\r\n\t} else {\r\n\t\treturn str;\r\n\t}\r\n}\r\n\r\nexport default trim\n"
  },
  {
    "path": "uview-ui/libs/function/type2icon.js",
    "content": "/**\r\n * 根据主题type值,获取对应的图标\r\n * @param String type 主题名称,primary|info|error|warning|success\r\n * @param String fill 是否使用fill填充实体的图标  \r\n */\r\nfunction type2icon(type = 'success', fill = false) {\r\n\t// 如果非预置值,默认为success\r\n\tif (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success';\r\n\tlet iconName = '';\r\n\t// 目前(2019-12-12),info和primary使用同一个图标\r\n\tswitch (type) {\r\n\t\tcase 'primary':\r\n\t\t\ticonName = 'info-circle';\r\n\t\t\tbreak;\r\n\t\tcase 'info':\r\n\t\t\ticonName = 'info-circle';\r\n\t\t\tbreak;\r\n\t\tcase 'error':\r\n\t\t\ticonName = 'close-circle';\r\n\t\t\tbreak;\r\n\t\tcase 'warning':\r\n\t\t\ticonName = 'error-circle';\r\n\t\t\tbreak;\r\n\t\tcase 'success':\r\n\t\t\ticonName = 'checkmark-circle';\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\ticonName = 'checkmark-circle';\r\n\t}\r\n\t// 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的\r\n\tif (fill) iconName += '-fill';\r\n\treturn iconName;\r\n}\r\n\r\nexport default type2icon\n"
  },
  {
    "path": "uview-ui/libs/mixin/mixin.js",
    "content": "module.exports = {\r\n\tdata() {\r\n\t\treturn {}\r\n\t},\r\n\tonLoad() {\r\n\t\t// getRect挂载到$u上，因为这方法需要使用in(this)，所以无法把它独立成一个单独的文件导出\r\n\t\tthis.$u.getRect = this.$uGetRect\r\n\t},\r\n\tmethods: {\r\n\t\t// 查询节点信息\r\n\t\t// 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸，为支付宝的bug(2020-07-21)\r\n\t\t// 解决办法为在组件根部再套一个没有任何作用的view元素\r\n\t\t$uGetRect(selector, all) {\r\n\t\t\treturn new Promise(resolve => {\r\n\t\t\t\tuni.createSelectorQuery().\r\n\t\t\t\tin(this)[all ? 'selectAll' : 'select'](selector)\r\n\t\t\t\t\t.boundingClientRect(rect => {\r\n\t\t\t\t\t\tif (all && Array.isArray(rect) && rect.length) {\r\n\t\t\t\t\t\t\tresolve(rect)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!all && rect) {\r\n\t\t\t\t\t\t\tresolve(rect)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.exec()\r\n\t\t\t})\r\n\t\t}\r\n\t},\r\n\tonReachBottom() {\r\n\t\tuni.$emit('uOnReachBottom')\r\n\t}\r\n}\r\n"
  },
  {
    "path": "uview-ui/libs/mixin/mpShare.js",
    "content": "module.exports = {\r\n\tonLoad() {\r\n\t\t// 设置默认的转发参数\r\n\t\tthis.$u.mpShare = {\r\n\t\t\ttitle: '', // 默认为小程序名称\r\n\t\t\tpath: '', // 默认为当前页面路径\r\n\t\t\timageUrl: '' // 默认为当前页面的截图\r\n\t\t}\r\n\t},\r\n\tonShareAppMessage() {\r\n\t\treturn this.$u.mpShare\r\n\t}\r\n}\r\n"
  },
  {
    "path": "uview-ui/libs/request/index.js",
    "content": "import deepMerge from \"../function/deepMerge\";\r\nimport validate from \"../function/test\";\r\nclass Request {\r\n\t// 设置全局默认配置\r\n\tsetConfig(customConfig) {\r\n\t\t// 深度合并对象，否则会造成对象深层属性丢失\r\n\t\tthis.config = deepMerge(this.config, customConfig);\r\n\t}\r\n\r\n\t// 主要请求部分\r\n\trequest(options = {}) {\r\n\t\t// 检查请求拦截\r\n\t\tif (this.interceptor.request && typeof this.interceptor.request === 'function') {\r\n\t\t\tlet tmpConfig = {};\r\n\t\t\tlet interceptorReuest = this.interceptor.request(options);\r\n\t\t\tif (interceptorReuest === false) {\r\n\t\t\t\t// 返回一个处于pending状态中的Promise，来取消原promise，避免进入then()回调\r\n\t\t\t\treturn new Promise(()=>{});\r\n\t\t\t}\r\n\t\t\tthis.options = interceptorReuest;\r\n\t\t}\r\n\t\toptions.dataType = options.dataType || this.config.dataType;\r\n\t\toptions.responseType = options.responseType || this.config.responseType;\r\n\t\toptions.url = options.url || '';\r\n\t\toptions.params = options.params || {};\r\n\t\toptions.header = Object.assign(this.config.header, options.header);\r\n\t\toptions.method = options.method || this.config.method;\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\toptions.complete = (response) => {\r\n\t\t\t\t// 请求返回后，隐藏loading(如果请求返回快的话，可能会没有loading)\r\n\t\t\t\tuni.hideLoading();\r\n\t\t\t\t// 清除定时器，如果请求回来了，就无需loading\r\n\t\t\t\tclearTimeout(this.config.timer);\r\n\t\t\t\tthis.config.timer = null;\r\n\t\t\t\t// 判断用户对拦截返回数据的要求，如果originalData为true，返回所有的数据(response)到拦截器，否则只返回response.data\r\n\t\t\t\tif(this.config.originalData) {\r\n\t\t\t\t\t// 判断是否存在拦截器\r\n\t\t\t\t\tif (this.interceptor.response && typeof this.interceptor.response === 'function') {\r\n\t\t\t\t\t\tlet resInterceptors = this.interceptor.response(response);\r\n\t\t\t\t\t\t// 如果拦截器不返回false，就将拦截器返回的内容给this.$u.post的then回调\r\n\t\t\t\t\t\tif (resInterceptors !== false) {\r\n\t\t\t\t\t\t\tresolve(resInterceptors);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// 如果拦截器返回false，意味着拦截器定义者认为返回有问题，直接接入catch回调\r\n\t\t\t\t\t\t\treject(response);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 如果要求返回原始数据，就算没有拦截器，也返回最原始的数据\r\n\t\t\t\t\t\tresolve(response);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (response.statusCode == 200) {\r\n\t\t\t\t\t\tif (this.interceptor.response && typeof this.interceptor.response === 'function') {\r\n\t\t\t\t\t\t\tlet resInterceptors = this.interceptor.response(response.data);\r\n\t\t\t\t\t\t\tif (resInterceptors !== false) {\r\n\t\t\t\t\t\t\t\tresolve(resInterceptors);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\treject(response.data);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// 如果不是返回原始数据(originalData=false)，且没有拦截器的情况下，返回纯数据给then回调\r\n\t\t\t\t\t\t\tresolve(response.data);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// 不返回原始数据的情况下，服务器状态码不为200，modal弹框提示\r\n\t\t\t\t\t\tif(response.errMsg) {\r\n\t\t\t\t\t\t\tuni.showModal({\r\n\t\t\t\t\t\t\t\ttitle: response.errMsg\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treject(response)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// 判断用户传递的URL是否/开头,如果不是,加上/，这里使用了uView的test.js验证库的url()方法\r\n\t\t\toptions.url = validate.url(options.url) ? options.url : (this.config.baseUrl + (options.url.indexOf('/') == 0 ?\r\n\t\t\t\toptions.url : '/' + options.url));\r\n\t\t\t\r\n\t\t\t// 是否显示loading\r\n\t\t\t// 加一个是否已有timer定时器的判断，否则有两个同时请求的时候，后者会清除前者的定时器id\r\n\t\t\t// 而没有清除前者的定时器，导致前者超时，一直显示loading\r\n\t\t\tif(this.config.showLoading && !this.config.timer) {\r\n\t\t\t\tthis.config.timer = setTimeout(() => {\r\n\t\t\t\t\tuni.showLoading({\r\n\t\t\t\t\t\ttitle: this.config.loadingText,\r\n\t\t\t\t\t\tmask: this.config.loadingMask\r\n\t\t\t\t\t})\r\n\t\t\t\t\tthis.config.timer = null;\r\n\t\t\t\t}, this.config.loadingTime);\r\n\t\t\t}\r\n\t\t\tuni.request(options);\r\n\t\t})\n\t\t// .catch(res => {\r\n\t\t// \t// 如果返回reject()，不让其进入this.$u.post().then().catch()后面的catct()\r\n\t\t// \t// 因为很多人都会忘了写后面的catch()，导致报错捕获不到catch\r\n\t\t// \treturn new Promise(()=>{});\r\n\t\t// })\r\n\t}\r\n\r\n\tconstructor() {\r\n\t\tthis.config = {\r\n\t\t\tbaseUrl: '', // 请求的根域名\r\n\t\t\t// 默认的请求头\r\n\t\t\theader: {},\r\n\t\t\tmethod: 'POST',\r\n\t\t\t// 设置为json，返回后uni.request会对数据进行一次JSON.parse\r\n\t\t\tdataType: 'json',\r\n\t\t\t// 此参数无需处理，因为5+和支付宝小程序不支持，默认为text即可\r\n\t\t\tresponseType: 'text',\r\n\t\t\tshowLoading: true, // 是否显示请求中的loading\r\n\t\t\tloadingText: '请求中...',\r\n\t\t\tloadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms\r\n\t\t\ttimer: null, // 定时器\r\n\t\t\toriginalData: false, // 是否在拦截器中返回服务端的原始数据，见文档说明\r\n\t\t\tloadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透\r\n\t\t}\r\n\t\r\n\t\t// 拦截器\r\n\t\tthis.interceptor = {\r\n\t\t\t// 请求前的拦截\r\n\t\t\trequest: null,\r\n\t\t\t// 请求后的拦截\r\n\t\t\tresponse: null\r\n\t\t}\r\n\r\n\t\t// get请求\r\n\t\tthis.get = (url, data = {}, header = {}) => {\r\n\t\t\treturn this.request({\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl,\r\n\t\t\t\theader,\r\n\t\t\t\tdata\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\t// post请求\r\n\t\tthis.post = (url, data = {}, header = {}) => {\r\n\t\t\treturn this.request({\r\n\t\t\t\turl,\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\theader,\r\n\t\t\t\tdata\r\n\t\t\t})\r\n\t\t}\r\n\t\t\r\n\t\t// put请求，不支持支付宝小程序(HX2.6.15)\r\n\t\tthis.put = (url, data = {}, header = {}) => {\r\n\t\t\treturn this.request({\r\n\t\t\t\turl,\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\theader,\r\n\t\t\t\tdata\r\n\t\t\t})\r\n\t\t}\r\n\t\t\r\n\t\t// delete请求，不支持支付宝和头条小程序(HX2.6.15)\r\n\t\tthis.delete = (url, data = {}, header = {}) => {\r\n\t\t\treturn this.request({\r\n\t\t\t\turl,\r\n\t\t\t\tmethod: 'DELETE',\r\n\t\t\t\theader,\r\n\t\t\t\tdata\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n}\r\nexport default new Request\r\n"
  },
  {
    "path": "uview-ui/libs/store/index.js",
    "content": "// 暂时不用vuex模块方式实现，将该方法直接放入到/store/index.js中\r\nconst module = {\r\n\tactions: {\r\n\t\t$uStore({rootState}, params) {\r\n\t\t\tlet nameArr = params.name.split('.');\r\n\t\t\tif(nameArr.length >= 2) {\r\n\t\t\t\tlet obj = rootState[nameArr[0]];\r\n\t\t\t\tfor(let i = 1; i < nameArr.length - 1; i ++) {\r\n\t\t\t\t\tobj = obj[nameArr[i]];\r\n\t\t\t\t}\r\n\t\t\t\tobj[nameArr[nameArr.length - 1]] = params.value;\r\n\t\t\t} else {\r\n\t\t\t\trootState[params.name] = params.value;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default module"
  },
  {
    "path": "uview-ui/libs/util/area.js",
    "content": "/* eslint-disable */\r\nvar areaData = [\r\n  [\r\n    [{\r\n        \"label\": \"东城区\",\r\n        \"value\": \"110101\"\r\n      },\r\n      {\r\n        \"label\": \"西城区\",\r\n        \"value\": \"110102\"\r\n      },\r\n      {\r\n        \"label\": \"朝阳区\",\r\n        \"value\": \"110105\"\r\n      },\r\n      {\r\n        \"label\": \"丰台区\",\r\n        \"value\": \"110106\"\r\n      },\r\n      {\r\n        \"label\": \"石景山区\",\r\n        \"value\": \"110107\"\r\n      },\r\n      {\r\n        \"label\": \"海淀区\",\r\n        \"value\": \"110108\"\r\n      },\r\n      {\r\n        \"label\": \"门头沟区\",\r\n        \"value\": \"110109\"\r\n      },\r\n      {\r\n        \"label\": \"房山区\",\r\n        \"value\": \"110111\"\r\n      },\r\n      {\r\n        \"label\": \"通州区\",\r\n        \"value\": \"110112\"\r\n      },\r\n      {\r\n        \"label\": \"顺义区\",\r\n        \"value\": \"110113\"\r\n      },\r\n      {\r\n        \"label\": \"昌平区\",\r\n        \"value\": \"110114\"\r\n      },\r\n      {\r\n        \"label\": \"大兴区\",\r\n        \"value\": \"110115\"\r\n      },\r\n      {\r\n        \"label\": \"怀柔区\",\r\n        \"value\": \"110116\"\r\n      },\r\n      {\r\n        \"label\": \"平谷区\",\r\n        \"value\": \"110117\"\r\n      },\r\n      {\r\n        \"label\": \"密云区\",\r\n        \"value\": \"110118\"\r\n      },\r\n      {\r\n        \"label\": \"延庆区\",\r\n        \"value\": \"110119\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"和平区\",\r\n        \"value\": \"120101\"\r\n      },\r\n      {\r\n        \"label\": \"河东区\",\r\n        \"value\": \"120102\"\r\n      },\r\n      {\r\n        \"label\": \"河西区\",\r\n        \"value\": \"120103\"\r\n      },\r\n      {\r\n        \"label\": \"南开区\",\r\n        \"value\": \"120104\"\r\n      },\r\n      {\r\n        \"label\": \"河北区\",\r\n        \"value\": \"120105\"\r\n      },\r\n      {\r\n        \"label\": \"红桥区\",\r\n        \"value\": \"120106\"\r\n      },\r\n      {\r\n        \"label\": \"东丽区\",\r\n        \"value\": \"120110\"\r\n      },\r\n      {\r\n        \"label\": \"西青区\",\r\n        \"value\": \"120111\"\r\n      },\r\n      {\r\n        \"label\": \"津南区\",\r\n        \"value\": \"120112\"\r\n      },\r\n      {\r\n        \"label\": \"北辰区\",\r\n        \"value\": \"120113\"\r\n      },\r\n      {\r\n        \"label\": \"武清区\",\r\n        \"value\": \"120114\"\r\n      },\r\n      {\r\n        \"label\": \"宝坻区\",\r\n        \"value\": \"120115\"\r\n      },\r\n      {\r\n        \"label\": \"滨海新区\",\r\n        \"value\": \"120116\"\r\n      },\r\n      {\r\n        \"label\": \"宁河区\",\r\n        \"value\": \"120117\"\r\n      },\r\n      {\r\n        \"label\": \"静海区\",\r\n        \"value\": \"120118\"\r\n      },\r\n      {\r\n        \"label\": \"蓟州区\",\r\n        \"value\": \"120119\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"长安区\",\r\n        \"value\": \"130102\"\r\n      },\r\n      {\r\n        \"label\": \"桥西区\",\r\n        \"value\": \"130104\"\r\n      },\r\n      {\r\n        \"label\": \"新华区\",\r\n        \"value\": \"130105\"\r\n      },\r\n      {\r\n        \"label\": \"井陉矿区\",\r\n        \"value\": \"130107\"\r\n      },\r\n      {\r\n        \"label\": \"裕华区\",\r\n        \"value\": \"130108\"\r\n      },\r\n      {\r\n        \"label\": \"藁城区\",\r\n        \"value\": \"130109\"\r\n      },\r\n      {\r\n        \"label\": \"鹿泉区\",\r\n        \"value\": \"130110\"\r\n      },\r\n      {\r\n        \"label\": \"栾城区\",\r\n        \"value\": \"130111\"\r\n      },\r\n      {\r\n        \"label\": \"井陉县\",\r\n        \"value\": \"130121\"\r\n      },\r\n      {\r\n        \"label\": \"正定县\",\r\n        \"value\": \"130123\"\r\n      },\r\n      {\r\n        \"label\": \"行唐县\",\r\n        \"value\": \"130125\"\r\n      },\r\n      {\r\n        \"label\": \"灵寿县\",\r\n        \"value\": \"130126\"\r\n      },\r\n      {\r\n        \"label\": \"高邑县\",\r\n        \"value\": \"130127\"\r\n      },\r\n      {\r\n        \"label\": \"深泽县\",\r\n        \"value\": \"130128\"\r\n      },\r\n      {\r\n        \"label\": \"赞皇县\",\r\n        \"value\": \"130129\"\r\n      },\r\n      {\r\n        \"label\": \"无极县\",\r\n        \"value\": \"130130\"\r\n      },\r\n      {\r\n        \"label\": \"平山县\",\r\n        \"value\": \"130131\"\r\n      },\r\n      {\r\n        \"label\": \"元氏县\",\r\n        \"value\": \"130132\"\r\n      },\r\n      {\r\n        \"label\": \"赵县\",\r\n        \"value\": \"130133\"\r\n      },\r\n      {\r\n        \"label\": \"石家庄高新技术产业开发区\",\r\n        \"value\": \"130171\"\r\n      },\r\n      {\r\n        \"label\": \"石家庄循环化工园区\",\r\n        \"value\": \"130172\"\r\n      },\r\n      {\r\n        \"label\": \"辛集市\",\r\n        \"value\": \"130181\"\r\n      },\r\n      {\r\n        \"label\": \"晋州市\",\r\n        \"value\": \"130183\"\r\n      },\r\n      {\r\n        \"label\": \"新乐市\",\r\n        \"value\": \"130184\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"路南区\",\r\n        \"value\": \"130202\"\r\n      },\r\n      {\r\n        \"label\": \"路北区\",\r\n        \"value\": \"130203\"\r\n      },\r\n      {\r\n        \"label\": \"古冶区\",\r\n        \"value\": \"130204\"\r\n      },\r\n      {\r\n        \"label\": \"开平区\",\r\n        \"value\": \"130205\"\r\n      },\r\n      {\r\n        \"label\": \"丰南区\",\r\n        \"value\": \"130207\"\r\n      },\r\n      {\r\n        \"label\": \"丰润区\",\r\n        \"value\": \"130208\"\r\n      },\r\n      {\r\n        \"label\": \"曹妃甸区\",\r\n        \"value\": \"130209\"\r\n      },\r\n      {\r\n        \"label\": \"滦县\",\r\n        \"value\": \"130223\"\r\n      },\r\n      {\r\n        \"label\": \"滦南县\",\r\n        \"value\": \"130224\"\r\n      },\r\n      {\r\n        \"label\": \"乐亭县\",\r\n        \"value\": \"130225\"\r\n      },\r\n      {\r\n        \"label\": \"迁西县\",\r\n        \"value\": \"130227\"\r\n      },\r\n      {\r\n        \"label\": \"玉田县\",\r\n        \"value\": \"130229\"\r\n      },\r\n      {\r\n        \"label\": \"唐山市芦台经济技术开发区\",\r\n        \"value\": \"130271\"\r\n      },\r\n      {\r\n        \"label\": \"唐山市汉沽管理区\",\r\n        \"value\": \"130272\"\r\n      },\r\n      {\r\n        \"label\": \"唐山高新技术产业开发区\",\r\n        \"value\": \"130273\"\r\n      },\r\n      {\r\n        \"label\": \"河北唐山海港经济开发区\",\r\n        \"value\": \"130274\"\r\n      },\r\n      {\r\n        \"label\": \"遵化市\",\r\n        \"value\": \"130281\"\r\n      },\r\n      {\r\n        \"label\": \"迁安市\",\r\n        \"value\": \"130283\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海港区\",\r\n        \"value\": \"130302\"\r\n      },\r\n      {\r\n        \"label\": \"山海关区\",\r\n        \"value\": \"130303\"\r\n      },\r\n      {\r\n        \"label\": \"北戴河区\",\r\n        \"value\": \"130304\"\r\n      },\r\n      {\r\n        \"label\": \"抚宁区\",\r\n        \"value\": \"130306\"\r\n      },\r\n      {\r\n        \"label\": \"青龙满族自治县\",\r\n        \"value\": \"130321\"\r\n      },\r\n      {\r\n        \"label\": \"昌黎县\",\r\n        \"value\": \"130322\"\r\n      },\r\n      {\r\n        \"label\": \"卢龙县\",\r\n        \"value\": \"130324\"\r\n      },\r\n      {\r\n        \"label\": \"秦皇岛市经济技术开发区\",\r\n        \"value\": \"130371\"\r\n      },\r\n      {\r\n        \"label\": \"北戴河新区\",\r\n        \"value\": \"130372\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"邯山区\",\r\n        \"value\": \"130402\"\r\n      },\r\n      {\r\n        \"label\": \"丛台区\",\r\n        \"value\": \"130403\"\r\n      },\r\n      {\r\n        \"label\": \"复兴区\",\r\n        \"value\": \"130404\"\r\n      },\r\n      {\r\n        \"label\": \"峰峰矿区\",\r\n        \"value\": \"130406\"\r\n      },\r\n      {\r\n        \"label\": \"肥乡区\",\r\n        \"value\": \"130407\"\r\n      },\r\n      {\r\n        \"label\": \"永年区\",\r\n        \"value\": \"130408\"\r\n      },\r\n      {\r\n        \"label\": \"临漳县\",\r\n        \"value\": \"130423\"\r\n      },\r\n      {\r\n        \"label\": \"成安县\",\r\n        \"value\": \"130424\"\r\n      },\r\n      {\r\n        \"label\": \"大名县\",\r\n        \"value\": \"130425\"\r\n      },\r\n      {\r\n        \"label\": \"涉县\",\r\n        \"value\": \"130426\"\r\n      },\r\n      {\r\n        \"label\": \"磁县\",\r\n        \"value\": \"130427\"\r\n      },\r\n      {\r\n        \"label\": \"邱县\",\r\n        \"value\": \"130430\"\r\n      },\r\n      {\r\n        \"label\": \"鸡泽县\",\r\n        \"value\": \"130431\"\r\n      },\r\n      {\r\n        \"label\": \"广平县\",\r\n        \"value\": \"130432\"\r\n      },\r\n      {\r\n        \"label\": \"馆陶县\",\r\n        \"value\": \"130433\"\r\n      },\r\n      {\r\n        \"label\": \"魏县\",\r\n        \"value\": \"130434\"\r\n      },\r\n      {\r\n        \"label\": \"曲周县\",\r\n        \"value\": \"130435\"\r\n      },\r\n      {\r\n        \"label\": \"邯郸经济技术开发区\",\r\n        \"value\": \"130471\"\r\n      },\r\n      {\r\n        \"label\": \"邯郸冀南新区\",\r\n        \"value\": \"130473\"\r\n      },\r\n      {\r\n        \"label\": \"武安市\",\r\n        \"value\": \"130481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"桥东区\",\r\n        \"value\": \"130502\"\r\n      },\r\n      {\r\n        \"label\": \"桥西区\",\r\n        \"value\": \"130503\"\r\n      },\r\n      {\r\n        \"label\": \"邢台县\",\r\n        \"value\": \"130521\"\r\n      },\r\n      {\r\n        \"label\": \"临城县\",\r\n        \"value\": \"130522\"\r\n      },\r\n      {\r\n        \"label\": \"内丘县\",\r\n        \"value\": \"130523\"\r\n      },\r\n      {\r\n        \"label\": \"柏乡县\",\r\n        \"value\": \"130524\"\r\n      },\r\n      {\r\n        \"label\": \"隆尧县\",\r\n        \"value\": \"130525\"\r\n      },\r\n      {\r\n        \"label\": \"任县\",\r\n        \"value\": \"130526\"\r\n      },\r\n      {\r\n        \"label\": \"南和县\",\r\n        \"value\": \"130527\"\r\n      },\r\n      {\r\n        \"label\": \"宁晋县\",\r\n        \"value\": \"130528\"\r\n      },\r\n      {\r\n        \"label\": \"巨鹿县\",\r\n        \"value\": \"130529\"\r\n      },\r\n      {\r\n        \"label\": \"新河县\",\r\n        \"value\": \"130530\"\r\n      },\r\n      {\r\n        \"label\": \"广宗县\",\r\n        \"value\": \"130531\"\r\n      },\r\n      {\r\n        \"label\": \"平乡县\",\r\n        \"value\": \"130532\"\r\n      },\r\n      {\r\n        \"label\": \"威县\",\r\n        \"value\": \"130533\"\r\n      },\r\n      {\r\n        \"label\": \"清河县\",\r\n        \"value\": \"130534\"\r\n      },\r\n      {\r\n        \"label\": \"临西县\",\r\n        \"value\": \"130535\"\r\n      },\r\n      {\r\n        \"label\": \"河北邢台经济开发区\",\r\n        \"value\": \"130571\"\r\n      },\r\n      {\r\n        \"label\": \"南宫市\",\r\n        \"value\": \"130581\"\r\n      },\r\n      {\r\n        \"label\": \"沙河市\",\r\n        \"value\": \"130582\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"竞秀区\",\r\n        \"value\": \"130602\"\r\n      },\r\n      {\r\n        \"label\": \"莲池区\",\r\n        \"value\": \"130606\"\r\n      },\r\n      {\r\n        \"label\": \"满城区\",\r\n        \"value\": \"130607\"\r\n      },\r\n      {\r\n        \"label\": \"清苑区\",\r\n        \"value\": \"130608\"\r\n      },\r\n      {\r\n        \"label\": \"徐水区\",\r\n        \"value\": \"130609\"\r\n      },\r\n      {\r\n        \"label\": \"涞水县\",\r\n        \"value\": \"130623\"\r\n      },\r\n      {\r\n        \"label\": \"阜平县\",\r\n        \"value\": \"130624\"\r\n      },\r\n      {\r\n        \"label\": \"定兴县\",\r\n        \"value\": \"130626\"\r\n      },\r\n      {\r\n        \"label\": \"唐县\",\r\n        \"value\": \"130627\"\r\n      },\r\n      {\r\n        \"label\": \"高阳县\",\r\n        \"value\": \"130628\"\r\n      },\r\n      {\r\n        \"label\": \"容城县\",\r\n        \"value\": \"130629\"\r\n      },\r\n      {\r\n        \"label\": \"涞源县\",\r\n        \"value\": \"130630\"\r\n      },\r\n      {\r\n        \"label\": \"望都县\",\r\n        \"value\": \"130631\"\r\n      },\r\n      {\r\n        \"label\": \"安新县\",\r\n        \"value\": \"130632\"\r\n      },\r\n      {\r\n        \"label\": \"易县\",\r\n        \"value\": \"130633\"\r\n      },\r\n      {\r\n        \"label\": \"曲阳县\",\r\n        \"value\": \"130634\"\r\n      },\r\n      {\r\n        \"label\": \"蠡县\",\r\n        \"value\": \"130635\"\r\n      },\r\n      {\r\n        \"label\": \"顺平县\",\r\n        \"value\": \"130636\"\r\n      },\r\n      {\r\n        \"label\": \"博野县\",\r\n        \"value\": \"130637\"\r\n      },\r\n      {\r\n        \"label\": \"雄县\",\r\n        \"value\": \"130638\"\r\n      },\r\n      {\r\n        \"label\": \"保定高新技术产业开发区\",\r\n        \"value\": \"130671\"\r\n      },\r\n      {\r\n        \"label\": \"保定白沟新城\",\r\n        \"value\": \"130672\"\r\n      },\r\n      {\r\n        \"label\": \"涿州市\",\r\n        \"value\": \"130681\"\r\n      },\r\n      {\r\n        \"label\": \"定州市\",\r\n        \"value\": \"130682\"\r\n      },\r\n      {\r\n        \"label\": \"安国市\",\r\n        \"value\": \"130683\"\r\n      },\r\n      {\r\n        \"label\": \"高碑店市\",\r\n        \"value\": \"130684\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"桥东区\",\r\n        \"value\": \"130702\"\r\n      },\r\n      {\r\n        \"label\": \"桥西区\",\r\n        \"value\": \"130703\"\r\n      },\r\n      {\r\n        \"label\": \"宣化区\",\r\n        \"value\": \"130705\"\r\n      },\r\n      {\r\n        \"label\": \"下花园区\",\r\n        \"value\": \"130706\"\r\n      },\r\n      {\r\n        \"label\": \"万全区\",\r\n        \"value\": \"130708\"\r\n      },\r\n      {\r\n        \"label\": \"崇礼区\",\r\n        \"value\": \"130709\"\r\n      },\r\n      {\r\n        \"label\": \"张北县\",\r\n        \"value\": \"130722\"\r\n      },\r\n      {\r\n        \"label\": \"康保县\",\r\n        \"value\": \"130723\"\r\n      },\r\n      {\r\n        \"label\": \"沽源县\",\r\n        \"value\": \"130724\"\r\n      },\r\n      {\r\n        \"label\": \"尚义县\",\r\n        \"value\": \"130725\"\r\n      },\r\n      {\r\n        \"label\": \"蔚县\",\r\n        \"value\": \"130726\"\r\n      },\r\n      {\r\n        \"label\": \"阳原县\",\r\n        \"value\": \"130727\"\r\n      },\r\n      {\r\n        \"label\": \"怀安县\",\r\n        \"value\": \"130728\"\r\n      },\r\n      {\r\n        \"label\": \"怀来县\",\r\n        \"value\": \"130730\"\r\n      },\r\n      {\r\n        \"label\": \"涿鹿县\",\r\n        \"value\": \"130731\"\r\n      },\r\n      {\r\n        \"label\": \"赤城县\",\r\n        \"value\": \"130732\"\r\n      },\r\n      {\r\n        \"label\": \"张家口市高新技术产业开发区\",\r\n        \"value\": \"130771\"\r\n      },\r\n      {\r\n        \"label\": \"张家口市察北管理区\",\r\n        \"value\": \"130772\"\r\n      },\r\n      {\r\n        \"label\": \"张家口市塞北管理区\",\r\n        \"value\": \"130773\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"双桥区\",\r\n        \"value\": \"130802\"\r\n      },\r\n      {\r\n        \"label\": \"双滦区\",\r\n        \"value\": \"130803\"\r\n      },\r\n      {\r\n        \"label\": \"鹰手营子矿区\",\r\n        \"value\": \"130804\"\r\n      },\r\n      {\r\n        \"label\": \"承德县\",\r\n        \"value\": \"130821\"\r\n      },\r\n      {\r\n        \"label\": \"兴隆县\",\r\n        \"value\": \"130822\"\r\n      },\r\n      {\r\n        \"label\": \"滦平县\",\r\n        \"value\": \"130824\"\r\n      },\r\n      {\r\n        \"label\": \"隆化县\",\r\n        \"value\": \"130825\"\r\n      },\r\n      {\r\n        \"label\": \"丰宁满族自治县\",\r\n        \"value\": \"130826\"\r\n      },\r\n      {\r\n        \"label\": \"宽城满族自治县\",\r\n        \"value\": \"130827\"\r\n      },\r\n      {\r\n        \"label\": \"围场满族蒙古族自治县\",\r\n        \"value\": \"130828\"\r\n      },\r\n      {\r\n        \"label\": \"承德高新技术产业开发区\",\r\n        \"value\": \"130871\"\r\n      },\r\n      {\r\n        \"label\": \"平泉市\",\r\n        \"value\": \"130881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"新华区\",\r\n        \"value\": \"130902\"\r\n      },\r\n      {\r\n        \"label\": \"运河区\",\r\n        \"value\": \"130903\"\r\n      },\r\n      {\r\n        \"label\": \"沧县\",\r\n        \"value\": \"130921\"\r\n      },\r\n      {\r\n        \"label\": \"青县\",\r\n        \"value\": \"130922\"\r\n      },\r\n      {\r\n        \"label\": \"东光县\",\r\n        \"value\": \"130923\"\r\n      },\r\n      {\r\n        \"label\": \"海兴县\",\r\n        \"value\": \"130924\"\r\n      },\r\n      {\r\n        \"label\": \"盐山县\",\r\n        \"value\": \"130925\"\r\n      },\r\n      {\r\n        \"label\": \"肃宁县\",\r\n        \"value\": \"130926\"\r\n      },\r\n      {\r\n        \"label\": \"南皮县\",\r\n        \"value\": \"130927\"\r\n      },\r\n      {\r\n        \"label\": \"吴桥县\",\r\n        \"value\": \"130928\"\r\n      },\r\n      {\r\n        \"label\": \"献县\",\r\n        \"value\": \"130929\"\r\n      },\r\n      {\r\n        \"label\": \"孟村回族自治县\",\r\n        \"value\": \"130930\"\r\n      },\r\n      {\r\n        \"label\": \"河北沧州经济开发区\",\r\n        \"value\": \"130971\"\r\n      },\r\n      {\r\n        \"label\": \"沧州高新技术产业开发区\",\r\n        \"value\": \"130972\"\r\n      },\r\n      {\r\n        \"label\": \"沧州渤海新区\",\r\n        \"value\": \"130973\"\r\n      },\r\n      {\r\n        \"label\": \"泊头市\",\r\n        \"value\": \"130981\"\r\n      },\r\n      {\r\n        \"label\": \"任丘市\",\r\n        \"value\": \"130982\"\r\n      },\r\n      {\r\n        \"label\": \"黄骅市\",\r\n        \"value\": \"130983\"\r\n      },\r\n      {\r\n        \"label\": \"河间市\",\r\n        \"value\": \"130984\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"安次区\",\r\n        \"value\": \"131002\"\r\n      },\r\n      {\r\n        \"label\": \"广阳区\",\r\n        \"value\": \"131003\"\r\n      },\r\n      {\r\n        \"label\": \"固安县\",\r\n        \"value\": \"131022\"\r\n      },\r\n      {\r\n        \"label\": \"永清县\",\r\n        \"value\": \"131023\"\r\n      },\r\n      {\r\n        \"label\": \"香河县\",\r\n        \"value\": \"131024\"\r\n      },\r\n      {\r\n        \"label\": \"大城县\",\r\n        \"value\": \"131025\"\r\n      },\r\n      {\r\n        \"label\": \"文安县\",\r\n        \"value\": \"131026\"\r\n      },\r\n      {\r\n        \"label\": \"大厂回族自治县\",\r\n        \"value\": \"131028\"\r\n      },\r\n      {\r\n        \"label\": \"廊坊经济技术开发区\",\r\n        \"value\": \"131071\"\r\n      },\r\n      {\r\n        \"label\": \"霸州市\",\r\n        \"value\": \"131081\"\r\n      },\r\n      {\r\n        \"label\": \"三河市\",\r\n        \"value\": \"131082\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"桃城区\",\r\n        \"value\": \"131102\"\r\n      },\r\n      {\r\n        \"label\": \"冀州区\",\r\n        \"value\": \"131103\"\r\n      },\r\n      {\r\n        \"label\": \"枣强县\",\r\n        \"value\": \"131121\"\r\n      },\r\n      {\r\n        \"label\": \"武邑县\",\r\n        \"value\": \"131122\"\r\n      },\r\n      {\r\n        \"label\": \"武强县\",\r\n        \"value\": \"131123\"\r\n      },\r\n      {\r\n        \"label\": \"饶阳县\",\r\n        \"value\": \"131124\"\r\n      },\r\n      {\r\n        \"label\": \"安平县\",\r\n        \"value\": \"131125\"\r\n      },\r\n      {\r\n        \"label\": \"故城县\",\r\n        \"value\": \"131126\"\r\n      },\r\n      {\r\n        \"label\": \"景县\",\r\n        \"value\": \"131127\"\r\n      },\r\n      {\r\n        \"label\": \"阜城县\",\r\n        \"value\": \"131128\"\r\n      },\r\n      {\r\n        \"label\": \"河北衡水经济开发区\",\r\n        \"value\": \"131171\"\r\n      },\r\n      {\r\n        \"label\": \"衡水滨湖新区\",\r\n        \"value\": \"131172\"\r\n      },\r\n      {\r\n        \"label\": \"深州市\",\r\n        \"value\": \"131182\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"小店区\",\r\n        \"value\": \"140105\"\r\n      },\r\n      {\r\n        \"label\": \"迎泽区\",\r\n        \"value\": \"140106\"\r\n      },\r\n      {\r\n        \"label\": \"杏花岭区\",\r\n        \"value\": \"140107\"\r\n      },\r\n      {\r\n        \"label\": \"尖草坪区\",\r\n        \"value\": \"140108\"\r\n      },\r\n      {\r\n        \"label\": \"万柏林区\",\r\n        \"value\": \"140109\"\r\n      },\r\n      {\r\n        \"label\": \"晋源区\",\r\n        \"value\": \"140110\"\r\n      },\r\n      {\r\n        \"label\": \"清徐县\",\r\n        \"value\": \"140121\"\r\n      },\r\n      {\r\n        \"label\": \"阳曲县\",\r\n        \"value\": \"140122\"\r\n      },\r\n      {\r\n        \"label\": \"娄烦县\",\r\n        \"value\": \"140123\"\r\n      },\r\n      {\r\n        \"label\": \"山西转型综合改革示范区\",\r\n        \"value\": \"140171\"\r\n      },\r\n      {\r\n        \"label\": \"古交市\",\r\n        \"value\": \"140181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城区\",\r\n        \"value\": \"140202\"\r\n      },\r\n      {\r\n        \"label\": \"矿区\",\r\n        \"value\": \"140203\"\r\n      },\r\n      {\r\n        \"label\": \"南郊区\",\r\n        \"value\": \"140211\"\r\n      },\r\n      {\r\n        \"label\": \"新荣区\",\r\n        \"value\": \"140212\"\r\n      },\r\n      {\r\n        \"label\": \"阳高县\",\r\n        \"value\": \"140221\"\r\n      },\r\n      {\r\n        \"label\": \"天镇县\",\r\n        \"value\": \"140222\"\r\n      },\r\n      {\r\n        \"label\": \"广灵县\",\r\n        \"value\": \"140223\"\r\n      },\r\n      {\r\n        \"label\": \"灵丘县\",\r\n        \"value\": \"140224\"\r\n      },\r\n      {\r\n        \"label\": \"浑源县\",\r\n        \"value\": \"140225\"\r\n      },\r\n      {\r\n        \"label\": \"左云县\",\r\n        \"value\": \"140226\"\r\n      },\r\n      {\r\n        \"label\": \"大同县\",\r\n        \"value\": \"140227\"\r\n      },\r\n      {\r\n        \"label\": \"山西大同经济开发区\",\r\n        \"value\": \"140271\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城区\",\r\n        \"value\": \"140302\"\r\n      },\r\n      {\r\n        \"label\": \"矿区\",\r\n        \"value\": \"140303\"\r\n      },\r\n      {\r\n        \"label\": \"郊区\",\r\n        \"value\": \"140311\"\r\n      },\r\n      {\r\n        \"label\": \"平定县\",\r\n        \"value\": \"140321\"\r\n      },\r\n      {\r\n        \"label\": \"盂县\",\r\n        \"value\": \"140322\"\r\n      },\r\n      {\r\n        \"label\": \"山西阳泉经济开发区\",\r\n        \"value\": \"140371\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城区\",\r\n        \"value\": \"140402\"\r\n      },\r\n      {\r\n        \"label\": \"郊区\",\r\n        \"value\": \"140411\"\r\n      },\r\n      {\r\n        \"label\": \"长治县\",\r\n        \"value\": \"140421\"\r\n      },\r\n      {\r\n        \"label\": \"襄垣县\",\r\n        \"value\": \"140423\"\r\n      },\r\n      {\r\n        \"label\": \"屯留县\",\r\n        \"value\": \"140424\"\r\n      },\r\n      {\r\n        \"label\": \"平顺县\",\r\n        \"value\": \"140425\"\r\n      },\r\n      {\r\n        \"label\": \"黎城县\",\r\n        \"value\": \"140426\"\r\n      },\r\n      {\r\n        \"label\": \"壶关县\",\r\n        \"value\": \"140427\"\r\n      },\r\n      {\r\n        \"label\": \"长子县\",\r\n        \"value\": \"140428\"\r\n      },\r\n      {\r\n        \"label\": \"武乡县\",\r\n        \"value\": \"140429\"\r\n      },\r\n      {\r\n        \"label\": \"沁县\",\r\n        \"value\": \"140430\"\r\n      },\r\n      {\r\n        \"label\": \"沁源县\",\r\n        \"value\": \"140431\"\r\n      },\r\n      {\r\n        \"label\": \"山西长治高新技术产业园区\",\r\n        \"value\": \"140471\"\r\n      },\r\n      {\r\n        \"label\": \"潞城市\",\r\n        \"value\": \"140481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城区\",\r\n        \"value\": \"140502\"\r\n      },\r\n      {\r\n        \"label\": \"沁水县\",\r\n        \"value\": \"140521\"\r\n      },\r\n      {\r\n        \"label\": \"阳城县\",\r\n        \"value\": \"140522\"\r\n      },\r\n      {\r\n        \"label\": \"陵川县\",\r\n        \"value\": \"140524\"\r\n      },\r\n      {\r\n        \"label\": \"泽州县\",\r\n        \"value\": \"140525\"\r\n      },\r\n      {\r\n        \"label\": \"高平市\",\r\n        \"value\": \"140581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"朔城区\",\r\n        \"value\": \"140602\"\r\n      },\r\n      {\r\n        \"label\": \"平鲁区\",\r\n        \"value\": \"140603\"\r\n      },\r\n      {\r\n        \"label\": \"山阴县\",\r\n        \"value\": \"140621\"\r\n      },\r\n      {\r\n        \"label\": \"应县\",\r\n        \"value\": \"140622\"\r\n      },\r\n      {\r\n        \"label\": \"右玉县\",\r\n        \"value\": \"140623\"\r\n      },\r\n      {\r\n        \"label\": \"怀仁县\",\r\n        \"value\": \"140624\"\r\n      },\r\n      {\r\n        \"label\": \"山西朔州经济开发区\",\r\n        \"value\": \"140671\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"榆次区\",\r\n        \"value\": \"140702\"\r\n      },\r\n      {\r\n        \"label\": \"榆社县\",\r\n        \"value\": \"140721\"\r\n      },\r\n      {\r\n        \"label\": \"左权县\",\r\n        \"value\": \"140722\"\r\n      },\r\n      {\r\n        \"label\": \"和顺县\",\r\n        \"value\": \"140723\"\r\n      },\r\n      {\r\n        \"label\": \"昔阳县\",\r\n        \"value\": \"140724\"\r\n      },\r\n      {\r\n        \"label\": \"寿阳县\",\r\n        \"value\": \"140725\"\r\n      },\r\n      {\r\n        \"label\": \"太谷县\",\r\n        \"value\": \"140726\"\r\n      },\r\n      {\r\n        \"label\": \"祁县\",\r\n        \"value\": \"140727\"\r\n      },\r\n      {\r\n        \"label\": \"平遥县\",\r\n        \"value\": \"140728\"\r\n      },\r\n      {\r\n        \"label\": \"灵石县\",\r\n        \"value\": \"140729\"\r\n      },\r\n      {\r\n        \"label\": \"介休市\",\r\n        \"value\": \"140781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"盐湖区\",\r\n        \"value\": \"140802\"\r\n      },\r\n      {\r\n        \"label\": \"临猗县\",\r\n        \"value\": \"140821\"\r\n      },\r\n      {\r\n        \"label\": \"万荣县\",\r\n        \"value\": \"140822\"\r\n      },\r\n      {\r\n        \"label\": \"闻喜县\",\r\n        \"value\": \"140823\"\r\n      },\r\n      {\r\n        \"label\": \"稷山县\",\r\n        \"value\": \"140824\"\r\n      },\r\n      {\r\n        \"label\": \"新绛县\",\r\n        \"value\": \"140825\"\r\n      },\r\n      {\r\n        \"label\": \"绛县\",\r\n        \"value\": \"140826\"\r\n      },\r\n      {\r\n        \"label\": \"垣曲县\",\r\n        \"value\": \"140827\"\r\n      },\r\n      {\r\n        \"label\": \"夏县\",\r\n        \"value\": \"140828\"\r\n      },\r\n      {\r\n        \"label\": \"平陆县\",\r\n        \"value\": \"140829\"\r\n      },\r\n      {\r\n        \"label\": \"芮城县\",\r\n        \"value\": \"140830\"\r\n      },\r\n      {\r\n        \"label\": \"永济市\",\r\n        \"value\": \"140881\"\r\n      },\r\n      {\r\n        \"label\": \"河津市\",\r\n        \"value\": \"140882\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"忻府区\",\r\n        \"value\": \"140902\"\r\n      },\r\n      {\r\n        \"label\": \"定襄县\",\r\n        \"value\": \"140921\"\r\n      },\r\n      {\r\n        \"label\": \"五台县\",\r\n        \"value\": \"140922\"\r\n      },\r\n      {\r\n        \"label\": \"代县\",\r\n        \"value\": \"140923\"\r\n      },\r\n      {\r\n        \"label\": \"繁峙县\",\r\n        \"value\": \"140924\"\r\n      },\r\n      {\r\n        \"label\": \"宁武县\",\r\n        \"value\": \"140925\"\r\n      },\r\n      {\r\n        \"label\": \"静乐县\",\r\n        \"value\": \"140926\"\r\n      },\r\n      {\r\n        \"label\": \"神池县\",\r\n        \"value\": \"140927\"\r\n      },\r\n      {\r\n        \"label\": \"五寨县\",\r\n        \"value\": \"140928\"\r\n      },\r\n      {\r\n        \"label\": \"岢岚县\",\r\n        \"value\": \"140929\"\r\n      },\r\n      {\r\n        \"label\": \"河曲县\",\r\n        \"value\": \"140930\"\r\n      },\r\n      {\r\n        \"label\": \"保德县\",\r\n        \"value\": \"140931\"\r\n      },\r\n      {\r\n        \"label\": \"偏关县\",\r\n        \"value\": \"140932\"\r\n      },\r\n      {\r\n        \"label\": \"五台山风景名胜区\",\r\n        \"value\": \"140971\"\r\n      },\r\n      {\r\n        \"label\": \"原平市\",\r\n        \"value\": \"140981\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"尧都区\",\r\n        \"value\": \"141002\"\r\n      },\r\n      {\r\n        \"label\": \"曲沃县\",\r\n        \"value\": \"141021\"\r\n      },\r\n      {\r\n        \"label\": \"翼城县\",\r\n        \"value\": \"141022\"\r\n      },\r\n      {\r\n        \"label\": \"襄汾县\",\r\n        \"value\": \"141023\"\r\n      },\r\n      {\r\n        \"label\": \"洪洞县\",\r\n        \"value\": \"141024\"\r\n      },\r\n      {\r\n        \"label\": \"古县\",\r\n        \"value\": \"141025\"\r\n      },\r\n      {\r\n        \"label\": \"安泽县\",\r\n        \"value\": \"141026\"\r\n      },\r\n      {\r\n        \"label\": \"浮山县\",\r\n        \"value\": \"141027\"\r\n      },\r\n      {\r\n        \"label\": \"吉县\",\r\n        \"value\": \"141028\"\r\n      },\r\n      {\r\n        \"label\": \"乡宁县\",\r\n        \"value\": \"141029\"\r\n      },\r\n      {\r\n        \"label\": \"大宁县\",\r\n        \"value\": \"141030\"\r\n      },\r\n      {\r\n        \"label\": \"隰县\",\r\n        \"value\": \"141031\"\r\n      },\r\n      {\r\n        \"label\": \"永和县\",\r\n        \"value\": \"141032\"\r\n      },\r\n      {\r\n        \"label\": \"蒲县\",\r\n        \"value\": \"141033\"\r\n      },\r\n      {\r\n        \"label\": \"汾西县\",\r\n        \"value\": \"141034\"\r\n      },\r\n      {\r\n        \"label\": \"侯马市\",\r\n        \"value\": \"141081\"\r\n      },\r\n      {\r\n        \"label\": \"霍州市\",\r\n        \"value\": \"141082\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"离石区\",\r\n        \"value\": \"141102\"\r\n      },\r\n      {\r\n        \"label\": \"文水县\",\r\n        \"value\": \"141121\"\r\n      },\r\n      {\r\n        \"label\": \"交城县\",\r\n        \"value\": \"141122\"\r\n      },\r\n      {\r\n        \"label\": \"兴县\",\r\n        \"value\": \"141123\"\r\n      },\r\n      {\r\n        \"label\": \"临县\",\r\n        \"value\": \"141124\"\r\n      },\r\n      {\r\n        \"label\": \"柳林县\",\r\n        \"value\": \"141125\"\r\n      },\r\n      {\r\n        \"label\": \"石楼县\",\r\n        \"value\": \"141126\"\r\n      },\r\n      {\r\n        \"label\": \"岚县\",\r\n        \"value\": \"141127\"\r\n      },\r\n      {\r\n        \"label\": \"方山县\",\r\n        \"value\": \"141128\"\r\n      },\r\n      {\r\n        \"label\": \"中阳县\",\r\n        \"value\": \"141129\"\r\n      },\r\n      {\r\n        \"label\": \"交口县\",\r\n        \"value\": \"141130\"\r\n      },\r\n      {\r\n        \"label\": \"孝义市\",\r\n        \"value\": \"141181\"\r\n      },\r\n      {\r\n        \"label\": \"汾阳市\",\r\n        \"value\": \"141182\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"新城区\",\r\n        \"value\": \"150102\"\r\n      },\r\n      {\r\n        \"label\": \"回民区\",\r\n        \"value\": \"150103\"\r\n      },\r\n      {\r\n        \"label\": \"玉泉区\",\r\n        \"value\": \"150104\"\r\n      },\r\n      {\r\n        \"label\": \"赛罕区\",\r\n        \"value\": \"150105\"\r\n      },\r\n      {\r\n        \"label\": \"土默特左旗\",\r\n        \"value\": \"150121\"\r\n      },\r\n      {\r\n        \"label\": \"托克托县\",\r\n        \"value\": \"150122\"\r\n      },\r\n      {\r\n        \"label\": \"和林格尔县\",\r\n        \"value\": \"150123\"\r\n      },\r\n      {\r\n        \"label\": \"清水河县\",\r\n        \"value\": \"150124\"\r\n      },\r\n      {\r\n        \"label\": \"武川县\",\r\n        \"value\": \"150125\"\r\n      },\r\n      {\r\n        \"label\": \"呼和浩特金海工业园区\",\r\n        \"value\": \"150171\"\r\n      },\r\n      {\r\n        \"label\": \"呼和浩特经济技术开发区\",\r\n        \"value\": \"150172\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东河区\",\r\n        \"value\": \"150202\"\r\n      },\r\n      {\r\n        \"label\": \"昆都仑区\",\r\n        \"value\": \"150203\"\r\n      },\r\n      {\r\n        \"label\": \"青山区\",\r\n        \"value\": \"150204\"\r\n      },\r\n      {\r\n        \"label\": \"石拐区\",\r\n        \"value\": \"150205\"\r\n      },\r\n      {\r\n        \"label\": \"白云鄂博矿区\",\r\n        \"value\": \"150206\"\r\n      },\r\n      {\r\n        \"label\": \"九原区\",\r\n        \"value\": \"150207\"\r\n      },\r\n      {\r\n        \"label\": \"土默特右旗\",\r\n        \"value\": \"150221\"\r\n      },\r\n      {\r\n        \"label\": \"固阳县\",\r\n        \"value\": \"150222\"\r\n      },\r\n      {\r\n        \"label\": \"达尔罕茂明安联合旗\",\r\n        \"value\": \"150223\"\r\n      },\r\n      {\r\n        \"label\": \"包头稀土高新技术产业开发区\",\r\n        \"value\": \"150271\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海勃湾区\",\r\n        \"value\": \"150302\"\r\n      },\r\n      {\r\n        \"label\": \"海南区\",\r\n        \"value\": \"150303\"\r\n      },\r\n      {\r\n        \"label\": \"乌达区\",\r\n        \"value\": \"150304\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"红山区\",\r\n        \"value\": \"150402\"\r\n      },\r\n      {\r\n        \"label\": \"元宝山区\",\r\n        \"value\": \"150403\"\r\n      },\r\n      {\r\n        \"label\": \"松山区\",\r\n        \"value\": \"150404\"\r\n      },\r\n      {\r\n        \"label\": \"阿鲁科尔沁旗\",\r\n        \"value\": \"150421\"\r\n      },\r\n      {\r\n        \"label\": \"巴林左旗\",\r\n        \"value\": \"150422\"\r\n      },\r\n      {\r\n        \"label\": \"巴林右旗\",\r\n        \"value\": \"150423\"\r\n      },\r\n      {\r\n        \"label\": \"林西县\",\r\n        \"value\": \"150424\"\r\n      },\r\n      {\r\n        \"label\": \"克什克腾旗\",\r\n        \"value\": \"150425\"\r\n      },\r\n      {\r\n        \"label\": \"翁牛特旗\",\r\n        \"value\": \"150426\"\r\n      },\r\n      {\r\n        \"label\": \"喀喇沁旗\",\r\n        \"value\": \"150428\"\r\n      },\r\n      {\r\n        \"label\": \"宁城县\",\r\n        \"value\": \"150429\"\r\n      },\r\n      {\r\n        \"label\": \"敖汉旗\",\r\n        \"value\": \"150430\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"科尔沁区\",\r\n        \"value\": \"150502\"\r\n      },\r\n      {\r\n        \"label\": \"科尔沁左翼中旗\",\r\n        \"value\": \"150521\"\r\n      },\r\n      {\r\n        \"label\": \"科尔沁左翼后旗\",\r\n        \"value\": \"150522\"\r\n      },\r\n      {\r\n        \"label\": \"开鲁县\",\r\n        \"value\": \"150523\"\r\n      },\r\n      {\r\n        \"label\": \"库伦旗\",\r\n        \"value\": \"150524\"\r\n      },\r\n      {\r\n        \"label\": \"奈曼旗\",\r\n        \"value\": \"150525\"\r\n      },\r\n      {\r\n        \"label\": \"扎鲁特旗\",\r\n        \"value\": \"150526\"\r\n      },\r\n      {\r\n        \"label\": \"通辽经济技术开发区\",\r\n        \"value\": \"150571\"\r\n      },\r\n      {\r\n        \"label\": \"霍林郭勒市\",\r\n        \"value\": \"150581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东胜区\",\r\n        \"value\": \"150602\"\r\n      },\r\n      {\r\n        \"label\": \"康巴什区\",\r\n        \"value\": \"150603\"\r\n      },\r\n      {\r\n        \"label\": \"达拉特旗\",\r\n        \"value\": \"150621\"\r\n      },\r\n      {\r\n        \"label\": \"准格尔旗\",\r\n        \"value\": \"150622\"\r\n      },\r\n      {\r\n        \"label\": \"鄂托克前旗\",\r\n        \"value\": \"150623\"\r\n      },\r\n      {\r\n        \"label\": \"鄂托克旗\",\r\n        \"value\": \"150624\"\r\n      },\r\n      {\r\n        \"label\": \"杭锦旗\",\r\n        \"value\": \"150625\"\r\n      },\r\n      {\r\n        \"label\": \"乌审旗\",\r\n        \"value\": \"150626\"\r\n      },\r\n      {\r\n        \"label\": \"伊金霍洛旗\",\r\n        \"value\": \"150627\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海拉尔区\",\r\n        \"value\": \"150702\"\r\n      },\r\n      {\r\n        \"label\": \"扎赉诺尔区\",\r\n        \"value\": \"150703\"\r\n      },\r\n      {\r\n        \"label\": \"阿荣旗\",\r\n        \"value\": \"150721\"\r\n      },\r\n      {\r\n        \"label\": \"莫力达瓦达斡尔族自治旗\",\r\n        \"value\": \"150722\"\r\n      },\r\n      {\r\n        \"label\": \"鄂伦春自治旗\",\r\n        \"value\": \"150723\"\r\n      },\r\n      {\r\n        \"label\": \"鄂温克族自治旗\",\r\n        \"value\": \"150724\"\r\n      },\r\n      {\r\n        \"label\": \"陈巴尔虎旗\",\r\n        \"value\": \"150725\"\r\n      },\r\n      {\r\n        \"label\": \"新巴尔虎左旗\",\r\n        \"value\": \"150726\"\r\n      },\r\n      {\r\n        \"label\": \"新巴尔虎右旗\",\r\n        \"value\": \"150727\"\r\n      },\r\n      {\r\n        \"label\": \"满洲里市\",\r\n        \"value\": \"150781\"\r\n      },\r\n      {\r\n        \"label\": \"牙克石市\",\r\n        \"value\": \"150782\"\r\n      },\r\n      {\r\n        \"label\": \"扎兰屯市\",\r\n        \"value\": \"150783\"\r\n      },\r\n      {\r\n        \"label\": \"额尔古纳市\",\r\n        \"value\": \"150784\"\r\n      },\r\n      {\r\n        \"label\": \"根河市\",\r\n        \"value\": \"150785\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"临河区\",\r\n        \"value\": \"150802\"\r\n      },\r\n      {\r\n        \"label\": \"五原县\",\r\n        \"value\": \"150821\"\r\n      },\r\n      {\r\n        \"label\": \"磴口县\",\r\n        \"value\": \"150822\"\r\n      },\r\n      {\r\n        \"label\": \"乌拉特前旗\",\r\n        \"value\": \"150823\"\r\n      },\r\n      {\r\n        \"label\": \"乌拉特中旗\",\r\n        \"value\": \"150824\"\r\n      },\r\n      {\r\n        \"label\": \"乌拉特后旗\",\r\n        \"value\": \"150825\"\r\n      },\r\n      {\r\n        \"label\": \"杭锦后旗\",\r\n        \"value\": \"150826\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"集宁区\",\r\n        \"value\": \"150902\"\r\n      },\r\n      {\r\n        \"label\": \"卓资县\",\r\n        \"value\": \"150921\"\r\n      },\r\n      {\r\n        \"label\": \"化德县\",\r\n        \"value\": \"150922\"\r\n      },\r\n      {\r\n        \"label\": \"商都县\",\r\n        \"value\": \"150923\"\r\n      },\r\n      {\r\n        \"label\": \"兴和县\",\r\n        \"value\": \"150924\"\r\n      },\r\n      {\r\n        \"label\": \"凉城县\",\r\n        \"value\": \"150925\"\r\n      },\r\n      {\r\n        \"label\": \"察哈尔右翼前旗\",\r\n        \"value\": \"150926\"\r\n      },\r\n      {\r\n        \"label\": \"察哈尔右翼中旗\",\r\n        \"value\": \"150927\"\r\n      },\r\n      {\r\n        \"label\": \"察哈尔右翼后旗\",\r\n        \"value\": \"150928\"\r\n      },\r\n      {\r\n        \"label\": \"四子王旗\",\r\n        \"value\": \"150929\"\r\n      },\r\n      {\r\n        \"label\": \"丰镇市\",\r\n        \"value\": \"150981\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"乌兰浩特市\",\r\n        \"value\": \"152201\"\r\n      },\r\n      {\r\n        \"label\": \"阿尔山市\",\r\n        \"value\": \"152202\"\r\n      },\r\n      {\r\n        \"label\": \"科尔沁右翼前旗\",\r\n        \"value\": \"152221\"\r\n      },\r\n      {\r\n        \"label\": \"科尔沁右翼中旗\",\r\n        \"value\": \"152222\"\r\n      },\r\n      {\r\n        \"label\": \"扎赉特旗\",\r\n        \"value\": \"152223\"\r\n      },\r\n      {\r\n        \"label\": \"突泉县\",\r\n        \"value\": \"152224\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"二连浩特市\",\r\n        \"value\": \"152501\"\r\n      },\r\n      {\r\n        \"label\": \"锡林浩特市\",\r\n        \"value\": \"152502\"\r\n      },\r\n      {\r\n        \"label\": \"阿巴嘎旗\",\r\n        \"value\": \"152522\"\r\n      },\r\n      {\r\n        \"label\": \"苏尼特左旗\",\r\n        \"value\": \"152523\"\r\n      },\r\n      {\r\n        \"label\": \"苏尼特右旗\",\r\n        \"value\": \"152524\"\r\n      },\r\n      {\r\n        \"label\": \"东乌珠穆沁旗\",\r\n        \"value\": \"152525\"\r\n      },\r\n      {\r\n        \"label\": \"西乌珠穆沁旗\",\r\n        \"value\": \"152526\"\r\n      },\r\n      {\r\n        \"label\": \"太仆寺旗\",\r\n        \"value\": \"152527\"\r\n      },\r\n      {\r\n        \"label\": \"镶黄旗\",\r\n        \"value\": \"152528\"\r\n      },\r\n      {\r\n        \"label\": \"正镶白旗\",\r\n        \"value\": \"152529\"\r\n      },\r\n      {\r\n        \"label\": \"正蓝旗\",\r\n        \"value\": \"152530\"\r\n      },\r\n      {\r\n        \"label\": \"多伦县\",\r\n        \"value\": \"152531\"\r\n      },\r\n      {\r\n        \"label\": \"乌拉盖管委会\",\r\n        \"value\": \"152571\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"阿拉善左旗\",\r\n        \"value\": \"152921\"\r\n      },\r\n      {\r\n        \"label\": \"阿拉善右旗\",\r\n        \"value\": \"152922\"\r\n      },\r\n      {\r\n        \"label\": \"额济纳旗\",\r\n        \"value\": \"152923\"\r\n      },\r\n      {\r\n        \"label\": \"内蒙古阿拉善经济开发区\",\r\n        \"value\": \"152971\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"和平区\",\r\n        \"value\": \"210102\"\r\n      },\r\n      {\r\n        \"label\": \"沈河区\",\r\n        \"value\": \"210103\"\r\n      },\r\n      {\r\n        \"label\": \"大东区\",\r\n        \"value\": \"210104\"\r\n      },\r\n      {\r\n        \"label\": \"皇姑区\",\r\n        \"value\": \"210105\"\r\n      },\r\n      {\r\n        \"label\": \"铁西区\",\r\n        \"value\": \"210106\"\r\n      },\r\n      {\r\n        \"label\": \"苏家屯区\",\r\n        \"value\": \"210111\"\r\n      },\r\n      {\r\n        \"label\": \"浑南区\",\r\n        \"value\": \"210112\"\r\n      },\r\n      {\r\n        \"label\": \"沈北新区\",\r\n        \"value\": \"210113\"\r\n      },\r\n      {\r\n        \"label\": \"于洪区\",\r\n        \"value\": \"210114\"\r\n      },\r\n      {\r\n        \"label\": \"辽中区\",\r\n        \"value\": \"210115\"\r\n      },\r\n      {\r\n        \"label\": \"康平县\",\r\n        \"value\": \"210123\"\r\n      },\r\n      {\r\n        \"label\": \"法库县\",\r\n        \"value\": \"210124\"\r\n      },\r\n      {\r\n        \"label\": \"新民市\",\r\n        \"value\": \"210181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"中山区\",\r\n        \"value\": \"210202\"\r\n      },\r\n      {\r\n        \"label\": \"西岗区\",\r\n        \"value\": \"210203\"\r\n      },\r\n      {\r\n        \"label\": \"沙河口区\",\r\n        \"value\": \"210204\"\r\n      },\r\n      {\r\n        \"label\": \"甘井子区\",\r\n        \"value\": \"210211\"\r\n      },\r\n      {\r\n        \"label\": \"旅顺口区\",\r\n        \"value\": \"210212\"\r\n      },\r\n      {\r\n        \"label\": \"金州区\",\r\n        \"value\": \"210213\"\r\n      },\r\n      {\r\n        \"label\": \"普兰店区\",\r\n        \"value\": \"210214\"\r\n      },\r\n      {\r\n        \"label\": \"长海县\",\r\n        \"value\": \"210224\"\r\n      },\r\n      {\r\n        \"label\": \"瓦房店市\",\r\n        \"value\": \"210281\"\r\n      },\r\n      {\r\n        \"label\": \"庄河市\",\r\n        \"value\": \"210283\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"铁东区\",\r\n        \"value\": \"210302\"\r\n      },\r\n      {\r\n        \"label\": \"铁西区\",\r\n        \"value\": \"210303\"\r\n      },\r\n      {\r\n        \"label\": \"立山区\",\r\n        \"value\": \"210304\"\r\n      },\r\n      {\r\n        \"label\": \"千山区\",\r\n        \"value\": \"210311\"\r\n      },\r\n      {\r\n        \"label\": \"台安县\",\r\n        \"value\": \"210321\"\r\n      },\r\n      {\r\n        \"label\": \"岫岩满族自治县\",\r\n        \"value\": \"210323\"\r\n      },\r\n      {\r\n        \"label\": \"海城市\",\r\n        \"value\": \"210381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"新抚区\",\r\n        \"value\": \"210402\"\r\n      },\r\n      {\r\n        \"label\": \"东洲区\",\r\n        \"value\": \"210403\"\r\n      },\r\n      {\r\n        \"label\": \"望花区\",\r\n        \"value\": \"210404\"\r\n      },\r\n      {\r\n        \"label\": \"顺城区\",\r\n        \"value\": \"210411\"\r\n      },\r\n      {\r\n        \"label\": \"抚顺县\",\r\n        \"value\": \"210421\"\r\n      },\r\n      {\r\n        \"label\": \"新宾满族自治县\",\r\n        \"value\": \"210422\"\r\n      },\r\n      {\r\n        \"label\": \"清原满族自治县\",\r\n        \"value\": \"210423\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"平山区\",\r\n        \"value\": \"210502\"\r\n      },\r\n      {\r\n        \"label\": \"溪湖区\",\r\n        \"value\": \"210503\"\r\n      },\r\n      {\r\n        \"label\": \"明山区\",\r\n        \"value\": \"210504\"\r\n      },\r\n      {\r\n        \"label\": \"南芬区\",\r\n        \"value\": \"210505\"\r\n      },\r\n      {\r\n        \"label\": \"本溪满族自治县\",\r\n        \"value\": \"210521\"\r\n      },\r\n      {\r\n        \"label\": \"桓仁满族自治县\",\r\n        \"value\": \"210522\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"元宝区\",\r\n        \"value\": \"210602\"\r\n      },\r\n      {\r\n        \"label\": \"振兴区\",\r\n        \"value\": \"210603\"\r\n      },\r\n      {\r\n        \"label\": \"振安区\",\r\n        \"value\": \"210604\"\r\n      },\r\n      {\r\n        \"label\": \"宽甸满族自治县\",\r\n        \"value\": \"210624\"\r\n      },\r\n      {\r\n        \"label\": \"东港市\",\r\n        \"value\": \"210681\"\r\n      },\r\n      {\r\n        \"label\": \"凤城市\",\r\n        \"value\": \"210682\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"古塔区\",\r\n        \"value\": \"210702\"\r\n      },\r\n      {\r\n        \"label\": \"凌河区\",\r\n        \"value\": \"210703\"\r\n      },\r\n      {\r\n        \"label\": \"太和区\",\r\n        \"value\": \"210711\"\r\n      },\r\n      {\r\n        \"label\": \"黑山县\",\r\n        \"value\": \"210726\"\r\n      },\r\n      {\r\n        \"label\": \"义县\",\r\n        \"value\": \"210727\"\r\n      },\r\n      {\r\n        \"label\": \"凌海市\",\r\n        \"value\": \"210781\"\r\n      },\r\n      {\r\n        \"label\": \"北镇市\",\r\n        \"value\": \"210782\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"站前区\",\r\n        \"value\": \"210802\"\r\n      },\r\n      {\r\n        \"label\": \"西市区\",\r\n        \"value\": \"210803\"\r\n      },\r\n      {\r\n        \"label\": \"鲅鱼圈区\",\r\n        \"value\": \"210804\"\r\n      },\r\n      {\r\n        \"label\": \"老边区\",\r\n        \"value\": \"210811\"\r\n      },\r\n      {\r\n        \"label\": \"盖州市\",\r\n        \"value\": \"210881\"\r\n      },\r\n      {\r\n        \"label\": \"大石桥市\",\r\n        \"value\": \"210882\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海州区\",\r\n        \"value\": \"210902\"\r\n      },\r\n      {\r\n        \"label\": \"新邱区\",\r\n        \"value\": \"210903\"\r\n      },\r\n      {\r\n        \"label\": \"太平区\",\r\n        \"value\": \"210904\"\r\n      },\r\n      {\r\n        \"label\": \"清河门区\",\r\n        \"value\": \"210905\"\r\n      },\r\n      {\r\n        \"label\": \"细河区\",\r\n        \"value\": \"210911\"\r\n      },\r\n      {\r\n        \"label\": \"阜新蒙古族自治县\",\r\n        \"value\": \"210921\"\r\n      },\r\n      {\r\n        \"label\": \"彰武县\",\r\n        \"value\": \"210922\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"白塔区\",\r\n        \"value\": \"211002\"\r\n      },\r\n      {\r\n        \"label\": \"文圣区\",\r\n        \"value\": \"211003\"\r\n      },\r\n      {\r\n        \"label\": \"宏伟区\",\r\n        \"value\": \"211004\"\r\n      },\r\n      {\r\n        \"label\": \"弓长岭区\",\r\n        \"value\": \"211005\"\r\n      },\r\n      {\r\n        \"label\": \"太子河区\",\r\n        \"value\": \"211011\"\r\n      },\r\n      {\r\n        \"label\": \"辽阳县\",\r\n        \"value\": \"211021\"\r\n      },\r\n      {\r\n        \"label\": \"灯塔市\",\r\n        \"value\": \"211081\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"双台子区\",\r\n        \"value\": \"211102\"\r\n      },\r\n      {\r\n        \"label\": \"兴隆台区\",\r\n        \"value\": \"211103\"\r\n      },\r\n      {\r\n        \"label\": \"大洼区\",\r\n        \"value\": \"211104\"\r\n      },\r\n      {\r\n        \"label\": \"盘山县\",\r\n        \"value\": \"211122\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"银州区\",\r\n        \"value\": \"211202\"\r\n      },\r\n      {\r\n        \"label\": \"清河区\",\r\n        \"value\": \"211204\"\r\n      },\r\n      {\r\n        \"label\": \"铁岭县\",\r\n        \"value\": \"211221\"\r\n      },\r\n      {\r\n        \"label\": \"西丰县\",\r\n        \"value\": \"211223\"\r\n      },\r\n      {\r\n        \"label\": \"昌图县\",\r\n        \"value\": \"211224\"\r\n      },\r\n      {\r\n        \"label\": \"调兵山市\",\r\n        \"value\": \"211281\"\r\n      },\r\n      {\r\n        \"label\": \"开原市\",\r\n        \"value\": \"211282\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"双塔区\",\r\n        \"value\": \"211302\"\r\n      },\r\n      {\r\n        \"label\": \"龙城区\",\r\n        \"value\": \"211303\"\r\n      },\r\n      {\r\n        \"label\": \"朝阳县\",\r\n        \"value\": \"211321\"\r\n      },\r\n      {\r\n        \"label\": \"建平县\",\r\n        \"value\": \"211322\"\r\n      },\r\n      {\r\n        \"label\": \"喀喇沁左翼蒙古族自治县\",\r\n        \"value\": \"211324\"\r\n      },\r\n      {\r\n        \"label\": \"北票市\",\r\n        \"value\": \"211381\"\r\n      },\r\n      {\r\n        \"label\": \"凌源市\",\r\n        \"value\": \"211382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"连山区\",\r\n        \"value\": \"211402\"\r\n      },\r\n      {\r\n        \"label\": \"龙港区\",\r\n        \"value\": \"211403\"\r\n      },\r\n      {\r\n        \"label\": \"南票区\",\r\n        \"value\": \"211404\"\r\n      },\r\n      {\r\n        \"label\": \"绥中县\",\r\n        \"value\": \"211421\"\r\n      },\r\n      {\r\n        \"label\": \"建昌县\",\r\n        \"value\": \"211422\"\r\n      },\r\n      {\r\n        \"label\": \"兴城市\",\r\n        \"value\": \"211481\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"南关区\",\r\n        \"value\": \"220102\"\r\n      },\r\n      {\r\n        \"label\": \"宽城区\",\r\n        \"value\": \"220103\"\r\n      },\r\n      {\r\n        \"label\": \"朝阳区\",\r\n        \"value\": \"220104\"\r\n      },\r\n      {\r\n        \"label\": \"二道区\",\r\n        \"value\": \"220105\"\r\n      },\r\n      {\r\n        \"label\": \"绿园区\",\r\n        \"value\": \"220106\"\r\n      },\r\n      {\r\n        \"label\": \"双阳区\",\r\n        \"value\": \"220112\"\r\n      },\r\n      {\r\n        \"label\": \"九台区\",\r\n        \"value\": \"220113\"\r\n      },\r\n      {\r\n        \"label\": \"农安县\",\r\n        \"value\": \"220122\"\r\n      },\r\n      {\r\n        \"label\": \"长春经济技术开发区\",\r\n        \"value\": \"220171\"\r\n      },\r\n      {\r\n        \"label\": \"长春净月高新技术产业开发区\",\r\n        \"value\": \"220172\"\r\n      },\r\n      {\r\n        \"label\": \"长春高新技术产业开发区\",\r\n        \"value\": \"220173\"\r\n      },\r\n      {\r\n        \"label\": \"长春汽车经济技术开发区\",\r\n        \"value\": \"220174\"\r\n      },\r\n      {\r\n        \"label\": \"榆树市\",\r\n        \"value\": \"220182\"\r\n      },\r\n      {\r\n        \"label\": \"德惠市\",\r\n        \"value\": \"220183\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"昌邑区\",\r\n        \"value\": \"220202\"\r\n      },\r\n      {\r\n        \"label\": \"龙潭区\",\r\n        \"value\": \"220203\"\r\n      },\r\n      {\r\n        \"label\": \"船营区\",\r\n        \"value\": \"220204\"\r\n      },\r\n      {\r\n        \"label\": \"丰满区\",\r\n        \"value\": \"220211\"\r\n      },\r\n      {\r\n        \"label\": \"永吉县\",\r\n        \"value\": \"220221\"\r\n      },\r\n      {\r\n        \"label\": \"吉林经济开发区\",\r\n        \"value\": \"220271\"\r\n      },\r\n      {\r\n        \"label\": \"吉林高新技术产业开发区\",\r\n        \"value\": \"220272\"\r\n      },\r\n      {\r\n        \"label\": \"吉林中国新加坡食品区\",\r\n        \"value\": \"220273\"\r\n      },\r\n      {\r\n        \"label\": \"蛟河市\",\r\n        \"value\": \"220281\"\r\n      },\r\n      {\r\n        \"label\": \"桦甸市\",\r\n        \"value\": \"220282\"\r\n      },\r\n      {\r\n        \"label\": \"舒兰市\",\r\n        \"value\": \"220283\"\r\n      },\r\n      {\r\n        \"label\": \"磐石市\",\r\n        \"value\": \"220284\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"铁西区\",\r\n        \"value\": \"220302\"\r\n      },\r\n      {\r\n        \"label\": \"铁东区\",\r\n        \"value\": \"220303\"\r\n      },\r\n      {\r\n        \"label\": \"梨树县\",\r\n        \"value\": \"220322\"\r\n      },\r\n      {\r\n        \"label\": \"伊通满族自治县\",\r\n        \"value\": \"220323\"\r\n      },\r\n      {\r\n        \"label\": \"公主岭市\",\r\n        \"value\": \"220381\"\r\n      },\r\n      {\r\n        \"label\": \"双辽市\",\r\n        \"value\": \"220382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"龙山区\",\r\n        \"value\": \"220402\"\r\n      },\r\n      {\r\n        \"label\": \"西安区\",\r\n        \"value\": \"220403\"\r\n      },\r\n      {\r\n        \"label\": \"东丰县\",\r\n        \"value\": \"220421\"\r\n      },\r\n      {\r\n        \"label\": \"东辽县\",\r\n        \"value\": \"220422\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东昌区\",\r\n        \"value\": \"220502\"\r\n      },\r\n      {\r\n        \"label\": \"二道江区\",\r\n        \"value\": \"220503\"\r\n      },\r\n      {\r\n        \"label\": \"通化县\",\r\n        \"value\": \"220521\"\r\n      },\r\n      {\r\n        \"label\": \"辉南县\",\r\n        \"value\": \"220523\"\r\n      },\r\n      {\r\n        \"label\": \"柳河县\",\r\n        \"value\": \"220524\"\r\n      },\r\n      {\r\n        \"label\": \"梅河口市\",\r\n        \"value\": \"220581\"\r\n      },\r\n      {\r\n        \"label\": \"集安市\",\r\n        \"value\": \"220582\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"浑江区\",\r\n        \"value\": \"220602\"\r\n      },\r\n      {\r\n        \"label\": \"江源区\",\r\n        \"value\": \"220605\"\r\n      },\r\n      {\r\n        \"label\": \"抚松县\",\r\n        \"value\": \"220621\"\r\n      },\r\n      {\r\n        \"label\": \"靖宇县\",\r\n        \"value\": \"220622\"\r\n      },\r\n      {\r\n        \"label\": \"长白朝鲜族自治县\",\r\n        \"value\": \"220623\"\r\n      },\r\n      {\r\n        \"label\": \"临江市\",\r\n        \"value\": \"220681\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"宁江区\",\r\n        \"value\": \"220702\"\r\n      },\r\n      {\r\n        \"label\": \"前郭尔罗斯蒙古族自治县\",\r\n        \"value\": \"220721\"\r\n      },\r\n      {\r\n        \"label\": \"长岭县\",\r\n        \"value\": \"220722\"\r\n      },\r\n      {\r\n        \"label\": \"乾安县\",\r\n        \"value\": \"220723\"\r\n      },\r\n      {\r\n        \"label\": \"吉林松原经济开发区\",\r\n        \"value\": \"220771\"\r\n      },\r\n      {\r\n        \"label\": \"扶余市\",\r\n        \"value\": \"220781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"洮北区\",\r\n        \"value\": \"220802\"\r\n      },\r\n      {\r\n        \"label\": \"镇赉县\",\r\n        \"value\": \"220821\"\r\n      },\r\n      {\r\n        \"label\": \"通榆县\",\r\n        \"value\": \"220822\"\r\n      },\r\n      {\r\n        \"label\": \"吉林白城经济开发区\",\r\n        \"value\": \"220871\"\r\n      },\r\n      {\r\n        \"label\": \"洮南市\",\r\n        \"value\": \"220881\"\r\n      },\r\n      {\r\n        \"label\": \"大安市\",\r\n        \"value\": \"220882\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"延吉市\",\r\n        \"value\": \"222401\"\r\n      },\r\n      {\r\n        \"label\": \"图们市\",\r\n        \"value\": \"222402\"\r\n      },\r\n      {\r\n        \"label\": \"敦化市\",\r\n        \"value\": \"222403\"\r\n      },\r\n      {\r\n        \"label\": \"珲春市\",\r\n        \"value\": \"222404\"\r\n      },\r\n      {\r\n        \"label\": \"龙井市\",\r\n        \"value\": \"222405\"\r\n      },\r\n      {\r\n        \"label\": \"和龙市\",\r\n        \"value\": \"222406\"\r\n      },\r\n      {\r\n        \"label\": \"汪清县\",\r\n        \"value\": \"222424\"\r\n      },\r\n      {\r\n        \"label\": \"安图县\",\r\n        \"value\": \"222426\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"道里区\",\r\n        \"value\": \"230102\"\r\n      },\r\n      {\r\n        \"label\": \"南岗区\",\r\n        \"value\": \"230103\"\r\n      },\r\n      {\r\n        \"label\": \"道外区\",\r\n        \"value\": \"230104\"\r\n      },\r\n      {\r\n        \"label\": \"平房区\",\r\n        \"value\": \"230108\"\r\n      },\r\n      {\r\n        \"label\": \"松北区\",\r\n        \"value\": \"230109\"\r\n      },\r\n      {\r\n        \"label\": \"香坊区\",\r\n        \"value\": \"230110\"\r\n      },\r\n      {\r\n        \"label\": \"呼兰区\",\r\n        \"value\": \"230111\"\r\n      },\r\n      {\r\n        \"label\": \"阿城区\",\r\n        \"value\": \"230112\"\r\n      },\r\n      {\r\n        \"label\": \"双城区\",\r\n        \"value\": \"230113\"\r\n      },\r\n      {\r\n        \"label\": \"依兰县\",\r\n        \"value\": \"230123\"\r\n      },\r\n      {\r\n        \"label\": \"方正县\",\r\n        \"value\": \"230124\"\r\n      },\r\n      {\r\n        \"label\": \"宾县\",\r\n        \"value\": \"230125\"\r\n      },\r\n      {\r\n        \"label\": \"巴彦县\",\r\n        \"value\": \"230126\"\r\n      },\r\n      {\r\n        \"label\": \"木兰县\",\r\n        \"value\": \"230127\"\r\n      },\r\n      {\r\n        \"label\": \"通河县\",\r\n        \"value\": \"230128\"\r\n      },\r\n      {\r\n        \"label\": \"延寿县\",\r\n        \"value\": \"230129\"\r\n      },\r\n      {\r\n        \"label\": \"尚志市\",\r\n        \"value\": \"230183\"\r\n      },\r\n      {\r\n        \"label\": \"五常市\",\r\n        \"value\": \"230184\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"龙沙区\",\r\n        \"value\": \"230202\"\r\n      },\r\n      {\r\n        \"label\": \"建华区\",\r\n        \"value\": \"230203\"\r\n      },\r\n      {\r\n        \"label\": \"铁锋区\",\r\n        \"value\": \"230204\"\r\n      },\r\n      {\r\n        \"label\": \"昂昂溪区\",\r\n        \"value\": \"230205\"\r\n      },\r\n      {\r\n        \"label\": \"富拉尔基区\",\r\n        \"value\": \"230206\"\r\n      },\r\n      {\r\n        \"label\": \"碾子山区\",\r\n        \"value\": \"230207\"\r\n      },\r\n      {\r\n        \"label\": \"梅里斯达斡尔族区\",\r\n        \"value\": \"230208\"\r\n      },\r\n      {\r\n        \"label\": \"龙江县\",\r\n        \"value\": \"230221\"\r\n      },\r\n      {\r\n        \"label\": \"依安县\",\r\n        \"value\": \"230223\"\r\n      },\r\n      {\r\n        \"label\": \"泰来县\",\r\n        \"value\": \"230224\"\r\n      },\r\n      {\r\n        \"label\": \"甘南县\",\r\n        \"value\": \"230225\"\r\n      },\r\n      {\r\n        \"label\": \"富裕县\",\r\n        \"value\": \"230227\"\r\n      },\r\n      {\r\n        \"label\": \"克山县\",\r\n        \"value\": \"230229\"\r\n      },\r\n      {\r\n        \"label\": \"克东县\",\r\n        \"value\": \"230230\"\r\n      },\r\n      {\r\n        \"label\": \"拜泉县\",\r\n        \"value\": \"230231\"\r\n      },\r\n      {\r\n        \"label\": \"讷河市\",\r\n        \"value\": \"230281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"鸡冠区\",\r\n        \"value\": \"230302\"\r\n      },\r\n      {\r\n        \"label\": \"恒山区\",\r\n        \"value\": \"230303\"\r\n      },\r\n      {\r\n        \"label\": \"滴道区\",\r\n        \"value\": \"230304\"\r\n      },\r\n      {\r\n        \"label\": \"梨树区\",\r\n        \"value\": \"230305\"\r\n      },\r\n      {\r\n        \"label\": \"城子河区\",\r\n        \"value\": \"230306\"\r\n      },\r\n      {\r\n        \"label\": \"麻山区\",\r\n        \"value\": \"230307\"\r\n      },\r\n      {\r\n        \"label\": \"鸡东县\",\r\n        \"value\": \"230321\"\r\n      },\r\n      {\r\n        \"label\": \"虎林市\",\r\n        \"value\": \"230381\"\r\n      },\r\n      {\r\n        \"label\": \"密山市\",\r\n        \"value\": \"230382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"向阳区\",\r\n        \"value\": \"230402\"\r\n      },\r\n      {\r\n        \"label\": \"工农区\",\r\n        \"value\": \"230403\"\r\n      },\r\n      {\r\n        \"label\": \"南山区\",\r\n        \"value\": \"230404\"\r\n      },\r\n      {\r\n        \"label\": \"兴安区\",\r\n        \"value\": \"230405\"\r\n      },\r\n      {\r\n        \"label\": \"东山区\",\r\n        \"value\": \"230406\"\r\n      },\r\n      {\r\n        \"label\": \"兴山区\",\r\n        \"value\": \"230407\"\r\n      },\r\n      {\r\n        \"label\": \"萝北县\",\r\n        \"value\": \"230421\"\r\n      },\r\n      {\r\n        \"label\": \"绥滨县\",\r\n        \"value\": \"230422\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"尖山区\",\r\n        \"value\": \"230502\"\r\n      },\r\n      {\r\n        \"label\": \"岭东区\",\r\n        \"value\": \"230503\"\r\n      },\r\n      {\r\n        \"label\": \"四方台区\",\r\n        \"value\": \"230505\"\r\n      },\r\n      {\r\n        \"label\": \"宝山区\",\r\n        \"value\": \"230506\"\r\n      },\r\n      {\r\n        \"label\": \"集贤县\",\r\n        \"value\": \"230521\"\r\n      },\r\n      {\r\n        \"label\": \"友谊县\",\r\n        \"value\": \"230522\"\r\n      },\r\n      {\r\n        \"label\": \"宝清县\",\r\n        \"value\": \"230523\"\r\n      },\r\n      {\r\n        \"label\": \"饶河县\",\r\n        \"value\": \"230524\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"萨尔图区\",\r\n        \"value\": \"230602\"\r\n      },\r\n      {\r\n        \"label\": \"龙凤区\",\r\n        \"value\": \"230603\"\r\n      },\r\n      {\r\n        \"label\": \"让胡路区\",\r\n        \"value\": \"230604\"\r\n      },\r\n      {\r\n        \"label\": \"红岗区\",\r\n        \"value\": \"230605\"\r\n      },\r\n      {\r\n        \"label\": \"大同区\",\r\n        \"value\": \"230606\"\r\n      },\r\n      {\r\n        \"label\": \"肇州县\",\r\n        \"value\": \"230621\"\r\n      },\r\n      {\r\n        \"label\": \"肇源县\",\r\n        \"value\": \"230622\"\r\n      },\r\n      {\r\n        \"label\": \"林甸县\",\r\n        \"value\": \"230623\"\r\n      },\r\n      {\r\n        \"label\": \"杜尔伯特蒙古族自治县\",\r\n        \"value\": \"230624\"\r\n      },\r\n      {\r\n        \"label\": \"大庆高新技术产业开发区\",\r\n        \"value\": \"230671\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"伊春区\",\r\n        \"value\": \"230702\"\r\n      },\r\n      {\r\n        \"label\": \"南岔区\",\r\n        \"value\": \"230703\"\r\n      },\r\n      {\r\n        \"label\": \"友好区\",\r\n        \"value\": \"230704\"\r\n      },\r\n      {\r\n        \"label\": \"西林区\",\r\n        \"value\": \"230705\"\r\n      },\r\n      {\r\n        \"label\": \"翠峦区\",\r\n        \"value\": \"230706\"\r\n      },\r\n      {\r\n        \"label\": \"新青区\",\r\n        \"value\": \"230707\"\r\n      },\r\n      {\r\n        \"label\": \"美溪区\",\r\n        \"value\": \"230708\"\r\n      },\r\n      {\r\n        \"label\": \"金山屯区\",\r\n        \"value\": \"230709\"\r\n      },\r\n      {\r\n        \"label\": \"五营区\",\r\n        \"value\": \"230710\"\r\n      },\r\n      {\r\n        \"label\": \"乌马河区\",\r\n        \"value\": \"230711\"\r\n      },\r\n      {\r\n        \"label\": \"汤旺河区\",\r\n        \"value\": \"230712\"\r\n      },\r\n      {\r\n        \"label\": \"带岭区\",\r\n        \"value\": \"230713\"\r\n      },\r\n      {\r\n        \"label\": \"乌伊岭区\",\r\n        \"value\": \"230714\"\r\n      },\r\n      {\r\n        \"label\": \"红星区\",\r\n        \"value\": \"230715\"\r\n      },\r\n      {\r\n        \"label\": \"上甘岭区\",\r\n        \"value\": \"230716\"\r\n      },\r\n      {\r\n        \"label\": \"嘉荫县\",\r\n        \"value\": \"230722\"\r\n      },\r\n      {\r\n        \"label\": \"铁力市\",\r\n        \"value\": \"230781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"向阳区\",\r\n        \"value\": \"230803\"\r\n      },\r\n      {\r\n        \"label\": \"前进区\",\r\n        \"value\": \"230804\"\r\n      },\r\n      {\r\n        \"label\": \"东风区\",\r\n        \"value\": \"230805\"\r\n      },\r\n      {\r\n        \"label\": \"郊区\",\r\n        \"value\": \"230811\"\r\n      },\r\n      {\r\n        \"label\": \"桦南县\",\r\n        \"value\": \"230822\"\r\n      },\r\n      {\r\n        \"label\": \"桦川县\",\r\n        \"value\": \"230826\"\r\n      },\r\n      {\r\n        \"label\": \"汤原县\",\r\n        \"value\": \"230828\"\r\n      },\r\n      {\r\n        \"label\": \"同江市\",\r\n        \"value\": \"230881\"\r\n      },\r\n      {\r\n        \"label\": \"富锦市\",\r\n        \"value\": \"230882\"\r\n      },\r\n      {\r\n        \"label\": \"抚远市\",\r\n        \"value\": \"230883\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"新兴区\",\r\n        \"value\": \"230902\"\r\n      },\r\n      {\r\n        \"label\": \"桃山区\",\r\n        \"value\": \"230903\"\r\n      },\r\n      {\r\n        \"label\": \"茄子河区\",\r\n        \"value\": \"230904\"\r\n      },\r\n      {\r\n        \"label\": \"勃利县\",\r\n        \"value\": \"230921\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东安区\",\r\n        \"value\": \"231002\"\r\n      },\r\n      {\r\n        \"label\": \"阳明区\",\r\n        \"value\": \"231003\"\r\n      },\r\n      {\r\n        \"label\": \"爱民区\",\r\n        \"value\": \"231004\"\r\n      },\r\n      {\r\n        \"label\": \"西安区\",\r\n        \"value\": \"231005\"\r\n      },\r\n      {\r\n        \"label\": \"林口县\",\r\n        \"value\": \"231025\"\r\n      },\r\n      {\r\n        \"label\": \"牡丹江经济技术开发区\",\r\n        \"value\": \"231071\"\r\n      },\r\n      {\r\n        \"label\": \"绥芬河市\",\r\n        \"value\": \"231081\"\r\n      },\r\n      {\r\n        \"label\": \"海林市\",\r\n        \"value\": \"231083\"\r\n      },\r\n      {\r\n        \"label\": \"宁安市\",\r\n        \"value\": \"231084\"\r\n      },\r\n      {\r\n        \"label\": \"穆棱市\",\r\n        \"value\": \"231085\"\r\n      },\r\n      {\r\n        \"label\": \"东宁市\",\r\n        \"value\": \"231086\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"爱辉区\",\r\n        \"value\": \"231102\"\r\n      },\r\n      {\r\n        \"label\": \"嫩江县\",\r\n        \"value\": \"231121\"\r\n      },\r\n      {\r\n        \"label\": \"逊克县\",\r\n        \"value\": \"231123\"\r\n      },\r\n      {\r\n        \"label\": \"孙吴县\",\r\n        \"value\": \"231124\"\r\n      },\r\n      {\r\n        \"label\": \"北安市\",\r\n        \"value\": \"231181\"\r\n      },\r\n      {\r\n        \"label\": \"五大连池市\",\r\n        \"value\": \"231182\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"北林区\",\r\n        \"value\": \"231202\"\r\n      },\r\n      {\r\n        \"label\": \"望奎县\",\r\n        \"value\": \"231221\"\r\n      },\r\n      {\r\n        \"label\": \"兰西县\",\r\n        \"value\": \"231222\"\r\n      },\r\n      {\r\n        \"label\": \"青冈县\",\r\n        \"value\": \"231223\"\r\n      },\r\n      {\r\n        \"label\": \"庆安县\",\r\n        \"value\": \"231224\"\r\n      },\r\n      {\r\n        \"label\": \"明水县\",\r\n        \"value\": \"231225\"\r\n      },\r\n      {\r\n        \"label\": \"绥棱县\",\r\n        \"value\": \"231226\"\r\n      },\r\n      {\r\n        \"label\": \"安达市\",\r\n        \"value\": \"231281\"\r\n      },\r\n      {\r\n        \"label\": \"肇东市\",\r\n        \"value\": \"231282\"\r\n      },\r\n      {\r\n        \"label\": \"海伦市\",\r\n        \"value\": \"231283\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"加格达奇区\",\r\n        \"value\": \"232701\"\r\n      },\r\n      {\r\n        \"label\": \"松岭区\",\r\n        \"value\": \"232702\"\r\n      },\r\n      {\r\n        \"label\": \"新林区\",\r\n        \"value\": \"232703\"\r\n      },\r\n      {\r\n        \"label\": \"呼中区\",\r\n        \"value\": \"232704\"\r\n      },\r\n      {\r\n        \"label\": \"呼玛县\",\r\n        \"value\": \"232721\"\r\n      },\r\n      {\r\n        \"label\": \"塔河县\",\r\n        \"value\": \"232722\"\r\n      },\r\n      {\r\n        \"label\": \"漠河县\",\r\n        \"value\": \"232723\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"黄浦区\",\r\n        \"value\": \"310101\"\r\n      },\r\n      {\r\n        \"label\": \"徐汇区\",\r\n        \"value\": \"310104\"\r\n      },\r\n      {\r\n        \"label\": \"长宁区\",\r\n        \"value\": \"310105\"\r\n      },\r\n      {\r\n        \"label\": \"静安区\",\r\n        \"value\": \"310106\"\r\n      },\r\n      {\r\n        \"label\": \"普陀区\",\r\n        \"value\": \"310107\"\r\n      },\r\n      {\r\n        \"label\": \"虹口区\",\r\n        \"value\": \"310109\"\r\n      },\r\n      {\r\n        \"label\": \"杨浦区\",\r\n        \"value\": \"310110\"\r\n      },\r\n      {\r\n        \"label\": \"闵行区\",\r\n        \"value\": \"310112\"\r\n      },\r\n      {\r\n        \"label\": \"宝山区\",\r\n        \"value\": \"310113\"\r\n      },\r\n      {\r\n        \"label\": \"嘉定区\",\r\n        \"value\": \"310114\"\r\n      },\r\n      {\r\n        \"label\": \"浦东新区\",\r\n        \"value\": \"310115\"\r\n      },\r\n      {\r\n        \"label\": \"金山区\",\r\n        \"value\": \"310116\"\r\n      },\r\n      {\r\n        \"label\": \"松江区\",\r\n        \"value\": \"310117\"\r\n      },\r\n      {\r\n        \"label\": \"青浦区\",\r\n        \"value\": \"310118\"\r\n      },\r\n      {\r\n        \"label\": \"奉贤区\",\r\n        \"value\": \"310120\"\r\n      },\r\n      {\r\n        \"label\": \"崇明区\",\r\n        \"value\": \"310151\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"玄武区\",\r\n        \"value\": \"320102\"\r\n      },\r\n      {\r\n        \"label\": \"秦淮区\",\r\n        \"value\": \"320104\"\r\n      },\r\n      {\r\n        \"label\": \"建邺区\",\r\n        \"value\": \"320105\"\r\n      },\r\n      {\r\n        \"label\": \"鼓楼区\",\r\n        \"value\": \"320106\"\r\n      },\r\n      {\r\n        \"label\": \"浦口区\",\r\n        \"value\": \"320111\"\r\n      },\r\n      {\r\n        \"label\": \"栖霞区\",\r\n        \"value\": \"320113\"\r\n      },\r\n      {\r\n        \"label\": \"雨花台区\",\r\n        \"value\": \"320114\"\r\n      },\r\n      {\r\n        \"label\": \"江宁区\",\r\n        \"value\": \"320115\"\r\n      },\r\n      {\r\n        \"label\": \"六合区\",\r\n        \"value\": \"320116\"\r\n      },\r\n      {\r\n        \"label\": \"溧水区\",\r\n        \"value\": \"320117\"\r\n      },\r\n      {\r\n        \"label\": \"高淳区\",\r\n        \"value\": \"320118\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"锡山区\",\r\n        \"value\": \"320205\"\r\n      },\r\n      {\r\n        \"label\": \"惠山区\",\r\n        \"value\": \"320206\"\r\n      },\r\n      {\r\n        \"label\": \"滨湖区\",\r\n        \"value\": \"320211\"\r\n      },\r\n      {\r\n        \"label\": \"梁溪区\",\r\n        \"value\": \"320213\"\r\n      },\r\n      {\r\n        \"label\": \"新吴区\",\r\n        \"value\": \"320214\"\r\n      },\r\n      {\r\n        \"label\": \"江阴市\",\r\n        \"value\": \"320281\"\r\n      },\r\n      {\r\n        \"label\": \"宜兴市\",\r\n        \"value\": \"320282\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"鼓楼区\",\r\n        \"value\": \"320302\"\r\n      },\r\n      {\r\n        \"label\": \"云龙区\",\r\n        \"value\": \"320303\"\r\n      },\r\n      {\r\n        \"label\": \"贾汪区\",\r\n        \"value\": \"320305\"\r\n      },\r\n      {\r\n        \"label\": \"泉山区\",\r\n        \"value\": \"320311\"\r\n      },\r\n      {\r\n        \"label\": \"铜山区\",\r\n        \"value\": \"320312\"\r\n      },\r\n      {\r\n        \"label\": \"丰县\",\r\n        \"value\": \"320321\"\r\n      },\r\n      {\r\n        \"label\": \"沛县\",\r\n        \"value\": \"320322\"\r\n      },\r\n      {\r\n        \"label\": \"睢宁县\",\r\n        \"value\": \"320324\"\r\n      },\r\n      {\r\n        \"label\": \"徐州经济技术开发区\",\r\n        \"value\": \"320371\"\r\n      },\r\n      {\r\n        \"label\": \"新沂市\",\r\n        \"value\": \"320381\"\r\n      },\r\n      {\r\n        \"label\": \"邳州市\",\r\n        \"value\": \"320382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"天宁区\",\r\n        \"value\": \"320402\"\r\n      },\r\n      {\r\n        \"label\": \"钟楼区\",\r\n        \"value\": \"320404\"\r\n      },\r\n      {\r\n        \"label\": \"新北区\",\r\n        \"value\": \"320411\"\r\n      },\r\n      {\r\n        \"label\": \"武进区\",\r\n        \"value\": \"320412\"\r\n      },\r\n      {\r\n        \"label\": \"金坛区\",\r\n        \"value\": \"320413\"\r\n      },\r\n      {\r\n        \"label\": \"溧阳市\",\r\n        \"value\": \"320481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"虎丘区\",\r\n        \"value\": \"320505\"\r\n      },\r\n      {\r\n        \"label\": \"吴中区\",\r\n        \"value\": \"320506\"\r\n      },\r\n      {\r\n        \"label\": \"相城区\",\r\n        \"value\": \"320507\"\r\n      },\r\n      {\r\n        \"label\": \"姑苏区\",\r\n        \"value\": \"320508\"\r\n      },\r\n      {\r\n        \"label\": \"吴江区\",\r\n        \"value\": \"320509\"\r\n      },\r\n      {\r\n        \"label\": \"苏州工业园区\",\r\n        \"value\": \"320571\"\r\n      },\r\n      {\r\n        \"label\": \"常熟市\",\r\n        \"value\": \"320581\"\r\n      },\r\n      {\r\n        \"label\": \"张家港市\",\r\n        \"value\": \"320582\"\r\n      },\r\n      {\r\n        \"label\": \"昆山市\",\r\n        \"value\": \"320583\"\r\n      },\r\n      {\r\n        \"label\": \"太仓市\",\r\n        \"value\": \"320585\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"崇川区\",\r\n        \"value\": \"320602\"\r\n      },\r\n      {\r\n        \"label\": \"港闸区\",\r\n        \"value\": \"320611\"\r\n      },\r\n      {\r\n        \"label\": \"通州区\",\r\n        \"value\": \"320612\"\r\n      },\r\n      {\r\n        \"label\": \"海安县\",\r\n        \"value\": \"320621\"\r\n      },\r\n      {\r\n        \"label\": \"如东县\",\r\n        \"value\": \"320623\"\r\n      },\r\n      {\r\n        \"label\": \"南通经济技术开发区\",\r\n        \"value\": \"320671\"\r\n      },\r\n      {\r\n        \"label\": \"启东市\",\r\n        \"value\": \"320681\"\r\n      },\r\n      {\r\n        \"label\": \"如皋市\",\r\n        \"value\": \"320682\"\r\n      },\r\n      {\r\n        \"label\": \"海门市\",\r\n        \"value\": \"320684\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"连云区\",\r\n        \"value\": \"320703\"\r\n      },\r\n      {\r\n        \"label\": \"海州区\",\r\n        \"value\": \"320706\"\r\n      },\r\n      {\r\n        \"label\": \"赣榆区\",\r\n        \"value\": \"320707\"\r\n      },\r\n      {\r\n        \"label\": \"东海县\",\r\n        \"value\": \"320722\"\r\n      },\r\n      {\r\n        \"label\": \"灌云县\",\r\n        \"value\": \"320723\"\r\n      },\r\n      {\r\n        \"label\": \"灌南县\",\r\n        \"value\": \"320724\"\r\n      },\r\n      {\r\n        \"label\": \"连云港经济技术开发区\",\r\n        \"value\": \"320771\"\r\n      },\r\n      {\r\n        \"label\": \"连云港高新技术产业开发区\",\r\n        \"value\": \"320772\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"淮安区\",\r\n        \"value\": \"320803\"\r\n      },\r\n      {\r\n        \"label\": \"淮阴区\",\r\n        \"value\": \"320804\"\r\n      },\r\n      {\r\n        \"label\": \"清江浦区\",\r\n        \"value\": \"320812\"\r\n      },\r\n      {\r\n        \"label\": \"洪泽区\",\r\n        \"value\": \"320813\"\r\n      },\r\n      {\r\n        \"label\": \"涟水县\",\r\n        \"value\": \"320826\"\r\n      },\r\n      {\r\n        \"label\": \"盱眙县\",\r\n        \"value\": \"320830\"\r\n      },\r\n      {\r\n        \"label\": \"金湖县\",\r\n        \"value\": \"320831\"\r\n      },\r\n      {\r\n        \"label\": \"淮安经济技术开发区\",\r\n        \"value\": \"320871\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"亭湖区\",\r\n        \"value\": \"320902\"\r\n      },\r\n      {\r\n        \"label\": \"盐都区\",\r\n        \"value\": \"320903\"\r\n      },\r\n      {\r\n        \"label\": \"大丰区\",\r\n        \"value\": \"320904\"\r\n      },\r\n      {\r\n        \"label\": \"响水县\",\r\n        \"value\": \"320921\"\r\n      },\r\n      {\r\n        \"label\": \"滨海县\",\r\n        \"value\": \"320922\"\r\n      },\r\n      {\r\n        \"label\": \"阜宁县\",\r\n        \"value\": \"320923\"\r\n      },\r\n      {\r\n        \"label\": \"射阳县\",\r\n        \"value\": \"320924\"\r\n      },\r\n      {\r\n        \"label\": \"建湖县\",\r\n        \"value\": \"320925\"\r\n      },\r\n      {\r\n        \"label\": \"盐城经济技术开发区\",\r\n        \"value\": \"320971\"\r\n      },\r\n      {\r\n        \"label\": \"东台市\",\r\n        \"value\": \"320981\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"广陵区\",\r\n        \"value\": \"321002\"\r\n      },\r\n      {\r\n        \"label\": \"邗江区\",\r\n        \"value\": \"321003\"\r\n      },\r\n      {\r\n        \"label\": \"江都区\",\r\n        \"value\": \"321012\"\r\n      },\r\n      {\r\n        \"label\": \"宝应县\",\r\n        \"value\": \"321023\"\r\n      },\r\n      {\r\n        \"label\": \"扬州经济技术开发区\",\r\n        \"value\": \"321071\"\r\n      },\r\n      {\r\n        \"label\": \"仪征市\",\r\n        \"value\": \"321081\"\r\n      },\r\n      {\r\n        \"label\": \"高邮市\",\r\n        \"value\": \"321084\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"京口区\",\r\n        \"value\": \"321102\"\r\n      },\r\n      {\r\n        \"label\": \"润州区\",\r\n        \"value\": \"321111\"\r\n      },\r\n      {\r\n        \"label\": \"丹徒区\",\r\n        \"value\": \"321112\"\r\n      },\r\n      {\r\n        \"label\": \"镇江新区\",\r\n        \"value\": \"321171\"\r\n      },\r\n      {\r\n        \"label\": \"丹阳市\",\r\n        \"value\": \"321181\"\r\n      },\r\n      {\r\n        \"label\": \"扬中市\",\r\n        \"value\": \"321182\"\r\n      },\r\n      {\r\n        \"label\": \"句容市\",\r\n        \"value\": \"321183\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海陵区\",\r\n        \"value\": \"321202\"\r\n      },\r\n      {\r\n        \"label\": \"高港区\",\r\n        \"value\": \"321203\"\r\n      },\r\n      {\r\n        \"label\": \"姜堰区\",\r\n        \"value\": \"321204\"\r\n      },\r\n      {\r\n        \"label\": \"泰州医药高新技术产业开发区\",\r\n        \"value\": \"321271\"\r\n      },\r\n      {\r\n        \"label\": \"兴化市\",\r\n        \"value\": \"321281\"\r\n      },\r\n      {\r\n        \"label\": \"靖江市\",\r\n        \"value\": \"321282\"\r\n      },\r\n      {\r\n        \"label\": \"泰兴市\",\r\n        \"value\": \"321283\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"宿城区\",\r\n        \"value\": \"321302\"\r\n      },\r\n      {\r\n        \"label\": \"宿豫区\",\r\n        \"value\": \"321311\"\r\n      },\r\n      {\r\n        \"label\": \"沭阳县\",\r\n        \"value\": \"321322\"\r\n      },\r\n      {\r\n        \"label\": \"泗阳县\",\r\n        \"value\": \"321323\"\r\n      },\r\n      {\r\n        \"label\": \"泗洪县\",\r\n        \"value\": \"321324\"\r\n      },\r\n      {\r\n        \"label\": \"宿迁经济技术开发区\",\r\n        \"value\": \"321371\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"上城区\",\r\n        \"value\": \"330102\"\r\n      },\r\n      {\r\n        \"label\": \"下城区\",\r\n        \"value\": \"330103\"\r\n      },\r\n      {\r\n        \"label\": \"江干区\",\r\n        \"value\": \"330104\"\r\n      },\r\n      {\r\n        \"label\": \"拱墅区\",\r\n        \"value\": \"330105\"\r\n      },\r\n      {\r\n        \"label\": \"西湖区\",\r\n        \"value\": \"330106\"\r\n      },\r\n      {\r\n        \"label\": \"滨江区\",\r\n        \"value\": \"330108\"\r\n      },\r\n      {\r\n        \"label\": \"萧山区\",\r\n        \"value\": \"330109\"\r\n      },\r\n      {\r\n        \"label\": \"余杭区\",\r\n        \"value\": \"330110\"\r\n      },\r\n      {\r\n        \"label\": \"富阳区\",\r\n        \"value\": \"330111\"\r\n      },\r\n      {\r\n        \"label\": \"临安区\",\r\n        \"value\": \"330112\"\r\n      },\r\n      {\r\n        \"label\": \"桐庐县\",\r\n        \"value\": \"330122\"\r\n      },\r\n      {\r\n        \"label\": \"淳安县\",\r\n        \"value\": \"330127\"\r\n      },\r\n      {\r\n        \"label\": \"建德市\",\r\n        \"value\": \"330182\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海曙区\",\r\n        \"value\": \"330203\"\r\n      },\r\n      {\r\n        \"label\": \"江北区\",\r\n        \"value\": \"330205\"\r\n      },\r\n      {\r\n        \"label\": \"北仑区\",\r\n        \"value\": \"330206\"\r\n      },\r\n      {\r\n        \"label\": \"镇海区\",\r\n        \"value\": \"330211\"\r\n      },\r\n      {\r\n        \"label\": \"鄞州区\",\r\n        \"value\": \"330212\"\r\n      },\r\n      {\r\n        \"label\": \"奉化区\",\r\n        \"value\": \"330213\"\r\n      },\r\n      {\r\n        \"label\": \"象山县\",\r\n        \"value\": \"330225\"\r\n      },\r\n      {\r\n        \"label\": \"宁海县\",\r\n        \"value\": \"330226\"\r\n      },\r\n      {\r\n        \"label\": \"余姚市\",\r\n        \"value\": \"330281\"\r\n      },\r\n      {\r\n        \"label\": \"慈溪市\",\r\n        \"value\": \"330282\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"鹿城区\",\r\n        \"value\": \"330302\"\r\n      },\r\n      {\r\n        \"label\": \"龙湾区\",\r\n        \"value\": \"330303\"\r\n      },\r\n      {\r\n        \"label\": \"瓯海区\",\r\n        \"value\": \"330304\"\r\n      },\r\n      {\r\n        \"label\": \"洞头区\",\r\n        \"value\": \"330305\"\r\n      },\r\n      {\r\n        \"label\": \"永嘉县\",\r\n        \"value\": \"330324\"\r\n      },\r\n      {\r\n        \"label\": \"平阳县\",\r\n        \"value\": \"330326\"\r\n      },\r\n      {\r\n        \"label\": \"苍南县\",\r\n        \"value\": \"330327\"\r\n      },\r\n      {\r\n        \"label\": \"文成县\",\r\n        \"value\": \"330328\"\r\n      },\r\n      {\r\n        \"label\": \"泰顺县\",\r\n        \"value\": \"330329\"\r\n      },\r\n      {\r\n        \"label\": \"温州经济技术开发区\",\r\n        \"value\": \"330371\"\r\n      },\r\n      {\r\n        \"label\": \"瑞安市\",\r\n        \"value\": \"330381\"\r\n      },\r\n      {\r\n        \"label\": \"乐清市\",\r\n        \"value\": \"330382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"南湖区\",\r\n        \"value\": \"330402\"\r\n      },\r\n      {\r\n        \"label\": \"秀洲区\",\r\n        \"value\": \"330411\"\r\n      },\r\n      {\r\n        \"label\": \"嘉善县\",\r\n        \"value\": \"330421\"\r\n      },\r\n      {\r\n        \"label\": \"海盐县\",\r\n        \"value\": \"330424\"\r\n      },\r\n      {\r\n        \"label\": \"海宁市\",\r\n        \"value\": \"330481\"\r\n      },\r\n      {\r\n        \"label\": \"平湖市\",\r\n        \"value\": \"330482\"\r\n      },\r\n      {\r\n        \"label\": \"桐乡市\",\r\n        \"value\": \"330483\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"吴兴区\",\r\n        \"value\": \"330502\"\r\n      },\r\n      {\r\n        \"label\": \"南浔区\",\r\n        \"value\": \"330503\"\r\n      },\r\n      {\r\n        \"label\": \"德清县\",\r\n        \"value\": \"330521\"\r\n      },\r\n      {\r\n        \"label\": \"长兴县\",\r\n        \"value\": \"330522\"\r\n      },\r\n      {\r\n        \"label\": \"安吉县\",\r\n        \"value\": \"330523\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"越城区\",\r\n        \"value\": \"330602\"\r\n      },\r\n      {\r\n        \"label\": \"柯桥区\",\r\n        \"value\": \"330603\"\r\n      },\r\n      {\r\n        \"label\": \"上虞区\",\r\n        \"value\": \"330604\"\r\n      },\r\n      {\r\n        \"label\": \"新昌县\",\r\n        \"value\": \"330624\"\r\n      },\r\n      {\r\n        \"label\": \"诸暨市\",\r\n        \"value\": \"330681\"\r\n      },\r\n      {\r\n        \"label\": \"嵊州市\",\r\n        \"value\": \"330683\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"婺城区\",\r\n        \"value\": \"330702\"\r\n      },\r\n      {\r\n        \"label\": \"金东区\",\r\n        \"value\": \"330703\"\r\n      },\r\n      {\r\n        \"label\": \"武义县\",\r\n        \"value\": \"330723\"\r\n      },\r\n      {\r\n        \"label\": \"浦江县\",\r\n        \"value\": \"330726\"\r\n      },\r\n      {\r\n        \"label\": \"磐安县\",\r\n        \"value\": \"330727\"\r\n      },\r\n      {\r\n        \"label\": \"兰溪市\",\r\n        \"value\": \"330781\"\r\n      },\r\n      {\r\n        \"label\": \"义乌市\",\r\n        \"value\": \"330782\"\r\n      },\r\n      {\r\n        \"label\": \"东阳市\",\r\n        \"value\": \"330783\"\r\n      },\r\n      {\r\n        \"label\": \"永康市\",\r\n        \"value\": \"330784\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"柯城区\",\r\n        \"value\": \"330802\"\r\n      },\r\n      {\r\n        \"label\": \"衢江区\",\r\n        \"value\": \"330803\"\r\n      },\r\n      {\r\n        \"label\": \"常山县\",\r\n        \"value\": \"330822\"\r\n      },\r\n      {\r\n        \"label\": \"开化县\",\r\n        \"value\": \"330824\"\r\n      },\r\n      {\r\n        \"label\": \"龙游县\",\r\n        \"value\": \"330825\"\r\n      },\r\n      {\r\n        \"label\": \"江山市\",\r\n        \"value\": \"330881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"定海区\",\r\n        \"value\": \"330902\"\r\n      },\r\n      {\r\n        \"label\": \"普陀区\",\r\n        \"value\": \"330903\"\r\n      },\r\n      {\r\n        \"label\": \"岱山县\",\r\n        \"value\": \"330921\"\r\n      },\r\n      {\r\n        \"label\": \"嵊泗县\",\r\n        \"value\": \"330922\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"椒江区\",\r\n        \"value\": \"331002\"\r\n      },\r\n      {\r\n        \"label\": \"黄岩区\",\r\n        \"value\": \"331003\"\r\n      },\r\n      {\r\n        \"label\": \"路桥区\",\r\n        \"value\": \"331004\"\r\n      },\r\n      {\r\n        \"label\": \"三门县\",\r\n        \"value\": \"331022\"\r\n      },\r\n      {\r\n        \"label\": \"天台县\",\r\n        \"value\": \"331023\"\r\n      },\r\n      {\r\n        \"label\": \"仙居县\",\r\n        \"value\": \"331024\"\r\n      },\r\n      {\r\n        \"label\": \"温岭市\",\r\n        \"value\": \"331081\"\r\n      },\r\n      {\r\n        \"label\": \"临海市\",\r\n        \"value\": \"331082\"\r\n      },\r\n      {\r\n        \"label\": \"玉环市\",\r\n        \"value\": \"331083\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"莲都区\",\r\n        \"value\": \"331102\"\r\n      },\r\n      {\r\n        \"label\": \"青田县\",\r\n        \"value\": \"331121\"\r\n      },\r\n      {\r\n        \"label\": \"缙云县\",\r\n        \"value\": \"331122\"\r\n      },\r\n      {\r\n        \"label\": \"遂昌县\",\r\n        \"value\": \"331123\"\r\n      },\r\n      {\r\n        \"label\": \"松阳县\",\r\n        \"value\": \"331124\"\r\n      },\r\n      {\r\n        \"label\": \"云和县\",\r\n        \"value\": \"331125\"\r\n      },\r\n      {\r\n        \"label\": \"庆元县\",\r\n        \"value\": \"331126\"\r\n      },\r\n      {\r\n        \"label\": \"景宁畲族自治县\",\r\n        \"value\": \"331127\"\r\n      },\r\n      {\r\n        \"label\": \"龙泉市\",\r\n        \"value\": \"331181\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"瑶海区\",\r\n        \"value\": \"340102\"\r\n      },\r\n      {\r\n        \"label\": \"庐阳区\",\r\n        \"value\": \"340103\"\r\n      },\r\n      {\r\n        \"label\": \"蜀山区\",\r\n        \"value\": \"340104\"\r\n      },\r\n      {\r\n        \"label\": \"包河区\",\r\n        \"value\": \"340111\"\r\n      },\r\n      {\r\n        \"label\": \"长丰县\",\r\n        \"value\": \"340121\"\r\n      },\r\n      {\r\n        \"label\": \"肥东县\",\r\n        \"value\": \"340122\"\r\n      },\r\n      {\r\n        \"label\": \"肥西县\",\r\n        \"value\": \"340123\"\r\n      },\r\n      {\r\n        \"label\": \"庐江县\",\r\n        \"value\": \"340124\"\r\n      },\r\n      {\r\n        \"label\": \"合肥高新技术产业开发区\",\r\n        \"value\": \"340171\"\r\n      },\r\n      {\r\n        \"label\": \"合肥经济技术开发区\",\r\n        \"value\": \"340172\"\r\n      },\r\n      {\r\n        \"label\": \"合肥新站高新技术产业开发区\",\r\n        \"value\": \"340173\"\r\n      },\r\n      {\r\n        \"label\": \"巢湖市\",\r\n        \"value\": \"340181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"镜湖区\",\r\n        \"value\": \"340202\"\r\n      },\r\n      {\r\n        \"label\": \"弋江区\",\r\n        \"value\": \"340203\"\r\n      },\r\n      {\r\n        \"label\": \"鸠江区\",\r\n        \"value\": \"340207\"\r\n      },\r\n      {\r\n        \"label\": \"三山区\",\r\n        \"value\": \"340208\"\r\n      },\r\n      {\r\n        \"label\": \"芜湖县\",\r\n        \"value\": \"340221\"\r\n      },\r\n      {\r\n        \"label\": \"繁昌县\",\r\n        \"value\": \"340222\"\r\n      },\r\n      {\r\n        \"label\": \"南陵县\",\r\n        \"value\": \"340223\"\r\n      },\r\n      {\r\n        \"label\": \"无为县\",\r\n        \"value\": \"340225\"\r\n      },\r\n      {\r\n        \"label\": \"芜湖经济技术开发区\",\r\n        \"value\": \"340271\"\r\n      },\r\n      {\r\n        \"label\": \"安徽芜湖长江大桥经济开发区\",\r\n        \"value\": \"340272\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"龙子湖区\",\r\n        \"value\": \"340302\"\r\n      },\r\n      {\r\n        \"label\": \"蚌山区\",\r\n        \"value\": \"340303\"\r\n      },\r\n      {\r\n        \"label\": \"禹会区\",\r\n        \"value\": \"340304\"\r\n      },\r\n      {\r\n        \"label\": \"淮上区\",\r\n        \"value\": \"340311\"\r\n      },\r\n      {\r\n        \"label\": \"怀远县\",\r\n        \"value\": \"340321\"\r\n      },\r\n      {\r\n        \"label\": \"五河县\",\r\n        \"value\": \"340322\"\r\n      },\r\n      {\r\n        \"label\": \"固镇县\",\r\n        \"value\": \"340323\"\r\n      },\r\n      {\r\n        \"label\": \"蚌埠市高新技术开发区\",\r\n        \"value\": \"340371\"\r\n      },\r\n      {\r\n        \"label\": \"蚌埠市经济开发区\",\r\n        \"value\": \"340372\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"大通区\",\r\n        \"value\": \"340402\"\r\n      },\r\n      {\r\n        \"label\": \"田家庵区\",\r\n        \"value\": \"340403\"\r\n      },\r\n      {\r\n        \"label\": \"谢家集区\",\r\n        \"value\": \"340404\"\r\n      },\r\n      {\r\n        \"label\": \"八公山区\",\r\n        \"value\": \"340405\"\r\n      },\r\n      {\r\n        \"label\": \"潘集区\",\r\n        \"value\": \"340406\"\r\n      },\r\n      {\r\n        \"label\": \"凤台县\",\r\n        \"value\": \"340421\"\r\n      },\r\n      {\r\n        \"label\": \"寿县\",\r\n        \"value\": \"340422\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"花山区\",\r\n        \"value\": \"340503\"\r\n      },\r\n      {\r\n        \"label\": \"雨山区\",\r\n        \"value\": \"340504\"\r\n      },\r\n      {\r\n        \"label\": \"博望区\",\r\n        \"value\": \"340506\"\r\n      },\r\n      {\r\n        \"label\": \"当涂县\",\r\n        \"value\": \"340521\"\r\n      },\r\n      {\r\n        \"label\": \"含山县\",\r\n        \"value\": \"340522\"\r\n      },\r\n      {\r\n        \"label\": \"和县\",\r\n        \"value\": \"340523\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"杜集区\",\r\n        \"value\": \"340602\"\r\n      },\r\n      {\r\n        \"label\": \"相山区\",\r\n        \"value\": \"340603\"\r\n      },\r\n      {\r\n        \"label\": \"烈山区\",\r\n        \"value\": \"340604\"\r\n      },\r\n      {\r\n        \"label\": \"濉溪县\",\r\n        \"value\": \"340621\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"铜官区\",\r\n        \"value\": \"340705\"\r\n      },\r\n      {\r\n        \"label\": \"义安区\",\r\n        \"value\": \"340706\"\r\n      },\r\n      {\r\n        \"label\": \"郊区\",\r\n        \"value\": \"340711\"\r\n      },\r\n      {\r\n        \"label\": \"枞阳县\",\r\n        \"value\": \"340722\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"迎江区\",\r\n        \"value\": \"340802\"\r\n      },\r\n      {\r\n        \"label\": \"大观区\",\r\n        \"value\": \"340803\"\r\n      },\r\n      {\r\n        \"label\": \"宜秀区\",\r\n        \"value\": \"340811\"\r\n      },\r\n      {\r\n        \"label\": \"怀宁县\",\r\n        \"value\": \"340822\"\r\n      },\r\n      {\r\n        \"label\": \"潜山县\",\r\n        \"value\": \"340824\"\r\n      },\r\n      {\r\n        \"label\": \"太湖县\",\r\n        \"value\": \"340825\"\r\n      },\r\n      {\r\n        \"label\": \"宿松县\",\r\n        \"value\": \"340826\"\r\n      },\r\n      {\r\n        \"label\": \"望江县\",\r\n        \"value\": \"340827\"\r\n      },\r\n      {\r\n        \"label\": \"岳西县\",\r\n        \"value\": \"340828\"\r\n      },\r\n      {\r\n        \"label\": \"安徽安庆经济开发区\",\r\n        \"value\": \"340871\"\r\n      },\r\n      {\r\n        \"label\": \"桐城市\",\r\n        \"value\": \"340881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"屯溪区\",\r\n        \"value\": \"341002\"\r\n      },\r\n      {\r\n        \"label\": \"黄山区\",\r\n        \"value\": \"341003\"\r\n      },\r\n      {\r\n        \"label\": \"徽州区\",\r\n        \"value\": \"341004\"\r\n      },\r\n      {\r\n        \"label\": \"歙县\",\r\n        \"value\": \"341021\"\r\n      },\r\n      {\r\n        \"label\": \"休宁县\",\r\n        \"value\": \"341022\"\r\n      },\r\n      {\r\n        \"label\": \"黟县\",\r\n        \"value\": \"341023\"\r\n      },\r\n      {\r\n        \"label\": \"祁门县\",\r\n        \"value\": \"341024\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"琅琊区\",\r\n        \"value\": \"341102\"\r\n      },\r\n      {\r\n        \"label\": \"南谯区\",\r\n        \"value\": \"341103\"\r\n      },\r\n      {\r\n        \"label\": \"来安县\",\r\n        \"value\": \"341122\"\r\n      },\r\n      {\r\n        \"label\": \"全椒县\",\r\n        \"value\": \"341124\"\r\n      },\r\n      {\r\n        \"label\": \"定远县\",\r\n        \"value\": \"341125\"\r\n      },\r\n      {\r\n        \"label\": \"凤阳县\",\r\n        \"value\": \"341126\"\r\n      },\r\n      {\r\n        \"label\": \"苏滁现代产业园\",\r\n        \"value\": \"341171\"\r\n      },\r\n      {\r\n        \"label\": \"滁州经济技术开发区\",\r\n        \"value\": \"341172\"\r\n      },\r\n      {\r\n        \"label\": \"天长市\",\r\n        \"value\": \"341181\"\r\n      },\r\n      {\r\n        \"label\": \"明光市\",\r\n        \"value\": \"341182\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"颍州区\",\r\n        \"value\": \"341202\"\r\n      },\r\n      {\r\n        \"label\": \"颍东区\",\r\n        \"value\": \"341203\"\r\n      },\r\n      {\r\n        \"label\": \"颍泉区\",\r\n        \"value\": \"341204\"\r\n      },\r\n      {\r\n        \"label\": \"临泉县\",\r\n        \"value\": \"341221\"\r\n      },\r\n      {\r\n        \"label\": \"太和县\",\r\n        \"value\": \"341222\"\r\n      },\r\n      {\r\n        \"label\": \"阜南县\",\r\n        \"value\": \"341225\"\r\n      },\r\n      {\r\n        \"label\": \"颍上县\",\r\n        \"value\": \"341226\"\r\n      },\r\n      {\r\n        \"label\": \"阜阳合肥现代产业园区\",\r\n        \"value\": \"341271\"\r\n      },\r\n      {\r\n        \"label\": \"阜阳经济技术开发区\",\r\n        \"value\": \"341272\"\r\n      },\r\n      {\r\n        \"label\": \"界首市\",\r\n        \"value\": \"341282\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"埇桥区\",\r\n        \"value\": \"341302\"\r\n      },\r\n      {\r\n        \"label\": \"砀山县\",\r\n        \"value\": \"341321\"\r\n      },\r\n      {\r\n        \"label\": \"萧县\",\r\n        \"value\": \"341322\"\r\n      },\r\n      {\r\n        \"label\": \"灵璧县\",\r\n        \"value\": \"341323\"\r\n      },\r\n      {\r\n        \"label\": \"泗县\",\r\n        \"value\": \"341324\"\r\n      },\r\n      {\r\n        \"label\": \"宿州马鞍山现代产业园区\",\r\n        \"value\": \"341371\"\r\n      },\r\n      {\r\n        \"label\": \"宿州经济技术开发区\",\r\n        \"value\": \"341372\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"金安区\",\r\n        \"value\": \"341502\"\r\n      },\r\n      {\r\n        \"label\": \"裕安区\",\r\n        \"value\": \"341503\"\r\n      },\r\n      {\r\n        \"label\": \"叶集区\",\r\n        \"value\": \"341504\"\r\n      },\r\n      {\r\n        \"label\": \"霍邱县\",\r\n        \"value\": \"341522\"\r\n      },\r\n      {\r\n        \"label\": \"舒城县\",\r\n        \"value\": \"341523\"\r\n      },\r\n      {\r\n        \"label\": \"金寨县\",\r\n        \"value\": \"341524\"\r\n      },\r\n      {\r\n        \"label\": \"霍山县\",\r\n        \"value\": \"341525\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"谯城区\",\r\n        \"value\": \"341602\"\r\n      },\r\n      {\r\n        \"label\": \"涡阳县\",\r\n        \"value\": \"341621\"\r\n      },\r\n      {\r\n        \"label\": \"蒙城县\",\r\n        \"value\": \"341622\"\r\n      },\r\n      {\r\n        \"label\": \"利辛县\",\r\n        \"value\": \"341623\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"贵池区\",\r\n        \"value\": \"341702\"\r\n      },\r\n      {\r\n        \"label\": \"东至县\",\r\n        \"value\": \"341721\"\r\n      },\r\n      {\r\n        \"label\": \"石台县\",\r\n        \"value\": \"341722\"\r\n      },\r\n      {\r\n        \"label\": \"青阳县\",\r\n        \"value\": \"341723\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"宣州区\",\r\n        \"value\": \"341802\"\r\n      },\r\n      {\r\n        \"label\": \"郎溪县\",\r\n        \"value\": \"341821\"\r\n      },\r\n      {\r\n        \"label\": \"广德县\",\r\n        \"value\": \"341822\"\r\n      },\r\n      {\r\n        \"label\": \"泾县\",\r\n        \"value\": \"341823\"\r\n      },\r\n      {\r\n        \"label\": \"绩溪县\",\r\n        \"value\": \"341824\"\r\n      },\r\n      {\r\n        \"label\": \"旌德县\",\r\n        \"value\": \"341825\"\r\n      },\r\n      {\r\n        \"label\": \"宣城市经济开发区\",\r\n        \"value\": \"341871\"\r\n      },\r\n      {\r\n        \"label\": \"宁国市\",\r\n        \"value\": \"341881\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"鼓楼区\",\r\n        \"value\": \"350102\"\r\n      },\r\n      {\r\n        \"label\": \"台江区\",\r\n        \"value\": \"350103\"\r\n      },\r\n      {\r\n        \"label\": \"仓山区\",\r\n        \"value\": \"350104\"\r\n      },\r\n      {\r\n        \"label\": \"马尾区\",\r\n        \"value\": \"350105\"\r\n      },\r\n      {\r\n        \"label\": \"晋安区\",\r\n        \"value\": \"350111\"\r\n      },\r\n      {\r\n        \"label\": \"闽侯县\",\r\n        \"value\": \"350121\"\r\n      },\r\n      {\r\n        \"label\": \"连江县\",\r\n        \"value\": \"350122\"\r\n      },\r\n      {\r\n        \"label\": \"罗源县\",\r\n        \"value\": \"350123\"\r\n      },\r\n      {\r\n        \"label\": \"闽清县\",\r\n        \"value\": \"350124\"\r\n      },\r\n      {\r\n        \"label\": \"永泰县\",\r\n        \"value\": \"350125\"\r\n      },\r\n      {\r\n        \"label\": \"平潭县\",\r\n        \"value\": \"350128\"\r\n      },\r\n      {\r\n        \"label\": \"福清市\",\r\n        \"value\": \"350181\"\r\n      },\r\n      {\r\n        \"label\": \"长乐市\",\r\n        \"value\": \"350182\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"思明区\",\r\n        \"value\": \"350203\"\r\n      },\r\n      {\r\n        \"label\": \"海沧区\",\r\n        \"value\": \"350205\"\r\n      },\r\n      {\r\n        \"label\": \"湖里区\",\r\n        \"value\": \"350206\"\r\n      },\r\n      {\r\n        \"label\": \"集美区\",\r\n        \"value\": \"350211\"\r\n      },\r\n      {\r\n        \"label\": \"同安区\",\r\n        \"value\": \"350212\"\r\n      },\r\n      {\r\n        \"label\": \"翔安区\",\r\n        \"value\": \"350213\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城厢区\",\r\n        \"value\": \"350302\"\r\n      },\r\n      {\r\n        \"label\": \"涵江区\",\r\n        \"value\": \"350303\"\r\n      },\r\n      {\r\n        \"label\": \"荔城区\",\r\n        \"value\": \"350304\"\r\n      },\r\n      {\r\n        \"label\": \"秀屿区\",\r\n        \"value\": \"350305\"\r\n      },\r\n      {\r\n        \"label\": \"仙游县\",\r\n        \"value\": \"350322\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"梅列区\",\r\n        \"value\": \"350402\"\r\n      },\r\n      {\r\n        \"label\": \"三元区\",\r\n        \"value\": \"350403\"\r\n      },\r\n      {\r\n        \"label\": \"明溪县\",\r\n        \"value\": \"350421\"\r\n      },\r\n      {\r\n        \"label\": \"清流县\",\r\n        \"value\": \"350423\"\r\n      },\r\n      {\r\n        \"label\": \"宁化县\",\r\n        \"value\": \"350424\"\r\n      },\r\n      {\r\n        \"label\": \"大田县\",\r\n        \"value\": \"350425\"\r\n      },\r\n      {\r\n        \"label\": \"尤溪县\",\r\n        \"value\": \"350426\"\r\n      },\r\n      {\r\n        \"label\": \"沙县\",\r\n        \"value\": \"350427\"\r\n      },\r\n      {\r\n        \"label\": \"将乐县\",\r\n        \"value\": \"350428\"\r\n      },\r\n      {\r\n        \"label\": \"泰宁县\",\r\n        \"value\": \"350429\"\r\n      },\r\n      {\r\n        \"label\": \"建宁县\",\r\n        \"value\": \"350430\"\r\n      },\r\n      {\r\n        \"label\": \"永安市\",\r\n        \"value\": \"350481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"鲤城区\",\r\n        \"value\": \"350502\"\r\n      },\r\n      {\r\n        \"label\": \"丰泽区\",\r\n        \"value\": \"350503\"\r\n      },\r\n      {\r\n        \"label\": \"洛江区\",\r\n        \"value\": \"350504\"\r\n      },\r\n      {\r\n        \"label\": \"泉港区\",\r\n        \"value\": \"350505\"\r\n      },\r\n      {\r\n        \"label\": \"惠安县\",\r\n        \"value\": \"350521\"\r\n      },\r\n      {\r\n        \"label\": \"安溪县\",\r\n        \"value\": \"350524\"\r\n      },\r\n      {\r\n        \"label\": \"永春县\",\r\n        \"value\": \"350525\"\r\n      },\r\n      {\r\n        \"label\": \"德化县\",\r\n        \"value\": \"350526\"\r\n      },\r\n      {\r\n        \"label\": \"金门县\",\r\n        \"value\": \"350527\"\r\n      },\r\n      {\r\n        \"label\": \"石狮市\",\r\n        \"value\": \"350581\"\r\n      },\r\n      {\r\n        \"label\": \"晋江市\",\r\n        \"value\": \"350582\"\r\n      },\r\n      {\r\n        \"label\": \"南安市\",\r\n        \"value\": \"350583\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"芗城区\",\r\n        \"value\": \"350602\"\r\n      },\r\n      {\r\n        \"label\": \"龙文区\",\r\n        \"value\": \"350603\"\r\n      },\r\n      {\r\n        \"label\": \"云霄县\",\r\n        \"value\": \"350622\"\r\n      },\r\n      {\r\n        \"label\": \"漳浦县\",\r\n        \"value\": \"350623\"\r\n      },\r\n      {\r\n        \"label\": \"诏安县\",\r\n        \"value\": \"350624\"\r\n      },\r\n      {\r\n        \"label\": \"长泰县\",\r\n        \"value\": \"350625\"\r\n      },\r\n      {\r\n        \"label\": \"东山县\",\r\n        \"value\": \"350626\"\r\n      },\r\n      {\r\n        \"label\": \"南靖县\",\r\n        \"value\": \"350627\"\r\n      },\r\n      {\r\n        \"label\": \"平和县\",\r\n        \"value\": \"350628\"\r\n      },\r\n      {\r\n        \"label\": \"华安县\",\r\n        \"value\": \"350629\"\r\n      },\r\n      {\r\n        \"label\": \"龙海市\",\r\n        \"value\": \"350681\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"延平区\",\r\n        \"value\": \"350702\"\r\n      },\r\n      {\r\n        \"label\": \"建阳区\",\r\n        \"value\": \"350703\"\r\n      },\r\n      {\r\n        \"label\": \"顺昌县\",\r\n        \"value\": \"350721\"\r\n      },\r\n      {\r\n        \"label\": \"浦城县\",\r\n        \"value\": \"350722\"\r\n      },\r\n      {\r\n        \"label\": \"光泽县\",\r\n        \"value\": \"350723\"\r\n      },\r\n      {\r\n        \"label\": \"松溪县\",\r\n        \"value\": \"350724\"\r\n      },\r\n      {\r\n        \"label\": \"政和县\",\r\n        \"value\": \"350725\"\r\n      },\r\n      {\r\n        \"label\": \"邵武市\",\r\n        \"value\": \"350781\"\r\n      },\r\n      {\r\n        \"label\": \"武夷山市\",\r\n        \"value\": \"350782\"\r\n      },\r\n      {\r\n        \"label\": \"建瓯市\",\r\n        \"value\": \"350783\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"新罗区\",\r\n        \"value\": \"350802\"\r\n      },\r\n      {\r\n        \"label\": \"永定区\",\r\n        \"value\": \"350803\"\r\n      },\r\n      {\r\n        \"label\": \"长汀县\",\r\n        \"value\": \"350821\"\r\n      },\r\n      {\r\n        \"label\": \"上杭县\",\r\n        \"value\": \"350823\"\r\n      },\r\n      {\r\n        \"label\": \"武平县\",\r\n        \"value\": \"350824\"\r\n      },\r\n      {\r\n        \"label\": \"连城县\",\r\n        \"value\": \"350825\"\r\n      },\r\n      {\r\n        \"label\": \"漳平市\",\r\n        \"value\": \"350881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"蕉城区\",\r\n        \"value\": \"350902\"\r\n      },\r\n      {\r\n        \"label\": \"霞浦县\",\r\n        \"value\": \"350921\"\r\n      },\r\n      {\r\n        \"label\": \"古田县\",\r\n        \"value\": \"350922\"\r\n      },\r\n      {\r\n        \"label\": \"屏南县\",\r\n        \"value\": \"350923\"\r\n      },\r\n      {\r\n        \"label\": \"寿宁县\",\r\n        \"value\": \"350924\"\r\n      },\r\n      {\r\n        \"label\": \"周宁县\",\r\n        \"value\": \"350925\"\r\n      },\r\n      {\r\n        \"label\": \"柘荣县\",\r\n        \"value\": \"350926\"\r\n      },\r\n      {\r\n        \"label\": \"福安市\",\r\n        \"value\": \"350981\"\r\n      },\r\n      {\r\n        \"label\": \"福鼎市\",\r\n        \"value\": \"350982\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"东湖区\",\r\n        \"value\": \"360102\"\r\n      },\r\n      {\r\n        \"label\": \"西湖区\",\r\n        \"value\": \"360103\"\r\n      },\r\n      {\r\n        \"label\": \"青云谱区\",\r\n        \"value\": \"360104\"\r\n      },\r\n      {\r\n        \"label\": \"湾里区\",\r\n        \"value\": \"360105\"\r\n      },\r\n      {\r\n        \"label\": \"青山湖区\",\r\n        \"value\": \"360111\"\r\n      },\r\n      {\r\n        \"label\": \"新建区\",\r\n        \"value\": \"360112\"\r\n      },\r\n      {\r\n        \"label\": \"南昌县\",\r\n        \"value\": \"360121\"\r\n      },\r\n      {\r\n        \"label\": \"安义县\",\r\n        \"value\": \"360123\"\r\n      },\r\n      {\r\n        \"label\": \"进贤县\",\r\n        \"value\": \"360124\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"昌江区\",\r\n        \"value\": \"360202\"\r\n      },\r\n      {\r\n        \"label\": \"珠山区\",\r\n        \"value\": \"360203\"\r\n      },\r\n      {\r\n        \"label\": \"浮梁县\",\r\n        \"value\": \"360222\"\r\n      },\r\n      {\r\n        \"label\": \"乐平市\",\r\n        \"value\": \"360281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"安源区\",\r\n        \"value\": \"360302\"\r\n      },\r\n      {\r\n        \"label\": \"湘东区\",\r\n        \"value\": \"360313\"\r\n      },\r\n      {\r\n        \"label\": \"莲花县\",\r\n        \"value\": \"360321\"\r\n      },\r\n      {\r\n        \"label\": \"上栗县\",\r\n        \"value\": \"360322\"\r\n      },\r\n      {\r\n        \"label\": \"芦溪县\",\r\n        \"value\": \"360323\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"濂溪区\",\r\n        \"value\": \"360402\"\r\n      },\r\n      {\r\n        \"label\": \"浔阳区\",\r\n        \"value\": \"360403\"\r\n      },\r\n      {\r\n        \"label\": \"柴桑区\",\r\n        \"value\": \"360404\"\r\n      },\r\n      {\r\n        \"label\": \"武宁县\",\r\n        \"value\": \"360423\"\r\n      },\r\n      {\r\n        \"label\": \"修水县\",\r\n        \"value\": \"360424\"\r\n      },\r\n      {\r\n        \"label\": \"永修县\",\r\n        \"value\": \"360425\"\r\n      },\r\n      {\r\n        \"label\": \"德安县\",\r\n        \"value\": \"360426\"\r\n      },\r\n      {\r\n        \"label\": \"都昌县\",\r\n        \"value\": \"360428\"\r\n      },\r\n      {\r\n        \"label\": \"湖口县\",\r\n        \"value\": \"360429\"\r\n      },\r\n      {\r\n        \"label\": \"彭泽县\",\r\n        \"value\": \"360430\"\r\n      },\r\n      {\r\n        \"label\": \"瑞昌市\",\r\n        \"value\": \"360481\"\r\n      },\r\n      {\r\n        \"label\": \"共青城市\",\r\n        \"value\": \"360482\"\r\n      },\r\n      {\r\n        \"label\": \"庐山市\",\r\n        \"value\": \"360483\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"渝水区\",\r\n        \"value\": \"360502\"\r\n      },\r\n      {\r\n        \"label\": \"分宜县\",\r\n        \"value\": \"360521\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"月湖区\",\r\n        \"value\": \"360602\"\r\n      },\r\n      {\r\n        \"label\": \"余江县\",\r\n        \"value\": \"360622\"\r\n      },\r\n      {\r\n        \"label\": \"贵溪市\",\r\n        \"value\": \"360681\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"章贡区\",\r\n        \"value\": \"360702\"\r\n      },\r\n      {\r\n        \"label\": \"南康区\",\r\n        \"value\": \"360703\"\r\n      },\r\n      {\r\n        \"label\": \"赣县区\",\r\n        \"value\": \"360704\"\r\n      },\r\n      {\r\n        \"label\": \"信丰县\",\r\n        \"value\": \"360722\"\r\n      },\r\n      {\r\n        \"label\": \"大余县\",\r\n        \"value\": \"360723\"\r\n      },\r\n      {\r\n        \"label\": \"上犹县\",\r\n        \"value\": \"360724\"\r\n      },\r\n      {\r\n        \"label\": \"崇义县\",\r\n        \"value\": \"360725\"\r\n      },\r\n      {\r\n        \"label\": \"安远县\",\r\n        \"value\": \"360726\"\r\n      },\r\n      {\r\n        \"label\": \"龙南县\",\r\n        \"value\": \"360727\"\r\n      },\r\n      {\r\n        \"label\": \"定南县\",\r\n        \"value\": \"360728\"\r\n      },\r\n      {\r\n        \"label\": \"全南县\",\r\n        \"value\": \"360729\"\r\n      },\r\n      {\r\n        \"label\": \"宁都县\",\r\n        \"value\": \"360730\"\r\n      },\r\n      {\r\n        \"label\": \"于都县\",\r\n        \"value\": \"360731\"\r\n      },\r\n      {\r\n        \"label\": \"兴国县\",\r\n        \"value\": \"360732\"\r\n      },\r\n      {\r\n        \"label\": \"会昌县\",\r\n        \"value\": \"360733\"\r\n      },\r\n      {\r\n        \"label\": \"寻乌县\",\r\n        \"value\": \"360734\"\r\n      },\r\n      {\r\n        \"label\": \"石城县\",\r\n        \"value\": \"360735\"\r\n      },\r\n      {\r\n        \"label\": \"瑞金市\",\r\n        \"value\": \"360781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"吉州区\",\r\n        \"value\": \"360802\"\r\n      },\r\n      {\r\n        \"label\": \"青原区\",\r\n        \"value\": \"360803\"\r\n      },\r\n      {\r\n        \"label\": \"吉安县\",\r\n        \"value\": \"360821\"\r\n      },\r\n      {\r\n        \"label\": \"吉水县\",\r\n        \"value\": \"360822\"\r\n      },\r\n      {\r\n        \"label\": \"峡江县\",\r\n        \"value\": \"360823\"\r\n      },\r\n      {\r\n        \"label\": \"新干县\",\r\n        \"value\": \"360824\"\r\n      },\r\n      {\r\n        \"label\": \"永丰县\",\r\n        \"value\": \"360825\"\r\n      },\r\n      {\r\n        \"label\": \"泰和县\",\r\n        \"value\": \"360826\"\r\n      },\r\n      {\r\n        \"label\": \"遂川县\",\r\n        \"value\": \"360827\"\r\n      },\r\n      {\r\n        \"label\": \"万安县\",\r\n        \"value\": \"360828\"\r\n      },\r\n      {\r\n        \"label\": \"安福县\",\r\n        \"value\": \"360829\"\r\n      },\r\n      {\r\n        \"label\": \"永新县\",\r\n        \"value\": \"360830\"\r\n      },\r\n      {\r\n        \"label\": \"井冈山市\",\r\n        \"value\": \"360881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"袁州区\",\r\n        \"value\": \"360902\"\r\n      },\r\n      {\r\n        \"label\": \"奉新县\",\r\n        \"value\": \"360921\"\r\n      },\r\n      {\r\n        \"label\": \"万载县\",\r\n        \"value\": \"360922\"\r\n      },\r\n      {\r\n        \"label\": \"上高县\",\r\n        \"value\": \"360923\"\r\n      },\r\n      {\r\n        \"label\": \"宜丰县\",\r\n        \"value\": \"360924\"\r\n      },\r\n      {\r\n        \"label\": \"靖安县\",\r\n        \"value\": \"360925\"\r\n      },\r\n      {\r\n        \"label\": \"铜鼓县\",\r\n        \"value\": \"360926\"\r\n      },\r\n      {\r\n        \"label\": \"丰城市\",\r\n        \"value\": \"360981\"\r\n      },\r\n      {\r\n        \"label\": \"樟树市\",\r\n        \"value\": \"360982\"\r\n      },\r\n      {\r\n        \"label\": \"高安市\",\r\n        \"value\": \"360983\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"临川区\",\r\n        \"value\": \"361002\"\r\n      },\r\n      {\r\n        \"label\": \"东乡区\",\r\n        \"value\": \"361003\"\r\n      },\r\n      {\r\n        \"label\": \"南城县\",\r\n        \"value\": \"361021\"\r\n      },\r\n      {\r\n        \"label\": \"黎川县\",\r\n        \"value\": \"361022\"\r\n      },\r\n      {\r\n        \"label\": \"南丰县\",\r\n        \"value\": \"361023\"\r\n      },\r\n      {\r\n        \"label\": \"崇仁县\",\r\n        \"value\": \"361024\"\r\n      },\r\n      {\r\n        \"label\": \"乐安县\",\r\n        \"value\": \"361025\"\r\n      },\r\n      {\r\n        \"label\": \"宜黄县\",\r\n        \"value\": \"361026\"\r\n      },\r\n      {\r\n        \"label\": \"金溪县\",\r\n        \"value\": \"361027\"\r\n      },\r\n      {\r\n        \"label\": \"资溪县\",\r\n        \"value\": \"361028\"\r\n      },\r\n      {\r\n        \"label\": \"广昌县\",\r\n        \"value\": \"361030\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"信州区\",\r\n        \"value\": \"361102\"\r\n      },\r\n      {\r\n        \"label\": \"广丰区\",\r\n        \"value\": \"361103\"\r\n      },\r\n      {\r\n        \"label\": \"上饶县\",\r\n        \"value\": \"361121\"\r\n      },\r\n      {\r\n        \"label\": \"玉山县\",\r\n        \"value\": \"361123\"\r\n      },\r\n      {\r\n        \"label\": \"铅山县\",\r\n        \"value\": \"361124\"\r\n      },\r\n      {\r\n        \"label\": \"横峰县\",\r\n        \"value\": \"361125\"\r\n      },\r\n      {\r\n        \"label\": \"弋阳县\",\r\n        \"value\": \"361126\"\r\n      },\r\n      {\r\n        \"label\": \"余干县\",\r\n        \"value\": \"361127\"\r\n      },\r\n      {\r\n        \"label\": \"鄱阳县\",\r\n        \"value\": \"361128\"\r\n      },\r\n      {\r\n        \"label\": \"万年县\",\r\n        \"value\": \"361129\"\r\n      },\r\n      {\r\n        \"label\": \"婺源县\",\r\n        \"value\": \"361130\"\r\n      },\r\n      {\r\n        \"label\": \"德兴市\",\r\n        \"value\": \"361181\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"历下区\",\r\n        \"value\": \"370102\"\r\n      },\r\n      {\r\n        \"label\": \"市中区\",\r\n        \"value\": \"370103\"\r\n      },\r\n      {\r\n        \"label\": \"槐荫区\",\r\n        \"value\": \"370104\"\r\n      },\r\n      {\r\n        \"label\": \"天桥区\",\r\n        \"value\": \"370105\"\r\n      },\r\n      {\r\n        \"label\": \"历城区\",\r\n        \"value\": \"370112\"\r\n      },\r\n      {\r\n        \"label\": \"长清区\",\r\n        \"value\": \"370113\"\r\n      },\r\n      {\r\n        \"label\": \"章丘区\",\r\n        \"value\": \"370114\"\r\n      },\r\n      {\r\n        \"label\": \"平阴县\",\r\n        \"value\": \"370124\"\r\n      },\r\n      {\r\n        \"label\": \"济阳县\",\r\n        \"value\": \"370125\"\r\n      },\r\n      {\r\n        \"label\": \"商河县\",\r\n        \"value\": \"370126\"\r\n      },\r\n      {\r\n        \"label\": \"济南高新技术产业开发区\",\r\n        \"value\": \"370171\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"市南区\",\r\n        \"value\": \"370202\"\r\n      },\r\n      {\r\n        \"label\": \"市北区\",\r\n        \"value\": \"370203\"\r\n      },\r\n      {\r\n        \"label\": \"黄岛区\",\r\n        \"value\": \"370211\"\r\n      },\r\n      {\r\n        \"label\": \"崂山区\",\r\n        \"value\": \"370212\"\r\n      },\r\n      {\r\n        \"label\": \"李沧区\",\r\n        \"value\": \"370213\"\r\n      },\r\n      {\r\n        \"label\": \"城阳区\",\r\n        \"value\": \"370214\"\r\n      },\r\n      {\r\n        \"label\": \"即墨区\",\r\n        \"value\": \"370215\"\r\n      },\r\n      {\r\n        \"label\": \"青岛高新技术产业开发区\",\r\n        \"value\": \"370271\"\r\n      },\r\n      {\r\n        \"label\": \"胶州市\",\r\n        \"value\": \"370281\"\r\n      },\r\n      {\r\n        \"label\": \"平度市\",\r\n        \"value\": \"370283\"\r\n      },\r\n      {\r\n        \"label\": \"莱西市\",\r\n        \"value\": \"370285\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"淄川区\",\r\n        \"value\": \"370302\"\r\n      },\r\n      {\r\n        \"label\": \"张店区\",\r\n        \"value\": \"370303\"\r\n      },\r\n      {\r\n        \"label\": \"博山区\",\r\n        \"value\": \"370304\"\r\n      },\r\n      {\r\n        \"label\": \"临淄区\",\r\n        \"value\": \"370305\"\r\n      },\r\n      {\r\n        \"label\": \"周村区\",\r\n        \"value\": \"370306\"\r\n      },\r\n      {\r\n        \"label\": \"桓台县\",\r\n        \"value\": \"370321\"\r\n      },\r\n      {\r\n        \"label\": \"高青县\",\r\n        \"value\": \"370322\"\r\n      },\r\n      {\r\n        \"label\": \"沂源县\",\r\n        \"value\": \"370323\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"市中区\",\r\n        \"value\": \"370402\"\r\n      },\r\n      {\r\n        \"label\": \"薛城区\",\r\n        \"value\": \"370403\"\r\n      },\r\n      {\r\n        \"label\": \"峄城区\",\r\n        \"value\": \"370404\"\r\n      },\r\n      {\r\n        \"label\": \"台儿庄区\",\r\n        \"value\": \"370405\"\r\n      },\r\n      {\r\n        \"label\": \"山亭区\",\r\n        \"value\": \"370406\"\r\n      },\r\n      {\r\n        \"label\": \"滕州市\",\r\n        \"value\": \"370481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东营区\",\r\n        \"value\": \"370502\"\r\n      },\r\n      {\r\n        \"label\": \"河口区\",\r\n        \"value\": \"370503\"\r\n      },\r\n      {\r\n        \"label\": \"垦利区\",\r\n        \"value\": \"370505\"\r\n      },\r\n      {\r\n        \"label\": \"利津县\",\r\n        \"value\": \"370522\"\r\n      },\r\n      {\r\n        \"label\": \"广饶县\",\r\n        \"value\": \"370523\"\r\n      },\r\n      {\r\n        \"label\": \"东营经济技术开发区\",\r\n        \"value\": \"370571\"\r\n      },\r\n      {\r\n        \"label\": \"东营港经济开发区\",\r\n        \"value\": \"370572\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"芝罘区\",\r\n        \"value\": \"370602\"\r\n      },\r\n      {\r\n        \"label\": \"福山区\",\r\n        \"value\": \"370611\"\r\n      },\r\n      {\r\n        \"label\": \"牟平区\",\r\n        \"value\": \"370612\"\r\n      },\r\n      {\r\n        \"label\": \"莱山区\",\r\n        \"value\": \"370613\"\r\n      },\r\n      {\r\n        \"label\": \"长岛县\",\r\n        \"value\": \"370634\"\r\n      },\r\n      {\r\n        \"label\": \"烟台高新技术产业开发区\",\r\n        \"value\": \"370671\"\r\n      },\r\n      {\r\n        \"label\": \"烟台经济技术开发区\",\r\n        \"value\": \"370672\"\r\n      },\r\n      {\r\n        \"label\": \"龙口市\",\r\n        \"value\": \"370681\"\r\n      },\r\n      {\r\n        \"label\": \"莱阳市\",\r\n        \"value\": \"370682\"\r\n      },\r\n      {\r\n        \"label\": \"莱州市\",\r\n        \"value\": \"370683\"\r\n      },\r\n      {\r\n        \"label\": \"蓬莱市\",\r\n        \"value\": \"370684\"\r\n      },\r\n      {\r\n        \"label\": \"招远市\",\r\n        \"value\": \"370685\"\r\n      },\r\n      {\r\n        \"label\": \"栖霞市\",\r\n        \"value\": \"370686\"\r\n      },\r\n      {\r\n        \"label\": \"海阳市\",\r\n        \"value\": \"370687\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"潍城区\",\r\n        \"value\": \"370702\"\r\n      },\r\n      {\r\n        \"label\": \"寒亭区\",\r\n        \"value\": \"370703\"\r\n      },\r\n      {\r\n        \"label\": \"坊子区\",\r\n        \"value\": \"370704\"\r\n      },\r\n      {\r\n        \"label\": \"奎文区\",\r\n        \"value\": \"370705\"\r\n      },\r\n      {\r\n        \"label\": \"临朐县\",\r\n        \"value\": \"370724\"\r\n      },\r\n      {\r\n        \"label\": \"昌乐县\",\r\n        \"value\": \"370725\"\r\n      },\r\n      {\r\n        \"label\": \"潍坊滨海经济技术开发区\",\r\n        \"value\": \"370772\"\r\n      },\r\n      {\r\n        \"label\": \"青州市\",\r\n        \"value\": \"370781\"\r\n      },\r\n      {\r\n        \"label\": \"诸城市\",\r\n        \"value\": \"370782\"\r\n      },\r\n      {\r\n        \"label\": \"寿光市\",\r\n        \"value\": \"370783\"\r\n      },\r\n      {\r\n        \"label\": \"安丘市\",\r\n        \"value\": \"370784\"\r\n      },\r\n      {\r\n        \"label\": \"高密市\",\r\n        \"value\": \"370785\"\r\n      },\r\n      {\r\n        \"label\": \"昌邑市\",\r\n        \"value\": \"370786\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"任城区\",\r\n        \"value\": \"370811\"\r\n      },\r\n      {\r\n        \"label\": \"兖州区\",\r\n        \"value\": \"370812\"\r\n      },\r\n      {\r\n        \"label\": \"微山县\",\r\n        \"value\": \"370826\"\r\n      },\r\n      {\r\n        \"label\": \"鱼台县\",\r\n        \"value\": \"370827\"\r\n      },\r\n      {\r\n        \"label\": \"金乡县\",\r\n        \"value\": \"370828\"\r\n      },\r\n      {\r\n        \"label\": \"嘉祥县\",\r\n        \"value\": \"370829\"\r\n      },\r\n      {\r\n        \"label\": \"汶上县\",\r\n        \"value\": \"370830\"\r\n      },\r\n      {\r\n        \"label\": \"泗水县\",\r\n        \"value\": \"370831\"\r\n      },\r\n      {\r\n        \"label\": \"梁山县\",\r\n        \"value\": \"370832\"\r\n      },\r\n      {\r\n        \"label\": \"济宁高新技术产业开发区\",\r\n        \"value\": \"370871\"\r\n      },\r\n      {\r\n        \"label\": \"曲阜市\",\r\n        \"value\": \"370881\"\r\n      },\r\n      {\r\n        \"label\": \"邹城市\",\r\n        \"value\": \"370883\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"泰山区\",\r\n        \"value\": \"370902\"\r\n      },\r\n      {\r\n        \"label\": \"岱岳区\",\r\n        \"value\": \"370911\"\r\n      },\r\n      {\r\n        \"label\": \"宁阳县\",\r\n        \"value\": \"370921\"\r\n      },\r\n      {\r\n        \"label\": \"东平县\",\r\n        \"value\": \"370923\"\r\n      },\r\n      {\r\n        \"label\": \"新泰市\",\r\n        \"value\": \"370982\"\r\n      },\r\n      {\r\n        \"label\": \"肥城市\",\r\n        \"value\": \"370983\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"环翠区\",\r\n        \"value\": \"371002\"\r\n      },\r\n      {\r\n        \"label\": \"文登区\",\r\n        \"value\": \"371003\"\r\n      },\r\n      {\r\n        \"label\": \"威海火炬高技术产业开发区\",\r\n        \"value\": \"371071\"\r\n      },\r\n      {\r\n        \"label\": \"威海经济技术开发区\",\r\n        \"value\": \"371072\"\r\n      },\r\n      {\r\n        \"label\": \"威海临港经济技术开发区\",\r\n        \"value\": \"371073\"\r\n      },\r\n      {\r\n        \"label\": \"荣成市\",\r\n        \"value\": \"371082\"\r\n      },\r\n      {\r\n        \"label\": \"乳山市\",\r\n        \"value\": \"371083\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东港区\",\r\n        \"value\": \"371102\"\r\n      },\r\n      {\r\n        \"label\": \"岚山区\",\r\n        \"value\": \"371103\"\r\n      },\r\n      {\r\n        \"label\": \"五莲县\",\r\n        \"value\": \"371121\"\r\n      },\r\n      {\r\n        \"label\": \"莒县\",\r\n        \"value\": \"371122\"\r\n      },\r\n      {\r\n        \"label\": \"日照经济技术开发区\",\r\n        \"value\": \"371171\"\r\n      },\r\n      {\r\n        \"label\": \"日照国际海洋城\",\r\n        \"value\": \"371172\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"莱城区\",\r\n        \"value\": \"371202\"\r\n      },\r\n      {\r\n        \"label\": \"钢城区\",\r\n        \"value\": \"371203\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"兰山区\",\r\n        \"value\": \"371302\"\r\n      },\r\n      {\r\n        \"label\": \"罗庄区\",\r\n        \"value\": \"371311\"\r\n      },\r\n      {\r\n        \"label\": \"河东区\",\r\n        \"value\": \"371312\"\r\n      },\r\n      {\r\n        \"label\": \"沂南县\",\r\n        \"value\": \"371321\"\r\n      },\r\n      {\r\n        \"label\": \"郯城县\",\r\n        \"value\": \"371322\"\r\n      },\r\n      {\r\n        \"label\": \"沂水县\",\r\n        \"value\": \"371323\"\r\n      },\r\n      {\r\n        \"label\": \"兰陵县\",\r\n        \"value\": \"371324\"\r\n      },\r\n      {\r\n        \"label\": \"费县\",\r\n        \"value\": \"371325\"\r\n      },\r\n      {\r\n        \"label\": \"平邑县\",\r\n        \"value\": \"371326\"\r\n      },\r\n      {\r\n        \"label\": \"莒南县\",\r\n        \"value\": \"371327\"\r\n      },\r\n      {\r\n        \"label\": \"蒙阴县\",\r\n        \"value\": \"371328\"\r\n      },\r\n      {\r\n        \"label\": \"临沭县\",\r\n        \"value\": \"371329\"\r\n      },\r\n      {\r\n        \"label\": \"临沂高新技术产业开发区\",\r\n        \"value\": \"371371\"\r\n      },\r\n      {\r\n        \"label\": \"临沂经济技术开发区\",\r\n        \"value\": \"371372\"\r\n      },\r\n      {\r\n        \"label\": \"临沂临港经济开发区\",\r\n        \"value\": \"371373\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"德城区\",\r\n        \"value\": \"371402\"\r\n      },\r\n      {\r\n        \"label\": \"陵城区\",\r\n        \"value\": \"371403\"\r\n      },\r\n      {\r\n        \"label\": \"宁津县\",\r\n        \"value\": \"371422\"\r\n      },\r\n      {\r\n        \"label\": \"庆云县\",\r\n        \"value\": \"371423\"\r\n      },\r\n      {\r\n        \"label\": \"临邑县\",\r\n        \"value\": \"371424\"\r\n      },\r\n      {\r\n        \"label\": \"齐河县\",\r\n        \"value\": \"371425\"\r\n      },\r\n      {\r\n        \"label\": \"平原县\",\r\n        \"value\": \"371426\"\r\n      },\r\n      {\r\n        \"label\": \"夏津县\",\r\n        \"value\": \"371427\"\r\n      },\r\n      {\r\n        \"label\": \"武城县\",\r\n        \"value\": \"371428\"\r\n      },\r\n      {\r\n        \"label\": \"德州经济技术开发区\",\r\n        \"value\": \"371471\"\r\n      },\r\n      {\r\n        \"label\": \"德州运河经济开发区\",\r\n        \"value\": \"371472\"\r\n      },\r\n      {\r\n        \"label\": \"乐陵市\",\r\n        \"value\": \"371481\"\r\n      },\r\n      {\r\n        \"label\": \"禹城市\",\r\n        \"value\": \"371482\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东昌府区\",\r\n        \"value\": \"371502\"\r\n      },\r\n      {\r\n        \"label\": \"阳谷县\",\r\n        \"value\": \"371521\"\r\n      },\r\n      {\r\n        \"label\": \"莘县\",\r\n        \"value\": \"371522\"\r\n      },\r\n      {\r\n        \"label\": \"茌平县\",\r\n        \"value\": \"371523\"\r\n      },\r\n      {\r\n        \"label\": \"东阿县\",\r\n        \"value\": \"371524\"\r\n      },\r\n      {\r\n        \"label\": \"冠县\",\r\n        \"value\": \"371525\"\r\n      },\r\n      {\r\n        \"label\": \"高唐县\",\r\n        \"value\": \"371526\"\r\n      },\r\n      {\r\n        \"label\": \"临清市\",\r\n        \"value\": \"371581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"滨城区\",\r\n        \"value\": \"371602\"\r\n      },\r\n      {\r\n        \"label\": \"沾化区\",\r\n        \"value\": \"371603\"\r\n      },\r\n      {\r\n        \"label\": \"惠民县\",\r\n        \"value\": \"371621\"\r\n      },\r\n      {\r\n        \"label\": \"阳信县\",\r\n        \"value\": \"371622\"\r\n      },\r\n      {\r\n        \"label\": \"无棣县\",\r\n        \"value\": \"371623\"\r\n      },\r\n      {\r\n        \"label\": \"博兴县\",\r\n        \"value\": \"371625\"\r\n      },\r\n      {\r\n        \"label\": \"邹平县\",\r\n        \"value\": \"371626\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"牡丹区\",\r\n        \"value\": \"371702\"\r\n      },\r\n      {\r\n        \"label\": \"定陶区\",\r\n        \"value\": \"371703\"\r\n      },\r\n      {\r\n        \"label\": \"曹县\",\r\n        \"value\": \"371721\"\r\n      },\r\n      {\r\n        \"label\": \"单县\",\r\n        \"value\": \"371722\"\r\n      },\r\n      {\r\n        \"label\": \"成武县\",\r\n        \"value\": \"371723\"\r\n      },\r\n      {\r\n        \"label\": \"巨野县\",\r\n        \"value\": \"371724\"\r\n      },\r\n      {\r\n        \"label\": \"郓城县\",\r\n        \"value\": \"371725\"\r\n      },\r\n      {\r\n        \"label\": \"鄄城县\",\r\n        \"value\": \"371726\"\r\n      },\r\n      {\r\n        \"label\": \"东明县\",\r\n        \"value\": \"371728\"\r\n      },\r\n      {\r\n        \"label\": \"菏泽经济技术开发区\",\r\n        \"value\": \"371771\"\r\n      },\r\n      {\r\n        \"label\": \"菏泽高新技术开发区\",\r\n        \"value\": \"371772\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"中原区\",\r\n        \"value\": \"410102\"\r\n      },\r\n      {\r\n        \"label\": \"二七区\",\r\n        \"value\": \"410103\"\r\n      },\r\n      {\r\n        \"label\": \"管城回族区\",\r\n        \"value\": \"410104\"\r\n      },\r\n      {\r\n        \"label\": \"金水区\",\r\n        \"value\": \"410105\"\r\n      },\r\n      {\r\n        \"label\": \"上街区\",\r\n        \"value\": \"410106\"\r\n      },\r\n      {\r\n        \"label\": \"惠济区\",\r\n        \"value\": \"410108\"\r\n      },\r\n      {\r\n        \"label\": \"中牟县\",\r\n        \"value\": \"410122\"\r\n      },\r\n      {\r\n        \"label\": \"郑州经济技术开发区\",\r\n        \"value\": \"410171\"\r\n      },\r\n      {\r\n        \"label\": \"郑州高新技术产业开发区\",\r\n        \"value\": \"410172\"\r\n      },\r\n      {\r\n        \"label\": \"郑州航空港经济综合实验区\",\r\n        \"value\": \"410173\"\r\n      },\r\n      {\r\n        \"label\": \"巩义市\",\r\n        \"value\": \"410181\"\r\n      },\r\n      {\r\n        \"label\": \"荥阳市\",\r\n        \"value\": \"410182\"\r\n      },\r\n      {\r\n        \"label\": \"新密市\",\r\n        \"value\": \"410183\"\r\n      },\r\n      {\r\n        \"label\": \"新郑市\",\r\n        \"value\": \"410184\"\r\n      },\r\n      {\r\n        \"label\": \"登封市\",\r\n        \"value\": \"410185\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"龙亭区\",\r\n        \"value\": \"410202\"\r\n      },\r\n      {\r\n        \"label\": \"顺河回族区\",\r\n        \"value\": \"410203\"\r\n      },\r\n      {\r\n        \"label\": \"鼓楼区\",\r\n        \"value\": \"410204\"\r\n      },\r\n      {\r\n        \"label\": \"禹王台区\",\r\n        \"value\": \"410205\"\r\n      },\r\n      {\r\n        \"label\": \"祥符区\",\r\n        \"value\": \"410212\"\r\n      },\r\n      {\r\n        \"label\": \"杞县\",\r\n        \"value\": \"410221\"\r\n      },\r\n      {\r\n        \"label\": \"通许县\",\r\n        \"value\": \"410222\"\r\n      },\r\n      {\r\n        \"label\": \"尉氏县\",\r\n        \"value\": \"410223\"\r\n      },\r\n      {\r\n        \"label\": \"兰考县\",\r\n        \"value\": \"410225\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"老城区\",\r\n        \"value\": \"410302\"\r\n      },\r\n      {\r\n        \"label\": \"西工区\",\r\n        \"value\": \"410303\"\r\n      },\r\n      {\r\n        \"label\": \"瀍河回族区\",\r\n        \"value\": \"410304\"\r\n      },\r\n      {\r\n        \"label\": \"涧西区\",\r\n        \"value\": \"410305\"\r\n      },\r\n      {\r\n        \"label\": \"吉利区\",\r\n        \"value\": \"410306\"\r\n      },\r\n      {\r\n        \"label\": \"洛龙区\",\r\n        \"value\": \"410311\"\r\n      },\r\n      {\r\n        \"label\": \"孟津县\",\r\n        \"value\": \"410322\"\r\n      },\r\n      {\r\n        \"label\": \"新安县\",\r\n        \"value\": \"410323\"\r\n      },\r\n      {\r\n        \"label\": \"栾川县\",\r\n        \"value\": \"410324\"\r\n      },\r\n      {\r\n        \"label\": \"嵩县\",\r\n        \"value\": \"410325\"\r\n      },\r\n      {\r\n        \"label\": \"汝阳县\",\r\n        \"value\": \"410326\"\r\n      },\r\n      {\r\n        \"label\": \"宜阳县\",\r\n        \"value\": \"410327\"\r\n      },\r\n      {\r\n        \"label\": \"洛宁县\",\r\n        \"value\": \"410328\"\r\n      },\r\n      {\r\n        \"label\": \"伊川县\",\r\n        \"value\": \"410329\"\r\n      },\r\n      {\r\n        \"label\": \"洛阳高新技术产业开发区\",\r\n        \"value\": \"410371\"\r\n      },\r\n      {\r\n        \"label\": \"偃师市\",\r\n        \"value\": \"410381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"新华区\",\r\n        \"value\": \"410402\"\r\n      },\r\n      {\r\n        \"label\": \"卫东区\",\r\n        \"value\": \"410403\"\r\n      },\r\n      {\r\n        \"label\": \"石龙区\",\r\n        \"value\": \"410404\"\r\n      },\r\n      {\r\n        \"label\": \"湛河区\",\r\n        \"value\": \"410411\"\r\n      },\r\n      {\r\n        \"label\": \"宝丰县\",\r\n        \"value\": \"410421\"\r\n      },\r\n      {\r\n        \"label\": \"叶县\",\r\n        \"value\": \"410422\"\r\n      },\r\n      {\r\n        \"label\": \"鲁山县\",\r\n        \"value\": \"410423\"\r\n      },\r\n      {\r\n        \"label\": \"郏县\",\r\n        \"value\": \"410425\"\r\n      },\r\n      {\r\n        \"label\": \"平顶山高新技术产业开发区\",\r\n        \"value\": \"410471\"\r\n      },\r\n      {\r\n        \"label\": \"平顶山市新城区\",\r\n        \"value\": \"410472\"\r\n      },\r\n      {\r\n        \"label\": \"舞钢市\",\r\n        \"value\": \"410481\"\r\n      },\r\n      {\r\n        \"label\": \"汝州市\",\r\n        \"value\": \"410482\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"文峰区\",\r\n        \"value\": \"410502\"\r\n      },\r\n      {\r\n        \"label\": \"北关区\",\r\n        \"value\": \"410503\"\r\n      },\r\n      {\r\n        \"label\": \"殷都区\",\r\n        \"value\": \"410505\"\r\n      },\r\n      {\r\n        \"label\": \"龙安区\",\r\n        \"value\": \"410506\"\r\n      },\r\n      {\r\n        \"label\": \"安阳县\",\r\n        \"value\": \"410522\"\r\n      },\r\n      {\r\n        \"label\": \"汤阴县\",\r\n        \"value\": \"410523\"\r\n      },\r\n      {\r\n        \"label\": \"滑县\",\r\n        \"value\": \"410526\"\r\n      },\r\n      {\r\n        \"label\": \"内黄县\",\r\n        \"value\": \"410527\"\r\n      },\r\n      {\r\n        \"label\": \"安阳高新技术产业开发区\",\r\n        \"value\": \"410571\"\r\n      },\r\n      {\r\n        \"label\": \"林州市\",\r\n        \"value\": \"410581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"鹤山区\",\r\n        \"value\": \"410602\"\r\n      },\r\n      {\r\n        \"label\": \"山城区\",\r\n        \"value\": \"410603\"\r\n      },\r\n      {\r\n        \"label\": \"淇滨区\",\r\n        \"value\": \"410611\"\r\n      },\r\n      {\r\n        \"label\": \"浚县\",\r\n        \"value\": \"410621\"\r\n      },\r\n      {\r\n        \"label\": \"淇县\",\r\n        \"value\": \"410622\"\r\n      },\r\n      {\r\n        \"label\": \"鹤壁经济技术开发区\",\r\n        \"value\": \"410671\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"红旗区\",\r\n        \"value\": \"410702\"\r\n      },\r\n      {\r\n        \"label\": \"卫滨区\",\r\n        \"value\": \"410703\"\r\n      },\r\n      {\r\n        \"label\": \"凤泉区\",\r\n        \"value\": \"410704\"\r\n      },\r\n      {\r\n        \"label\": \"牧野区\",\r\n        \"value\": \"410711\"\r\n      },\r\n      {\r\n        \"label\": \"新乡县\",\r\n        \"value\": \"410721\"\r\n      },\r\n      {\r\n        \"label\": \"获嘉县\",\r\n        \"value\": \"410724\"\r\n      },\r\n      {\r\n        \"label\": \"原阳县\",\r\n        \"value\": \"410725\"\r\n      },\r\n      {\r\n        \"label\": \"延津县\",\r\n        \"value\": \"410726\"\r\n      },\r\n      {\r\n        \"label\": \"封丘县\",\r\n        \"value\": \"410727\"\r\n      },\r\n      {\r\n        \"label\": \"长垣县\",\r\n        \"value\": \"410728\"\r\n      },\r\n      {\r\n        \"label\": \"新乡高新技术产业开发区\",\r\n        \"value\": \"410771\"\r\n      },\r\n      {\r\n        \"label\": \"新乡经济技术开发区\",\r\n        \"value\": \"410772\"\r\n      },\r\n      {\r\n        \"label\": \"新乡市平原城乡一体化示范区\",\r\n        \"value\": \"410773\"\r\n      },\r\n      {\r\n        \"label\": \"卫辉市\",\r\n        \"value\": \"410781\"\r\n      },\r\n      {\r\n        \"label\": \"辉县市\",\r\n        \"value\": \"410782\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"解放区\",\r\n        \"value\": \"410802\"\r\n      },\r\n      {\r\n        \"label\": \"中站区\",\r\n        \"value\": \"410803\"\r\n      },\r\n      {\r\n        \"label\": \"马村区\",\r\n        \"value\": \"410804\"\r\n      },\r\n      {\r\n        \"label\": \"山阳区\",\r\n        \"value\": \"410811\"\r\n      },\r\n      {\r\n        \"label\": \"修武县\",\r\n        \"value\": \"410821\"\r\n      },\r\n      {\r\n        \"label\": \"博爱县\",\r\n        \"value\": \"410822\"\r\n      },\r\n      {\r\n        \"label\": \"武陟县\",\r\n        \"value\": \"410823\"\r\n      },\r\n      {\r\n        \"label\": \"温县\",\r\n        \"value\": \"410825\"\r\n      },\r\n      {\r\n        \"label\": \"焦作城乡一体化示范区\",\r\n        \"value\": \"410871\"\r\n      },\r\n      {\r\n        \"label\": \"沁阳市\",\r\n        \"value\": \"410882\"\r\n      },\r\n      {\r\n        \"label\": \"孟州市\",\r\n        \"value\": \"410883\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"华龙区\",\r\n        \"value\": \"410902\"\r\n      },\r\n      {\r\n        \"label\": \"清丰县\",\r\n        \"value\": \"410922\"\r\n      },\r\n      {\r\n        \"label\": \"南乐县\",\r\n        \"value\": \"410923\"\r\n      },\r\n      {\r\n        \"label\": \"范县\",\r\n        \"value\": \"410926\"\r\n      },\r\n      {\r\n        \"label\": \"台前县\",\r\n        \"value\": \"410927\"\r\n      },\r\n      {\r\n        \"label\": \"濮阳县\",\r\n        \"value\": \"410928\"\r\n      },\r\n      {\r\n        \"label\": \"河南濮阳工业园区\",\r\n        \"value\": \"410971\"\r\n      },\r\n      {\r\n        \"label\": \"濮阳经济技术开发区\",\r\n        \"value\": \"410972\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"魏都区\",\r\n        \"value\": \"411002\"\r\n      },\r\n      {\r\n        \"label\": \"建安区\",\r\n        \"value\": \"411003\"\r\n      },\r\n      {\r\n        \"label\": \"鄢陵县\",\r\n        \"value\": \"411024\"\r\n      },\r\n      {\r\n        \"label\": \"襄城县\",\r\n        \"value\": \"411025\"\r\n      },\r\n      {\r\n        \"label\": \"许昌经济技术开发区\",\r\n        \"value\": \"411071\"\r\n      },\r\n      {\r\n        \"label\": \"禹州市\",\r\n        \"value\": \"411081\"\r\n      },\r\n      {\r\n        \"label\": \"长葛市\",\r\n        \"value\": \"411082\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"源汇区\",\r\n        \"value\": \"411102\"\r\n      },\r\n      {\r\n        \"label\": \"郾城区\",\r\n        \"value\": \"411103\"\r\n      },\r\n      {\r\n        \"label\": \"召陵区\",\r\n        \"value\": \"411104\"\r\n      },\r\n      {\r\n        \"label\": \"舞阳县\",\r\n        \"value\": \"411121\"\r\n      },\r\n      {\r\n        \"label\": \"临颍县\",\r\n        \"value\": \"411122\"\r\n      },\r\n      {\r\n        \"label\": \"漯河经济技术开发区\",\r\n        \"value\": \"411171\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"湖滨区\",\r\n        \"value\": \"411202\"\r\n      },\r\n      {\r\n        \"label\": \"陕州区\",\r\n        \"value\": \"411203\"\r\n      },\r\n      {\r\n        \"label\": \"渑池县\",\r\n        \"value\": \"411221\"\r\n      },\r\n      {\r\n        \"label\": \"卢氏县\",\r\n        \"value\": \"411224\"\r\n      },\r\n      {\r\n        \"label\": \"河南三门峡经济开发区\",\r\n        \"value\": \"411271\"\r\n      },\r\n      {\r\n        \"label\": \"义马市\",\r\n        \"value\": \"411281\"\r\n      },\r\n      {\r\n        \"label\": \"灵宝市\",\r\n        \"value\": \"411282\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"宛城区\",\r\n        \"value\": \"411302\"\r\n      },\r\n      {\r\n        \"label\": \"卧龙区\",\r\n        \"value\": \"411303\"\r\n      },\r\n      {\r\n        \"label\": \"南召县\",\r\n        \"value\": \"411321\"\r\n      },\r\n      {\r\n        \"label\": \"方城县\",\r\n        \"value\": \"411322\"\r\n      },\r\n      {\r\n        \"label\": \"西峡县\",\r\n        \"value\": \"411323\"\r\n      },\r\n      {\r\n        \"label\": \"镇平县\",\r\n        \"value\": \"411324\"\r\n      },\r\n      {\r\n        \"label\": \"内乡县\",\r\n        \"value\": \"411325\"\r\n      },\r\n      {\r\n        \"label\": \"淅川县\",\r\n        \"value\": \"411326\"\r\n      },\r\n      {\r\n        \"label\": \"社旗县\",\r\n        \"value\": \"411327\"\r\n      },\r\n      {\r\n        \"label\": \"唐河县\",\r\n        \"value\": \"411328\"\r\n      },\r\n      {\r\n        \"label\": \"新野县\",\r\n        \"value\": \"411329\"\r\n      },\r\n      {\r\n        \"label\": \"桐柏县\",\r\n        \"value\": \"411330\"\r\n      },\r\n      {\r\n        \"label\": \"南阳高新技术产业开发区\",\r\n        \"value\": \"411371\"\r\n      },\r\n      {\r\n        \"label\": \"南阳市城乡一体化示范区\",\r\n        \"value\": \"411372\"\r\n      },\r\n      {\r\n        \"label\": \"邓州市\",\r\n        \"value\": \"411381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"梁园区\",\r\n        \"value\": \"411402\"\r\n      },\r\n      {\r\n        \"label\": \"睢阳区\",\r\n        \"value\": \"411403\"\r\n      },\r\n      {\r\n        \"label\": \"民权县\",\r\n        \"value\": \"411421\"\r\n      },\r\n      {\r\n        \"label\": \"睢县\",\r\n        \"value\": \"411422\"\r\n      },\r\n      {\r\n        \"label\": \"宁陵县\",\r\n        \"value\": \"411423\"\r\n      },\r\n      {\r\n        \"label\": \"柘城县\",\r\n        \"value\": \"411424\"\r\n      },\r\n      {\r\n        \"label\": \"虞城县\",\r\n        \"value\": \"411425\"\r\n      },\r\n      {\r\n        \"label\": \"夏邑县\",\r\n        \"value\": \"411426\"\r\n      },\r\n      {\r\n        \"label\": \"豫东综合物流产业聚集区\",\r\n        \"value\": \"411471\"\r\n      },\r\n      {\r\n        \"label\": \"河南商丘经济开发区\",\r\n        \"value\": \"411472\"\r\n      },\r\n      {\r\n        \"label\": \"永城市\",\r\n        \"value\": \"411481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"浉河区\",\r\n        \"value\": \"411502\"\r\n      },\r\n      {\r\n        \"label\": \"平桥区\",\r\n        \"value\": \"411503\"\r\n      },\r\n      {\r\n        \"label\": \"罗山县\",\r\n        \"value\": \"411521\"\r\n      },\r\n      {\r\n        \"label\": \"光山县\",\r\n        \"value\": \"411522\"\r\n      },\r\n      {\r\n        \"label\": \"新县\",\r\n        \"value\": \"411523\"\r\n      },\r\n      {\r\n        \"label\": \"商城县\",\r\n        \"value\": \"411524\"\r\n      },\r\n      {\r\n        \"label\": \"固始县\",\r\n        \"value\": \"411525\"\r\n      },\r\n      {\r\n        \"label\": \"潢川县\",\r\n        \"value\": \"411526\"\r\n      },\r\n      {\r\n        \"label\": \"淮滨县\",\r\n        \"value\": \"411527\"\r\n      },\r\n      {\r\n        \"label\": \"息县\",\r\n        \"value\": \"411528\"\r\n      },\r\n      {\r\n        \"label\": \"信阳高新技术产业开发区\",\r\n        \"value\": \"411571\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"川汇区\",\r\n        \"value\": \"411602\"\r\n      },\r\n      {\r\n        \"label\": \"扶沟县\",\r\n        \"value\": \"411621\"\r\n      },\r\n      {\r\n        \"label\": \"西华县\",\r\n        \"value\": \"411622\"\r\n      },\r\n      {\r\n        \"label\": \"商水县\",\r\n        \"value\": \"411623\"\r\n      },\r\n      {\r\n        \"label\": \"沈丘县\",\r\n        \"value\": \"411624\"\r\n      },\r\n      {\r\n        \"label\": \"郸城县\",\r\n        \"value\": \"411625\"\r\n      },\r\n      {\r\n        \"label\": \"淮阳县\",\r\n        \"value\": \"411626\"\r\n      },\r\n      {\r\n        \"label\": \"太康县\",\r\n        \"value\": \"411627\"\r\n      },\r\n      {\r\n        \"label\": \"鹿邑县\",\r\n        \"value\": \"411628\"\r\n      },\r\n      {\r\n        \"label\": \"河南周口经济开发区\",\r\n        \"value\": \"411671\"\r\n      },\r\n      {\r\n        \"label\": \"项城市\",\r\n        \"value\": \"411681\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"驿城区\",\r\n        \"value\": \"411702\"\r\n      },\r\n      {\r\n        \"label\": \"西平县\",\r\n        \"value\": \"411721\"\r\n      },\r\n      {\r\n        \"label\": \"上蔡县\",\r\n        \"value\": \"411722\"\r\n      },\r\n      {\r\n        \"label\": \"平舆县\",\r\n        \"value\": \"411723\"\r\n      },\r\n      {\r\n        \"label\": \"正阳县\",\r\n        \"value\": \"411724\"\r\n      },\r\n      {\r\n        \"label\": \"确山县\",\r\n        \"value\": \"411725\"\r\n      },\r\n      {\r\n        \"label\": \"泌阳县\",\r\n        \"value\": \"411726\"\r\n      },\r\n      {\r\n        \"label\": \"汝南县\",\r\n        \"value\": \"411727\"\r\n      },\r\n      {\r\n        \"label\": \"遂平县\",\r\n        \"value\": \"411728\"\r\n      },\r\n      {\r\n        \"label\": \"新蔡县\",\r\n        \"value\": \"411729\"\r\n      },\r\n      {\r\n        \"label\": \"河南驻马店经济开发区\",\r\n        \"value\": \"411771\"\r\n      }\r\n    ],\r\n    [{\r\n      \"label\": \"济源市\",\r\n      \"value\": \"419001\"\r\n    }]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"江岸区\",\r\n        \"value\": \"420102\"\r\n      },\r\n      {\r\n        \"label\": \"江汉区\",\r\n        \"value\": \"420103\"\r\n      },\r\n      {\r\n        \"label\": \"硚口区\",\r\n        \"value\": \"420104\"\r\n      },\r\n      {\r\n        \"label\": \"汉阳区\",\r\n        \"value\": \"420105\"\r\n      },\r\n      {\r\n        \"label\": \"武昌区\",\r\n        \"value\": \"420106\"\r\n      },\r\n      {\r\n        \"label\": \"青山区\",\r\n        \"value\": \"420107\"\r\n      },\r\n      {\r\n        \"label\": \"洪山区\",\r\n        \"value\": \"420111\"\r\n      },\r\n      {\r\n        \"label\": \"东西湖区\",\r\n        \"value\": \"420112\"\r\n      },\r\n      {\r\n        \"label\": \"汉南区\",\r\n        \"value\": \"420113\"\r\n      },\r\n      {\r\n        \"label\": \"蔡甸区\",\r\n        \"value\": \"420114\"\r\n      },\r\n      {\r\n        \"label\": \"江夏区\",\r\n        \"value\": \"420115\"\r\n      },\r\n      {\r\n        \"label\": \"黄陂区\",\r\n        \"value\": \"420116\"\r\n      },\r\n      {\r\n        \"label\": \"新洲区\",\r\n        \"value\": \"420117\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"黄石港区\",\r\n        \"value\": \"420202\"\r\n      },\r\n      {\r\n        \"label\": \"西塞山区\",\r\n        \"value\": \"420203\"\r\n      },\r\n      {\r\n        \"label\": \"下陆区\",\r\n        \"value\": \"420204\"\r\n      },\r\n      {\r\n        \"label\": \"铁山区\",\r\n        \"value\": \"420205\"\r\n      },\r\n      {\r\n        \"label\": \"阳新县\",\r\n        \"value\": \"420222\"\r\n      },\r\n      {\r\n        \"label\": \"大冶市\",\r\n        \"value\": \"420281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"茅箭区\",\r\n        \"value\": \"420302\"\r\n      },\r\n      {\r\n        \"label\": \"张湾区\",\r\n        \"value\": \"420303\"\r\n      },\r\n      {\r\n        \"label\": \"郧阳区\",\r\n        \"value\": \"420304\"\r\n      },\r\n      {\r\n        \"label\": \"郧西县\",\r\n        \"value\": \"420322\"\r\n      },\r\n      {\r\n        \"label\": \"竹山县\",\r\n        \"value\": \"420323\"\r\n      },\r\n      {\r\n        \"label\": \"竹溪县\",\r\n        \"value\": \"420324\"\r\n      },\r\n      {\r\n        \"label\": \"房县\",\r\n        \"value\": \"420325\"\r\n      },\r\n      {\r\n        \"label\": \"丹江口市\",\r\n        \"value\": \"420381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"西陵区\",\r\n        \"value\": \"420502\"\r\n      },\r\n      {\r\n        \"label\": \"伍家岗区\",\r\n        \"value\": \"420503\"\r\n      },\r\n      {\r\n        \"label\": \"点军区\",\r\n        \"value\": \"420504\"\r\n      },\r\n      {\r\n        \"label\": \"猇亭区\",\r\n        \"value\": \"420505\"\r\n      },\r\n      {\r\n        \"label\": \"夷陵区\",\r\n        \"value\": \"420506\"\r\n      },\r\n      {\r\n        \"label\": \"远安县\",\r\n        \"value\": \"420525\"\r\n      },\r\n      {\r\n        \"label\": \"兴山县\",\r\n        \"value\": \"420526\"\r\n      },\r\n      {\r\n        \"label\": \"秭归县\",\r\n        \"value\": \"420527\"\r\n      },\r\n      {\r\n        \"label\": \"长阳土家族自治县\",\r\n        \"value\": \"420528\"\r\n      },\r\n      {\r\n        \"label\": \"五峰土家族自治县\",\r\n        \"value\": \"420529\"\r\n      },\r\n      {\r\n        \"label\": \"宜都市\",\r\n        \"value\": \"420581\"\r\n      },\r\n      {\r\n        \"label\": \"当阳市\",\r\n        \"value\": \"420582\"\r\n      },\r\n      {\r\n        \"label\": \"枝江市\",\r\n        \"value\": \"420583\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"襄城区\",\r\n        \"value\": \"420602\"\r\n      },\r\n      {\r\n        \"label\": \"樊城区\",\r\n        \"value\": \"420606\"\r\n      },\r\n      {\r\n        \"label\": \"襄州区\",\r\n        \"value\": \"420607\"\r\n      },\r\n      {\r\n        \"label\": \"南漳县\",\r\n        \"value\": \"420624\"\r\n      },\r\n      {\r\n        \"label\": \"谷城县\",\r\n        \"value\": \"420625\"\r\n      },\r\n      {\r\n        \"label\": \"保康县\",\r\n        \"value\": \"420626\"\r\n      },\r\n      {\r\n        \"label\": \"老河口市\",\r\n        \"value\": \"420682\"\r\n      },\r\n      {\r\n        \"label\": \"枣阳市\",\r\n        \"value\": \"420683\"\r\n      },\r\n      {\r\n        \"label\": \"宜城市\",\r\n        \"value\": \"420684\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"梁子湖区\",\r\n        \"value\": \"420702\"\r\n      },\r\n      {\r\n        \"label\": \"华容区\",\r\n        \"value\": \"420703\"\r\n      },\r\n      {\r\n        \"label\": \"鄂城区\",\r\n        \"value\": \"420704\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东宝区\",\r\n        \"value\": \"420802\"\r\n      },\r\n      {\r\n        \"label\": \"掇刀区\",\r\n        \"value\": \"420804\"\r\n      },\r\n      {\r\n        \"label\": \"京山县\",\r\n        \"value\": \"420821\"\r\n      },\r\n      {\r\n        \"label\": \"沙洋县\",\r\n        \"value\": \"420822\"\r\n      },\r\n      {\r\n        \"label\": \"钟祥市\",\r\n        \"value\": \"420881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"孝南区\",\r\n        \"value\": \"420902\"\r\n      },\r\n      {\r\n        \"label\": \"孝昌县\",\r\n        \"value\": \"420921\"\r\n      },\r\n      {\r\n        \"label\": \"大悟县\",\r\n        \"value\": \"420922\"\r\n      },\r\n      {\r\n        \"label\": \"云梦县\",\r\n        \"value\": \"420923\"\r\n      },\r\n      {\r\n        \"label\": \"应城市\",\r\n        \"value\": \"420981\"\r\n      },\r\n      {\r\n        \"label\": \"安陆市\",\r\n        \"value\": \"420982\"\r\n      },\r\n      {\r\n        \"label\": \"汉川市\",\r\n        \"value\": \"420984\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"沙市区\",\r\n        \"value\": \"421002\"\r\n      },\r\n      {\r\n        \"label\": \"荆州区\",\r\n        \"value\": \"421003\"\r\n      },\r\n      {\r\n        \"label\": \"公安县\",\r\n        \"value\": \"421022\"\r\n      },\r\n      {\r\n        \"label\": \"监利县\",\r\n        \"value\": \"421023\"\r\n      },\r\n      {\r\n        \"label\": \"江陵县\",\r\n        \"value\": \"421024\"\r\n      },\r\n      {\r\n        \"label\": \"荆州经济技术开发区\",\r\n        \"value\": \"421071\"\r\n      },\r\n      {\r\n        \"label\": \"石首市\",\r\n        \"value\": \"421081\"\r\n      },\r\n      {\r\n        \"label\": \"洪湖市\",\r\n        \"value\": \"421083\"\r\n      },\r\n      {\r\n        \"label\": \"松滋市\",\r\n        \"value\": \"421087\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"黄州区\",\r\n        \"value\": \"421102\"\r\n      },\r\n      {\r\n        \"label\": \"团风县\",\r\n        \"value\": \"421121\"\r\n      },\r\n      {\r\n        \"label\": \"红安县\",\r\n        \"value\": \"421122\"\r\n      },\r\n      {\r\n        \"label\": \"罗田县\",\r\n        \"value\": \"421123\"\r\n      },\r\n      {\r\n        \"label\": \"英山县\",\r\n        \"value\": \"421124\"\r\n      },\r\n      {\r\n        \"label\": \"浠水县\",\r\n        \"value\": \"421125\"\r\n      },\r\n      {\r\n        \"label\": \"蕲春县\",\r\n        \"value\": \"421126\"\r\n      },\r\n      {\r\n        \"label\": \"黄梅县\",\r\n        \"value\": \"421127\"\r\n      },\r\n      {\r\n        \"label\": \"龙感湖管理区\",\r\n        \"value\": \"421171\"\r\n      },\r\n      {\r\n        \"label\": \"麻城市\",\r\n        \"value\": \"421181\"\r\n      },\r\n      {\r\n        \"label\": \"武穴市\",\r\n        \"value\": \"421182\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"咸安区\",\r\n        \"value\": \"421202\"\r\n      },\r\n      {\r\n        \"label\": \"嘉鱼县\",\r\n        \"value\": \"421221\"\r\n      },\r\n      {\r\n        \"label\": \"通城县\",\r\n        \"value\": \"421222\"\r\n      },\r\n      {\r\n        \"label\": \"崇阳县\",\r\n        \"value\": \"421223\"\r\n      },\r\n      {\r\n        \"label\": \"通山县\",\r\n        \"value\": \"421224\"\r\n      },\r\n      {\r\n        \"label\": \"赤壁市\",\r\n        \"value\": \"421281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"曾都区\",\r\n        \"value\": \"421303\"\r\n      },\r\n      {\r\n        \"label\": \"随县\",\r\n        \"value\": \"421321\"\r\n      },\r\n      {\r\n        \"label\": \"广水市\",\r\n        \"value\": \"421381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"恩施市\",\r\n        \"value\": \"422801\"\r\n      },\r\n      {\r\n        \"label\": \"利川市\",\r\n        \"value\": \"422802\"\r\n      },\r\n      {\r\n        \"label\": \"建始县\",\r\n        \"value\": \"422822\"\r\n      },\r\n      {\r\n        \"label\": \"巴东县\",\r\n        \"value\": \"422823\"\r\n      },\r\n      {\r\n        \"label\": \"宣恩县\",\r\n        \"value\": \"422825\"\r\n      },\r\n      {\r\n        \"label\": \"咸丰县\",\r\n        \"value\": \"422826\"\r\n      },\r\n      {\r\n        \"label\": \"来凤县\",\r\n        \"value\": \"422827\"\r\n      },\r\n      {\r\n        \"label\": \"鹤峰县\",\r\n        \"value\": \"422828\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"仙桃市\",\r\n        \"value\": \"429004\"\r\n      },\r\n      {\r\n        \"label\": \"潜江市\",\r\n        \"value\": \"429005\"\r\n      },\r\n      {\r\n        \"label\": \"天门市\",\r\n        \"value\": \"429006\"\r\n      },\r\n      {\r\n        \"label\": \"神农架林区\",\r\n        \"value\": \"429021\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"芙蓉区\",\r\n        \"value\": \"430102\"\r\n      },\r\n      {\r\n        \"label\": \"天心区\",\r\n        \"value\": \"430103\"\r\n      },\r\n      {\r\n        \"label\": \"岳麓区\",\r\n        \"value\": \"430104\"\r\n      },\r\n      {\r\n        \"label\": \"开福区\",\r\n        \"value\": \"430105\"\r\n      },\r\n      {\r\n        \"label\": \"雨花区\",\r\n        \"value\": \"430111\"\r\n      },\r\n      {\r\n        \"label\": \"望城区\",\r\n        \"value\": \"430112\"\r\n      },\r\n      {\r\n        \"label\": \"长沙县\",\r\n        \"value\": \"430121\"\r\n      },\r\n      {\r\n        \"label\": \"浏阳市\",\r\n        \"value\": \"430181\"\r\n      },\r\n      {\r\n        \"label\": \"宁乡市\",\r\n        \"value\": \"430182\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"荷塘区\",\r\n        \"value\": \"430202\"\r\n      },\r\n      {\r\n        \"label\": \"芦淞区\",\r\n        \"value\": \"430203\"\r\n      },\r\n      {\r\n        \"label\": \"石峰区\",\r\n        \"value\": \"430204\"\r\n      },\r\n      {\r\n        \"label\": \"天元区\",\r\n        \"value\": \"430211\"\r\n      },\r\n      {\r\n        \"label\": \"株洲县\",\r\n        \"value\": \"430221\"\r\n      },\r\n      {\r\n        \"label\": \"攸县\",\r\n        \"value\": \"430223\"\r\n      },\r\n      {\r\n        \"label\": \"茶陵县\",\r\n        \"value\": \"430224\"\r\n      },\r\n      {\r\n        \"label\": \"炎陵县\",\r\n        \"value\": \"430225\"\r\n      },\r\n      {\r\n        \"label\": \"云龙示范区\",\r\n        \"value\": \"430271\"\r\n      },\r\n      {\r\n        \"label\": \"醴陵市\",\r\n        \"value\": \"430281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"雨湖区\",\r\n        \"value\": \"430302\"\r\n      },\r\n      {\r\n        \"label\": \"岳塘区\",\r\n        \"value\": \"430304\"\r\n      },\r\n      {\r\n        \"label\": \"湘潭县\",\r\n        \"value\": \"430321\"\r\n      },\r\n      {\r\n        \"label\": \"湖南湘潭高新技术产业园区\",\r\n        \"value\": \"430371\"\r\n      },\r\n      {\r\n        \"label\": \"湘潭昭山示范区\",\r\n        \"value\": \"430372\"\r\n      },\r\n      {\r\n        \"label\": \"湘潭九华示范区\",\r\n        \"value\": \"430373\"\r\n      },\r\n      {\r\n        \"label\": \"湘乡市\",\r\n        \"value\": \"430381\"\r\n      },\r\n      {\r\n        \"label\": \"韶山市\",\r\n        \"value\": \"430382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"珠晖区\",\r\n        \"value\": \"430405\"\r\n      },\r\n      {\r\n        \"label\": \"雁峰区\",\r\n        \"value\": \"430406\"\r\n      },\r\n      {\r\n        \"label\": \"石鼓区\",\r\n        \"value\": \"430407\"\r\n      },\r\n      {\r\n        \"label\": \"蒸湘区\",\r\n        \"value\": \"430408\"\r\n      },\r\n      {\r\n        \"label\": \"南岳区\",\r\n        \"value\": \"430412\"\r\n      },\r\n      {\r\n        \"label\": \"衡阳县\",\r\n        \"value\": \"430421\"\r\n      },\r\n      {\r\n        \"label\": \"衡南县\",\r\n        \"value\": \"430422\"\r\n      },\r\n      {\r\n        \"label\": \"衡山县\",\r\n        \"value\": \"430423\"\r\n      },\r\n      {\r\n        \"label\": \"衡东县\",\r\n        \"value\": \"430424\"\r\n      },\r\n      {\r\n        \"label\": \"祁东县\",\r\n        \"value\": \"430426\"\r\n      },\r\n      {\r\n        \"label\": \"衡阳综合保税区\",\r\n        \"value\": \"430471\"\r\n      },\r\n      {\r\n        \"label\": \"湖南衡阳高新技术产业园区\",\r\n        \"value\": \"430472\"\r\n      },\r\n      {\r\n        \"label\": \"湖南衡阳松木经济开发区\",\r\n        \"value\": \"430473\"\r\n      },\r\n      {\r\n        \"label\": \"耒阳市\",\r\n        \"value\": \"430481\"\r\n      },\r\n      {\r\n        \"label\": \"常宁市\",\r\n        \"value\": \"430482\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"双清区\",\r\n        \"value\": \"430502\"\r\n      },\r\n      {\r\n        \"label\": \"大祥区\",\r\n        \"value\": \"430503\"\r\n      },\r\n      {\r\n        \"label\": \"北塔区\",\r\n        \"value\": \"430511\"\r\n      },\r\n      {\r\n        \"label\": \"邵东县\",\r\n        \"value\": \"430521\"\r\n      },\r\n      {\r\n        \"label\": \"新邵县\",\r\n        \"value\": \"430522\"\r\n      },\r\n      {\r\n        \"label\": \"邵阳县\",\r\n        \"value\": \"430523\"\r\n      },\r\n      {\r\n        \"label\": \"隆回县\",\r\n        \"value\": \"430524\"\r\n      },\r\n      {\r\n        \"label\": \"洞口县\",\r\n        \"value\": \"430525\"\r\n      },\r\n      {\r\n        \"label\": \"绥宁县\",\r\n        \"value\": \"430527\"\r\n      },\r\n      {\r\n        \"label\": \"新宁县\",\r\n        \"value\": \"430528\"\r\n      },\r\n      {\r\n        \"label\": \"城步苗族自治县\",\r\n        \"value\": \"430529\"\r\n      },\r\n      {\r\n        \"label\": \"武冈市\",\r\n        \"value\": \"430581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"岳阳楼区\",\r\n        \"value\": \"430602\"\r\n      },\r\n      {\r\n        \"label\": \"云溪区\",\r\n        \"value\": \"430603\"\r\n      },\r\n      {\r\n        \"label\": \"君山区\",\r\n        \"value\": \"430611\"\r\n      },\r\n      {\r\n        \"label\": \"岳阳县\",\r\n        \"value\": \"430621\"\r\n      },\r\n      {\r\n        \"label\": \"华容县\",\r\n        \"value\": \"430623\"\r\n      },\r\n      {\r\n        \"label\": \"湘阴县\",\r\n        \"value\": \"430624\"\r\n      },\r\n      {\r\n        \"label\": \"平江县\",\r\n        \"value\": \"430626\"\r\n      },\r\n      {\r\n        \"label\": \"岳阳市屈原管理区\",\r\n        \"value\": \"430671\"\r\n      },\r\n      {\r\n        \"label\": \"汨罗市\",\r\n        \"value\": \"430681\"\r\n      },\r\n      {\r\n        \"label\": \"临湘市\",\r\n        \"value\": \"430682\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"武陵区\",\r\n        \"value\": \"430702\"\r\n      },\r\n      {\r\n        \"label\": \"鼎城区\",\r\n        \"value\": \"430703\"\r\n      },\r\n      {\r\n        \"label\": \"安乡县\",\r\n        \"value\": \"430721\"\r\n      },\r\n      {\r\n        \"label\": \"汉寿县\",\r\n        \"value\": \"430722\"\r\n      },\r\n      {\r\n        \"label\": \"澧县\",\r\n        \"value\": \"430723\"\r\n      },\r\n      {\r\n        \"label\": \"临澧县\",\r\n        \"value\": \"430724\"\r\n      },\r\n      {\r\n        \"label\": \"桃源县\",\r\n        \"value\": \"430725\"\r\n      },\r\n      {\r\n        \"label\": \"石门县\",\r\n        \"value\": \"430726\"\r\n      },\r\n      {\r\n        \"label\": \"常德市西洞庭管理区\",\r\n        \"value\": \"430771\"\r\n      },\r\n      {\r\n        \"label\": \"津市市\",\r\n        \"value\": \"430781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"永定区\",\r\n        \"value\": \"430802\"\r\n      },\r\n      {\r\n        \"label\": \"武陵源区\",\r\n        \"value\": \"430811\"\r\n      },\r\n      {\r\n        \"label\": \"慈利县\",\r\n        \"value\": \"430821\"\r\n      },\r\n      {\r\n        \"label\": \"桑植县\",\r\n        \"value\": \"430822\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"资阳区\",\r\n        \"value\": \"430902\"\r\n      },\r\n      {\r\n        \"label\": \"赫山区\",\r\n        \"value\": \"430903\"\r\n      },\r\n      {\r\n        \"label\": \"南县\",\r\n        \"value\": \"430921\"\r\n      },\r\n      {\r\n        \"label\": \"桃江县\",\r\n        \"value\": \"430922\"\r\n      },\r\n      {\r\n        \"label\": \"安化县\",\r\n        \"value\": \"430923\"\r\n      },\r\n      {\r\n        \"label\": \"益阳市大通湖管理区\",\r\n        \"value\": \"430971\"\r\n      },\r\n      {\r\n        \"label\": \"湖南益阳高新技术产业园区\",\r\n        \"value\": \"430972\"\r\n      },\r\n      {\r\n        \"label\": \"沅江市\",\r\n        \"value\": \"430981\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"北湖区\",\r\n        \"value\": \"431002\"\r\n      },\r\n      {\r\n        \"label\": \"苏仙区\",\r\n        \"value\": \"431003\"\r\n      },\r\n      {\r\n        \"label\": \"桂阳县\",\r\n        \"value\": \"431021\"\r\n      },\r\n      {\r\n        \"label\": \"宜章县\",\r\n        \"value\": \"431022\"\r\n      },\r\n      {\r\n        \"label\": \"永兴县\",\r\n        \"value\": \"431023\"\r\n      },\r\n      {\r\n        \"label\": \"嘉禾县\",\r\n        \"value\": \"431024\"\r\n      },\r\n      {\r\n        \"label\": \"临武县\",\r\n        \"value\": \"431025\"\r\n      },\r\n      {\r\n        \"label\": \"汝城县\",\r\n        \"value\": \"431026\"\r\n      },\r\n      {\r\n        \"label\": \"桂东县\",\r\n        \"value\": \"431027\"\r\n      },\r\n      {\r\n        \"label\": \"安仁县\",\r\n        \"value\": \"431028\"\r\n      },\r\n      {\r\n        \"label\": \"资兴市\",\r\n        \"value\": \"431081\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"零陵区\",\r\n        \"value\": \"431102\"\r\n      },\r\n      {\r\n        \"label\": \"冷水滩区\",\r\n        \"value\": \"431103\"\r\n      },\r\n      {\r\n        \"label\": \"祁阳县\",\r\n        \"value\": \"431121\"\r\n      },\r\n      {\r\n        \"label\": \"东安县\",\r\n        \"value\": \"431122\"\r\n      },\r\n      {\r\n        \"label\": \"双牌县\",\r\n        \"value\": \"431123\"\r\n      },\r\n      {\r\n        \"label\": \"道县\",\r\n        \"value\": \"431124\"\r\n      },\r\n      {\r\n        \"label\": \"江永县\",\r\n        \"value\": \"431125\"\r\n      },\r\n      {\r\n        \"label\": \"宁远县\",\r\n        \"value\": \"431126\"\r\n      },\r\n      {\r\n        \"label\": \"蓝山县\",\r\n        \"value\": \"431127\"\r\n      },\r\n      {\r\n        \"label\": \"新田县\",\r\n        \"value\": \"431128\"\r\n      },\r\n      {\r\n        \"label\": \"江华瑶族自治县\",\r\n        \"value\": \"431129\"\r\n      },\r\n      {\r\n        \"label\": \"永州经济技术开发区\",\r\n        \"value\": \"431171\"\r\n      },\r\n      {\r\n        \"label\": \"永州市金洞管理区\",\r\n        \"value\": \"431172\"\r\n      },\r\n      {\r\n        \"label\": \"永州市回龙圩管理区\",\r\n        \"value\": \"431173\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"鹤城区\",\r\n        \"value\": \"431202\"\r\n      },\r\n      {\r\n        \"label\": \"中方县\",\r\n        \"value\": \"431221\"\r\n      },\r\n      {\r\n        \"label\": \"沅陵县\",\r\n        \"value\": \"431222\"\r\n      },\r\n      {\r\n        \"label\": \"辰溪县\",\r\n        \"value\": \"431223\"\r\n      },\r\n      {\r\n        \"label\": \"溆浦县\",\r\n        \"value\": \"431224\"\r\n      },\r\n      {\r\n        \"label\": \"会同县\",\r\n        \"value\": \"431225\"\r\n      },\r\n      {\r\n        \"label\": \"麻阳苗族自治县\",\r\n        \"value\": \"431226\"\r\n      },\r\n      {\r\n        \"label\": \"新晃侗族自治县\",\r\n        \"value\": \"431227\"\r\n      },\r\n      {\r\n        \"label\": \"芷江侗族自治县\",\r\n        \"value\": \"431228\"\r\n      },\r\n      {\r\n        \"label\": \"靖州苗族侗族自治县\",\r\n        \"value\": \"431229\"\r\n      },\r\n      {\r\n        \"label\": \"通道侗族自治县\",\r\n        \"value\": \"431230\"\r\n      },\r\n      {\r\n        \"label\": \"怀化市洪江管理区\",\r\n        \"value\": \"431271\"\r\n      },\r\n      {\r\n        \"label\": \"洪江市\",\r\n        \"value\": \"431281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"娄星区\",\r\n        \"value\": \"431302\"\r\n      },\r\n      {\r\n        \"label\": \"双峰县\",\r\n        \"value\": \"431321\"\r\n      },\r\n      {\r\n        \"label\": \"新化县\",\r\n        \"value\": \"431322\"\r\n      },\r\n      {\r\n        \"label\": \"冷水江市\",\r\n        \"value\": \"431381\"\r\n      },\r\n      {\r\n        \"label\": \"涟源市\",\r\n        \"value\": \"431382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"吉首市\",\r\n        \"value\": \"433101\"\r\n      },\r\n      {\r\n        \"label\": \"泸溪县\",\r\n        \"value\": \"433122\"\r\n      },\r\n      {\r\n        \"label\": \"凤凰县\",\r\n        \"value\": \"433123\"\r\n      },\r\n      {\r\n        \"label\": \"花垣县\",\r\n        \"value\": \"433124\"\r\n      },\r\n      {\r\n        \"label\": \"保靖县\",\r\n        \"value\": \"433125\"\r\n      },\r\n      {\r\n        \"label\": \"古丈县\",\r\n        \"value\": \"433126\"\r\n      },\r\n      {\r\n        \"label\": \"永顺县\",\r\n        \"value\": \"433127\"\r\n      },\r\n      {\r\n        \"label\": \"龙山县\",\r\n        \"value\": \"433130\"\r\n      },\r\n      {\r\n        \"label\": \"湖南吉首经济开发区\",\r\n        \"value\": \"433172\"\r\n      },\r\n      {\r\n        \"label\": \"湖南永顺经济开发区\",\r\n        \"value\": \"433173\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"荔湾区\",\r\n        \"value\": \"440103\"\r\n      },\r\n      {\r\n        \"label\": \"越秀区\",\r\n        \"value\": \"440104\"\r\n      },\r\n      {\r\n        \"label\": \"海珠区\",\r\n        \"value\": \"440105\"\r\n      },\r\n      {\r\n        \"label\": \"天河区\",\r\n        \"value\": \"440106\"\r\n      },\r\n      {\r\n        \"label\": \"白云区\",\r\n        \"value\": \"440111\"\r\n      },\r\n      {\r\n        \"label\": \"黄埔区\",\r\n        \"value\": \"440112\"\r\n      },\r\n      {\r\n        \"label\": \"番禺区\",\r\n        \"value\": \"440113\"\r\n      },\r\n      {\r\n        \"label\": \"花都区\",\r\n        \"value\": \"440114\"\r\n      },\r\n      {\r\n        \"label\": \"南沙区\",\r\n        \"value\": \"440115\"\r\n      },\r\n      {\r\n        \"label\": \"从化区\",\r\n        \"value\": \"440117\"\r\n      },\r\n      {\r\n        \"label\": \"增城区\",\r\n        \"value\": \"440118\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"武江区\",\r\n        \"value\": \"440203\"\r\n      },\r\n      {\r\n        \"label\": \"浈江区\",\r\n        \"value\": \"440204\"\r\n      },\r\n      {\r\n        \"label\": \"曲江区\",\r\n        \"value\": \"440205\"\r\n      },\r\n      {\r\n        \"label\": \"始兴县\",\r\n        \"value\": \"440222\"\r\n      },\r\n      {\r\n        \"label\": \"仁化县\",\r\n        \"value\": \"440224\"\r\n      },\r\n      {\r\n        \"label\": \"翁源县\",\r\n        \"value\": \"440229\"\r\n      },\r\n      {\r\n        \"label\": \"乳源瑶族自治县\",\r\n        \"value\": \"440232\"\r\n      },\r\n      {\r\n        \"label\": \"新丰县\",\r\n        \"value\": \"440233\"\r\n      },\r\n      {\r\n        \"label\": \"乐昌市\",\r\n        \"value\": \"440281\"\r\n      },\r\n      {\r\n        \"label\": \"南雄市\",\r\n        \"value\": \"440282\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"罗湖区\",\r\n        \"value\": \"440303\"\r\n      },\r\n      {\r\n        \"label\": \"福田区\",\r\n        \"value\": \"440304\"\r\n      },\r\n      {\r\n        \"label\": \"南山区\",\r\n        \"value\": \"440305\"\r\n      },\r\n      {\r\n        \"label\": \"宝安区\",\r\n        \"value\": \"440306\"\r\n      },\r\n      {\r\n        \"label\": \"龙岗区\",\r\n        \"value\": \"440307\"\r\n      },\r\n      {\r\n        \"label\": \"盐田区\",\r\n        \"value\": \"440308\"\r\n      },\r\n      {\r\n        \"label\": \"龙华区\",\r\n        \"value\": \"440309\"\r\n      },\r\n      {\r\n        \"label\": \"坪山区\",\r\n        \"value\": \"440310\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"香洲区\",\r\n        \"value\": \"440402\"\r\n      },\r\n      {\r\n        \"label\": \"斗门区\",\r\n        \"value\": \"440403\"\r\n      },\r\n      {\r\n        \"label\": \"金湾区\",\r\n        \"value\": \"440404\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"龙湖区\",\r\n        \"value\": \"440507\"\r\n      },\r\n      {\r\n        \"label\": \"金平区\",\r\n        \"value\": \"440511\"\r\n      },\r\n      {\r\n        \"label\": \"濠江区\",\r\n        \"value\": \"440512\"\r\n      },\r\n      {\r\n        \"label\": \"潮阳区\",\r\n        \"value\": \"440513\"\r\n      },\r\n      {\r\n        \"label\": \"潮南区\",\r\n        \"value\": \"440514\"\r\n      },\r\n      {\r\n        \"label\": \"澄海区\",\r\n        \"value\": \"440515\"\r\n      },\r\n      {\r\n        \"label\": \"南澳县\",\r\n        \"value\": \"440523\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"禅城区\",\r\n        \"value\": \"440604\"\r\n      },\r\n      {\r\n        \"label\": \"南海区\",\r\n        \"value\": \"440605\"\r\n      },\r\n      {\r\n        \"label\": \"顺德区\",\r\n        \"value\": \"440606\"\r\n      },\r\n      {\r\n        \"label\": \"三水区\",\r\n        \"value\": \"440607\"\r\n      },\r\n      {\r\n        \"label\": \"高明区\",\r\n        \"value\": \"440608\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"蓬江区\",\r\n        \"value\": \"440703\"\r\n      },\r\n      {\r\n        \"label\": \"江海区\",\r\n        \"value\": \"440704\"\r\n      },\r\n      {\r\n        \"label\": \"新会区\",\r\n        \"value\": \"440705\"\r\n      },\r\n      {\r\n        \"label\": \"台山市\",\r\n        \"value\": \"440781\"\r\n      },\r\n      {\r\n        \"label\": \"开平市\",\r\n        \"value\": \"440783\"\r\n      },\r\n      {\r\n        \"label\": \"鹤山市\",\r\n        \"value\": \"440784\"\r\n      },\r\n      {\r\n        \"label\": \"恩平市\",\r\n        \"value\": \"440785\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"赤坎区\",\r\n        \"value\": \"440802\"\r\n      },\r\n      {\r\n        \"label\": \"霞山区\",\r\n        \"value\": \"440803\"\r\n      },\r\n      {\r\n        \"label\": \"坡头区\",\r\n        \"value\": \"440804\"\r\n      },\r\n      {\r\n        \"label\": \"麻章区\",\r\n        \"value\": \"440811\"\r\n      },\r\n      {\r\n        \"label\": \"遂溪县\",\r\n        \"value\": \"440823\"\r\n      },\r\n      {\r\n        \"label\": \"徐闻县\",\r\n        \"value\": \"440825\"\r\n      },\r\n      {\r\n        \"label\": \"廉江市\",\r\n        \"value\": \"440881\"\r\n      },\r\n      {\r\n        \"label\": \"雷州市\",\r\n        \"value\": \"440882\"\r\n      },\r\n      {\r\n        \"label\": \"吴川市\",\r\n        \"value\": \"440883\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"茂南区\",\r\n        \"value\": \"440902\"\r\n      },\r\n      {\r\n        \"label\": \"电白区\",\r\n        \"value\": \"440904\"\r\n      },\r\n      {\r\n        \"label\": \"高州市\",\r\n        \"value\": \"440981\"\r\n      },\r\n      {\r\n        \"label\": \"化州市\",\r\n        \"value\": \"440982\"\r\n      },\r\n      {\r\n        \"label\": \"信宜市\",\r\n        \"value\": \"440983\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"端州区\",\r\n        \"value\": \"441202\"\r\n      },\r\n      {\r\n        \"label\": \"鼎湖区\",\r\n        \"value\": \"441203\"\r\n      },\r\n      {\r\n        \"label\": \"高要区\",\r\n        \"value\": \"441204\"\r\n      },\r\n      {\r\n        \"label\": \"广宁县\",\r\n        \"value\": \"441223\"\r\n      },\r\n      {\r\n        \"label\": \"怀集县\",\r\n        \"value\": \"441224\"\r\n      },\r\n      {\r\n        \"label\": \"封开县\",\r\n        \"value\": \"441225\"\r\n      },\r\n      {\r\n        \"label\": \"德庆县\",\r\n        \"value\": \"441226\"\r\n      },\r\n      {\r\n        \"label\": \"四会市\",\r\n        \"value\": \"441284\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"惠城区\",\r\n        \"value\": \"441302\"\r\n      },\r\n      {\r\n        \"label\": \"惠阳区\",\r\n        \"value\": \"441303\"\r\n      },\r\n      {\r\n        \"label\": \"博罗县\",\r\n        \"value\": \"441322\"\r\n      },\r\n      {\r\n        \"label\": \"惠东县\",\r\n        \"value\": \"441323\"\r\n      },\r\n      {\r\n        \"label\": \"龙门县\",\r\n        \"value\": \"441324\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"梅江区\",\r\n        \"value\": \"441402\"\r\n      },\r\n      {\r\n        \"label\": \"梅县区\",\r\n        \"value\": \"441403\"\r\n      },\r\n      {\r\n        \"label\": \"大埔县\",\r\n        \"value\": \"441422\"\r\n      },\r\n      {\r\n        \"label\": \"丰顺县\",\r\n        \"value\": \"441423\"\r\n      },\r\n      {\r\n        \"label\": \"五华县\",\r\n        \"value\": \"441424\"\r\n      },\r\n      {\r\n        \"label\": \"平远县\",\r\n        \"value\": \"441426\"\r\n      },\r\n      {\r\n        \"label\": \"蕉岭县\",\r\n        \"value\": \"441427\"\r\n      },\r\n      {\r\n        \"label\": \"兴宁市\",\r\n        \"value\": \"441481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城区\",\r\n        \"value\": \"441502\"\r\n      },\r\n      {\r\n        \"label\": \"海丰县\",\r\n        \"value\": \"441521\"\r\n      },\r\n      {\r\n        \"label\": \"陆河县\",\r\n        \"value\": \"441523\"\r\n      },\r\n      {\r\n        \"label\": \"陆丰市\",\r\n        \"value\": \"441581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"源城区\",\r\n        \"value\": \"441602\"\r\n      },\r\n      {\r\n        \"label\": \"紫金县\",\r\n        \"value\": \"441621\"\r\n      },\r\n      {\r\n        \"label\": \"龙川县\",\r\n        \"value\": \"441622\"\r\n      },\r\n      {\r\n        \"label\": \"连平县\",\r\n        \"value\": \"441623\"\r\n      },\r\n      {\r\n        \"label\": \"和平县\",\r\n        \"value\": \"441624\"\r\n      },\r\n      {\r\n        \"label\": \"东源县\",\r\n        \"value\": \"441625\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"江城区\",\r\n        \"value\": \"441702\"\r\n      },\r\n      {\r\n        \"label\": \"阳东区\",\r\n        \"value\": \"441704\"\r\n      },\r\n      {\r\n        \"label\": \"阳西县\",\r\n        \"value\": \"441721\"\r\n      },\r\n      {\r\n        \"label\": \"阳春市\",\r\n        \"value\": \"441781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"清城区\",\r\n        \"value\": \"441802\"\r\n      },\r\n      {\r\n        \"label\": \"清新区\",\r\n        \"value\": \"441803\"\r\n      },\r\n      {\r\n        \"label\": \"佛冈县\",\r\n        \"value\": \"441821\"\r\n      },\r\n      {\r\n        \"label\": \"阳山县\",\r\n        \"value\": \"441823\"\r\n      },\r\n      {\r\n        \"label\": \"连山壮族瑶族自治县\",\r\n        \"value\": \"441825\"\r\n      },\r\n      {\r\n        \"label\": \"连南瑶族自治县\",\r\n        \"value\": \"441826\"\r\n      },\r\n      {\r\n        \"label\": \"英德市\",\r\n        \"value\": \"441881\"\r\n      },\r\n      {\r\n        \"label\": \"连州市\",\r\n        \"value\": \"441882\"\r\n      }\r\n    ],\r\n    [{\r\n      \"label\": \"东莞市\",\r\n      \"value\": \"441900\"\r\n    }],\r\n    [{\r\n      \"label\": \"中山市\",\r\n      \"value\": \"442000\"\r\n    }],\r\n    [{\r\n        \"label\": \"湘桥区\",\r\n        \"value\": \"445102\"\r\n      },\r\n      {\r\n        \"label\": \"潮安区\",\r\n        \"value\": \"445103\"\r\n      },\r\n      {\r\n        \"label\": \"饶平县\",\r\n        \"value\": \"445122\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"榕城区\",\r\n        \"value\": \"445202\"\r\n      },\r\n      {\r\n        \"label\": \"揭东区\",\r\n        \"value\": \"445203\"\r\n      },\r\n      {\r\n        \"label\": \"揭西县\",\r\n        \"value\": \"445222\"\r\n      },\r\n      {\r\n        \"label\": \"惠来县\",\r\n        \"value\": \"445224\"\r\n      },\r\n      {\r\n        \"label\": \"普宁市\",\r\n        \"value\": \"445281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"云城区\",\r\n        \"value\": \"445302\"\r\n      },\r\n      {\r\n        \"label\": \"云安区\",\r\n        \"value\": \"445303\"\r\n      },\r\n      {\r\n        \"label\": \"新兴县\",\r\n        \"value\": \"445321\"\r\n      },\r\n      {\r\n        \"label\": \"郁南县\",\r\n        \"value\": \"445322\"\r\n      },\r\n      {\r\n        \"label\": \"罗定市\",\r\n        \"value\": \"445381\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"兴宁区\",\r\n        \"value\": \"450102\"\r\n      },\r\n      {\r\n        \"label\": \"青秀区\",\r\n        \"value\": \"450103\"\r\n      },\r\n      {\r\n        \"label\": \"江南区\",\r\n        \"value\": \"450105\"\r\n      },\r\n      {\r\n        \"label\": \"西乡塘区\",\r\n        \"value\": \"450107\"\r\n      },\r\n      {\r\n        \"label\": \"良庆区\",\r\n        \"value\": \"450108\"\r\n      },\r\n      {\r\n        \"label\": \"邕宁区\",\r\n        \"value\": \"450109\"\r\n      },\r\n      {\r\n        \"label\": \"武鸣区\",\r\n        \"value\": \"450110\"\r\n      },\r\n      {\r\n        \"label\": \"隆安县\",\r\n        \"value\": \"450123\"\r\n      },\r\n      {\r\n        \"label\": \"马山县\",\r\n        \"value\": \"450124\"\r\n      },\r\n      {\r\n        \"label\": \"上林县\",\r\n        \"value\": \"450125\"\r\n      },\r\n      {\r\n        \"label\": \"宾阳县\",\r\n        \"value\": \"450126\"\r\n      },\r\n      {\r\n        \"label\": \"横县\",\r\n        \"value\": \"450127\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城中区\",\r\n        \"value\": \"450202\"\r\n      },\r\n      {\r\n        \"label\": \"鱼峰区\",\r\n        \"value\": \"450203\"\r\n      },\r\n      {\r\n        \"label\": \"柳南区\",\r\n        \"value\": \"450204\"\r\n      },\r\n      {\r\n        \"label\": \"柳北区\",\r\n        \"value\": \"450205\"\r\n      },\r\n      {\r\n        \"label\": \"柳江区\",\r\n        \"value\": \"450206\"\r\n      },\r\n      {\r\n        \"label\": \"柳城县\",\r\n        \"value\": \"450222\"\r\n      },\r\n      {\r\n        \"label\": \"鹿寨县\",\r\n        \"value\": \"450223\"\r\n      },\r\n      {\r\n        \"label\": \"融安县\",\r\n        \"value\": \"450224\"\r\n      },\r\n      {\r\n        \"label\": \"融水苗族自治县\",\r\n        \"value\": \"450225\"\r\n      },\r\n      {\r\n        \"label\": \"三江侗族自治县\",\r\n        \"value\": \"450226\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"秀峰区\",\r\n        \"value\": \"450302\"\r\n      },\r\n      {\r\n        \"label\": \"叠彩区\",\r\n        \"value\": \"450303\"\r\n      },\r\n      {\r\n        \"label\": \"象山区\",\r\n        \"value\": \"450304\"\r\n      },\r\n      {\r\n        \"label\": \"七星区\",\r\n        \"value\": \"450305\"\r\n      },\r\n      {\r\n        \"label\": \"雁山区\",\r\n        \"value\": \"450311\"\r\n      },\r\n      {\r\n        \"label\": \"临桂区\",\r\n        \"value\": \"450312\"\r\n      },\r\n      {\r\n        \"label\": \"阳朔县\",\r\n        \"value\": \"450321\"\r\n      },\r\n      {\r\n        \"label\": \"灵川县\",\r\n        \"value\": \"450323\"\r\n      },\r\n      {\r\n        \"label\": \"全州县\",\r\n        \"value\": \"450324\"\r\n      },\r\n      {\r\n        \"label\": \"兴安县\",\r\n        \"value\": \"450325\"\r\n      },\r\n      {\r\n        \"label\": \"永福县\",\r\n        \"value\": \"450326\"\r\n      },\r\n      {\r\n        \"label\": \"灌阳县\",\r\n        \"value\": \"450327\"\r\n      },\r\n      {\r\n        \"label\": \"龙胜各族自治县\",\r\n        \"value\": \"450328\"\r\n      },\r\n      {\r\n        \"label\": \"资源县\",\r\n        \"value\": \"450329\"\r\n      },\r\n      {\r\n        \"label\": \"平乐县\",\r\n        \"value\": \"450330\"\r\n      },\r\n      {\r\n        \"label\": \"荔浦县\",\r\n        \"value\": \"450331\"\r\n      },\r\n      {\r\n        \"label\": \"恭城瑶族自治县\",\r\n        \"value\": \"450332\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"万秀区\",\r\n        \"value\": \"450403\"\r\n      },\r\n      {\r\n        \"label\": \"长洲区\",\r\n        \"value\": \"450405\"\r\n      },\r\n      {\r\n        \"label\": \"龙圩区\",\r\n        \"value\": \"450406\"\r\n      },\r\n      {\r\n        \"label\": \"苍梧县\",\r\n        \"value\": \"450421\"\r\n      },\r\n      {\r\n        \"label\": \"藤县\",\r\n        \"value\": \"450422\"\r\n      },\r\n      {\r\n        \"label\": \"蒙山县\",\r\n        \"value\": \"450423\"\r\n      },\r\n      {\r\n        \"label\": \"岑溪市\",\r\n        \"value\": \"450481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海城区\",\r\n        \"value\": \"450502\"\r\n      },\r\n      {\r\n        \"label\": \"银海区\",\r\n        \"value\": \"450503\"\r\n      },\r\n      {\r\n        \"label\": \"铁山港区\",\r\n        \"value\": \"450512\"\r\n      },\r\n      {\r\n        \"label\": \"合浦县\",\r\n        \"value\": \"450521\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"港口区\",\r\n        \"value\": \"450602\"\r\n      },\r\n      {\r\n        \"label\": \"防城区\",\r\n        \"value\": \"450603\"\r\n      },\r\n      {\r\n        \"label\": \"上思县\",\r\n        \"value\": \"450621\"\r\n      },\r\n      {\r\n        \"label\": \"东兴市\",\r\n        \"value\": \"450681\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"钦南区\",\r\n        \"value\": \"450702\"\r\n      },\r\n      {\r\n        \"label\": \"钦北区\",\r\n        \"value\": \"450703\"\r\n      },\r\n      {\r\n        \"label\": \"灵山县\",\r\n        \"value\": \"450721\"\r\n      },\r\n      {\r\n        \"label\": \"浦北县\",\r\n        \"value\": \"450722\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"港北区\",\r\n        \"value\": \"450802\"\r\n      },\r\n      {\r\n        \"label\": \"港南区\",\r\n        \"value\": \"450803\"\r\n      },\r\n      {\r\n        \"label\": \"覃塘区\",\r\n        \"value\": \"450804\"\r\n      },\r\n      {\r\n        \"label\": \"平南县\",\r\n        \"value\": \"450821\"\r\n      },\r\n      {\r\n        \"label\": \"桂平市\",\r\n        \"value\": \"450881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"玉州区\",\r\n        \"value\": \"450902\"\r\n      },\r\n      {\r\n        \"label\": \"福绵区\",\r\n        \"value\": \"450903\"\r\n      },\r\n      {\r\n        \"label\": \"容县\",\r\n        \"value\": \"450921\"\r\n      },\r\n      {\r\n        \"label\": \"陆川县\",\r\n        \"value\": \"450922\"\r\n      },\r\n      {\r\n        \"label\": \"博白县\",\r\n        \"value\": \"450923\"\r\n      },\r\n      {\r\n        \"label\": \"兴业县\",\r\n        \"value\": \"450924\"\r\n      },\r\n      {\r\n        \"label\": \"北流市\",\r\n        \"value\": \"450981\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"右江区\",\r\n        \"value\": \"451002\"\r\n      },\r\n      {\r\n        \"label\": \"田阳县\",\r\n        \"value\": \"451021\"\r\n      },\r\n      {\r\n        \"label\": \"田东县\",\r\n        \"value\": \"451022\"\r\n      },\r\n      {\r\n        \"label\": \"平果县\",\r\n        \"value\": \"451023\"\r\n      },\r\n      {\r\n        \"label\": \"德保县\",\r\n        \"value\": \"451024\"\r\n      },\r\n      {\r\n        \"label\": \"那坡县\",\r\n        \"value\": \"451026\"\r\n      },\r\n      {\r\n        \"label\": \"凌云县\",\r\n        \"value\": \"451027\"\r\n      },\r\n      {\r\n        \"label\": \"乐业县\",\r\n        \"value\": \"451028\"\r\n      },\r\n      {\r\n        \"label\": \"田林县\",\r\n        \"value\": \"451029\"\r\n      },\r\n      {\r\n        \"label\": \"西林县\",\r\n        \"value\": \"451030\"\r\n      },\r\n      {\r\n        \"label\": \"隆林各族自治县\",\r\n        \"value\": \"451031\"\r\n      },\r\n      {\r\n        \"label\": \"靖西市\",\r\n        \"value\": \"451081\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"八步区\",\r\n        \"value\": \"451102\"\r\n      },\r\n      {\r\n        \"label\": \"平桂区\",\r\n        \"value\": \"451103\"\r\n      },\r\n      {\r\n        \"label\": \"昭平县\",\r\n        \"value\": \"451121\"\r\n      },\r\n      {\r\n        \"label\": \"钟山县\",\r\n        \"value\": \"451122\"\r\n      },\r\n      {\r\n        \"label\": \"富川瑶族自治县\",\r\n        \"value\": \"451123\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"金城江区\",\r\n        \"value\": \"451202\"\r\n      },\r\n      {\r\n        \"label\": \"宜州区\",\r\n        \"value\": \"451203\"\r\n      },\r\n      {\r\n        \"label\": \"南丹县\",\r\n        \"value\": \"451221\"\r\n      },\r\n      {\r\n        \"label\": \"天峨县\",\r\n        \"value\": \"451222\"\r\n      },\r\n      {\r\n        \"label\": \"凤山县\",\r\n        \"value\": \"451223\"\r\n      },\r\n      {\r\n        \"label\": \"东兰县\",\r\n        \"value\": \"451224\"\r\n      },\r\n      {\r\n        \"label\": \"罗城仫佬族自治县\",\r\n        \"value\": \"451225\"\r\n      },\r\n      {\r\n        \"label\": \"环江毛南族自治县\",\r\n        \"value\": \"451226\"\r\n      },\r\n      {\r\n        \"label\": \"巴马瑶族自治县\",\r\n        \"value\": \"451227\"\r\n      },\r\n      {\r\n        \"label\": \"都安瑶族自治县\",\r\n        \"value\": \"451228\"\r\n      },\r\n      {\r\n        \"label\": \"大化瑶族自治县\",\r\n        \"value\": \"451229\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"兴宾区\",\r\n        \"value\": \"451302\"\r\n      },\r\n      {\r\n        \"label\": \"忻城县\",\r\n        \"value\": \"451321\"\r\n      },\r\n      {\r\n        \"label\": \"象州县\",\r\n        \"value\": \"451322\"\r\n      },\r\n      {\r\n        \"label\": \"武宣县\",\r\n        \"value\": \"451323\"\r\n      },\r\n      {\r\n        \"label\": \"金秀瑶族自治县\",\r\n        \"value\": \"451324\"\r\n      },\r\n      {\r\n        \"label\": \"合山市\",\r\n        \"value\": \"451381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"江州区\",\r\n        \"value\": \"451402\"\r\n      },\r\n      {\r\n        \"label\": \"扶绥县\",\r\n        \"value\": \"451421\"\r\n      },\r\n      {\r\n        \"label\": \"宁明县\",\r\n        \"value\": \"451422\"\r\n      },\r\n      {\r\n        \"label\": \"龙州县\",\r\n        \"value\": \"451423\"\r\n      },\r\n      {\r\n        \"label\": \"大新县\",\r\n        \"value\": \"451424\"\r\n      },\r\n      {\r\n        \"label\": \"天等县\",\r\n        \"value\": \"451425\"\r\n      },\r\n      {\r\n        \"label\": \"凭祥市\",\r\n        \"value\": \"451481\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"秀英区\",\r\n        \"value\": \"460105\"\r\n      },\r\n      {\r\n        \"label\": \"龙华区\",\r\n        \"value\": \"460106\"\r\n      },\r\n      {\r\n        \"label\": \"琼山区\",\r\n        \"value\": \"460107\"\r\n      },\r\n      {\r\n        \"label\": \"美兰区\",\r\n        \"value\": \"460108\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"海棠区\",\r\n        \"value\": \"460202\"\r\n      },\r\n      {\r\n        \"label\": \"吉阳区\",\r\n        \"value\": \"460203\"\r\n      },\r\n      {\r\n        \"label\": \"天涯区\",\r\n        \"value\": \"460204\"\r\n      },\r\n      {\r\n        \"label\": \"崖州区\",\r\n        \"value\": \"460205\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"西沙群岛\",\r\n        \"value\": \"460321\"\r\n      },\r\n      {\r\n        \"label\": \"南沙群岛\",\r\n        \"value\": \"460322\"\r\n      },\r\n      {\r\n        \"label\": \"中沙群岛的岛礁及其海域\",\r\n        \"value\": \"460323\"\r\n      }\r\n    ],\r\n    [{\r\n      \"label\": \"儋州市\",\r\n      \"value\": \"460400\"\r\n    }],\r\n    [{\r\n        \"label\": \"五指山市\",\r\n        \"value\": \"469001\"\r\n      },\r\n      {\r\n        \"label\": \"琼海市\",\r\n        \"value\": \"469002\"\r\n      },\r\n      {\r\n        \"label\": \"文昌市\",\r\n        \"value\": \"469005\"\r\n      },\r\n      {\r\n        \"label\": \"万宁市\",\r\n        \"value\": \"469006\"\r\n      },\r\n      {\r\n        \"label\": \"东方市\",\r\n        \"value\": \"469007\"\r\n      },\r\n      {\r\n        \"label\": \"定安县\",\r\n        \"value\": \"469021\"\r\n      },\r\n      {\r\n        \"label\": \"屯昌县\",\r\n        \"value\": \"469022\"\r\n      },\r\n      {\r\n        \"label\": \"澄迈县\",\r\n        \"value\": \"469023\"\r\n      },\r\n      {\r\n        \"label\": \"临高县\",\r\n        \"value\": \"469024\"\r\n      },\r\n      {\r\n        \"label\": \"白沙黎族自治县\",\r\n        \"value\": \"469025\"\r\n      },\r\n      {\r\n        \"label\": \"昌江黎族自治县\",\r\n        \"value\": \"469026\"\r\n      },\r\n      {\r\n        \"label\": \"乐东黎族自治县\",\r\n        \"value\": \"469027\"\r\n      },\r\n      {\r\n        \"label\": \"陵水黎族自治县\",\r\n        \"value\": \"469028\"\r\n      },\r\n      {\r\n        \"label\": \"保亭黎族苗族自治县\",\r\n        \"value\": \"469029\"\r\n      },\r\n      {\r\n        \"label\": \"琼中黎族苗族自治县\",\r\n        \"value\": \"469030\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"万州区\",\r\n        \"value\": \"500101\"\r\n      },\r\n      {\r\n        \"label\": \"涪陵区\",\r\n        \"value\": \"500102\"\r\n      },\r\n      {\r\n        \"label\": \"渝中区\",\r\n        \"value\": \"500103\"\r\n      },\r\n      {\r\n        \"label\": \"大渡口区\",\r\n        \"value\": \"500104\"\r\n      },\r\n      {\r\n        \"label\": \"江北区\",\r\n        \"value\": \"500105\"\r\n      },\r\n      {\r\n        \"label\": \"沙坪坝区\",\r\n        \"value\": \"500106\"\r\n      },\r\n      {\r\n        \"label\": \"九龙坡区\",\r\n        \"value\": \"500107\"\r\n      },\r\n      {\r\n        \"label\": \"南岸区\",\r\n        \"value\": \"500108\"\r\n      },\r\n      {\r\n        \"label\": \"北碚区\",\r\n        \"value\": \"500109\"\r\n      },\r\n      {\r\n        \"label\": \"綦江区\",\r\n        \"value\": \"500110\"\r\n      },\r\n      {\r\n        \"label\": \"大足区\",\r\n        \"value\": \"500111\"\r\n      },\r\n      {\r\n        \"label\": \"渝北区\",\r\n        \"value\": \"500112\"\r\n      },\r\n      {\r\n        \"label\": \"巴南区\",\r\n        \"value\": \"500113\"\r\n      },\r\n      {\r\n        \"label\": \"黔江区\",\r\n        \"value\": \"500114\"\r\n      },\r\n      {\r\n        \"label\": \"长寿区\",\r\n        \"value\": \"500115\"\r\n      },\r\n      {\r\n        \"label\": \"江津区\",\r\n        \"value\": \"500116\"\r\n      },\r\n      {\r\n        \"label\": \"合川区\",\r\n        \"value\": \"500117\"\r\n      },\r\n      {\r\n        \"label\": \"永川区\",\r\n        \"value\": \"500118\"\r\n      },\r\n      {\r\n        \"label\": \"南川区\",\r\n        \"value\": \"500119\"\r\n      },\r\n      {\r\n        \"label\": \"璧山区\",\r\n        \"value\": \"500120\"\r\n      },\r\n      {\r\n        \"label\": \"铜梁区\",\r\n        \"value\": \"500151\"\r\n      },\r\n      {\r\n        \"label\": \"潼南区\",\r\n        \"value\": \"500152\"\r\n      },\r\n      {\r\n        \"label\": \"荣昌区\",\r\n        \"value\": \"500153\"\r\n      },\r\n      {\r\n        \"label\": \"开州区\",\r\n        \"value\": \"500154\"\r\n      },\r\n      {\r\n        \"label\": \"梁平区\",\r\n        \"value\": \"500155\"\r\n      },\r\n      {\r\n        \"label\": \"武隆区\",\r\n        \"value\": \"500156\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"城口县\",\r\n        \"value\": \"500229\"\r\n      },\r\n      {\r\n        \"label\": \"丰都县\",\r\n        \"value\": \"500230\"\r\n      },\r\n      {\r\n        \"label\": \"垫江县\",\r\n        \"value\": \"500231\"\r\n      },\r\n      {\r\n        \"label\": \"忠县\",\r\n        \"value\": \"500233\"\r\n      },\r\n      {\r\n        \"label\": \"云阳县\",\r\n        \"value\": \"500235\"\r\n      },\r\n      {\r\n        \"label\": \"奉节县\",\r\n        \"value\": \"500236\"\r\n      },\r\n      {\r\n        \"label\": \"巫山县\",\r\n        \"value\": \"500237\"\r\n      },\r\n      {\r\n        \"label\": \"巫溪县\",\r\n        \"value\": \"500238\"\r\n      },\r\n      {\r\n        \"label\": \"石柱土家族自治县\",\r\n        \"value\": \"500240\"\r\n      },\r\n      {\r\n        \"label\": \"秀山土家族苗族自治县\",\r\n        \"value\": \"500241\"\r\n      },\r\n      {\r\n        \"label\": \"酉阳土家族苗族自治县\",\r\n        \"value\": \"500242\"\r\n      },\r\n      {\r\n        \"label\": \"彭水苗族土家族自治县\",\r\n        \"value\": \"500243\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"锦江区\",\r\n        \"value\": \"510104\"\r\n      },\r\n      {\r\n        \"label\": \"青羊区\",\r\n        \"value\": \"510105\"\r\n      },\r\n      {\r\n        \"label\": \"金牛区\",\r\n        \"value\": \"510106\"\r\n      },\r\n      {\r\n        \"label\": \"武侯区\",\r\n        \"value\": \"510107\"\r\n      },\r\n      {\r\n        \"label\": \"成华区\",\r\n        \"value\": \"510108\"\r\n      },\r\n      {\r\n        \"label\": \"龙泉驿区\",\r\n        \"value\": \"510112\"\r\n      },\r\n      {\r\n        \"label\": \"青白江区\",\r\n        \"value\": \"510113\"\r\n      },\r\n      {\r\n        \"label\": \"新都区\",\r\n        \"value\": \"510114\"\r\n      },\r\n      {\r\n        \"label\": \"温江区\",\r\n        \"value\": \"510115\"\r\n      },\r\n      {\r\n        \"label\": \"双流区\",\r\n        \"value\": \"510116\"\r\n      },\r\n      {\r\n        \"label\": \"郫都区\",\r\n        \"value\": \"510117\"\r\n      },\r\n      {\r\n        \"label\": \"金堂县\",\r\n        \"value\": \"510121\"\r\n      },\r\n      {\r\n        \"label\": \"大邑县\",\r\n        \"value\": \"510129\"\r\n      },\r\n      {\r\n        \"label\": \"蒲江县\",\r\n        \"value\": \"510131\"\r\n      },\r\n      {\r\n        \"label\": \"新津县\",\r\n        \"value\": \"510132\"\r\n      },\r\n      {\r\n        \"label\": \"都江堰市\",\r\n        \"value\": \"510181\"\r\n      },\r\n      {\r\n        \"label\": \"彭州市\",\r\n        \"value\": \"510182\"\r\n      },\r\n      {\r\n        \"label\": \"邛崃市\",\r\n        \"value\": \"510183\"\r\n      },\r\n      {\r\n        \"label\": \"崇州市\",\r\n        \"value\": \"510184\"\r\n      },\r\n      {\r\n        \"label\": \"简阳市\",\r\n        \"value\": \"510185\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"自流井区\",\r\n        \"value\": \"510302\"\r\n      },\r\n      {\r\n        \"label\": \"贡井区\",\r\n        \"value\": \"510303\"\r\n      },\r\n      {\r\n        \"label\": \"大安区\",\r\n        \"value\": \"510304\"\r\n      },\r\n      {\r\n        \"label\": \"沿滩区\",\r\n        \"value\": \"510311\"\r\n      },\r\n      {\r\n        \"label\": \"荣县\",\r\n        \"value\": \"510321\"\r\n      },\r\n      {\r\n        \"label\": \"富顺县\",\r\n        \"value\": \"510322\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东区\",\r\n        \"value\": \"510402\"\r\n      },\r\n      {\r\n        \"label\": \"西区\",\r\n        \"value\": \"510403\"\r\n      },\r\n      {\r\n        \"label\": \"仁和区\",\r\n        \"value\": \"510411\"\r\n      },\r\n      {\r\n        \"label\": \"米易县\",\r\n        \"value\": \"510421\"\r\n      },\r\n      {\r\n        \"label\": \"盐边县\",\r\n        \"value\": \"510422\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"江阳区\",\r\n        \"value\": \"510502\"\r\n      },\r\n      {\r\n        \"label\": \"纳溪区\",\r\n        \"value\": \"510503\"\r\n      },\r\n      {\r\n        \"label\": \"龙马潭区\",\r\n        \"value\": \"510504\"\r\n      },\r\n      {\r\n        \"label\": \"泸县\",\r\n        \"value\": \"510521\"\r\n      },\r\n      {\r\n        \"label\": \"合江县\",\r\n        \"value\": \"510522\"\r\n      },\r\n      {\r\n        \"label\": \"叙永县\",\r\n        \"value\": \"510524\"\r\n      },\r\n      {\r\n        \"label\": \"古蔺县\",\r\n        \"value\": \"510525\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"旌阳区\",\r\n        \"value\": \"510603\"\r\n      },\r\n      {\r\n        \"label\": \"罗江区\",\r\n        \"value\": \"510604\"\r\n      },\r\n      {\r\n        \"label\": \"中江县\",\r\n        \"value\": \"510623\"\r\n      },\r\n      {\r\n        \"label\": \"广汉市\",\r\n        \"value\": \"510681\"\r\n      },\r\n      {\r\n        \"label\": \"什邡市\",\r\n        \"value\": \"510682\"\r\n      },\r\n      {\r\n        \"label\": \"绵竹市\",\r\n        \"value\": \"510683\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"涪城区\",\r\n        \"value\": \"510703\"\r\n      },\r\n      {\r\n        \"label\": \"游仙区\",\r\n        \"value\": \"510704\"\r\n      },\r\n      {\r\n        \"label\": \"安州区\",\r\n        \"value\": \"510705\"\r\n      },\r\n      {\r\n        \"label\": \"三台县\",\r\n        \"value\": \"510722\"\r\n      },\r\n      {\r\n        \"label\": \"盐亭县\",\r\n        \"value\": \"510723\"\r\n      },\r\n      {\r\n        \"label\": \"梓潼县\",\r\n        \"value\": \"510725\"\r\n      },\r\n      {\r\n        \"label\": \"北川羌族自治县\",\r\n        \"value\": \"510726\"\r\n      },\r\n      {\r\n        \"label\": \"平武县\",\r\n        \"value\": \"510727\"\r\n      },\r\n      {\r\n        \"label\": \"江油市\",\r\n        \"value\": \"510781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"利州区\",\r\n        \"value\": \"510802\"\r\n      },\r\n      {\r\n        \"label\": \"昭化区\",\r\n        \"value\": \"510811\"\r\n      },\r\n      {\r\n        \"label\": \"朝天区\",\r\n        \"value\": \"510812\"\r\n      },\r\n      {\r\n        \"label\": \"旺苍县\",\r\n        \"value\": \"510821\"\r\n      },\r\n      {\r\n        \"label\": \"青川县\",\r\n        \"value\": \"510822\"\r\n      },\r\n      {\r\n        \"label\": \"剑阁县\",\r\n        \"value\": \"510823\"\r\n      },\r\n      {\r\n        \"label\": \"苍溪县\",\r\n        \"value\": \"510824\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"船山区\",\r\n        \"value\": \"510903\"\r\n      },\r\n      {\r\n        \"label\": \"安居区\",\r\n        \"value\": \"510904\"\r\n      },\r\n      {\r\n        \"label\": \"蓬溪县\",\r\n        \"value\": \"510921\"\r\n      },\r\n      {\r\n        \"label\": \"射洪县\",\r\n        \"value\": \"510922\"\r\n      },\r\n      {\r\n        \"label\": \"大英县\",\r\n        \"value\": \"510923\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"市中区\",\r\n        \"value\": \"511002\"\r\n      },\r\n      {\r\n        \"label\": \"东兴区\",\r\n        \"value\": \"511011\"\r\n      },\r\n      {\r\n        \"label\": \"威远县\",\r\n        \"value\": \"511024\"\r\n      },\r\n      {\r\n        \"label\": \"资中县\",\r\n        \"value\": \"511025\"\r\n      },\r\n      {\r\n        \"label\": \"内江经济开发区\",\r\n        \"value\": \"511071\"\r\n      },\r\n      {\r\n        \"label\": \"隆昌市\",\r\n        \"value\": \"511083\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"市中区\",\r\n        \"value\": \"511102\"\r\n      },\r\n      {\r\n        \"label\": \"沙湾区\",\r\n        \"value\": \"511111\"\r\n      },\r\n      {\r\n        \"label\": \"五通桥区\",\r\n        \"value\": \"511112\"\r\n      },\r\n      {\r\n        \"label\": \"金口河区\",\r\n        \"value\": \"511113\"\r\n      },\r\n      {\r\n        \"label\": \"犍为县\",\r\n        \"value\": \"511123\"\r\n      },\r\n      {\r\n        \"label\": \"井研县\",\r\n        \"value\": \"511124\"\r\n      },\r\n      {\r\n        \"label\": \"夹江县\",\r\n        \"value\": \"511126\"\r\n      },\r\n      {\r\n        \"label\": \"沐川县\",\r\n        \"value\": \"511129\"\r\n      },\r\n      {\r\n        \"label\": \"峨边彝族自治县\",\r\n        \"value\": \"511132\"\r\n      },\r\n      {\r\n        \"label\": \"马边彝族自治县\",\r\n        \"value\": \"511133\"\r\n      },\r\n      {\r\n        \"label\": \"峨眉山市\",\r\n        \"value\": \"511181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"顺庆区\",\r\n        \"value\": \"511302\"\r\n      },\r\n      {\r\n        \"label\": \"高坪区\",\r\n        \"value\": \"511303\"\r\n      },\r\n      {\r\n        \"label\": \"嘉陵区\",\r\n        \"value\": \"511304\"\r\n      },\r\n      {\r\n        \"label\": \"南部县\",\r\n        \"value\": \"511321\"\r\n      },\r\n      {\r\n        \"label\": \"营山县\",\r\n        \"value\": \"511322\"\r\n      },\r\n      {\r\n        \"label\": \"蓬安县\",\r\n        \"value\": \"511323\"\r\n      },\r\n      {\r\n        \"label\": \"仪陇县\",\r\n        \"value\": \"511324\"\r\n      },\r\n      {\r\n        \"label\": \"西充县\",\r\n        \"value\": \"511325\"\r\n      },\r\n      {\r\n        \"label\": \"阆中市\",\r\n        \"value\": \"511381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"东坡区\",\r\n        \"value\": \"511402\"\r\n      },\r\n      {\r\n        \"label\": \"彭山区\",\r\n        \"value\": \"511403\"\r\n      },\r\n      {\r\n        \"label\": \"仁寿县\",\r\n        \"value\": \"511421\"\r\n      },\r\n      {\r\n        \"label\": \"洪雅县\",\r\n        \"value\": \"511423\"\r\n      },\r\n      {\r\n        \"label\": \"丹棱县\",\r\n        \"value\": \"511424\"\r\n      },\r\n      {\r\n        \"label\": \"青神县\",\r\n        \"value\": \"511425\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"翠屏区\",\r\n        \"value\": \"511502\"\r\n      },\r\n      {\r\n        \"label\": \"南溪区\",\r\n        \"value\": \"511503\"\r\n      },\r\n      {\r\n        \"label\": \"宜宾县\",\r\n        \"value\": \"511521\"\r\n      },\r\n      {\r\n        \"label\": \"江安县\",\r\n        \"value\": \"511523\"\r\n      },\r\n      {\r\n        \"label\": \"长宁县\",\r\n        \"value\": \"511524\"\r\n      },\r\n      {\r\n        \"label\": \"高县\",\r\n        \"value\": \"511525\"\r\n      },\r\n      {\r\n        \"label\": \"珙县\",\r\n        \"value\": \"511526\"\r\n      },\r\n      {\r\n        \"label\": \"筠连县\",\r\n        \"value\": \"511527\"\r\n      },\r\n      {\r\n        \"label\": \"兴文县\",\r\n        \"value\": \"511528\"\r\n      },\r\n      {\r\n        \"label\": \"屏山县\",\r\n        \"value\": \"511529\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"广安区\",\r\n        \"value\": \"511602\"\r\n      },\r\n      {\r\n        \"label\": \"前锋区\",\r\n        \"value\": \"511603\"\r\n      },\r\n      {\r\n        \"label\": \"岳池县\",\r\n        \"value\": \"511621\"\r\n      },\r\n      {\r\n        \"label\": \"武胜县\",\r\n        \"value\": \"511622\"\r\n      },\r\n      {\r\n        \"label\": \"邻水县\",\r\n        \"value\": \"511623\"\r\n      },\r\n      {\r\n        \"label\": \"华蓥市\",\r\n        \"value\": \"511681\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"通川区\",\r\n        \"value\": \"511702\"\r\n      },\r\n      {\r\n        \"label\": \"达川区\",\r\n        \"value\": \"511703\"\r\n      },\r\n      {\r\n        \"label\": \"宣汉县\",\r\n        \"value\": \"511722\"\r\n      },\r\n      {\r\n        \"label\": \"开江县\",\r\n        \"value\": \"511723\"\r\n      },\r\n      {\r\n        \"label\": \"大竹县\",\r\n        \"value\": \"511724\"\r\n      },\r\n      {\r\n        \"label\": \"渠县\",\r\n        \"value\": \"511725\"\r\n      },\r\n      {\r\n        \"label\": \"达州经济开发区\",\r\n        \"value\": \"511771\"\r\n      },\r\n      {\r\n        \"label\": \"万源市\",\r\n        \"value\": \"511781\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"雨城区\",\r\n        \"value\": \"511802\"\r\n      },\r\n      {\r\n        \"label\": \"名山区\",\r\n        \"value\": \"511803\"\r\n      },\r\n      {\r\n        \"label\": \"荥经县\",\r\n        \"value\": \"511822\"\r\n      },\r\n      {\r\n        \"label\": \"汉源县\",\r\n        \"value\": \"511823\"\r\n      },\r\n      {\r\n        \"label\": \"石棉县\",\r\n        \"value\": \"511824\"\r\n      },\r\n      {\r\n        \"label\": \"天全县\",\r\n        \"value\": \"511825\"\r\n      },\r\n      {\r\n        \"label\": \"芦山县\",\r\n        \"value\": \"511826\"\r\n      },\r\n      {\r\n        \"label\": \"宝兴县\",\r\n        \"value\": \"511827\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"巴州区\",\r\n        \"value\": \"511902\"\r\n      },\r\n      {\r\n        \"label\": \"恩阳区\",\r\n        \"value\": \"511903\"\r\n      },\r\n      {\r\n        \"label\": \"通江县\",\r\n        \"value\": \"511921\"\r\n      },\r\n      {\r\n        \"label\": \"南江县\",\r\n        \"value\": \"511922\"\r\n      },\r\n      {\r\n        \"label\": \"平昌县\",\r\n        \"value\": \"511923\"\r\n      },\r\n      {\r\n        \"label\": \"巴中经济开发区\",\r\n        \"value\": \"511971\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"雁江区\",\r\n        \"value\": \"512002\"\r\n      },\r\n      {\r\n        \"label\": \"安岳县\",\r\n        \"value\": \"512021\"\r\n      },\r\n      {\r\n        \"label\": \"乐至县\",\r\n        \"value\": \"512022\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"马尔康市\",\r\n        \"value\": \"513201\"\r\n      },\r\n      {\r\n        \"label\": \"汶川县\",\r\n        \"value\": \"513221\"\r\n      },\r\n      {\r\n        \"label\": \"理县\",\r\n        \"value\": \"513222\"\r\n      },\r\n      {\r\n        \"label\": \"茂县\",\r\n        \"value\": \"513223\"\r\n      },\r\n      {\r\n        \"label\": \"松潘县\",\r\n        \"value\": \"513224\"\r\n      },\r\n      {\r\n        \"label\": \"九寨沟县\",\r\n        \"value\": \"513225\"\r\n      },\r\n      {\r\n        \"label\": \"金川县\",\r\n        \"value\": \"513226\"\r\n      },\r\n      {\r\n        \"label\": \"小金县\",\r\n        \"value\": \"513227\"\r\n      },\r\n      {\r\n        \"label\": \"黑水县\",\r\n        \"value\": \"513228\"\r\n      },\r\n      {\r\n        \"label\": \"壤塘县\",\r\n        \"value\": \"513230\"\r\n      },\r\n      {\r\n        \"label\": \"阿坝县\",\r\n        \"value\": \"513231\"\r\n      },\r\n      {\r\n        \"label\": \"若尔盖县\",\r\n        \"value\": \"513232\"\r\n      },\r\n      {\r\n        \"label\": \"红原县\",\r\n        \"value\": \"513233\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"康定市\",\r\n        \"value\": \"513301\"\r\n      },\r\n      {\r\n        \"label\": \"泸定县\",\r\n        \"value\": \"513322\"\r\n      },\r\n      {\r\n        \"label\": \"丹巴县\",\r\n        \"value\": \"513323\"\r\n      },\r\n      {\r\n        \"label\": \"九龙县\",\r\n        \"value\": \"513324\"\r\n      },\r\n      {\r\n        \"label\": \"雅江县\",\r\n        \"value\": \"513325\"\r\n      },\r\n      {\r\n        \"label\": \"道孚县\",\r\n        \"value\": \"513326\"\r\n      },\r\n      {\r\n        \"label\": \"炉霍县\",\r\n        \"value\": \"513327\"\r\n      },\r\n      {\r\n        \"label\": \"甘孜县\",\r\n        \"value\": \"513328\"\r\n      },\r\n      {\r\n        \"label\": \"新龙县\",\r\n        \"value\": \"513329\"\r\n      },\r\n      {\r\n        \"label\": \"德格县\",\r\n        \"value\": \"513330\"\r\n      },\r\n      {\r\n        \"label\": \"白玉县\",\r\n        \"value\": \"513331\"\r\n      },\r\n      {\r\n        \"label\": \"石渠县\",\r\n        \"value\": \"513332\"\r\n      },\r\n      {\r\n        \"label\": \"色达县\",\r\n        \"value\": \"513333\"\r\n      },\r\n      {\r\n        \"label\": \"理塘县\",\r\n        \"value\": \"513334\"\r\n      },\r\n      {\r\n        \"label\": \"巴塘县\",\r\n        \"value\": \"513335\"\r\n      },\r\n      {\r\n        \"label\": \"乡城县\",\r\n        \"value\": \"513336\"\r\n      },\r\n      {\r\n        \"label\": \"稻城县\",\r\n        \"value\": \"513337\"\r\n      },\r\n      {\r\n        \"label\": \"得荣县\",\r\n        \"value\": \"513338\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"西昌市\",\r\n        \"value\": \"513401\"\r\n      },\r\n      {\r\n        \"label\": \"木里藏族自治县\",\r\n        \"value\": \"513422\"\r\n      },\r\n      {\r\n        \"label\": \"盐源县\",\r\n        \"value\": \"513423\"\r\n      },\r\n      {\r\n        \"label\": \"德昌县\",\r\n        \"value\": \"513424\"\r\n      },\r\n      {\r\n        \"label\": \"会理县\",\r\n        \"value\": \"513425\"\r\n      },\r\n      {\r\n        \"label\": \"会东县\",\r\n        \"value\": \"513426\"\r\n      },\r\n      {\r\n        \"label\": \"宁南县\",\r\n        \"value\": \"513427\"\r\n      },\r\n      {\r\n        \"label\": \"普格县\",\r\n        \"value\": \"513428\"\r\n      },\r\n      {\r\n        \"label\": \"布拖县\",\r\n        \"value\": \"513429\"\r\n      },\r\n      {\r\n        \"label\": \"金阳县\",\r\n        \"value\": \"513430\"\r\n      },\r\n      {\r\n        \"label\": \"昭觉县\",\r\n        \"value\": \"513431\"\r\n      },\r\n      {\r\n        \"label\": \"喜德县\",\r\n        \"value\": \"513432\"\r\n      },\r\n      {\r\n        \"label\": \"冕宁县\",\r\n        \"value\": \"513433\"\r\n      },\r\n      {\r\n        \"label\": \"越西县\",\r\n        \"value\": \"513434\"\r\n      },\r\n      {\r\n        \"label\": \"甘洛县\",\r\n        \"value\": \"513435\"\r\n      },\r\n      {\r\n        \"label\": \"美姑县\",\r\n        \"value\": \"513436\"\r\n      },\r\n      {\r\n        \"label\": \"雷波县\",\r\n        \"value\": \"513437\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"南明区\",\r\n        \"value\": \"520102\"\r\n      },\r\n      {\r\n        \"label\": \"云岩区\",\r\n        \"value\": \"520103\"\r\n      },\r\n      {\r\n        \"label\": \"花溪区\",\r\n        \"value\": \"520111\"\r\n      },\r\n      {\r\n        \"label\": \"乌当区\",\r\n        \"value\": \"520112\"\r\n      },\r\n      {\r\n        \"label\": \"白云区\",\r\n        \"value\": \"520113\"\r\n      },\r\n      {\r\n        \"label\": \"观山湖区\",\r\n        \"value\": \"520115\"\r\n      },\r\n      {\r\n        \"label\": \"开阳县\",\r\n        \"value\": \"520121\"\r\n      },\r\n      {\r\n        \"label\": \"息烽县\",\r\n        \"value\": \"520122\"\r\n      },\r\n      {\r\n        \"label\": \"修文县\",\r\n        \"value\": \"520123\"\r\n      },\r\n      {\r\n        \"label\": \"清镇市\",\r\n        \"value\": \"520181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"钟山区\",\r\n        \"value\": \"520201\"\r\n      },\r\n      {\r\n        \"label\": \"六枝特区\",\r\n        \"value\": \"520203\"\r\n      },\r\n      {\r\n        \"label\": \"水城县\",\r\n        \"value\": \"520221\"\r\n      },\r\n      {\r\n        \"label\": \"盘州市\",\r\n        \"value\": \"520281\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"红花岗区\",\r\n        \"value\": \"520302\"\r\n      },\r\n      {\r\n        \"label\": \"汇川区\",\r\n        \"value\": \"520303\"\r\n      },\r\n      {\r\n        \"label\": \"播州区\",\r\n        \"value\": \"520304\"\r\n      },\r\n      {\r\n        \"label\": \"桐梓县\",\r\n        \"value\": \"520322\"\r\n      },\r\n      {\r\n        \"label\": \"绥阳县\",\r\n        \"value\": \"520323\"\r\n      },\r\n      {\r\n        \"label\": \"正安县\",\r\n        \"value\": \"520324\"\r\n      },\r\n      {\r\n        \"label\": \"道真仡佬族苗族自治县\",\r\n        \"value\": \"520325\"\r\n      },\r\n      {\r\n        \"label\": \"务川仡佬族苗族自治县\",\r\n        \"value\": \"520326\"\r\n      },\r\n      {\r\n        \"label\": \"凤冈县\",\r\n        \"value\": \"520327\"\r\n      },\r\n      {\r\n        \"label\": \"湄潭县\",\r\n        \"value\": \"520328\"\r\n      },\r\n      {\r\n        \"label\": \"余庆县\",\r\n        \"value\": \"520329\"\r\n      },\r\n      {\r\n        \"label\": \"习水县\",\r\n        \"value\": \"520330\"\r\n      },\r\n      {\r\n        \"label\": \"赤水市\",\r\n        \"value\": \"520381\"\r\n      },\r\n      {\r\n        \"label\": \"仁怀市\",\r\n        \"value\": \"520382\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"西秀区\",\r\n        \"value\": \"520402\"\r\n      },\r\n      {\r\n        \"label\": \"平坝区\",\r\n        \"value\": \"520403\"\r\n      },\r\n      {\r\n        \"label\": \"普定县\",\r\n        \"value\": \"520422\"\r\n      },\r\n      {\r\n        \"label\": \"镇宁布依族苗族自治县\",\r\n        \"value\": \"520423\"\r\n      },\r\n      {\r\n        \"label\": \"关岭布依族苗族自治县\",\r\n        \"value\": \"520424\"\r\n      },\r\n      {\r\n        \"label\": \"紫云苗族布依族自治县\",\r\n        \"value\": \"520425\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"七星关区\",\r\n        \"value\": \"520502\"\r\n      },\r\n      {\r\n        \"label\": \"大方县\",\r\n        \"value\": \"520521\"\r\n      },\r\n      {\r\n        \"label\": \"黔西县\",\r\n        \"value\": \"520522\"\r\n      },\r\n      {\r\n        \"label\": \"金沙县\",\r\n        \"value\": \"520523\"\r\n      },\r\n      {\r\n        \"label\": \"织金县\",\r\n        \"value\": \"520524\"\r\n      },\r\n      {\r\n        \"label\": \"纳雍县\",\r\n        \"value\": \"520525\"\r\n      },\r\n      {\r\n        \"label\": \"威宁彝族回族苗族自治县\",\r\n        \"value\": \"520526\"\r\n      },\r\n      {\r\n        \"label\": \"赫章县\",\r\n        \"value\": \"520527\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"碧江区\",\r\n        \"value\": \"520602\"\r\n      },\r\n      {\r\n        \"label\": \"万山区\",\r\n        \"value\": \"520603\"\r\n      },\r\n      {\r\n        \"label\": \"江口县\",\r\n        \"value\": \"520621\"\r\n      },\r\n      {\r\n        \"label\": \"玉屏侗族自治县\",\r\n        \"value\": \"520622\"\r\n      },\r\n      {\r\n        \"label\": \"石阡县\",\r\n        \"value\": \"520623\"\r\n      },\r\n      {\r\n        \"label\": \"思南县\",\r\n        \"value\": \"520624\"\r\n      },\r\n      {\r\n        \"label\": \"印江土家族苗族自治县\",\r\n        \"value\": \"520625\"\r\n      },\r\n      {\r\n        \"label\": \"德江县\",\r\n        \"value\": \"520626\"\r\n      },\r\n      {\r\n        \"label\": \"沿河土家族自治县\",\r\n        \"value\": \"520627\"\r\n      },\r\n      {\r\n        \"label\": \"松桃苗族自治县\",\r\n        \"value\": \"520628\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"兴义市\",\r\n        \"value\": \"522301\"\r\n      },\r\n      {\r\n        \"label\": \"兴仁县\",\r\n        \"value\": \"522322\"\r\n      },\r\n      {\r\n        \"label\": \"普安县\",\r\n        \"value\": \"522323\"\r\n      },\r\n      {\r\n        \"label\": \"晴隆县\",\r\n        \"value\": \"522324\"\r\n      },\r\n      {\r\n        \"label\": \"贞丰县\",\r\n        \"value\": \"522325\"\r\n      },\r\n      {\r\n        \"label\": \"望谟县\",\r\n        \"value\": \"522326\"\r\n      },\r\n      {\r\n        \"label\": \"册亨县\",\r\n        \"value\": \"522327\"\r\n      },\r\n      {\r\n        \"label\": \"安龙县\",\r\n        \"value\": \"522328\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"凯里市\",\r\n        \"value\": \"522601\"\r\n      },\r\n      {\r\n        \"label\": \"黄平县\",\r\n        \"value\": \"522622\"\r\n      },\r\n      {\r\n        \"label\": \"施秉县\",\r\n        \"value\": \"522623\"\r\n      },\r\n      {\r\n        \"label\": \"三穗县\",\r\n        \"value\": \"522624\"\r\n      },\r\n      {\r\n        \"label\": \"镇远县\",\r\n        \"value\": \"522625\"\r\n      },\r\n      {\r\n        \"label\": \"岑巩县\",\r\n        \"value\": \"522626\"\r\n      },\r\n      {\r\n        \"label\": \"天柱县\",\r\n        \"value\": \"522627\"\r\n      },\r\n      {\r\n        \"label\": \"锦屏县\",\r\n        \"value\": \"522628\"\r\n      },\r\n      {\r\n        \"label\": \"剑河县\",\r\n        \"value\": \"522629\"\r\n      },\r\n      {\r\n        \"label\": \"台江县\",\r\n        \"value\": \"522630\"\r\n      },\r\n      {\r\n        \"label\": \"黎平县\",\r\n        \"value\": \"522631\"\r\n      },\r\n      {\r\n        \"label\": \"榕江县\",\r\n        \"value\": \"522632\"\r\n      },\r\n      {\r\n        \"label\": \"从江县\",\r\n        \"value\": \"522633\"\r\n      },\r\n      {\r\n        \"label\": \"雷山县\",\r\n        \"value\": \"522634\"\r\n      },\r\n      {\r\n        \"label\": \"麻江县\",\r\n        \"value\": \"522635\"\r\n      },\r\n      {\r\n        \"label\": \"丹寨县\",\r\n        \"value\": \"522636\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"都匀市\",\r\n        \"value\": \"522701\"\r\n      },\r\n      {\r\n        \"label\": \"福泉市\",\r\n        \"value\": \"522702\"\r\n      },\r\n      {\r\n        \"label\": \"荔波县\",\r\n        \"value\": \"522722\"\r\n      },\r\n      {\r\n        \"label\": \"贵定县\",\r\n        \"value\": \"522723\"\r\n      },\r\n      {\r\n        \"label\": \"瓮安县\",\r\n        \"value\": \"522725\"\r\n      },\r\n      {\r\n        \"label\": \"独山县\",\r\n        \"value\": \"522726\"\r\n      },\r\n      {\r\n        \"label\": \"平塘县\",\r\n        \"value\": \"522727\"\r\n      },\r\n      {\r\n        \"label\": \"罗甸县\",\r\n        \"value\": \"522728\"\r\n      },\r\n      {\r\n        \"label\": \"长顺县\",\r\n        \"value\": \"522729\"\r\n      },\r\n      {\r\n        \"label\": \"龙里县\",\r\n        \"value\": \"522730\"\r\n      },\r\n      {\r\n        \"label\": \"惠水县\",\r\n        \"value\": \"522731\"\r\n      },\r\n      {\r\n        \"label\": \"三都水族自治县\",\r\n        \"value\": \"522732\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"五华区\",\r\n        \"value\": \"530102\"\r\n      },\r\n      {\r\n        \"label\": \"盘龙区\",\r\n        \"value\": \"530103\"\r\n      },\r\n      {\r\n        \"label\": \"官渡区\",\r\n        \"value\": \"530111\"\r\n      },\r\n      {\r\n        \"label\": \"西山区\",\r\n        \"value\": \"530112\"\r\n      },\r\n      {\r\n        \"label\": \"东川区\",\r\n        \"value\": \"530113\"\r\n      },\r\n      {\r\n        \"label\": \"呈贡区\",\r\n        \"value\": \"530114\"\r\n      },\r\n      {\r\n        \"label\": \"晋宁区\",\r\n        \"value\": \"530115\"\r\n      },\r\n      {\r\n        \"label\": \"富民县\",\r\n        \"value\": \"530124\"\r\n      },\r\n      {\r\n        \"label\": \"宜良县\",\r\n        \"value\": \"530125\"\r\n      },\r\n      {\r\n        \"label\": \"石林彝族自治县\",\r\n        \"value\": \"530126\"\r\n      },\r\n      {\r\n        \"label\": \"嵩明县\",\r\n        \"value\": \"530127\"\r\n      },\r\n      {\r\n        \"label\": \"禄劝彝族苗族自治县\",\r\n        \"value\": \"530128\"\r\n      },\r\n      {\r\n        \"label\": \"寻甸回族彝族自治县\",\r\n        \"value\": \"530129\"\r\n      },\r\n      {\r\n        \"label\": \"安宁市\",\r\n        \"value\": \"530181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"麒麟区\",\r\n        \"value\": \"530302\"\r\n      },\r\n      {\r\n        \"label\": \"沾益区\",\r\n        \"value\": \"530303\"\r\n      },\r\n      {\r\n        \"label\": \"马龙县\",\r\n        \"value\": \"530321\"\r\n      },\r\n      {\r\n        \"label\": \"陆良县\",\r\n        \"value\": \"530322\"\r\n      },\r\n      {\r\n        \"label\": \"师宗县\",\r\n        \"value\": \"530323\"\r\n      },\r\n      {\r\n        \"label\": \"罗平县\",\r\n        \"value\": \"530324\"\r\n      },\r\n      {\r\n        \"label\": \"富源县\",\r\n        \"value\": \"530325\"\r\n      },\r\n      {\r\n        \"label\": \"会泽县\",\r\n        \"value\": \"530326\"\r\n      },\r\n      {\r\n        \"label\": \"宣威市\",\r\n        \"value\": \"530381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"红塔区\",\r\n        \"value\": \"530402\"\r\n      },\r\n      {\r\n        \"label\": \"江川区\",\r\n        \"value\": \"530403\"\r\n      },\r\n      {\r\n        \"label\": \"澄江县\",\r\n        \"value\": \"530422\"\r\n      },\r\n      {\r\n        \"label\": \"通海县\",\r\n        \"value\": \"530423\"\r\n      },\r\n      {\r\n        \"label\": \"华宁县\",\r\n        \"value\": \"530424\"\r\n      },\r\n      {\r\n        \"label\": \"易门县\",\r\n        \"value\": \"530425\"\r\n      },\r\n      {\r\n        \"label\": \"峨山彝族自治县\",\r\n        \"value\": \"530426\"\r\n      },\r\n      {\r\n        \"label\": \"新平彝族傣族自治县\",\r\n        \"value\": \"530427\"\r\n      },\r\n      {\r\n        \"label\": \"元江哈尼族彝族傣族自治县\",\r\n        \"value\": \"530428\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"隆阳区\",\r\n        \"value\": \"530502\"\r\n      },\r\n      {\r\n        \"label\": \"施甸县\",\r\n        \"value\": \"530521\"\r\n      },\r\n      {\r\n        \"label\": \"龙陵县\",\r\n        \"value\": \"530523\"\r\n      },\r\n      {\r\n        \"label\": \"昌宁县\",\r\n        \"value\": \"530524\"\r\n      },\r\n      {\r\n        \"label\": \"腾冲市\",\r\n        \"value\": \"530581\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"昭阳区\",\r\n        \"value\": \"530602\"\r\n      },\r\n      {\r\n        \"label\": \"鲁甸县\",\r\n        \"value\": \"530621\"\r\n      },\r\n      {\r\n        \"label\": \"巧家县\",\r\n        \"value\": \"530622\"\r\n      },\r\n      {\r\n        \"label\": \"盐津县\",\r\n        \"value\": \"530623\"\r\n      },\r\n      {\r\n        \"label\": \"大关县\",\r\n        \"value\": \"530624\"\r\n      },\r\n      {\r\n        \"label\": \"永善县\",\r\n        \"value\": \"530625\"\r\n      },\r\n      {\r\n        \"label\": \"绥江县\",\r\n        \"value\": \"530626\"\r\n      },\r\n      {\r\n        \"label\": \"镇雄县\",\r\n        \"value\": \"530627\"\r\n      },\r\n      {\r\n        \"label\": \"彝良县\",\r\n        \"value\": \"530628\"\r\n      },\r\n      {\r\n        \"label\": \"威信县\",\r\n        \"value\": \"530629\"\r\n      },\r\n      {\r\n        \"label\": \"水富县\",\r\n        \"value\": \"530630\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"古城区\",\r\n        \"value\": \"530702\"\r\n      },\r\n      {\r\n        \"label\": \"玉龙纳西族自治县\",\r\n        \"value\": \"530721\"\r\n      },\r\n      {\r\n        \"label\": \"永胜县\",\r\n        \"value\": \"530722\"\r\n      },\r\n      {\r\n        \"label\": \"华坪县\",\r\n        \"value\": \"530723\"\r\n      },\r\n      {\r\n        \"label\": \"宁蒗彝族自治县\",\r\n        \"value\": \"530724\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"思茅区\",\r\n        \"value\": \"530802\"\r\n      },\r\n      {\r\n        \"label\": \"宁洱哈尼族彝族自治县\",\r\n        \"value\": \"530821\"\r\n      },\r\n      {\r\n        \"label\": \"墨江哈尼族自治县\",\r\n        \"value\": \"530822\"\r\n      },\r\n      {\r\n        \"label\": \"景东彝族自治县\",\r\n        \"value\": \"530823\"\r\n      },\r\n      {\r\n        \"label\": \"景谷傣族彝族自治县\",\r\n        \"value\": \"530824\"\r\n      },\r\n      {\r\n        \"label\": \"镇沅彝族哈尼族拉祜族自治县\",\r\n        \"value\": \"530825\"\r\n      },\r\n      {\r\n        \"label\": \"江城哈尼族彝族自治县\",\r\n        \"value\": \"530826\"\r\n      },\r\n      {\r\n        \"label\": \"孟连傣族拉祜族佤族自治县\",\r\n        \"value\": \"530827\"\r\n      },\r\n      {\r\n        \"label\": \"澜沧拉祜族自治县\",\r\n        \"value\": \"530828\"\r\n      },\r\n      {\r\n        \"label\": \"西盟佤族自治县\",\r\n        \"value\": \"530829\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"临翔区\",\r\n        \"value\": \"530902\"\r\n      },\r\n      {\r\n        \"label\": \"凤庆县\",\r\n        \"value\": \"530921\"\r\n      },\r\n      {\r\n        \"label\": \"云县\",\r\n        \"value\": \"530922\"\r\n      },\r\n      {\r\n        \"label\": \"永德县\",\r\n        \"value\": \"530923\"\r\n      },\r\n      {\r\n        \"label\": \"镇康县\",\r\n        \"value\": \"530924\"\r\n      },\r\n      {\r\n        \"label\": \"双江拉祜族佤族布朗族傣族自治县\",\r\n        \"value\": \"530925\"\r\n      },\r\n      {\r\n        \"label\": \"耿马傣族佤族自治县\",\r\n        \"value\": \"530926\"\r\n      },\r\n      {\r\n        \"label\": \"沧源佤族自治县\",\r\n        \"value\": \"530927\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"楚雄市\",\r\n        \"value\": \"532301\"\r\n      },\r\n      {\r\n        \"label\": \"双柏县\",\r\n        \"value\": \"532322\"\r\n      },\r\n      {\r\n        \"label\": \"牟定县\",\r\n        \"value\": \"532323\"\r\n      },\r\n      {\r\n        \"label\": \"南华县\",\r\n        \"value\": \"532324\"\r\n      },\r\n      {\r\n        \"label\": \"姚安县\",\r\n        \"value\": \"532325\"\r\n      },\r\n      {\r\n        \"label\": \"大姚县\",\r\n        \"value\": \"532326\"\r\n      },\r\n      {\r\n        \"label\": \"永仁县\",\r\n        \"value\": \"532327\"\r\n      },\r\n      {\r\n        \"label\": \"元谋县\",\r\n        \"value\": \"532328\"\r\n      },\r\n      {\r\n        \"label\": \"武定县\",\r\n        \"value\": \"532329\"\r\n      },\r\n      {\r\n        \"label\": \"禄丰县\",\r\n        \"value\": \"532331\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"个旧市\",\r\n        \"value\": \"532501\"\r\n      },\r\n      {\r\n        \"label\": \"开远市\",\r\n        \"value\": \"532502\"\r\n      },\r\n      {\r\n        \"label\": \"蒙自市\",\r\n        \"value\": \"532503\"\r\n      },\r\n      {\r\n        \"label\": \"弥勒市\",\r\n        \"value\": \"532504\"\r\n      },\r\n      {\r\n        \"label\": \"屏边苗族自治县\",\r\n        \"value\": \"532523\"\r\n      },\r\n      {\r\n        \"label\": \"建水县\",\r\n        \"value\": \"532524\"\r\n      },\r\n      {\r\n        \"label\": \"石屏县\",\r\n        \"value\": \"532525\"\r\n      },\r\n      {\r\n        \"label\": \"泸西县\",\r\n        \"value\": \"532527\"\r\n      },\r\n      {\r\n        \"label\": \"元阳县\",\r\n        \"value\": \"532528\"\r\n      },\r\n      {\r\n        \"label\": \"红河县\",\r\n        \"value\": \"532529\"\r\n      },\r\n      {\r\n        \"label\": \"金平苗族瑶族傣族自治县\",\r\n        \"value\": \"532530\"\r\n      },\r\n      {\r\n        \"label\": \"绿春县\",\r\n        \"value\": \"532531\"\r\n      },\r\n      {\r\n        \"label\": \"河口瑶族自治县\",\r\n        \"value\": \"532532\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"文山市\",\r\n        \"value\": \"532601\"\r\n      },\r\n      {\r\n        \"label\": \"砚山县\",\r\n        \"value\": \"532622\"\r\n      },\r\n      {\r\n        \"label\": \"西畴县\",\r\n        \"value\": \"532623\"\r\n      },\r\n      {\r\n        \"label\": \"麻栗坡县\",\r\n        \"value\": \"532624\"\r\n      },\r\n      {\r\n        \"label\": \"马关县\",\r\n        \"value\": \"532625\"\r\n      },\r\n      {\r\n        \"label\": \"丘北县\",\r\n        \"value\": \"532626\"\r\n      },\r\n      {\r\n        \"label\": \"广南县\",\r\n        \"value\": \"532627\"\r\n      },\r\n      {\r\n        \"label\": \"富宁县\",\r\n        \"value\": \"532628\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"景洪市\",\r\n        \"value\": \"532801\"\r\n      },\r\n      {\r\n        \"label\": \"勐海县\",\r\n        \"value\": \"532822\"\r\n      },\r\n      {\r\n        \"label\": \"勐腊县\",\r\n        \"value\": \"532823\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"大理市\",\r\n        \"value\": \"532901\"\r\n      },\r\n      {\r\n        \"label\": \"漾濞彝族自治县\",\r\n        \"value\": \"532922\"\r\n      },\r\n      {\r\n        \"label\": \"祥云县\",\r\n        \"value\": \"532923\"\r\n      },\r\n      {\r\n        \"label\": \"宾川县\",\r\n        \"value\": \"532924\"\r\n      },\r\n      {\r\n        \"label\": \"弥渡县\",\r\n        \"value\": \"532925\"\r\n      },\r\n      {\r\n        \"label\": \"南涧彝族自治县\",\r\n        \"value\": \"532926\"\r\n      },\r\n      {\r\n        \"label\": \"巍山彝族回族自治县\",\r\n        \"value\": \"532927\"\r\n      },\r\n      {\r\n        \"label\": \"永平县\",\r\n        \"value\": \"532928\"\r\n      },\r\n      {\r\n        \"label\": \"云龙县\",\r\n        \"value\": \"532929\"\r\n      },\r\n      {\r\n        \"label\": \"洱源县\",\r\n        \"value\": \"532930\"\r\n      },\r\n      {\r\n        \"label\": \"剑川县\",\r\n        \"value\": \"532931\"\r\n      },\r\n      {\r\n        \"label\": \"鹤庆县\",\r\n        \"value\": \"532932\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"瑞丽市\",\r\n        \"value\": \"533102\"\r\n      },\r\n      {\r\n        \"label\": \"芒市\",\r\n        \"value\": \"533103\"\r\n      },\r\n      {\r\n        \"label\": \"梁河县\",\r\n        \"value\": \"533122\"\r\n      },\r\n      {\r\n        \"label\": \"盈江县\",\r\n        \"value\": \"533123\"\r\n      },\r\n      {\r\n        \"label\": \"陇川县\",\r\n        \"value\": \"533124\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"泸水市\",\r\n        \"value\": \"533301\"\r\n      },\r\n      {\r\n        \"label\": \"福贡县\",\r\n        \"value\": \"533323\"\r\n      },\r\n      {\r\n        \"label\": \"贡山独龙族怒族自治县\",\r\n        \"value\": \"533324\"\r\n      },\r\n      {\r\n        \"label\": \"兰坪白族普米族自治县\",\r\n        \"value\": \"533325\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"香格里拉市\",\r\n        \"value\": \"533401\"\r\n      },\r\n      {\r\n        \"label\": \"德钦县\",\r\n        \"value\": \"533422\"\r\n      },\r\n      {\r\n        \"label\": \"维西傈僳族自治县\",\r\n        \"value\": \"533423\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"城关区\",\r\n        \"value\": \"540102\"\r\n      },\r\n      {\r\n        \"label\": \"堆龙德庆区\",\r\n        \"value\": \"540103\"\r\n      },\r\n      {\r\n        \"label\": \"林周县\",\r\n        \"value\": \"540121\"\r\n      },\r\n      {\r\n        \"label\": \"当雄县\",\r\n        \"value\": \"540122\"\r\n      },\r\n      {\r\n        \"label\": \"尼木县\",\r\n        \"value\": \"540123\"\r\n      },\r\n      {\r\n        \"label\": \"曲水县\",\r\n        \"value\": \"540124\"\r\n      },\r\n      {\r\n        \"label\": \"达孜县\",\r\n        \"value\": \"540126\"\r\n      },\r\n      {\r\n        \"label\": \"墨竹工卡县\",\r\n        \"value\": \"540127\"\r\n      },\r\n      {\r\n        \"label\": \"格尔木藏青工业园区\",\r\n        \"value\": \"540171\"\r\n      },\r\n      {\r\n        \"label\": \"拉萨经济技术开发区\",\r\n        \"value\": \"540172\"\r\n      },\r\n      {\r\n        \"label\": \"西藏文化旅游创意园区\",\r\n        \"value\": \"540173\"\r\n      },\r\n      {\r\n        \"label\": \"达孜工业园区\",\r\n        \"value\": \"540174\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"桑珠孜区\",\r\n        \"value\": \"540202\"\r\n      },\r\n      {\r\n        \"label\": \"南木林县\",\r\n        \"value\": \"540221\"\r\n      },\r\n      {\r\n        \"label\": \"江孜县\",\r\n        \"value\": \"540222\"\r\n      },\r\n      {\r\n        \"label\": \"定日县\",\r\n        \"value\": \"540223\"\r\n      },\r\n      {\r\n        \"label\": \"萨迦县\",\r\n        \"value\": \"540224\"\r\n      },\r\n      {\r\n        \"label\": \"拉孜县\",\r\n        \"value\": \"540225\"\r\n      },\r\n      {\r\n        \"label\": \"昂仁县\",\r\n        \"value\": \"540226\"\r\n      },\r\n      {\r\n        \"label\": \"谢通门县\",\r\n        \"value\": \"540227\"\r\n      },\r\n      {\r\n        \"label\": \"白朗县\",\r\n        \"value\": \"540228\"\r\n      },\r\n      {\r\n        \"label\": \"仁布县\",\r\n        \"value\": \"540229\"\r\n      },\r\n      {\r\n        \"label\": \"康马县\",\r\n        \"value\": \"540230\"\r\n      },\r\n      {\r\n        \"label\": \"定结县\",\r\n        \"value\": \"540231\"\r\n      },\r\n      {\r\n        \"label\": \"仲巴县\",\r\n        \"value\": \"540232\"\r\n      },\r\n      {\r\n        \"label\": \"亚东县\",\r\n        \"value\": \"540233\"\r\n      },\r\n      {\r\n        \"label\": \"吉隆县\",\r\n        \"value\": \"540234\"\r\n      },\r\n      {\r\n        \"label\": \"聂拉木县\",\r\n        \"value\": \"540235\"\r\n      },\r\n      {\r\n        \"label\": \"萨嘎县\",\r\n        \"value\": \"540236\"\r\n      },\r\n      {\r\n        \"label\": \"岗巴县\",\r\n        \"value\": \"540237\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"卡若区\",\r\n        \"value\": \"540302\"\r\n      },\r\n      {\r\n        \"label\": \"江达县\",\r\n        \"value\": \"540321\"\r\n      },\r\n      {\r\n        \"label\": \"贡觉县\",\r\n        \"value\": \"540322\"\r\n      },\r\n      {\r\n        \"label\": \"类乌齐县\",\r\n        \"value\": \"540323\"\r\n      },\r\n      {\r\n        \"label\": \"丁青县\",\r\n        \"value\": \"540324\"\r\n      },\r\n      {\r\n        \"label\": \"察雅县\",\r\n        \"value\": \"540325\"\r\n      },\r\n      {\r\n        \"label\": \"八宿县\",\r\n        \"value\": \"540326\"\r\n      },\r\n      {\r\n        \"label\": \"左贡县\",\r\n        \"value\": \"540327\"\r\n      },\r\n      {\r\n        \"label\": \"芒康县\",\r\n        \"value\": \"540328\"\r\n      },\r\n      {\r\n        \"label\": \"洛隆县\",\r\n        \"value\": \"540329\"\r\n      },\r\n      {\r\n        \"label\": \"边坝县\",\r\n        \"value\": \"540330\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"巴宜区\",\r\n        \"value\": \"540402\"\r\n      },\r\n      {\r\n        \"label\": \"工布江达县\",\r\n        \"value\": \"540421\"\r\n      },\r\n      {\r\n        \"label\": \"米林县\",\r\n        \"value\": \"540422\"\r\n      },\r\n      {\r\n        \"label\": \"墨脱县\",\r\n        \"value\": \"540423\"\r\n      },\r\n      {\r\n        \"label\": \"波密县\",\r\n        \"value\": \"540424\"\r\n      },\r\n      {\r\n        \"label\": \"察隅县\",\r\n        \"value\": \"540425\"\r\n      },\r\n      {\r\n        \"label\": \"朗县\",\r\n        \"value\": \"540426\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"乃东区\",\r\n        \"value\": \"540502\"\r\n      },\r\n      {\r\n        \"label\": \"扎囊县\",\r\n        \"value\": \"540521\"\r\n      },\r\n      {\r\n        \"label\": \"贡嘎县\",\r\n        \"value\": \"540522\"\r\n      },\r\n      {\r\n        \"label\": \"桑日县\",\r\n        \"value\": \"540523\"\r\n      },\r\n      {\r\n        \"label\": \"琼结县\",\r\n        \"value\": \"540524\"\r\n      },\r\n      {\r\n        \"label\": \"曲松县\",\r\n        \"value\": \"540525\"\r\n      },\r\n      {\r\n        \"label\": \"措美县\",\r\n        \"value\": \"540526\"\r\n      },\r\n      {\r\n        \"label\": \"洛扎县\",\r\n        \"value\": \"540527\"\r\n      },\r\n      {\r\n        \"label\": \"加查县\",\r\n        \"value\": \"540528\"\r\n      },\r\n      {\r\n        \"label\": \"隆子县\",\r\n        \"value\": \"540529\"\r\n      },\r\n      {\r\n        \"label\": \"错那县\",\r\n        \"value\": \"540530\"\r\n      },\r\n      {\r\n        \"label\": \"浪卡子县\",\r\n        \"value\": \"540531\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"那曲县\",\r\n        \"value\": \"542421\"\r\n      },\r\n      {\r\n        \"label\": \"嘉黎县\",\r\n        \"value\": \"542422\"\r\n      },\r\n      {\r\n        \"label\": \"比如县\",\r\n        \"value\": \"542423\"\r\n      },\r\n      {\r\n        \"label\": \"聂荣县\",\r\n        \"value\": \"542424\"\r\n      },\r\n      {\r\n        \"label\": \"安多县\",\r\n        \"value\": \"542425\"\r\n      },\r\n      {\r\n        \"label\": \"申扎县\",\r\n        \"value\": \"542426\"\r\n      },\r\n      {\r\n        \"label\": \"索县\",\r\n        \"value\": \"542427\"\r\n      },\r\n      {\r\n        \"label\": \"班戈县\",\r\n        \"value\": \"542428\"\r\n      },\r\n      {\r\n        \"label\": \"巴青县\",\r\n        \"value\": \"542429\"\r\n      },\r\n      {\r\n        \"label\": \"尼玛县\",\r\n        \"value\": \"542430\"\r\n      },\r\n      {\r\n        \"label\": \"双湖县\",\r\n        \"value\": \"542431\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"普兰县\",\r\n        \"value\": \"542521\"\r\n      },\r\n      {\r\n        \"label\": \"札达县\",\r\n        \"value\": \"542522\"\r\n      },\r\n      {\r\n        \"label\": \"噶尔县\",\r\n        \"value\": \"542523\"\r\n      },\r\n      {\r\n        \"label\": \"日土县\",\r\n        \"value\": \"542524\"\r\n      },\r\n      {\r\n        \"label\": \"革吉县\",\r\n        \"value\": \"542525\"\r\n      },\r\n      {\r\n        \"label\": \"改则县\",\r\n        \"value\": \"542526\"\r\n      },\r\n      {\r\n        \"label\": \"措勤县\",\r\n        \"value\": \"542527\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"新城区\",\r\n        \"value\": \"610102\"\r\n      },\r\n      {\r\n        \"label\": \"碑林区\",\r\n        \"value\": \"610103\"\r\n      },\r\n      {\r\n        \"label\": \"莲湖区\",\r\n        \"value\": \"610104\"\r\n      },\r\n      {\r\n        \"label\": \"灞桥区\",\r\n        \"value\": \"610111\"\r\n      },\r\n      {\r\n        \"label\": \"未央区\",\r\n        \"value\": \"610112\"\r\n      },\r\n      {\r\n        \"label\": \"雁塔区\",\r\n        \"value\": \"610113\"\r\n      },\r\n      {\r\n        \"label\": \"阎良区\",\r\n        \"value\": \"610114\"\r\n      },\r\n      {\r\n        \"label\": \"临潼区\",\r\n        \"value\": \"610115\"\r\n      },\r\n      {\r\n        \"label\": \"长安区\",\r\n        \"value\": \"610116\"\r\n      },\r\n      {\r\n        \"label\": \"高陵区\",\r\n        \"value\": \"610117\"\r\n      },\r\n      {\r\n        \"label\": \"鄠邑区\",\r\n        \"value\": \"610118\"\r\n      },\r\n      {\r\n        \"label\": \"蓝田县\",\r\n        \"value\": \"610122\"\r\n      },\r\n      {\r\n        \"label\": \"周至县\",\r\n        \"value\": \"610124\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"王益区\",\r\n        \"value\": \"610202\"\r\n      },\r\n      {\r\n        \"label\": \"印台区\",\r\n        \"value\": \"610203\"\r\n      },\r\n      {\r\n        \"label\": \"耀州区\",\r\n        \"value\": \"610204\"\r\n      },\r\n      {\r\n        \"label\": \"宜君县\",\r\n        \"value\": \"610222\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"渭滨区\",\r\n        \"value\": \"610302\"\r\n      },\r\n      {\r\n        \"label\": \"金台区\",\r\n        \"value\": \"610303\"\r\n      },\r\n      {\r\n        \"label\": \"陈仓区\",\r\n        \"value\": \"610304\"\r\n      },\r\n      {\r\n        \"label\": \"凤翔县\",\r\n        \"value\": \"610322\"\r\n      },\r\n      {\r\n        \"label\": \"岐山县\",\r\n        \"value\": \"610323\"\r\n      },\r\n      {\r\n        \"label\": \"扶风县\",\r\n        \"value\": \"610324\"\r\n      },\r\n      {\r\n        \"label\": \"眉县\",\r\n        \"value\": \"610326\"\r\n      },\r\n      {\r\n        \"label\": \"陇县\",\r\n        \"value\": \"610327\"\r\n      },\r\n      {\r\n        \"label\": \"千阳县\",\r\n        \"value\": \"610328\"\r\n      },\r\n      {\r\n        \"label\": \"麟游县\",\r\n        \"value\": \"610329\"\r\n      },\r\n      {\r\n        \"label\": \"凤县\",\r\n        \"value\": \"610330\"\r\n      },\r\n      {\r\n        \"label\": \"太白县\",\r\n        \"value\": \"610331\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"秦都区\",\r\n        \"value\": \"610402\"\r\n      },\r\n      {\r\n        \"label\": \"杨陵区\",\r\n        \"value\": \"610403\"\r\n      },\r\n      {\r\n        \"label\": \"渭城区\",\r\n        \"value\": \"610404\"\r\n      },\r\n      {\r\n        \"label\": \"三原县\",\r\n        \"value\": \"610422\"\r\n      },\r\n      {\r\n        \"label\": \"泾阳县\",\r\n        \"value\": \"610423\"\r\n      },\r\n      {\r\n        \"label\": \"乾县\",\r\n        \"value\": \"610424\"\r\n      },\r\n      {\r\n        \"label\": \"礼泉县\",\r\n        \"value\": \"610425\"\r\n      },\r\n      {\r\n        \"label\": \"永寿县\",\r\n        \"value\": \"610426\"\r\n      },\r\n      {\r\n        \"label\": \"彬县\",\r\n        \"value\": \"610427\"\r\n      },\r\n      {\r\n        \"label\": \"长武县\",\r\n        \"value\": \"610428\"\r\n      },\r\n      {\r\n        \"label\": \"旬邑县\",\r\n        \"value\": \"610429\"\r\n      },\r\n      {\r\n        \"label\": \"淳化县\",\r\n        \"value\": \"610430\"\r\n      },\r\n      {\r\n        \"label\": \"武功县\",\r\n        \"value\": \"610431\"\r\n      },\r\n      {\r\n        \"label\": \"兴平市\",\r\n        \"value\": \"610481\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"临渭区\",\r\n        \"value\": \"610502\"\r\n      },\r\n      {\r\n        \"label\": \"华州区\",\r\n        \"value\": \"610503\"\r\n      },\r\n      {\r\n        \"label\": \"潼关县\",\r\n        \"value\": \"610522\"\r\n      },\r\n      {\r\n        \"label\": \"大荔县\",\r\n        \"value\": \"610523\"\r\n      },\r\n      {\r\n        \"label\": \"合阳县\",\r\n        \"value\": \"610524\"\r\n      },\r\n      {\r\n        \"label\": \"澄城县\",\r\n        \"value\": \"610525\"\r\n      },\r\n      {\r\n        \"label\": \"蒲城县\",\r\n        \"value\": \"610526\"\r\n      },\r\n      {\r\n        \"label\": \"白水县\",\r\n        \"value\": \"610527\"\r\n      },\r\n      {\r\n        \"label\": \"富平县\",\r\n        \"value\": \"610528\"\r\n      },\r\n      {\r\n        \"label\": \"韩城市\",\r\n        \"value\": \"610581\"\r\n      },\r\n      {\r\n        \"label\": \"华阴市\",\r\n        \"value\": \"610582\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"宝塔区\",\r\n        \"value\": \"610602\"\r\n      },\r\n      {\r\n        \"label\": \"安塞区\",\r\n        \"value\": \"610603\"\r\n      },\r\n      {\r\n        \"label\": \"延长县\",\r\n        \"value\": \"610621\"\r\n      },\r\n      {\r\n        \"label\": \"延川县\",\r\n        \"value\": \"610622\"\r\n      },\r\n      {\r\n        \"label\": \"子长县\",\r\n        \"value\": \"610623\"\r\n      },\r\n      {\r\n        \"label\": \"志丹县\",\r\n        \"value\": \"610625\"\r\n      },\r\n      {\r\n        \"label\": \"吴起县\",\r\n        \"value\": \"610626\"\r\n      },\r\n      {\r\n        \"label\": \"甘泉县\",\r\n        \"value\": \"610627\"\r\n      },\r\n      {\r\n        \"label\": \"富县\",\r\n        \"value\": \"610628\"\r\n      },\r\n      {\r\n        \"label\": \"洛川县\",\r\n        \"value\": \"610629\"\r\n      },\r\n      {\r\n        \"label\": \"宜川县\",\r\n        \"value\": \"610630\"\r\n      },\r\n      {\r\n        \"label\": \"黄龙县\",\r\n        \"value\": \"610631\"\r\n      },\r\n      {\r\n        \"label\": \"黄陵县\",\r\n        \"value\": \"610632\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"汉台区\",\r\n        \"value\": \"610702\"\r\n      },\r\n      {\r\n        \"label\": \"南郑区\",\r\n        \"value\": \"610703\"\r\n      },\r\n      {\r\n        \"label\": \"城固县\",\r\n        \"value\": \"610722\"\r\n      },\r\n      {\r\n        \"label\": \"洋县\",\r\n        \"value\": \"610723\"\r\n      },\r\n      {\r\n        \"label\": \"西乡县\",\r\n        \"value\": \"610724\"\r\n      },\r\n      {\r\n        \"label\": \"勉县\",\r\n        \"value\": \"610725\"\r\n      },\r\n      {\r\n        \"label\": \"宁强县\",\r\n        \"value\": \"610726\"\r\n      },\r\n      {\r\n        \"label\": \"略阳县\",\r\n        \"value\": \"610727\"\r\n      },\r\n      {\r\n        \"label\": \"镇巴县\",\r\n        \"value\": \"610728\"\r\n      },\r\n      {\r\n        \"label\": \"留坝县\",\r\n        \"value\": \"610729\"\r\n      },\r\n      {\r\n        \"label\": \"佛坪县\",\r\n        \"value\": \"610730\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"榆阳区\",\r\n        \"value\": \"610802\"\r\n      },\r\n      {\r\n        \"label\": \"横山区\",\r\n        \"value\": \"610803\"\r\n      },\r\n      {\r\n        \"label\": \"府谷县\",\r\n        \"value\": \"610822\"\r\n      },\r\n      {\r\n        \"label\": \"靖边县\",\r\n        \"value\": \"610824\"\r\n      },\r\n      {\r\n        \"label\": \"定边县\",\r\n        \"value\": \"610825\"\r\n      },\r\n      {\r\n        \"label\": \"绥德县\",\r\n        \"value\": \"610826\"\r\n      },\r\n      {\r\n        \"label\": \"米脂县\",\r\n        \"value\": \"610827\"\r\n      },\r\n      {\r\n        \"label\": \"佳县\",\r\n        \"value\": \"610828\"\r\n      },\r\n      {\r\n        \"label\": \"吴堡县\",\r\n        \"value\": \"610829\"\r\n      },\r\n      {\r\n        \"label\": \"清涧县\",\r\n        \"value\": \"610830\"\r\n      },\r\n      {\r\n        \"label\": \"子洲县\",\r\n        \"value\": \"610831\"\r\n      },\r\n      {\r\n        \"label\": \"神木市\",\r\n        \"value\": \"610881\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"汉滨区\",\r\n        \"value\": \"610902\"\r\n      },\r\n      {\r\n        \"label\": \"汉阴县\",\r\n        \"value\": \"610921\"\r\n      },\r\n      {\r\n        \"label\": \"石泉县\",\r\n        \"value\": \"610922\"\r\n      },\r\n      {\r\n        \"label\": \"宁陕县\",\r\n        \"value\": \"610923\"\r\n      },\r\n      {\r\n        \"label\": \"紫阳县\",\r\n        \"value\": \"610924\"\r\n      },\r\n      {\r\n        \"label\": \"岚皋县\",\r\n        \"value\": \"610925\"\r\n      },\r\n      {\r\n        \"label\": \"平利县\",\r\n        \"value\": \"610926\"\r\n      },\r\n      {\r\n        \"label\": \"镇坪县\",\r\n        \"value\": \"610927\"\r\n      },\r\n      {\r\n        \"label\": \"旬阳县\",\r\n        \"value\": \"610928\"\r\n      },\r\n      {\r\n        \"label\": \"白河县\",\r\n        \"value\": \"610929\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"商州区\",\r\n        \"value\": \"611002\"\r\n      },\r\n      {\r\n        \"label\": \"洛南县\",\r\n        \"value\": \"611021\"\r\n      },\r\n      {\r\n        \"label\": \"丹凤县\",\r\n        \"value\": \"611022\"\r\n      },\r\n      {\r\n        \"label\": \"商南县\",\r\n        \"value\": \"611023\"\r\n      },\r\n      {\r\n        \"label\": \"山阳县\",\r\n        \"value\": \"611024\"\r\n      },\r\n      {\r\n        \"label\": \"镇安县\",\r\n        \"value\": \"611025\"\r\n      },\r\n      {\r\n        \"label\": \"柞水县\",\r\n        \"value\": \"611026\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"城关区\",\r\n        \"value\": \"620102\"\r\n      },\r\n      {\r\n        \"label\": \"七里河区\",\r\n        \"value\": \"620103\"\r\n      },\r\n      {\r\n        \"label\": \"西固区\",\r\n        \"value\": \"620104\"\r\n      },\r\n      {\r\n        \"label\": \"安宁区\",\r\n        \"value\": \"620105\"\r\n      },\r\n      {\r\n        \"label\": \"红古区\",\r\n        \"value\": \"620111\"\r\n      },\r\n      {\r\n        \"label\": \"永登县\",\r\n        \"value\": \"620121\"\r\n      },\r\n      {\r\n        \"label\": \"皋兰县\",\r\n        \"value\": \"620122\"\r\n      },\r\n      {\r\n        \"label\": \"榆中县\",\r\n        \"value\": \"620123\"\r\n      },\r\n      {\r\n        \"label\": \"兰州新区\",\r\n        \"value\": \"620171\"\r\n      }\r\n    ],\r\n    [{\r\n      \"label\": \"嘉峪关市\",\r\n      \"value\": \"620201\"\r\n    }],\r\n    [{\r\n        \"label\": \"金川区\",\r\n        \"value\": \"620302\"\r\n      },\r\n      {\r\n        \"label\": \"永昌县\",\r\n        \"value\": \"620321\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"白银区\",\r\n        \"value\": \"620402\"\r\n      },\r\n      {\r\n        \"label\": \"平川区\",\r\n        \"value\": \"620403\"\r\n      },\r\n      {\r\n        \"label\": \"靖远县\",\r\n        \"value\": \"620421\"\r\n      },\r\n      {\r\n        \"label\": \"会宁县\",\r\n        \"value\": \"620422\"\r\n      },\r\n      {\r\n        \"label\": \"景泰县\",\r\n        \"value\": \"620423\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"秦州区\",\r\n        \"value\": \"620502\"\r\n      },\r\n      {\r\n        \"label\": \"麦积区\",\r\n        \"value\": \"620503\"\r\n      },\r\n      {\r\n        \"label\": \"清水县\",\r\n        \"value\": \"620521\"\r\n      },\r\n      {\r\n        \"label\": \"秦安县\",\r\n        \"value\": \"620522\"\r\n      },\r\n      {\r\n        \"label\": \"甘谷县\",\r\n        \"value\": \"620523\"\r\n      },\r\n      {\r\n        \"label\": \"武山县\",\r\n        \"value\": \"620524\"\r\n      },\r\n      {\r\n        \"label\": \"张家川回族自治县\",\r\n        \"value\": \"620525\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"凉州区\",\r\n        \"value\": \"620602\"\r\n      },\r\n      {\r\n        \"label\": \"民勤县\",\r\n        \"value\": \"620621\"\r\n      },\r\n      {\r\n        \"label\": \"古浪县\",\r\n        \"value\": \"620622\"\r\n      },\r\n      {\r\n        \"label\": \"天祝藏族自治县\",\r\n        \"value\": \"620623\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"甘州区\",\r\n        \"value\": \"620702\"\r\n      },\r\n      {\r\n        \"label\": \"肃南裕固族自治县\",\r\n        \"value\": \"620721\"\r\n      },\r\n      {\r\n        \"label\": \"民乐县\",\r\n        \"value\": \"620722\"\r\n      },\r\n      {\r\n        \"label\": \"临泽县\",\r\n        \"value\": \"620723\"\r\n      },\r\n      {\r\n        \"label\": \"高台县\",\r\n        \"value\": \"620724\"\r\n      },\r\n      {\r\n        \"label\": \"山丹县\",\r\n        \"value\": \"620725\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"崆峒区\",\r\n        \"value\": \"620802\"\r\n      },\r\n      {\r\n        \"label\": \"泾川县\",\r\n        \"value\": \"620821\"\r\n      },\r\n      {\r\n        \"label\": \"灵台县\",\r\n        \"value\": \"620822\"\r\n      },\r\n      {\r\n        \"label\": \"崇信县\",\r\n        \"value\": \"620823\"\r\n      },\r\n      {\r\n        \"label\": \"华亭县\",\r\n        \"value\": \"620824\"\r\n      },\r\n      {\r\n        \"label\": \"庄浪县\",\r\n        \"value\": \"620825\"\r\n      },\r\n      {\r\n        \"label\": \"静宁县\",\r\n        \"value\": \"620826\"\r\n      },\r\n      {\r\n        \"label\": \"平凉工业园区\",\r\n        \"value\": \"620871\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"肃州区\",\r\n        \"value\": \"620902\"\r\n      },\r\n      {\r\n        \"label\": \"金塔县\",\r\n        \"value\": \"620921\"\r\n      },\r\n      {\r\n        \"label\": \"瓜州县\",\r\n        \"value\": \"620922\"\r\n      },\r\n      {\r\n        \"label\": \"肃北蒙古族自治县\",\r\n        \"value\": \"620923\"\r\n      },\r\n      {\r\n        \"label\": \"阿克塞哈萨克族自治县\",\r\n        \"value\": \"620924\"\r\n      },\r\n      {\r\n        \"label\": \"玉门市\",\r\n        \"value\": \"620981\"\r\n      },\r\n      {\r\n        \"label\": \"敦煌市\",\r\n        \"value\": \"620982\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"西峰区\",\r\n        \"value\": \"621002\"\r\n      },\r\n      {\r\n        \"label\": \"庆城县\",\r\n        \"value\": \"621021\"\r\n      },\r\n      {\r\n        \"label\": \"环县\",\r\n        \"value\": \"621022\"\r\n      },\r\n      {\r\n        \"label\": \"华池县\",\r\n        \"value\": \"621023\"\r\n      },\r\n      {\r\n        \"label\": \"合水县\",\r\n        \"value\": \"621024\"\r\n      },\r\n      {\r\n        \"label\": \"正宁县\",\r\n        \"value\": \"621025\"\r\n      },\r\n      {\r\n        \"label\": \"宁县\",\r\n        \"value\": \"621026\"\r\n      },\r\n      {\r\n        \"label\": \"镇原县\",\r\n        \"value\": \"621027\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"安定区\",\r\n        \"value\": \"621102\"\r\n      },\r\n      {\r\n        \"label\": \"通渭县\",\r\n        \"value\": \"621121\"\r\n      },\r\n      {\r\n        \"label\": \"陇西县\",\r\n        \"value\": \"621122\"\r\n      },\r\n      {\r\n        \"label\": \"渭源县\",\r\n        \"value\": \"621123\"\r\n      },\r\n      {\r\n        \"label\": \"临洮县\",\r\n        \"value\": \"621124\"\r\n      },\r\n      {\r\n        \"label\": \"漳县\",\r\n        \"value\": \"621125\"\r\n      },\r\n      {\r\n        \"label\": \"岷县\",\r\n        \"value\": \"621126\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"武都区\",\r\n        \"value\": \"621202\"\r\n      },\r\n      {\r\n        \"label\": \"成县\",\r\n        \"value\": \"621221\"\r\n      },\r\n      {\r\n        \"label\": \"文县\",\r\n        \"value\": \"621222\"\r\n      },\r\n      {\r\n        \"label\": \"宕昌县\",\r\n        \"value\": \"621223\"\r\n      },\r\n      {\r\n        \"label\": \"康县\",\r\n        \"value\": \"621224\"\r\n      },\r\n      {\r\n        \"label\": \"西和县\",\r\n        \"value\": \"621225\"\r\n      },\r\n      {\r\n        \"label\": \"礼县\",\r\n        \"value\": \"621226\"\r\n      },\r\n      {\r\n        \"label\": \"徽县\",\r\n        \"value\": \"621227\"\r\n      },\r\n      {\r\n        \"label\": \"两当县\",\r\n        \"value\": \"621228\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"临夏市\",\r\n        \"value\": \"622901\"\r\n      },\r\n      {\r\n        \"label\": \"临夏县\",\r\n        \"value\": \"622921\"\r\n      },\r\n      {\r\n        \"label\": \"康乐县\",\r\n        \"value\": \"622922\"\r\n      },\r\n      {\r\n        \"label\": \"永靖县\",\r\n        \"value\": \"622923\"\r\n      },\r\n      {\r\n        \"label\": \"广河县\",\r\n        \"value\": \"622924\"\r\n      },\r\n      {\r\n        \"label\": \"和政县\",\r\n        \"value\": \"622925\"\r\n      },\r\n      {\r\n        \"label\": \"东乡族自治县\",\r\n        \"value\": \"622926\"\r\n      },\r\n      {\r\n        \"label\": \"积石山保安族东乡族撒拉族自治县\",\r\n        \"value\": \"622927\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"合作市\",\r\n        \"value\": \"623001\"\r\n      },\r\n      {\r\n        \"label\": \"临潭县\",\r\n        \"value\": \"623021\"\r\n      },\r\n      {\r\n        \"label\": \"卓尼县\",\r\n        \"value\": \"623022\"\r\n      },\r\n      {\r\n        \"label\": \"舟曲县\",\r\n        \"value\": \"623023\"\r\n      },\r\n      {\r\n        \"label\": \"迭部县\",\r\n        \"value\": \"623024\"\r\n      },\r\n      {\r\n        \"label\": \"玛曲县\",\r\n        \"value\": \"623025\"\r\n      },\r\n      {\r\n        \"label\": \"碌曲县\",\r\n        \"value\": \"623026\"\r\n      },\r\n      {\r\n        \"label\": \"夏河县\",\r\n        \"value\": \"623027\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"城东区\",\r\n        \"value\": \"630102\"\r\n      },\r\n      {\r\n        \"label\": \"城中区\",\r\n        \"value\": \"630103\"\r\n      },\r\n      {\r\n        \"label\": \"城西区\",\r\n        \"value\": \"630104\"\r\n      },\r\n      {\r\n        \"label\": \"城北区\",\r\n        \"value\": \"630105\"\r\n      },\r\n      {\r\n        \"label\": \"大通回族土族自治县\",\r\n        \"value\": \"630121\"\r\n      },\r\n      {\r\n        \"label\": \"湟中县\",\r\n        \"value\": \"630122\"\r\n      },\r\n      {\r\n        \"label\": \"湟源县\",\r\n        \"value\": \"630123\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"乐都区\",\r\n        \"value\": \"630202\"\r\n      },\r\n      {\r\n        \"label\": \"平安区\",\r\n        \"value\": \"630203\"\r\n      },\r\n      {\r\n        \"label\": \"民和回族土族自治县\",\r\n        \"value\": \"630222\"\r\n      },\r\n      {\r\n        \"label\": \"互助土族自治县\",\r\n        \"value\": \"630223\"\r\n      },\r\n      {\r\n        \"label\": \"化隆回族自治县\",\r\n        \"value\": \"630224\"\r\n      },\r\n      {\r\n        \"label\": \"循化撒拉族自治县\",\r\n        \"value\": \"630225\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"门源回族自治县\",\r\n        \"value\": \"632221\"\r\n      },\r\n      {\r\n        \"label\": \"祁连县\",\r\n        \"value\": \"632222\"\r\n      },\r\n      {\r\n        \"label\": \"海晏县\",\r\n        \"value\": \"632223\"\r\n      },\r\n      {\r\n        \"label\": \"刚察县\",\r\n        \"value\": \"632224\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"同仁县\",\r\n        \"value\": \"632321\"\r\n      },\r\n      {\r\n        \"label\": \"尖扎县\",\r\n        \"value\": \"632322\"\r\n      },\r\n      {\r\n        \"label\": \"泽库县\",\r\n        \"value\": \"632323\"\r\n      },\r\n      {\r\n        \"label\": \"河南蒙古族自治县\",\r\n        \"value\": \"632324\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"共和县\",\r\n        \"value\": \"632521\"\r\n      },\r\n      {\r\n        \"label\": \"同德县\",\r\n        \"value\": \"632522\"\r\n      },\r\n      {\r\n        \"label\": \"贵德县\",\r\n        \"value\": \"632523\"\r\n      },\r\n      {\r\n        \"label\": \"兴海县\",\r\n        \"value\": \"632524\"\r\n      },\r\n      {\r\n        \"label\": \"贵南县\",\r\n        \"value\": \"632525\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"玛沁县\",\r\n        \"value\": \"632621\"\r\n      },\r\n      {\r\n        \"label\": \"班玛县\",\r\n        \"value\": \"632622\"\r\n      },\r\n      {\r\n        \"label\": \"甘德县\",\r\n        \"value\": \"632623\"\r\n      },\r\n      {\r\n        \"label\": \"达日县\",\r\n        \"value\": \"632624\"\r\n      },\r\n      {\r\n        \"label\": \"久治县\",\r\n        \"value\": \"632625\"\r\n      },\r\n      {\r\n        \"label\": \"玛多县\",\r\n        \"value\": \"632626\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"玉树市\",\r\n        \"value\": \"632701\"\r\n      },\r\n      {\r\n        \"label\": \"杂多县\",\r\n        \"value\": \"632722\"\r\n      },\r\n      {\r\n        \"label\": \"称多县\",\r\n        \"value\": \"632723\"\r\n      },\r\n      {\r\n        \"label\": \"治多县\",\r\n        \"value\": \"632724\"\r\n      },\r\n      {\r\n        \"label\": \"囊谦县\",\r\n        \"value\": \"632725\"\r\n      },\r\n      {\r\n        \"label\": \"曲麻莱县\",\r\n        \"value\": \"632726\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"格尔木市\",\r\n        \"value\": \"632801\"\r\n      },\r\n      {\r\n        \"label\": \"德令哈市\",\r\n        \"value\": \"632802\"\r\n      },\r\n      {\r\n        \"label\": \"乌兰县\",\r\n        \"value\": \"632821\"\r\n      },\r\n      {\r\n        \"label\": \"都兰县\",\r\n        \"value\": \"632822\"\r\n      },\r\n      {\r\n        \"label\": \"天峻县\",\r\n        \"value\": \"632823\"\r\n      },\r\n      {\r\n        \"label\": \"大柴旦行政委员会\",\r\n        \"value\": \"632857\"\r\n      },\r\n      {\r\n        \"label\": \"冷湖行政委员会\",\r\n        \"value\": \"632858\"\r\n      },\r\n      {\r\n        \"label\": \"茫崖行政委员会\",\r\n        \"value\": \"632859\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"兴庆区\",\r\n        \"value\": \"640104\"\r\n      },\r\n      {\r\n        \"label\": \"西夏区\",\r\n        \"value\": \"640105\"\r\n      },\r\n      {\r\n        \"label\": \"金凤区\",\r\n        \"value\": \"640106\"\r\n      },\r\n      {\r\n        \"label\": \"永宁县\",\r\n        \"value\": \"640121\"\r\n      },\r\n      {\r\n        \"label\": \"贺兰县\",\r\n        \"value\": \"640122\"\r\n      },\r\n      {\r\n        \"label\": \"灵武市\",\r\n        \"value\": \"640181\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"大武口区\",\r\n        \"value\": \"640202\"\r\n      },\r\n      {\r\n        \"label\": \"惠农区\",\r\n        \"value\": \"640205\"\r\n      },\r\n      {\r\n        \"label\": \"平罗县\",\r\n        \"value\": \"640221\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"利通区\",\r\n        \"value\": \"640302\"\r\n      },\r\n      {\r\n        \"label\": \"红寺堡区\",\r\n        \"value\": \"640303\"\r\n      },\r\n      {\r\n        \"label\": \"盐池县\",\r\n        \"value\": \"640323\"\r\n      },\r\n      {\r\n        \"label\": \"同心县\",\r\n        \"value\": \"640324\"\r\n      },\r\n      {\r\n        \"label\": \"青铜峡市\",\r\n        \"value\": \"640381\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"原州区\",\r\n        \"value\": \"640402\"\r\n      },\r\n      {\r\n        \"label\": \"西吉县\",\r\n        \"value\": \"640422\"\r\n      },\r\n      {\r\n        \"label\": \"隆德县\",\r\n        \"value\": \"640423\"\r\n      },\r\n      {\r\n        \"label\": \"泾源县\",\r\n        \"value\": \"640424\"\r\n      },\r\n      {\r\n        \"label\": \"彭阳县\",\r\n        \"value\": \"640425\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"沙坡头区\",\r\n        \"value\": \"640502\"\r\n      },\r\n      {\r\n        \"label\": \"中宁县\",\r\n        \"value\": \"640521\"\r\n      },\r\n      {\r\n        \"label\": \"海原县\",\r\n        \"value\": \"640522\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n        \"label\": \"天山区\",\r\n        \"value\": \"650102\"\r\n      },\r\n      {\r\n        \"label\": \"沙依巴克区\",\r\n        \"value\": \"650103\"\r\n      },\r\n      {\r\n        \"label\": \"新市区\",\r\n        \"value\": \"650104\"\r\n      },\r\n      {\r\n        \"label\": \"水磨沟区\",\r\n        \"value\": \"650105\"\r\n      },\r\n      {\r\n        \"label\": \"头屯河区\",\r\n        \"value\": \"650106\"\r\n      },\r\n      {\r\n        \"label\": \"达坂城区\",\r\n        \"value\": \"650107\"\r\n      },\r\n      {\r\n        \"label\": \"米东区\",\r\n        \"value\": \"650109\"\r\n      },\r\n      {\r\n        \"label\": \"乌鲁木齐县\",\r\n        \"value\": \"650121\"\r\n      },\r\n      {\r\n        \"label\": \"乌鲁木齐经济技术开发区\",\r\n        \"value\": \"650171\"\r\n      },\r\n      {\r\n        \"label\": \"乌鲁木齐高新技术产业开发区\",\r\n        \"value\": \"650172\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"独山子区\",\r\n        \"value\": \"650202\"\r\n      },\r\n      {\r\n        \"label\": \"克拉玛依区\",\r\n        \"value\": \"650203\"\r\n      },\r\n      {\r\n        \"label\": \"白碱滩区\",\r\n        \"value\": \"650204\"\r\n      },\r\n      {\r\n        \"label\": \"乌尔禾区\",\r\n        \"value\": \"650205\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"高昌区\",\r\n        \"value\": \"650402\"\r\n      },\r\n      {\r\n        \"label\": \"鄯善县\",\r\n        \"value\": \"650421\"\r\n      },\r\n      {\r\n        \"label\": \"托克逊县\",\r\n        \"value\": \"650422\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"伊州区\",\r\n        \"value\": \"650502\"\r\n      },\r\n      {\r\n        \"label\": \"巴里坤哈萨克自治县\",\r\n        \"value\": \"650521\"\r\n      },\r\n      {\r\n        \"label\": \"伊吾县\",\r\n        \"value\": \"650522\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"昌吉市\",\r\n        \"value\": \"652301\"\r\n      },\r\n      {\r\n        \"label\": \"阜康市\",\r\n        \"value\": \"652302\"\r\n      },\r\n      {\r\n        \"label\": \"呼图壁县\",\r\n        \"value\": \"652323\"\r\n      },\r\n      {\r\n        \"label\": \"玛纳斯县\",\r\n        \"value\": \"652324\"\r\n      },\r\n      {\r\n        \"label\": \"奇台县\",\r\n        \"value\": \"652325\"\r\n      },\r\n      {\r\n        \"label\": \"吉木萨尔县\",\r\n        \"value\": \"652327\"\r\n      },\r\n      {\r\n        \"label\": \"木垒哈萨克自治县\",\r\n        \"value\": \"652328\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"博乐市\",\r\n        \"value\": \"652701\"\r\n      },\r\n      {\r\n        \"label\": \"阿拉山口市\",\r\n        \"value\": \"652702\"\r\n      },\r\n      {\r\n        \"label\": \"精河县\",\r\n        \"value\": \"652722\"\r\n      },\r\n      {\r\n        \"label\": \"温泉县\",\r\n        \"value\": \"652723\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"库尔勒市\",\r\n        \"value\": \"652801\"\r\n      },\r\n      {\r\n        \"label\": \"轮台县\",\r\n        \"value\": \"652822\"\r\n      },\r\n      {\r\n        \"label\": \"尉犁县\",\r\n        \"value\": \"652823\"\r\n      },\r\n      {\r\n        \"label\": \"若羌县\",\r\n        \"value\": \"652824\"\r\n      },\r\n      {\r\n        \"label\": \"且末县\",\r\n        \"value\": \"652825\"\r\n      },\r\n      {\r\n        \"label\": \"焉耆回族自治县\",\r\n        \"value\": \"652826\"\r\n      },\r\n      {\r\n        \"label\": \"和静县\",\r\n        \"value\": \"652827\"\r\n      },\r\n      {\r\n        \"label\": \"和硕县\",\r\n        \"value\": \"652828\"\r\n      },\r\n      {\r\n        \"label\": \"博湖县\",\r\n        \"value\": \"652829\"\r\n      },\r\n      {\r\n        \"label\": \"库尔勒经济技术开发区\",\r\n        \"value\": \"652871\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"阿克苏市\",\r\n        \"value\": \"652901\"\r\n      },\r\n      {\r\n        \"label\": \"温宿县\",\r\n        \"value\": \"652922\"\r\n      },\r\n      {\r\n        \"label\": \"库车县\",\r\n        \"value\": \"652923\"\r\n      },\r\n      {\r\n        \"label\": \"沙雅县\",\r\n        \"value\": \"652924\"\r\n      },\r\n      {\r\n        \"label\": \"新和县\",\r\n        \"value\": \"652925\"\r\n      },\r\n      {\r\n        \"label\": \"拜城县\",\r\n        \"value\": \"652926\"\r\n      },\r\n      {\r\n        \"label\": \"乌什县\",\r\n        \"value\": \"652927\"\r\n      },\r\n      {\r\n        \"label\": \"阿瓦提县\",\r\n        \"value\": \"652928\"\r\n      },\r\n      {\r\n        \"label\": \"柯坪县\",\r\n        \"value\": \"652929\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"阿图什市\",\r\n        \"value\": \"653001\"\r\n      },\r\n      {\r\n        \"label\": \"阿克陶县\",\r\n        \"value\": \"653022\"\r\n      },\r\n      {\r\n        \"label\": \"阿合奇县\",\r\n        \"value\": \"653023\"\r\n      },\r\n      {\r\n        \"label\": \"乌恰县\",\r\n        \"value\": \"653024\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"喀什市\",\r\n        \"value\": \"653101\"\r\n      },\r\n      {\r\n        \"label\": \"疏附县\",\r\n        \"value\": \"653121\"\r\n      },\r\n      {\r\n        \"label\": \"疏勒县\",\r\n        \"value\": \"653122\"\r\n      },\r\n      {\r\n        \"label\": \"英吉沙县\",\r\n        \"value\": \"653123\"\r\n      },\r\n      {\r\n        \"label\": \"泽普县\",\r\n        \"value\": \"653124\"\r\n      },\r\n      {\r\n        \"label\": \"莎车县\",\r\n        \"value\": \"653125\"\r\n      },\r\n      {\r\n        \"label\": \"叶城县\",\r\n        \"value\": \"653126\"\r\n      },\r\n      {\r\n        \"label\": \"麦盖提县\",\r\n        \"value\": \"653127\"\r\n      },\r\n      {\r\n        \"label\": \"岳普湖县\",\r\n        \"value\": \"653128\"\r\n      },\r\n      {\r\n        \"label\": \"伽师县\",\r\n        \"value\": \"653129\"\r\n      },\r\n      {\r\n        \"label\": \"巴楚县\",\r\n        \"value\": \"653130\"\r\n      },\r\n      {\r\n        \"label\": \"塔什库尔干塔吉克自治县\",\r\n        \"value\": \"653131\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"和田市\",\r\n        \"value\": \"653201\"\r\n      },\r\n      {\r\n        \"label\": \"和田县\",\r\n        \"value\": \"653221\"\r\n      },\r\n      {\r\n        \"label\": \"墨玉县\",\r\n        \"value\": \"653222\"\r\n      },\r\n      {\r\n        \"label\": \"皮山县\",\r\n        \"value\": \"653223\"\r\n      },\r\n      {\r\n        \"label\": \"洛浦县\",\r\n        \"value\": \"653224\"\r\n      },\r\n      {\r\n        \"label\": \"策勒县\",\r\n        \"value\": \"653225\"\r\n      },\r\n      {\r\n        \"label\": \"于田县\",\r\n        \"value\": \"653226\"\r\n      },\r\n      {\r\n        \"label\": \"民丰县\",\r\n        \"value\": \"653227\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"伊宁市\",\r\n        \"value\": \"654002\"\r\n      },\r\n      {\r\n        \"label\": \"奎屯市\",\r\n        \"value\": \"654003\"\r\n      },\r\n      {\r\n        \"label\": \"霍尔果斯市\",\r\n        \"value\": \"654004\"\r\n      },\r\n      {\r\n        \"label\": \"伊宁县\",\r\n        \"value\": \"654021\"\r\n      },\r\n      {\r\n        \"label\": \"察布查尔锡伯自治县\",\r\n        \"value\": \"654022\"\r\n      },\r\n      {\r\n        \"label\": \"霍城县\",\r\n        \"value\": \"654023\"\r\n      },\r\n      {\r\n        \"label\": \"巩留县\",\r\n        \"value\": \"654024\"\r\n      },\r\n      {\r\n        \"label\": \"新源县\",\r\n        \"value\": \"654025\"\r\n      },\r\n      {\r\n        \"label\": \"昭苏县\",\r\n        \"value\": \"654026\"\r\n      },\r\n      {\r\n        \"label\": \"特克斯县\",\r\n        \"value\": \"654027\"\r\n      },\r\n      {\r\n        \"label\": \"尼勒克县\",\r\n        \"value\": \"654028\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"塔城市\",\r\n        \"value\": \"654201\"\r\n      },\r\n      {\r\n        \"label\": \"乌苏市\",\r\n        \"value\": \"654202\"\r\n      },\r\n      {\r\n        \"label\": \"额敏县\",\r\n        \"value\": \"654221\"\r\n      },\r\n      {\r\n        \"label\": \"沙湾县\",\r\n        \"value\": \"654223\"\r\n      },\r\n      {\r\n        \"label\": \"托里县\",\r\n        \"value\": \"654224\"\r\n      },\r\n      {\r\n        \"label\": \"裕民县\",\r\n        \"value\": \"654225\"\r\n      },\r\n      {\r\n        \"label\": \"和布克赛尔蒙古自治县\",\r\n        \"value\": \"654226\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"阿勒泰市\",\r\n        \"value\": \"654301\"\r\n      },\r\n      {\r\n        \"label\": \"布尔津县\",\r\n        \"value\": \"654321\"\r\n      },\r\n      {\r\n        \"label\": \"富蕴县\",\r\n        \"value\": \"654322\"\r\n      },\r\n      {\r\n        \"label\": \"福海县\",\r\n        \"value\": \"654323\"\r\n      },\r\n      {\r\n        \"label\": \"哈巴河县\",\r\n        \"value\": \"654324\"\r\n      },\r\n      {\r\n        \"label\": \"青河县\",\r\n        \"value\": \"654325\"\r\n      },\r\n      {\r\n        \"label\": \"吉木乃县\",\r\n        \"value\": \"654326\"\r\n      }\r\n    ],\r\n    [{\r\n        \"label\": \"石河子市\",\r\n        \"value\": \"659001\"\r\n      },\r\n      {\r\n        \"label\": \"阿拉尔市\",\r\n        \"value\": \"659002\"\r\n      },\r\n      {\r\n        \"label\": \"图木舒克市\",\r\n        \"value\": \"659003\"\r\n      },\r\n      {\r\n        \"label\": \"五家渠市\",\r\n        \"value\": \"659004\"\r\n      },\r\n      {\r\n        \"label\": \"铁门关市\",\r\n        \"value\": \"659006\"\r\n      }\r\n    ]\r\n  ],\r\n  [\r\n    [{\r\n      \"label\": \"台北\",\r\n      \"value\": \"660101\"\r\n    }],\r\n    [{\r\n      \"label\": \"高雄\",\r\n      \"value\": \"660201\"\r\n    }],\r\n    [{\r\n      \"label\": \"基隆\",\r\n      \"value\": \"660301\"\r\n    }],\r\n    [{\r\n      \"label\": \"台中\",\r\n      \"value\": \"660401\"\r\n    }],\r\n    [{\r\n      \"label\": \"台南\",\r\n      \"value\": \"660501\"\r\n    }],\r\n    [{\r\n      \"label\": \"新竹\",\r\n      \"value\": \"660601\"\r\n    }],\r\n    [{\r\n      \"label\": \"嘉义\",\r\n      \"value\": \"660701\"\r\n    }],\r\n    [{\r\n      \"label\": \"宜兰\",\r\n      \"value\": \"660801\"\r\n    }],\r\n    [{\r\n      \"label\": \"桃园\",\r\n      \"value\": \"660901\"\r\n    }],\r\n    [{\r\n      \"label\": \"苗栗\",\r\n      \"value\": \"661001\"\r\n    }],\r\n    [{\r\n      \"label\": \"彰化\",\r\n      \"value\": \"661101\"\r\n    }],\r\n    [{\r\n      \"label\": \"南投\",\r\n      \"value\": \"661201\"\r\n    }],\r\n    [{\r\n      \"label\": \"云林\",\r\n      \"value\": \"661301\"\r\n    }],\r\n    [{\r\n      \"label\": \"屏东\",\r\n      \"value\": \"661401\"\r\n    }],\r\n    [{\r\n      \"label\": \"台东\",\r\n      \"value\": \"661501\"\r\n    }],\r\n    [{\r\n      \"label\": \"花莲\",\r\n      \"value\": \"661601\"\r\n    }],\r\n    [{\r\n      \"label\": \"澎湖\",\r\n      \"value\": \"661701\"\r\n    }]\r\n  ],\r\n  [\r\n    [{\r\n      \"label\": \"香港岛\",\r\n      \"value\": \"670101\"\r\n    }],\r\n    [{\r\n      \"label\": \"九龙\",\r\n      \"value\": \"670201\"\r\n    }],\r\n    [{\r\n      \"label\": \"新界\",\r\n      \"value\": \"670301\"\r\n    }]\r\n  ],\r\n  [\r\n    [{\r\n      \"label\": \"澳门半岛\",\r\n      \"value\": \"680101\"\r\n    }],\r\n    [{\r\n      \"label\": \"氹仔岛\",\r\n      \"value\": \"680201\"\r\n    }],\r\n    [{\r\n      \"label\": \"路环岛\",\r\n      \"value\": \"680301\"\r\n    }],\r\n    [{\r\n      \"label\": \"路氹城\",\r\n      \"value\": \"680401\"\r\n    }]\r\n  ]\r\n]\r\nexport default areaData;\r\n"
  },
  {
    "path": "uview-ui/libs/util/async-validator.js",
    "content": "function _extends() {\r\n\t_extends = Object.assign || function(target) {\r\n\t\tfor (var i = 1; i < arguments.length; i++) {\r\n\t\t\tvar source = arguments[i];\r\n\r\n\t\t\tfor (var key in source) {\r\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\r\n\t\t\t\t\ttarget[key] = source[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn target;\r\n\t};\r\n\r\n\treturn _extends.apply(this, arguments);\r\n}\r\n\r\n/* eslint no-console:0 */\r\nvar formatRegExp = /%[sdj%]/g;\r\nvar warning = function warning() {}; // don't print warning message when in production env or node runtime\r\n\r\nif (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !==\r\n\t'undefined' && typeof document !== 'undefined') {\r\n\twarning = function warning(type, errors) {\r\n\t\tif (typeof console !== 'undefined' && console.warn) {\r\n\t\t\tif (errors.every(function(e) {\r\n\t\t\t\t\treturn typeof e === 'string';\r\n\t\t\t\t})) {\r\n\t\t\t\tconsole.warn(type, errors);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n\r\nfunction convertFieldsError(errors) {\r\n\tif (!errors || !errors.length) return null;\r\n\tvar fields = {};\r\n\terrors.forEach(function(error) {\r\n\t\tvar field = error.field;\r\n\t\tfields[field] = fields[field] || [];\r\n\t\tfields[field].push(error);\r\n\t});\r\n\treturn fields;\r\n}\r\n\r\nfunction format() {\r\n\tfor (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\r\n\t\targs[_key] = arguments[_key];\r\n\t}\r\n\r\n\tvar i = 1;\r\n\tvar f = args[0];\r\n\tvar len = args.length;\r\n\r\n\tif (typeof f === 'function') {\r\n\t\treturn f.apply(null, args.slice(1));\r\n\t}\r\n\r\n\tif (typeof f === 'string') {\r\n\t\tvar str = String(f).replace(formatRegExp, function(x) {\r\n\t\t\tif (x === '%%') {\r\n\t\t\t\treturn '%';\r\n\t\t\t}\r\n\r\n\t\t\tif (i >= len) {\r\n\t\t\t\treturn x;\r\n\t\t\t}\r\n\r\n\t\t\tswitch (x) {\r\n\t\t\t\tcase '%s':\r\n\t\t\t\t\treturn String(args[i++]);\r\n\r\n\t\t\t\tcase '%d':\r\n\t\t\t\t\treturn Number(args[i++]);\r\n\r\n\t\t\t\tcase '%j':\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\treturn JSON.stringify(args[i++]);\r\n\t\t\t\t\t} catch (_) {\r\n\t\t\t\t\t\treturn '[Circular]';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn x;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tfor (var arg = args[i]; i < len; arg = args[++i]) {\r\n\t\t\tstr += \" \" + arg;\r\n\t\t}\r\n\r\n\t\treturn str;\r\n\t}\r\n\r\n\treturn f;\r\n}\r\n\r\nfunction isNativeStringType(type) {\r\n\treturn type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern';\r\n}\r\n\r\nfunction isEmptyValue(value, type) {\r\n\tif (value === undefined || value === null) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\tif (type === 'array' && Array.isArray(value) && !value.length) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\tif (isNativeStringType(type) && typeof value === 'string' && !value) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\treturn false;\r\n}\r\n\r\nfunction asyncParallelArray(arr, func, callback) {\r\n\tvar results = [];\r\n\tvar total = 0;\r\n\tvar arrLength = arr.length;\r\n\r\n\tfunction count(errors) {\r\n\t\tresults.push.apply(results, errors);\r\n\t\ttotal++;\r\n\r\n\t\tif (total === arrLength) {\r\n\t\t\tcallback(results);\r\n\t\t}\r\n\t}\r\n\r\n\tarr.forEach(function(a) {\r\n\t\tfunc(a, count);\r\n\t});\r\n}\r\n\r\nfunction asyncSerialArray(arr, func, callback) {\r\n\tvar index = 0;\r\n\tvar arrLength = arr.length;\r\n\r\n\tfunction next(errors) {\r\n\t\tif (errors && errors.length) {\r\n\t\t\tcallback(errors);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar original = index;\r\n\t\tindex = index + 1;\r\n\r\n\t\tif (original < arrLength) {\r\n\t\t\tfunc(arr[original], next);\r\n\t\t} else {\r\n\t\t\tcallback([]);\r\n\t\t}\r\n\t}\r\n\r\n\tnext([]);\r\n}\r\n\r\nfunction flattenObjArr(objArr) {\r\n\tvar ret = [];\r\n\tObject.keys(objArr).forEach(function(k) {\r\n\t\tret.push.apply(ret, objArr[k]);\r\n\t});\r\n\treturn ret;\r\n}\r\n\r\nfunction asyncMap(objArr, option, func, callback) {\r\n\tif (option.first) {\r\n\t\tvar _pending = new Promise(function(resolve, reject) {\r\n\t\t\tvar next = function next(errors) {\r\n\t\t\t\tcallback(errors);\r\n\t\t\t\treturn errors.length ? reject({\r\n\t\t\t\t\terrors: errors,\r\n\t\t\t\t\tfields: convertFieldsError(errors)\r\n\t\t\t\t}) : resolve();\r\n\t\t\t};\r\n\r\n\t\t\tvar flattenArr = flattenObjArr(objArr);\r\n\t\t\tasyncSerialArray(flattenArr, func, next);\r\n\t\t});\r\n\r\n\t\t_pending[\"catch\"](function(e) {\r\n\t\t\treturn e;\r\n\t\t});\r\n\r\n\t\treturn _pending;\r\n\t}\r\n\r\n\tvar firstFields = option.firstFields || [];\r\n\r\n\tif (firstFields === true) {\r\n\t\tfirstFields = Object.keys(objArr);\r\n\t}\r\n\r\n\tvar objArrKeys = Object.keys(objArr);\r\n\tvar objArrLength = objArrKeys.length;\r\n\tvar total = 0;\r\n\tvar results = [];\r\n\tvar pending = new Promise(function(resolve, reject) {\r\n\t\tvar next = function next(errors) {\r\n\t\t\tresults.push.apply(results, errors);\r\n\t\t\ttotal++;\r\n\r\n\t\t\tif (total === objArrLength) {\r\n\t\t\t\tcallback(results);\r\n\t\t\t\treturn results.length ? reject({\r\n\t\t\t\t\terrors: results,\r\n\t\t\t\t\tfields: convertFieldsError(results)\r\n\t\t\t\t}) : resolve();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (!objArrKeys.length) {\r\n\t\t\tcallback(results);\r\n\t\t\tresolve();\r\n\t\t}\r\n\r\n\t\tobjArrKeys.forEach(function(key) {\r\n\t\t\tvar arr = objArr[key];\r\n\r\n\t\t\tif (firstFields.indexOf(key) !== -1) {\r\n\t\t\t\tasyncSerialArray(arr, func, next);\r\n\t\t\t} else {\r\n\t\t\t\tasyncParallelArray(arr, func, next);\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\tpending[\"catch\"](function(e) {\r\n\t\treturn e;\r\n\t});\r\n\treturn pending;\r\n}\r\n\r\nfunction complementError(rule) {\r\n\treturn function(oe) {\r\n\t\tif (oe && oe.message) {\r\n\t\t\toe.field = oe.field || rule.fullField;\r\n\t\t\treturn oe;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmessage: typeof oe === 'function' ? oe() : oe,\r\n\t\t\tfield: oe.field || rule.fullField\r\n\t\t};\r\n\t};\r\n}\r\n\r\nfunction deepMerge(target, source) {\r\n\tif (source) {\r\n\t\tfor (var s in source) {\r\n\t\t\tif (source.hasOwnProperty(s)) {\r\n\t\t\t\tvar value = source[s];\r\n\r\n\t\t\t\tif (typeof value === 'object' && typeof target[s] === 'object') {\r\n\t\t\t\t\ttarget[s] = _extends({}, target[s], {}, value);\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttarget[s] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn target;\r\n}\r\n\r\n/**\r\n *  Rule for validating required fields.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param source The source object being validated.\r\n *  @param errors An array of errors that this rule may add\r\n *  validation errors to.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction required(rule, value, source, errors, options, type) {\r\n\tif (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\r\n\t\terrors.push(format(options.messages.required, rule.fullField));\r\n\t}\r\n}\r\n\r\n/**\r\n *  Rule for validating whitespace.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param source The source object being validated.\r\n *  @param errors An array of errors that this rule may add\r\n *  validation errors to.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction whitespace(rule, value, source, errors, options) {\r\n\tif (/^\\s+$/.test(value) || value === '') {\r\n\t\terrors.push(format(options.messages.whitespace, rule.fullField));\r\n\t}\r\n}\r\n\r\n/* eslint max-len:0 */\r\n\r\nvar pattern = {\r\n\t// http://emailregex.com/\r\n\temail: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\r\n\turl: new RegExp(\r\n\t\t\"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$\",\r\n\t\t'i'),\r\n\thex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\r\n};\r\nvar types = {\r\n\tinteger: function integer(value) {\r\n\t\treturn types.number(value) && parseInt(value, 10) === value;\r\n\t},\r\n\t\"float\": function float(value) {\r\n\t\treturn types.number(value) && !types.integer(value);\r\n\t},\r\n\tarray: function array(value) {\r\n\t\treturn Array.isArray(value);\r\n\t},\r\n\tregexp: function regexp(value) {\r\n\t\tif (value instanceof RegExp) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\treturn !!new RegExp(value);\r\n\t\t} catch (e) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t},\r\n\tdate: function date(value) {\r\n\t\treturn typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear ===\r\n\t\t\t'function';\r\n\t},\r\n\tnumber: function number(value) {\r\n\t\tif (isNaN(value)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// 修改源码，将字符串数值先转为数值\r\n\t\treturn typeof +value === 'number';\r\n\t},\r\n\tobject: function object(value) {\r\n\t\treturn typeof value === 'object' && !types.array(value);\r\n\t},\r\n\tmethod: function method(value) {\r\n\t\treturn typeof value === 'function';\r\n\t},\r\n\temail: function email(value) {\r\n\t\treturn typeof value === 'string' && !!value.match(pattern.email) && value.length < 255;\r\n\t},\r\n\turl: function url(value) {\r\n\t\treturn typeof value === 'string' && !!value.match(pattern.url);\r\n\t},\r\n\thex: function hex(value) {\r\n\t\treturn typeof value === 'string' && !!value.match(pattern.hex);\r\n\t}\r\n};\r\n/**\r\n *  Rule for validating the type of a value.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param source The source object being validated.\r\n *  @param errors An array of errors that this rule may add\r\n *  validation errors to.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction type(rule, value, source, errors, options) {\r\n\tif (rule.required && value === undefined) {\r\n\t\trequired(rule, value, source, errors, options);\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];\r\n\tvar ruleType = rule.type;\r\n\r\n\tif (custom.indexOf(ruleType) > -1) {\r\n\t\tif (!types[ruleType](value)) {\r\n\t\t\terrors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\r\n\t\t} // straight typeof check\r\n\r\n\t} else if (ruleType && typeof value !== rule.type) {\r\n\t\terrors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));\r\n\t}\r\n}\r\n\r\n/**\r\n *  Rule for validating minimum and maximum allowed values.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param source The source object being validated.\r\n *  @param errors An array of errors that this rule may add\r\n *  validation errors to.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction range(rule, value, source, errors, options) {\r\n\tvar len = typeof rule.len === 'number';\r\n\tvar min = typeof rule.min === 'number';\r\n\tvar max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字（补充平面Supplementary Plane）\r\n\r\n\tvar spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\r\n\tvar val = value;\r\n\tvar key = null;\r\n\tvar num = typeof value === 'number';\r\n\tvar str = typeof value === 'string';\r\n\tvar arr = Array.isArray(value);\r\n\r\n\tif (num) {\r\n\t\tkey = 'number';\r\n\t} else if (str) {\r\n\t\tkey = 'string';\r\n\t} else if (arr) {\r\n\t\tkey = 'array';\r\n\t} // if the value is not of a supported type for range validation\r\n\t// the validation rule rule should use the\r\n\t// type property to also test for a particular type\r\n\r\n\r\n\tif (!key) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (arr) {\r\n\t\tval = value.length;\r\n\t}\r\n\r\n\tif (str) {\r\n\t\t// 处理码点大于U+010000的文字length属性不准确的bug，如\"𠮷𠮷𠮷\".lenght !== 3\r\n\t\tval = value.replace(spRegexp, '_').length;\r\n\t}\r\n\r\n\tif (len) {\r\n\t\tif (val !== rule.len) {\r\n\t\t\terrors.push(format(options.messages[key].len, rule.fullField, rule.len));\r\n\t\t}\r\n\t} else if (min && !max && val < rule.min) {\r\n\t\terrors.push(format(options.messages[key].min, rule.fullField, rule.min));\r\n\t} else if (max && !min && val > rule.max) {\r\n\t\terrors.push(format(options.messages[key].max, rule.fullField, rule.max));\r\n\t} else if (min && max && (val < rule.min || val > rule.max)) {\r\n\t\terrors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));\r\n\t}\r\n}\r\n\r\nvar ENUM = 'enum';\r\n/**\r\n *  Rule for validating a value exists in an enumerable list.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param source The source object being validated.\r\n *  @param errors An array of errors that this rule may add\r\n *  validation errors to.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction enumerable(rule, value, source, errors, options) {\r\n\trule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];\r\n\r\n\tif (rule[ENUM].indexOf(value) === -1) {\r\n\t\terrors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')));\r\n\t}\r\n}\r\n\r\n/**\r\n *  Rule for validating a regular expression pattern.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param source The source object being validated.\r\n *  @param errors An array of errors that this rule may add\r\n *  validation errors to.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction pattern$1(rule, value, source, errors, options) {\r\n\tif (rule.pattern) {\r\n\t\tif (rule.pattern instanceof RegExp) {\r\n\t\t\t// if a RegExp instance is passed, reset `lastIndex` in case its `global`\r\n\t\t\t// flag is accidentally set to `true`, which in a validation scenario\r\n\t\t\t// is not necessary and the result might be misleading\r\n\t\t\trule.pattern.lastIndex = 0;\r\n\r\n\t\t\tif (!rule.pattern.test(value)) {\r\n\t\t\t\terrors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\r\n\t\t\t}\r\n\t\t} else if (typeof rule.pattern === 'string') {\r\n\t\t\tvar _pattern = new RegExp(rule.pattern);\r\n\r\n\t\t\tif (!_pattern.test(value)) {\r\n\t\t\t\terrors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvar rules = {\r\n\trequired: required,\r\n\twhitespace: whitespace,\r\n\ttype: type,\r\n\trange: range,\r\n\t\"enum\": enumerable,\r\n\tpattern: pattern$1\r\n};\r\n\r\n/**\r\n *  Performs validation for string types.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction string(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value, 'string') && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options, 'string');\r\n\r\n\t\tif (!isEmptyValue(value, 'string')) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t\trules.range(rule, value, source, errors, options);\r\n\t\t\trules.pattern(rule, value, source, errors, options);\r\n\r\n\t\t\tif (rule.whitespace === true) {\r\n\t\t\t\trules.whitespace(rule, value, source, errors, options);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates a function.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction method(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates a number.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction number(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (value === '') {\r\n\t\t\tvalue = undefined;\r\n\t\t}\r\n\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t\trules.range(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates a boolean.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction _boolean(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates the regular expression type.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction regexp(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (!isEmptyValue(value)) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates a number is an integer.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction integer(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t\trules.range(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates a number is a floating point number.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction floatFn(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t\trules.range(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates an array.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction array(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value, 'array') && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options, 'array');\r\n\r\n\t\tif (!isEmptyValue(value, 'array')) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t\trules.range(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates an object.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction object(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\nvar ENUM$1 = 'enum';\r\n/**\r\n *  Validates an enumerable list.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction enumerable$1(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (value !== undefined) {\r\n\t\t\trules[ENUM$1](rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Validates a regular expression pattern.\r\n *\r\n *  Performs validation when a rule only contains\r\n *  a pattern property but is not declared as a string type.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction pattern$2(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value, 'string') && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (!isEmptyValue(value, 'string')) {\r\n\t\t\trules.pattern(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\nfunction date(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); \r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\r\n\t\tif (!isEmptyValue(value)) {\r\n\t\t\tvar dateObject;\r\n\r\n\t\t\tif (typeof value === 'number') {\r\n\t\t\t\tdateObject = new Date(value);\r\n\t\t\t} else {\r\n\t\t\t\tdateObject = value;\r\n\t\t\t}\r\n\r\n\t\t\trules.type(rule, dateObject, source, errors, options);\r\n\r\n\t\t\tif (dateObject) {\r\n\t\t\t\trules.range(rule, dateObject.getTime(), source, errors, options);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\nfunction required$1(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar type = Array.isArray(value) ? 'array' : typeof value;\r\n\trules.required(rule, value, source, errors, options, type);\r\n\tcallback(errors);\r\n}\r\n\r\nfunction type$1(rule, value, callback, source, options) {\r\n\tvar ruleType = rule.type;\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value, ruleType) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options, ruleType);\r\n\r\n\t\tif (!isEmptyValue(value, ruleType)) {\r\n\t\t\trules.type(rule, value, source, errors, options);\r\n\t\t}\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\n/**\r\n *  Performs validation for any type.\r\n *\r\n *  @param rule The validation rule.\r\n *  @param value The value of the field on the source object.\r\n *  @param callback The callback function.\r\n *  @param source The source object being validated.\r\n *  @param options The validation options.\r\n *  @param options.messages The validation messages.\r\n */\r\n\r\nfunction any(rule, value, callback, source, options) {\r\n\tvar errors = [];\r\n\tvar validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);\r\n\r\n\tif (validate) {\r\n\t\tif (isEmptyValue(value) && !rule.required) {\r\n\t\t\treturn callback();\r\n\t\t}\r\n\r\n\t\trules.required(rule, value, source, errors, options);\r\n\t}\r\n\r\n\tcallback(errors);\r\n}\r\n\r\nvar validators = {\r\n\tstring: string,\r\n\tmethod: method,\r\n\tnumber: number,\r\n\t\"boolean\": _boolean,\r\n\tregexp: regexp,\r\n\tinteger: integer,\r\n\t\"float\": floatFn,\r\n\tarray: array,\r\n\tobject: object,\r\n\t\"enum\": enumerable$1,\r\n\tpattern: pattern$2,\r\n\tdate: date,\r\n\turl: type$1,\r\n\thex: type$1,\r\n\temail: type$1,\r\n\trequired: required$1,\r\n\tany: any\r\n};\r\n\r\nfunction newMessages() {\r\n\treturn {\r\n\t\t\"default\": 'Validation error on field %s',\r\n\t\trequired: '%s is required',\r\n\t\t\"enum\": '%s must be one of %s',\r\n\t\twhitespace: '%s cannot be empty',\r\n\t\tdate: {\r\n\t\t\tformat: '%s date %s is invalid for format %s',\r\n\t\t\tparse: '%s date could not be parsed, %s is invalid ',\r\n\t\t\tinvalid: '%s date %s is invalid'\r\n\t\t},\r\n\t\ttypes: {\r\n\t\t\tstring: '%s is not a %s',\r\n\t\t\tmethod: '%s is not a %s (function)',\r\n\t\t\tarray: '%s is not an %s',\r\n\t\t\tobject: '%s is not an %s',\r\n\t\t\tnumber: '%s is not a %s',\r\n\t\t\tdate: '%s is not a %s',\r\n\t\t\t\"boolean\": '%s is not a %s',\r\n\t\t\tinteger: '%s is not an %s',\r\n\t\t\t\"float\": '%s is not a %s',\r\n\t\t\tregexp: '%s is not a valid %s',\r\n\t\t\temail: '%s is not a valid %s',\r\n\t\t\turl: '%s is not a valid %s',\r\n\t\t\thex: '%s is not a valid %s'\r\n\t\t},\r\n\t\tstring: {\r\n\t\t\tlen: '%s must be exactly %s characters',\r\n\t\t\tmin: '%s must be at least %s characters',\r\n\t\t\tmax: '%s cannot be longer than %s characters',\r\n\t\t\trange: '%s must be between %s and %s characters'\r\n\t\t},\r\n\t\tnumber: {\r\n\t\t\tlen: '%s must equal %s',\r\n\t\t\tmin: '%s cannot be less than %s',\r\n\t\t\tmax: '%s cannot be greater than %s',\r\n\t\t\trange: '%s must be between %s and %s'\r\n\t\t},\r\n\t\tarray: {\r\n\t\t\tlen: '%s must be exactly %s in length',\r\n\t\t\tmin: '%s cannot be less than %s in length',\r\n\t\t\tmax: '%s cannot be greater than %s in length',\r\n\t\t\trange: '%s must be between %s and %s in length'\r\n\t\t},\r\n\t\tpattern: {\r\n\t\t\tmismatch: '%s value %s does not match pattern %s'\r\n\t\t},\r\n\t\tclone: function clone() {\r\n\t\t\tvar cloned = JSON.parse(JSON.stringify(this));\r\n\t\t\tcloned.clone = this.clone;\r\n\t\t\treturn cloned;\r\n\t\t}\r\n\t};\r\n}\r\nvar messages = newMessages();\r\n\r\n/**\r\n *  Encapsulates a validation schema.\r\n *\r\n *  @param descriptor An object declaring validation rules\r\n *  for this schema.\r\n */\r\n\r\nfunction Schema(descriptor) {\r\n\tthis.rules = null;\r\n\tthis._messages = messages;\r\n\tthis.define(descriptor);\r\n}\r\n\r\nSchema.prototype = {\r\n\tmessages: function messages(_messages) {\r\n\t\tif (_messages) {\r\n\t\t\tthis._messages = deepMerge(newMessages(), _messages);\r\n\t\t}\r\n\r\n\t\treturn this._messages;\r\n\t},\r\n\tdefine: function define(rules) {\r\n\t\tif (!rules) {\r\n\t\t\tthrow new Error('Cannot configure a schema with no rules');\r\n\t\t}\r\n\r\n\t\tif (typeof rules !== 'object' || Array.isArray(rules)) {\r\n\t\t\tthrow new Error('Rules must be an object');\r\n\t\t}\r\n\r\n\t\tthis.rules = {};\r\n\t\tvar z;\r\n\t\tvar item;\r\n\r\n\t\tfor (z in rules) {\r\n\t\t\tif (rules.hasOwnProperty(z)) {\r\n\t\t\t\titem = rules[z];\r\n\t\t\t\tthis.rules[z] = Array.isArray(item) ? item : [item];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tvalidate: function validate(source_, o, oc) {\r\n\t\tvar _this = this;\r\n\r\n\t\tif (o === void 0) {\r\n\t\t\to = {};\r\n\t\t}\r\n\r\n\t\tif (oc === void 0) {\r\n\t\t\toc = function oc() {};\r\n\t\t}\r\n\r\n\t\tvar source = source_;\r\n\t\tvar options = o;\r\n\t\tvar callback = oc;\r\n\r\n\t\tif (typeof options === 'function') {\r\n\t\t\tcallback = options;\r\n\t\t\toptions = {};\r\n\t\t}\r\n\r\n\t\tif (!this.rules || Object.keys(this.rules).length === 0) {\r\n\t\t\tif (callback) {\r\n\t\t\t\tcallback();\r\n\t\t\t}\r\n\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\tfunction complete(results) {\r\n\t\t\tvar i;\r\n\t\t\tvar errors = [];\r\n\t\t\tvar fields = {};\r\n\r\n\t\t\tfunction add(e) {\r\n\t\t\t\tif (Array.isArray(e)) {\r\n\t\t\t\t\tvar _errors;\r\n\r\n\t\t\t\t\terrors = (_errors = errors).concat.apply(_errors, e);\r\n\t\t\t\t} else {\r\n\t\t\t\t\terrors.push(e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor (i = 0; i < results.length; i++) {\r\n\t\t\t\tadd(results[i]);\r\n\t\t\t}\r\n\r\n\t\t\tif (!errors.length) {\r\n\t\t\t\terrors = null;\r\n\t\t\t\tfields = null;\r\n\t\t\t} else {\r\n\t\t\t\tfields = convertFieldsError(errors);\r\n\t\t\t}\r\n\r\n\t\t\tcallback(errors, fields);\r\n\t\t}\r\n\r\n\t\tif (options.messages) {\r\n\t\t\tvar messages$1 = this.messages();\r\n\r\n\t\t\tif (messages$1 === messages) {\r\n\t\t\t\tmessages$1 = newMessages();\r\n\t\t\t}\r\n\r\n\t\t\tdeepMerge(messages$1, options.messages);\r\n\t\t\toptions.messages = messages$1;\r\n\t\t} else {\r\n\t\t\toptions.messages = this.messages();\r\n\t\t}\r\n\r\n\t\tvar arr;\r\n\t\tvar value;\r\n\t\tvar series = {};\r\n\t\tvar keys = options.keys || Object.keys(this.rules);\r\n\t\tkeys.forEach(function(z) {\r\n\t\t\tarr = _this.rules[z];\r\n\t\t\tvalue = source[z];\r\n\t\t\tarr.forEach(function(r) {\r\n\t\t\t\tvar rule = r;\r\n\r\n\t\t\t\tif (typeof rule.transform === 'function') {\r\n\t\t\t\t\tif (source === source_) {\r\n\t\t\t\t\t\tsource = _extends({}, source);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvalue = source[z] = rule.transform(value);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof rule === 'function') {\r\n\t\t\t\t\trule = {\r\n\t\t\t\t\t\tvalidator: rule\r\n\t\t\t\t\t};\r\n\t\t\t\t} else {\r\n\t\t\t\t\trule = _extends({}, rule);\r\n\t\t\t\t}\r\n\r\n\t\t\t\trule.validator = _this.getValidationMethod(rule);\r\n\t\t\t\trule.field = z;\r\n\t\t\t\trule.fullField = rule.fullField || z;\r\n\t\t\t\trule.type = _this.getType(rule);\r\n\r\n\t\t\t\tif (!rule.validator) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tseries[z] = series[z] || [];\r\n\t\t\t\tseries[z].push({\r\n\t\t\t\t\trule: rule,\r\n\t\t\t\t\tvalue: value,\r\n\t\t\t\t\tsource: source,\r\n\t\t\t\t\tfield: z\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t\tvar errorFields = {};\r\n\t\treturn asyncMap(series, options, function(data, doIt) {\r\n\t\t\tvar rule = data.rule;\r\n\t\t\tvar deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField ===\r\n\t\t\t\t'object');\r\n\t\t\tdeep = deep && (rule.required || !rule.required && data.value);\r\n\t\t\trule.field = data.field;\r\n\r\n\t\t\tfunction addFullfield(key, schema) {\r\n\t\t\t\treturn _extends({}, schema, {\r\n\t\t\t\t\tfullField: rule.fullField + \".\" + key\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfunction cb(e) {\r\n\t\t\t\tif (e === void 0) {\r\n\t\t\t\t\te = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar errors = e;\r\n\r\n\t\t\t\tif (!Array.isArray(errors)) {\r\n\t\t\t\t\terrors = [errors];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!options.suppressWarning && errors.length) {\r\n\t\t\t\t\tSchema.warning('async-validator:', errors);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (errors.length && rule.message) {\r\n\t\t\t\t\terrors = [].concat(rule.message);\r\n\t\t\t\t}\r\n\r\n\t\t\t\terrors = errors.map(complementError(rule));\r\n\r\n\t\t\t\tif (options.first && errors.length) {\r\n\t\t\t\t\terrorFields[rule.field] = 1;\r\n\t\t\t\t\treturn doIt(errors);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!deep) {\r\n\t\t\t\t\tdoIt(errors);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// if rule is required but the target object\r\n\t\t\t\t\t// does not exist fail at the rule level and don't\r\n\t\t\t\t\t// go deeper\r\n\t\t\t\t\tif (rule.required && !data.value) {\r\n\t\t\t\t\t\tif (rule.message) {\r\n\t\t\t\t\t\t\terrors = [].concat(rule.message).map(complementError(rule));\r\n\t\t\t\t\t\t} else if (options.error) {\r\n\t\t\t\t\t\t\terrors = [options.error(rule, format(options.messages.required, rule.field))];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\terrors = [];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn doIt(errors);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar fieldsSchema = {};\r\n\r\n\t\t\t\t\tif (rule.defaultField) {\r\n\t\t\t\t\t\tfor (var k in data.value) {\r\n\t\t\t\t\t\t\tif (data.value.hasOwnProperty(k)) {\r\n\t\t\t\t\t\t\t\tfieldsSchema[k] = rule.defaultField;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfieldsSchema = _extends({}, fieldsSchema, {}, data.rule.fields);\r\n\r\n\t\t\t\t\tfor (var f in fieldsSchema) {\r\n\t\t\t\t\t\tif (fieldsSchema.hasOwnProperty(f)) {\r\n\t\t\t\t\t\t\tvar fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];\r\n\t\t\t\t\t\t\tfieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar schema = new Schema(fieldsSchema);\r\n\t\t\t\t\tschema.messages(options.messages);\r\n\r\n\t\t\t\t\tif (data.rule.options) {\r\n\t\t\t\t\t\tdata.rule.options.messages = options.messages;\r\n\t\t\t\t\t\tdata.rule.options.error = options.error;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tschema.validate(data.value, data.rule.options || options, function(errs) {\r\n\t\t\t\t\t\tvar finalErrors = [];\r\n\r\n\t\t\t\t\t\tif (errors && errors.length) {\r\n\t\t\t\t\t\t\tfinalErrors.push.apply(finalErrors, errors);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (errs && errs.length) {\r\n\t\t\t\t\t\t\tfinalErrors.push.apply(finalErrors, errs);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdoIt(finalErrors.length ? finalErrors : null);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar res;\r\n\r\n\t\t\tif (rule.asyncValidator) {\r\n\t\t\t\tres = rule.asyncValidator(rule, data.value, cb, data.source, options);\r\n\t\t\t} else if (rule.validator) {\r\n\t\t\t\tres = rule.validator(rule, data.value, cb, data.source, options);\r\n\r\n\t\t\t\tif (res === true) {\r\n\t\t\t\t\tcb();\r\n\t\t\t\t} else if (res === false) {\r\n\t\t\t\t\tcb(rule.message || rule.field + \" fails\");\r\n\t\t\t\t} else if (res instanceof Array) {\r\n\t\t\t\t\tcb(res);\r\n\t\t\t\t} else if (res instanceof Error) {\r\n\t\t\t\t\tcb(res.message);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (res && res.then) {\r\n\t\t\t\tres.then(function() {\r\n\t\t\t\t\treturn cb();\r\n\t\t\t\t}, function(e) {\r\n\t\t\t\t\treturn cb(e);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, function(results) {\r\n\t\t\tcomplete(results);\r\n\t\t});\r\n\t},\r\n\tgetType: function getType(rule) {\r\n\t\tif (rule.type === undefined && rule.pattern instanceof RegExp) {\r\n\t\t\trule.type = 'pattern';\r\n\t\t}\r\n\r\n\t\tif (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\r\n\t\t\tthrow new Error(format('Unknown rule type %s', rule.type));\r\n\t\t}\r\n\r\n\t\treturn rule.type || 'string';\r\n\t},\r\n\tgetValidationMethod: function getValidationMethod(rule) {\r\n\t\tif (typeof rule.validator === 'function') {\r\n\t\t\treturn rule.validator;\r\n\t\t}\r\n\r\n\t\tvar keys = Object.keys(rule);\r\n\t\tvar messageIndex = keys.indexOf('message');\r\n\r\n\t\tif (messageIndex !== -1) {\r\n\t\t\tkeys.splice(messageIndex, 1);\r\n\t\t}\r\n\r\n\t\tif (keys.length === 1 && keys[0] === 'required') {\r\n\t\t\treturn validators.required;\r\n\t\t}\r\n\r\n\t\treturn validators[this.getType(rule)] || false;\r\n\t}\r\n};\r\n\r\nSchema.register = function register(type, validator) {\r\n\tif (typeof validator !== 'function') {\r\n\t\tthrow new Error('Cannot register a validator by type, validator is not a function');\r\n\t}\r\n\r\n\tvalidators[type] = validator;\r\n};\r\n\r\nSchema.warning = warning;\r\nSchema.messages = messages;\r\n\r\nexport default Schema;\r\n//# sourceMappingURL=index.js.map\r\n"
  },
  {
    "path": "uview-ui/libs/util/city.js",
    "content": "/* eslint-disable */\r\nvar cityData = [\r\n  [{\r\n    \"label\": \"市辖区\",\r\n    \"value\": \"1101\"\r\n  }],\r\n  [{\r\n    \"label\": \"市辖区\",\r\n    \"value\": \"1201\"\r\n  }],\r\n  [{\r\n      \"label\": \"石家庄市\",\r\n      \"value\": \"1301\"\r\n    },\r\n    {\r\n      \"label\": \"唐山市\",\r\n      \"value\": \"1302\"\r\n    },\r\n    {\r\n      \"label\": \"秦皇岛市\",\r\n      \"value\": \"1303\"\r\n    },\r\n    {\r\n      \"label\": \"邯郸市\",\r\n      \"value\": \"1304\"\r\n    },\r\n    {\r\n      \"label\": \"邢台市\",\r\n      \"value\": \"1305\"\r\n    },\r\n    {\r\n      \"label\": \"保定市\",\r\n      \"value\": \"1306\"\r\n    },\r\n    {\r\n      \"label\": \"张家口市\",\r\n      \"value\": \"1307\"\r\n    },\r\n    {\r\n      \"label\": \"承德市\",\r\n      \"value\": \"1308\"\r\n    },\r\n    {\r\n      \"label\": \"沧州市\",\r\n      \"value\": \"1309\"\r\n    },\r\n    {\r\n      \"label\": \"廊坊市\",\r\n      \"value\": \"1310\"\r\n    },\r\n    {\r\n      \"label\": \"衡水市\",\r\n      \"value\": \"1311\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"太原市\",\r\n      \"value\": \"1401\"\r\n    },\r\n    {\r\n      \"label\": \"大同市\",\r\n      \"value\": \"1402\"\r\n    },\r\n    {\r\n      \"label\": \"阳泉市\",\r\n      \"value\": \"1403\"\r\n    },\r\n    {\r\n      \"label\": \"长治市\",\r\n      \"value\": \"1404\"\r\n    },\r\n    {\r\n      \"label\": \"晋城市\",\r\n      \"value\": \"1405\"\r\n    },\r\n    {\r\n      \"label\": \"朔州市\",\r\n      \"value\": \"1406\"\r\n    },\r\n    {\r\n      \"label\": \"晋中市\",\r\n      \"value\": \"1407\"\r\n    },\r\n    {\r\n      \"label\": \"运城市\",\r\n      \"value\": \"1408\"\r\n    },\r\n    {\r\n      \"label\": \"忻州市\",\r\n      \"value\": \"1409\"\r\n    },\r\n    {\r\n      \"label\": \"临汾市\",\r\n      \"value\": \"1410\"\r\n    },\r\n    {\r\n      \"label\": \"吕梁市\",\r\n      \"value\": \"1411\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"呼和浩特市\",\r\n      \"value\": \"1501\"\r\n    },\r\n    {\r\n      \"label\": \"包头市\",\r\n      \"value\": \"1502\"\r\n    },\r\n    {\r\n      \"label\": \"乌海市\",\r\n      \"value\": \"1503\"\r\n    },\r\n    {\r\n      \"label\": \"赤峰市\",\r\n      \"value\": \"1504\"\r\n    },\r\n    {\r\n      \"label\": \"通辽市\",\r\n      \"value\": \"1505\"\r\n    },\r\n    {\r\n      \"label\": \"鄂尔多斯市\",\r\n      \"value\": \"1506\"\r\n    },\r\n    {\r\n      \"label\": \"呼伦贝尔市\",\r\n      \"value\": \"1507\"\r\n    },\r\n    {\r\n      \"label\": \"巴彦淖尔市\",\r\n      \"value\": \"1508\"\r\n    },\r\n    {\r\n      \"label\": \"乌兰察布市\",\r\n      \"value\": \"1509\"\r\n    },\r\n    {\r\n      \"label\": \"兴安盟\",\r\n      \"value\": \"1522\"\r\n    },\r\n    {\r\n      \"label\": \"锡林郭勒盟\",\r\n      \"value\": \"1525\"\r\n    },\r\n    {\r\n      \"label\": \"阿拉善盟\",\r\n      \"value\": \"1529\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"沈阳市\",\r\n      \"value\": \"2101\"\r\n    },\r\n    {\r\n      \"label\": \"大连市\",\r\n      \"value\": \"2102\"\r\n    },\r\n    {\r\n      \"label\": \"鞍山市\",\r\n      \"value\": \"2103\"\r\n    },\r\n    {\r\n      \"label\": \"抚顺市\",\r\n      \"value\": \"2104\"\r\n    },\r\n    {\r\n      \"label\": \"本溪市\",\r\n      \"value\": \"2105\"\r\n    },\r\n    {\r\n      \"label\": \"丹东市\",\r\n      \"value\": \"2106\"\r\n    },\r\n    {\r\n      \"label\": \"锦州市\",\r\n      \"value\": \"2107\"\r\n    },\r\n    {\r\n      \"label\": \"营口市\",\r\n      \"value\": \"2108\"\r\n    },\r\n    {\r\n      \"label\": \"阜新市\",\r\n      \"value\": \"2109\"\r\n    },\r\n    {\r\n      \"label\": \"辽阳市\",\r\n      \"value\": \"2110\"\r\n    },\r\n    {\r\n      \"label\": \"盘锦市\",\r\n      \"value\": \"2111\"\r\n    },\r\n    {\r\n      \"label\": \"铁岭市\",\r\n      \"value\": \"2112\"\r\n    },\r\n    {\r\n      \"label\": \"朝阳市\",\r\n      \"value\": \"2113\"\r\n    },\r\n    {\r\n      \"label\": \"葫芦岛市\",\r\n      \"value\": \"2114\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"长春市\",\r\n      \"value\": \"2201\"\r\n    },\r\n    {\r\n      \"label\": \"吉林市\",\r\n      \"value\": \"2202\"\r\n    },\r\n    {\r\n      \"label\": \"四平市\",\r\n      \"value\": \"2203\"\r\n    },\r\n    {\r\n      \"label\": \"辽源市\",\r\n      \"value\": \"2204\"\r\n    },\r\n    {\r\n      \"label\": \"通化市\",\r\n      \"value\": \"2205\"\r\n    },\r\n    {\r\n      \"label\": \"白山市\",\r\n      \"value\": \"2206\"\r\n    },\r\n    {\r\n      \"label\": \"松原市\",\r\n      \"value\": \"2207\"\r\n    },\r\n    {\r\n      \"label\": \"白城市\",\r\n      \"value\": \"2208\"\r\n    },\r\n    {\r\n      \"label\": \"延边朝鲜族自治州\",\r\n      \"value\": \"2224\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"哈尔滨市\",\r\n      \"value\": \"2301\"\r\n    },\r\n    {\r\n      \"label\": \"齐齐哈尔市\",\r\n      \"value\": \"2302\"\r\n    },\r\n    {\r\n      \"label\": \"鸡西市\",\r\n      \"value\": \"2303\"\r\n    },\r\n    {\r\n      \"label\": \"鹤岗市\",\r\n      \"value\": \"2304\"\r\n    },\r\n    {\r\n      \"label\": \"双鸭山市\",\r\n      \"value\": \"2305\"\r\n    },\r\n    {\r\n      \"label\": \"大庆市\",\r\n      \"value\": \"2306\"\r\n    },\r\n    {\r\n      \"label\": \"伊春市\",\r\n      \"value\": \"2307\"\r\n    },\r\n    {\r\n      \"label\": \"佳木斯市\",\r\n      \"value\": \"2308\"\r\n    },\r\n    {\r\n      \"label\": \"七台河市\",\r\n      \"value\": \"2309\"\r\n    },\r\n    {\r\n      \"label\": \"牡丹江市\",\r\n      \"value\": \"2310\"\r\n    },\r\n    {\r\n      \"label\": \"黑河市\",\r\n      \"value\": \"2311\"\r\n    },\r\n    {\r\n      \"label\": \"绥化市\",\r\n      \"value\": \"2312\"\r\n    },\r\n    {\r\n      \"label\": \"大兴安岭地区\",\r\n      \"value\": \"2327\"\r\n    }\r\n  ],\r\n  [{\r\n    \"label\": \"市辖区\",\r\n    \"value\": \"3101\"\r\n  }],\r\n  [{\r\n      \"label\": \"南京市\",\r\n      \"value\": \"3201\"\r\n    },\r\n    {\r\n      \"label\": \"无锡市\",\r\n      \"value\": \"3202\"\r\n    },\r\n    {\r\n      \"label\": \"徐州市\",\r\n      \"value\": \"3203\"\r\n    },\r\n    {\r\n      \"label\": \"常州市\",\r\n      \"value\": \"3204\"\r\n    },\r\n    {\r\n      \"label\": \"苏州市\",\r\n      \"value\": \"3205\"\r\n    },\r\n    {\r\n      \"label\": \"南通市\",\r\n      \"value\": \"3206\"\r\n    },\r\n    {\r\n      \"label\": \"连云港市\",\r\n      \"value\": \"3207\"\r\n    },\r\n    {\r\n      \"label\": \"淮安市\",\r\n      \"value\": \"3208\"\r\n    },\r\n    {\r\n      \"label\": \"盐城市\",\r\n      \"value\": \"3209\"\r\n    },\r\n    {\r\n      \"label\": \"扬州市\",\r\n      \"value\": \"3210\"\r\n    },\r\n    {\r\n      \"label\": \"镇江市\",\r\n      \"value\": \"3211\"\r\n    },\r\n    {\r\n      \"label\": \"泰州市\",\r\n      \"value\": \"3212\"\r\n    },\r\n    {\r\n      \"label\": \"宿迁市\",\r\n      \"value\": \"3213\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"杭州市\",\r\n      \"value\": \"3301\"\r\n    },\r\n    {\r\n      \"label\": \"宁波市\",\r\n      \"value\": \"3302\"\r\n    },\r\n    {\r\n      \"label\": \"温州市\",\r\n      \"value\": \"3303\"\r\n    },\r\n    {\r\n      \"label\": \"嘉兴市\",\r\n      \"value\": \"3304\"\r\n    },\r\n    {\r\n      \"label\": \"湖州市\",\r\n      \"value\": \"3305\"\r\n    },\r\n    {\r\n      \"label\": \"绍兴市\",\r\n      \"value\": \"3306\"\r\n    },\r\n    {\r\n      \"label\": \"金华市\",\r\n      \"value\": \"3307\"\r\n    },\r\n    {\r\n      \"label\": \"衢州市\",\r\n      \"value\": \"3308\"\r\n    },\r\n    {\r\n      \"label\": \"舟山市\",\r\n      \"value\": \"3309\"\r\n    },\r\n    {\r\n      \"label\": \"台州市\",\r\n      \"value\": \"3310\"\r\n    },\r\n    {\r\n      \"label\": \"丽水市\",\r\n      \"value\": \"3311\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"合肥市\",\r\n      \"value\": \"3401\"\r\n    },\r\n    {\r\n      \"label\": \"芜湖市\",\r\n      \"value\": \"3402\"\r\n    },\r\n    {\r\n      \"label\": \"蚌埠市\",\r\n      \"value\": \"3403\"\r\n    },\r\n    {\r\n      \"label\": \"淮南市\",\r\n      \"value\": \"3404\"\r\n    },\r\n    {\r\n      \"label\": \"马鞍山市\",\r\n      \"value\": \"3405\"\r\n    },\r\n    {\r\n      \"label\": \"淮北市\",\r\n      \"value\": \"3406\"\r\n    },\r\n    {\r\n      \"label\": \"铜陵市\",\r\n      \"value\": \"3407\"\r\n    },\r\n    {\r\n      \"label\": \"安庆市\",\r\n      \"value\": \"3408\"\r\n    },\r\n    {\r\n      \"label\": \"黄山市\",\r\n      \"value\": \"3410\"\r\n    },\r\n    {\r\n      \"label\": \"滁州市\",\r\n      \"value\": \"3411\"\r\n    },\r\n    {\r\n      \"label\": \"阜阳市\",\r\n      \"value\": \"3412\"\r\n    },\r\n    {\r\n      \"label\": \"宿州市\",\r\n      \"value\": \"3413\"\r\n    },\r\n    {\r\n      \"label\": \"六安市\",\r\n      \"value\": \"3415\"\r\n    },\r\n    {\r\n      \"label\": \"亳州市\",\r\n      \"value\": \"3416\"\r\n    },\r\n    {\r\n      \"label\": \"池州市\",\r\n      \"value\": \"3417\"\r\n    },\r\n    {\r\n      \"label\": \"宣城市\",\r\n      \"value\": \"3418\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"福州市\",\r\n      \"value\": \"3501\"\r\n    },\r\n    {\r\n      \"label\": \"厦门市\",\r\n      \"value\": \"3502\"\r\n    },\r\n    {\r\n      \"label\": \"莆田市\",\r\n      \"value\": \"3503\"\r\n    },\r\n    {\r\n      \"label\": \"三明市\",\r\n      \"value\": \"3504\"\r\n    },\r\n    {\r\n      \"label\": \"泉州市\",\r\n      \"value\": \"3505\"\r\n    },\r\n    {\r\n      \"label\": \"漳州市\",\r\n      \"value\": \"3506\"\r\n    },\r\n    {\r\n      \"label\": \"南平市\",\r\n      \"value\": \"3507\"\r\n    },\r\n    {\r\n      \"label\": \"龙岩市\",\r\n      \"value\": \"3508\"\r\n    },\r\n    {\r\n      \"label\": \"宁德市\",\r\n      \"value\": \"3509\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"南昌市\",\r\n      \"value\": \"3601\"\r\n    },\r\n    {\r\n      \"label\": \"景德镇市\",\r\n      \"value\": \"3602\"\r\n    },\r\n    {\r\n      \"label\": \"萍乡市\",\r\n      \"value\": \"3603\"\r\n    },\r\n    {\r\n      \"label\": \"九江市\",\r\n      \"value\": \"3604\"\r\n    },\r\n    {\r\n      \"label\": \"新余市\",\r\n      \"value\": \"3605\"\r\n    },\r\n    {\r\n      \"label\": \"鹰潭市\",\r\n      \"value\": \"3606\"\r\n    },\r\n    {\r\n      \"label\": \"赣州市\",\r\n      \"value\": \"3607\"\r\n    },\r\n    {\r\n      \"label\": \"吉安市\",\r\n      \"value\": \"3608\"\r\n    },\r\n    {\r\n      \"label\": \"宜春市\",\r\n      \"value\": \"3609\"\r\n    },\r\n    {\r\n      \"label\": \"抚州市\",\r\n      \"value\": \"3610\"\r\n    },\r\n    {\r\n      \"label\": \"上饶市\",\r\n      \"value\": \"3611\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"济南市\",\r\n      \"value\": \"3701\"\r\n    },\r\n    {\r\n      \"label\": \"青岛市\",\r\n      \"value\": \"3702\"\r\n    },\r\n    {\r\n      \"label\": \"淄博市\",\r\n      \"value\": \"3703\"\r\n    },\r\n    {\r\n      \"label\": \"枣庄市\",\r\n      \"value\": \"3704\"\r\n    },\r\n    {\r\n      \"label\": \"东营市\",\r\n      \"value\": \"3705\"\r\n    },\r\n    {\r\n      \"label\": \"烟台市\",\r\n      \"value\": \"3706\"\r\n    },\r\n    {\r\n      \"label\": \"潍坊市\",\r\n      \"value\": \"3707\"\r\n    },\r\n    {\r\n      \"label\": \"济宁市\",\r\n      \"value\": \"3708\"\r\n    },\r\n    {\r\n      \"label\": \"泰安市\",\r\n      \"value\": \"3709\"\r\n    },\r\n    {\r\n      \"label\": \"威海市\",\r\n      \"value\": \"3710\"\r\n    },\r\n    {\r\n      \"label\": \"日照市\",\r\n      \"value\": \"3711\"\r\n    },\r\n    {\r\n      \"label\": \"莱芜市\",\r\n      \"value\": \"3712\"\r\n    },\r\n    {\r\n      \"label\": \"临沂市\",\r\n      \"value\": \"3713\"\r\n    },\r\n    {\r\n      \"label\": \"德州市\",\r\n      \"value\": \"3714\"\r\n    },\r\n    {\r\n      \"label\": \"聊城市\",\r\n      \"value\": \"3715\"\r\n    },\r\n    {\r\n      \"label\": \"滨州市\",\r\n      \"value\": \"3716\"\r\n    },\r\n    {\r\n      \"label\": \"菏泽市\",\r\n      \"value\": \"3717\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"郑州市\",\r\n      \"value\": \"4101\"\r\n    },\r\n    {\r\n      \"label\": \"开封市\",\r\n      \"value\": \"4102\"\r\n    },\r\n    {\r\n      \"label\": \"洛阳市\",\r\n      \"value\": \"4103\"\r\n    },\r\n    {\r\n      \"label\": \"平顶山市\",\r\n      \"value\": \"4104\"\r\n    },\r\n    {\r\n      \"label\": \"安阳市\",\r\n      \"value\": \"4105\"\r\n    },\r\n    {\r\n      \"label\": \"鹤壁市\",\r\n      \"value\": \"4106\"\r\n    },\r\n    {\r\n      \"label\": \"新乡市\",\r\n      \"value\": \"4107\"\r\n    },\r\n    {\r\n      \"label\": \"焦作市\",\r\n      \"value\": \"4108\"\r\n    },\r\n    {\r\n      \"label\": \"濮阳市\",\r\n      \"value\": \"4109\"\r\n    },\r\n    {\r\n      \"label\": \"许昌市\",\r\n      \"value\": \"4110\"\r\n    },\r\n    {\r\n      \"label\": \"漯河市\",\r\n      \"value\": \"4111\"\r\n    },\r\n    {\r\n      \"label\": \"三门峡市\",\r\n      \"value\": \"4112\"\r\n    },\r\n    {\r\n      \"label\": \"南阳市\",\r\n      \"value\": \"4113\"\r\n    },\r\n    {\r\n      \"label\": \"商丘市\",\r\n      \"value\": \"4114\"\r\n    },\r\n    {\r\n      \"label\": \"信阳市\",\r\n      \"value\": \"4115\"\r\n    },\r\n    {\r\n      \"label\": \"周口市\",\r\n      \"value\": \"4116\"\r\n    },\r\n    {\r\n      \"label\": \"驻马店市\",\r\n      \"value\": \"4117\"\r\n    },\r\n    {\r\n      \"label\": \"省直辖县级行政区划\",\r\n      \"value\": \"4190\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"武汉市\",\r\n      \"value\": \"4201\"\r\n    },\r\n    {\r\n      \"label\": \"黄石市\",\r\n      \"value\": \"4202\"\r\n    },\r\n    {\r\n      \"label\": \"十堰市\",\r\n      \"value\": \"4203\"\r\n    },\r\n    {\r\n      \"label\": \"宜昌市\",\r\n      \"value\": \"4205\"\r\n    },\r\n    {\r\n      \"label\": \"襄阳市\",\r\n      \"value\": \"4206\"\r\n    },\r\n    {\r\n      \"label\": \"鄂州市\",\r\n      \"value\": \"4207\"\r\n    },\r\n    {\r\n      \"label\": \"荆门市\",\r\n      \"value\": \"4208\"\r\n    },\r\n    {\r\n      \"label\": \"孝感市\",\r\n      \"value\": \"4209\"\r\n    },\r\n    {\r\n      \"label\": \"荆州市\",\r\n      \"value\": \"4210\"\r\n    },\r\n    {\r\n      \"label\": \"黄冈市\",\r\n      \"value\": \"4211\"\r\n    },\r\n    {\r\n      \"label\": \"咸宁市\",\r\n      \"value\": \"4212\"\r\n    },\r\n    {\r\n      \"label\": \"随州市\",\r\n      \"value\": \"4213\"\r\n    },\r\n    {\r\n      \"label\": \"恩施土家族苗族自治州\",\r\n      \"value\": \"4228\"\r\n    },\r\n    {\r\n      \"label\": \"省直辖县级行政区划\",\r\n      \"value\": \"4290\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"长沙市\",\r\n      \"value\": \"4301\"\r\n    },\r\n    {\r\n      \"label\": \"株洲市\",\r\n      \"value\": \"4302\"\r\n    },\r\n    {\r\n      \"label\": \"湘潭市\",\r\n      \"value\": \"4303\"\r\n    },\r\n    {\r\n      \"label\": \"衡阳市\",\r\n      \"value\": \"4304\"\r\n    },\r\n    {\r\n      \"label\": \"邵阳市\",\r\n      \"value\": \"4305\"\r\n    },\r\n    {\r\n      \"label\": \"岳阳市\",\r\n      \"value\": \"4306\"\r\n    },\r\n    {\r\n      \"label\": \"常德市\",\r\n      \"value\": \"4307\"\r\n    },\r\n    {\r\n      \"label\": \"张家界市\",\r\n      \"value\": \"4308\"\r\n    },\r\n    {\r\n      \"label\": \"益阳市\",\r\n      \"value\": \"4309\"\r\n    },\r\n    {\r\n      \"label\": \"郴州市\",\r\n      \"value\": \"4310\"\r\n    },\r\n    {\r\n      \"label\": \"永州市\",\r\n      \"value\": \"4311\"\r\n    },\r\n    {\r\n      \"label\": \"怀化市\",\r\n      \"value\": \"4312\"\r\n    },\r\n    {\r\n      \"label\": \"娄底市\",\r\n      \"value\": \"4313\"\r\n    },\r\n    {\r\n      \"label\": \"湘西土家族苗族自治州\",\r\n      \"value\": \"4331\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"广州市\",\r\n      \"value\": \"4401\"\r\n    },\r\n    {\r\n      \"label\": \"韶关市\",\r\n      \"value\": \"4402\"\r\n    },\r\n    {\r\n      \"label\": \"深圳市\",\r\n      \"value\": \"4403\"\r\n    },\r\n    {\r\n      \"label\": \"珠海市\",\r\n      \"value\": \"4404\"\r\n    },\r\n    {\r\n      \"label\": \"汕头市\",\r\n      \"value\": \"4405\"\r\n    },\r\n    {\r\n      \"label\": \"佛山市\",\r\n      \"value\": \"4406\"\r\n    },\r\n    {\r\n      \"label\": \"江门市\",\r\n      \"value\": \"4407\"\r\n    },\r\n    {\r\n      \"label\": \"湛江市\",\r\n      \"value\": \"4408\"\r\n    },\r\n    {\r\n      \"label\": \"茂名市\",\r\n      \"value\": \"4409\"\r\n    },\r\n    {\r\n      \"label\": \"肇庆市\",\r\n      \"value\": \"4412\"\r\n    },\r\n    {\r\n      \"label\": \"惠州市\",\r\n      \"value\": \"4413\"\r\n    },\r\n    {\r\n      \"label\": \"梅州市\",\r\n      \"value\": \"4414\"\r\n    },\r\n    {\r\n      \"label\": \"汕尾市\",\r\n      \"value\": \"4415\"\r\n    },\r\n    {\r\n      \"label\": \"河源市\",\r\n      \"value\": \"4416\"\r\n    },\r\n    {\r\n      \"label\": \"阳江市\",\r\n      \"value\": \"4417\"\r\n    },\r\n    {\r\n      \"label\": \"清远市\",\r\n      \"value\": \"4418\"\r\n    },\r\n    {\r\n      \"label\": \"东莞市\",\r\n      \"value\": \"4419\"\r\n    },\r\n    {\r\n      \"label\": \"中山市\",\r\n      \"value\": \"4420\"\r\n    },\r\n    {\r\n      \"label\": \"潮州市\",\r\n      \"value\": \"4451\"\r\n    },\r\n    {\r\n      \"label\": \"揭阳市\",\r\n      \"value\": \"4452\"\r\n    },\r\n    {\r\n      \"label\": \"云浮市\",\r\n      \"value\": \"4453\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"南宁市\",\r\n      \"value\": \"4501\"\r\n    },\r\n    {\r\n      \"label\": \"柳州市\",\r\n      \"value\": \"4502\"\r\n    },\r\n    {\r\n      \"label\": \"桂林市\",\r\n      \"value\": \"4503\"\r\n    },\r\n    {\r\n      \"label\": \"梧州市\",\r\n      \"value\": \"4504\"\r\n    },\r\n    {\r\n      \"label\": \"北海市\",\r\n      \"value\": \"4505\"\r\n    },\r\n    {\r\n      \"label\": \"防城港市\",\r\n      \"value\": \"4506\"\r\n    },\r\n    {\r\n      \"label\": \"钦州市\",\r\n      \"value\": \"4507\"\r\n    },\r\n    {\r\n      \"label\": \"贵港市\",\r\n      \"value\": \"4508\"\r\n    },\r\n    {\r\n      \"label\": \"玉林市\",\r\n      \"value\": \"4509\"\r\n    },\r\n    {\r\n      \"label\": \"百色市\",\r\n      \"value\": \"4510\"\r\n    },\r\n    {\r\n      \"label\": \"贺州市\",\r\n      \"value\": \"4511\"\r\n    },\r\n    {\r\n      \"label\": \"河池市\",\r\n      \"value\": \"4512\"\r\n    },\r\n    {\r\n      \"label\": \"来宾市\",\r\n      \"value\": \"4513\"\r\n    },\r\n    {\r\n      \"label\": \"崇左市\",\r\n      \"value\": \"4514\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"海口市\",\r\n      \"value\": \"4601\"\r\n    },\r\n    {\r\n      \"label\": \"三亚市\",\r\n      \"value\": \"4602\"\r\n    },\r\n    {\r\n      \"label\": \"三沙市\",\r\n      \"value\": \"4603\"\r\n    },\r\n    {\r\n      \"label\": \"儋州市\",\r\n      \"value\": \"4604\"\r\n    },\r\n    {\r\n      \"label\": \"省直辖县级行政区划\",\r\n      \"value\": \"4690\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"市辖区\",\r\n      \"value\": \"5001\"\r\n    },\r\n    {\r\n      \"label\": \"县\",\r\n      \"value\": \"5002\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"成都市\",\r\n      \"value\": \"5101\"\r\n    },\r\n    {\r\n      \"label\": \"自贡市\",\r\n      \"value\": \"5103\"\r\n    },\r\n    {\r\n      \"label\": \"攀枝花市\",\r\n      \"value\": \"5104\"\r\n    },\r\n    {\r\n      \"label\": \"泸州市\",\r\n      \"value\": \"5105\"\r\n    },\r\n    {\r\n      \"label\": \"德阳市\",\r\n      \"value\": \"5106\"\r\n    },\r\n    {\r\n      \"label\": \"绵阳市\",\r\n      \"value\": \"5107\"\r\n    },\r\n    {\r\n      \"label\": \"广元市\",\r\n      \"value\": \"5108\"\r\n    },\r\n    {\r\n      \"label\": \"遂宁市\",\r\n      \"value\": \"5109\"\r\n    },\r\n    {\r\n      \"label\": \"内江市\",\r\n      \"value\": \"5110\"\r\n    },\r\n    {\r\n      \"label\": \"乐山市\",\r\n      \"value\": \"5111\"\r\n    },\r\n    {\r\n      \"label\": \"南充市\",\r\n      \"value\": \"5113\"\r\n    },\r\n    {\r\n      \"label\": \"眉山市\",\r\n      \"value\": \"5114\"\r\n    },\r\n    {\r\n      \"label\": \"宜宾市\",\r\n      \"value\": \"5115\"\r\n    },\r\n    {\r\n      \"label\": \"广安市\",\r\n      \"value\": \"5116\"\r\n    },\r\n    {\r\n      \"label\": \"达州市\",\r\n      \"value\": \"5117\"\r\n    },\r\n    {\r\n      \"label\": \"雅安市\",\r\n      \"value\": \"5118\"\r\n    },\r\n    {\r\n      \"label\": \"巴中市\",\r\n      \"value\": \"5119\"\r\n    },\r\n    {\r\n      \"label\": \"资阳市\",\r\n      \"value\": \"5120\"\r\n    },\r\n    {\r\n      \"label\": \"阿坝藏族羌族自治州\",\r\n      \"value\": \"5132\"\r\n    },\r\n    {\r\n      \"label\": \"甘孜藏族自治州\",\r\n      \"value\": \"5133\"\r\n    },\r\n    {\r\n      \"label\": \"凉山彝族自治州\",\r\n      \"value\": \"5134\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"贵阳市\",\r\n      \"value\": \"5201\"\r\n    },\r\n    {\r\n      \"label\": \"六盘水市\",\r\n      \"value\": \"5202\"\r\n    },\r\n    {\r\n      \"label\": \"遵义市\",\r\n      \"value\": \"5203\"\r\n    },\r\n    {\r\n      \"label\": \"安顺市\",\r\n      \"value\": \"5204\"\r\n    },\r\n    {\r\n      \"label\": \"毕节市\",\r\n      \"value\": \"5205\"\r\n    },\r\n    {\r\n      \"label\": \"铜仁市\",\r\n      \"value\": \"5206\"\r\n    },\r\n    {\r\n      \"label\": \"黔西南布依族苗族自治州\",\r\n      \"value\": \"5223\"\r\n    },\r\n    {\r\n      \"label\": \"黔东南苗族侗族自治州\",\r\n      \"value\": \"5226\"\r\n    },\r\n    {\r\n      \"label\": \"黔南布依族苗族自治州\",\r\n      \"value\": \"5227\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"昆明市\",\r\n      \"value\": \"5301\"\r\n    },\r\n    {\r\n      \"label\": \"曲靖市\",\r\n      \"value\": \"5303\"\r\n    },\r\n    {\r\n      \"label\": \"玉溪市\",\r\n      \"value\": \"5304\"\r\n    },\r\n    {\r\n      \"label\": \"保山市\",\r\n      \"value\": \"5305\"\r\n    },\r\n    {\r\n      \"label\": \"昭通市\",\r\n      \"value\": \"5306\"\r\n    },\r\n    {\r\n      \"label\": \"丽江市\",\r\n      \"value\": \"5307\"\r\n    },\r\n    {\r\n      \"label\": \"普洱市\",\r\n      \"value\": \"5308\"\r\n    },\r\n    {\r\n      \"label\": \"临沧市\",\r\n      \"value\": \"5309\"\r\n    },\r\n    {\r\n      \"label\": \"楚雄彝族自治州\",\r\n      \"value\": \"5323\"\r\n    },\r\n    {\r\n      \"label\": \"红河哈尼族彝族自治州\",\r\n      \"value\": \"5325\"\r\n    },\r\n    {\r\n      \"label\": \"文山壮族苗族自治州\",\r\n      \"value\": \"5326\"\r\n    },\r\n    {\r\n      \"label\": \"西双版纳傣族自治州\",\r\n      \"value\": \"5328\"\r\n    },\r\n    {\r\n      \"label\": \"大理白族自治州\",\r\n      \"value\": \"5329\"\r\n    },\r\n    {\r\n      \"label\": \"德宏傣族景颇族自治州\",\r\n      \"value\": \"5331\"\r\n    },\r\n    {\r\n      \"label\": \"怒江傈僳族自治州\",\r\n      \"value\": \"5333\"\r\n    },\r\n    {\r\n      \"label\": \"迪庆藏族自治州\",\r\n      \"value\": \"5334\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"拉萨市\",\r\n      \"value\": \"5401\"\r\n    },\r\n    {\r\n      \"label\": \"日喀则市\",\r\n      \"value\": \"5402\"\r\n    },\r\n    {\r\n      \"label\": \"昌都市\",\r\n      \"value\": \"5403\"\r\n    },\r\n    {\r\n      \"label\": \"林芝市\",\r\n      \"value\": \"5404\"\r\n    },\r\n    {\r\n      \"label\": \"山南市\",\r\n      \"value\": \"5405\"\r\n    },\r\n    {\r\n      \"label\": \"那曲地区\",\r\n      \"value\": \"5424\"\r\n    },\r\n    {\r\n      \"label\": \"阿里地区\",\r\n      \"value\": \"5425\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"西安市\",\r\n      \"value\": \"6101\"\r\n    },\r\n    {\r\n      \"label\": \"铜川市\",\r\n      \"value\": \"6102\"\r\n    },\r\n    {\r\n      \"label\": \"宝鸡市\",\r\n      \"value\": \"6103\"\r\n    },\r\n    {\r\n      \"label\": \"咸阳市\",\r\n      \"value\": \"6104\"\r\n    },\r\n    {\r\n      \"label\": \"渭南市\",\r\n      \"value\": \"6105\"\r\n    },\r\n    {\r\n      \"label\": \"延安市\",\r\n      \"value\": \"6106\"\r\n    },\r\n    {\r\n      \"label\": \"汉中市\",\r\n      \"value\": \"6107\"\r\n    },\r\n    {\r\n      \"label\": \"榆林市\",\r\n      \"value\": \"6108\"\r\n    },\r\n    {\r\n      \"label\": \"安康市\",\r\n      \"value\": \"6109\"\r\n    },\r\n    {\r\n      \"label\": \"商洛市\",\r\n      \"value\": \"6110\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"兰州市\",\r\n      \"value\": \"6201\"\r\n    },\r\n    {\r\n      \"label\": \"嘉峪关市\",\r\n      \"value\": \"6202\"\r\n    },\r\n    {\r\n      \"label\": \"金昌市\",\r\n      \"value\": \"6203\"\r\n    },\r\n    {\r\n      \"label\": \"白银市\",\r\n      \"value\": \"6204\"\r\n    },\r\n    {\r\n      \"label\": \"天水市\",\r\n      \"value\": \"6205\"\r\n    },\r\n    {\r\n      \"label\": \"武威市\",\r\n      \"value\": \"6206\"\r\n    },\r\n    {\r\n      \"label\": \"张掖市\",\r\n      \"value\": \"6207\"\r\n    },\r\n    {\r\n      \"label\": \"平凉市\",\r\n      \"value\": \"6208\"\r\n    },\r\n    {\r\n      \"label\": \"酒泉市\",\r\n      \"value\": \"6209\"\r\n    },\r\n    {\r\n      \"label\": \"庆阳市\",\r\n      \"value\": \"6210\"\r\n    },\r\n    {\r\n      \"label\": \"定西市\",\r\n      \"value\": \"6211\"\r\n    },\r\n    {\r\n      \"label\": \"陇南市\",\r\n      \"value\": \"6212\"\r\n    },\r\n    {\r\n      \"label\": \"临夏回族自治州\",\r\n      \"value\": \"6229\"\r\n    },\r\n    {\r\n      \"label\": \"甘南藏族自治州\",\r\n      \"value\": \"6230\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"西宁市\",\r\n      \"value\": \"6301\"\r\n    },\r\n    {\r\n      \"label\": \"海东市\",\r\n      \"value\": \"6302\"\r\n    },\r\n    {\r\n      \"label\": \"海北藏族自治州\",\r\n      \"value\": \"6322\"\r\n    },\r\n    {\r\n      \"label\": \"黄南藏族自治州\",\r\n      \"value\": \"6323\"\r\n    },\r\n    {\r\n      \"label\": \"海南藏族自治州\",\r\n      \"value\": \"6325\"\r\n    },\r\n    {\r\n      \"label\": \"果洛藏族自治州\",\r\n      \"value\": \"6326\"\r\n    },\r\n    {\r\n      \"label\": \"玉树藏族自治州\",\r\n      \"value\": \"6327\"\r\n    },\r\n    {\r\n      \"label\": \"海西蒙古族藏族自治州\",\r\n      \"value\": \"6328\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"银川市\",\r\n      \"value\": \"6401\"\r\n    },\r\n    {\r\n      \"label\": \"石嘴山市\",\r\n      \"value\": \"6402\"\r\n    },\r\n    {\r\n      \"label\": \"吴忠市\",\r\n      \"value\": \"6403\"\r\n    },\r\n    {\r\n      \"label\": \"固原市\",\r\n      \"value\": \"6404\"\r\n    },\r\n    {\r\n      \"label\": \"中卫市\",\r\n      \"value\": \"6405\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"乌鲁木齐市\",\r\n      \"value\": \"6501\"\r\n    },\r\n    {\r\n      \"label\": \"克拉玛依市\",\r\n      \"value\": \"6502\"\r\n    },\r\n    {\r\n      \"label\": \"吐鲁番市\",\r\n      \"value\": \"6504\"\r\n    },\r\n    {\r\n      \"label\": \"哈密市\",\r\n      \"value\": \"6505\"\r\n    },\r\n    {\r\n      \"label\": \"昌吉回族自治州\",\r\n      \"value\": \"6523\"\r\n    },\r\n    {\r\n      \"label\": \"博尔塔拉蒙古自治州\",\r\n      \"value\": \"6527\"\r\n    },\r\n    {\r\n      \"label\": \"巴音郭楞蒙古自治州\",\r\n      \"value\": \"6528\"\r\n    },\r\n    {\r\n      \"label\": \"阿克苏地区\",\r\n      \"value\": \"6529\"\r\n    },\r\n    {\r\n      \"label\": \"克孜勒苏柯尔克孜自治州\",\r\n      \"value\": \"6530\"\r\n    },\r\n    {\r\n      \"label\": \"喀什地区\",\r\n      \"value\": \"6531\"\r\n    },\r\n    {\r\n      \"label\": \"和田地区\",\r\n      \"value\": \"6532\"\r\n    },\r\n    {\r\n      \"label\": \"伊犁哈萨克自治州\",\r\n      \"value\": \"6540\"\r\n    },\r\n    {\r\n      \"label\": \"塔城地区\",\r\n      \"value\": \"6542\"\r\n    },\r\n    {\r\n      \"label\": \"阿勒泰地区\",\r\n      \"value\": \"6543\"\r\n    },\r\n    {\r\n      \"label\": \"自治区直辖县级行政区划\",\r\n      \"value\": \"6590\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"台北\",\r\n      \"value\": \"6601\"\r\n    },\r\n    {\r\n      \"label\": \"高雄\",\r\n      \"value\": \"6602\"\r\n    },\r\n    {\r\n      \"label\": \"基隆\",\r\n      \"value\": \"6603\"\r\n    },\r\n    {\r\n      \"label\": \"台中\",\r\n      \"value\": \"6604\"\r\n    },\r\n    {\r\n      \"label\": \"台南\",\r\n      \"value\": \"6605\"\r\n    },\r\n    {\r\n      \"label\": \"新竹\",\r\n      \"value\": \"6606\"\r\n    },\r\n    {\r\n      \"label\": \"嘉义\",\r\n      \"value\": \"6607\"\r\n    },\r\n    {\r\n      \"label\": \"宜兰\",\r\n      \"value\": \"6608\"\r\n    },\r\n    {\r\n      \"label\": \"桃园\",\r\n      \"value\": \"6609\"\r\n    },\r\n    {\r\n      \"label\": \"苗栗\",\r\n      \"value\": \"6610\"\r\n    },\r\n    {\r\n      \"label\": \"彰化\",\r\n      \"value\": \"6611\"\r\n    },\r\n    {\r\n      \"label\": \"南投\",\r\n      \"value\": \"6612\"\r\n    },\r\n    {\r\n      \"label\": \"云林\",\r\n      \"value\": \"6613\"\r\n    },\r\n    {\r\n      \"label\": \"屏东\",\r\n      \"value\": \"6614\"\r\n    },\r\n    {\r\n      \"label\": \"台东\",\r\n      \"value\": \"6615\"\r\n    },\r\n    {\r\n      \"label\": \"花莲\",\r\n      \"value\": \"6616\"\r\n    },\r\n    {\r\n      \"label\": \"澎湖\",\r\n      \"value\": \"6617\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"香港岛\",\r\n      \"value\": \"6701\"\r\n    },\r\n    {\r\n      \"label\": \"九龙\",\r\n      \"value\": \"6702\"\r\n    },\r\n    {\r\n      \"label\": \"新界\",\r\n      \"value\": \"6703\"\r\n    }\r\n  ],\r\n  [{\r\n      \"label\": \"澳门半岛\",\r\n      \"value\": \"6801\"\r\n    },\r\n    {\r\n      \"label\": \"氹仔岛\",\r\n      \"value\": \"6802\"\r\n    },\r\n    {\r\n      \"label\": \"路环岛\",\r\n      \"value\": \"6803\"\r\n    },\r\n    {\r\n      \"label\": \"路氹城\",\r\n      \"value\": \"6804\"\r\n    }\r\n  ]\r\n]\r\nexport default cityData;\r\n"
  },
  {
    "path": "uview-ui/libs/util/emitter.js",
    "content": "/**\r\n * 递归使用 call 方式this指向\r\n * @param componentName // 需要找的组件的名称\r\n * @param eventName // 事件名称\r\n * @param params // 需要传递的参数\r\n */\r\nfunction broadcast(componentName, eventName, params) {\r\n    // 循环子节点找到名称一样的子节点 否则 递归 当前子节点\r\n    this.$children.map(child=>{\r\n        if (componentName===child.$options.name) {\r\n            child.$emit.apply(child,[eventName].concat(params))\r\n        }else {\r\n            broadcast.apply(child,[componentName,eventName].concat(params))\r\n        }\r\n    })\r\n}\r\nexport default {\r\n    methods: {\r\n        /**\r\n         * 派发 (向上查找) (一个)\r\n         * @param componentName // 需要找的组件的名称\r\n         * @param eventName // 事件名称\r\n         * @param params // 需要传递的参数\r\n         */\r\n        dispatch(componentName, eventName, params) {\r\n            let parent = this.$parent || this.$root;//$parent 找到最近的父节点 $root 根节点\r\n            let name = parent.$options.name; // 获取当前组件实例的name\r\n            // 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点\r\n            // 循环出当前名称的一样的组件实例\r\n            while (parent && (!name||name!==componentName)) {\r\n                parent = parent.$parent;\r\n                if (parent) {\r\n                    name = parent.$options.name;\r\n                }\r\n            }\r\n            // 有节点表示当前找到了name一样的实例\r\n            if (parent) {\r\n                parent.$emit.apply(parent,[eventName].concat(params))\r\n            }\r\n        },\r\n        /**\r\n         * 广播 (向下查找) (广播多个)\r\n         * @param componentName // 需要找的组件的名称\r\n         * @param eventName // 事件名称\r\n         * @param params // 需要传递的参数\r\n         */\r\n        broadcast(componentName, eventName, params) {\r\n            broadcast.call(this,componentName, eventName, params)\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "uview-ui/libs/util/province.js",
    "content": "/* eslint-disable */\r\nvar provinceData = [{\r\n    \"label\": \"北京市\",\r\n    \"value\": \"11\"\r\n  },\r\n  {\r\n    \"label\": \"天津市\",\r\n    \"value\": \"12\"\r\n  },\r\n  {\r\n    \"label\": \"河北省\",\r\n    \"value\": \"13\"\r\n  },\r\n  {\r\n    \"label\": \"山西省\",\r\n    \"value\": \"14\"\r\n  },\r\n  {\r\n    \"label\": \"内蒙古自治区\",\r\n    \"value\": \"15\"\r\n  },\r\n  {\r\n    \"label\": \"辽宁省\",\r\n    \"value\": \"21\"\r\n  },\r\n  {\r\n    \"label\": \"吉林省\",\r\n    \"value\": \"22\"\r\n  },\r\n  {\r\n    \"label\": \"黑龙江省\",\r\n    \"value\": \"23\"\r\n  },\r\n  {\r\n    \"label\": \"上海市\",\r\n    \"value\": \"31\"\r\n  },\r\n  {\r\n    \"label\": \"江苏省\",\r\n    \"value\": \"32\"\r\n  },\r\n  {\r\n    \"label\": \"浙江省\",\r\n    \"value\": \"33\"\r\n  },\r\n  {\r\n    \"label\": \"安徽省\",\r\n    \"value\": \"34\"\r\n  },\r\n  {\r\n    \"label\": \"福建省\",\r\n    \"value\": \"35\"\r\n  },\r\n  {\r\n    \"label\": \"江西省\",\r\n    \"value\": \"36\"\r\n  },\r\n  {\r\n    \"label\": \"山东省\",\r\n    \"value\": \"37\"\r\n  },\r\n  {\r\n    \"label\": \"河南省\",\r\n    \"value\": \"41\"\r\n  },\r\n  {\r\n    \"label\": \"湖北省\",\r\n    \"value\": \"42\"\r\n  },\r\n  {\r\n    \"label\": \"湖南省\",\r\n    \"value\": \"43\"\r\n  },\r\n  {\r\n    \"label\": \"广东省\",\r\n    \"value\": \"44\"\r\n  },\r\n  {\r\n    \"label\": \"广西壮族自治区\",\r\n    \"value\": \"45\"\r\n  },\r\n  {\r\n    \"label\": \"海南省\",\r\n    \"value\": \"46\"\r\n  },\r\n  {\r\n    \"label\": \"重庆市\",\r\n    \"value\": \"50\"\r\n  },\r\n  {\r\n    \"label\": \"四川省\",\r\n    \"value\": \"51\"\r\n  },\r\n  {\r\n    \"label\": \"贵州省\",\r\n    \"value\": \"52\"\r\n  },\r\n  {\r\n    \"label\": \"云南省\",\r\n    \"value\": \"53\"\r\n  },\r\n  {\r\n    \"label\": \"西藏自治区\",\r\n    \"value\": \"54\"\r\n  },\r\n  {\r\n    \"label\": \"陕西省\",\r\n    \"value\": \"61\"\r\n  },\r\n  {\r\n    \"label\": \"甘肃省\",\r\n    \"value\": \"62\"\r\n  },\r\n  {\r\n    \"label\": \"青海省\",\r\n    \"value\": \"63\"\r\n  },\r\n  {\r\n    \"label\": \"宁夏回族自治区\",\r\n    \"value\": \"64\"\r\n  },\r\n  {\r\n    \"label\": \"新疆维吾尔自治区\",\r\n    \"value\": \"65\"\r\n  },\r\n  {\r\n    \"label\": \"台湾\",\r\n    \"value\": \"66\"\r\n  },\r\n  {\r\n    \"label\": \"香港\",\r\n    \"value\": \"67\"\r\n  },\r\n  {\r\n    \"label\": \"澳门\",\r\n    \"value\": \"68\"\r\n  }\r\n]\r\nexport default provinceData;\r\n"
  },
  {
    "path": "uview-ui/package.json",
    "content": "{\r\n\t\"name\": \"uview-ui\",\r\n\t\"version\": \"1.6.0\",\r\n\t\"description\": \"uView UI，是uni-app生态优秀的UI框架，全面的组件和便捷的工具会让您信手拈来，如鱼得水\",\r\n\t\"main\": \"index.js\",\r\n\t\"keywords\": [\"uview\", \"uView\", \"uni-app\", \"uni-app ui\", \"uniapp\", \"uviewui\", \"uview ui\", \"uviewUI\", \"uViewui\", \"uViewUI\", \"uView UI\", \"uni ui\", \"uni UI\", \"uniapp ui\", \"ui\", \"UI框架\", \"uniapp ui框架\", \"uniapp UI\"],\r\n\t\"scripts\": {\r\n\t\t\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\r\n\t},\r\n\t\"repository\": {\r\n\t\t\"type\": \"git\",\r\n\t\t\"url\": \"\"\r\n\t},\r\n\t\"devDependencies\": {\r\n\t\t\"node-sass\": \"^4.14.0\",\r\n\t\t\"sass-loader\": \"^8.0.2\"\r\n\t},\r\n\t\"author\": \"uView\",\r\n\t\"license\": \"MIT\"\r\n}\r\n"
  },
  {
    "path": "uview-ui/theme.scss",
    "content": "// 此文件为uView的主题变量，这些变量目前只能通过uni.scss引入才有效，另外由于\r\n// uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中，造成微信程序包太大，\r\n// 故uni.scss只建议放scss变量名相关样式，其他的样式可以通过main.js或者App.vue引入\r\n\r\n$u-main-color: #303133;\r\n$u-content-color: #606266;\r\n$u-tips-color: #909399;\r\n$u-light-color: #c0c4cc;\r\n$u-border-color: #e4e7ed;\r\n$u-bg-color: #f3f4f6;\r\n\r\n$u-type-primary: #2979ff;\r\n$u-type-primary-light: #ecf5ff;\r\n$u-type-primary-disabled: #a0cfff;\r\n$u-type-primary-dark: #2b85e4;\r\n\r\n$u-type-warning: #ff9900;\r\n$u-type-warning-disabled: #fcbd71;\r\n$u-type-warning-dark: #f29100;\r\n$u-type-warning-light: #fdf6ec;\r\n\r\n$u-type-success: #19be6b;\r\n$u-type-success-disabled: #71d5a1;\r\n$u-type-success-dark: #18b566;\r\n$u-type-success-light: #dbf1e1;\r\n\r\n$u-type-error: #fa3534;\r\n$u-type-error-disabled: #fab6b6;\r\n$u-type-error-dark: #dd6161;\r\n$u-type-error-light: #fef0f0;\r\n\r\n$u-type-info: #909399;\r\n$u-type-info-disabled: #c8c9cc;\r\n$u-type-info-dark: #82848a;\r\n$u-type-info-light: #f4f4f5;\r\n\r\n$u-form-item-height: 70rpx;\r\n$u-form-item-border-color: #dcdfe6;\r\n"
  },
  {
    "path": "vue.config.js",
    "content": "\n// module.exports = {\n//     /**\n//      *  此处为发行h5,微信小程序，app中删除console \n//      *  如需显示console 需要注释此处重新运行\n//      */\n//     chainWebpack: (config) => {\n//         // 发行或运行时启用了压缩时会生效\n//         config.optimization.minimizer('terser').tap((args) => {\n//             const compress = args[0].terserOptions.compress\n//             // 非 App 平台移除 console 代码(包含所有 console 方法，如 log,debug,info...)\n//             compress.drop_console = true\n//             compress.pure_funcs = [\n//                 '__f__', // App 平台 vue 移除日志代码\n//                 // 'console.debug' // 可移除指定的 console 方法\n//             ]\n//             return args\n//         })\n//     }\n// }"
  }
]