[
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\npackage-lock.json\n\n\n.hbuilderx\nuniCloud-aliyun\n\n# plugin\n/nativeplugins\n\n\n# testing\n/coverage\n\n# production\n/build\n/unpackage/cache\n/unpackage/debug\n/unpackage/dist\n/unpackage/resources\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# electron output\n/dist\n\n# db\nOpenIM_*\n\n# plugin\n/nativeplugins\n"
  },
  {
    "path": ".prettierignore",
    "content": "/node_modules/\n/nativeplugins/"
  },
  {
    "path": "App.vue",
    "content": "<script>\nimport { mapGetters, mapActions } from \"vuex\";\nimport IMSDK, {\n  IMMethods,\n  MessageType,\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport config from \"./common/config\";\nimport { getDbDir, toastWithCallback } from \"@/util/common.js\";\nimport { conversationSort } from \"@/util/imCommon\";\nimport { PageEvents, UpdateMessageTypes } from \"@/constant\";\n\nexport default {\n  onLaunch: function () {\n    console.log(\"App Launch\");\n    this.setGlobalIMlistener();\n    this.tryLogin();\n    // #ifdef H5\n    console.error(\n      `暂时不支持运行到 Web，如果需要移动端的 Web 项目，参考 [H5 demo](https://github.com/openimsdk/openim-h5-demo)`\n    );\n    // #endif\n    // #ifdef MP-WEIXIN\n    console.error(`暂时不支持运行到小程序端`);\n    // #endif\n  },\n  onShow: function () {\n    console.log(\"App Show\");\n    IMSDK.asyncApi(IMSDK.IMMethods.SetAppBackgroundStatus, IMSDK.uuid(), false);\n  },\n  onHide: function () {\n    console.log(\"App Hide\");\n    IMSDK.asyncApi(IMSDK.IMMethods.SetAppBackgroundStatus, IMSDK.uuid(), true);\n  },\n  computed: {\n    ...mapGetters([\n      \"storeConversationList\",\n      \"storeCurrentConversation\",\n      \"storeCurrentUserID\",\n      \"storeSelfInfo\",\n      \"storeRecvFriendApplications\",\n      \"storeRecvGroupApplications\",\n      \"storeHistoryMessageList\",\n      \"storeIsSyncing\",\n      \"storeGroupList\",\n    ]),\n  },\n  methods: {\n    ...mapActions(\"message\", [\"pushNewMessage\", \"updateOneMessage\"]),\n    ...mapActions(\"conversation\", [\"updateCurrentMemberInGroup\"]),\n    ...mapActions(\"contact\", [\n      \"updateFriendInfo\",\n      \"pushNewFriend\",\n      \"updateBlackInfo\",\n      \"pushNewBlack\",\n      \"pushNewGroup\",\n      \"updateGroupInfo\",\n      \"pushNewRecvFriendApplition\",\n      \"updateRecvFriendApplition\",\n      \"pushNewSentFriendApplition\",\n      \"updateSentFriendApplition\",\n      \"pushNewRecvGroupApplition\",\n      \"updateRecvGroupApplition\",\n      \"pushNewSentGroupApplition\",\n      \"updateSentGroupApplition\",\n    ]),\n    setGlobalIMlistener() {\n      console.log(\"setGlobalIMlistener\");\n      // init\n      const kickHander = (message) => {\n        toastWithCallback(message, () => {\n          uni.removeStorage({\n            key: \"IMToken\",\n          });\n          uni.removeStorage({\n            key: \"BusinessToken\",\n          });\n          uni.$u.route(\"/pages/login/index\");\n        });\n      };\n      IMSDK.subscribe(IMSDK.IMEvents.OnKickedOffline, (data) => {\n        kickHander(\"您的账号在其他设备登录，请重新登陆！\");\n      });\n      IMSDK.subscribe(IMSDK.IMEvents.OnUserTokenExpired, (data) => {\n        kickHander(\"您的登录已过期，请重新登陆！\");\n      });\n      IMSDK.subscribe(IMSDK.IMEvents.OnUserTokenInvalid, (data) => {\n        kickHander(\"您的登录已无效，请重新登陆！\");\n      });\n\n      // sync\n      const syncStartHandler = ({ data }) => {\n        this.$store.commit(\"user/SET_IS_SYNCING\", true);\n        this.$store.commit(\"user/SET_REINSTALL\", data);\n      };\n      const syncProgressHandler = ({ data }) => {\n        this.$store.commit(\"user/SET_PROGRESS\", data);\n      };\n      const syncFinishHandler = () => {\n        uni.hideLoading();\n        this.$store.dispatch(\"conversation/getConversationList\");\n        this.$store.dispatch(\"contact/getFriendList\");\n        this.$store.dispatch(\"contact/getGrouplist\");\n        this.$store.dispatch(\"conversation/getUnReadCount\");\n        this.$store.commit(\"user/SET_IS_SYNCING\", false);\n      };\n      const syncFailedHandler = () => {\n        uni.hideLoading();\n        uni.$u.toast(\"同步消息失败\");\n        this.$store.dispatch(\"conversation/getConversationList\");\n        this.$store.dispatch(\"conversation/getUnReadCount\");\n        this.$store.commit(\"user/SET_IS_SYNCING\", false);\n      };\n      IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerStart, syncStartHandler);\n      IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerFinish, syncFinishHandler);\n      IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerFailed, syncFailedHandler);\n      IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerProgress, syncProgressHandler);\n\n      // self\n      const selfInfoUpdateHandler = ({ data }) => {\n        this.$store.commit(\"user/SET_SELF_INFO\", {\n          ...this.storeSelfInfo,\n          ...data,\n        });\n      };\n\n      IMSDK.subscribe(IMSDK.IMEvents.OnSelfInfoUpdated, selfInfoUpdateHandler);\n\n      // message\n      const newMessagesHandler = ({ data }) => {\n        if (this.storeIsSyncing) {\n          return;\n        }\n        data.forEach(this.handleNewMessage);\n      };\n\n      IMSDK.subscribe(IMSDK.IMEvents.OnRecvNewMessages, newMessagesHandler);\n\n      // friend\n      const friendInfoChangeHandler = ({ data }) => {\n        uni.$emit(IMSDK.IMEvents.OnFriendInfoChanged, { data });\n        this.updateFriendInfo({\n          friendInfo: data,\n        });\n      };\n      const friendAddedHandler = ({ data }) => {\n        this.pushNewFriend(data);\n      };\n      const friendDeletedHander = ({ data }) => {\n        this.updateFriendInfo({\n          friendInfo: data,\n          isRemove: true,\n        });\n      };\n\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnFriendInfoChanged,\n        friendInfoChangeHandler\n      );\n      IMSDK.subscribe(IMSDK.IMEvents.OnFriendAdded, friendAddedHandler);\n      IMSDK.subscribe(IMSDK.IMEvents.OnFriendDeleted, friendDeletedHander);\n\n      // blacklist\n      const blackAddedHandler = ({ data }) => {\n        this.pushNewBlack(data);\n      };\n      const blackDeletedHandler = ({ data }) => {\n        this.updateBlackInfo({\n          blackInfo: data,\n          isRemove: true,\n        });\n      };\n\n      IMSDK.subscribe(IMSDK.IMEvents.OnBlackAdded, blackAddedHandler);\n      IMSDK.subscribe(IMSDK.IMEvents.OnBlackDeleted, blackDeletedHandler);\n\n      // group\n      const joinedGroupAddedHandler = ({ data }) => {\n        this.pushNewGroup(data);\n      };\n      const joinedGroupDeletedHandler = ({ data }) => {\n        this.updateGroupInfo({\n          groupInfo: data,\n          isRemove: true,\n        });\n      };\n      const groupInfoChangedHandler = ({ data }) => {\n        this.updateGroupInfo({\n          groupInfo: data,\n        });\n      };\n      const groupMemberInfoChangedHandler = ({ data }) => {\n        uni.$emit(IMSDK.IMEvents.OnGroupMemberInfoChanged, { data });\n        if (data.groupID === this.storeCurrentConversation?.groupID) {\n          this.updateCurrentMemberInGroup(data);\n        }\n      };\n\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnJoinedGroupAdded,\n        joinedGroupAddedHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnJoinedGroupDeleted,\n        joinedGroupDeletedHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnGroupInfoChanged,\n        groupInfoChangedHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnGroupMemberInfoChanged,\n        groupMemberInfoChangedHandler\n      );\n\n      // application\n      const friendApplicationNumHandler = ({ data }) => {\n        const isRecv = data.toUserID === this.storeCurrentUserID;\n        if (isRecv) {\n          this.pushNewRecvFriendApplition(data);\n        } else {\n          this.pushNewSentFriendApplition(data);\n        }\n      };\n      const friendApplicationAccessHandler = ({ data }) => {\n        const isRecv = data.toUserID === this.storeCurrentUserID;\n        if (isRecv) {\n          this.updateRecvFriendApplition({\n            application: data,\n          });\n        } else {\n          this.updateSentFriendApplition({\n            application: data,\n          });\n        }\n      };\n      const groupApplicationNumHandler = ({ data }) => {\n        const isRecv = data.userID !== this.storeCurrentUserID;\n        if (isRecv) {\n          this.pushNewRecvGroupApplition(data);\n        } else {\n          this.pushNewSentGroupApplition(data);\n        }\n      };\n      const groupApplicationAccessHandler = ({ data }) => {\n        const isRecv = data.userID !== this.storeCurrentUserID;\n        if (isRecv) {\n          this.updateRecvGroupApplition({\n            application: data,\n          });\n        } else {\n          this.updateSentGroupApplition({\n            application: data,\n          });\n        }\n      };\n\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnFriendApplicationAdded,\n        friendApplicationNumHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnFriendApplicationAccepted,\n        friendApplicationAccessHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnFriendApplicationRejected,\n        friendApplicationAccessHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnGroupApplicationAdded,\n        groupApplicationNumHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnGroupApplicationAccepted,\n        groupApplicationAccessHandler\n      );\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnGroupApplicationRejected,\n        groupApplicationAccessHandler\n      );\n\n      // conversation\n      const totalUnreadCountChangedHandler = ({ data }) => {\n        if (this.storeIsSyncing) {\n          return;\n        }\n        this.$store.commit(\"conversation/SET_UNREAD_COUNT\", data);\n      };\n      const newConversationHandler = ({ data }) => {\n        if (this.storeIsSyncing) {\n          return;\n        }\n        const result = [...data, ...this.storeConversationList];\n        this.$store.commit(\n          \"conversation/SET_CONVERSATION_LIST\",\n          conversationSort(result)\n        );\n      };\n      const conversationChangedHandler = ({ data }) => {\n        if (this.storeIsSyncing) {\n          return;\n        }\n        let filterArr = [];\n        console.log(data);\n        const chids = data.map((ch) => ch.conversationID);\n        filterArr = this.storeConversationList.filter(\n          (tc) => !chids.includes(tc.conversationID)\n        );\n        const idx = data.findIndex(\n          (c) =>\n            c.conversationID === this.storeCurrentConversation.conversationID\n        );\n        if (idx !== -1)\n          this.$store.commit(\n            \"conversation/SET_CURRENT_CONVERSATION\",\n            data[idx]\n          );\n        const result = [...data, ...filterArr];\n        this.$store.commit(\n          \"conversation/SET_CONVERSATION_LIST\",\n          conversationSort(result)\n        );\n      };\n\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnTotalUnreadMessageCountChanged,\n        totalUnreadCountChangedHandler\n      );\n      IMSDK.subscribe(IMSDK.IMEvents.OnNewConversation, newConversationHandler);\n      IMSDK.subscribe(\n        IMSDK.IMEvents.OnConversationChanged,\n        conversationChangedHandler\n      );\n    },\n\n    tryLogin() {\n      const initStore = () => {\n        this.$store.dispatch(\"user/getSelfInfo\");\n        this.$store.dispatch(\"conversation/getConversationList\");\n        this.$store.dispatch(\"conversation/getUnReadCount\");\n        this.$store.dispatch(\"contact/getBlacklist\");\n        this.$store.dispatch(\"contact/getRecvFriendApplications\");\n        this.$store.dispatch(\"contact/getSentFriendApplications\");\n        this.$store.dispatch(\"contact/getRecvGroupApplications\");\n        this.$store.dispatch(\"contact/getSentGroupApplications\");\n        uni.switchTab({\n          url: \"/pages/conversation/conversationList/index?isRedirect=true\",\n        });\n      };\n      getDbDir()\n        .then(async (path) => {\n          const flag = await IMSDK.asyncApi(IMMethods.InitSDK, IMSDK.uuid(), {\n            systemType: \"uni-app\",\n            apiAddr: config.getApiUrl(), // SDK的API接口地址。如：http://xxx:10002\n            wsAddr: config.getWsUrl(), // SDK的websocket地址。如： ws://xxx:10001\n            dataDir: path, // 数据存储路径\n            logLevel: 6,\n            logFilePath: path,\n            isLogStandardOutput: true,\n            isExternalExtensions: false,\n          });\n          if (!flag) {\n            plus.navigator.closeSplashscreen();\n            uni.$u.toast(\"初始化IMSDK失败！\");\n            return;\n          }\n          const status = await IMSDK.asyncApi(\n            IMSDK.IMMethods.GetLoginStatus,\n            IMSDK.uuid()\n          );\n          if (status === 3) {\n            initStore();\n            return;\n          }\n\n          const IMToken = uni.getStorageSync(\"IMToken\");\n          const IMUserID = uni.getStorageSync(\"IMUserID\");\n          if (IMToken && IMUserID) {\n            IMSDK.asyncApi(IMSDK.IMMethods.Login, IMSDK.uuid(), {\n              userID: IMUserID,\n              token: IMToken,\n            })\n              .then(initStore)\n              .catch((err) => {\n                console.log(err);\n                uni.removeStorage({\n                  key: \"IMToken\",\n                });\n                uni.removeStorage({\n                  key: \"BusinessToken\",\n                });\n                plus.navigator.closeSplashscreen();\n              });\n          } else {\n            plus.navigator.closeSplashscreen();\n          }\n        })\n        .catch((err) => {\n          console.log(\"get dir failed\");\n          console.log(err);\n          plus.navigator.closeSplashscreen();\n        });\n    },\n    handleNewMessage(newServerMsg) {\n      if (this.inCurrentConversation(newServerMsg)) {\n        if (\n          newServerMsg.contentType !== MessageType.TypingMessage &&\n          newServerMsg.contentType !== MessageType.RevokeMessage\n        ) {\n          newServerMsg.isAppend = true;\n          this.pushNewMessage(newServerMsg);\n          setTimeout(() => uni.$emit(PageEvents.ScrollToBottom, true));\n          uni.$u.debounce(this.markConversationAsRead, 2000);\n        }\n      }\n    },\n    inCurrentConversation(newServerMsg) {\n      switch (newServerMsg.sessionType) {\n        case SessionType.Single:\n          return (\n            newServerMsg.sendID === this.storeCurrentConversation.userID ||\n            (newServerMsg.sendID === this.storeCurrentUserID &&\n              newServerMsg.recvID === this.storeCurrentConversation.userID)\n          );\n        case SessionType.WorkingGroup:\n          return newServerMsg.groupID === this.storeCurrentConversation.groupID;\n        case SessionType.Notification:\n          return newServerMsg.sendID === this.storeCurrentConversation.userID;\n        default:\n          return false;\n      }\n    },\n    markConversationAsRead() {\n      IMSDK.asyncApi(\n        IMSDK.IMMethods.MarkConversationMessageAsRead,\n        IMSDK.uuid(),\n        this.storeCurrentConversation.conversationID\n      );\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n/*每个页面公共css */\n@import \"@/uni_modules/uview-ui/index.scss\";\n@import \"@/styles/login.scss\";\n@import \"@/styles/global.scss\";\n\nuni-page-body {\n  height: 100vh;\n  overflow: hidden;\n}\n\n.uni-tabbar .uni-tabbar__icon {\n  width: 28px !important;\n  height: 28px !important;\n}\n</style>\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "Readme.md",
    "content": "<p align=\"center\">\n    <a href=\"https://openim.io\">\n        <img src=\"./docs/images/logo.jpg\" width=\"60%\" height=\"30%\"/>\n    </a>\n</p>\n\n# OpenIM Uniapp 💬💻\n\n<p>\n  <a href=\"https://docs.openim.io/\">OpenIM Docs</a>\n  •\n  <a href=\"https://github.com/openimsdk/open-im-server\">OpenIM Server</a>\n  •\n  <a href=\"https://github.com/openimsdk/open-im-sdk-uniapp\">open-im-sdk-uniapp</a>\n  •\n  <a href=\"https://github.com/openimsdk/openim-sdk-core\">openim-sdk-core</a>\n</p>\nOpenIM 为开发者提供开源即时通讯 SDK，作为 Twilio、Sendbird 等云服务的替代方案。借助 OpenIM，开发者可以构建安全可靠的即时通讯应用，如 WeChat、Zoom、Slack 等。\n\n本仓库基于开源版 OpenIM SDK 开发，提供了一款基于 uniapp 的即时通讯应用。您可以使用此应用程序作为 OpenIM SDK 的参考实现。本项目引用了 `openim-uniapp-polyfill`，可以构建安卓程序和 iOS 程序。\n\n<p align=\"center\">\n   <img src=\"./docs/images/preview1.png\" alt=\"Preview\" width=\"32%\"/>\n   <span style=\"display: inline-block; width: 16px;\"></span>\n   <img src=\"./docs/images/preview2.png\" alt=\"Preview\" width=\"32%\"/>\n</p>\n\n## 授权许可 :page_facing_up:\n\n本仓库采用 GNU Affero 通用公共许可证第 3 版 (AGPL-3.0) 进行许可，并受以下附加条款的约束。**不允许用于商业用途**。详情请参阅 [此处](./LICENSE)。\n\n## 开发环境\n\n在开始开发之前，请确保您的系统已安装以下软件：\n\n- **HBuilderX**：最新版本\n- **Node.js**：版本 ≥ 16.x（[手动安装](https://nodejs.org/dist/latest-v20.x/) 或使用 [nvm](https://github.com/nvm-sh/nvm) 进行版本管理）\n- **npm**：版本 ≥ 6.x（随 Node.js 一起安装）\n- **Git**：用于代码版本控制\n\n同时，您需要确保已经[部署](https://docs.openim.io/zh-Hans/guides/gettingStarted/dockerCompose)了最新版本的 OpenIM Server。接下来，您可以编译项目并连接自己的服务端进行测试。\n\n## 运行环境\n\n本应用支持以下操作系统版本：\n\n| 浏览器/操作系统 | 版本              | 状态 |\n| --------------- | ----------------- | ---- |\n| **iOS**         | 13.0 及以上        | ✅   |\n| **Android**     | 24 及以上          | ✅   |\n\n### 说明\n\n- `只支持` Uniapp 打包成 Android/iOS 应用。并且 SDK 也暂未支持 UniappX （开发中）。\n- 暂时 `不支持` 运行到 Web，如果需要移动端的 Web 项目，参考 [H5 demo](https://github.com/openimsdk/openim-h5-demo)。\n- 暂时 `不支持` 运行到小程序端。\n- 暂时 `不支持` 一对一音视频。如果需要使用，可以运行其他仓库的项目。\n\n## 快速开始\n\n按照以下步骤设置本地开发环境：\n\n1. 拉取代码\n\n   ```bash\n   git clone https://github.com/openimsdk/open-im-uniapp-demo.git\n   cd open-im-uniapp-demo\n   ```\n\n2. 安装依赖\n\n   ```bash\n   npm install\n   ```\n\n3. 修改配置\n\n   - `common/config.js`\n\n     > 如果没有修改过服务端默认端口，则只需要修改`BASE_HOST`为您的服务器 ip 即可，如需配置域名和 https 访问，可以参考[nginx 配置](https://docs.openim.io/zh-Hans/guides/gettingStarted/nginxDomainConfig)，并采用最下方的配置项，并修改`BASE_DOMAIN`为您的域名。\n\n     ```javascript\n     const BASE_HOST = 'your-server-ip'\n     const CHAT_URL = `http://${BASE_HOST}:10008`\n     const API_URL = `http://${BASE_HOST}:10002`\n     const WS_URL = `ws://${BASE_HOST}:10001`\n\n     // const BASE_DOMAIN = 'your-server-domain'\n     // const CHAT_URL = `http://${BASE_DOMAIN}/chat`\n     // const API_URL = `http://${BASE_DOMAIN}/api`\n     // const WS_URL = `ws://${BASE_DOMAIN}/msg_gateway`\n     ```\n\n4. 修改为您自己的 AppID\n\n- 使用 Hbuilder 打开 manifest.json\n\n  ![](./docs/images/appid.png)\n\n5. 导入原生插件\n\n- 使用 Hbuilder 打开 manifest.json\n\n  ![](./docs/images/plugin.png)\n\n- 选择云插件需要选择您的项目 Appid 和输入 Android 包名称\n\n  ![](./docs/images/download.png)\n\n6. 云打包自定义调试基座\n\n- 菜单 -> 运行 -> 运行到手机或模拟器 -> 制作自定义调试基座 (使用自己的包名)\n\n  ![](./docs/images/dev.png)\n\n7. 在真实的机器或模拟器上运行 （ iOS 仅支持在真机调试 ）\n\n- 菜单 -> 运行 -> 运行到手机或模拟器 -> 运行到Android App基座\n\n  ![](./docs/images/run_dev.png)\n\n8. 开始开发测试！ 🎉\n\n## 音视频通话\n\n一对一音视频通话，多人音视频通话、视频会议请联系邮箱 [contact@openim.io](mailto:contact@openim.io)\n\n## 构建 🚀\n\n### 使用原生App 云打包\n\n- 菜单 -> 发行 -> 原生App-云打包\n\n  ![](./docs/images/build.png)\n\n## 功能列表\n\n### 说明\n\n| 功能模块           | 功能项                                                    | 状态 |\n| ------------------ | --------------------------------------------------------- | ---- |\n| **账号功能**       | 手机号注册\\邮箱注册\\验证码登录                            | ✅   |\n|                    | 个人信息查看\\修改                                         | ✅   |\n|                    | 修改密码\\忘记密码                                         | ✅   |\n| **好友功能**       | 查找\\申请\\搜索\\添加\\删除好友                              | ✅   |\n|                    | 同意\\拒绝好友申请                                         | ✅   |\n|                    | 好友备注                                                  | ✅   |\n|                    | 是否允许添加好友                                          | ✅   |\n|                    | 好友列表\\好友资料实时同步                                 | ✅   |\n| **黑名单功能**     | 限制消息                                                  | ✅   |\n|                    | 黑名单列表实时同步                                        | ✅   |\n|                    | 添加\\移出黑名单                                           | ✅   |\n| **群组功能**       | 创建\\解散群组                                             | ✅   |\n|                    | 申请加群\\邀请加群\\退出群组\\移除群成员                     | ✅   |\n|                    | 群名/群头像更改/群资料变更通知和实时同步                  | ✅   |\n|                    | 群成员邀请进群                                            | ✅   |\n|                    | 群主转让                                                  | ✅   |\n|                    | 群主、管理员同意进群申请                                  | ✅   |\n|                    | 搜索群成员                                                | ✅   |\n| **消息功能**       | 离线消息                                                  | ✅   |\n|                    | 漫游消息                                                  | ✅   |\n|                    | 多端消息                                                  | ✅   |\n|                    | 历史消息                                                  | ✅   |\n|                    | 消息删除                                                  | ✅   |\n|                    | 消息清空                                                  | ✅   |\n|                    | 消息复制                                                  | ✅   |\n|                    | 单聊正在输入                                              | ✅   |\n|                    | 新消息勿扰                                                | ✅   |\n|                    | 清空聊天记录                                              | ✅   |\n|                    | 新成员查看群聊历史消息                                    | ✅   |\n|                    | 新消息提示                                                | ✅   |\n|                    | 文本消息                                                  | ✅   |\n|                    | 图片消息                                                  | ✅   |\n|                    | 视频消息                                                  | ✅   |\n|                    | 表情消息                                                  | ✅   |\n|                    | 文件消息                                                  | ✅   |\n|                    | 语音消息                                                  | ✅   |\n|                    | 名片消息                                                  | ✅   |\n|                    | 地理位置消息                                              | ✅   |\n|                    | 自定义消息                                                | ✅   |\n| **会话功能**       | 置顶会话                                                  | ✅   |\n|                    | 会话已读                                                  | ✅   |\n|                    | 会话免打扰                                                | ✅   |\n| **REST API**       | 认证管理                                                  | ✅   |\n|                    | 用户管理                                                  | ✅   |\n|                    | 关系链管理                                                | ✅   |\n|                    | 群组管理                                                  | ✅   |\n|                    | 会话管理                                                  | ✅   |\n|                    | 消息管理                                                  | ✅   |\n| **Webhook**        | 群组回调                                                  | ✅   |\n|                    | 消息回调                                                  | ✅   |\n|                    | 推送回调                                                  | ✅   |\n|                    | 关系链回调                                                | ✅   |\n|                    | 用户回调                                                  | ✅   |\n| **容量和性能**     | 1 万好友                                                  | ✅   |\n|                    | 10 万人大群                                               | ✅   |\n|                    | 秒级同步                                                  | ✅   |\n|                    | 集群部署                                                  | ✅   |\n|                    | 互踢策略                                                  | ✅   |\n| **在线状态**       | 所有平台不互踢                                            | ✅   |\n|                    | 每个平台各只能登录一个设备                                | ✅   |\n|                    | PC 端、移动端、Pad 端、Web 端、小程序端各只能登录一个设备 | ✅   |\n|                    | PC 端不互踢，其他平台总计一个设备                         | ✅   |\n| **文件类对象存储** | 支持私有化部署 minio                                      | ✅   |\n|                    | 支持 COS、OSS、Kodo、S3 公有云                            | ✅   |\n| **推送**           | 消息在线实时推送                                          | ✅   |\n|                    | 消息离线推送，支持个推，Firebase                          | ✅   |\n\n更多高级功能、音视频通话、视频会议 请联系邮箱 [contact@openim.io](mailto:contact@openim.io)\n\n## 加入社区 :busts_in_silhouette:\n\n- 🚀 [加入我们的 Slack 社区](https://join.slack.com/t/openimsdk/shared_invite/zt-22720d66b-o_FvKxMTGXtcnnnHiMqe9Q)\n- :eyes: [加入我们的微信群](https://openim-1253691595.cos.ap-nanjing.myqcloud.com/WechatIMG20.jpeg)\n\n## 常见问题\n\n1. 直接运行无法使用？\n\n   答：必须严格按照文档操作，导入原生插件和制作自定义基座才能运行。\n\n2. iOS 制作自定义基座失败？\n\n   答：插件源码不能经过其他操作系统。只能在 MacOS 环境下载插件、制作自定义基座和云打包。\n\n3. 如何使用地图、定位?\n  答： [参考文档](CONFIGKEY.md)\n\n4. 如何使用离线推送?\n  答： [参考文档](CONFIGKEY.md)\n"
  },
  {
    "path": "api/login.js",
    "content": "// 登录\nexport const businessLogin = (params) =>\n  uni.$u?.http.post(\"/account/login\", JSON.stringify(params));\nexport const businessSendSms = (params) =>\n  uni.$u?.http.post(\"/account/code/send\", JSON.stringify(params));\nexport const businessVerifyCode = (params) =>\n  uni.$u?.http.post(\"/account/code/verify\", JSON.stringify(params));\nexport const businessRegister = (params) =>\n  uni.$u?.http.post(\"/account/register\", JSON.stringify(params));\nexport const businessReset = (params) =>\n  uni.$u?.http.post(\"/account/password/reset\", JSON.stringify(params));\n\nexport const businessModify = (params) =>\n  uni.$u?.http.post(\n    \"/account/password/change\",\n    JSON.stringify({\n      ...params,\n    }),\n    {\n      header: {\n        token: uni.getStorageSync(\"BusinessToken\"),\n      },\n    }\n  );\n\n// 用户信息\nexport const businessInfoUpdate = (params) =>\n  uni.$u?.http.post(\n    \"/user/update\",\n    JSON.stringify({\n      ...params,\n    }),\n    {\n      header: {\n        token: uni.getStorageSync(\"BusinessToken\"),\n      },\n    }\n  );\nexport const businessGetUserInfo = (userID) =>\n  uni.$u?.http.post(\n    \"/user/find/full\",\n    JSON.stringify({\n      userIDs: [userID],\n    }),\n    {\n      header: {\n        token: uni.getStorageSync(\"BusinessToken\"),\n      },\n    }\n  );\n\nexport const businessSearchUserInfo = (keyword) =>\n  uni.$u?.http.post(\n    \"/user/search/full\",\n    JSON.stringify({\n      keyword,\n      pagination: {\n        pageNumber: 1,\n        showNumber: 10,\n      },\n    }),\n    {\n      header: {\n        token: uni.getStorageSync(\"BusinessToken\"),\n      },\n    }\n  );\n\nexport const businessSearchUser = (keyword) =>\n  uni.$u?.http.post(\n    \"/friend/search\",\n    JSON.stringify({\n      keyword,\n      pagination: {\n        pageNumber: 1,\n        showNumber: 99,\n      },\n    }),\n    {\n      header: {\n        token: uni.getStorageSync(\"BusinessToken\"),\n      },\n    }\n  );\n"
  },
  {
    "path": "common/config.js",
    "content": "// const BASE_HOST = 'your-server-ip'\n// const CHAT_URL = `http://${BASE_HOST}:10008`\n// const API_URL = `http://${BASE_HOST}:10002`\n// const WS_URL = `ws://${BASE_HOST}:10001`\n\nconst BASE_DOMAIN = 'web.rentsoft.cn'\nconst CHAT_URL = `https://${BASE_DOMAIN}/chat`\nconst API_URL = `https://${BASE_DOMAIN}/api`\nconst WS_URL = `wss://${BASE_DOMAIN}/msg_gateway`\n\nconst version = 'Uniapp-Demo'\n\nconst getRegisterUrl = () => uni.getStorageSync(\"IMRegisteUrl\") || CHAT_URL;\nconst getApiUrl = () => uni.getStorageSync(\"IMApiUrl\") || API_URL;\nconst getWsUrl = () => uni.getStorageSync(\"IMWsUrl\") || WS_URL;\n\nmodule.exports = {\n  version,\n  getRegisterUrl,\n  getApiUrl,\n  getWsUrl,\n};\n"
  },
  {
    "path": "common/demo.scss",
    "content": ".u-block {\n  padding: 14px;\n  &__section {\n    margin-bottom: 10px;\n  }\n  &__title {\n    margin-top: 10px;\n    font-size: 15px;\n    color: $u-content-color;\n    margin-bottom: 10px;\n  }\n  &__flex {\n    /* #ifndef APP-NVUE */\n    display: flex;\n    /* #endif */\n  }\n}\n\n// 使用了cell组件的icon图片样式\n.u-cell-icon {\n  width: 36rpx;\n  height: 36rpx;\n  margin-right: 8rpx;\n}\n\n.u-page {\n  padding: 15px 15px 40px 15px;\n}\n\n.u-demo-block {\n  flex: 1;\n  margin-bottom: 23px;\n\n  &__content {\n    @include flex(column);\n  }\n\n  &__title {\n    font-size: 14px;\n    color: rgb(143, 156, 162);\n    margin-bottom: 8px;\n    @include flex;\n  }\n}\n"
  },
  {
    "path": "common/emojis.js",
    "content": "export const emojis = [\n  \"😀\",\n  \"😃\",\n  \"😄\",\n  \"😁\",\n  \"😆\",\n  \"😅\",\n  \"🤣\",\n  \"😂\",\n  \"🙂\",\n  \"🙃\",\n  \"😉\",\n  \"😊\",\n  \"😇\",\n  \"🥰\",\n  \"😍\",\n  \"🤩\",\n  \"😘\",\n  \"😗\",\n  \"😚\",\n  \"😙\",\n  \"😋\",\n  \"😛\",\n  \"😜\",\n  \"🤪\",\n  \"😝\",\n  \"🤑\",\n  \"🤗\",\n  \"🤭\",\n  \"🤫\",\n  \"🤔\",\n];\n\nexport default emojis;\n"
  },
  {
    "path": "common/mixin.js",
    "content": "export default {\n  data() {\n    return {};\n  },\n};\n"
  },
  {
    "path": "common/props.js",
    "content": "uni.$u.props.gap.bgColor = \"#f3f4f6\";\nuni.$u.props.gap.height = \"10\";\n"
  },
  {
    "path": "components/AreaPicker/areaCode.js",
    "content": "export const areaCode = [\n  { label: \"中国\", value: \"86\" },\n  { label: \"马来西亚\", value: \"60\" },\n  { label: \"印度尼西亚\", value: \"62\" },\n  { label: \"菲律宾\", value: \"63\" },\n  { label: \"新加坡\", value: \"65\" },\n  { label: \"泰国\", value: \"66\" },\n  { label: \"文莱\", value: \"673\" },\n  { label: \"日本\", value: \"81\" },\n  { label: \"韩国\", value: \"82\" },\n  { label: \"越南\", value: \"84\" },\n  { label: \"朝鲜\", value: \"850\" },\n  { label: \"香港(中国)\", value: \"852\" },\n  { label: \"澳门(中国)\", value: \"853\" },\n  { label: \"柬埔寨\", value: \"855\" },\n  { label: \"老挝\", value: \"856\" },\n  { label: \"台湾(中国)\", value: \"886\" },\n  { label: \"孟加拉国\", value: \"880\" },\n  { label: \"土耳其\", value: \"90\" },\n  { label: \"印度\", value: \"91\" },\n  { label: \"巴基斯坦\", value: \"92\" },\n  { label: \"阿富汗\", value: \"93\" },\n  { label: \"斯里兰卡\", value: \"94\" },\n  { label: \"缅甸\", value: \"95\" },\n  { label: \"马尔代夫\", value: \"960\" },\n  { label: \"黎巴嫩\", value: \"961\" },\n  { label: \"约旦\", value: \"962\" },\n  { label: \"叙利亚\", value: \"963\" },\n  { label: \"伊拉克\", value: \"964\" },\n  { label: \"科威特\", value: \"965\" },\n  { label: \"沙特阿拉伯\", value: \"966\" },\n  { label: \"阿曼\", value: \"968\" },\n  { label: \"以色列\", value: \"972\" },\n  { label: \"巴林\", value: \"973\" },\n  { label: \"卡塔尔\", value: \"974\" },\n  { label: \"不丹\", value: \"975\" },\n  { label: \"蒙古\", value: \"976\" },\n  { label: \"尼泊尔\", value: \"977\" },\n  { label: \"伊朗\", value: \"98\" },\n  { label: \"塞浦路斯\", value: \"357\" },\n  { label: \"巴勒斯坦\", value: \"970\" },\n  { label: \"阿联酋\", value: \"971\" },\n  { label: \"俄罗斯联邦\", value: \"7\" },\n  { label: \"希腊\", value: \"30\" },\n  { label: \"荷兰\", value: \"31\" },\n  { label: \"比利时\", value: \"32\" },\n  { label: \"法国\", value: \"33\" },\n  { label: \"西班牙\", value: \"34\" },\n  { label: \"直布罗陀\", value: \"350\" },\n  { label: \"葡萄牙\", value: \"351\" },\n  { label: \"卢森堡\", value: \"352\" },\n  { label: \"爱尔兰\", value: \"353\" },\n  { label: \"冰岛\", value: \"354\" },\n  { label: \"阿尔巴尼亚\", value: \"355\" },\n  { label: \"马耳他\", value: \"356\" },\n  { label: \"安道尔\", value: \"376\" },\n  { label: \"芬兰\", value: \"358\" },\n  { label: \"保加利亚\", value: \"359\" },\n  { label: \"匈牙利\", value: \"36\" },\n  { label: \"德国\", value: \"49\" },\n  { label: \"南斯拉夫\", value: \"381\" },\n  { label: \"意大利\", value: \"39\" },\n  { label: \"圣马力诺\", value: \"378\" },\n  { label: \"梵蒂冈\", value: \"3906698\" },\n  { label: \"罗马尼亚\", value: \"40\" },\n  { label: \"瑞士\", value: \"41\" },\n  { label: \"列支敦士登\", value: \"423\" },\n  { label: \"奥地利\", value: \"43\" },\n  { label: \"英国\", value: \"44\" },\n  { label: \"丹麦\", value: \"45\" },\n  { label: \"瑞典\", value: \"46\" },\n  { label: \"挪威\", value: \"47\" },\n  { label: \"波兰\", value: \"48\" },\n  { label: \"捷克\", value: \"420\" },\n  { label: \"斯洛伐克\", value: \"421\" },\n  { label: \"摩纳哥\", value: \"377\" },\n  { label: \"马其顿\", value: \"389\" },\n  { label: \"科罗地亚\", value: \"385\" },\n  { label: \"斯洛文尼亚\", value: \"386\" },\n  { label: \"波斯尼亚和塞哥维那\", value: \"387\" },\n  { label: \"亚美尼亚共和国\", value: \"374\" },\n  { label: \"白俄罗斯共和国\", value: \"375\" },\n  { label: \"格鲁吉亚共和国\", value: \"995\" },\n  { label: \"哈萨克斯坦共和国\", value: \"7\" },\n  { label: \"吉尔吉斯坦共和国\", value: \"996\" },\n  { label: \"乌兹别克斯坦共和国\", value: \"998\" },\n  { label: \"塔吉克斯坦共和国\", value: \"992\" },\n  { label: \"土库曼斯坦共和国\", value: \"993\" },\n  { label: \"乌克兰\", value: \"380\" },\n  { label: \"立陶宛\", value: \"370\" },\n  { label: \"拉脱维亚\", value: \"371\" },\n  { label: \"爱沙尼亚\", value: \"372\" },\n  { label: \"摩尔多瓦\", value: \"373\" },\n  { label: \"埃及\", value: \"20\" },\n  { label: \"摩洛哥\", value: \"212\" },\n  { label: \"阿尔及利亚\", value: \"213\" },\n  { label: \"突尼斯\", value: \"216\" },\n  { label: \"利比亚\", value: \"218\" },\n  { label: \"冈比亚\", value: \"220\" },\n  { label: \"塞内加尔\", value: \"221\" },\n  { label: \"毛里塔尼亚\", value: \"222\" },\n  { label: \"马里\", value: \"223\" },\n  { label: \"几内亚\", value: \"224\" },\n  { label: \"科特迪瓦\", value: \"225\" },\n  { label: \"布基拉法索\", value: \"226\" },\n  { label: \"尼日尔\", value: \"227\" },\n  { label: \"多哥\", value: \"228\" },\n  { label: \"贝宁\", value: \"229\" },\n  { label: \"毛里求斯\", value: \"230\" },\n  { label: \"利比里亚\", value: \"231\" },\n  { label: \"塞拉利昂\", value: \"232\" },\n  { label: \"加纳\", value: \"233\" },\n  { label: \"尼日利亚\", value: \"234\" },\n  { label: \"乍得\", value: \"235\" },\n  { label: \"中非\", value: \"236\" },\n  { label: \"喀麦隆\", value: \"237\" },\n  { label: \"佛得角\", value: \"238\" },\n  { label: \"圣多美\", value: \"239\" },\n  { label: \"普林西比\", value: \"239\" },\n];\n"
  },
  {
    "path": "components/AreaPicker/index.vue",
    "content": "<template>\n  <u-picker\n    :show=\"show\"\n    :defaultIndex=\"defaultIndex\"\n    :columns=\"columns\"\n    keyName=\"label\"\n    @cancel=\"cancel\"\n    @confirm=\"confirm\"\n  />\n</template>\n\n<script>\nimport { areaCode } from \"./areaCode\";\nexport default {\n  data() {\n    return {\n      show: false,\n      defaultIndex: [0],\n    };\n  },\n  methods: {\n    init() {\n      this.show = true;\n    },\n    confirm({ value }) {\n      const item = value[0];\n      this.$emit(\"chooseArea\", item.value);\n      this.show = false;\n    },\n    cancel() {\n      this.show = false;\n    },\n  },\n  computed: {\n    columns() {\n      const list = areaCode.map((i) => {\n        return { label: `${i.label} +${i.value}`, value: i.value };\n      });\n      return [list];\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped></style>\n"
  },
  {
    "path": "components/ChooseIndexFooter/SelectedMember.vue",
    "content": "<template>\n  <view class=\"selected_item\">\n    <view class=\"left_info\">\n      <my-avatar\n        :src=\"source.faceURL\"\n        :desc=\"source.nickname || source.showName\"\n        :isGroup=\"Boolean(source.groupID)\"\n        size=\"42\"\n      />\n      <text>{{ source.nickname || source.groupName || source.showName }}</text>\n    </view>\n    <view>\n      <u-button @click=\"action\" plain text=\"移除\" type=\"primary\" />\n    </view>\n  </view>\n</template>\n\n<script>\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nexport default {\n  name: \"\",\n  components: {\n    MyAvatar,\n  },\n  props: {\n    source: Object,\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    action() {\n      this.$emit(\"removeItem\");\n    },\n  },\n  mounted() {\n    console.log(this.source);\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.selected_item {\n  @include btwBox();\n  padding: 20rpx 0;\n\n  .left_info {\n    @include vCenterBox();\n\n    .u-avatar {\n      margin-right: 24rpx;\n    }\n  }\n\n  .u-button {\n    height: 48rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "components/ChooseIndexFooter/index.vue",
    "content": "<template>\n  <view class=\"member_checked_desc\">\n    <view @click=\"showSelected = true\" class=\"left_info\">\n      <view class=\"select_num\">\n        <text class=\"text\">{{ `已选择(${choosedData.length})` }}</text>\n        <u-icon name=\"arrow-up\" size=\"14\" color=\"#007aff\" />\n      </view>\n      <view class=\"select_list\">{{ selectedStr }}</view>\n    </view>\n    <view class=\"\">\n      <u-button\n        :loading=\"comfirmLoading\"\n        @click=\"clickComfirm\"\n        :disabled=\"choosedData.length === 0\"\n        type=\"primary\"\n        :text=\"\n          isRemove\n            ? '移除'\n            : `确定(${choosedData.length}${\n                maxLength > 0 ? `/${maxLength}` : ``\n              })`\n        \"\n      />\n      <u-popup round=\"24\" :show=\"showSelected\" mode=\"bottom\" @close=\"close\">\n        <view class=\"selected_container\">\n          <view class=\"top_desc\">\n            <text>{{ `已选择(${choosedData.length})` }}</text>\n            <text @click=\"close\" class=\"comfirm_text\">确认</text>\n          </view>\n          <u-list class=\"selected_list\">\n            <u-list-item\n              v-for=\"item in choosedData\"\n              :key=\"item.userID || item.groupID\"\n            >\n              <selected-member @removeItem=\"removeItem(item)\" :source=\"item\" />\n            </u-list-item>\n          </u-list>\n        </view>\n      </u-popup>\n    </view>\n  </view>\n</template>\n\n<script>\nimport SelectedMember from \"./SelectedMember.vue\";\nexport default {\n  name: \"ChooseIndexFooter\",\n  components: {\n    SelectedMember,\n  },\n  props: {\n    isRemove: Boolean,\n    choosedData: Array,\n    comfirmLoading: Boolean,\n    maxLength: Number,\n  },\n  data() {\n    return {\n      showSelected: false,\n      showConfirmModal: false,\n    };\n  },\n  computed: {\n    selectedStr() {\n      return this.choosedData\n        .map((item) => item.nickname || item.showName || item.groupName)\n        .join(\"、\");\n    },\n  },\n  methods: {\n    close() {\n      this.showSelected = false;\n    },\n    removeItem(item) {\n      this.$emit(\"removeItem\", item);\n    },\n    clickComfirm() {\n      this.$emit(\"confirm\");\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.member_checked_desc {\n  @include btwBox();\n  background-color: #fff;\n  align-items: flex-start;\n  padding: 24rpx 44rpx 0;\n  height: 60px;\n  max-height: 60px;\n  box-shadow: 0px -1px 4px 1px rgba(0, 0, 0, 0.04);\n\n  .left_info {\n    @include colBox(false);\n\n    .select_num {\n      display: flex;\n      align-items: center;\n      color: $uni-color-primary;\n    }\n\n    .select_list {\n      font-size: 24rpx;\n      color: #8e9ab0;\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      max-width: 50vw;\n    }\n\n    .text {\n      font-size: 30rpx;\n      margin-right: 24rpx;\n    }\n  }\n\n  .u-button {\n    background-color: #0089ff;\n    height: 40px;\n    margin: 0;\n  }\n}\n\n.selected_container {\n  padding: 44rpx;\n\n  .top_desc {\n    @include btwBox();\n    margin-bottom: 20rpx;\n\n    .comfirm_text {\n      color: $uni-color-primary;\n      margin-right: 24rpx;\n    }\n  }\n\n  .selected_list {\n    height: 60vh !important;\n    overflow-y: auto;\n  }\n}\n</style>\n"
  },
  {
    "path": "components/ChooseIndexList/index.vue",
    "content": "<template>\n  <u-index-list\n    @scrolltolower=\"scrolltolower\"\n    class=\"user_list\"\n    :style=\"{ height: height }\"\n    :index-list=\"indexList\"\n  >\n    <template v-for=\"(item, index) in itemArr\">\n      <u-index-item :key=\"index\">\n        <u-index-anchor\n          class=\"user_anchor\"\n          :text=\"indexList[index]\"\n        ></u-index-anchor>\n        <user-item\n          @itemClick=\"itemClick\"\n          @updateCheck=\"updateCheck\"\n          :checked=\"checkedIDList.includes(cell.userID)\"\n          :disabled=\"disabledIDList.includes(cell.userID)\"\n          :checkVisible=\"showCheck\"\n          v-for=\"cell in item\"\n          :item=\"cell\"\n          :key=\"cell.userID\"\n        />\n      </u-index-item>\n    </template>\n  </u-index-list>\n</template>\n\n<script>\nimport UserItem from \"../UserItem/index.vue\";\nexport default {\n  name: \"ChooseIndexList\",\n  components: {\n    UserItem,\n  },\n  props: {\n    height: {\n      type: String,\n      default: \"0px\",\n    },\n    indexList: {\n      type: Array,\n      default: () => [],\n    },\n    itemArr: {\n      type: Array,\n      default: () => [],\n    },\n    checkedIDList: {\n      type: Array,\n      default: () => [],\n    },\n    disabledIDList: {\n      type: Array,\n      default: () => [],\n    },\n    showCheck: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    itemClick(item) {\n      this.$emit(\"itemClick\", item);\n    },\n    updateCheck(item) {\n      this.$emit(\"updateCheck\", item);\n    },\n    scrolltolower() {\n      this.$emit(\"scrolltolower\");\n    },\n  },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.user_list {\n  flex: 1;\n  /deep/uni-scroll-view {\n    max-height: 100% !important;\n  }\n}\n\n.user_anchor {\n  background-color: #f8f8f8 !important;\n  border: none !important;\n}\n</style>\n"
  },
  {
    "path": "components/CustomNavBar/index.vue",
    "content": "<template>\n  <u-navbar :title=\"title\" placeholder class=\"custom_nav_bar\">\n    <template slot=\"left\">\n      <slot name=\"left\">\n        <view class=\"u-nav-slot\">\n          <img\n            @click=\"leftClick\"\n            class=\"back_icon\"\n            width=\"12\"\n            height=\"20\"\n            src=\"static/images/common_left_arrow.png\"\n            alt=\"\"\n            srcset=\"\"\n          />\n        </view>\n      </slot>\n    </template>\n\n    <template slot=\"center\">\n      <slot name=\"center\"></slot>\n    </template>\n\n    <template slot=\"right\">\n      <slot name=\"more\">\n        <view @click=\"rightClick\" v-if=\"more\" class=\"u-nav-slot\">\n          <u-icon\n            class=\"more_dot\"\n            name=\"more-dot-fill\"\n            size=\"23\"\n            color=\"#0C1C33\"\n          ></u-icon>\n        </view>\n      </slot>\n    </template>\n  </u-navbar>\n</template>\n\n<script>\nexport default {\n  name: \"\",\n  components: {},\n  props: {\n    title: {\n      type: String,\n    },\n    more: {\n      type: Boolean,\n      default: false,\n    },\n    route: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    leftClick() {\n      if (this.route) {\n        uni.navigateBack();\n      }\n      this.$emit(\"leftClick\");\n    },\n    rightClick() {\n      this.$emit(\"rightClick\");\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.custom_nav_bar {\n  /deep/ .u-navbar__content__left {\n    padding: 0;\n  }\n\n  /deep/ .u-navbar__content__right {\n    padding: 0;\n  }\n\n  .back_icon {\n    padding: 24rpx;\n    margin-left: 20rpx;\n  }\n\n  .more_dot {\n    padding: 24rpx;\n    margin-right: 20rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "components/MyAvatar/index.vue",
    "content": "<template>\n  <u-avatar\n    @longpress=\"longpress\"\n    @click=\"click\"\n    @onError=\"errorHandle\"\n    :src=\"getAvatarUrl\"\n    :text=\"avatarText\"\n    bgColor=\"#0089FF\"\n    :defaultUrl=\"getDdefaultUrl\"\n    :shape=\"shape\"\n    :size=\"size\"\n    mode=\"aspectFill\"\n    font-size=\"14\"\n  >\n  </u-avatar>\n</template>\n\n<script>\nimport defaultGroupIcon from \"static/images/contact_my_group.png\";\nimport defaultNotifyIcon from \"static/images/default_notify_icon.png\";\nexport default {\n  name: \"MyAvatar\",\n  props: {\n    src: String,\n    shape: {\n      type: String,\n      default: \"square\",\n    },\n    size: {\n      type: String,\n      default: \"40\",\n    },\n    isGroup: {\n      type: Boolean,\n      default: false,\n    },\n    isNotify: {\n      type: Boolean,\n      default: false,\n    },\n\n    desc: String,\n  },\n  data() {\n    return {\n      avatarText: undefined,\n    };\n  },\n  computed: {\n    getAvatarUrl() {\n      if (this.src) {\n        return this.src;\n      }\n      if (this.isGroup) {\n        return defaultGroupIcon;\n      }\n      if (this.isNotify) {\n        return defaultNotifyIcon;\n      }\n      this.avatarText = this.desc ? this.desc.slice(0, 1) : \"未知\";\n      return \"\";\n    },\n    getDdefaultUrl() {\n      return this.isGroup ? defaultGroupIcon : undefined;\n    },\n  },\n  methods: {\n    errorHandle() {\n      this.avatarText = this.desc ? this.desc.slice(0, 1) : \"未知\";\n    },\n    redirectShow() {\n      if (this.avatarText) {\n        this.avatarText = undefined;\n      }\n    },\n    click() {\n      this.$emit(\"click\");\n    },\n    longpress() {\n      this.$emit(\"longpress\");\n    },\n  },\n  watch: {\n    src() {\n      this.redirectShow();\n    },\n    desc() {\n      this.redirectShow();\n    },\n  },\n};\n</script>\n\n<style></style>\n"
  },
  {
    "path": "components/SettingItem/index.vue",
    "content": "<template>\n  <view\n    @click=\"onClick\"\n    class=\"setting_item\"\n    :class=\"{ setting_item_border: border }\"\n  >\n    <text :style=\"{ color: danger ? '#FF381F' : '$uni-text-color' }\">{{\n      title\n    }}</text>\n    <u-switch\n      :loading=\"loading\"\n      @change=\"onChange\"\n      :asyncChange=\"true\"\n      v-if=\"is_switch\"\n      size=\"20\"\n      :value=\"switchValue\"\n    />\n    <view v-else class=\"setting_right\">\n      <slot></slot>\n      <u-icon v-if=\"arrow\" name=\"arrow-right\" color=\"#999\" size=\"18\" />\n    </view>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"\",\n  components: {},\n  props: {\n    title: String,\n    danger: {\n      type: Boolean,\n      default: false,\n    },\n    is_switch: {\n      type: Boolean,\n      default: false,\n    },\n    switchValue: {\n      type: Boolean,\n      default: false,\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n    border: {\n      type: Boolean,\n      default: true,\n    },\n    arrow: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    onClick() {\n      this.$emit(\"click\");\n    },\n    onChange(value) {\n      this.$emit(\"switch\", value);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.setting_item {\n  @include btwBox();\n  padding: 24rpx 36rpx;\n  color: $uni-text-color;\n\n  .setting_right {\n    @include vCenterBox();\n  }\n\n  &_border {\n    border-bottom: 1px solid rgba(153, 153, 153, 0.2);\n  }\n}\n</style>\n"
  },
  {
    "path": "components/UserItem/index.vue",
    "content": "<template>\n  <view @click=\"clickItem\" class=\"user_item\">\n    <view\n      v-if=\"checkVisible\"\n      class=\"check_wrap\"\n      :class=\"{ check_wrap_active: checked, check_wrap_disabled: disabled }\"\n    >\n      <u-icon v-show=\"checked\" name=\"checkbox-mark\" size=\"12\" color=\"#fff\" />\n    </view>\n\n    <my-avatar\n      :src=\"item.faceURL\"\n      :desc=\"item.remark || item.nickname || item.showName\"\n      :isGroup=\"item.groupName !== undefined || isGroupConversation\"\n      size=\"42\"\n    />\n    <view class=\"user_item_details\">\n      <text class=\"user_name\">{{\n        item.remark || item.nickname || item.groupName || item.showName\n      }}</text>\n      <text v-if=\"item.roleLevel === 100\" class=\"user_role\">群主</text>\n      <text v-if=\"item.roleLevel === 60\" class=\"user_role admin_role\"\n        >管理员</text\n      >\n      <!-- <view class=\"bottom_line\" /> -->\n    </view>\n\n    <slot name=\"action\"></slot>\n  </view>\n</template>\n\n<script>\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport { SessionType } from \"openim-uniapp-polyfill\";\nexport default {\n  name: \"UserItem\",\n  components: {\n    MyAvatar,\n  },\n  props: {\n    checkVisible: {\n      type: Boolean,\n      default: false,\n    },\n    checked: {\n      type: Boolean,\n      default: false,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    item: Object,\n  },\n  data() {\n    return {};\n  },\n  computed: {\n    isGroupConversation() {\n      return this.item.conversationType === SessionType.WorkingGroup;\n    },\n  },\n  methods: {\n    clickItem() {\n      if (!this.disabled) {\n        this.$emit(this.checkVisible ? \"updateCheck\" : \"itemClick\", this.item);\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.user_item {\n  @include vCenterBox();\n  padding: 24rpx 44rpx;\n  color: $uni-text-color;\n  position: relative;\n\n  .check_wrap {\n    @include centerBox();\n    box-sizing: border-box;\n    width: 40rpx;\n    min-width: 40rpx;\n    height: 40rpx;\n    min-height: 40rpx;\n    border: 2px solid #979797;\n    border-radius: 50%;\n    margin-top: 16rpx;\n    margin-right: 24rpx;\n\n    &_active {\n      background-color: #1d6bed;\n      border: none;\n    }\n\n    &_disabled {\n      background-color: #c8c9cc;\n    }\n  }\n\n  &_details {\n    @include vCenterBox();\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n    margin-left: 24rpx;\n    width: 100%;\n    position: relative;\n\n    .bottom_line {\n      height: 1px;\n      width: 100%;\n      background-color: #f0f0f0;\n      position: absolute;\n      bottom: -44rpx;\n    }\n\n    .user_name {\n      @include nomalEllipsis();\n      max-width: 60%;\n      color: $uni-text-color;\n    }\n\n    .user_role {\n      font-size: 34rpx;\n      // background-color: #f4da9a;\n      // color: #FF8C00;\n      padding: 8rpx 24rpx;\n      border-radius: 24rpx;\n      margin-left: 24rpx;\n      color: $u-tips-color;\n    }\n\n    .admin_role {\n      color: $u-tips-color;\n      // background-color: #A2C9F8;\n      // color: #2691ED;\n    }\n  }\n}\n\n.u-list-item:last-child {\n  .bottom_line {\n    height: 0;\n  }\n}\n</style>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseAudio.vue",
    "content": "<template>\n  <!-- '<audio/>' 组件不再维护，建议使用能力更强的 'uni.createInnerAudioContext' 接口 有时间再改-->\n  <!--增加audio标签支持-->\n  <audio\n    :id=\"node.attr.id\"\n    :class=\"node.classStr\"\n    :style=\"node.styleStr\"\n    :src=\"node.attr.src\"\n    :loop=\"node.attr.loop\"\n    :poster=\"node.attr.poster\"\n    :name=\"node.attr.name\"\n    :author=\"node.attr.author\"\n    controls\n  ></audio>\n</template>\n\n<script>\nexport default {\n  name: \"wxParseAudio\",\n  props: {\n    node: {\n      type: Object,\n      default() {\n        return {};\n      },\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseImg.vue",
    "content": "<template>\n  <image\n    :mode=\"node.attr.mode\"\n    :lazy-load=\"node.attr.lazyLoad\"\n    :class=\"node.classStr\"\n    :style=\"newStyleStr || node.styleStr\"\n    :data-src=\"node.attr.src\"\n    :src=\"node.attr.src\"\n    @tap=\"wxParseImgTap\"\n    @load=\"wxParseImgLoad\"\n  />\n</template>\n\n<script>\nexport default {\n  name: \"wxParseImg\",\n  data() {\n    return {\n      newStyleStr: \"\",\n      preview: false,\n    };\n  },\n  inject: [\"parseWidth\"],\n  mounted() {},\n  props: {\n    node: {\n      type: Object,\n      default() {\n        return {};\n      },\n    },\n  },\n\n  methods: {\n    wxParseImgTap(e) {\n      if (!this.preview) return;\n      const { src } = e.currentTarget.dataset;\n      if (!src) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        // TODO 遍历获取父节点执行方法\n        parent = parent.$parent;\n      }\n      parent.preview(src, e);\n    },\n    // 图片视觉宽高计算函数区\n    wxParseImgLoad(e) {\n      const { src } = e.currentTarget.dataset;\n      if (!src) return;\n      let { width, height } = e.mp.detail;\n\n      const recal = this.wxAutoImageCal(width, height);\n\n      const { imageheight, imageWidth } = recal;\n      const { padding, mode } = this.node.attr; //删除padding\n      // const { mode } = this.node.attr;\n\n      const { styleStr } = this.node;\n      const imageHeightStyle =\n        mode === \"widthFix\" ? \"\" : `height: ${imageheight}px;`;\n\n      this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px; padding: 0 ${+padding}px;`; //删除padding\n      // this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px;`;\n    },\n    // 计算视觉优先的图片宽高\n    wxAutoImageCal(originalWidth, originalHeight) {\n      // 获取图片的原始长宽\n      const windowWidth = this.parseWidth.value;\n      const results = {};\n\n      if (originalWidth < 60 || originalHeight < 60) {\n        const { src } = this.node.attr;\n        let parent = this.$parent;\n        while (!parent.preview || typeof parent.preview !== \"function\") {\n          parent = parent.$parent;\n        }\n        parent.removeImageUrl(src);\n        this.preview = false;\n      }\n\n      // 判断按照那种方式进行缩放\n      if (originalWidth > windowWidth) {\n        // 在图片width大于手机屏幕width时候\n        results.imageWidth = windowWidth;\n        results.imageheight = windowWidth * (originalHeight / originalWidth);\n      } else {\n        // 否则展示原来的数据\n        results.imageWidth = originalWidth;\n        results.imageheight = originalHeight;\n      }\n      return results;\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTable.vue",
    "content": "<template>\n  <div class=\"tablebox\">\n    <rich-text\n      :nodes=\"nodes\"\n      :class=\"node.classStr\"\n      :style=\"'user-select:' + parseSelect\"\n    ></rich-text>\n  </div>\n</template>\n<script>\nexport default {\n  name: \"wxParseTable\",\n  props: {\n    node: {\n      type: Object,\n      default() {\n        return {};\n      },\n    },\n  },\n  inject: [\"parseSelect\"],\n  data() {\n    return {\n      nodes: [],\n    };\n  },\n  mounted() {\n    this.nodes = this.loadNode([this.node]);\n  },\n  methods: {\n    loadNode(node) {\n      let obj = [];\n      for (let children of node) {\n        if (children.node == \"element\") {\n          let t = {\n            name: children.tag,\n            attrs: {\n              class: children.classStr,\n              // style: children.styleStr,\n            },\n            children: children.nodes ? this.loadNode(children.nodes) : [],\n          };\n\n          obj.push(t);\n        } else if (children.node == \"text\") {\n          obj.push({\n            type: \"text\",\n            text: children.text,\n          });\n        }\n      }\n      return obj;\n    },\n  },\n};\n</script>\n<style>\n@import url(\"../parse.css\");\n</style>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate0.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\n// #ifdef APP-PLUS | H5\nimport wxParseTemplate from \"./wxParseTemplate0\";\n// #endif\n// #ifdef MP\nimport wxParseTemplate from \"./wxParseTemplate1\";\n// #endif\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  // #ifdef APP-PLUS | H5\n  name: \"wxParseTemplate\",\n  // #endif\n  // #ifdef MP\n  name: \"wxParseTemplate0\",\n  // #endif\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset; // TODO currentTarget才有dataset\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        // TODO 遍历获取父节点执行方法\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate1.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate2\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate1\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate10.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate11\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate10\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate11.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <rich-text\n        :nodes=\"node\"\n        :class=\"node.classStr\"\n        :style=\"'user-select:' + parseSelect\"\n      ></rich-text>\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <rich-text\n          :nodes=\"node\"\n          :class=\"node.classStr\"\n          :style=\"'user-select:' + parseSelect\"\n        ></rich-text>\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <rich-text\n          :nodes=\"node\"\n          :class=\"node.classStr\"\n          :style=\"'user-select:' + parseSelect\"\n        ></rich-text>\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img :node=\"node\" v-else-if=\"node.tag == 'img'\" />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <rich-text\n          :nodes=\"node\"\n          :class=\"node.classStr\"\n          :style=\"'user-select:' + parseSelect\"\n        ></rich-text>\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate11\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate2.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate3\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate2\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate3.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate4\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate3\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate4.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate5\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate4\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate5.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate6\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate5\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate6.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate7\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate6\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate7.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate8\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate7\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate8.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate9\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate8\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseTemplate9.vue",
    "content": "<template>\n  <!--判断是否是标签节点-->\n  <block v-if=\"node.node == 'element'\">\n    <!--button类型-->\n    <button\n      v-if=\"node.tag == 'button'\"\n      type=\"default\"\n      size=\"mini\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <wx-parse-template :node=\"node\" />\n    </button>\n\n    <!--a类型-->\n    <view\n      v-else-if=\"node.tag == 'a'\"\n      @click=\"wxParseATap(node.attr, $event)\"\n      :class=\"node.classStr\"\n      :data-href=\"node.attr.href\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--li类型-->\n    <view\n      v-else-if=\"node.tag == 'li'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n    >\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n\n    <!--table类型-->\n    <wx-parse-table\n      v-else-if=\"node.tag == 'table'\"\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      :node=\"node\"\n    />\n\n    <!--br类型-->\n    <!-- #ifndef H5 -->\n    <text v-else-if=\"node.tag == 'br'\">\\n</text>\n    <!-- #endif -->\n    <!-- #ifdef H5 -->\n    <br v-else-if=\"node.tag == 'br'\" />\n    <!-- #endif -->\n\n    <!--video类型-->\n    <wx-parse-video :node=\"node\" v-else-if=\"node.tag == 'video'\" />\n\n    <!--audio类型-->\n    <wx-parse-audio :node=\"node\" v-else-if=\"node.tag == 'audio'\" />\n\n    <!--img类型-->\n    <wx-parse-img\n      :node=\"node\"\n      v-else-if=\"node.tag == 'img'\"\n      :style=\"node.styleStr\"\n    />\n\n    <!--其他标签-->\n    <view v-else :class=\"node.classStr\" :style=\"node.styleStr\">\n      <block v-for=\"(node, index) of node.nodes\" :key=\"index\">\n        <wx-parse-template :node=\"node\" />\n      </block>\n    </view>\n  </block>\n\n  <!--判断是否是文本节点-->\n  <block v-else-if=\"node.node == 'text'\">{{ node.text }}</block>\n</template>\n\n<script>\nimport wxParseTemplate from \"./wxParseTemplate10\";\nimport wxParseImg from \"./wxParseImg\";\nimport wxParseVideo from \"./wxParseVideo\";\nimport wxParseAudio from \"./wxParseAudio\";\nimport wxParseTable from \"./wxParseTable\";\n\nexport default {\n  name: \"wxParseTemplate9\",\n  props: {\n    node: {},\n  },\n  components: {\n    wxParseTemplate,\n    wxParseImg,\n    wxParseVideo,\n    wxParseAudio,\n    wxParseTable,\n  },\n  methods: {\n    wxParseATap(attr, e) {\n      const { href } = e.currentTarget.dataset;\n      if (!href) return;\n      let parent = this.$parent;\n      while (!parent.preview || typeof parent.preview !== \"function\") {\n        parent = parent.$parent;\n      }\n      parent.navigate(href, e, attr);\n    },\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/components/wxParseVideo.vue",
    "content": "<template>\n  <!--增加video标签支持，并循环添加-->\n  <view :class=\"node.classStr\" :style=\"node.styleStr\">\n    <video\n      :class=\"node.classStr\"\n      :style=\"node.styleStr\"\n      class=\"video-video\"\n      :src=\"node.attr.src\"\n    ></video>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"wxParseVideo\",\n  props: {\n    node: {},\n  },\n};\n</script>\n"
  },
  {
    "path": "components/gaoyia-parse/libs/html2json.js",
    "content": "/**\n * html2Json 改造来自: https://github.com/Jxck/html2json\n *\n *\n * author: Di (微信小程序开发工程师)\n * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)\n *               垂直微信小程序开发交流社区\n *\n * github地址: https://github.com/icindy/wxParse\n *\n * for: 微信小程序富文本解析\n * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184\n */\n\nimport wxDiscode from \"./wxDiscode\";\nimport HTMLParser from \"./htmlparser\";\n\nfunction makeMap(str) {\n  const obj = {};\n  const items = str.split(\",\");\n  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;\n  return obj;\n}\n\n// Block Elements - HTML 5\nconst block = makeMap(\n  \"br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video\",\n);\n\n// Inline Elements - HTML 5\nconst inline = makeMap(\n  \"a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var\",\n);\n\n// Elements that you can, intentionally, leave open\n// (and which close themselves)\nconst closeSelf = makeMap(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr\");\n\nfunction removeDOCTYPE(html) {\n  const isDocument = /<body.*>([^]*)<\\/body>/.test(html);\n  return isDocument ? RegExp.$1 : html;\n}\n\nfunction trimHtml(html) {\n  return html\n    .replace(/<!--.*?-->/gi, \"\")\n    .replace(/\\/\\*.*?\\*\\//gi, \"\")\n    .replace(/[ ]+</gi, \"<\")\n    .replace(/<script[^]*<\\/script>/gi, \"\")\n    .replace(/<style[^]*<\\/style>/gi, \"\");\n}\n\nfunction getScreenInfo() {\n  const screen = {};\n  wx.getSystemInfo({\n    success: (res) => {\n      screen.width = res.windowWidth;\n      screen.height = res.windowHeight;\n    },\n  });\n  return screen;\n}\n\nfunction html2json(html, customHandler, imageProp, host) {\n  // 处理字符串\n  html = removeDOCTYPE(html);\n  html = trimHtml(html);\n  html = wxDiscode.strDiscode(html);\n  // 生成node节点\n  const bufArray = [];\n  const results = {\n    nodes: [],\n    imageUrls: [],\n  };\n\n  const screen = getScreenInfo();\n  function Node(tag) {\n    this.node = \"element\";\n    this.tag = tag;\n\n    this.$screen = screen;\n  }\n\n  HTMLParser(html, {\n    start(tag, attrs, unary) {\n      // node for this element\n      const node = new Node(tag);\n\n      if (bufArray.length !== 0) {\n        const parent = bufArray[0];\n        if (parent.nodes === undefined) {\n          parent.nodes = [];\n        }\n      }\n\n      if (block[tag]) {\n        node.tagType = \"block\";\n      } else if (inline[tag]) {\n        node.tagType = \"inline\";\n      } else if (closeSelf[tag]) {\n        node.tagType = \"closeSelf\";\n      }\n\n      node.attr = attrs.reduce((pre, attr) => {\n        const { name } = attr;\n        let { value } = attr;\n        if (name === \"class\") {\n          node.classStr = value;\n        }\n        // has multi attibutes\n        // make it array of attribute\n        if (name === \"style\") {\n          node.styleStr = value;\n        }\n        if (value.match(/ /)) {\n          value = value.split(\" \");\n        }\n\n        // if attr already exists\n        // merge it\n        if (pre[name]) {\n          if (Array.isArray(pre[name])) {\n            // already array, push to last\n            pre[name].push(value);\n          } else {\n            // single value, make it array\n            pre[name] = [pre[name], value];\n          }\n        } else {\n          // not exist, put it\n          pre[name] = value;\n        }\n\n        return pre;\n      }, {});\n\n      // 优化样式相关属性\n      if (node.classStr) {\n        node.classStr += ` ${node.tag}`;\n      } else {\n        node.classStr = node.tag;\n      }\n      if (node.tagType === \"inline\") {\n        node.classStr += \" inline\";\n      }\n\n      // 对img添加额外数据\n      if (node.tag === \"img\") {\n        let imgUrl = node.attr.src;\n        imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);\n        Object.assign(node.attr, imageProp, {\n          src: imgUrl || \"\",\n        });\n        if (imgUrl) {\n          results.imageUrls.push(imgUrl);\n        }\n      }\n\n      // 处理a标签属性\n      if (node.tag === \"a\") {\n        node.attr.href = node.attr.href || \"\";\n      }\n\n      // 处理font标签样式属性\n      if (node.tag === \"font\") {\n        const fontSize = [\n          \"x-small\",\n          \"small\",\n          \"medium\",\n          \"large\",\n          \"x-large\",\n          \"xx-large\",\n          \"-webkit-xxx-large\",\n        ];\n        const styleAttrs = {\n          color: \"color\",\n          face: \"font-family\",\n          size: \"font-size\",\n        };\n        if (!node.styleStr) node.styleStr = \"\";\n        Object.keys(styleAttrs).forEach((key) => {\n          if (node.attr[key]) {\n            const value =\n              key === \"size\" ? fontSize[node.attr[key] - 1] : node.attr[key];\n            node.styleStr += `${styleAttrs[key]}: ${value};`;\n          }\n        });\n      }\n\n      // 临时记录source资源\n      if (node.tag === \"source\") {\n        results.source = node.attr.src;\n      }\n\n      if (customHandler.start) {\n        customHandler.start(node, results);\n      }\n\n      if (unary) {\n        // if this tag doesn't have end tag\n        // like <img src=\"hoge.png\"/>\n        // add to parents\n        const parent = bufArray[0] || results;\n        if (parent.nodes === undefined) {\n          parent.nodes = [];\n        }\n        parent.nodes.push(node);\n      } else {\n        bufArray.unshift(node);\n      }\n    },\n    end(tag) {\n      // merge into parent tag\n      const node = bufArray.shift();\n      if (node.tag !== tag) {\n        console.error(\"invalid state: mismatch end tag\");\n      }\n\n      // 当有缓存source资源时于于video补上src资源\n      if (node.tag === \"video\" && results.source) {\n        node.attr.src = results.source;\n        delete results.source;\n      }\n\n      if (customHandler.end) {\n        customHandler.end(node, results);\n      }\n\n      if (bufArray.length === 0) {\n        results.nodes.push(node);\n      } else {\n        const parent = bufArray[0];\n        if (!parent.nodes) {\n          parent.nodes = [];\n        }\n        parent.nodes.push(node);\n      }\n    },\n    chars(text) {\n      if (!text.trim()) return;\n\n      const node = {\n        node: \"text\",\n        text,\n      };\n\n      if (customHandler.chars) {\n        customHandler.chars(node, results);\n      }\n\n      if (bufArray.length === 0) {\n        results.nodes.push(node);\n      } else {\n        const parent = bufArray[0];\n        if (parent.nodes === undefined) {\n          parent.nodes = [];\n        }\n        parent.nodes.push(node);\n      }\n    },\n  });\n\n  return results;\n}\n\nexport default html2json;\n"
  },
  {
    "path": "components/gaoyia-parse/libs/htmlparser.js",
    "content": "/**\n *\n * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser\n *\n * author: Di (微信小程序开发工程师)\n * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)\n *               垂直微信小程序开发交流社区\n *\n * github地址: https://github.com/icindy/wxParse\n *\n * for: 微信小程序富文本解析\n * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184\n */\n// Regular Expressions for parsing tags and attributes\n\nconst startTag =\n  /^<([-A-Za-z0-9_]+)((?:\\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)>/;\nconst endTag = /^<\\/([-A-Za-z0-9_]+)[^>]*>/;\nconst attr =\n  /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\\s*=\\s*(?:(?:\"((?:\\\\.|[^\"])*)\")|(?:'((?:\\\\.|[^'])*)')|([^>\\s]+)))?/g;\n\nfunction makeMap(str) {\n  const obj = {};\n  const items = str.split(\",\");\n  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;\n  return obj;\n}\n\n// Empty Elements - HTML 5\nconst empty = makeMap(\n  \"area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr\",\n);\n\n// Block Elements - HTML 5\nconst block = makeMap(\n  \"address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video\",\n);\n\n// Inline Elements - HTML 5\nconst inline = makeMap(\n  \"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var\",\n);\n\n// Elements that you can, intentionally, leave open\n// (and which close themselves)\nconst closeSelf = makeMap(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr\");\n\n// Attributes that have their values filled in disabled=\"disabled\"\nconst fillAttrs = makeMap(\n  \"checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected\",\n);\n\nfunction HTMLParser(html, handler) {\n  let index;\n  let chars;\n  let match;\n  let last = html;\n  const stack = [];\n\n  stack.last = () => stack[stack.length - 1];\n\n  function parseEndTag(tag, tagName) {\n    // If no tag name is provided, clean shop\n    let pos;\n    if (!tagName) {\n      pos = 0;\n    } else {\n      // Find the closest opened tag of the same type\n      tagName = tagName.toLowerCase();\n      for (pos = stack.length - 1; pos >= 0; pos -= 1) {\n        if (stack[pos] === tagName) break;\n      }\n    }\n    if (pos >= 0) {\n      // Close all the open elements, up the stack\n      for (let i = stack.length - 1; i >= pos; i -= 1) {\n        if (handler.end) handler.end(stack[i]);\n      }\n\n      // Remove the open elements from the stack\n      stack.length = pos;\n    }\n  }\n\n  function parseStartTag(tag, tagName, rest, unary) {\n    tagName = tagName.toLowerCase();\n\n    if (block[tagName]) {\n      while (stack.last() && inline[stack.last()]) {\n        parseEndTag(\"\", stack.last());\n      }\n    }\n\n    if (closeSelf[tagName] && stack.last() === tagName) {\n      parseEndTag(\"\", tagName);\n    }\n\n    unary = empty[tagName] || !!unary;\n\n    if (!unary) stack.push(tagName);\n\n    if (handler.start) {\n      const attrs = [];\n\n      rest.replace(attr, function genAttr(matches, name) {\n        const value =\n          arguments[2] ||\n          arguments[3] ||\n          arguments[4] ||\n          (fillAttrs[name] ? name : \"\");\n\n        attrs.push({\n          name,\n          value,\n          escaped: value.replace(/(^|[^\\\\])\"/g, '$1\\\\\"'), // \"\n        });\n      });\n\n      if (handler.start) {\n        handler.start(tagName, attrs, unary);\n      }\n    }\n  }\n\n  while (html) {\n    chars = true;\n\n    if (html.indexOf(\"</\") === 0) {\n      match = html.match(endTag);\n\n      if (match) {\n        html = html.substring(match[0].length);\n        match[0].replace(endTag, parseEndTag);\n        chars = false;\n      }\n\n      // start tag\n    } else if (html.indexOf(\"<\") === 0) {\n      match = html.match(startTag);\n\n      if (match) {\n        html = html.substring(match[0].length);\n        match[0].replace(startTag, parseStartTag);\n        chars = false;\n      }\n    }\n\n    if (chars) {\n      index = html.indexOf(\"<\");\n      let text = \"\";\n      while (index === 0) {\n        text += \"<\";\n        html = html.substring(1);\n        index = html.indexOf(\"<\");\n      }\n      text += index < 0 ? html : html.substring(0, index);\n      html = index < 0 ? \"\" : html.substring(index);\n\n      if (handler.chars) handler.chars(text);\n    }\n\n    if (html === last) throw new Error(`Parse Error: ${html}`);\n    last = html;\n  }\n\n  // Clean up any remaining tags\n  parseEndTag();\n}\n\nexport default HTMLParser;\n"
  },
  {
    "path": "components/gaoyia-parse/libs/wxDiscode.js",
    "content": "// HTML 支持的数学符号\nfunction strNumDiscode(str) {\n  str = str.replace(/&forall;|&#8704;|&#x2200;/g, \"∀\");\n  str = str.replace(/&part;|&#8706;|&#x2202;/g, \"∂\");\n  str = str.replace(/&exist;|&#8707;|&#x2203;/g, \"∃\");\n  str = str.replace(/&empty;|&#8709;|&#x2205;/g, \"∅\");\n  str = str.replace(/&nabla;|&#8711;|&#x2207;/g, \"∇\");\n  str = str.replace(/&isin;|&#8712;|&#x2208;/g, \"∈\");\n  str = str.replace(/&notin;|&#8713;|&#x2209;/g, \"∉\");\n  str = str.replace(/&ni;|&#8715;|&#x220b;/g, \"∋\");\n  str = str.replace(/&prod;|&#8719;|&#x220f;/g, \"∏\");\n  str = str.replace(/&sum;|&#8721;|&#x2211;/g, \"∑\");\n  str = str.replace(/&minus;|&#8722;|&#x2212;/g, \"−\");\n  str = str.replace(/&lowast;|&#8727;|&#x2217;/g, \"∗\");\n  str = str.replace(/&radic;|&#8730;|&#x221a;/g, \"√\");\n  str = str.replace(/&prop;|&#8733;|&#x221d;/g, \"∝\");\n  str = str.replace(/&infin;|&#8734;|&#x221e;/g, \"∞\");\n  str = str.replace(/&ang;|&#8736;|&#x2220;/g, \"∠\");\n  str = str.replace(/&and;|&#8743;|&#x2227;/g, \"∧\");\n  str = str.replace(/&or;|&#8744;|&#x2228;/g, \"∨\");\n  str = str.replace(/&cap;|&#8745;|&#x2229;/g, \"∩\");\n  str = str.replace(/&cup;|&#8746;|&#x222a;/g, \"∪\");\n  str = str.replace(/&int;|&#8747;|&#x222b;/g, \"∫\");\n  str = str.replace(/&there4;|&#8756;|&#x2234;/g, \"∴\");\n  str = str.replace(/&sim;|&#8764;|&#x223c;/g, \"∼\");\n  str = str.replace(/&cong;|&#8773;|&#x2245;/g, \"≅\");\n  str = str.replace(/&asymp;|&#8776;|&#x2248;/g, \"≈\");\n  str = str.replace(/&ne;|&#8800;|&#x2260;/g, \"≠\");\n  str = str.replace(/&le;|&#8804;|&#x2264;/g, \"≤\");\n  str = str.replace(/&ge;|&#8805;|&#x2265;/g, \"≥\");\n  str = str.replace(/&sub;|&#8834;|&#x2282;/g, \"⊂\");\n  str = str.replace(/&sup;|&#8835;|&#x2283;/g, \"⊃\");\n  str = str.replace(/&nsub;|&#8836;|&#x2284;/g, \"⊄\");\n  str = str.replace(/&sube;|&#8838;|&#x2286;/g, \"⊆\");\n  str = str.replace(/&supe;|&#8839;|&#x2287;/g, \"⊇\");\n  str = str.replace(/&oplus;|&#8853;|&#x2295;/g, \"⊕\");\n  str = str.replace(/&otimes;|&#8855;|&#x2297;/g, \"⊗\");\n  str = str.replace(/&perp;|&#8869;|&#x22a5;/g, \"⊥\");\n  str = str.replace(/&sdot;|&#8901;|&#x22c5;/g, \"⋅\");\n  return str;\n}\n\n// HTML 支持的希腊字母\nfunction strGreeceDiscode(str) {\n  str = str.replace(/&Alpha;|&#913;|&#x391;/g, \"Α\");\n  str = str.replace(/&Beta;|&#914;|&#x392;/g, \"Β\");\n  str = str.replace(/&Gamma;|&#915;|&#x393;/g, \"Γ\");\n  str = str.replace(/&Delta;|&#916;|&#x394;/g, \"Δ\");\n  str = str.replace(/&Epsilon;|&#917;|&#x395;/g, \"Ε\");\n  str = str.replace(/&Zeta;|&#918;|&#x396;/g, \"Ζ\");\n  str = str.replace(/&Eta;|&#919;|&#x397;/g, \"Η\");\n  str = str.replace(/&Theta;|&#920;|&#x398;/g, \"Θ\");\n  str = str.replace(/&Iota;|&#921;|&#x399;/g, \"Ι\");\n  str = str.replace(/&Kappa;|&#922;|&#x39a;/g, \"Κ\");\n  str = str.replace(/&Lambda;|&#923;|&#x39b;/g, \"Λ\");\n  str = str.replace(/&Mu;|&#924;|&#x39c;/g, \"Μ\");\n  str = str.replace(/&Nu;|&#925;|&#x39d;/g, \"Ν\");\n  str = str.replace(/&Xi;|&#925;|&#x39d;/g, \"Ν\");\n  str = str.replace(/&Omicron;|&#927;|&#x39f;/g, \"Ο\");\n  str = str.replace(/&Pi;|&#928;|&#x3a0;/g, \"Π\");\n  str = str.replace(/&Rho;|&#929;|&#x3a1;/g, \"Ρ\");\n  str = str.replace(/&Sigma;|&#931;|&#x3a3;/g, \"Σ\");\n  str = str.replace(/&Tau;|&#932;|&#x3a4;/g, \"Τ\");\n  str = str.replace(/&Upsilon;|&#933;|&#x3a5;/g, \"Υ\");\n  str = str.replace(/&Phi;|&#934;|&#x3a6;/g, \"Φ\");\n  str = str.replace(/&Chi;|&#935;|&#x3a7;/g, \"Χ\");\n  str = str.replace(/&Psi;|&#936;|&#x3a8;/g, \"Ψ\");\n  str = str.replace(/&Omega;|&#937;|&#x3a9;/g, \"Ω\");\n\n  str = str.replace(/&alpha;|&#945;|&#x3b1;/g, \"α\");\n  str = str.replace(/&beta;|&#946;|&#x3b2;/g, \"β\");\n  str = str.replace(/&gamma;|&#947;|&#x3b3;/g, \"γ\");\n  str = str.replace(/&delta;|&#948;|&#x3b4;/g, \"δ\");\n  str = str.replace(/&epsilon;|&#949;|&#x3b5;/g, \"ε\");\n  str = str.replace(/&zeta;|&#950;|&#x3b6;/g, \"ζ\");\n  str = str.replace(/&eta;|&#951;|&#x3b7;/g, \"η\");\n  str = str.replace(/&theta;|&#952;|&#x3b8;/g, \"θ\");\n  str = str.replace(/&iota;|&#953;|&#x3b9;/g, \"ι\");\n  str = str.replace(/&kappa;|&#954;|&#x3ba;/g, \"κ\");\n  str = str.replace(/&lambda;|&#955;|&#x3bb;/g, \"λ\");\n  str = str.replace(/&mu;|&#956;|&#x3bc;/g, \"μ\");\n  str = str.replace(/&nu;|&#957;|&#x3bd;/g, \"ν\");\n  str = str.replace(/&xi;|&#958;|&#x3be;/g, \"ξ\");\n  str = str.replace(/&omicron;|&#959;|&#x3bf;/g, \"ο\");\n  str = str.replace(/&pi;|&#960;|&#x3c0;/g, \"π\");\n  str = str.replace(/&rho;|&#961;|&#x3c1;/g, \"ρ\");\n  str = str.replace(/&sigmaf;|&#962;|&#x3c2;/g, \"ς\");\n  str = str.replace(/&sigma;|&#963;|&#x3c3;/g, \"σ\");\n  str = str.replace(/&tau;|&#964;|&#x3c4;/g, \"τ\");\n  str = str.replace(/&upsilon;|&#965;|&#x3c5;/g, \"υ\");\n  str = str.replace(/&phi;|&#966;|&#x3c6;/g, \"φ\");\n  str = str.replace(/&chi;|&#967;|&#x3c7;/g, \"χ\");\n  str = str.replace(/&psi;|&#968;|&#x3c8;/g, \"ψ\");\n  str = str.replace(/&omega;|&#969;|&#x3c9;/g, \"ω\");\n  str = str.replace(/&thetasym;|&#977;|&#x3d1;/g, \"ϑ\");\n  str = str.replace(/&upsih;|&#978;|&#x3d2;/g, \"ϒ\");\n  str = str.replace(/&piv;|&#982;|&#x3d6;/g, \"ϖ\");\n  str = str.replace(/&middot;|&#183;|&#xb7;/g, \"·\");\n  return str;\n}\n\nfunction strcharacterDiscode(str) {\n  // 加入常用解析\n\n  // str = str.replace(/&nbsp;|&#32;|&#x20;/g, \"&nbsp;\");\n  // str = str.replace(/&ensp;|&#8194;|&#x2002;/g, '&ensp;');\n  // str = str.replace(/&#12288;|&#x3000;/g, '<span class=\\'spaceshow\\'>　</span>');\n  // str = str.replace(/&emsp;|&#8195;|&#x2003;/g, '&emsp;');\n  // str = str.replace(/&quot;|&#34;|&#x22;/g, \"\\\"\");\n  // str = str.replace(/&apos;|&#39;|&#x27;/g, \"&apos;\");\n  // str = str.replace(/&acute;|&#180;|&#xB4;/g, \"´\");\n  // str = str.replace(/&times;|&#215;|&#xD7;/g, \"×\");\n  // str = str.replace(/&divide;|&#247;|&#xF7;/g, \"÷\");\n  // str = str.replace(/&amp;|&#38;|&#x26;/g, '&amp;');\n  // str = str.replace(/&lt;|&#60;|&#x3c;/g, '&lt;');\n  // str = str.replace(/&gt;|&#62;|&#x3e;/g, '&gt;');\n\n  str = str.replace(/&nbsp;|&#32;|&#x20;/g, \"<span class='spaceshow'> </span>\");\n  str = str.replace(\n    /&ensp;|&#8194;|&#x2002;/g,\n    \"<span class='spaceshow'> </span>\",\n  );\n  str = str.replace(/&#12288;|&#x3000;/g, \"<span class='spaceshow'>　</span>\");\n  str = str.replace(\n    /&emsp;|&#8195;|&#x2003;/g,\n    \"<span class='spaceshow'> </span>\",\n  );\n  str = str.replace(/&quot;|&#34;|&#x22;/g, '\"');\n  str = str.replace(/&quot;|&#39;|&#x27;/g, \"'\");\n  str = str.replace(/&acute;|&#180;|&#xB4;/g, \"´\");\n  str = str.replace(/&times;|&#215;|&#xD7;/g, \"×\");\n  str = str.replace(/&divide;|&#247;|&#xF7;/g, \"÷\");\n  str = str.replace(/&amp;|&#38;|&#x26;/g, \"&\");\n  str = str.replace(/&lt;|&#60;|&#x3c;/g, \"<\");\n  str = str.replace(/&gt;|&#62;|&#x3e;/g, \">\");\n  return str;\n}\n\n// HTML 支持的其他实体\nfunction strOtherDiscode(str) {\n  str = str.replace(/&OElig;|&#338;|&#x152;/g, \"Œ\");\n  str = str.replace(/&oelig;|&#339;|&#x153;/g, \"œ\");\n  str = str.replace(/&Scaron;|&#352;|&#x160;/g, \"Š\");\n  str = str.replace(/&scaron;|&#353;|&#x161;/g, \"š\");\n  str = str.replace(/&Yuml;|&#376;|&#x178;/g, \"Ÿ\");\n  str = str.replace(/&fnof;|&#402;|&#x192;/g, \"ƒ\");\n  str = str.replace(/&circ;|&#710;|&#x2c6;/g, \"ˆ\");\n  str = str.replace(/&tilde;|&#732;|&#x2dc;/g, \"˜\");\n  str = str.replace(\n    /&thinsp;|$#8201;|&#x2009;/g,\n    \"<span class='spaceshow'> </span>\",\n  );\n  str = str.replace(\n    /&zwnj;|&#8204;|&#x200C;/g,\n    \"<span class='spaceshow'>‌</span>\",\n  );\n  str = str.replace(\n    /&zwj;|$#8205;|&#x200D;/g,\n    \"<span class='spaceshow'>‍</span>\",\n  );\n  str = str.replace(\n    /&lrm;|$#8206;|&#x200E;/g,\n    \"<span class='spaceshow'>‎</span>\",\n  );\n  str = str.replace(\n    /&rlm;|&#8207;|&#x200F;/g,\n    \"<span class='spaceshow'>‏</span>\",\n  );\n  str = str.replace(/&ndash;|&#8211;|&#x2013;/g, \"–\");\n  str = str.replace(/&mdash;|&#8212;|&#x2014;/g, \"—\");\n  str = str.replace(/&lsquo;|&#8216;|&#x2018;/g, \"‘\");\n  str = str.replace(/&rsquo;|&#8217;|&#x2019;/g, \"’\");\n  str = str.replace(/&sbquo;|&#8218;|&#x201a;/g, \"‚\");\n  str = str.replace(/&ldquo;|&#8220;|&#x201c;/g, \"“\");\n  str = str.replace(/&rdquo;|&#8221;|&#x201d;/g, \"”\");\n  str = str.replace(/&bdquo;|&#8222;|&#x201e;/g, \"„\");\n  str = str.replace(/&dagger;|&#8224;|&#x2020;/g, \"†\");\n  str = str.replace(/&Dagger;|&#8225;|&#x2021;/g, \"‡\");\n  str = str.replace(/&bull;|&#8226;|&#x2022;/g, \"•\");\n  str = str.replace(/&hellip;|&#8230;|&#x2026;/g, \"…\");\n  str = str.replace(/&permil;|&#8240;|&#x2030;/g, \"‰\");\n  str = str.replace(/&prime;|&#8242;|&#x2032;/g, \"′\");\n  str = str.replace(/&Prime;|&#8243;|&#x2033;/g, \"″\");\n  str = str.replace(/&lsaquo;|&#8249;|&#x2039;/g, \"‹\");\n  str = str.replace(/&rsaquo;|&#8250;|&#x203a;/g, \"›\");\n  str = str.replace(/&oline;|&#8254;|&#x203e;/g, \"‾\");\n  str = str.replace(/&euro;|&#8364;|&#x20ac;/g, \"€\");\n  str = str.replace(/&trade;|&#8482;|&#x2122;/g, \"™\");\n  str = str.replace(/&larr;|&#8592;|&#x2190;/g, \"←\");\n  str = str.replace(/&uarr;|&#8593;|&#x2191;/g, \"↑\");\n  str = str.replace(/&rarr;|&#8594;|&#x2192;/g, \"→\");\n  str = str.replace(/&darr;|&#8595;|&#x2193;/g, \"↓\");\n  str = str.replace(/&harr;|&#8596;|&#x2194;/g, \"↔\");\n  str = str.replace(/&crarr;|&#8629;|&#x21b5;/g, \"↵\");\n  str = str.replace(/&lceil;|&#8968;|&#x2308;/g, \"⌈\");\n  str = str.replace(/&rceil;|&#8969;|&#x2309;/g, \"⌉\");\n  str = str.replace(/&lfloor;|&#8970;|&#x230a;/g, \"⌊\");\n  str = str.replace(/&rfloor;|&#8971;|&#x230b;/g, \"⌋\");\n  str = str.replace(/&loz;|&#9674;|&#x25ca;/g, \"◊\");\n  str = str.replace(/&spades;|&#9824;|&#x2660;/g, \"♠\");\n  str = str.replace(/&clubs;|&#9827;|&#x2663;/g, \"♣\");\n  str = str.replace(/&hearts;|&#9829;|&#x2665;/g, \"♥\");\n  str = str.replace(/&diams;|&#9830;|&#x2666;/g, \"♦\");\n  return str;\n}\n\nfunction strDiscode(str) {\n  str = strNumDiscode(str);\n  str = strGreeceDiscode(str);\n  str = strcharacterDiscode(str);\n  str = strOtherDiscode(str);\n  return str;\n}\n\nfunction urlToHttpUrl(url, domain) {\n  if (/^\\/\\//.test(url)) {\n    return `https:${url}`;\n  } else if (/^\\//.test(url)) {\n    return `https://${domain}${url}`;\n  }\n  return url;\n}\n\nexport default {\n  strDiscode,\n  urlToHttpUrl,\n};\n"
  },
  {
    "path": "components/gaoyia-parse/parse.css",
    "content": "/**\n * author: Di (微信小程序开发工程师)\n * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)\n *         垂直微信小程序开发交流社区\n *\n * github地址: https://github.com/icindy/wxParse\n *\n * for: 微信小程序富文本解析\n * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184\n */\n/**\n * 请在全局下引入该文件，@import '/static/wxParse.css';\n */\n.wxParse {\n  user-select: none;\n  width: 100%;\n  font-family: Helvetica, \"PingFangSC\", \"Microsoft Yahei\", \"微软雅黑\", Arial,\n    sans-serif;\n  color: #0c1c33;\n  line-height: 1.5;\n  font-size: 1em;\n  text-align: justify; /* //左右两端对齐 */\n}\n.wxParse view,\n.wxParse uni-view {\n  word-break: break-word;\n}\n.wxParse .p {\n  padding-bottom: 0.5em;\n  clear: both;\n  /* letter-spacing: 0;//字间距 */\n}\n.wxParse .inline {\n  display: inline;\n  margin: 0;\n  padding: 0;\n}\n\n.wxParse .div {\n  margin: 0;\n  padding: 0;\n  display: block;\n}\n\n.wxParse .h1 {\n  font-size: 2em;\n  line-height: 1.2em;\n  margin: 0.67em 0;\n}\n.wxParse .h2 {\n  font-size: 1.5em;\n  margin: 0.83em 0;\n}\n.wxParse .h3 {\n  font-size: 1.17em;\n  margin: 1em 0;\n}\n.wxParse .h4 {\n  margin: 1.33em 0;\n}\n.wxParse .h5 {\n  font-size: 0.83em;\n  margin: 1.67em 0;\n}\n.wxParse .h6 {\n  font-size: 0.83em;\n  margin: 1.67em 0;\n}\n\n.wxParse .h1,\n.wxParse .h2,\n.wxParse .h3,\n.wxParse .h4,\n.wxParse .h5,\n.wxParse .h6,\n.wxParse .b,\n.wxParse .strong {\n  font-weight: bolder;\n}\n\n.wxParse .i,\n.wxParse .cite,\n.wxParse .em,\n.wxParse .var,\n.wxParse .address {\n  font-style: italic;\n}\n.wxParse .spaceshow {\n  white-space: pre;\n}\n.wxParse .pre,\n.wxParse .tt,\n.wxParse .code,\n.wxParse .kbd,\n.wxParse .samp {\n  font-family: monospace;\n}\n.wxParse .pre {\n  overflow: auto;\n  background: #f5f5f5;\n  padding: 16upx;\n  white-space: pre;\n  margin: 1em 0upx;\n  font-size: 24upx;\n}\n.wxParse .code {\n  overflow: auto;\n  padding: 16upx;\n  white-space: pre;\n  margin: 1em 0upx;\n  background: #f5f5f5;\n  font-size: 24upx;\n}\n\n.wxParse .big {\n  font-size: 1.17em;\n}\n\n.wxParse .small,\n.wxParse .sub,\n.wxParse .sup {\n  font-size: 0.83em;\n}\n\n.wxParse .sub {\n  vertical-align: sub;\n}\n.wxParse .sup {\n  vertical-align: super;\n}\n\n.wxParse .s,\n.wxParse .strike,\n.wxParse .del {\n  text-decoration: line-through;\n}\n\n.wxParse .strong,\n.wxParse .text,\n.wxParse .span,\n.wxParse .s {\n  display: inline;\n}\n\n.wxParse .a {\n  color: deepskyblue;\n}\n\n.wxParse .video {\n  text-align: center;\n  margin: 22upx 0;\n}\n\n.wxParse .video-video {\n  width: 100%;\n}\n.wxParse .uni-image {\n  max-width: 100%;\n}\n.wxParse .img {\n  display: block;\n  max-width: 100%;\n  margin-bottom: 0em; /* //与p标签底部padding同时修改 */\n  overflow: hidden;\n}\n\n.wxParse .blockquote {\n  margin: 10upx 0;\n  padding: 22upx 0 22upx 22upx;\n  font-family: Courier, Calibri, \"宋体\";\n  background: #f5f5f5;\n  border-left: 6upx solid #dbdbdb;\n}\n.wxParse .blockquote .p {\n  margin: 0;\n}\n.wxParse .ul,\n.wxParse .ol {\n  display: block;\n  margin: 1em 0;\n  padding-left: 2em;\n}\n.wxParse .ol {\n  list-style-type: disc;\n}\n.wxParse .ol {\n  list-style-type: decimal;\n}\n.wxParse .ol > weixin-parse-template,\n.wxParse .ul > weixin-parse-template {\n  display: list-item;\n  align-items: baseline;\n  text-align: match-parent;\n}\n\n.wxParse .ol > .li,\n.wxParse .ul > .li {\n  display: list-item;\n  align-items: baseline;\n  text-align: match-parent;\n}\n.wxParse .ul .ul,\n.wxParse .ol .ul {\n  list-style-type: circle;\n}\n.wxParse .ol .ol .ul,\n.wxParse .ol .ul .ul,\n.wxParse .ul .ol .ul,\n.wxParse .ul .ul .ul {\n  list-style-type: square;\n}\n\n.wxParse .u {\n  text-decoration: underline;\n}\n.wxParse .hide {\n  display: none;\n}\n.wxParse .del {\n  display: inline;\n}\n.wxParse .figure {\n  overflow: hidden;\n}\n.wxParse .tablebox {\n  overflow: auto;\n  background-color: #f5f5f5;\n  background: #f5f5f5;\n  font-size: 13px;\n  padding: 8px;\n}\n.wxParse .table .table,\n.wxParse .table {\n  border-collapse: collapse;\n  box-sizing: border-box;\n  /* 内边框 */\n  /* width: 100%; */\n  overflow: auto;\n  white-space: pre;\n}\n.wxParse .tbody {\n  border-collapse: collapse;\n  box-sizing: border-box;\n  /* 内边框 */\n  border: 1px solid #dadada;\n}\n.wxParse .table .thead,\n.wxParse .table .tfoot,\n.wxParse .table .th {\n  border-collapse: collapse;\n  box-sizing: border-box;\n  background: #ececec;\n  font-weight: 40;\n}\n.wxParse .table .tr {\n  border-collapse: collapse;\n  box-sizing: border-box;\n  /* border: 2px solid #F0AD4E; */\n  overflow: auto;\n}\n.wxParse .table .th,\n.wxParse .table .td {\n  border-collapse: collapse;\n  box-sizing: border-box;\n  border: 2upx solid #dadada;\n  overflow: auto;\n}\n.wxParse .audio,\n.wxParse .uni-audio-default {\n  display: block;\n}\n"
  },
  {
    "path": "components/gaoyia-parse/parse.vue",
    "content": "<!--**\n * forked from：https://github.com/F-loat/mpvue-wxParse\n *\n * github地址: https://github.com/dcloudio/uParse\n *\n * for: uni-app框架下 富文本解析\n * \n * 优化 by gaoyia@qq.com  https://github.com/gaoyia/parse\n */-->\n\n<template>\n  <!--基础元素-->\n  <div class=\"wxParse\" :class=\"className\" :style=\"'user-select:' + userSelect\">\n    <block v-for=\"(node, index) of nodes\" :key=\"index\" v-if=\"!loading\">\n      <wxParseTemplate :node=\"node\" />\n    </block>\n  </div>\n</template>\n\n<script>\nimport HtmlToJson from \"./libs/html2json\";\nimport wxParseTemplate from \"./components/wxParseTemplate0\";\n\nexport default {\n  name: \"wxParse\",\n  props: {\n    // user-select:none;\n    userSelect: {\n      type: String,\n      default: \"text\", //none |text| all | element\n    },\n    imgOptions: {\n      type: [Object, Boolean],\n      default: function () {\n        return {\n          loop: false,\n          indicator: \"number\",\n          longPressActions: false,\n          // longPressActions: {\n          // \t itemList: ['发送给朋友', '保存图片', '收藏'],\n          // \t\tsuccess: function (res) {\n          // \t\t\tconsole.log('选中了第' + (res.tapIndex + 1) + '个按钮');\n          // \t\t},\n          // \t\tfail: function (res) {\n          // \t\t\tconsole.log(res.errMsg);\n          // \t\t}\n          // \t}\n          // }\n        };\n      },\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n    className: {\n      type: String,\n      default: \"\",\n    },\n    content: {\n      type: String,\n      default: \"\",\n    },\n    noData: {\n      type: String,\n      default: '<div style=\"color: red;\">数据不能为空</div>',\n    },\n    startHandler: {\n      type: Function,\n      default() {\n        return (node) => {\n          node.attr.class = null;\n          node.attr.style = null;\n        };\n      },\n    },\n    endHandler: {\n      type: Function,\n      default: null,\n    },\n    charsHandler: {\n      type: Function,\n      default: null,\n    },\n    imageProp: {\n      type: Object,\n      default() {\n        return {\n          mode: \"aspectFit\",\n          padding: 0,\n          lazyLoad: false,\n          domain: \"\",\n        };\n      },\n    },\n  },\n  components: {\n    wxParseTemplate,\n  },\n  data() {\n    return {\n      nodes: {},\n      imageUrls: [],\n      wxParseWidth: {\n        value: 0,\n      },\n    };\n  },\n  computed: {},\n  mounted() {\n    this.setHtml();\n  },\n  methods: {\n    setHtml() {\n      this.getWidth().then((data) => {\n        this.wxParseWidth.value = data;\n      });\n      let {\n        content,\n        noData,\n        imageProp,\n        startHandler,\n        endHandler,\n        charsHandler,\n      } = this;\n      let parseData = content || noData;\n      let customHandler = {\n        start: startHandler,\n        end: endHandler,\n        chars: charsHandler,\n      };\n      let results = HtmlToJson(parseData, customHandler, imageProp, this);\n\n      this.imageUrls = results.imageUrls;\n      // this.nodes = results.nodes;\n\n      this.nodes = [];\n      results.nodes.forEach((item) => {\n        setTimeout(() => {\n          this.nodes.push(item);\n        }, 0);\n      });\n    },\n    getWidth() {\n      return new Promise((res, rej) => {\n        // #ifndef MP-ALIPAY || MP-BAIDU\n        uni\n          .createSelectorQuery()\n          .in(this)\n          .select(\".wxParse\")\n          .fields(\n            {\n              size: true,\n              scrollOffset: true,\n            },\n            (data) => {\n              res(data.width);\n            },\n          )\n          .exec();\n        // #endif\n        // #ifdef MP-BAIDU\n        const query = swan.createSelectorQuery();\n        query.select(\".wxParse\").boundingClientRect();\n        query.exec((obj) => {\n          const rect = obj[0];\n          if (rect) {\n            res(rect.width);\n          }\n        });\n        // #endif\n        // #ifdef MP-ALIPAY\n        my.createSelectorQuery()\n          .select(\".wxParse\")\n          .boundingClientRect()\n          .exec((ret) => {\n            res(ret[0].width);\n          });\n        // #endif\n      });\n    },\n    navigate(href, $event, attr) {\n      console.log(href, attr);\n      this.$emit(\"navigate\", href, $event);\n    },\n    preview(src, $event) {\n      // if (!this.imageUrls.length || typeof this.imgOptions === 'boolean') {\n      // } else {\n      // \tuni.previewImage({\n      // \t\tcurrent: src,\n      // \t\turls: this.imageUrls,\n      // \t\tloop: this.imgOptions.loop,\n      // \t\tindicator: this.imgOptions.indicator,\n      // \t\tlongPressActions: this.imgOptions.longPressActions\n      // \t});\n      // }\n      // this.$emit('preview', src, $event);\n    },\n    removeImageUrl(src) {\n      const { imageUrls } = this;\n      imageUrls.splice(imageUrls.indexOf(src), 1);\n    },\n  },\n  // 父组件中提供\n  provide() {\n    return {\n      parseWidth: this.wxParseWidth,\n      parseSelect: this.userSelect,\n      // 提示：provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而，如果你传入了一个可监听的对象，那么其对象的属性还是可响应的。\n    };\n  },\n  watch: {\n    content() {\n      this.setHtml();\n    },\n    // content: {\n    // \thandler: function(newVal, oldVal) {\n    // \t\tif (newVal !== oldVal) {\n    //\n    // \t\t}\n    // \t},\n    // \tdeep: true\n    // }\n  },\n};\n</script>\n"
  },
  {
    "path": "constant/comp.js",
    "content": "export const ChatingFooterActionTypes = {\n  Album: \"Album\",\n};\n\nexport const ContactMenuTypes = {\n  NewFriend: \"NewFriend\",\n  NewGroup: \"NewGroup\",\n  MyFriend: \"MyFriend\",\n  MyGroup: \"MyGroup\",\n};\n\nexport const GroupMemberListTypes = {\n  Preview: \"Preview\",\n  Transfer: \"Transfer\",\n  Kickout: \"Kickout\",\n};\n\nexport const ContactChooseTypes = {\n  Invite: \"Invite\",\n  GetList: \"GetList\",\n};\n\nexport const UpdateMessageTypes = {\n  Overall: \"Overall\",\n  KeyWords: \"KeyWords\",\n};\n\nexport const SmsUserFor = {\n  Register: 1,\n  Reset: 2,\n  Login: 3,\n};\n\nexport const CustomMessageStatus = {\n  Success: \"success\",\n  Cancel: \"cancel\",\n  Canceled: \"canceled\",\n  Refuse: \"refuse\",\n  Refused: \"refused\",\n  Timeout: \"timeout\",\n  AccessByOther: \"accessByOther\",\n};\n"
  },
  {
    "path": "constant/event.js",
    "content": "export const PageEvents = {\n  GlobalToast: \"GlobalToast\",\n  ScrollToBottom: \"ScrollToBottom\",\n  RtcCall: \"RtcCall\"\n};\n"
  },
  {
    "path": "constant/im.js",
    "content": "import { MessageType } from \"openim-uniapp-polyfill\";\n\nexport const CustomType = {\n  VideoCall: \"c100\",\n  VoiceCall: \"c101\",\n  Call: 901,\n  MassMsg: 903,\n};\n\nexport const Platform = {\n  1: 'iOS',\n  2: 'Android',\n  3: 'PC',\n  4: 'PC',\n  5: 'Web'\n};\n\nexport const noticeMessageTypes = [\n  MessageType.RevokeMessage,\n  MessageType.FriendAdded,\n  MessageType.GroupCreated,\n  MessageType.GroupInfoUpdated,\n  MessageType.MemberQuit,\n  MessageType.GroupOwnerTransferred,\n  MessageType.MemberKicked,\n  MessageType.MemberInvited,\n  MessageType.MemberEnter,\n  MessageType.GroupDismissed,\n  MessageType.GroupMemberMuted,\n  MessageType.GroupMuted,\n  MessageType.GroupCancelMuted,\n  MessageType.GroupMemberCancelMuted,\n  MessageType.GroupNameUpdated,\n  MessageType.BurnMessageChange,\n];\n\nexport const GroupSystemMessageTypes = [\n  MessageType.GroupCreated,\n  MessageType.GroupInfoUpdated,\n  MessageType.MemberQuit,\n  MessageType.GroupOwnerTransferred,\n  MessageType.MemberKicked,\n  MessageType.MemberInvited,\n  MessageType.MemberEnter,\n  MessageType.GroupDismissed,\n  MessageType.GroupMemberMuted,\n  MessageType.GroupMuted,\n  MessageType.GroupCancelMuted,\n  MessageType.GroupMemberCancelMuted,\n  MessageType.GroupNameUpdated\n];\n"
  },
  {
    "path": "constant/index.js",
    "content": "export * from \"./im\";\nexport * from \"./comp\";\nexport * from \"./event\";\n"
  },
  {
    "path": "index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <script>\n      var coverSupport =\n        \"CSS\" in window &&\n        typeof CSS.supports === \"function\" &&\n        (CSS.supports(\"top: env(a)\") || CSS.supports(\"top: constant(a)\"));\n      document.write(\n        '<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +\n          (coverSupport ? \", viewport-fit=cover\" : \"\") +\n          '\" />',\n      );\n    </script>\n    <title></title>\n    <!--preload-links-->\n    <!--app-context-->\n  </head>\n  <body>\n    <div id=\"app\"><!--app-html--></div>\n    <script type=\"module\" src=\"/main.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "main.js",
    "content": "import App from \"./App\";\nimport Vue from \"vue\";\n\n// vuex\nimport store from \"./store\";\n\n// 引入全局uView\nimport uView from \"@/uni_modules/uview-ui\";\nVue.use(uView);\n\nVue.prototype.$store = store;\n\nVue.config.productionTip = false;\nApp.mpType = \"app\";\nconst app = new Vue({\n  store,\n  ...App,\n});\n\n// 引入请求封装\nrequire(\"./util/request/index\")(app);\n\napp.$mount();\n"
  },
  {
    "path": "manifest.json",
    "content": "{\n    \"name\" : \"IM-UCB\",\n    \"appid\" : \"__UNI__60BFCE0\",\n    \"description\" : \"\",\n    \"versionName\" : \"toc_base_open 3.3.4\",\n    \"versionCode\" : 334,\n    \"transformPx\" : false,\n    \"app-plus\" : {\n        \"bounce\" : \"none\",\n        \"usingComponents\" : true,\n        \"nvueStyleCompiler\" : \"uni-app\",\n        \"compilerVersion\" : 3,\n        \"splashscreen\" : {\n            \"alwaysShowBeforeRender\" : false,\n            \"waiting\" : true,\n            \"autoclose\" : false,\n            \"delay\" : 0\n        },\n        \"modules\" : {\n            \"VideoPlayer\" : {},\n            \"Camera\" : {},\n            \"Record\" : {},\n            \"Geolocation\" : {},\n            \"Maps\" : {}\n        },\n        \"distribute\" : {\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.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.INTERNET\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.READ_EXTERNAL_STORAGE\\\"/>\",\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.VIBRATE\\\"/>\",\n                    \"<uses-permission android:name=\\\"android.permission.WAKE_LOCK\\\"/>\",\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\" ],\n                \"minSdkVersion\" : 21\n            },\n            \"ios\" : {\n                \"dSYMs\" : false,\n                \"privacyDescription\" : {\n                    \"NSPhotoLibraryUsageDescription\" : \"请求获取读取相册权限\",\n                    \"NSPhotoLibraryAddUsageDescription\" : \"请求获取存入相册权限\",\n                    \"NSCameraUsageDescription\" : \"请求获取摄像头权限\",\n                    \"NSMicrophoneUsageDescription\" : \"请求获取麦克风权限\",\n                    \"NSLocationWhenInUseUsageDescription\" : \"请求获取位置权限\",\n                    \"NSLocationAlwaysAndWhenInUseUsageDescription\" : \"请求获取位置权限\",\n                    \"NSLocationAlwaysUsageDescription\" : \"请求获取位置权限\",\n                    \"NSBluetoothAlwaysUsageDescription\" : \"请求获取蓝牙权限\"\n                }\n            },\n            \"sdkConfigs\" : {\n                \"ad\" : {},\n                \"geolocation\" : {},\n                \"maps\" : {},\n                \"share\" : {},\n                \"statics\" : {},\n                \"speech\" : {}\n            },\n            \"splashscreen\" : {\n                \"androidStyle\" : \"default\",\n                \"iosStyle\" : \"common\",\n                \"android\" : {\n                    \"hdpi\" : \"unpackage/res/cover/480_762.9.png\",\n                    \"xhdpi\" : \"unpackage/res/cover/720_1242.9.png\",\n                    \"xxhdpi\" : \"unpackage/res/cover/1080_1882.9.png\"\n                }\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        },\n        \"nativePlugins\" : {\n            \"Tuoyun-OpenIMSDK\" : {\n                \"__plugin_info__\" : {\n                    \"name\" : \"OpenIM SDK\",\n                    \"description\" : \"OpenIM：由IM技术专家打造的基于 Go 实现的即时通讯（IM）项目，从服务端到客户端SDK开源即时通讯（IM）整体解决方案，可以轻松替代第三方IM云服务，打造具备聊天、社交功能的app。\",\n                    \"platforms\" : \"Android,iOS\",\n                    \"url\" : \"https://ext.dcloud.net.cn/plugin?id=6577\",\n                    \"android_package_name\" : \"\",\n                    \"ios_bundle_id\" : \"com.tuoyun.uni\",\n                    \"isCloud\" : true,\n                    \"bought\" : 1,\n                    \"pid\" : \"6577\",\n                    \"parameters\" : {}\n                }\n            }\n        },\n        \"uniStatistics\" : {\n            \"enable\" : false\n        }\n    },\n    /* 快应用特有相关 */\n    \"quickapp\" : {},\n    /* 小程序特有相关 */\n    \"mp-weixin\" : {\n        \"appid\" : \"\",\n        \"setting\" : {\n            \"urlCheck\" : false\n        },\n        \"usingComponents\" : true\n    },\n    \"mp-alipay\" : {\n        \"usingComponents\" : true\n    },\n    \"mp-baidu\" : {\n        \"usingComponents\" : true\n    },\n    \"mp-toutiao\" : {\n        \"usingComponents\" : true\n    },\n    \"uniStatistics\" : {\n        \"enable\" : false,\n        \"version\" : \"2\"\n    },\n    \"vueVersion\" : \"2\",\n    \"h5\" : {\n        \"template\" : \"\",\n        \"sdkConfigs\" : {\n            \"maps\" : {}\n        },\n        \"devServer\" : {\n            \"port\" : 8080, //端口号\n            \"disableHostCheck\" : true,\n            \"proxy\" : {\n                \"/apiv2\" : {\n                    \"target\" : \"https://www.pgyer.com/\", //目标接口域名\n                    \"changeOrigin\" : true, //是否跨域\n                    \"secure\" : true // 设置支持https协议的代理\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"dependencies\": {\n    \"date-fns\": \"^2.30.0\",\n    \"dayjs\": \"^1.11.6\",\n    \"image-tools\": \"^1.4.0\",\n    \"md5\": \"^2.3.0\",\n    \"@openim/client-sdk\": \"^0.0.11-ahpha.1\",\n    \"openim-uniapp-polyfill\": \"^1.4.1\",\n    \"uuid\": \"^9.0.0\"\n  }\n}\n"
  },
  {
    "path": "pages/common/contactChoose/index.vue",
    "content": "<template>\n  <view class=\"contact_choose_container\">\n    <custom-nav-bar title=\"联系人\" />\n\n    <view class=\"search_bar_wrap\">\n      <u-search\n        shape=\"square\"\n        placeholder=\"搜索\"\n        :showAction=\"false\"\n        v-model=\"keyword\"\n      />\n    </view>\n\n    <view class=\"tab_container\">\n      <template v-if=\"activeTab === 0\">\n        <setting-item\n          @click=\"tabChange(tabs[0].idx)\"\n          :title=\"tabs[0].title\"\n          :border=\"false\"\n        />\n\n        <view class=\"tab_pane\"></view>\n      </template>\n\n      <template v-else>\n        <view class=\"tab_pane\" v-show=\"activeTab === 1\">\n          <choose-index-list\n            @updateCheck=\"updateCheckedUser\"\n            :indexList=\"getChooseData.indexList\"\n            :itemArr=\"getChooseData.dataList\"\n            :checkedIDList=\"checkedUserIDList\"\n            :disabledIDList=\"disabledUserIDList\"\n            :showCheck=\"true\"\n          />\n        </view>\n      </template>\n    </view>\n    <choose-index-footer\n      :comfirmLoading=\"comfirmLoading\"\n      @removeItem=\"updateCheckedUserOrGroup\"\n      @confirm=\"confirm\"\n      :choosedData=\"getCheckedInfo\"\n    />\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { ContactChooseTypes } from \"@/constant\";\nimport { formatChooseData, toastWithCallback } from \"@/util/common\";\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport UserItem from \"@/components/UserItem/index.vue\";\nimport ChooseIndexList from \"@/components/ChooseIndexList/index.vue\";\nimport ChooseIndexFooter from \"@/components/ChooseIndexFooter/index.vue\";\nimport SettingItem from \"@/components/SettingItem/index.vue\";\n\nexport default {\n  components: {\n    CustomNavBar,\n    UserItem,\n    ChooseIndexList,\n    ChooseIndexFooter,\n    SettingItem,\n  },\n  data() {\n    return {\n      keyword: \"\",\n      type: ContactChooseTypes.Card,\n      activeTab: 0,\n      groupID: \"\",\n      checkedUserIDList: [],\n      disabledUserIDList: [],\n      comfirmLoading: false,\n      tabs: [\n        {\n          idx: 1,\n          title: \"我的好友\",\n        },\n      ],\n    };\n  },\n  computed: {\n    ...mapGetters([\n      \"storeFriendList\",\n      \"storeCurrentConversation\",\n      \"storeCurrentUserID\",\n      \"storeConversationList\",\n    ]),\n    getChooseData() {\n      if (this.keyword) {\n        return {\n          indexList: [\"#\"],\n          dataList: [\n            this.storeFriendList.filter(\n              (friend) =>\n                friend.nickname.includes(this.keyword) ||\n                friend.remark.includes(this.keyword)\n            ),\n          ],\n        };\n      }\n      return formatChooseData(this.storeFriendList);\n    },\n    getCheckedInfo() {\n      const tmpUserIDList = [...this.checkedUserIDList];\n      const checkedFriends = this.storeFriendList.filter((friend) => {\n        const idx = tmpUserIDList.findIndex(\n          (userID) => userID === friend.userID\n        );\n        if (idx > -1) {\n          tmpUserIDList.splice(idx, 1);\n        }\n        return idx > -1;\n      });\n      return [...checkedFriends];\n    },\n  },\n  onLoad(options) {\n    const {\n      groupID,\n      type,\n      checkedUserIDList,\n    } = options;\n    this.type = type;\n    this.groupID = groupID;\n    this.checkedUserIDList = checkedUserIDList\n      ? JSON.parse(checkedUserIDList)\n      : [];\n    if (this.type === ContactChooseTypes.Invite) {\n      this.checkDisabledUser();\n    }\n  },\n  methods: {\n    checkDisabledUser() {\n      const friendIDList = this.storeFriendList.map((friend) => friend.userID);\n      IMSDK.asyncApi(\"getUsersInGroup\", IMSDK.uuid(), {\n        groupID: this.groupID,\n        userIDList: friendIDList,\n      }).then(({ data }) => {\n        this.disabledUserIDList = data;\n      });\n    },\n    tabChange(idx) {\n      this.keyword = \"\";\n      this.activeTab = idx;\n    },\n    updateCheckedUserOrGroup(item) {\n      if (item.userID) {\n        this.updateCheckedUser(item);\n      }\n    },\n    updateCheckedUser({ userID }) {\n      if (this.checkedUserIDList.includes(userID)) {\n        const idx = this.checkedUserIDList.findIndex((item) => item === userID);\n        const tmpArr = [...this.checkedUserIDList];\n        tmpArr.splice(idx, 1);\n        this.checkedUserIDList = [...tmpArr];\n      } else {\n        this.checkedUserIDList = [...this.checkedUserIDList, userID];\n      }\n    },\n    confirm() {\n      if (this.activeTab) {\n        this.activeTab = 0;\n        return;\n      }\n      this.comfirmLoading = true;\n      if (this.type === ContactChooseTypes.GetList) {\n        let pages = getCurrentPages();\n        let prevPage = pages[pages.length - 2];\n        prevPage.$vm.getCheckedUsers(this.getCheckedInfo);\n        this.comfirmLoading = false;\n\n        uni.navigateBack({\n          delta: 1,\n        });\n        return;\n      }\n\n      if (this.type === ContactChooseTypes.Invite) {\n        IMSDK.asyncApi(IMSDK.IMMethods.InviteUserToGroup, IMSDK.uuid(), {\n          groupID: this.groupID,\n          reason: \"\",\n          userIDList: this.getCheckedInfo.map((user) => user.userID),\n        })\n          .then(() => {\n            toastWithCallback(\"操作成功\", () => uni.navigateBack());\n            this.comfirmLoading = false;\n          })\n          .catch(() => toastWithCallback(\"操作失败\"));\n        return;\n      }\n\n      this.comfirmLoading = false;\n    },\n  },\n  onBackPress() {\n    if (this.activeTab) {\n      this.activeTab = 0;\n      return true;\n    }\n    return false;\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n/deep/.u-popup {\n  flex: none;\n}\n.contact_choose_container {\n  height: 100vh;\n  display: flex;\n  flex-direction: column;\n  .search_bar_wrap {\n    height: 34px;\n    padding: 12px 22px;\n  }\n\n  .tab_container {\n    @include colBox(false);\n    flex: 1;\n    overflow: hidden;\n\n    .setting_item {\n      padding: 32rpx 36rpx;\n    }\n\n    .title {\n      height: 60rpx;\n      display: flex;\n      justify-content: start;\n      align-items: center;\n      // padding: 16rpx 8rpx;\n      background: #f8f9fa;\n      color: #8e9ab0;\n      font-size: 24rpx;\n    }\n\n    .tabs_bar {\n      @include vCenterBox();\n      justify-content: space-evenly;\n\n      .tab_item {\n        @include colBox(false);\n        align-items: center;\n\n        image {\n          width: 50px;\n          height: 50px;\n        }\n      }\n    }\n\n    .tab_pane {\n      display: flex;\n      flex-direction: column;\n      flex: 1;\n      overflow: hidden;\n\n      .member_list {\n        flex: 1;\n        height: 80% !important;\n        /deep/uni-scroll-view {\n          max-height: 100% !important;\n        }\n      }\n\n      .user_list {\n        height: 100% !important;\n      }\n\n      .member_anchor {\n        background-color: #f8f8f8 !important;\n        border: none !important;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/createGroup/index.vue",
    "content": "<template>\n  <view class=\"create_group_container\">\n    <custom-nav-bar title=\"发起群聊\" />\n    <u-toast ref=\"uToast\"></u-toast>\n    <view class=\"main\">\n      <view class=\"group_base_info\">\n        <my-avatar\n          @click=\"chooseImage\"\n          :isGroup=\"true\"\n          :src=\"groupFaceUrl\"\n          size=\"44\"\n        />\n        <u--input\n          placeholder=\"取个群名称方便后续搜索\"\n          border=\"none\"\n          maxlength=\"16\"\n          v-model=\"groupName\"\n        ></u--input>\n      </view>\n\n      <view class=\"member_row\" @click=\"toChooseMember\">\n        <view class=\"desc_title\">\n          <text>群成员</text>\n          <text>{{ `${checkedMemberList.length}人` }}</text>\n        </view>\n        <view class=\"member_list\">\n          <view\n            v-for=\"member in checkedMemberList.slice(0, 5)\"\n            :key=\"member.userID\"\n            class=\"member_item\"\n          >\n            <my-avatar :src=\"member.userID\" :desc=\"member.nickname\" size=\"42\" />\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"action_bar\">\n      <u-button\n        :loading=\"createLoading\"\n        :disabled=\"disabledCreate\"\n        @click=\"complateCreate\"\n        type=\"primary\"\n        text=\"完成创建\"\n      ></u-button>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { ContactChooseTypes } from \"@/constant\";\nimport IMSDK, {\n  GroupType,\n  IMMethods,\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport { navigateToDesignatedConversation } from \"@/util/imCommon\";\nimport { getPurePath, toastWithCallback } from \"@/util/common\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n  },\n  data() {\n    return {\n      groupName: \"\",\n      groupFaceUrl: \"\",\n      checkedMemberList: [],\n      fileList: [],\n      createLoading: false,\n    };\n  },\n  computed: {\n    disabledCreate() {\n      return !this.groupName || this.checkedMemberList.length === 0;\n    },\n  },\n  onLoad(options) {\n    const { checkedMemberList } = options;\n    this.checkedMemberList = checkedMemberList\n      ? JSON.parse(checkedMemberList)\n      : [];\n  },\n  methods: {\n    toChooseMember() {\n      const checkedIDList = this.checkedMemberList.map(\n        (member) => member.userID,\n      );\n      uni.navigateTo({\n        url: `/pages/common/contactChoose/index?type=${\n          ContactChooseTypes.GetList\n        }&checkedUserIDList=${JSON.stringify(checkedIDList)}`,\n      });\n    },\n    complateCreate() {\n      this.createLoading = true;\n      const options = {\n        adminUserIDs: [],\n        memberUserIDs: this.checkedMemberList.map((member) => member.userID),\n        groupInfo: {\n          groupType: GroupType.WorkingGroup,\n          groupName: this.groupName,\n          faceURL: this.groupFaceUrl,\n        },\n      };\n      IMSDK.asyncApi(IMSDK.IMMethods.CreateGroup, IMSDK.uuid(), options)\n        .then(({ data }) => {\n          toastWithCallback(\"创建成功\", () =>\n            navigateToDesignatedConversation(\n              data.groupID,\n              SessionType.WorkingGroup,\n              true,\n            ),\n          );\n        })\n        .finally(() => (this.createLoading = false));\n    },\n    getCheckedUsers(list) {\n      this.checkedMemberList = [...list];\n    },\n    chooseImage() {\n      uni.chooseImage({\n        count: 1,\n        sizeType: [\"compressed\"],\n        success: async ({ tempFilePaths }) => {\n          const path = tempFilePaths[0];\n          const nameIdx = path.lastIndexOf(\"/\") + 1;\n          const typeIdx = path.lastIndexOf(\".\") + 1;\n          const fileName = path.slice(nameIdx);\n          const fileType = path.slice(typeIdx);\n\n          try {\n            const {\n              data: { url },\n            } = await IMSDK.asyncApi(IMMethods.UploadFile, IMSDK.uuid(), {\n              filepath: getPurePath(tempFilePaths[0]),\n              name: fileName,\n              contentType: fileType,\n              uuid: IMSDK.uuid(),\n            });\n            this.groupFaceUrl = url;\n          } catch (error) {\n            uni.$u.toast(\"上传失败\");\n          }\n        },\n        fail: function (err) {\n          uni.$u.toast(\"上传失败\");\n        },\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.create_group_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .main {\n    display: flex;\n    flex-direction: column;\n    flex: 1;\n  }\n\n  .group_base_info {\n    @include vCenterBox();\n    padding: 44rpx;\n    background-color: #fff;\n    margin: 36rpx 0;\n\n    .u-input {\n      margin-left: 48rpx;\n    }\n  }\n\n  .member_row {\n    padding: 44rpx;\n    background-color: #fff;\n    color: #999;\n\n    .desc_title {\n      @include vCenterBox();\n      justify-content: space-between;\n    }\n\n    .member_list {\n      display: flex;\n      flex-wrap: wrap;\n      margin-top: 24rpx;\n\n      .member_item {\n        @include colBox(false);\n        align-items: center;\n        margin-right: 12rpx;\n\n        .member_name {\n          @include nomalEllipsis();\n          max-width: 42px;\n          margin-top: 12rpx;\n        }\n      }\n    }\n  }\n\n  .action_bar {\n    background-color: #fff;\n    padding: 44rpx 44rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/detailsFileds/index.vue",
    "content": "<template>\n  <view class=\"details_container\">\n    <custom-nav-bar title=\"个人资料\" />\n\n    <view class=\"info_list\">\n      <user-info-row-item class=\"info_item\" lable=\"头像\" arrow>\n        <my-avatar\n          :src=\"sourceInfo.faceURL\"\n          :desc=\"sourceInfo.nickname\"\n          size=\"26\"\n        />\n      </user-info-row-item>\n      <user-info-row-item class=\"info_item\" lable=\"昵称\" arrow>\n        <text class=\"right_content\">{{ sourceInfo.nickname }}</text>\n      </user-info-row-item>\n      <user-info-row-item class=\"info_item\" lable=\"性别\" arrow>\n        <text class=\"right_content\">{{ getGender }}</text>\n      </user-info-row-item>\n      <user-info-row-item class=\"info_item\" lable=\"生日\" arrow>\n        <text class=\"right_content\">{{ getBirthStr }}</text>\n      </user-info-row-item>\n    </view>\n\n    <view class=\"info_list\">\n      <user-info-row-item class=\"info_item\" lable=\"手机号码\" arrow>\n        <text class=\"right_content\">{{ sourceInfo.phoneNumber || \"-\" }}</text>\n      </user-info-row-item>\n      <user-info-row-item class=\"info_item\" lable=\"邮箱\" arrow>\n        <text class=\"right_content\">{{ sourceInfo.email || \"-\" }}</text>\n      </user-info-row-item>\n    </view>\n  </view>\n</template>\n\n<script>\nimport dayjs from \"dayjs\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport UserInfoRowItem from \"../userCard/components/UserInfoRowItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    UserInfoRowItem,\n  },\n  data() {\n    return {\n      sourceInfo: {},\n    };\n  },\n  computed: {\n    getGender() {\n      if (this.sourceInfo.gender === 1) {\n        return \"男\";\n      }\n      if (this.sourceInfo.gender === 2) {\n        return \"女\";\n      }\n      return \"保密\";\n    },\n    getBirthStr() {\n      const birth = this.sourceInfo.birth ?? 0;\n      return dayjs(birth).format(\"YYYY-MM-DD\");\n    },\n  },\n  onLoad(options) {\n    const { sourceInfo } = options;\n    this.sourceInfo = JSON.parse(sourceInfo);\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.details_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .info_list {\n    border-radius: 6px;\n    overflow: hidden;\n    margin: 24rpx;\n\n    .info_item {\n      background-color: #fff;\n      // border-bottom: 1px solid rgba(153, 153, 153, 0.3);\n\n      .right_content {\n        color: #999;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/groupCard/index.vue",
    "content": "<template>\n  <view class=\"group_card_container\">\n    <custom-nav-bar title=\"\" />\n    <u-toast ref=\"uToast\"></u-toast>\n\n    <view class=\"main\">\n      <view class=\"base_info\">\n        <my-avatar :src=\"sourceGroupInfo.faceURL\" :isGroup=\"true\" size=\"48\" />\n        <view>\n          <view class=\"group_name\">\n            <text>{{ sourceGroupInfo.groupName }}</text>\n            <text v-if=\"!!sourceGroupInfo.memberCount\"\n              >（{{ sourceGroupInfo.memberCount }}）</text\n            >\n          </view>\n          <view class=\"create_time\">\n            <u-icon name=\"clock\" color=\"#999\" size=\"14\"></u-icon>\n            <text>{{ getCreateTime }}</text>\n          </view>\n        </view>\n      </view>\n\n      <view\n        v-if=\"!!sourceGroupInfo.memberCount\"\n        @click=\"toMemberList\"\n        class=\"member_row info_row\"\n      >\n        <view class=\"member_desc\">\n          <text>群成员</text>\n          <text class=\"member_count\">{{\n            `${sourceGroupInfo.memberCount}人`\n          }}</text>\n          <u-icon name=\"arrow-right\" color=\"#999\" size=\"18\"></u-icon>\n        </view>\n        <view class=\"member_list\">\n          <my-avatar\n            v-for=\"member in getRenderMemberList\"\n            :key=\"member.userID\"\n            class=\"member_item\"\n            size=\"42\"\n            :src=\"member.faceURL\"\n            :desc=\"member.nickname\"\n          ></my-avatar>\n          <u-avatar\n            bgColor=\"#5496EB\"\n            icon=\"more-dot-fill\"\n            shape=\"square\"\n            size=\"42\"\n          ></u-avatar>\n        </view>\n      </view>\n\n      <view class=\"info_row\">\n        <user-info-row-item lable=\"群ID号\" :content=\"sourceGroupInfo.groupID\" />\n      </view>\n    </view>\n\n    <view class=\"action_row\">\n      <u-button type=\"primary\" v-if=\"!isJoinedGroup\" @click=\"joinGroup\"\n        >申请加入该群</u-button\n      >\n      <u-button type=\"primary\" v-else @click=\"chatingInGroup\">发消息</u-button>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { GroupMemberListTypes } from \"@/constant\";\nimport { navigateToDesignatedConversation } from \"@/util/imCommon\";\nimport IMSDK, {\n  GroupVerificationType,\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport dayjs from \"dayjs\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport UserInfoRowItem from \"../userCard/components/UserInfoRowItem.vue\";\n\nimport userIcon from \"static/images/contact_my_friend.png\";\n\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    UserInfoRowItem,\n  },\n  data() {\n    return {\n      sourceID: \"\",\n      isScan: false,\n      sourceGroupInfo: {},\n      groupMemberList: [],\n    };\n  },\n  computed: {\n    isJoinedGroup() {\n      return (\n        this.$store.getters.storeGroupList.findIndex(\n          (group) => group.groupID === this.sourceID,\n        ) !== -1\n      );\n    },\n    getCreateTime() {\n      return dayjs(this.sourceGroupInfo.createTime).format(\"YYYY-MM-DD\");\n    },\n    getRenderMemberList() {\n      if (this.isJoinedGroup) {\n        this.groupMemberList;\n        return this.groupMemberList;\n      }\n      const memberCount = this.sourceGroupInfo.memberCount ?? 0;\n      return new Array(memberCount >= 6 ? 6 : memberCount)\n        .fill(1)\n        .map((item, idx) => ({\n          userID: idx,\n          src: userIcon,\n        }));\n    },\n  },\n  onLoad(options) {\n    const { sourceID, sourceInfo, isScan } = options;\n    this.isScan = !!isScan;\n    if (sourceID) {\n      this.sourceID = sourceID;\n      this.getSourceGroupInfo();\n    } else {\n      const info = JSON.parse(sourceInfo);\n      this.sourceID = info.groupID;\n      this.sourceGroupInfo = {\n        ...info,\n      };\n    }\n    this.getGroupMemberList();\n  },\n  methods: {\n    toMemberList() {\n      if (this.isJoinedGroup) {\n        this.$store.dispatch(\"conversation/getCurrentGroup\", this.sourceID);\n        this.$store.dispatch(\n          \"conversation/getCurrentMemberInGroup\",\n          this.sourceID,\n        );\n        uni.navigateTo({\n          url: `/pages/conversation/groupMemberList/index?type=${GroupMemberListTypes.Preview}&groupID=${this.sourceID}`,\n        });\n      }\n    },\n    joinGroup() {\n      uni.$u.route(\"/pages/common/sendAddRequest/index\", {\n        isGroup: true,\n        sourceID: this.sourceID,\n        isScan: this.isScan,\n        notNeedVerification:\n          this.sourceGroupInfo.needVerification ===\n          GroupVerificationType.AllNot,\n        sessionType: SessionType.WorkingGroup,\n      });\n    },\n    chatingInGroup() {\n      navigateToDesignatedConversation(\n        this.sourceID,\n        SessionType.WorkingGroup,\n      ).catch(() => this.showToast(\"获取会话信息失败\"));\n    },\n    async getSourceGroupInfo() {\n      let info = null;\n      if (this.isJoinedGroup) {\n        info = this.$store.getters.storeGroupList.find(\n          (group) => group.groupID === this.sourceID,\n        );\n      } else {\n        try {\n          const { data } = await IMSDK.asyncApi(\n            IMSDK.IMMethods.GetSpecifiedGroupsInfo,\n            IMSDK.uuid(),\n            [this.sourceID],\n          );\n          info = data[0] ?? {};\n        } catch (e) {\n          info = {};\n        }\n      }\n      this.sourceGroupInfo = {\n        ...info,\n      };\n    },\n    getGroupMemberList() {\n      if (this.isJoinedGroup) {\n        IMSDK.asyncApi(IMSDK.IMMethods.GetGroupMemberList, IMSDK.uuid(), {\n          groupID: this.sourceID,\n          filter: 0,\n          offset: 0,\n          count: 6,\n        }).then(({ data }) => {\n          this.groupMemberList = [...data];\n        });\n      }\n    },\n    showToast(message) {\n      this.$refs.uToast.show({\n        message,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.group_card_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .main {\n    display: flex;\n    flex-direction: column;\n    flex: 1;\n  }\n\n  .base_info {\n    @include vCenterBox();\n    background-color: #fff;\n    padding: 44rpx;\n    margin-bottom: 18rpx;\n\n    .u-avatar {\n      margin-right: 24rpx;\n    }\n\n    .group_name {\n      display: flex;\n      margin-bottom: 12rpx;\n    }\n\n    .create_time {\n      @include vCenterBox();\n      justify-content: center;\n      color: #adadad;\n      font-size: 26rpx;\n\n      .u-icon {\n        margin-right: 12rpx;\n      }\n    }\n  }\n\n  .member_row {\n    padding: 24rpx 44rpx;\n\n    .member_desc {\n      margin-bottom: 24rpx;\n      position: relative;\n\n      .member_count {\n        font-size: 28rpx;\n        color: #adadad;\n        margin-left: 24rpx;\n      }\n\n      .u-icon {\n        position: absolute;\n        right: 0;\n        top: 0;\n      }\n    }\n\n    .member_list {\n      display: flex;\n\n      .member_item {\n        margin-right: 12rpx;\n\n        &:nth-child(7) {\n          margin-right: 0;\n        }\n      }\n    }\n  }\n\n  .info_row {\n    background-color: #fff;\n    margin-bottom: 24rpx;\n\n    /deep/ .content {\n      color: #adadad;\n    }\n  }\n\n  .action_row {\n    background-color: #fff;\n    padding: 44rpx 44rpx;\n  }\n\n  .online_state {\n    @include vCenterBox();\n    margin-left: 24rpx;\n    font-size: 24rpx;\n    color: #999;\n\n    .dot {\n      background-color: #10cc64;\n      width: 12rpx;\n      height: 12rpx;\n      border-radius: 50%;\n      margin-right: 12rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/markOrIDPage/index.vue",
    "content": "<template>\n  <view class=\"mark_id_container\">\n    <custom-nav-bar :title=\"getTitle\">\n      <view class=\"nav_right_action\" slot=\"more\">\n        <text v-show=\"!loading\" @click=\"saveOrCopy\">{{ getConfirmText }}</text>\n        <u-loading-icon v-show=\"loading\" />\n      </view>\n    </custom-nav-bar>\n\n    <view class=\"content_row\">\n      <u-input\n        :disabled=\"!isRemark && !isSelfNickname\"\n        v-model=\"content\"\n        disabledColor=\"transparent\"\n        maxlength=\"16\"\n        placeholder=\"请输入内容\"\n        clearable\n      >\n      </u-input>\n    </view>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\n\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport { businessInfoUpdate } from \"@/api/login\";\nexport default {\n  components: {\n    CustomNavBar,\n  },\n  props: {},\n  data() {\n    return {\n      content: \"\",\n      isRemark: false,\n      isSelfNickname: false,\n      sourceInfo: {},\n      loading: false,\n    };\n  },\n  computed: {\n    getTitle() {\n      if (this.isRemark) {\n        return \"设置备注\";\n      }\n      if (this.isSelfNickname) {\n        return \"我的姓名\";\n      }\n      return \"ID号\";\n    },\n    getConfirmText() {\n      return this.isRemark || this.isSelfNickname ? \"保存\" : \"复制\";\n    },\n  },\n  onLoad(options) {\n    const { isRemark, isSelfNickname, sourceInfo } = options;\n    this.sourceInfo = JSON.parse(sourceInfo);\n    this.isRemark = !!isRemark;\n    if (this.isRemark) {\n      this.content = this.sourceInfo.remark;\n    }\n    this.isSelfNickname = !!isSelfNickname;\n    if (this.isSelfNickname) {\n      this.content = this.sourceInfo.nickname;\n    }\n  },\n  methods: {\n    async saveOrCopy() {\n      if (this.isRemark) {\n        this.loading = true;\n        IMSDK.asyncApi(IMSDK.IMMethods.SetFriendRemark, IMSDK.uuid(), {\n          toUserID: this.sourceInfo.userID,\n          remark: this.content,\n        })\n          .then(() => {\n            uni.$u.toast(\"设置成功\");\n            setTimeout(() => uni.navigateBack(), 1000);\n          })\n          .catch((error) => {\n            console.log(error);\n            uni.$u.toast(\"设置失败\");\n          })\n          .finally(() => (this.loading = false));\n      } else if (this.isSelfNickname) {\n        this.loading = true;\n        try {\n          await businessInfoUpdate({\n            userID: this.sourceInfo.userID,\n            nickname: this.content,\n          });\n          await this.$store.dispatch(\"user/updateBusinessInfo\");\n          uni.$u.toast(\"修改成功\");\n          setTimeout(() => uni.navigateBack(), 1000);\n        } catch (e) {\n          console.log(e);\n          uni.$u.toast(\"修改失败\");\n        }\n        this.loading = false;\n      } else {\n        uni.setClipboardData({\n          data: this.sourceInfo.userID,\n          success: () => {\n            uni.hideToast();\n            this.$nextTick(() => {\n              uni.$u.toast(\"复制成功\");\n            });\n          },\n        });\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.mark_id_container {\n  @include colBox(false);\n  height: 100vh;\n\n  .nav_right_action {\n    margin-right: 36rpx;\n  }\n\n  .content_row {\n    margin-top: 96rpx;\n    margin: 72rpx 44rpx 0;\n\n    .u-input {\n      background-color: #e8eaef;\n    }\n\n    .u-button {\n      height: 60rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/searchUserOrGroup/index.vue",
    "content": "<template>\n  <view class=\"search_container\">\n    <custom-nav-bar :route=\"false\">\n      <view slot=\"left\"> </view>\n      <view class=\"search_bar\" slot=\"center\">\n        <u-search\n          actionText=\"取消\"\n          @change=\"keywordChange\"\n          @custom=\"cancel\"\n          @search=\"startSearch\"\n          shape=\"square\"\n          :placeholder=\"getPlaceholder\"\n          v-model=\"keyword\"\n        />\n      </view>\n    </custom-nav-bar>\n\n    <view v-show=\"!empty && !searching\" @click=\"startSearch(keyword)\" class=\"result_row\">\n      <image class=\"icon\" :src=\"getIcon\" alt=\"\" />\n      <view class=\"\">\n        <text>查找：</text>\n        <text>{{ keyword }}</text>\n      </view>\n    </view>\n\n    <view v-show=\"searching && !empty\" class=\"result_row result_row_empty\">\n      <u-loading-icon></u-loading-icon>\n    </view>\n\n    <view v-show=\"empty\" class=\"result_row result_row_empty\">\n      <text>未搜索到相关结果</text>\n    </view>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\n\nimport searchGroup from \"static/images/contact_add_join_group_fill.png\";\nimport searchUser from \"static/images/contact_add_search_user_fill.png\";\nimport { businessSearchUserInfo } from \"@/api/login\";\n\nexport default {\n  components: {\n    CustomNavBar,\n  },\n  data() {\n    return {\n      keyword: \"\",\n      searching: false,\n      empty: false,\n      isSearchGroup: false,\n    };\n  },\n  computed: {\n    getIcon() {\n      return this.isSearchGroup ? searchGroup : searchUser;\n    },\n    getPlaceholder() {\n      return this.isSearchGroup ? \"请输入群聊ID\" : \"搜索ID或手机号添加好友\";\n    },\n  },\n  onLoad(options) {\n    const { isSearchGroup } = options;\n    this.isSearchGroup = JSON.parse(isSearchGroup);\n  },\n  methods: {\n    cancel() {\n      console.log(\"cancel\");\n      uni.navigateBack();\n    },\n    keywordChange() {\n      if (this.empty) {\n        this.empty = !this.empty;\n      }\n    },\n    async startSearch(value) {\n      if (!value) return;\n      this.searching = true;\n      try {\n        if (this.isSearchGroup) {\n          let info = this.$store.getters.storeGroupList.find(\n            (item) => item.groupID === value,\n          );\n          if (!info) {\n            const { data } = await IMSDK.asyncApi(\n              IMSDK.IMMethods.GetSpecifiedGroupsInfo,\n              IMSDK.uuid(),\n              [value],\n            );\n            info = data[0];\n          }\n          if (info) {\n            uni.navigateTo({\n              url: `/pages/common/groupCard/index?sourceInfo=${JSON.stringify(\n                info,\n              )}`,\n            });\n          } else {\n            this.empty = true;\n          }\n        } else {\n          let info = this.$store.getters.storeFriendList.find(\n            (item) => item.userID === value,\n          );\n          if (!info) {\n            const { total, users } = await businessSearchUserInfo(value);\n            if (total > 0) {\n              const { data } = await IMSDK.asyncApi(\n                IMSDK.IMMethods.GetUsersInfo,\n                IMSDK.uuid(),\n                [users[0].userID],\n              );\n              const imData = data[0];\n\n              info = {\n                ...imData,\n                ...users[0],\n              };\n            }\n          }\n          if (info) {\n            uni.navigateTo({\n              url: `/pages/common/userCard/index?sourceInfo=${JSON.stringify(\n                info,\n              )}`,\n            });\n          } else {\n            this.empty = true;\n          }\n        }\n      } catch (e) {\n        //TODO handle the exception\n      }\n      this.searching = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.search_container {\n  height: 100vh;\n  background-color: #f8f8f8;\n\n  .search_bar {\n    width: 100%;\n    padding: 0 44rpx;\n  }\n\n  .result_row {\n    @include vCenterBox();\n    padding: 24rpx 44rpx;\n    font-size: 28rpx;\n    color: $uni-text-color;\n    background-color: #fff;\n\n    .icon {\n      width: 20px;\n      height: 20px;\n      margin-right: 24rpx;\n    }\n\n    &_empty {\n      display: flex;\n      justify-content: center;\n      color: #999;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/sendAddRequest/index.vue",
    "content": "<template>\n  <view class=\"request_join_container\">\n    <custom-nav-bar :title=\"isGroup ? '群聊验证' : '好友验证'\">\n      <view class=\"top_right_btn\" slot=\"more\">\n        <u-button @click=\"sendRequest\" text=\"发送\" type=\"primary\"></u-button>\n      </view>\n    </custom-nav-bar>\n\n    <text class=\"title\">{{ `发送${isGroup ? \"入群\" : \"好友\"}申请` }}</text>\n\n    <view class=\"input_container\">\n      <u--textarea\n        height=\"120\"\n        v-model=\"reason\"\n        border=\"none\"\n        placeholder=\"请输入内容\"\n        maxlength=\"20\"\n        count\n      >\n      </u--textarea>\n    </view>\n  </view>\n</template>\n\n<script>\nimport IMSDK, { GroupJoinSource } from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport { navigateToDesignatedConversation } from \"@/util/imCommon\";\n\nexport default {\n  components: {\n    CustomNavBar,\n  },\n  data() {\n    return {\n      reason: \"\",\n      sourceID: \"\",\n      isGroup: false,\n      isScan: false,\n      notNeedVerification: false,\n      sessionType: 0,\n    };\n  },\n  onLoad(options) {\n    const { isGroup, sourceID, isScan, notNeedVerification, sessionType } =\n      options;\n    this.isGroup = JSON.parse(isGroup);\n    this.isScan = JSON.parse(isScan);\n    this.sourceID = sourceID;\n    this.notNeedVerification = JSON.parse(notNeedVerification);\n    this.sessionType = sessionType ?? 0;\n  },\n  methods: {\n    sendRequest() {\n      let func;\n      if (this.isGroup) {\n        const joinSource = this.isScan\n          ? GroupJoinSource.QrCode\n          : GroupJoinSource.Search;\n        func = IMSDK.asyncApi(IMSDK.IMMethods.JoinGroup, IMSDK.uuid(), {\n          groupID: this.sourceID,\n          reqMsg: this.reason,\n          joinSource,\n        });\n      } else {\n        func = IMSDK.asyncApi(IMSDK.IMMethods.AddFriend, IMSDK.uuid(), {\n          toUserID: this.sourceID,\n          reqMsg: this.reason,\n        });\n      }\n      func\n        .then(() => {\n          uni.$u.toast(this.notNeedVerification ? \"你已加入该群\" : \"发送成功\");\n          setTimeout(() => {\n            if (this.notNeedVerification) {\n              navigateToDesignatedConversation(\n                this.sourceID,\n                Number(this.sessionType),\n              ).catch(() => this.showToast(\"获取会话信息失败\"));\n            } else {\n              uni.navigateBack();\n            }\n          }, 1000);\n        })\n        .catch((err) => {\n          console.log(err);\n          uni.$u.toast(\"发送失败\");\n        });\n    },\n    showToast(message) {\n      this.$refs.uToast.show({\n        message,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.request_join_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .top_right_btn {\n    margin-right: 44rpx;\n\n    .u-button {\n      height: 48rpx;\n    }\n  }\n\n  .title {\n    font-size: 28rpx;\n    color: #999;\n    margin: 24rpx 44rpx;\n  }\n\n  .input_container {\n    /deep/.u-textarea {\n      padding: 24rpx 44rpx !important;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/userCard/components/UserInfoRowItem.vue",
    "content": "<template>\n  <view @click=\"click\" class=\"row_item\" :class=\"{ arrow_right: arrow }\">\n    <view class=\"title\">\n      <text>{{ lable }}</text>\n    </view>\n    <view class=\"content\">\n      <text>{{ content }}</text>\n    </view>\n    <slot>\n      <u-icon v-if=\"arrow\" name=\"arrow-right\" color=\"#999\" size=\"20\"></u-icon>\n    </slot>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"\",\n  components: {},\n  props: {\n    lable: String,\n    content: String,\n    arrow: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    click() {\n      this.$emit(\"click\");\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.row_item {\n  @include vCenterBox();\n  padding: 24rpx 44rpx;\n}\n\n.title {\n  margin-right: 24rpx;\n}\n\n.arrow_right {\n  justify-content: space-between;\n}\n</style>\n"
  },
  {
    "path": "pages/common/userCard/index.vue",
    "content": "<template>\n  <view class=\"user_card_container\">\n    <u-loading-page :loading=\"isLoading\" loading-text=\"loading...\"></u-loading-page>\n    <custom-nav-bar title=\"\" />\n\n    <view v-if=\"!isLoading\" style=\"flex: 1;display: flex;flex-direction: column;\">\n      <view class=\"base_info\">\n        <my-avatar\n          :desc=\"sourceUserInfo.remark || sourceUserInfo.nickname\"\n          :src=\"sourceUserInfo.faceURL\"\n          size=\"46\"\n        />\n        <view class=\"user_name\">\n          <text class=\"text\">{{ getShowName }}</text>\n          <text class=\"id\" @click=\"copy(sourceUserInfo.userID)\">{{\n            sourceUserInfo.userID\n          }}</text>\n        </view>\n        <view class=\"add_btn\" @click=\"toAddFriend\" v-if=\"trySendRequest\">\n          <u-button type=\"primary\" icon=\"man-add\" text=\"添加\"></u-button>\n        </view>\n      </view>\n\n      <view v-if=\"isFriend\" class=\"info_row\">\n        <user-info-row-item @click=\"toMoreInfo\" lable=\"个人资料\" arrow />\n      </view>\n\n      <view class=\"action_row\" v-if=\"!isSelf\">\n        <view @click=\"toDesignatedConversation\" class=\"action_item\">\n          <img src=\"static/images/user_card_message.png\" alt=\"\" />\n          <text>发消息</text>\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { navigateToDesignatedConversation } from \"@/util/imCommon\";\nimport IMSDK, {\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport UserInfoRowItem from \"./components/UserInfoRowItem.vue\";\nimport { businessSearchUserInfo } from \"@/api/login\";\n\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    UserInfoRowItem,\n  },\n  data() {\n    return {\n      isLoading: false,\n      sourceID: \"\",\n      sourceUserInfo: {},\n      switchLoading: false,\n      showSetRole: false,\n    };\n  },\n  computed: {\n    ...mapGetters([\n      \"storeFriendList\",\n      \"storeSelfInfo\",\n    ]),\n    isFriend() {\n      return (\n        this.storeFriendList.findIndex(\n          (friend) => friend.userID === this.sourceID,\n        ) !== -1\n      );\n    },\n    trySendRequest() {\n      return !this.isFriend && !this.isSelf\n    },\n    isSelf() {\n      return this.sourceID === this.storeSelfInfo.userID;\n    },\n    getShowName() {\n      let suffix = \"\";\n      if (this.sourceUserInfo.remark) {\n        suffix = `(${this.sourceUserInfo.remark})`;\n      }\n      return this.sourceUserInfo.nickname + suffix;\n    },\n  },\n  onLoad(options) {\n    const { sourceID, sourceInfo } = options;\n    if (sourceID) {\n      this.sourceID = sourceID;\n    } else {\n      const info = JSON.parse(sourceInfo);\n      this.sourceID = info.userID;\n    }\n    this.getSourceUserInfo();\n  },\n  methods: {\n    copy(userID) {\n      uni.setClipboardData({\n        showToast: false,\n        data: userID,\n        success: function () {\n          uni.showToast({\n            icon: \"none\",\n            title: \"复制成功\",\n          });\n        },\n      });\n    },\n    async getSourceUserInfo() {\n      let info = {};\n      const friendInfo = this.storeFriendList.find((item) => item.userID === this.sourceID);\n      if (friendInfo) {\n        info = { ...friendInfo };\n      }\n      else {\n        const { data } = await IMSDK.asyncApi(\n          IMSDK.IMMethods.GetUsersInfo,\n          IMSDK.uuid(),\n          [this.sourceID],\n        );\n        info = { ...(data[0] ?? {}) };\n      }\n      this.isLoading = true\n      try {\n        const { total, users } = await businessSearchUserInfo(this.sourceID);\n        if (total > 0) {\n          const { data } = await IMSDK.asyncApi(\n            IMSDK.IMMethods.GetUsersInfo,\n            IMSDK.uuid(),\n            [this.sourceID],\n          );\n          const imData = data[0]?.friendInfo ?? data[0]?.publicInfo ?? {};\n          info = {\n            ...imData,\n            ...users[0],\n          };\n        }\n      } catch (e) {\n        info = {};\n      }\n      this.isLoading = false\n      this.sourceUserInfo = {\n        ...info,\n      };\n    },\n    toAddFriend() {\n      uni.$u.route(\"/pages/common/sendAddRequest/index\", {\n        isGroup: false,\n        sourceID: this.sourceID,\n        isScan: false,\n        notNeedVerification: false,\n      });\n    },\n    toDesignatedConversation() {\n      navigateToDesignatedConversation(\n        this.sourceID,\n        SessionType.Single,\n        false,\n      ).catch(() => uni.$u.toast(\"获取会话信息失败\"));\n    },\n    toMoreInfo() {\n      uni.navigateTo({\n        url: `/pages/common/userCardMore/index?sourceInfo=${JSON.stringify(\n          this.sourceUserInfo,\n        )}`,\n      });\n    }\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.user_card_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n  overflow-y: auto;\n  position: relative;\n\n  .base_info {\n    @include vCenterBox();\n    background-color: #fff;\n    padding: 44rpx;\n    margin-bottom: 18rpx;\n\n    .add_btn {\n      width: 140rpx;\n      height: 60rpx;\n      margin-left: auto;\n\n      .u-button {\n        width: 140rpx;\n        height: 60rpx;\n      }\n    }\n\n    .u-avatar {\n      margin-right: 24rpx;\n    }\n\n    .user_name {\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n      margin-bottom: 12rpx;\n      height: 46px;\n\n      .text {\n        @include nomalEllipsis();\n        max-width: 300rpx;\n      }\n    }\n\n    .company {\n      font-size: 28rpx;\n      color: $u-primary;\n    }\n  }\n\n  .info_row {\n    background-color: #fff;\n    margin-bottom: 24rpx;\n  }\n\n  .mute_right {\n    display: flex;\n    align-items: center;\n  }\n\n  .company_row {\n    padding: 20rpx 0;\n\n    .desc_title {\n      padding-left: 44rpx;\n    }\n\n    /deep/.title {\n      width: 200rpx;\n      color: #999 !important;\n    }\n  }\n\n  .action_row {\n    @include vCenterBox();\n    align-items: flex-end;\n    justify-content: space-around;\n    margin: 44rpx;\n    flex: 1;\n\n    .action_item {\n      width: 100%;\n      @include colBox(true);\n      flex-direction: row;\n      align-items: center;\n      justify-content: center;\n      padding: 22rpx 0;\n      background: $u-primary;\n      color: #fff;\n      border-radius: 12rpx;\n\n      img {\n        margin-right: 16rpx;\n        width: 40rpx;\n        height: 40rpx;\n      }\n    }\n  }\n\n  .id {\n    font-size: 24rpx;\n    color: #999;\n  }\n\n  .online_state {\n    @include vCenterBox();\n    margin-left: 24rpx;\n    font-size: 24rpx;\n    color: #999;\n\n    .dot {\n      background-color: #10cc64;\n      width: 12rpx;\n      height: 12rpx;\n      border-radius: 50%;\n      margin-right: 12rpx;\n    }\n\n    .online_str {\n      @include nomalEllipsis();\n      max-width: 280rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/userCardMore/index.vue",
    "content": "<template>\n  <view class=\"user_more_container\">\n    <custom-nav-bar title=\"好友设置\" />\n\n    <view class=\"info_row\">\n      <user-info-row-item @click=\"toMark\" lable=\"设置备注\" arrow />\n      <user-info-row-item @click=\"toMore\" lable=\"个人资料\" arrow />\n    </view>\n\n    <view class=\"info_row\">\n      <user-info-row-item lable=\"加入黑名单\" arrow>\n        <u-switch\n          asyncChange\n          :loading=\"blackLoading\"\n          size=\"20\"\n          :value=\"isBlacked\"\n          @change=\"change\"\n        ></u-switch>\n      </user-info-row-item>\n    </view>\n\n    <view v-if=\"isFriend\" class=\"info_row\">\n      <u-button\n        @click=\"() => (showConfirm = true)\"\n        type=\"error\"\n        plain\n        text=\"解除好友关系\"\n      ></u-button>\n    </view>\n    <u-toast ref=\"uToast\"></u-toast>\n    <u-modal\n      :content=\"`确定要解除与${sourceInfo.nickname}的好友关系吗？`\"\n      asyncClose\n      :show=\"showConfirm\"\n      showCancelButton\n      @confirm=\"confirmRemove\"\n      @cancel=\"() => (showConfirm = false)\"\n    ></u-modal>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport UserInfoRowItem from \"../userCard/components/UserInfoRowItem.vue\";\nimport { ContactChooseTypes } from \"@/constant\";\nexport default {\n  components: {\n    CustomNavBar,\n    UserInfoRowItem,\n  },\n  data() {\n    return {\n      blackLoading: false,\n      sourceInfo: {},\n      showConfirm: false,\n    };\n  },\n  computed: {\n    isFriend() {\n      return (\n        this.$store.getters.storeFriendList.findIndex(\n          (friend) => friend.userID === this.sourceInfo.userID,\n        ) !== -1\n      );\n    },\n    isBlacked() {\n      return (\n        this.$store.getters.storeBlackList.findIndex(\n          (black) => black.userID === this.sourceInfo.userID,\n        ) !== -1\n      );\n    },\n  },\n  onLoad(options) {\n    const { sourceInfo } = options;\n    this.sourceInfo = JSON.parse(sourceInfo);\n  },\n  methods: {\n    change(isBlack) {\n      this.blackLoading = true;\n      if (isBlack) {\n        IMSDK.asyncApi(IMSDK.IMMethods.AddBlack, IMSDK.uuid(), {\n          toUserID: this.sourceInfo.userID,\n          ex: \"\",\n        })\n          .catch(() => this.showToast(\"操作失败\"))\n          .finally(() => (this.blackLoading = false));\n        return;\n      }\n      IMSDK.asyncApi(\n        IMSDK.IMMethods.RemoveBlack,\n        IMSDK.uuid(),\n        this.sourceInfo.userID\n      )\n        .catch(() => this.showToast(\"操作失败\"))\n        .finally(() => (this.blackLoading = false));\n    },\n    confirmRemove() {\n      IMSDK.asyncApi(\n        IMSDK.IMMethods.DeleteFriend,\n        IMSDK.uuid(),\n        this.sourceInfo.userID,\n      )\n        .then(() => this.showToast(\"操作成功\"))\n        .catch(() => this.showToast(\"操作失败\"))\n        .finally(() => (this.showConfirm = false));\n    },\n    toMore() {\n      uni.navigateTo({\n        url: `/pages/common/detailsFileds/index?sourceInfo=${JSON.stringify(\n          this.sourceInfo,\n        )}`,\n      });\n    },\n    toMark() {\n      uni.navigateTo({\n        url: `/pages/common/markOrIDPage/index?isRemark=true&sourceInfo=${JSON.stringify(\n          this.sourceInfo,\n        )}`,\n      });\n    },\n    toShare() {\n      uni.navigateTo({\n        url: `/pages/common/contactChoose/index?type=${\n          ContactChooseTypes.ShareCard\n        }&cardInfo=${JSON.stringify(this.sourceInfo)}`,\n      });\n    },\n    showToast(message) {\n      this.$refs.uToast.show({\n        message,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.user_more_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .info_row {\n    background-color: #fff;\n    margin: 24rpx;\n    border-radius: 6px;\n    overflow: hidden;\n\n    .u-button {\n      border: none;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/common/webviewWrapper/index.vue",
    "content": "<template>\n  <web-view :src=\"url\"></web-view>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      url: \"\",\n    };\n  },\n  onLoad(options) {\n    this.url = decodeURIComponent(options.url);\n  },\n};\n</script>\n\n<style lang=\"scss\"></style>\n"
  },
  {
    "path": "pages/contact/applicationDetails/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <custom-nav-bar :title=\"isGroupApplication ? '群通知' : '好友请求'\" />\n\n    <view class=\"application_item\">\n      <view class=\"base_info_row\">\n        <view class=\"base_info_left\" @click=\"toSourceDetails\">\n          <my-avatar :src=\"getSourceFaceURL\" :desc=\"getSourceName\" />\n          <view class=\"base_info_details\">\n            <text class=\"nickname\">{{ getSourceName }}</text>\n          </view>\n        </view>\n\n        <u-icon name=\"arrow-right\" size=\"18\" color=\"#999\"></u-icon>\n      </view>\n\n      <view class=\"request_message\">\n        <view v-if=\"isGroupApplication\" class=\"title\">\n          <text>申请加入 </text>\n          <text class=\"group_name\">{{ currentApplication.groupName }}</text>\n        </view>\n        <text v-else>{{ `${getSourceName}：` }}</text>\n        <text>{{ currentApplication.reqMsg }}</text>\n      </view>\n\n    </view>\n\n    <view class=\"action_row\">\n      <u-button\n        :loading=\"loadingState.accept\"\n        @click=\"acceptAplication\"\n        type=\"primary\"\n        :plain=\"true\"\n        :text=\"`通过${isGroupApplication ? '入群' : '好友'}申请`\"\n      ></u-button>\n    </view>\n\n    <view class=\"action_row\">\n      <u-button\n        :loading=\"loadingState.refuse\"\n        @click=\"refuseAplication\"\n        type=\"primary\"\n        :plain=\"true\"\n        :text=\"`拒绝${isGroupApplication ? '入群' : '好友'}申请`\"\n      ></u-button>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport IMSDK, { GroupJoinSource } from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n  },\n  data() {\n    return {\n      currentApplication: {},\n      isOnline: false,\n      loadingState: {\n        accept: false,\n        refuse: false,\n      },\n    };\n  },\n  computed: {\n    ...mapGetters([\"storeSelfInfo\"]),\n    isGroupApplication() {\n      return this.currentApplication.groupID !== undefined;\n    },\n    getSourceID() {\n      return (\n        this.currentApplication.fromUserID ?? this.currentApplication.userID\n      );\n    },\n    getSourceName() {\n      return (\n        this.currentApplication.fromNickname ?? this.currentApplication.nickname\n      );\n    },\n    getSourceFaceURL() {\n      return (\n        this.currentApplication.fromFaceURL ?? this.currentApplication.faceURL\n      );\n    },\n  },\n  onLoad(options) {\n    const { application } = options;\n    this.currentApplication = JSON.parse(application);\n  },\n  methods: {\n    toSourceDetails() {\n      uni.navigateTo({\n        url: `/pages/common/userCard/index?sourceID=${this.getSourceID}`,\n      });\n    },\n    acceptAplication() {\n      this.loadingState.accept = true;\n      let func;\n      if (this.isGroupApplication) {\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.AcceptGroupApplication,\n          IMSDK.uuid(),\n          {\n            groupID: this.currentApplication.groupID,\n            fromUserID: this.currentApplication.userID,\n            handleMsg: \"\",\n          },\n        );\n      } else {\n        console.log(this.currentApplication);\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.AcceptFriendApplication,\n          IMSDK.uuid(),\n          {\n            toUserID: this.currentApplication.fromUserID,\n            handleMsg: \"\",\n          },\n        );\n      }\n      func\n        .then(() => {\n          uni.$u.toast(\"操作成功\");\n          setTimeout(() => uni.navigateBack(), 500);\n        })\n        .catch((e) => {\n          console.log(e);\n          uni.$u.toast(\"操作失败\");\n        })\n        .finally(() => (this.loadingState.accept = false));\n    },\n    refuseAplication() {\n      this.loadingState.refuse = true;\n      let func;\n      if (this.isGroupApplication) {\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.RefuseGroupApplication,\n          IMSDK.uuid(),\n          {\n            groupID: this.currentApplication.groupID,\n            fromUserID: this.currentApplication.userID,\n            handleMsg: \"\",\n          },\n        );\n      } else {\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.RefuseFriendApplication,\n          IMSDK.uuid(),\n          {\n            toUserID: this.currentApplication.fromUserID,\n            handleMsg: \"\",\n          },\n        );\n      }\n      func\n        .then(() => {\n          uni.$u.toast(\"操作成功\");\n          setTimeout(() => uni.navigateBack(), 250);\n        })\n        .catch(() => uni.$u.toast(\"操作失败\"))\n        .finally(() => (this.loadingState.refuse = false));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.page_container {\n  background-color: #f8f8f8;\n\n  .application_item {\n    padding: 72rpx 44rpx 24rpx;\n    background-color: #fff;\n\n    .base_info_row {\n      @include btwBox();\n\n      .base_info_left {\n        @include vCenterBox();\n      }\n\n      .base_info_details {\n        margin-left: 24rpx;\n\n        .nickname {\n          @include nomalEllipsis();\n          max-width: 600rpx;\n        }\n\n        .online_state {\n          @include vCenterBox();\n          flex-direction: row;\n          font-size: 24rpx;\n          color: #999;\n          margin-top: 6rpx;\n\n          .dot {\n            background-color: #10cc64;\n            width: 12rpx;\n            height: 12rpx;\n            border-radius: 50%;\n            margin-right: 12rpx;\n          }\n        }\n      }\n    }\n\n    .request_message {\n      background-color: #eee;\n      margin-top: 48rpx;\n      padding: 24rpx 36rpx;\n      border-radius: 12rpx;\n      font-size: 28rpx;\n      color: #666;\n      min-height: 240rpx;\n\n      .title {\n        margin-bottom: 12rpx;\n        color: $uni-text-color;\n\n        .group_name {\n          @nomalEllipsis();\n          max-width: 400rpx;\n          color: $uni-color-primary;\n          margin-left: 12rpx;\n        }\n      }\n    }\n\n    .join_source {\n      margin-top: 20rpx;\n      font-size: 24rpx;\n      color: #666;\n      text-align: right;\n    }\n  }\n\n  .action_row {\n    margin-top: 24rpx;\n\n    .u-button {\n      border: none;\n    }\n\n    &:last-child {\n      .u-button {\n        color: #999 !important;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/applicationList/ApplicationItem.vue",
    "content": "<template>\n  <view @click=\"clickItem\" class=\"application_item\">\n    <my-avatar\n      :src=\"getAvatarUrl\"\n      :isGroup=\"isGroupApplication\"\n      :desc=\"application[isRecv ? 'fromNickname' : 'toNickname']\"\n      size=\"42\"\n    />\n    <view class=\"application_item_details\">\n      <view class=\"content\">\n        <text class=\"user_name\">{{ getShowName }}</text>\n\n        <view v-if=\"isGroupApplication\" class=\"title\">\n          申请加入\n          <text class=\"group_name\">{{ application.groupName }}</text>\n        </view>\n        <text class=\"req_message\">{{ application.reqMsg }}</text>\n      </view>\n\n      <view class=\"application_action\">\n        <text v-if=\"showStateStr\" class=\"status_tip\">{{ getStateStr }}</text>\n        <text v-if=\"showGreet\" @tap.stop=\"greetToUser\" class=\"status_tip greet\"\n          >打招呼</text\n        >\n        <button\n          :loading=\"accessLoading\"\n          v-if=\"showAccept\"\n          class=\"access_btn\"\n          @tap.stop=\"acceptApplication\"\n          type=\"primary\"\n          :plain=\"true\"\n          size=\"mini\"\n        >\n          {{ isGroupApplication ? \"同意\" : \"接受\" }}\n        </button>\n      </view>\n\n      <view class=\"bottom_line\"> </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { navigateToDesignatedConversation } from \"@/util/imCommon\";\nimport IMSDK, { SessionType } from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nexport default {\n  name: \"ApplicationItem\",\n  components: {\n    MyAvatar,\n  },\n  props: {\n    application: Object,\n    isRecv: Boolean,\n  },\n  data() {\n    return {\n      accessLoading: false,\n    };\n  },\n  computed: {\n    isGroupApplication() {\n      return this.application.groupID !== undefined;\n    },\n    getShowName() {\n      if (this.isRecv) {\n        return this.application[\n          this.isGroupApplication ? \"nickname\" : \"fromNickname\"\n        ];\n      }\n      return this.application[\n        this.isGroupApplication ? \"groupName\" : \"toNickname\"\n      ];\n    },\n    showGreet() {\n      return !this.isGroupApplication && this.application.handleResult === 1;\n    },\n    showStateStr() {\n      if (\n        (this.isRecv && this.application.handleResult === 0) ||\n        this.showGreet\n      ) {\n        return false;\n      }\n      return true;\n    },\n    showAccept() {\n      return this.application.handleResult === 0 && this.isRecv;\n    },\n    getStateStr() {\n      if (this.application.handleResult === -1) {\n        return \"已拒绝\";\n      }\n      if (this.application.handleResult === 0) {\n        return \"等待验证\";\n      }\n      return \"已同意\";\n    },\n    getAvatarUrl() {\n      if (this.isGroupApplication) {\n        return this.application.groupFaceURL;\n      }\n      return this.application[this.isRecv ? \"fromFaceURL\" : \"toFaceURL\"];\n    },\n  },\n  methods: {\n    clickItem() {\n      if (this.showAccept) {\n        uni.navigateTo({\n          url: `/pages/contact/applicationDetails/index?application=${JSON.stringify(\n            this.application,\n          )}`,\n        });\n      } else {\n        let sourceID =\n          this.application.groupID ??\n          (this.isRecv\n            ? this.application.fromUserID\n            : this.application.toUserID);\n        let cardType = this.isGroupApplication ? \"groupCard\" : \"userCard\";\n        const url = `/pages/common/${cardType}/index?sourceID=${sourceID}`;\n        uni.navigateTo({\n          url,\n        });\n      }\n    },\n    acceptApplication() {\n      this.accessLoading = true;\n      let func;\n      if (this.isGroupApplication) {\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.AcceptGroupApplication,\n          IMSDK.uuid(),\n          {\n            groupID: this.application.groupID,\n            fromUserID: this.application.userID,\n            handleMsg: \"\",\n          },\n        );\n      } else {\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.AcceptFriendApplication,\n          IMSDK.uuid(),\n          {\n            toUserID: this.application.fromUserID,\n            handleMsg: \"\",\n          },\n        );\n      }\n      func\n        .then(() => uni.$u.toast(\"操作成功\"))\n        .catch(() => uni.$u.toast(\"操作失败\"))\n        .finally(() => (this.accessLoading = false));\n    },\n    greetToUser() {\n      navigateToDesignatedConversation(\n        this.application[this.isRecv ? \"fromUserID\" : \"toUserID\"],\n        SessionType.Single,\n      ).catch(() => uni.$u.toast(\"获取会话信息失败\"));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.application_item {\n  // @include vCenterBox();\n  display: flex;\n  justify-content: flex-start;\n  padding: 24rpx 44rpx;\n  color: $uni-text-color;\n  background-color: #fff;\n\n  &_details {\n    @include vCenterBox();\n    margin-left: 24rpx;\n    width: 100%;\n    position: relative;\n\n    .content {\n      @include colBox(false);\n      font-size: 26rpx;\n      width: 100%;\n\n      .user_name {\n        @include nomalEllipsis();\n        max-width: 400rpx;\n        font-size: 28rpx;\n        color: $uni-text-color;\n        margin-bottom: 10rpx;\n      }\n\n      .req_message {\n        @include ellipsisWithLine(2);\n        max-width: 80%;\n        color: #999;\n      }\n\n      .title {\n        margin-bottom: 20rpx;\n        word-break: break-all;\n        width: 75%;\n\n        .group_name {\n          margin-left: 12rpx;\n          color: $uni-color-primary;\n        }\n      }\n    }\n\n    .application_action {\n      position: absolute;\n      right: 0;\n\n      .status_tip {\n        font-size: 28rpx;\n        color: #666;\n      }\n\n      .access_btn {\n        padding: 0 12rpx;\n        height: 48rpx;\n        line-height: 48rpx;\n      }\n\n      .greet {\n        color: #418ae5;\n      }\n    }\n\n    .bottom_line {\n      height: 1px;\n      width: 100%;\n      background-color: #f0f0f0;\n      position: absolute;\n      bottom: -24rpx;\n    }\n  }\n}\n\n.u-list-item:last-child {\n  .bottom_line {\n    height: 0;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/applicationList/index.vue",
    "content": "<template>\n  <view class=\"application_list_container\">\n    <custom-nav-bar :title=\"isGroupApplication ? '新的群聊' : '新的好友'\" />\n    <view\n      class=\"pane_row\"\n      :style=\"{ transform: `translateX(${isRecv ? '0' : '-100%'})` }\"\n    >\n      <view class=\"pane_content\">\n        <u-list v-if=\"getRecvRenderData.length > 0\" class=\"application_list\">\n          <u-list-item\n            v-for=\"application in getRecvRenderData\"\n            :key=\"\n              application[!isGroupApplication ? 'fromUserID' : 'userID'] +\n              application.groupID\n            \"\n          >\n            <application-item :isRecv=\"true\" :application=\"application\" />\n          </u-list-item>\n        </u-list>\n        <u-list\n          v-else-if=\"getSendRenderData.length > 0\"\n          class=\"application_list\"\n        >\n          <u-list-item\n            v-for=\"application in getSendRenderData\"\n            :key=\"application[!isGroupApplication ? 'toUserID' : 'groupID']\"\n          >\n            <application-item :application=\"application\" />\n          </u-list-item>\n        </u-list>\n        <view v-else class=\"empty\">\n          <image src=\"@/static/images/block_empty.png\"></image>\n          <text class=\"empty_text\">暂无数据</text>\n        </view>\n      </view>\n\t  </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { ContactMenuTypes } from \"@/constant\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport ApplicationItem from \"./ApplicationItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    ApplicationItem,\n  },\n  data() {\n    return {\n      keyword: \"\",\n      isRecv: true,\n      isGroupApplication: false,\n    };\n  },\n  computed: {\n    ...mapGetters([\n      \"storeRecvFriendApplications\",\n      \"storeSentFriendApplications\",\n      \"storeRecvGroupApplications\",\n      \"storeSentGroupApplications\",\n    ]),\n    getRecvRenderData() {\n      const tmpList = this.isGroupApplication\n        ? this.storeRecvGroupApplications\n        : this.storeRecvFriendApplications;\n      tmpList.sort((a, b) => (a.handleResult === 0 ? -1 : 1));\n      return tmpList.slice(0, 4);\n    },\n    getSendRenderData() {\n      const tmpList = this.isGroupApplication\n        ? this.storeSentGroupApplications\n        : this.storeSentFriendApplications;\n      tmpList.sort((a, b) => (a.handleResult === 0 ? -1 : 1));\n      return tmpList.slice(0, 4);\n    },\n    tabList() {\n      return [\n        {\n          name: this.isGroupApplication ? \"入群申请\" : \"好友请求\",\n        },\n        {\n          name: \"我的请求\",\n        },\n      ];\n    },\n  },\n  onLoad(params) {\n    const { applicationType } = params;\n    this.isGroupApplication = applicationType === ContactMenuTypes.NewGroup;\n  },\n  methods: {\n    clickTab({ index }) {\n      this.isRecv = index === 0;\n    },\n    previewAll() {\n      uni.navigateTo({\n        url: `/pages/contact/applicationListDetails/index?isGroupApplication=${this.isGroupApplication}&isRecv=${this.isRecv}`,\n      });\n    },\n    toSearch() {\n      uni.navigateTo({\n        url: `/pages/common/searchUserOrGroup/index?isSearchGroup=${this.isGroupApplication}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.empty {\n  @include centerBox();\n  flex-direction: column;\n  margin-top: 25vh !important;\n\n  &_text {\n    margin-top: 26rpx;\n    color: #8e9ab0;\n  }\n  image {\n    width: 237rpx;\n    height: 244rpx;\n  }\n}\n.application_list_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f8f9fa;\n  overflow-x: hidden;\n\n  .search_bar_wrap {\n    height: 34px;\n    padding: 12px 22px;\n    background-color: #fff;\n  }\n\n  .u-tabs {\n    background-color: #fff;\n  }\n\n  .pane_row {\n    display: flex;\n    flex: 1;\n    transition: all 0.3s ease 0s !important;\n    background-color: #fff;\n    margin-top: 20rpx;\n\n    .pane_content {\n      @include colBox(false);\n      height: 100%;\n      flex: 0 0 100%;\n\n      .pane_title {\n        font-size: 28rpx;\n        color: #999;\n        padding: 12rpx 44rpx;\n        background-color: #f8f8f8;\n      }\n\n      .application_list {\n        flex: 1;\n        height: 100% !important;\n      }\n    }\n  }\n\n  .view_all {\n    background-color: #fff;\n    padding: 44rpx 44rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/applicationListDetails/index.vue",
    "content": "<template>\n  <view class=\"application_list_container\">\n    <custom-nav-bar :title=\"getTitle\" />\n\n    <u-list class=\"application_list\">\n      <u-list-item\n        v-for=\"application in getRenderData\"\n        :key=\"getKey(application)\"\n      >\n        <application-item :isRecv=\"isRecv\" :application=\"application\" />\n      </u-list-item>\n    </u-list>\n  </view>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport ApplicationItem from \"../applicationList/ApplicationItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    ApplicationItem,\n  },\n  data() {\n    return {\n      isGroupApplication: false,\n      isRecv: false,\n    };\n  },\n  computed: {\n    getRenderData() {\n      let getterKey = this.isRecv\n        ? \"storeRecvFriendApplications\"\n        : \"storeSentFriendApplications\";\n      if (this.isGroupApplication) {\n        getterKey = this.isRecv\n          ? \"storeRecvGroupApplications\"\n          : \"storeSentGroupApplications\";\n      }\n      return [...this.$store.getters[getterKey]].sort((a, b) =>\n        a.handleResult === 0 ? -1 : 1,\n      );\n    },\n    getKey() {\n      return (application) => {\n        if (this.isGroupApplication) {\n          return this.isRecv\n            ? application.userID + application.groupID\n            : application.groupID;\n        }\n        return application[this.isRecv ? \"fromUserID\" : \"toUserID\"];\n      };\n    },\n    getTitle() {\n      if (!this.isRecv) {\n        return \"我的申请\";\n      }\n      return this.isGroupApplication ? \"群通知\" : \"好友请求\";\n    },\n  },\n  onLoad(options) {\n    const { isGroupApplication, isRecv } = options;\n    this.isGroupApplication = JSON.parse(isGroupApplication);\n    this.isRecv = JSON.parse(isRecv);\n  },\n  methods: {},\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.application_list_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f8f8f8;\n\n  .application_list {\n    margin-top: 24rpx;\n    flex: 1;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/contactAdd/ActionItem.vue",
    "content": "<template>\n  <view class=\"action_item\" @click=\"onClick\">\n    <slot name=\"icon\">\n      <view class=\"action_icon\">\n        <image :src=\"action.icon\" mode=\"\"></image>\n      </view>\n    </slot>\n\n    <view class=\"action_details\">\n      <text class=\"title\">{{ action.title }}</text>\n      <text class=\"desc\">{{ action.desc }}</text>\n      <view class=\"bottom_line\"></view>\n    </view>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"\",\n  props: {\n    action: Object,\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    onClick() {\n      this.$emit(\"click\", this.action);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.action_item {\n  @include vCenterBox();\n  padding: 24rpx 44rpx;\n\n  .action_icon {\n    width: 30px;\n    height: 30px;\n\n    image {\n      max-width: 100%;\n      max-height: 100%;\n    }\n  }\n\n  .action_details {\n    @include colBox(false);\n    margin-left: 48rpx;\n    width: 100%;\n    position: relative;\n\n    .title {\n      font-weight: 500;\n      padding-bottom: 12rpx;\n    }\n\n    .desc {\n      font-size: 24rpx;\n      color: #999;\n    }\n\n    .bottom_line {\n      height: 1px;\n      width: 100%;\n      background-color: #f0f0f0;\n      position: absolute;\n      bottom: -24rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/contactAdd/index.vue",
    "content": "<template>\n  <view class=\"contact_add_container\">\n    <custom-nav-bar title=\"添加\" />\n\n    <view class=\"action_row\">\n      <action-item\n        @click=\"friendAction(item)\"\n        v-for=\"item in friendActionMenus\"\n        :action=\"item\"\n        :key=\"item.idx\"\n      />\n      <action-item\n        @click=\"groupAction(item)\"\n        v-for=\"item in groupActionMenus\"\n        :action=\"item\"\n        :key=\"item.idx\"\n      />\n    </view>\n  </view>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport ActionItem from \"./ActionItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    ActionItem,\n  },\n  data() {\n    return {\n      groupActionMenus: [\n        {\n          idx: 0,\n          title: \"创建群聊\",\n          desc: \"创建群聊，全面使用OpenIM\",\n          icon: require(\"static/images/contact_add_create_group.png\"),\n        },\n        {\n          idx: 1,\n          title: \"添加群聊\",\n          desc: \"向管理员或团队成员询问ID\",\n          icon: require(\"static/images/contact_add_join_group.png\"),\n        },\n      ],\n      friendActionMenus: [\n        {\n          idx: 0,\n          title: \"添加好友\",\n          desc: \"通过手机号/ID号/搜索添加\",\n          icon: require(\"static/images/contact_add_search_user.png\"),\n        },\n      ],\n    };\n  },\n  methods: {\n    groupAction({ idx }) {\n      if (idx === 0) {\n        uni.navigateTo({\n          url: `/pages/common/createGroup/index`,\n        });\n      } else {\n        uni.navigateTo({\n          url: \"/pages/contact/switchJoinGroup/index\",\n        });\n      }\n    },\n    friendAction({ idx }) {\n      if (!idx) {\n        uni.navigateTo({\n          url: \"/pages/common/searchUserOrGroup/index?isSearchGroup=false\",\n        });\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.contact_add_container {\n  height: 100vh;\n  background-color: #f8f8f8;\n\n  .desc_title {\n    font-size: 24rpx;\n    color: #999;\n    padding: 24rpx 44rpx;\n  }\n\n  .action_row {\n    margin-top: 24rpx;\n    background-color: #fff;\n\n    .action_item:last-child {\n      .bottom_line {\n        height: 0;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/friendList/index.vue",
    "content": "<template>\n  <view class=\"friend_list_container\">\n    <custom-nav-bar title=\"我的好友\" />\n    <view class=\"search_bar_wrap\">\n      <u-search\n        class=\"search_bar\"\n        shape=\"square\"\n        placeholder=\"搜索\"\n        :showAction=\"false\"\n        disabled\n      />\n    </view>\n\n    <choose-index-list\n      v-if=\"getIndexData.dataList.length > 0\"\n      @itemClick=\"userClick\"\n      :height=\"`${listHeight}px`\"\n      :indexList=\"getIndexData.indexList\"\n      :itemArr=\"getIndexData.dataList\"\n    />\n    <u-empty v-else mode=\"list\" />\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { formatChooseData } from \"@/util/common\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport ChooseIndexList from \"@/components/ChooseIndexList/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    ChooseIndexList,\n  },\n  data() {\n    return {\n      keyword: \"\",\n      listHeight: 0,\n    };\n  },\n  computed: {\n    ...mapGetters([\"storeFriendList\"]),\n    getIndexData() {\n      return formatChooseData(this.storeFriendList);\n    },\n  },\n  mounted() {\n    this.getListHeight();\n  },\n  methods: {\n    userClick(friend) {\n      uni.navigateTo({\n        url: `/pages/common/userCard/index?sourceID=${friend.userID}`,\n      });\n    },\n    async getListHeight() {\n      const windowInfo = uni.getWindowInfo();\n      const data = await this.getEl(\".search_bar_wrap\");\n      const searchBarHeight = Number(data.height.toFixed());\n      this.listHeight =\n        windowInfo.windowHeight -\n        windowInfo.statusBarHeight -\n        44 -\n        searchBarHeight;\n    },\n    getEl(el) {\n      return new Promise((resolve) => {\n        const query = uni.createSelectorQuery().in(this);\n        query\n          .select(el)\n          .boundingClientRect((data) => {\n            // 存在data，且存在宽和高，视为渲染完毕\n            resolve(data);\n          })\n          .exec();\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.friend_list_container {\n  .search_bar_wrap {\n    height: 34px;\n    padding: 12px 22px;\n  }\n\n  .u-empty {\n    margin-top: 25vh !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/groupList/GroupItem.vue",
    "content": "<template>\n  <view @click=\"toGroupCard\" class=\"group_item\">\n    <my-avatar :src=\"groupInfo.faceURL\" :isGroup=\"true\" size=\"42\" />\n    <view class=\"group_info\">\n      <text class=\"group_name\">{{ groupInfo.groupName }}</text>\n      <view class=\"group_details\">\n        <text>{{ `${groupInfo.memberCount}人` }}</text>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nexport default {\n  name: \"\",\n  components: {\n    MyAvatar,\n  },\n  props: {\n    groupInfo: Object,\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    toGroupCard() {\n      uni.navigateTo({\n        url: `/pages/common/groupCard/index?sourceID=${this.groupInfo.groupID}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.group_item {\n  @include vCenterBox();\n  padding: 24rpx 44rpx;\n\n  .group_info {\n    margin-left: 24rpx;\n\n    .group_name {\n      @include nomalEllipsis() max-width: 400rpx;\n    }\n\n    .group_details {\n      font-size: 28rpx;\n      color: #999;\n      margin-top: 8rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/groupList/index.vue",
    "content": "<template>\n  <view class=\"group_list_container\">\n    <custom-nav-bar title=\"我的群组\">\n\n    </custom-nav-bar>\n    <view class=\"search_bar_wrap\">\n      <u-search\n        class=\"search_bar\"\n        shape=\"square\"\n        placeholder=\"搜索\"\n        disabled\n        :showAction=\"false\"\n      />\n    </view>\n\n    <u-tabs :scrollable=\"false\" :list=\"tabList\" @click=\"clickTab\"></u-tabs>\n\n    <view\n      class=\"pane_row\"\n      :style=\"{ transform: `translateX(${isMyCreate ? '0' : '-100%'})` }\"\n    >\n      <view class=\"pane_content\">\n        <u-list\n          v-if=\"getMyCreateGroupList.length > 0\"\n          class=\"group_list\"\n          :height=\"`${getListHeight}px`\"\n        >\n          <u-list-item\n            v-for=\"group in getMyCreateGroupList\"\n            :key=\"group.groupID\"\n          >\n            <group-item :groupInfo=\"group\" />\n          </u-list-item>\n        </u-list>\n        <u-empty v-else mode=\"list\" />\n      </view>\n\n      <view class=\"pane_content\">\n        <u-list\n          v-if=\"getMyJoinedGroupList.length > 0\"\n          class=\"group_list\"\n          :height=\"`${getListHeight}px`\"\n        >\n          <u-list-item\n            v-for=\"group in getMyJoinedGroupList\"\n            :key=\"group.groupID\"\n          >\n            <group-item :groupInfo=\"group\" />\n          </u-list-item>\n        </u-list>\n        <u-empty v-else mode=\"list\" />\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport GroupItem from \"./GroupItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    GroupItem,\n  },\n  data() {\n    return {\n      keyword: \"\",\n      tabList: [\n        {\n          name: \"我创建的\",\n        },\n        {\n          name: \"我加入的\",\n        },\n      ],\n      isMyCreate: true,\n    };\n  },\n  computed: {\n    ...mapGetters([\"storeGroupList\", \"storeCurrentUserID\"]),\n    getMyCreateGroupList() {\n      return this.storeGroupList.filter(\n        (group) => group.ownerUserID === this.storeCurrentUserID,\n      );\n    },\n    getListHeight() {\n      const statusBar = uni.getWindowInfo().statusBarHeight;\n      const searchBar = 58;\n      const tabAndNavBar = 44 * 2;\n      const titleBar = 32;\n      return (\n        uni.getWindowInfo().safeArea.height -\n        statusBar -\n        searchBar -\n        tabAndNavBar -\n        titleBar\n      );\n    },\n    getMyJoinedGroupList() {\n      // console.log(this.storeGroupList.filter(group => group.ownerUserID !== this.storeCurrentUserID));\n      return this.storeGroupList.filter(\n        (group) => group.ownerUserID !== this.storeCurrentUserID,\n      );\n    },\n  },\n  mounted() {},\n  methods: {\n    clickTab({ index }) {\n      this.isMyCreate = index === 0;\n    },\n    toCreateGroup() {\n      uni.navigateTo({\n        url: `/pages/common/createGroup/index`,\n      });\n    }\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.group_list_container {\n  @include colBox(false);\n  height: 100vh;\n  overflow: hidden;\n\n  .nav_right_action {\n    padding-right: 44rpx;\n  }\n\n  .search_bar_wrap {\n    height: 34px;\n    padding: 12px 22px;\n  }\n\n  .pane_row {\n    display: flex;\n    flex: 1;\n    transition: all 0.3s ease 0s !important;\n    border-top: 2rpx solid #e8eaef;\n    // overflow-x: hidden;\n\n    .pane_content {\n      @include colBox(false);\n      height: 100%;\n      flex: 0 0 100%;\n\n      .pane_title {\n        font-size: 14px;\n        color: #999;\n        padding: 6px 22px;\n        background-color: #f8f8f8;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/index/components/ContactMenus.vue",
    "content": "<template>\n  <view class=\"\">\n    <view class=\"menu_list\">\n      <view\n        @click=\"menuClick(item)\"\n        v-for=\"item in getMenus\"\n        :key=\"item.idx\"\n        class=\"menu_list_item\"\n      >\n        <image class=\"menu_icon\" :src=\"item.icon\" mode=\"\"></image>\n        <view class=\"item_content\">\n          <text class=\"title\">\n            {{ item.title }}\n          </text>\n          <view class=\"icon\">\n            <u-icon name=\"arrow-right\" color=\"#999\" size=\"18\" />\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"menu_list\">\n      <view\n        @click=\"menuClick(item)\"\n        v-for=\"item in getFriendsMenus\"\n        :key=\"item.idx\"\n        class=\"menu_list_item\"\n      >\n        <image class=\"menu_icon\" :src=\"item.icon\" mode=\"\"></image>\n        <view class=\"item_content\">\n          <text class=\"title\">\n            {{ item.title }}\n          </text>\n          <view class=\"icon\">\n            <u-icon name=\"arrow-right\" color=\"#999\" size=\"18\" />\n          </view>\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { ContactMenuTypes } from \"@/constant\";\n\nexport default {\n  name: \"\",\n  props: {},\n  data() {\n    return {};\n  },\n  computed: {\n    getMenus() {\n      return [\n        {\n          idx: 0,\n          type: ContactMenuTypes.NewFriend,\n          title: \"新的好友\",\n          icon: require(\"static/images/contact_new_friend.png\"),\n        },\n        {\n          idx: 1,\n          type: ContactMenuTypes.NewGroup,\n          title: \"新的群组\",\n          icon: require(\"static/images/contact_new_group.png\"),\n        },\n      ];\n    },\n    getFriendsMenus() {\n      return [\n        {\n          idx: 2,\n          type: ContactMenuTypes.MyFriend,\n          title: \"我的好友\",\n          icon: require(\"static/images/contact_my_friend.png\"),\n          badge: 0,\n        },\n        {\n          idx: 3,\n          type: ContactMenuTypes.MyGroup,\n          title: \"我的群组\",\n          icon: require(\"static/images/contact_my_group.png\"),\n          badge: 0,\n        },\n      ];\n    },\n  },\n  methods: {\n    menuClick({ type }) {\n      switch (type) {\n        case ContactMenuTypes.NewFriend:\n        case ContactMenuTypes.NewGroup:\n          uni.navigateTo({\n            url: `/pages/contact/applicationList/index?applicationType=${type}`,\n          });\n          break;\n        case ContactMenuTypes.MyFriend:\n          uni.navigateTo({\n            url: \"/pages/contact/friendList/index\",\n          });\n          break;\n        case ContactMenuTypes.MyGroup:\n          uni.navigateTo({\n            url: \"/pages/contact/groupList/index\",\n          });\n          break;\n        default:\n          break;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.menu_list {\n  margin-bottom: 24rpx;\n  background-color: #fff;\n\n  &_item {\n    @include vCenterBox();\n    margin: 0 44rpx;\n    padding: 24rpx 0;\n    color: #0c1c33;\n\n    .menu_icon {\n      width: 42px;\n      min-width: 42px;\n      height: 42px;\n      min-height: 42px;\n    }\n\n    .item_content {\n      @include btwBox();\n      margin-left: 24rpx;\n      width: 100%;\n      position: relative;\n\n      .icon {\n        display: flex;\n\n        .u-badge {\n          width: fit-content;\n          padding: 8rpx 12rpx;\n          line-height: 18rpx;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/index/index.vue",
    "content": "<template>\n  <view class=\"contact_container\">\n    <custom-nav-bar>\n      <view class=\"contact_title\" slot=\"left\">\n        <text>通讯录</text>\n      </view>\n      <view class=\"contact_action\" slot=\"more\">\n        <view @click=\"contactAddClick\" class=\"search_icon\">\n          <image src=\"@/static/images/common_add.png\" alt=\"\" srcset=\"\" />\n        </view>\n      </view>\n    </custom-nav-bar>\n\n    <contact-menus />\n  </view>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport ContactMenus from \"./components/ContactMenus.vue\";\nimport UserItem from \"@/components/UserItem/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    ContactMenus,\n    UserItem,\n  },\n  data() {\n    return {\n      frequentContacts: [],\n    };\n  },\n  methods: {\n    contactAddClick() {\n      uni.navigateTo({\n        url: \"/pages/contact/contactAdd/index\",\n      });\n    },\n    userClick(item) {\n      uni.navigateTo({\n        url: `/pages/common/userCard/index?sourceID=${item.userID}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.contact_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .contact_title {\n    padding-left: 44rpx;\n    font-size: 40rpx;\n    font-weight: 600;\n    color: #0c1c33;\n  }\n\n  .contact_action {\n    padding-right: 36rpx;\n    display: flex;\n\n    .search_icon {\n      margin: 0 16rpx;\n\n      image {\n        width: 56rpx;\n        height: 56rpx;\n      }\n    }\n  }\n\n  .list_title {\n    font-size: 24rpx;\n    color: #999;\n    margin-left: 44rpx;\n  }\n\n  .user_list {\n    flex: 1;\n    margin-top: 24rpx;\n    background-color: #fff;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/searchUserOrGroup/index.vue",
    "content": "<template>\n  <view class=\"search_group_container\">\n    <custom-nav-bar title=\"搜索群组\" />\n    <view class=\"search_bar_wrap\">\n      <u-search\n        class=\"search_bar\"\n        shape=\"square\"\n        placeholder=\"搜索群组\"\n        :showAction=\"false\"\n        v-model=\"keyword\"\n      />\n    </view>\n\n    <view class=\"search_results\">\n      <u-empty mode=\"search\" />\n    </view>\n  </view>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport GroupItem from \"../groupList/GroupItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    GroupItem,\n  },\n  data() {\n    return {\n      keyword: \"\",\n    };\n  },\n  mounted() {},\n  methods: {\n    userClick() {},\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.search_group_container {\n  @include colBox(false);\n  height: 100vh;\n\n  .search_bar_wrap {\n    height: 34px;\n    padding: 12px 22px;\n  }\n\n  .search_results {\n    flex: 1;\n    .group_list {\n      height: 100% !important;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/contact/switchJoinGroup/index.vue",
    "content": "<template>\n  <view class=\"switch_join_container\">\n    <custom-nav-bar title=\"加入群聊\" />\n\n    <view class=\"action_row\">\n      <action-item\n        @click=\"actionClick(item)\"\n        v-for=\"item in joinGroupMenus\"\n        :action=\"item\"\n        :key=\"item.idx\"\n      >\n        <view\n          class=\"custom_icon\"\n          :class=\"{ custom_icon_id: item.idx === 1 }\"\n          slot=\"icon\"\n        >\n          <image :src=\"item.icon\" mode=\"\"> </image>\n        </view>\n      </action-item>\n    </view>\n  </view>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport ActionItem from \"../contactAdd/ActionItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    ActionItem,\n  },\n  data() {\n    return {\n      joinGroupMenus: [\n        {\n          idx: 1,\n          title: \"群ID号加入\",\n          desc: \"向管理员或团队成员询问ID\",\n          icon: require(\"static/images/switch_join_id.png\"),\n        },\n      ],\n    };\n  },\n  methods: {\n    actionClick({ idx }) {\n      if (idx) {\n        uni.navigateTo({\n          url: \"/pages/common/searchUserOrGroup/index?isSearchGroup=true\",\n        });\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.switch_join_container {\n  height: 100vh;\n  background-color: #f8f8f8;\n\n  .desc_title {\n    font-size: 24rpx;\n    color: #999;\n    padding: 24rpx 44rpx;\n  }\n\n  .action_row {\n    background-color: #fff;\n\n    .custom_icon {\n      @include centerBox();\n      width: 44px;\n      min-width: 44px;\n      height: 44px;\n      border-radius: 50%;\n      background-color: #5496eb;\n\n      image {\n        width: 20px;\n        height: 20px;\n      }\n\n      &_id {\n        background-color: #ffc563;\n      }\n    }\n\n    /deep/ .action_item {\n      align-items: start;\n    }\n\n    .action_item:last-child {\n      .bottom_line {\n        height: 0;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue",
    "content": "<template>\n  <view class=\"chat_action_bar\">\n    <u-row class=\"action_row\">\n      <u-col\n        v-for=\"item in actionList\"\n        :key=\"item.idx\"\n        @click=\"actionClick(item)\"\n        span=\"3\"\n      >\n        <view class=\"action_item\">\n          <image :src=\"item.icon\" alt=\"\" srcset=\"\" />\n          <text class=\"action_item_title\">{{ item.title }}</text>\n        </view>\n      </u-col>\n    </u-row>\n  </view>\n</template>\n\n<script>\nimport {\n  ChatingFooterActionTypes,\n} from \"@/constant\";\n\nexport default {\n  components: {},\n  data() {\n    return {\n      actionList: [\n        {\n          idx: 0,\n          type: ChatingFooterActionTypes.Album,\n          title: \"相册\",\n          icon: require(\"static/images/chating_action_image.png\"),\n        }\n      ],\n    };\n  },\n  methods: {\n    async actionClick(action) {\n      switch (action.type) {\n        case ChatingFooterActionTypes.Album:\n          this.$emit(\"prepareMediaMessage\", action.type);\n          break;\n        default:\n          break;\n      }\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.chat_action_bar {\n  position: relative;\n  background: #f0f2f6;\n  padding: 24rpx 36rpx;\n\n  .action_row {\n    flex-wrap: wrap;\n    margin-bottom: 24rpx;\n  }\n\n  .action_item {\n    @include centerBox();\n    flex-direction: column;\n    margin-top: 24rpx;\n\n    image {\n      width: 96rpx;\n      height: 96rpx;\n    }\n\n    &_title {\n      font-size: 24rpx;\n      color: #999;\n      margin-top: 6rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/ChatingFooter/CustomEditor.vue",
    "content": "<template>\n  <view\n    class=\"editor_wrap\"\n  >\n    <editor\n      :placeholder=\"placeholder\"\n      id=\"editor2\"\n      @ready=\"editorReady\"\n      @focus=\"editorFocus\"\n      @blur=\"editorBlur\"\n      @input=\"editorInput\"\n    />\n  </view>\n</template>\n\n<script>\nimport { html2Text } from \"@/util/common\";\nexport default {\n  props: {\n    placeholder: {\n      type: String,\n      default: \"\",\n    },\n  },\n  data() {\n    return {\n      editorCtx: null,\n      lastStr: \"\",\n    };\n  },\n  methods: {\n    editorReady() {\n      uni\n        .createSelectorQuery()\n        .select(\"#editor2\")\n        .context((res) => {\n          this.$emit(\"ready\", res);\n          this.editorCtx = res.context;\n        })\n        .exec();\n    },\n    editorFocus() {\n      this.$emit(\"focus\");\n    },\n    editorBlur() {\n      this.$emit(\"blur\");\n    },\n    editorInput(e) {\n      let str = e.detail.html;\n      const oldArr = (this.lastStr ?? '').split(\"\");\n      let contentStr = str;\n      oldArr.forEach((str) => {\n        contentStr = contentStr.replace(str, \"\");\n      });\n      contentStr = html2Text(contentStr);\n      this.$emit(\"input\", e);\n      this.lastStr = e.detail.html;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.editor_wrap {\n  position: relative;\n}\n\n#editor2 {\n  background-color: #fff;\n  min-height: 30px;\n  max-height: 120px;\n  height: auto;\n  word-break: break-all;\n}\n\n/deep/.ql-editor {\n  img {\n    vertical-align: sub !important;\n  }\n\n  p {\n    padding: 4px;\n  }\n}\n\n.canvas_container {\n  position: fixed;\n  bottom: -99px;\n  z-index: -100;\n\n  &_name {\n    max-width: 480rpx;\n    display: inline-block;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n\n  #atCanvas {\n    height: 20px;\n  }\n\n  .convas_container_name {\n    font-size: 16px !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/ChatingFooter/index.vue",
    "content": "<template>\n  <view>\n    <view>\n      <view class=\"chat_footer\">\n        <view class=\"input_content\">\n          <CustomEditor\n            class=\"custom_editor\"\n            ref=\"customEditor\"\n            @ready=\"editorReady\"\n            @focus=\"editorFocus\"\n            @blur=\"editorBlur\"\n            @input=\"editorInput\"\n          />\n        </view>\n\n        <view class=\"footer_action_area\">\n          <image\n            v-show=\"!hasContent\"\n            @click.prevent=\"updateActionBar\"\n            src=\"@/static/images/chating_footer_add.png\"\n            alt=\"\"\n            srcset=\"\"\n          />\n          <image\n            v-show=\"hasContent\"\n            @touchend.prevent=\"sendTextMessage\"\n            src=\"@/static/images/send_btn.png\"\n            alt=\"\"\n            srcset=\"\"\n          />\n        </view>\n      </view>\n      <chating-action-bar\n        @sendMessage=\"sendMessage\"\n        @prepareMediaMessage=\"prepareMediaMessage\"\n        v-show=\"actionBarVisible\"\n      />\n      <u-action-sheet\n        :safeAreaInsetBottom=\"true\"\n        round=\"12\"\n        :actions=\"actionSheetMenu\"\n        @select=\"selectClick\"\n        :closeOnClickOverlay=\"true\"\n        :closeOnClickAction=\"true\"\n        :show=\"showActionSheet\"\n        @close=\"showActionSheet = false\"\n      >\n      </u-action-sheet>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters, mapActions } from \"vuex\";\nimport { getPurePath, html2Text } from \"@/util/common\";\nimport { offlinePushInfo } from \"@/util/imCommon\";\nimport {\n  ChatingFooterActionTypes,\n  UpdateMessageTypes,\n} from \"@/constant\";\nimport IMSDK, {\n  IMMethods,\n  MessageStatus,\n  MessageType,\n} from \"openim-uniapp-polyfill\";\nimport UParse from \"@/components/gaoyia-parse/parse.vue\";\nimport CustomEditor from \"./CustomEditor.vue\";\nimport ChatingActionBar from \"./ChatingActionBar.vue\";\n\nconst needClearTypes = [MessageType.TextMessage];\n\nconst albumChoose = [\n  {\n    name: \"图片\",\n    type: ChatingFooterActionTypes.Album,\n    idx: 0,\n  },\n  {\n    name: \"拍照\",\n    type: ChatingFooterActionTypes.Camera,\n    idx: 1,\n  },\n];\n\nexport default {\n  components: {\n    CustomEditor,\n    ChatingActionBar,\n    UParse,\n  },\n  props: {\n    footerOutsideFlag: Number,\n  },\n  data() {\n    return {\n      customEditorCtx: null,\n      inputHtml: \"\",\n      actionBarVisible: false,\n      isInputFocus: false,\n      actionSheetMenu: [],\n      showActionSheet: false,\n    };\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeCurrentGroup\",\n      \"storeBlackList\",\n    ]),\n    hasContent() {\n      return html2Text(this.inputHtml) !== \"\";\n    },\n  },\n  watch: {\n    footerOutsideFlag(newVal) {\n      this.onClickActionBarOutside();\n    },\n  },\n  mounted() {\n    this.setKeyboardListener();\n  },\n  beforeDestroy() {\n    this.disposeKeyboardListener();\n  },\n  methods: {\n    ...mapActions(\"message\", [\"pushNewMessage\", \"updateOneMessage\"]),\n    async createTextMessage() {\n      let message = \"\";\n      const text = html2Text(this.inputHtml);\n      message = await IMSDK.asyncApi(\n            IMMethods.CreateTextMessage,\n            IMSDK.uuid(),\n            text\n          );\n          console.log(message);\n      return message;\n    },\n    async sendTextMessage() {\n      if (!this.hasContent) return;\n      const message = await this.createTextMessage();\n      this.sendMessage(message);\n    },\n    sendMessage(message) {\n      this.pushNewMessage(message);\n      if (needClearTypes.includes(message.contentType)) {\n        this.customEditorCtx.clear();\n      }\n      this.$emit(\"scrollToBottom\");\n      IMSDK.asyncApi(IMMethods.SendMessage, IMSDK.uuid(), {\n        recvID: this.storeCurrentConversation.userID,\n        groupID: this.storeCurrentConversation.groupID,\n        message,\n        offlinePushInfo,\n      })\n        .then(({ data }) => {\n          this.updateOneMessage({\n            message: data,\n            isSuccess: true,\n          });\n        })\n        .catch(({ data, errCode, errMsg }) => {\n          this.updateOneMessage({\n            message: data,\n            type: UpdateMessageTypes.KeyWords,\n            keyWords: [\n              {\n                key: \"status\",\n                value: MessageStatus.Failed,\n              },\n              {\n                key: \"errCode\",\n                value: errCode,\n              },\n            ],\n          });\n        });\n    },\n\n    // action\n    onClickActionBarOutside() {\n      if (this.actionBarVisible) {\n        this.actionBarVisible = false;\n      }\n    },\n    updateActionBar() {\n      this.actionBarVisible = !this.actionBarVisible;\n    },\n    editorReady(e) {\n      this.customEditorCtx = e.context;\n      this.customEditorCtx.clear();\n    },\n    editorFocus() {\n      this.isInputFocus = true;\n      this.$emit(\"scrollToBottom\");\n    },\n    editorBlur() {\n      this.isInputFocus = false;\n    },\n    editorInput(e) {\n      this.inputHtml = e.detail.html;\n    },\n    prepareMediaMessage(type) {\n      if (type === ChatingFooterActionTypes.Album) {\n        this.actionSheetMenu = [...albumChoose];\n      }\n      this.showActionSheet = true;\n    },\n\n    // from comp\n    batchCreateImageMesage(paths) {\n      paths.forEach(async (path) => {\n        const message = await IMSDK.asyncApi(\n          IMMethods.CreateImageMessageFromFullPath,\n          IMSDK.uuid(),\n          getPurePath(path)\n        );\n        this.sendMessage(message);\n      });\n    },\n    selectClick({ idx }) {\n      if (idx === 0) {\n        this.chooseOrShotImage([\"album\"]).then((paths) =>\n          this.batchCreateImageMesage(paths)\n        );\n      } else {\n        this.chooseOrShotImage([\"camera\"]).then((paths) =>\n          this.batchCreateImageMesage(paths)\n        );\n      }\n    },\n    chooseOrShotImage(sourceType) {\n      return new Promise((resolve, reject) => {\n        uni.chooseImage({\n          count: 9,\n          sizeType: [\"compressed\"],\n          sourceType,\n          success: function ({ tempFilePaths }) {\n            resolve(tempFilePaths);\n          },\n          fail: function (err) {\n            console.log(err);\n            reject(err);\n          },\n        });\n      });\n    },\n\n    // keyboard\n    keyboardChangeHander({ height }) {\n      if (height > 0) {\n        if (this.actionBarVisible) {\n          this.actionBarVisible = false;\n        }\n      }\n    },\n    setKeyboardListener() {\n      uni.onKeyboardHeightChange(this.keyboardChangeHander);\n    },\n    disposeKeyboardListener() {\n      uni.offKeyboardHeightChange(this.keyboardChangeHander);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.custom_editor {\n  img {\n    vertical-align: sub;\n  }\n}\n\n.forbidden_footer {\n  width: 100%;\n  height: 112rpx;\n  color: #8e9ab0;\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n  background: #f0f2f6;\n}\n\n.chat_footer {\n  display: flex;\n  align-items: center;\n  // background-color: #e9f4ff;\n  background: #f0f2f6;\n  // height: 50px;\n  max-height: 120px;\n  padding: 24rpx 20rpx;\n\n  .input_content {\n    flex: 1;\n    min-height: 30px;\n    max-height: 120px;\n    margin: 0 24rpx;\n    border-radius: 8rpx;\n    position: relative;\n\n    .record_btn {\n      // background-color: #3c9cff;\n      background: #fff;\n      color: black;\n      height: 30px;\n      font-size: 24rpx;\n    }\n  }\n\n  .quote_message {\n    @include vCenterBox();\n    justify-content: space-between;\n    margin-top: 12rpx;\n    padding: 8rpx;\n    // padding-top: 20rpx;\n    border-radius: 6rpx;\n    background-color: #fff;\n    color: #666;\n\n    .content {\n      /deep/ uni-view {\n        @include ellipsisWithLine(2);\n      }\n    }\n  }\n\n  .footer_action_area {\n    display: flex;\n    align-items: center;\n\n    .emoji_action {\n      margin-right: 24rpx;\n    }\n\n    image {\n      width: 26px;\n      height: 26px;\n    }\n  }\n\n  .send_btn {\n    height: 30px;\n    line-height: 30px;\n    background-color: #4a9cfc;\n    padding: 0 8px;\n    border-radius: 4px;\n    color: #fff;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/ChatingHeader.vue",
    "content": "<template>\n  <u-navbar @click=\"click\" placeholder class=\"chating_header\">\n    <view @click=\"routeBack\" class=\"u-nav-slot\" slot=\"left\">\n      <img\n        class=\"back_icon\"\n        width=\"12\"\n        height=\"20\"\n        src=\"static/images/common_left_arrow.png\"\n        alt=\"\"\n        srcset=\"\"\n      />\n    </view>\n    <view class=\"u-nav-slot\" slot=\"center\">\n      <view class=\"chating_info\" :class=\"{ chating_info_single: isSingle }\">\n        <view class=\"conversation_info\">\n          <view class=\"title\">{{ storeCurrentConversation.showName }}</view>\n          <view v-if=\"!isSingle && !isNotify\" class=\"sub_title\"\n            >{{ groupMemberCount }}\n          </view>\n        </view>\n      </view>\n\n    </view>\n    <view class=\"u-nav-slot\" slot=\"right\">\n      <view class=\"right_action\">\n        <u-icon\n          @click=\"goSetting\"\n          class=\"action_item\"\n          name=\"more-dot-fill\"\n          size=\"23\"\n          color=\"#0C1C33\"\n        >\n        </u-icon>\n      </view>\n    </view>\n  </u-navbar>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { SessionType } from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\n\nexport default {\n  name: \"ChatingHeader\",\n  components: {\n    MyAvatar,\n  },\n  props: {\n    \n  },\n  data() {\n    return {\n      showMoreMember: false,\n      joinLock: false,\n    };\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeCurrentGroup\",\n      \"storeCurrentMemberInGroup\",\n      \"storeSelfInfo\",\n    ]),\n    isSingle() {\n      return (\n        this.storeCurrentConversation.conversationType === SessionType.Single\n      );\n    },\n    isNotify() {\n      return (\n        this.storeCurrentConversation.conversationType ===\n        SessionType.Notification\n      );\n    },\n    groupMemberCount() {\n      return `(${this.storeCurrentGroup?.memberCount ?? 0})`;\n    },\n    canGoSetting() {\n      if (this.isSingle) {\n        return true;\n      }\n      return (\n        this.storeCurrentMemberInGroup.groupID ===\n        this.storeCurrentConversation.groupID\n      );\n    },\n  },\n  methods: {\n    click(e) {\n      this.$emit(\"click\", e);\n    },\n    routeBack() {\n      uni.switchTab({\n        url: \"/pages/conversation/conversationList/index\",\n      });\n    },\n    goSetting() {\n      const url = this.isSingle\n        ? \"/pages/conversation/singleSettings/index\"\n        : \"/pages/conversation/groupSettings/index\";\n      uni.navigateTo({\n        url,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.chating_header {\n  border: 2rpx solid #e8eaef;\n  /deep/ .u-navbar__content__left {\n    padding: 0;\n  }\n\n  .back_icon {\n    padding: 24rpx;\n    margin-left: 20rpx;\n  }\n\n  .chating_info {\n    @include vCenterBox();\n    flex-direction: column;\n\n    &_single {\n      margin-bottom: 24rpx;\n    }\n\n    .conversation_info {\n      flex-direction: row;\n      justify-content: center;\n      @include vCenterBox();\n\n      .title {\n        @include nomalEllipsis();\n        max-width: 280rpx;\n        font-size: 14px;\n        font-weight: 500;\n      }\n\n      .sub_title {\n        margin-left: 8rpx;\n      }\n    }\n\n    .online_state {\n      @include vCenterBox();\n      flex-direction: row;\n      margin-top: 6rpx;\n      // position: absolute;\n      // top: 2px;\n      // left: 50%;\n      // transform: translateX(-50%);\n      font-size: 20rpx;\n      color: #999;\n\n      .dot {\n        background-color: #10cc64;\n        width: 12rpx;\n        height: 12rpx;\n        border-radius: 50%;\n        margin-right: 12rpx;\n      }\n\n      .online_str {\n        @include nomalEllipsis();\n        max-width: 280rpx;\n      }\n    }\n  }\n\n  /deep/ .u-navbar__content__right {\n    padding: 0;\n  }\n\n  .right_action {\n    @include vCenterBox();\n    flex-direction: row;\n    margin-right: 24rpx;\n\n    .action_item {\n      padding: 12rpx;\n    }\n\n    .u-icon {\n      margin-left: 12rpx;\n    }\n  }\n}\n\n.group_announcement_tab {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: 80%;\n  position: absolute;\n  left: 6%;\n  // bottom: -44px;\n  margin-top: 40rpx;\n  padding: 14rpx 32rpx;\n  background-color: #f0f6ff;\n  border-radius: 12rpx;\n\n  .announcement_header {\n    @include vCenterBox();\n    width: 100%;\n    flex-direction: row;\n    justify-content: space-between;\n    margin-bottom: 16rpx;\n\n    &_left {\n      @include vCenterBox();\n    }\n  }\n\n  .announcement_content {\n    @include ellipsisWithLine(2);\n    margin: 0 12rpx;\n    font-size: 24rpx;\n    color: #617183;\n  }\n\n  image {\n    width: 16px;\n    height: 16px;\n    min-width: 16px;\n  }\n}\n\n.group_calling_tab {\n  position: absolute;\n  left: 0;\n  width: 80%;\n  margin-top: 12px;\n  margin-left: 5%;\n  padding: 24rpx;\n  background-color: #f4f9ff;\n  border-radius: 8rpx;\n  color: #5496eb;\n  font-size: 24rpx;\n\n  .base_row {\n    display: flex;\n    align-items: center;\n\n    image {\n      width: 10px;\n      height: 10px;\n    }\n\n    text {\n      margin-left: 16rpx;\n    }\n\n    .arrow {\n      width: 9px;\n      height: 6px;\n      position: absolute;\n      right: 24rpx;\n    }\n  }\n\n  .member_row {\n    display: flex;\n    // justify-content: space-between;\n    flex-wrap: wrap;\n    padding: 24rpx 28rpx;\n    margin-top: 24rpx;\n    background-color: #fff;\n    border-bottom: 1px solid rgba(151, 151, 151, 0.16);\n    border-top-left-radius: 8rpx;\n    border-top-right-radius: 8rpx;\n\n    .u-avatar {\n      margin-bottom: 16rpx;\n\n      &:not(:nth-child(6n)) {\n        margin-right: calc(6% / 2);\n      }\n    }\n  }\n\n  .action_row {\n    display: flex;\n    justify-content: center;\n    padding: 24rpx;\n    background-color: #fff;\n    font-size: 28rpx;\n    border-bottom-left-radius: 8rpx;\n    border-bottom-right-radius: 8rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/ChatingList.vue",
    "content": "<template>\n  <scroll-view\n    :scroll-with-animation=\"withAnimation\"\n    @click=\"click\"\n    id=\"scroll_view\"\n    :style=\"{\n      height: '1px'\n    }\"\n    @scroll=\"throttleScroll\"\n    :scroll-top=\"scrollTop\"\n    scroll-y\n    :scroll-into-view=\"scrollIntoView\"\n    upper-threshold=\"250\"\n    @scrolltoupper=\"scrolltoupper\"\n  >\n    <view id=\"scroll_wrap\">\n      <u-loadmore nomoreText=\"\" :status=\"loadMoreStatus\" />\n      <view\n        v-for=\"item in storeHistoryMessageList\"\n        :key=\"item.clientMsgID\"\n      >\n        <message-item-render\n          @messageItemRender=\"messageItemRender\"\n          :source=\"item\"\n          :isSender=\"item.sendID === storeCurrentUserID\"\n        />\n      </view>\n      <view\n        style=\"visibility: hidden; height: 12px\"\n        id=\"auchormessage_bottom_item\"\n      ></view>\n    </view>\n  </scroll-view>\n</template>\n\n<script>\nimport { mapGetters, mapActions } from \"vuex\";\nimport MessageItemRender from \"./MessageItem/index.vue\";\n\nexport default {\n  name: \"\",\n  components: {\n    MessageItemRender,\n  },\n  props: {},\n  data() {\n    return {\n      scrollIntoView: \"\",\n      scrollWithAnimation: false,\n      scrollTop: 0,\n      old: {\n      \tscrollTop: 0\n      },\n      initFlag: true,\n      isOverflow: false,\n      needScoll: true,\n      withAnimation: false,\n      messageLoadState: {\n        loading: false,\n      },\n    };\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeHistoryMessageList\",\n      \"storeHasMoreMessage\",\n      \"storeCurrentUserID\",\n      \"storeSelfInfo\",\n    ]),\n    loadMoreStatus() {\n      if (!this.storeHasMoreMessage) {\n        return \"nomore\";\n      }\n      return this.messageLoadState.loading ? \"loading\" : \"loadmore\";\n    },\n  },\n  mounted() {\n    this.loadMessageList();\n  },\n  methods: {\n    ...mapActions(\"message\", [\"getHistoryMesageList\"]),\n    messageItemRender(clientMsgID) {\n      if (\n        this.initFlag &&\n        clientMsgID ===\n          this.storeHistoryMessageList[this.storeHistoryMessageList.length - 1]\n            .clientMsgID\n      ) {\n        this.initFlag = false;\n        setTimeout(() => this.scrollToBottom(true), 200);\n        this.checkInitHeight();\n      }\n    },\n    async loadMessageList(isLoadMore = false) {\n      this.messageLoadState.loading = true;\n      const lastMsgID = this.storeHistoryMessageList[0]?.clientMsgID;\n      const options = {\n        conversationID: this.storeCurrentConversation.conversationID,\n        count: 20,\n        startClientMsgID: this.storeHistoryMessageList[0]?.clientMsgID ?? \"\",\n        viewType: 0,\n      };\n      try {\n        const { emptyFlag } =\n          await this.getHistoryMesageList(options);\n        if (emptyFlag) {\n          this.$emit(\"initSuccess\");\n        }\n      } catch (e) {\n        console.log(e);\n        //TODO handle the exception\n      }\n      this.$nextTick(function () {\n        if (isLoadMore && lastMsgID) {\n          this.scrollToAnchor(`auchor${lastMsgID}`);\n        }\n        this.messageLoadState.loading = false;\n      });\n    },\n    click(e) {\n      this.$emit(\"click\", e);\n    },\n    onScroll(event) {\n      const { scrollHeight, scrollTop } = event.target;\n      this.old.scrollTop = scrollTop\n      this.needScoll =\n        scrollHeight - scrollTop < uni.getWindowInfo().windowHeight * 1.2;\n    },\n    throttleScroll(event) {\n      uni.$u.throttle(() => this.onScroll(event), 150);\n    },\n    scrolltoupper() {\n      if (!this.messageLoadState.loading && this.storeHasMoreMessage) {\n        this.loadMessageList(true);\n      }\n    },\n    scrollToBottom(isInit = false, isRecv = false) {\n      if (isRecv && !this.needScoll) {\n        return;\n      }\n\n      if (!isInit) {\n        this.withAnimation = true;\n        setTimeout(() => (this.withAnimation = false), 100);\n      }\n\n      this.$nextTick(() => {\n        uni\n          .createSelectorQuery()\n          .in(this)\n          .select(\"#scroll_wrap\")\n          .boundingClientRect((res) => {\n            // let top = res.height - this.scrollViewHeight;\n            // if (top > 0) {\n            this.scrollTop = this.old.scrollTop\n            this.$nextTick(() => this.scrollTop = res.height);\n            if (isInit) {\n              this.$emit(\"initSuccess\");\n            }\n            // }\n          })\n          .exec();\n      });\n    },\n    scrollToAnchor(auchor) {\n      this.$nextTick(function () {\n        this.scrollIntoView = auchor;\n      });\n    },\n    checkInitHeight() {\n      this.getEl(\"#scroll_view\").then(({ height }) => {\n        this.bgHeight = `${height}px`;\n      });\n    },\n    getEl(el) {\n      return new Promise((resolve) => {\n        const query = uni.createSelectorQuery().in(this);\n        query\n          .select(el)\n          .boundingClientRect((data) => {\n            resolve(data);\n          })\n          .exec();\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n#scroll_view {\n  flex: 1;\n  background-repeat: no-repeat;\n  position: relative;\n}\n\n.watermark-view {\n  width: 100%;\n  height: 100%;\n  position: fixed;\n}\n\n.watermark {\n  font-size: 16px; /* 水印文字大小 */\n  color: #f0f2f6; /* 水印文字颜色，使用透明度控制可见度 */\n  position: absolute; /* 水印相对定位 */\n  transform: rotate(-45deg);\n  pointer-events: none; /* 防止水印文字干扰交互 */\n}\n\n.uni-scroll-view {\n  position: relative;\n}\n\n.new_message_flag {\n  position: sticky;\n  background: #ffffff;\n  box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.1);\n  border-radius: 14px;\n  padding: 4px 8px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  bottom: 12px;\n  left: 50%;\n  transform: translateX(-50%);\n  width: fit-content;\n  font-size: 24rpx;\n  color: #006aff;\n}\n\n.time_gap_line {\n  position: relative;\n  padding: 0 10vw 12rpx;\n  text-align: center;\n  // font-size: 24rpx;\n  font-size: 0.93rem;\n  color: #999;\n}\n\n.fade-leave,\n.fade-enter-to {\n  opacity: 1;\n}\n\n.fade-leave-active,\n.fade-enter-active {\n  transition: all 0.3s;\n}\n\n.fade-leave-to,\n.fade-enter {\n  opacity: 0;\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/MessageItem/ErrorMessageRender.vue",
    "content": "<template>\n  <view class=\"text_message_container bg_container\">\n    <view> [暂未支持的消息类型] </view>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"ErrorMessagegRender\",\n  components: {},\n  data() {\n    return {};\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n"
  },
  {
    "path": "pages/conversation/chating/components/MessageItem/MediaMessageRender.vue",
    "content": "<template>\n  <view class=\"media_message_container\" @click=\"clickMediaItem\">\n    <u--image\n      @load=\"onLoaded\"\n      :showLoading=\"true\"\n      width=\"120\"\n      :height=\"maxHeight\"\n      mode=\"widthFix\"\n      :src=\"getImgUrl\"\n      @click=\"clickMediaItem\"\n    >\n      <template v-slot:loading>\n        <u-loading-icon color=\"red\"></u-loading-icon>\n      </template>\n    </u--image>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"\",\n  props: {\n    message: Object,\n  },\n  data() {\n    return {\n      loadingWidth: \"120px\",\n    };\n  },\n  computed: {\n    getImgUrl() {\n      return (\n        this.message.pictureElem.snapshotPicture?.url ??\n        this.message.pictureElem.sourcePath\n      );\n    },\n    maxHeight() {\n      const imageHeight = this.message.pictureElem.sourcePicture.height;\n      const imageWidth = this.message.pictureElem.sourcePicture.width;\n      const aspectRatio = imageHeight / imageWidth;\n      return 120 * aspectRatio;\n    },\n  },\n  methods: {\n    clickMediaItem() {\n      uni.previewImage({\n        current: 0,\n        urls: [this.message.pictureElem.sourcePicture.url],\n        indicator: \"none\",\n      });\n    },\n    onLoaded() {\n      this.loadingWidth = \"auto\";\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.media_message_container {\n  position: relative;\n  border-radius: 16rpx;\n  overflow: hidden;\n\n  .play_icon {\n    width: 48px;\n    height: 48px;\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n  }\n\n  .video_duration {\n    position: absolute;\n    bottom: 12rpx;\n    right: 24rpx;\n    color: #fff;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/components/MessageItem/TextMessageRender.vue",
    "content": "<template>\n  <view class=\"text_message_container bg_container\">\n    <mp-html\n      :previewImg=\"false\"\n      :showImgMenu=\"false\"\n      :lazyLoad=\"false\"\n      :content=\"getContent\"\n    />\n  </view>\n</template>\n\n<script>\nimport { parseBr } from \"@/util/common\";\n\nexport default {\n  name: \"TextMessageRender\",\n  components: {},\n  props: {\n    message: Object,\n  },\n  computed: {\n    getContent() {\n      return parseBr(this.message.textElem?.content);\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    \n  },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n"
  },
  {
    "path": "pages/conversation/chating/components/MessageItem/index.vue",
    "content": "<template>\n  <view\n    v-if=\"!getNoticeContent\"\n    :id=\"`auchor${source.clientMsgID}`\"\n    class=\"message_item\"\n    :class=\"{ message_item_self: isSender, message_item_active: isActive }\"\n  >\n    <my-avatar\n      size=\"42\"\n      :desc=\"source.senderNickname\"\n      :src=\"source.senderFaceUrl\"\n    />\n    <view class=\"message_container\">\n      <view\n        class=\"message_sender\"\n        :style=\"{ 'flex-direction': !isSender ? 'row-reverse' : 'row' }\"\n      >\n        <text>{{ formattedMessageTime }}</text>\n        <text style=\"margin-left: 2rpx; margin-right: 2rpx\">{{ \"\" }}</text>\n        <text v-if=\"!isSingle\">{{ source.senderNickname }}</text>\n      </view>\n      <view class=\"message_send_state_box\">\n        <view\n          style=\"\n            height: 100%;\n            display: flex;\n            justify-items: center;\n            align-items: center;\n          \"\n        >\n          <view class=\"message_send_state\">\n            <u-loading-icon v-if=\"showSending && !isPreview\" />\n            <image\n              v-if=\"isFailedMessage && !isPreview\"\n              src=\"@/static/images/chating_message_failed.png\"\n            />\n          </view>\n        </view>\n        <view class=\"message_content_wrap message_content_wrap_shadow\">\n          <text-message-render\n            v-if=\"showTextRender\"\n            :message=\"source\"\n          />\n          <media-message-render v-else-if=\"showMediaRender\" :message=\"source\" />\n          <error-message-render v-else />\n        </view>\n      </view>\n    </view>\n  </view>\n\n  <view\n    v-else\n    class=\"notice_message_container\"\n    :id=\"`auchor${source.clientMsgID}`\"\n  >\n    <text>{{ getNoticeContent }}</text>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport {\n  MessageStatus,\n  MessageType,\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport TextMessageRender from \"./TextMessageRender.vue\";\nimport MediaMessageRender from \"./MediaMessageRender.vue\";\nimport ErrorMessageRender from \"./ErrorMessageRender.vue\";\nimport { noticeMessageTypes } from \"@/constant\";\nimport { tipMessaggeFormat, formatMessageTime } from \"@/util/imCommon\";\n\nconst textRenderTypes = [MessageType.TextMessage];\n\nconst mediaRenderTypes = [MessageType.PictureMessage];\n\nexport default {\n  components: {\n    MyAvatar,\n    TextMessageRender,\n    MediaMessageRender,\n    ErrorMessageRender,\n  },\n  props: {\n    source: Object,\n    isSender: {\n      type: Boolean,\n      default: false,\n    },\n    isPreview: Boolean,\n    isActive: Boolean,\n  },\n  data() {\n    return {};\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeSelfInfo\",\n    ]),\n    isSingle() {\n      return (\n        this.storeCurrentConversation.conversationType === SessionType.Single\n      );\n    },\n    formattedMessageTime() {\n      return formatMessageTime(this.source.sendTime);\n    },\n    showTextRender() {\n      return textRenderTypes.includes(this.source.contentType);\n    },\n    showMediaRender() {\n      return mediaRenderTypes.includes(this.source.contentType);\n    },\n    getNoticeContent() {\n      const isNoticeMessage = noticeMessageTypes.includes(\n        this.source.contentType\n      );\n      return !isNoticeMessage\n        ? \"\"\n        : tipMessaggeFormat(\n            this.source,\n            this.$store.getters.storeCurrentUserID\n          );\n    },\n    isSuccessMessage() {\n      return this.source.status === MessageStatus.Succeed;\n    },\n    isFailedMessage() {\n      return this.source.status === MessageStatus.Failed;\n    },\n    showSending() {\n      return this.source.status === MessageStatus.Sending && !this.sendingDelay;\n    },\n  },\n  mounted() {\n    this.$emit(\"messageItemRender\", this.source.clientMsgID);\n    this.setSendingDelay();\n  },\n  methods: {\n    setSendingDelay() {\n      if (this.source.status === MessageStatus.Sending) {\n        setTimeout(() => {\n          this.sendingDelay = false;\n        }, 2000);\n      }\n    },\n  },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.message_item {\n  display: flex;\n  flex-direction: row;\n  padding: 16rpx 44rpx;\n  // padding-top: 48rpx;\n  position: relative;\n\n  .check_wrap {\n    @include centerBox();\n    box-sizing: border-box;\n    width: 40rpx;\n    min-width: 40rpx;\n    height: 40rpx;\n    min-height: 40rpx;\n    border: 2px solid #979797;\n    border-radius: 50%;\n    margin-top: 16rpx;\n    margin-right: 24rpx;\n\n    &_active {\n      background-color: #1d6bed;\n      border: none;\n    }\n\n    &_disabled {\n      background-color: #c8c9cc;\n    }\n  }\n\n  .message_container {\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    margin-left: 20rpx;\n    // text-align: start;\n    max-width: 80%;\n    position: relative;\n\n    .message_sender {\n      @include nomalEllipsis();\n      display: flex;\n      max-width: 480rpx;\n      // font-size: 24rpx;\n      font-size: 0.85rem;\n      color: #666;\n      margin-bottom: 6rpx;\n    }\n\n    .message_content_wrap {\n      @include vCenterBox();\n      text-align: start;\n      // font-size: 14px;\n      color: $uni-text-color;\n      width: fit-content;\n      max-width: 100%;\n\n      .bg_container {\n        padding: 16rpx 24rpx;\n        border-radius: 0rpx 12rpx 12rpx 12rpx;\n        background-color: #f0f0f0;\n      }\n    }\n  }\n\n  .message_send_state_box {\n    display: flex;\n    flex-direction: row-reverse;\n  }\n\n  .message_send_state {\n    @include centerBox();\n    margin-left: 12rpx;\n    // margin-top: 48rpx;\n    width: 48rpx;\n    height: 48rpx;\n\n    .read_limit_count {\n      // font-size: 24rpx;\n      font-size: 0.85rem;\n      color: #999;\n    }\n\n    image {\n      width: 16px;\n      height: 16px;\n    }\n  }\n\n  /deep/.emoji_display {\n    width: 24px;\n    height: 18px;\n    vertical-align: sub;\n  }\n\n  &_self {\n    flex-direction: row-reverse;\n\n    .check_wrap {\n      margin-right: 0;\n      margin-left: 24rpx;\n    }\n\n    .message_container {\n      margin-left: 0;\n      margin-right: 20rpx;\n      // text-align: end;\n      align-items: flex-end;\n\n      .message_content_wrap {\n        flex-direction: row-reverse;\n\n        .bg_container {\n          border-radius: 12rpx 0 12rpx 12rpx;\n          background-color: #dcebfe !important;\n        }\n      }\n    }\n\n    .message_send_state_box {\n      flex-direction: row;\n    }\n\n    .message_send_state {\n      margin-left: 0rpx;\n      margin-right: 12rpx;\n    }\n  }\n\n  &_active {\n    background-color: #fdf5e9;\n  }\n}\n\n.notice_message_container {\n  @include ellipsisWithLine(2);\n  text-align: center;\n  margin: 24rpx 48rpx;\n  // font-size: 24rpx;\n  font-size: 0.85rem;\n  color: #999;\n  position: relative;\n}\n\n.fade-leave,\n.fade-enter-to {\n  opacity: 1;\n}\n\n.fade-leave-active,\n.fade-enter-active {\n  transition: all 0.5s;\n}\n\n.fade-leave-to,\n.fade-enter {\n  opacity: 0;\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/chating/index.vue",
    "content": "<template>\n  <view :style=\"{ backgroundColor: '#f8f8f8' }\" class=\"chating_container\">\n    <chating-header\n      @click=\"pageClick\"\n      ref=\"chatingHeaderRef\"\n    />\n    <chating-list\n      @click=\"pageClick\"\n      ref=\"chatingListRef\"\n      @initSuccess=\"initSuccess\"\n    />\n    <chating-footer\n      ref=\"chatingFooterRef\"\n      :footerOutsideFlag=\"footerOutsideFlag\"\n      @scrollToBottom=\"scrollToBottom\"\n    />\n    <u-loading-page :loading=\"initLoading\"></u-loading-page>\n  </view>\n</template>\n\n<script>\nimport { mapActions } from \"vuex\";\nimport {\n  PageEvents,\n} from \"@/constant\";\nimport ChatingHeader from \"./components/ChatingHeader.vue\";\nimport ChatingFooter from \"./components/ChatingFooter/index.vue\";\nimport ChatingList from \"./components/ChatingList.vue\";\nimport { markConversationAsRead } from \"@/util/imCommon\";\n\nexport default {\n  components: {\n    ChatingHeader,\n    ChatingFooter,\n    ChatingList,\n  },\n  data() {\n    return {\n      listHeight: 0,\n      footerOutsideFlag: 0,\n      initLoading: true,\n      back2Tab: false,\n    };\n  },\n  onLoad(options) {\n    console.log(\"onload\");\n    this.setPageListener();\n    if (options?.back2Tab) {\n      this.back2Tab = JSON.parse(options.back2Tab);\n    }\n  },\n  onUnload() {\n    console.log(\"unload\");\n    this.disposePageListener();\n    markConversationAsRead(\n      {\n        ...this.$store.getters.storeCurrentConversation,\n      },\n      true\n    );\n    this.resetConversationState();\n    this.resetMessageState();\n  },\n  methods: {\n    ...mapActions(\"message\", [\"resetMessageState\", \"deleteMessages\"]),\n    ...mapActions(\"conversation\", [\"resetConversationState\"]),\n    scrollToBottom(isRecv = false) {\n      this.$refs.chatingListRef.scrollToBottom(false, isRecv);\n    },\n    pageClick(e) {\n      this.footerOutsideFlag += 1;\n    },\n    initSuccess() {\n      console.log(\"initSuccess\");\n      this.initLoading = false;\n    },\n\n    // page event\n    setPageListener() {\n      uni.$on(PageEvents.ScrollToBottom, this.scrollToBottom);\n    },\n    disposePageListener() {\n      uni.$off(PageEvents.ScrollToBottom, this.scrollToBottom);\n    },\n  },\n  onBackPress() {\n    uni.switchTab({\n      url: \"/pages/conversation/conversationList/index\",\n    });\n    return true;\n  },\n  beforeDestroy() {\n    uni.switchTab({\n      url: \"/pages/conversation/conversationList/index\",\n    });\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.chating_container {\n  @include colBox(false);\n  height: 100vh;\n  overflow: hidden;\n  background-color: #fff !important;\n  position: relative;\n\n  .watermark {\n    font-size: 16px; /* 水印文字大小 */\n    color: rgba(0, 0, 0, 0.2); /* 水印文字颜色，使用透明度控制可见度 */\n    position: absolute; /* 水印相对定位 */\n    transform: rotate(-45deg);\n    pointer-events: none; /* 防止水印文字干扰交互 */\n\n    /* 为不同的水印元素设置不同的偏移，以避免重叠 */\n    // transform-origin: top right;\n    // margin-top: 20px;\n    // margin-right: 20px;\n  }\n\n  // ::before {\n  //   content: \"Your Watermark Text\"; /* 替换为你想要的水印文字 */\n  //   font-size: 16px; /* 水印文字大小 */\n  //   color: rgba(0, 0, 0, 0.2); /* 水印文字颜色，使用透明度控制可见度 */\n  //   position: absolute; /* 水印相对定位 */\n  //   top: 20px; /* 距离顶部的距离 */\n  //   right: 20px; /* 距离右侧的距离 */\n  //   transform: rotate(-45deg); /* 将水印旋转为倾斜状态 */\n  //   pointer-events: none; /* 防止水印文字干扰交互 */\n  //   z-index: -1; /* 将水印置于底层 */\n  // }\n\n  .mutiple_action_container {\n    display: flex;\n    border-top: 1px solid #eaebed;\n    background: #f0f2f6;\n    justify-content: space-evenly;\n    padding: 12px 24px;\n\n    .action_item {\n      @include centerBox();\n      flex-direction: column;\n\n      image {\n        width: 48px;\n        height: 48px;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/conversationList/components/ChatHeader.vue",
    "content": "<template>\n  <view class=\"chat_header\">\n    <view class=\"self_info\">\n      <my-avatar\n        :src=\"storeSelfInfo.faceURL\"\n        :desc=\"storeSelfInfo.nickname\"\n        size=\"46\"\n      />\n      <view class=\"self_info_desc\">\n        <view class=\"user_state\">\n          <text class=\"nickname\">{{ storeSelfInfo.nickname }}</text>\n          <view v-if=\"!storeReinstall\">\n            <view class=\"tag\" v-if=\"storeIsSyncing\">\n              <img\n                class=\"loading\"\n                style=\"height: 24rpx; width: 24rpx\"\n                src=\"static/images/loading.png\"\n                alt=\"\"\n              />\n              <text class=\"status\">同步中</text>\n            </view>\n            <view class=\"tag\" v-if=\"connectStart == 0\">\n              <img\n                class=\"loading\"\n                style=\"height: 24rpx; width: 24rpx\"\n                src=\"static/images/loading.png\"\n                alt=\"\"\n              />\n              <text class=\"status\">连接中</text>\n            </view>\n            <view class=\"err-tag\" v-if=\"connectStart == -1\">\n              <img\n                style=\"height: 24rpx; width: 24rpx\"\n                src=\"static/images/sync_error.png\"\n                alt=\"\"\n              />\n              <text class=\"status\">连接失败</text>\n            </view>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"right_action\">\n      <view class=\"call_icon\"> </view>\n      <view @click=\"showMore\" class=\"more_icon\">\n        <image src=\"@/static/images/common_circle_add.png\"></image>\n      </view>\n      <u-overlay\n        :show=\"moreMenuVisible\"\n        @click=\"moreMenuVisible = false\"\n        opacity=\"0\"\n      >\n        <view\n          :style=\"{ top: popMenuPosition.top, right: popMenuPosition.right }\"\n          class=\"more_menu\"\n        >\n          <view\n            @click=\"clickMenu(item)\"\n            v-for=\"item in moreMenus\"\n            :key=\"item.idx\"\n            class=\"menu_item\"\n          >\n            <image :src=\"item.icon\" mode=\"\"></image>\n            <text>{{ item.title }}</text>\n          </view>\n        </view>\n      </u-overlay>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport IMSDK from \"openim-uniapp-polyfill\";\nexport default {\n  name: \"ChatHeader\",\n  components: {\n    MyAvatar,\n  },\n  props: {},\n  data() {\n    return {\n      connectStart: -2,\n      moreMenuVisible: false,\n      popMenuPosition: {\n        top: 0,\n        right: 0,\n      },\n      moreMenus: [\n        {\n          idx: 1,\n          title: \"添加好友\",\n          icon: require(\"static/images/more_add_friend.png\"),\n        },\n        {\n          idx: 2,\n          title: \"添加群聊\",\n          icon: require(\"static/images/more_add_group.png\"),\n        },\n        {\n          idx: 3,\n          title: \"创建群聊\",\n          icon: require(\"static/images/more_create_group.png\"),\n        },\n      ],\n    };\n  },\n  computed: {\n    ...mapGetters([\"storeSelfInfo\", \"storeIsSyncing\", \"storeReinstall\"]),\n  },\n  mounted() {\n    this.subscribeAll();\n  },\n  beforeDestroy() {\n    this.unsubscribeAll();\n  },\n  methods: {\n    setStateStart() {\n      this.connectStart = 0;\n    },\n    setStateSuccess() {\n      this.connectStart = 1;\n    },\n    setStateError() {\n      this.connectStart = -1;\n    },\n    subscribeAll() {\n      IMSDK.subscribe(IMSDK.IMEvents.OnConnecting, this.setStateStart);\n      IMSDK.subscribe(IMSDK.IMEvents.OnConnectSuccess, this.setStateSuccess);\n      IMSDK.subscribe(IMSDK.IMEvents.OnConnectFailed, this.setStateError);\n    },\n    unsubscribeAll() {\n      IMSDK.unsubscribe(IMSDK.IMEvents.OnConnecting, this.setStateStart);\n      IMSDK.unsubscribe(IMSDK.IMEvents.OnConnectSuccess, this.setStateSuccess);\n      IMSDK.unsubscribe(IMSDK.IMEvents.OnConnectFailed, this.setStateError);\n    },\n    clickMenu({ idx }) {\n      switch (idx) {\n        case 1:\n        case 2:\n          uni.navigateTo({\n            url: `/pages/common/searchUserOrGroup/index?isSearchGroup=${\n              idx === 2\n            }`,\n          });\n          break;\n        case 3:\n          uni.navigateTo({\n            url: `/pages/common/createGroup/index`,\n          });\n          break;\n        default:\n          break;\n      }\n    },\n    async showMore() {\n      const { right, bottom } = await this.getEl(\".more_icon\");\n      this.popMenuPosition.right =\n        uni.getWindowInfo().windowWidth - right + \"px\";\n      this.popMenuPosition.top = bottom + \"px\";\n      this.moreMenuVisible = true;\n    },\n    getEl(el) {\n      return new Promise((resolve) => {\n        const query = uni.createSelectorQuery().in(this);\n        query\n          .select(el)\n          .boundingClientRect((data) => {\n            // 存在data，且存在宽和高，视为渲染完毕\n            resolve(data);\n          })\n          .exec();\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@keyframes loading {\n  0% {\n    transform: rotate(0deg);\n  }\n\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n.chat_header {\n  @include btwBox();\n  padding: 36rpx 44rpx;\n  margin-top: var(--status-bar-height);\n\n  .self_info {\n    @include btwBox();\n\n    &_desc {\n      @include colBox(true);\n      margin-left: 24rpx;\n      color: $uni-text-color;\n\n      .company {\n        @include nomalEllipsis();\n        font-size: 24rpx;\n        margin-bottom: 10rpx;\n        max-width: 300rpx;\n      }\n\n      .user_state {\n        @include vCenterBox();\n\n        .nickname {\n          @include nomalEllipsis();\n          font-size: 26rpx;\n          max-width: 240rpx;\n        }\n\n        .err-tag {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          width: 152rpx;\n          height: 44rpx;\n          background: #ffe1dd;\n          border-radius: 12rpx 12rpx 12rpx 12rpx;\n          margin-left: 8rpx;\n          .status {\n            font-size: 24rpx;\n            margin-left: 8rpx;\n            font-weight: 400;\n            color: #ff381f;\n          }\n        }\n\n        .tag {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          width: 152rpx;\n          height: 44rpx;\n          background: #f2f8ff;\n          border-radius: 12rpx 12rpx 12rpx 12rpx;\n          margin-left: 8rpx;\n\n          .loading {\n            animation: loading 1.5s infinite;\n          }\n\n          .status {\n            font-size: 24rpx;\n            margin-left: 8rpx;\n            font-weight: 400;\n            color: #0089ff;\n          }\n        }\n\n        .online_state {\n          @include vCenterBox();\n          margin-left: 24rpx;\n          font-size: 24rpx;\n\n          .dot {\n            background-color: #10cc64;\n            width: 12rpx;\n            height: 12rpx;\n            border-radius: 50%;\n            margin-right: 12rpx;\n          }\n        }\n      }\n    }\n  }\n\n  .right_action {\n    display: flex;\n    position: relative;\n\n    .call_icon {\n      margin-right: 24rpx;\n\n      image {\n        width: 56rpx;\n        height: 56rpx;\n      }\n    }\n\n    .more_icon {\n      image {\n        width: 56rpx;\n        height: 56rpx;\n      }\n    }\n\n    .more_menu {\n      position: absolute;\n      // bottom: 0;\n      // left: 100%;\n      z-index: 999;\n      // transform: translate(-100%, 100%);\n      box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.16);\n      width: max-content;\n      border-radius: 12rpx;\n      background-color: #fff;\n\n      .menu_item {\n        display: flex;\n        justify-content: flex-start;\n        align-items: center;\n        padding: 20rpx 24rpx;\n        font-size: 28rpx;\n        color: $uni-text-color;\n        border-bottom: 1px solid #f0f0f0;\n\n        image {\n          width: 24px;\n          height: 24px;\n          margin-right: 24rpx;\n        }\n\n        &:last-child {\n          border: none;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/conversationList/components/ConversationItem.vue",
    "content": "<template>\n  <view @tap.prevent=\"clickConversationItem\" class=\"conversation_item\">\n    <view class=\"pinned\" v-if=\"source.isPinned\"></view>\n    <view class=\"left_info\">\n      <my-avatar\n        :isGroup=\"isGroup\"\n        :isNotify=\"isNotify\"\n        :src=\"source.faceURL\"\n        :desc=\"source.showName\"\n        size=\"46\"\n      />\n      <view class=\"details\">\n        <text class=\"conversation_name\">{{ source.showName }}</text>\n        <view class=\"lastest_msg_wrap\">\n          <text class=\"lastest_msg_content\">{{ latestMessage }}</text>\n        </view>\n      </view>\n    </view>\n    <view class=\"right_desc\">\n      <text class=\"send_time\">{{ latestMessageTime }}</text>\n      <u-badge max=\"99\" :value=\"source.unreadCount\"></u-badge>\n    </view>\n  </view>\n</template>\n\n<script>\nimport {\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport UParse from \"@/components/gaoyia-parse/parse.vue\";\nimport {\n  getConversationContent,\n  formatConversionTime,\n  prepareConversationState,\n} from \"@/util/imCommon\";\n\nexport default {\n  components: {\n    MyAvatar,\n    UParse,\n  },\n  props: {\n    source: {\n      type: Object,\n      default: () => {},\n    },\n  },\n  computed: {\n    latestMessage() {\n      if (this.source.latestMsg === \"\") return \"\";\n      let parsedMessage;\n      try {\n        parsedMessage = JSON.parse(this.source.latestMsg);\n      } catch (e) {}\n      if (!parsedMessage) return \"\";\n      return getConversationContent(parsedMessage);\n    },\n    latestMessageTime() {\n      return this.source.latestMsgSendTime\n        ? formatConversionTime(this.source.latestMsgSendTime)\n        : \"\";\n    },\n    isGroup() {\n      return this.source.conversationType === SessionType.WorkingGroup;\n    },\n    isNotify() {\n      return this.source.conversationType === SessionType.Notification;\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    clickConversationItem() {\n      console.log(this.source);\n      prepareConversationState(this.source);\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.conversation_item {\n  @include btwBox();\n  flex-direction: row;\n  padding: 12rpx 44rpx 20rpx;\n  position: relative;\n\n  &_active {\n    background-color: #f3f3f3;\n  }\n\n  .left_info {\n    @include btwBox();\n\n    .details {\n      @include colBox(true);\n      margin-left: 24rpx;\n      height: 46px;\n      color: $uni-text-color;\n\n      .conversation_name {\n        @include nomalEllipsis();\n        max-width: 40vw;\n        font-size: 28rpx;\n      }\n\n      .lastest_msg_wrap {\n        display: flex;\n        font-size: 24rpx;\n        margin-top: 10rpx;\n        color: #666;\n\n        .lastest_msg_prefix {\n          margin-right: 6rpx;\n\n          &_active {\n            color: $u-primary;\n          }\n        }\n\n        .lastest_msg_content {\n          flex: 1;\n          margin-right: 160rpx;\n          // /deep/uni-view {\n          @include ellipsisWithLine(1);\n          // }\n        }\n      }\n    }\n  }\n\n  .right_desc {\n    @include colBox(true);\n    align-items: flex-end;\n    width: max-content;\n    justify-content: space-between;\n    height: 46px;\n\n    .send_time {\n      width: max-content;\n      font-size: 24rpx;\n      color: #999;\n    }\n\n    .u-badge {\n      width: fit-content;\n    }\n  }\n\n  .pinned {\n    position: absolute;\n    top: 0;\n    right: 24rpx;\n    width: 17rpx;\n    height: 17rpx;\n    background-image: linear-gradient(to bottom left, #314ffe 50%, white 50%);\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/conversationList/index.vue",
    "content": "<template>\n  <view class=\"conversation_container\">\n    <chat-header ref=\"chatHeaderRef\" />\n    <scroll-view\n      class=\"scroll-view\"\n      scroll-y=\"true\"\n      refresher-enabled=\"true\"\n      :refresher-triggered=\"triggered\"\n      :scroll-top=\"scrollTop\"\n      :scroll-with-animation=\"true\"\n      @scroll=\"scroll\"\n      @refresherrefresh=\"onRefresh\"\n      @refresherrestore=\"onRestore\"\n      @scrolltolower=\"scrolltolower\"\n    >\n      <conversation-item\n        v-for=\"item in storeConversationList\"\n        :key=\"item.conversationID\"\n        :source=\"item\"\n        ref=\"conversationItem\"\n      />\n    </scroll-view>\n    <view class=\"loading_wrap\" v-if=\"storeProgress > 0 && storeProgress < 100\">\n      <u-loading-icon\n        :vertical=\"true\"\n        :text=\"storeProgress + '%'\"\n      ></u-loading-icon>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport ChatHeader from \"./components/ChatHeader.vue\";\nimport ConversationItem from \"./components/ConversationItem.vue\";\n\nexport default {\n  components: {\n    ChatHeader,\n    ConversationItem,\n  },\n  data() {\n    return {\n      scrollTop: 0,\n      old: {\n        scrollTop: 0,\n      },\n      doubleClick: 0,\n      triggered: false,\n      refreshing: false,\n    };\n  },\n  computed: {\n    ...mapGetters([\"storeConversationList\", \"storeIsSyncing\", \"storeProgress\"]),\n  },\n  onReady() {\n    this.$nextTick(() => plus.navigator.closeSplashscreen());\n  },\n  onLoad() {\n    this._freshing = false;\n    this.triggered = true;\n  },\n  methods: {\n    scroll(e) {\n      this.old.scrollTop = e.detail.scrollTop;\n    },\n    onRefresh() {\n      if (this._freshing) return;\n      this._freshing = true;\n      this.queryList(true);\n    },\n    onRestore() {\n      this.triggered = \"restore\";\n      console.log(\"onRestore\");\n    },\n    scrolltolower() {\n      this.queryList();\n    },\n    async queryList(isFirstPage = false) {\n      await this.$store.dispatch(\n        \"conversation/getConversationList\",\n        isFirstPage\n      );\n      this.triggered = false;\n      this._freshing = false;\n    },\n    closeAllSwipe() {\n      this.$refs.swipeWrapperRef.closeAll();\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.conversation_container {\n  @include colBox(false);\n  height: 100vh;\n  overflow-y: hidden;\n}\n\n.conversation_search {\n  padding: 0 44rpx 24rpx;\n}\n\n.z-paging-content {\n  flex: 1;\n}\n\n.swipe_wrapper {\n  @include colBox(false);\n  flex: 1;\n  width: 100%;\n  overflow-y: auto;\n}\n\n.scroll-view {\n  height: 0;\n  flex: 1;\n}\n\n.loading_wrap {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n}\n\n/deep/.u-swipe-action-item__right__button__wrapper__text {\n  -webkit-line-clamp: 2 !important;\n  max-width: 32px;\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/groupManage/index.vue",
    "content": "<template>\n  <view class=\"group_settings_container\">\n    <custom-nav-bar title=\"群管理\" />\n    <view class=\"setting_row\">\n      <setting-item\n        @click=\"toTransfer\"\n        title=\"群主管理权转让\"\n        :border=\"false\"\n      />\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { GroupMemberListTypes } from \"@/constant\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport SettingItem from \"@/components/SettingItem/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    SettingItem,\n  },\n  data() {\n    return {};\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeCurrentMemberInGroup\",\n      \"storeCurrentGroup\",\n    ]),\n  },\n  methods: {\n    toTransfer() {\n      uni.navigateTo({\n        url: `/pages/conversation/groupMemberList/index?type=${GroupMemberListTypes.Transfer}&groupID=${this.storeCurrentGroup.groupID}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.group_settings_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .setting_row {\n    background-color: #fff;\n    margin: 24rpx 24rpx 0;\n    border-radius: 6px;\n    overflow: hidden;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/groupMemberList/components/GroupMemberListHeader.vue",
    "content": "<template>\n  <custom-nav-bar @leftClick=\"leftClick\" :title=\"getTitle\">\n  </custom-nav-bar>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport { ContactChooseTypes } from \"@/constant\";\nexport default {\n  name: \"\",\n  components: {\n    CustomNavBar,\n  },\n  props: {\n    checkVisible: {\n      type: Boolean,\n      default: false,\n    },\n    isNomal: {\n      type: Boolean,\n      default: false,\n    },\n    isTransfer: {\n      type: Boolean,\n      default: false,\n    },\n    isAt: {\n      type: Boolean,\n      default: false,\n    },\n    isSetAdmin: {\n      type: Boolean,\n      default: false,\n    },\n    isMute: {\n      type: Boolean,\n      default: false,\n    },\n    isCall: {\n      type: Boolean,\n      default: false,\n    },\n    groupID: String,\n  },\n  data() {\n    return {\n      moreMenuVisible: false,\n    };\n  },\n  computed: {\n    getTitle() {\n      if (this.isCall) {\n        return \"邀请成员\";\n      }\n      if (this.isAt) {\n        return \"选择提醒的人\";\n      }\n      if (this.isSetAdmin) {\n        return \"设置管理员\";\n      }\n      if (this.isMute) {\n        return \"禁言成员\";\n      }\n      if (this.checkVisible) {\n        return \"移除群成员\";\n      }\n      return \"群成员\";\n    },\n  },\n  methods: {\n    leftClick() {\n      if (this.checkVisible) {\n        this.$emit(\"update:checkVisible\", false);\n      }\n    },\n    rightClick() {\n      this.moreMenuVisible = true;\n    },\n    checkMenu() {\n      if (this.moreMenuVisible) {\n        this.moreMenuVisible = false;\n      }\n    },\n    inviteMember() {\n      uni.navigateTo({\n        url: `/pages/common/contactChoose/index?type=${ContactChooseTypes.Invite}&groupID=${this.groupID}`,\n      });\n    },\n    removeMember() {\n      this.$emit(\"removeMember\");\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.more_container {\n  position: relative;\n\n  .more_dot {\n    padding: 24rpx;\n    margin-right: 20rpx;\n  }\n\n  .more_menu {\n    position: absolute;\n    bottom: 0;\n    left: 50%;\n    transform: translate(-100%, 100%);\n    box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.16);\n    width: max-content;\n    border-radius: 8rpx;\n    background-color: #fff;\n\n    .menu_item {\n      padding: 20rpx 48rpx;\n      font-size: 28rpx;\n      color: $uni-text-color;\n\n      // &:nth-child(1) {\n      // \tborder-bottom: 1px solid #F0F0F0;\n      // }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/groupMemberList/index.vue",
    "content": "<template>\n  <view @click=\"pageClick\" class=\"group_members_container\">\n    <group-member-list-header\n      ref=\"navHeaderRef\"\n      :checkVisible.sync=\"showCheck\"\n      :isTransfer=\"isTransfer\"\n      :isNomal=\"!isOwner && !isAdmin\"\n      :groupID=\"groupID\"\n      @removeMember=\"showMemberCheck\"\n    />\n\n    <view class=\"search_bar_wrap\">\n      <u-search\n        disabled\n        class=\"search_bar\"\n        shape=\"square\"\n        placeholder=\"搜索\"\n        :showAction=\"false\"\n        v-model=\"keyword\"\n      />\n    </view>\n\n    <u-list\n      class=\"member_list\"\n      @scrolltolower=\"loadMore\"\n      lowerThreshold=\"100\"\n      height=\"1\"\n    >\n      <u-list-item v-for=\"member in groupMemberList\" :key=\"member.userID\">\n        <user-item\n          @itemClick=\"userClick\"\n          @updateCheck=\"updateCheck\"\n          :checked=\"isChecked(member.userID)\"\n          :checkVisible=\"showCheck\"\n          :disabled=\"!canCheck(member) && showCheck\"\n          :item=\"member\"\n        />\n      </u-list-item>\n      <view\n        v-show=\"loadState.loading\"\n        class=\"member_loading\"\n      >\n        <u-loading-icon></u-loading-icon>\n      </view>\n    </u-list>\n\n    <choose-index-footer\n      v-if=\"showCheck\"\n      :comfirmLoading=\"comfirmLoading\"\n      @removeItem=\"updateCheck\"\n      @confirm=\"confirm\"\n      :choosedData=\"getChoosedData\"\n      :isRemove=\"isRemove\"\n      :maxLength=\"groupMemberLength\"\n    />\n\n    <u-modal\n      :show=\"showConfirmModal\"\n      asyncClose\n      showCancelButton\n      @confirm=\"modalConfirm\"\n      @cancel=\"() => (showConfirmModal = false)\"\n      :content=\"\n        isRemove\n          ? '确定移除已选群成员？'\n          : `确定要把群主转移给${choosedTransferMember.nickname}吗？`\n      \"\n    />\n    <u-toast ref=\"uToast\"></u-toast>\n  </view>\n</template>\n\n<script>\nlet moreActionArea;\nimport { GroupMemberListTypes } from \"@/constant\";\nimport IMSDK, { GroupMemberRole } from \"openim-uniapp-polyfill\";\nimport UserItem from \"@/components/UserItem/index.vue\";\nimport GroupMemberListHeader from \"./components/GroupMemberListHeader.vue\";\nimport ChooseIndexFooter from \"@/components/ChooseIndexFooter/index.vue\";\nexport default {\n  components: {\n    GroupMemberListHeader,\n    ChooseIndexFooter,\n    UserItem,\n  },\n  data() {\n    return {\n      showCheck: false,\n      groupID: \"\",\n      keyword: \"\",\n      showConfirmModal: false,\n      comfirmLoading: false,\n      groupMemberList: [],\n      choosedMemberIDList: [],\n      choosedTransferMember: {},\n      type: GroupMemberListTypes.Preview,\n      isRightKick: true,\n      loadState: {\n        hasMore: true,\n        loading: false,\n      },\n    };\n  },\n  computed: {\n    getChoosedData() {\n      const tmpList = [...this.choosedMemberIDList];\n      return this.groupMemberList.filter(\n        (member) => {\n          const idx = tmpList.findIndex((item) => item === member.userID);\n          if (idx > -1) {\n            tmpList.splice(idx, 1);\n          }\n          return idx > -1;\n        },\n      );\n    },\n    isRemove() {\n      return this.type === GroupMemberListTypes.Kickout;\n    },\n    isTransfer() {\n      return this.type === GroupMemberListTypes.Transfer;\n    },\n    isChecked() {\n      return (userID) => this.choosedMemberIDList.includes(userID);\n    },\n    isOwner() {\n      return (\n        this.$store.getters.storeCurrentMemberInGroup.roleLevel ===\n        GroupMemberRole.Owner\n      );\n    },\n    isAdmin() {\n      return (\n        this.$store.getters.storeCurrentMemberInGroup.roleLevel ===\n        GroupMemberRole.Admin\n      );\n    },\n    canCheck() {\n      return ({ roleLevel, userID }) => {\n        if (this.type === GroupMemberListTypes.Kickout) {\n          return (\n            (this.isOwner ||\n              (this.isAdmin && roleLevel !== GroupMemberRole.Owner)) &&\n            userID !== this.$store.getters.storeCurrentUserID\n          );\n        }\n\n        return userID !== this.$store.getters.storeCurrentUserID;\n      };\n    },\n    groupMemberLength() {\n      return this.$store.getters.storeCurrentGroup?.memberCount ?? 0;\n    },\n  },\n  onLoad(options) {\n    const { groupID, type } = options;\n    this.loadMemberList(groupID);\n    this.type = type;\n    this.groupID = groupID;\n    this.isRightKick = type === GroupMemberListTypes.Kickout;\n    if (\n      this.isRightKick\n    ) {\n      this.showCheck = true;\n    }\n  },\n  methods: {\n    async pageClick(e) {\n      if (!moreActionArea) {\n        moreActionArea = await this.getEl(\".more_container\");\n      }\n      if (!moreActionArea) return;\n      if (\n        e.target.y < moreActionArea.top ||\n        e.target.y > moreActionArea.bottom ||\n        e.target.x < moreActionArea.left\n      ) {\n        this.$refs.navHeaderRef.checkMenu();\n      }\n    },\n    confirm() {\n      this.showConfirmModal = true;\n    },\n    modalConfirm() {\n      let func = () => {};\n      if (this.type === GroupMemberListTypes.Kickout) {\n        func = IMSDK.asyncApi(IMSDK.IMMethods.KickGroupMember, IMSDK.uuid(), {\n          groupID: this.getChoosedData[0].groupID,\n          reason: \"\",\n          userIDList: this.getChoosedData.map((member) => member.userID),\n        });\n      } else {\n        func = IMSDK.asyncApi(\n          IMSDK.IMMethods.TransferGroupOwner,\n          IMSDK.uuid(),\n          {\n            groupID: this.choosedTransferMember.groupID,\n            newOwnerUserID: this.choosedTransferMember.userID,\n          },\n        );\n      }\n      func\n        .then(() => this.showToast(\"操作成功\", () => uni.navigateBack()))\n        .catch(() => this.showToast(\"操作失败\"))\n        .finally(() => (this.showConfirmModal = false));\n    },\n    updateChoosedData(userID) {\n      if (this.choosedMemberIDList.includes(userID)) {\n        const idx = this.choosedMemberIDList.findIndex(\n          (item) => item === userID,\n        );\n        const tmpArr = [...this.choosedMemberIDList];\n        tmpArr.splice(idx, 1);\n        this.choosedMemberIDList = tmpArr;\n      } else {\n        this.choosedMemberIDList = [...this.choosedMemberIDList, userID];\n      }\n      console.log(this.choosedMemberIDList);\n    },\n    userClick(member) {\n      if (this.type === GroupMemberListTypes.Transfer) {\n        if (member.userID === this.$store.getters.storeCurrentUserID) return;\n        this.choosedTransferMember = member;\n        this.showConfirmModal = true;\n      } else {\n        uni.$u.route(\"/pages/common/userCard/index\", {\n          sourceID: member.userID,\n          memberInfo: JSON.stringify(member),\n        });\n      }\n    },\n    updateCheck(member) {\n      this.updateChoosedData(member.userID);\n    },\n    showMemberCheck() {\n      this.type = GroupMemberListTypes.Kickout;\n      this.showCheck = true;\n    },\n    loadMore() {\n      const stateKey = \"loadState\";\n      const methodKey = \"loadMemberList\";\n      if (this[stateKey].hasMore && !this[stateKey].loading) {\n        this[methodKey]();\n      }\n    },\n    loadMemberList(groupID) {\n      this.loadState.loading = true;\n      IMSDK.asyncApi(IMSDK.IMMethods.GetGroupMemberList, IMSDK.uuid(), {\n        groupID: groupID ?? this.groupID,\n        filter: 0,\n        offset: this.groupMemberList.length,\n        count: 500,\n      })\n        .then(({ data }) => {\n          this.groupMemberList = [...this.groupMemberList, ...data];\n          this.loadState.hasMore = data.length === 500;\n        })\n        .finally(() => (this.loadState.loading = false));\n    },\n    showToast(message, complete = null) {\n      this.$refs.uToast.show({\n        message,\n        complete,\n      });\n    },\n    getEl(el) {\n      return new Promise((resolve) => {\n        const query = uni.createSelectorQuery().in(this);\n        query\n          .select(el)\n          .boundingClientRect((data) => {\n            // 存在data，且存在宽和高，视为渲染完毕\n            resolve(data);\n          })\n          .exec();\n      });\n    },\n  },\n  onBackPress(options) {\n    if (this.showCheck && this.isRightKick) {\n      this.showCheck = false;\n      this.type = GroupMemberListTypes.Preview;\n      return true;\n    }\n    return false;\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.group_members_container {\n  @include colBox(false);\n  height: 100vh;\n  overflow: hidden;\n\n  .search_bar_wrap {\n    height: 34px;\n    padding: 12px 22px;\n  }\n\n  .at_all_btn {\n    font-weight: 500;\n    padding: 24rpx 44rpx;\n  }\n\n  /deep/.u-popup {\n    flex: none;\n  }\n\n  .member_list {\n    flex: 1;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/groupSettings/components/ActionSheet.vue",
    "content": "<template>\n  <u-action-sheet\n    safeAreaInsetBottom\n    closeOnClickOverlay\n    @close=\"onClose\"\n    @select=\"onSelect\"\n    round=\"24\"\n    :actions=\"joinGroupActions\"\n    :show=\"visible\"\n    cancelText=\"取消\"\n  />\n</template>\n\n<script>\nimport IMSDK, { GroupVerificationType } from \"openim-uniapp-polyfill\";\nexport default {\n  name: \"\",\n  components: {},\n  props: {\n    visible: Boolean,\n    groupID: String,\n  },\n  data() {\n    return {\n      joinGroupActions: [\n        {\n          name: \"允许任何人加群\",\n          type: GroupVerificationType.AllNot,\n        },\n        {\n          name: \"群成员邀请无需验证\",\n          type: GroupVerificationType.ApplyNeedInviteNot,\n        },\n        {\n          name: \"需要发送验证消息\",\n          type: GroupVerificationType.AllNeed,\n        },\n      ],\n    };\n  },\n  methods: {\n    onClose() {\n      this.$emit(\"update:visible\", false);\n    },\n    onSelect({ type }) {\n      IMSDK.asyncApi(IMSDK.IMMethods.SetGroupVerification, IMSDK.uuid(), {\n        groupID: this.groupID,\n        verification: type,\n      })\n        .then(() => uni.$u.toast(\"操作成功\"))\n        .catch(() => uni.$u.toast(\"操作失败\"));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\"></style>\n"
  },
  {
    "path": "pages/conversation/groupSettings/components/GroupMemberRow.vue",
    "content": "<template>\n  <view @click=\"toMemberList\" class=\"member_row\">\n    <!-- <view class=\"member_title\">\n      <text>群成员</text>\n      <view class=\"member_desc\">\n        <text>{{ `${memberCount}人` }}</text>\n        <u-icon name=\"arrow-right\" color=\"#999\" size=\"16\" />\n      </view>\n    </view> -->\n    <view class=\"member_list\">\n      <view class=\"member_item\" v-for=\"(member, index) in groupMemberList\">\n        <my-avatar\n          :src=\"member.faceURL\"\n          :desc=\"member.nickname\"\n          :key=\"member.userID\"\n          size=\"48\"\n        />\n        <view class=\"ower\" v-if=\"member.roleLevel === 100\">群主</view>\n        <text class=\"member_item_name\">{{ member.nickname }}</text>\n      </view>\n      <view class=\"member_item\">\n        <image\n          style=\"width: 48px; height: 48px; min-width: 48px\"\n          @click.stop=\"inviteMember\"\n          src=\"@/static/images/group_setting_invite.png\"\n          alt=\"\"\n        />\n        <text class=\"member_item_name\">增加</text>\n      </view>\n      <view class=\"member_item\" v-if=\"isAdmin || isOwner\">\n        <image\n          style=\"width: 48px; height: 48px; min-width: 48px\"\n          @click.stop=\"kickMember\"\n          src=\"@/static/images/group_setting_remove.png\"\n          alt=\"\"\n        />\n        <text class=\"member_item_name\">移出</text>\n      </view>\n    </view>\n    <view @click=\"toMemberList\" class=\"more\">\n      <text>查看全部群成员({{ memberCount }})</text>\n      <view class=\"more_right\">\n        <u-icon name=\"arrow-right\" color=\"#999\" size=\"18\" />\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport IMSDK, { GroupMemberRole } from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport SettingItem from \"@/components/SettingItem/index.vue\";\nimport { ContactChooseTypes, GroupMemberListTypes } from \"@/constant\";\nexport default {\n  name: \"\",\n  components: {\n    MyAvatar,\n    SettingItem,\n  },\n  props: {\n    isNomal: Boolean,\n    memberCount: Number,\n    groupID: String,\n    groupMemberList: Array,\n  },\n  data() {\n    return {};\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeCurrentMemberInGroup\",\n      \"storeCurrentGroup\",\n    ]),\n    isOwner() {\n      return this.storeCurrentMemberInGroup.roleLevel === GroupMemberRole.Owner;\n    },\n    isAdmin() {\n      return this.storeCurrentMemberInGroup.roleLevel === GroupMemberRole.Admin;\n    },\n  },\n  methods: {\n    toMemberList() {\n      uni.navigateTo({\n        url: `/pages/conversation/groupMemberList/index?type=${GroupMemberListTypes.Preview}&groupID=${this.groupID}`,\n      });\n    },\n    inviteMember() {\n      uni.navigateTo({\n        url: `/pages/common/contactChoose/index?type=${ContactChooseTypes.Invite}&groupID=${this.groupID}`,\n      });\n    },\n    kickMember() {\n      uni.navigateTo({\n        url: `/pages/conversation/groupMemberList/index?type=${GroupMemberListTypes.Kickout}&groupID=${this.groupID}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.member_row {\n  @include colBox(false);\n  padding: 36rpx 36rpx 0;\n  margin: 24rpx;\n  background-color: #fff;\n  color: $uni-text-color;\n  border-radius: 6px;\n  overflow: hidden;\n\n  .member_title {\n    @include btwBox();\n\n    .member_desc {\n      @include vCenterBox();\n      font-size: 26rpx;\n    }\n  }\n\n  .member_list {\n    @include vCenterBox();\n    flex-wrap: wrap;\n\n    .member_item {\n      position: relative;\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n      margin: 8rpx 14rpx;\n\n      &_name {\n        margin-top: 8rpx;\n        font-size: 24rpx;\n        color: #8e9ab0;\n        max-width: 48px;\n        display: inline-block;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n    }\n  }\n\n  .ower{\n    width: 48px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    bottom: 34rpx;\n    font-size: 24rpx;\n    position: absolute;\n    color: #0089FF;\n    background: #E8EAEF;\n    border-radius: 12rpx 12rpx 12rpx 12rpx;\n  }\n\n  .more {\n    @include btwBox();\n    margin-top: 20rpx;\n    padding: 20rpx 0rpx 20rpx;\n    border-top: 1px solid rgba(153, 153, 153, 0.2);\n\n    .more_right {\n      @include vCenterBox();\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/groupSettings/index.vue",
    "content": "<template>\n  <view class=\"group_settings_container\">\n    <custom-nav-bar title=\"群聊设置\" />\n    <view class=\"group_settings_content\">\n      <view class=\"setting_row info_row\">\n        <view class=\"group_avatar\" @click=\"updateGroupAvatar\">\n          <my-avatar\n            :src=\"storeCurrentConversation.faceURL\"\n            :isGroup=\"true\"\n            size=\"46\"\n          />\n          <image\n            v-if=\"isOwner\"\n            class=\"edit_icon\"\n            src=\"@/static/images/group_setting_edit.png\"\n            alt=\"\"\n          />\n        </view>\n        <view class=\"group_info\">\n          <view class=\"group_info_name\">\n            <text class=\"group_name\"\n              >{{ storeCurrentConversation.showName }}({{\n                storeCurrentGroup.memberCount\n              }})</text\n            >\n            <image\n              v-if=\"isOwner || isAdmin\"\n              @click=\"toUpdateGroupName\"\n              style=\"width: 24rpx; height: 24rpx\"\n              src=\"@/static/images/group_edit.png\"\n              alt=\"\"\n            />\n          </view>\n\n          <text @click=\"copyGroupID\" class=\"sub_title\">{{\n            storeCurrentConversation.groupID\n          }}</text>\n        </view>\n      </view>\n\n      <group-member-row\n        v-if=\"isJoinGroup\"\n        :isNomal=\"!isAdmin && !isOwner\"\n        :groupID=\"storeCurrentConversation.groupID\"\n        :memberCount=\"storeCurrentGroup.memberCount\"\n        :groupMemberList=\"groupMemberList\"\n      />\n      <view v-if=\"isJoinGroup\" class=\"setting_row\">\n        <setting-item\n          v-if=\"isOwner || isAdmin\"\n          @click=\"toGroupManage\"\n          title=\"群管理\"\n          :border=\"false\"\n        />\n      </view>\n\n      <view class=\"setting_row\">\n        <setting-item\n          v-if=\"isJoinGroup\"\n          danger\n          @click=\"() => (confirmType = isOwner ? 'Dismiss' : 'Quit')\"\n          :title=\"isOwner ? '解散群聊' : '退出群聊'\"\n          :border=\"false\"\n        />\n      </view>\n\n      <u-modal\n        :content=\"getConfirmContent\"\n        asyncClose\n        :show=\"confirmType !== null\"\n        showCancelButton\n        @confirm=\"confirm\"\n        @cancel=\"() => (confirmType = null)\"\n      ></u-modal>\n    </view>\n\n    <u-toast ref=\"uToast\"></u-toast>\n    <action-sheet\n      :groupID=\"storeCurrentConversation.groupID\"\n      :visible.sync=\"actionSheetVisible\"\n    />\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport { GroupMemberListTypes } from \"@/constant\";\nimport IMSDK, {\n  GroupMemberRole,\n  GroupStatus,\n  GroupVerificationType,\n  IMMethods,\n  MessageReceiveOptType,\n} from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport SettingItem from \"@/components/SettingItem/index.vue\";\nimport GroupMemberRow from \"./components/GroupMemberRow.vue\";\nimport ActionSheet from \"./components/ActionSheet.vue\";\nimport { getPurePath } from \"@/util/common\";\n\nconst ConfirmTypes = {\n  Dismiss: \"Dismiss\",\n  Quit: \"Quit\",\n};\n\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    SettingItem,\n    GroupMemberRow,\n    ActionSheet,\n  },\n  props: {},\n  data() {\n    return {\n      actionSheetVisible: false,\n      confirmType: null,\n      switchLoading: {\n        pin: false,\n        opt: false,\n        mute: false,\n      },\n      groupMemberList: [],\n      isJoinGroup: true\n    };\n  },\n  onShow() {\n    this.getGroupMemberList();\n    if (this.storeCurrentConversation.groupID) {\n      IMSDK.asyncApi(\n        IMMethods.IsJoinGroup,\n        IMSDK.uuid(),\n        this.storeCurrentConversation.groupID\n      ).then((res) => {\n        this.isJoinGroup = res.data\n      });\n    }\n  },\n  watch: {\n    \"storeCurrentGroup.memberCount\"() {\n      this.getGroupMemberList();\n    },\n  },\n  computed: {\n    ...mapGetters([\n      \"storeCurrentConversation\",\n      \"storeCurrentMemberInGroup\",\n      \"storeCurrentGroup\",\n    ]),\n    getConfirmContent() {\n      if (this.confirmType === ConfirmTypes.Quit) {\n        return \"确定要退出当前群聊吗？\";\n      }\n      if (this.confirmType === ConfirmTypes.Dismiss) {\n        return \"确定要解散当前群聊吗？\";\n      }\n      return \"\";\n    },\n    isOwner() {\n      return this.storeCurrentMemberInGroup.roleLevel === GroupMemberRole.Owner;\n    },\n    isAdmin() {\n      return this.storeCurrentMemberInGroup.roleLevel === GroupMemberRole.Admin;\n    },\n    getGroupVerStr() {\n      if (\n        this.storeCurrentGroup.needVerification ===\n        GroupVerificationType.ApplyNeedInviteNot\n      ) {\n        return \"群成员邀请无需验证\";\n      }\n      if (\n        this.storeCurrentGroup.needVerification === GroupVerificationType.AllNot\n      ) {\n        return \"允许所有人加群\";\n      }\n      return \"需要发送验证消息\";\n    },\n    isAllMuted() {\n      return this.storeCurrentGroup.status === GroupStatus.Muted;\n    },\n  },\n  methods: {\n    getGroupMemberList() {\n      IMSDK.asyncApi(IMSDK.IMMethods.GetGroupMemberList, IMSDK.uuid(), {\n        groupID: this.storeCurrentConversation.groupID,\n        filter: 0,\n        offset: 0,\n        count: !this.isAdmin && !this.isOwner ? 9 : 8,\n      })\n        .then(({ data }) => {\n          console.log(data);\n          this.groupMemberList = [...data];\n        })\n        .catch((err) => {\n          console.log(err);\n        });\n    },\n    toGroupManage() {\n      uni.navigateTo({\n        url: \"/pages/conversation/groupManage/index\",\n      });\n    },\n    toUpdateGroupName() {\n      if (!this.isAdmin && !this.isOwner) {\n        return;\n      }\n\n      uni.navigateTo({\n        url: `/pages/conversation/updateGroupOrNickname/index?sourceInfo=${JSON.stringify(\n          this.storeCurrentGroup,\n        )}`,\n      });\n    },\n    copyGroupID() {\n      uni.setClipboardData({\n        data: this.storeCurrentGroup.groupID,\n        success: () => {\n          uni.hideToast();\n          this.$nextTick(() => {\n            uni.$u.toast(\"复制成功\");\n          });\n        },\n      });\n    },\n    showActionSheet() {\n      if (!this.isAdmin && !this.isOwner) {\n        return;\n      }\n\n      this.actionSheetVisible = true;\n    },\n    updateGroupAvatar() {\n      if (!this.isAdmin && !this.isOwner) {\n        return;\n      }\n\n      uni.chooseImage({\n        count: 1,\n        sizeType: [\"compressed\"],\n        success: async ({ tempFilePaths }) => {\n          const path = tempFilePaths[0];\n          const nameIdx = path.lastIndexOf(\"/\") + 1;\n          const typeIdx = path.lastIndexOf(\".\") + 1;\n          const fileName = path.slice(nameIdx);\n          const fileType = path.slice(typeIdx);\n          try {\n            const {\n              data: { url },\n            } = await IMSDK.asyncApi(IMMethods.UploadFile, IMSDK.uuid(), {\n              filepath: getPurePath(tempFilePaths[0]),\n              name: fileName,\n              contentType: fileType,\n              uuid: IMSDK.uuid(),\n            });\n            await IMSDK.asyncApi(IMSDK.IMMethods.SetGroupInfo, IMSDK.uuid(), {\n              groupID: this.storeCurrentConversation.groupID,\n              faceURL: url,\n            });\n            uni.$u.toast(\"修改成功\");\n          } catch (error) {\n            uni.$u.toast(\"修改失败\");\n          }\n        },\n      });\n    },\n    confirm() {\n      let funcName = \"\";\n      let sourceID = this.storeCurrentConversation.groupID;\n      if (this.confirmType === ConfirmTypes.Quit) {\n        funcName = IMSDK.IMMethods.QuitGroup;\n      }\n      if (this.confirmType === ConfirmTypes.Dismiss) {\n        funcName = IMSDK.IMMethods.DismissGroup;\n      }\n      IMSDK.asyncApi(funcName, IMSDK.uuid(), sourceID)\n        .then(() => {\n          uni.$u.toast(\"操作成功\");\n          setTimeout(\n            () =>\n              uni.switchTab({\n                url: \"/pages/conversation/conversationList/index\",\n              }),\n            250,\n          );\n        })\n        .catch(() => uni.$u.toast(\"操作失败\"))\n        .finally(() => (this.confirmType = null));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.group_settings_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .group_settings_content {\n    overflow-y: auto;\n  }\n\n  .setting_row {\n    background-color: #fff;\n    margin: 24rpx;\n    border-radius: 6px;\n    overflow: hidden;\n  }\n\n  .info_row {\n    @include vCenterBox();\n    padding: 36rpx 44rpx;\n\n    .group_avatar {\n      margin-right: 16rpx;\n      position: relative;\n\n      .edit_icon {\n        position: absolute;\n        right: -6rpx;\n        bottom: -6rpx;\n        width: 11px;\n        height: 11px;\n      }\n    }\n\n    .group_info {\n      min-height: 46px;\n      display: flex;\n      flex: 1;\n      flex-direction: column;\n      align-items: flex-start;\n      justify-content: space-between;\n\n      &_name {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: center;\n\n        .group_name {\n          // @include nomalEllipsis();\n          font-size: 34rpx;\n          max-width: 380rpx;\n          margin-right: 24rpx;\n        }\n      }\n\n      .sub_title {\n        @include nomalEllipsis();\n        margin-bottom: 0;\n        font-size: 28rpx;\n        color: #999;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/singleSettings/index.vue",
    "content": "<template>\n  <view class=\"single_settings_container\">\n    <custom-nav-bar title=\"好友设置\" />\n\n    <view class=\"row_wrap\">\n      <view class=\"setting_row info_row\">\n        <view @click=\"toUserCard\" class=\"user_info\">\n          <my-avatar\n            :src=\"storeCurrentConversation.faceURL\"\n            :desc=\"storeCurrentConversation.showName\"\n            size=\"46\"\n          />\n        </view>\n        <view @click=\"invite2group\" class=\"action\">\n          <image\n            style=\"width: 46px; height: 46px\"\n            src=\"@/static/images/single_setting_add.png\"\n            alt=\"\"\n          />\n        </view>\n      </view>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { mapGetters } from \"vuex\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport SettingItem from \"@/components/SettingItem/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    SettingItem,\n  },\n  props: {},\n  data() {\n    return {\n      switchLoading: {\n        pin: false,\n        opt: false,\n        readLimit: false,\n      },\n      showConfirm: false,\n    };\n  },\n  computed: {\n    ...mapGetters([\"storeCurrentConversation\"]),\n  },\n  methods: {\n    toUserCard() {\n      uni.navigateTo({\n        url: `/pages/common/userCard/index?sourceID=${this.storeCurrentConversation.userID}`,\n      });\n    },\n    invite2group() {\n      const checkedMemberList = JSON.stringify([\n        {\n          userID: this.storeCurrentConversation.userID,\n          faceURL: this.storeCurrentConversation.faceURL,\n          nickname: this.storeCurrentConversation.showName,\n        },\n      ]);\n      uni.navigateTo({\n        url: `/pages/common/createGroup/index?checkedMemberList=${checkedMemberList}`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.single_settings_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f6f6f6;\n\n  .row_wrap {\n    flex: 1;\n    overflow-y: auto;\n  }\n\n  .setting_row {\n    margin: 24rpx 24rpx 0 24rpx;\n    background: #fff;\n    border-radius: 6px;\n    overflow: hidden;\n  }\n\n  .info_row {\n    display: flex;\n    align-items: center;\n    padding: 44rpx;\n\n    .user_info {\n      @include colBox(false);\n      margin-right: 36rpx;\n\n      .user_name {\n        margin-top: 20rpx;\n        color: #666;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/conversation/updateGroupOrNickname/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <custom-nav-bar :title=\"getTitle\">\n      <view class=\"nav_right_action\" slot=\"more\">\n        <text v-show=\"!updateLoading\" @click=\"comfirmUpdate\">保存</text>\n        <u-loading-icon v-show=\"updateLoading\" />\n      </view>\n    </custom-nav-bar>\n\n    <view class=\"content_row\">\n      <u-input\n        v-model=\"content\"\n        disabledColor=\"transparent\"\n        maxlength=\"16\"\n        placeholder=\"请输入内容\"\n        clearable\n      >\n      </u-input>\n    </view>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n  },\n  data() {\n    return {\n      sourceInfo: {},\n      content: \"\",\n      updateLoading: false,\n    };\n  },\n  computed: {\n    getTitle() {\n      return \"修改群聊名称\";\n    },\n    getSubTitle() {\n      return \"修改群名称后，将在群内通知其他成员\";\n    },\n  },\n  onLoad(options) {\n    const { sourceInfo } = options;\n    this.sourceInfo = JSON.parse(sourceInfo);\n    this.content = this.sourceInfo.groupName;\n  },\n  methods: {\n    comfirmUpdate() {\n      this.updateLoading = true;\n      IMSDK.asyncApi(IMSDK.IMMethods.SetGroupInfo, IMSDK.uuid(), {\n          groupID: this.sourceInfo.groupID,\n          groupName: this.content,\n        })\n        .then(() => {\n          uni.$u.toast(\"修改成功\");\n          setTimeout(() => uni.navigateBack(), 250);\n        })\n        .catch(() => uni.$u.toast(\"修改失败\"))\n        .finally(() => (this.updateLoading = false));\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.page_container {\n  @include colBox(false);\n  height: 100vh;\n\n  .nav_right_action {\n    margin-right: 36rpx;\n  }\n\n  .content_row {\n    margin-top: 96rpx;\n    margin: 72rpx 44rpx 0;\n\n    .u-input {\n      background-color: #e8eaef;\n    }\n\n    .u-button {\n      height: 60rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/login/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <view class=\"login\">\n      <view class=\"logo\">\n        <img src=\"static/images/logo.png\" alt=\"\" />\n        <view class=\"title\">欢迎使用OpenCorp</view>\n      </view>\n      <u-tabs :list=\"list\" @click=\"click\"></u-tabs>\n      <u-form\n        class=\"loginForm\"\n        labelPosition=\"top\"\n        :model=\"loginInfo\"\n        :labelStyle=\"{\n          fontSize: '14px',\n          marginTop: '20rpx',\n          width: 'max-content',\n        }\"\n        ref=\"loginForm\"\n      >\n        <u-form-item v-if=\"active === 0\" label=\"\" prop=\"phoneNumber\">\n          <u-input\n            v-model=\"loginInfo.phoneNumber\"\n            border=\"surround\"\n            placeholder=\"请输入手机号码\"\n            clearable\n          >\n            <view\n              slot=\"prefix\"\n              class=\"phoneNumber_areacode\"\n              @click=\"showPicker\"\n            >\n              <text class=\"areacode_content\">+{{ loginInfo.areaCode }}</text>\n              <u-icon class=\"arrow_down\" name=\"arrow-down\"></u-icon>\n            </view>\n          </u-input>\n        </u-form-item>\n        <u-form-item v-if=\"active === 1\" label=\"\" prop=\"email\">\n          <u-input\n            v-model=\"loginInfo.email\"\n            border=\"surround\"\n            placeholder=\"请输入您的邮箱\"\n            clearable\n          >\n          </u-input>\n        </u-form-item>\n        <u-form-item v-if=\"active > 1 || isPwdLogin\" label=\"\" prop=\"password\">\n          <u-input\n            v-model=\"loginInfo.password\"\n            border=\"surround\"\n            placeholder=\"请输入密码\"\n            :password=\"!eying\"\n            clearable\n          >\n            <u-icon\n              @click=\"updateEye\"\n              slot=\"suffix\"\n              :name=\"eying ? 'eye-off' : 'eye'\"\n            >\n            </u-icon>\n          </u-input>\n        </u-form-item>\n        <u-form-item\n          v-if=\"active <= 1 && !isPwdLogin\"\n          label=\"\"\n          prop=\"verificationCode\"\n        >\n          <u-input\n            v-model=\"loginInfo.verificationCode\"\n            border=\"surround\"\n            placeholder=\"请输入验证码\"\n          >\n            <view class=\"code_btn\" slot=\"suffix\" @click=\"getCode\">\n              {{ count !== 0 ? `${count} s` : \"获取验证码\" }}\n            </view>\n          </u-input>\n        </u-form-item>\n      </u-form>\n      <view v-if=\"active <= 1\" class=\"other\">\n        <text @click=\"toRegisterOrForget(false)\">忘记密码</text>\n        <text class=\"forget\" @click=\"toggleLoginMethod\">{{ isPwdLogin ? \"验证码登录\" : \"密码登录\" }}</text>\n      </view>\n      <view class=\"login-btn\">\n        <u-button\n          :loading=\"loading\"\n          type=\"primary\"\n          @click=\"startLogin\"\n          :disabled=\"!canLogin\"\n        >\n          登录\n        </u-button>\n      </view>\n\n      <AreaPicker ref=\"AreaPicker\" @chooseArea=\"chooseArea\" />\n    </view>\n\n    <view class=\"action_bar\">\n      <text>还没有账号？<text class=\"register\" @click=\"toRegisterOrForget(true)\">立即注册</text></text>\n      <text style=\"margin-bottom: 16rpx\" @click=\"copy\">{{ v }}</text>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { v4 as uuidv4 } from \"uuid\";\nimport md5 from \"md5\";\nimport { version } from '@/common/config'\nimport { businessLogin, businessSendSms } from \"@/api/login\";\nimport AreaPicker from \"@/components/AreaPicker\";\nimport { checkLoginError } from \"@/util/common\";\nimport { SmsUserFor } from \"@/constant\";\nimport IMSDK from \"openim-uniapp-polyfill\";\n\nlet timer;\n\nexport default {\n  components: {\n    AreaPicker,\n  },\n  data() {\n    return {\n      list: [{\n          name: '手机号',\n      }, {\n          name: '邮箱',\n      }],\n      loginInfo: {\n        email: \"\",\n        phoneNumber: \"\",\n        password: \"\",\n        areaCode: \"86\",\n        verificationCode: \"\",\n      },\n      eying: false,\n      loading: false,\n      count: 0,\n      isPwdLogin: true,\n      active: 0,\n    };\n  },\n  computed: {\n    v() {\n      return version\n    },\n    canLogin() {\n      return (\n        (this.loginInfo.phoneNumber || this.loginInfo.email) && \n        (this.loginInfo.password || this.loginInfo.verificationCode)\n      );\n    },\n  },\n  onLoad(options) {\n    // if(options.isRedirect){\n    // \tplus.navigator.closeSplashscreen();\n    // }\n    this.version = version\n    this.init();\n  },\n  methods: {\n    click({ index }) {\n      this.active = index;\n    },\n    copy() {\n      uni.setClipboardData({\n        showToast: false,\n        data: version,\n        success: function () {\n          uni.showToast({\n            icon: \"none\",\n            title: \"复制成功\",\n          });\n        },\n      });\n    },\n    init() {\n      this.loginInfo.areaCode = uni.getStorageSync(\"last_areaCode\") || \"86\";\n      this.loginInfo.email = uni.getStorageSync(\"last_email\") || \"\";\n      this.loginInfo.phoneNumber = uni.getStorageSync(\"last_phoneNumber\") || \"\";\n    },\n    updateEye() {\n      this.eying = !this.eying;\n    },\n    toRegisterOrForget(isRegister) {\n      uni.$u.route(\"/pages/login/registerOrForget/index\", {\n        isRegister,\n      });\n    },\n    async startLogin() {\n      // this.$refs.loginForm.validate().then(async (valid) => {\n        this.loading = true;\n        this.saveLoginInfo();\n        let data = {};\n        try {\n          data = await businessLogin({\n            phoneNumber: this.loginInfo.phoneNumber,\n            email: this.loginInfo.email,\n            areaCode: `+${this.loginInfo.areaCode}`,\n            password: this.isPwdLogin ? md5(this.loginInfo.password) : \"\",\n            platform: uni.$u.os() === \"ios\" ? 1 : 2,\n            verifyCode: this.loginInfo.verificationCode,\n          });\n          const { imToken, userID } = data;\n          await IMSDK.asyncApi(IMSDK.IMMethods.Login, uuidv4(), {\n            userID,\n            token: imToken,\n          });\n          this.saveLoginProfile(data);\n          this.$store.commit(\"user/SET_AUTH_DATA\", data);\n          this.$store.dispatch(\"user/getSelfInfo\");\n          this.$store.dispatch(\"conversation/getConversationList\");\n          this.$store.dispatch(\"conversation/getUnReadCount\");\n          // this.$store.dispatch(\"contact/getFriendList\");\n          // this.$store.dispatch(\"contact/getGrouplist\");\n          this.$store.dispatch(\"contact/getBlacklist\");\n          this.$store.dispatch(\"contact/getRecvFriendApplications\");\n          this.$store.dispatch(\"contact/getSentFriendApplications\");\n          this.$store.dispatch(\"contact/getRecvGroupApplications\");\n          this.$store.dispatch(\"contact/getSentGroupApplications\");\n          uni.switchTab({\n            url: \"/pages/conversation/conversationList/index\",\n          });\n          this.loginInfo.password = \"\";\n        } catch (err) {\n          console.error(err);\n          uni.$u.toast(checkLoginError(err));\n        }\n        this.loading = false;\n      // });\n    },\n    saveLoginProfile(data) {\n      const { imToken, chatToken, userID } = data;\n      uni.setStorage({\n        key: \"IMUserID\",\n        data: userID,\n      });\n      uni.setStorage({\n        key: \"IMToken\",\n        data: imToken,\n      });\n      uni.setStorage({\n        key: \"BusinessToken\",\n        data: chatToken,\n      });\n    },\n    saveLoginInfo() {\n      uni.setStorage({\n        key: \"last_areaCode\",\n        data: this.loginInfo.areaCode,\n      });\n      uni.setStorage({\n        key: \"last_phoneNumber\",\n        data: this.loginInfo.phoneNumber,\n      });\n      uni.setStorage({\n        key: \"last_email\",\n        data: this.loginInfo.email,\n      });\n    },\n    showPicker() {\n      this.$refs.AreaPicker.init();\n    },\n    chooseArea(areaCode) {\n      this.loginInfo.areaCode = areaCode;\n    },\n    toggleLoginMethod() {\n      this.isPwdLogin = !this.isPwdLogin;\n    },\n    getCode() {\n      if (!this.loginInfo.phoneNumber) {\n        uni.$u.toast(\"请先输入手机号！\");\n        return;\n      }\n\n      if (this.count !== 0) {\n        return;\n      }\n\n      const options = {\n        phoneNumber: this.loginInfo.phoneNumber,\n        areaCode: `+${this.loginInfo.areaCode}`,\n        usedFor: SmsUserFor.Login,\n        operationID: Date.now() + \"\",\n      };\n      businessSendSms(options)\n        .then(() => {\n          uni.$u.toast(\"验证码已发送！\");\n          this.startCount();\n        })\n        .catch((err) => {\n          console.error(err);\n          uni.$u.toast(checkLoginError(err));\n        });\n    },\n    startCount() {\n      if (timer) {\n        clearInterval(timer);\n      }\n      this.count = 60;\n      timer = setInterval(() => {\n        if (this.count > 0) {\n          this.count--;\n        }\n      }, 1000);\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.page_container {\n  justify-content: space-between;\n\n  .login {\n    color: #0c1c33;\n    padding: 10vh 80rpx 0;\n    background: linear-gradient(\n      180deg,\n      rgba(0, 137, 255, 0.1) 0%,\n      rgba(255, 255, 255, 0) 100%\n    );\n\n    .title {\n      font-size: 34rpx;\n      font-weight: 700;\n      margin-bottom: 64rpx;\n      // color: $u-primary;\n    }\n\n    .logo {\n      display: flex;\n      flex-direction: column;\n      justify-content: start;\n      align-items: start;\n\n      img {\n        width: 160rpx;\n        height: 160rpx;\n      }\n    }\n\n    .loginType {\n      margin-bottom: 36rpx;\n\n      &-item {\n        margin-right: 68rpx;\n        font-size: 28rpx;\n        font-weight: 400;\n        border-radius: 4rpx;\n        padding: 2rpx 0;\n      }\n\n      &-active {\n        color: $u-primary;\n        border-bottom: 4rpx solid $u-primary;\n      }\n    }\n\n    .loginForm {\n      .phoneNumber-code {\n        display: flex;\n        align-items: center;\n        font-size: 36rpx;\n        border-right: 2rpx solid #d8d8d8;\n        margin-right: 58rpx;\n\n        .code {\n          font-weight: 400;\n          margin-right: 20rpx;\n        }\n\n        .icon {\n          margin-right: 40rpx;\n        }\n      }\n\n      .eye {\n        .image {\n          width: 44rpx;\n          height: 32rpx;\n        }\n      }\n\n      .code_btn {\n        color: $u-primary;\n      }\n    }\n\n    .other {\n      display: flex;\n      flex-direction: row;\n      justify-content: space-between;\n      margin: 8rpx;\n      font-size: 24rpx;\n      font-weight: 400;\n      color: $u-tips-color;\n\n      .forget {\n        color: $u-primary;\n      }\n    }\n\n    .login-btn {\n      margin-top: 8vh;\n    }\n\n    .agreement {\n      display: flex;\n      align-items: flex-start;\n      margin-top: 36rpx;\n\n      .detail {\n        font-size: 24rpx;\n        font-weight: 400;\n        color: $u-primary;\n      }\n    }\n  }\n\n  .action_bar {\n    display: flex;\n    justify-content: center;\n    flex-direction: column;\n    text-align: center;\n    margin-bottom: 96rpx;\n    font-size: 24rpx;\n    font-weight: 400;\n    color: $u-tips-color;\n\n    .register {\n      color: $u-primary;\n    }\n\n    .tap_line {\n      width: 1px;\n      margin: 0 24rpx;\n      background-color: #999;\n      transform: scale(0.5, 0.8);\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/login/registerOrForget/index.vue",
    "content": "<template>\n  <view class=\"register_container content_with_back\">\n    <view class=\"back_icon\">\n      <u-icon name=\"arrow-left\" bold size=\"22\" @click=\"back\" />\n    </view>\n    <view class=\"title\" v-if=\"isRegister\">新用户注册</view>\n    <view class=\"title\" v-else>忘记密码</view>\n    <u-form\n      labelPosition=\"top\"\n      :model=\"userInfo\"\n      :rules=\"rules\"\n      :labelStyle=\"{\n        fontSize: '14px',\n        marginTop: '20rpx',\n        minWidth: '200rpx',\n      }\"\n      ref=\"registerForm\"\n    >\n      <u-form-item prop=\"phoneNumber\" label=\"手机号码\">\n        <u-input\n          v-model=\"userInfo.phoneNumber\"\n          border=\"surround\"\n          placeholder=\"请输入手机号码\"\n          clearable\n        >\n          <view slot=\"prefix\" class=\"phoneNumber_areacode\" @click=\"showPicker\">\n            <text class=\"areacode_content\">+{{ userInfo.areaCode }}</text>\n            <u-icon class=\"arrow_down\" name=\"arrow-down\"></u-icon>\n          </view>\n        </u-input>\n      </u-form-item>\n    </u-form>\n    <view class=\"action_btn\">\n      <u-button\n        @click=\"sendSms\"\n        type=\"primary\"\n        :disabled=\"isRegister && !checked[0]\"\n      >\n        {{ isRegister ? \"下一步\" : \"获取验证码\" }}\n      </u-button>\n    </view>\n    <AreaPicker ref=\"AreaPicker\" @chooseArea=\"chooseArea\" />\n  </view>\n</template>\n\n<script>\nimport AreaPicker from \"@/components/AreaPicker\";\nimport { businessSendSms } from \"@/api/login\";\nimport { SmsUserFor } from \"@/constant\";\nimport { checkLoginError } from \"@/util/common\";\nexport default {\n  components: {\n    AreaPicker,\n  },\n  data() {\n    return {\n      userInfo: {\n        phoneNumber: \"\",\n        email: \"\",\n        areaCode: \"86\",\n        invitationCode: \"\",\n      },\n      checked: [true],\n      rules: {\n        phoneNumber: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请输入手机号码\",\n            trigger: [\"blur\", \"change\"],\n            pattern: /^\\d{11}$/,\n          },\n        ],\n      },\n      isRegister: true,\n      pageStatus: \"normal\",\n    };\n  },\n  onLoad(param) {\n    this.isRegister = JSON.parse(param.isRegister);\n  },\n  methods: {\n    sendSms() {\n      this.$refs.registerForm.validate().then((valid) => {\n        const options = {\n          phoneNumber: this.userInfo.phoneNumber,\n          areaCode: `+${this.userInfo.areaCode}`,\n          usedFor: this.isRegister ? SmsUserFor.Register : SmsUserFor.Reset,\n          invitationCode: this.userInfo.invitationCode,\n        };\n        businessSendSms(options)\n          .then(() => {\n            uni.$u.toast(\"验证码已发送！\");\n            setTimeout(\n              () =>\n                uni.$u.route(\"/pages/login/verifyCode/index\", {\n                  userInfo: JSON.stringify(this.userInfo),\n                  isRegister: this.isRegister,\n                }),\n              1000,\n            );\n          })\n          .catch((err) => {\n            console.error(err);\n            uni.$u.toast(checkLoginError(err));\n          });\n      });\n    },\n    back() {\n      uni.$u.route(\"/pages/login/index\");\n    },\n    showPicker() {\n      this.$refs.AreaPicker.init();\n    },\n    chooseArea(areaCode) {\n      this.userInfo.areaCode = areaCode;\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.register_container {\n  margin-top: var(--status-bar-height);\n  background: linear-gradient(\n    180deg,\n    rgba(0, 137, 255, 0.1) 0%,\n    rgba(255, 255, 255, 0) 100%\n  );\n\n  .title {\n    font-size: 44rpx;\n    font-weight: 600;\n    color: $u-primary;\n  }\n\n  .action_btn {\n    padding-top: 20vh;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/login/setPassword/index.vue",
    "content": "<template>\n  <view class=\"set_password_container content_with_back\">\n    <view class=\"title\">重置密码</view>\n    <u-form\n      class=\"loginForm commonPage-form\"\n      labelPosition=\"top\"\n      :model=\"formData\"\n      :rules=\"rules\"\n      :labelStyle=\"{\n        fontSize: '14px',\n        marginTop: '20rpx',\n        minWidth: '200rpx',\n      }\"\n      ref=\"loginForm\"\n    >\n      <u-form-item label=\"密码\" prop=\"password\">\n        <u-input\n          v-model=\"formData.password\"\n          border=\"surround\"\n          placeholder=\"请输入密码\"\n          :password=\"!passwordEying\"\n        >\n          <u-icon\n            @click=\"updateEye('passwordEying')\"\n            slot=\"suffix\"\n            :name=\"passwordEying ? 'eye-off' : 'eye'\"\n          ></u-icon>\n        </u-input>\n      </u-form-item>\n      <view class=\"feild_desc\">6～20位，至少包含数字、字母</view>\n      <u-form-item label=\"确认密码\" prop=\"confirmPassword\">\n        <u-input\n          v-model=\"formData.confirmPassword\"\n          border=\"surround\"\n          placeholder=\"请输入密码\"\n          :password=\"!comfirmEying\"\n        >\n          <u-icon\n            @click=\"updateEye('comfirmEying')\"\n            slot=\"suffix\"\n            :name=\"comfirmEying ? 'eye-off' : 'eye'\"\n          ></u-icon>\n        </u-input>\n      </u-form-item>\n    </u-form>\n    <view class=\"action_btn\">\n      <u-button type=\"primary\" @click=\"doNext\">\n        确认修改\n      </u-button>\n    </view>\n  </view>\n</template>\n\n<script>\nimport { businessReset } from \"@/api/login\";\nexport default {\n  data() {\n    return {\n      isRegister: false,\n      codeValue: \"\",\n      userInfo: {\n        phoneNumber: \"\",\n        areaCode: \"\",\n      },\n      formData: {\n        password: \"\",\n        confirmPassword: \"\",\n      },\n      passwordEying: false,\n      comfirmEying: false,\n      rules: {\n        password: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请输入密码\",\n            trigger: [\"blur\", \"change\"],\n            pattern: /^(?=.*\\d)(?=.*[a-zA-Z]).{7,}$/,\n          },\n          {\n            validator: (rule, value, callback) => {\n              return value.length >= 6;\n            },\n            message: \"密码太短\",\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n        confirmPassword: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请输入确认密码\",\n            trigger: [\"blur\", \"change\"],\n            pattern: /^(?=.*\\d)(?=.*[a-zA-Z]).{7,}$/,\n          },\n          {\n            validator: (rule, value, callback) => {\n              return value === this.formData.password;\n            },\n            message: \"两次密码不一致\",\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n      },\n    };\n  },\n  onLoad(options) {\n    const { userInfo, isRegister, codeValue } = options;\n    this.userInfo = JSON.parse(userInfo);\n    this.isRegister = JSON.parse(isRegister);\n    this.codeValue = codeValue;\n  },\n  onBackPress() {\n    return true;\n  },\n  methods: {\n    doNext() {\n      this.$refs.loginForm.validate().then((valid) => {\n        if (valid) {\n          const options = {\n            phoneNumber: this.userInfo.phoneNumber,\n            areaCode: `+${this.userInfo.areaCode}`,\n            VerifyCode: this.codeValue,\n            password: this.formData.password,\n            platform: uni.$u.os() === \"ios\" ? 1 : 2,\n            operationID: Date.now() + \"\",\n          };\n          businessReset(options)\n            .then(() => {\n              uni.$u.toast(\"密码重置成功，请前往登录！\");\n              setTimeout(() => uni.$u.route(\"/pages/login/index\"), 1000);\n            })\n            .catch((err) => {\n              console.log('err', err)\n              uni.$u.toast(\"密码重置失败\")\n            });\n        }\n      });\n    },\n    updateEye(key) {\n      this[key] = !this[key];\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.set_password_container {\n  margin-top: var(--status-bar-height);\n  background: linear-gradient(\n    180deg,\n    rgba(0, 137, 255, 0.1) 0%,\n    rgba(255, 255, 255, 0) 100%\n  );\n  padding-top: 150rpx;\n\n  .title {\n    font-size: 34rpx;\n    font-weight: 600;\n    margin-bottom: 116rpx;\n    padding-bottom: 8rpx;\n    color: $u-primary;\n  }\n\n  .feild_desc {\n    font-size: 24rpx;\n    color: $u-tips-color;\n    margin-top: 4rpx;\n  }\n\n  .action_btn {\n    margin-top: 12vh;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/login/setSelfInfo/index.vue",
    "content": "<template>\n  <view class=\"set_info_container content_with_back\">\n    <view class=\"title\">设置信息</view>\n    <u-form\n      class=\"loginForm commonPage-form\"\n      labelPosition=\"top\"\n      :model=\"userInfo\"\n      :rules=\"rules\"\n      :labelStyle=\"{\n        fontSize: '14px',\n        marginTop: '20rpx',\n        minWidth: '200rpx',\n      }\"\n      ref=\"loginForm\"\n    >\n      <u-form-item label=\"昵称\" prop=\"nickname\">\n\t\t\t\t<u-input\n\t\t\t\t  v-model=\"userInfo.nickname\"\n\t\t\t\t  border=\"surround\"\n\t\t\t\t  placeholder=\"请输入您的昵称\"\n\t\t\t\t\tclearable\n\t\t\t\t>\n\t\t\t\t</u-input>\n      </u-form-item>\n      <u-form-item label=\"密码\" prop=\"password\">\n        <u-input\n          v-model=\"userInfo.password\"\n          border=\"surround\"\n          placeholder=\"请输入密码\"\n          :password=\"!passwordEying\"\n        >\n          <u-icon\n            @click=\"updateEye('passwordEying')\"\n            slot=\"suffix\"\n            :name=\"passwordEying ? 'eye-off' : 'eye'\"\n          ></u-icon>\n        </u-input>\n      </u-form-item>\n      <view class=\"feild_desc\">6～20位，至少包含数字、字母</view>\n      <u-form-item label=\"确认密码\" prop=\"confirmPassword\">\n        <u-input\n          v-model=\"userInfo.confirmPassword\"\n          border=\"surround\"\n          placeholder=\"请输入密码\"\n          :password=\"!comfirmEying\"\n        >\n          <u-icon\n            @click=\"updateEye('comfirmEying')\"\n            slot=\"suffix\"\n            :name=\"comfirmEying ? 'eye-off' : 'eye'\"\n          ></u-icon>\n        </u-input>\n      </u-form-item>\n    </u-form>\n    <view class=\"btn\">\n      <u-button :loading=\"loading\" type=\"primary\" @click=\"doNext\">\n        进入OpenIM\n      </u-button>\n    </view>\n  </view>\n</template>\n\n<script>\nimport md5 from \"md5\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport { businessRegister } from \"@/api/login\";\nimport { checkLoginError } from \"@/util/common\";\nexport default {\n  components: {\n    MyAvatar,\n  },\n  data() {\n    return {\n      loading: false,\n      passwordEying: false,\n      comfirmEying: false,\n      codeValue: \"\",\n      userInfo: {\n        phoneNumber: \"\",\n        areaCode: \"\",\n        nickname: \"\",\n        password: \"\",\n        confirmPassword: \"\",\n      },\n      rules: {\n        nickname: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请填写真实姓名\",\n            trigger: [\"blur\", \"change\"],\n          },\n        ],\n        password: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请输入密码\",\n            trigger: [\"blur\", \"change\"],\n            pattern: /^(?=.*\\d)(?=.*[a-zA-Z]).{7,}$/,\n          },\n          {\n            validator: (rule, value, callback) => {\n              return value.length >= 6;\n            },\n            message: \"密码太短\",\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n        confirmPassword: [\n          {\n            type: \"string\",\n            required: true,\n            message: \"请输入确认密码\",\n            trigger: [\"blur\", \"change\"],\n            pattern: /^(?=.*\\d)(?=.*[a-zA-Z]).{7,}$/,\n          },\n          {\n            validator: (rule, value, callback) => {\n              return value === this.formData.password;\n            },\n            message: \"两次密码不一致\",\n            trigger: [\"change\", \"blur\"],\n          },\n        ],\n      },\n    };\n  },\n  onLoad(options) {\n    const { userInfo, codeValue } = options;\n    this.userInfo = {\n      ...this.userInfo,\n      ...JSON.parse(userInfo),\n    };\n    this.codeValue = codeValue;\n  },\n  onBackPress() {\n    return true;\n  },\n  methods: {\n    updateEye(key) {\n      this[key] = !this[key];\n    },\n    doNext() {\n      this.$refs.loginForm.validate().then((valid) => {\n        if (valid) {\n          this.doRegister();\n        }\n      });\n    },\n    async doRegister() {\n      this.loading = true;\n      const options = {\n        verifyCode: this.codeValue,\n        platform: uni.$u.os() === \"ios\" ? 1 : 2,\n        autoLogin: true,\n        user: {\n          ...this.userInfo,\n          areaCode: `+${this.userInfo.areaCode}`,\n          password: md5(this.userInfo.password),\n        },\n      };\n      try {\n        await businessRegister(options);\n        this.saveLoginInfo();\n        uni.$u.toast('注册成功')\n        uni.$u.route(\"/pages/login/index\")\n      } catch (err) {\n        console.log(err);\n        uni.$u.toast(checkLoginError(err));\n        // uni.$u.toast('注册失败')\n      } finally {\n        this.loading = false;\n      }\n    },\n    saveLoginInfo() {\n      uni.setStorage({\n        key: \"lastPhoneNumber\",\n        data: this.userInfo.phoneNumber,\n      });\n      uni.setStorage({\n        key: \"lastAreaCode\",\n        data: this.userInfo.areaCode,\n      });\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.set_info_container {\n  margin-top: var(--status-bar-height);\n  background: linear-gradient(\n    180deg,\n    rgba(0, 137, 255, 0.1) 0%,\n    rgba(255, 255, 255, 0) 100%\n  );\n  padding-top: 150rpx;\n\n  .title {\n    font-size: 34rpx;\n    font-weight: 600;\n    margin-bottom: 116rpx;\n    padding-bottom: 8rpx;\n    color: $u-primary;\n  }\n\n  .feild_desc {\n    font-size: 24rpx;\n    color: $u-tips-color;\n    margin-top: 4rpx;\n  }\n\n  .btn {\n    margin-top: 200rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/login/verifyCode/index.vue",
    "content": "<template>\n  <view class=\"verify_code content_with_back\">\n    <view class=\"back_icon\">\n      <u-icon name=\"arrow-left\" bold size=\"22\" @click=\"back\" />\n    </view>\n    <view class=\"title\">验证码已发送至手机</view>\n    <view class=\"sub_title\">\n      {{ `+${userInfo.areaCode} ${userInfo.phoneNumber}` }}\n    </view>\n    <view class=\"code_container\">\n      <!-- <view class=\"code_title\">请输入验证码</view> -->\n      <u-code-input\n        fontSize=\"24\"\n        color=\"#000\"\n        :focus=\"true\"\n        v-model=\"codeValue\"\n        hairline\n        space=\"16\"\n        @finish=\"checkCode\"\n      />\n      <view class=\"code_des\">\n        <text>\n          {{ `${count}s` }}\n        </text>\n        后\n        <text @click=\"getSmsAgain\"> 重发验证码 </text>\n      </view>\n    </view>\n  </view>\n</template>\n<script>\nimport { businessSendSms, businessVerifyCode } from \"@/api/login\";\nimport { SmsUserFor } from \"@/constant\";\nimport { checkLoginError } from \"@/util/common\";\nlet timer;\nexport default {\n  data() {\n    return {\n      codeValue: \"\",\n      count: 60,\n      userInfo: {\n        phoneNumber: \"\",\n        areaCode: \"\",\n      },\n      isRegister: false,\n    };\n  },\n  onLoad(options) {\n    const { userInfo, isRegister } = options;\n    this.userInfo = JSON.parse(userInfo);\n    this.isRegister = JSON.parse(isRegister);\n    this.startCount();\n  },\n  onReady() {},\n  methods: {\n    back() {\n      uni.$u.route(\"/pages/login/registerOrForget/index\", {\n        isRegister: this.isRegister,\n      });\n    },\n    checkCode(value) {\n      const options = {\n        phoneNumber: this.userInfo.phoneNumber,\n        areaCode: `+${this.userInfo.areaCode}`,\n        usedFor: this.isRegister ? SmsUserFor.Register : SmsUserFor.Reset,\n        verifyCode: value,\n      };\n      businessVerifyCode(options)\n        .then(() => {\n          if(this.isRegister){\n            uni.$u.route(\"/pages/login/setSelfInfo/index\", {\n              userInfo: JSON.stringify(this.userInfo),\n              isRegister: this.isRegister,\n              codeValue: this.codeValue,\n            });\n          }else{\n            uni.$u.route(\"/pages/login/setPassword/index\", {\n              userInfo: JSON.stringify(this.userInfo),\n              isRegister: !this.isRegister,\n              codeValue: this.codeValue,\n            });\n          }\n        })\n        .catch((err) => {\n          uni.$u.toast(checkLoginError(err));\n          // uni.$u.toast('验证失败')\n        });\n    },\n    startCount() {\n      if (timer) {\n        clearInterval(timer);\n      }\n      timer = setInterval(() => {\n        if (this.count > 0) {\n          this.count--;\n        }\n      }, 1000);\n    },\n    getSmsAgain() {\n      if (this.count === 0) {\n        const options = {\n          phoneNumber: this.userInfo.phoneNumber,\n          areaCode: `+${this.userInfo.areaCode}`,\n          usedFor: this.isRegister ? SmsUserFor.Register : SmsUserFor.Reset,\n        };\n        businessSendSms(options)\n          .then(() => {\n            this.count = 60;\n            this.startCount();\n            uni.$u.toast(\"验证码已发送！\");\n          })\n          .catch((err) => uni.$u.toast(\"验证码发送失败\"));\n      }\n    },\n  },\n};\n</script>\n<style lang=\"scss\" scoped>\n.verify_code {\n  margin-top: var(--status-bar-height);\n  background: linear-gradient(\n    180deg,\n    rgba(0, 137, 255, 0.1) 0%,\n    rgba(255, 255, 255, 0) 100%\n  );\n\n  .title {\n    padding-bottom: 6rpx;\n    font-size: 44rpx;\n    font-weight: 600;\n    color: $u-primary;\n  }\n\n  .sub_title {\n    font-size: 24rpx;\n    color: $u-tips-color;\n    margin-top: 6rpx;\n  }\n\n  .code_container {\n    .code_title {\n      font-size: 28rpx;\n      margin-bottom: 24rpx;\n    }\n\n    .code_des {\n      margin-top: 24rpx;\n      font-size: 24rpx;\n      color: $u-tips-color;\n\n      .blue_text {\n        color: $u-primary;\n\n        &:nth-child(2) {\n          margin-left: 12rpx;\n          cursor: pointer;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/profile/about/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <custom-nav-bar title=\"关于我们\" />\n    <view class=\"logo_area\">\n      <image src=\"@/static/images/about_logo.png\" mode=\"\"></image>\n      <view>{{ v }}</view>\n\n      <info-item\n        @click=\"show = true\"\n        class=\"check\"\n        title=\"上传调试日志\"\n        content=\"\"\n      />\n\n      <u-modal showCancelButton :show=\"show\" title=\"上传日志\" @confirm=\"uploadLog\" @cancel=\"show = false\" >\n        <view class=\"slot-content\">\n          <u--input\n            placeholder=\"日志数量\"\n            border=\"surround\"\n            v-model=\"line\"\n          ></u--input>\n        </view>\n      </u-modal>\n    </view>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport { version } from '@/common/config'\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport { PageEvents } from \"@/constant\";\nimport InfoItem from \"../selfInfo/InfoItem.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    InfoItem,\n  },\n  data() {\n    return {\n      show: false,\n      line: 10000,\n      version: \"\",\n      loading: false,\n    };\n  },\n  computed: {\n    v(){\n      return version\n    }\n  },\n  onLoad() {\n    this.getAppVersion();\n    uni.$on(PageEvents.CheckForUpdateResp, this.checkRespHandler);\n  },\n  onUnload() {\n    uni.$off(PageEvents.CheckForUpdateResp, this.checkRespHandler);\n  },\n  mounted() {\n    IMSDK.subscribe('uploadLogsProgress', this.uploadHandler);\n  },\n  beforeDestroy() {\n    IMSDK.unsubscribe('uploadLogsProgress', this.uploadHandler);\n  },\n  methods: {\n    uploadLog() {\n      this.show = false\n      IMSDK.asyncApi(\n        'uploadLogs',\n        IMSDK.uuid(),\n        {\n          line: this.line,\n          ex: \"\"\n        }\n      )\n      uni.showLoading({\n        title: '上传中',\n        mask: true,\n      });\n    },\n    uploadHandler({\n      data: { current, size },\n    }) {\n      console.log('uploadHandler',current,size)\n      if (current >= size) {\n        uni.hideLoading();\n        uni.showToast({\n          title: \"上传成功\",\n          icon: \"none\",\n        });\n        return;\n      }\n    },\n    getAppVersion() {\n      plus.runtime.getProperty(\n        plus.runtime.appid,\n        ({ version }) => (this.appVersion = version),\n      );\n    },\n    updateCheck() {\n      this.loading = true;\n      uni.$emit(PageEvents.CheckForUpdate, true);\n    },\n    checkRespHandler() {\n      this.loading = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\">\n.page_container {\n  background-color: #f8f8f8;\n\n  .logo_area {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    margin: 24rpx 24rpx 0 24rpx;\n    background: #fff;\n    border-radius: 6px;\n    padding: 48rpx 0 16rpx 0;\n    color: $uni-text-color;\n\n    image {\n      width: 72px;\n      height: 72px;\n      margin-bottom: 24rpx;\n    }\n  }\n\n  .check {\n    margin-top: 26rpx;\n    border-top: 1px #e8eaef solid;\n    padding: 20rpx;\n    padding-bottom: 0;\n    width: 90%;\n  }\n\n  .btn_row {\n    padding: 0 44rpx;\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/profile/accountSetting/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <custom-nav-bar title=\"账号设置\" />\n\n    <view class=\"info_wrap\">\n      <setting-item @click=\"toBlockList\" title=\"通讯录黑名单\" :border=\"false\" />\n    </view>\n\n  </view>\n</template>\n\n<script>\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport SettingItem from \"@/components/SettingItem/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    SettingItem,\n  },\n  data() {\n    return {\n     \n    };\n  },\n  methods: {\n    toBlockList() {\n      uni.navigateTo({\n        url: \"/pages/profile/blockList/index\",\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.page_container {\n  background-color: #f8f8f8;\n\n  .info_wrap {\n    background-color: #fff;\n    margin: 24rpx 24rpx 0 24rpx;\n    border-radius: 6px;\n\n    .qr_icon {\n      width: 22px;\n      height: 23px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/profile/blockList/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <custom-nav-bar title=\"通讯录黑名单\" />\n\n    <u-list v-if=\"blockList.length > 0\" class=\"block_list\" height=\"1\">\n      <u-list-item v-for=\"item in blockList\" :key=\"item.userID\">\n        <user-item :item=\"item\">\n          <view @click=\"tryRemove(item)\" class=\"user_action\" slot=\"action\">\n            移除\n          </view>\n        </user-item>\n      </u-list-item>\n    </u-list>\n\n    <view v-else class=\"empty\">\n      <image src=\"@/static/images/block_empty.png\"></image>\n      <text class=\"empty_text\">暂无黑名单</text>\n    </view>\n    <!-- <u-empty icon=\"/static/images/block_empty.png\" v-else text=\"暂无黑名单\" iconSize=\"20\" /> -->\n\n    <u-modal\n      width=\"500rpx\"\n      showCancelButton\n      :show=\"showComfirm\"\n      @confirm=\"confirm\"\n      @cancel=\"closeModal\"\n      content=\"确定将用户移除黑名单吗？\"\n      :asyncClose=\"true\"\n    ></u-modal>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport UserItem from \"@/components/UserItem/index.vue\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    UserItem,\n  },\n  data() {\n    return {\n      showComfirm: false,\n      selectedUser: {},\n    };\n  },\n  computed: {\n    blockList() {\n      return this.$store.getters.storeBlackList;\n    },\n  },\n  methods: {\n    tryRemove(item) {\n      this.selectedUser = {\n        ...item,\n      };\n      this.showComfirm = true;\n    },\n    confirm() {\n      IMSDK.asyncApi(\n        IMSDK.IMMethods.RemoveBlack,\n        IMSDK.uuid(),\n        this.selectedUser.userID,\n      )\n        .then(() => uni.$u.toast(\"移除成功\"))\n        .catch(() => uni.$u.toast(\"移除失败\"))\n        .finally(() => (this.showComfirm = false));\n    },\n    closeModal() {\n      this.showComfirm = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.page_container {\n  @include colBox(false);\n  height: 100vh;\n  background-color: #f8f8f8;\n\n  .block_list {\n    flex: 1;\n    margin-top: 24rpx;\n\n    .user_item {\n      background-color: #fff;\n    }\n\n    .user_action {\n      position: absolute;\n      right: 44rpx;\n      font-size: 28rpx;\n      color: $uni-color-primary;\n    }\n  }\n\n  .empty {\n    @include centerBox();\n    flex-direction: column;\n    margin-top: 25vh !important;\n\n    &_text {\n      margin-top: 26rpx;\n      color: #8e9ab0;\n    }\n\n    image {\n      width: 237rpx;\n      height: 244rpx;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/profile/index/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <view class=\"self_info_row\"></view>\n\n    <view class=\"info_card\">\n      <my-avatar :src=\"selfInfo.faceURL\" :desc=\"selfInfo.nickname\" size=\"46\" />\n\n      <view class=\"id_row\">\n        <text class=\"nickname\">{{ selfInfo.nickname }}</text>\n        <view class=\"id_row_copy\" @click=\"copy\">\n          <text class=\"id\">{{ selfInfo.userID }}</text>\n          <image\n            style=\"width: 32rpx; height: 32rpx\"\n            src=\"@/static/images/id_copy.png\"\n            mode=\"\"\n          />\n        </view>\n      </view>\n\n      <view class=\"qr\" @click=\"toSelfQr\">\n        <img src=\"static/images/self_info_qr.png\" alt=\"\" />\n        <img src=\"static/images/common_right.png\" alt=\"\" />\n      </view>\n    </view>\n\n    <view class=\"action_box\">\n      <view\n        @click=\"profileMenuClick(item)\"\n        class=\"profile_menu_item\"\n        v-for=\"item in profileMenus\"\n        :key=\"item.idx\"\n      >\n        <view class=\"menu_left\">\n          <image style=\"width: 48rpx; height: 48rpx\" :src=\"item.icon\" mode=\"\" />\n          <text>{{ item.title }}</text>\n        </view>\n        <u-icon name=\"arrow-right\" size=\"16\" color=\"#999\"></u-icon>\n      </view>\n    </view>\n\n    <u-toast ref=\"uToast\"></u-toast>\n  </view>\n</template>\n\n<script>\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nexport default {\n  components: {\n    MyAvatar,\n  },\n  data() {\n    return {\n      profileMenus: [\n        {\n          idx: 0,\n          title: \"我的信息\",\n          icon: require(\"static/images/profile_menu_info.png\"),\n        },\n        {\n          idx: 2,\n          title: \"账号设置\",\n          icon: require(\"static/images/profile_menu_account.png\"),\n        },\n        {\n          idx: 3,\n          title: \"关于我们\",\n          icon: require(\"static/images/profile_menu_about.png\"),\n        },\n        {\n          idx: 4,\n          title: \"退出登录\",\n          icon: require(\"static/images/profile_menu_logout.png\"),\n        },\n      ],\n    };\n  },\n  computed: {\n    selfInfo() {\n      return this.$store.getters.storeSelfInfo;\n    },\n  },\n  methods: {\n    copy() {\n      uni.setClipboardData({\n        showToast: false,\n        data: this.selfInfo.userID,\n        success: function () {\n          uni.showToast({\n            icon: \"none\",\n            title: \"复制成功\",\n          });\n        },\n      });\n    },\n    logoutConfirm() {\n      IMSDK.asyncApi(IMSDK.IMMethods.Logout, IMSDK.uuid())\n        .then(() => {\n          uni.removeStorage({\n            key: \"IMToken\",\n          });\n          uni.removeStorage({\n            key: \"BusinessToken\",\n          });\n        })\n        .catch((err) => console.log(err))\n        .finally(() => {\n          uni.$u.route(\"/pages/login/index\");\n        });\n    },\n    profileMenuClick({ idx }) {\n      switch (idx) {\n        case 0:\n          uni.navigateTo({\n            url: \"/pages/profile/selfInfo/index\",\n          });\n          break;\n        case 1:\n          uni.navigateTo({\n            url: \"/pages/profile/messageNotification/index\",\n          });\n          break;\n        case 2:\n          uni.navigateTo({\n            url: \"/pages/profile/accountSetting/index\",\n          });\n          break;\n        case 3:\n          uni.navigateTo({\n            url: \"/pages/profile/about/index\",\n          });\n          break;\n        case 4:\n          uni.showModal({\n            title: \"提示\",\n            content: \"确定要退出当前账号吗？\",\n            confirmText: \"确认\",\n            cancelText: \"取消\",\n            success: (res) => {\n              if (res.confirm) {\n                this.logoutConfirm();\n              }\n            },\n          });\n          break;\n        default:\n          break;\n      }\n    },\n    toSelfQr() {\n      uni.navigateTo({\n        url: `/pages/common/userOrGroupQrCode/index`,\n      });\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.page_container {\n  background-color: #f8f9fa;\n\n  .self_info_row {\n    display: flex;\n    flex-direction: column;\n    justify-content: flex-end;\n    align-items: center;\n    width: 100%;\n    height: 276rpx;\n    background-image: url(\"@/static/images/profile_top_bg.png\");\n    background-repeat: round;\n  }\n\n  .info_card {\n    width: 640rpx;\n    height: 196rpx;\n    border-radius: 6px;\n    background: #fff;\n    margin: -120rpx auto 0 auto;\n    padding: 0 36rpx;\n    color: #0c1c33;\n    display: flex;\n    align-items: center;\n\n    .id_row {\n      @include vCenterBox();\n      display: flex;\n      height: 46px;\n      margin-left: 16rpx;\n      flex-direction: column;\n      align-items: flex-start;\n      justify-content: space-between;\n      flex: 1;\n      font-size: 28rpx;\n\n      &_copy {\n        @include vCenterBox();\n      }\n\n      .nickname {\n        @include nomalEllipsis();\n        max-width: 400rpx;\n        font-weight: 500;\n        font-size: 34rpx;\n      }\n\n      .id {\n        color: #8e9ab0;\n      }\n    }\n\n    img {\n      width: 18px;\n      height: 18px;\n    }\n  }\n\n  .action_box {\n    margin: 24rpx 24rpx 0 24rpx;\n    background: #fff;\n    border-radius: 6px;\n  }\n\n  .profile_menu_item {\n    @include btwBox();\n    padding: 24rpx 36rpx;\n\n    .menu_left {\n      @include vCenterBox();\n      color: $uni-text-color;\n\n      image {\n        margin-right: 24rpx;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/profile/selfInfo/InfoItem.vue",
    "content": "<template>\n  <view @click=\"clickItem\" class=\"info_item\">\n    <view class=\"left_label\">\n      <text>{{ title }}</text>\n    </view>\n    <view class=\"right_value\">\n      <slot name=\"value\">\n        <text class=\"content\">{{ content }}</text>\n      </slot>\n      <u-icon\n        v-if=\"showArrow\"\n        name=\"arrow-right\"\n        size=\"16\"\n        color=\"#999\"\n      ></u-icon>\n    </view>\n    <u-loading-icon v-show=\"loading\" class=\"loading_icon\"></u-loading-icon>\n  </view>\n</template>\n\n<script>\nexport default {\n  name: \"\",\n  props: {\n    title: String,\n    content: String,\n    showArrow: {\n      type: Boolean,\n      default: true,\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  data() {\n    return {};\n  },\n  methods: {\n    clickItem() {\n      this.$emit(\"click\");\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.info_item {\n  @include btwBox();\n  height: 82rpx;\n  padding: 0 44rpx;\n  color: $uni-text-color;\n  // border-bottom: 1px solid rgba(153,153,153,0.3);\n  position: relative;\n\n  .right_value {\n    @include vCenterBox();\n    .content {\n      font-size: 28rpx;\n      color: #999;\n    }\n    .u-icon {\n      margin-left: 12rpx;\n    }\n  }\n\n  .loading_icon {\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    transform: translate(-50%, -50%);\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/profile/selfInfo/index.vue",
    "content": "<template>\n  <view class=\"page_container\">\n    <custom-nav-bar title=\"个人资料\" />\n\n    <view class=\"info_wrap\">\n      <info-item\n        :loading=\"loadingState.faceURL\"\n        @click=\"updateAvatar\"\n        title=\"头像\"\n      >\n        <my-avatar\n          :src=\"selfInfo.faceURL\"\n          :desc=\"selfInfo.nickname\"\n          size=\"30\"\n          slot=\"value\"\n        />\n      </info-item>\n      <info-item\n        @click=\"updateNickname\"\n        title=\"姓名\"\n        :content=\"selfInfo.nickname\"\n      />\n      <info-item\n        :loading=\"loadingState.gender\"\n        @click=\"updateGender\"\n        title=\"性别\"\n        :content=\"getGender\"\n      />\n      <info-item\n        :loading=\"loadingState.birth\"\n        @click=\"() => (showDatePicker = true)\"\n        title=\"生日\"\n        :content=\"getBirth\"\n      />\n    </view>\n\n    <view class=\"info_wrap\">\n      <info-item\n        :showArrow=\"false\"\n        title=\"手机号码\"\n        :content=\"selfInfo.phoneNumber || '-'\"\n      />\n      <info-item\n        :showArrow=\"false\"\n        title=\"邮箱\"\n        :content=\"selfInfo.email || '-'\"\n      />\n    </view>\n\n    <u-datetime-picker\n      :minDate=\"0\"\n      :maxDate=\"nowDate\"\n      :show=\"showDatePicker\"\n      @confirm=\"confirmDate\"\n      @cancel=\"() => (showDatePicker = false)\"\n      v-model=\"selfInfo.birth\"\n      mode=\"date\"\n    />\n  </view>\n</template>\n\n<script>\nimport { businessInfoUpdate } from \"@/api/login\";\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport CustomNavBar from \"@/components/CustomNavBar/index.vue\";\nimport MyAvatar from \"@/components/MyAvatar/index.vue\";\nimport dayjs from \"dayjs\";\nimport InfoItem from \"./InfoItem.vue\";\nimport { getPurePath } from \"@/util/common\";\nexport default {\n  components: {\n    CustomNavBar,\n    MyAvatar,\n    InfoItem,\n  },\n  data() {\n    return {\n      showDatePicker: false,\n      loadingState: {\n        faceURL: false,\n        gender: false,\n        birth: false,\n      },\n      nowDate: Date.now(),\n    };\n  },\n  computed: {\n    selfInfo() {\n      return this.$store.getters.storeSelfInfo;\n    },\n    getGender() {\n      if (this.selfInfo.gender === 0) {\n        return \"保密\";\n      }\n      if (this.selfInfo.gender === 1) {\n        return \"男\";\n      }\n      return \"女\";\n    },\n    getBirth() {\n      const birth = this.selfInfo.birth ?? 0;\n      return dayjs(birth).format(\"YYYY-MM-DD\");\n    },\n  },\n  methods: {\n    updateNickname() {\n      uni.navigateTo({\n        url: `/pages/common/markOrIDPage/index?isSelfNickname=true&sourceInfo=${JSON.stringify(\n          this.selfInfo,\n        )}`,\n      });\n    },\n    updateGender() {\n      uni.showActionSheet({\n        itemList: [\"男\", \"女\"],\n        success: async ({ tapIndex }) => {\n          this.loadingState.gender = true;\n          await this.updateSelfInfo(\n            {\n              gender: tapIndex + 1,\n            },\n            \"gender\",\n          );\n        },\n      });\n    },\n    updateAvatar() {\n      uni.chooseImage({\n        count: 1,\n        sizeType: [\"compressed\"],\n        success: async ({ tempFilePaths }) => {\n          const path = tempFilePaths[0];\n          const nameIdx = path.lastIndexOf(\"/\") + 1;\n          const typeIdx = path.lastIndexOf(\".\") + 1;\n          const fileName = path.slice(nameIdx);\n          const fileType = path.slice(typeIdx);\n          this.loadingState.faceURL = true;\n          const {\n            data: { url },\n          } = await IMSDK.asyncApi(IMSDK.IMMethods.UploadFile, IMSDK.uuid(), {\n            filepath: getPurePath(tempFilePaths[0]),\n            name: fileName,\n            contentType: fileType,\n            uuid: IMSDK.uuid(),\n          });\n          console.log(url);\n          this.updateSelfInfo(\n            {\n              faceURL: url,\n            },\n            \"faceURL\",\n          );\n          this.loadingState.faceURL = false;\n        },\n      });\n    },\n    toQrCode() {\n      uni.navigateTo({\n        url: `/pages/common/userOrGroupQrCode/index`,\n      });\n    },\n    copyID() {\n      uni.setClipboardData({\n        data: this.selfInfo.userID,\n        success: () => {\n          uni.hideToast();\n          this.$nextTick(() => {\n            uni.$u.toast(\"复制成功\");\n          });\n        },\n      });\n    },\n    async updateSelfInfo(data, key) {\n      try {\n        await businessInfoUpdate({\n          userID: this.selfInfo.userID,\n          ...data,\n        });\n        await this.$store.dispatch(\"user/updateBusinessInfo\");\n        uni.$u.toast(\"修改成功\");\n      } catch (e) {\n        console.log(e);\n        uni.$u.toast(\"修改失败\");\n      }\n      this.loadingState[key] = false;\n    },\n    confirmDate({ value }) {\n      this.loadingState.birth = true;\n      this.updateSelfInfo(\n        {\n          birth: value,\n        },\n        \"birth\",\n      );\n      this.showDatePicker = false;\n    },\n  },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.page_container {\n  background-color: #f8f8f8;\n\n  .info_wrap {\n    margin: 24rpx 24rpx 0 24rpx;\n    background: #fff;\n    border-radius: 6px;\n\n    .qr_icon {\n      width: 22px;\n      height: 23px;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "pages/workbench/index/index.vue",
    "content": "<template>\n  <web-view :src=\"linkUrl\"></web-view>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      linkUrl: \"\",\n    };\n  },\n  onShow() {\n    this.linkUrl = 'https://doc.rentsoft.cn/'\n  },\n  onReady() {\n    // #ifdef APP-PLUS\n    setTimeout(() => {\n      this.$scope\n        .$getAppWebview()\n        .children()[0]\n        .setStyle({\n          top: uni.getWindowInfo().statusBarHeight,\n          height: uni.getWindowInfo().safeArea.height,\n        });\n    });\n    // #endif\n  },\n};\n</script>\n\n<style lang=\"scss\"></style>\n"
  },
  {
    "path": "pages.json",
    "content": "{\n  \"pages\": [\n    //pages数组中第一项表示应用启动页，参考：https://uniapp.dcloud.io/collocation/pages\n    {\n      \"path\": \"pages/login/index\"\n    },\n    {\n      \"path\": \"pages/login/registerOrForget/index\"\n    },\n    {\n      \"path\": \"pages/login/setSelfInfo/index\"\n    },\n    {\n      \"path\": \"pages/login/setPassword/index\"\n    },\n    {\n      \"path\": \"pages/login/verifyCode/index\"\n    },\n    {\n      \"path\": \"pages/profile/index/index\"\n    },\n    {\n      \"path\": \"pages/conversation/conversationList/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false,\n        \"disableScroll\": true,\n        \"app-plus\": {\n          \"bounce\": \"none\"\n        }\n      }\n    },\n    {\n      \"path\": \"pages/contact/index/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"disableScroll\": true,\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/conversation/chating/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false,\n        \"disableScroll\": true,\n        \"app-plus\": {\n          \"softinputMode\": \"adjustResize\"\n        }\n      }\n    },\n    {\n      \"path\": \"pages/conversation/singleSettings/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/conversation/groupSettings/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/conversation/groupManage/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/conversation/groupMemberList/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/userCard/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/searchUserOrGroup/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/groupCard/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/userCardMore/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/markOrIDPage/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/detailsFileds/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/contactChoose/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false,\n        \"disableScroll\": true\n      }\n    },\n    {\n      \"path\": \"pages/common/createGroup/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/contactAdd/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/switchJoinGroup/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/friendList/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/groupList/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/searchUserOrGroup/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/applicationList/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/applicationListDetails/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/contact/applicationDetails/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/profile/selfInfo/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/profile/accountSetting/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/profile/blockList/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/conversation/updateGroupOrNickname/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/sendAddRequest/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/common/webviewWrapper/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/profile/about/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    },\n    {\n      \"path\": \"pages/workbench/index/index\",\n      \"style\": {\n        \"navigationBarTitleText\": \"\",\n        \"enablePullDownRefresh\": false\n      }\n    }\n  ],\n  \"tabBar\": {\n    \"color\": \"#8E9AB0\",\n    \"selectedColor\": \"#0089FF\",\n    \"borderStyle\": \"black\",\n    \"backgroundColor\": \"#ffffff\",\n    \"height\": \"55px\",\n    \"list\": [\n      {\n        \"pagePath\": \"pages/conversation/conversationList/index\",\n        \"iconPath\": \"./static/images/tabbar_conversation.png\",\n        \"selectedIconPath\": \"static/images/tabbar_conversation_active.png\",\n        \"text\": \"OpenIM\"\n      },\n      {\n        \"pagePath\": \"pages/contact/index/index\",\n        \"iconPath\": \"./static/images/tabbar_contacts.png\",\n        \"selectedIconPath\": \"static/images/tabbar_contacts_active.png\",\n        \"text\": \"通讯录\"\n      },\n      {\n        \"pagePath\": \"pages/workbench/index/index\",\n        \"iconPath\": \"./static/images/tabbar_workbench.png\",\n        \"selectedIconPath\": \"static/images/tabbar_workbench_active.png\",\n        \"text\": \"发现\"\n      },\n      {\n        \"pagePath\": \"pages/profile/index/index\",\n        \"iconPath\": \"./static/images/tabbar_profile.png\",\n        \"selectedIconPath\": \"static/images/tabbar_profile_active.png\",\n        \"text\": \"我的\"\n      }\n    ]\n  },\n  \"globalStyle\": {\n    \"navigationStyle\": \"custom\",\n    \"navigationBarTextStyle\": \"black\",\n    \"app-plus\": {\n      \"bounce\": \"none\"\n    }\n  }\n}\n"
  },
  {
    "path": "static/wasm_exec.js",
    "content": "// Copyright 2018 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n// @ts-nocheck\n\n(() => {\n  // Map multiple JavaScript environments to a single common API,\n  // preferring web standards over Node.js API.\n  //\n  // Environments considered:\n  // - Browsers\n  // - Node.js\n  // - Electron\n  // - Parcel\n  // - Webpack\n\n  if (typeof global !== \"undefined\") {\n    // global already exists\n  } else if (typeof window !== \"undefined\") {\n    window.global = window;\n  } else if (typeof self !== \"undefined\") {\n    self.global = self;\n  } else {\n    throw new Error(\n      \"cannot export Go (neither global, window nor self is defined)\",\n    );\n  }\n\n  if (!global.require && typeof require !== \"undefined\") {\n    global.require = require;\n  }\n\n  if (!global.fs && global.require) {\n    const fs = require(\"fs\");\n    if (typeof fs === \"object\" && fs !== null && Object.keys(fs).length !== 0) {\n      global.fs = fs;\n    }\n  }\n\n  const enosys = () => {\n    const err = new Error(\"not implemented\");\n    err.code = \"ENOSYS\";\n    return err;\n  };\n\n  if (!global.fs) {\n    let outputBuf = \"\";\n    global.fs = {\n      constants: {\n        O_WRONLY: -1,\n        O_RDWR: -1,\n        O_CREAT: -1,\n        O_TRUNC: -1,\n        O_APPEND: -1,\n        O_EXCL: -1,\n      }, // unused\n      writeSync(fd, buf) {\n        outputBuf += decoder.decode(buf);\n        const nl = outputBuf.lastIndexOf(\"\\n\");\n        if (nl != -1) {\n          console.log(outputBuf.substr(0, nl));\n          outputBuf = outputBuf.substr(nl + 1);\n        }\n        return buf.length;\n      },\n      write(fd, buf, offset, length, position, callback) {\n        if (offset !== 0 || length !== buf.length || position !== null) {\n          callback(enosys());\n          return;\n        }\n        const n = this.writeSync(fd, buf);\n        callback(null, n);\n      },\n      chmod(path, mode, callback) {\n        callback(enosys());\n      },\n      chown(path, uid, gid, callback) {\n        callback(enosys());\n      },\n      close(fd, callback) {\n        callback(enosys());\n      },\n      fchmod(fd, mode, callback) {\n        callback(enosys());\n      },\n      fchown(fd, uid, gid, callback) {\n        callback(enosys());\n      },\n      fstat(fd, callback) {\n        callback(enosys());\n      },\n      fsync(fd, callback) {\n        callback(null);\n      },\n      ftruncate(fd, length, callback) {\n        callback(enosys());\n      },\n      lchown(path, uid, gid, callback) {\n        callback(enosys());\n      },\n      link(path, link, callback) {\n        callback(enosys());\n      },\n      lstat(path, callback) {\n        callback(enosys());\n      },\n      mkdir(path, perm, callback) {\n        callback(enosys());\n      },\n      open(path, flags, mode, callback) {\n        callback(enosys());\n      },\n      read(fd, buffer, offset, length, position, callback) {\n        callback(enosys());\n      },\n      readdir(path, callback) {\n        callback(enosys());\n      },\n      readlink(path, callback) {\n        callback(enosys());\n      },\n      rename(from, to, callback) {\n        callback(enosys());\n      },\n      rmdir(path, callback) {\n        callback(enosys());\n      },\n      stat(path, callback) {\n        callback(enosys());\n      },\n      symlink(path, link, callback) {\n        callback(enosys());\n      },\n      truncate(path, length, callback) {\n        callback(enosys());\n      },\n      unlink(path, callback) {\n        callback(enosys());\n      },\n      utimes(path, atime, mtime, callback) {\n        callback(enosys());\n      },\n    };\n  }\n\n  if (!global.process) {\n    global.process = {\n      getuid() {\n        return -1;\n      },\n      getgid() {\n        return -1;\n      },\n      geteuid() {\n        return -1;\n      },\n      getegid() {\n        return -1;\n      },\n      getgroups() {\n        throw enosys();\n      },\n      pid: -1,\n      ppid: -1,\n      umask() {\n        throw enosys();\n      },\n      cwd() {\n        throw enosys();\n      },\n      chdir() {\n        throw enosys();\n      },\n    };\n  }\n\n  if (!global.crypto && global.require) {\n    const nodeCrypto = require(\"crypto\");\n    global.crypto = {\n      getRandomValues(b) {\n        nodeCrypto.randomFillSync(b);\n      },\n    };\n  }\n  if (!global.crypto) {\n    throw new Error(\n      \"global.crypto is not available, polyfill required (getRandomValues only)\",\n    );\n  }\n\n  if (!global.performance) {\n    global.performance = {\n      now() {\n        const [sec, nsec] = process.hrtime();\n        return sec * 1000 + nsec / 1000000;\n      },\n    };\n  }\n\n  if (!global.TextEncoder && global.require) {\n    global.TextEncoder = require(\"util\").TextEncoder;\n  }\n  if (!global.TextEncoder) {\n    throw new Error(\"global.TextEncoder is not available, polyfill required\");\n  }\n\n  if (!global.TextDecoder && global.require) {\n    global.TextDecoder = require(\"util\").TextDecoder;\n  }\n  if (!global.TextDecoder) {\n    throw new Error(\"global.TextDecoder is not available, polyfill required\");\n  }\n\n  // End of polyfills for common API.\n\n  const encoder = new TextEncoder(\"utf-8\");\n  const decoder = new TextDecoder(\"utf-8\");\n\n  global.Go = class {\n    constructor() {\n      this.argv = [\"js\"];\n      this.env = {};\n      this.exit = (code) => {\n        if (code !== 0) {\n          console.warn(\"exit code:\", code);\n        }\n      };\n      this._exitPromise = new Promise((resolve) => {\n        this._resolveExitPromise = resolve;\n      });\n      this._pendingEvent = null;\n      this._scheduledTimeouts = new Map();\n      this._nextCallbackTimeoutID = 1;\n\n      const setInt64 = (addr, v) => {\n        this.mem.setUint32(addr + 0, v, true);\n        this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true);\n      };\n\n      const getInt64 = (addr) => {\n        const low = this.mem.getUint32(addr + 0, true);\n        const high = this.mem.getInt32(addr + 4, true);\n        return low + high * 4294967296;\n      };\n\n      const loadValue = (addr) => {\n        const f = this.mem.getFloat64(addr, true);\n        if (f === 0) {\n          return undefined;\n        }\n        if (!isNaN(f)) {\n          return f;\n        }\n\n        const id = this.mem.getUint32(addr, true);\n        return this._values[id];\n      };\n\n      const storeValue = (addr, v) => {\n        const nanHead = 0x7ff80000;\n\n        if (typeof v === \"number\" && v !== 0) {\n          if (isNaN(v)) {\n            this.mem.setUint32(addr + 4, nanHead, true);\n            this.mem.setUint32(addr, 0, true);\n            return;\n          }\n          this.mem.setFloat64(addr, v, true);\n          return;\n        }\n\n        if (v === undefined) {\n          this.mem.setFloat64(addr, 0, true);\n          return;\n        }\n\n        let id = this._ids.get(v);\n        if (id === undefined) {\n          id = this._idPool.pop();\n          if (id === undefined) {\n            id = this._values.length;\n          }\n          this._values[id] = v;\n          this._goRefCounts[id] = 0;\n          this._ids.set(v, id);\n        }\n        this._goRefCounts[id]++;\n        let typeFlag = 0;\n        switch (typeof v) {\n          case \"object\":\n            if (v !== null) {\n              typeFlag = 1;\n            }\n            break;\n          case \"string\":\n            typeFlag = 2;\n            break;\n          case \"symbol\":\n            typeFlag = 3;\n            break;\n          case \"function\":\n            typeFlag = 4;\n            break;\n        }\n        this.mem.setUint32(addr + 4, nanHead | typeFlag, true);\n        this.mem.setUint32(addr, id, true);\n      };\n\n      const loadSlice = (addr) => {\n        const array = getInt64(addr + 0);\n        const len = getInt64(addr + 8);\n        return new Uint8Array(this._inst.exports.mem.buffer, array, len);\n      };\n\n      const loadSliceOfValues = (addr) => {\n        const array = getInt64(addr + 0);\n        const len = getInt64(addr + 8);\n        const a = new Array(len);\n        for (let i = 0; i < len; i++) {\n          a[i] = loadValue(array + i * 8);\n        }\n        return a;\n      };\n\n      const loadString = (addr) => {\n        const saddr = getInt64(addr + 0);\n        const len = getInt64(addr + 8);\n        return decoder.decode(\n          new DataView(this._inst.exports.mem.buffer, saddr, len),\n        );\n      };\n\n      const timeOrigin = Date.now() - performance.now();\n      this.importObject = {\n        go: {\n          // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters)\n          // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported\n          // function. A goroutine can switch to a new stack if the current stack is too small (see morestack function).\n          // This changes the SP, thus we have to update the SP used by the imported function.\n\n          // func wasmExit(code int32)\n          \"runtime.wasmExit\": (sp) => {\n            sp >>>= 0;\n            const code = this.mem.getInt32(sp + 8, true);\n            this.exited = true;\n            delete this._inst;\n            delete this._values;\n            delete this._goRefCounts;\n            delete this._ids;\n            delete this._idPool;\n            this.exit(code);\n          },\n\n          // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)\n          \"runtime.wasmWrite\": (sp) => {\n            sp >>>= 0;\n            const fd = getInt64(sp + 8);\n            const p = getInt64(sp + 16);\n            const n = this.mem.getInt32(sp + 24, true);\n            fs.writeSync(\n              fd,\n              new Uint8Array(this._inst.exports.mem.buffer, p, n),\n            );\n          },\n\n          // func resetMemoryDataView()\n          \"runtime.resetMemoryDataView\": (sp) => {\n            sp >>>= 0;\n            this.mem = new DataView(this._inst.exports.mem.buffer);\n          },\n\n          // func nanotime1() int64\n          \"runtime.nanotime1\": (sp) => {\n            sp >>>= 0;\n            setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000);\n          },\n\n          // func walltime() (sec int64, nsec int32)\n          \"runtime.walltime\": (sp) => {\n            sp >>>= 0;\n            const msec = new Date().getTime();\n            setInt64(sp + 8, msec / 1000);\n            this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true);\n          },\n\n          // func scheduleTimeoutEvent(delay int64) int32\n          \"runtime.scheduleTimeoutEvent\": (sp) => {\n            sp >>>= 0;\n            const id = this._nextCallbackTimeoutID;\n            this._nextCallbackTimeoutID++;\n            this._scheduledTimeouts.set(\n              id,\n              setTimeout(\n                () => {\n                  this._resume();\n                  while (this._scheduledTimeouts.has(id)) {\n                    // for some reason Go failed to register the timeout event, log and try again\n                    // (temporary workaround for https://github.com/golang/go/issues/28975)\n                    console.warn(\"scheduleTimeoutEvent: missed timeout event\");\n                    this._resume();\n                  }\n                },\n                getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early\n              ),\n            );\n            this.mem.setInt32(sp + 16, id, true);\n          },\n\n          // func clearTimeoutEvent(id int32)\n          \"runtime.clearTimeoutEvent\": (sp) => {\n            sp >>>= 0;\n            const id = this.mem.getInt32(sp + 8, true);\n            clearTimeout(this._scheduledTimeouts.get(id));\n            this._scheduledTimeouts.delete(id);\n          },\n\n          // func getRandomData(r []byte)\n          \"runtime.getRandomData\": (sp) => {\n            sp >>>= 0;\n            crypto.getRandomValues(loadSlice(sp + 8));\n          },\n\n          // func finalizeRef(v ref)\n          \"syscall/js.finalizeRef\": (sp) => {\n            sp >>>= 0;\n            const id = this.mem.getUint32(sp + 8, true);\n            this._goRefCounts[id]--;\n            if (this._goRefCounts[id] === 0) {\n              const v = this._values[id];\n              this._values[id] = null;\n              this._ids.delete(v);\n              this._idPool.push(id);\n            }\n          },\n\n          // func stringVal(value string) ref\n          \"syscall/js.stringVal\": (sp) => {\n            sp >>>= 0;\n            storeValue(sp + 24, loadString(sp + 8));\n          },\n\n          // func valueGet(v ref, p string) ref\n          \"syscall/js.valueGet\": (sp) => {\n            sp >>>= 0;\n            const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16));\n            sp = this._inst.exports.getsp() >>> 0; // see comment above\n            storeValue(sp + 32, result);\n          },\n\n          // func valueSet(v ref, p string, x ref)\n          \"syscall/js.valueSet\": (sp) => {\n            sp >>>= 0;\n            Reflect.set(\n              loadValue(sp + 8),\n              loadString(sp + 16),\n              loadValue(sp + 32),\n            );\n          },\n\n          // func valueDelete(v ref, p string)\n          \"syscall/js.valueDelete\": (sp) => {\n            sp >>>= 0;\n            Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16));\n          },\n\n          // func valueIndex(v ref, i int) ref\n          \"syscall/js.valueIndex\": (sp) => {\n            sp >>>= 0;\n            storeValue(\n              sp + 24,\n              Reflect.get(loadValue(sp + 8), getInt64(sp + 16)),\n            );\n          },\n\n          // valueSetIndex(v ref, i int, x ref)\n          \"syscall/js.valueSetIndex\": (sp) => {\n            sp >>>= 0;\n            Reflect.set(\n              loadValue(sp + 8),\n              getInt64(sp + 16),\n              loadValue(sp + 24),\n            );\n          },\n\n          // func valueCall(v ref, m string, args []ref) (ref, bool)\n          \"syscall/js.valueCall\": (sp) => {\n            sp >>>= 0;\n            try {\n              const v = loadValue(sp + 8);\n              const m = Reflect.get(v, loadString(sp + 16));\n              const args = loadSliceOfValues(sp + 32);\n              const result = Reflect.apply(m, v, args);\n              sp = this._inst.exports.getsp() >>> 0; // see comment above\n              storeValue(sp + 56, result);\n              this.mem.setUint8(sp + 64, 1);\n            } catch (err) {\n              sp = this._inst.exports.getsp() >>> 0; // see comment above\n              storeValue(sp + 56, err);\n              this.mem.setUint8(sp + 64, 0);\n            }\n          },\n\n          // func valueInvoke(v ref, args []ref) (ref, bool)\n          \"syscall/js.valueInvoke\": (sp) => {\n            sp >>>= 0;\n            try {\n              const v = loadValue(sp + 8);\n              const args = loadSliceOfValues(sp + 16);\n              const result = Reflect.apply(v, undefined, args);\n              sp = this._inst.exports.getsp() >>> 0; // see comment above\n              storeValue(sp + 40, result);\n              this.mem.setUint8(sp + 48, 1);\n            } catch (err) {\n              sp = this._inst.exports.getsp() >>> 0; // see comment above\n              storeValue(sp + 40, err);\n              this.mem.setUint8(sp + 48, 0);\n            }\n          },\n\n          // func valueNew(v ref, args []ref) (ref, bool)\n          \"syscall/js.valueNew\": (sp) => {\n            sp >>>= 0;\n            try {\n              const v = loadValue(sp + 8);\n              const args = loadSliceOfValues(sp + 16);\n              const result = Reflect.construct(v, args);\n              sp = this._inst.exports.getsp() >>> 0; // see comment above\n              storeValue(sp + 40, result);\n              this.mem.setUint8(sp + 48, 1);\n            } catch (err) {\n              sp = this._inst.exports.getsp() >>> 0; // see comment above\n              storeValue(sp + 40, err);\n              this.mem.setUint8(sp + 48, 0);\n            }\n          },\n\n          // func valueLength(v ref) int\n          \"syscall/js.valueLength\": (sp) => {\n            sp >>>= 0;\n            setInt64(sp + 16, parseInt(loadValue(sp + 8).length));\n          },\n\n          // valuePrepareString(v ref) (ref, int)\n          \"syscall/js.valuePrepareString\": (sp) => {\n            sp >>>= 0;\n            const str = encoder.encode(String(loadValue(sp + 8)));\n            storeValue(sp + 16, str);\n            setInt64(sp + 24, str.length);\n          },\n\n          // valueLoadString(v ref, b []byte)\n          \"syscall/js.valueLoadString\": (sp) => {\n            sp >>>= 0;\n            const str = loadValue(sp + 8);\n            loadSlice(sp + 16).set(str);\n          },\n\n          // func valueInstanceOf(v ref, t ref) bool\n          \"syscall/js.valueInstanceOf\": (sp) => {\n            sp >>>= 0;\n            this.mem.setUint8(\n              sp + 24,\n              loadValue(sp + 8) instanceof loadValue(sp + 16) ? 1 : 0,\n            );\n          },\n\n          // func copyBytesToGo(dst []byte, src ref) (int, bool)\n          \"syscall/js.copyBytesToGo\": (sp) => {\n            sp >>>= 0;\n            const dst = loadSlice(sp + 8);\n            const src = loadValue(sp + 32);\n            if (\n              !(src instanceof Uint8Array || src instanceof Uint8ClampedArray)\n            ) {\n              this.mem.setUint8(sp + 48, 0);\n              return;\n            }\n            const toCopy = src.subarray(0, dst.length);\n            dst.set(toCopy);\n            setInt64(sp + 40, toCopy.length);\n            this.mem.setUint8(sp + 48, 1);\n          },\n\n          // func copyBytesToJS(dst ref, src []byte) (int, bool)\n          \"syscall/js.copyBytesToJS\": (sp) => {\n            sp >>>= 0;\n            const dst = loadValue(sp + 8);\n            const src = loadSlice(sp + 16);\n            if (\n              !(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)\n            ) {\n              this.mem.setUint8(sp + 48, 0);\n              return;\n            }\n            const toCopy = src.subarray(0, dst.length);\n            dst.set(toCopy);\n            setInt64(sp + 40, toCopy.length);\n            this.mem.setUint8(sp + 48, 1);\n          },\n\n          debug: (value) => {\n            console.log(value);\n          },\n        },\n      };\n    }\n\n    async run(instance) {\n      if (!(instance instanceof WebAssembly.Instance)) {\n        throw new Error(\"Go.run: WebAssembly.Instance expected\");\n      }\n      this._inst = instance;\n      this.mem = new DataView(this._inst.exports.mem.buffer);\n      this._values = [\n        // JS values that Go currently has references to, indexed by reference id\n        NaN,\n        0,\n        null,\n        true,\n        false,\n        global,\n        this,\n      ];\n      this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id\n      this._ids = new Map([\n        // mapping from JS values to reference ids\n        [0, 1],\n        [null, 2],\n        [true, 3],\n        [false, 4],\n        [global, 5],\n        [this, 6],\n      ]);\n      this._idPool = []; // unused ids that have been garbage collected\n      this.exited = false; // whether the Go program has exited\n\n      // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory.\n      let offset = 4096;\n\n      const strPtr = (str) => {\n        const ptr = offset;\n        const bytes = encoder.encode(str + \"\\0\");\n        new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes);\n        offset += bytes.length;\n        if (offset % 8 !== 0) {\n          offset += 8 - (offset % 8);\n        }\n        return ptr;\n      };\n\n      const argc = this.argv.length;\n\n      const argvPtrs = [];\n      this.argv.forEach((arg) => {\n        argvPtrs.push(strPtr(arg));\n      });\n      argvPtrs.push(0);\n\n      const keys = Object.keys(this.env).sort();\n      keys.forEach((key) => {\n        argvPtrs.push(strPtr(`${key}=${this.env[key]}`));\n      });\n      argvPtrs.push(0);\n\n      const argv = offset;\n      argvPtrs.forEach((ptr) => {\n        this.mem.setUint32(offset, ptr, true);\n        this.mem.setUint32(offset + 4, 0, true);\n        offset += 8;\n      });\n\n      // The linker guarantees global data starts from at least wasmMinDataAddr.\n      // Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr.\n      const wasmMinDataAddr = 4096 + 8192;\n      if (offset >= wasmMinDataAddr) {\n        throw new Error(\n          \"total length of command line and environment variables exceeds limit\",\n        );\n      }\n\n      this._inst.exports.run(argc, argv);\n      if (this.exited) {\n        this._resolveExitPromise();\n      }\n      await this._exitPromise;\n    }\n\n    _resume() {\n      if (this.exited) {\n        throw new Error(\"Go program has already exited\");\n      }\n      this._inst.exports.resume();\n      if (this.exited) {\n        this._resolveExitPromise();\n      }\n    }\n\n    _makeFuncWrapper(id) {\n      const go = this;\n      return function () {\n        const event = { id: id, this: this, args: arguments };\n        go._pendingEvent = event;\n        go._resume();\n        return event.result;\n      };\n    }\n  };\n\n  if (\n    typeof module !== \"undefined\" &&\n    global.require &&\n    global.require.main === module &&\n    global.process &&\n    global.process.versions &&\n    !global.process.versions.electron\n  ) {\n    if (process.argv.length < 3) {\n      console.error(\"usage: go_js_wasm_exec [wasm binary] [arguments]\");\n      process.exit(1);\n    }\n\n    const go = new Go();\n    go.argv = process.argv.slice(2);\n    go.env = Object.assign({ TMPDIR: require(\"os\").tmpdir() }, process.env);\n    go.exit = process.exit;\n    WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject)\n      .then((result) => {\n        process.on(\"exit\", (code) => {\n          // Node.js exits if no event handler is pending\n          if (code === 0 && !go.exited) {\n            // deadlock, make Go print error and stack traces\n            go._pendingEvent = { id: 0 };\n            go._resume();\n          }\n        });\n        return go.run(result.instance);\n      })\n      .catch((err) => {\n        console.error(err);\n        process.exit(1);\n      });\n  }\n})();\n"
  },
  {
    "path": "store/getters.js",
    "content": "export default {\n  storeConversationList: (state) => state.conversation.conversationList,\n  storeCurrentConversation: (state) => state.conversation.currentConversation,\n  storeUnReadCount: (state) => state.conversation.unReadCount,\n  storeCurrentGroup: (state) => state.conversation.currentGroup,\n  storeCurrentMemberInGroup: (state) => state.conversation.currentMemberInGroup,\n  storeFriendList: (state) => state.contact.friendList,\n  storeBlackList: (state) => state.contact.blackList,\n  storeGroupList: (state) => state.contact.groupList,\n  storeRecvFriendApplications: (state) => state.contact.recvFriendApplications,\n  storeSentFriendApplications: (state) => state.contact.sentFriendApplications,\n  storeRecvGroupApplications: (state) => state.contact.recvGroupApplications,\n  storeSentGroupApplications: (state) => state.contact.sentGroupApplications,\n  storeHistoryMessageList: (state) => state.message.historyMessageList,\n  storeHasMoreMessage: (state) => state.message.hasMoreMessage,\n  storeSelfInfo: (state) => state.user.selfInfo,\n  storeCurrentUserID: (state) => state.user.selfInfo.userID,\n  storeIsSyncing: (state) => state.user.isSyncing,\n  storeReinstall: (state) => state.user.reinstall,\n  storeProgress: (state) => state.user.progress,\n  storeAuthData: (state) => state.user.authData,\n};\n"
  },
  {
    "path": "store/index.js",
    "content": "import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport user from \"./modules/user\";\nimport contact from \"./modules/contact\";\nimport conversation from \"./modules/conversation\";\nimport message from \"./modules/message\";\nimport getters from \"./getters\";\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n  modules: {\n    user,\n    contact,\n    conversation,\n    message,\n  },\n  getters,\n});\n\nexport default store;\n"
  },
  {
    "path": "store/modules/contact.js",
    "content": "import { v4 as uuidv4 } from \"uuid\";\nimport IMSDK from \"openim-uniapp-polyfill\";\n\nconst state = {\n  friendList: [],\n  blackList: [],\n  groupList: [],\n  recvFriendApplications: [],\n  sentFriendApplications: [],\n  recvGroupApplications: [],\n  sentGroupApplications: [],\n  unHandleFriendApplicationNum: 0,\n  unHandleGroupApplicationNum: 0,\n};\n\nconst mutations = {\n  SET_FRIEND_LIST(state, list) {\n    state.friendList = [...list];\n  },\n  SET_BLACK_LIST(state, list) {\n    state.blackList = [...list];\n  },\n  SET_GROUP_LIST(state, list) {\n    state.groupList = [...list];\n  },\n  SET_RECV_FRIEND_APPLICATIONS(state, list) {\n    state.recvFriendApplications = [...list];\n  },\n  SET_SENT_FRIEND_APPLICATIONS(state, list) {\n    state.sentFriendApplications = [...list];\n  },\n  SET_RECV_GROUP_APPLICATIONS(state, list) {\n    state.recvGroupApplications = [...list];\n  },\n  SET_SENT_GROUP_APPLICATIONS(state, list) {\n    state.sentGroupApplications = [...list];\n  },\n};\n\nconst actions = {\n  async getFriendList({ commit }) {\n    let offset = 0;\n    let friendInfoList = [];\n    let initialFetch = true;\n    while (true) {\n      try {\n        const count = initialFetch ? 10000 : 1000;\n        const { data } = await IMSDK.asyncApi(\"getFriendListPage\", uuidv4(), {\n          offset,\n          count,\n        });\n        friendInfoList = [\n          ...friendInfoList,\n          ...data,\n        ];\n        offset += count;\n        if (data.length < count) break;\n        initialFetch = false;\n      } catch (error) {\n        console.error(\"getFriendListPage error\");\n      }\n    }\n    commit(\"SET_FRIEND_LIST\", friendInfoList);\n  },\n  async getGrouplist({ commit }) {\n    let offset = 0;\n    let groupList = [];\n    while (true) {\n      try {\n        const { data } = await IMSDK.asyncApi(\n          \"getJoinedGroupListPage\",\n          uuidv4(),\n          {\n            offset,\n            count: 1000,\n          }\n        );\n        groupList = [...groupList, ...data];\n        offset += 1000;\n        if (data.length < 1000) break;\n      } catch (error) {\n        console.error(\"getGrouplist error\");\n      }\n    }\n    commit(\"SET_GROUP_LIST\", groupList);\n  },\n  getBlacklist({ commit }) {\n    IMSDK.asyncApi(IMSDK.IMMethods.GetBlackList, uuidv4()).then(({ data }) => {\n      commit(\"SET_BLACK_LIST\", data);\n    });\n  },\n  getRecvFriendApplications({ commit }) {\n    IMSDK.asyncApi(\n      IMSDK.IMMethods.GetFriendApplicationListAsRecipient,\n      uuidv4(),\n    ).then(({ data }) => {\n      commit(\"SET_RECV_FRIEND_APPLICATIONS\", data);\n    });\n  },\n  getSentFriendApplications({ commit }) {\n    IMSDK.asyncApi(\n      IMSDK.IMMethods.GetFriendApplicationListAsApplicant,\n      uuidv4(),\n    ).then(({ data }) => {\n      commit(\"SET_SENT_FRIEND_APPLICATIONS\", data);\n    });\n  },\n  getRecvGroupApplications({ commit }) {\n    IMSDK.asyncApi(\n      IMSDK.IMMethods.GetGroupApplicationListAsRecipient,\n      uuidv4(),\n    ).then(({ data }) => {\n      commit(\"SET_RECV_GROUP_APPLICATIONS\", data);\n    });\n  },\n  getSentGroupApplications({ commit }) {\n    IMSDK.asyncApi(\n      IMSDK.IMMethods.GetGroupApplicationListAsApplicant,\n      uuidv4(),\n    ).then(({ data }) => {\n      commit(\"SET_SENT_GROUP_APPLICATIONS\", data);\n    });\n  },\n  pushNewFriend({ commit, state }, friendInfo) {\n    const tmpList = [...state.friendList];\n    const idx = tmpList.findIndex((item) => item.userID === friendInfo.userID);\n    if (idx === -1) {\n      commit(\"SET_FRIEND_LIST\", [...tmpList, friendInfo]);\n    }\n  },\n  updateFriendInfo({ commit, state }, { friendInfo, isRemove = false }) {\n    const tmpList = [...state.friendList];\n    const idx = tmpList.findIndex((item) => item.userID === friendInfo.userID);\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...friendInfo,\n        };\n      }\n      commit(\"SET_FRIEND_LIST\", tmpList);\n    }\n  },\n  pushNewBlack({ commit, state }, blackInfo) {\n    const tmpList = [...state.blackList];\n    const idx = tmpList.findIndex((item) => item.userID === blackInfo.userID);\n    if (idx === -1) {\n      commit(\"SET_BLACK_LIST\", [...tmpList, blackInfo]);\n    }\n  },\n  updateBlackInfo({ commit, state }, { blackInfo, isRemove = false }) {\n    const tmpList = [...state.blackList];\n    const idx = tmpList.findIndex((item) => item.userID === blackInfo.userID);\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...blackInfo,\n        };\n      }\n      commit(\"SET_BLACK_LIST\", tmpList);\n    }\n  },\n  pushNewGroup({ commit, state }, groupInfo) {\n    const tmpList = [...state.groupList];\n    const idx = tmpList.findIndex((item) => item.groupID === groupInfo.groupID);\n    if (idx === -1) {\n      commit(\"SET_GROUP_LIST\", [...tmpList, groupInfo]);\n    }\n  },\n  updateGroupInfo(\n    { commit, state, rootState },\n    { groupInfo, isRemove = false },\n  ) {\n    const tmpList = [...state.groupList];\n    const idx = tmpList.findIndex((item) => item.groupID === groupInfo.groupID);\n\n    if (rootState.conversation.currentGroup.groupID === groupInfo.groupID) {\n      commit(\"conversation/SET_CURRENT_GROUP\", groupInfo, { root: true });\n    }\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...groupInfo,\n        };\n      }\n      commit(\"SET_GROUP_LIST\", tmpList);\n    }\n  },\n  pushNewRecvFriendApplition({ commit, state }, application) {\n    const tmpList = [...state.recvFriendApplications];\n    const idx = tmpList.findIndex(\n      (item) => item.fromUserID === application.fromUserID,\n    );\n    if (idx !== -1) {\n      tmpList.splice(idx, 1);\n    }\n    commit(\"SET_RECV_FRIEND_APPLICATIONS\", [...tmpList, application]);\n  },\n  updateRecvFriendApplition(\n    { commit, state, rootState },\n    { application, isRemove = false },\n  ) {\n    const tmpList = [...state.recvFriendApplications];\n    const idx = tmpList.findIndex(\n      (item) => item.fromUserID === application.fromUserID,\n    );\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...application,\n        };\n      }\n      commit(\"SET_RECV_FRIEND_APPLICATIONS\", tmpList);\n    }\n  },\n  pushNewSentFriendApplition({ commit, state }, application) {\n    const tmpList = [...state.sentFriendApplications];\n    const idx = tmpList.findIndex(\n      (item) => item.toUserID === application.toUserID,\n    );\n    if (idx !== -1) {\n      tmpList.splice(idx, 1);\n    }\n    commit(\"SET_SENT_FRIEND_APPLICATIONS\", [...tmpList, application]);\n  },\n  updateSentFriendApplition(\n    { commit, state, rootState },\n    { application, isRemove = false },\n  ) {\n    const tmpList = [...state.sentFriendApplications];\n    const idx = tmpList.findIndex(\n      (item) => item.toUserID === application.toUserID,\n    );\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...application,\n        };\n      }\n      commit(\"SET_SENT_FRIEND_APPLICATIONS\", tmpList);\n    }\n  },\n  pushNewRecvGroupApplition({ commit, state }, application) {\n    const tmpList = [...state.recvGroupApplications];\n    const idx = tmpList.findIndex((item) => item.userID === application.userID);\n    if (idx !== -1) {\n      tmpList.splice(idx, 1);\n    }\n    commit(\"SET_RECV_GROUP_APPLICATIONS\", [...tmpList, application]);\n  },\n  updateRecvGroupApplition(\n    { commit, state, rootState },\n    { application, isRemove = false },\n  ) {\n    const tmpList = [...state.recvGroupApplications];\n    const idx = tmpList.findIndex((item) => item.userID === application.userID);\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...application,\n        };\n      }\n      commit(\"SET_RECV_GROUP_APPLICATIONS\", tmpList);\n    }\n  },\n  pushNewSentGroupApplition({ commit, state }, application) {\n    const tmpList = [...state.sentGroupApplications];\n    const idx = tmpList.findIndex(\n      (item) => item.groupID === application.groupID,\n    );\n    if (idx !== -1) {\n      tmpList.splice(idx, 1);\n    }\n    commit(\"SET_SENT_GROUP_APPLICATIONS\", [...tmpList, application]);\n  },\n  updateSentGroupApplition(\n    { commit, state, rootState },\n    { application, isRemove = false },\n  ) {\n    const tmpList = [...state.sentGroupApplications];\n    const idx = tmpList.findIndex(\n      (item) => item.groupID === application.groupID,\n    );\n\n    if (idx !== -1) {\n      if (isRemove) {\n        tmpList.splice(idx, 1);\n      } else {\n        tmpList[idx] = {\n          ...application,\n        };\n      }\n      commit(\"SET_SENT_GROUP_APPLICATIONS\", tmpList);\n    }\n  },\n};\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions,\n};\n"
  },
  {
    "path": "store/modules/conversation.js",
    "content": "import { v4 as uuidv4 } from \"uuid\";\nimport IMSDK from \"openim-uniapp-polyfill\";\n\nconst state = {\n  conversationList: [],\n  currentConversation: {},\n  unReadCount: 0,\n  currentGroup: {},\n  currentMemberInGroup: {},\n};\n\nconst mutations = {\n  SET_CONVERSATION_LIST(state, list) {\n    state.conversationList = [...list];\n  },\n  SET_CURRENT_CONVERSATION(state, conversation) {\n    state.currentConversation = {\n      ...conversation,\n    };\n  },\n  SET_UNREAD_COUNT(state, count) {\n    if (count) {\n      uni.setTabBarBadge({\n        index: 0,\n        text: count < 99 ? count + \"\" : \"99+\",\n      });\n    } else {\n      uni.removeTabBarBadge({\n        index: 0,\n      });\n    }\n    state.unReadCount = count;\n  },\n  SET_CURRENT_GROUP(state, group) {\n    state.currentGroup = {\n      ...group,\n    };\n  },\n  SET_CURRENT_MEMBER_IN_GROUP(state, member) {\n    state.currentMemberInGroup = {\n      ...member,\n    };\n  },\n};\n\nconst actions = {\n  async getConversationList({ state, commit }, isFirstPage = true) {\n    try {\n      const { data } = await IMSDK.asyncApi(\n        IMSDK.IMMethods.GetConversationListSplit,\n        uuidv4(),\n        {\n          offset: isFirstPage ? 0 : state.conversationList.length,\n          count: 500,\n        },\n      );\n      commit(\"SET_CONVERSATION_LIST\", [\n        ...(isFirstPage ? [] : state.conversationList),\n        ...data,\n      ]);\n      return [...data];\n    } catch (e) {\n      console.log(e);\n      commit(\"SET_CONVERSATION_LIST\", []);\n      return [];\n    }\n  },\n  getCurrentGroup({ commit }, groupID) {\n    IMSDK.asyncApi(IMSDK.IMMethods.GetSpecifiedGroupsInfo, uuidv4(), [\n      groupID,\n    ]).then(({ data }) => {\n      commit(\"SET_CURRENT_GROUP\", data[0] ?? {});\n    });\n  },\n  getCurrentMemberInGroup({ commit, rootState }, groupID) {\n    IMSDK.asyncApi(IMSDK.IMMethods.GetSpecifiedGroupMembersInfo, uuidv4(), {\n      groupID,\n      userIDList: [rootState.user.selfInfo.userID],\n    }).then(({ data }) => {\n      commit(\"SET_CURRENT_MEMBER_IN_GROUP\", data[0] ?? {});\n    });\n  },\n  getUnReadCount({ commit }) {\n    IMSDK.asyncApi(IMSDK.IMMethods.GetTotalUnreadMsgCount, uuidv4()).then(\n      (res) => {\n        console.log(res);\n        commit(\"SET_UNREAD_COUNT\", res.data);\n      },\n    );\n  },\n  updateCurrentMemberInGroup({ commit, state }, memberInfo) {\n    console.log(memberInfo);\n    if (\n      memberInfo.groupID === state.currentMemberInGroup.groupID &&\n      memberInfo.userID === state.currentMemberInGroup.userID\n    ) {\n      commit(\"SET_CURRENT_MEMBER_IN_GROUP\", memberInfo);\n    }\n  },\n  resetConversationState({ commit }) {\n    commit(\"SET_CURRENT_MEMBER_IN_GROUP\", {});\n    commit(\"SET_CURRENT_GROUP\", {});\n    commit(\"SET_CURRENT_CONVERSATION\", {});\n  },\n};\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions,\n};\n"
  },
  {
    "path": "store/modules/message.js",
    "content": "import IMSDK, { MessageStatus, MessageType } from \"openim-uniapp-polyfill\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { UpdateMessageTypes } from \"@/constant\";\n\nconst state = {\n  historyMessageList: [],\n  hasMoreMessage: true,\n};\n\nconst mutations = {\n  SET_HISTORY_MESSAGE_LIST(state, list) {\n    state.historyMessageList = [...list];\n  },\n  SET_HAS_MORE_MESSAGE(state, hasMore) {\n    state.hasMoreMessage = hasMore;\n  },\n};\n\nconst actions = {\n  async getHistoryMesageList({ commit, state }, params) {\n    let emptyFlag = true;\n    try {\n      console.log(\"getHistoryMesageList:::\");\n      console.log(params);\n      const { data } = await IMSDK.asyncApi(\n        IMSDK.IMMethods.GetAdvancedHistoryMessageList,\n        uuidv4(),\n        params,\n      );\n      console.log(data);\n      const isFistPage = !params.startClientMsgID\n      const messages = data.messageList ?? [];\n      emptyFlag = messages.length === 0;\n      commit(\"SET_HISTORY_MESSAGE_LIST\", [\n        ...messages,\n        ...(isFistPage ? [] : state.historyMessageList),\n      ]);\n      commit(\"SET_HAS_MORE_MESSAGE\", !data.isEnd && messages.length === 20);\n    } catch (e) {\n      commit(\"SET_HISTORY_MESSAGE_LIST\", []);\n    }\n    return {\n      emptyFlag,\n    };\n  },\n  pushNewMessage({ commit, state }, message) {\n    commit(\"SET_HISTORY_MESSAGE_LIST\", [...state.historyMessageList, message]);\n  },\n  updateOneMessage(\n    { commit, state },\n    {\n      message,\n      type = UpdateMessageTypes.Overall,\n      keyWords = [],\n      isSuccess = false,\n    },\n  ) {\n    const tmpList = state.historyMessageList;\n    const idx = tmpList.findIndex(\n      (msg) => msg.clientMsgID === message.clientMsgID,\n    );\n    if (idx !== -1) {\n      if (type === UpdateMessageTypes.Overall) {\n        tmpList[idx] = {\n          ...message,\n        };\n      } else if (type === UpdateMessageTypes.KeyWords) {\n        const updateFields = Array.isArray(keyWords) ? keyWords : [keyWords];\n        updateFields.forEach(\n          (field) => (tmpList[idx][field.key] = field.value),\n        );\n      }\n      commit(\"SET_HISTORY_MESSAGE_LIST\", tmpList);\n    }\n  },\n  resetMessageState({ commit }) {\n    commit(\"SET_HISTORY_MESSAGE_LIST\", []);\n    commit(\"SET_HAS_MORE_MESSAGE\", true);\n  },\n};\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions,\n};\n"
  },
  {
    "path": "store/modules/user.js",
    "content": "import { v4 as uuidv4 } from \"uuid\";\nimport IMSDK from \"openim-uniapp-polyfill\";\nimport { businessGetUserInfo } from \"@/api/login\";\nimport { filterEmptyValue } from \"@/util/common\";\n\nconst state = {\n  selfInfo: {},\n  authData: {},\n  isSyncing: false,\n  reinstall: false,\n  progress: 0,\n};\n\nconst mutations = {\n  SET_SELF_INFO(state, info) {\n    state.selfInfo = {\n      ...info,\n    };\n  },\n  SET_AUTH_DATA(state, data) {\n    state.authData = {\n      ...data,\n    };\n  },\n  SET_IS_SYNCING(state, data) {\n    state.isSyncing = data;\n  },\n  SET_REINSTALL(state, data) {\n    state.reinstall = data;\n  },\n  SET_PROGRESS(state, data) {\n    state.progress = data;\n  },\n};\n\nconst actions = {\n  async getSelfInfo({ commit }) {\n    try {\n      const { data } = await IMSDK.asyncApi(\n        IMSDK.IMMethods.GetSelfUserInfo,\n        uuidv4(),\n      );\n      const { users } = await businessGetUserInfo(data.userID);\n      const businessData = users[0] ?? {};\n      filterEmptyValue(businessData);\n      commit(\"SET_SELF_INFO\", {\n        ...data,\n        ...businessData,\n      });\n    } catch (e) {\n      console.log(e);\n      uni.$u.toast(\"获取个人信息失败\");\n    }\n  },\n  async updateBusinessInfo({ commit, state }) {\n    try {\n      const { users } = await businessGetUserInfo(state.selfInfo.userID);\n      const businessData = users[0] ?? {};\n      filterEmptyValue(businessData);\n      commit(\"SET_SELF_INFO\", {\n        ...state.selfInfo,\n        ...businessData,\n      });\n    } catch (e) {\n      console.log(e);\n    }\n  },\n};\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions,\n};\n"
  },
  {
    "path": "styles/common.scss",
    "content": "@mixin colBox($isBtw) {\n  display: flex;\n  flex-direction: column;\n  @if $isBtw {\n    justify-content: space-between;\n  }\n}\n\n@mixin centerBox {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n@mixin vCenterBox {\n  display: flex;\n  align-items: center;\n}\n\n@mixin btwBox {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n@mixin nomalEllipsis {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  word-break: break-all;\n  white-space: nowrap;\n}\n\n@mixin ellipsisWithLine($line) {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: $line;\n  overflow: hidden;\n  word-break: break-all;\n}\n"
  },
  {
    "path": "styles/global.scss",
    "content": ".page_container {\n  display: flex;\n  flex-direction: column;\n  height: 100vh;\n}\n\nimage {\n  image-rendering: -moz-crisp-edges;\n  image-rendering: -o-crisp-edges;\n  image-rendering: -webkit-optimize-contrast;\n  image-rendering: crisp-edges;\n  -ms-interpolation-mode: nearest-neighbor;\n}\n"
  },
  {
    "path": "styles/login.scss",
    "content": ".content_with_back {\n  padding: 0 64rpx;\n\n  .back_icon {\n    padding-top: 50rpx;\n    padding-bottom: 100rpx;\n  }\n\n  .title {\n    font-size: 48rpx;\n    padding-bottom: 90rpx;\n  }\n\n  .sub_title {\n    color: $u-primary;\n    padding-bottom: 48rpx;\n  }\n}\n\n.phoneNumber_areacode {\n  display: flex;\n  align-items: center;\n  font-size: 36rpx;\n  border-right: 2rpx solid #d8d8d8;\n  margin-right: 48rpx;\n\n  .areacode_content {\n    font-weight: 400;\n    font-size: 28rpx;\n    margin-right: 12rpx;\n  }\n\n  .arrow_down {\n    margin-right: 12rpx;\n  }\n}\n\n.agreement {\n  display: flex;\n  align-items: flex-start;\n  flex-wrap: wrap;\n  margin: 36rpx 24rpx;\n\n  .detail {\n    font-size: 24rpx;\n    font-weight: 400;\n    color: $u-primary;\n  }\n}\n"
  },
  {
    "path": "uni.scss",
    "content": "/**\n * 这里是uni-app内置的常用样式变量\n *\n * uni-app 官方扩展插件及插件市场（https://ext.dcloud.net.cn）上很多三方插件均使用了这些样式变量\n * 如果你是插件开发者，建议你使用scss预处理，并在插件代码中直接使用这些变量（无需 import 这个文件），方便用户通过搭积木的方式开发整体风格一致的App\n *\n */\n\n/**\n * 如果你是App开发者（插件使用者），你可以通过修改这些变量来定制自己的插件主题，实现自定义主题功能\n *\n * 如果你的项目同样使用了scss预处理，你也可以直接在你的 scss 代码中使用如下变量，同时无需 import 这个文件\n */\n@import \"@/styles/common.scss\";\n\n/* 颜色变量 */\n@import \"@/uni_modules/uview-ui/theme.scss\";\n\ntext {\n  // line-height: 1.5;\n}\n\n/* 行为相关颜色 */\n$uni-color-primary: #007aff;\n$uni-color-success: #4cd964;\n$uni-color-warning: #f0ad4e;\n$uni-color-error: #dd524d;\n\n/* 文字基本颜色 */\n$uni-text-color: #0c1c33; //基本色\n$uni-text-color-inverse: #fff; //反色\n$uni-text-color-grey: #999; //辅助灰色，如加载更多的提示信息\n$uni-text-color-placeholder: #808080;\n$uni-text-color-disable: #c0c0c0;\n\n/* 背景颜色 */\n$uni-bg-color: #ffffff;\n$uni-bg-color-grey: #f8f8f8;\n$uni-bg-color-hover: #f1f1f1; //点击状态颜色\n$uni-bg-color-mask: rgba(0, 0, 0, 0.4); //遮罩颜色\n\n/* 边框颜色 */\n$uni-border-color: #c8c7cc;\n\n/* 尺寸变量 */\n\n/* 文字尺寸 */\n$uni-font-size-sm: 12px;\n$uni-font-size-base: 14px;\n$uni-font-size-lg: 16;\n\n/* 图片尺寸 */\n$uni-img-size-sm: 20px;\n$uni-img-size-base: 26px;\n$uni-img-size-lg: 40px;\n\n/* Border Radius */\n$uni-border-radius-sm: 2px;\n$uni-border-radius-base: 3px;\n$uni-border-radius-lg: 6px;\n$uni-border-radius-circle: 50%;\n\n/* 水平间距 */\n$uni-spacing-row-sm: 5px;\n$uni-spacing-row-base: 10px;\n$uni-spacing-row-lg: 15px;\n\n/* 垂直间距 */\n$uni-spacing-col-sm: 4px;\n$uni-spacing-col-base: 8px;\n$uni-spacing-col-lg: 12px;\n\n/* 透明度 */\n$uni-opacity-disabled: 0.3; // 组件禁用态的透明度\n\n/* 文章场景相关 */\n$uni-color-title: #2c405a; // 文章标题颜色\n$uni-font-size-title: 20px;\n$uni-color-subtitle: #555555; // 二级标题颜色\n$uni-font-size-subtitle: 26px;\n$uni-color-paragraph: #3f536e; // 文章段落颜色\n$uni-font-size-paragraph: 15px;\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/changelog.md",
    "content": "## 3.6.5（2022-10-14）\n修复组件size值为string类型时，调用toTempFilePath导出临时文件路径失败；  \n优化组件加载本地图片。\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue",
    "content": "<!-- ---------------------------------------------------------------------\n// uQRCode二维码生成插件 v3.6.5\n// \n// uQRCode是一款基于Javascript环境开发的二维码生成插件，适用所有Javascript运行环境的前端应用和Node.js。\n// \n// Copyright (c) Sansnn uQRCode All rights reserved.\n// \n// Licensed ( 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/@uqrcode/uni-app\n// \n// uni-app插件市场地址：\n//   https://ext.dcloud.net.cn/plugin?id=1287\n// \n// 复制使用请保留本段注释，感谢支持开源！\n// \n--------------------------------------------------------------------- -->\n<template>\n  <view class=\"uqrcode\" :class=\"{ 'uqrcode-hide': hide }\" :style=\"{ width: `${templateOptions.width}px`, height: `${templateOptions.height}px` }\">\n    <!-- 画布 -->\n    <!-- #ifndef APP-NVUE -->\n    <canvas\n      class=\"uqrcode-canvas\"\n      :id=\"canvasId\"\n      :canvas-id=\"canvasId\"\n      :type=\"type\"\n      :style=\"{\n        width: `${templateOptions.canvasWidth}px`,\n        height: `${templateOptions.canvasHeight}px`,\n        transform: templateOptions.canvasTransform\n      }\"\n      @click=\"onClick\"\n      v-if=\"templateOptions.canvasDisplay\"\n    ></canvas>\n    <!-- #endif -->\n\n    <!-- nvue用gcanvas -->\n    <!-- #ifdef APP-NVUE -->\n    <gcanvas\n      class=\"uqrcode-canvas\"\n      ref=\"gcanvas\"\n      :style=\"{\n        width: `${templateOptions.canvasWidth}px`,\n        height: `${templateOptions.canvasHeight}px`\n      }\"\n      @click=\"onClick\"\n      v-if=\"templateOptions.canvasDisplay\"\n    ></gcanvas>\n    <!-- #endif -->\n\n    <!-- H5保存提示，可在此替换。后续版本做成插槽 -->\n    <!-- #ifdef H5 -->\n    <view class=\"uqrcode-h5-save\" v-if=\"isH5Save\">\n      <image class=\"uqrcode-h5-save-image\" :src=\"tempFilePath\"></image>\n      <text class=\"uqrcode-h5-save-text\">若保存失败，请长按二维码进行保存</text>\n      <view class=\"uqrcode-h5-save-close\" @click=\"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\n    <!-- 加载效果，可在此替换。后续版本做成插槽 -->\n    <view class=\"uqrcode-makeing\" v-if=\"makeing\">\n      <image\n        class=\"uqrcode-makeing-image\"\n        :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    </view>\n\n    <!-- 错误处理，可在此替换 -->\n    <view class=\"uqrcode-error\" v-if=\"inError\"><text class=\"uqrcode-error-message\">Error, see console.</text></view>\n  </view>\n</template>\n\n<script>\n// #ifdef VUE3\nimport { toRaw } from 'vue';\n// #endif\n\n/* 引入uQRCode核心js */\nimport UQRCode from '../../js_sdk/uqrcode';\n\n/* 引入nvue所需模块 */\n// #ifdef APP-NVUE\nimport { enable, WeexBridge } from '../../js_sdk/gcanvas';\nconst modal = weex.requireModule('modal');\n// #endif\n\nexport default {\n  name: 'uqrcode',\n  props: {\n    /**\n     * canvas组件id\n     */\n    canvasId: {\n      type: String,\n      required: true // canvasId在微信小程序初始值不能为空，created中赋值也不行，必须给一个值，否则挂载组件后无法绘制\n    },\n    /**\n     * 二维码内容\n     */\n    value: {\n      type: [String, Number]\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    options: {\n      type: Object,\n      default: () => {\n        return {};\n      }\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: false\n    },\n    /**\n     * 隐藏组件\n     */\n    hide: {\n      type: Boolean,\n      default: false\n    },\n    /**\n     * canvas 类型\n     * 注意：微信小程序type2d手机上正常，PC上微信内打开小程序toDataURL报错\n     */\n    type: {\n      type: String,\n      default: undefined\n    },\n    /**\n     * 是否队列加载图片\n     */\n    isQueueLoadImage: {\n      type: Boolean,\n      default: false\n    }\n  },\n  data() {\n    return {\n      canvas: undefined,\n      canvasContext: undefined,\n      makeDelegate: undefined,\n      drawDelegate: undefined,\n      toTempFilePathDelegate: undefined,\n      makeing: false,\n      drawing: false,\n      inError: false,\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      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    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    isQueueLoadImage: {\n      handler(val) {\n        UQRCode.isQueueLoadImage = val;\n      },\n      immediate: true\n    }\n  },\n  mounted() {\n    this.templateOptions.size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size;\n    this.templateOptions.canvasWidth = this.templateOptions.size;\n    this.templateOptions.canvasHeight = this.templateOptions.size;\n    if (this.type == '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 UQRCode.deepReplace(this.templateOptions, {\n        size,\n        width: size,\n        height: size\n      });\n    },\n    /**\n     * 获取插件选项\n     */\n    getUqrcodeOptions() {\n      return UQRCode.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      this.inError = false;\n      if (!this.canvasId) {\n        console.error('[uQRCode]: canvasId must be set!');\n        this.inError = true;\n        callback.fail({\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.inError = true;\n        callback.fail({\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      this.uqrcodeOptions.useDynamicSize = false;\n      // #endif\n\n      /* 获取uQRCode实例 */\n      const qr = new UQRCode();\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.type === '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        /* 微信小程序获取图像方式，多个组件type默认和2d混用导致loadImage被替换，从而获取图像失败，导致报错：Unhandled promise rejection RangeError: Maximum call stack size exceeded，后续优化一下，现在只能统一所有组件的type */\n        UQRCode.loadImage = 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        UQRCode.loadImage = 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        UQRCode.loadImage = 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      UQRCode.loadImage = function(src) {\n        return new Promise((resolve, reject) => {\n          /* getImageInfo在nvue的bug：获取同一个路径的图片信息，同一时间第一次获取成功，后续失败，猜测是写入本地时产生文件写入冲突，所以没有返回，特别是对于网络资源 --- js部分已实现队列绘制，已解决此问题 */\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\n      /* 设置uQRCode实例的canvas上下文 */\n      qr.canvasContext = canvasContext;\n      /* 延时等待页面重新绘制完毕 */\n      setTimeout(() => {\n        /* 调用绘制方法将二维码图案绘制到canvas上 */\n        qr.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            if (this.drawDelegate) {\n              /* 高频重绘纠正 */\n              let delegate = this.drawDelegate;\n              this.drawDelegate = undefined;\n              delegate();\n            } else {\n              this.drawing = false;\n              this.inError = true;\n              callback.fail(err);\n            }\n          })\n          .finally(() => {\n            callback.complete();\n          });\n      }, 300);\n    },\n    /**\n     * 生成二维码\n     */\n    make(callback = {}) {\n      this.makeing = true;\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.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.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.type === '2d') {\n        // #ifdef MP-WEIXIN\n        /* 需要将 data:image/png;base64, 这段去除 writeFile 才能正常打开文件，否则是损坏文件，无法打开*/\n        const reg = new RegExp('^data:image/png;base64,', 'g');\n        // #ifdef VUE3\n        const dataURL = toRaw(this.canvas)\n          .toDataURL()\n          .replace(reg, '');\n        // #endif\n        // #ifndef VUE3\n        const dataURL = this.canvas.toDataURL().replace(reg, '');\n        // #endif\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: res => {\n            callback.success({\n              tempFilePath\n            });\n          },\n          fail: err => {\n            callback.fail(err);\n          },\n          complete: () => {\n            callback.complete();\n          }\n        });\n        // #endif\n      } else {\n        uni.canvasToTempFilePath(\n          {\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      /* 测试过程中，size需要乘以3才能保存完整，3又对应dpr，猜测是与像素比有关，故乘以3。第一次运行无法保存，后续正常，待排查。 */\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          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          // #endif\n\n          // #ifdef H5\n          /* 可以在电脑浏览器下载，移动端iOS不行，安卓微信浏览器不行，安卓外部浏览器可以 */\n          this.isH5Save = true;\n          this.tempFilePath = res.tempFilePath;\n          const aEle = document.createElement('a');\n          aEle.download = 'uQRCode'; // 设置下载的文件名，默认是'下载'\n          aEle.href = res.tempFilePath;\n          document.body.appendChild(aEle);\n          aEle.click();\n          aEle.remove(); // 下载之后把创建的元素删除\n          callback.success({\n            errMsg: 'ok'\n          });\n          callback.complete();\n          // #endif\n        },\n        fail: err => {\n          callback.fail(err);\n          callback.complete();\n        }\n      });\n    },\n    /**\n     * 注册click事件\n     */\n    onClick(e) {\n      this.$emit('click', e);\n    }\n  }\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: 40rpx;\n  height: 40rpx;\n  border: 2rpx solid #ffffff;\n  border-radius: 40rpx;\n  padding: 10rpx;\n}\n\n.uqrcode-h5-save-close-before {\n  position: absolute;\n  top: 50%;\n  transform: translateY(-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  transform: translateY(-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": "<!-- ---------------------------------------------------------------------\n// uQRCode二维码生成插件 v3.6.5\n// \n// uQRCode是一款基于Javascript环境开发的二维码生成插件，适用所有Javascript运行环境的前端应用和Node.js。\n// \n// Copyright (c) Sansnn uQRCode All rights reserved.\n// \n// Licensed ( 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/@uqrcode/uni-app\n// \n// uni-app插件市场地址：\n//   https://ext.dcloud.net.cn/plugin?id=1287\n// \n// 复制使用请保留本段注释，感谢支持开源！\n// \n--------------------------------------------------------------------- -->\n<template>\n  <view class=\"uqrcode\" :class=\"{ 'uqrcode-hide': hide }\" :style=\"{ width: `${templateOptions.width}px`, height: `${templateOptions.height}px` }\">\n    <!-- 画布 -->\n    <!-- #ifndef APP-NVUE -->\n    <canvas\n      class=\"uqrcode-canvas\"\n      :id=\"canvasId\"\n      :canvas-id=\"canvasId\"\n      :type=\"type\"\n      :style=\"{\n        width: `${templateOptions.canvasWidth}px`,\n        height: `${templateOptions.canvasHeight}px`,\n        transform: templateOptions.canvasTransform\n      }\"\n      @click=\"onClick\"\n      v-if=\"templateOptions.canvasDisplay\"\n    ></canvas>\n    <!-- #endif -->\n\n    <!-- nvue用gcanvas -->\n    <!-- #ifdef APP-NVUE -->\n    <gcanvas\n      class=\"uqrcode-canvas\"\n      ref=\"gcanvas\"\n      :style=\"{\n        width: `${templateOptions.canvasWidth}px`,\n        height: `${templateOptions.canvasHeight}px`\n      }\"\n      @click=\"onClick\"\n      v-if=\"templateOptions.canvasDisplay\"\n    ></gcanvas>\n    <!-- #endif -->\n\n    <!-- H5保存提示，可在此替换。后续版本做成插槽 -->\n    <!-- #ifdef H5 -->\n    <view class=\"uqrcode-h5-save\" v-if=\"isH5Save\">\n      <image class=\"uqrcode-h5-save-image\" :src=\"tempFilePath\"></image>\n      <text class=\"uqrcode-h5-save-text\">若保存失败，请长按二维码进行保存</text>\n      <view class=\"uqrcode-h5-save-close\" @click=\"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\n    <!-- 加载效果，可在此替换。后续版本做成插槽 -->\n    <view class=\"uqrcode-makeing\" v-if=\"makeing\">\n      <image\n        class=\"uqrcode-makeing-image\"\n        :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    </view>\n\n    <!-- 错误处理，可在此替换 -->\n    <view class=\"uqrcode-error\" v-if=\"inError\"><text class=\"uqrcode-error-message\">Error, see console.</text></view>\n  </view>\n</template>\n\n<script>\n// #ifdef VUE3\nimport { toRaw } from 'vue';\n// #endif\n\n/* 引入uQRCode核心js */\nimport UQRCode from '../../js_sdk/uqrcode';\n\n/* 引入nvue所需模块 */\n// #ifdef APP-NVUE\nimport { enable, WeexBridge } from '../../js_sdk/gcanvas';\nconst modal = weex.requireModule('modal');\n// #endif\n\nexport default {\n  name: 'uqrcode',\n  props: {\n    /**\n     * canvas组件id\n     */\n    canvasId: {\n      type: String,\n      required: true // canvasId在微信小程序初始值不能为空，created中赋值也不行，必须给一个值，否则挂载组件后无法绘制\n    },\n    /**\n     * 二维码内容\n     */\n    value: {\n      type: [String, Number]\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    options: {\n      type: Object,\n      default: () => {\n        return {};\n      }\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: false\n    },\n    /**\n     * 隐藏组件\n     */\n    hide: {\n      type: Boolean,\n      default: false\n    },\n    /**\n     * canvas 类型\n     * 注意：微信小程序type2d手机上正常，PC上微信内打开小程序toDataURL报错\n     */\n    type: {\n      type: String,\n      default: undefined\n    },\n    /**\n     * 是否队列加载图片\n     */\n    isQueueLoadImage: {\n      type: Boolean,\n      default: false\n    }\n  },\n  data() {\n    return {\n      canvas: undefined,\n      canvasContext: undefined,\n      makeDelegate: undefined,\n      drawDelegate: undefined,\n      toTempFilePathDelegate: undefined,\n      makeing: false,\n      drawing: false,\n      inError: false,\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      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    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    isQueueLoadImage: {\n      handler(val) {\n        UQRCode.isQueueLoadImage = val;\n      },\n      immediate: true\n    }\n  },\n  mounted() {\n    this.templateOptions.size = this.sizeUnit == 'rpx' ? uni.upx2px(this.size) : this.size;\n    this.templateOptions.canvasWidth = this.templateOptions.size;\n    this.templateOptions.canvasHeight = this.templateOptions.size;\n    if (this.type == '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 UQRCode.deepReplace(this.templateOptions, {\n        size,\n        width: size,\n        height: size\n      });\n    },\n    /**\n     * 获取插件选项\n     */\n    getUqrcodeOptions() {\n      return UQRCode.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      this.inError = false;\n      if (!this.canvasId) {\n        console.error('[uQRCode]: canvasId must be set!');\n        this.inError = true;\n        callback.fail({\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.inError = true;\n        callback.fail({\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      this.uqrcodeOptions.useDynamicSize = false;\n      // #endif\n\n      /* 获取uQRCode实例 */\n      const qr = new UQRCode();\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.type === '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        /* 微信小程序获取图像方式，多个组件type默认和2d混用导致loadImage被替换，从而获取图像失败，导致报错：Unhandled promise rejection RangeError: Maximum call stack size exceeded，后续优化一下，现在只能统一所有组件的type */\n        UQRCode.loadImage = 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        UQRCode.loadImage = 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        UQRCode.loadImage = 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      UQRCode.loadImage = function(src) {\n        return new Promise((resolve, reject) => {\n          /* getImageInfo在nvue的bug：获取同一个路径的图片信息，同一时间第一次获取成功，后续失败，猜测是写入本地时产生文件写入冲突，所以没有返回，特别是对于网络资源 --- js部分已实现队列绘制，已解决此问题 */\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\n      /* 设置uQRCode实例的canvas上下文 */\n      qr.canvasContext = canvasContext;\n      /* 延时等待页面重新绘制完毕 */\n      setTimeout(() => {\n        /* 调用绘制方法将二维码图案绘制到canvas上 */\n        qr.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            if (this.drawDelegate) {\n              /* 高频重绘纠正 */\n              let delegate = this.drawDelegate;\n              this.drawDelegate = undefined;\n              delegate();\n            } else {\n              this.drawing = false;\n              this.inError = true;\n              callback.fail(err);\n            }\n          })\n          .finally(() => {\n            callback.complete();\n          });\n      }, 300);\n    },\n    /**\n     * 生成二维码\n     */\n    make(callback = {}) {\n      this.makeing = true;\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.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.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.type === '2d') {\n        // #ifdef MP-WEIXIN\n        /* 需要将 data:image/png;base64, 这段去除 writeFile 才能正常打开文件，否则是损坏文件，无法打开*/\n        const reg = new RegExp('^data:image/png;base64,', 'g');\n        // #ifdef VUE3\n        const dataURL = toRaw(this.canvas)\n          .toDataURL()\n          .replace(reg, '');\n        // #endif\n        // #ifndef VUE3\n        const dataURL = this.canvas.toDataURL().replace(reg, '');\n        // #endif\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: res => {\n            callback.success({\n              tempFilePath\n            });\n          },\n          fail: err => {\n            callback.fail(err);\n          },\n          complete: () => {\n            callback.complete();\n          }\n        });\n        // #endif\n      } else {\n        uni.canvasToTempFilePath(\n          {\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      /* 测试过程中，size需要乘以3才能保存完整，3又对应dpr，猜测是与像素比有关，故乘以3。第一次运行无法保存，后续正常，待排查。 */\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          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          // #endif\n\n          // #ifdef H5\n          /* 可以在电脑浏览器下载，移动端iOS不行，安卓微信浏览器不行，安卓外部浏览器可以 */\n          this.isH5Save = true;\n          this.tempFilePath = res.tempFilePath;\n          const aEle = document.createElement('a');\n          aEle.download = 'uQRCode'; // 设置下载的文件名，默认是'下载'\n          aEle.href = res.tempFilePath;\n          document.body.appendChild(aEle);\n          aEle.click();\n          aEle.remove(); // 下载之后把创建的元素删除\n          callback.success({\n            errMsg: 'ok'\n          });\n          callback.complete();\n          // #endif\n        },\n        fail: err => {\n          callback.fail(err);\n          callback.complete();\n        }\n      });\n    },\n    /**\n     * 注册click事件\n     */\n    onClick(e) {\n      this.$emit('click', e);\n    }\n  }\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: 40rpx;\n  height: 40rpx;\n  border: 2rpx solid #ffffff;\n  border-radius: 40rpx;\n  padding: 10rpx;\n}\n\n.uqrcode-h5-save-close-before {\n  position: absolute;\n  top: 50%;\n  transform: translateY(-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  transform: translateY(-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/package.json",
    "content": "{\n  \"name\": \"uqrcode\",\n  \"version\": \"3.6.0\",\n  \"description\": \"\",\n  \"main\": \"uqrcode.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}\n"
  },
  {
    "path": "uni_modules/Sansnn-uQRCode/js_sdk/uqrcode/uqrcode.js",
    "content": "//---------------------------------------------------------------------\n// uQRCode二维码生成插件 v3.6.0 Basic\n// \n// uQRCode是一款基于Javascript环境开发的二维码生成插件，适用所有Javascript运行环境的前端应用和Node.js。\n// \n// Copyright (c) Sansnn uQRCode All rights reserved.\n// \n// Licensed ( 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// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n//   http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of \n// DENSO WAVE INCORPORATED\n//   http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n\"use strict\";let uQRCode;!function(){function o(o){this.mode=d.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}function r(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 t(o,e){this.totalCount=o,this.dataCount=e}function i(){this.buffer=new Array,this.length=0}function n(){function o(t,i,n){t().then(o=>{i(o)}).catch(o=>{n(o)}).finally(()=>{if(e.length){const r=e.shift();o(r.task,r.resolve,r.reject)}else r=!1})}let e=this.waitingQueue=[],r=this.isRunning=!1;this.exec=function(t){return new Promise((i,n)=>{r?e.push({task:t,resolve:i,reject:n}):(r=!0,o(t,i,n))})}}function a(o){this.errMsg=o}function u(o,e){var r=this.data=\"\",t=this.size=200,i=this.typeNumber=-1,n=(this.errorCorrectLevel=s.H,this.useDynamicSize=!1,this.dynamicSize=void 0,this.margin=0),a=(this.backgroundColor=\"#FFFFFF\",this.backgroundImageSrc=void 0,this.backgroundImageWidth=void 0),d=this.backgroundImageHeight=void 0,g=this.backgroundImageX=void 0,l=this.backgroundImageY=void 0,h=(this.backgroundImageAlpha=1,this.backgroundImageBorderRadius=0,this.foregroundColor=\"#000000\",this.foregroundImageSrc=void 0,this.foregroundImageWidth=void 0),c=this.foregroundImageHeight=void 0,m=this.foregroundImageX=void 0,f=this.foregroundImageY=void 0,v=this.foregroundImagePadding=0,C=(this.foregroundImageBackgroundColor=\"#FFFFFF\",this.foregroundImageBorderRadius=0),p=this.foregroundImageShadowOffsetX=0,b=this.foregroundImageShadowOffsetY=0,y=this.foregroundImageShadowBlur=0,k=(this.foregroundImageShadowColor=\"#808080\",this.foregroundPadding=0,this.foregroundRadius=1),I=this.positionProbeBackgroundColor=void 0,w=this.positionProbeForegroundColor=void 0,B=this.separatorColor=void 0,T=this.positionAdjustBackgroundColor=void 0,P=this.positionAdjustForegroundColor=void 0,S=this.timingBackgroundColor=void 0,A=this.timingForegroundColor=void 0,E=this.typeNumberBackgroundColor=void 0,D=this.typeNumberForegroundColor=void 0,N=this.darkBlockColor=void 0,L=(this.style=\"default\",this.patterns=[],this.canvasContext=void 0);this.queue=!1,this.modules=[],this.moduleCount=0,this.drawModules=[];Object.defineProperties(this,{data:{get:()=>(\"\"!==r&&void 0!==r||console.error(\"[uQRCode]: data must be set!\"),r),set(o){r=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===g?0:this.useDynamicSize?this.dynamicSize/this.size*g:g},set(o){g=Number(o)}},backgroundImageY:{get(){return void 0===l?0:this.useDynamicSize?this.dynamicSize/this.size*l:l},set(o){l=Number(o)}},foregroundImageWidth:{get(){return void 0===h?(this.dynamicSize-2*this.margin)/4:this.useDynamicSize?this.dynamicSize/this.size*h:h},set(o){h=Number(o)}},foregroundImageHeight:{get(){return void 0===c?(this.dynamicSize-2*this.margin)/4:this.useDynamicSize?this.dynamicSize/this.size*c:c},set(o){c=Number(o)}},foregroundImageX:{get(){return void 0===m?this.dynamicSize/2-this.foregroundImageWidth/2:this.useDynamicSize?this.dynamicSize/this.size*m:m},set(o){m=Number(o)}},foregroundImageY:{get(){return void 0===f?this.dynamicSize/2-this.foregroundImageHeight/2:this.useDynamicSize?this.dynamicSize/this.size*f:f},set(o){f=Number(o)}},foregroundImagePadding:{get(){return this.useDynamicSize?this.dynamicSize/this.size*v:v},set(o){v=Number(o)}},foregroundImageBorderRadius:{get(){return this.useDynamicSize?this.dynamicSize/this.size*C:C},set(o){C=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*b:b},set(o){b=Number(o)}},foregroundImageShadowBlur:{get(){return this.useDynamicSize?this.dynamicSize/this.size*y:y},set(o){y=Number(o)}},foregroundRadius:{get:()=>k,set(o){k=o>1?1:o<0?0:o}},positionProbeBackgroundColor:{get(){return I||this.backgroundColor},set(o){I=o}},positionProbeForegroundColor:{get(){return w||this.foregroundColor},set(o){w=o}},separatorColor:{get(){return B||this.backgroundColor},set(o){B=o}},positionAdjustBackgroundColor:{get(){return T||this.backgroundColor},set(o){T=o}},positionAdjustForegroundColor:{get(){return P||this.foregroundColor},set(o){P=o}},timingBackgroundColor:{get(){return S||this.backgroundColor},set(o){S=o}},timingForegroundColor:{get(){return A||this.foregroundColor},set(o){A=o}},typeNumberBackgroundColor:{get(){return E||this.backgroundColor},set(o){E=o}},typeNumberForegroundColor:{get(){return D||this.foregroundColor},set(o){D=o}},darkBlockColor:{get(){return N||this.foregroundColor},set(o){N=o}},canvasContext:{get:()=>(void 0===L&&console.error(\"[uQRCode]: use drawCanvas, you need to set the canvasContext!\"),L),set(o){L=u.getCanvasContext(o)}}}),o&&this.setOptions(o),e&&(this.canvasContext=u.getCanvasContext(e))}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=t.getRSBlocks(o,this.errorCorrectLevel),r=new i,n=0,a=0;a<e.length;a++)n+=e[a].dataCount;for(a=0;a<this.dataList.length;a++){var u=this.dataList[a];r.put(u.mode,4),r.put(u.getLength(),l.getLengthInBits(u.mode,o)),u.write(r)}if(r.getLengthInBits()<=8*n)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=l.getLostPoint(this);(0==r||o>t)&&(o=t,e=r)}return e},createMovieClip:function(o,e,r){var t=o.createEmptyMovieClip(e,r),i=1;this.make();for(var n=0;n<this.modules.length;n++)for(var a=n*i,u=0;u<this.modules[n].length;u++){var d=u*i,s=this.modules[n][u];s&&(t.beginFill(0,100),t.moveTo(d,a),t.lineTo(d+i,a),t.lineTo(d+i,a+i),t.lineTo(d,a+i),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=l.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=l.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=l.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 u=0;u<2;u++)if(null==this.modules[t][a-u]){var d=!1;n<o.length&&(d=1==(o[n]>>>i&1));var s=l.getMask(e,t,a-u);s&&(d=!d),this.modules[t][a-u]=d,i--,-1==i&&(n++,i=7)}if(t+=r,t<0||this.moduleCount<=t){t-=r,r=-r;break}}}},e.PAD0=236,e.PAD1=17,e.createData=function(o,r,n){for(var a=t.getRSBlocks(o,r),u=new i,d=0;d<n.length;d++){var s=n[d];u.put(s.mode,4),u.put(s.getLength(),l.getLengthInBits(s.mode,o)),s.write(u)}var g=0;for(d=0;d<a.length;d++)g+=a[d].dataCount;if(u.getLengthInBits()>8*g)throw new Error(\"code length overflow. (\"+u.getLengthInBits()+\">\"+8*g+\")\");for(u.getLengthInBits()+4<=8*g&&u.put(0,4);u.getLengthInBits()%8!=0;)u.putBit(!1);for(;!(u.getLengthInBits()>=8*g||(u.put(e.PAD0,8),u.getLengthInBits()>=8*g));)u.put(e.PAD1,8);return e.createBytes(u,a)},e.createBytes=function(o,e){for(var t=0,i=0,n=0,a=new Array(e.length),u=new Array(e.length),d=0;d<e.length;d++){var s=e[d].dataCount,g=e[d].totalCount-s;i=Math.max(i,s),n=Math.max(n,g),a[d]=new Array(s);for(var h=0;h<a[d].length;h++)a[d][h]=255&o.buffer[h+t];t+=s;var c=l.getErrorCorrectPolynomial(g),m=new r(a[d],c.getLength()-1),f=m.mod(c);u[d]=new Array(c.getLength()-1);for(h=0;h<u[d].length;h++){var v=h+f.getLength()-u[d].length;u[d][h]=v>=0?f.get(v):0}}var C=0;for(h=0;h<e.length;h++)C+=e[h].totalCount;var p=new Array(C),b=0;for(h=0;h<i;h++)for(d=0;d<e.length;d++)h<a[d].length&&(p[b++]=a[d][h]);for(h=0;h<n;h++)for(d=0;d<e.length;d++)h<u[d].length&&(p[b++]=u[d][h]);return p};for(var d={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},s={L:1,M:0,Q:3,H:2},g={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},l={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;l.getBCHDigit(e)-l.getBCHDigit(l.G15)>=0;)e^=l.G15<<l.getBCHDigit(e)-l.getBCHDigit(l.G15);return(o<<10|e)^l.G15_MASK},getBCHTypeNumber:function(o){for(var e=o<<12;l.getBCHDigit(e)-l.getBCHDigit(l.G18)>=0;)e^=l.G18<<l.getBCHDigit(e)-l.getBCHDigit(l.G18);return o<<12|e},getBCHDigit:function(o){for(var e=0;0!=o;)e++,o>>>=1;return e},getPatternPosition:function(o){return l.PATTERN_POSITION_TABLE[o-1]},getMask:function(o,e,r){switch(o){case g.PATTERN000:return(e+r)%2==0;case g.PATTERN001:return e%2==0;case g.PATTERN010:return r%3==0;case g.PATTERN011:return(e+r)%3==0;case g.PATTERN100:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case g.PATTERN101:return e*r%2+e*r%3==0;case g.PATTERN110:return(e*r%2+e*r%3)%2==0;case g.PATTERN111:return(e*r%3+(e+r)%2)%2==0;default:throw new Error(\"bad maskPattern:\"+o)}},getErrorCorrectPolynomial:function(o){for(var e=new r([1],0),t=0;t<o;t++)e=e.multiply(new r([1,h.gexp(t)],0));return e},getLengthInBits:function(o,e){if(1<=e&&e<10)switch(o){case d.MODE_NUMBER:return 10;case d.MODE_ALPHA_NUM:return 9;case d.MODE_8BIT_BYTE:case d.MODE_KANJI:return 8;default:throw new Error(\"mode:\"+o)}else if(e<27)switch(o){case d.MODE_NUMBER:return 12;case d.MODE_ALPHA_NUM:return 11;case d.MODE_8BIT_BYTE:return 16;case d.MODE_KANJI:return 10;default:throw new Error(\"mode:\"+o)}else{if(!(e<41))throw new Error(\"type:\"+e);switch(o){case d.MODE_NUMBER:return 14;case d.MODE_ALPHA_NUM:return 13;case d.MODE_8BIT_BYTE:return 16;case d.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),u=-1;u<=1;u++)if(!(t+u<0||e<=t+u))for(var d=-1;d<=1;d++)i+d<0||e<=i+d||0==u&&0==d||a==o.isDark(t+u,i+d)&&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++;var l=Math.abs(100*g/e/e-50)/5;return r+=10*l,r}},h={glog:function(o){if(o<1)throw new Error(\"glog(\"+o+\")\");return h.LOG_TABLE[o]},gexp:function(o){for(;o<0;)o+=255;for(;o>=256;)o-=255;return h.EXP_TABLE[o]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},c=0;c<8;c++)h.EXP_TABLE[c]=1<<c;for(c=8;c<256;c++)h.EXP_TABLE[c]=h.EXP_TABLE[c-4]^h.EXP_TABLE[c-5]^h.EXP_TABLE[c-6]^h.EXP_TABLE[c-8];for(c=0;c<255;c++)h.LOG_TABLE[h.EXP_TABLE[c]]=c;r.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),t=0;t<this.getLength();t++)for(var i=0;i<o.getLength();i++)e[t+i]^=h.gexp(h.glog(this.get(t))+h.glog(o.get(i)));return new r(e,0)},mod:function(o){if(this.getLength()-o.getLength()<0)return this;for(var e=h.glog(this.get(0))-h.glog(o.get(0)),t=new Array(this.getLength()),i=0;i<this.getLength();i++)t[i]=this.get(i);for(i=0;i<o.getLength();i++)t[i]^=h.gexp(h.glog(o.get(i))+e);return new r(t,0).mod(o)}},t.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]],t.getRSBlocks=function(o,e){var r=t.getRsBlockTable(o,e);if(null==r)throw new Error(\"bad rs block @ typeNumber:\"+o+\"/errorCorrectLevel:\"+e);for(var i=r.length/3,n=new Array,a=0;a<i;a++)for(var u=r[3*a+0],d=r[3*a+1],s=r[3*a+2],g=0;g<u;g++)n.push(new t(d,s));return n},t.getRsBlockTable=function(o,e){switch(e){case s.L:return t.RS_BLOCK_TABLE[4*(o-1)+0];case s.M:return t.RS_BLOCK_TABLE[4*(o-1)+1];case s.Q:return t.RS_BLOCK_TABLE[4*(o-1)+2];case s.H:return t.RS_BLOCK_TABLE[4*(o-1)+3];default:return}},i.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++}},u.errorCorrectLevel=s,u.queue=new n,u.queueLoadImage=new n,u.isQueueLoadImage=!1,u.loadImageCache=[],u.utf16To8=function(o){for(var e,r=\"\",t=0;t<o.length;t++)e=o.charCodeAt(t),e>=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},u.deepReplace=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])}return t},u.getSomePropertyToNewObject=function(o={},e=[]){let r={};return e.forEach(e=>{r[e]=o[e]}),r},u.getCanvasContext=function(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.draw=o.draw||function(o,e){e&&e()},o},u.getLoadImage=function(o){return\"function\"==typeof o?function(e,r=!1){return u.isQueueLoadImage?u.queueLoadImage.exec(()=>new Promise((t,i)=>{setTimeout(()=>{const r=u.loadImageCache.find(o=>o.src==e);r?t(r.img):o(e).then(o=>{u.loadImageCache.push({src:e,img:o}),t(o)}).catch(o=>{i(o)})},r?150:10)})):o(e)}:function(o){return Promise.resolve(o)}};var m=u.loadImage=function(o){return Promise.resolve(o)};Object.defineProperty(u,\"loadImage\",{get:()=>m,set(o){m=u.getLoadImage(o)}}),u.prototype={setOptions(o){var e,r,t,i,n,a,d,s,g,l,h,c,m,f,v,C,p,b,y,k,I,w,B,T,P,S,A,E,D,N,L,R,z,M,x,_,O,F,H,X,j,Y,Q,G,K,W,q,U,$,J,V,Z,oo,eo,ro,to,io,no,ao;o&&u.deepReplace(this,{data:o.data||o.text,size:o.size,typeNumber:o.typeNumber,errorCorrectLevel:o.errorCorrectLevel,useDynamicSize:o.useDynamicSize,margin:o.margin,backgroundColor:o.backgroundColor||(null===(e=o.background)||void 0===e?void 0:e.color),backgroundImageSrc:o.backgroundImageSrc||(null===(r=o.background)||void 0===r?void 0:null===(t=r.image)||void 0===t?void 0:t.src),backgroundImageWidth:o.backgroundImageWidth||(null===(i=o.background)||void 0===i?void 0:null===(n=i.image)||void 0===n?void 0:n.width),backgroundImageHeight:o.backgroundImageHeight||(null===(a=o.background)||void 0===a?void 0:null===(d=a.image)||void 0===d?void 0:d.height),backgroundImageX:o.backgroundImageX||(null===(s=o.background)||void 0===s?void 0:null===(g=s.image)||void 0===g?void 0:g.x),backgroundImageY:o.backgroundImageY||(null===(l=o.background)||void 0===l?void 0:null===(h=l.image)||void 0===h?void 0:h.y),backgroundImageAlpha:o.backgroundImageAlpha||(null===(c=o.background)||void 0===c?void 0:null===(m=c.image)||void 0===m?void 0:m.alpha),backgroundImageBorderRadius:o.backgroundImageBorderRadius||(null===(f=o.background)||void 0===f?void 0:null===(v=f.image)||void 0===v?void 0:v.borderRadius),foregroundColor:o.foregroundColor||(null===(C=o.foreground)||void 0===C?void 0:C.color),foregroundImageSrc:o.foregroundImageSrc||(null===(p=o.foreground)||void 0===p?void 0:null===(b=p.image)||void 0===b?void 0:b.src),foregroundImageWidth:o.foregroundImageWidth||(null===(y=o.foreground)||void 0===y?void 0:null===(k=y.image)||void 0===k?void 0:k.width),foregroundImageHeight:o.foregroundImageHeight||(null===(I=o.foreground)||void 0===I?void 0:null===(w=I.image)||void 0===w?void 0:w.height),foregroundImageX:o.foregroundImageX||(null===(B=o.foreground)||void 0===B?void 0:null===(T=B.image)||void 0===T?void 0:T.x),foregroundImageY:o.foregroundImageY||(null===(P=o.foreground)||void 0===P?void 0:null===(S=P.image)||void 0===S?void 0:S.y),foregroundImagePadding:o.foregroundImagePadding||(null===(A=o.foreground)||void 0===A?void 0:null===(E=A.image)||void 0===E?void 0:E.padding),foregroundImageBackgroundColor:o.foregroundImageBackgroundColor||(null===(D=o.foreground)||void 0===D?void 0:null===(N=D.image)||void 0===N?void 0:N.backgroundColor),foregroundImageBorderRadius:o.foregroundImageBorderRadius||(null===(L=o.foreground)||void 0===L?void 0:null===(R=L.image)||void 0===R?void 0:R.borderRadius),foregroundImageShadowOffsetX:o.foregroundImageShadowOffsetX||(null===(z=o.foreground)||void 0===z?void 0:null===(M=z.image)||void 0===M?void 0:M.shadowOffsetX),foregroundImageShadowOffsetY:o.foregroundImageShadowOffsetY||(null===(x=o.foreground)||void 0===x?void 0:null===(_=x.image)||void 0===_?void 0:_.shadowOffsetY),foregroundImageShadowBlur:o.foregroundImageShadowBlur||(null===(O=o.foreground)||void 0===O?void 0:null===(F=O.image)||void 0===F?void 0:F.shadowBlur),foregroundImageShadowColor:o.foregroundImageShadowColor||(null===(H=o.foreground)||void 0===H?void 0:null===(X=H.image)||void 0===X?void 0:X.shadowColor),foregroundPadding:o.foregroundPadding,foregroundRadius:o.foregroundRadius,positionProbeBackgroundColor:o.positionProbeBackgroundColor||(null===(j=o.positionProbe)||void 0===j?void 0:j.backgroundColor)||(null===(Y=o.positionDetection)||void 0===Y?void 0:Y.backgroundColor),positionProbeForegroundColor:o.positionProbeForegroundColor||(null===(Q=o.positionProbe)||void 0===Q?void 0:Q.foregroundColor)||(null===(G=o.positionDetection)||void 0===G?void 0:G.foregroundColor),separatorColor:o.separatorColor||(null===(K=o.separator)||void 0===K?void 0:K.color),positionAdjustBackgroundColor:o.positionAdjustBackgroundColor||(null===(W=o.positionAdjust)||void 0===W?void 0:W.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===(V=o.timing)||void 0===V?void 0:V.foregroundColor),typeNumberBackgroundColor:o.typeNumberBackgroundColor||(null===(Z=o.typeNumber)||void 0===Z?void 0:Z.backgroundColor)||(null===(oo=o.versionInformation)||void 0===oo?void 0:oo.backgroundColor),typeNumberForegroundColor:o.typeNumberForegroundColor||(null===(eo=o.typeNumber)||void 0===eo?void 0:eo.foregroundColor)||(null===(ro=o.versionInformation)||void 0===ro?void 0:ro.foregroundColor),darkBlockColor:o.darkBlockColor||(null===(to=o.darkBlock)||void 0===to?void 0:to.color),style:o.style,patterns:o.patterns||(null===(io=o.art)||void 0===io?void 0:io.patterns)||(null===(no=o.art)||void 0===no?void 0:null===(ao=no.shape)||void 0===ao?void 0:ao.map(o=>(o.imageSrc=o.image,o))),queue:o.queue},!0)},make(){this.foregroundColor===this.backgroundColor&&console.error(\"[uQRCode]: foregroundColor and backgroundColor cannot be the same!\");var o=new e(this.typeNumber,this.errorCorrectLevel);o.addData(u.utf16To8(this.data.toString())),o.make(),this.typeNumber=o.typeNumber,this.modules=o.modules,this.moduleCount=o.moduleCount;var r=this.size-2*this.margin;this.dynamicSize=Math.ceil(r/o.moduleCount)*o.moduleCount+2*this.margin,this.useDynamicSize||(this.dynamicSize=this.size),this.paintData(),this.paintPositionProbe(),this.paintSeparator(),this.paintTiming(),this.paintPositionAdjust(),this.paintDarkBlock(),this.paintTypeNumber(),this.getDrawModules()},paintData(){let{dynamicSize:o,margin:e,backgroundColor:r,foregroundColor:t,foregroundPadding:i,style:n,modules:a,moduleCount:u}=this,d=(o-2*e)/u,s=d,g=0;i>0&&\"liquid\"!=n&&\"art\"!=n&&(g=s*i/2,s-=2*g);for(var l=0;l<u;l++)for(var h=0;h<u;h++){var c=a[l][h];if(c){var m=h*d+e+g,f=l*d+e+g;a[l][h]={size:s,x:m,y:f,type:[\"foreground\"],color:t,isBlack:!0,isDrawn:!1}}else a[l][h]={size:s,x:h*s+e,y:l*s+e,type:[\"background\"],color:r,isBlack:!1,isDrawn:!1}}},paintPositionProbe(){let{modules:o,moduleCount:e,positionProbeBackgroundColor:r,positionProbeForegroundColor:t}=this,i=[[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]],n=e-7;i.forEach(e=>{var i=o[e[0]][e[1]],a=o[e[0]+n][e[1]],u=o[e[0]][e[1]+n];u.type.push(\"positionProbe\"),a.type.push(\"positionProbe\"),i.type.push(\"positionProbe\"),i.color=1==e[2]?t:r,a.color=1==e[2]?t:r,u.color=1==e[2]?t:r})},paintSeparator(){let{modules:o,moduleCount:e,separatorColor:r}=this;[[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(t=>{var i=o[t[0]][t[1]],n=o[e-t[0]-1][t[1]],a=o[t[0]][e-t[1]-1];a.type.push(\"separator\"),n.type.push(\"separator\"),i.type.push(\"separator\"),i.color=r,n.color=r,a.color=r})},paintPositionAdjust(){let{typeNumber:o,modules:e,moduleCount:r,foregroundColor:t,backgroundColor:i,positionAdjustForegroundColor:n,positionAdjustBackgroundColor:a,timingForegroundColor:u,timingBackgroundColor:d}=this;const s=[[],[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]],g=s[o-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]],s=g.length;for(let l=0;l<s;l++)for(let h=0;h<s;h++){let{x:s,y:c}={x:g[l],y:g[h]};s<9&&c<9||s>r-9-1&&c<9||c>r-9-1&&s<9||o.forEach(o=>{var r=e[s+o[0]][c+o[1]];r.type.push(\"positionAdjust\"),r.type.includes(\"timing\")?1==o[2]?r.color=n==t?u:n:r.color=n==t&&a==i?d:a:r.color=1==o[2]?n:a})}}},paintTiming(){let{modules:o,moduleCount:e,timingForegroundColor:r,timingBackgroundColor:t}=this,i=e-16;for(let e=0;e<i;e++){var n=o[6][8+e],a=o[8+e][6];n.type.push(\"timing\"),a.type.push(\"timing\"),n.color=1&e^1?r:t,a.color=1&e^1?r:t}},paintDarkBlock(){let{modules:o,moduleCount:e,darkBlockColor:r}=this;var t=o[e-7-1][8];t.type.push(\"darkBlock\"),t.color=r},paintTypeNumber(){let{typeNumber:o,modules:e,moduleCount:r,typeNumberBackgroundColor:t,typeNumberForegroundColor:i}=this;if(o<7)return e;const n=[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 a=n[o]+n[o],u=[r-11,r-10,r-9],d=[[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]];d.forEach((o,r)=>{var n=e[o[0]][o[1]];n.type.push(\"typeNumber\"),n.color=\"1\"==a[r]?i:t})},getDrawModules(){let o=this.drawModules=[],{modules:e,moduleCount:r,dynamicSize:t,backgroundColor:i,backgroundImageSrc:n,backgroundImageX:a,backgroundImageY:u,backgroundImageWidth:d,backgroundImageHeight:s,backgroundImageAlpha:g,backgroundImageBorderRadius:l,style:h,patterns:c,foregroundImageSrc:m,foregroundImageX:f,foregroundImageY:v,foregroundImageWidth:C,foregroundImageHeight:p,foregroundImagePadding:b,foregroundImageBackgroundColor:y,foregroundImageBorderRadius:k,foregroundImageShadowOffsetX:I,foregroundImageShadowOffsetY:w,foregroundImageShadowBlur:B,foregroundImageShadowColor:T}=this;i&&o.push({name:\"background\",type:\"box\",color:i,x:0,y:0,width:t,height:t}),n&&o.push({name:\"backgroundImage\",type:\"image\",imageSrc:n,imageSource:\"backgroundImageSrc\",x:a,y:u,width:d,height:s,alpha:g,borderRadius:l});for(var P=0;P<r;P++)for(var S=0;S<r;S++){var A=e[P][S];A.isDrawn||(A.type.includes(\"foreground\")?o.push({name:\"foreground\",type:\"block\",color:A.color,x:A.x,y:A.y,width:A.size,height:A.size,rowIndex:P,colIndex:S}):o.push({name:\"background\",type:\"block\",color:A.color,x:A.x,y:A.y,width:A.size,height:A.size,rowIndex:P,colIndex:S}),A.isDrawn=!0)}m&&o.push({name:\"foregroundImage\",type:\"image\",imageSrc:m,imageSource:\"foregroundImageSrc\",x:f,y:v,width:C,height:p,padding:b,backgroundColor:y,borderRadius:k,shadowOffsetX:I,shadowOffsetY:w,shadowBlur:B,shadowColor:T})},getModuleIsBack(o,e){var r=this.moduleCount;return!(0>o||0>e||o>=r||e>=r)&&this.modules[o][e].isBlack},drawCanvas(){let{canvasContext:o,foregroundColor:e,backgroundColor:r,queue:t,style:i}=this;if(e===r)return Promise.reject(new a(\"[uQRCode]: foregroundColor and backgroundColor cannot be the same!\"));let n=async(e,r)=>{try{o.draw(!1),await this.styleDefault(),o.draw(!0),setTimeout(e,150)}catch(o){if(!(o instanceof a))throw o;r(o)}};return new Promise((o,e)=>{t?u.queue.exec(()=>new Promise((o,e)=>{n(o,e)})).then(()=>{setTimeout(o,150)}).catch(o=>{e(o)}):n(o,e)})},draw(){return this.drawCanvas()},async styleDefault(){let{drawModules:o,canvasContext:e,backgroundColor:r,margin:t,queue:i}=this;for(var n=0;n<o.length;n++){e.save();var d=o[n];switch(d.type){case\"box\":\"background\"==d.name&&(e.setFillStyle(d.color),e.fillRect(d.x,d.y,d.width,d.height));break;case\"block\":\"foreground\"==d.name&&(e.beginPath(),e.rect(Math.round(d.x)+.5,Math.round(d.y)+.5,Math.round(d.width),Math.round(d.height)),e.closePath(),e.fillStyle=d.color,e.fill(),e.strokeStyle=d.color,e.stroke());break;case\"image\":if(\"backgroundImage\"===d.name){var s=d.x,g=d.y,l=d.width,h=d.height,c=d.borderRadius;l<2*c&&(c=l/2),h<2*c&&(c=h/2),e.globalAlpha=d.alpha,e.beginPath(),e.moveTo(s+c,g),e.arcTo(s+l,g,s+l,g+h,c),e.arcTo(s+l,g+h,s,g+h,c),e.arcTo(s,g+h,s,g,c),e.arcTo(s,g,s+l,g,c),e.closePath(),e.strokeStyle=\"rgba(0,0,0,0)\",e.stroke(),e.clip();try{var m=await u.loadImage(d.imageSrc);e.drawImage(m,d.x,d.y,d.width,d.height)}catch(o){throw console.error(`[uQRCode]: ${d.imageSource} invalid!`),new a(`[uQRCode]: ${d.imageSource} invalid!`)}}else if(\"foregroundImage\"===d.name){s=d.x,g=d.y,l=d.width,h=d.height,c=d.borderRadius;l<2*c&&(c=l/2),h<2*c&&(c=h/2);var f=d.x-d.padding,v=d.y-d.padding,C=d.width+2*d.padding,p=d.height+2*d.padding,b=C/l*c;C<2*b&&(b=C/2),p<2*b&&(b=p/2),e.save(),e.shadowOffsetX=d.shadowOffsetX,e.shadowOffsetY=d.shadowOffsetY,e.shadowBlur=d.shadowBlur,e.shadowColor=d.shadowColor,e.beginPath(),e.moveTo(f+b,v),e.arcTo(f+C,v,f+C,v+p,b),e.arcTo(f+C,v+p,f,v+p,b),e.arcTo(f,v+p,f,v,b),e.arcTo(f,v,f+C,v,b),e.closePath(),e.setFillStyle(d.backgroundColor),e.fill(),e.restore(),e.beginPath(),e.moveTo(f+b,v),e.arcTo(f+C,v,f+C,v+p,b),e.arcTo(f+C,v+p,f,v+p,b),e.arcTo(f,v+p,f,v,b),e.arcTo(f,v,f+C,v,b),e.closePath(),e.setFillStyle(d.padding>0?d.backgroundColor:\"rgba(0,0,0,0)\"),e.fill(),e.beginPath(),e.moveTo(s+c,g),e.arcTo(s+l,g,s+l,g+h,c),e.arcTo(s+l,g+h,s,g+h,c),e.arcTo(s,g+h,s,g,c),e.arcTo(s,g,s+l,g,c),e.closePath(),e.strokeStyle=\"rgba(0,0,0,0)\",e.stroke(),e.clip();try{m=await u.loadImage(d.imageSrc);e.drawImage(m,d.x,d.y,d.width,d.height)}catch(o){throw console.error(`[uQRCode]: ${d.imageSource} invalid!`),new a(`[uQRCode]: ${d.imageSource} invalid!`)}}}i&&e.draw(!0),e.restore()}}},uQRCode=u,uQRCode.export=function(){var o,e;o=\"undefined\"!=typeof window?window:global,e=uQRCode,\"undefined\"!=typeof module&&\"object\"==typeof exports?module.exports=e:\"function\"==typeof define&&(define.amd||define.cmd)?define(function(){return e}):o.UQRCode=e}}();\n//---------------------------------------------------------------------\n// 默认导出方式，非vite(vue3)使用该方式。\n// ↓\n//---------------------------------------------------------------------\n// uQRCode.export();\n//---------------------------------------------------------------------\n// ES6导出方式，vite(vue3)使用该方式。\n// ↓\n//---------------------------------------------------------------------\nexport default uQRCode;"
  },
  {
    "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/package.json",
    "content": "{\n  \"id\": \"Sansnn-uQRCode\",\n  \"displayName\": \"uQRCode 全端二维码生成插件 支持nvue 支持nodejs服务端\",\n  \"version\": \"3.6.5\",\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    \"category\": [\n      \"JS SDK\",\n      \"通用 SDK\"\n    ],\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  },\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/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://doc.uqrcode.cn/mp_weixin_code.jpg)\n\n## 设计器模板示例\n\n![uQRCode设计器](https://doc.uqrcode.cn/yz_1.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_2.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_3.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_4.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_5.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_6.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_7.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_8.png)\n![uQRCode设计器](https://doc.uqrcode.cn/yz_9.png)\n\n# 快速上手\n\n> 在`uni-app`中，我们更推荐使用组件方式来生成二维码，组件方式大大提高了页面的可读性以及避开了一些平台容易出问题的地方，当组件无法满足需求的时候，再考虑切换成原生方式。\n\n官方文档：[https://doc.uqrcode.cn](https://doc.uqrcode.cn)。\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://doc.uqrcode.cn/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``` html\n<canvas id=\"qrcode\" width=\"200\" height=\"200\"></canvas>\n```\n\n- JS部分\n``` javascript\n// 获取uQRCode实例\nvar qr = new UQRCode();\n// 设置二维码内容\nqr.data = \"https://doc.uqrcode.cn\";\n// 设置二维码大小，必须与canvas设置的宽高一致\nqr.size = 200;\n// 调用制作二维码方法\nqr.make();\n// 获取canvas元素\nvar canvas = document.getElementById(\"qrcode\");\n// 获取canvas上下文\nvar canvasContext = canvas.getContext(\"2d\");\n// 设置uQRCode实例的canvas上下文\nqr.canvasContext = canvasContext;\n// 调用绘制方法将二维码图案绘制到canvas上\nqr.drawCanvas();\n```\n\n### 高级用法\n\n考虑到部分平台可能不支持`canvas`，所以`uQRCode`并没有强制要求和`canvas`一起使用，您还可以选择其他方式来生成二维码，例如使用`js`操作`dom`进行绘制或是使用`svg`绘制等。以下是示例：\n\n- js操作dom\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://doc.uqrcode.cn\";\n    // 设置二维码大小，必须与canvas设置的宽高一致\n    qr.size = 200;\n    // 设置二维码前景图，可以是路径\n    qr.foregroundImageSrc =\n        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAC3xJREFUeJztnd1vFNcZxodSJ3y3EL7SYIQwu15wI5FSAkqVkISKgEkuSIEC6127RrloL9r8D4n5UFUZp/9C24A/okqUOzCmSdoohQtkXIkiRS1VC7YQF41Kbe/unL7PzHt2z45ndnZmd1l75hzrSSwzMzvn+c15z8ee3dcwdIlkWaRlqSnF62a+4dDiiMtZ36cKyc183NQ3WS2sZ2IqWX/phwTWEDhuEKT5S0hLSctJK1grWasiLllPWe9l7MUSowTJDU7oopKVICSEZXwz3yKtJj1HWkdaT9pA2hgTbeA6r2MPVrMnEpCEI8HU1FpUGC18cbQEPB1r+Ea+Q2olbSFtJbWREqxkxCXr2cZ1hwebSM+zN2vYq+XsXYtRQ2uRJ8hWgaa4kl8ET0Ur30SK9F3STtL3SLtJL5P2kPZGXHu4rru57vCgg9TO3mxir1azd0uNUmuRUALBWKzAAOm1pBcM+4nYwTeBG3uNtJ/0FukQqZP0NuudiErWr5PrfID0JulVwwb1Enu0lT1byx6qUKpqJWoH3qLAQIzcbNhNFU/CKwzhMOld0o9JaVKW1EP6CamXdDqi6uU69nCdUffjpCPsyZvs0U72bDN7KKHI8OULRcIAQcQ9NDXQRYhCeNpF2ocXPXjw4M8uX748eP/+/b9NT08/ETEv8ABekCcXDx069FMGs489SzGUtezpEqPK0KWGKnRGiH8vMGVc+I1UKnXy3r17N5ttwHwvd+/e/bKjo+Mkt5bvG3bfAi/RD69gj2Ur8YQhO/Il3LzQKbVx09t35MiR9x4/fvzvZld2oRTy6l8HDhxAiHvdsPsVeInhMobGSw2fvkTtO5YxSYQqdE6Ih4cnJiY+b3YlF1q5ffv2p4Y9APiBYY/CELqe4wj0TKWwpYYrxLn1TBSjqf1Hjx79eYGK3w1sGz4VK/kVeHbs2LFfkIc/ZC/b2FtEoGcrhS01XKFJYdKHzghD28NjY2N/0BDCwSHvrnAreYU9RV/ybUfY8gSyVAlXmPRhnvHuw4cP/65hhIPy4MGDf5CHPzLsUdeLHLbWVAKi9h/LOcZtMezOHPONE25D22ZXfr7KWeAdeXiSw9ZO9nYte91iuPQjEgj6DwzJMInBLBNDXczA07p1hAeCQh52sZe7lH5EDn99geDgbYa9ToOlgayGURsU8rCbvdzN3voCUUdYmH9gJRPrMphx9mggNQPpYS/3sLcb2GvXCaITyEYFCEYHvRpIzUB62UsJZGO1QFbxwVgu2auB1B3IXvZ2I3sdGAiWm09rIDUDOc1eaiAaSEWlHQp7ntc1Kh0XRlEHMtQ1V2HPm3N+uvJxYRQSyoIB0j6Ymash/0onyBy3c5MkeUzS45haFFEg9pOLCk6LgsgJs0xPxKxIDbu1lNITn7l2hs7N0U/p/Bn6vf/OkEgM28dcuDMy59rhlbfuKzmUCdaSFxoQVNZZUHk/INlrZ+mo8tV/k34GCMI2BvLRnU/mXDt8MQlHLs5AMhWBdI+e00CeJpDtw9lQQD7SQBoBJCdSQ+FaSHVA5r6m/xExB6KOtBIj6boBMemUWTNntUIvTZP1pmnOuboG0gAgOKebBgQpeu3UYNZVHRd7ilA0kAYDwTHZ0TPWtXBdN7XTuTlqRc4zNZAGAelmIF73ZwPJayBOICUQ9evUqwYiNBAFCM3U6d+bBSTlASSngTSrhaTFZ1Pj4k+TE+LPk39lTYhPJ8et9bEYAslb85BmAYESCJmkJC9YQok4LC66AUGsbqfhpysQa42ri0ZKtY6yqrxPfj0oEd3l98pA/idmRM+1cyJ7vc9Tv/ziY5rgFQhJ6fzq5iGmOP+X34nM9Q+L18qQuki7fv9e8f4y1z4Q6bEPRfqPfSJ9g/597Az9rY+um41fyMKELFeA2bbhc1UQecAwTQtCECA4JmedW37tWfpv1/UPrPtDuHwi/kvwgM8Wjp+hR2X7pTgC4Se5UjGLP+V/81/LkhDKC/6GloJ7w7B31pwph02/YrJovUkVNyDVFJNNDA7EvRSB0HlJC0hOOJcY8zRZTGkg7sVUJP9gAxkuARkPCGS0z+q4k4MAMivKgJgxATLDz3mYH+eZCEMDAMKGDYyPVH0tvBUMIEkJhPqLvBBlr5WnMLb9UoRHWRjb908Mi4GJESvU1KZhC8YJ6pgTDCRNIylce8DnXBxzge7jjSvv88QvI341fkn00/UusHD9/vFhe6YePSAlJZRxfs0aknMFBXzA8+VWn4TrvYar44ICUvd9U04goc4PvyFuAQNJW+HhghU2Pqld1IGjz0CYkrsM0zRqCnc995DYf2eQW3TwXYzzHEjtoyy30uhdJ7Fd7Q1vmd4GVCzzBYjeBsRFA4kwEGzVyftMGPPFlaxgi4s4vGD6Xd1l4miaYpomhqUN17Hp1E1rHQlbdbKjZ0W3m66fE+e//K29ahsQCGCcvfUbmpWfcb+2i3AfOB7L720jJwPWdcED4XcMBzOe23QgLJXbS+gqyiqACNMyN1FhG5Cr6Pi2EfcJY2yAVLoG1p0KjnPr+RZuvRURIN4fLfMC4jfs1UBqAeK5tNFlvfWqgTxFIDsuZSt+tKyHOli87ZoXpbdhc9YnqJT3QzSQ+gCBaV8U90O5a+irMWolNPLB5gP8n0JYF+n1K+8XW5IGUicg1ZTPpyZEu/WhHu9VWw2kKUBcOv0KQDAl7L16TrQPZQKqy9px0jYS7jPr8QEyZzPdqcothF5umrDMWgshwX7+Y20D6o7f0ollnB+QyQnryW0LCoShlJZdqhP2is0QyFiuZeG7TnPWNrWCpz6bvE1AsmRQt/UBUfyOkJL0AVJLwagudkBMq+Kz4sWPs9b+3hSMdihFELJXz1trXnkIXx5g5kUuVxAD40MaSG1A8qIsNNDPDJmMz/p5rTfh/OzVPguCiaVhbCnFulbBFL8eL98G5Ni9FbogzM2aCFmnot2pP6HIPGt9IkRqRnxtPqF/6/asNBb4eq7iqzVmLJOKn6Cl3/uphST4Kb5AcMo/YVuoQXnxNb3ijsFgLWOBACk9ZUk5rEQ/MIw+ICO2Y9lkxP989BkpGvWkBruLn6BNKMNf/J4sqqs2DWWs19kazeV3RRW38TTgvCZJA5lnWjhAYiINZJ6pkUD018TWB0jor4nVX6TcWCCBv0hZf9V4Y4D0GAG/alx/GX9jgQT+Mn6drqJBMBiIM13FumqA6IQuDQDikdBFJgZzTegiociUR8hfWJbyaGpq6p+6lQSHgRIm5ZEKRCYFQ9bjYlKwGzdu6KRgIWCguCQFQ8K1qpKCqSOt9dyPICHi/uPHj+u0eQEgyALPkHLQmJs2Dx77ps2rlFiy89atW9d870CXsnLz5s1RpXUETiyphi2ZehWtxEq9unnz5mOPHj263+xKLpQyOTn5VWtrKzJp7zPKU6/KrNG+abzVsOWanLijo+OETk7sX+AREjkb7smJZevwDFfOsAVyiG9e6bs7OX33RZ2+2y5K+u5LnL6706hT+m61L1ET3Lca7gnukdRdJ7ivnOC+1QiZ4F6FIkOXhAK6aHKIg+joMWLAkPg1vgHMQrE0gCfjbdY7EZWsXyfX+QB78Kphr1W9xB5tZc/WKjDgqW/f4SxqBy+hoKkh/qGj38QvhriIySOeBADCOs3LfFN7I649XNfdXHd40MGebGWP4NVq9k6F4Ruq3IraUtDEEPfQGYE0wGAsjckjmuMWvgm0ngQrGXHJerZx3bewF8+zN2vYK3j2rBEwTLmVRUY5FNlaAAbzFFDHjB5PAMbV6/hG8FRsjIk2cJ3XsQer2ZOV7NESo9QqVBihgMiidvQSTItRgoOmiKdgBWsla1XEJesp672MvZAQWowSCBmiagKhlkUOqXAkIAkpjpL1l344IdQVhrM4X0SFpGpxxOWsr5cvTSleNxM36RK18n+GJEwNAYal3QAAAABJRU5ErkJggg==';\n    // 调用制作二维码方法\n    qr.make();\n\n    // 遍历drawModules创建dom元素\n    var qrHtml = '';\n    for (var i = 0; i < qr.drawModules.length; i++) {\n        var drawModule = qr.drawModules[i];\n        switch (drawModule.type) {\n        case 'block':\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://doc.uqrcode.cn\";\n    // 设置二维码大小，必须与canvas设置的宽高一致\n    qr.size = 200;\n    // 设置二维码前景图，可以是路径\n    qr.foregroundImageSrc =\n        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAC3xJREFUeJztnd1vFNcZxodSJ3y3EL7SYIQwu15wI5FSAkqVkISKgEkuSIEC6127RrloL9r8D4n5UFUZp/9C24A/okqUOzCmSdoohQtkXIkiRS1VC7YQF41Kbe/unL7PzHt2z45ndnZmd1l75hzrSSwzMzvn+c15z8ee3dcwdIlkWaRlqSnF62a+4dDiiMtZ36cKyc183NQ3WS2sZ2IqWX/phwTWEDhuEKT5S0hLSctJK1grWasiLllPWe9l7MUSowTJDU7oopKVICSEZXwz3yKtJj1HWkdaT9pA2hgTbeA6r2MPVrMnEpCEI8HU1FpUGC18cbQEPB1r+Ea+Q2olbSFtJbWREqxkxCXr2cZ1hwebSM+zN2vYq+XsXYtRQ2uRJ8hWgaa4kl8ET0Ur30SK9F3STtL3SLtJL5P2kPZGXHu4rru57vCgg9TO3mxir1azd0uNUmuRUALBWKzAAOm1pBcM+4nYwTeBG3uNtJ/0FukQqZP0NuudiErWr5PrfID0JulVwwb1Enu0lT1byx6qUKpqJWoH3qLAQIzcbNhNFU/CKwzhMOld0o9JaVKW1EP6CamXdDqi6uU69nCdUffjpCPsyZvs0U72bDN7KKHI8OULRcIAQcQ9NDXQRYhCeNpF2ocXPXjw4M8uX748eP/+/b9NT08/ETEv8ABekCcXDx069FMGs489SzGUtezpEqPK0KWGKnRGiH8vMGVc+I1UKnXy3r17N5ttwHwvd+/e/bKjo+Mkt5bvG3bfAi/RD69gj2Ur8YQhO/Il3LzQKbVx09t35MiR9x4/fvzvZld2oRTy6l8HDhxAiHvdsPsVeInhMobGSw2fvkTtO5YxSYQqdE6Ih4cnJiY+b3YlF1q5ffv2p4Y9APiBYY/CELqe4wj0TKWwpYYrxLn1TBSjqf1Hjx79eYGK3w1sGz4VK/kVeHbs2LFfkIc/ZC/b2FtEoGcrhS01XKFJYdKHzghD28NjY2N/0BDCwSHvrnAreYU9RV/ybUfY8gSyVAlXmPRhnvHuw4cP/65hhIPy4MGDf5CHPzLsUdeLHLbWVAKi9h/LOcZtMezOHPONE25D22ZXfr7KWeAdeXiSw9ZO9nYte91iuPQjEgj6DwzJMInBLBNDXczA07p1hAeCQh52sZe7lH5EDn99geDgbYa9ToOlgayGURsU8rCbvdzN3voCUUdYmH9gJRPrMphx9mggNQPpYS/3sLcb2GvXCaITyEYFCEYHvRpIzUB62UsJZGO1QFbxwVgu2auB1B3IXvZ2I3sdGAiWm09rIDUDOc1eaiAaSEWlHQp7ntc1Kh0XRlEHMtQ1V2HPm3N+uvJxYRQSyoIB0j6Ymash/0onyBy3c5MkeUzS45haFFEg9pOLCk6LgsgJs0xPxKxIDbu1lNITn7l2hs7N0U/p/Bn6vf/OkEgM28dcuDMy59rhlbfuKzmUCdaSFxoQVNZZUHk/INlrZ+mo8tV/k34GCMI2BvLRnU/mXDt8MQlHLs5AMhWBdI+e00CeJpDtw9lQQD7SQBoBJCdSQ+FaSHVA5r6m/xExB6KOtBIj6boBMemUWTNntUIvTZP1pmnOuboG0gAgOKebBgQpeu3UYNZVHRd7ilA0kAYDwTHZ0TPWtXBdN7XTuTlqRc4zNZAGAelmIF73ZwPJayBOICUQ9evUqwYiNBAFCM3U6d+bBSTlASSngTSrhaTFZ1Pj4k+TE+LPk39lTYhPJ8et9bEYAslb85BmAYESCJmkJC9YQok4LC66AUGsbqfhpysQa42ri0ZKtY6yqrxPfj0oEd3l98pA/idmRM+1cyJ7vc9Tv/ziY5rgFQhJ6fzq5iGmOP+X34nM9Q+L18qQuki7fv9e8f4y1z4Q6bEPRfqPfSJ9g/597Az9rY+um41fyMKELFeA2bbhc1UQecAwTQtCECA4JmedW37tWfpv1/UPrPtDuHwi/kvwgM8Wjp+hR2X7pTgC4Se5UjGLP+V/81/LkhDKC/6GloJ7w7B31pwph02/YrJovUkVNyDVFJNNDA7EvRSB0HlJC0hOOJcY8zRZTGkg7sVUJP9gAxkuARkPCGS0z+q4k4MAMivKgJgxATLDz3mYH+eZCEMDAMKGDYyPVH0tvBUMIEkJhPqLvBBlr5WnMLb9UoRHWRjb908Mi4GJESvU1KZhC8YJ6pgTDCRNIylce8DnXBxzge7jjSvv88QvI341fkn00/UusHD9/vFhe6YePSAlJZRxfs0aknMFBXzA8+VWn4TrvYar44ICUvd9U04goc4PvyFuAQNJW+HhghU2Pqld1IGjz0CYkrsM0zRqCnc995DYf2eQW3TwXYzzHEjtoyy30uhdJ7Fd7Q1vmd4GVCzzBYjeBsRFA4kwEGzVyftMGPPFlaxgi4s4vGD6Xd1l4miaYpomhqUN17Hp1E1rHQlbdbKjZ0W3m66fE+e//K29ahsQCGCcvfUbmpWfcb+2i3AfOB7L720jJwPWdcED4XcMBzOe23QgLJXbS+gqyiqACNMyN1FhG5Cr6Pi2EfcJY2yAVLoG1p0KjnPr+RZuvRURIN4fLfMC4jfs1UBqAeK5tNFlvfWqgTxFIDsuZSt+tKyHOli87ZoXpbdhc9YnqJT3QzSQ+gCBaV8U90O5a+irMWolNPLB5gP8n0JYF+n1K+8XW5IGUicg1ZTPpyZEu/WhHu9VWw2kKUBcOv0KQDAl7L16TrQPZQKqy9px0jYS7jPr8QEyZzPdqcothF5umrDMWgshwX7+Y20D6o7f0ollnB+QyQnryW0LCoShlJZdqhP2is0QyFiuZeG7TnPWNrWCpz6bvE1AsmRQt/UBUfyOkJL0AVJLwagudkBMq+Kz4sWPs9b+3hSMdihFELJXz1trXnkIXx5g5kUuVxAD40MaSG1A8qIsNNDPDJmMz/p5rTfh/OzVPguCiaVhbCnFulbBFL8eL98G5Ni9FbogzM2aCFmnot2pP6HIPGt9IkRqRnxtPqF/6/asNBb4eq7iqzVmLJOKn6Cl3/uphST4Kb5AcMo/YVuoQXnxNb3ijsFgLWOBACk9ZUk5rEQ/MIw+ICO2Y9lkxP989BkpGvWkBruLn6BNKMNf/J4sqqs2DWWs19kazeV3RRW38TTgvCZJA5lnWjhAYiINZJ6pkUD018TWB0jor4nVX6TcWCCBv0hZf9V4Y4D0GAG/alx/GX9jgQT+Mn6drqJBMBiIM13FumqA6IQuDQDikdBFJgZzTegiociUR8hfWJbyaGpq6p+6lQSHgRIm5ZEKRCYFQ9bjYlKwGzdu6KRgIWCguCQFQ8K1qpKCqSOt9dyPICHi/uPHj+u0eQEgyALPkHLQmJs2Dx77ps2rlFiy89atW9d870CXsnLz5s1RpXUETiyphi2ZehWtxEq9unnz5mOPHj263+xKLpQyOTn5VWtrKzJp7zPKU6/KrNG+abzVsOWanLijo+OETk7sX+AREjkb7smJZevwDFfOsAVyiG9e6bs7OX33RZ2+2y5K+u5LnL6706hT+m61L1ET3Lca7gnukdRdJ7ivnOC+1QiZ4F6FIkOXhAK6aHKIg+joMWLAkPg1vgHMQrE0gCfjbdY7EZWsXyfX+QB78Kphr1W9xB5tZc/WKjDgqW/f4SxqBy+hoKkh/qGj38QvhriIySOeBADCOs3LfFN7I649XNfdXHd40MGebGWP4NVq9k6F4Ruq3IraUtDEEPfQGYE0wGAsjckjmuMWvgm0ngQrGXHJerZx3bewF8+zN2vYK3j2rBEwTLmVRUY5FNlaAAbzFFDHjB5PAMbV6/hG8FRsjIk2cJ3XsQer2ZOV7NESo9QqVBihgMiidvQSTItRgoOmiKdgBWsla1XEJesp672MvZAQWowSCBmiagKhlkUOqXAkIAkpjpL1l344IdQVhrM4X0SFpGpxxOWsr5cvTSleNxM36RK18n+GJEwNAYal3QAAAABJRU5ErkJggg==';\n    // 调用制作二维码方法\n    qr.make();\n\n    // 遍历drawModules创建svg元素\n    var qrHtml = '';\n    for (var i = 0; i < qr.drawModules.length; i++) {\n        var drawModule = qr.drawModules[i];\n        switch (drawModule.type) {\n        case 'block':\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://doc.uqrcode.cn/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://doc.uqrcode.cn/document/uni-app.html#options) 。\n\n``` html\n<uqrcode ref=\"uqrcode\" canvas-id=\"qrcode\" value=\"https://doc.uqrcode.cn\" :options=\"{ margin: 10 }\"></uqrcode>\n```\n\n### 导出临时文件路径\n\n为了保证方法调用成功，请在 [complete](https://doc.uqrcode.cn/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://doc.uqrcode.cn/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://doc.uqrcode.cn](https://doc.uqrcode.cn)。"
  },
  {
    "path": "uni_modules/mp-html/README.md",
    "content": "## 为减小组件包的大小，默认组件包中不包含编辑、latex 公式等扩展功能，需要使用扩展功能的请参考下方的 插件扩展 栏的说明\n\n## 功能介绍\n- 全端支持（含 `v3、NVUE`）\n- 支持丰富的标签（包括 `table`、`video`、`svg` 等）\n- 支持丰富的事件效果（自动预览图片、链接处理等）\n- 支持设置占位图（加载中、出错时、预览时）\n- 支持锚点跳转、长按复制等丰富功能\n- 支持大部分 *html* 实体\n- 丰富的插件（关键词搜索、内容编辑、`latex` 公式等）\n- 效率高、容错性强且轻量化\n\n查看 [功能介绍](https://jin-yufeng.gitee.io/mp-html/#/overview/feature) 了解更多\n\n## 使用方法\n- `uni_modules` 方式  \n  1. 点击右上角的 `使用 HBuilder X 导入插件` 按钮直接导入项目或点击 `下载插件 ZIP` 按钮下载插件包并解压到项目的 `uni_modules/mp-html` 目录下  \n  2. 在需要使用页面的 `(n)vue` 文件中添加  \n     ```html\n     <!-- 不需要引入，可直接使用 -->\n     <mp-html :content=\"html\" />\n     ```\n     ```javascript\n     export default {\n       data() {\n         return {\n           html: '<div>Hello World!</div>'\n         }\n       }\n     }\n     ```\n  3. 需要更新版本时在 `HBuilder X` 中右键 `uni_modules/mp-html` 目录选择 `从插件市场更新` 即可  \n\n- 源码方式  \n  1. 从 [github](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 或 [gitee](https://gitee.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 下载源码  \n     插件市场的 **非 uni_modules 版本** 无法更新，不建议从插件市场获取  \n  2. 在需要使用页面的 `(n)vue` 文件中添加  \n     ```html\n     <mp-html :content=\"html\" />\n     ```\n     ```javascript\n     import mpHtml from '@/components/mp-html/mp-html'\n     export default {\n       // HBuilderX 2.5.5+ 可以通过 easycom 自动引入\n       components: {\n         mpHtml\n       },\n       data() {\n         return {\n           html: '<div>Hello World!</div>'\n         }\n       }\n     }\n     ```\n\n- npm 方式  \n  1. 在项目根目录下执行  \n     ```bash\n     npm install mp-html\n     ```\n  2. 在需要使用页面的 `(n)vue` 文件中添加  \n     ```html\n     <mp-html :content=\"html\" />\n     ```\n     ```javascript\n     import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html'\n     export default {\n       // 不可省略\n       components: {\n         mpHtml\n       },\n       data() {\n         return {\n           html: '<div>Hello World!</div>'\n         }\n       }\n     }\n     ```\n  3. 需要更新版本时执行以下命令即可  \n     ```bash\n     npm update mp-html\n     ```\n  \n  使用 *cli* 方式运行的项目，通过 *npm* 方式引入时，需要在 *vue.config.js* 中配置 *transpileDependencies*，详情可见 [#330](https://github.com/jin-yufeng/mp-html/issues/330#issuecomment-913617687)  \n  如果在 **nvue** 中使用还要将 `dist/uni-app/static` 目录下的内容拷贝到项目的 `static` 目录下，否则无法运行  \n\n查看 [快速开始](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart) 了解更多\n\n## 组件属性\n\n| 属性 | 类型 | 默认值 | 说明 |\n|:---:|:---:|:---:|---|\n| container-style | String |  | 容器的样式（[2.1.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v210)） |\n| content | String |  | 用于渲染的 html 字符串 |\n| copy-link | Boolean | true | 是否允许外部链接被点击时自动复制 |\n| domain | String |  | 主域名（用于链接拼接） |\n| error-img | String |  | 图片出错时的占位图链接 |\n| lazy-load | Boolean | false | 是否开启图片懒加载 |\n| loading-img | String |  | 图片加载过程中的占位图链接 |\n| pause-video | Boolean | true | 是否在播放一个视频时自动暂停其他视频 |\n| preview-img | Boolean | true | 是否允许图片被点击时自动预览 |\n| scroll-table | Boolean | false | 是否给每个表格添加一个滚动层使其能单独横向滚动 |\n| selectable | Boolean | false | 是否开启文本长按复制 |\n| set-title | Boolean | true | 是否将 title 标签的内容设置到页面标题 |\n| show-img-menu | Boolean | true | 是否允许图片被长按时显示菜单 |\n| tag-style | Object |  | 设置标签的默认样式 |\n| use-anchor | Boolean | false | 是否使用锚点链接 |\n\n查看 [属性](https://jin-yufeng.gitee.io/mp-html/#/basic/prop) 了解更多\n\n## 组件事件\n\n| 名称 | 触发时机 |\n|:---:|---|\n| load | dom 树加载完毕时 |\n| ready | 图片加载完毕时 |\n| error | 发生渲染错误时 |\n| imgtap | 图片被点击时 |\n| linktap | 链接被点击时 |\n| play | 音视频播放时 |\n\n查看 [事件](https://jin-yufeng.gitee.io/mp-html/#/basic/event) 了解更多\n\n## api\n组件实例上提供了一些 `api` 方法可供调用\n\n| 名称 | 作用 |\n|:---:|---|\n| in | 将锚点跳转的范围限定在一个 scroll-view 内 |\n| navigateTo | 锚点跳转 |\n| getText | 获取文本内容 |\n| getRect | 获取富文本内容的位置和大小 |\n| setContent | 设置富文本内容 |\n| imgList | 获取所有图片的数组 |\n| pauseMedia | 暂停播放音视频（[2.2.2+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v222)） |\n| setPlaybackRate | 设置音视频播放速率（[2.4.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v240)） |\n\n查看 [api](https://jin-yufeng.gitee.io/mp-html/#/advanced/api) 了解更多\n\n## 插件扩展  \n除基本功能外，本组件还提供了丰富的扩展，可按照需要选用\n\n| 名称 | 作用 |\n|:---:|---|\n| audio | 音乐播放器 |\n| editable | 富文本 **编辑**（[示例项目](https://mp-html.oss-cn-hangzhou.aliyuncs.com/editable.zip)） |\n| emoji | 解析 emoji |\n| highlight | 代码块高亮显示 |\n| markdown | 渲染 markdown |\n| search | 关键词搜索 |\n| style | 匹配 style 标签中的样式 |\n| txv-video | 使用腾讯视频 |\n| img-cache | 图片缓存 by [@PentaTea](https://github.com/PentaTea) |\n| latex | 渲染 latex 公式 by [@Zeng-J](https://github.com/Zeng-J) |\n\n从插件市场导入的包中 **不含有** 扩展插件，使用插件需通过微信小程序 `富文本插件` 获取或参考以下方法进行打包：  \n1. 获取完整组件包  \n   ```bash\n   npm install mp-html\n   ```\n2. 编辑 `tools/config.js` 中的 `plugins` 项，选择需要的插件  \n3. 生成新的组件包  \n   在 `node_modules/mp-html` 目录下执行  \n   ```bash\n   npm install\n   npm run build:uni-app\n   ```\n4. 拷贝 `dist/uni-app` 中的内容到项目根目录  \n\n查看 [插件](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin) 了解更多\n\n## 关于 nvue\n`nvue` 使用原生渲染，不支持部分 `css` 样式，为实现和 `html` 相同的效果，组件内部通过 `web-view` 进行渲染，性能上差于原生，根据 `weex` 官方建议，`web` 标签仅应用在非常规的降级场景。因此，如果通过原生的方式（如 `richtext`）能够满足需要，则不建议使用本组件，如果有较多的富文本内容，则可以直接使用 `vue` 页面  \n由于渲染方式与其他端不同，有以下限制：  \n1. 不支持 `lazy-load` 属性\n2. 视频不支持全屏播放\n3. 如果在 `flex-direction: row` 的容器中使用，需要给组件设置宽度或设置 `flex: 1` 占满剩余宽度\n\n纯 `nvue` 模式下，[此问题](https://ask.dcloud.net.cn/question/119678) 修复前，不支持通过 `uni_modules` 引入，需要本地引入（将 [dist/uni-app](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 中的内容拷贝到项目根目录下）  \n\n## 立即体验\n![富文本插件](https://mp-html.oss-cn-hangzhou.aliyuncs.com/qrcode.jpg)\n\n## 问题反馈\n遇到问题时，请先查阅 [常见问题](https://jin-yufeng.gitee.io/mp-html/#/question/faq) 和 [issue](https://github.com/jin-yufeng/mp-html/issues) 中是否已有相同的问题  \n可通过 [issue](https://github.com/jin-yufeng/mp-html/issues/new/choose) 、插件问答或发送邮件到 [mp_html@126.com](mailto:mp_html@126.com) 提问，不建议在评论区提问（不方便回复）  \n提问请严格按照 [issue 模板](https://github.com/jin-yufeng/mp-html/issues/new/choose) ，描述清楚使用环境、`html` 内容或可复现的 `demo` 项目以及复现方式，对于 **描述不清**、**无法复现** 或重复的问题将不予回复  \n\n欢迎加入 `QQ` 交流群：`699734691`  \n\n查看 [问题反馈](https://jin-yufeng.gitee.io/mp-html/#/question/feedback) 了解更多\n"
  },
  {
    "path": "uni_modules/mp-html/changelog.md",
    "content": "## v2.4.0（2022-08-27）\n1. `A` 增加了 [setPlaybackRate](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#setPlaybackRate) 的 `api`，可以设置音视频的播放速率 [详细](https://github.com/jin-yufeng/mp-html/issues/452)\n2. `A` 示例小程序代码开源 [详细](https://github.com/jin-yufeng/mp-html-demo)\n3. `U` 优化 `ready` 事件触发时机，未设置懒加载的情况下基本可以准确触发 [详细](https://github.com/jin-yufeng/mp-html/issues/195)\n4. `U` `highlight` 插件在编辑状态下不进行高亮处理，便于编辑\n5. `F` 修复了 `flex` 布局下图片大小可能不正确的问题\n6. `F` 修复了 `selectable` 属性没有设置 `force` 也可能出现渲染异常的问题\n7. `F` 修复了表格中的图片大小可能不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/448)\n8. `F` 修复了含有合并单元格的表格可能无法设置竖直对齐的问题\n9. `F` 修复了 `editable` 插件在 `scroll-view` 中使用时工具条位置可能不正确的问题\n10. `F` 修复了 `vue3` 使用 [search](advanced/plugin#search) 插件可能导致错误换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/449)\n## v2.3.2（2022-08-13）\n1. `A` 增加 [latex](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#latex) 插件，可以渲染数学公式 [详细](https://github.com/jin-yufeng/mp-html/pull/447) by [@Zeng-J](https://github.com/Zeng-J)\n2. `U` 优化根节点下有很多标签的长内容渲染速度\n3. `U` `highlight` 插件适配 `lang-xxx` 格式\n4. `F` 修复了 `table` 标签设置 `border` 属性后可能无法修改边框样式的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/439) by [@zouxingjie](https://github.com/zouxingjie)\n5. `F` 修复了 `editable` 插件输入连续空格无效的问题\n6. `F` 修复了 `vue3` 图片设置 `inline` 会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/438)\n7. `F` 修复了 `vue3` 使用 `table` 可能报错的问题\n## v2.3.1（2022-05-20）\n1. `U` `app` 端支持使用本地图片\n2. `U` 优化了微信小程序 `selectable` 属性在 `ios` 端的处理 [详细](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable)\n3. `F` 修复了 `editable` 插件不在顶部时 `tooltip` 位置可能错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/430)\n4. `F` 修复了 `vue3` 运行到微信小程序可能报错丢失内容的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/414)\n5. `F` 修复了 `vue3` 部分标签可能被错误换行的问题\n6. `F` 修复了 `editable` 插件 `app` 端插入视频无法预览的问题\n## v2.3.0（2022-04-01）\n1. `A` 增加了 `play` 事件，音视频播放时触发，可用于与页面其他音视频进行互斥播放 [详细](basic/event#play)\n2. `U` `show-img-menu` 属性支持控制预览时是否长按弹出菜单\n3. `U` 优化 `wxs` 处理，提高渲染性能 [详细](https://developers.weixin.qq.com/community/develop/article/doc/0006cc2b204740f601bd43fa25a413)  \n4. `U` `video` 标签支持 `object-fit` 属性\n5. `U` 增加支持一些常用实体编码 [详细](https://github.com/jin-yufeng/mp-html/issues/418)\n6. `F` 修复了图片仅设置高度可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/410)\n7. `F` 修复了 `video` 标签高度设置为 `auto` 不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/411)\n8. `F` 修复了使用 `grid` 布局时可能样式错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/413)\n9. `F` 修复了含有合并单元格的表格部分情况下显示异常的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/417)\n10. `F` 修复了 `editable` 插件连续插入内容时顺序不正确的问题\n11. `F` 修复了 `uni-app` 包 `vue3` 使用 `audio` 插件报错的问题\n12. `F` 修复了 `uni-app` 包 `highlight` 插件使用自定义的 `prism.min.js` 报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/416)\n## v2.2.2（2022-02-26）\n1. `A` 增加了 [pauseMedia](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#pauseMedia) 的 `api`，可用于暂停播放音视频 [详细](https://github.com/jin-yufeng/mp-html/issues/317)\n2. `U` 优化了长内容的加载速度  \n3. `U` 适配 `vue3` [#389](https://github.com/jin-yufeng/mp-html/issues/389)、[#398](https://github.com/jin-yufeng/mp-html/pull/398) by [@zhouhuafei](https://github.com/zhouhuafei)、[#400](https://github.com/jin-yufeng/mp-html/issues/400)\n4. `F` 修复了小程序端图片高度设置为百分比时可能不显示的问题\n5. `F` 修复了 `highlight` 插件部分情况下可能显示不完整的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/403)\n## v2.2.1（2021-12-24）\n1. `A` `editable` 插件增加上下移动标签功能\n2. `U` `editable` 插件支持在文本中间光标处插入内容\n3. `F` 修复了 `nvue` 端设置 `margin` 后可能导致高度不正确的问题\n4. `F` 修复了 `highlight` 插件使用压缩版的 `prism.css` 可能导致背景失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/367)\n5. `F` 修复了编辑状态下使用 `emoji` 插件内容为空时可能报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/371)\n6. `F` 修复了使用 `editable` 插件后将 `selectable` 属性设置为 `force` 不生效的问题\n## v2.2.0（2021-10-12）\n1. `A` 增加 `customElements` 配置项，便于添加自定义功能性标签 [详细](https://github.com/jin-yufeng/mp-html/issues/350)\n2. `A` `editable` 插件增加切换音视频自动播放状态的功能 [详细](https://github.com/jin-yufeng/mp-html/pull/341) by [@leeseett](https://github.com/leeseett)\n3. `A` `editable` 插件删除媒体标签时触发 `remove` 事件，便于删除已上传的文件\n4. `U` `editable` 插件 `insertImg` 方法支持同时插入多张图片 [详细](https://github.com/jin-yufeng/mp-html/issues/342)\n5. `U` `editable` 插入图片和音视频时支持拼接 `domian` 主域名\n6. `F` 修复了内部链接参数中包含 `://` 时被认为是外部链接的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/356)\n7. `F` 修复了部分 `svg` 标签名或属性名大小写不正确时不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/351)\n8. `F` 修复了 `nvue` 页面运行到非 `app` 平台时可能样式错误的问题\n## v2.1.5（2021-08-13）\n1. `A` 增加支持标签的 `dir` 属性\n2. `F` 修复了 `ruby` 标签文字与拼音没有居中对齐的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/325)\n3. `F` 修复了音视频标签内有 `a` 标签时可能无法播放的问题\n4. `F` 修复了 `externStyle` 中的 `class` 名包含下划线或数字时可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326)\n5. `F` 修复了 `h5` 端引入 `externStyle` 可能不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326)\n## v2.1.4（2021-07-14）\n1. `F` 修复了 `rt` 标签无法设置样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/318)\n2. `F` 修复了表格中有单元格同时合并行和列时可能显示不正确的问题\n3. `F` 修复了 `app` 端无法关闭图片长按菜单的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/322)\n4. `F` 修复了 `editable` 插件只能添加图片链接不能修改的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/312) by [@leeseett](https://github.com/leeseett)\n## v2.1.3（2021-06-12）\n1. `A` `editable` 插件增加 `insertTable` 方法\n2. `U` `editable` 插件支持编辑表格中的空白单元格 [详细](https://github.com/jin-yufeng/mp-html/issues/310)\n3. `F` 修复了 `externStyle` 中使用伪类可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/298)\n4. `F` 修复了多个组件同时使用时 `tag-style` 属性时可能互相影响的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/305) by [@woodguoyu](https://github.com/woodguoyu)\n5. `F` 修复了包含 `linearGradient` 的 `svg` 可能无法显示的问题\n6. `F` 修复了编译到头条小程序时可能报错的问题\n7. `F` 修复了 `nvue` 端不触发 `click` 事件的问题\n8. `F` 修复了 `editable` 插件尾部插入时无法撤销的问题\n9. `F` 修复了 `editable` 插件的 `insertHtml` 方法只能在末尾插入的问题\n10. `F` 修复了 `editable` 插件插入音频不显示的问题\n## v2.1.2（2021-04-24）\n1. `A` 增加了 [img-cache](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#img-cache) 插件，可以在 `app` 端缓存图片 [详细](https://github.com/jin-yufeng/mp-html/issues/292) by [@PentaTea](https://github.com/PentaTea)\n2. `U` 支持通过 `container-style` 属性设置 `white-space` 来保留连续空格和换行符 [详细](https://jin-yufeng.gitee.io/mp-html/#/question/faq#space)\n3. `U` 代码风格符合 [standard](https://standardjs.com) 标准\n4. `U` `editable` 插件编辑状态下支持预览视频 [详细](https://github.com/jin-yufeng/mp-html/issues/286)\n5. `F` 修复了 `svg` 标签内嵌 `svg` 时无法显示的问题\n6. `F` 修复了编译到支付宝和头条小程序时部分区域不可复制的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/291)\n## v2.1.1（2021-04-09）\n1. 修复了对 `p` 标签设置 `tag-style` 可能不生效的问题\n2. 修复了 `svg` 标签中的文本无法显示的问题\n3. 修复了使用 `editable` 插件编辑表格时可能报错的问题\n4. 修复了使用 `highlight` 插件运行到头条小程序时可能没有样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/280)\n5. 修复了使用 `editable` 插件 `editable` 属性为 `false` 时会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/284)\n6. 修复了 `style` 插件连续子选择器失效的问题\n7. 修复了 `editable` 插件无法修改图片和字体大小的问题\n## v2.1.0.2（2021-03-21）\n修复了 `nvue` 端使用可能报错的问题\n## v2.1.0（2021-03-20）\n1. `A` 增加了 [container-style](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#container-style) 属性 [详细](https://gitee.com/jin-yufeng/mp-html/pulls/1)\n2. `A` 增加支持 `strike` 标签\n3. `A` `editable` 插件增加 `placeholder` 属性 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable)\n4. `A` `editable` 插件增加 `insertHtml` 方法 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable)\n5. `U` 外部样式支持标签名选择器 [详细](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart#setting)\n6. `F` 修复了 `nvue` 端部分情况下可能不显示的问题\n## v2.0.5（2021-03-12）\n1. `U` [linktap](https://jin-yufeng.gitee.io/mp-html/#/basic/event#linktap) 事件增加返回内部文本内容 `innerText` [详细](https://github.com/jin-yufeng/mp-html/issues/271)\n2. `U` [selectable](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) 属性设置为 `force` 时能够在微信 `iOS` 端生效（文本块会变成 `inline-block`） [详细](https://github.com/jin-yufeng/mp-html/issues/267)\n3. `F` 修复了部分情况下竖向无法滚动的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/182)\n4. `F` 修复了多次修改富文本数据时部分内容可能不显示的问题\n5. `F` 修复了 [腾讯视频](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#txv-video) 插件可能无法播放的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/265)\n6. `F` 修复了 [highlight](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#highlight) 插件没有设置高亮语言时没有应用默认样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/276) by [@fuzui](https://github.com/fuzui)\n"
  },
  {
    "path": "uni_modules/mp-html/components/mp-html/mp-html.vue",
    "content": "<template>\n  <view id=\"_root\" :class=\"(selectable?'_select ':'')+'_root'\" :style=\"containerStyle\">\n    <slot v-if=\"!nodes[0]\" />\n    <!-- #ifndef APP-PLUS-NVUE -->\n    <node v-else :childs=\"nodes\" :opts=\"[lazyLoad,loadingImg,errorImg,showImgMenu,selectable]\" name=\"span\" />\n    <!-- #endif -->\n    <!-- #ifdef APP-PLUS-NVUE -->\n    <web-view ref=\"web\" src=\"/uni_modules/mp-html/static/app-plus/mp-html/local.html\" :style=\"'margin-top:-2px;height:' + height + 'px'\" @onPostMessage=\"_onMessage\" />\n    <!-- #endif -->\n  </view>\n</template>\n\n<script>\n/**\n * mp-html v2.4.0\n * @description 富文本组件\n * @tutorial https://github.com/jin-yufeng/mp-html\n * @property {String} container-style 容器的样式\n * @property {String} content 用于渲染的 html 字符串\n * @property {Boolean} copy-link 是否允许外部链接被点击时自动复制\n * @property {String} domain 主域名，用于拼接链接\n * @property {String} error-img 图片出错时的占位图链接\n * @property {Boolean} lazy-load 是否开启图片懒加载\n * @property {string} loading-img 图片加载过程中的占位图链接\n * @property {Boolean} pause-video 是否在播放一个视频时自动暂停其他视频\n * @property {Boolean} preview-img 是否允许图片被点击时自动预览\n * @property {Boolean} scroll-table 是否给每个表格添加一个滚动层使其能单独横向滚动\n * @property {Boolean | String} selectable 是否开启长按复制\n * @property {Boolean} set-title 是否将 title 标签的内容设置到页面标题\n * @property {Boolean} show-img-menu 是否允许图片被长按时显示菜单\n * @property {Object} tag-style 标签的默认样式\n * @property {Boolean | Number} use-anchor 是否使用锚点链接\n * @event {Function} load dom 结构加载完毕时触发\n * @event {Function} ready 所有图片加载完毕时触发\n * @event {Function} imgtap 图片被点击时触发\n * @event {Function} linktap 链接被点击时触发\n * @event {Function} play 音视频播放时触发\n * @event {Function} error 媒体加载出错时触发\n */\n// #ifndef APP-PLUS-NVUE\nimport node from './node/node'\n// #endif\nimport Parser from './parser'\nconst plugins=[]\n// #ifdef APP-PLUS-NVUE\nconst dom = weex.requireModule('dom')\n// #endif\nexport default {\n  name: 'mp-html',\n  data () {\n    return {\n      nodes: [],\n      // #ifdef APP-PLUS-NVUE\n      height: 3\n      // #endif\n    }\n  },\n  props: {\n    containerStyle: {\n      type: String,\n      default: ''\n    },\n    content: {\n      type: String,\n      default: ''\n    },\n    copyLink: {\n      type: [Boolean, String],\n      default: true\n    },\n    domain: String,\n    errorImg: {\n      type: String,\n      default: ''\n    },\n    lazyLoad: {\n      type: [Boolean, String],\n      default: true\n    },\n    loadingImg: {\n      type: String,\n      default: ''\n    },\n    pauseVideo: {\n      type: [Boolean, String],\n      default: true\n    },\n    previewImg: {\n      type: [Boolean, String],\n      default: true\n    },\n    scrollTable: [Boolean, String],\n    selectable: [Boolean, String],\n    setTitle: {\n      type: [Boolean, String],\n      default: true\n    },\n    showImgMenu: {\n      type: [Boolean, String],\n      default: true\n    },\n    tagStyle: Object,\n    useAnchor: [Boolean, Number]\n  },\n  // #ifdef VUE3\n  emits: ['load', 'ready', 'imgtap', 'linktap', 'play', 'error'],\n  // #endif\n  // #ifndef APP-PLUS-NVUE\n  components: {\n    node\n  },\n  // #endif\n  watch: {\n    content (content) {\n      this.setContent(content)\n    }\n  },\n  created () {\n    this.plugins = []\n    for (let i = plugins.length; i--;) {\n      this.plugins.push(new plugins[i](this))\n    }\n  },\n  mounted () {\n    if (this.content && !this.nodes.length) {\n      this.setContent(this.content)\n    }\n  },\n  beforeDestroy () {\n    this._hook('onDetached')\n  },\n  methods: {\n    /**\n     * @description 将锚点跳转的范围限定在一个 scroll-view 内\n     * @param {Object} page scroll-view 所在页面的示例\n     * @param {String} selector scroll-view 的选择器\n     * @param {String} scrollTop scroll-view scroll-top 属性绑定的变量名\n     */\n    in (page, selector, scrollTop) {\n      // #ifndef APP-PLUS-NVUE\n      if (page && selector && scrollTop) {\n        this._in = {\n          page,\n          selector,\n          scrollTop\n        }\n      }\n      // #endif\n    },\n\n    /**\n     * @description 锚点跳转\n     * @param {String} id 要跳转的锚点 id\n     * @param {Number} offset 跳转位置的偏移量\n     * @returns {Promise}\n     */\n    navigateTo (id, offset) {\n      return new Promise((resolve, reject) => {\n        if (!this.useAnchor) {\n          reject(Error('Anchor is disabled'))\n          return\n        }\n        offset = offset || parseInt(this.useAnchor) || 0\n        // #ifdef APP-PLUS-NVUE\n        if (!id) {\n          dom.scrollToElement(this.$refs.web, {\n            offset\n          })\n          resolve()\n        } else {\n          this._navigateTo = {\n            resolve,\n            reject,\n            offset\n          }\n          this.$refs.web.evalJs('uni.postMessage({data:{action:\"getOffset\",offset:(document.getElementById(' + id + ')||{}).offsetTop}})')\n        }\n        // #endif\n        // #ifndef APP-PLUS-NVUE\n        let deep = ' '\n        // #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO\n        deep = '>>>'\n        // #endif\n        const selector = uni.createSelectorQuery()\n          // #ifndef MP-ALIPAY\n          .in(this._in ? this._in.page : this)\n          // #endif\n          .select((this._in ? this._in.selector : '._root') + (id ? `${deep}#${id}` : '')).boundingClientRect()\n        if (this._in) {\n          selector.select(this._in.selector).scrollOffset()\n            .select(this._in.selector).boundingClientRect()\n        } else {\n          // 获取 scroll-view 的位置和滚动距离\n          selector.selectViewport().scrollOffset() // 获取窗口的滚动距离\n        }\n        selector.exec(res => {\n          if (!res[0]) {\n            reject(Error('Label not found'))\n            return\n          }\n          const scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + offset\n          if (this._in) {\n            // scroll-view 跳转\n            this._in.page[this._in.scrollTop] = scrollTop\n          } else {\n            // 页面跳转\n            uni.pageScrollTo({\n              scrollTop,\n              duration: 300\n            })\n          }\n          resolve()\n        })\n        // #endif\n      })\n    },\n\n    /**\n     * @description 获取文本内容\n     * @return {String}\n     */\n    getText (nodes) {\n      let text = '';\n      (function traversal (nodes) {\n        for (let i = 0; i < nodes.length; i++) {\n          const node = nodes[i]\n          if (node.type === 'text') {\n            text += node.text.replace(/&amp;/g, '&')\n          } else if (node.name === 'br') {\n            text += '\\n'\n          } else {\n            // 块级标签前后加换行\n            const isBlock = node.name === 'p' || node.name === 'div' || node.name === 'tr' || node.name === 'li' || (node.name[0] === 'h' && node.name[1] > '0' && node.name[1] < '7')\n            if (isBlock && text && text[text.length - 1] !== '\\n') {\n              text += '\\n'\n            }\n            // 递归获取子节点的文本\n            if (node.children) {\n              traversal(node.children)\n            }\n            if (isBlock && text[text.length - 1] !== '\\n') {\n              text += '\\n'\n            } else if (node.name === 'td' || node.name === 'th') {\n              text += '\\t'\n            }\n          }\n        }\n      })(nodes || this.nodes)\n      return text\n    },\n\n    /**\n     * @description 获取内容大小和位置\n     * @return {Promise}\n     */\n    getRect () {\n      return new Promise((resolve, reject) => {\n        uni.createSelectorQuery()\n          // #ifndef MP-ALIPAY\n          .in(this)\n          // #endif\n          .select('#_root').boundingClientRect().exec(res => res[0] ? resolve(res[0]) : reject(Error('Root label not found')))\n      })\n    },\n\n    /**\n     * @description 暂停播放媒体\n     */\n    pauseMedia () {\n      for (let i = (this._videos || []).length; i--;) {\n        this._videos[i].pause()\n      }\n      // #ifdef APP-PLUS\n      const command = 'for(var e=document.getElementsByTagName(\"video\"),i=e.length;i--;)e[i].pause()'\n      // #ifndef APP-PLUS-NVUE\n      let page = this.$parent\n      while (!page.$scope) page = page.$parent\n      page.$scope.$getAppWebview().evalJS(command)\n      // #endif\n      // #ifdef APP-PLUS-NVUE\n      this.$refs.web.evalJs(command)\n      // #endif\n      // #endif\n    },\n\n    /**\n     * @description 设置媒体播放速率\n     * @param {Number} rate 播放速率\n     */\n    setPlaybackRate (rate) {\n      this.playbackRate = rate\n      for (let i = (this._videos || []).length; i--;) {\n        this._videos[i].playbackRate(rate)\n      }\n      // #ifdef APP-PLUS\n      const command = 'for(var e=document.getElementsByTagName(\"video\"),i=e.length;i--;)e[i].playbackRate=' + rate\n      // #ifndef APP-PLUS-NVUE\n      let page = this.$parent\n      while (!page.$scope) page = page.$parent\n      page.$scope.$getAppWebview().evalJS(command)\n      // #endif\n      // #ifdef APP-PLUS-NVUE\n      this.$refs.web.evalJs(command)\n      // #endif\n      // #endif\n    },\n\n    /**\n     * @description 设置内容\n     * @param {String} content html 内容\n     * @param {Boolean} append 是否在尾部追加\n     */\n    setContent (content, append) {\n      if (!append || !this.imgList) {\n        this.imgList = []\n      }\n      const nodes = new Parser(this).parse(content)\n      // #ifdef APP-PLUS-NVUE\n      if (this._ready) {\n        this._set(nodes, append)\n      }\n      // #endif\n      this.$set(this, 'nodes', append ? (this.nodes || []).concat(nodes) : nodes)\n\n      // #ifndef APP-PLUS-NVUE\n      this._videos = []\n      this.$nextTick(() => {\n        this._hook('onLoad')\n        this.$emit('load')\n      })\n\n      if (this.lazyLoad || this.imgList._unloadimgs < this.imgList.length / 2) {\n        // 设置懒加载，每 350ms 获取高度，不变则认为加载完毕\n        let height\n        const callback = rect => {\n          // 350ms 总高度无变化就触发 ready 事件\n          if (rect.height === height) {\n            this.$emit('ready', rect)\n          } else {\n            height = rect.height\n            setTimeout(() => {\n              this.getRect().then(callback)\n            }, 350)\n          }\n        }\n        this.getRect().then(callback)\n      } else {\n        // 未设置懒加载，等待所有图片加载完毕\n        if (!this.imgList._unloadimgs) {\n          this.getRect(rect => {\n            this.$emit('ready', rect)\n          })\n        }\n      }\n      // #endif\n    },\n\n    /**\n     * @description 调用插件钩子函数\n     */\n    _hook (name) {\n      for (let i = plugins.length; i--;) {\n        if (this.plugins[i][name]) {\n          this.plugins[i][name]()\n        }\n      }\n    },\n\n    // #ifdef APP-PLUS-NVUE\n    /**\n     * @description 设置内容\n     */\n    _set (nodes, append) {\n      this.$refs.web.evalJs('setContent(' + JSON.stringify(nodes) + ',' + JSON.stringify([this.containerStyle.replace(/(?:margin|padding)[^;]+/g, ''), this.errorImg, this.loadingImg, this.pauseVideo, this.scrollTable, this.selectable]) + ',' + append + ')')\n    },\n\n    /**\n     * @description 接收到 web-view 消息\n     */\n    _onMessage (e) {\n      const message = e.detail.data[0]\n      switch (message.action) {\n        // web-view 初始化完毕\n        case 'onJSBridgeReady':\n          this._ready = true\n          if (this.nodes) {\n            this._set(this.nodes)\n          }\n          break\n        // 内容 dom 加载完毕\n        case 'onLoad':\n          this.height = message.height\n          this._hook('onLoad')\n          this.$emit('load')\n          break\n        // 所有图片加载完毕\n        case 'onReady':\n          this.getRect().then(res => {\n            this.$emit('ready', res)\n          }).catch(() => { })\n          break\n        // 总高度发生变化\n        case 'onHeightChange':\n          this.height = message.height\n          break\n        // 图片点击\n        case 'onImgTap':\n          this.$emit('imgtap', message.attrs)\n          if (this.previewImg) {\n            uni.previewImage({\n              current: parseInt(message.attrs.i),\n              urls: this.imgList\n            })\n          }\n          break\n        // 链接点击\n        case 'onLinkTap': {\n          const href = message.attrs.href\n          this.$emit('linktap', message.attrs)\n          if (href) {\n            // 锚点跳转\n            if (href[0] === '#') {\n              if (this.useAnchor) {\n                dom.scrollToElement(this.$refs.web, {\n                  offset: message.offset\n                })\n              }\n            } else if (href.includes('://')) {\n              // 打开外链\n              if (this.copyLink) {\n                plus.runtime.openWeb(href)\n              }\n            } else {\n              uni.navigateTo({\n                url: href,\n                fail () {\n                  uni.switchTab({\n                    url: href\n                  })\n                }\n              })\n            }\n          }\n          break\n        }\n        case 'onPlay':\n          this.$emit('play')\n          break\n        // 获取到锚点的偏移量\n        case 'getOffset':\n          if (typeof message.offset === 'number') {\n            dom.scrollToElement(this.$refs.web, {\n              offset: message.offset + this._navigateTo.offset\n            })\n            this._navigateTo.resolve()\n          } else {\n            this._navigateTo.reject(Error('Label not found'))\n          }\n          break\n        // 点击\n        case 'onClick':\n          this.$emit('tap')\n          this.$emit('click')\n          break\n        // 出错\n        case 'onError':\n          this.$emit('error', {\n            source: message.source,\n            attrs: message.attrs\n          })\n      }\n    }\n    // #endif\n  }\n}\n</script>\n\n<style>\n/* #ifndef APP-PLUS-NVUE */\n/* 根节点样式 */\n._root {\n  padding: 1px 0;\n  overflow-x: auto;\n  overflow-y: hidden;\n  -webkit-overflow-scrolling: touch;\n}\n\n/* 长按复制 */\n._select {\n  user-select: text;\n}\n/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/mp-html/components/mp-html/node/node.vue",
    "content": "<template>\n  <view :id=\"attrs.id\" :class=\"'_block _'+name+' '+attrs.class\" :style=\"attrs.style\">\n    <block v-for=\"(n, i) in childs\" v-bind:key=\"i\">\n      <!-- 图片 -->\n      <!-- 占位图 -->\n      <image v-if=\"n.name==='img'&&!n.t&&((opts[1]&&!ctrl[i])||ctrl[i]<0)\" class=\"_img\" :style=\"n.attrs.style\" :src=\"ctrl[i]<0?opts[2]:opts[1]\" mode=\"widthFix\" />\n      <!-- 显示图片 -->\n      <!-- #ifdef H5 || (APP-PLUS && VUE2) -->\n      <img v-if=\"n.name==='img'\" :id=\"n.attrs.id\" :class=\"'_img '+n.attrs.class\" :style=\"(ctrl[i]===-1?'display:none;':'')+n.attrs.style\" :src=\"n.attrs.src||(ctrl.load?n.attrs['data-src']:'')\" :data-i=\"i\" @load=\"imgLoad\" @error=\"mediaError\" @tap.stop=\"imgTap\" @longpress=\"imgLongTap\" />\n      <!-- #endif -->\n      <!-- #ifndef H5 || (APP-PLUS && VUE2) -->\n      <!-- 表格中的图片，使用 rich-text 防止大小不正确 -->\n      <rich-text v-if=\"n.name==='img'&&n.t\" :style=\"'display:'+n.t\" :nodes=\"'<img class=\\'_img\\' style=\\''+n.attrs.style+'\\' src=\\''+n.attrs.src+'\\'>'\" :data-i=\"i\" @tap.stop=\"imgTap\" />\n      <!-- #endif -->\n      <!-- #ifndef H5 || APP-PLUS -->\n      <image v-else-if=\"n.name==='img'\" :id=\"n.attrs.id\" :class=\"'_img '+n.attrs.class\" :style=\"(ctrl[i]===-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;height:1px;'+n.attrs.style\" :src=\"n.attrs.src\" :mode=\"!n.h?'widthFix':(!n.w?'heightFix':'')\" :lazy-load=\"opts[0]\" :webp=\"n.webp\" :show-menu-by-longpress=\"opts[3]&&!n.attrs.ignore\" :image-menu-prevent=\"!opts[3]||n.attrs.ignore\" :data-i=\"i\" @load=\"imgLoad\" @error=\"mediaError\" @tap.stop=\"imgTap\" @longpress=\"imgLongTap\" />\n      <!-- #endif -->\n      <!-- #ifdef APP-PLUS && VUE3 -->\n      <image v-else-if=\"n.name==='img'\" :id=\"n.attrs.id\" :class=\"'_img '+n.attrs.class\" :style=\"(ctrl[i]===-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;'+n.attrs.style\" :src=\"n.attrs.src||(ctrl.load?n.attrs['data-src']:'')\" :mode=\"!n.h?'widthFix':(!n.w?'heightFix':'')\" :data-i=\"i\" @load=\"imgLoad\" @error=\"mediaError\" @tap.stop=\"imgTap\" @longpress=\"imgLongTap\" />\n      <!-- #endif -->\n      <!-- 文本 -->\n      <!-- #ifdef MP-WEIXIN -->\n      <text v-else-if=\"n.text\" :user-select=\"opts[4]=='force'&&isiOS\" decode>{{n.text}}</text>\n      <!-- #endif -->\n      <!-- #ifndef MP-WEIXIN || MP-BAIDU || MP-ALIPAY || MP-TOUTIAO -->\n      <text v-else-if=\"n.text\" decode>{{n.text}}</text>\n      <!-- #endif -->\n      <text v-else-if=\"n.name==='br'\">\\n</text>\n      <!-- 链接 -->\n      <view v-else-if=\"n.name==='a'\" :id=\"n.attrs.id\" :class=\"(n.attrs.href?'_a ':'')+n.attrs.class\" hover-class=\"_hover\" :style=\"'display:inline;'+n.attrs.style\" :data-i=\"i\" @tap.stop=\"linkTap\">\n        <node name=\"span\" :childs=\"n.children\" :opts=\"opts\" style=\"display:inherit\" />\n      </view>\n      <!-- 视频 -->\n      <!-- #ifdef APP-PLUS -->\n      <view v-else-if=\"n.html\" :id=\"n.attrs.id\" :class=\"'_video '+n.attrs.class\" :style=\"n.attrs.style\" v-html=\"n.html\" @vplay.stop=\"play\" />\n      <!-- #endif -->\n      <!-- #ifndef APP-PLUS -->\n      <video v-else-if=\"n.name==='video'\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :autoplay=\"n.attrs.autoplay\" :controls=\"n.attrs.controls\" :loop=\"n.attrs.loop\" :muted=\"n.attrs.muted\" :object-fit=\"n.attrs['object-fit']\" :poster=\"n.attrs.poster\" :src=\"n.src[ctrl[i]||0]\" :data-i=\"i\" @play=\"play\" @error=\"mediaError\" />\n      <!-- #endif -->\n      <!-- #ifdef H5 || APP-PLUS -->\n      <iframe v-else-if=\"n.name==='iframe'\" :style=\"n.attrs.style\" :allowfullscreen=\"n.attrs.allowfullscreen\" :frameborder=\"n.attrs.frameborder\" :src=\"n.attrs.src\" />\n      <embed v-else-if=\"n.name==='embed'\" :style=\"n.attrs.style\" :src=\"n.attrs.src\" />\n      <!-- #endif -->\n      <!-- #ifndef MP-TOUTIAO || ((H5 || APP-PLUS) && VUE3) -->\n      <!-- 音频 -->\n      <audio v-else-if=\"n.name==='audio'\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :author=\"n.attrs.author\" :controls=\"n.attrs.controls\" :loop=\"n.attrs.loop\" :name=\"n.attrs.name\" :poster=\"n.attrs.poster\" :src=\"n.src[ctrl[i]||0]\" :data-i=\"i\" @play=\"play\" @error=\"mediaError\" />\n      <!-- #endif -->\n      <view v-else-if=\"(n.name==='table'&&n.c)||n.name==='li'\" :id=\"n.attrs.id\" :class=\"'_'+n.name+' '+n.attrs.class\" :style=\"n.attrs.style\">\n        <node v-if=\"n.name==='li'\" :childs=\"n.children\" :opts=\"opts\" />\n        <view v-else v-for=\"(tbody, x) in n.children\" v-bind:key=\"x\" :class=\"'_'+tbody.name+' '+tbody.attrs.class\" :style=\"tbody.attrs.style\">\n          <node v-if=\"tbody.name==='td'||tbody.name==='th'\" :childs=\"tbody.children\" :opts=\"opts\" />\n          <block v-else v-for=\"(tr, y) in tbody.children\" v-bind:key=\"y\">\n            <view v-if=\"tr.name==='td'||tr.name==='th'\" :class=\"'_'+tr.name+' '+tr.attrs.class\" :style=\"tr.attrs.style\">\n              <node :childs=\"tr.children\" :opts=\"opts\" />\n            </view>\n            <view v-else :class=\"'_'+tr.name+' '+tr.attrs.class\" :style=\"tr.attrs.style\">\n              <view v-for=\"(td, z) in tr.children\" v-bind:key=\"z\" :class=\"'_'+td.name+' '+td.attrs.class\" :style=\"td.attrs.style\">\n                <node :childs=\"td.children\" :opts=\"opts\" />\n              </view>\n            </view>\n          </block>\n        </view>\n      </view>\n      \n      <!-- 富文本 -->\n      <!-- #ifdef H5 || ((MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE2) -->\n      <rich-text v-else-if=\"!n.c&&!handler.isInline(n.name, n.attrs.style)\" :id=\"n.attrs.id\" :style=\"n.f\" :user-select=\"opts[4]\" :nodes=\"[n]\" />\n      <!-- #endif -->\n      <!-- #ifndef H5 || ((MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE2) -->\n      <rich-text v-else-if=\"!n.c\" :id=\"n.attrs.id\" :style=\"n.f+';display:inline'\" :preview=\"false\" :selectable=\"opts[4]\" :user-select=\"opts[4]\" :nodes=\"[n]\" />\n      <!-- #endif -->\n      <!-- 继续递归 -->\n      <view v-else-if=\"n.c===2\" :id=\"n.attrs.id\" :class=\"'_block _'+n.name+' '+n.attrs.class\" :style=\"n.f+';'+n.attrs.style\">\n        <node v-for=\"(n2, j) in n.children\" v-bind:key=\"j\" :style=\"n2.f\" :name=\"n2.name\" :attrs=\"n2.attrs\" :childs=\"n2.children\" :opts=\"opts\" />\n      </view>\n      <node v-else :style=\"n.f\" :name=\"n.name\" :attrs=\"n.attrs\" :childs=\"n.children\" :opts=\"opts\" />\n    </block>\n  </view>\n</template>\n<script module=\"handler\" lang=\"wxs\">\n// 行内标签列表\nvar inlineTags = {\n  abbr: true,\n  b: true,\n  big: true,\n  code: true,\n  del: true,\n  em: true,\n  i: true,\n  ins: true,\n  label: true,\n  q: true,\n  small: true,\n  span: true,\n  strong: true,\n  sub: true,\n  sup: true\n}\n/**\n * @description 判断是否为行内标签\n */\nmodule.exports = {\n  isInline: function (tagName, style) {\n    return inlineTags[tagName] || (style || '').indexOf('display:inline') !== -1\n  }\n}\n</script>\n<script>\n\nimport node from './node'\nexport default {\n  name: 'node',\n  options: {\n    // #ifdef MP-WEIXIN\n    virtualHost: true,\n    // #endif\n    // #ifdef MP-TOUTIAO\n    addGlobalClass: false\n    // #endif\n  },\n  data () {\n    return {\n      ctrl: {},\n      // #ifdef MP-WEIXIN\n      isiOS: uni.getSystemInfoSync().system.includes('iOS')\n      // #endif\n    }\n  },\n  props: {\n    name: String,\n    attrs: {\n      type: Object,\n      default () {\n        return {}\n      }\n    },\n    childs: Array,\n    opts: Array\n  },\n  components: {\n\n    // #ifndef H5 && VUE3\n    node\n    // #endif\n  },\n  mounted () {\n    this.$nextTick(() => {\n      for (this.root = this.$parent; this.root.$options.name !== 'mp-html'; this.root = this.root.$parent);\n    })\n    // #ifdef H5 || APP-PLUS\n    if (this.opts[0]) {\n      let i\n      for (i = this.childs.length; i--;) {\n        if (this.childs[i].name === 'img') break\n      }\n      if (i !== -1) {\n        this.observer = uni.createIntersectionObserver(this).relativeToViewport({\n          top: 500,\n          bottom: 500\n        })\n        this.observer.observe('._img', res => {\n          if (res.intersectionRatio) {\n            this.$set(this.ctrl, 'load', 1)\n            this.observer.disconnect()\n          }\n        })\n      }\n    }\n    // #endif\n  },\n  beforeDestroy () {\n    // #ifdef H5 || APP-PLUS\n    if (this.observer) {\n      this.observer.disconnect()\n    }\n    // #endif\n  },\n  methods:{\n    // #ifdef MP-WEIXIN\n    toJSON () { return this },\n    // #endif\n    /**\n     * @description 播放视频事件\n     * @param {Event} e\n     */\n    play (e) {\n      this.root.$emit('play')\n      // #ifndef APP-PLUS\n      if (this.root.pauseVideo) {\n        let flag = false\n        const id = e.target.id\n        for (let i = this.root._videos.length; i--;) {\n          if (this.root._videos[i].id === id) {\n            flag = true\n          } else {\n            this.root._videos[i].pause() // 自动暂停其他视频\n          }\n        }\n        // 将自己加入列表\n        if (!flag) {\n          const ctx = uni.createVideoContext(id\n            // #ifndef MP-BAIDU\n            , this\n            // #endif\n          )\n          ctx.id = id\n          if (this.root.playbackRate) {\n            ctx.playbackRate(this.root.playbackRate)\n          }\n          this.root._videos.push(ctx)\n        }\n      }\n      // #endif\n    },\n\n    /**\n     * @description 图片点击事件\n     * @param {Event} e\n     */\n    imgTap (e) {\n      const node = this.childs[e.currentTarget.dataset.i]\n      if (node.a) {\n        this.linkTap(node.a)\n        return\n      }\n      if (node.attrs.ignore) return\n      // #ifdef H5 || APP-PLUS\n      node.attrs.src = node.attrs.src || node.attrs['data-src']\n      // #endif\n      this.root.$emit('imgtap', node.attrs)\n      // 自动预览图片\n      if (this.root.previewImg) {\n        uni.previewImage({\n          // #ifdef MP-WEIXIN\n          showmenu: this.root.showImgMenu,\n          // #endif\n          // #ifdef MP-ALIPAY\n          enablesavephoto: this.root.showImgMenu,\n          enableShowPhotoDownload: this.root.showImgMenu,\n          // #endif\n          current: parseInt(node.attrs.i),\n          urls: this.root.imgList\n        })\n      }\n    },\n\n    /**\n     * @description 图片长按\n     */\n    imgLongTap (e) {\n      // #ifdef APP-PLUS\n      const attrs = this.childs[e.currentTarget.dataset.i].attrs\n      if (this.opts[3] && !attrs.ignore) {\n        uni.showActionSheet({\n          itemList: ['保存图片'],\n          success: () => {\n            const save = path => {\n              uni.saveImageToPhotosAlbum({\n                filePath: path,\n                success () {\n                  uni.showToast({\n                    title: '保存成功'\n                  })\n                }\n              })\n            }\n            if (this.root.imgList[attrs.i].startsWith('http')) {\n              uni.downloadFile({\n                url: this.root.imgList[attrs.i],\n                success: res => save(res.tempFilePath)\n              })\n            } else {\n              save(this.root.imgList[attrs.i])\n            }\n          }\n        })\n      }\n      // #endif\n    },\n\n    /**\n     * @description 图片加载完成事件\n     * @param {Event} e\n     */\n    imgLoad (e) {\n      const i = e.currentTarget.dataset.i\n      /* #ifndef H5 || (APP-PLUS && VUE2) */\n      if (!this.childs[i].w) {\n        // 设置原宽度\n        this.$set(this.ctrl, i, e.detail.width)\n      } else /* #endif */ if ((this.opts[1] && !this.ctrl[i]) || this.ctrl[i] === -1) {\n        // 加载完毕，取消加载中占位图\n        this.$set(this.ctrl, i, 1)\n      }\n      this.checkReady()\n    },\n\n    /**\n     * @description 检查是否所有图片加载完毕\n     */\n    checkReady () {\n\t\tif(!this.root) return;\n\t\t\n      if (!this.root.lazyLoad) {\n        this.root._unloadimgs -= 1\n        if (!this.root._unloadimgs) {\n          setTimeout(() => {\n            this.root.getRect().then(rect => {\n              this.root.$emit('ready', rect)\n            })\n          }, 350)\n        }\n      }\n    },\n\n    /**\n     * @description 链接点击事件\n     * @param {Event} e\n     */\n    linkTap (e) {\n      const node = e.currentTarget ? this.childs[e.currentTarget.dataset.i] : {}\n      const attrs = node.attrs || e\n      const href = attrs.href\n      this.root.$emit('linktap', Object.assign({\n        innerText: this.root.getText(node.children || []) // 链接内的文本内容\n      }, attrs))\n      if (href) {\n        if (href[0] === '#') {\n          // 跳转锚点\n          this.root.navigateTo(href.substring(1)).catch(() => { })\n        } else if (href.split('?')[0].includes('://')) {\n          // 复制外部链接\n          if (this.root.copyLink) {\n            // #ifdef H5\n            window.open(href)\n            // #endif\n            // #ifdef MP\n            uni.setClipboardData({\n              data: href,\n              success: () =>\n                uni.showToast({\n                  title: '链接已复制'\n                })\n            })\n            // #endif\n            // #ifdef APP-PLUS\n            plus.runtime.openWeb(href)\n            // #endif\n          }\n        } else {\n          // 跳转页面\n          uni.navigateTo({\n            url: href,\n            fail () {\n              uni.switchTab({\n                url: href,\n                fail () { }\n              })\n            }\n          })\n        }\n      }\n    },\n\n    /**\n     * @description 错误事件\n     * @param {Event} e\n     */\n    mediaError (e) {\n      const i = e.currentTarget.dataset.i\n      const node = this.childs[i]\n      // 加载其他源\n      if (node.name === 'video' || node.name === 'audio') {\n        let index = (this.ctrl[i] || 0) + 1\n        if (index > node.src.length) {\n          index = 0\n        }\n        if (index < node.src.length) {\n          this.$set(this.ctrl, i, index)\n          return\n        }\n      } else if (node.name === 'img') {\n        // #ifdef H5 && VUE3\n        if (this.opts[0] && !this.ctrl.load) return\n        // #endif\n        // 显示错误占位图\n        if (this.opts[2]) {\n          this.$set(this.ctrl, i, -1)\n        }\n        this.checkReady()\n      }\n      if (this.root) {\n        this.root.$emit('error', {\n          source: node.name,\n          attrs: node.attrs,\n          // #ifndef H5 && VUE3\n          errMsg: e.detail.errMsg\n          // #endif\n        })\n      }\n    }\n  }\n}\n</script>\n<style>\n/* a 标签默认效果 */\n._a {\n  padding: 1.5px 0 1.5px 0;\n  color: #366092;\n  word-break: break-all;\n}\n\n/* a 标签点击态效果 */\n._hover {\n  text-decoration: underline;\n  opacity: 0.7;\n}\n\n/* 图片默认效果 */\n._img {\n  max-width: 100%;\n  -webkit-touch-callout: none;\n}\n\n/* 内部样式 */\n\n._block {\n  display: block;\n}\n\n._b,\n._strong {\n  font-weight: bold;\n}\n\n._code {\n  font-family: monospace;\n}\n\n._del {\n  text-decoration: line-through;\n}\n\n._em,\n._i {\n  font-style: italic;\n}\n\n._h1 {\n  font-size: 2em;\n}\n\n._h2 {\n  font-size: 1.5em;\n}\n\n._h3 {\n  font-size: 1.17em;\n}\n\n._h5 {\n  font-size: 0.83em;\n}\n\n._h6 {\n  font-size: 0.67em;\n}\n\n._h1,\n._h2,\n._h3,\n._h4,\n._h5,\n._h6 {\n  display: block;\n  font-weight: bold;\n}\n\n._image {\n  height: 1px;\n}\n\n._ins {\n  text-decoration: underline;\n}\n\n._li {\n  display: list-item;\n}\n\n._ol {\n  list-style-type: decimal;\n}\n\n._ol,\n._ul {\n  display: block;\n  padding-left: 40px;\n  margin: 1em 0;\n}\n\n._q::before {\n  content: '\"';\n}\n\n._q::after {\n  content: '\"';\n}\n\n._sub {\n  font-size: smaller;\n  vertical-align: sub;\n}\n\n._sup {\n  font-size: smaller;\n  vertical-align: super;\n}\n\n._thead,\n._tbody,\n._tfoot {\n  display: table-row-group;\n}\n\n._tr {\n  display: table-row;\n}\n\n._td,\n._th {\n  display: table-cell;\n  vertical-align: middle;\n}\n\n._th {\n  font-weight: bold;\n  text-align: center;\n}\n\n._ul {\n  list-style-type: disc;\n}\n\n._ul ._ul {\n  margin: 0;\n  list-style-type: circle;\n}\n\n._ul ._ul ._ul {\n  list-style-type: square;\n}\n\n._abbr,\n._b,\n._code,\n._del,\n._em,\n._i,\n._ins,\n._label,\n._q,\n._span,\n._strong,\n._sub,\n._sup {\n  display: inline;\n}\n\n/* #ifdef APP-PLUS */\n._video {\n  width: 300px;\n  height: 225px;\n}\n/* #endif */\n</style>"
  },
  {
    "path": "uni_modules/mp-html/components/mp-html/parser.js",
    "content": "/**\n * @fileoverview html 解析器\n */\n\n// 配置\nconst config = {\n  // 信任的标签（保持标签名不变）\n  trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),\n\n  // 块级标签（转为 div，其他的非信任标签转为 span）\n  blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),\n\n  // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3\n  // 行内标签\n  inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'),\n  // #endif\n\n  // 要移除的标签\n  ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),\n\n  // 自闭合的标签\n  voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),\n\n  // html 实体\n  entities: {\n    lt: '<',\n    gt: '>',\n    quot: '\"',\n    apos: \"'\",\n    ensp: '\\u2002',\n    emsp: '\\u2003',\n    nbsp: '\\xA0',\n    semi: ';',\n    ndash: '–',\n    mdash: '—',\n    middot: '·',\n    lsquo: '‘',\n    rsquo: '’',\n    ldquo: '“',\n    rdquo: '”',\n    bull: '•',\n    hellip: '…',\n    larr: '←',\n    uarr: '↑',\n    rarr: '→',\n    darr: '↓'\n  },\n\n  // 默认的标签样式\n  tagStyle: {\n    // #ifndef APP-PLUS-NVUE\n    address: 'font-style:italic',\n    big: 'display:inline;font-size:1.2em',\n    caption: 'display:table-caption;text-align:center',\n    center: 'text-align:center',\n    cite: 'font-style:italic',\n    dd: 'margin-left:40px',\n    mark: 'background-color:yellow',\n    pre: 'font-family:monospace;white-space:pre',\n    s: 'text-decoration:line-through',\n    small: 'display:inline;font-size:0.8em',\n    strike: 'text-decoration:line-through',\n    u: 'text-decoration:underline'\n    // #endif\n  },\n\n  // svg 大小写对照表\n  svgDict: {\n    animatetransform: 'animateTransform',\n    lineargradient: 'linearGradient',\n    viewbox: 'viewBox',\n    attributename: 'attributeName',\n    repeatcount: 'repeatCount',\n    repeatdur: 'repeatDur'\n  }\n}\nconst tagSelector={}\nconst {\n  windowWidth,\n  // #ifdef MP-WEIXIN\n  system\n  // #endif\n} = uni.getSystemInfoSync()\nconst blankChar = makeMap(' ,\\r,\\n,\\t,\\f')\nlet idIndex = 0\n\n// #ifdef H5 || APP-PLUS\nconfig.ignoreTags.iframe = undefined\nconfig.trustTags.iframe = true\nconfig.ignoreTags.embed = undefined\nconfig.trustTags.embed = true\n// #endif\n// #ifdef APP-PLUS-NVUE\nconfig.ignoreTags.source = undefined\nconfig.ignoreTags.style = undefined\n// #endif\n\n/**\n * @description 创建 map\n * @param {String} str 逗号分隔\n */\nfunction makeMap (str) {\n  const map = Object.create(null)\n  const list = str.split(',')\n  for (let i = list.length; i--;) {\n    map[list[i]] = true\n  }\n  return map\n}\n\n/**\n * @description 解码 html 实体\n * @param {String} str 要解码的字符串\n * @param {Boolean} amp 要不要解码 &amp;\n * @returns {String} 解码后的字符串\n */\nfunction decodeEntity (str, amp) {\n  let i = str.indexOf('&')\n  while (i !== -1) {\n    const j = str.indexOf(';', i + 3)\n    let code\n    if (j === -1) break\n    if (str[i + 1] === '#') {\n      // &#123; 形式的实体\n      code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j))\n      if (!isNaN(code)) {\n        str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)\n      }\n    } else {\n      // &nbsp; 形式的实体\n      code = str.substring(i + 1, j)\n      if (config.entities[code] || (code === 'amp' && amp)) {\n        str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)\n      }\n    }\n    i = str.indexOf('&', i + 1)\n  }\n  return str\n}\n\n/**\n * @description 合并多个块级标签，加快长内容渲染\n * @param {Array} nodes 要合并的标签数组\n */\nfunction mergeNodes (nodes) {\n  let i = nodes.length - 1\n  for (let j = i; j >= -1; j--) {\n    if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j].name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) {\n      if (i - j >= 5) {\n        nodes.splice(j + 1, i - j, {\n          name: 'div',\n          attrs: {},\n          children: nodes.slice(j + 1, i + 1)\n        })\n      }\n      i = j - 1\n    }\n  }\n}\n\n/**\n * @description html 解析器\n * @param {Object} vm 组件实例\n */\nfunction Parser (vm) {\n  this.options = vm || {}\n  this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle)\n  this.imgList = vm.imgList || []\n  this.imgList._unloadimgs = 0\n  this.plugins = vm.plugins || []\n  this.attrs = Object.create(null)\n  this.stack = []\n  this.nodes = []\n  this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0\n}\n\n/**\n * @description 执行解析\n * @param {String} content 要解析的文本\n */\nParser.prototype.parse = function (content) {\n  // 插件处理\n  for (let i = this.plugins.length; i--;) {\n    if (this.plugins[i].onUpdate) {\n      content = this.plugins[i].onUpdate(content, config) || content\n    }\n  }\n\n  new Lexer(this).parse(content)\n  // 出栈未闭合的标签\n  while (this.stack.length) {\n    this.popNode()\n  }\n  if (this.nodes.length > 50) {\n    mergeNodes(this.nodes)\n  }\n  return this.nodes\n}\n\n/**\n * @description 将标签暴露出来（不被 rich-text 包含）\n */\nParser.prototype.expose = function () {\n  // #ifndef APP-PLUS-NVUE\n  for (let i = this.stack.length; i--;) {\n    const item = this.stack[i]\n    if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return\n    item.c = 1\n  }\n  // #endif\n}\n\n/**\n * @description 处理插件\n * @param {Object} node 要处理的标签\n * @returns {Boolean} 是否要移除此标签\n */\nParser.prototype.hook = function (node) {\n  for (let i = this.plugins.length; i--;) {\n    if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * @description 将链接拼接上主域名\n * @param {String} url 需要拼接的链接\n * @returns {String} 拼接后的链接\n */\nParser.prototype.getUrl = function (url) {\n  const domain = this.options.domain\n  if (url[0] === '/') {\n    if (url[1] === '/') {\n      // // 开头的补充协议名\n      url = (domain ? domain.split('://')[0] : 'http') + ':' + url\n    } else if (domain) {\n      // 否则补充整个域名\n      url = domain + url\n    } /* #ifdef APP-PLUS */ else {\n      url = plus.io.convertLocalFileSystemURL(url)\n    } /* #endif */\n  } else if (!url.includes('data:') && !url.includes('://')) {\n    if (domain) {\n      url = domain + '/' + url\n    } /* #ifdef APP-PLUS */ else {\n      url = plus.io.convertLocalFileSystemURL(url)\n    } /* #endif */\n  }\n  return url\n}\n\n/**\n * @description 解析样式表\n * @param {Object} node 标签\n * @returns {Object}\n */\nParser.prototype.parseStyle = function (node) {\n  const attrs = node.attrs\n  const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))\n  const styleObj = {}\n  let tmp = ''\n\n  if (attrs.id && !this.xml) {\n    // 暴露锚点\n    if (this.options.useAnchor) {\n      this.expose()\n    } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') {\n      attrs.id = undefined\n    }\n  }\n\n  // 转换 width 和 height 属性\n  if (attrs.width) {\n    styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')\n    attrs.width = undefined\n  }\n  if (attrs.height) {\n    styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')\n    attrs.height = undefined\n  }\n\n  for (let i = 0, len = list.length; i < len; i++) {\n    const info = list[i].split(':')\n    if (info.length < 2) continue\n    const key = info.shift().trim().toLowerCase()\n    let value = info.join(':').trim()\n    if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) {\n      // 兼容性的 css 不压缩\n      tmp += `;${key}:${value}`\n    } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {\n      // 重复的样式进行覆盖\n      if (value.includes('url')) {\n        // 填充链接\n        let j = value.indexOf('(') + 1\n        if (j) {\n          while (value[j] === '\"' || value[j] === \"'\" || blankChar[value[j]]) {\n            j++\n          }\n          value = value.substr(0, j) + this.getUrl(value.substr(j))\n        }\n      } else if (value.includes('rpx')) {\n        // 转换 rpx（rich-text 内部不支持 rpx）\n        value = value.replace(/[0-9.]+\\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px')\n      }\n      styleObj[key] = value\n    }\n  }\n\n  node.attrs.style = tmp\n  return styleObj\n}\n\n/**\n * @description 解析到标签名\n * @param {String} name 标签名\n * @private\n */\nParser.prototype.onTagName = function (name) {\n  this.tagName = this.xml ? name : name.toLowerCase()\n  if (this.tagName === 'svg') {\n    this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感\n  }\n}\n\n/**\n * @description 解析到属性名\n * @param {String} name 属性名\n * @private\n */\nParser.prototype.onAttrName = function (name) {\n  name = this.xml ? name : name.toLowerCase()\n  if (name.substr(0, 5) === 'data-') {\n    if (name === 'data-src' && !this.attrs.src) {\n      // data-src 自动转为 src\n      this.attrName = 'src'\n    } else if (this.tagName === 'img' || this.tagName === 'a') {\n      // a 和 img 标签保留 data- 的属性，可以在 imgtap 和 linktap 事件中使用\n      this.attrName = name\n    } else {\n      // 剩余的移除以减小大小\n      this.attrName = undefined\n    }\n  } else {\n    this.attrName = name\n    this.attrs[name] = 'T' // boolean 型属性缺省设置\n  }\n}\n\n/**\n * @description 解析到属性值\n * @param {String} val 属性值\n * @private\n */\nParser.prototype.onAttrVal = function (val) {\n  const name = this.attrName || ''\n  if (name === 'style' || name === 'href') {\n    // 部分属性进行实体解码\n    this.attrs[name] = decodeEntity(val, true)\n  } else if (name.includes('src')) {\n    // 拼接主域名\n    this.attrs[name] = this.getUrl(decodeEntity(val, true))\n  } else if (name) {\n    this.attrs[name] = val\n  }\n}\n\n/**\n * @description 解析到标签开始\n * @param {Boolean} selfClose 是否有自闭合标识 />\n * @private\n */\nParser.prototype.onOpenTag = function (selfClose) {\n  // 拼装 node\n  const node = Object.create(null)\n  node.name = this.tagName\n  node.attrs = this.attrs\n  // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示\n  if (this.options.nodes.length) {\n    node.type = 'node'\n  }\n  this.attrs = Object.create(null)\n\n  const attrs = node.attrs\n  const parent = this.stack[this.stack.length - 1]\n  const siblings = parent ? parent.children : this.nodes\n  const close = this.xml ? selfClose : config.voidTags[node.name]\n\n  // 替换标签名选择器\n  if (tagSelector[node.name]) {\n    attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '')\n  }\n\n  // 转换 embed 标签\n  if (node.name === 'embed') {\n    // #ifndef H5 || APP-PLUS\n    const src = attrs.src || ''\n    // 按照后缀名和 type 将 embed 转为 video 或 audio\n    if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) {\n      node.name = 'video'\n    } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) {\n      node.name = 'audio'\n    }\n    if (attrs.autostart) {\n      attrs.autoplay = 'T'\n    }\n    attrs.controls = 'T'\n    // #endif\n    // #ifdef H5 || APP-PLUS\n    this.expose()\n    // #endif\n  }\n\n  // #ifndef APP-PLUS-NVUE\n  // 处理音视频\n  if (node.name === 'video' || node.name === 'audio') {\n    // 设置 id 以便获取 context\n    if (node.name === 'video' && !attrs.id) {\n      attrs.id = 'v' + idIndex++\n    }\n    // 没有设置 controls 也没有设置 autoplay 的自动设置 controls\n    if (!attrs.controls && !attrs.autoplay) {\n      attrs.controls = 'T'\n    }\n    // 用数组存储所有可用的 source\n    node.src = []\n    if (attrs.src) {\n      node.src.push(attrs.src)\n      attrs.src = undefined\n    }\n    this.expose()\n  }\n  // #endif\n\n  // 处理自闭合标签\n  if (close) {\n    if (!this.hook(node) || config.ignoreTags[node.name]) {\n      // 通过 base 标签设置主域名\n      if (node.name === 'base' && !this.options.domain) {\n        this.options.domain = attrs.href\n      } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) {\n        // 设置 source 标签（仅父节点为 video 或 audio 时有效）\n        parent.src.push(attrs.src)\n      } /* #endif */\n      return\n    }\n\n    // 解析 style\n    const styleObj = this.parseStyle(node)\n\n    // 处理图片\n    if (node.name === 'img') {\n      if (attrs.src) {\n        // 标记 webp\n        if (attrs.src.includes('webp')) {\n          node.webp = 'T'\n        }\n        // data url 图片如果没有设置 original-src 默认为不可预览的小图片\n        if (attrs.src.includes('data:') && !attrs['original-src']) {\n          attrs.ignore = 'T'\n        }\n        if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {\n          for (let i = this.stack.length; i--;) {\n            const item = this.stack[i]\n            if (item.name === 'a') {\n              node.a = item.attrs\n            }\n            if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) {\n              if (!styleObj.display || styleObj.display.includes('inline')) {\n                node.t = 'inline-block'\n              } else {\n                node.t = styleObj.display\n              }\n              styleObj.display = undefined\n            }\n            // #ifndef H5 || APP-PLUS\n            const style = item.attrs.style || ''\n            if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || parseInt(styleObj.width) > 100)) {\n              styleObj.width = '100% !important'\n              styleObj.height = ''\n              for (let j = i + 1; j < this.stack.length; j++) {\n                this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')\n              }\n            } else if (style.includes('flex') && styleObj.width === '100%') {\n              for (let j = i + 1; j < this.stack.length; j++) {\n                const style = this.stack[j].attrs.style || ''\n                if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) {\n                  styleObj.width = ''\n                  break\n                }\n              }\n            } else if (style.includes('inline-block')) {\n              if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') {\n                item.attrs.style += ';max-width:' + styleObj.width\n                styleObj.width = ''\n              } else {\n                item.attrs.style += ';max-width:100%'\n              }\n            }\n            // #endif\n            item.c = 1\n          }\n          attrs.i = this.imgList.length.toString()\n          let src = attrs['original-src'] || attrs.src\n          // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360\n          if (this.imgList.includes(src)) {\n            // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位\n            let i = src.indexOf('://')\n            if (i !== -1) {\n              i += 3\n              let newSrc = src.substr(0, i)\n              for (; i < src.length; i++) {\n                if (src[i] === '/') break\n                newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i]\n              }\n              newSrc += src.substr(i)\n              src = newSrc\n            }\n          }\n          // #endif\n          this.imgList.push(src)\n          if (!node.t) {\n            this.imgList._unloadimgs += 1\n          }\n          // #ifdef H5 || APP-PLUS\n          if (this.options.lazyLoad) {\n            attrs['data-src'] = attrs.src\n            attrs.src = undefined\n          }\n          // #endif\n        }\n      }\n      if (styleObj.display === 'inline') {\n        styleObj.display = ''\n      }\n      // #ifndef APP-PLUS-NVUE\n      if (attrs.ignore) {\n        styleObj['max-width'] = styleObj['max-width'] || '100%'\n        attrs.style += ';-webkit-touch-callout:none'\n      }\n      // #endif\n      // 设置的宽度超出屏幕，为避免变形，高度转为自动\n      if (parseInt(styleObj.width) > windowWidth) {\n        styleObj.height = undefined\n      }\n      // 记录是否设置了宽高\n      if (!isNaN(parseInt(styleObj.width))) {\n        node.w = 'T'\n      }\n      if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs.style || '').includes('height')))) {\n        node.h = 'T'\n      }\n    } else if (node.name === 'svg') {\n      siblings.push(node)\n      this.stack.push(node)\n      this.popNode()\n      return\n    }\n    for (const key in styleObj) {\n      if (styleObj[key]) {\n        attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}`\n      }\n    }\n    attrs.style = attrs.style.substr(1) || undefined\n    // #ifdef (MP-WEIXIN || MP-QQ) && VUE3\n    if (!attrs.style) {\n      delete attrs.style\n    }\n    // #endif\n  } else {\n    if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) {\n      this.pre = node.pre = 1\n    }\n    node.children = []\n    this.stack.push(node)\n  }\n\n  // 加入节点树\n  siblings.push(node)\n}\n\n/**\n * @description 解析到标签结束\n * @param {String} name 标签名\n * @private\n */\nParser.prototype.onCloseTag = function (name) {\n  // 依次出栈到匹配为止\n  name = this.xml ? name : name.toLowerCase()\n  let i\n  for (i = this.stack.length; i--;) {\n    if (this.stack[i].name === name) break\n  }\n  if (i !== -1) {\n    while (this.stack.length > i) {\n      this.popNode()\n    }\n  } else if (name === 'p' || name === 'br') {\n    const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes\n    siblings.push({\n      name,\n      attrs: {\n        class: tagSelector[name] || '',\n        style: this.tagStyle[name] || ''\n      }\n    })\n  }\n}\n\n/**\n * @description 处理标签出栈\n * @private\n */\nParser.prototype.popNode = function () {\n  const node = this.stack.pop()\n  let attrs = node.attrs\n  const children = node.children\n  const parent = this.stack[this.stack.length - 1]\n  const siblings = parent ? parent.children : this.nodes\n\n  if (!this.hook(node) || config.ignoreTags[node.name]) {\n    // 获取标题\n    if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) {\n      uni.setNavigationBarTitle({\n        title: children[0].text\n      })\n    }\n    siblings.pop()\n    return\n  }\n\n  if (node.pre && this.pre !== 2) {\n    // 是否合并空白符标识\n    this.pre = node.pre = undefined\n    for (let i = this.stack.length; i--;) {\n      if (this.stack[i].pre) {\n        this.pre = 1\n      }\n    }\n  }\n\n  const styleObj = {}\n\n  // 转换 svg\n  if (node.name === 'svg') {\n    if (this.xml > 1) {\n      // 多层 svg 嵌套\n      this.xml--\n      return\n    }\n    // #ifdef APP-PLUS-NVUE\n    (function traversal (node) {\n      if (node.name) {\n        // 调整 svg 的大小写\n        node.name = config.svgDict[node.name] || node.name\n        for (const item in node.attrs) {\n          if (config.svgDict[item]) {\n            node.attrs[config.svgDict[item]] = node.attrs[item]\n            node.attrs[item] = undefined\n          }\n        }\n        for (let i = 0; i < (node.children || []).length; i++) {\n          traversal(node.children[i])\n        }\n      }\n    })(node)\n    // #endif\n    // #ifndef APP-PLUS-NVUE\n    let src = ''\n    const style = attrs.style\n    attrs.style = ''\n    attrs.xmlns = 'http://www.w3.org/2000/svg';\n    (function traversal (node) {\n      if (node.type === 'text') {\n        src += node.text\n        return\n      }\n      const name = config.svgDict[node.name] || node.name\n      src += '<' + name\n      for (const item in node.attrs) {\n        const val = node.attrs[item]\n        if (val) {\n          src += ` ${config.svgDict[item] || item}=\"${val}\"`\n        }\n      }\n      if (!node.children) {\n        src += '/>'\n      } else {\n        src += '>'\n        for (let i = 0; i < node.children.length; i++) {\n          traversal(node.children[i])\n        }\n        src += '</' + name + '>'\n      }\n    })(node)\n    node.name = 'img'\n    node.attrs = {\n      src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),\n      style,\n      ignore: 'T'\n    }\n    node.children = undefined\n    // #endif\n    this.xml = false\n    return\n  }\n\n  // #ifndef APP-PLUS-NVUE\n  // 转换 align 属性\n  if (attrs.align) {\n    if (node.name === 'table') {\n      if (attrs.align === 'center') {\n        styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'\n      } else {\n        styleObj.float = attrs.align\n      }\n    } else {\n      styleObj['text-align'] = attrs.align\n    }\n    attrs.align = undefined\n  }\n\n  // 转换 dir 属性\n  if (attrs.dir) {\n    styleObj.direction = attrs.dir\n    attrs.dir = undefined\n  }\n\n  // 转换 font 标签的属性\n  if (node.name === 'font') {\n    if (attrs.color) {\n      styleObj.color = attrs.color\n      attrs.color = undefined\n    }\n    if (attrs.face) {\n      styleObj['font-family'] = attrs.face\n      attrs.face = undefined\n    }\n    if (attrs.size) {\n      let size = parseInt(attrs.size)\n      if (!isNaN(size)) {\n        if (size < 1) {\n          size = 1\n        } else if (size > 7) {\n          size = 7\n        }\n        styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][size - 1]\n      }\n      attrs.size = undefined\n    }\n  }\n  // #endif\n\n  // 一些编辑器的自带 class\n  if ((attrs.class || '').includes('align-center')) {\n    styleObj['text-align'] = 'center'\n  }\n\n  Object.assign(styleObj, this.parseStyle(node))\n\n  if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) {\n    styleObj['max-width'] = '100%'\n    styleObj['box-sizing'] = 'border-box'\n  }\n\n  // #ifndef APP-PLUS-NVUE\n  if (config.blockTags[node.name]) {\n    node.name = 'div'\n  } else if (!config.trustTags[node.name] && !this.xml) {\n    // 未知标签转为 span，避免无法显示\n    node.name = 'span'\n  }\n\n  if (node.name === 'a' || node.name === 'ad'\n    // #ifdef H5 || APP-PLUS\n    || node.name === 'iframe' // eslint-disable-line\n    // #endif\n  ) {\n    this.expose()\n  } else if (node.name === 'video') {\n    if ((styleObj.height || '').includes('auto')) {\n      styleObj.height = undefined\n    }\n    /* #ifdef APP-PLUS */\n    let str = '<video style=\"width:100%;height:100%\"'\n    for (const item in attrs) {\n      if (attrs[item]) {\n        str += ' ' + item + '=\"' + attrs[item] + '\"'\n      }\n    }\n    if (this.options.pauseVideo) {\n      str += ' onplay=\"this.dispatchEvent(new CustomEvent(\\'vplay\\',{bubbles:!0}));for(var e=document.getElementsByTagName(\\'video\\'),t=0;t<e.length;t++)e[t]!=this&&e[t].pause()\"'\n    }\n    str += '>'\n    for (let i = 0; i < node.src.length; i++) {\n      str += '<source src=\"' + node.src[i] + '\">'\n    }\n    str += '</video>'\n    node.html = str\n    /* #endif */\n  } else if ((node.name === 'ul' || node.name === 'ol') && node.c) {\n    // 列表处理\n    const types = {\n      a: 'lower-alpha',\n      A: 'upper-alpha',\n      i: 'lower-roman',\n      I: 'upper-roman'\n    }\n    if (types[attrs.type]) {\n      attrs.style += ';list-style-type:' + types[attrs.type]\n      attrs.type = undefined\n    }\n    for (let i = children.length; i--;) {\n      if (children[i].name === 'li') {\n        children[i].c = 1\n      }\n    }\n  } else if (node.name === 'table') {\n    // 表格处理\n    // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现\n    let padding = parseFloat(attrs.cellpadding)\n    let spacing = parseFloat(attrs.cellspacing)\n    const border = parseFloat(attrs.border)\n    const bordercolor = styleObj['border-color']\n    const borderstyle = styleObj['border-style']\n    if (node.c) {\n      // padding 和 spacing 默认 2\n      if (isNaN(padding)) {\n        padding = 2\n      }\n      if (isNaN(spacing)) {\n        spacing = 2\n      }\n    }\n    if (border) {\n      attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}`\n    }\n    if (node.flag && node.c) {\n      // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现\n      styleObj.display = 'grid'\n      if (spacing) {\n        styleObj['grid-gap'] = spacing + 'px'\n        styleObj.padding = spacing + 'px'\n      } else if (border) {\n        // 无间隔的情况下避免边框重叠\n        attrs.style += ';border-left:0;border-top:0'\n      }\n\n      const width = [] // 表格的列宽\n      const trList = [] // tr 列表\n      const cells = [] // 保存新的单元格\n      const map = {}; // 被合并单元格占用的格子\n\n      (function traversal (nodes) {\n        for (let i = 0; i < nodes.length; i++) {\n          if (nodes[i].name === 'tr') {\n            trList.push(nodes[i])\n          } else {\n            traversal(nodes[i].children || [])\n          }\n        }\n      })(children)\n\n      for (let row = 1; row <= trList.length; row++) {\n        let col = 1\n        for (let j = 0; j < trList[row - 1].children.length; j++) {\n          const td = trList[row - 1].children[j]\n          if (td.name === 'td' || td.name === 'th') {\n            // 这个格子被上面的单元格占用，则列号++\n            while (map[row + '.' + col]) {\n              col++\n            }\n            let style = td.attrs.style || ''\n            let start = style.indexOf('width') ? style.indexOf(';width') : 0\n            // 提取出 td 的宽度\n            if (start !== -1) {\n              let end = style.indexOf(';', start + 6)\n              if (end === -1) {\n                end = style.length\n              }\n              if (!td.attrs.colspan) {\n                width[col] = style.substring(start ? start + 7 : 6, end)\n              }\n              style = style.substr(0, start) + style.substr(end)\n            }\n            // 设置竖直对齐\n            style += ';display:flex'\n            start = style.indexOf('vertical-align')\n            if (start !== -1) {\n              const val = style.substr(start + 15, 10)\n              if (val.includes('middle')) {\n                style += ';align-items:center'\n              } else if (val.includes('bottom')) {\n                style += ';align-items:flex-end'\n              }\n            } else {\n              style += ';align-items:center'\n            }\n            // 设置水平对齐\n            start = style.indexOf('text-align')\n            if (start !== -1) {\n              const val = style.substr(start + 11, 10)\n              if (val.includes('center')) {\n                style += ';justify-content: center'\n              } else if (val.includes('right')) {\n                style += ';justify-content: right'\n              }\n            }\n            style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '') + ';' + style\n            // 处理列合并\n            if (td.attrs.colspan) {\n              style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}`\n              if (!td.attrs.rowspan) {\n                style += `;grid-row-start:${row};grid-row-end:${row + 1}`\n              }\n              col += parseInt(td.attrs.colspan) - 1\n            }\n            // 处理行合并\n            if (td.attrs.rowspan) {\n              style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}`\n              if (!td.attrs.colspan) {\n                style += `;grid-column-start:${col};grid-column-end:${col + 1}`\n              }\n              // 记录下方单元格被占用\n              for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) {\n                for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) {\n                  map[(row + rowspan) + '.' + (col - colspan)] = 1\n                }\n              }\n            }\n            if (style) {\n              td.attrs.style = style\n            }\n            cells.push(td)\n            col++\n          }\n        }\n        if (row === 1) {\n          let temp = ''\n          for (let i = 1; i < col; i++) {\n            temp += (width[i] ? width[i] : 'auto') + ' '\n          }\n          styleObj['grid-template-columns'] = temp\n        }\n      }\n      node.children = cells\n    } else {\n      // 没有使用合并单元格的表格通过 table 布局实现\n      if (node.c) {\n        styleObj.display = 'table'\n      }\n      if (!isNaN(spacing)) {\n        styleObj['border-spacing'] = spacing + 'px'\n      }\n      if (border || padding) {\n        // 遍历\n        (function traversal (nodes) {\n          for (let i = 0; i < nodes.length; i++) {\n            const td = nodes[i]\n            if (td.name === 'th' || td.name === 'td') {\n              if (border) {\n                td.attrs.style = `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}`\n              }\n              if (padding) {\n                td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}`\n              }\n            } else if (td.children) {\n              traversal(td.children)\n            }\n          }\n        })(children)\n      }\n    }\n    // 给表格添加一个单独的横向滚动层\n    if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {\n      const table = Object.assign({}, node)\n      node.name = 'div'\n      node.attrs = {\n        style: 'overflow:auto'\n      }\n      node.children = [table]\n      attrs = table.attrs\n    }\n  } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) {\n    for (let i = this.stack.length; i--;) {\n      if (this.stack[i].name === 'table') {\n        this.stack[i].flag = 1 // 指示含有合并单元格\n        break\n      }\n    }\n  } else if (node.name === 'ruby') {\n    // 转换 ruby\n    node.name = 'span'\n    for (let i = 0; i < children.length - 1; i++) {\n      if (children[i].type === 'text' && children[i + 1].name === 'rt') {\n        children[i] = {\n          name: 'div',\n          attrs: {\n            style: 'display:inline-block;text-align:center'\n          },\n          children: [{\n            name: 'div',\n            attrs: {\n              style: 'font-size:50%;' + (children[i + 1].attrs.style || '')\n            },\n            children: children[i + 1].children\n          }, children[i]]\n        }\n        children.splice(i + 1, 1)\n      }\n    }\n  } else if (node.c) {\n    (function traversal (node) {\n      node.c = 2\n      for (let i = node.children.length; i--;) {\n        const child = node.children[i]\n        // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3\n        if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes('inline') && child.children)) && !child.c) {\n          traversal(child)\n        }\n        // #endif\n        if (!child.c || child.name === 'table') {\n          node.c = 1\n        }\n      }\n    })(node)\n  }\n\n  if ((styleObj.display || '').includes('flex') && !node.c) {\n    for (let i = children.length; i--;) {\n      const item = children[i]\n      if (item.f) {\n        item.attrs.style = (item.attrs.style || '') + item.f\n        item.f = undefined\n      }\n    }\n  }\n  // flex 布局时部分样式需要提取到 rich-text 外层\n  const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes('grid'))\n    // #ifdef MP-WEIXIN\n    // 检查基础库版本 virtualHost 是否可用\n    && !(node.c && wx.getNFCAdapter) // eslint-disable-line\n    // #endif\n    // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO\n    && !node.c // eslint-disable-line\n  // #endif\n  if (flex) {\n    node.f = ';max-width:100%'\n  }\n\n  if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) {\n    mergeNodes(children)\n  }\n  // #endif\n\n  for (const key in styleObj) {\n    if (styleObj[key]) {\n      const val = `;${key}:${styleObj[key].replace(' !important', '')}`\n      /* #ifndef APP-PLUS-NVUE */\n      if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes('grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) {\n        node.f += val\n        if (key === 'width') {\n          attrs.style += ';width:100%'\n        }\n      } else /* #endif */ {\n        attrs.style += val\n      }\n    }\n  }\n  attrs.style = attrs.style.substr(1) || undefined\n  // #ifdef (MP-WEIXIN || MP-QQ) && VUE3\n  for (const key in attrs) {\n    if (!attrs[key]) {\n      delete attrs[key]\n    }\n  }\n  // #endif\n}\n\n/**\n * @description 解析到文本\n * @param {String} text 文本内容\n */\nParser.prototype.onText = function (text) {\n  if (!this.pre) {\n    // 合并空白符\n    let trim = ''\n    let flag\n    for (let i = 0, len = text.length; i < len; i++) {\n      if (!blankChar[text[i]]) {\n        trim += text[i]\n      } else {\n        if (trim[trim.length - 1] !== ' ') {\n          trim += ' '\n        }\n        if (text[i] === '\\n' && !flag) {\n          flag = true\n        }\n      }\n    }\n    // 去除含有换行符的空串\n    if (trim === ' ') {\n      if (flag) return\n      // #ifdef VUE3\n      else {\n        const parent = this.stack[this.stack.length - 1]\n        if (parent && parent.name[0] === 't') return\n      }\n      // #endif\n    }\n    text = trim\n  }\n  const node = Object.create(null)\n  node.type = 'text'\n  // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3\n  node.attrs = {}\n  // #endif\n  node.text = decodeEntity(text)\n  if (this.hook(node)) {\n    // #ifdef MP-WEIXIN\n    if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse('rich-text.user-select')) {\n      this.expose()\n    }\n    // #endif\n    const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes\n    siblings.push(node)\n  }\n}\n\n/**\n * @description html 词法分析器\n * @param {Object} handler 高层处理器\n */\nfunction Lexer (handler) {\n  this.handler = handler\n}\n\n/**\n * @description 执行解析\n * @param {String} content 要解析的文本\n */\nLexer.prototype.parse = function (content) {\n  this.content = content || ''\n  this.i = 0 // 标记解析位置\n  this.start = 0 // 标记一个单词的开始位置\n  this.state = this.text // 当前状态\n  for (let len = this.content.length; this.i !== -1 && this.i < len;) {\n    this.state()\n  }\n}\n\n/**\n * @description 检查标签是否闭合\n * @param {String} method 如果闭合要进行的操作\n * @returns {Boolean} 是否闭合\n * @private\n */\nLexer.prototype.checkClose = function (method) {\n  const selfClose = this.content[this.i] === '/'\n  if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) {\n    if (method) {\n      this.handler[method](this.content.substring(this.start, this.i))\n    }\n    this.i += selfClose ? 2 : 1\n    this.start = this.i\n    this.handler.onOpenTag(selfClose)\n    if (this.handler.tagName === 'script') {\n      this.i = this.content.indexOf('</', this.i)\n      if (this.i !== -1) {\n        this.i += 2\n        this.start = this.i\n      }\n      this.state = this.endTag\n    } else {\n      this.state = this.text\n    }\n    return true\n  }\n  return false\n}\n\n/**\n * @description 文本状态\n * @private\n */\nLexer.prototype.text = function () {\n  this.i = this.content.indexOf('<', this.i) // 查找最近的标签\n  if (this.i === -1) {\n    // 没有标签了\n    if (this.start < this.content.length) {\n      this.handler.onText(this.content.substring(this.start, this.content.length))\n    }\n    return\n  }\n  const c = this.content[this.i + 1]\n  if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {\n    // 标签开头\n    if (this.start !== this.i) {\n      this.handler.onText(this.content.substring(this.start, this.i))\n    }\n    this.start = ++this.i\n    this.state = this.tagName\n  } else if (c === '/' || c === '!' || c === '?') {\n    if (this.start !== this.i) {\n      this.handler.onText(this.content.substring(this.start, this.i))\n    }\n    const next = this.content[this.i + 2]\n    if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) {\n      // 标签结尾\n      this.i += 2\n      this.start = this.i\n      this.state = this.endTag\n      return\n    }\n    // 处理注释\n    let end = '-->'\n    if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') {\n      end = '>'\n    }\n    this.i = this.content.indexOf(end, this.i)\n    if (this.i !== -1) {\n      this.i += end.length\n      this.start = this.i\n    }\n  } else {\n    this.i++\n  }\n}\n\n/**\n * @description 标签名状态\n * @private\n */\nLexer.prototype.tagName = function () {\n  if (blankChar[this.content[this.i]]) {\n    // 解析到标签名\n    this.handler.onTagName(this.content.substring(this.start, this.i))\n    while (blankChar[this.content[++this.i]]);\n    if (this.i < this.content.length && !this.checkClose()) {\n      this.start = this.i\n      this.state = this.attrName\n    }\n  } else if (!this.checkClose('onTagName')) {\n    this.i++\n  }\n}\n\n/**\n * @description 属性名状态\n * @private\n */\nLexer.prototype.attrName = function () {\n  let c = this.content[this.i]\n  if (blankChar[c] || c === '=') {\n    // 解析到属性名\n    this.handler.onAttrName(this.content.substring(this.start, this.i))\n    let needVal = c === '='\n    const len = this.content.length\n    while (++this.i < len) {\n      c = this.content[this.i]\n      if (!blankChar[c]) {\n        if (this.checkClose()) return\n        if (needVal) {\n          // 等号后遇到第一个非空字符\n          this.start = this.i\n          this.state = this.attrVal\n          return\n        }\n        if (this.content[this.i] === '=') {\n          needVal = true\n        } else {\n          this.start = this.i\n          this.state = this.attrName\n          return\n        }\n      }\n    }\n  } else if (!this.checkClose('onAttrName')) {\n    this.i++\n  }\n}\n\n/**\n * @description 属性值状态\n * @private\n */\nLexer.prototype.attrVal = function () {\n  const c = this.content[this.i]\n  const len = this.content.length\n  if (c === '\"' || c === \"'\") {\n    // 有冒号的属性\n    this.start = ++this.i\n    this.i = this.content.indexOf(c, this.i)\n    if (this.i === -1) return\n    this.handler.onAttrVal(this.content.substring(this.start, this.i))\n  } else {\n    // 没有冒号的属性\n    for (; this.i < len; this.i++) {\n      if (blankChar[this.content[this.i]]) {\n        this.handler.onAttrVal(this.content.substring(this.start, this.i))\n        break\n      } else if (this.checkClose('onAttrVal')) return\n    }\n  }\n  while (blankChar[this.content[++this.i]]);\n  if (this.i < len && !this.checkClose()) {\n    this.start = this.i\n    this.state = this.attrName\n  }\n}\n\n/**\n * @description 结束标签状态\n * @returns {String} 结束的标签名\n * @private\n */\nLexer.prototype.endTag = function () {\n  const c = this.content[this.i]\n  if (blankChar[c] || c === '>' || c === '/') {\n    this.handler.onCloseTag(this.content.substring(this.start, this.i))\n    if (c !== '>') {\n      this.i = this.content.indexOf('>', this.i)\n      if (this.i === -1) return\n    }\n    this.start = ++this.i\n    this.state = this.text\n  } else {\n    this.i++\n  }\n}\n\nexport default Parser\n"
  },
  {
    "path": "uni_modules/mp-html/package.json",
    "content": "{\n    \"id\": \"mp-html\",\n    \"displayName\": \"mp-html 富文本组件【全端支持，支持编辑、latex等扩展】\",\n    \"version\": \"v2.4.0\",\n    \"description\": \"一个强大的富文本组件，高效轻量，功能丰富\",\n    \"keywords\": [\n        \"富文本\",\n        \"编辑器\",\n        \"html\",\n        \"rich-text\",\n        \"editor\"\n    ],\n    \"repository\": \"https://github.com/jin-yufeng/mp-html\",\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/mp-html\",\n        \"type\": \"component-vue\"\n    },\n    \"uni_modules\": {\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\": \"u\",\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}"
  },
  {
    "path": "uni_modules/mp-html/static/app-plus/mp-html/js/handler.js",
    "content": "\"use strict\";function t(t){for(var e=Object.create(null),n=t.attributes.length;n--;)e[t.attributes[n].name]=t.attributes[n].value;return e}function e(){a[1]&&(this.src=a[1],this.onerror=null),this.onclick=null,this.ontouchstart=null,uni.postMessage({data:{action:\"onError\",source:\"img\",attrs:t(this)}})}function n(){window.unloadimgs-=1,0===window.unloadimgs&&uni.postMessage({data:{action:\"onReady\"}})}function o(r,s,c){for(var d=0;d<r.length;d++)!function(d){var u=r[d],l=void 0;if(u.type&&\"node\"!==u.type)l=document.createTextNode(u.text.replace(/&amp;/g,\"&\"));else{var g=u.name;\"svg\"===g&&(c=\"http://www.w3.org/2000/svg\"),\"html\"!==g&&\"body\"!==g||(g=\"div\"),l=c?document.createElementNS(c,g):document.createElement(g);for(var p in u.attrs)l.setAttribute(p,u.attrs[p]);if(u.children&&o(u.children,l,c),\"img\"===g){if(window.unloadimgs+=1,l.onload=n,l.onerror=n,!l.src&&l.getAttribute(\"data-src\")&&(l.src=l.getAttribute(\"data-src\")),u.attrs.ignore||(l.onclick=function(e){e.stopPropagation(),uni.postMessage({data:{action:\"onImgTap\",attrs:t(this)}})}),a[2]){var h=new Image;h.src=l.src,l.src=a[2],h.onload=function(){l.src=this.src},h.onerror=function(){l.onerror()}}l.onerror=e}else if(\"a\"===g)l.addEventListener(\"click\",function(e){e.stopPropagation(),e.preventDefault();var n,o=this.getAttribute(\"href\");o&&\"#\"===o[0]&&(n=(document.getElementById(o.substr(1))||{}).offsetTop),uni.postMessage({data:{action:\"onLinkTap\",attrs:t(this),offset:n}})},!0);else if(\"video\"===g||\"audio\"===g)i.push(l),u.attrs.autoplay||u.attrs.controls||l.setAttribute(\"controls\",\"true\"),l.onplay=function(){if(uni.postMessage({data:{action:\"onPlay\"}}),a[3])for(var t=0;t<i.length;t++)i[t]!==this&&i[t].pause()},l.onerror=function(){uni.postMessage({data:{action:\"onError\",source:g,attrs:t(this)}})};else if(\"table\"===g&&a[4]&&!l.style.cssText.includes(\"inline\")){var f=document.createElement(\"div\");f.style.overflow=\"auto\",f.appendChild(l),l=f}else\"svg\"===g&&(c=void 0)}s.appendChild(l)}(d)}document.addEventListener(\"UniAppJSBridgeReady\",function(){document.body.onclick=function(){return uni.postMessage({data:{action:\"onClick\"}})},uni.postMessage({data:{action:\"onJSBridgeReady\"}})});var a,i=[];window.setContent=function(t,e,n){var r=document.getElementById(\"content\");e[0]&&(document.body.style.cssText=e[0]),e[5]||(r.style.userSelect=\"none\"),n||(r.innerHTML=\"\",i=[]),a=e,window.unloadimgs=0;var s=document.createDocumentFragment();o(t,s),r.appendChild(s);var c=r.scrollHeight;uni.postMessage({data:{action:\"onLoad\",height:c}}),window.unloadimgs||uni.postMessage({data:{action:\"onReady\",height:c}}),clearInterval(window.timer),window.timer=setInterval(function(){r.scrollHeight!==c&&(c=r.scrollHeight,uni.postMessage({data:{action:\"onHeightChange\",height:c}}))},350)},window.onunload=function(){clearInterval(window.timer)};"
  },
  {
    "path": "uni_modules/mp-html/static/app-plus/mp-html/local.html",
    "content": "<head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no\"><style>body,html{width:100%;height:100%;overflow-x:scroll;overflow-y:hidden}body{margin:0}video{width:300px;height:225px}img{max-width:100%;-webkit-touch-callout:none}</style></head><body><div id=\"content\" style=\"overflow:hidden\"></div><script type=\"text/javascript\" src=\"./js/uni.webview.min.js\"></script><script type=\"text/javascript\" src=\"./js/handler.js\"></script></body>"
  },
  {
    "path": "uni_modules/uni-scss/changelog.md",
    "content": "## 1.0.3（2022-01-21）\n- 优化 组件示例\n## 1.0.2（2021-11-22）\n- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题\n## 1.0.1（2021-11-22）\n- 修复 vue3中scss语法兼容问题\n## 1.0.0（2021-11-18）\n- init\n"
  },
  {
    "path": "uni_modules/uni-scss/index.scss",
    "content": "@import './styles/index.scss';\n"
  },
  {
    "path": "uni_modules/uni-scss/package.json",
    "content": "{\n  \"id\": \"uni-scss\",\n  \"displayName\": \"uni-scss 辅助样式\",\n  \"version\": \"1.0.3\",\n  \"description\": \"uni-sass是uni-ui提供的一套全局样式 ，通过一些简单的类名和sass变量，实现简单的页面布局操作，比如颜色、边距、圆角等。\",\n  \"keywords\": [\n    \"uni-scss\",\n    \"uni-ui\",\n    \"辅助样式\"\n],\n  \"repository\": \"https://github.com/dcloudio/uni-ui\",\n  \"engines\": {\n    \"HBuilderX\": \"^3.1.0\"\n  },\n  \"dcloudext\": {\n    \"category\": [\n        \"JS SDK\",\n        \"通用 SDK\"\n    ],\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/@dcloudio/uni-ui\"\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\": \"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          \"阿里\": \"y\",\n          \"百度\": \"y\",\n          \"字节跳动\": \"y\",\n          \"QQ\": \"y\"\n        },\n        \"快应用\": {\n          \"华为\": \"n\",\n          \"联盟\": \"n\"\n        },\n        \"Vue\": {\n            \"vue2\": \"y\",\n            \"vue3\": \"y\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "uni_modules/uni-scss/readme.md",
    "content": "`uni-sass` 是 `uni-ui`提供的一套全局样式 ，通过一些简单的类名和`sass`变量，实现简单的页面布局操作，比如颜色、边距、圆角等。\n\n### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)\n#### 如使用过程中有任何问题，或者您对uni-ui有一些好的建议，欢迎加入 uni-ui 交流群：871950839 "
  },
  {
    "path": "uni_modules/uni-scss/styles/index.scss",
    "content": "@import './setting/_variables.scss';\n@import './setting/_border.scss';\n@import './setting/_color.scss';\n@import './setting/_space.scss';\n@import './setting/_radius.scss';\n@import './setting/_text.scss';\n@import './setting/_styles.scss';\n"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_border.scss",
    "content": ".uni-border {\n\tborder: 1px $uni-border-1 solid;\n}"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_color.scss",
    "content": "\n// TODO 暂时不需要 class ，需要用户使用变量实现 ，如果使用类名其实并不推荐\n// @mixin get-styles($k,$c) {\n// \t@if $k == size or $k == weight{\n// \t\tfont-#{$k}:#{$c}\n// \t}@else{\n// \t\t#{$k}:#{$c}\n// \t}\n// }\n$uni-ui-color:(\n\t// 主色\n\tprimary: $uni-primary,\n\tprimary-disable: $uni-primary-disable,\n\tprimary-light: $uni-primary-light,\n\t// 辅助色\n\tsuccess: $uni-success,\n\tsuccess-disable: $uni-success-disable,\n\tsuccess-light: $uni-success-light,\n\twarning: $uni-warning,\n\twarning-disable: $uni-warning-disable,\n\twarning-light: $uni-warning-light,\n\terror: $uni-error,\n\terror-disable: $uni-error-disable,\n\terror-light: $uni-error-light,\n\tinfo: $uni-info,\n\tinfo-disable: $uni-info-disable,\n\tinfo-light: $uni-info-light,\n\t// 中性色\n\tmain-color: $uni-main-color,\n\tbase-color: $uni-base-color,\n\tsecondary-color: $uni-secondary-color,\n\textra-color: $uni-extra-color,\n\t// 背景色\n\tbg-color: $uni-bg-color,\n\t// 边框颜色\n\tborder-1: $uni-border-1,\n\tborder-2: $uni-border-2,\n\tborder-3: $uni-border-3,\n\tborder-4: $uni-border-4,\n\t// 黑色\n\tblack:$uni-black,\n\t// 白色\n\twhite:$uni-white,\n\t// 透明\n\ttransparent:$uni-transparent\n) !default;\n@each $key, $child in $uni-ui-color {\n\t.uni-#{\"\" + $key} {\n\t\tcolor: $child;\n\t}\n\t.uni-#{\"\" + $key}-bg {\n\t\tbackground-color: $child;\n\t}\n}\n.uni-shadow-sm {\n\tbox-shadow: $uni-shadow-sm;\n}\n.uni-shadow-base {\n\tbox-shadow: $uni-shadow-base;\n}\n.uni-shadow-lg {\n\tbox-shadow: $uni-shadow-lg;\n}\n.uni-mask {\n\tbackground-color:$uni-mask;\n}\n"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_radius.scss",
    "content": "@mixin radius($r,$d:null ,$important: false){\n  $radius-value:map-get($uni-radius, $r) if($important, !important, null);\n  // Key exists within the $uni-radius variable\n  @if (map-has-key($uni-radius, $r) and  $d){\n\t\t@if $d == t {\n\t\t\t\tborder-top-left-radius:$radius-value;\n\t\t\t\tborder-top-right-radius:$radius-value;\n\t\t}@else if $d == r {\n\t\t\t\tborder-top-right-radius:$radius-value;\n\t\t\t\tborder-bottom-right-radius:$radius-value;\n\t\t}@else if $d == b {\n\t\t\t\tborder-bottom-left-radius:$radius-value;\n\t\t\t\tborder-bottom-right-radius:$radius-value;\n\t\t}@else if $d == l {\n\t\t\t\tborder-top-left-radius:$radius-value;\n\t\t\t\tborder-bottom-left-radius:$radius-value;\n\t\t}@else if $d == tl {\n\t\t\t\tborder-top-left-radius:$radius-value;\n\t\t}@else if $d == tr {\n\t\t\t\tborder-top-right-radius:$radius-value;\n\t\t}@else if $d == br {\n\t\t\t\tborder-bottom-right-radius:$radius-value;\n\t\t}@else if $d == bl {\n\t\t\t\tborder-bottom-left-radius:$radius-value;\n\t\t}\n  }@else{\n\t\tborder-radius:$radius-value;\n  }\n}\n\n@each $key, $child in $uni-radius {\n\t@if($key){\n\t\t.uni-radius-#{\"\" + $key} {\n\t\t\t\t@include radius($key)\n\t\t}\n\t}@else{\n\t\t.uni-radius {\n\t\t\t\t@include radius($key)\n\t\t}\n\t}\n}\n\n@each $direction in t, r, b, l,tl, tr, br, bl {\n\t@each $key, $child in $uni-radius {\n\t\t@if($key){\n\t\t\t.uni-radius-#{\"\" + $direction}-#{\"\" + $key} {\n\t\t\t\t@include radius($key,$direction,false)\n\t\t\t}\n\t\t}@else{\n\t\t\t.uni-radius-#{$direction} {\n\t\t\t\t@include radius($key,$direction,false)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_space.scss",
    "content": "\n@mixin fn($space,$direction,$size,$n) {\n\t@if $n {\n\t\t#{$space}-#{$direction}: #{$size*$uni-space-root}px\n\t} @else {\n\t\t #{$space}-#{$direction}: #{-$size*$uni-space-root}px\n\t}\n}\n@mixin get-styles($direction,$i,$space,$n){\n\t@if $direction == t {\n\t\t@include fn($space, top,$i,$n);\n\t} \n\t@if $direction == r {\n\t\t@include fn($space, right,$i,$n);\n\t} \n\t@if $direction == b {\n\t\t@include fn($space, bottom,$i,$n);\n\t} \n\t@if $direction == l {\n\t @include fn($space, left,$i,$n);\n\t} \n\t@if $direction == x {\n\t\t@include fn($space, left,$i,$n);\n\t\t@include fn($space, right,$i,$n);\n\t} \n\t@if $direction == y {\n\t\t@include fn($space, top,$i,$n);\n\t\t@include fn($space, bottom,$i,$n);\n\t} \n\t@if $direction == a {\n\t\t@if $n {\n\t\t\t#{$space}:#{$i*$uni-space-root}px;\n\t\t} @else {\n\t\t\t#{$space}:#{-$i*$uni-space-root}px;\n\t\t}\n\t} \n}\n\n@each $orientation in m,p {\n\t$space: margin;\n\t@if $orientation == m {\n\t\t$space: margin;\n\t} @else {\n\t\t$space: padding;\n\t}\n\t@for $i from 0 through 16 {\n\t\t@each $direction in t, r, b, l, x, y, a {\n\t\t\t.uni-#{$orientation}#{$direction}-#{$i} { \n\t\t\t\t@include  get-styles($direction,$i,$space,true);\n\t\t\t} \n\t\t\t.uni-#{$orientation}#{$direction}-n#{$i} { \n\t\t\t\t@include  get-styles($direction,$i,$space,false);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_styles.scss",
    "content": "/* #ifndef APP-NVUE */\n\n$-color-white:#fff;\n$-color-black:#000;\n@mixin base-style($color) {\n\tcolor: #fff;\n\tbackground-color: $color;\n\tborder-color: mix($-color-black, $color, 8%);\n\t&:not([hover-class]):active {\n\t\tbackground: mix($-color-black, $color, 10%);\n\t\tborder-color: mix($-color-black, $color, 20%);\n\t\tcolor: $-color-white;\n\t\toutline: none;\n\t}\n}\n@mixin is-color($color) {\n\t@include base-style($color);\n\t&[loading] {\n\t\t@include base-style($color);\n\t\t&::before {\n\t\t\tmargin-right:5px;\n\t\t}\n\t}\n\t&[disabled] {\n\t  &,\n\t\t&[loading],\n\t  &:not([hover-class]):active {\n\t    color: $-color-white;\n\t\t\tborder-color: mix(darken($color,10%), $-color-white);\n\t    background-color: mix($color, $-color-white);\n\t  }\n\t}\n\n}\n@mixin base-plain-style($color) {\n\tcolor:$color;\n\tbackground-color: mix($-color-white, $color, 90%);\n\tborder-color: mix($-color-white, $color, 70%);\n\t&:not([hover-class]):active {\n\t  background: mix($-color-white, $color, 80%);\n\t  color: $color;\n\t  outline: none;\n\t\tborder-color: mix($-color-white, $color, 50%);\n\t}\n}\n@mixin is-plain($color){\n\t&[plain] {\n\t\t@include base-plain-style($color);\n\t\t&[loading] {\n\t\t\t@include base-plain-style($color);\n\t\t\t&::before {\n\t\t\t\tmargin-right:5px;\n\t\t\t}\n\t\t}\n\t\t&[disabled] {\n\t\t  &,\n\t\t  &:active {\n\t\t    color: mix($-color-white, $color, 40%);\n\t\t    background-color: mix($-color-white, $color, 90%);\n\t\t\t\tborder-color: mix($-color-white, $color, 80%);\n\t\t  }\n\t\t}\n\t}\n}\n\n\n.uni-btn {\n\tmargin: 5px;\n\tcolor: #393939;\n\tborder:1px solid #ccc;\n\tfont-size: 16px;\n\tfont-weight: 200;\n\tbackground-color: #F9F9F9;\n\t// TODO 暂时处理边框隐藏一边的问题\n\toverflow: visible;\n\t&::after{\n\t\tborder: none;\n\t}\n\n\t&:not([type]),&[type=default] {\n\t\tcolor: #999;\n\t\t&[loading] {\n\t\t\tbackground: none;\n\t\t\t&::before {\n\t\t\t\tmargin-right:5px;\n\t\t\t}\n\t\t}\n\n\n\n\t\t&[disabled]{\n\t\t\tcolor: mix($-color-white, #999, 60%);\n\t\t  &,\n\t\t\t&[loading],\n\t\t  &:active {\n\t\t\t\tcolor: mix($-color-white, #999, 60%);\n\t\t    background-color: mix($-color-white,$-color-black , 98%);\n\t\t\t\tborder-color: mix($-color-white,  #999, 85%);\n\t\t  }\n\t\t}\n\n\t\t&[plain] {\n\t\t\tcolor: #999;\n\t\t\tbackground: none;\n\t\t\tborder-color: $uni-border-1;\n\t\t\t&:not([hover-class]):active {\n\t\t\t\tbackground: none;\n\t\t\t  color: mix($-color-white, $-color-black, 80%);\n\t\t\t\tborder-color: mix($-color-white, $-color-black, 90%);\n\t\t\t  outline: none;\n\t\t\t}\n\t\t\t&[disabled]{\n\t\t\t  &,\n\t\t\t\t&[loading],\n\t\t\t  &:active {\n\t\t\t    background: none;\n\t\t\t\t\tcolor: mix($-color-white, #999, 60%);\n\t\t\t\t\tborder-color: mix($-color-white,  #999, 85%);\n\t\t\t  }\n\t\t\t}\n\t\t}\n\t}\n\n\t&:not([hover-class]):active {\n\t  color: mix($-color-white, $-color-black, 50%);\n\t}\n\n\t&[size=mini] {\n\t\tfont-size: 16px;\n\t\tfont-weight: 200;\n\t\tborder-radius: 8px;\n\t}\n\n\n\n\t&.uni-btn-small {\n\t\tfont-size: 14px;\n\t}\n\t&.uni-btn-mini {\n\t\tfont-size: 12px;\n\t}\n\n\t&.uni-btn-radius {\n\t\tborder-radius: 999px;\n\t}\n\t&[type=primary] {\n\t\t@include is-color($uni-primary);\n\t\t@include is-plain($uni-primary)\n\t}\n\t&[type=success] {\n\t\t@include is-color($uni-success);\n\t\t@include is-plain($uni-success)\n\t}\n\t&[type=error] {\n\t\t@include is-color($uni-error);\n\t\t@include is-plain($uni-error)\n\t}\n\t&[type=warning] {\n\t\t@include is-color($uni-warning);\n\t\t@include is-plain($uni-warning)\n\t}\n\t&[type=info] {\n\t\t@include is-color($uni-info);\n\t\t@include is-plain($uni-info)\n\t}\n}\n/* #endif */\n"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_text.scss",
    "content": "@mixin get-styles($k,$c) {\n\t@if $k == size or $k == weight{\n\t\tfont-#{$k}:#{$c}\n\t}@else{\n\t\t#{$k}:#{$c}\n\t}\n}\n\n@each $key, $child in $uni-headings {\n\t/* #ifndef APP-NVUE */\n\t.uni-#{$key} {\n\t\t@each $k, $c in $child {\n\t\t\t@include get-styles($k,$c)\n\t\t}\n\t}\n\t/* #endif */\n\t/* #ifdef APP-NVUE */\n\t.container .uni-#{$key} {\n\t\t@each $k, $c in $child {\n\t\t\t@include get-styles($k,$c)\n\t\t}\n\t}\n\t/* #endif */\n}\n"
  },
  {
    "path": "uni_modules/uni-scss/styles/setting/_variables.scss",
    "content": "// @use \"sass:math\";\n@import  '../tools/functions.scss';\n// 间距基础倍数\n$uni-space-root: 2 !default;\n// 边框半径默认值\n$uni-radius-root:5px !default;\n$uni-radius: () !default;\n// 边框半径断点\n$uni-radius: map-deep-merge(\n  (\n    0: 0,\n\t\t// TODO 当前版本暂时不支持 sm 属性\n    // 'sm': math.div($uni-radius-root, 2),\n    null: $uni-radius-root,\n    'lg': $uni-radius-root * 2,\n    'xl': $uni-radius-root * 6,\n    'pill': 9999px,\n    'circle': 50%\n  ),\n  $uni-radius\n);\n// 字体家族\n$body-font-family: 'Roboto', sans-serif !default;\n// 文本\n$heading-font-family: $body-font-family !default;\n$uni-headings: () !default;\n$letterSpacing: -0.01562em;\n$uni-headings: map-deep-merge(\n  (\n    'h1': (\n      size: 32px,\n\t\t\tweight: 300,\n\t\t\tline-height: 50px,\n\t\t\t// letter-spacing:-0.01562em\n    ),\n    'h2': (\n      size: 28px,\n      weight: 300,\n      line-height: 40px,\n      // letter-spacing: -0.00833em\n    ),\n    'h3': (\n      size: 24px,\n      weight: 400,\n      line-height: 32px,\n      // letter-spacing: normal\n    ),\n    'h4': (\n      size: 20px,\n      weight: 400,\n      line-height: 30px,\n      // letter-spacing: 0.00735em\n    ),\n    'h5': (\n      size: 16px,\n      weight: 400,\n      line-height: 24px,\n      // letter-spacing: normal\n    ),\n    'h6': (\n      size: 14px,\n      weight: 500,\n      line-height: 18px,\n      // letter-spacing: 0.0125em\n    ),\n    'subtitle': (\n      size: 12px,\n      weight: 400,\n      line-height: 20px,\n      // letter-spacing: 0.00937em\n    ),\n    'body': (\n      font-size: 14px,\n\t\t\tfont-weight: 400,\n\t\t\tline-height: 22px,\n\t\t\t// letter-spacing: 0.03125em\n    ),\n    'caption': (\n      'size': 12px,\n      'weight': 400,\n      'line-height': 20px,\n      // 'letter-spacing': 0.03333em,\n      // 'text-transform': false\n    )\n  ),\n  $uni-headings\n);\n\n\n\n// 主色\n$uni-primary: #2979ff !default;\n$uni-primary-disable:lighten($uni-primary,20%) !default;\n$uni-primary-light: lighten($uni-primary,25%) !default;\n\n// 辅助色\n// 除了主色外的场景色，需要在不同的场景中使用（例如危险色表示危险的操作）。\n$uni-success: #18bc37 !default;\n$uni-success-disable:lighten($uni-success,20%) !default;\n$uni-success-light: lighten($uni-success,25%) !default;\n\n$uni-warning: #f3a73f !default;\n$uni-warning-disable:lighten($uni-warning,20%) !default;\n$uni-warning-light: lighten($uni-warning,25%) !default;\n\n$uni-error: #e43d33 !default;\n$uni-error-disable:lighten($uni-error,20%) !default;\n$uni-error-light: lighten($uni-error,25%) !default;\n\n$uni-info: #8f939c !default;\n$uni-info-disable:lighten($uni-info,20%) !default;\n$uni-info-light: lighten($uni-info,25%) !default;\n\n// 中性色\n// 中性色用于文本、背景和边框颜色。通过运用不同的中性色，来表现层次结构。\n$uni-main-color: #3a3a3a !default; \t\t\t// 主要文字\n$uni-base-color: #6a6a6a !default;\t\t\t// 常规文字\n$uni-secondary-color: #909399 !default;\t// 次要文字\n$uni-extra-color: #c7c7c7 !default;\t\t\t// 辅助说明\n\n// 边框颜色\n$uni-border-1: #F0F0F0 !default;\n$uni-border-2: #EDEDED !default;\n$uni-border-3: #DCDCDC !default;\n$uni-border-4: #B9B9B9 !default;\n\n// 常规色\n$uni-black: #000000 !default;\n$uni-white: #ffffff !default;\n$uni-transparent: rgba($color: #000000, $alpha: 0) !default;\n\n// 背景色\n$uni-bg-color: #f7f7f7 !default;\n\n/* 水平间距 */\n$uni-spacing-sm: 8px !default;\n$uni-spacing-base: 15px !default;\n$uni-spacing-lg: 30px !default;\n\n// 阴影\n$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;\n$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;\n$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;\n\n// 蒙版\n$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;\n"
  },
  {
    "path": "uni_modules/uni-scss/styles/tools/functions.scss",
    "content": "// 合并 map\n@function map-deep-merge($parent-map, $child-map){\n\t$result: $parent-map;\n\t@each $key, $child in $child-map {\n\t\t$parent-has-key: map-has-key($result, $key);\n\t\t$parent-value: map-get($result, $key);\n\t\t$parent-type: type-of($parent-value);\n\t\t$child-type: type-of($child);\n\t\t$parent-is-map: $parent-type == map;\n\t\t$child-is-map: $child-type == map;\n\t\t\t\n\t\t@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){\n\t\t\t$result: map-merge($result, ( $key: $child ));\n\t\t}@else {\n\t\t\t$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));\n\t\t}\n\t}\n\t@return $result;\n};\n"
  },
  {
    "path": "uni_modules/uni-scss/theme.scss",
    "content": "// 间距基础倍数\n$uni-space-root: 2;\n// 边框半径默认值\n$uni-radius-root:5px;\n// 主色\n$uni-primary: #2979ff;\n// 辅助色\n$uni-success: #4cd964;\n// 警告色\n$uni-warning: #f0ad4e;\n// 错误色\n$uni-error: #dd524d;\n// 描述色\n$uni-info: #909399;\n// 中性色\n$uni-main-color: #303133;\n$uni-base-color: #606266;\n$uni-secondary-color: #909399;\n$uni-extra-color: #C0C4CC;\n// 背景色\n$uni-bg-color: #f5f5f5;\n// 边框颜色\n$uni-border-1: #DCDFE6;\n$uni-border-2: #E4E7ED;\n$uni-border-3: #EBEEF5;\n$uni-border-4: #F2F6FC;\n\n// 常规色\n$uni-black: #000000;\n$uni-white: #ffffff;\n$uni-transparent: rgba($color: #000000, $alpha: 0);\n"
  },
  {
    "path": "uni_modules/uni-scss/variables.scss",
    "content": "@import './styles/setting/_variables.scss';\n// 间距基础倍数\n$uni-space-root: 2;\n// 边框半径默认值\n$uni-radius-root:5px;\n\n// 主色\n$uni-primary: #2979ff;\n$uni-primary-disable:mix(#fff,$uni-primary,50%);\n$uni-primary-light: mix(#fff,$uni-primary,80%);\n\n// 辅助色\n// 除了主色外的场景色，需要在不同的场景中使用（例如危险色表示危险的操作）。\n$uni-success: #18bc37;\n$uni-success-disable:mix(#fff,$uni-success,50%);\n$uni-success-light: mix(#fff,$uni-success,80%);\n\n$uni-warning: #f3a73f;\n$uni-warning-disable:mix(#fff,$uni-warning,50%);\n$uni-warning-light: mix(#fff,$uni-warning,80%);\n\n$uni-error: #e43d33;\n$uni-error-disable:mix(#fff,$uni-error,50%);\n$uni-error-light: mix(#fff,$uni-error,80%);\n\n$uni-info: #8f939c;\n$uni-info-disable:mix(#fff,$uni-info,50%);\n$uni-info-light: mix(#fff,$uni-info,80%);\n\n// 中性色\n// 中性色用于文本、背景和边框颜色。通过运用不同的中性色，来表现层次结构。\n$uni-main-color: #3a3a3a; \t\t\t// 主要文字\n$uni-base-color: #6a6a6a;\t\t\t// 常规文字\n$uni-secondary-color: #909399;\t// 次要文字\n$uni-extra-color: #c7c7c7;\t\t\t// 辅助说明\n\n// 边框颜色\n$uni-border-1: #F0F0F0;\n$uni-border-2: #EDEDED;\n$uni-border-3: #DCDCDC;\n$uni-border-4: #B9B9B9;\n\n// 常规色\n$uni-black: #000000;\n$uni-white: #ffffff;\n$uni-transparent: rgba($color: #000000, $alpha: 0);\n\n// 背景色\n$uni-bg-color: #f7f7f7;\n\n/* 水平间距 */\n$uni-spacing-sm: 8px;\n$uni-spacing-base: 15px;\n$uni-spacing-lg: 30px;\n\n// 阴影\n$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);\n$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);\n$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);\n\n// 蒙版\n$uni-mask: rgba($color: #000000, $alpha: 0.4);\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/changelog.md",
    "content": "## 1.3.8（2023-04-13）\n- 修复`uni-swipe-action`和`uni-swipe-action-item`不同时使用导致 closeOther 方法报错的 bug\n## 1.3.7（2022-06-06）\n- 修复 vue3 下使用组件不能正常运行的Bug\n## 1.3.6（2022-05-31）\n- 修复 h5端点击click触发两次的Bug\n## 1.3.5（2022-05-23）\n- 修复 isPC 找不到的Bug\n## 1.3.4（2022-05-19）\n-  修复 在 nvue 下 disabled 失效的bug\n## 1.3.3（2022-03-31）\n- 修复 按钮字体大小不能设置的bug\n## 1.3.2（2022-03-16）\n- 修复 h5和app端下报el错误的bug\n## 1.3.1（2022-03-07）\n- 修复 HBuilderX 1.4.X 版本中，h5和app端下报错的bug\n## 1.3.0（2021-11-19）\n- 优化 组件UI，并提供设计资源，详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)\n- 文档迁移，详见:[https://uniapp.dcloud.io/component/uniui/uni-swipe-action](https://uniapp.dcloud.io/component/uniui/uni-swipe-action)\n## 1.2.4（2021-08-20）\n- 优化 close-all 方法\n## 1.2.3（2021-08-20）\n- 新增 close-all 方法，关闭所有已打开的组件\n## 1.2.2（2021-08-17）\n- 新增 resize() 方法，在非微信小程序、h5、app-vue端出现不能滑动的问题的时候，重置组件\n- 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 \n- 优化 微信小程序、h5、app-vue 滑动逻辑，避免出现动态新增组件后不能滑动的问题\n## 1.2.1（2021-07-30）\n- 组件兼容 vue3，如何创建vue3项目，详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)\n- 修复 跨页面修改组件数据 ，导致不能滑动的问题\n## 1.1.10（2021-06-17）\n- 修复 按钮点击执行两次的bug\n## 1.1.9（2021-05-12）\n- 新增 项目示例地址\n## 1.1.8（2021-03-26）\n- 修复 微信小程序 nv_navigator is not defined 报错的bug\n## 1.1.7（2021-02-05）\n- 调整为uni_modules目录规范\n- 新增 左侧滑动\n- 新增 插槽使用方式\n- 新增 threshold 属性，可以控制滑动缺省值\n- 优化 长列表滚动性能\n- 修复 滚动页面时触发组件滑动的Bug\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue",
    "content": "<template>\n\t<view>\n\t\t<slot></slot>\n\t</view>\n</template>\n\n<script>\n\t/**\n\t * SwipeAction 滑动操作\n\t * @description 通过滑动触发选项的容器\n\t * @tutorial https://ext.dcloud.net.cn/plugin?id=181\n\t */\n\texport default {\n\t\tname:\"uniSwipeAction\",\n\t\tdata() {\n\t\t\treturn {};\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = [];\n\t\t},\n\t\tmethods: {\n\t\t\t// 公开给用户使用，重制组件样式\n\t\t\tresize(){\n\t\t\t\t// wxs 会自己计算组件大小，所以无需执行下面代码\n\t\t\t\t// #ifndef APP-VUE || H5 || MP-WEIXIN\n\t\t\t\tthis.children.forEach(vm=>{\n\t\t\t\t\tvm.init()\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 公开给用户使用，关闭全部 已经打开的组件\n\t\t\tcloseAll(){\n\t\t\t\tthis.children.forEach(vm=>{\n\t\t\t\t\t// #ifdef APP-VUE || H5 || MP-WEIXIN\n\t\t\t\t\tvm.is_show = 'none'\n\t\t\t\t\t// #endif\n\n\t\t\t\t\t// #ifndef APP-VUE || H5 || MP-WEIXIN\n\t\t\t\t\tvm.close()\n\t\t\t\t\t// #endif\n\t\t\t\t})\n\t\t\t},\n\t\t\tcloseOther(vm) {\n\t\t\t\tif (this.openItem && this.openItem !== vm) {\n\t\t\t\t\t// #ifdef APP-VUE || H5 || MP-WEIXIN\n\t\t\t\t\tthis.openItem.is_show = 'none'\n\t\t\t\t\t// #endif\n\n\t\t\t\t\t// #ifndef APP-VUE || H5 || MP-WEIXIN\n\t\t\t\t\tthis.openItem.close()\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t\t// 记录上一个打开的 swipe-action-item ,用于 auto-close\n\t\t\t\tthis.openItem = vm\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style></style>\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js",
    "content": "let bindIngXMixins = {}\n\n// #ifdef APP-NVUE\nconst BindingX = uni.requireNativePlugin('bindingx');\nconst dom = uni.requireNativePlugin('dom');\nconst animation = uni.requireNativePlugin('animation');\n\nbindIngXMixins = {\n\tdata() {\n\t\treturn {}\n\t},\n\n\twatch: {\n\t\tshow(newVal) {\n\t\t\tif (this.autoClose) return\n\t\t\tif (this.stop) return\n\t\t\tthis.stop = true\n\t\t\tif (newVal) {\n\t\t\t\tthis.open(newVal)\n\t\t\t} else {\n\t\t\t\tthis.close()\n\t\t\t}\n\t\t},\n\t\tleftOptions() {\n\t\t\tthis.getSelectorQuery()\n\t\t\tthis.init()\n\t\t},\n\t\trightOptions(newVal) {\n\t\t\tthis.init()\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.swipeaction = this.getSwipeAction()\n\t\tif (this.swipeaction && Array.isArray(this.swipeaction.children)) {\n\t\t\tthis.swipeaction.children.push(this)\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.box = this.getEl(this.$refs['selector-box--hock'])\n\t\tthis.selector = this.getEl(this.$refs['selector-content--hock']);\n\t\tthis.leftButton = this.getEl(this.$refs['selector-left-button--hock']);\n\t\tthis.rightButton = this.getEl(this.$refs['selector-right-button--hock']);\n\t\tthis.init()\n\t},\n\t// beforeDestroy() {\n\t// \tthis.swipeaction.children.forEach((item, index) => {\n\t// \t\tif (item === this) {\n\t// \t\t\tthis.swipeaction.children.splice(index, 1)\n\t// \t\t}\n\t// \t})\n\t// },\n\tmethods: {\n\t\tinit() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.x = 0\n\t\t\t\tthis.button = {\n\t\t\t\t\tshow: false\n\t\t\t\t}\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.getSelectorQuery()\n\t\t\t\t}, 200)\n\t\t\t})\n\t\t},\n\t\tonClick(index, item, position) {\n\t\t\tthis.$emit('click', {\n\t\t\t\tcontent: item,\n\t\t\t\tindex,\n\t\t\t\tposition\n\t\t\t})\n\t\t},\n\t\ttouchstart(e) {\n\t\t\t// fix by mehaotian 禁止滑动\n\t\t\tif (this.disabled) return\n\t\t\t// 每次只触发一次，避免多次监听造成闪烁\n\t\t\tif (this.stop) return\n\t\t\tthis.stop = true\n\t\t\tif (this.autoClose && this.swipeaction) {\n\t\t\t\tthis.swipeaction.closeOther(this)\n\t\t\t}\n\n\t\t\tconst leftWidth = this.button.left.width\n\t\t\tconst rightWidth = this.button.right.width\n\t\t\tlet expression = this.range(this.x, -rightWidth, leftWidth)\n\t\t\tlet leftExpression = this.range(this.x - leftWidth, -leftWidth, 0)\n\t\t\tlet rightExpression = this.range(this.x + rightWidth, 0, rightWidth)\n\n\t\t\tthis.eventpan = BindingX.bind({\n\t\t\t\tanchor: this.box,\n\t\t\t\teventType: 'pan',\n\t\t\t\tprops: [{\n\t\t\t\t\telement: this.selector,\n\t\t\t\t\tproperty: 'transform.translateX',\n\t\t\t\t\texpression\n\t\t\t\t}, {\n\t\t\t\t\telement: this.leftButton,\n\t\t\t\t\tproperty: 'transform.translateX',\n\t\t\t\t\texpression: leftExpression\n\t\t\t\t}, {\n\t\t\t\t\telement: this.rightButton,\n\t\t\t\t\tproperty: 'transform.translateX',\n\t\t\t\t\texpression: rightExpression\n\t\t\t\t}, ]\n\t\t\t}, (e) => {\n\t\t\t\t// nope\n\t\t\t\tif (e.state === 'end') {\n\t\t\t\t\tthis.x = e.deltaX + this.x;\n\t\t\t\t\tthis.isclick = true\n\t\t\t\t\tthis.bindTiming(e.deltaX)\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\ttouchend(e) {\n\t\t\tif (this.isopen !== 'none' && !this.isclick) {\n\t\t\t\tthis.open('none')\n\t\t\t}\n\t\t},\n\t\tbindTiming(x) {\n\t\t\tconst left = this.x\n\t\t\tconst leftWidth = this.button.left.width\n\t\t\tconst rightWidth = this.button.right.width\n\t\t\tconst threshold = this.threshold\n\t\t\tif (!this.isopen || this.isopen === 'none') {\n\t\t\t\tif (left > threshold) {\n\t\t\t\t\tthis.open('left')\n\t\t\t\t} else if (left < -threshold) {\n\t\t\t\t\tthis.open('right')\n\t\t\t\t} else {\n\t\t\t\t\tthis.open('none')\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((x > -leftWidth && x < 0) || x > rightWidth) {\n\t\t\t\t\tif ((x > -threshold && x < 0) || (x - rightWidth > threshold)) {\n\t\t\t\t\t\tthis.open('left')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.open('none')\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ((x < threshold && x > 0) || (x + leftWidth < -threshold)) {\n\t\t\t\t\t\tthis.open('right')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.open('none')\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 * @param {Object} num\n\t\t * @param {Object} mix\n\t\t * @param {Object} max\n\t\t */\n\t\trange(num, mix, max) {\n\t\t\treturn `min(max(x+${num}, ${mix}), ${max})`\n\t\t},\n\n\t\t/**\n\t\t * 开启swipe\n\t\t */\n\t\topen(type) {\n\t\t\tthis.animation(type)\n\t\t},\n\n\t\t/**\n\t\t * 关闭swipe\n\t\t */\n\t\tclose() {\n\t\t\tthis.animation('none')\n\t\t},\n\n\t\t/**\n\t\t * 开启关闭动画\n\t\t * @param {Object} type\n\t\t */\n\t\tanimation(type) {\n\t\t\tconst time = 300\n\t\t\tconst leftWidth = this.button.left.width\n\t\t\tconst rightWidth = this.button.right.width\n\t\t\tif (this.eventpan && this.eventpan.token) {\n\t\t\t\tBindingX.unbind({\n\t\t\t\t\ttoken: this.eventpan.token,\n\t\t\t\t\teventType: 'pan'\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'left':\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tthis.move(this.selector, leftWidth),\n\t\t\t\t\t\tthis.move(this.leftButton, 0),\n\t\t\t\t\t\tthis.move(this.rightButton, rightWidth * 2)\n\t\t\t\t\t]).then(() => {\n\t\t\t\t\t\tthis.setEmit(leftWidth, type)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'right':\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tthis.move(this.selector, -rightWidth),\n\t\t\t\t\t\tthis.move(this.leftButton, -leftWidth * 2),\n\t\t\t\t\t\tthis.move(this.rightButton, 0)\n\t\t\t\t\t]).then(() => {\n\t\t\t\t\t\tthis.setEmit(-rightWidth, type)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tPromise.all([\n\t\t\t\t\t\tthis.move(this.selector, 0),\n\t\t\t\t\t\tthis.move(this.leftButton, -leftWidth),\n\t\t\t\t\t\tthis.move(this.rightButton, rightWidth)\n\t\t\t\t\t]).then(() => {\n\t\t\t\t\t\tthis.setEmit(0, type)\n\t\t\t\t\t})\n\n\t\t\t}\n\t\t},\n\t\tsetEmit(x, type) {\n\t\t\tconst leftWidth = this.button.left.width\n\t\t\tconst rightWidth = this.button.right.width\n\t\t\tthis.isopen = this.isopen || 'none'\n\t\t\tthis.stop = false\n\t\t\tthis.isclick = false\n\t\t\t// 只有状态不一致才会返回结果\n\t\t\tif (this.isopen !== type && this.x !== x) {\n\t\t\t\tif (type === 'left' && leftWidth > 0) {\n\t\t\t\t\tthis.$emit('change', 'left')\n\t\t\t\t}\n\t\t\t\tif (type === 'right' && rightWidth > 0) {\n\t\t\t\t\tthis.$emit('change', 'right')\n\t\t\t\t}\n\t\t\t\tif (type === 'none') {\n\t\t\t\t\tthis.$emit('change', 'none')\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.x = x\n\t\t\tthis.isopen = type\n\t\t},\n\t\tmove(ref, value) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tanimation.transition(ref, {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\ttransform: `translateX(${value})`,\n\t\t\t\t\t},\n\t\t\t\t\tduration: 150, //ms\n\t\t\t\t\ttimingFunction: 'linear',\n\t\t\t\t\tneedLayout: false,\n\t\t\t\t\tdelay: 0 //ms\n\t\t\t\t}, function(res) {\n\t\t\t\t\tresolve(res)\n\t\t\t\t})\n\t\t\t})\n\n\t\t},\n\n\t\t/**\n\t\t * 获取ref\n\t\t * @param {Object} el\n\t\t */\n\t\tgetEl(el) {\n\t\t\treturn el.ref\n\t\t},\n\t\t/**\n\t\t * 获取节点信息\n\t\t */\n\t\tgetSelectorQuery() {\n\t\t\tPromise.all([\n\t\t\t\tthis.getDom('left'),\n\t\t\t\tthis.getDom('right'),\n\t\t\t]).then((data) => {\n\t\t\t\tlet show = 'none'\n\t\t\t\tif (this.autoClose) {\n\t\t\t\t\tshow = 'none'\n\t\t\t\t} else {\n\t\t\t\t\tshow = this.show\n\t\t\t\t}\n\n\t\t\t\tif (show === 'none') {\n\t\t\t\t\t// this.close()\n\t\t\t\t} else {\n\t\t\t\t\tthis.open(show)\n\t\t\t\t}\n\n\t\t\t})\n\n\t\t},\n\t\tgetDom(str) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tdom.getComponentRect(this.$refs[`selector-${str}-button--hock`], (data) => {\n\t\t\t\t\tif (data) {\n\t\t\t\t\t\tthis.button[str] = data.size\n\t\t\t\t\t\tresolve(data)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n}\n\n// #endif\n\nexport default bindIngXMixins\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js",
    "content": "export function isPC() {\n\tvar userAgentInfo = navigator.userAgent;\n\tvar Agents = [\"Android\", \"iPhone\", \"SymbianOS\", \"Windows Phone\", \"iPad\", \"iPod\"];\n\tvar flag = true;\n\tfor (let v = 0; v < Agents.length - 1; v++) {\n\t\tif (userAgentInfo.indexOf(Agents[v]) > 0) {\n\t\t\tflag = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn flag;\n}\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js",
    "content": "export default {\n\tdata() {\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ttransition: false,\n\t\t\twidth: 0,\n\t\t\tviewWidth: 0,\n\t\t\tswipeShow: 0\n\t\t}\n\t},\n\twatch: {\n\t\tshow(newVal) {\n\t\t\tif (this.autoClose) return\n\t\t\tif (newVal && newVal !== 'none') {\n\t\t\t\tthis.transition = true\n\t\t\t\tthis.open(newVal)\n\t\t\t} else {\n\t\t\t\tthis.close()\n\t\t\t}\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.swipeaction = this.getSwipeAction()\n\t\tif (this.swipeaction && Array.isArray(this.swipeaction.children)) {\n\t\t\tthis.swipeaction.children.push(this)\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.isopen = false\n\t\tsetTimeout(() => {\n\t\t\tthis.getQuerySelect()\n\t\t}, 50)\n\t},\n\tmethods: {\n\t\tappTouchStart(e) {\n\t\t\tconst {\n\t\t\t\tclientX\n\t\t\t} = e.changedTouches[0]\n\t\t\tthis.clientX = clientX\n\t\t\tthis.timestamp = new Date().getTime()\n\t\t},\n\t\tappTouchEnd(e, index, item, position) {\n\t\t\tconst {\n\t\t\t\tclientX\n\t\t\t} = e.changedTouches[0]\n\t\t\t// fixed by xxxx 模拟点击事件，解决 ios 13 点击区域错位的问题\n\t\t\tlet diff = Math.abs(this.clientX - clientX)\n\t\t\tlet time = (new Date().getTime()) - this.timestamp\n\t\t\tif (diff < 40 && time < 300) {\n\t\t\t\tthis.$emit('click', {\n\t\t\t\t\tcontent: item,\n\t\t\t\t\tindex,\n\t\t\t\t\tposition\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * 移动触发\n\t\t * @param {Object} e\n\t\t */\n\t\tonChange(e) {\n\t\t\tthis.moveX = e.detail.x\n\t\t\tthis.isclose = false\n\t\t},\n\t\ttouchstart(e) {\n\t\t\tthis.transition = false\n\t\t\tthis.isclose = true\n\t\t\tif (this.autoClose && this.swipeaction) {\n\t\t\t\tthis.swipeaction.closeOther(this)\n\t\t\t}\n\t\t},\n\t\ttouchmove(e) {},\n\t\ttouchend(e) {\n\t\t\t// 0的位置什么都不执行\n\t\t\tif (this.isclose && this.isopen === 'none') return\n\t\t\tif (this.isclose && this.isopen !== 'none') {\n\t\t\t\tthis.transition = true\n\t\t\t\tthis.close()\n\t\t\t} else {\n\t\t\t\tthis.move(this.moveX + this.leftWidth)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * 移动\n\t\t * @param {Object} moveX\n\t\t */\n\t\tmove(moveX) {\n\t\t\t// 打开关闭的处理逻辑不太一样\n\t\t\tthis.transition = true\n\t\t\t// 未打开状态\n\t\t\tif (!this.isopen || this.isopen === 'none') {\n\t\t\t\tif (moveX > this.threshold) {\n\t\t\t\t\tthis.open('left')\n\t\t\t\t} else if (moveX < -this.threshold) {\n\t\t\t\t\tthis.open('right')\n\t\t\t\t} else {\n\t\t\t\t\tthis.close()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (moveX < 0 && moveX < this.rightWidth) {\n\t\t\t\t\tconst rightX = this.rightWidth + moveX\n\t\t\t\t\tif (rightX < this.threshold) {\n\t\t\t\t\t\tthis.open('right')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t}\n\t\t\t\t} else if (moveX > 0 && moveX < this.leftWidth) {\n\t\t\t\t\tconst leftX = this.leftWidth - moveX\n\t\t\t\t\tif (leftX < this.threshold) {\n\t\t\t\t\t\tthis.open('left')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * 打开\n\t\t */\n\t\topen(type) {\n\t\t\tthis.x = this.moveX\n\t\t\tthis.animation(type)\n\t\t},\n\n\t\t/**\n\t\t * 关闭\n\t\t */\n\t\tclose() {\n\t\t\tthis.x = this.moveX\n\t\t\t// TODO 解决 x 值不更新的问题，所以会多触发一次 nextTick ，待优化\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.x = -this.leftWidth\n\t\t\t\tif (this.isopen !== 'none') {\n\t\t\t\t\tthis.$emit('change', 'none')\n\t\t\t\t}\n\t\t\t\tthis.isopen = 'none'\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * 执行结束动画\n\t\t * @param {Object} type\n\t\t */\n\t\tanimation(type) {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tif (type === 'left') {\n\t\t\t\t\tthis.x = 0\n\t\t\t\t} else {\n\t\t\t\t\tthis.x = -this.rightWidth - this.leftWidth\n\t\t\t\t}\n\n\t\t\t\tif (this.isopen !== type) {\n\t\t\t\t\tthis.$emit('change', type)\n\t\t\t\t}\n\t\t\t\tthis.isopen = type\n\t\t\t})\n\n\t\t},\n\t\tgetSlide(x) {},\n\t\tgetQuerySelect() {\n\t\t\tconst query = uni.createSelectorQuery().in(this);\n\t\t\tquery.selectAll('.movable-view--hock').boundingClientRect(data => {\n\t\t\t\tthis.leftWidth = data[1].width\n\t\t\t\tthis.rightWidth = data[2].width\n\t\t\t\tthis.width = data[0].width\n\t\t\t\tthis.viewWidth = this.width + this.rightWidth + this.leftWidth\n\t\t\t\tif (this.leftWidth === 0) {\n\t\t\t\t\t// TODO 疑似bug ,初始化的时候如果x 是0，会导致移动位置错误，所以让元素超出一点\n\t\t\t\t\tthis.x = -0.1\n\t\t\t\t} else {\n\t\t\t\t\tthis.x = -this.leftWidth\n\t\t\t\t}\n\t\t\t\tthis.moveX = this.x\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.swipeShow = 1\n\t\t\t\t})\n\n\t\t\t\tif (!this.buttonWidth) {\n\t\t\t\t\tthis.disabledView = true\n\t\t\t\t}\n\n\t\t\t\tif (this.autoClose) return\n\t\t\t\tif (this.show !== 'none') {\n\t\t\t\t\tthis.transition = true\n\t\t\t\t\tthis.open(this.shows)\n\t\t\t\t}\n\t\t\t}).exec();\n\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js",
    "content": "let otherMixins = {}\n\n// #ifndef APP-PLUS|| MP-WEIXIN  ||  H5\nconst MIN_DISTANCE = 10;\notherMixins = {\n\tdata() {\n\t\t// TODO 随机生生元素ID，解决百度小程序获取同一个元素位置信息的bug\n\t\tconst elClass = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`\n\t\treturn {\n\t\t\tuniShow: false,\n\t\t\tleft: 0,\n\t\t\tbuttonShow: 'none',\n\t\t\tani: false,\n\t\t\tmoveLeft: '',\n\t\t\telClass\n\t\t}\n\t},\n\twatch: {\n\t\tshow(newVal) {\n\t\t\tif (this.autoClose) return\n\t\t\tthis.openState(newVal)\n\t\t},\n\t\tleft() {\n\t\t\tthis.moveLeft = `translateX(${this.left}px)`\n\t\t},\n\t\tbuttonShow(newVal) {\n\t\t\tif (this.autoClose) return\n\t\t\tthis.openState(newVal)\n\t\t},\n\t\tleftOptions() {\n\t\t\tthis.init()\n\t\t},\n\t\trightOptions() {\n\t\t\tthis.init()\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.swipeaction = this.getSwipeAction()\n\t\tif (this.swipeaction && Array.isArray(this.swipeaction.children)) {\n\t\t\tthis.swipeaction.children.push(this)\n\t\t}\n\t\tthis.init()\n\t},\n\tmethods: {\n\t\tinit() {\n\t\t\tclearTimeout(this.timer)\n\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\tthis.getSelectorQuery()\n\t\t\t}, 100)\n\t\t\t// 移动距离\n\t\t\tthis.left = 0\n\t\t\tthis.x = 0\n\t\t},\n\n\t\tcloseSwipe(e) {\n\t\t\tif (this.autoClose && this.swipeaction) {\n\t\t\t\tthis.swipeaction.closeOther(this)\n\t\t\t}\n\t\t},\n\t\tappTouchStart(e) {\n\t\t\tconst {\n\t\t\t\tclientX\n\t\t\t} = e.changedTouches[0]\n\t\t\tthis.clientX = clientX\n\t\t\tthis.timestamp = new Date().getTime()\n\t\t},\n\t\tappTouchEnd(e, index, item, position) {\n\t\t\tconst {\n\t\t\t\tclientX\n\t\t\t} = e.changedTouches[0]\n\t\t\t// fixed by xxxx 模拟点击事件，解决 ios 13 点击区域错位的问题\n\t\t\tlet diff = Math.abs(this.clientX - clientX)\n\t\t\tlet time = (new Date().getTime()) - this.timestamp\n\t\t\tif (diff < 40 && time < 300) {\n\t\t\t\tthis.$emit('click', {\n\t\t\t\t\tcontent: item,\n\t\t\t\t\tindex,\n\t\t\t\t\tposition\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\ttouchstart(e) {\n\t\t\tif (this.disabled) return\n\t\t\tthis.ani = false\n\t\t\tthis.x = this.left || 0\n\t\t\tthis.stopTouchStart(e)\n\t\t\tthis.autoClose && this.closeSwipe()\n\t\t},\n\t\ttouchmove(e) {\n\t\t\tif (this.disabled) return\n\t\t\t// 是否可以滑动页面\n\t\t\tthis.stopTouchMove(e);\n\t\t\tif (this.direction !== 'horizontal') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.move(this.x + this.deltaX)\n\t\t\treturn false\n\t\t},\n\t\ttouchend() {\n\t\t\tif (this.disabled) return\n\t\t\tthis.moveDirection(this.left)\n\t\t},\n\t\t/**\n\t\t * 设置移动距离\n\t\t * @param {Object} value\n\t\t */\n\t\tmove(value) {\n\t\t\tvalue = value || 0\n\t\t\tconst leftWidth = this.leftWidth\n\t\t\tconst rightWidth = this.rightWidth\n\t\t\t// 获取可滑动范围\n\t\t\tthis.left = this.range(value, -rightWidth, leftWidth);\n\t\t},\n\n\t\t/**\n\t\t * 获取范围\n\t\t * @param {Object} num\n\t\t * @param {Object} min\n\t\t * @param {Object} max\n\t\t */\n\t\trange(num, min, max) {\n\t\t\treturn Math.min(Math.max(num, min), max);\n\t\t},\n\t\t/**\n\t\t * 移动方向判断\n\t\t * @param {Object} left\n\t\t * @param {Object} value\n\t\t */\n\t\tmoveDirection(left) {\n\t\t\tconst threshold = this.threshold\n\t\t\tconst isopen = this.isopen || 'none'\n\t\t\tconst leftWidth = this.leftWidth\n\t\t\tconst rightWidth = this.rightWidth\n\t\t\tif (this.deltaX === 0) {\n\t\t\t\tthis.openState('none')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth >\n\t\t\t\t\t0 && rightWidth +\n\t\t\t\t\tleft < threshold)) {\n\t\t\t\t// right\n\t\t\t\tthis.openState('right')\n\t\t\t} else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth >\n\t\t\t\t\t0 &&\n\t\t\t\t\tleftWidth - left < threshold)) {\n\t\t\t\t// left\n\t\t\t\tthis.openState('left')\n\t\t\t} else {\n\t\t\t\t// default\n\t\t\t\tthis.openState('none')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * 开启状态\n\t\t * @param {Boolean} type\n\t\t */\n\t\topenState(type) {\n\t\t\tconst leftWidth = this.leftWidth\n\t\t\tconst rightWidth = this.rightWidth\n\t\t\tlet left = ''\n\t\t\tthis.isopen = this.isopen ? this.isopen : 'none'\n\t\t\tswitch (type) {\n\t\t\t\tcase \"left\":\n\t\t\t\t\tleft = leftWidth\n\t\t\t\t\tbreak\n\t\t\t\tcase \"right\":\n\t\t\t\t\tleft = -rightWidth\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tleft = 0\n\t\t\t}\n\n\n\t\t\tif (this.isopen !== type) {\n\t\t\t\tthis.throttle = true\n\t\t\t\tthis.$emit('change', type)\n\t\t\t}\n\n\t\t\tthis.isopen = type\n\t\t\t// 添加动画类\n\t\t\tthis.ani = true\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.move(left)\n\t\t\t})\n\t\t\t// 设置最终移动位置,理论上只要进入到这个函数，肯定是要打开的\n\t\t},\n\t\tclose() {\n\t\t\tthis.openState('none')\n\t\t},\n\t\tgetDirection(x, y) {\n\t\t\tif (x > y && x > MIN_DISTANCE) {\n\t\t\t\treturn 'horizontal';\n\t\t\t}\n\t\t\tif (y > x && y > MIN_DISTANCE) {\n\t\t\t\treturn 'vertical';\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\n\t\t/**\n\t\t * 重置滑动状态\n\t\t * @param {Object} event\n\t\t */\n\t\tresetTouchStatus() {\n\t\t\tthis.direction = '';\n\t\t\tthis.deltaX = 0;\n\t\t\tthis.deltaY = 0;\n\t\t\tthis.offsetX = 0;\n\t\t\tthis.offsetY = 0;\n\t\t},\n\n\t\t/**\n\t\t * 设置滑动开始位置\n\t\t * @param {Object} event\n\t\t */\n\t\tstopTouchStart(event) {\n\t\t\tthis.resetTouchStatus();\n\t\t\tconst touch = event.touches[0];\n\t\t\tthis.startX = touch.clientX;\n\t\t\tthis.startY = touch.clientY;\n\t\t},\n\n\t\t/**\n\t\t * 滑动中，是否禁止打开\n\t\t * @param {Object} event\n\t\t */\n\t\tstopTouchMove(event) {\n\t\t\tconst touch = event.touches[0];\n\t\t\tthis.deltaX = touch.clientX - this.startX;\n\t\t\tthis.deltaY = touch.clientY - this.startY;\n\t\t\tthis.offsetX = Math.abs(this.deltaX);\n\t\t\tthis.offsetY = Math.abs(this.deltaY);\n\t\t\tthis.direction = this.direction || this.getDirection(this.offsetX, this.offsetY);\n\t\t},\n\n\t\tgetSelectorQuery() {\n\t\t\tconst views = uni.createSelectorQuery().in(this)\n\t\t\tviews\n\t\t\t\t.selectAll('.' + this.elClass)\n\t\t\t\t.boundingClientRect(data => {\n\t\t\t\t\tif (data.length === 0) return\n\t\t\t\t\tlet show = 'none'\n\t\t\t\t\tif (this.autoClose) {\n\t\t\t\t\t\tshow = 'none'\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshow = this.show\n\t\t\t\t\t}\n\t\t\t\t\tthis.leftWidth = data[0].width || 0\n\t\t\t\t\tthis.rightWidth = data[1].width || 0\n\t\t\t\t\tthis.buttonShow = show\n\t\t\t\t})\n\t\t\t\t.exec()\n\t\t}\n\t}\n}\n\n// #endif\n\nexport default otherMixins\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js",
    "content": "let mpMixins = {}\nlet is_pc = null\n// #ifdef H5\nimport {\n\tisPC\n} from \"./isPC\"\nis_pc = isPC()\n// #endif\n// #ifdef APP-VUE|| MP-WEIXIN || H5\n\nmpMixins = {\n\tdata() {\n\t\treturn {\n\t\t\tis_show: 'none'\n\t\t}\n\t},\n\twatch: {\n\t\tshow(newVal) {\n\t\t\tthis.is_show = this.show\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.swipeaction = this.getSwipeAction()\n\t\tif (this.swipeaction && Array.isArray(this.swipeaction.children)) {\n\t\t\tthis.swipeaction.children.push(this)\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.is_show = this.show\n\t},\n\tmethods: {\n\t\t// wxs 中调用\n\t\tcloseSwipe(e) {\n\t\t\tif (this.autoClose && this.swipeaction) {\n\t\t\t\tthis.swipeaction.closeOther(this)\n\t\t\t}\n\t\t},\n\n\t\tchange(e) {\n\t\t\tthis.$emit('change', e.open)\n\t\t\tif (this.is_show !== e.open) {\n\t\t\t\tthis.is_show = e.open\n\t\t\t}\n\t\t},\n\n\t\tappTouchStart(e) {\n\t\t\tif (is_pc) return\n\t\t\tconst {\n\t\t\t\tclientX\n\t\t\t} = e.changedTouches[0]\n\t\t\tthis.clientX = clientX\n\t\t\tthis.timestamp = new Date().getTime()\n\t\t},\n\t\tappTouchEnd(e, index, item, position) {\n\t\t\tif (is_pc) return\n\t\t\tconst {\n\t\t\t\tclientX\n\t\t\t} = e.changedTouches[0]\n\t\t\t// fixed by xxxx 模拟点击事件，解决 ios 13 点击区域错位的问题\n\t\t\tlet diff = Math.abs(this.clientX - clientX)\n\t\t\tlet time = (new Date().getTime()) - this.timestamp\n\t\t\tif (diff < 40 && time < 300) {\n\t\t\t\tthis.$emit('click', {\n\t\t\t\t\tcontent: item,\n\t\t\t\t\tindex,\n\t\t\t\t\tposition\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tonClickForPC(index, item, position) {\n\t\t\tif (!is_pc) return\n\t\t\t// #ifdef H5\n\t\t\tthis.$emit('click', {\n\t\t\t\tcontent: item,\n\t\t\t\tindex,\n\t\t\t\tposition\n\t\t\t})\n\t\t\t// #endif\n\t\t}\n\t}\n}\n\n// #endif\nexport default mpMixins\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js",
    "content": "const MIN_DISTANCE = 10;\nexport default {\n\tshowWatch(newVal, oldVal, ownerInstance, instance, self) {\n\t\tvar state = self.state\n\t\tvar $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el\n\t\tif (!$el) return\n\t\tthis.getDom(instance, ownerInstance, self)\n\t\tif (newVal && newVal !== 'none') {\n\t\t\tthis.openState(newVal, instance, ownerInstance, self)\n\t\t\treturn\n\t\t}\n\n\t\tif (state.left) {\n\t\t\tthis.openState('none', instance, ownerInstance, self)\n\t\t}\n\t\tthis.resetTouchStatus(instance, self)\n\t},\n\n\t/**\n\t * 开始触摸操作\n\t * @param {Object} e\n\t * @param {Object} ins\n\t */\n\ttouchstart(e, ownerInstance, self) {\n\t\tlet instance = e.instance;\n\t\tlet disabled = instance.getDataset().disabled\n\t\tlet state = self.state;\n\t\tthis.getDom(instance, ownerInstance, self)\n\t\t// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复\n\t\tdisabled = this.getDisabledType(disabled)\n\t\tif (disabled) return\n\t\t// 开始触摸时移除动画类\n\t\tinstance.requestAnimationFrame(function() {\n\t\t\tinstance.removeClass('ani');\n\t\t\townerInstance.callMethod('closeSwipe');\n\t\t})\n\n\t\t// 记录上次的位置\n\t\tstate.x = state.left || 0\n\t\t// 计算滑动开始位置\n\t\tthis.stopTouchStart(e, ownerInstance, self)\n\t},\n\n\t/**\n\t * 开始滑动操作\n\t * @param {Object} e\n\t * @param {Object} ownerInstance\n\t */\n\ttouchmove(e, ownerInstance, self) {\n\t\tlet instance = e.instance;\n\t\t// 删除之后已经那不到实例了\n\t\tif (!instance) return;\n\t\tlet disabled = instance.getDataset().disabled\n\t\tlet state = self.state\n\t\t// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复\n\t\tdisabled = this.getDisabledType(disabled)\n\t\tif (disabled) return\n\t\t// 是否可以滑动页面\n\t\tthis.stopTouchMove(e, self);\n\t\tif (state.direction !== 'horizontal') {\n\t\t\treturn;\n\t\t}\n\t\tif (e.preventDefault) {\n\t\t\t// 阻止页面滚动\n\t\t\te.preventDefault()\n\t\t}\n\t\tlet x = state.x + state.deltaX\n\t\tthis.move(x, instance, ownerInstance, self)\n\t},\n\n\t/**\n\t * 结束触摸操作\n\t * @param {Object} e\n\t * @param {Object} ownerInstance\n\t */\n\ttouchend(e, ownerInstance, self) {\n\t\tlet instance = e.instance;\n\t\tlet disabled = instance.getDataset().disabled\n\t\tlet state = self.state\n\t\t// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复\n\t\tdisabled = this.getDisabledType(disabled)\n\n\t\tif (disabled) return\n\t\t// 滑动过程中触摸结束,通过阙值判断是开启还是关闭\n\t\t// fixed by mehaotian 定时器解决点击按钮，touchend 触发比 click 事件时机早的问题 ，主要是 ios13\n\t\tthis.moveDirection(state.left, instance, ownerInstance, self)\n\n\t},\n\n\t/**\n\t * 设置移动距离\n\t * @param {Object} value\n\t * @param {Object} instance\n\t * @param {Object} ownerInstance\n\t */\n\tmove(value, instance, ownerInstance, self) {\n\t\tvalue = value || 0\n\t\tlet state = self.state\n\t\tlet leftWidth = state.leftWidth\n\t\tlet rightWidth = state.rightWidth\n\t\t// 获取可滑动范围\n\t\tstate.left = this.range(value, -rightWidth, leftWidth);\n\t\tinstance.requestAnimationFrame(function() {\n\t\t\tinstance.setStyle({\n\t\t\t\ttransform: 'translateX(' + state.left + 'px)',\n\t\t\t\t'-webkit-transform': 'translateX(' + state.left + 'px)'\n\t\t\t})\n\t\t})\n\n\t},\n\n\t/**\n\t * 获取元素信息\n\t * @param {Object} instance\n\t * @param {Object} ownerInstance\n\t */\n\tgetDom(instance, ownerInstance, self) {\n\t\tvar state = self.state\n\t\tvar $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el\n\t\tvar leftDom = $el.querySelector('.button-group--left')\n\t\tvar rightDom = $el.querySelector('.button-group--right')\n\n\t\tstate.leftWidth = leftDom.offsetWidth || 0\n\t\tstate.rightWidth = rightDom.offsetWidth || 0\n\t\tstate.threshold = instance.getDataset().threshold\n\t},\n\n\tgetDisabledType(value) {\n\t\treturn (typeof(value) === 'string' ? JSON.parse(value) : value) || false;\n\t},\n\n\t/**\n\t * 获取范围\n\t * @param {Object} num\n\t * @param {Object} min\n\t * @param {Object} max\n\t */\n\trange(num, min, max) {\n\t\treturn Math.min(Math.max(num, min), max);\n\t},\n\n\n\t/**\n\t * 移动方向判断\n\t * @param {Object} left\n\t * @param {Object} value\n\t * @param {Object} ownerInstance\n\t * @param {Object} ins\n\t */\n\tmoveDirection(left, ins, ownerInstance, self) {\n\t\tvar state = self.state\n\t\tvar threshold = state.threshold\n\t\tvar position = state.position\n\t\tvar isopen = state.isopen || 'none'\n\t\tvar leftWidth = state.leftWidth\n\t\tvar rightWidth = state.rightWidth\n\t\tif (state.deltaX === 0) {\n\t\t\tthis.openState('none', ins, ownerInstance, self)\n\t\t\treturn\n\t\t}\n\t\tif ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 &&\n\t\t\t\trightWidth +\n\t\t\t\tleft < threshold)) {\n\t\t\t// right\n\t\t\tthis.openState('right', ins, ownerInstance, self)\n\t\t} else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&\n\t\t\t\tleftWidth - left < threshold)) {\n\t\t\t// left\n\t\t\tthis.openState('left', ins, ownerInstance, self)\n\t\t} else {\n\t\t\t// default\n\t\t\tthis.openState('none', ins, ownerInstance, self)\n\t\t}\n\t},\n\n\n\t/**\n\t * 开启状态\n\t * @param {Boolean} type\n\t * @param {Object} ins\n\t * @param {Object} ownerInstance\n\t */\n\topenState(type, ins, ownerInstance, self) {\n\t\tlet state = self.state\n\t\tlet leftWidth = state.leftWidth\n\t\tlet rightWidth = state.rightWidth\n\t\tlet left = ''\n\t\tstate.isopen = state.isopen ? state.isopen : 'none'\n\t\tswitch (type) {\n\t\t\tcase \"left\":\n\t\t\t\tleft = leftWidth\n\t\t\t\tbreak\n\t\t\tcase \"right\":\n\t\t\t\tleft = -rightWidth\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tleft = 0\n\t\t}\n\n\t\t// && !state.throttle\n\n\t\tif (state.isopen !== type) {\n\t\t\tstate.throttle = true\n\t\t\townerInstance.callMethod('change', {\n\t\t\t\topen: type\n\t\t\t})\n\n\t\t}\n\n\t\tstate.isopen = type\n\t\t// 添加动画类\n\t\tins.requestAnimationFrame(() => {\n\t\t\tins.addClass('ani');\n\t\t\tthis.move(left, ins, ownerInstance, self)\n\t\t})\n\t},\n\n\n\tgetDirection(x, y) {\n\t\tif (x > y && x > MIN_DISTANCE) {\n\t\t\treturn 'horizontal';\n\t\t}\n\t\tif (y > x && y > MIN_DISTANCE) {\n\t\t\treturn 'vertical';\n\t\t}\n\t\treturn '';\n\t},\n\n\t/**\n\t * 重置滑动状态\n\t * @param {Object} event\n\t */\n\tresetTouchStatus(instance, self) {\n\t\tlet state = self.state;\n\t\tstate.direction = '';\n\t\tstate.deltaX = 0;\n\t\tstate.deltaY = 0;\n\t\tstate.offsetX = 0;\n\t\tstate.offsetY = 0;\n\t},\n\n\t/**\n\t * 设置滑动开始位置\n\t * @param {Object} event\n\t */\n\tstopTouchStart(event, ownerInstance, self) {\n\t\tlet instance = event.instance;\n\t\tlet state = self.state\n\t\tthis.resetTouchStatus(instance, self);\n\t\tvar touch = event.touches[0];\n\t\tstate.startX = touch.clientX;\n\t\tstate.startY = touch.clientY;\n\t},\n\n\t/**\n\t * 滑动中，是否禁止打开\n\t * @param {Object} event\n\t */\n\tstopTouchMove(event, self) {\n\t\tlet instance = event.instance;\n\t\tlet state = self.state;\n\t\tlet touch = event.touches[0];\n\n\t\tstate.deltaX = touch.clientX - state.startX;\n\t\tstate.deltaY = touch.clientY - state.startY;\n\t\tstate.offsetY = Math.abs(state.deltaY);\n\t\tstate.offsetX = Math.abs(state.deltaX);\n\t\tstate.direction = state.direction || this.getDirection(state.offsetX, state.offsetY);\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue",
    "content": "<template>\n\t<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->\n\t<!-- #ifdef APP-VUE || MP-WEIXIN || H5 -->\n\t<view class=\"uni-swipe\">\n\t\t<!--  #ifdef MP-WEIXIN || VUE3 -->\n\t\t<view class=\"uni-swipe_box\" :change:prop=\"wxsswipe.showWatch\" :prop=\"is_show\" :data-threshold=\"threshold\"\n\t\t\t:data-disabled=\"disabled\" @touchstart=\"wxsswipe.touchstart\" @touchmove=\"wxsswipe.touchmove\"\n\t\t\t@touchend=\"wxsswipe.touchend\">\n\t\t\t<!-- #endif -->\n\t\t\t<!--  #ifndef MP-WEIXIN || VUE3 -->\n\t\t\t<view class=\"uni-swipe_box\" :change:prop=\"renderswipe.showWatch\" :prop=\"is_show\" :data-threshold=\"threshold\"\n\t\t\t\t:data-disabled=\"disabled+''\" @touchstart=\"renderswipe.touchstart\" @touchmove=\"renderswipe.touchmove\"\n\t\t\t\t@touchend=\"renderswipe.touchend\">\n\t\t\t\t<!-- #endif -->\n\t\t\t\t<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->\n\t\t\t\t<view class=\"uni-swipe_button-group button-group--left\">\n\t\t\t\t\t<slot name=\"left\">\n\t\t\t\t\t\t<view v-for=\"(item,index) in leftOptions\" :key=\"index\" :style=\"{\n\t\t\t\t\t  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'\n\t\t\t\t\t}\" class=\"uni-swipe_button button-hock\" @touchstart=\"appTouchStart\"\n\t\t\t\t\t\t\t@touchend=\"appTouchEnd($event,index,item,'left')\"\n\t\t\t\t\t\t\t@click.stop=\"onClickForPC(index,item,'left')\">\n\t\t\t\t\t\t\t<text class=\"uni-swipe_button-text\"\n\t\t\t\t\t\t\t\t:style=\"{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}\">{{ item.text }}</text>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"uni-swipe_text--center\">\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"uni-swipe_button-group button-group--right\">\n\t\t\t\t\t<slot name=\"right\">\n\t\t\t\t\t\t<view v-for=\"(item,index) in rightOptions\" :key=\"index\" :style=\"{\n\t\t\t\t\t  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'\n\t\t\t\t\t}\" class=\"uni-swipe_button button-hock\" @touchstart=\"appTouchStart\"\n\t\t\t\t\t\t\t@touchend=\"appTouchEnd($event,index,item,'right')\"\n\t\t\t\t\t\t\t@click.stop=\"onClickForPC(index,item,'right')\"><text class=\"uni-swipe_button-text\"\n\t\t\t\t\t\t\t\t:style=\"{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}\">{{ item.text }}</text>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t\t<!-- #endif -->\n\t\t<!-- app nvue端 使用 bindingx -->\n\t\t<!-- #ifdef APP-NVUE -->\n\t\t<view ref=\"selector-box--hock\" class=\"uni-swipe\" @horizontalpan=\"touchstart\" @touchend=\"touchend\">\n\t\t\t<view ref='selector-left-button--hock' class=\"uni-swipe_button-group button-group--left\">\n\t\t\t\t<slot name=\"left\">\n\t\t\t\t\t<view v-for=\"(item,index) in leftOptions\" :key=\"index\" :style=\"{\n\t\t\t\t  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'\n\t\t\t\t}\" class=\"uni-swipe_button button-hock\" @click.stop=\"onClick(index,item,'left')\"><text\n\t\t\t\t\t\t\tclass=\"uni-swipe_button-text\"\n\t\t\t\t\t\t\t:style=\"{color: item.style && item.style.color ? item.style.color : '#FFFFFF', fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}\">{{ item.text }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</slot>\n\t\t\t</view>\n\t\t\t<view ref='selector-right-button--hock' class=\"uni-swipe_button-group button-group--right\">\n\t\t\t\t<slot name=\"right\">\n\t\t\t\t\t<view v-for=\"(item,index) in rightOptions\" :key=\"index\" :style=\"{\n\t\t\t\t  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD'\n\t\t\t\t}\" class=\"uni-swipe_button button-hock\" @click.stop=\"onClick(index,item,'right')\"><text\n\t\t\t\t\t\t\tclass=\"uni-swipe_button-text\"\n\t\t\t\t\t\t\t:style=\"{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}\">{{ item.text }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</slot>\n\t\t\t</view>\n\t\t\t<view ref='selector-content--hock' class=\"uni-swipe_box\">\n\t\t\t\t<slot></slot>\n\t\t\t</view>\n\t\t</view>\n\t\t<!-- #endif -->\n\t\t<!-- 其他平台使用 js ，长列表性能可能会有影响-->\n\t\t<!-- #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ -->\n\t\t<view class=\"uni-swipe\">\n\t\t\t<view class=\"uni-swipe_box\" @touchstart=\"touchstart\" @touchmove=\"touchmove\" @touchend=\"touchend\"\n\t\t\t\t:style=\"{transform:moveLeft}\" :class=\"{ani:ani}\">\n\t\t\t\t<view class=\"uni-swipe_button-group button-group--left\" :class=\"[elClass]\">\n\t\t\t\t\t<slot name=\"left\">\n\t\t\t\t\t\t<view v-for=\"(item,index) in leftOptions\" :key=\"index\" :style=\"{\n\t\t\t\t\t  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',\n\t\t\t\t\t  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'\n\t\t\t\t\t}\" class=\"uni-swipe_button button-hock\" @touchstart=\"appTouchStart\"\n\t\t\t\t\t\t\t@touchend=\"appTouchEnd($event,index,item,'left')\"><text class=\"uni-swipe_button-text\"\n\t\t\t\t\t\t\t\t:style=\"{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}\">{{ item.text }}</text>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t\t<slot></slot>\n\t\t\t\t<view class=\"uni-swipe_button-group button-group--right\" :class=\"[elClass]\">\n\t\t\t\t\t<slot name=\"right\">\n\t\t\t\t\t\t<view v-for=\"(item,index) in rightOptions\" :key=\"index\" :style=\"{\n\t\t\t\t\t  backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',\n\t\t\t\t\t  fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'\n\t\t\t\t\t}\" @touchstart=\"appTouchStart\" @touchend=\"appTouchEnd($event,index,item,'right')\"\n\t\t\t\t\t\t\tclass=\"uni-swipe_button button-hock\"><text class=\"uni-swipe_button-text\"\n\t\t\t\t\t\t\t\t:style=\"{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}\">{{ item.text }}</text>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t\t<!-- #endif -->\n\n</template>\n<script src=\"./wx.wxs\" module=\"wxsswipe\" lang=\"wxs\"></script>\n\n<script module=\"renderswipe\" lang=\"renderjs\">\n\timport render from './render.js'\n\texport default {\n\t\tmounted(e, ins, owner) {\n\t\t\tthis.state = {}\n\t\t},\n\t\tmethods: {\n\t\t\tshowWatch(newVal, oldVal, ownerInstance, instance) {\n\t\t\t\trender.showWatch(newVal, oldVal, ownerInstance, instance, this)\n\t\t\t},\n\t\t\ttouchstart(e, ownerInstance) {\n\t\t\t\trender.touchstart(e, ownerInstance, this)\n\t\t\t},\n\t\t\ttouchmove(e, ownerInstance) {\n\t\t\t\trender.touchmove(e, ownerInstance, this)\n\t\t\t},\n\t\t\ttouchend(e, ownerInstance) {\n\t\t\t\trender.touchend(e, ownerInstance, this)\n\t\t\t}\n\t\t}\n\t}\n</script>\n<script>\n\timport mpwxs from './mpwxs'\n\timport bindingx from './bindingx.js'\n\timport mpother from './mpother'\n\n\t/**\n\t * SwipeActionItem 滑动操作子组件\n\t * @description 通过滑动触发选项的容器\n\t * @tutorial https://ext.dcloud.net.cn/plugin?id=181\n\t * @property {Boolean} show = [left|right｜none] \t开启关闭组件，auto-close = false 时生效\n\t * @property {Boolean} disabled = [true|false] \t\t是否禁止滑动\n\t * @property {Boolean} autoClose = [true|false] \t滑动打开当前组件，是否关闭其他组件\n\t * @property {Number}  threshold \t\t\t\t\t滑动缺省值\n\t * @property {Array} leftOptions \t\t\t\t\t左侧选项内容及样式\n\t * @property {Array} rgihtOptions \t\t\t\t\t右侧选项内容及样式\n\t * @event {Function} click \t\t\t\t\t\t\t点击选项按钮时触发事件，e = {content,index} ，content（点击内容）、index（下标)\n\t * @event {Function} change \t\t\t\t\t\t组件打开或关闭时触发，left\\right\\none\n\t */\n\n\texport default {\n\t\tmixins: [mpwxs, bindingx, mpother],\n\t\temits: ['click', 'change'],\n\t\tprops: {\n\t\t\t// 控制开关\n\t\t\tshow: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: 'none'\n\t\t\t},\n\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\n\t\t\t// 是否自动关闭\n\t\t\tautoClose: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\n\t\t\t// 滑动缺省距离\n\t\t\tthreshold: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: 20\n\t\t\t},\n\n\t\t\t// 左侧按钮内容\n\t\t\tleftOptions: {\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\n\t\t\t// 右侧按钮内容\n\t\t\trightOptions: {\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\n\t\t},\n\t\t// #ifndef VUE3\n\t\t// TODO vue2\n\t\tdestroyed() {\n\t\t\tif (this.__isUnmounted) return\n\t\t\tthis.uninstall()\n\t\t},\n\t\t// #endif\n\t\t// #ifdef VUE3\n\t\t// TODO vue3\n\t\tunmounted() {\n\t\t\tthis.__isUnmounted = true\n\t\t\tthis.uninstall()\n\t\t},\n\t\t// #endif\n\n\t\tmethods: {\n\t\t\tuninstall() {\n\t\t\t\tif (this.swipeaction) {\n\t\t\t\t\tthis.swipeaction.children.forEach((item, index) => {\n\t\t\t\t\t\tif (item === this) {\n\t\t\t\t\t\t\tthis.swipeaction.children.splice(index, 1)\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\t/**\n\t\t\t * 获取父元素实例\n\t\t\t */\n\t\t\tgetSwipeAction(name = 'uniSwipeAction') {\n\t\t\t\tlet parent = this.$parent;\n\t\t\t\tlet parentName = parent.$options.name;\n\t\t\t\twhile (parentName !== name) {\n\t\t\t\t\tparent = parent.$parent;\n\t\t\t\t\tif (!parent) return false;\n\t\t\t\t\tparentName = parent.$options.name;\n\t\t\t\t}\n\t\t\t\treturn parent;\n\t\t\t}\n\t\t}\n\t}\n</script>\n<style lang=\"scss\">\n\t.uni-swipe {\n\t\tposition: relative;\n\t\t/* #ifndef APP-NVUE */\n\t\toverflow: hidden;\n\t\t/* #endif */\n\t}\n\n\t.uni-swipe_box {\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\tflex-shrink: 0;\n\t\t// touch-action: none;\n\t\t/* #endif */\n\t\tposition: relative;\n\t}\n\n\t.uni-swipe_content {\n\t\t// border: 1px red solid;\n\t}\n\n\t.uni-swipe_text--center {\n\t\twidth: 100%;\n\t\t/* #ifndef APP-NVUE */\n\t\tcursor: grab;\n\t\t/* #endif */\n\t}\n\n\t.uni-swipe_button-group {\n\t\t/* #ifndef APP-NVUE */\n\t\tbox-sizing: border-box;\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\t/* #ifdef H5 */\n\t\tcursor: pointer;\n\t\t/* #endif */\n\t}\n\n\t.button-group--left {\n\t\tleft: 0;\n\t\ttransform: translateX(-100%)\n\t}\n\n\t.button-group--right {\n\t\tright: 0;\n\t\ttransform: translateX(100%)\n\t}\n\n\t.uni-swipe_button {\n\t\t/* #ifdef APP-NVUE */\n\t\tflex: 1;\n\t\t/* #endif */\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tpadding: 0 20px;\n\t}\n\n\t.uni-swipe_button-text {\n\t\t/* #ifndef APP-NVUE */\n\t\tflex-shrink: 0;\n\t\t/* #endif */\n\t\tfont-size: 14px;\n\t}\n\n\t.ani {\n\t\ttransition-property: transform;\n\t\ttransition-duration: 0.3s;\n\t\ttransition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);\n\t}\n\n\t/* #ifdef MP-ALIPAY */\n\t.movable-area {\n\t\t/* width: 100%; */\n\t\theight: 45px;\n\t}\n\n\t.movable-view {\n\t\tdisplay: flex;\n\t\t/* justify-content: center; */\n\t\tposition: relative;\n\t\tflex: 1;\n\t\theight: 45px;\n\t\tz-index: 2;\n\t}\n\n\t.movable-view-button {\n\t\tdisplay: flex;\n\t\tflex-shrink: 0;\n\t\tflex-direction: row;\n\t\theight: 100%;\n\t\tbackground: #C0C0C0;\n\t}\n\n\t/* .transition {\n\t\ttransition: all 0.3s;\n\t} */\n\n\t.movable-view-box {\n\t\tflex-shrink: 0;\n\t\theight: 100%;\n\t\tbackground-color: #fff;\n\t}\n\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs",
    "content": "var MIN_DISTANCE = 10;\n\n/**\n * 判断当前是否为H5、app-vue\n */\nvar IS_HTML5 = false\nif (typeof window === 'object') IS_HTML5 = true\n\n/**\n * 监听页面内值的变化,主要用于动态开关swipe-action\n * @param {Object} newValue\n * @param {Object} oldValue\n * @param {Object} ownerInstance\n * @param {Object} instance\n */\nfunction showWatch(newVal, oldVal, ownerInstance, instance) {\n\tvar state = instance.getState()\n\tgetDom(instance, ownerInstance)\n\tif (newVal && newVal !== 'none') {\n\t\topenState(newVal, instance, ownerInstance)\n\t\treturn\n\t}\n\n\tif (state.left) {\n\t\topenState('none', instance, ownerInstance)\n\t}\n\tresetTouchStatus(instance)\n}\n\n/**\n * 开始触摸操作\n * @param {Object} e\n * @param {Object} ins\n */\nfunction touchstart(e, ownerInstance) {\n\tvar instance = e.instance;\n\tvar disabled = instance.getDataset().disabled\n\tvar state = instance.getState();\n\tgetDom(instance, ownerInstance)\n\t// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复\n\tdisabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;\n\tif (disabled) return\n\t// 开始触摸时移除动画类\n\tinstance.requestAnimationFrame(function() {\n\t\tinstance.removeClass('ani');\n\t\townerInstance.callMethod('closeSwipe');\n\t})\n\n\t// 记录上次的位置\n\tstate.x = state.left || 0\n\t// 计算滑动开始位置\n\tstopTouchStart(e, ownerInstance)\n}\n\n/**\n * 开始滑动操作\n * @param {Object} e\n * @param {Object} ownerInstance\n */\nfunction touchmove(e, ownerInstance) {\n\tvar instance = e.instance;\n\tvar disabled = instance.getDataset().disabled\n\tvar state = instance.getState()\n\t// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复\n\tdisabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;\n\tif (disabled) return\n\t// 是否可以滑动页面\n\tstopTouchMove(e);\n\tif (state.direction !== 'horizontal') {\n\t\treturn;\n\t}\n\n\tif (e.preventDefault) {\n\t\t// 阻止页面滚动\n\t\te.preventDefault()\n\t}\n\n\tmove(state.x + state.deltaX, instance, ownerInstance)\n}\n\n/**\n * 结束触摸操作\n * @param {Object} e\n * @param {Object} ownerInstance\n */\nfunction touchend(e, ownerInstance) {\n\tvar instance = e.instance;\n\tvar disabled = instance.getDataset().disabled\n\tvar state = instance.getState()\n\t// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复\n\tdisabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;\n\n\tif (disabled) return\n\t// 滑动过程中触摸结束,通过阙值判断是开启还是关闭\n\t// fixed by mehaotian 定时器解决点击按钮，touchend 触发比 click 事件时机早的问题 ，主要是 ios13\n\tmoveDirection(state.left, instance, ownerInstance)\n\n}\n\n/**\n * 设置移动距离\n * @param {Object} value\n * @param {Object} instance\n * @param {Object} ownerInstance\n */\nfunction move(value, instance, ownerInstance) {\n\tvalue = value || 0\n\tvar state = instance.getState()\n\tvar leftWidth = state.leftWidth\n\tvar rightWidth = state.rightWidth\n\t// 获取可滑动范围\n\tstate.left = range(value, -rightWidth, leftWidth);\n\tinstance.requestAnimationFrame(function() {\n\t\tinstance.setStyle({\n\t\t\ttransform: 'translateX(' + state.left + 'px)',\n\t\t\t'-webkit-transform': 'translateX(' + state.left + 'px)'\n\t\t})\n\t})\n\n}\n\n/**\n * 获取元素信息\n * @param {Object} instance\n * @param {Object} ownerInstance\n */\nfunction getDom(instance, ownerInstance) {\n\tvar state = instance.getState()\n\tvar leftDom = ownerInstance.selectComponent('.button-group--left')\n\tvar rightDom = ownerInstance.selectComponent('.button-group--right')\n\tvar leftStyles = {\n\t\twidth: 0\n\t}\n\tvar rightStyles = {\n\t\twidth: 0\n\t}\n\tleftStyles = leftDom.getBoundingClientRect()\n\trightStyles = rightDom.getBoundingClientRect()\n\n\tstate.leftWidth = leftStyles.width || 0\n\tstate.rightWidth = rightStyles.width || 0\n\tstate.threshold = instance.getDataset().threshold\n}\n\n/**\n * 获取范围\n * @param {Object} num\n * @param {Object} min\n * @param {Object} max\n */\nfunction range(num, min, max) {\n\treturn Math.min(Math.max(num, min), max);\n}\n\n\n/**\n * 移动方向判断\n * @param {Object} left\n * @param {Object} value\n * @param {Object} ownerInstance\n * @param {Object} ins\n */\nfunction moveDirection(left, ins, ownerInstance) {\n\tvar state = ins.getState()\n\tvar threshold = state.threshold\n\tvar position = state.position\n\tvar isopen = state.isopen || 'none'\n\tvar leftWidth = state.leftWidth\n\tvar rightWidth = state.rightWidth\n\tif (state.deltaX === 0) {\n\t\topenState('none', ins, ownerInstance)\n\t\treturn\n\t}\n\tif ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 &&\n\t\t\trightWidth +\n\t\t\tleft < threshold)) {\n\t\t// right\n\t\topenState('right', ins, ownerInstance)\n\t} else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 &&\n\t\t\tleftWidth - left < threshold)) {\n\t\t// left\n\t\topenState('left', ins, ownerInstance)\n\t} else {\n\t\t// default\n\t\topenState('none', ins, ownerInstance)\n\t}\n}\n\n\n/**\n * 开启状态\n * @param {Boolean} type\n * @param {Object} ins\n * @param {Object} ownerInstance\n */\nfunction openState(type, ins, ownerInstance) {\n\tvar state = ins.getState()\n\tvar leftWidth = state.leftWidth\n\tvar rightWidth = state.rightWidth\n\tvar left = ''\n\tstate.isopen = state.isopen ? state.isopen : 'none'\n\tswitch (type) {\n\t\tcase \"left\":\n\t\t\tleft = leftWidth\n\t\t\tbreak\n\t\tcase \"right\":\n\t\t\tleft = -rightWidth\n\t\t\tbreak\n\t\tdefault:\n\t\t\tleft = 0\n\t}\n\n\t// && !state.throttle\n\n\tif (state.isopen !== type) {\n\t\tstate.throttle = true\n\t\townerInstance.callMethod('change', {\n\t\t\topen: type\n\t\t})\n\n\t}\n\n\tstate.isopen = type\n\t// 添加动画类\n\tins.requestAnimationFrame(function() {\n\t\tins.addClass('ani');\n\t\tmove(left, ins, ownerInstance)\n\t})\n\t// 设置最终移动位置,理论上只要进入到这个函数，肯定是要打开的\n}\n\n\nfunction getDirection(x, y) {\n\tif (x > y && x > MIN_DISTANCE) {\n\t\treturn 'horizontal';\n\t}\n\tif (y > x && y > MIN_DISTANCE) {\n\t\treturn 'vertical';\n\t}\n\treturn '';\n}\n\n/**\n * 重置滑动状态\n * @param {Object} event\n */\nfunction resetTouchStatus(instance) {\n\tvar state = instance.getState();\n\tstate.direction = '';\n\tstate.deltaX = 0;\n\tstate.deltaY = 0;\n\tstate.offsetX = 0;\n\tstate.offsetY = 0;\n}\n\n/**\n * 设置滑动开始位置\n * @param {Object} event\n */\nfunction stopTouchStart(event) {\n\tvar instance = event.instance;\n\tvar state = instance.getState();\n\tresetTouchStatus(instance);\n\tvar touch = event.touches[0];\n\tif (IS_HTML5 && isPC()) {\n\t\ttouch = event;\n\t}\n\tstate.startX = touch.clientX;\n\tstate.startY = touch.clientY;\n}\n\n/**\n * 滑动中，是否禁止打开\n * @param {Object} event\n */\nfunction stopTouchMove(event) {\n\tvar instance = event.instance;\n\tvar state = instance.getState();\n\tvar touch = event.touches[0];\n\tif (IS_HTML5 && isPC()) {\n\t\ttouch = event;\n\t}\n\tstate.deltaX = touch.clientX - state.startX;\n\tstate.deltaY = touch.clientY - state.startY;\n\tstate.offsetY = Math.abs(state.deltaY);\n\tstate.offsetX = Math.abs(state.deltaX);\n\tstate.direction = state.direction || getDirection(state.offsetX, state.offsetY);\n}\n\nfunction isPC() {\n\tvar userAgentInfo = navigator.userAgent;\n\tvar Agents = [\"Android\", \"iPhone\", \"SymbianOS\", \"Windows Phone\", \"iPad\", \"iPod\"];\n\tvar flag = true;\n\tfor (var v = 0; v < Agents.length - 1; v++) {\n\t\tif (userAgentInfo.indexOf(Agents[v]) > 0) {\n\t\t\tflag = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn flag;\n}\n\nvar movable = false\n\nfunction mousedown(e, ins) {\n\tif (!IS_HTML5) return\n\tif (!isPC()) return\n\ttouchstart(e, ins)\n\tmovable = true\n}\n\nfunction mousemove(e, ins) {\n\tif (!IS_HTML5) return\n\tif (!isPC()) return\n\tif (!movable) return\n\ttouchmove(e, ins)\n}\n\nfunction mouseup(e, ins) {\n\tif (!IS_HTML5) return\n\tif (!isPC()) return\n\ttouchend(e, ins)\n\tmovable = false\n}\n\nfunction mouseleave(e, ins) {\n\tif (!IS_HTML5) return\n\tif (!isPC()) return\n\tmovable = false\n}\n\nmodule.exports = {\n\tshowWatch: showWatch,\n\ttouchstart: touchstart,\n\ttouchmove: touchmove,\n\ttouchend: touchend,\n\tmousedown: mousedown,\n\tmousemove: mousemove,\n\tmouseup: mouseup,\n\tmouseleave: mouseleave\n}\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/package.json",
    "content": "{\n\t\"id\": \"uni-swipe-action\",\n\t\"displayName\": \"uni-swipe-action 滑动操作\",\n\t\"version\": \"1.3.8\",\n\t\"description\": \"SwipeAction 滑动操作操作组件\",\n\t\"keywords\": [\n        \"\",\n        \"uni-ui\",\n        \"uniui\",\n        \"滑动删除\",\n        \"侧滑删除\"\n    ],\n\t\"repository\": \"https://github.com/dcloudio/uni-ui\",\n\t\"engines\": {\n\t\t\"HBuilderX\": \"\"\n\t},\n\t\"directories\": {\n\t\t\"example\": \"../../temps/example_temps\"\n\t},\n    \"dcloudext\": {\n        \"sale\": {\n\t\t\t\"regular\": {\n\t\t\t\t\"price\": \"0.00\"\n\t\t\t},\n\t\t\t\"sourcecode\": {\n\t\t\t\t\"price\": \"0.00\"\n\t\t\t}\n\t\t},\n\t\t\"contact\": {\n\t\t\t\"qq\": \"\"\n\t\t},\n\t\t\"declaration\": {\n\t\t\t\"ads\": \"无\",\n\t\t\t\"data\": \"无\",\n\t\t\t\"permissions\": \"无\"\n\t\t},\n        \"npmurl\": \"https://www.npmjs.com/package/@dcloudio/uni-ui\",\n        \"type\": \"component-vue\"\n\t},\n\t\"uni_modules\": {\n\t\t\"dependencies\": [\"uni-scss\"],\n\t\t\"encrypt\": [],\n\t\t\"platforms\": {\n\t\t\t\"cloud\": {\n\t\t\t\t\"tcb\": \"y\",\n\t\t\t\t\"aliyun\": \"y\"\n\t\t\t},\n\t\t\t\"client\": {\n\t\t\t\t\"App\": {\n\t\t\t\t\t\"app-vue\": \"y\",\n\t\t\t\t\t\"app-nvue\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"H5-mobile\": {\n\t\t\t\t\t\"Safari\": \"y\",\n\t\t\t\t\t\"Android Browser\": \"y\",\n\t\t\t\t\t\"微信浏览器(Android)\": \"y\",\n\t\t\t\t\t\"QQ浏览器(Android)\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"H5-pc\": {\n\t\t\t\t\t\"Chrome\": \"y\",\n\t\t\t\t\t\"IE\": \"y\",\n\t\t\t\t\t\"Edge\": \"y\",\n\t\t\t\t\t\"Firefox\": \"y\",\n\t\t\t\t\t\"Safari\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"小程序\": {\n\t\t\t\t\t\"微信\": \"y\",\n\t\t\t\t\t\"阿里\": \"y\",\n\t\t\t\t\t\"百度\": \"y\",\n\t\t\t\t\t\"字节跳动\": \"y\",\n\t\t\t\t\t\"QQ\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"快应用\": {\n\t\t\t\t\t\"华为\": \"y\",\n\t\t\t\t\t\"联盟\": \"u\"\n\t\t\t\t},\n\t\t\t\t\"Vue\": {\n\t\t\t\t\t\"vue2\": \"y\",\n\t\t\t\t\t\"vue3\": \"y\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uni-swipe-action/readme.md",
    "content": "\n\n## SwipeAction 滑动操作\n> **组件名：uni-swipe-action**\n> 代码块： `uSwipeAction`、`uSwipeActionItem`\n\n\n通过滑动触发选项的容器\n\n### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swipe-action)\n#### 如使用过程中有任何问题，或者您对uni-ui有一些好的建议，欢迎加入 uni-ui 交流群：871950839 "
  },
  {
    "path": "uni_modules/uview-ui/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 www.uviewui.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "uni_modules/uview-ui/README.md",
    "content": "<p align=\"center\">\n    <img alt=\"logo\" src=\"https://uviewui.com/common/logo.png\" width=\"120\" height=\"120\" style=\"margin-bottom: 10px;\">\n</p>\n<h3 align=\"center\" style=\"margin: 30px 0 30px;font-weight: bold;font-size:40px;\">uView 2.0</h3>\n<h3 align=\"center\">多平台快速开发的UI框架</h3>\n\n[![stars](https://img.shields.io/github/stars/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)\n[![forks](https://img.shields.io/github/forks/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)\n[![issues](https://img.shields.io/github/issues/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0/issues)\n[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com)\n[![release](https://img.shields.io/github/v/release/umicro/uView2.0?style=flat-square)](https://gitee.com/umicro/uView2.0/releases)\n[![license](https://img.shields.io/github/license/umicro/uView2.0?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)\n\n## 说明\n\nuView UI，是[uni-app](https://uniapp.dcloud.io/)全面兼容nvue的uni-app生态框架，全面的组件和便捷的工具会让您信手拈来，如鱼得水\n\n## [官方文档：https://uviewui.com](https://uviewui.com)\n\n\n## 预览\n\n您可以通过**微信**扫码，查看最佳的演示效果。\n<br>\n<br>\n<img src=\"https://uviewui.com/common/weixin_mini_qrcode.png\" width=\"220\" height=\"220\" >\n\n\n## 链接\n\n- [官方文档](https://www.uviewui.com/)\n- [更新日志](https://www.uviewui.com/components/changelog.html)\n- [升级指南](https://www.uviewui.com/components/changeGuide.html)\n- [关于我们](https://www.uviewui.com/cooperation/about.html)\n\n## 交流反馈\n\n欢迎加入我们的QQ群交流反馈：[点此跳转](https://www.uviewui.com/components/addQQGroup.html)\n\n## 关于PR\n\n> 我们非常乐意接受各位的优质PR，但在此之前我希望您了解uView2.0是一个需要兼容多个平台的（小程序、h5、ios app、android app）包括nvue页面、vue页面。\n> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢！\n\n## 安装\n\n#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593)\n\n请通过[官网安装文档](https://www.uviewui.com/components/install.html)了解更详细的内容\n\n## 快速上手\n\n请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容\n\n## 使用方法\n配置easycom规则后，自动按需引入，无需`import`组件，直接引用即可。\n\n```html\n<template>\n\t<u-button text=\"按钮\"></u-button>\n</template>\n```\n\n## 版权信息\nuView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议，意味着您无需支付任何费用，也无需授权，即可将uView应用到您的产品中。\n\n"
  },
  {
    "path": "uni_modules/uview-ui/changelog.md",
    "content": "## 2.0.34（2022-09-25）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. `u-input`、`u-textarea`增加`ignoreCompositionEvent`属性\n2. 修复`route`方法调用可能报错的问题\n3. 修复`u-no-network`组件`z-index`无效的问题\n4. 修复`textarea`组件在h5上confirmType=\"\"报错的问题\n5. `u-rate`适配`nvue`\n6. 优化验证手机号码的正则表达式(根据工信部发布的《电信网编号计划（2017年版）》进行修改。)\n7. `form-item`添加`labelPosition`属性\n8. `u-calendar`修复`maxDate`设置为当前日期，并且当前时间大于08：00时无法显示日期列表的问题 (#724)\n9. `u-radio`增加一个默认插槽用于自定义修改label内容 (#680)\n10. 修复`timeFormat`函数在safari重的兼容性问题 (#664)\n## 2.0.33（2022-06-17）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复`loadmore`组件`lineColor`类型错误问题\n2. 修复`u-parse`组件`imgtap`、`linktap`不生效问题\n## 2.0.32（2022-06-16）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n1. `u-loadmore`新增自定义颜色、虚/实线\n2. 修复`u-swiper-action`组件部分平台不能上下滑动的问题\n3. 修复`u-list`回弹问题\n4. 修复`notice-bar`组件动画在低端安卓机可能会抖动的问题\n5. `u-loading-page`添加控制图标大小的属性`iconSize`\n6. 修复`u-tooltip`组件`color`参数不生效的问题\n7. 修复`u--input`组件使用`blur`事件输出为`undefined`的bug\n8. `u-code-input`组件新增键盘弹起时，是否自动上推页面参数`adjustPosition`\n9. 修复`image`组件`load`事件无回调对象问题\n10. 修复`button`组件`loadingSize`设置无效问题\n10. 其他修复\n## 2.0.31（2022-04-19）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复`upload`在`vue`页面上传成功后没有成功标志的问题\n2. 解决演示项目中微信小程序模拟上传图片一直出于上传中问题\n3. 修复`u-code-input`组件在`nvue`页面编译到`app`平台上光标异常问题（`app`去除此功能）\n4. 修复`actionSheet`组件标题关闭按钮点击事件名称错误的问题\n5. 其他修复\n## 2.0.30（2022-04-04）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. `u-rate`增加`readonly`属性\n2. `tabs`滑块支持设置背景图片\n3. 修复`u-subsection` `mode`为`subsection`时，滑块样式不正确的问题\n4. `u-code-input`添加光标效果动画\n5. 修复`popup`的`open`事件不触发\n6. 修复`u-flex-column`无效的问题\n7. 修复`u-datetime-picker`索引在特定场合异常问题\n8. 修复`u-datetime-picker`最小时间字符串模板错误问题\n9. `u-swiper`添加`m3u8`验证\n10. `u-swiper`修改判断image和video逻辑\n11. 修复`swiper`无法使用本地图片问题，增加`type`参数\n12. 修复`u-row-notice`格式错误问题\n13. 修复`u-switch`组件当`unit`为`rpx`时,`nodeStyle`消失的问题\n14. 修复`datetime-picker`组件`showToolbar`与`visibleItemCount`属性无效的问题\n15. 修复`upload`组件条件编译位置判断错误，导致`previewImage`属性设置为`false`时，整个组件都会被隐藏的问题\n16. 修复`u-checkbox-group`设置`shape`属性无效的问题\n17. 修复`u-upload`的`capture`传入字符串的时候不生效的问题\n18. 修复`u-action-sheet`组件，关闭事件逻辑错误的问题\n19. 修复`u-list`触顶事件的触发错误的问题\n20. 修复`u-text`只有手机号可拨打的问题\n21. 修复`u-textarea`不能换行的问题\n22. 其他修复\n## 2.0.29（2022-03-13）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复`u--text`组件设置`decoration`属性未生效的问题\n2. 修复`u-datetime-picker`使用`formatter`后返回值不正确\n3. 修复`u-datetime-picker` `intercept` 可能为undefined\n4. 修复已设置单位 uni..config.unit = 'rpx'时，线型指示器 `transform` 的位置翻倍，导致指示器超出宽度\n5. 修复mixin中bem方法生成的类名在支付宝和字节小程序中失效\n6. 修复默认值传值为空的时候，打开`u-datetime-picker`报错，不能选中第一列时间的bug\n7. 修复`u-datetime-picker`使用`formatter`后返回值不正确\n8. 修复`u-image`组件`loading`无效果的问题\n9. 修复`config.unit`属性设为`rpx`时，导航栏占用高度不足导致塌陷的问题\n10. 修复`u-datetime-picker`组件`itemHeight`无效问题\n11. 其他修复\n## 2.0.28（2022-02-22）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. search组件新增searchIconSize属性\n2. 兼容Safari/Webkit中传入时间格式如2022-02-17 12:00:56\n3. 修复text value.js 判断日期出format错误问题\n4. priceFormat格式化金额出现精度错误\n5. priceFormat在部分情况下出现精度损失问题\n6. 优化表单rules提示\n7. 修复avatar组件src为空时，展示状态不对\n8. 其他修复\n## 2.0.27（2022-01-28）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1.样式修复\n## 2.0.26（2022-01-28）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1.样式修复\n## 2.0.25（2022-01-27）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复text组件mode=price时，可能会导致精度错误的问题\n2. 添加$u.setConfig()方法，可设置uView内置的config, props, zIndex, color属性，详见：[修改uView内置配置方案](https://uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)\n3. 优化form组件在errorType=toast时，如果输入错误页面会有抖动的问题\n4. 修复$u.addUnit()对配置默认单位可能无效的问题\n## 2.0.24（2022-01-25）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复swiper在current指定非0时缩放有误\n2. 修复u-icon添加stop属性的时候报错\n3. 优化遗留的通过正则判断rpx单位的问题\n4. 优化Layout布局 vue使用gutter时，会超出固定区域\n5. 优化search组件高度单位问题（rpx -> px）\n6. 修复u-image slot 加载和错误的图片失去了高度\n7. 修复u-index-list中footer插槽与header插槽存在性判断错误\n8. 修复部分机型下u-popup关闭时会闪烁\n9. 修复u-image在nvue-app下失去宽高\n10. 修复u-popup运行报错\n11. 修复u-tooltip报错\n12. 修复box-sizing在app下的警告\n13. 修复u-navbar在小程序中报运行时错误\n14. 其他修复\n## 2.0.23（2022-01-24）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复image组件在hx3.3.9的nvue下可能会显示异常的问题\n2. 修复col组件gutter参数带rpx单位处理不正确的问题\n3. 修复text组件单行时无法显示省略号的问题\n4. navbar添加titleStyle参数\n5. 升级到hx3.3.9可消除nvue下控制台样式警告的问题\n## 2.0.22（2022-01-19）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. $u.page()方法优化，避免在特殊场景可能报错的问题\n2. picker组件添加immediateChange参数\n3. 新增$u.pages()方法\n## 2.0.21（2022-01-19）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 优化：form组件在用户设置rules的时候提示用户model必传\n2. 优化遗留的通过正则判断rpx单位的问题\n3. 修复微信小程序环境中tabbar组件开启safeAreaInsetBottom属性后，placeholder高度填充不正确\n4. 修复swiper在current指定非0时缩放有误\n5. 修复u-icon添加stop属性的时候报错\n6. 修复upload组件在accept=all的时候没有作用\n7. 修复在text组件mode为phone时call属性无效的问题\n8. 处理u-form clearValidate方法\n9. 其他修复\n## 2.0.20（2022-01-14）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复calendar默认会选择一个日期，如果直接点确定的话，无法取到值的问题\n2. 修复Slider缺少disabled props 还有注释\n3. 修复u-notice-bar点击事件无法拿到index索引值的问题\n4. 修复u-collapse-item在vue文件下，app端自定义插槽不生效的问题\n5. 优化头像为空时显示默认头像 \n6. 修复图片地址赋值后判断加载状态为完成问题\n7. 修复日历滚动到默认日期月份区域\n8. search组件暴露点击左边icon事件\n9. 修复u-form clearValidate方法不生效\n10. upload h5端增加返回文件参数（文件的name参数）\n11. 处理upload选择文件后url为blob类型无法预览的问题\n12. u-code-input 修复输入框没有往左移出一半屏幕\n13. 修复Upload上传 disabled为true时，控制台报hoverClass类型错误\n14. 临时处理ios app下grid点击坍塌问题\n15. 其他修复\n## 2.0.19（2021-12-29）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 优化微信小程序包体积可在微信中预览，请升级HbuilderX3.3.4，同时在“运行->运行到小程序模拟器”中勾选“运行时是否压缩代码”\n2. 优化微信小程序setData性能，处理某些方法如$u.route()无法在模板中使用的问题\n3. navbar添加autoBack参数\n4. 允许avatar组件的事件冒泡\n5. 修复cell组件报错问题\n6. 其他修复\n## 2.0.18（2021-12-28）\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复app端编译报错问题\n2. 重新处理微信小程序端setData过大的性能问题\n3. 修复边框问题\n4. 修复最大最小月份不大于0则没有数据出现的问题\n5. 修复SwipeAction微信小程序端无法上下滑动问题\n6. 修复input的placeholder在小程序端默认显示为true问题\n7. 修复divider组件click事件无效问题\n8. 修复u-code-input maxlength 属性值为 String 类型时显示异常\n9. 修复当 grid只有 1到2时 在小程序端algin设置无效的问题\n10. 处理form-item的label为top时，取消错误提示的左边距\n11. 其他修复\n## 2.0.17（2021-12-26）\n## uView正在参与开源中国的“年度最佳项目”评选，之前投过票的现在也可以投票，恳请同学们投一票，[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 解决HBuilderX3.3.3.20211225版本导致的样式问题\n2. calendar日历添加monthNum参数\n3. navbar添加center slot\n## 2.0.16（2021-12-25）\n## uView正在参与开源中国的“年度最佳项目”评选，之前投过票的现在也可以投票，恳请同学们投一票，[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 解决微信小程序setData性能问题\n2. 修复count-down组件change事件不触发问题\n## 2.0.15（2021-12-21）\n## uView正在参与开源中国的“年度最佳项目”评选，之前投过票的现在也可以投票，恳请同学们投一票，[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复Cell单元格titleWidth无效\n2. 修复cheakbox组件ischecked不更新\n3. 修复keyboard是否显示\".\"按键默认值问题\n4. 修复number-keyboard是否显示键盘的\".\"符号问题\n5. 修复Input输入框 readonly无效\n6. 修复u-avatar 导致打包app、H5时候报错问题\n7. 修复Upload上传deletable无效\n8. 修复upload当设置maxSize时无效的问题\n9. 修复tabs lineWidth传入带单位的字符串的时候偏移量计算错误问题\n10. 修复rate组件在有padding的view内，显示的星星位置和可触摸区域不匹配，无法正常选中星星\n## 2.0.13（2021-12-14）\n## [点击加群交流反馈：364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复配置默认单位为rpx可能会导致自定义导航栏高度异常的问题\n## 2.0.12（2021-12-14）\n## [点击加群交流反馈：364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复tabs组件在vue环境下划线消失的问题\n2. 修复upload组件在安卓小程序无法选择视频的问题\n3. 添加uni.$u.config.unit配置，用于配置参数默认单位，详见：[默认单位配置](https://www.uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)\n4. 修复textarea组件在没绑定v-model时，字符统计不生效问题\n5. 修复nvue下控制是否出现滚动条失效问题\n## 2.0.11（2021-12-13）\n## [点击加群交流反馈：364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. text组件align参数无效的问题\n2. subsection组件添加keyName参数\n3. upload组件无法判断[Object file]类型的问题\n4. 处理notify层级过低问题\n5. codeInput组件添加disabledDot参数\n6. 处理actionSheet组件round参数无效的问题\n7. calendar组件添加round参数用于控制圆角值\n8. 处理swipeAction组件在vue环境下默认被打开的问题\n9. button组件的throttleTime节流参数无效的问题\n10. 解决u-notify手动关闭方法close()无效的问题\n11. input组件readonly不生效问题\n12. tag组件type参数为info不生效问题\n## 2.0.10（2021-12-08）\n## [点击加群交流反馈：364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复button sendMessagePath属性不生效\n2. 修复DatetimePicker选择器title无效\n3. 修复u-toast设置loading=true不生效\n4. 修复u-text金额模式传0报错\n5. 修复u-toast组件的icon属性配置不生效\n6. button的icon在特殊场景下的颜色优化\n7. IndexList优化，增加#\n## 2.0.9（2021-12-01）\n## [点击加群交流反馈：232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 优化swiper的height支持100%值(仅vue有效)，修复嵌入视频时click事件无法触发的问题\n2. 优化tabs组件对list值为空的判断，或者动态变化list时重新计算相关尺寸的问题\n3. 优化datetime-picker组件逻辑，让其后续打开的默认值为上一次的选中值，需要通过v-model绑定值才有效\n4. 修复upload内嵌在其他组件中，选择图片可能不会换行的问题\n## 2.0.8（2021-12-01）\n## [点击加群交流反馈：232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复toast的position参数无效问题\n2. 处理input在ios nvue上无法获得焦点的问题\n3. avatar-group组件添加extraValue参数，让剩余展示数量可手动控制\n4. tabs组件添加keyName参数用于配置从对象中读取的键名\n5. 处理text组件名字脱敏默认配置无效的问题\n6. 处理picker组件item文本太长换行问题\n## 2.0.7（2021-11-30）\n## [点击加群交流反馈：232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 修复radio和checkbox动态改变v-model无效的问题。\n2. 优化form规则validator在微信小程序用法\n3. 修复backtop组件mode参数在微信小程序无效的问题\n4. 处理Album的previewFullImage属性无效的问题\n5. 处理u-datetime-picker组件mode='time'在选择改变时间时，控制台报错的问题\n## 2.0.6（2021-11-27）\n## [点击加群交流反馈：232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. 处理tag组件在vue下边框无效的问题。\n2. 处理popup组件圆角参数可能无效的问题。\n3. 处理tabs组件lineColor参数可能无效的问题。\n4. propgress组件在值很小时，显示异常的问题。\n## 2.0.5（2021-11-25）\n## [点击加群交流反馈：232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. calendar在vue下显示异常问题。 \n2. form组件labelPosition和errorType参数无效的问题\n3. input组件inputAlign无效的问题\n4. 其他一些修复\n## 2.0.4（2021-11-23）\n## [点击加群交流反馈：232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n0. input组件缺失@confirm事件，以及subfix和prefix无效问题\n1. component.scss文件样式在vue下干扰全局布局问题\n2. 修复subsection在vue环境下表现异常的问题\n3. tag组件的bgColor等参数无效的问题\n4. upload组件不换行的问题\n5. 其他的一些修复处理\n## 2.0.3（2021-11-16）\n## [点击加群交流反馈：1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. uView2.0已实现全面兼容nvue\n2. uView2.0对1.x进行了架构重构，细节和性能都有极大提升\n3. 目前uView2.0为公测阶段，相关细节可能会有变动\n4. 我们写了一份与1.x的对比指南，详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)\n5. 处理modal的confirm回调事件拼写错误问题\n6. 处理input组件@input事件参数错误问题\n7. 其他一些修复\n## 2.0.2（2021-11-16）\n## [点击加群交流反馈：1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. uView2.0已实现全面兼容nvue\n2. uView2.0对1.x进行了架构重构，细节和性能都有极大提升\n3. 目前uView2.0为公测阶段，相关细节可能会有变动\n4. 我们写了一份与1.x的对比指南，详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)\n5. 修复input组件formatter参数缺失问题\n6. 优化loading-icon组件的scss写法问题，防止不兼容新版本scss\n## 2.0.0(2020-11-15)\n## [点击加群交流反馈：1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)\n\n# uView2.0重磅发布，利剑出鞘，一统江湖\n\n1. uView2.0已实现全面兼容nvue\n2. uView2.0对1.x进行了架构重构，细节和性能都有极大提升\n3. 目前uView2.0为公测阶段，相关细节可能会有变动\n4. 我们写了一份与1.x的对比指南，详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)\n5. 修复input组件formatter参数缺失问题\n\n\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u--form/u--form.vue",
    "content": "<template>\n\t<uvForm\n\t\tref=\"uForm\"\n\t\t:model=\"model\"\n\t\t:rules=\"rules\"\n\t\t:errorType=\"errorType\"\n\t\t:borderBottom=\"borderBottom\"\n\t\t:labelPosition=\"labelPosition\"\n\t\t:labelWidth=\"labelWidth\"\n\t\t:labelAlign=\"labelAlign\"\n\t\t:labelStyle=\"labelStyle\"\n\t\t:customStyle=\"customStyle\"\n\t>\n\t\t<slot />\n\t</uvForm>\n</template>\n\n<script>\n\t/**\n\t * 此组件存在的理由是，在nvue下，u-form被uni-app官方占用了，u-form在nvue中相当于form组件\n\t * 所以在nvue下，取名为u--form，内部其实还是u-form.vue，只不过做一层中转\n\t */\n\timport uvForm from '../u-form/u-form.vue';\n\timport props from '../u-form/props.js'\n\texport default {\n\t\t// #ifdef MP-WEIXIN\n\t\tname: 'u-form',\n\t\t// #endif\n\t\t// #ifndef MP-WEIXIN\n\t\tname: 'u--form',\n\t\t// #endif\n\t\tmixins: [uni.$u.mpMixin, props, uni.$u.mixin],\n\t\tcomponents: {\n\t\t\tuvForm\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t},\n\t\tmethods: {\n\t\t\t// 手动设置校验的规则，如果规则中有函数的话，微信小程序中会过滤掉，所以只能手动调用设置规则\n\t\t\tsetRules(rules) {\n\t\t\t\tthis.$refs.uForm.setRules(rules)\n\t\t\t},\n\t\t\tvalidate() {\n\t\t\t\t/**\n\t\t\t\t * 在微信小程序中，通过this.$parent拿到的父组件是u--form，而不是其内嵌的u-form\n\t\t\t\t * 导致在u-form组件中，拿不到对应的children数组，从而校验无效，所以这里每次调用u-form组件中的\n\t\t\t\t * 对应方法的时候，在小程序中都先将u--form的children赋值给u-form中的children\n\t\t\t\t */\n\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\tthis.setMpData()\n\t\t\t\t// #endif\n\t\t\t\treturn this.$refs.uForm.validate()\n\t\t\t},\n\t\t\tvalidateField(value, callback) {\n\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\tthis.setMpData()\n\t\t\t\t// #endif\n\t\t\t\treturn this.$refs.uForm.validateField(value, callback)\n\t\t\t},\n\t\t\tresetFields() {\n\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\tthis.setMpData()\n\t\t\t\t// #endif\n\t\t\t\treturn this.$refs.uForm.resetFields()\n\t\t\t},\n\t\t\tclearValidate(props) {\n\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\tthis.setMpData()\n\t\t\t\t// #endif\n\t\t\t\treturn this.$refs.uForm.clearValidate(props)\n\t\t\t},\n\t\t\tsetMpData() {\n\t\t\t\tthis.$refs.uForm.children = this.children\n\t\t\t}\n\t\t},\n\t}\n</script>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u--image/u--image.vue",
    "content": "<template>\n\t<uvImage \n\t\t:src=\"src\"\n\t\t:mode=\"mode\"\n\t\t:width=\"width\"\n\t\t:height=\"height\"\n\t\t:shape=\"shape\"\n\t\t:radius=\"radius\"\n\t\t:lazyLoad=\"lazyLoad\"\n\t\t:showMenuByLongpress=\"showMenuByLongpress\"\n\t\t:loadingIcon=\"loadingIcon\"\n\t\t:errorIcon=\"errorIcon\"\n\t\t:showLoading=\"showLoading\"\n\t\t:showError=\"showError\"\n\t\t:fade=\"fade\"\n\t\t:webp=\"webp\"\n\t\t:duration=\"duration\"\n\t\t:bgColor=\"bgColor\"\n\t\t:customStyle=\"customStyle\"\n\t\t@click=\"$emit('click')\"\n\t\t@error=\"$emit('error')\"\n\t\t@load=\"$emit('load')\"\n\t>\n\t\t<template v-slot:loading>\n\t\t\t<slot name=\"loading\"></slot>\n\t\t</template>\n\t\t<template v-slot:error>\n\t\t\t<slot name=\"error\"></slot>\n\t\t</template>\n\t</uvImage>\n</template>\n\n<script>\n\t/**\n\t * 此组件存在的理由是，在nvue下，u-image被uni-app官方占用了，u-image在nvue中相当于image组件\n\t * 所以在nvue下，取名为u--image，内部其实还是u-iamge.vue，只不过做一层中转\n\t */\n\timport uvImage from '../u-image/u-image.vue';\n\timport props from '../u-image/props.js';\n\texport default {\n\t\tname: 'u--image',\n\t\tmixins: [uni.$u.mpMixin, props, uni.$u.mixin],\n\t\tcomponents: {\n\t\t\tuvImage\n\t\t},\n\t}\n</script>"
  },
  {
    "path": "uni_modules/uview-ui/components/u--input/u--input.vue",
    "content": "<template>\n\t<uvInput \n\t\t:value=\"value\"\n\t\t:type=\"type\"\n\t\t:fixed=\"fixed\"\n\t\t:disabled=\"disabled\"\n\t\t:disabledColor=\"disabledColor\"\n\t\t:clearable=\"clearable\"\n\t\t:password=\"password\"\n\t\t:maxlength=\"maxlength\"\n\t\t:placeholder=\"placeholder\"\n\t\t:placeholderClass=\"placeholderClass\"\n\t\t:placeholderStyle=\"placeholderStyle\"\n\t\t:showWordLimit=\"showWordLimit\"\n\t\t:confirmType=\"confirmType\"\n\t\t:confirmHold=\"confirmHold\"\n\t\t:holdKeyboard=\"holdKeyboard\"\n\t\t:focus=\"focus\"\n\t\t:autoBlur=\"autoBlur\"\n\t\t:disableDefaultPadding=\"disableDefaultPadding\"\n\t\t:cursor=\"cursor\"\n\t\t:cursorSpacing=\"cursorSpacing\"\n\t\t:selectionStart=\"selectionStart\"\n\t\t:selectionEnd=\"selectionEnd\"\n\t\t:adjustPosition=\"adjustPosition\"\n\t\t:inputAlign=\"inputAlign\"\n\t\t:fontSize=\"fontSize\"\n\t\t:color=\"color\"\n\t\t:prefixIcon=\"prefixIcon\"\n\t\t:suffixIcon=\"suffixIcon\"\n\t\t:suffixIconStyle=\"suffixIconStyle\"\n\t\t:prefixIconStyle=\"prefixIconStyle\"\n\t\t:border=\"border\"\n\t\t:readonly=\"readonly\"\n\t\t:shape=\"shape\"\n\t\t:customStyle=\"customStyle\"\n\t\t:formatter=\"formatter\"\n\t\t:ignoreCompositionEvent=\"ignoreCompositionEvent\"\n\t\t@focus=\"$emit('focus')\"\n\t\t@blur=\"e => $emit('blur', e)\"\n\t\t@keyboardheightchange=\"$emit('keyboardheightchange')\"\n\t\t@change=\"e => $emit('change', e)\"\n\t\t@input=\"e => $emit('input', e)\"\n\t\t@confirm=\"e => $emit('confirm', e)\"\n\t\t@clear=\"$emit('clear')\"\n\t\t@click=\"$emit('click')\"\n\t>\n\t\t<!-- #ifdef MP -->\n\t\t<slot name=\"prefix\"></slot>\n\t\t<slot name=\"suffix\"></slot>\n\t\t<!-- #endif -->\n\t\t<!-- #ifndef MP -->\n\t\t<slot name=\"prefix\" slot=\"prefix\"></slot>\n\t\t<slot name=\"suffix\" slot=\"suffix\"></slot>\n\t\t<!-- #endif -->\n\t</uvInput>\n</template>\n\n<script>\n\t/**\n\t * 此组件存在的理由是，在nvue下，u-input被uni-app官方占用了，u-input在nvue中相当于input组件\n\t * 所以在nvue下，取名为u--input，内部其实还是u-input.vue，只不过做一层中转\n\t */\n\timport uvInput from '../u-input/u-input.vue';\n\timport props from '../u-input/props.js'\n\texport default {\n\t\tname: 'u--input',\n\t\tmixins: [uni.$u.mpMixin, props, uni.$u.mixin],\n\t\tcomponents: {\n\t\t\tuvInput\n\t\t},\n\t}\n</script>"
  },
  {
    "path": "uni_modules/uview-ui/components/u--text/u--text.vue",
    "content": "<template>\n    <uvText\n        :type=\"type\"\n        :show=\"show\"\n        :text=\"text\"\n        :prefixIcon=\"prefixIcon\"\n        :suffixIcon=\"suffixIcon\"\n        :mode=\"mode\"\n        :href=\"href\"\n        :format=\"format\"\n        :call=\"call\"\n        :openType=\"openType\"\n        :bold=\"bold\"\n        :block=\"block\"\n        :lines=\"lines\"\n        :color=\"color\"\n\t\t:decoration=\"decoration\"\n        :size=\"size\"\n        :iconStyle=\"iconStyle\"\n        :margin=\"margin\"\n        :lineHeight=\"lineHeight\"\n        :align=\"align\"\n        :wordWrap=\"wordWrap\"\n        :customStyle=\"customStyle\"\n        @click=\"$emit('click')\"\n    ></uvText>\n</template>\n\n<script>\n/**\n * 此组件存在的理由是，在nvue下，u-text被uni-app官方占用了，u-text在nvue中相当于input组件\n * 所以在nvue下，取名为u--input，内部其实还是u-text.vue，只不过做一层中转\n * 不使用v-bind=\"$attrs\"，而是分开独立写传参，是因为微信小程序不支持此写法\n */\nimport uvText from \"../u-text/u-text.vue\";\nimport props from \"../u-text/props.js\";\nexport default {\n    name: \"u--text\",\n    mixins: [uni.$u.mpMixin, props, uni.$u.mixin],\n    components: {\n        uvText,\n    },\n};\n</script>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u--textarea/u--textarea.vue",
    "content": "<template>\n\t<uvTextarea\n\t\t:value=\"value\"\n\t\t:placeholder=\"placeholder\"\n\t\t:height=\"height\"\n\t\t:confirmType=\"confirmType\"\n\t\t:disabled=\"disabled\"\n\t\t:count=\"count\"\n\t\t:focus=\"focus\"\n\t\t:autoHeight=\"autoHeight\"\n\t\t:fixed=\"fixed\"\n\t\t:cursorSpacing=\"cursorSpacing\"\n\t\t:cursor=\"cursor\"\n\t\t:showConfirmBar=\"showConfirmBar\"\n\t\t:selectionStart=\"selectionStart\"\n\t\t:selectionEnd=\"selectionEnd\"\n\t\t:adjustPosition=\"adjustPosition\"\n\t\t:disableDefaultPadding=\"disableDefaultPadding\"\n\t\t:holdKeyboard=\"holdKeyboard\"\n\t\t:maxlength=\"maxlength\"\n\t\t:border=\"border\"\n\t\t:customStyle=\"customStyle\"\n\t\t:formatter=\"formatter\"\n\t\t:ignoreCompositionEvent=\"ignoreCompositionEvent\"\n\t\t@focus=\"e => $emit('focus')\"\n\t\t@blur=\"e => $emit('blur')\"\n\t\t@linechange=\"e => $emit('linechange', e)\"\n\t\t@confirm=\"e => $emit('confirm')\"\n\t\t@input=\"e => $emit('input', e)\"\n\t\t@keyboardheightchange=\"e => $emit('keyboardheightchange')\"\n\t></uvTextarea>\n</template>\n\n<script>\n\t/**\n\t * 此组件存在的理由是，在nvue下，u--textarea被uni-app官方占用了，u-textarea在nvue中相当于textarea组件\n\t * 所以在nvue下，取名为u--textarea，内部其实还是u-textarea.vue，只不过做一层中转\n\t */\n\timport uvTextarea from '../u-textarea/u-textarea.vue';\n\timport props from '../u-textarea/props.js'\n\texport default {\n\t\tname: 'u--textarea',\n\t\tmixins: [uni.$u.mpMixin, props, uni.$u.mixin],\n\t\tcomponents: {\n\t\t\tuvTextarea\n\t\t},\n\t}\n</script>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-action-sheet/props.js",
    "content": "export default {\n    props: {\n        // 操作菜单是否展示 （默认false）\n        show: {\n            type: Boolean,\n            default: uni.$u.props.actionSheet.show\n        },\n        // 标题\n        title: {\n            type: String,\n            default: uni.$u.props.actionSheet.title\n        },\n        // 选项上方的描述信息\n        description: {\n            type: String,\n            default: uni.$u.props.actionSheet.description\n        },\n        // 数据\n        actions: {\n            type: Array,\n            default: uni.$u.props.actionSheet.actions\n        },\n        // 取消按钮的文字，不为空时显示按钮\n        cancelText: {\n            type: String,\n            default: uni.$u.props.actionSheet.cancelText\n        },\n        // 点击某个菜单项时是否关闭弹窗\n        closeOnClickAction: {\n            type: Boolean,\n            default: uni.$u.props.actionSheet.closeOnClickAction\n        },\n        // 处理底部安全区（默认true）\n        safeAreaInsetBottom: {\n            type: Boolean,\n            default: uni.$u.props.actionSheet.safeAreaInsetBottom\n        },\n        // 小程序的打开方式\n        openType: {\n            type: String,\n            default: uni.$u.props.actionSheet.openType\n        },\n        // 点击遮罩是否允许关闭 (默认true)\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.actionSheet.closeOnClickOverlay\n        },\n        // 圆角值\n        round: {\n            type: [Boolean, String, Number],\n            default: uni.$u.props.actionSheet.round\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue",
    "content": "\n<template>\n\t<u-popup\n\t    :show=\"show\"\n\t    mode=\"bottom\"\n\t    @close=\"closeHandler\"\n\t    :safeAreaInsetBottom=\"safeAreaInsetBottom\"\n\t    :round=\"round\"\n\t>\n\t\t<view class=\"u-action-sheet\">\n\t\t\t<view\n\t\t\t    class=\"u-action-sheet__header\"\n\t\t\t    v-if=\"title\"\n\t\t\t>\n\t\t\t\t<text class=\"u-action-sheet__header__title u-line-1\">{{title}}</text>\n\t\t\t\t<view\n\t\t\t\t    class=\"u-action-sheet__header__icon-wrap\"\n\t\t\t\t    @tap.stop=\"cancel\"\n\t\t\t\t>\n\t\t\t\t\t<u-icon\n\t\t\t\t\t    name=\"close\"\n\t\t\t\t\t    size=\"17\"\n\t\t\t\t\t    color=\"#c8c9cc\"\n\t\t\t\t\t    bold\n\t\t\t\t\t></u-icon>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<text\n\t\t\t    class=\"u-action-sheet__description\"\n\t\t\t\t:style=\"[{\n\t\t\t\t\tmarginTop: `${title && description ? 0 : '18px'}`\n\t\t\t\t}]\"\n\t\t\t    v-if=\"description\"\n\t\t\t>{{description}}</text>\n\t\t\t<slot>\n\t\t\t\t<u-line v-if=\"description\"></u-line>\n\t\t\t\t<view class=\"u-action-sheet__item-wrap\">\n\t\t\t\t\t<template v-for=\"(item, index) in actions\">\n\t\t\t\t\t\t<!-- #ifdef MP -->\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t    :key=\"index\"\n\t\t\t\t\t\t    class=\"u-reset-button\"\n\t\t\t\t\t\t    :openType=\"item.openType\"\n\t\t\t\t\t\t    @getuserinfo=\"onGetUserInfo\"\n\t\t\t\t\t\t    @contact=\"onContact\"\n\t\t\t\t\t\t    @getphonenumber=\"onGetPhoneNumber\"\n\t\t\t\t\t\t    @error=\"onError\"\n\t\t\t\t\t\t    @launchapp=\"onLaunchApp\"\n\t\t\t\t\t\t    @opensetting=\"onOpenSetting\"\n\t\t\t\t\t\t    :lang=\"lang\"\n\t\t\t\t\t\t    :session-from=\"sessionFrom\"\n\t\t\t\t\t\t    :send-message-title=\"sendMessageTitle\"\n\t\t\t\t\t\t    :send-message-path=\"sendMessagePath\"\n\t\t\t\t\t\t    :send-message-img=\"sendMessageImg\"\n\t\t\t\t\t\t    :show-message-card=\"showMessageCard\"\n\t\t\t\t\t\t    :app-parameter=\"appParameter\"\n\t\t\t\t\t\t    @tap=\"selectHandler(index)\"\n\t\t\t\t\t\t    :hover-class=\"item && !item.disabled && !item.loading ? 'u-action-sheet--hover' : ''\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t    class=\"u-action-sheet__item-wrap__item\"\n\t\t\t\t\t\t\t    @tap.stop=\"selectHandler(index)\"\n\t\t\t\t\t\t\t    :hover-class=\"item && !item.disabled && !item.loading ? 'u-action-sheet--hover' : ''\"\n\t\t\t\t\t\t\t    :hover-stay-time=\"150\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template v-if=\"!item.loading\">\n\t\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t    class=\"u-action-sheet__item-wrap__item__name\"\n\t\t\t\t\t\t\t\t\t    :style=\"[itemStyle(index)]\"\n\t\t\t\t\t\t\t\t\t>{{ item.name }}</text>\n\t\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t    v-if=\"item.subname\"\n\t\t\t\t\t\t\t\t\t    class=\"u-action-sheet__item-wrap__item__subname\"\n\t\t\t\t\t\t\t\t\t>{{ item.subname }}</text>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<u-loading-icon\n\t\t\t\t\t\t\t\t    v-else\n\t\t\t\t\t\t\t\t    custom-class=\"van-action-sheet__loading\"\n\t\t\t\t\t\t\t\t    size=\"18\"\n\t\t\t\t\t\t\t\t    mode=\"circle\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t<!-- #ifdef MP -->\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t<u-line v-if=\"index !== actions.length - 1\"></u-line>\n\t\t\t\t\t</template>\n\t\t\t\t</view>\n\t\t\t</slot>\n\t\t\t<u-gap\n\t\t\t    bgColor=\"#eaeaec\"\n\t\t\t    height=\"6\"\n\t\t\t    v-if=\"cancelText\"\n\t\t\t></u-gap>\n\t\t\t<view hover-class=\"u-action-sheet--hover\">\n\t\t\t\t<text\n\t\t\t\t    @touchmove.stop.prevent\n\t\t\t\t    :hover-stay-time=\"150\"\n\t\t\t\t    v-if=\"cancelText\"\n\t\t\t\t    class=\"u-action-sheet__cancel-text\"\n\t\t\t\t    @tap=\"cancel\"\n\t\t\t\t>{{cancelText}}</text>\n\t\t\t</view>\n\t\t</view>\n\t</u-popup>\n</template>\n\n<script>\n\timport openType from '../../libs/mixin/openType'\n\timport button from '../../libs/mixin/button'\n\timport props from './props.js';\n\t/**\n\t * ActionSheet 操作菜单\n\t * @description 本组件用于从底部弹出一个操作菜单，供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI，配置更加灵活，所有平台都表现一致。\n\t * @tutorial https://www.uviewui.com/components/actionSheet.html\n\t * \n\t * @property {Boolean}\t\t\tshow\t\t\t\t操作菜单是否展示 （默认 false ）\n\t * @property {String}\t\t\ttitle\t\t\t\t操作菜单标题\n\t * @property {String}\t\t\tdescription\t\t\t选项上方的描述信息\n\t * @property {Array<Object>}\tactions\t\t\t\t按钮的文字数组，见官方文档示例\n\t * @property {String}\t\t\tcancelText\t\t\t取消按钮的提示文字,不为空时显示按钮\n\t * @property {Boolean}\t\t\tcloseOnClickAction\t点击某个菜单项时是否关闭弹窗 （默认 true ）\n\t * @property {Boolean}\t\t\tsafeAreaInsetBottom\t处理底部安全区 （默认 true ）\n\t * @property {String}\t\t\topenType\t\t\t小程序的打开方式 (contact | launchApp | getUserInfo | openSetting ｜getPhoneNumber ｜error )\n\t * @property {Boolean}\t\t\tcloseOnClickOverlay\t点击遮罩是否允许关闭  (默认 true )\n\t * @property {Number|String}\tround\t\t\t\t圆角值，默认无圆角  (默认 0 )\n\t * @property {String}\t\t\tlang\t\t\t\t指定返回用户信息的语言，zh_CN 简体中文，zh_TW 繁体中文，en 英文\n\t * @property {String}\t\t\tsessionFrom\t\t\t会话来源，openType=\"contact\"时有效\n\t * @property {String}\t\t\tsendMessageTitle\t会话内消息卡片标题，openType=\"contact\"时有效\n\t * @property {String}\t\t\tsendMessagePath\t\t会话内消息卡片点击跳转小程序路径，openType=\"contact\"时有效\n\t * @property {String}\t\t\tsendMessageImg\t\t会话内消息卡片图片，openType=\"contact\"时有效\n\t * @property {Boolean}\t\t\tshowMessageCard\t\t是否显示会话内消息卡片，设置此参数为 true，用户进入客服会话会在右下角显示\"可能要发送的小程序\"提示，用户点击后可以快速发送小程序消息，openType=\"contact\"时有效 （默认 false ）\n\t * @property {String}\t\t\tappParameter\t\t打开 APP 时，向 APP 传递的参数，openType=launchApp 时有效\n\t * \n\t * @event {Function} select\t\t\t点击ActionSheet列表项时触发 \n\t * @event {Function} close\t\t\t点击取消按钮时触发\n\t * @event {Function} getuserinfo\t用户点击该按钮时，会返回获取到的用户信息，回调的 detail 数据与 wx.getUserInfo 返回的一致，openType=\"getUserInfo\"时有效\n\t * @event {Function} contact\t\t客服消息回调，openType=\"contact\"时有效\n\t * @event {Function} getphonenumber\t获取用户手机号回调，openType=\"getPhoneNumber\"时有效\n\t * @event {Function} error\t\t\t当使用开放能力时，发生错误的回调，openType=\"error\"时有效\n\t * @event {Function} launchapp\t\t打开 APP 成功的回调，openType=\"launchApp\"时有效\n\t * @event {Function} opensetting\t在打开授权设置页后回调，openType=\"openSetting\"时有效\n\t * @example <u-action-sheet :actions=\"list\" :title=\"title\" :show=\"show\"></u-action-sheet>\n\t */\n\texport default {\n\t\tname: \"u-action-sheet\",\n\t\t// 一些props参数和methods方法，通过mixin混入，因为其他文件也会用到\n\t\tmixins: [openType, button, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 操作项目的样式\n\t\t\titemStyle() {\n\t\t\t\treturn (index) => {\n\t\t\t\t\tlet style = {};\n\t\t\t\t\tif (this.actions[index].color) style.color = this.actions[index].color\n\t\t\t\t\tif (this.actions[index].fontSize) style.fontSize = uni.$u.addUnit(this.actions[index].fontSize)\n\t\t\t\t\t// 选项被禁用的样式\n\t\t\t\t\tif (this.actions[index]?.disabled) style.color = '#c0c4cc'\n\t\t\t\t\treturn style;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\tcloseHandler() {\n\t\t\t\t// 允许点击遮罩关闭时，才发出close事件\n\t\t\t\tif(this.closeOnClickOverlay) {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 点击取消按钮\n\t\t\tcancel() {\n\t\t\t\tthis.$emit('close')\n\t\t\t},\n\t\t\tselectHandler(index) {\n\t\t\t\tconst item = this.actions[index]\n\t\t\t\tif (item && !item?.disabled && !item?.loading) {\n\t\t\t\t\tthis.$emit('select', item)\n\t\t\t\t\tif (this.closeOnClickAction) {\n\t\t\t\t\t\tthis.$emit('close')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-action-sheet-reset-button-width:100% !default;\n\t$u-action-sheet-title-font-size: 16px !default;\n\t$u-action-sheet-title-padding: 12px 30px !default;\n\t$u-action-sheet-title-color: $u-main-color !default;\n\t$u-action-sheet-header-icon-wrap-right:15px !default;\n\t$u-action-sheet-header-icon-wrap-top:15px !default;\n\t$u-action-sheet-description-font-size:13px !default;\n\t$u-action-sheet-description-color:14px !default;\n\t$u-action-sheet-description-margin: 18px 15px !default;\n\t$u-action-sheet-item-wrap-item-padding:15px !default;\n\t$u-action-sheet-item-wrap-name-font-size:16px !default;\n\t$u-action-sheet-item-wrap-subname-font-size:13px !default;\n\t$u-action-sheet-item-wrap-subname-color: #c0c4cc !default;\n\t$u-action-sheet-item-wrap-subname-margin-top:10px !default;\n\t$u-action-sheet-cancel-text-font-size:16px !default;\n\t$u-action-sheet-cancel-text-color:$u-content-color !default;\n\t$u-action-sheet-cancel-text-font-size:15px !default;\n\t$u-action-sheet-cancel-text-hover-background-color:rgb(242, 243, 245) !default;\n\n\t.u-reset-button {\n\t\twidth: $u-action-sheet-reset-button-width;\n\t}\n\n\t.u-action-sheet {\n\t\ttext-align: center;\n\t\t&__header {\n\t\t\tposition: relative;\n\t\t\tpadding: $u-action-sheet-title-padding;\n\t\t\t&__title {\n\t\t\t\tfont-size: $u-action-sheet-title-font-size;\n\t\t\t\tcolor: $u-action-sheet-title-color;\n\t\t\t\tfont-weight: bold;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\t&__icon-wrap {\n\t\t\t\tposition: absolute;\n\t\t\t\tright: $u-action-sheet-header-icon-wrap-right;\n\t\t\t\ttop: $u-action-sheet-header-icon-wrap-top;\n\t\t\t}\n\t\t}\n\n\t\t&__description {\n\t\t\tfont-size: $u-action-sheet-description-font-size;\n\t\t\tcolor: $u-tips-color;\n\t\t\tmargin: $u-action-sheet-description-margin;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t&__item-wrap {\n\n\t\t\t&__item {\n\t\t\t\tpadding: $u-action-sheet-item-wrap-item-padding;\n\t\t\t\t@include flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tflex-direction: column;\n\n\t\t\t\t&__name {\n\t\t\t\t\tfont-size: $u-action-sheet-item-wrap-name-font-size;\n\t\t\t\t\tcolor: $u-main-color;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\n\t\t\t\t&__subname {\n\t\t\t\t\tfont-size: $u-action-sheet-item-wrap-subname-font-size;\n\t\t\t\t\tcolor: $u-action-sheet-item-wrap-subname-color;\n\t\t\t\t\tmargin-top: $u-action-sheet-item-wrap-subname-margin-top;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__cancel-text {\n\t\t\tfont-size: $u-action-sheet-cancel-text-font-size;\n\t\t\tcolor: $u-action-sheet-cancel-text-color;\n\t\t\ttext-align: center;\n\t\t\tpadding: $u-action-sheet-cancel-text-font-size;\n\t\t}\n\n\t\t&--hover {\n\t\t\tbackground-color: $u-action-sheet-cancel-text-hover-background-color;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-album/props.js",
    "content": "export default {\n    props: {\n        // 图片地址，Array<String>|Array<Object>形式\n        urls: {\n            type: Array,\n            default: uni.$u.props.album.urls\n        },\n        // 指定从数组的对象元素中读取哪个属性作为图片地址\n        keyName: {\n            type: String,\n            default: uni.$u.props.album.keyName\n        },\n        // OpenIM 用于预览时使用原地址\n        previewKeyName: {\n          type: String,\n          default: uni.$u.props.album.keyName\n        },            \n        // 单图时，图片长边的长度\n        singleSize: {\n            type: [String, Number],\n            default: uni.$u.props.album.singleSize\n        },\n        // 多图时，图片边长\n        multipleSize: {\n            type: [String, Number],\n            default: uni.$u.props.album.multipleSize\n        },\n        // 多图时，图片水平和垂直之间的间隔\n        space: {\n            type: [String, Number],\n            default: uni.$u.props.album.space\n        },\n        // 单图时，图片缩放裁剪的模式\n        singleMode: {\n            type: String,\n            default: uni.$u.props.album.singleMode\n        },\n        // 多图时，图片缩放裁剪的模式\n        multipleMode: {\n            type: String,\n            default: uni.$u.props.album.multipleMode\n        },\n        // 最多展示的图片数量，超出时最后一个位置将会显示剩余图片数量\n        maxCount: {\n            type: [String, Number],\n            default: uni.$u.props.album.maxCount\n        },\n        // 是否可以预览图片\n        previewFullImage: {\n            type: Boolean,\n            default: uni.$u.props.album.previewFullImage\n        },\n        // 每行展示图片数量，如设置，singleSize和multipleSize将会无效\n        rowCount: {\n            type: [String, Number],\n            default: uni.$u.props.album.rowCount\n        },\n        // 超出maxCount时是否显示查看更多的提示\n        showMore: {\n            type: Boolean,\n            default: uni.$u.props.album.showMore\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-album/u-album.vue",
    "content": "<template>\n\t<view class=\"u-album\">\n\t\t<view class=\"u-album__row\" ref=\"u-album__row\" v-for=\"(arr, index) in showUrls\" :forComputedUse=\"albumWidth\"\n\t\t\t:key=\"index\">\n\t\t\t<view class=\"u-album__row__wrapper\" v-for=\"(item, index1) in arr\" :key=\"index1\"\n\t\t\t\t:style=\"[imageStyle(index + 1, index1 + 1)]\"\n\t\t\t\t@tap=\"previewFullImage ? onPreviewTap(getSrc(item)) : $emit('clickItem',item)\">\n\t\t\t\t<image :src=\"getSrc(item)\" :mode=\"\n                        urls.length === 1\n                            ? imageHeight > 0\n                                ? singleMode\n                                : 'widthFix'\n                            : multipleMode\n                    \" :style=\"[\n                        {\n                            width: imageWidth,\n                            height: imageHeight\n                        }\n                    ]\"></image>\n\t\t\t\t<view v-if=\"\n                        showMore &&\n                        urls.length > rowCount * showUrls.length &&\n                        index === showUrls.length - 1 &&\n                        index1 === showUrls[showUrls.length - 1].length - 1\n                    \" class=\"u-album__row__wrapper__text\">\n\t\t\t\t\t<u--text :text=\"`+${urls.length - maxCount}`\" color=\"#fff\" :size=\"multipleSize * 0.3\" align=\"center\"\n\t\t\t\t\t\tcustomStyle=\"justify-content: center\"></u--text>\n\t\t\t\t</view>\n\t\t\t\t<image v-if=\"isVideo && !(showMore &&\n                        urls.length > rowCount * showUrls.length &&\n                        index === showUrls.length - 1 &&\n                        index1 === showUrls[showUrls.length - 1].length - 1)\" class=\"play_icon\"\n\t\t\t\t\tsrc=\"@/static/images/chating_message_video_play.png\" />\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport { myPreview } from \"@/util/preview\";\n\timport props from './props.js'\n\t// #ifdef APP-NVUE\n\t// 由于weex为阿里的KPI业绩考核的产物，所以不支持百分比单位，这里需要通过dom查询组件的宽度\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\n\t/**\n\t * Album 相册\n\t * @description 本组件提供一个类似相册的功能，让开发者开发起来更加得心应手。减少重复的模板代码\n\t * @tutorial https://www.uviewui.com/components/album.html\n\t *\n\t * @property {Array}           urls             图片地址列表 Array<String>|Array<Object>形式\n\t * @property {String}          keyName          指定从数组的对象元素中读取哪个属性作为图片地址\n\t * @property {String | Number} singleSize       单图时，图片长边的长度  （默认 180 ）\n\t * @property {String | Number} multipleSize     多图时，图片边长 （默认 70 ）\n\t * @property {String | Number} space            多图时，图片水平和垂直之间的间隔 （默认 6 ）\n\t * @property {String}          singleMode       单图时，图片缩放裁剪的模式 （默认 'scaleToFill' ）\n\t * @property {String}          multipleMode     多图时，图片缩放裁剪的模式 （默认 'aspectFill' ）\n\t * @property {String | Number} maxCount         取消按钮的提示文字 （默认 9 ）\n\t * @property {Boolean}         previewFullImage 是否可以预览图片 （默认 true ）\n\t * @property {String | Number} rowCount         每行展示图片数量，如设置，singleSize和multipleSize将会无效\t（默认 3 ）\n\t * @property {Boolean}         showMore         超出maxCount时是否显示查看更多的提示 （默认 true ）\n\t *\n\t * @event    {Function}        albumWidth       某些特殊的情况下，需要让文字与相册的宽度相等，这里事件的形式对外发送  （回调参数 width ）\n\t * @example <u-album :urls=\"urls2\" @albumWidth=\"width => albumWidth = width\" multipleSize=\"68\" ></u-album>\n\t */\n\texport default {\n\t\tname: 'u-album',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tprops: {\n\t\t\tisVideo: Boolean\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 单图的宽度\n\t\t\t\tsingleWidth: 0,\n\t\t\t\t// 单图的高度\n\t\t\t\tsingleHeight: 0,\n\t\t\t\t// 单图时，如果无法获取图片的尺寸信息，让图片宽度默认为容器的一定百分比\n\t\t\t\tsinglePercent: 0.6\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\turls: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(newVal) {\n\t\t\t\t\tif (newVal.length === 1) {\n\t\t\t\t\t\tthis.getImageRect()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\timageStyle() {\n\t\t\t\treturn (index1, index2) => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tspace,\n\t\t\t\t\t\trowCount,\n\t\t\t\t\t\tmultipleSize,\n\t\t\t\t\t\turls\n\t\t\t\t\t} = this, {\n\t\t\t\t\t\taddUnit,\n\t\t\t\t\t\taddStyle\n\t\t\t\t\t} = uni.$u,\n\t\t\t\t\t\trowLen = this.showUrls.length,\n\t\t\t\t\t\tallLen = this.urls.length\n\t\t\t\t\tconst style = {\n\t\t\t\t\t\tmarginRight: addUnit(space),\n\t\t\t\t\t\tmarginBottom: addUnit(space)\n\t\t\t\t\t}\n\t\t\t\t\t// 如果为最后一行，则每个图片都无需下边框\n\t\t\t\t\tif (index1 === rowLen) style.marginBottom = 0\n\t\t\t\t\t// 每行的最右边一张和总长度的最后一张无需右边框\n\t\t\t\t\tif (\n\t\t\t\t\t\tindex2 === rowCount ||\n\t\t\t\t\t\t(index1 === rowLen &&\n\t\t\t\t\t\t\tindex2 === this.showUrls[index1 - 1].length)\n\t\t\t\t\t)\n\t\t\t\t\t\tstyle.marginRight = 0\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 将数组划分为二维数组\n\t\t\tshowUrls() {\n\t\t\t\tconst arr = []\n\t\t\t\tthis.urls.map((item, index) => {\n\t\t\t\t\t// 限制最大展示数量\n\t\t\t\t\tif (index + 1 <= this.maxCount) {\n\t\t\t\t\t\t// 计算该元素为第几个素组内\n\t\t\t\t\t\tconst itemIndex = Math.floor(index / this.rowCount)\n\t\t\t\t\t\t// 判断对应的索引是否存在\n\t\t\t\t\t\tif (!arr[itemIndex]) {\n\t\t\t\t\t\t\tarr[itemIndex] = []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tarr[itemIndex].push(item)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn arr\n\t\t\t},\n\t\t\timageWidth() {\n\t\t\t\treturn uni.$u.addUnit(\n\t\t\t\t\tthis.urls.length === 1 ? this.singleWidth : this.multipleSize\n\t\t\t\t)\n\t\t\t},\n\t\t\timageHeight() {\n\t\t\t\treturn uni.$u.addUnit(\n\t\t\t\t\tthis.urls.length === 1 ? this.singleHeight : this.multipleSize\n\t\t\t\t)\n\t\t\t},\n\t\t\t// 此变量无实际用途，仅仅是为了利用computed特性，让其在urls长度等变化时，重新计算图片的宽度\n\t\t\t// 因为用户在某些特殊的情况下，需要让文字与相册的宽度相等，所以这里事件的形式对外发送\n\t\t\talbumWidth() {\n\t\t\t\tlet width = 0\n\t\t\t\tif (this.urls.length === 1) {\n\t\t\t\t\twidth = this.singleWidth\n\t\t\t\t} else {\n\t\t\t\t\twidth =\n\t\t\t\t\t\tthis.showUrls[0].length * this.multipleSize +\n\t\t\t\t\t\tthis.space * (this.showUrls[0].length - 1)\n\t\t\t\t}\n\t\t\t\tthis.$emit('albumWidth', width)\n\t\t\t\treturn width\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 预览图片\n\t\t\tonPreviewTap(url) {\n\t\t\t\tconst urls = this.urls.map((item) => {\n\t\t\t\t\t// return this.getSrc(item)\n\t\t\t\t\treturn uni.$u.test.object(item) ?\n\t\t\t\t\t(this.previewKeyName && item[this.previewKeyName]) || item.src :\n\t\t\t\t\titem\n\t\t\t\t})\n\t\t\t\tmyPreview(url, urls)\n\t\t\t\t// uni.previewImage({\n\t\t\t\t// \tcurrent: url,\n\t\t\t\t// \turls\n\t\t\t\t// })\n\t\t\t},\n\t\t\t// 获取图片的路径\n\t\t\tgetSrc(item) {\n\t\t\t\treturn uni.$u.test.object(item) ?\n\t\t\t\t\t(this.keyName && item[this.keyName]) || item.src :\n\t\t\t\t\titem\n\t\t\t},\n\t\t\t// 单图时，获取图片的尺寸\n\t\t\t// 在小程序中，需要将网络图片的的域名添加到小程序的download域名才可能获取尺寸\n\t\t\t// 在没有添加的情况下，让单图宽度默认为盒子的一定宽度(singlePercent)\n\t\t\tgetImageRect() {\n\t\t\t\tconst src = this.getSrc(this.urls[0])\n\t\t\t\tuni.getImageInfo({\n\t\t\t\t\tsrc,\n\t\t\t\t\tsuccess: (res) => {\n\t\t\t\t\t\t// 判断图片横向还是竖向展示方式\n\t\t\t\t\t\tconst isHorizotal = res.width >= res.height\n\t\t\t\t\t\tthis.singleWidth = isHorizotal ?\n\t\t\t\t\t\t\tthis.singleSize :\n\t\t\t\t\t\t\t(res.width / res.height) * this.singleSize\n\t\t\t\t\t\tthis.singleHeight = !isHorizotal ?\n\t\t\t\t\t\t\tthis.singleSize :\n\t\t\t\t\t\t\t(res.height / res.width) * this.singleWidth\n\t\t\t\t\t},\n\t\t\t\t\tfail: () => {\n\t\t\t\t\t\tthis.getComponentWidth()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取组件的宽度\n\t\t\tasync getComponentWidth() {\n\t\t\t\t// 延时一定时间，以获取dom尺寸\n\t\t\t\tawait uni.$u.sleep(30)\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect('.u-album__row').then((size) => {\n\t\t\t\t\tthis.singleWidth = size.width * this.singlePercent\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 这里ref=\"u-album__row\"所在的标签为通过for循环出来，导致this.$refs['u-album__row']是一个数组\n\t\t\t\tconst ref = this.$refs['u-album__row'][0]\n\t\t\t\tref &&\n\t\t\t\t\tdom.getComponentRect(ref, (res) => {\n\t\t\t\t\t\tthis.singleWidth = res.size.width * this.singlePercent\n\t\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n\n\t.u-album {\n\t\t@include flex(column);\n\n\t\t&__row {\n\t\t\t@include flex(row);\n\t\t\tflex-wrap: wrap;\n\n\t\t\t&__wrapper {\n\t\t\t\tposition: relative;\n\n\t\t\t\t.play_icon {\n\t\t\t\t\twidth: 48px;\n\t\t\t\t\theight: 48px;\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\ttop: 50%;\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\ttransform: translate(-50%, -50%);\n\t\t\t\t}\n\n\t\t\t\t&__text {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\ttop: 0;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\tright: 0;\n\t\t\t\t\tbottom: 0;\n\t\t\t\t\tbackground-color: rgba(0, 0, 0, 0.3);\n\t\t\t\t\t@include flex(row);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-alert/props.js",
    "content": "export default {\n    props: {\n        // 显示文字\n        title: {\n            type: String,\n            default: uni.$u.props.alert.title\n        },\n        // 主题，success/warning/info/error\n        type: {\n            type: String,\n            default: uni.$u.props.alert.type\n        },\n        // 辅助性文字\n        description: {\n            type: String,\n            default: uni.$u.props.alert.description\n        },\n        // 是否可关闭\n        closable: {\n            type: Boolean,\n            default: uni.$u.props.alert.closable\n        },\n        // 是否显示图标\n        showIcon: {\n            type: Boolean,\n            default: uni.$u.props.alert.showIcon\n        },\n        // 浅或深色调，light-浅色，dark-深色\n        effect: {\n            type: String,\n            default: uni.$u.props.alert.effect\n        },\n        // 文字是否居中\n        center: {\n            type: Boolean,\n            default: uni.$u.props.alert.center\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.alert.fontSize\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-alert/u-alert.vue",
    "content": "<template>\n\t<u-transition\n\t    mode=\"fade\"\n\t    :show=\"show\"\n\t>\n\t\t<view\n\t\t    class=\"u-alert\"\n\t\t    :class=\"[`u-alert--${type}--${effect}`]\"\n\t\t    @tap.stop=\"clickHandler\"\n\t\t    :style=\"[$u.addStyle(customStyle)]\"\n\t\t>\n\t\t\t<view\n\t\t\t    class=\"u-alert__icon\"\n\t\t\t    v-if=\"showIcon\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t    :name=\"iconName\"\n\t\t\t\t    size=\"18\"\n\t\t\t\t    :color=\"iconColor\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t    class=\"u-alert__content\"\n\t\t\t    :style=\"[{\n\t\t\t\t\tpaddingRight: closable ? '20px' : 0\n\t\t\t\t}]\"\n\t\t\t>\n\t\t\t\t<text\n\t\t\t\t    class=\"u-alert__content__title\"\n\t\t\t\t    v-if=\"title\"\n\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\tfontSize: $u.addUnit(fontSize),\n\t\t\t\t\t\ttextAlign: center ? 'center' : 'left'\n\t\t\t\t\t}]\"\n\t\t\t\t    :class=\"[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]\"\n\t\t\t\t>{{ title }}</text>\n\t\t\t\t<text\n\t\t\t\t    class=\"u-alert__content__desc\"\n\t\t\t\t\tv-if=\"description\"\n\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\tfontSize: $u.addUnit(fontSize),\n\t\t\t\t\t\ttextAlign: center ? 'center' : 'left'\n\t\t\t\t\t}]\"\n\t\t\t\t    :class=\"[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]\"\n\t\t\t\t>{{ description }}</text>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t    class=\"u-alert__close\"\n\t\t\t    v-if=\"closable\"\n\t\t\t    @tap.stop=\"closeHandler\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t    name=\"close\"\n\t\t\t\t    :color=\"iconColor\"\n\t\t\t\t    size=\"15\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t</view>\n\t</u-transition>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Alert  警告提示\n\t * @description 警告提示，展现需要关注的信息。\n\t * @tutorial https://www.uviewui.com/components/alertTips.html\n\t * \n\t * @property {String}\t\t\ttitle       显示的文字 \n\t * @property {String}\t\t\ttype        使用预设的颜色  （默认 'warning' ）\n\t * @property {String}\t\t\tdescription 辅助性文字，颜色比title浅一点，字号也小一点，可选  \n\t * @property {Boolean}\t\t\tclosable    关闭按钮(默认为叉号icon图标)  （默认 false ）\n\t * @property {Boolean}\t\t\tshowIcon    是否显示左边的辅助图标   （ 默认 false ）\n\t * @property {String}\t\t\teffect      多图时，图片缩放裁剪的模式  （默认 'light' ）\n\t * @property {Boolean}\t\t\tcenter\t\t文字是否居中  （默认 false ）\n\t * @property {String | Number}\tfontSize    字体大小  （默认 14 ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * @event    {Function}        click       点击组件时触发\n\t * @example  <u-alert :title=\"title\"  type = \"warning\" :closable=\"closable\" :description = \"description\"></u-alert>\n\t */\n\texport default {\n\t\tname: 'u-alert',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tshow: true\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ticonColor() {\n\t\t\t\treturn this.effect === 'light' ? this.type : '#fff'\n\t\t\t},\n\t\t\t// 不同主题对应不同的图标\n\t\t\ticonName() {\n\t\t\t\tswitch (this.type) {\n\t\t\t\t\tcase 'success':\n\t\t\t\t\t\treturn 'checkmark-circle-fill';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\treturn 'close-circle-fill';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'warning':\n\t\t\t\t\t\treturn 'error-circle-fill';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'info':\n\t\t\t\t\t\treturn 'info-circle-fill';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'primary':\n\t\t\t\t\t\treturn 'more-circle-fill';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: \n\t\t\t\t\t\treturn 'error-circle-fill';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击内容\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('click')\n\t\t\t},\n\t\t\t// 点击关闭按钮\n\t\t\tcloseHandler() {\n\t\t\t\tthis.show = false\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-alert {\n\t\tposition: relative;\n\t\tbackground-color: $u-primary;\n\t\tpadding: 8px 10px;\n\t\t@include flex(row);\n\t\talign-items: center;\n\t\tborder-top-left-radius: 4px;\n\t\tborder-top-right-radius: 4px;\n\t\tborder-bottom-left-radius: 4px;\n\t\tborder-bottom-right-radius: 4px;\n\n\t\t&--primary--dark {\n\t\t\tbackground-color: $u-primary;\n\t\t}\n\n\t\t&--primary--light {\n\t\t\tbackground-color: #ecf5ff;\n\t\t}\n\n\t\t&--error--dark {\n\t\t\tbackground-color: $u-error;\n\t\t}\n\n\t\t&--error--light {\n\t\t\tbackground-color: #FEF0F0;\n\t\t}\n\n\t\t&--success--dark {\n\t\t\tbackground-color: $u-success;\n\t\t}\n\n\t\t&--success--light {\n\t\t\tbackground-color: #f5fff0;\n\t\t}\n\n\t\t&--warning--dark {\n\t\t\tbackground-color: $u-warning;\n\t\t}\n\n\t\t&--warning--light {\n\t\t\tbackground-color: #FDF6EC;\n\t\t}\n\n\t\t&--info--dark {\n\t\t\tbackground-color: $u-info;\n\t\t}\n\n\t\t&--info--light {\n\t\t\tbackground-color: #f4f4f5;\n\t\t}\n\n\t\t&__icon {\n\t\t\tmargin-right: 5px;\n\t\t}\n\n\t\t&__content {\n\t\t\t@include flex(column);\n\t\t\tflex: 1;\n\n\t\t\t&__title {\n\t\t\t\tcolor: $u-main-color;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tcolor: #fff;\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\n\t\t\t&__desc {\n\t\t\t\tcolor: $u-main-color;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\t\t}\n\n\t\t&__title--dark,\n\t\t&__desc--dark {\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\n\t\t&__text--primary--light,\n\t\t&__text--primary--light {\n\t\t\tcolor: $u-primary;\n\t\t}\n\n\t\t&__text--success--light,\n\t\t&__text--success--light {\n\t\t\tcolor: $u-success;\n\t\t}\n\n\t\t&__text--warning--light,\n\t\t&__text--warning--light {\n\t\t\tcolor: $u-warning;\n\t\t}\n\n\t\t&__text--error--light,\n\t\t&__text--error--light {\n\t\t\tcolor: $u-error;\n\t\t}\n\n\t\t&__text--info--light,\n\t\t&__text--info--light {\n\t\t\tcolor: $u-info;\n\t\t}\n\n\t\t&__close {\n\t\t\tposition: absolute;\n\t\t\ttop: 11px;\n\t\t\tright: 10px;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-avatar/props.js",
    "content": "export default {\n    props: {\n        // 头像图片路径(不能为相对路径)\n        src: {\n            type: String,\n            default: uni.$u.props.avatar.src\n        },\n        // 头像形状，circle-圆形，square-方形\n        shape: {\n            type: String,\n            default: uni.$u.props.avatar.shape\n        },\n        // 头像尺寸\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.avatar.size\n        },\n        // 裁剪模式\n        mode: {\n            type: String,\n            default: uni.$u.props.avatar.mode\n        },\n        // 显示的文字\n        text: {\n            type: String,\n            default: uni.$u.props.avatar.text\n        },\n        // 背景色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.avatar.bgColor\n        },\n        // 文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.avatar.color\n        },\n        // 文字大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.avatar.fontSize\n        },\n        // 显示的图标\n        icon: {\n            type: String,\n            default: uni.$u.props.avatar.icon\n        },\n        // 显示小程序头像，只对百度，微信，QQ小程序有效\n        mpAvatar: {\n            type: Boolean,\n            default: uni.$u.props.avatar.mpAvatar\n        },\n        // 是否使用随机背景色\n        randomBgColor: {\n            type: Boolean,\n            default: uni.$u.props.avatar.randomBgColor\n        },\n        // 加载失败的默认头像(组件有内置默认图片)\n        defaultUrl: {\n            type: String,\n            default: uni.$u.props.avatar.defaultUrl\n        },\n        // 如果配置了randomBgColor为true，且配置了此值，则从默认的背景色数组中取出对应索引的颜色值，取值0-19之间\n        colorIndex: {\n            type: [String, Number],\n            // 校验参数规则，索引在0-19之间\n            validator(n) {\n                return uni.$u.test.range(n, [0, 19]) || n === ''\n            },\n            default: uni.$u.props.avatar.colorIndex\n        },\n        // 组件标识符\n        name: {\n            type: String,\n            default: uni.$u.props.avatar.name\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-avatar/u-avatar.vue",
    "content": "<template>\n\t<view class=\"u-avatar\" :class=\"[`u-avatar--${shape}`]\" :style=\"[{\n\t\t\tbackgroundColor: (text || icon) ? (randomBgColor ? colors[colorIndex !== '' ? colorIndex : $u.random(0, 19)] : bgColor) : 'transparent',\n\t\t\twidth: $u.addUnit(size),\n\t\t\theight: $u.addUnit(size),\n\t\t}, $u.addStyle(customStyle)]\" @tap=\"clickHandler\" @longpress=\"longpressHandler\">\n\t\t<slot>\n\t\t\t<!-- #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU  -->\n\t\t\t<open-data v-if=\"mpAvatar && allowMp\" type=\"userAvatarUrl\" :style=\"[{\n\t\t\t\t\twidth: $u.addUnit(size),\n\t\t\t\t\theight: $u.addUnit(size)\n\t\t\t\t}]\" />\n\t\t\t<!-- #endif -->\n\t\t\t<!-- #ifndef MP-WEIXIN && MP-QQ && MP-BAIDU  -->\n\t\t\t<template v-if=\"mpAvatar && allowMp\"></template>\n\t\t\t<!-- #endif -->\n\t\t\t<u-icon v-else-if=\"icon\" :name=\"icon\" :size=\"fontSize\" :color=\"color\"></u-icon>\n\t\t\t<u--text v-else-if=\"text\" :text=\"text\" :size=\"fontSize\" :color=\"color\" align=\"center\"\n\t\t\t\tcustomStyle=\"justify-content: center\"></u--text>\n\t\t\t<image class=\"u-avatar__image\" v-else :class=\"[`u-avatar__image--${shape}`]\" :src=\"avatarUrl || defaultUrl\"\n\t\t\t\t:mode=\"mode\" @error=\"errorHandler\" :style=\"[{\n\t\t\t\t\twidth: $u.addUnit(size),\n\t\t\t\t\theight: $u.addUnit(size)\n\t\t\t\t}]\"></image>\n\t\t</slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\tconst base64Avatar =\n\t\t\"data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMEQwRkY0RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMEQwRkY1RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQwRDBGRjJGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQwRDBGRjNGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwMDBAMDg8QDw4MExMUFBMTHBsbGxwfHx8fHx8fHx8fAQcHBw0MDRgQEBgaFREVGh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx//wAARCADIAMgDAREAAhEBAxEB/8QAcQABAQEAAwEBAAAAAAAAAAAAAAUEAQMGAgcBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAwICBgkDBQAAAAAAAAABAhEDBCEFMVFBYXGREiKBscHRMkJSEyOh4XLxYjNDFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHbHFyZ/Dam+yLA+Z2L0Pjtyj2poD4AAAAAAAAAAAAAAAAAAAAAAAAKWFs9y6lcvvwQeqj8z9wFaziY1n/HbUX9XF97A7QAGXI23EvJ1goyfzR0YEfN269jeZ+a03pNe0DIAAAAAAAAAAAAAAAAAAAACvtO3RcVkXlWutuL9YFYAAAAAOJRjKLjJVi9GmB5/csH/mu1h/in8PU+QGMAAAAAAAAAAAAAAAAAAaMDG/6MmMH8C80+xAelSSVFolwQAAAAAAAHVlWI37ErUulaPk+hgeYnCUJuElSUXRrrQHAAAAAAAAAAAAAAAAABa2Oz4bM7r4zdF2ICmAAAAAAAAAg7zZ8GX41wuJP0rRgYAAAAAAAAAAAAAAAAAD0m2R8ODaXU33tsDSAAAAAAAAAlb9HyWZcnJd9PcBHAAAAAAAAAAAAAAAAAPS7e64Vn+KA0AAAAAAAAAJm+v8Ftf3ewCKAAAAAAAAAAAAAAAAAX9muqeGo9NttP06+0DcAAAAAAAAAjb7dTu2ra+VOT9P8AQCWAAAAAAAAAAAAAAAAAUNmyPt5Ltv4bui/kuAF0AAAAAAADiUlGLlJ0SVW+oDzOXfd/Ind6JPRdS0QHSAAAAAAAAAAAAAAAAAE2nVaNcGB6Lbs6OTao9LsF51z60BrAAAAAABJ3jOVHjW3r/sa9QEgAAAAAAAAAAAAAAAAAAAPu1duWriuW34ZR4MC9hbnZyEoy8l36XwfYBsAAADaSq9EuLAlZ+7xSdrGdW9Hc5dgEdtt1erfFgAAAAAAAAAAAAAAAAADVjbblX6NR8MH80tEBRs7HYivyzlN8lovaBPzduvY0m6eK10TXtAyAarO55lpJK54orolr+4GqO/Xaea1FvqbXvA+Z77kNeW3GPbV+4DJfzcm/pcm3H6Vou5AdAFLC2ed2Pjv1txa8sV8T6wOL+yZEKu1JXFy4MDBOE4ScZxcZLinoB8gAAAAAAAAAAAB242LeyJ+C3GvN9C7QLmJtePYpKS+5c+p8F2IDYAANJqj1T4oCfk7Nj3G5Wn9qXJax7gJ93Z82D8sVNc4v30A6Xg5i42Z+iLfqARwcyT0sz9MWvWBps7LlTf5Grce9/oBTxdtxseklHxT+uWr9AGoAB138ezfj4bsFJdD6V2MCPm7RdtJzs1uW1xXzL3gTgAAAAAAAAADRhYc8q74I6RWs5ckB6GxYtWLat21SK731sDsAAAAAAAAAAAAAAAASt021NO/YjrxuQXT1oCOAAAAAAABzGLlJRSq26JAelwsWONYjbXxcZvmwO8AAAAAAAAAAAAAAAAAAef3TEWPkVivx3NY9T6UBiAAAAAABo2+VmGXblddIJ8eivRUD0oAAAAAAAAAAAAAAAAAAAYt4tKeFKVNYNSXfRgefAAAAAAAAr7VuSSWPedKaW5v1MCsAAAAAAAAAAAAAAAAAAIe6bj96Ts2n+JPzSXzP3ATgAAAAAAAAFbbt1UUrOQ9FpC4/UwK6aaqtU+DAAAAAAAAAAAAAAA4lKMIuUmoxWrb4ARNx3R3q2rLpa4Sl0y/YCcAAAAAAAAAAANmFud7G8r89r6X0dgFvGzLGRGtuWvTF6NAdwAAAAAAAAAAAy5W442PVN+K59EePp5ARMvOv5MvO6QXCC4AZwAAAAAAAAAAAAAcxlKLUotprg1owN+PvORborq+7Hnwl3gUbO74VzRydt8pKn68ANcJwmqwkpLmnUDkAAAAfNy9atqtyagut0AxXt5xIV8Fbj6lRd7Am5G65V6qUvtwfyx94GMAAAAAAAAAAAAAAAAAAAOU2nVOj5gdsc3LiqRvTpyqwOxbnnrhdfpSfrQB7pnv/AGvuS9gHXPMy5/Fem1yq0v0A6W29XqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//Z\";\n\t/**\n\t * Avatar  头像\n\t * @description 本组件一般用于展示头像的地方，如个人中心，或者评论列表页的用户头像展示等场所。\n\t * @tutorial https://www.uviewui.com/components/avatar.html\n\t *\n\t * @property {String}\t\t\tsrc\t\t\t\t头像路径，如加载失败，将会显示默认头像(不能为相对路径)\n\t * @property {String}\t\t\tshape\t\t\t头像形状  （ circle (默认) | square）\n\t * @property {String | Number}\tsize\t\t\t头像尺寸，可以为指定字符串(large, default, mini)，或者数值 （默认 40 ）\n\t * @property {String}\t\t\tmode\t\t\t头像图片的裁剪类型，与uni的image组件的mode参数一致，如效果达不到需求，可尝试传widthFix值 （默认 'scaleToFill' ）\n\t * @property {String}\t\t\ttext\t\t\t用文字替代图片，级别优先于src\n\t * @property {String}\t\t\tbgColor\t\t\t背景颜色，一般显示文字时用 （默认 '#c0c4cc' ）\n\t * @property {String}\t\t\tcolor\t\t\t文字颜色 （默认 '#ffffff' ）\n\t * @property {String | Number}\tfontSize\t\t文字大小  （默认 18 ）\n\t * @property {String}\t\t\ticon\t\t\t显示的图标\n\t * @property {Boolean}\t\t\tmpAvatar\t\t显示小程序头像，只对百度，微信，QQ小程序有效  （默认 false ）\n\t * @property {Boolean}\t\t\trandomBgColor\t是否使用随机背景色  （默认 false ）\n\t * @property {String}\t\t\tdefaultUrl\t\t加载失败的默认头像(组件有内置默认图片)\n\t * @property {String | Number}\tcolorIndex\t\t如果配置了randomBgColor为true，且配置了此值，则从默认的背景色数组中取出对应索引的颜色值，取值0-19之间\n\t * @property {String}\t\t\tname\t\t\t组件标识符  （默认 'level' ）\n\t * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t *\n\t * @event    {Function}        click       点击组件时触发   index: 用户传递的标识符\n\t * @example  <u-avatar :src=\"src\" mode=\"square\"></u-avatar>\n\t */\n\texport default {\n\t\tname: 'u-avatar',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 如果配置randomBgColor参数为true，在图标或者文字的模式下，会随机从中取出一个颜色值当做背景色\n\t\t\t\tcolors: ['#ffb34b', '#f2bba9', '#f7a196', '#f18080', '#88a867', '#bfbf39', '#89c152', '#94d554', '#f19ec2',\n\t\t\t\t\t'#afaae4', '#e1b0df', '#c38cc1', '#72dcdc', '#9acdcb', '#77b1cc', '#448aca', '#86cefa', '#98d1ee',\n\t\t\t\t\t'#73d1f1',\n\t\t\t\t\t'#80a7dc'\n\t\t\t\t],\n\t\t\t\tavatarUrl: this.src,\n\t\t\t\tallowMp: false\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 监听头像src的变化，赋值给内部的avatarUrl变量，因为图片加载失败时，需要修改图片的src为默认值\n\t\t\t// 而组件内部不能直接修改props的值，所以需要一个中间变量\n\t\t\tsrc: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(newVal) {\n\t\t\t\t\tthis.avatarUrl = newVal\n\t\t\t\t\t// 如果没有传src，则主动触发error事件，用于显示默认的头像，否则src为''空字符等的时候，会无内容展示\n\t\t\t\t\tif (!newVal) {\n\t\t\t\t\t\tthis.errorHandler()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\timageStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 目前只有这几个小程序平台具有open-data标签\n\t\t\t\t// 其他平台可以通过uni.getUserInfo类似接口获取信息，但是需要弹窗授权(首次)，不合符组件逻辑\n\t\t\t\t// 故目前自动获取小程序头像只支持这几个平台\n\t\t\t\t// #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU\n\t\t\t\tthis.allowMp = true\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 判断传入的name属性，是否图片路径，只要带有\"/\"均认为是图片形式\n\t\t\tisImg() {\n\t\t\t\treturn this.src.indexOf('/') !== -1\n\t\t\t},\n\t\t\t// 图片加载时失败时触发\n\t\t\terrorHandler() {\n\t\t\t\tthis.$emit('onError')\n\t\t\t\tthis.avatarUrl = this.defaultUrl || base64Avatar\n\t\t\t},\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('click', this.name)\n\t\t\t},\n\t\t\tlongpressHandler() {\n\t\t\t\tthis.$emit('longpress', this.name)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-avatar {\n\t\t@include flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t&--circle {\n\t\t\tborder-radius: 100px;\n\t\t}\n\n\t\t&--square {\n\t\t\tborder-radius: 4px;\n\t\t}\n\n\t\t&__image {\n\t\t\t&--circle {\n\t\t\t\tborder-radius: 100px;\n\t\t\t}\n\n\t\t\t&--square {\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-avatar-group/props.js",
    "content": "export default {\n    props: {\n        // 头像图片组\n        urls: {\n            type: Array,\n            default: uni.$u.props.avatarGroup.urls\n        },\n        // 最多展示的头像数量\n        maxCount: {\n            type: [String, Number],\n            default: uni.$u.props.avatarGroup.maxCount\n        },\n        // 头像形状\n        shape: {\n            type: String,\n            default: uni.$u.props.avatarGroup.shape\n        },\n        // 图片裁剪模式\n        mode: {\n            type: String,\n            default: uni.$u.props.avatarGroup.mode\n        },\n        // 超出maxCount时是否显示查看更多的提示\n        showMore: {\n            type: Boolean,\n            default: uni.$u.props.avatarGroup.showMore\n        },\n        // 头像大小\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.avatarGroup.size\n        },\n        // 指定从数组的对象元素中读取哪个属性作为图片地址\n        keyName: {\n            type: String,\n            default: uni.$u.props.avatarGroup.keyName\n        },\n\t\t// 头像之间的遮挡比例\n        gap: {\n            type: [String, Number],\n            validator(value) {\n                return value >= 0 && value <= 1\n            },\n            default: uni.$u.props.avatarGroup.gap\n        },\n\t\t// 需额外显示的值\n\t\textraValue: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: uni.$u.props.avatarGroup.extraValue\n\t\t}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue",
    "content": "<template>\n\t<view class=\"u-avatar-group\">\n\t\t<view\n\t\t    class=\"u-avatar-group__item\"\n\t\t    v-for=\"(item, index) in showUrl\"\n\t\t    :key=\"index\"\n\t\t    :style=\"{\n\t\t\t\tmarginLeft: index === 0 ? 0 : $u.addUnit(-size * gap)\n\t\t\t}\"\n\t\t>\n\t\t\t<u-avatar\n\t\t\t    :size=\"size\"\n\t\t\t    :shape=\"shape\"\n\t\t\t    :mode=\"mode\"\n\t\t\t    :src=\"$u.test.object(item) ? keyName && item[keyName] || item.url : item\"\n\t\t\t></u-avatar>\n\t\t\t<view\n\t\t\t    class=\"u-avatar-group__item__show-more\"\n\t\t\t    v-if=\"showMore && index === showUrl.length - 1 && (urls.length > maxCount || extraValue > 0)\"\n\t\t\t\t@tap=\"clickHandler\"\n\t\t\t>\n\t\t\t\t<u--text\n\t\t\t\t    color=\"#ffffff\"\n\t\t\t\t    :size=\"size * 0.4\"\n\t\t\t\t    :text=\"`+${extraValue || urls.length - showUrl.length}`\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tcustomStyle=\"justify-content: center\"\n\t\t\t\t></u--text>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * AvatarGroup  头像组\n\t * @description 本组件一般用于展示头像的地方，如个人中心，或者评论列表页的用户头像展示等场所。\n\t * @tutorial https://www.uviewui.com/components/avatar.html\n\t * \n\t * @property {Array}           urls     头像图片组 （默认 [] ）\n\t * @property {String | Number} maxCount 最多展示的头像数量 （ 默认 5 ）\n\t * @property {String}          shape    头像形状（ 'circle' (默认) | 'square' ）\n\t * @property {String}          mode     图片裁剪模式（默认 'scaleToFill' ）\n\t * @property {Boolean}         showMore 超出maxCount时是否显示查看更多的提示 （默认 true ）\n\t * @property {String | Number} size      头像大小 （默认 40 ）\n\t * @property {String}          keyName  指定从数组的对象元素中读取哪个属性作为图片地址 \n\t * @property {String | Number} gap      头像之间的遮挡比例（0.4代表遮挡40%）  （默认 0.5 ）\n\t * @property {String | Number} extraValue  需额外显示的值\n\t * @event    {Function}        showMore 头像组更多点击\n\t * @example  <u-avatar-group:urls=\"urls\" size=\"35\" gap=\"0.4\" ></u-avatar-group:urls=>\n\t */\n\texport default {\n\t\tname: 'u-avatar-group',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tshowUrl() {\n\t\t\t\treturn this.urls.slice(0, this.maxCount)\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('showMore')\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-avatar-group {\n\t\t@include flex;\n\n\t\t&__item {\n\t\t\tmargin-left: -10px;\n\t\t\tposition: relative;\n\n\t\t\t&--no-indent {\n\t\t\t\t// 如果你想质疑作者不会使用:first-child，说明你太年轻，因为nvue不支持\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t&__show-more {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tbackground-color: rgba(0, 0, 0, 0.3);\n\t\t\t\t@include flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tborder-radius: 100px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-back-top/props.js",
    "content": "export default {\n    props: {\n        // 返回顶部的形状，circle-圆形，square-方形\n        mode: {\n            type: String,\n            default: uni.$u.props.backtop.mode\n        },\n        // 自定义图标\n        icon: {\n            type: String,\n            default: uni.$u.props.backtop.icon\n        },\n        // 提示文字\n        text: {\n            type: String,\n            default: uni.$u.props.backtop.text\n        },\n        // 返回顶部滚动时间\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.backtop.duration\n        },\n        // 滚动距离\n        scrollTop: {\n            type: [String, Number],\n            default: uni.$u.props.backtop.scrollTop\n        },\n        // 距离顶部多少距离显示，单位px\n        top: {\n            type: [String, Number],\n            default: uni.$u.props.backtop.top\n        },\n        // 返回顶部按钮到底部的距离，单位px\n        bottom: {\n            type: [String, Number],\n            default: uni.$u.props.backtop.bottom\n        },\n        // 返回顶部按钮到右边的距离，单位px\n        right: {\n            type: [String, Number],\n            default: uni.$u.props.backtop.right\n        },\n        // 层级\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.backtop.zIndex\n        },\n        // 图标的样式，对象形式\n        iconStyle: {\n            type: Object,\n            default: uni.$u.props.backtop.iconStyle\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-back-top/u-back-top.vue",
    "content": "<template>\n\t<u-transition\n\t    mode=\"fade\"\n\t    :customStyle=\"backTopStyle\"\n\t    :show=\"show\"\n\t>\n\t\t<view\n\t\t    class=\"u-back-top\"\n\t\t\t:style=\"[contentStyle]\"\n\t\t    v-if=\"!$slots.default && !$slots.$default\"\n\t\t\t@click=\"backToTop\"\n\t\t>\n\t\t\t<u-icon\n\t\t\t    :name=\"icon\"\n\t\t\t    :custom-style=\"iconStyle\"\n\t\t\t></u-icon>\n\t\t\t<text\n\t\t\t    v-if=\"text\"\n\t\t\t    class=\"u-back-top__text\"\n\t\t\t>{{text}}</text>\n\t\t</view>\n\t\t<slot v-else />\n\t</u-transition>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = weex.requireModule('dom')\n\t// #endif\n\t/**\n\t * backTop 返回顶部\n\t * @description 本组件一个用于长页面，滑动一定距离后，出现返回顶部按钮，方便快速返回顶部的场景。\n\t * @tutorial https://uviewui.com/components/backTop.html\n\t * \n\t * @property {String}\t\t\tmode  \t\t返回顶部的形状，circle-圆形，square-方形 （默认 'circle' ）\n\t * @property {String} \t\t\ticon \t\t自定义图标 （默认 'arrow-upward' ） 见官方文档示例\n\t * @property {String} \t\t\ttext \t\t提示文字 \n\t * @property {String | Number}  duration\t返回顶部滚动时间 （默认 100）\n\t * @property {String | Number}  scrollTop\t滚动距离 （默认 0 ）\n\t * @property {String | Number}  top  \t\t距离顶部多少距离显示，单位px （默认 400 ）\n\t * @property {String | Number}  bottom  \t返回顶部按钮到底部的距离，单位px （默认 100 ）\n\t * @property {String | Number}  right  \t\t返回顶部按钮到右边的距离，单位px （默认 20 ）\n\t * @property {String | Number}  zIndex \t\t层级   （默认 9 ）\n\t * @property {Object<Object>}  \ticonStyle \t图标的样式，对象形式   （默认 {color: '#909399',fontSize: '19px'}）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @example <u-back-top :scrollTop=\"scrollTop\"></u-back-top>\n\t */\n\texport default {\n\t\tname: 'u-back-top',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\tbackTopStyle() {\n\t\t\t\t// 动画组件样式\n\t\t\t\tconst style = {\n\t\t\t\t\tbottom: uni.$u.addUnit(this.bottom),\n\t\t\t\t\tright: uni.$u.addUnit(this.right),\n\t\t\t\t\twidth: '40px',\n\t\t\t\t\theight: '40px',\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tzIndex: 10,\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tshow() {\n\t\t\t\treturn uni.$u.getPx(this.scrollTop) > uni.$u.getPx(this.top)\n\t\t\t},\n\t\t\tcontentStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tlet radius = 0\n\t\t\t\t// 是否圆形\n\t\t\t\tif(this.mode === 'circle') {\n\t\t\t\t\tradius = '100px'\n\t\t\t\t} else {\n\t\t\t\t\tradius = '4px'\n\t\t\t\t}\n\t\t\t\t// 为了兼容安卓nvue，只能这么分开写\n\t\t\t\tstyle.borderTopLeftRadius = radius\n\t\t\t\tstyle.borderTopRightRadius = radius\n\t\t\t\tstyle.borderBottomLeftRadius = radius\n\t\t\t\tstyle.borderBottomRightRadius = radius\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tbackToTop() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tif (!this.$parent.$refs['u-back-top']) {\n\t\t\t\t\tuni.$u.error(`nvue页面需要给页面最外层元素设置\"ref='u-back-top'`)\n\t\t\t\t}\n\t\t\t\tdom.scrollToElement(this.$parent.$refs['u-back-top'], {\n\t\t\t\t\toffset: 0\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tuni.pageScrollTo({\n\t\t\t\t\tscrollTop: 0,\n\t\t\t\t\tduration: this.duration\n\t\t\t\t});\n\t\t\t\t// #endif\n\t\t\t\tthis.$emit('click')\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n     $u-back-top-flex:1 !default;\n     $u-back-top-height:100% !default;\n     $u-back-top-background-color:#E1E1E1 !default;\n     $u-back-top-tips-font-size:12px !default;\n\t.u-back-top {\n\t\t@include flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tflex:$u-back-top-flex;\n\t\theight: $u-back-top-height;\n\t\tjustify-content: center;\n\t\tbackground-color: $u-back-top-background-color;\n\n\t\t&__tips {\n\t\t\tfont-size:$u-back-top-tips-font-size;\n\t\t\ttransform: scale(0.8);\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-badge/props.js",
    "content": "export default {\n    props: {\n        // 是否显示圆点\n        isDot: {\n            type: Boolean,\n            default: uni.$u.props.badge.isDot\n        },\n        // 显示的内容\n        value: {\n            type: [Number, String],\n            default: uni.$u.props.badge.value\n        },\n        // 是否显示\n        show: {\n            type: Boolean,\n            default: uni.$u.props.badge.show\n        },\n        // 最大值，超过最大值会显示 '{max}+'\n        max: {\n            type: [Number, String],\n            default: uni.$u.props.badge.max\n        },\n        // 主题类型，error|warning|success|primary\n        type: {\n            type: String,\n            default: uni.$u.props.badge.type\n        },\n        // 当数值为 0 时，是否展示 Badge\n        showZero: {\n            type: Boolean,\n            default: uni.$u.props.badge.showZero\n        },\n        // 背景颜色，优先级比type高，如设置，type参数会失效\n        bgColor: {\n            type: [String, null],\n            default: uni.$u.props.badge.bgColor\n        },\n        // 字体颜色\n        color: {\n            type: [String, null],\n            default: uni.$u.props.badge.color\n        },\n        // 徽标形状，circle-四角均为圆角，horn-左下角为直角\n        shape: {\n            type: String,\n            default: uni.$u.props.badge.shape\n        },\n        // 设置数字的显示方式，overflow|ellipsis|limit\n        // overflow会根据max字段判断，超出显示`${max}+`\n        // ellipsis会根据max判断，超出显示`${max}...`\n        // limit会依据1000作为判断条件，超出1000，显示`${value/1000}K`，比如2.2k、3.34w，最多保留2位小数\n        numberType: {\n            type: String,\n            default: uni.$u.props.badge.numberType\n        },\n        // 设置badge的位置偏移，格式为 [x, y]，也即设置的为top和right的值，absolute为true时有效\n        offset: {\n            type: Array,\n            default: uni.$u.props.badge.offset\n        },\n        // 是否反转背景和字体颜色\n        inverted: {\n            type: Boolean,\n            default: uni.$u.props.badge.inverted\n        },\n        // 是否绝对定位\n        absolute: {\n            type: Boolean,\n            default: uni.$u.props.badge.absolute\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-badge/u-badge.vue",
    "content": "<template>\n\t<text\n\t\tv-if=\"show && ((Number(value) === 0 ? showZero : true) || isDot)\"\n\t\t:class=\"[isDot ? 'u-badge--dot' : 'u-badge--not-dot', inverted && 'u-badge--inverted', shape === 'horn' && 'u-badge--horn', `u-badge--${type}${inverted ? '--inverted' : ''}`]\"\n\t\t:style=\"[$u.addStyle(customStyle), badgeStyle]\"\n\t\tclass=\"u-badge\"\n\t>{{ isDot ? '' :showValue }}</text>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * badge 徽标数\n\t * @description 该组件一般用于图标右上角显示未读的消息数量，提示用户点击，有圆点和圆包含文字两种形式。\n\t * @tutorial https://uviewui.com/components/badge.html\n\t * \n\t * @property {Boolean} \t\t\tisDot \t\t是否显示圆点 （默认 false ）\n\t * @property {String | Number} \tvalue \t\t显示的内容\n\t * @property {Boolean} \t\t\tshow \t\t是否显示 （默认 true ）\n\t * @property {String | Number} \tmax \t\t最大值，超过最大值会显示 '{max}+'  （默认999）\n\t * @property {String} \t\t\ttype \t\t主题类型，error|warning|success|primary （默认 'error' ）\n\t * @property {Boolean} \t\t\tshowZero\t当数值为 0 时，是否展示 Badge （默认 false ）\n\t * @property {String} \t\t\tbgColor \t背景颜色，优先级比type高，如设置，type参数会失效\n\t * @property {String} \t\t\tcolor \t\t字体颜色 （默认 '#ffffff' ）\n\t * @property {String} \t\t\tshape \t\t徽标形状，circle-四角均为圆角，horn-左下角为直角 （默认 'circle' ）\n\t * @property {String} \t\t\tnumberType\t设置数字的显示方式，overflow|ellipsis|limit  （默认 'overflow' ）\n\t * @property {Array}} \t\t\toffset\t\t设置badge的位置偏移，格式为 [x, y]，也即设置的为top和right的值，absolute为true时有效\n\t * @property {Boolean} \t\t\tinverted\t是否反转背景和字体颜色（默认 false ）\n\t * @property {Boolean} \t\t\tabsolute\t是否绝对定位（默认 false ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * @example <u-badge :type=\"type\" :count=\"count\"></u-badge>\n\t */\n\texport default {\n\t\tname: 'u-badge',\n\t\tmixins: [uni.$u.mpMixin, props, uni.$u.mixin],\n\t\tcomputed: {\n\t\t\t// 是否将badge中心与父组件右上角重合\n\t\t\tboxStyle() {\n\t\t\t\tlet style = {};\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\t// 整个组件的样式\n\t\t\tbadgeStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif(this.color) {\n\t\t\t\t\tstyle.color = this.color\n\t\t\t\t}\n\t\t\t\tif (this.bgColor && !this.inverted) {\n\t\t\t\t\tstyle.backgroundColor = this.bgColor\n\t\t\t\t}\n\t\t\t\tif (this.absolute) {\n\t\t\t\t\tstyle.position = 'absolute'\n\t\t\t\t\t// 如果有设置offset参数\n\t\t\t\t\tif(this.offset.length) {\n\t\t\t\t\t\t// top和right分为为offset的第一个和第二个值，如果没有第二个值，则right等于top\n\t\t\t\t\t\tconst top = this.offset[0]\n\t\t\t\t\t\tconst right = this.offset[1] || top\n\t\t\t\t\t\tstyle.top = uni.$u.addUnit(top)\n\t\t\t\t\t\tstyle.right = uni.$u.addUnit(right)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tshowValue() {\n\t\t\t\tswitch (this.numberType) {\n\t\t\t\t\tcase \"overflow\":\n\t\t\t\t\t\treturn Number(this.value) > Number(this.max) ? this.max + \"+\" : this.value\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"ellipsis\":\n\t\t\t\t\t\treturn Number(this.value) > Number(this.max) ? \"...\" : this.value\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"limit\":\n\t\t\t\t\t\treturn Number(this.value) > 999 ? Number(this.value) >= 9999 ?\n\t\t\t\t\t\t\tMath.floor(this.value / 1e4 * 100) / 100 + \"w\" : Math.floor(this.value /\n\t\t\t\t\t\t\t\t1e3 * 100) / 100 + \"k\" : this.value\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn Number(this.value)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t$u-badge-primary: $u-primary !default;\n\t$u-badge-error: $u-error !default;\n\t$u-badge-success: $u-success !default;\n\t$u-badge-info: $u-info !default;\n\t$u-badge-warning: $u-warning !default;\n\t$u-badge-dot-radius: 100px !default;\n\t$u-badge-dot-size: 8px !default;\n\t$u-badge-dot-right: 4px !default;\n\t$u-badge-dot-top: 0 !default;\n\t$u-badge-text-font-size: 11px !default;\n\t$u-badge-text-right: 10px !default;\n\t$u-badge-text-padding: 2px 5px !default;\n\t$u-badge-text-align: center !default;\n\t$u-badge-text-color: #FFFFFF !default;\n\n\t.u-badge {\n\t\tborder-top-right-radius: $u-badge-dot-radius;\n\t\tborder-top-left-radius: $u-badge-dot-radius;\n\t\tborder-bottom-left-radius: $u-badge-dot-radius;\n\t\tborder-bottom-right-radius: $u-badge-dot-radius;\n\t\t@include flex;\n\t\tline-height: $u-badge-text-font-size;\n\t\ttext-align: $u-badge-text-align;\n\t\tfont-size: $u-badge-text-font-size;\n\t\tcolor: $u-badge-text-color;\n\n\t\t&--dot {\n\t\t\theight: $u-badge-dot-size;\n\t\t\twidth: $u-badge-dot-size;\n\t\t}\n\t\t\n\t\t&--inverted {\n\t\t\tfont-size: 13px;\n\t\t}\n\t\t\n\t\t&--not-dot {\n\t\t\tpadding: $u-badge-text-padding;\n\t\t}\n\n\t\t&--horn {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t&--primary {\n\t\t\tbackground-color: $u-badge-primary;\n\t\t}\n\t\t\n\t\t&--primary--inverted {\n\t\t\tcolor: $u-badge-primary;\n\t\t}\n\n\t\t&--error {\n\t\t\tbackground-color: $u-badge-error;\n\t\t}\n\t\t\n\t\t&--error--inverted {\n\t\t\tcolor: $u-badge-error;\n\t\t}\n\n\t\t&--success {\n\t\t\tbackground-color: $u-badge-success;\n\t\t}\n\t\t\n\t\t&--success--inverted {\n\t\t\tcolor: $u-badge-success;\n\t\t}\n\n\t\t&--info {\n\t\t\tbackground-color: $u-badge-info;\n\t\t}\n\t\t\n\t\t&--info--inverted {\n\t\t\tcolor: $u-badge-info;\n\t\t}\n\n\t\t&--warning {\n\t\t\tbackground-color: $u-badge-warning;\n\t\t}\n\t\t\n\t\t&--warning--inverted {\n\t\t\tcolor: $u-badge-warning;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-button/nvue.scss",
    "content": "$u-button-active-opacity:0.75 !default;\n$u-button-loading-text-margin-left:4px !default;\n$u-button-text-color: #FFFFFF !default;\n$u-button-text-plain-error-color:$u-error !default;\n$u-button-text-plain-warning-color:$u-warning !default;\n$u-button-text-plain-success-color:$u-success !default;\n$u-button-text-plain-info-color:$u-info !default;\n$u-button-text-plain-primary-color:$u-primary !default;\n.u-button {\n\t&--active {\n\t\topacity: $u-button-active-opacity;\n\t}\n\t\n\t&--active--plain {\n\t\tbackground-color: rgb(217, 217, 217);\n\t}\n\t\n\t&__loading-text {\n\t\tmargin-left:$u-button-loading-text-margin-left;\n\t}\n\t\n\t&__text,\n\t&__loading-text {\n\t\tcolor:$u-button-text-color;\n\t}\n\t\n\t&__text--plain--error {\n\t\tcolor:$u-button-text-plain-error-color;\n\t}\n\t\n\t&__text--plain--warning {\n\t\tcolor:$u-button-text-plain-warning-color;\n\t}\n\t\n\t&__text--plain--success{\n\t\tcolor:$u-button-text-plain-success-color;\n\t}\n\t\n\t&__text--plain--info {\n\t\tcolor:$u-button-text-plain-info-color;\n\t}\n\t\n\t&__text--plain--primary {\n\t\tcolor:$u-button-text-plain-primary-color;\n\t}\n}"
  },
  {
    "path": "uni_modules/uview-ui/components/u-button/props.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-16 10:04:04\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-16 10:04:24\n * @FilePath     : /u-view2.0/uview-ui/components/u-button/props.js\n */\nexport default {\n    props: {\n        // 是否细边框\n        hairline: {\n            type: Boolean,\n            default: uni.$u.props.button.hairline\n        },\n        // 按钮的预置样式，info，primary，error，warning，success\n        type: {\n            type: String,\n            default: uni.$u.props.button.type\n        },\n        // 按钮尺寸，large，normal，small，mini\n        size: {\n            type: String,\n            default: uni.$u.props.button.size\n        },\n        // 按钮形状，circle（两边为半圆），square（带圆角）\n        shape: {\n            type: String,\n            default: uni.$u.props.button.shape\n        },\n        // 按钮是否镂空\n        plain: {\n            type: Boolean,\n            default: uni.$u.props.button.plain\n        },\n        // 是否禁止状态\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.button.disabled\n        },\n        // 是否加载中\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.button.loading\n        },\n        // 加载中提示文字\n        loadingText: {\n            type: [String, Number],\n            default: uni.$u.props.button.loadingText\n        },\n        // 加载状态图标类型\n        loadingMode: {\n            type: String,\n            default: uni.$u.props.button.loadingMode\n        },\n        // 加载图标大小\n        loadingSize: {\n            type: [String, Number],\n            default: uni.$u.props.button.loadingSize\n        },\n        // 开放能力，具体请看uniapp稳定关于button组件部分说明\n        // https://uniapp.dcloud.io/component/button\n        openType: {\n            type: String,\n            default: uni.$u.props.button.openType\n        },\n        // 用于 <form> 组件，点击分别会触发 <form> 组件的 submit/reset 事件\n        // 取值为submit（提交表单），reset（重置表单）\n        formType: {\n            type: String,\n            default: uni.$u.props.button.formType\n        },\n        // 打开 APP 时，向 APP 传递的参数，open-type=launchApp时有效\n        // 只微信小程序、QQ小程序有效\n        appParameter: {\n            type: String,\n            default: uni.$u.props.button.appParameter\n        },\n        // 指定是否阻止本节点的祖先节点出现点击态，微信小程序有效\n        hoverStopPropagation: {\n            type: Boolean,\n            default: uni.$u.props.button.hoverStopPropagation\n        },\n        // 指定返回用户信息的语言，zh_CN 简体中文，zh_TW 繁体中文，en 英文。只微信小程序有效\n        lang: {\n            type: String,\n            default: uni.$u.props.button.lang\n        },\n        // 会话来源，open-type=\"contact\"时有效。只微信小程序有效\n        sessionFrom: {\n            type: String,\n            default: uni.$u.props.button.sessionFrom\n        },\n        // 会话内消息卡片标题，open-type=\"contact\"时有效\n        // 默认当前标题，只微信小程序有效\n        sendMessageTitle: {\n            type: String,\n            default: uni.$u.props.button.sendMessageTitle\n        },\n        // 会话内消息卡片点击跳转小程序路径，open-type=\"contact\"时有效\n        // 默认当前分享路径，只微信小程序有效\n        sendMessagePath: {\n            type: String,\n            default: uni.$u.props.button.sendMessagePath\n        },\n        // 会话内消息卡片图片，open-type=\"contact\"时有效\n        // 默认当前页面截图，只微信小程序有效\n        sendMessageImg: {\n            type: String,\n            default: uni.$u.props.button.sendMessageImg\n        },\n        // 是否显示会话内消息卡片，设置此参数为 true，用户进入客服会话会在右下角显示\"可能要发送的小程序\"提示，\n        // 用户点击后可以快速发送小程序消息，open-type=\"contact\"时有效\n        showMessageCard: {\n            type: Boolean,\n            default: uni.$u.props.button.showMessageCard\n        },\n        // 额外传参参数，用于小程序的data-xxx属性，通过target.dataset.name获取\n        dataName: {\n            type: String,\n            default: uni.$u.props.button.dataName\n        },\n        // 节流，一定时间内只能触发一次\n        throttleTime: {\n            type: [String, Number],\n            default: uni.$u.props.button.throttleTime\n        },\n        // 按住后多久出现点击态，单位毫秒\n        hoverStartTime: {\n            type: [String, Number],\n            default: uni.$u.props.button.hoverStartTime\n        },\n        // 手指松开后点击态保留时间，单位毫秒\n        hoverStayTime: {\n            type: [String, Number],\n            default: uni.$u.props.button.hoverStayTime\n        },\n        // 按钮文字，之所以通过props传入，是因为slot传入的话\n        // nvue中无法控制文字的样式\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.button.text\n        },\n        // 按钮图标\n        icon: {\n            type: String,\n            default: uni.$u.props.button.icon\n        },\n        // 按钮图标\n        iconColor: {\n            type: String,\n            default: uni.$u.props.button.icon\n        },\n        // 按钮颜色，支持传入linear-gradient渐变色\n        color: {\n            type: String,\n            default: uni.$u.props.button.color\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-button/u-button.vue",
    "content": "<template>\n    <!-- #ifndef APP-NVUE -->\n    <button\n        :hover-start-time=\"Number(hoverStartTime)\"\n        :hover-stay-time=\"Number(hoverStayTime)\"\n        :form-type=\"formType\"\n        :open-type=\"openType\"\n        :app-parameter=\"appParameter\"\n        :hover-stop-propagation=\"hoverStopPropagation\"\n        :send-message-title=\"sendMessageTitle\"\n        :send-message-path=\"sendMessagePath\"\n        :lang=\"lang\"\n        :data-name=\"dataName\"\n        :session-from=\"sessionFrom\"\n        :send-message-img=\"sendMessageImg\"\n        :show-message-card=\"showMessageCard\"\n        @getphonenumber=\"getphonenumber\"\n        @getuserinfo=\"getuserinfo\"\n        @error=\"error\"\n        @opensetting=\"opensetting\"\n        @launchapp=\"launchapp\"\n        :hover-class=\"!disabled && !loading ? 'u-button--active' : ''\"\n        class=\"u-button u-reset-button\"\n        :style=\"[baseColor, $u.addStyle(customStyle)]\"\n        @tap=\"clickHandler\"\n        :class=\"bemClass\"\n    >\n        <template v-if=\"loading\">\n            <u-loading-icon\n                :mode=\"loadingMode\"\n                :size=\"loadingSize * 1.15\"\n                :color=\"loadingColor\"\n            ></u-loading-icon>\n            <text\n                class=\"u-button__loading-text\"\n                :style=\"[{ fontSize: textSize + 'px' }]\"\n                >{{ loadingText || text }}</text\n            >\n        </template>\n        <template v-else>\n            <u-icon\n                v-if=\"icon\"\n                :name=\"icon\"\n                :color=\"iconColorCom\"\n                :size=\"textSize * 1.35\"\n                :customStyle=\"{ marginRight: '2px' }\"\n            ></u-icon>\n            <slot>\n                <text\n                    class=\"u-button__text\"\n                    :style=\"[{ fontSize: textSize + 'px' }]\"\n                    >{{ text }}</text\n                >\n            </slot>\n        </template>\n    </button>\n    <!-- #endif -->\n\n    <!-- #ifdef APP-NVUE -->\n    <view\n        :hover-start-time=\"Number(hoverStartTime)\"\n        :hover-stay-time=\"Number(hoverStayTime)\"\n        class=\"u-button\"\n        :hover-class=\"\n            !disabled && !loading && !color && (plain || type === 'info')\n                ? 'u-button--active--plain'\n                : !disabled && !loading && !plain\n                ? 'u-button--active'\n                : ''\n        \"\n        @tap=\"clickHandler\"\n        :class=\"bemClass\"\n        :style=\"[baseColor, $u.addStyle(customStyle)]\"\n    >\n        <template v-if=\"loading\">\n            <u-loading-icon\n                :mode=\"loadingMode\"\n                :size=\"loadingSize * 1.15\"\n                :color=\"loadingColor\"\n            ></u-loading-icon>\n            <text\n                class=\"u-button__loading-text\"\n                :style=\"[nvueTextStyle]\"\n                :class=\"[plain && `u-button__text--plain--${type}`]\"\n                >{{ loadingText || text }}</text\n            >\n        </template>\n        <template v-else>\n            <u-icon\n                v-if=\"icon\"\n                :name=\"icon\"\n                :color=\"iconColorCom\"\n                :size=\"textSize * 1.35\"\n            ></u-icon>\n            <text\n                class=\"u-button__text\"\n                :style=\"[\n                    {\n                        marginLeft: icon ? '2px' : 0,\n                    },\n                    nvueTextStyle,\n                ]\"\n                :class=\"[plain && `u-button__text--plain--${type}`]\"\n                >{{ text }}</text\n            >\n        </template>\n    </view>\n    <!-- #endif -->\n</template>\n\n<script>\nimport button from \"../../libs/mixin/button.js\";\nimport openType from \"../../libs/mixin/openType.js\";\nimport props from \"./props.js\";\n/**\n * button 按钮\n * @description Button 按钮\n * @tutorial https://www.uviewui.com/components/button.html\n *\n * @property {Boolean}\t\t\thairline\t\t\t\t是否显示按钮的细边框 (默认 true )\n * @property {String}\t\t\ttype\t\t\t\t\t按钮的预置样式，info，primary，error，warning，success (默认 'info' )\n * @property {String}\t\t\tsize\t\t\t\t\t按钮尺寸，large，normal，mini （默认 normal）\n * @property {String}\t\t\tshape\t\t\t\t\t按钮形状，circle（两边为半圆），square（带圆角） （默认 'square' ）\n * @property {Boolean}\t\t\tplain\t\t\t\t\t按钮是否镂空，背景色透明 （默认 false）\n * @property {Boolean}\t\t\tdisabled\t\t\t\t是否禁用 （默认 false）\n * @property {Boolean}\t\t\tloading\t\t\t\t\t按钮名称前是否带 loading 图标(App-nvue 平台，在 ios 上为雪花，Android上为圆圈) （默认 false）\n * @property {String | Number}\tloadingText\t\t\t\t加载中提示文字\n * @property {String}\t\t\tloadingMode\t\t\t\t加载状态图标类型 （默认 'spinner' ）\n * @property {String | Number}\tloadingSize\t\t\t\t加载图标大小 （默认 15 ）\n * @property {String}\t\t\topenType\t\t\t\t开放能力，具体请看uniapp稳定关于button组件部分说明\n * @property {String}\t\t\tformType\t\t\t\t用于 <form> 组件，点击分别会触发 <form> 组件的 submit/reset 事件\n * @property {String}\t\t\tappParameter\t\t\t打开 APP 时，向 APP 传递的参数，open-type=launchApp时有效 （注：只微信小程序、QQ小程序有效）\n * @property {Boolean}\t\t\thoverStopPropagation\t指定是否阻止本节点的祖先节点出现点击态，微信小程序有效（默认 true ）\n * @property {String}\t\t\tlang\t\t\t\t\t指定返回用户信息的语言，zh_CN 简体中文，zh_TW 繁体中文，en 英文（默认 en ）\n * @property {String}\t\t\tsessionFrom\t\t\t\t会话来源，openType=\"contact\"时有效\n * @property {String}\t\t\tsendMessageTitle\t\t会话内消息卡片标题，openType=\"contact\"时有效\n * @property {String}\t\t\tsendMessagePath\t\t\t会话内消息卡片点击跳转小程序路径，openType=\"contact\"时有效\n * @property {String}\t\t\tsendMessageImg\t\t\t会话内消息卡片图片，openType=\"contact\"时有效\n * @property {Boolean}\t\t\tshowMessageCard\t\t\t是否显示会话内消息卡片，设置此参数为 true，用户进入客服会话会在右下角显示\"可能要发送的小程序\"提示，用户点击后可以快速发送小程序消息，openType=\"contact\"时有效（默认false）\n * @property {String}\t\t\tdataName\t\t\t\t额外传参参数，用于小程序的data-xxx属性，通过target.dataset.name获取\n * @property {String | Number}\tthrottleTime\t\t\t节流，一定时间内只能触发一次 （默认 0 )\n * @property {String | Number}\thoverStartTime\t\t\t按住后多久出现点击态，单位毫秒 （默认 0 )\n * @property {String | Number}\thoverStayTime\t\t\t手指松开后点击态保留时间，单位毫秒 （默认 200 )\n * @property {String | Number}\ttext\t\t\t\t\t按钮文字，之所以通过props传入，是因为slot传入的话（注：nvue中无法控制文字的样式）\n * @property {String}\t\t\ticon\t\t\t\t\t按钮图标\n * @property {String}\t\t\ticonColor\t\t\t\t按钮图标颜色\n * @property {String}\t\t\tcolor\t\t\t\t\t按钮颜色，支持传入linear-gradient渐变色\n * @property {Object}\t\t\tcustomStyle\t\t\t\t定义需要用到的外部样式\n *\n * @event {Function}\tclick\t\t\t非禁止并且非加载中，才能点击\n * @event {Function}\tgetphonenumber\topen-type=\"getPhoneNumber\"时有效\n * @event {Function}\tgetuserinfo\t\t用户点击该按钮时，会返回获取到的用户信息，从返回参数的detail中获取到的值同uni.getUserInfo\n * @event {Function}\terror\t\t\t当使用开放能力时，发生错误的回调\n * @event {Function}\topensetting\t\t在打开授权设置页并关闭后回调\n * @event {Function}\tlaunchapp\t\t打开 APP 成功的回调\n * @example <u-button>月落</u-button>\n */\nexport default {\n    name: \"u-button\",\n    // #ifdef MP\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, button, openType, props],\n    // #endif\n    // #ifndef MP\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n    // #endif\n    data() {\n        return {};\n    },\n    computed: {\n        // 生成bem风格的类名\n        bemClass() {\n            // this.bem为一个computed变量，在mixin中\n            if (!this.color) {\n                return this.bem(\n                    \"button\",\n                    [\"type\", \"shape\", \"size\"],\n                    [\"disabled\", \"plain\", \"hairline\"]\n                );\n            } else {\n                // 由于nvue的原因，在有color参数时，不需要传入type，否则会生成type相关的类型，影响最终的样式\n                return this.bem(\n                    \"button\",\n                    [\"shape\", \"size\"],\n                    [\"disabled\", \"plain\", \"hairline\"]\n                );\n            }\n        },\n        loadingColor() {\n            if (this.plain) {\n                // 如果有设置color值，则用color值，否则使用type主题颜色\n                return this.color\n                    ? this.color\n                    : uni.$u.config.color[`u-${this.type}`];\n            }\n            if (this.type === \"info\") {\n                return \"#c9c9c9\";\n            }\n            return \"rgb(200, 200, 200)\";\n        },\n        iconColorCom() {\n            // 如果是镂空状态，设置了color就用color值，否则使用主题颜色，\n            // u-icon的color能接受一个主题颜色的值\n\t\t\tif (this.iconColor) return this.iconColor;\n\t\t\tif (this.plain) {\n                return this.color ? this.color : this.type;\n            } else {\n                return this.type === \"info\" ? \"#000000\" : \"#ffffff\";\n            }\n        },\n        baseColor() {\n            let style = {};\n            if (this.color) {\n                // 针对自定义了color颜色的情况，镂空状态下，就是用自定义的颜色\n                style.color = this.plain ? this.color : \"white\";\n                if (!this.plain) {\n                    // 非镂空，背景色使用自定义的颜色\n                    style[\"background-color\"] = this.color;\n                }\n                if (this.color.indexOf(\"gradient\") !== -1) {\n                    // 如果自定义的颜色为渐变色，不显示边框，以及通过backgroundImage设置渐变色\n                    // weex文档说明可以写borderWidth的形式，为什么这里需要分开写？\n                    // 因为weex是阿里巴巴为了部门业绩考核而做的你懂的东西，所以需要这么写才有效\n                    style.borderTopWidth = 0;\n                    style.borderRightWidth = 0;\n                    style.borderBottomWidth = 0;\n                    style.borderLeftWidth = 0;\n                    if (!this.plain) {\n                        style.backgroundImage = this.color;\n                    }\n                } else {\n                    // 非渐变色，则设置边框相关的属性\n                    style.borderColor = this.color;\n                    style.borderWidth = \"1px\";\n                    style.borderStyle = \"solid\";\n                }\n            }\n            return style;\n        },\n        // nvue版本按钮的字体不会继承父组件的颜色，需要对每一个text组件进行单独的设置\n        nvueTextStyle() {\n            let style = {};\n            // 针对自定义了color颜色的情况，镂空状态下，就是用自定义的颜色\n            if (this.type === \"info\") {\n                style.color = \"#323233\";\n            }\n            if (this.color) {\n                style.color = this.plain ? this.color : \"white\";\n            }\n            style.fontSize = this.textSize + \"px\";\n            return style;\n        },\n        // 字体大小\n        textSize() {\n            let fontSize = 14,\n                { size } = this;\n            if (size === \"large\") fontSize = 16;\n            if (size === \"normal\") fontSize = 14;\n            if (size === \"small\") fontSize = 12;\n            if (size === \"mini\") fontSize = 10;\n            return fontSize;\n        },\n    },\n    methods: {\n        clickHandler(e) {\n            // 非禁止并且非加载中，才能点击\n            if (!this.disabled && !this.loading) {\n\t\t\t\t// 进行节流控制，每this.throttle毫秒内，只在开始处执行\n\t\t\t\tuni.$u.throttle(() => {\n\t\t\t\t\tthis.$emit(\"click\",e);\n\t\t\t\t}, this.throttleTime);\n            }\n        },\n        // 下面为对接uniapp官方按钮开放能力事件回调的对接\n        getphonenumber(res) {\n            this.$emit(\"getphonenumber\", res);\n        },\n        getuserinfo(res) {\n            this.$emit(\"getuserinfo\", res);\n        },\n        error(res) {\n            this.$emit(\"error\", res);\n        },\n        opensetting(res) {\n            this.$emit(\"opensetting\", res);\n        },\n        launchapp(res) {\n            this.$emit(\"launchapp\", res);\n        },\n    },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n/* #ifndef APP-NVUE */\n@import \"./vue.scss\";\n/* #endif */\n\n/* #ifdef APP-NVUE */\n@import \"./nvue.scss\";\n/* #endif */\n\n$u-button-u-button-height: 40px !default;\n$u-button-text-font-size: 15px !default;\n$u-button-loading-text-font-size: 15px !default;\n$u-button-loading-text-margin-left: 4px !default;\n$u-button-large-width: 100% !default;\n$u-button-large-height: 50px !default;\n$u-button-normal-padding: 0 12px !default;\n$u-button-large-padding: 0 15px !default;\n$u-button-normal-font-size: 14px !default;\n$u-button-small-min-width: 60px !default;\n$u-button-small-height: 30px !default;\n$u-button-small-padding: 0px 8px !default;\n$u-button-mini-padding: 0px 8px !default;\n$u-button-small-font-size: 12px !default;\n$u-button-mini-height: 22px !default;\n$u-button-mini-font-size: 10px !default;\n$u-button-mini-min-width: 50px !default;\n$u-button-disabled-opacity: 0.5 !default;\n$u-button-info-color: #323233 !default;\n$u-button-info-background-color: #fff !default;\n$u-button-info-border-color: #ebedf0 !default;\n$u-button-info-border-width: 1px !default;\n$u-button-info-border-style: solid !default;\n$u-button-success-color: #fff !default;\n$u-button-success-background-color: $u-success !default;\n$u-button-success-border-color: $u-button-success-background-color !default;\n$u-button-success-border-width: 1px !default;\n$u-button-success-border-style: solid !default;\n$u-button-primary-color: #fff !default;\n$u-button-primary-background-color: $u-primary !default;\n$u-button-primary-border-color: $u-button-primary-background-color !default;\n$u-button-primary-border-width: 1px !default;\n$u-button-primary-border-style: solid !default;\n$u-button-error-color: #fff !default;\n$u-button-error-background-color: $u-error !default;\n$u-button-error-border-color: $u-button-error-background-color !default;\n$u-button-error-border-width: 1px !default;\n$u-button-error-border-style: solid !default;\n$u-button-warning-color: #fff !default;\n$u-button-warning-background-color: $u-warning !default;\n$u-button-warning-border-color: $u-button-warning-background-color !default;\n$u-button-warning-border-width: 1px !default;\n$u-button-warning-border-style: solid !default;\n$u-button-block-width: 100% !default;\n$u-button-circle-border-top-right-radius: 100px !default;\n$u-button-circle-border-top-left-radius: 100px !default;\n$u-button-circle-border-bottom-left-radius: 100px !default;\n$u-button-circle-border-bottom-right-radius: 100px !default;\n$u-button-square-border-top-right-radius: 3px !default;\n$u-button-square-border-top-left-radius: 3px !default;\n$u-button-square-border-bottom-left-radius: 3px !default;\n$u-button-square-border-bottom-right-radius: 3px !default;\n$u-button-icon-min-width: 1em !default;\n$u-button-plain-background-color: #fff !default;\n$u-button-hairline-border-width: 0.5px !default;\n\n.u-button {\n    height: $u-button-u-button-height;\n    position: relative;\n    align-items: center;\n    justify-content: center;\n    @include flex;\n    /* #ifndef APP-NVUE */\n    box-sizing: border-box;\n    /* #endif */\n    flex-direction: row;\n\n    &__text {\n        font-size: $u-button-text-font-size;\n    }\n\n    &__loading-text {\n        font-size: $u-button-loading-text-font-size;\n        margin-left: $u-button-loading-text-margin-left;\n    }\n\n    &--large {\n        /* #ifndef APP-NVUE */\n        width: $u-button-large-width;\n        /* #endif */\n        height: $u-button-large-height;\n        padding: $u-button-large-padding;\n    }\n\n    &--normal {\n        padding: $u-button-normal-padding;\n        font-size: $u-button-normal-font-size;\n    }\n\n    &--small {\n        /* #ifndef APP-NVUE */\n        min-width: $u-button-small-min-width;\n        /* #endif */\n        height: $u-button-small-height;\n        padding: $u-button-small-padding;\n        font-size: $u-button-small-font-size;\n    }\n\n    &--mini {\n        height: $u-button-mini-height;\n        font-size: $u-button-mini-font-size;\n        /* #ifndef APP-NVUE */\n        min-width: $u-button-mini-min-width;\n        /* #endif */\n        padding: $u-button-mini-padding;\n    }\n\n    &--disabled {\n        opacity: $u-button-disabled-opacity;\n    }\n\n    &--info {\n        color: $u-button-info-color;\n        background-color: $u-button-info-background-color;\n        border-color: $u-button-info-border-color;\n        border-width: $u-button-info-border-width;\n        border-style: $u-button-info-border-style;\n    }\n\n    &--success {\n        color: $u-button-success-color;\n        background-color: $u-button-success-background-color;\n        border-color: $u-button-success-border-color;\n        border-width: $u-button-success-border-width;\n        border-style: $u-button-success-border-style;\n    }\n\n    &--primary {\n        color: $u-button-primary-color;\n        background-color: $u-button-primary-background-color;\n        border-color: $u-button-primary-border-color;\n        border-width: $u-button-primary-border-width;\n        border-style: $u-button-primary-border-style;\n    }\n\n    &--error {\n        color: $u-button-error-color;\n        background-color: $u-button-error-background-color;\n        border-color: $u-button-error-border-color;\n        border-width: $u-button-error-border-width;\n        border-style: $u-button-error-border-style;\n    }\n\n    &--warning {\n        color: $u-button-warning-color;\n        background-color: $u-button-warning-background-color;\n        border-color: $u-button-warning-border-color;\n        border-width: $u-button-warning-border-width;\n        border-style: $u-button-warning-border-style;\n    }\n\n    &--block {\n        @include flex;\n        width: $u-button-block-width;\n    }\n\n    &--circle {\n        border-top-right-radius: $u-button-circle-border-top-right-radius;\n        border-top-left-radius: $u-button-circle-border-top-left-radius;\n        border-bottom-left-radius: $u-button-circle-border-bottom-left-radius;\n        border-bottom-right-radius: $u-button-circle-border-bottom-right-radius;\n    }\n\n    &--square {\n        border-bottom-left-radius: $u-button-square-border-top-right-radius;\n        border-bottom-right-radius: $u-button-square-border-top-left-radius;\n        border-top-left-radius: $u-button-square-border-bottom-left-radius;\n        border-top-right-radius: $u-button-square-border-bottom-right-radius;\n    }\n\n    &__icon {\n        /* #ifndef APP-NVUE */\n        min-width: $u-button-icon-min-width;\n        line-height: inherit !important;\n        vertical-align: top;\n        /* #endif */\n    }\n\n    &--plain {\n        background-color: $u-button-plain-background-color;\n    }\n\n    &--hairline {\n        border-width: $u-button-hairline-border-width !important;\n    }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-button/vue.scss",
    "content": "// nvue下hover-class无效\n$u-button-before-top:50% !default;\n$u-button-before-left:50% !default;\n$u-button-before-width:100% !default;\n$u-button-before-height:100% !default;\n$u-button-before-transform:translate(-50%, -50%) !default;\n$u-button-before-opacity:0 !default;\n$u-button-before-background-color:#000 !default;\n$u-button-before-border-color:#000 !default;\n$u-button-active-before-opacity:.15 !default;\n$u-button-icon-margin-left:4px !default;\n$u-button-plain-u-button-info-color:$u-info;\n$u-button-plain-u-button-success-color:$u-success;\n$u-button-plain-u-button-error-color:$u-error;\n$u-button-plain-u-button-warning-color:$u-error;\n\n.u-button {\n\twidth: 100%;\n\t\n\t&__text {\n\t\twhite-space: nowrap;\n\t\tline-height: 1;\n\t}\n\t\n\t&:before {\n\t\tposition: absolute;\n\t\ttop:$u-button-before-top;\n\t\tleft:$u-button-before-left;\n\t\twidth:$u-button-before-width;\n\t\theight:$u-button-before-height;\n\t\tborder: inherit;\n\t\tborder-radius: inherit;\n\t\ttransform:$u-button-before-transform;\n\t\topacity:$u-button-before-opacity;\n\t\tcontent: \" \";\n\t\tbackground-color:$u-button-before-background-color;\n\t\tborder-color:$u-button-before-border-color;\n\t}\n\t\n\t&--active {\n\t\t&:before {\n\t\t\topacity: .15\n\t\t}\n\t}\n\t\n\t&__icon+&__text:not(:empty),\n\t&__loading-text {\n\t\tmargin-left:$u-button-icon-margin-left;\n\t}\n\t\n\t&--plain {\n\t\t&.u-button--primary {\n\t\t\tcolor: $u-primary;\n\t\t}\n\t}\n\t\n\t&--plain {\n\t\t&.u-button--info {\n\t\t\tcolor:$u-button-plain-u-button-info-color;\n\t\t}\n\t}\n\t\n\t&--plain {\n\t\t&.u-button--success {\n\t\t\tcolor:$u-button-plain-u-button-success-color;\n\t\t}\n\t}\n\t\n\t&--plain {\n\t\t&.u-button--error {\n\t\t\tcolor:$u-button-plain-u-button-error-color;\n\t\t}\n\t}\n\t\n\t&--plain {\n\t\t&.u-button--warning {\n\t\t\tcolor:$u-button-plain-u-button-warning-color;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-calendar/header.vue",
    "content": "<template>\n\t<view class=\"u-calendar-header u-border-bottom\">\n\t\t<text\n\t\t\tclass=\"u-calendar-header__title\"\n\t\t\tv-if=\"showTitle\"\n\t\t>{{ title }}</text>\n\t\t<text\n\t\t\tclass=\"u-calendar-header__subtitle\"\n\t\t\tv-if=\"showSubtitle\"\n\t\t>{{ subtitle }}</text>\n\t\t<view class=\"u-calendar-header__weekdays\">\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">一</text>\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">二</text>\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">三</text>\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">四</text>\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">五</text>\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">六</text>\n\t\t\t<text class=\"u-calendar-header__weekdays__weekday\">日</text>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\texport default {\n\t\tname: 'u-calendar-header',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin],\n\t\tprops: {\n\t\t\t// 标题\n\t\t\ttitle: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: ''\n\t\t\t},\n\t\t\t// 副标题\n\t\t\tsubtitle: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: ''\n\t\t\t},\n\t\t\t// 是否显示标题\n\t\t\tshowTitle: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\t\t\t// 是否显示副标题\n\t\t\tshowSubtitle: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tname() {\n\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-calendar-header {\n\t\tpadding-bottom: 4px;\n\n\t\t&__title {\n\t\t\tfont-size: 16px;\n\t\t\tcolor: $u-main-color;\n\t\t\ttext-align: center;\n\t\t\theight: 42px;\n\t\t\tline-height: 42px;\n\t\t\tfont-weight: bold;\n\t\t}\n\n\t\t&__subtitle {\n\t\t\tfont-size: 14px;\n\t\t\tcolor: $u-main-color;\n\t\t\theight: 40px;\n\t\t\ttext-align: center;\n\t\t\tline-height: 40px;\n\t\t\tfont-weight: bold;\n\t\t}\n\n\t\t&__weekdays {\n\t\t\t@include flex;\n\t\t\tjustify-content: space-between;\n\n\t\t\t&__weekday {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: $u-main-color;\n\t\t\t\tline-height: 30px;\n\t\t\t\tflex: 1;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-calendar/month.vue",
    "content": "<template>\n\t<view class=\"u-calendar-month-wrapper\" ref=\"u-calendar-month-wrapper\">\n\t\t<view v-for=\"(item, index) in months\" :key=\"index\" :class=\"[`u-calendar-month-${index}`]\"\n\t\t\t:ref=\"`u-calendar-month-${index}`\" :id=\"`month-${index}`\">\n\t\t\t<text v-if=\"index !== 0\" class=\"u-calendar-month__title\">{{ item.year }}年{{ item.month }}月</text>\n\t\t\t<view class=\"u-calendar-month__days\">\n\t\t\t\t<view v-if=\"showMark\" class=\"u-calendar-month__days__month-mark-wrapper\">\n\t\t\t\t\t<text class=\"u-calendar-month__days__month-mark-wrapper__text\">{{ item.month }}</text>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"u-calendar-month__days__day\" v-for=\"(item1, index1) in item.date\" :key=\"index1\"\n\t\t\t\t\t:style=\"[dayStyle(index, index1, item1)]\" @tap=\"clickHandler(index, index1, item1)\"\n\t\t\t\t\t:class=\"[item1.selected && 'u-calendar-month__days__day__select--selected']\">\n\t\t\t\t\t<view class=\"u-calendar-month__days__day__select\" :style=\"[daySelectStyle(index, index1, item1)]\">\n\t\t\t\t\t\t<text class=\"u-calendar-month__days__day__select__info\"\n\t\t\t\t\t\t\t:class=\"[item1.disabled && 'u-calendar-month__days__day__select__info--disabled']\"\n\t\t\t\t\t\t\t:style=\"[textStyle(item1)]\">{{ item1.day }}</text>\n\t\t\t\t\t\t<text v-if=\"getBottomInfo(index, index1, item1)\"\n\t\t\t\t\t\t\tclass=\"u-calendar-month__days__day__select__buttom-info\"\n\t\t\t\t\t\t\t:class=\"[item1.disabled && 'u-calendar-month__days__day__select__buttom-info--disabled']\"\n\t\t\t\t\t\t\t:style=\"[textStyle(item1)]\">{{ getBottomInfo(index, index1, item1) }}</text>\n\t\t\t\t\t\t<text v-if=\"item1.dot\" class=\"u-calendar-month__days__day__select__dot\"></text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\t// #ifdef APP-NVUE\n\t// 由于nvue不支持百分比单位，需要查询宽度来计算每个日期的宽度\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\timport dayjs from '../../libs/util/dayjs.js';\n\texport default {\n\t\tname: 'u-calendar-month',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin],\n\t\tprops: {\n\t\t\t// 是否显示月份背景色\n\t\t\tshowMark: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\t\t\t// 主题色，对底部按钮和选中日期有效\n\t\t\tcolor: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '#3c9cff'\n\t\t\t},\n\t\t\t// 月份数据\n\t\t\tmonths: {\n\t\t\t\ttype: Array,\n\t\t\t\tdefault: () => []\n\t\t\t},\n\t\t\t// 日期选择类型\n\t\t\tmode: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: 'single'\n\t\t\t},\n\t\t\t// 日期行高\n\t\t\trowHeight: {\n\t\t\t\ttype: [String, Number],\n\t\t\t\tdefault: 58\n\t\t\t},\n\t\t\t// mode=multiple时，最多可选多少个日期\n\t\t\tmaxCount: {\n\t\t\t\ttype: [String, Number],\n\t\t\t\tdefault: Infinity\n\t\t\t},\n\t\t\t// mode=range时，第一个日期底部的提示文字\n\t\t\tstartText: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '开始'\n\t\t\t},\n\t\t\t// mode=range时，最后一个日期底部的提示文字\n\t\t\tendText: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '结束'\n\t\t\t},\n\t\t\t// 默认选中的日期，mode为multiple或range是必须为数组格式\n\t\t\tdefaultDate: {\n\t\t\t\ttype: [Array, String, Date],\n\t\t\t\tdefault: null\n\t\t\t},\n\t\t\t// 最小的可选日期\n\t\t\tminDate: {\n\t\t\t\ttype: [String, Number],\n\t\t\t\tdefault: 0\n\t\t\t},\n\t\t\t// 最大可选日期\n\t\t\tmaxDate: {\n\t\t\t\ttype: [String, Number],\n\t\t\t\tdefault: 0\n\t\t\t},\n\t\t\t// 如果没有设置maxDate，则往后推多少个月\n\t\t\tmaxMonth: {\n\t\t\t\ttype: [String, Number],\n\t\t\t\tdefault: 2\n\t\t\t},\n\t\t\t// 是否为只读状态，只读状态下禁止选择日期\n\t\t\treadonly: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: uni.$u.props.calendar.readonly\n\t\t\t},\n\t\t\t// 日期区间最多可选天数，默认无限制，mode = range时有效\n\t\t\tmaxRange: {\n\t\t\t\ttype: [Number, String],\n\t\t\t\tdefault: Infinity\n\t\t\t},\n\t\t\t// 范围选择超过最多可选天数时的提示文案，mode = range时有效\n\t\t\trangePrompt: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: ''\n\t\t\t},\n\t\t\t// 范围选择超过最多可选天数时，是否展示提示文案，mode = range时有效\n\t\t\tshowRangePrompt: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\t\t\t// 是否允许日期范围的起止时间为同一天，mode = range时有效\n\t\t\tallowSameDay: {\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\t// 每个日期的宽度\n\t\t\t\twidth: 0,\n\t\t\t\t// 当前选中的日期item\n\t\t\t\titem: {},\n\t\t\t\tselected: []\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tselectedChange: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(n) {\n\t\t\t\t\tthis.setDefaultDate()\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 多个条件的变化，会引起选中日期的变化，这里统一管理监听\n\t\t\tselectedChange() {\n\t\t\t\treturn [this.minDate, this.maxDate, this.defaultDate]\n\t\t\t},\n\t\t\tdayStyle(index1, index2, item) {\n\t\t\t\treturn (index1, index2, item) => {\n\t\t\t\t\tconst style = {}\n\t\t\t\t\tlet week = item.week\n\t\t\t\t\t// 不进行四舍五入的形式保留2位小数\n\t\t\t\t\tconst dayWidth = Number(parseFloat(this.width / 7).toFixed(3).slice(0, -1))\n\t\t\t\t\t// 得出每个日期的宽度\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tstyle.width = uni.$u.addUnit(dayWidth)\n\t\t\t\t\t// #endif\n\t\t\t\t\tstyle.height = uni.$u.addUnit(this.rowHeight)\n\t\t\t\t\tif (index2 === 0) {\n\t\t\t\t\t\t// 获取当前为星期几，如果为0，则为星期天，减一为每月第一天时，需要向左偏移的item个数\n\t\t\t\t\t\tweek = (week === 0 ? 7 : week) - 1\n\t\t\t\t\t\tstyle.marginLeft = uni.$u.addUnit(week * dayWidth)\n\t\t\t\t\t}\n\t\t\t\t\tif (this.mode === 'range') {\n\t\t\t\t\t\t// 之所以需要这么写，是因为DCloud公司的iOS客户端的开发者能力有限导致的bug\n\t\t\t\t\t\tstyle.paddingLeft = 0\n\t\t\t\t\t\tstyle.paddingRight = 0\n\t\t\t\t\t\tstyle.paddingBottom = 0\n\t\t\t\t\t\tstyle.paddingTop = 0\n\t\t\t\t\t}\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t},\n\t\t\tdaySelectStyle() {\n\t\t\t\treturn (index1, index2, item) => {\n\t\t\t\t\tlet date = dayjs(item.date).format(\"YYYY-MM-DD\"),\n\t\t\t\t\t\tstyle = {}\n\t\t\t\t\t// 判断date是否在selected数组中，因为月份可能会需要补0，所以使用dateSame判断，而不用数组的includes判断\n\t\t\t\t\tif (this.selected.some(item => this.dateSame(item, date))) {\n\t\t\t\t\t\tstyle.backgroundColor = this.color\n\t\t\t\t\t}\n\t\t\t\t\tif (this.mode === 'single') {\n\t\t\t\t\t\tif (date === this.selected[0]) {\n\t\t\t\t\t\t\t// 因为需要对nvue的兼容，只能这么写，无法缩写，也无法通过类名控制等等\n\t\t\t\t\t\t\tstyle.borderTopLeftRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderBottomLeftRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderTopRightRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderBottomRightRadius = '3px'\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this.mode === 'range') {\n\t\t\t\t\t\tif (this.selected.length >= 2) {\n\t\t\t\t\t\t\tconst len = this.selected.length - 1\n\t\t\t\t\t\t\t// 第一个日期设置左上角和左下角的圆角\n\t\t\t\t\t\t\tif (this.dateSame(date, this.selected[0])) {\n\t\t\t\t\t\t\t\tstyle.borderTopLeftRadius = '3px'\n\t\t\t\t\t\t\t\tstyle.borderBottomLeftRadius = '3px'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 最后一个日期设置右上角和右下角的圆角\n\t\t\t\t\t\t\tif (this.dateSame(date, this.selected[len])) {\n\t\t\t\t\t\t\t\tstyle.borderTopRightRadius = '3px'\n\t\t\t\t\t\t\t\tstyle.borderBottomRightRadius = '3px'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 处于第一和最后一个之间的日期，背景色设置为浅色，通过将对应颜色进行等分，再取其尾部的颜色值\n\t\t\t\t\t\t\tif (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this\n\t\t\t\t\t\t\t\t\t.selected[len]))) {\n\t\t\t\t\t\t\t\tstyle.backgroundColor = uni.$u.colorGradient(this.color, '#ffffff', 100)[90]\n\t\t\t\t\t\t\t\t// 增加一个透明度，让范围区间的背景色也能看到底部的mark水印字符\n\t\t\t\t\t\t\t\tstyle.opacity = 0.7\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (this.selected.length === 1) {\n\t\t\t\t\t\t\t// 之所以需要这么写，是因为DCloud公司的iOS客户端的开发者能力有限导致的bug\n\t\t\t\t\t\t\t// 进行还原操作，否则在nvue的iOS，uni-app有bug，会导致诡异的表现\n\t\t\t\t\t\t\tstyle.borderTopLeftRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderBottomLeftRadius = '3px'\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.selected.some(item => this.dateSame(item, date))) {\n\t\t\t\t\t\t\tstyle.borderTopLeftRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderBottomLeftRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderTopRightRadius = '3px'\n\t\t\t\t\t\t\tstyle.borderBottomRightRadius = '3px'\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 某个日期是否被选中\n\t\t\ttextStyle() {\n\t\t\t\treturn (item) => {\n\t\t\t\t\tconst date = dayjs(item.date).format(\"YYYY-MM-DD\"),\n\t\t\t\t\t\tstyle = {}\n\t\t\t\t\t// 选中的日期，提示文字设置白色\n\t\t\t\t\tif (this.selected.some(item => this.dateSame(item, date))) {\n\t\t\t\t\t\tstyle.color = '#ffffff'\n\t\t\t\t\t}\n\t\t\t\t\tif (this.mode === 'range') {\n\t\t\t\t\t\tconst len = this.selected.length - 1\n\t\t\t\t\t\t// 如果是范围选择模式，第一个和最后一个之间的日期，文字颜色设置为高亮的主题色\n\t\t\t\t\t\tif (dayjs(date).isAfter(dayjs(this.selected[0])) && dayjs(date).isBefore(dayjs(this\n\t\t\t\t\t\t\t\t.selected[len]))) {\n\t\t\t\t\t\t\tstyle.color = this.color\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 获取底部的提示文字\n\t\t\tgetBottomInfo() {\n\t\t\t\treturn (index1, index2, item) => {\n\t\t\t\t\tconst date = dayjs(item.date).format(\"YYYY-MM-DD\")\n\t\t\t\t\tconst bottomInfo = item.bottomInfo\n\t\t\t\t\t// 当为日期范围模式时，且选择的日期个数大于0时\n\t\t\t\t\tif (this.mode === 'range' && this.selected.length > 0) {\n\t\t\t\t\t\tif (this.selected.length === 1) {\n\t\t\t\t\t\t\t// 选择了一个日期时，如果当前日期为数组中的第一个日期，则显示底部文字为“开始”\n\t\t\t\t\t\t\tif (this.dateSame(date, this.selected[0])) return this.startText\n\t\t\t\t\t\t\telse return bottomInfo\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst len = this.selected.length - 1\n\t\t\t\t\t\t\t// 如果数组中的日期大于2个时，第一个和最后一个显示为开始和结束日期\n\t\t\t\t\t\t\tif (this.dateSame(date, this.selected[0]) && this.dateSame(date, this.selected[1]) &&\n\t\t\t\t\t\t\t\tlen === 1) {\n\t\t\t\t\t\t\t\t// 如果长度为2，且第一个等于第二个日期，则提示语放在同一个item中\n\t\t\t\t\t\t\t\treturn `${this.startText}/${this.endText}`\n\t\t\t\t\t\t\t} else if (this.dateSame(date, this.selected[0])) {\n\t\t\t\t\t\t\t\treturn this.startText\n\t\t\t\t\t\t\t} else if (this.dateSame(date, this.selected[len])) {\n\t\t\t\t\t\t\t\treturn this.endText\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn bottomInfo\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\treturn bottomInfo\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 初始化默认选中\n\t\t\t\tthis.$emit('monthSelected', this.selected)\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t// 这里需要另一个延时，因为获取宽度后，会进行月份数据渲染，只有渲染完成之后，才有真正的高度\n\t\t\t\t\t// 因为nvue下，$nextTick并不是100%可靠的\n\t\t\t\t\tuni.$u.sleep(10).then(() => {\n\t\t\t\t\t\tthis.getWrapperWidth()\n\t\t\t\t\t\tthis.getMonthRect()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 判断两个日期是否相等\n\t\t\tdateSame(date1, date2) {\n\t\t\t\treturn dayjs(date1).isSame(dayjs(date2))\n\t\t\t},\n\t\t\t// 获取月份数据区域的宽度，因为nvue不支持百分比，所以无法通过css设置每个日期item的宽度\n\t\t\tgetWrapperWidth() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tdom.getComponentRect(this.$refs['u-calendar-month-wrapper'], res => {\n\t\t\t\t\tthis.width = res.size.width\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect('.u-calendar-month-wrapper').then(size => {\n\t\t\t\t\tthis.width = size.width\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tgetMonthRect() {\n\t\t\t\t// 获取每个月份数据的尺寸，用于父组件在scroll-view滚动事件中，监听当前滚动到了第几个月份\n\t\t\t\tconst promiseAllArr = this.months.map((item, index) => this.getMonthRectByPromise(\n\t\t\t\t\t`u-calendar-month-${index}`))\n\t\t\t\t// 一次性返回\n\t\t\t\tPromise.all(promiseAllArr).then(\n\t\t\t\t\tsizes => {\n\t\t\t\t\t\tlet height = 1\n\t\t\t\t\t\tconst topArr = []\n\t\t\t\t\t\tfor (let i = 0; i < this.months.length; i++) {\n\t\t\t\t\t\t\t// 添加到months数组中，供scroll-view滚动事件中，判断当前滚动到哪个月份\n\t\t\t\t\t\t\ttopArr[i] = height\n\t\t\t\t\t\t\theight += sizes[i].height\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// 由于微信下，无法通过this.months[i].top的形式(引用类型)去修改父组件的month的top值，所以使用事件形式对外发出\n\t\t\t\t\t\tthis.$emit('updateMonthTop', topArr)\n\t\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取每个月份区域的尺寸\n\t\t\tgetMonthRectByPromise(el) {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t// $uGetRect为uView自带的节点查询简化方法，详见文档介绍：https://www.uviewui.com/js/getRect.html\n\t\t\t\t// 组件内部一般用this.$uGetRect，对外的为uni.$u.getRect，二者功能一致，名称不同\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tthis.$uGetRect(`.${el}`).then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下，使用dom模块查询元素高度\n\t\t\t\t// 返回一个promise，让调用此方法的主体能使用then回调\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(this.$refs[el][0], res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 点击某一个日期\n\t\t\tclickHandler(index1, index2, item) {\n\t\t\t\tif (this.readonly) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.item = item\n\t\t\t\tconst date = dayjs(item.date).format(\"YYYY-MM-DD\")\n\t\t\t\tif (item.disabled) return\n\t\t\t\t// 对上一次选择的日期数组进行深度克隆\n\t\t\t\tlet selected = uni.$u.deepClone(this.selected)\n\t\t\t\tif (this.mode === 'single') {\n\t\t\t\t\t// 单选情况下，让数组中的元素为当前点击的日期\n\t\t\t\t\tselected = [date]\n\t\t\t\t} else if (this.mode === 'multiple') {\n\t\t\t\t\tif (selected.some(item => this.dateSame(item, date))) {\n\t\t\t\t\t\t// 如果点击的日期已在数组中，则进行移除操作，也就是达到反选的效果\n\t\t\t\t\t\tconst itemIndex = selected.findIndex(item => item === date)\n\t\t\t\t\t\tselected.splice(itemIndex, 1)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// 如果点击的日期不在数组中，且已有的长度小于总可选长度时，则添加到数组中去\n\t\t\t\t\t\tif (selected.length < this.maxCount) selected.push(date)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// 选择区间形式\n\t\t\t\t\tif (selected.length === 0 || selected.length >= 2) {\n\t\t\t\t\t\t// 如果原来就为0或者大于2的长度，则当前点击的日期，就是开始日期\n\t\t\t\t\t\tselected = [date]\n\t\t\t\t\t} else if (selected.length === 1) {\n\t\t\t\t\t\t// 如果已经选择了开始日期\n\t\t\t\t\t\tconst existsDate = selected[0]\n\t\t\t\t\t\t// 如果当前选择的日期小于上一次选择的日期，则当前的日期定为开始日期\n\t\t\t\t\t\tif (dayjs(date).isBefore(existsDate)) {\n\t\t\t\t\t\t\tselected = [date]\n\t\t\t\t\t\t} else if (dayjs(date).isAfter(existsDate)) {\n\t\t\t\t\t\t\t// 当前日期减去最大可选的日期天数，如果大于起始时间，则进行提示\n\t\t\t\t\t\t\tif(dayjs(dayjs(date).subtract(this.maxRange, 'day')).isAfter(dayjs(selected[0])) && this.showRangePrompt) {\n\t\t\t\t\t\t\t\tif(this.rangePrompt) {\n\t\t\t\t\t\t\t\t\tuni.$u.toast(this.rangePrompt)\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tuni.$u.toast(`选择天数不能超过 ${this.maxRange} 天`)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 如果当前日期大于已有日期，将当前的添加到数组尾部\n\t\t\t\t\t\t\tselected.push(date)\n\t\t\t\t\t\t\tconst startDate = selected[0]\n\t\t\t\t\t\t\tconst endDate = selected[1]\n\t\t\t\t\t\t\tconst arr = []\n\t\t\t\t\t\t\tlet i = 0\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\t// 将开始和结束日期之间的日期添加到数组中\n\t\t\t\t\t\t\t\tarr.push(dayjs(startDate).add(i, 'day').format(\"YYYY-MM-DD\"))\n\t\t\t\t\t\t\t\ti++\n\t\t\t\t\t\t\t\t// 累加的日期小于结束日期时，继续下一次的循环\n\t\t\t\t\t\t\t} while (dayjs(startDate).add(i, 'day').isBefore(dayjs(endDate)))\n\t\t\t\t\t\t\t// 为了一次性修改数组，避免computed中多次触发，这里才用arr变量一次性赋值的方式，同时将最后一个日期添加近来\n\t\t\t\t\t\t\tarr.push(endDate)\n\t\t\t\t\t\t\tselected = arr\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// 选择区间时，只有一个日期的情况下，且不允许选择起止为同一天的话，不允许选择自己\n\t\t\t\t\t\t\tif (selected[0] === date && !this.allowSameDay) return\n\t\t\t\t\t\t\tselected.push(date)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.setSelected(selected)\n\t\t\t},\n\t\t\t// 设置默认日期\n\t\t\tsetDefaultDate() {\n\t\t\t\tif (!this.defaultDate) {\n\t\t\t\t\t// 如果没有设置默认日期，则将当天日期设置为默认选中的日期\n\t\t\t\t\tconst selected = [dayjs().format(\"YYYY-MM-DD\")]\n\t\t\t\t\treturn this.setSelected(selected, false)\n\t\t\t\t}\n\t\t\t\tlet defaultDate = []\n\t\t\t\tconst minDate = this.minDate || dayjs().format(\"YYYY-MM-DD\")\n\t\t\t\tconst maxDate = this.maxDate || dayjs(minDate).add(this.maxMonth - 1, 'month').format(\"YYYY-MM-DD\")\n\t\t\t\tif (this.mode === 'single') {\n\t\t\t\t\t// 单选模式，可以是字符串或数组，Date对象等\n\t\t\t\t\tif (!uni.$u.test.array(this.defaultDate)) {\n\t\t\t\t\t\tdefaultDate = [dayjs(this.defaultDate).format(\"YYYY-MM-DD\")]\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdefaultDate = [this.defaultDate[0]]\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// 如果为非数组，则不执行\n\t\t\t\t\tif (!uni.$u.test.array(this.defaultDate)) return\n\t\t\t\t\tdefaultDate = this.defaultDate\n\t\t\t\t}\n\t\t\t\t// 过滤用户传递的默认数组，取出只在可允许最大值与最小值之间的元素\n\t\t\t\tdefaultDate = defaultDate.filter(item => {\n\t\t\t\t\treturn dayjs(item).isAfter(dayjs(minDate).subtract(1, 'day')) && dayjs(item).isBefore(dayjs(\n\t\t\t\t\t\tmaxDate).add(1, 'day'))\n\t\t\t\t})\n\t\t\t\tthis.setSelected(defaultDate, false)\n\t\t\t},\n\t\t\tsetSelected(selected, event = true) {\n\t\t\t\tthis.selected = selected\n\t\t\t\tevent && this.$emit('monthSelected', this.selected)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-calendar-month-wrapper {\n\t\tmargin-top: 4px;\n\t}\n\n\t.u-calendar-month {\n\n\t\t&__title {\n\t\t\tfont-size: 14px;\n\t\t\tline-height: 42px;\n\t\t\theight: 42px;\n\t\t\tcolor: $u-main-color;\n\t\t\ttext-align: center;\n\t\t\tfont-weight: bold;\n\t\t}\n\n\t\t&__days {\n\t\t\tposition: relative;\n\t\t\t@include flex;\n\t\t\tflex-wrap: wrap;\n\n\t\t\t&__month-mark-wrapper {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\t@include flex;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\n\t\t\t\t&__text {\n\t\t\t\t\tfont-size: 155px;\n\t\t\t\t\tcolor: rgba(231, 232, 234, 0.83);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__day {\n\t\t\t\t@include flex;\n\t\t\t\tpadding: 2px;\n\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\t// vue下使用css进行宽度计算，因为某些安卓机会无法进行js获取父元素宽度进行计算得出，会有偏移\n\t\t\t\twidth: calc(100% / 7);\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\t/* #endif */\n\n\t\t\t\t&__select {\n\t\t\t\t\tflex: 1;\n\t\t\t\t\t@include flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\tposition: relative;\n\n\t\t\t\t\t&__dot {\n\t\t\t\t\t\twidth: 7px;\n\t\t\t\t\t\theight: 7px;\n\t\t\t\t\t\tborder-radius: 100px;\n\t\t\t\t\t\tbackground-color: $u-error;\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\ttop: 12px;\n\t\t\t\t\t\tright: 7px;\n\t\t\t\t\t}\n\n\t\t\t\t\t&__buttom-info {\n\t\t\t\t\t\tcolor: $u-content-color;\n\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tbottom: 5px;\n\t\t\t\t\t\tfont-size: 10px;\n\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\tleft: 0;\n\t\t\t\t\t\tright: 0;\n\n\t\t\t\t\t\t&--selected {\n\t\t\t\t\t\t\tcolor: #ffffff;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t&--disabled {\n\t\t\t\t\t\t\tcolor: #cacbcd;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t&__info {\n\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\tfont-size: 16px;\n\n\t\t\t\t\t\t&--selected {\n\t\t\t\t\t\t\tcolor: #ffffff;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t&--disabled {\n\t\t\t\t\t\t\tcolor: #cacbcd;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t&--selected {\n\t\t\t\t\t\tbackground-color: $u-primary;\n\t\t\t\t\t\t@include flex;\n\t\t\t\t\t\tjustify-content: center;\n\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\tflex: 1;\n\t\t\t\t\t\tborder-radius: 3px;\n\t\t\t\t\t}\n\n\t\t\t\t\t&--range-selected {\n\t\t\t\t\t\topacity: 0.3;\n\t\t\t\t\t\tborder-radius: 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t&--range-start-selected {\n\t\t\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t&--range-end-selected {\n\t\t\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-calendar/props.js",
    "content": "export default {\n    props: {\n        // 日历顶部标题\n        title: {\n            type: String,\n            default: uni.$u.props.calendar.title\n        },\n        // 是否显示标题\n        showTitle: {\n            type: Boolean,\n            default: uni.$u.props.calendar.showTitle\n        },\n        // 是否显示副标题\n        showSubtitle: {\n            type: Boolean,\n            default: uni.$u.props.calendar.showSubtitle\n        },\n        // 日期类型选择，single-选择单个日期，multiple-可以选择多个日期，range-选择日期范围\n        mode: {\n            type: String,\n            default: uni.$u.props.calendar.mode\n        },\n        // mode=range时，第一个日期底部的提示文字\n        startText: {\n            type: String,\n            default: uni.$u.props.calendar.startText\n        },\n        // mode=range时，最后一个日期底部的提示文字\n        endText: {\n            type: String,\n            default: uni.$u.props.calendar.endText\n        },\n        // 自定义列表\n        customList: {\n            type: Array,\n            default: uni.$u.props.calendar.customList\n        },\n        // 主题色，对底部按钮和选中日期有效\n        color: {\n            type: String,\n            default: uni.$u.props.calendar.color\n        },\n        // 最小的可选日期\n        minDate: {\n            type: [String, Number],\n            default: uni.$u.props.calendar.minDate\n        },\n        // 最大可选日期\n        maxDate: {\n            type: [String, Number],\n            default: uni.$u.props.calendar.maxDate\n        },\n        // 默认选中的日期，mode为multiple或range是必须为数组格式\n        defaultDate: {\n            type: [Array, String, Date, null],\n            default: uni.$u.props.calendar.defaultDate\n        },\n        // mode=multiple时，最多可选多少个日期\n        maxCount: {\n            type: [String, Number],\n            default: uni.$u.props.calendar.maxCount\n        },\n        // 日期行高\n        rowHeight: {\n            type: [String, Number],\n            default: uni.$u.props.calendar.rowHeight\n        },\n        // 日期格式化函数\n        formatter: {\n            type: [Function, null],\n            default: uni.$u.props.calendar.formatter\n        },\n        // 是否显示农历\n        showLunar: {\n            type: Boolean,\n            default: uni.$u.props.calendar.showLunar\n        },\n        // 是否显示月份背景色\n        showMark: {\n            type: Boolean,\n            default: uni.$u.props.calendar.showMark\n        },\n        // 确定按钮的文字\n        confirmText: {\n            type: String,\n            default: uni.$u.props.calendar.confirmText\n        },\n        // 确认按钮处于禁用状态时的文字\n        confirmDisabledText: {\n            type: String,\n            default: uni.$u.props.calendar.confirmDisabledText\n        },\n        // 是否显示日历弹窗\n        show: {\n            type: Boolean,\n            default: uni.$u.props.calendar.show\n        },\n        // 是否允许点击遮罩关闭日历\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.calendar.closeOnClickOverlay\n        },\n        // 是否为只读状态，只读状态下禁止选择日期\n        readonly: {\n            type: Boolean,\n            default: uni.$u.props.calendar.readonly\n        },\n        // \t是否展示确认按钮\n        showConfirm: {\n            type: Boolean,\n            default: uni.$u.props.calendar.showConfirm\n        },\n        // 日期区间最多可选天数，默认无限制，mode = range时有效\n        maxRange: {\n            type: [Number, String],\n            default: uni.$u.props.calendar.maxRange\n        },\n        // 范围选择超过最多可选天数时的提示文案，mode = range时有效\n        rangePrompt: {\n            type: String,\n            default: uni.$u.props.calendar.rangePrompt\n        },\n        // 范围选择超过最多可选天数时，是否展示提示文案，mode = range时有效\n        showRangePrompt: {\n            type: Boolean,\n            default: uni.$u.props.calendar.showRangePrompt\n        },\n        // 是否允许日期范围的起止时间为同一天，mode = range时有效\n        allowSameDay: {\n            type: Boolean,\n            default: uni.$u.props.calendar.allowSameDay\n        },\n\t\t// 圆角值\n\t\tround: {\n\t\t    type: [Boolean, String, Number],\n\t\t    default: uni.$u.props.calendar.round\n\t\t},\n\t\t// 最多展示月份数量\n\t\tmonthNum: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: 3\n\t\t}\t\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-calendar/u-calendar.vue",
    "content": "<template>\n\t<u-popup\n\t\t:show=\"show\"\n\t\tmode=\"bottom\"\n\t\tcloseable\n\t\t@close=\"close\"\n\t\t:round=\"round\"\n\t\t:closeOnClickOverlay=\"closeOnClickOverlay\"\n\t>\n\t\t<view class=\"u-calendar\">\n\t\t\t<uHeader\n\t\t\t\t:title=\"title\"\n\t\t\t\t:subtitle=\"subtitle\"\n\t\t\t\t:showSubtitle=\"showSubtitle\"\n\t\t\t\t:showTitle=\"showTitle\"\n\t\t\t></uHeader>\n\t\t\t<scroll-view\n\t\t\t\t:style=\"{\n                    height: $u.addUnit(listHeight)\n                }\"\n\t\t\t\tscroll-y\n\t\t\t\t@scroll=\"onScroll\"\n\t\t\t\t:scroll-top=\"scrollTop\"\n\t\t\t\t:scrollIntoView=\"scrollIntoView\"\n\t\t\t>\n\t\t\t\t<uMonth\n\t\t\t\t\t:color=\"color\"\n\t\t\t\t\t:rowHeight=\"rowHeight\"\n\t\t\t\t\t:showMark=\"showMark\"\n\t\t\t\t\t:months=\"months\"\n\t\t\t\t\t:mode=\"mode\"\n\t\t\t\t\t:maxCount=\"maxCount\"\n\t\t\t\t\t:startText=\"startText\"\n\t\t\t\t\t:endText=\"endText\"\n\t\t\t\t\t:defaultDate=\"defaultDate\"\n\t\t\t\t\t:minDate=\"innerMinDate\"\n\t\t\t\t\t:maxDate=\"innerMaxDate\"\n\t\t\t\t\t:maxMonth=\"monthNum\"\n\t\t\t\t\t:readonly=\"readonly\"\n\t\t\t\t\t:maxRange=\"maxRange\"\n\t\t\t\t\t:rangePrompt=\"rangePrompt\"\n\t\t\t\t\t:showRangePrompt=\"showRangePrompt\"\n\t\t\t\t\t:allowSameDay=\"allowSameDay\"\n\t\t\t\t\tref=\"month\"\n\t\t\t\t\t@monthSelected=\"monthSelected\"\n\t\t\t\t\t@updateMonthTop=\"updateMonthTop\"\n\t\t\t\t></uMonth>\n\t\t\t</scroll-view>\n\t\t\t<slot name=\"footer\" v-if=\"showConfirm\">\n\t\t\t\t<view class=\"u-calendar__confirm\">\n\t\t\t\t\t<u-button\n\t\t\t\t\t\tshape=\"circle\"\n\t\t\t\t\t\t:text=\"\n                            buttonDisabled ? confirmDisabledText : confirmText\n                        \"\n\t\t\t\t\t\t:color=\"color\"\n\t\t\t\t\t\t@click=\"confirm\"\n\t\t\t\t\t\t:disabled=\"buttonDisabled\"\n\t\t\t\t\t></u-button>\n\t\t\t\t</view>\n\t\t\t</slot>\n\t\t</view>\n\t</u-popup>\n</template>\n\n<script>\nimport uHeader from './header.vue'\nimport uMonth from './month.vue'\nimport props from './props.js'\nimport util from './util.js'\nimport dayjs from '../../libs/util/dayjs.js'\nimport Calendar from '../../libs/util/calendar.js'\n/**\n * Calendar 日历\n * @description  此组件用于单个选择日期，范围选择日期等，日历被包裹在底部弹起的容器中.\n * @tutorial https://www.uviewui.com/components/calendar.html\n *\n * @property {String}\t\t\t\ttitle\t\t\t\t标题内容 (默认 日期选择 )\n * @property {Boolean}\t\t\t\tshowTitle\t\t\t是否显示标题  (默认 true )\n * @property {Boolean}\t\t\t\tshowSubtitle\t\t是否显示副标题\t(默认 true )\n * @property {String}\t\t\t\tmode\t\t\t\t日期类型选择  single-选择单个日期，multiple-可以选择多个日期，range-选择日期范围 （ 默认 'single' )\n * @property {String}\t\t\t\tstartText\t\t\tmode=range时，第一个日期底部的提示文字  (默认 '开始' )\n * @property {String}\t\t\t\tendText\t\t\t\tmode=range时，最后一个日期底部的提示文字 (默认 '结束' )\n * @property {Array}\t\t\t\tcustomList\t\t\t自定义列表\n * @property {String}\t\t\t\tcolor\t\t\t\t主题色，对底部按钮和选中日期有效  (默认 ‘#3c9cff' )\n * @property {String | Number}\t\tminDate\t\t\t\t最小的可选日期\t (默认 0 )\n * @property {String | Number}\t\tmaxDate\t\t\t\t最大可选日期  (默认 0 )\n * @property {Array | String| Date}\tdefaultDate\t\t\t默认选中的日期，mode为multiple或range是必须为数组格式\n * @property {String | Number}\t\tmaxCount\t\t\tmode=multiple时，最多可选多少个日期  (默认 \tNumber.MAX_SAFE_INTEGER  )\n * @property {String | Number}\t\trowHeight\t\t\t日期行高 (默认 56 )\n * @property {Function}\t\t\t\tformatter\t\t\t日期格式化函数\n * @property {Boolean}\t\t\t\tshowLunar\t\t\t是否显示农历  (默认 false )\n * @property {Boolean}\t\t\t\tshowMark\t\t\t是否显示月份背景色 (默认 true )\n * @property {String}\t\t\t\tconfirmText\t\t\t确定按钮的文字 (默认 '确定' )\n * @property {String}\t\t\t\tconfirmDisabledText\t确认按钮处于禁用状态时的文字 (默认 '确定' )\n * @property {Boolean}\t\t\t\tshow\t\t\t\t是否显示日历弹窗 (默认 false )\n * @property {Boolean}\t\t\t\tcloseOnClickOverlay\t是否允许点击遮罩关闭日历 (默认 false )\n * @property {Boolean}\t\t\t\treadonly\t        是否为只读状态，只读状态下禁止选择日期 (默认 false )\n * @property {String | Number}\t\tmaxRange\t        日期区间最多可选天数，默认无限制，mode = range时有效\n * @property {String}\t\t\t\trangePrompt\t        范围选择超过最多可选天数时的提示文案，mode = range时有效\n * @property {Boolean}\t\t\t\tshowRangePrompt\t    范围选择超过最多可选天数时，是否展示提示文案，mode = range时有效 (默认 true )\n * @property {Boolean}\t\t\t\tallowSameDay\t    是否允许日期范围的起止时间为同一天，mode = range时有效 (默认 false )\n * @property {Number|String}\t    round\t\t\t\t圆角值，默认无圆角  (默认 0 )\n * @property {Number|String}\t    monthNum\t\t\t最多展示的月份数量  (默认 3 )\n *\n * @event {Function()} confirm \t\t点击确定按钮时触发\t\t选择日期相关的返回参数\n * @event {Function()} close \t\t日历关闭时触发\t\t\t可定义页面关闭时的回调事件\n * @example <u-calendar  :defaultDate=\"defaultDateMultiple\" :show=\"show\" mode=\"multiple\" @confirm=\"confirm\">\n\t</u-calendar>\n * */\nexport default {\n\tname: 'u-calendar',\n\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\tcomponents: {\n\t\tuHeader,\n\t\tuMonth\n\t},\n\tdata() {\n\t\treturn {\n\t\t\t// 需要显示的月份的数组\n\t\t\tmonths: [],\n\t\t\t// 在月份滚动区域中，当前视图中月份的index索引\n\t\t\tmonthIndex: 0,\n\t\t\t// 月份滚动区域的高度\n\t\t\tlistHeight: 0,\n\t\t\t// month组件中选择的日期数组\n\t\t\tselected: [],\n\t\t\tscrollIntoView: '',\n\t\t\tscrollTop:0,\n\t\t\t// 过滤处理方法\n\t\t\tinnerFormatter: (value) => value\n\t\t}\n\t},\n\twatch: {\n\t\tselectedChange: {\n\t\t\timmediate: true,\n\t\t\thandler(n) {\n\t\t\t\tthis.setMonth()\n\t\t\t}\n\t\t},\n\t\t// 打开弹窗时，设置月份数据\n\t\tshow: {\n\t\t\timmediate: true,\n\t\t\thandler(n) {\n\t\t\t\tthis.setMonth()\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\t// 由于maxDate和minDate可以为字符串(2021-10-10)，或者数值(时间戳)，但是dayjs如果接受字符串形式的时间戳会有问题，这里进行处理\n\t\tinnerMaxDate() {\n\t\t\treturn uni.$u.test.number(this.maxDate)\n\t\t\t\t? Number(this.maxDate)\n\t\t\t\t: this.maxDate\n\t\t},\n\t\tinnerMinDate() {\n\t\t\treturn uni.$u.test.number(this.minDate)\n\t\t\t\t? Number(this.minDate)\n\t\t\t\t: this.minDate\n\t\t},\n\t\t// 多个条件的变化，会引起选中日期的变化，这里统一管理监听\n\t\tselectedChange() {\n\t\t\treturn [this.innerMinDate, this.innerMaxDate, this.defaultDate]\n\t\t},\n\t\tsubtitle() {\n\t\t\t// 初始化时，this.months为空数组，所以需要特别判断处理\n\t\t\tif (this.months.length) {\n\t\t\t\treturn `${this.months[this.monthIndex].year}年${\n\t\t\t\t\tthis.months[this.monthIndex].month\n\t\t\t\t}月`\n\t\t\t} else {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\t\tbuttonDisabled() {\n\t\t\t// 如果为range类型，且选择的日期个数不足1个时，让底部的按钮出于disabled状态\n\t\t\tif (this.mode === 'range') {\n\t\t\t\tif (this.selected.length <= 1) {\n\t\t\t\t\treturn true\n\t\t\t\t} else {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.start = Date.now()\n\t\tthis.init()\n\t},\n\tmethods: {\n\t\t// 在微信小程序中，不支持将函数当做props参数，故只能通过ref形式调用\n\t\tsetFormatter(e) {\n\t\t\tthis.innerFormatter = e\n\t\t},\n\t\t// month组件内部选择日期后，通过事件通知给父组件\n\t\tmonthSelected(e) {\n\t\t\tthis.selected = e\n\t\t\tif (!this.showConfirm) {\n\t\t\t\t// 在不需要确认按钮的情况下，如果为单选，或者范围多选且已选长度大于2，则直接进行返还\n\t\t\t\tif (\n\t\t\t\t\tthis.mode === 'multiple' ||\n\t\t\t\t\tthis.mode === 'single' ||\n\t\t\t\t\t(this.mode === 'range' && this.selected.length >= 2)\n\t\t\t\t) {\n\t\t\t\t\tthis.$emit('confirm', this.selected)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinit() {\n\t\t\t// 校验maxDate，不能小于minDate\n\t\t\tif (\n\t\t\t\tthis.innerMaxDate &&\n\t\t\t\tthis.innerMinDate &&\n\t\t\t\tnew Date(this.innerMaxDate).getTime() < new Date(this.innerMinDate).getTime()\n\t\t\t) {\n\t\t\t\treturn uni.$u.error('maxDate不能小于minDate')\n\t\t\t}\n\t\t\t// 滚动区域的高度\n\t\t\tthis.listHeight = this.rowHeight * 5 + 30\n\t\t\tthis.setMonth()\n\t\t},\n\t\tclose() {\n\t\t\tthis.$emit('close')\n\t\t},\n\t\t// 点击确定按钮\n\t\tconfirm() {\n\t\t\tif (!this.buttonDisabled) {\n\t\t\t\tthis.$emit('confirm', this.selected)\n\t\t\t}\n\t\t},\n\t\t// 获得两个日期之间的月份数\n\t\tgetMonths(minDate, maxDate) {\n\t\t\tconst minYear = dayjs(minDate).year()\n\t\t\tconst minMonth = dayjs(minDate).month() + 1\n\t\t\tconst maxYear = dayjs(maxDate).year()\n\t\t\tconst maxMonth = dayjs(maxDate).month() + 1\n\t\t\treturn (maxYear - minYear) * 12 + (maxMonth - minMonth) + 1\n\t\t},\n\t\t// 设置月份数据\n\t\tsetMonth() {\n\t\t\t// 最小日期的毫秒数\n\t\t\tconst minDate = this.innerMinDate || dayjs().valueOf()\n\t\t\t// 如果没有指定最大日期，则往后推3个月\n\t\t\tconst maxDate =\n\t\t\t\tthis.innerMaxDate ||\n\t\t\t\tdayjs(minDate)\n\t\t\t\t\t.add(this.monthNum - 1, 'month')\n\t\t\t\t\t.valueOf()\n\t\t\t// 最大最小月份之间的共有多少个月份，\n\t\t\tconst months = uni.$u.range(\n\t\t\t\t1,\n\t\t\t\tthis.monthNum,\n\t\t\t\tthis.getMonths(minDate, maxDate)\n\t\t\t)\n\t\t\t// 先清空数组\n\t\t\tthis.months = []\n\t\t\tfor (let i = 0; i < months; i++) {\n\t\t\t\tthis.months.push({\n\t\t\t\t\tdate: new Array(\n\t\t\t\t\t\tdayjs(minDate).add(i, 'month').daysInMonth()\n\t\t\t\t\t)\n\t\t\t\t\t\t.fill(1)\n\t\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\t\t// 日期，取值1-31\n\t\t\t\t\t\t\tlet day = index + 1\n\t\t\t\t\t\t\t// 星期，0-6，0为周日\n\t\t\t\t\t\t\tconst week = dayjs(minDate)\n\t\t\t\t\t\t\t\t.add(i, 'month')\n\t\t\t\t\t\t\t\t.date(day)\n\t\t\t\t\t\t\t\t.day()\n\t\t\t\t\t\t\tconst date = dayjs(minDate)\n\t\t\t\t\t\t\t\t.add(i, 'month')\n\t\t\t\t\t\t\t\t.date(day)\n\t\t\t\t\t\t\t\t.format('YYYY-MM-DD')\n\t\t\t\t\t\t\tlet bottomInfo = ''\n\t\t\t\t\t\t\tif (this.showLunar) {\n\t\t\t\t\t\t\t\t// 将日期转为农历格式\n\t\t\t\t\t\t\t\tconst lunar = Calendar.solar2lunar(\n\t\t\t\t\t\t\t\t\tdayjs(date).year(),\n\t\t\t\t\t\t\t\t\tdayjs(date).month() + 1,\n\t\t\t\t\t\t\t\t\tdayjs(date).date()\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tbottomInfo = lunar.IDayCn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet config = {\n\t\t\t\t\t\t\t\tday,\n\t\t\t\t\t\t\t\tweek,\n\t\t\t\t\t\t\t\t// 小于最小允许的日期，或者大于最大的日期，则设置为disabled状态\n\t\t\t\t\t\t\t\tdisabled:\n\t\t\t\t\t\t\t\t\tdayjs(date).isBefore(\n\t\t\t\t\t\t\t\t\t\tdayjs(minDate).format('YYYY-MM-DD')\n\t\t\t\t\t\t\t\t\t) ||\n\t\t\t\t\t\t\t\t\tdayjs(date).isAfter(\n\t\t\t\t\t\t\t\t\t\tdayjs(maxDate).format('YYYY-MM-DD')\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t// 返回一个日期对象，供外部的formatter获取当前日期的年月日等信息，进行加工处理\n\t\t\t\t\t\t\t\tdate: new Date(date),\n\t\t\t\t\t\t\t\tbottomInfo,\n\t\t\t\t\t\t\t\tdot: false,\n\t\t\t\t\t\t\t\tmonth:\n\t\t\t\t\t\t\t\t\tdayjs(minDate).add(i, 'month').month() + 1\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst formatter =\n\t\t\t\t\t\t\t\tthis.formatter || this.innerFormatter\n\t\t\t\t\t\t\treturn formatter(config)\n\t\t\t\t\t\t}),\n\t\t\t\t\t// 当前所属的月份\n\t\t\t\t\tmonth: dayjs(minDate).add(i, 'month').month() + 1,\n\t\t\t\t\t// 当前年份\n\t\t\t\t\tyear: dayjs(minDate).add(i, 'month').year()\n\t\t\t\t})\n\t\t\t}\n\n\t\t},\n\t\t// 滚动到默认设置的月份\n\t\tscrollIntoDefaultMonth(selected) {\n\t\t\t// 查询默认日期在可选列表的下标\n\t\t\tconst _index = this.months.findIndex(({\n\t\t\t\t  year,\n\t\t\t\t  month\n\t\t\t  }) => {\n\t\t\t\tmonth = uni.$u.padZero(month)\n\t\t\t\treturn `${year}-${month}` === selected\n\t\t\t})\n\t\t\tif (_index !== -1) {\n\t\t\t\t// #ifndef MP-WEIXIN\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.scrollIntoView = `month-${_index}`\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\tthis.scrollTop = this.months[_index].top || 0;\n\t\t\t\t// #endif\n\t\t\t}\n\t\t},\n\t\t// scroll-view滚动监听\n\t\tonScroll(event) {\n\t\t\t// 不允许小于0的滚动值，如果scroll-view到顶了，继续下拉，会出现负数值\n\t\t\tconst scrollTop = Math.max(0, event.detail.scrollTop)\n\t\t\t// 将当前滚动条数值，除以滚动区域的高度，可以得出当前滚动到了哪一个月份的索引\n\t\t\tfor (let i = 0; i < this.months.length; i++) {\n\t\t\t\tif (scrollTop >= (this.months[i].top || this.listHeight)) {\n\t\t\t\t\tthis.monthIndex = i\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// 更新月份的top值\n\t\tupdateMonthTop(topArr = []) {\n\t\t\t// 设置对应月份的top值，用于onScroll方法更新月份\n\t\t\ttopArr.map((item, index) => {\n\t\t\t\tthis.months[index].top = item\n\t\t\t})\n\n\t\t\t// 获取默认日期的下标\n\t\t\tif (!this.defaultDate) {\n\t\t\t\t// 如果没有设置默认日期，则将当天日期设置为默认选中的日期\n\t\t\t\tconst selected = dayjs().format(\"YYYY-MM\")\n\t\t\t\tthis.scrollIntoDefaultMonth(selected)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet selected = dayjs().format(\"YYYY-MM\");\n\t\t\t// 单选模式，可以是字符串或数组，Date对象等\n\t\t\tif (!uni.$u.test.array(this.defaultDate)) {\n\t\t\t\tselected = dayjs(this.defaultDate).format(\"YYYY-MM\")\n\t\t\t} else {\n\t\t\t\tselected = dayjs(this.defaultDate[0]).format(\"YYYY-MM\");\n\t\t\t}\n\t\t\tthis.scrollIntoDefaultMonth(selected)\n\t\t}\n\t}\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../libs/css/components.scss';\n\n.u-calendar {\n\t&__confirm {\n\t\tpadding: 7px 18px;\n\t}\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-calendar/util.js",
    "content": "export default {\n    methods: {\n        // 设置月份数据\n        setMonth() {\n            // 月初是周几\n            const day = dayjs(this.date).date(1).day()\n            const start = day == 0 ? 6 : day - 1\n\n            // 本月天数\n            const days = dayjs(this.date).endOf('month').format('D')\n\n            // 上个月天数\n            const prevDays = dayjs(this.date).endOf('month').subtract(1, 'month').format('D')\n\n            // 日期数据\n            const arr = []\n            // 清空表格\n            this.month = []\n\n            // 添加上月数据\n            arr.push(\n                ...new Array(start).fill(1).map((e, i) => {\n                    const day = prevDays - start + i + 1\n\n                    return {\n                        value: day,\n                        disabled: true,\n                        date: dayjs(this.date).subtract(1, 'month').date(day).format('YYYY-MM-DD')\n                    }\n                })\n            )\n\n            // 添加本月数据\n            arr.push(\n                ...new Array(days - 0).fill(1).map((e, i) => {\n                    const day = i + 1\n\n                    return {\n                        value: day,\n                        date: dayjs(this.date).date(day).format('YYYY-MM-DD')\n                    }\n                })\n            )\n\n            // 添加下个月\n            arr.push(\n                ...new Array(42 - days - start).fill(1).map((e, i) => {\n                    const day = i + 1\n\n                    return {\n                        value: day,\n                        disabled: true,\n                        date: dayjs(this.date).add(1, 'month').date(day).format('YYYY-MM-DD')\n                    }\n                })\n            )\n\n            // 分割数组\n            for (let n = 0; n < arr.length; n += 7) {\n                this.month.push(\n                    arr.slice(n, n + 7).map((e, i) => {\n                        e.index = i + n\n\n                        // 自定义信息\n                        const custom = this.customList.find((c) => c.date == e.date)\n\n                        // 农历\n                        if (this.lunar) {\n                            const {\n                                IDayCn,\n                                IMonthCn\n                            } = this.getLunar(e.date)\n                            e.lunar = IDayCn == '初一' ? IMonthCn : IDayCn\n                        }\n\n                        return {\n                            ...e,\n                            ...custom\n                        }\n                    })\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-car-keyboard/props.js",
    "content": "export default {\n    props: {\n        // 是否打乱键盘按键的顺序\n        random: {\n            type: Boolean,\n            default: false\n        },\n        // 输入一个中文后，是否自动切换到英文\n        autoChange: {\n            type: Boolean,\n            default: false\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-keyboard\"\n\t\t@touchmove.stop.prevent=\"noop\"\n\t>\n\t\t<view\n\t\t\tv-for=\"(group, i) in abc ? engKeyBoardList : areaList\"\n\t\t\t:key=\"i\"\n\t\t\tclass=\"u-keyboard__button\"\n\t\t\t:index=\"i\"\n\t\t\t:class=\"[i + 1 === 4 && 'u-keyboard__button--center']\"\n\t\t>\n\t\t\t<view\n\t\t\t\tv-if=\"i === 3\"\n\t\t\t\tclass=\"u-keyboard__button__inner-wrapper\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-keyboard__button__inner-wrapper__left\"\n\t\t\t\t\thover-class=\"u-hover-class\"\n\t\t\t\t\t:hover-stay-time=\"200\"\n\t\t\t\t\t@tap=\"changeCarInputMode\"\n\t\t\t\t>\n\t\t\t\t\t<text\n\t\t\t\t\t\tclass=\"u-keyboard__button__inner-wrapper__left__lang\"\n\t\t\t\t\t\t:class=\"[!abc && 'u-keyboard__button__inner-wrapper__left__lang--active']\"\n\t\t\t\t\t>中</text>\n\t\t\t\t\t<text class=\"u-keyboard__button__inner-wrapper__left__line\">/</text>\n\t\t\t\t\t<text\n\t\t\t\t\t\tclass=\"u-keyboard__button__inner-wrapper__left__lang\"\n\t\t\t\t\t\t:class=\"[abc && 'u-keyboard__button__inner-wrapper__left__lang--active']\"\n\t\t\t\t\t>英</text>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t\tclass=\"u-keyboard__button__inner-wrapper\"\n\t\t\t\tv-for=\"(item, j) in group\"\n\t\t\t\t:key=\"j\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-keyboard__button__inner-wrapper__inner\"\n\t\t\t\t\t:hover-stay-time=\"200\"\n\t\t\t\t\t@tap=\"carInputClick(i, j)\"\n\t\t\t\t\thover-class=\"u-hover-class\"\n\t\t\t\t>\n\t\t\t\t\t<text class=\"u-keyboard__button__inner-wrapper__inner__text\">{{ item }}</text>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t\tv-if=\"i === 3\"\n\t\t\t\t@touchstart=\"backspaceClick\"\n\t\t\t\t@touchend=\"clearTimer\"\n\t\t\t\tclass=\"u-keyboard__button__inner-wrapper\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-keyboard__button__inner-wrapper__right\"\n\t\t\t\t\thover-class=\"u-hover-class\"\n\t\t\t\t\t:hover-stay-time=\"200\"\n\t\t\t\t>\n\t\t\t\t\t<u-icon\n\t\t\t\t\t\tsize=\"28\"\n\t\t\t\t\t\tname=\"backspace\"\n\t\t\t\t\t\tcolor=\"#303133\"\n\t\t\t\t\t></u-icon>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * keyboard 键盘组件\n\t * @description 此为uView自定义的键盘面板，内含了数字键盘，车牌号键，身份证号键盘3种模式，都有可以打乱按键顺序的选项。\n\t * @tutorial https://uviewui.com/components/keyboard.html\n\t * @property {Boolean} random 是否打乱键盘的顺序\n\t * @event {Function} change 点击键盘触发\n\t * @event {Function} backspace 点击退格键触发\n\t * @example <u-keyboard ref=\"uKeyboard\" mode=\"car\" v-model=\"show\"></u-keyboard>\n\t */\n\texport default {\n\t\tname: \"u-keyboard\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 车牌输入时，abc=true为输入车牌号码，bac=false为输入省份中文简称\n\t\t\t\tabc: false\n\t\t\t};\n\t\t},\n\t\tcomputed: {\n\t\t\tareaList() {\n\t\t\t\tlet data = [\n\t\t\t\t\t'京',\n\t\t\t\t\t'沪',\n\t\t\t\t\t'粤',\n\t\t\t\t\t'津',\n\t\t\t\t\t'冀',\n\t\t\t\t\t'豫',\n\t\t\t\t\t'云',\n\t\t\t\t\t'辽',\n\t\t\t\t\t'黑',\n\t\t\t\t\t'湘',\n\t\t\t\t\t'皖',\n\t\t\t\t\t'鲁',\n\t\t\t\t\t'苏',\n\t\t\t\t\t'浙',\n\t\t\t\t\t'赣',\n\t\t\t\t\t'鄂',\n\t\t\t\t\t'桂',\n\t\t\t\t\t'甘',\n\t\t\t\t\t'晋',\n\t\t\t\t\t'陕',\n\t\t\t\t\t'蒙',\n\t\t\t\t\t'吉',\n\t\t\t\t\t'闽',\n\t\t\t\t\t'贵',\n\t\t\t\t\t'渝',\n\t\t\t\t\t'川',\n\t\t\t\t\t'青',\n\t\t\t\t\t'琼',\n\t\t\t\t\t'宁',\n\t\t\t\t\t'挂',\n\t\t\t\t\t'藏',\n\t\t\t\t\t'港',\n\t\t\t\t\t'澳',\n\t\t\t\t\t'新',\n\t\t\t\t\t'使',\n\t\t\t\t\t'学'\n\t\t\t\t];\n\t\t\t\tlet tmp = [];\n\t\t\t\t// 打乱顺序\n\t\t\t\tif (this.random) data = uni.$u.randomArray(data);\n\t\t\t\t// 切割成二维数组\n\t\t\t\ttmp[0] = data.slice(0, 10);\n\t\t\t\ttmp[1] = data.slice(10, 20);\n\t\t\t\ttmp[2] = data.slice(20, 30);\n\t\t\t\ttmp[3] = data.slice(30, 36);\n\t\t\t\treturn tmp;\n\t\t\t},\n\t\t\tengKeyBoardList() {\n\t\t\t\tlet data = [\n\t\t\t\t\t1,\n\t\t\t\t\t2,\n\t\t\t\t\t3,\n\t\t\t\t\t4,\n\t\t\t\t\t5,\n\t\t\t\t\t6,\n\t\t\t\t\t7,\n\t\t\t\t\t8,\n\t\t\t\t\t9,\n\t\t\t\t\t0,\n\t\t\t\t\t'Q',\n\t\t\t\t\t'W',\n\t\t\t\t\t'E',\n\t\t\t\t\t'R',\n\t\t\t\t\t'T',\n\t\t\t\t\t'Y',\n\t\t\t\t\t'U',\n\t\t\t\t\t'I',\n\t\t\t\t\t'O',\n\t\t\t\t\t'P',\n\t\t\t\t\t'A',\n\t\t\t\t\t'S',\n\t\t\t\t\t'D',\n\t\t\t\t\t'F',\n\t\t\t\t\t'G',\n\t\t\t\t\t'H',\n\t\t\t\t\t'J',\n\t\t\t\t\t'K',\n\t\t\t\t\t'L',\n\t\t\t\t\t'Z',\n\t\t\t\t\t'X',\n\t\t\t\t\t'C',\n\t\t\t\t\t'V',\n\t\t\t\t\t'B',\n\t\t\t\t\t'N',\n\t\t\t\t\t'M'\n\t\t\t\t];\n\t\t\t\tlet tmp = [];\n\t\t\t\tif (this.random) data = uni.$u.randomArray(data);\n\t\t\t\ttmp[0] = data.slice(0, 10);\n\t\t\t\ttmp[1] = data.slice(10, 20);\n\t\t\t\ttmp[2] = data.slice(20, 30);\n\t\t\t\ttmp[3] = data.slice(30, 36);\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击键盘按钮\n\t\t\tcarInputClick(i, j) {\n\t\t\t\tlet value = '';\n\t\t\t\t// 不同模式，获取不同数组的值\n\t\t\t\tif (this.abc) value = this.engKeyBoardList[i][j];\n\t\t\t\telse value = this.areaList[i][j];\n\t\t\t\t// 如果允许自动切换，则将中文状态切换为英文\n\t\t\t\tif (!this.abc && this.autoChange) uni.$u.sleep(200).then(() => this.abc = true)\n\t\t\t\tthis.$emit('change', value);\n\t\t\t},\n\t\t\t// 修改汽车牌键盘的输入模式，中文|英文\n\t\t\tchangeCarInputMode() {\n\t\t\t\tthis.abc = !this.abc;\n\t\t\t},\n\t\t\t// 点击退格键\n\t\t\tbackspaceClick() {\n\t\t\t\tthis.$emit('backspace');\n\t\t\t\tclearInterval(this.timer); //再次清空定时器，防止重复注册定时器\n\t\t\t\tthis.timer = null;\n\t\t\t\tthis.timer = setInterval(() => {\n\t\t\t\t\tthis.$emit('backspace');\n\t\t\t\t}, 250);\n\t\t\t},\n\t\t\tclearTimer() {\n\t\t\t\tclearInterval(this.timer);\n\t\t\t\tthis.timer = null;\n\t\t\t},\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-car-keyboard-background-color: rgb(224, 228, 230) !default;\n\t$u-car-keyboard-padding:6px 0 6px !default;\n\t$u-car-keyboard-button-inner-width:64rpx !default;\n\t$u-car-keyboard-button-inner-background-color:#FFFFFF !default;\n\t$u-car-keyboard-button-height:80rpx !default;\n\t$u-car-keyboard-button-inner-box-shadow:0 1px 0px #999992 !default;\n\t$u-car-keyboard-button-border-radius:4px !default;\n\t$u-car-keyboard-button-inner-margin:8rpx 5rpx !default;\n\t$u-car-keyboard-button-text-font-size:16px !default;\n\t$u-car-keyboard-button-text-color:$u-main-color !default;\n\t$u-car-keyboard-center-inner-margin: 0 4rpx !default;\n\t$u-car-keyboard-special-button-width:134rpx !default;\n\t$u-car-keyboard-lang-font-size:16px !default;\n\t$u-car-keyboard-lang-color:$u-main-color !default;\n\t$u-car-keyboard-active-color:$u-primary !default;\n\t$u-car-keyboard-line-font-size:15px !default;\n\t$u-car-keyboard-line-color:$u-main-color !default;\n\t$u-car-keyboard-line-margin:0 1px !default;\n\t$u-car-keyboard-u-hover-class-background-color:#BBBCC6 !default;\n\n\t.u-keyboard {\n\t\t@include flex(column);\n\t\tjustify-content: space-around;\n\t\tbackground-color: $u-car-keyboard-background-color;\n\t\talign-items: stretch;\n\t\tpadding: $u-car-keyboard-padding;\n\n\t\t&__button {\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\tflex: 1;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\t/* #endif */\n\n\t\t\t&__inner-wrapper {\n\t\t\t\tbox-shadow: $u-car-keyboard-button-inner-box-shadow;\n\t\t\t\tmargin: $u-car-keyboard-button-inner-margin;\n\t\t\t\tborder-radius: $u-car-keyboard-button-border-radius;\n\n\t\t\t\t&__inner {\n\t\t\t\t\t@include flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\twidth: $u-car-keyboard-button-inner-width;\n\t\t\t\t\tbackground-color: $u-car-keyboard-button-inner-background-color;\n\t\t\t\t\theight: $u-car-keyboard-button-height;\n\t\t\t\t\tborder-radius: $u-car-keyboard-button-border-radius;\n\n\t\t\t\t\t&__text {\n\t\t\t\t\t\tfont-size: $u-car-keyboard-button-text-font-size;\n\t\t\t\t\t\tcolor: $u-car-keyboard-button-text-color;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&__left,\n\t\t\t\t&__right {\n\t\t\t\t\tborder-radius: $u-car-keyboard-button-border-radius;\n\t\t\t\t\twidth: $u-car-keyboard-special-button-width;\n\t\t\t\t\theight: $u-car-keyboard-button-height;\n\t\t\t\t\tbackground-color: $u-car-keyboard-u-hover-class-background-color;\n\t\t\t\t\t@include flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tbox-shadow: $u-car-keyboard-button-inner-box-shadow;\n\t\t\t\t}\n\n\t\t\t\t&__left {\n\t\t\t\t\t&__line {\n\t\t\t\t\t\tfont-size: $u-car-keyboard-line-font-size;\n\t\t\t\t\t\tcolor: $u-car-keyboard-line-color;\n\t\t\t\t\t\tmargin: $u-car-keyboard-line-margin;\n\t\t\t\t\t}\n\n\t\t\t\t\t&__lang {\n\t\t\t\t\t\tfont-size: $u-car-keyboard-lang-font-size;\n\t\t\t\t\t\tcolor: $u-car-keyboard-lang-color;\n\n\t\t\t\t\t\t&--active {\n\t\t\t\t\t\t\tcolor: $u-car-keyboard-active-color;\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\t}\n\n\t.u-hover-class {\n\t\tbackground-color: $u-car-keyboard-u-hover-class-background-color;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-cell/props.js",
    "content": "export default {\n    props: {\n        // 标题\n        title: {\n            type: [String, Number],\n            default: uni.$u.props.cell.title\n        },\n        // 标题下方的描述信息\n        label: {\n            type: [String, Number],\n            default: uni.$u.props.cell.label\n        },\n        // 右侧的内容\n        value: {\n            type: [String, Number],\n            default: uni.$u.props.cell.value\n        },\n        // 左侧图标名称，或者图片链接(本地文件建议使用绝对地址)\n        icon: {\n            type: String,\n            default: uni.$u.props.cell.icon\n        },\n        // 是否禁用cell\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.cell.disabled\n        },\n        // 是否显示下边框\n        border: {\n            type: Boolean,\n            default: uni.$u.props.cell.border\n        },\n        // 内容是否垂直居中(主要是针对右侧的value部分)\n        center: {\n            type: Boolean,\n            default: uni.$u.props.cell.center\n        },\n        // 点击后跳转的URL地址\n        url: {\n            type: String,\n            default: uni.$u.props.cell.url\n        },\n        // 链接跳转的方式，内部使用的是uView封装的route方法，可能会进行拦截操作\n        linkType: {\n            type: String,\n            default: uni.$u.props.cell.linkType\n        },\n        // 是否开启点击反馈(表现为点击时加上灰色背景)\n        clickable: {\n            type: Boolean,\n            default: uni.$u.props.cell.clickable\n        },\n        // 是否展示右侧箭头并开启点击反馈\n        isLink: {\n            type: Boolean,\n            default: uni.$u.props.cell.isLink\n        },\n        // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件)\n        required: {\n            type: Boolean,\n            default: uni.$u.props.cell.required\n        },\n        // 右侧的图标箭头\n        rightIcon: {\n            type: String,\n            default: uni.$u.props.cell.rightIcon\n        },\n        // 右侧箭头的方向，可选值为：left，up，down\n        arrowDirection: {\n            type: String,\n            default: uni.$u.props.cell.arrowDirection\n        },\n        // 左侧图标样式\n        iconStyle: {\n            type: [Object, String],\n            default: () => {\n\t\t\t\treturn uni.$u.props.cell.iconStyle\n\t\t\t}\n        },\n        // 右侧箭头图标的样式\n        rightIconStyle: {\n            type: [Object, String],\n            default: () => {\n\t\t\t\treturn uni.$u.props.cell.rightIconStyle\n\t\t\t}\n        },\n        // 标题的样式\n        titleStyle: {\n            type: [Object, String],\n\t\t\tdefault: () => {\n\t\t\t\treturn uni.$u.props.cell.titleStyle\n\t\t\t}\n        },\n        // 单位元的大小，可选值为large\n        size: {\n            type: String,\n            default: uni.$u.props.cell.size\n        },\n        // 点击cell是否阻止事件传播\n        stop: {\n            type: Boolean,\n            default: uni.$u.props.cell.stop\n        },\n        // 标识符，cell被点击时返回\n        name: {\n            type: [Number, String],\n            default: uni.$u.props.cell.name\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-cell/u-cell.vue",
    "content": "<template>\n\t<view class=\"u-cell\" :class=\"[customClass]\" :style=\"[$u.addStyle(customStyle)]\"\n\t\t:hover-class=\"(!disabled && (clickable || isLink)) ? 'u-cell--clickable' : ''\" :hover-stay-time=\"250\"\n\t\t@tap=\"clickHandler\">\n\t\t<view class=\"u-cell__body\" :class=\"[ center && 'u-cell--center', size === 'large' && 'u-cell__body--large']\">\n\t\t\t<view class=\"u-cell__body__content\">\n\t\t\t\t<view class=\"u-cell__left-icon-wrap\" v-if=\"$slots.icon || icon\">\n\t\t\t\t\t<slot name=\"icon\" v-if=\"$slots.icon\">\n\t\t\t\t\t</slot>\n\t\t\t\t\t<u-icon v-else :name=\"icon\" :custom-style=\"iconStyle\" :size=\"size === 'large' ? 22 : 18\"></u-icon>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"u-cell__title\">\n\t\t\t\t\t<slot name=\"title\">\n\t\t\t\t\t\t<text v-if=\"title\" class=\"u-cell__title-text\" :style=\"[titleTextStyle]\"\n\t\t\t\t\t\t\t:class=\"[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__title-text--large']\">{{ title }}</text>\n\t\t\t\t\t</slot>\n\t\t\t\t\t<slot name=\"label\">\n\t\t\t\t\t\t<text class=\"u-cell__label\" v-if=\"label\"\n\t\t\t\t\t\t\t:class=\"[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__label--large']\">{{ label }}</text>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<slot name=\"value\">\n\t\t\t\t<text class=\"u-cell__value\"\n\t\t\t\t\t:class=\"[disabled && 'u-cell--disabled', size === 'large' && 'u-cell__value--large']\"\n\t\t\t\t\tv-if=\"!$u.test.empty(value)\">{{ value }}</text>\n\t\t\t</slot>\n\t\t\t<view class=\"u-cell__right-icon-wrap\" v-if=\"$slots['right-icon'] || isLink\"\n\t\t\t\t:class=\"[`u-cell__right-icon-wrap--${arrowDirection}`]\">\n\t\t\t\t<slot name=\"right-icon\" v-if=\"$slots['right-icon']\">\n\t\t\t\t</slot>\n\t\t\t\t<u-icon v-else :name=\"rightIcon\" :custom-style=\"rightIconStyle\" :color=\"disabled ? '#c8c9cc' : 'info'\"\n\t\t\t\t\t:size=\"size === 'large' ? 18 : 16\"></u-icon>\n\t\t\t</view>\n\t\t</view>\n\t\t<u-line v-if=\"border\"></u-line>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * cell  单元格\n\t * @description cell单元格一般用于一组列表的情况，比如个人中心页，设置页等。\n\t * @tutorial https://uviewui.com/components/cell.html\n\t * @property {String | Number}\ttitle\t\t\t标题\n\t * @property {String | Number}\tlabel\t\t\t标题下方的描述信息\n\t * @property {String | Number}\tvalue\t\t\t右侧的内容\n\t * @property {String}\t\t\ticon\t\t\t左侧图标名称，或者图片链接(本地文件建议使用绝对地址)\n\t * @property {Boolean}\t\t\tdisabled\t\t是否禁用cell\t\n\t * @property {Boolean}\t\t\tborder\t\t\t是否显示下边框 (默认 true )\n\t * @property {Boolean}\t\t\tcenter\t\t\t内容是否垂直居中(主要是针对右侧的value部分) (默认 false )\n\t * @property {String}\t\t\turl\t\t\t\t点击后跳转的URL地址\n\t * @property {String}\t\t\tlinkType\t\t链接跳转的方式，内部使用的是uView封装的route方法，可能会进行拦截操作 (默认 'navigateTo' )\n\t * @property {Boolean}\t\t\tclickable\t\t是否开启点击反馈(表现为点击时加上灰色背景) （默认 false ） \n\t * @property {Boolean}\t\t\tisLink\t\t\t是否展示右侧箭头并开启点击反馈 （默认 false ）\n\t * @property {Boolean}\t\t\trequired\t\t是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) （默认 false ）\n\t * @property {String}\t\t\trightIcon\t\t右侧的图标箭头 （默认 'arrow-right'）\n\t * @property {String}\t\t\tarrowDirection\t右侧箭头的方向，可选值为：left，up，down\n\t * @property {Object | String}\t\t\trightIconStyle\t右侧箭头图标的样式\n\t * @property {Object | String}\t\t\ttitleStyle\t\t标题的样式\n\t * @property {Object | String}\t\t\ticonStyle\t\t左侧图标样式\n\t * @property {String}\t\t\tsize\t\t\t单位元的大小，可选值为 large，normal，mini \n\t * @property {Boolean}\t\t\tstop\t\t\t点击cell是否阻止事件传播 (默认 true )\n\t * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t * \n\t * @event {Function}\t\t\tclick\t\t\t点击cell列表时触发\n\t * @example 该组件需要搭配cell-group组件使用，见官方文档示例\n\t */\n\texport default {\n\t\tname: 'u-cell',\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tcomputed: {\n\t\t\ttitleTextStyle() {\n\t\t\t\treturn uni.$u.addStyle(this.titleStyle)\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击cell\n\t\t\tclickHandler(e) {\n\t\t\t\tif (this.disabled) return\n\t\t\t\tthis.$emit('click', {\n\t\t\t\t\tname: this.name\n\t\t\t\t})\n\t\t\t\t// 如果配置了url(此props参数通过mixin引入)参数，跳转页面\n\t\t\t\tthis.openPage()\n\t\t\t\t// 是否阻止事件传播\n\t\t\t\tthis.stop && this.preventEvent(e)\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t$u-cell-padding: 10px 15px !default;\n\t$u-cell-font-size: 15px !default;\n\t$u-cell-line-height: 24px !default;\n\t$u-cell-color: $u-main-color !default;\n\t$u-cell-icon-size: 16px !default;\n\t$u-cell-title-font-size: 15px !default;\n\t$u-cell-title-line-height: 22px !default;\n\t$u-cell-title-color: $u-main-color !default;\n\t$u-cell-label-font-size: 12px !default;\n\t$u-cell-label-color: $u-tips-color !default;\n\t$u-cell-label-line-height: 18px !default;\n\t$u-cell-value-font-size: 14px !default;\n\t$u-cell-value-color: $u-content-color !default;\n\t$u-cell-clickable-color: $u-bg-color !default;\n\t$u-cell-disabled-color: #c8c9cc !default;\n\t$u-cell-padding-top-large: 13px !default;\n\t$u-cell-padding-bottom-large: 13px !default;\n\t$u-cell-value-font-size-large: 15px !default;\n\t$u-cell-label-font-size-large: 14px !default;\n\t$u-cell-title-font-size-large: 16px !default;\n\t$u-cell-left-icon-wrap-margin-right: 4px !default;\n\t$u-cell-right-icon-wrap-margin-left: 4px !default;\n\t$u-cell-title-flex:1 !default;\n\t$u-cell-label-margin-top:5px !default;\n\n\n\t.u-cell {\n\t\t&__body {\n\t\t\t@include flex();\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tbox-sizing: border-box;\n\t\t\t/* #endif */\n\t\t\tpadding: $u-cell-padding;\n\t\t\tfont-size: $u-cell-font-size;\n\t\t\tcolor: $u-cell-color;\n\t\t\t// line-height: $u-cell-line-height;\n\t\t\talign-items: center;\n\n\t\t\t&__content {\n\t\t\t\t@include flex(row);\n\t\t\t\talign-items: center;\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t&--large {\n\t\t\t\tpadding-top: $u-cell-padding-top-large;\n\t\t\t\tpadding-bottom: $u-cell-padding-bottom-large;\n\t\t\t}\n\t\t}\n\n\t\t&__left-icon-wrap,\n\t\t&__right-icon-wrap {\n\t\t\t@include flex();\n\t\t\talign-items: center;\n\t\t\t// height: $u-cell-line-height;\n\t\t\tfont-size: $u-cell-icon-size;\n\t\t}\n\n\t\t&__left-icon-wrap {\n\t\t\tmargin-right: $u-cell-left-icon-wrap-margin-right;\n\t\t}\n\n\t\t&__right-icon-wrap {\n\t\t\tmargin-left: $u-cell-right-icon-wrap-margin-left;\n\t\t\ttransition: transform 0.3s;\n\n\t\t\t&--up {\n\t\t\t\ttransform: rotate(-90deg);\n\t\t\t}\n\n\t\t\t&--down {\n\t\t\t\ttransform: rotate(90deg);\n\t\t\t}\n\t\t}\n\n\t\t&__title {\n\t\t\tflex: $u-cell-title-flex;\n\n\t\t\t&-text {\n\t\t\t\tfont-size: $u-cell-title-font-size;\n\t\t\t\tline-height: $u-cell-title-line-height;\n\t\t\t\tcolor: $u-cell-title-color;\n\n\t\t\t\t&--large {\n\t\t\t\t\tfont-size: $u-cell-title-font-size-large;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t&__label {\n\t\t\tmargin-top: $u-cell-label-margin-top;\n\t\t\tfont-size: $u-cell-label-font-size;\n\t\t\tcolor: $u-cell-label-color;\n\t\t\tline-height: $u-cell-label-line-height;\n\n\t\t\t&--large {\n\t\t\t\tfont-size: $u-cell-label-font-size-large;\n\t\t\t}\n\t\t}\n\n\t\t&__value {\n\t\t\ttext-align: right;\n\t\t\tfont-size: $u-cell-value-font-size;\n\t\t\tline-height: $u-cell-line-height;\n\t\t\tcolor: $u-cell-value-color;\n\n\t\t\t&--large {\n\t\t\t\tfont-size: $u-cell-value-font-size-large;\n\t\t\t}\n\t\t}\n\n\t\t&--clickable {\n\t\t\tbackground-color: $u-cell-clickable-color;\n\t\t}\n\n\t\t&--disabled {\n\t\t\tcolor: $u-cell-disabled-color;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tcursor: not-allowed;\n\t\t\t/* #endif */\n\t\t}\n\n\t\t&--center {\n\t\t\talign-items: center;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-cell-group/props.js",
    "content": "export default {\n    props: {\n        // 分组标题\n        title: {\n            type: String,\n            default: uni.$u.props.cellGroup.title\n        },\n        // 是否显示外边框\n        border: {\n            type: Boolean,\n            default: uni.$u.props.cellGroup.border\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-cell-group/u-cell-group.vue",
    "content": "<template>\n    <view :style=\"[$u.addStyle(customStyle)]\" :class=\"[customClass]\" class=\"u-cell-group\">\n        <view v-if=\"title\" class=\"u-cell-group__title\">\n            <slot name=\"title\">\n\t\t\t\t<text class=\"u-cell-group__title__text\">{{ title }}</text>\n\t\t\t</slot>\n        </view>\n        <view class=\"u-cell-group__wrapper\">\n\t\t\t<u-line v-if=\"border\"></u-line>\n            <slot />\n        </view>\n    </view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * cellGroup  单元格\n\t * @description cell单元格一般用于一组列表的情况，比如个人中心页，设置页等。\n\t * @tutorial https://uviewui.com/components/cell.html\n\t * \n\t * @property {String}\ttitle\t\t分组标题\n\t * @property {Boolean}\tborder\t\t是否显示外边框 (默认 true )\n\t * @property {Object}\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @event {Function} click \t点击cell列表时触发\n\t * @example <u-cell-group title=\"设置喜好\">\n\t */\n\texport default {\n\t\tname: 'u-cell-group',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t\n\t$u-cell-group-title-padding: 16px 16px 8px !default;\n\t$u-cell-group-title-font-size: 15px !default;\n\t$u-cell-group-title-line-height: 16px !default;\n\t$u-cell-group-title-color: $u-main-color !default;\n\n    .u-cell-group {\n\t\tflex: 1;\n\t\t\n        &__title {\n            padding: $u-cell-group-title-padding;\n\n            &__text {\n                font-size: $u-cell-group-title-font-size;\n                line-height: $u-cell-group-title-line-height;\n                color: $u-cell-group-title-color;\n            }\n        }\n\t\t\n\t\t&__wrapper {\n\t\t\tposition: relative;\n\t\t}\n    }\n</style>\n\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-checkbox/props.js",
    "content": "export default {\n    props: {\n        // checkbox的名称\n        name: {\n            type: [String, Number, Boolean],\n            default: uni.$u.props.checkbox.name\n        },\n        // 形状，square为方形，circle为圆型\n        shape: {\n            type: String,\n            default: uni.$u.props.checkbox.shape\n        },\n        // 整体的大小\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.checkbox.size\n        },\n        // 是否默认选中\n        checked: {\n            type: Boolean,\n            default: uni.$u.props.checkbox.checked\n        },\n        // 是否禁用\n        disabled: {\n            type: [String, Boolean],\n            default: uni.$u.props.checkbox.disabled\n        },\n        // 选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值\n        activeColor: {\n            type: String,\n            default: uni.$u.props.checkbox.activeColor\n        },\n        // 未选中的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.checkbox.inactiveColor\n        },\n        // 图标的大小，单位px\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.checkbox.iconSize\n        },\n        // 图标颜色\n        iconColor: {\n            type: String,\n            default: uni.$u.props.checkbox.iconColor\n        },\n        // label提示文字，因为nvue下，直接slot进来的文字，由于特殊的结构，无法修改样式\n        label: {\n            type: [String, Number],\n            default: uni.$u.props.checkbox.label\n        },\n        // label的字体大小，px单位\n        labelSize: {\n            type: [String, Number],\n            default: uni.$u.props.checkbox.labelSize\n        },\n        // label的颜色\n        labelColor: {\n            type: String,\n            default: uni.$u.props.checkbox.labelColor\n        },\n        // 是否禁止点击提示语选中复选框\n        labelDisabled: {\n            type: [String, Boolean],\n            default: uni.$u.props.checkbox.labelDisabled\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-checkbox/u-checkbox.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-checkbox\"\n\t    :style=\"[checkboxStyle]\"\n\t    @tap.stop=\"wrapperClickHandler\"\n\t    :class=\"[`u-checkbox-label--${parentData.iconPlacement}`, parentData.borderBottom && parentData.placement === 'column' && 'u-border-bottom']\"\n\t>\n\t\t<view\n\t\t    class=\"u-checkbox__icon-wrap\"\n\t\t    @tap.stop=\"iconClickHandler\"\n\t\t    :class=\"iconClasses\"\n\t\t    :style=\"[iconWrapStyle]\"\n\t\t>\n\t\t\t<slot name=\"icon\">\n\t\t\t\t<u-icon\n\t\t\t\t    class=\"u-checkbox__icon-wrap__icon\"\n\t\t\t\t    name=\"checkbox-mark\"\n\t\t\t\t    :size=\"elIconSize\"\n\t\t\t\t    :color=\"elIconColor\"\n\t\t\t\t/>\n\t\t\t</slot>\n\t\t</view>\n\t\t<text\n\t\t    @tap.stop=\"labelClickHandler\"\n\t\t    :style=\"{\n\t\t\t\tcolor: elDisabled ? elInactiveColor : elLabelColor,\n\t\t\t\tfontSize: elLabelSize,\n\t\t\t\tlineHeight: elLabelSize\n\t\t\t}\"\n\t\t>{{label}}</text>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * checkbox  复选框\n\t * @description 复选框组件一般用于需要多个选择的场景，该组件功能完整，使用方便\n\t * @tutorial https://uviewui.com/components/checkbox.html\n\t * @property {String | Number | Boolean}\tname\t\t\tcheckbox组件的标示符\n\t * @property {String}\t\t\t\t\t\tshape\t\t\t形状，square为方形，circle为圆型\n\t * @property {String | Number}\t\t\t\tsize\t\t\t整体的大小\n\t * @property {Boolean}\t\t\t\t\t\tchecked\t\t\t是否默认选中\n\t * @property {String | Boolean}\t\t\t\tdisabled\t\t是否禁用\n\t * @property {String}\t\t\t\t\t\tactiveColor\t\t选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值\n\t * @property {String}\t\t\t\t\t\tinactiveColor\t未选中的颜色\n\t * @property {String | Number}\t\t\t\ticonSize\t\t图标的大小，单位px\n\t * @property {String}\t\t\t\t\t\ticonColor\t\t图标颜色\n\t * @property {String | Number}\t\t\t\tlabel\t\t\tlabel提示文字，因为nvue下，直接slot进来的文字，由于特殊的结构，无法修改样式\n\t * @property {String}\t\t\t\t\t\tlabelColor \t\tlabel的颜色\n\t * @property {String | Number}\t\t\t\tlabelSize\t\tlabel的字体大小，px单位\n\t * @property {String | Boolean}\t\t\t\tlabelDisabled\t是否禁止点击提示语选中复选框\n\t * @property {Object}\t\t\t\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t * \n\t * @event {Function}\tchange\t任一个checkbox状态发生变化时触发，回调为一个对象\n\t * @example <u-checkbox v-model=\"checked\" :disabled=\"false\">天涯</u-checkbox>\n\t */\n\texport default {\n\t\tname: \"u-checkbox\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisChecked: false,\n\t\t\t\t// 父组件的默认值，因为头条小程序不支持在computed中使用this.parent.shape的形式\n\t\t\t\t// 故只能使用如此方法\n\t\t\t\tparentData: {\n\t\t\t\t\ticonSize: 12,\n\t\t\t\t\tlabelDisabled: null,\n\t\t\t\t\tdisabled: null,\n\t\t\t\t\tshape: 'square',\n\t\t\t\t\tactiveColor: null,\n\t\t\t\t\tinactiveColor: null,\n\t\t\t\t\tsize: 18,\n\t\t\t\t\tvalue: null,\n\t\t\t\t\ticonColor: null,\n\t\t\t\t\tplacement: 'row',\n\t\t\t\t\tborderBottom: false,\n\t\t\t\t\ticonPlacement: 'left'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 是否禁用，如果父组件u-raios-group禁用的话，将会忽略子组件的配置\n\t\t\telDisabled() {\n\t\t\t\treturn this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;\n\t\t\t},\n\t\t\t// 是否禁用label点击\n\t\t\telLabelDisabled() {\n\t\t\t\treturn this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled :\n\t\t\t\t\tfalse;\n\t\t\t},\n\t\t\t// 组件尺寸，对应size的值，默认值为21px\n\t\t\telSize() {\n\t\t\t\treturn this.size ? this.size : (this.parentData.size ? this.parentData.size : 21);\n\t\t\t},\n\t\t\t// 组件的勾选图标的尺寸，默认12px\n\t\t\telIconSize() {\n\t\t\t\treturn this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 12);\n\t\t\t},\n\t\t\t// 组件选中激活时的颜色\n\t\t\telActiveColor() {\n\t\t\t\treturn this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : '#2979ff');\n\t\t\t},\n\t\t\t// 组件选未中激活时的颜色\n\t\t\telInactiveColor() {\n\t\t\t\treturn this.inactiveColor ? this.inactiveColor : (this.parentData.inactiveColor ? this.parentData.inactiveColor :\n\t\t\t\t\t'#c8c9cc');\n\t\t\t},\n\t\t\t// label的颜色\n\t\t\telLabelColor() {\n\t\t\t\treturn this.labelColor ? this.labelColor : (this.parentData.labelColor ? this.parentData.labelColor : '#606266')\n\t\t\t},\n\t\t\t// 组件的形状\n\t\t\telShape() {\n\t\t\t\treturn this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');\n\t\t\t},\n\t\t\t// label大小\n\t\t\telLabelSize() {\n\t\t\t\treturn uni.$u.addUnit(this.labelSize ? this.labelSize : (this.parentData.labelSize ? this.parentData.labelSize :\n\t\t\t\t\t'15'))\n\t\t\t},\n\t\t\telIconColor() {\n\t\t\t\tconst iconColor = this.iconColor ? this.iconColor : (this.parentData.iconColor ? this.parentData.iconColor :\n\t\t\t\t\t'#ffffff');\n\t\t\t\t// 图标的颜色\n\t\t\t\tif (this.elDisabled) {\n\t\t\t\t\t// disabled状态下，已勾选的checkbox图标改为elInactiveColor\n\t\t\t\t\treturn this.isChecked ? this.elInactiveColor : 'transparent'\n\t\t\t\t} else {\n\t\t\t\t\treturn this.isChecked ? iconColor : 'transparent'\n\t\t\t\t}\n\t\t\t},\n\t\t\ticonClasses() {\n\t\t\t\tlet classes = []\n\t\t\t\t// 组件的形状\n\t\t\t\tclasses.push('u-checkbox__icon-wrap--' + this.elShape)\n\t\t\t\tif (this.elDisabled) {\n\t\t\t\t\tclasses.push('u-checkbox__icon-wrap--disabled')\n\t\t\t\t}\n\t\t\t\tif (this.isChecked && this.elDisabled) {\n\t\t\t\t\tclasses.push('u-checkbox__icon-wrap--disabled--checked')\n\t\t\t\t}\n\t\t\t\t// 支付宝，头条小程序无法动态绑定一个数组类名，否则解析出来的结果会带有\",\"，而导致失效\n\t\t\t\t// #ifdef MP-ALIPAY || MP-TOUTIAO\n\t\t\t\tclasses = classes.join(' ')\n\t\t\t\t// #endif\n\t\t\t\treturn classes\n\t\t\t},\n\t\t\ticonWrapStyle() {\n\t\t\t\t// checkbox的整体样式\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.backgroundColor = this.isChecked && !this.elDisabled ? this.elActiveColor : '#ffffff'\n\t\t\t\tstyle.borderColor = this.isChecked && !this.elDisabled ? this.elActiveColor : this.elInactiveColor\n\t\t\t\tstyle.width = uni.$u.addUnit(this.elSize)\n\t\t\t\tstyle.height = uni.$u.addUnit(this.elSize)\n\t\t\t\t// 如果是图标在右边的话，移除它的右边距\n\t\t\t\tif (this.parentData.iconPlacement === 'right') {\n\t\t\t\t\tstyle.marginRight = 0\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tcheckboxStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (this.parentData.borderBottom && this.parentData.placement === 'row') {\n\t\t\t\t\tuni.$u.error('检测到您将borderBottom设置为true，需要同时将u-checkbox-group的placement设置为column才有效')\n\t\t\t\t}\n\t\t\t\t// 当父组件设置了显示下边框并且排列形式为纵向时，给内容和边框之间加上一定间隔\n\t\t\t\tif (this.parentData.borderBottom && this.parentData.placement === 'column') {\n\t\t\t\t\tstyle.paddingBottom = '8px'\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环引用\n\t\t\t\tthis.updateParentData()\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\tuni.$u.error('u-checkbox必须搭配u-checkbox-group组件使用')\n\t\t\t\t}\n\t\t\t\t// 设置初始化时，是否默认选中的状态，父组件u-checkbox-group的value可能是array，所以额外判断\n\t\t\t\tif (this.checked) {\n\t\t\t\t\tthis.isChecked = true\n\t\t\t\t} else if (uni.$u.test.array(this.parentData.value)) {\n\t\t\t\t\t// 查找数组是是否存在this.name元素值\n\t\t\t\t\tthis.isChecked = this.parentData.value.some(item => {\n\t\t\t\t\t\treturn item === this.name\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\tthis.getParentData('u-checkbox-group')\n\t\t\t},\n\t\t\t// 横向两端排列时，点击组件即可触发选中事件\n\t\t\twrapperClickHandler(e) {\n\t\t\t\tthis.parentData.iconPlacement === 'right' && this.iconClickHandler(e)\n\t\t\t},\n\t\t\t// 点击图标\n\t\t\ticonClickHandler(e) {\n\t\t\t\tthis.preventEvent(e)\n\t\t\t\t// 如果整体被禁用，不允许被点击\n\t\t\t\tif (!this.elDisabled) {\n\t\t\t\t\tthis.setRadioCheckedStatus()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 点击label\n\t\t\tlabelClickHandler(e) {\n\t\t\t\tthis.preventEvent(e)\n\t\t\t\t// 如果按钮整体被禁用或者label被禁用，则不允许点击文字修改状态\n\t\t\t\tif (!this.elLabelDisabled && !this.elDisabled) {\n\t\t\t\t\tthis.setRadioCheckedStatus()\n\t\t\t\t}\n\t\t\t},\n\t\t\temitEvent() {\n\t\t\t\tthis.$emit('change', this.isChecked)\n\t\t\t\t// 尝试调用u-form的验证方法，进行一定延迟，否则微信小程序更新可能会不及时\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tuni.$u.formValidate(this, 'change')\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 改变组件选中状态\n\t\t\t// 这里的改变的依据是，更改本组件的checked值为true，同时通过父组件遍历所有u-checkbox实例\n\t\t\t// 将本组件外的其他u-checkbox的checked都设置为false(都被取消选中状态)，因而只剩下一个为选中状态\n\t\t\tsetRadioCheckedStatus() {\n\t\t\t\t// 将本组件标记为与原来相反的状态\n\t\t\t\tthis.isChecked = !this.isChecked\n\t\t\t\tthis.emitEvent()\n\t\t\t\ttypeof this.parent.unCheckedOther === 'function' && this.parent.unCheckedOther(this)\n\t\t\t}\n\t\t},\n\t\twatch:{\n\t\t\tchecked(){\n\t\t\t\tthis.isChecked = this.checked\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-checkbox-icon-wrap-margin-right:6px !default;\n\t$u-checkbox-icon-wrap-font-size:6px !default;\n\t$u-checkbox-icon-wrap-border-width:1px !default;\n\t$u-checkbox-icon-wrap-border-color:#c8c9cc !default;\n\t$u-checkbox-icon-wrap-icon-line-height:0 !default;\n\t$u-checkbox-icon-wrap-circle-border-radius:100% !default;\n\t$u-checkbox-icon-wrap-square-border-radius:3px !default;\n\t$u-checkbox-icon-wrap-checked-color:#fff !default;\n\t$u-checkbox-icon-wrap-checked-background-color:red !default;\n\t$u-checkbox-icon-wrap-checked-border-color:#2979ff !default;\n\t$u-checkbox-icon-wrap-disabled-background-color:#ebedf0 !default;\n\t$u-checkbox-icon-wrap-disabled-checked-color:#c8c9cc !default;\n\t$u-checkbox-label-margin-left:5px !default;\n\t$u-checkbox-label-margin-right:12px !default;\n\t$u-checkbox-label-color:$u-content-color !default;\n\t$u-checkbox-label-font-size:15px !default;\n\t$u-checkbox-label-disabled-color:#c8c9cc !default;\n\n\t.u-checkbox {\n\t\t/* #ifndef APP-NVUE */\n\t\t@include flex(row);\n\t\t/* #endif */\n\t\toverflow: hidden;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\n\t\t&-label--left {\n\t\t\tflex-direction: row\n\t\t}\n\n\t\t&-label--right {\n\t\t\tflex-direction: row-reverse;\n\t\t\tjustify-content: space-between\n\t\t}\n\n\t\t&__icon-wrap {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tbox-sizing: border-box;\n\t\t\t// nvue下，border-color过渡有问题\n\t\t\ttransition-property: border-color, background-color, color;\n\t\t\ttransition-duration: 0.2s;\n\t\t\t/* #endif */\n\t\t\tcolor: $u-content-color;\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tcolor: transparent;\n\t\t\ttext-align: center;\n\t\t\tmargin-right: $u-checkbox-icon-wrap-margin-right;\n\n\t\t\tfont-size: $u-checkbox-icon-wrap-font-size;\n\t\t\tborder-width: $u-checkbox-icon-wrap-border-width;\n\t\t\tborder-color: $u-checkbox-icon-wrap-border-color;\n\t\t\tborder-style: solid;\n\n\t\t\t/* #ifdef MP-TOUTIAO */\n\t\t\t// 头条小程序兼容性问题，需要设置行高为0，否则图标偏下\n\t\t\t&__icon {\n\t\t\t\tline-height: $u-checkbox-icon-wrap-icon-line-height;\n\t\t\t}\n\n\t\t\t/* #endif */\n\n\t\t\t&--circle {\n\t\t\t\tborder-radius: $u-checkbox-icon-wrap-circle-border-radius;\n\t\t\t}\n\n\t\t\t&--square {\n\t\t\t\tborder-radius: $u-checkbox-icon-wrap-square-border-radius;\n\t\t\t}\n\n\t\t\t&--checked {\n\t\t\t\tcolor: $u-checkbox-icon-wrap-checked-color;\n\t\t\t\tbackground-color: $u-checkbox-icon-wrap-checked-background-color;\n\t\t\t\tborder-color: $u-checkbox-icon-wrap-checked-border-color;\n\t\t\t}\n\n\t\t\t&--disabled {\n\t\t\t\tbackground-color: $u-checkbox-icon-wrap-disabled-background-color !important;\n\t\t\t}\n\n\t\t\t&--disabled--checked {\n\t\t\t\tcolor: $u-checkbox-icon-wrap-disabled-checked-color !important;\n\t\t\t}\n\t\t}\n\n\t\t&__label {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tword-wrap: break-word;\n\t\t\t/* #endif */\n\t\t\tmargin-left: $u-checkbox-label-margin-left;\n\t\t\tmargin-right: $u-checkbox-label-margin-right;\n\t\t\tcolor: $u-checkbox-label-color;\n\t\t\tfont-size: $u-checkbox-label-font-size;\n\n\t\t\t&--disabled {\n\t\t\t\tcolor: $u-checkbox-label-disabled-color;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-checkbox-group/props.js",
    "content": "export default {\n    props: {\n        // 标识符\n        name: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.name\n        },\n        // 绑定的值\n        value: {\n            type: Array,\n            default: uni.$u.props.checkboxGroup.value\n        },\n        // 形状，circle-圆形，square-方形\n        shape: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.shape\n        },\n        // 是否禁用全部checkbox\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.checkboxGroup.disabled\n        },\n\n        // 选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值\n        activeColor: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.activeColor\n        },\n        // 未选中的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.inactiveColor\n        },\n\n        // 整个组件的尺寸，默认px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.checkboxGroup.size\n        },\n        // 布局方式，row-横向，column-纵向\n        placement: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.placement\n        },\n        // label的字体大小，px单位\n        labelSize: {\n            type: [String, Number],\n            default: uni.$u.props.checkboxGroup.labelSize\n        },\n        // label的字体颜色\n        labelColor: {\n            type: [String],\n            default: uni.$u.props.checkboxGroup.labelColor\n        },\n        // 是否禁止点击文本操作\n        labelDisabled: {\n            type: Boolean,\n            default: uni.$u.props.checkboxGroup.labelDisabled\n        },\n        // 图标颜色\n        iconColor: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.iconColor\n        },\n        // 图标的大小，单位px\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.checkboxGroup.iconSize\n        },\n        // 勾选图标的对齐方式，left-左边，right-右边\n        iconPlacement: {\n            type: String,\n            default: uni.$u.props.checkboxGroup.iconPlacement\n        },\n        // 竖向配列时，是否显示下划线\n        borderBottom: {\n            type: Boolean,\n            default: uni.$u.props.checkboxGroup.borderBottom\n        }\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-checkbox-group\"\n\t    :class=\"bemClass\"\n\t>\n\t\t<slot></slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * checkboxGroup 复选框组\n\t * @description 复选框组件一般用于需要多个选择的场景，该组件功能完整，使用方便\n\t * @tutorial https://www.uviewui.com/components/checkbox.html\n\t * @property {String}\t\t\tname\t\t\t标识符 \n\t * @property {Array}\t\t\tvalue\t\t\t绑定的值\n\t * @property {String}\t\t\tshape\t\t\t形状，circle-圆形，square-方形 （默认 'square' ）\n\t * @property {Boolean}\t\t\tdisabled\t\t是否禁用全部checkbox （默认 false ）\n\t * @property {String}\t\t\tactiveColor\t\t选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值 （默认 '#2979ff' ）\n\t * @property {String}\t\t\tinactiveColor\t未选中的颜色 （默认 '#c8c9cc' ）\n\t * @property {String | Number}\tsize\t\t\t整个组件的尺寸 单位px （默认 18 ）\n\t * @property {String}\t\t\tplacement\t\t布局方式，row-横向，column-纵向 （默认 'row' ）\n\t * @property {String | Number}\tlabelSize\t\tlabel的字体大小，px单位  （默认 14 ）\n\t * @property {String}\t\t\tlabelColor\t\tlabel的字体颜色 （默认 '#303133' ）\n\t * @property {Boolean}\t\t\tlabelDisabled\t是否禁止点击文本操作 (默认 false )\n\t * @property {String}\t\t\ticonColor\t\t图标颜色 （默认 '#ffffff' ）\n\t * @property {String | Number}\ticonSize\t\t图标的大小，单位px （默认 12 ）\n\t * @property {String}\t\t\ticonPlacement\t勾选图标的对齐方式，left-左边，right-右边  （默认 'left' ）\n\t * @property {Boolean}\t\t\tborderBottom\tplacement为row时，是否显示下边框 （默认 false ）\n\t * @event {Function}\tchange\t任一个checkbox状态发生变化时触发，回调为一个对象\n\t * @event {Function}\tinput\t修改通过v-model绑定的值时触发，回调为一个对象\n\t * @example <u-checkbox-group></u-checkbox-group>\n\t */\n\texport default {\n\t\tname: 'u-checkbox-group',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\t// 这里computed的变量，都是子组件u-checkbox需要用到的，由于头条小程序的兼容性差异，子组件无法实时监听父组件参数的变化\n\t\t\t// 所以需要手动通知子组件，这里返回一个parentData变量，供watch监听，在其中去通知每一个子组件重新从父组件(u-checkbox-group)\n\t\t\t// 拉取父组件新的变化后的参数\n\t\t\tparentData() {\n\t\t\t\treturn [this.value, this.disabled, this.inactiveColor, this.activeColor, this.size, this.labelDisabled, this.shape,\n\t\t\t\t\tthis.iconSize, this.borderBottom, this.placement\n\t\t\t\t]\n\t\t\t},\n\t\t\tbemClass() {\n\t\t\t\t// this.bem为一个computed变量，在mixin中\n\t\t\t\treturn this.bem('checkbox-group', ['placement'])\n\t\t\t},\n\t\t},\n\t\twatch: {\n\t\t\t// 当父组件需要子组件需要共享的参数发生了变化，手动通知子组件\n\t\t\tparentData() {\n\t\t\t\tif (this.children.length) {\n\t\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t\t// 判断子组件(u-checkbox)如果有init方法的话，就就执行(执行的结果是子组件重新从父组件拉取了最新的值)\n\t\t\t\t\t\ttypeof(child.init) === 'function' && child.init()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t},\n\t\tmethods: {\n\t\t\t// 将其他的checkbox设置为未选中的状态\n\t\t\tunCheckedOther(childInstance) {\n\t\t\t\tconst values = []\n\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t// 将被选中的checkbox，放到数组中返回\n\t\t\t\t\tif (child.isChecked) {\n\t\t\t\t\t\tvalues.push(child.name)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t// 发出事件\n\t\t\t\tthis.$emit('change', values)\n\t\t\t\t// 修改通过v-model绑定的值\n\t\t\t\tthis.$emit('input', values)\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-checkbox-group {\n\n\t\t&--row {\n\t\t\t@include flex;\n\t\t}\n\n\t\t&--column {\n\t\t\t@include flex(column);\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-circle-progress/props.js",
    "content": "export default {\n    props: {\n        percentage: {\n            type: [String, Number],\n            default: uni.$u.props.circleProgress.percentage\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue",
    "content": "<template>\n\t<view class=\"u-circle-progress\">\n\t\t<view class=\"u-circle-progress__left\">\n\t\t\t<view\n\t\t\t    class=\"u-circle-progress__left__circle\"\n\t\t\t    :style=\"[leftSyle]\"\n\t\t\t    ref=\"left-circle\"\n\t\t\t>\n\n\t\t\t</view>\n\t\t</view>\n\t\t<view\n\t\t    class=\"u-circle-progress__right\"\n\t\t>\n\t\t\t<view\n\t\t\t    class=\"u-circle-progress__right__circle\"\n\t\t\t    ref=\"right-circle\"\n\t\t\t\t:style=\"[rightSyle]\"\n\t\t\t>\n\n\t\t\t</view>\n\t\t</view>\n\t\t<view class=\"u-circle-progress__circle\">\n\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst animation = uni.requireNativePlugin('animation')\n\t// #endif\n\t/**\n\t * CircleProgress 圆形进度条 TODO: 待完善 \n\t * @description 展示操作或任务的当前进度，比如上传文件，是一个圆形的进度环。\n\t * @tutorial https://www.uviewui.com/components/circleProgress.html\n\t * @property {String | Number}\tpercentage\t圆环进度百分比值，为数值类型，0-100 (默认 30 )\n\t * @example\n\t */\n\texport default {\n\t\tname: 'u-circle-progress',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tleftBorderColor: 'rgb(200, 200, 200)',\n\t\t\t\trightBorderColor: 'rgb(200, 200, 200)',\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tleftSyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.borderTopColor = this.leftBorderColor\n\t\t\t\tstyle.borderRightColor = this.leftBorderColor\n\t\t\t\treturn style\n\t\t\t},\n\t\t\trightSyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.borderLeftColor = this.rightBorderColor\n\t\t\t\tstyle.borderBottomColor = this.rightBorderColor\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tuni.$u.sleep().then(() => {\n\t\t\t\tthis.rightBorderColor = 'rgb(66, 185, 131)'\n\t\t\t\t// this.init()\n\t\t\t})\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tanimation.transition(this.$refs['right-circle'].ref, {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\ttransform: 'rotate(45deg)',\n\t\t\t\t\t\ttransformOrigin: 'center center'\n\t\t\t\t\t},\n\t\t\t\t}, () => {\n\t\t\t\t\tthis.rightBorderColor = 'rgb(66, 185, 131)'\n\t\t\t\t\t// animation.transition(this.$refs['right-circle'].ref, {\n\t\t\t\t\t// \tstyles: {\n\t\t\t\t\t// \t\ttransform: 'rotate(225deg)',\n\t\t\t\t\t// \t\ttransformOrigin: 'center center'\n\t\t\t\t\t// \t},\n\t\t\t\t\t// \tduration: 3000,\n\t\t\t\t\t// }, () => {\n\t\t\t\t\t// \tanimation.transition(this.$refs['left-circle'].ref, {\n\t\t\t\t\t// \t\tstyles: {\n\t\t\t\t\t// \t\t\ttransform: 'rotate(45deg)',\n\t\t\t\t\t// \t\t\ttransformOrigin: 'center center'\n\t\t\t\t\t// \t\t},\n\t\t\t\t\t// \t}, () => {\n\t\t\t\t\t// \t\tthis.leftBorderColor = 'rgb(66, 185, 131)'\n\t\t\t\t\t// \t\tanimation.transition(this.$refs['left-circle'].ref, {\n\t\t\t\t\t// \t\t\tstyles: {\n\t\t\t\t\t// \t\t\t\ttransform: 'rotate(225deg)',\n\t\t\t\t\t// \t\t\t\ttransformOrigin: 'center center'\n\t\t\t\t\t// \t\t\t},\n\t\t\t\t\t// \t\t\tduration: 1500,\n\t\t\t\t\t// \t\t}, () => {\n\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\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-circle-progress {\n\t\t@include flex(row);\n\t\tposition: relative;\n\t\tborder-radius: 100px;\n\t\theight: 100px;\n\t\twidth: 100px;\n\t\t// transform: rotate(0deg);\n\t\t// background-color: rgb(66, 185, 131);\n\t\tbackground-color: rgb(200, 200, 200);\n\t\toverflow: hidden;\n\t\tjustify-content: space-between;\n\n\t\t&__circle {\n\t\t\tborder-radius: 100px;\n\t\t\theight: 90px;\n\t\t\twidth: 90px;\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\tbackground-color: rgb(255, 255, 255);\n\t\t\tleft: 50px;\n\t\t\ttop: 50px;\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&__left {\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\twidth: 50px;\n\t\t\theight: 100px;\n\t\t\toverflow: hidden;\n\t\t\tbox-sizing: border-box;\n\t\t\t// background-color: rgb(66, 185, 131);\n\t\t\t// background-color: rgb(200, 200, 200);\n\t\t\t// transform-origin: left center;\n\n\t\t\t&__circle {\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\t// background-color: red;\n\t\t\t\tborder-left-color: transparent;\n\t\t\t\tborder-bottom-color: transparent;\n\t\t\t\tborder-top-left-radius: 50px;\n\t\t\t\tborder-top-right-radius: 50px;\n\t\t\t\tborder-bottom-right-radius: 50px;\n\t\t\t\t// border-left-color: rgb(66, 185, 131);\n\t\t\t\t// border-bottom-color: rgb(66, 185, 131);\n\t\t\t\tborder-top-color: rgb(66, 185, 131);\n\t\t\t\tborder-right-color: rgb(66, 185, 131);\n\t\t\t\tborder-width: 5px;\n\t\t\t\twidth: 100px;\n\t\t\t\theight: 100px;\n\t\t\t\ttransform: rotate(225deg);\n\t\t\t\t// border-radius: 100px;\n\t\t\t}\n\t\t}\n\n\t\t&__right {\n\t\t\tposition: absolute;\n\t\t\tright: 0;\n\t\t\twidth: 50px;\n\t\t\theight: 100px;\n\t\t\toverflow: hidden;\n\n\t\t\t&__circle {\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 0;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\t// background-color: red;\n\t\t\t\tborder-top-color: transparent;\n\t\t\t\tborder-right-color: transparent;\n\t\t\t\tborder-top-left-radius: 50px;\n\t\t\t\tborder-bottom-left-radius: 50px;\n\t\t\t\tborder-bottom-right-radius: 50px;\n\t\t\t\t// border-left-color: rgb(66, 185, 131);\n\t\t\t\t// border-bottom-color: rgb(66, 185, 131);\n\t\t\t\tborder-left-color: rgb(200, 200, 200);\n\t\t\t\tborder-bottom-color: rgb(200, 200, 200);\n\t\t\t\tborder-width: 5px;\n\t\t\t\twidth: 100px;\n\t\t\t\theight: 100px;\n\t\t\t\ttransform: rotate(45deg);\n\t\t\t\ttransform-origin: center center;\n\t\t\t\t// border-radius: 100px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-code/props.js",
    "content": "export default {\n    props: {\n        // 倒计时总秒数\n        seconds: {\n            type: [String, Number],\n            default: uni.$u.props.code.seconds\n        },\n        // 尚未开始时提示\n        startText: {\n            type: String,\n            default: uni.$u.props.code.startText\n        },\n        // 正在倒计时中的提示\n        changeText: {\n            type: String,\n            default: uni.$u.props.code.changeText\n        },\n        // 倒计时结束时的提示\n        endText: {\n            type: String,\n            default: uni.$u.props.code.endText\n        },\n        // 是否在H5刷新或各端返回再进入时继续倒计时\n        keepRunning: {\n            type: Boolean,\n            default: uni.$u.props.code.keepRunning\n        },\n        // 为了区分多个页面，或者一个页面多个倒计时组件本地存储的继续倒计时变了\n        uniqueKey: {\n            type: String,\n            default: uni.$u.props.code.uniqueKey\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-code/u-code.vue",
    "content": "<template>\n\t<view class=\"u-code\">\n\t\t<!-- 此组件功能由js完成，无需写html逻辑 -->\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Code 验证码输入框\n\t * @description 考虑到用户实际发送验证码的场景，可能是一个按钮，也可能是一段文字，提示语各有不同，所以本组件 不提供界面显示，只提供提示语，由用户将提示语嵌入到具体的场景\n\t * @tutorial https://www.uviewui.com/components/code.html\n\t * @property {String | Number}\tseconds\t\t\t倒计时所需的秒数（默认 60 ）\n\t * @property {String}\t\t\tstartText\t\t开始前的提示语，见官网说明（默认 '获取验证码' ）\n\t * @property {String}\t\t\tchangeText\t\t倒计时期间的提示语，必须带有字母\"x\"，见官网说明（默认 'X秒重新获取' ）\n\t * @property {String}\t\t\tendText\t\t\t倒计结束的提示语，见官网说明（默认 '重新获取' ）\n\t * @property {Boolean}\t\t\tkeepRunning\t\t是否在H5刷新或各端返回再进入时继续倒计时（ 默认false ）\n\t * @property {String}\t\t\tuniqueKey\t\t为了区分多个页面，或者一个页面多个倒计时组件本地存储的继续倒计时变了\n\t *\n\t * @event {Function}\tchange\t倒计时期间，每秒触发一次\n\t * @event {Function}\tstart\t开始倒计时触发\n\t * @event {Function}\tend\t\t结束倒计时触发\n\t * @example <u-code ref=\"uCode\" @change=\"codeChange\" seconds=\"20\"></u-code>\n\t */\n\texport default {\n\t\tname: \"u-code\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tsecNum: this.seconds,\n\t\t\t\ttimer: null,\n\t\t\t\tcanGetCode: true, // 是否可以执行验证码操作\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.checkKeepRunning()\n\t\t},\n\t\twatch: {\n\t\t\tseconds: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(n) {\n\t\t\t\t\tthis.secNum = n\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tcheckKeepRunning() {\n\t\t\t\t// 获取上一次退出页面(H5还包括刷新)时的时间戳，如果没有上次的保存，此值可能为空\n\t\t\t\tlet lastTimestamp = Number(uni.getStorageSync(this.uniqueKey + '_$uCountDownTimestamp'))\n\t\t\t\tif(!lastTimestamp) return this.changeEvent(this.startText)\n\t\t\t\t// 当前秒的时间戳\n\t\t\t\tlet nowTimestamp = Math.floor((+ new Date()) / 1000)\n\t\t\t\t// 判断当前的时间戳，是否小于上一次的本该按设定结束，却提前结束的时间戳\n\t\t\t\tif(this.keepRunning && lastTimestamp && lastTimestamp > nowTimestamp) {\n\t\t\t\t\t// 剩余尚未执行完的倒计秒数\n\t\t\t\t\tthis.secNum = lastTimestamp - nowTimestamp\n\t\t\t\t\t// 清除本地保存的变量\n\t\t\t\t\tuni.removeStorageSync(this.uniqueKey + '_$uCountDownTimestamp')\n\t\t\t\t\t// 开始倒计时\n\t\t\t\t\tthis.start()\n\t\t\t\t} else {\n\t\t\t\t\t// 如果不存在需要继续上一次的倒计时，执行正常的逻辑\n\t\t\t\t\tthis.changeEvent(this.startText)\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 开始倒计时\n\t\t\tstart() {\n\t\t\t\t// 防止快速点击获取验证码的按钮而导致内部产生多个定时器导致混乱\n\t\t\t\tif(this.timer) {\n\t\t\t\t\tclearInterval(this.timer)\n\t\t\t\t\tthis.timer = null\n\t\t\t\t}\n\t\t\t\tthis.$emit('start')\n\t\t\t\tthis.canGetCode = false\n\t\t\t\t// 这里放这句，是为了一开始时就提示，否则要等setInterval的1秒后才会有提示\n\t\t\t\tthis.changeEvent(this.changeText.replace(/x|X/, this.secNum))\n\t\t\t\tthis.timer = setInterval(() => {\n\t\t\t\t\tif (--this.secNum) {\n\t\t\t\t\t\t// 用当前倒计时的秒数替换提示字符串中的\"x\"字母\n\t\t\t\t\t\tthis.changeEvent(this.changeText.replace(/x|X/, this.secNum))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclearInterval(this.timer)\n\t\t\t\t\t\tthis.timer = null\n\t\t\t\t\t\tthis.changeEvent(this.endText)\n\t\t\t\t\t\tthis.secNum = this.seconds\n\t\t\t\t\t\tthis.$emit('end')\n\t\t\t\t\t\tthis.canGetCode = true\n\t\t\t\t\t}\n\t\t\t\t}, 1000)\n        this.setTimeToStorage()\n      },\n\t\t\t// 重置，可以让用户再次获取验证码\n\t\t\treset() {\n\t\t\t\tthis.canGetCode = true\n\t\t\t\tclearInterval(this.timer)\n\t\t\t\tthis.secNum = this.seconds\n\t\t\t\tthis.changeEvent(this.endText)\n\t\t\t},\n\t\t\tchangeEvent(text) {\n\t\t\t\tthis.$emit('change', text)\n\t\t\t},\n\t\t\t// 保存时间戳，为了防止倒计时尚未结束，H5刷新或者各端的右上角返回上一页再进来\n\t\t\tsetTimeToStorage() {\n\t\t\t\tif(!this.keepRunning || !this.timer) return\n\t\t\t\t// 记录当前的时间戳，为了下次进入页面，如果还在倒计时内的话，继续倒计时\n\t\t\t\t// 倒计时尚未结束，结果大于0；倒计时已经开始，就会小于初始值，如果等于初始值，说明没有开始倒计时，无需处理\n\t\t\t\tif(this.secNum > 0 && this.secNum <= this.seconds) {\n\t\t\t\t\t// 获取当前时间戳(+ new Date()为特殊写法)，除以1000变成秒，再去除小数部分\n\t\t\t\t\tlet nowTimestamp = Math.floor((+ new Date()) / 1000)\n\t\t\t\t\t// 将本该结束时候的时间戳保存起来 => 当前时间戳 + 剩余的秒数\n\t\t\t\t\tuni.setStorage({\n\t\t\t\t\t\tkey: this.uniqueKey + '_$uCountDownTimestamp',\n\t\t\t\t\t\tdata: nowTimestamp + Number(this.secNum)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// 组件销毁的时候，清除定时器，否则定时器会继续存在，系统不会自动清除\n\t\tbeforeDestroy() {\n\t\t\tthis.setTimeToStorage()\n\t\t\tclearTimeout(this.timer)\n\t\t\tthis.timer = null\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-code-input/props.js",
    "content": "export default {\n    props: {\n\t\t// 键盘弹起时，是否自动上推页面\n\t\tadjustPosition: {\n\t\t\ttype: Boolean,\n            default: uni.$u.props.codeInput.adjustPosition\n\t\t},\n        // 最大输入长度\n        maxlength: {\n            type: [String, Number],\n            default: uni.$u.props.codeInput.maxlength\n        },\n        // 是否用圆点填充\n        dot: {\n            type: Boolean,\n            default: uni.$u.props.codeInput.dot\n        },\n        // 显示模式，box-盒子模式，line-底部横线模式\n        mode: {\n            type: String,\n            default: uni.$u.props.codeInput.mode\n        },\n        // 是否细边框\n        hairline: {\n            type: Boolean,\n            default: uni.$u.props.codeInput.hairline\n        },\n        // 字符间的距离\n        space: {\n            type: [String, Number],\n            default: uni.$u.props.codeInput.space\n        },\n        // 预置值\n        value: {\n            type: [String, Number],\n            default: uni.$u.props.codeInput.value\n        },\n        // 是否自动获取焦点\n        focus: {\n            type: Boolean,\n            default: uni.$u.props.codeInput.focus\n        },\n        // 字体是否加粗\n        bold: {\n            type: Boolean,\n            default: uni.$u.props.codeInput.bold\n        },\n        // 字体颜色\n        color: {\n            type: String,\n            default: uni.$u.props.codeInput.color\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.codeInput.fontSize\n        },\n        // 输入框的大小，宽等于高\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.codeInput.size\n        },\n        // 是否隐藏原生键盘，如果想用自定义键盘的话，需设置此参数为true\n        disabledKeyboard: {\n            type: Boolean,\n            default: uni.$u.props.codeInput.disabledKeyboard\n        },\n        // 边框和线条颜色\n        borderColor: {\n            type: String,\n            default: uni.$u.props.codeInput.borderColor\n        },\n\t\t// 是否禁止输入\".\"符号\n\t\tdisabledDot: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.codeInput.disabledDot\n\t\t}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-code-input/u-code-input.vue",
    "content": "<template>\n\t<view class=\"u-code-input\">\n\t\t<view\n\t\t\tclass=\"u-code-input__item\"\n\t\t\t:style=\"[itemStyle(index)]\"\n\t\t\tv-for=\"(item, index) in codeLength\"\n\t\t\t:key=\"index\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-code-input__item__dot\"\n\t\t\t\tv-if=\"dot && codeArray.length > index\"\n\t\t\t></view>\n\t\t\t<text\n\t\t\t\tv-else\n\t\t\t\t:style=\"{\n\t\t\t\t\tfontSize: $u.addUnit(fontSize),\n\t\t\t\t\tfontWeight: bold ? 'bold' : 'normal',\n\t\t\t\t\tcolor: color\n\t\t\t\t}\"\n\t\t\t>{{codeArray[index]}}</text>\n\t\t\t<view\n\t\t\t\tclass=\"u-code-input__item__line\"\n\t\t\t\tv-if=\"mode === 'line'\"\n\t\t\t\t:style=\"[lineStyle]\"\n\t\t\t></view>\n\t\t\t<!-- #ifndef APP-PLUS -->\n\t\t\t<view v-if=\"isFocus && codeArray.length === index\" :style=\"{backgroundColor: color}\" class=\"u-code-input__item__cursor\"></view>\n\t\t\t<!-- #endif -->\n\t\t</view>\n\t\t<input\n\t\t\t:disabled=\"disabledKeyboard\"\n\t\t\ttype=\"number\"\n\t\t\t:focus=\"focus\"\n\t\t\t:value=\"inputValue\"\n\t\t\t:maxlength=\"maxlength\"\n\t\t\t:adjustPosition=\"adjustPosition\"\n\t\t\tclass=\"u-code-input__input\"\n\t\t\t@input=\"inputHandler\"\n\t\t\t:style=\"{\n\t\t\t\theight: $u.addUnit(size) \n\t\t\t}\"\n\t\t\t@focus=\"isFocus = true\"\n\t\t\t@blur=\"isFocus = false\"\n\t\t/>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * CodeInput 验证码输入\n\t * @description 该组件一般用于验证用户短信验证码的场景，也可以结合uView的键盘组件使用\n\t * @tutorial https://www.uviewui.com/components/codeInput.html\n\t * @property {String | Number}\tmaxlength\t\t\t最大输入长度 （默认 6 ）\n\t * @property {Boolean}\t\t\tdot\t\t\t\t\t是否用圆点填充 （默认 false ）\n\t * @property {String}\t\t\tmode\t\t\t\t显示模式，box-盒子模式，line-底部横线模式 （默认 'box' ）\n\t * @property {Boolean}\t\t\thairline\t\t\t是否细边框 （默认 false ）\n\t * @property {String | Number}\tspace\t\t\t\t字符间的距离 （默认 10 ）\n\t * @property {String | Number}\tvalue\t\t\t\t预置值\n\t * @property {Boolean}\t\t\tfocus\t\t\t\t是否自动获取焦点 （默认 false ）\n\t * @property {Boolean}\t\t\tbold\t\t\t\t字体和输入横线是否加粗 （默认 false ）\n\t * @property {String}\t\t\tcolor\t\t\t\t字体颜色 （默认 '#606266' ）\n\t * @property {String | Number}\tfontSize\t\t\t字体大小，单位px （默认 18 ）\n\t * @property {String | Number}\tsize\t\t\t\t输入框的大小，宽等于高 （默认 35 ）\n\t * @property {Boolean}\t\t\tdisabledKeyboard\t是否隐藏原生键盘，如果想用自定义键盘的话，需设置此参数为true （默认 false ）\n\t * @property {String}\t\t\tborderColor\t\t\t边框和线条颜色 （默认 '#c9cacc' ）\n\t * @property {Boolean}\t\t\tdisabledDot\t\t\t是否禁止输入\".\"符号 （默认 true ）\n\t * \n\t * @event {Function}\tchange\t输入内容发生改变时触发，具体见上方说明\t\t\tvalue：当前输入的值\n\t * @event {Function}\tfinish\t输入字符个数达maxlength值时触发，见上方说明\tvalue：当前输入的值\n\t * @example\t<u-code-input v-model=\"value4\" :focus=\"true\"></u-code-input>\n\t */\n\texport default {\n\t\tname: 'u-code-input',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tinputValue: '',\n\t\t\t\tisFocus: this.focus\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tvalue: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(val) {\n\t\t\t\t\t// 转为字符串，超出部分截掉\n\t\t\t\t\tthis.inputValue = String(val).substring(0, this.maxlength)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tcomputed: {\n\t\t\t// 根据长度，循环输入框的个数，因为头条小程序数值不能用于v-for\n\t\t\tcodeLength() {\n\t\t\t\treturn new Array(Number(this.maxlength))\n\t\t\t},\n\t\t\t// 循环item的样式\n\t\t\titemStyle() {\n\t\t\t\treturn index => {\n\t\t\t\t\tconst addUnit = uni.$u.addUnit\n\t\t\t\t\tconst style = {\n\t\t\t\t\t\twidth: addUnit(this.size),\n\t\t\t\t\t\theight: addUnit(this.size)\n\t\t\t\t\t}\n\t\t\t\t\t// 盒子模式下，需要额外进行处理\n\t\t\t\t\tif (this.mode === 'box') {\n\t\t\t\t\t\t// 设置盒子的边框，如果是细边框，则设置为0.5px宽度\n\t\t\t\t\t\tstyle.border = `${this.hairline ? 0.5 : 1}px solid ${this.borderColor}`\n\t\t\t\t\t\t// 如果盒子间距为0的话\n\t\t\t\t\t\tif (uni.$u.getPx(this.space) === 0) {\n\t\t\t\t\t\t\t// 给第一和最后一个盒子设置圆角\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tstyle.borderTopLeftRadius = '3px'\n\t\t\t\t\t\t\t\tstyle.borderBottomLeftRadius = '3px'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (index === this.codeLength.length - 1) {\n\t\t\t\t\t\t\t\tstyle.borderTopRightRadius = '3px'\n\t\t\t\t\t\t\t\tstyle.borderBottomRightRadius = '3px'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 最后一个盒子的右边框需要保留\n\t\t\t\t\t\t\tif (index !== this.codeLength.length - 1) {\n\t\t\t\t\t\t\t\tstyle.borderRight = 'none'\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\tif (index !== this.codeLength.length - 1) {\n\t\t\t\t\t\t// 设置验证码字符之间的距离，通过margin-right设置，最后一个字符，无需右边框\n\t\t\t\t\t\tstyle.marginRight = addUnit(this.space)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// 最后一个盒子的有边框需要保留\n\t\t\t\t\t\tstyle.marginRight = 0\n\t\t\t\t\t}\n\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 将输入的值，转为数组，给item历遍时，根据当前的索引显示数组的元素\n\t\t\tcodeArray() {\n\t\t\t\treturn String(this.inputValue).split('')\n\t\t\t},\n\t\t\t// 下划线模式下，横线的样式\n\t\t\tlineStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.height = this.hairline ? '2px' : '4px'\n\t\t\t\tstyle.width = uni.$u.addUnit(this.size)\n\t\t\t\t// 线条模式下，背景色即为边框颜色\n\t\t\t\tstyle.backgroundColor = this.borderColor\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 监听输入框的值发生变化\n\t\t\tinputHandler(e) {\n\t\t\t\tconst value = e.detail.value\n\t\t\t\tthis.inputValue = value\n\t\t\t\t// 是否允许输入“.”符号\n\t\t\t\tif(this.disabledDot) {\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.inputValue = value.replace('.', '')\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// 未达到maxlength之前，发送change事件，达到后发送finish事件\n\t\t\t\tthis.$emit('change', value)\n\t\t\t\t// 修改通过v-model双向绑定的值\n\t\t\t\tthis.$emit('input', value)\n\t\t\t\t// 达到用户指定输入长度时，发出完成事件\n\t\t\t\tif (String(value).length >= Number(this.maxlength)) {\n\t\t\t\t\tthis.$emit('finish', value)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-code-input-cursor-width: 1px;\n\t$u-code-input-cursor-height: 40%;\n\t$u-code-input-cursor-animation-duration: 1s;\n\t$u-code-input-cursor-animation-name: u-cursor-flicker;\n\n\t.u-code-input {\n\t\t@include flex;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\n\t\t&__item {\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tposition: relative;\n\n\t\t\t&__text {\n\t\t\t\tfont-size: 15px;\n\t\t\t\tcolor: $u-content-color;\n\t\t\t}\n\n\t\t\t&__dot {\n\t\t\t\twidth: 7px;\n\t\t\t\theight: 7px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t\tbackground-color: $u-content-color;\n\t\t\t}\n\n\t\t\t&__line {\n\t\t\t\tposition: absolute;\n\t\t\t\tbottom: 0;\n\t\t\t\theight: 4px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t\twidth: 40px;\n\t\t\t\tbackground-color: $u-content-color;\n\t\t\t}\n\t\t\t/* #ifndef APP-PLUS */\n\t\t\t&__cursor {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translate(-50%,-50%);\n\t\t\t\twidth: $u-code-input-cursor-width;\n\t\t\t\theight: $u-code-input-cursor-height;\n\t\t\t\tanimation: $u-code-input-cursor-animation-duration u-cursor-flicker infinite;\n\t\t\t}\n\t\t\t/* #endif */\n\t\t\t\n\t\t}\n\n\t\t&__input {\n\t\t\t// 之所以需要input输入框，是因为有它才能唤起键盘\n\t\t\t// 这里将它设置为两倍的屏幕宽度，再将左边的一半移出屏幕，为了不让用户看到输入的内容\n\t\t\tposition: absolute;\n\t\t\tleft: -750rpx;\n\t\t\twidth: 1500rpx;\n\t\t\ttop: 0;\n\t\t\tbackground-color: transparent;\n\t\t\ttext-align: left;\n\t\t}\n\t}\n\t\n\t/* #ifndef APP-PLUS */\n\t@keyframes u-cursor-flicker {\n\t\t0% {\n\t\t    opacity: 0;\n\t\t}\n\t\t50% {\n\t\t    opacity: 1;\n\t\t}\n\t\t100% {\n\t\t    opacity: 0;\n\t\t}\n\t}\n\t/* #endif */\n\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-col/props.js",
    "content": "export default {\n    props: {\n        // 占父容器宽度的多少等分，总分为12份\n        span: {\n            type: [String, Number],\n            default: uni.$u.props.col.span\n        },\n        // 指定栅格左侧的间隔数(总12栏)\n        offset: {\n            type: [String, Number],\n            default: uni.$u.props.col.offset\n        },\n        // 水平排列方式，可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)\n        justify: {\n            type: String,\n            default: uni.$u.props.col.justify\n        },\n        // 垂直对齐方式，可选值为top、center、bottom、stretch\n        align: {\n            type: String,\n            default: uni.$u.props.col.align\n        },\n        // 文字对齐方式\n        textAlign: {\n            type: String,\n            default: uni.$u.props.col.textAlign\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-col/u-col.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-col\"\n\t\tref=\"u-col\"\n\t    :class=\"[\n\t\t\t'u-col-' + span\n\t\t]\"\n\t    :style=\"[colStyle]\"\n\t    @tap=\"clickHandler\"\n\t>\n\t\t<slot></slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * CodeInput 栅格系统的列 \n\t * @description 该组件一般用于Layout 布局 通过基础的 12 分栏，迅速简便地创建布局\n\t * @tutorial https://www.uviewui.com/components/Layout.html\n\t * @property {String | Number}\tspan\t\t栅格占据的列数，总12等份 (默认 12 ) \n\t * @property {String | Number}\toffset\t\t分栏左边偏移，计算方式与span相同 (默认 0 ) \n\t * @property {String}\t\t\tjustify\t\t水平排列方式，可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)  (默认 'start' ) \n\t * @property {String}\t\t\talign\t\t垂直对齐方式，可选值为top、center、bottom、stretch (默认 'stretch' ) \n\t * @property {String}\t\t\ttextAlign\t文字水平对齐方式 (默认 'left' ) \n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * @event {Function}\tclick\tcol被点击，会阻止事件冒泡到row\n\t * @example\t <u-col  span=\"3\" offset=\"3\" > <view class=\"demo-layout bg-purple\"></view> </u-col>\n\t */\n\texport default {\n\t\tname: 'u-col',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\twidth: 0,\n\t\t\t\tparentData: {\n\t\t\t\t\tgutter: 0\n\t\t\t\t},\n\t\t\t\tgridNum: 12\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tuJustify() {\n\t\t\t\tif (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify\n\t\t\t\telse if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify\n\t\t\t\telse return this.justify\n\t\t\t},\n\t\t\tuAlignItem() {\n\t\t\t\tif (this.align == 'top') return 'flex-start'\n\t\t\t\tif (this.align == 'bottom') return 'flex-end'\n\t\t\t\telse return this.align\n\t\t\t},\n\t\t\tcolStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\t// 这里写成\"padding: 0 10px\"的形式是因为nvue的需要\n\t\t\t\t\tpaddingLeft: uni.$u.addUnit(uni.$u.getPx(this.parentData.gutter)/2),\n\t\t\t\t\tpaddingRight: uni.$u.addUnit(uni.$u.getPx(this.parentData.gutter)/2),\n\t\t\t\t\talignItems: this.uAlignItem,\n\t\t\t\t\tjustifyContent: this.uJustify,\n\t\t\t\t\ttextAlign: this.textAlign,\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\t// 在非nvue上，使用百分比形式\n\t\t\t\t\tflex: `0 0 ${100 / this.gridNum * this.span}%`,\n\t\t\t\t\tmarginLeft: 100 / 12 * this.offset + '%',\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\t// 在nvue上，由于无法使用百分比单位，这里需要获取父组件的宽度，再计算得出该有对应的百分比尺寸\n\t\t\t\t\twidth: uni.$u.addUnit(Math.floor(this.width / this.gridNum * Number(this.span))),\n\t\t\t\t\tmarginLeft: uni.$u.addUnit(Math.floor(this.width / this.gridNum * Number(this.offset))),\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tasync init() {\n\t\t\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环引用\n\t\t\t\tthis.updateParentData()\n\t\t\t\tthis.width = await this.parent.getComponentWidth()\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\tthis.getParentData('u-row')\n\t\t\t},\n\t\t\tclickHandler(e) {\n\t\t\t\tthis.$emit('click');\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-col {\n\t\tpadding: 0;\n\t\t/* #ifndef APP-NVUE */\n\t\tbox-sizing:border-box;\n\t\t/* #endif */\n\t\t/* #ifdef MP */\n\t\tdisplay: block;\n\t\t/* #endif */\n\t}\n\n\t// nvue下百分比无效\n\t/* #ifndef APP-NVUE */\n\t.u-col-0 {\n\t\twidth: 0;\n\t}\n\n\t.u-col-1 {\n\t\twidth: calc(100%/12);\n\t}\n\n\t.u-col-2 {\n\t\twidth: calc(100%/12 * 2);\n\t}\n\n\t.u-col-3 {\n\t\twidth: calc(100%/12 * 3);\n\t}\n\n\t.u-col-4 {\n\t\twidth: calc(100%/12 * 4);\n\t}\n\n\t.u-col-5 {\n\t\twidth: calc(100%/12 * 5);\n\t}\n\n\t.u-col-6 {\n\t\twidth: calc(100%/12 * 6);\n\t}\n\n\t.u-col-7 {\n\t\twidth: calc(100%/12 * 7);\n\t}\n\n\t.u-col-8 {\n\t\twidth: calc(100%/12 * 8);\n\t}\n\n\t.u-col-9 {\n\t\twidth: calc(100%/12 * 9);\n\t}\n\n\t.u-col-10 {\n\t\twidth: calc(100%/12 * 10);\n\t}\n\n\t.u-col-11 {\n\t\twidth: calc(100%/12 * 11);\n\t}\n\n\t.u-col-12 {\n\t\twidth: calc(100%/12 * 12);\n\t}\n\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-collapse/props.js",
    "content": "export default {\n    props: {\n        // 当前展开面板的name，非手风琴模式：[<string | number>]，手风琴模式：string | number\n        value: {\n            type: [String, Number, Array, null],\n            default: uni.$u.props.collapse.value\n        },\n        // 是否手风琴模式\n        accordion: {\n            type: Boolean,\n            default: uni.$u.props.collapse.accordion\n        },\n        // 是否显示外边框\n        border: {\n            type: Boolean,\n            default: uni.$u.props.collapse.border\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-collapse/u-collapse.vue",
    "content": "<template>\n\t<view class=\"u-collapse\">\n\t\t<u-line v-if=\"border\"></u-line>\n\t\t<slot />\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * collapse 折叠面板 \n\t * @description 通过折叠面板收纳内容区域\n\t * @tutorial https://www.uviewui.com/components/collapse.html\n\t * @property {String | Number | Array}\tvalue\t\t当前展开面板的name，非手风琴模式：[<string | number>]，手风琴模式：string | number\n\t * @property {Boolean}\t\t\t\t\taccordion\t是否手风琴模式（ 默认 false ）\n\t * @property {Boolean}\t\t\t\t\tborder\t\t是否显示外边框 ( 默认 true ）\n\t * @event {Function}\tchange \t\t当前激活面板展开时触发(如果是手风琴模式，参数activeNames类型为String，否则为Array)\n\t * @example <u-collapse></u-collapse>\n\t */\n\texport default {\n\t\tname: \"u-collapse\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\twatch: {\n\t\t\tneedInit() {\n\t\t\t\tthis.init()\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t},\n\t\tcomputed: {\n\t\t\tneedInit() {\n\t\t\t\t// 通过computed，同时监听accordion和value值的变化\n\t\t\t\t// 再通过watch去执行init()方法，进行再一次的初始化\n\t\t\t\treturn [this.accordion, this.value]\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 当父组件需要子组件需要共享的参数发生了变化，手动通知子组件\n\t\t\tparentData() {\n\t\t\t\tif (this.children.length) {\n\t\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t\t// 判断子组件(u-checkbox)如果有updateParentData方法的话，就就执行(执行的结果是子组件重新从父组件拉取了最新的值)\n\t\t\t\t\t\ttypeof(child.updateParentData) === 'function' && child.updateParentData()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\t// 重新初始化一次内部的所有子元素\n\t\t\tinit() {\n\t\t\t\tthis.children.map(child => {\n\t\t\t\t\tchild.init()\n\t\t\t\t})\n\t\t\t},\n\t\t\t/**\n\t\t\t * collapse-item被点击时触发，由collapse统一处理各子组件的状态\n\t\t\t * @param {Object} target 被操作的面板的实例\n\t\t\t */\n\t\t\tonChange(target) {\n\t\t\t\tlet changeArr = []\n\t\t\t\tthis.children.map((child, index) => {\n\t\t\t\t\t// 如果是手风琴模式，将其他的折叠面板收起来\n\t\t\t\t\tif (this.accordion) {\n\t\t\t\t\t\tchild.expanded = child === target ? !target.expanded : false\n\t\t\t\t\t\tchild.setContentAnimate()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(child === target) {\n\t\t\t\t\t\t\tchild.expanded = !child.expanded\n\t\t\t\t\t\t\tchild.setContentAnimate()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// 拼接change事件中，数组元素的状态\n\t\t\t\t\tchangeArr.push({\n\t\t\t\t\t\t// 如果没有定义name属性，则默认返回组件的index索引\n\t\t\t\t\t\tname: child.name || index,\n\t\t\t\t\t\tstatus: child.expanded ? 'open' : 'close'\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\tthis.$emit('change', changeArr)\n\t\t\t\tthis.$emit(target.expanded ? 'open' : 'close', target.name)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-collapse-item/props.js",
    "content": "export default {\n    props: {\n        // 标题\n        title: {\n            type: String,\n            default: uni.$u.props.collapseItem.title\n        },\n        // 标题右侧内容\n        value: {\n            type: String,\n            default: uni.$u.props.collapseItem.value\n        },\n        // 标题下方的描述信息\n        label: {\n            type: String,\n            default: uni.$u.props.collapseItem.label\n        },\n        // 是否禁用折叠面板\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.collapseItem.disabled\n        },\n        // 是否展示右侧箭头并开启点击反馈\n        isLink: {\n            type: Boolean,\n            default: uni.$u.props.collapseItem.isLink\n        },\n        // 是否开启点击反馈\n        clickable: {\n            type: Boolean,\n            default: uni.$u.props.collapseItem.clickable\n        },\n        // 是否显示内边框\n        border: {\n            type: Boolean,\n            default: uni.$u.props.collapseItem.border\n        },\n        // 标题的对齐方式\n        align: {\n            type: String,\n            default: uni.$u.props.collapseItem.align\n        },\n        // 唯一标识符\n        name: {\n            type: [String, Number],\n            default: uni.$u.props.collapseItem.name\n        },\n        // 标题左侧图片，可为绝对路径的图片或内置图标\n        icon: {\n            type: String,\n            default: uni.$u.props.collapseItem.icon\n        },\n        // 面板展开收起的过渡时间，单位ms\n        duration: {\n            type: Number,\n            default: uni.$u.props.collapseItem.duration\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue",
    "content": "<template>\n\t<view class=\"u-collapse-item\">\n\t\t<u-cell\n\t\t\t:title=\"title\"\n\t\t\t:value=\"value\"\n\t\t\t:label=\"label\"\n\t\t\t:icon=\"icon\"\n\t\t\t:isLink=\"isLink\"\n\t\t\t:clickable=\"clickable\"\n\t\t\t:border=\"parentData.border && showBorder\"\n\t\t\t@click=\"clickHandler\"\n\t\t\t:arrowDirection=\"expanded ? 'up' : 'down'\"\n\t\t\t:disabled=\"disabled\"\n\t\t>\n\t\t\t<!-- #ifndef MP-WEIXIN -->\n\t\t\t<!-- 微信小程序不支持，因为微信中不支持 <slot name=\"title\" slot=\"title\" />的写法 -->\n\t\t\t<template slot=\"title\">\n\t\t\t\t<slot name=\"title\"></slot>\n\t\t\t</template>\n\t\t\t<template slot=\"icon\">\n\t\t\t\t<slot name=\"icon\"></slot>\n\t\t\t</template>\n\t\t\t<template slot=\"value\">\n\t\t\t\t<slot name=\"value\"></slot>\n\t\t\t</template>\n\t\t\t<template slot=\"right-icon\">\n\t\t\t\t<slot name=\"right-icon\"></slot>\n\t\t\t</template>\n\t\t\t<!-- #endif -->\n\t\t</u-cell>\n\t\t<view\n\t\t\tclass=\"u-collapse-item__content\"\n\t\t\t:animation=\"animationData\"\n\t\t\tref=\"animation\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-collapse-item__content__text content-class\"\n\t\t\t\t:id=\"elId\"\n\t\t\t\t:ref=\"elId\"\n\t\t\t><slot /></view>\n\t\t</view>\n\t\t<u-line v-if=\"parentData.border\"></u-line>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst animation = uni.requireNativePlugin('animation')\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * collapseItem 折叠面板Item\n\t * @description 通过折叠面板收纳内容区域（搭配u-collapse使用）\n\t * @tutorial https://www.uviewui.com/components/collapse.html\n\t * @property {String}\t\t\ttitle \t\t标题\n\t * @property {String}\t\t\tvalue \t\t标题右侧内容\n\t * @property {String}\t\t\tlabel \t\t标题下方的描述信息\n\t * @property {Boolean}\t\t\tdisbled \t是否禁用折叠面板 ( 默认 false )\n\t * @property {Boolean}\t\t\tisLink \t\t是否展示右侧箭头并开启点击反馈 ( 默认 true )\n\t * @property {Boolean}\t\t\tclickable\t是否开启点击反馈 ( 默认 true )\n\t * @property {Boolean}\t\t\tborder\t\t是否显示内边框 ( 默认 true )\n\t * @property {String}\t\t\talign\t\t标题的对齐方式 ( 默认 'left' )\n\t * @property {String | Number}\tname\t\t唯一标识符\n\t * @property {String}\t\t\ticon\t\t标题左侧图片，可为绝对路径的图片或内置图标\n\t * @event {Function}\t\t\tchange \t\t\t某个item被打开或者收起时触发\n\t * @example <u-collapse-item :title=\"item.head\" v-for=\"(item, index) in itemList\" :key=\"index\">{{item.body}}</u-collapse-item>\n\t */\n\texport default {\n\t\tname: \"u-collapse-item\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\telId: uni.$u.guid(),\n\t\t\t\t// uni.createAnimation的导出数据\n\t\t\t\tanimationData: {},\n\t\t\t\t// 是否展开状态\n\t\t\t\texpanded: false,\n\t\t\t\t// 根据expanded确定是否显示border，为了控制展开时，cell的下划线更好的显示效果，进行一定时间的延时\n\t\t\t\tshowBorder: false,\n\t\t\t\t// 是否动画中，如果是则不允许继续触发点击\n\t\t\t\tanimating: false,\n\t\t\t\t// 父组件u-collapse的参数\n\t\t\t\tparentData: {\n\t\t\t\t\taccordion: false,\n\t\t\t\t\tborder: false\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\texpanded(n) {\n\t\t\t\tclearTimeout(this.timer)\n\t\t\t\tthis.timer = null\n\t\t\t\t// 这里根据expanded的值来进行一定的延时，是为了cell的下划线更好的显示效果\n\t\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\t\tthis.showBorder = n\n\t\t\t\t}, n ? 10 : 290)\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\t// 异步获取内容，或者动态修改了内容时，需要重新初始化\n\t\t\tinit() {\n\t\t\t\t// 初始化数据\n\t\t\t\tthis.updateParentData()\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\treturn uni.$u.error('u-collapse-item必须要搭配u-collapse组件使用')\n\t\t\t\t}\n\t\t\t\tconst {\n\t\t\t\t\tvalue,\n\t\t\t\t\taccordion,\n\t\t\t\t\tchildren = []\n\t\t\t\t} = this.parent\n\n\t\t\t\tif (accordion) {\n\t\t\t\t\tif (uni.$u.test.array(value)) {\n\t\t\t\t\t\treturn uni.$u.error('手风琴模式下，u-collapse组件的value参数不能为数组')\n\t\t\t\t\t}\n\t\t\t\t\tthis.expanded = this.name == value\n\t\t\t\t} else {\n\t\t\t\t\tif (!uni.$u.test.array(value) && value !== null) {\n\t\t\t\t\t\treturn uni.$u.error('非手风琴模式下，u-collapse组件的value参数必须为数组')\n\t\t\t\t\t}\n\t\t\t\t\tthis.expanded = (value || []).some(item => item == this.name)\n\t\t\t\t}\n\t\t\t\t// 设置组件的展开或收起状态\n\t\t\t\tthis.$nextTick(function() {\n\t\t\t\t\tthis.setContentAnimate()\n\t\t\t\t})\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法在mixin中\n\t\t\t\tthis.getParentData('u-collapse')\n\t\t\t},\n\t\t\tasync setContentAnimate() {\n\t\t\t\t// 每次面板打开或者收起时，都查询元素尺寸\n\t\t\t\t// 好处是，父组件从服务端获取内容后，变更折叠面板后可以获得最新的高度\n\t\t\t\tconst rect = await this.queryRect()\n\t\t\t\tconst height = this.expanded ? rect.height : 0\n\t\t\t\tthis.animating = true\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tconst ref = this.$refs['animation'].ref\n\t\t\t\tanimation.transition(ref, {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\theight: height + 'px'\n\t\t\t\t\t},\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t\t// 必须设置为true，否则会到面板收起或展开时，页面其他元素不会随之调整它们的布局\n\t\t\t\t\tneedLayout: true,\n\t\t\t\t\ttimingFunction: 'ease-in-out',\n\t\t\t\t}, () => {\n\t\t\t\t\tthis.animating = false\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tconst animation = uni.createAnimation({\n\t\t\t\t\ttimingFunction: 'ease-in-out',\n\t\t\t\t});\n\t\t\t\tanimation\n\t\t\t\t\t.height(height)\n\t\t\t\t\t.step({\n\t\t\t\t\t\tduration: this.duration,\n\t\t\t\t\t})\n\t\t\t\t\t.step()\n\t\t\t\t// 导出动画数据给面板的animationData值\n\t\t\t\tthis.animationData = animation.export()\n\t\t\t\t// 标识动画结束\n\t\t\t\tuni.$u.sleep(this.duration).then(() => {\n\t\t\t\t\tthis.animating = false\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 点击collapsehead头部\n\t\t\tclickHandler() {\n\t\t\t\tif (this.disabled && this.animating) return\n\t\t\t\t// 设置本组件为相反的状态\n\t\t\t\tthis.parent && this.parent.onChange(this)\n\t\t\t},\n\t\t\t// 查询内容高度\n\t\t\tqueryRect() {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t// $uGetRect为uView自带的节点查询简化方法，详见文档介绍：https://www.uviewui.com/js/getRect.html\n\t\t\t\t// 组件内部一般用this.$uGetRect，对外的为uni.$u.getRect，二者功能一致，名称不同\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tthis.$uGetRect(`#${this.elId}`).then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下，使用dom模块查询元素高度\n\t\t\t\t// 返回一个promise，让调用此方法的主体能使用then回调\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(this.$refs[this.elId], res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t}\n\t\t},\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-collapse-item {\n\n\t\t&__content {\n\t\t\toverflow: hidden;\n\t\t\theight: 0;\n\n\t\t\t&__text {\n\t\t\t\tpadding: 12px 15px;\n\t\t\t\tcolor: $u-content-color;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tline-height: 18px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-column-notice/props.js",
    "content": "export default {\n    props: {\n        // 显示的内容，字符串\n        text: {\n            type: [Array],\n            default: uni.$u.props.columnNotice.text\n        },\n        // 是否显示左侧的音量图标\n        icon: {\n            type: String,\n            default: uni.$u.props.columnNotice.icon\n        },\n        // 通告模式，link-显示右箭头，closable-显示右侧关闭图标\n        mode: {\n            type: String,\n            default: uni.$u.props.columnNotice.mode\n        },\n        // 文字颜色，各图标也会使用文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.columnNotice.color\n        },\n        // 背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.columnNotice.bgColor\n        },\n        // 字体大小，单位px\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.columnNotice.fontSize\n        },\n        // 水平滚动时的滚动速度，即每秒滚动多少px(px)，这有利于控制文字无论多少时，都能有一个恒定的速度\n        speed: {\n            type: [String, Number],\n            default: uni.$u.props.columnNotice.speed\n        },\n        // direction = row时，是否使用步进形式滚动\n        step: {\n            type: Boolean,\n            default: uni.$u.props.columnNotice.step\n        },\n        // 滚动一个周期的时间长，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.columnNotice.duration\n        },\n        // 是否禁止用手滑动切换\n        // 目前HX2.6.11，只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序\n        disableTouch: {\n            type: Boolean,\n            default: uni.$u.props.columnNotice.disableTouch\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-column-notice/u-column-notice.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-notice\"\n\t\t@tap=\"clickHandler\"\n\t>\n\t\t<slot name=\"icon\">\n\t\t\t<view\n\t\t\t\tclass=\"u-notice__left-icon\"\n\t\t\t\tv-if=\"icon\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t\t:name=\"icon\"\n\t\t\t\t\t:color=\"color\"\n\t\t\t\t\tsize=\"19\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t</slot>\n\t\t<swiper\n\t\t\t:disable-touch=\"disableTouch\"\n\t\t\t:vertical=\"step ? false : true\"\n\t\t\tcircular\n\t\t\t:interval=\"duration\"\n\t\t\t:autoplay=\"true\"\n\t\t\tclass=\"u-notice__swiper\"\n\t\t\t@change=\"noticeChange\"\n\t\t>\n\t\t\t<swiper-item\n\t\t\t\tv-for=\"(item, index) in text\"\n\t\t\t\t:key=\"index\"\n\t\t\t\tclass=\"u-notice__swiper__item\"\n\t\t\t>\n\t\t\t\t<text\n\t\t\t\t\tclass=\"u-notice__swiper__item__text u-line-1\"\n\t\t\t\t\t:style=\"[textStyle]\"\n\t\t\t\t>{{ item }}</text>\n\t\t\t</swiper-item>\n\t\t</swiper>\n\t\t<view\n\t\t\tclass=\"u-notice__right-icon\"\n\t\t\tv-if=\"['link', 'closable'].includes(mode)\"\n\t\t>\n\t\t\t<u-icon\n\t\t\t\tv-if=\"mode === 'link'\"\n\t\t\t\tname=\"arrow-right\"\n\t\t\t\t:size=\"17\"\n\t\t\t\t:color=\"color\"\n\t\t\t></u-icon>\n\t\t\t<u-icon\n\t\t\t\tv-if=\"mode === 'closable'\"\n\t\t\t\tname=\"close\"\n\t\t\t\t:size=\"16\"\n\t\t\t\t:color=\"color\"\n\t\t\t\t@click=\"close\"\n\t\t\t></u-icon>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * ColumnNotice 滚动通知中的垂直滚动 内部组件\n\t * @description 该组件用于滚动通告场景，是其中的垂直滚动方式\n\t * @tutorial https://www.uviewui.com/components/noticeBar.html\n\t * @property {Array}\t\t\ttext \t\t\t显示的内容，字符串\n\t * @property {String}\t\t\ticon \t\t\t是否显示左侧的音量图标 （ 默认 'volume' ）\n\t * @property {String}\t\t\tmode \t\t\t通告模式，link-显示右箭头，closable-显示右侧关闭图标\n\t * @property {String}\t\t\tcolor \t\t\t文字颜色，各图标也会使用文字颜色 （ 默认 '#f9ae3d' ）\n\t * @property {String}\t\t\tbgColor \t\t背景颜色 （ 默认 '#fdf6ec' ）\n\t * @property {String | Number}\tfontSize\t\t字体大小，单位px  （ 默认 14 ）\n\t * @property {String | Number}\tspeed\t\t\t水平滚动时的滚动速度，即每秒滚动多少px(rpx)，这有利于控制文字无论多少时，都能有一个恒定的速度 （ 默认 80 ）\n\t * @property {Boolean}\t\t\tstep\t\t\tdirection = row时，是否使用步进形式滚动 （ 默认 false ）\n\t * @property {String | Number}\tduration\t\t滚动一个周期的时间长，单位ms （ 默认 1500 ）\n\t * @property {Boolean}\t\t\tdisableTouch\t是否禁止用手滑动切换   目前HX2.6.11，只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 （ 默认 true ）\n\t * @example \n\t */\n\texport default {\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\twatch: {\n\t\t\ttext: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(newValue, oldValue) {\n\t\t\t\t\tif(!uni.$u.test.array(newValue)) {\n\t\t\t\t\t\tuni.$u.error('noticebar组件direction为column时，要求text参数为数组形式')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 文字内容的样式\n\t\t\ttextStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\tstyle.color = this.color\n\t\t\t\tstyle.fontSize = uni.$u.addUnit(this.fontSize)\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 垂直或者水平滚动\n\t\t\tvertical() {\n\t\t\t\tif (this.mode == 'horizontal') return false\n\t\t\t\telse return true\n\t\t\t},\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tindex:0\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tnoticeChange(e){\n\t\t\t\tthis.index = e.detail.current\n\t\t\t},\n\t\t\t// 点击通告栏\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('click', this.index)\n\t\t\t},\n\t\t\t// 点击关闭按钮\n\t\t\tclose() {\n\t\t\t\tthis.$emit('close')\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-notice {\n\t\t@include flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\n\t\t&__left-icon {\n\t\t\talign-items: center;\n\t\t\tmargin-right: 5px;\n\t\t}\n\n\t\t&__right-icon {\n\t\t\tmargin-left: 5px;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t&__swiper {\n\t\t\theight: 16px;\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\tflex: 1;\n\n\t\t\t&__item {\n\t\t\t\t@include flex;\n\t\t\t\talign-items: center;\n\t\t\t\toverflow: hidden;\n\n\t\t\t\t&__text {\n\t\t\t\t\tfont-size: 14px;\n\t\t\t\t\tcolor: $u-warning;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-count-down/props.js",
    "content": "export default {\n    props: {\n        // 倒计时时长，单位ms\n        time: {\n            type: [String, Number],\n            default: uni.$u.props.countDown.time\n        },\n        // 时间格式，DD-日，HH-时，mm-分，ss-秒，SSS-毫秒\n        format: {\n            type: String,\n            default: uni.$u.props.countDown.format\n        },\n        // 是否自动开始倒计时\n        autoStart: {\n            type: Boolean,\n            default: uni.$u.props.countDown.autoStart\n        },\n        // 是否展示毫秒倒计时\n        millisecond: {\n            type: Boolean,\n            default: uni.$u.props.countDown.millisecond\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-count-down/u-count-down.vue",
    "content": "<template>\n\t<view class=\"u-count-down\">\n\t\t<slot>\n\t\t\t<text class=\"u-count-down__text\">{{ formattedTime }}</text>\n\t\t</slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\timport {\n\t\tisSameSecond,\n\t\tparseFormat,\n\t\tparseTimeData\n\t} from './utils';\n\t/**\n\t * u-count-down 倒计时\n\t * @description 该组件一般使用于某个活动的截止时间上，通过数字的变化，给用户明确的时间感受，提示用户进行某一个行为操作。\n\t * @tutorial https://uviewui.com/components/countDown.html\n\t * @property {String | Number}\ttime\t\t倒计时时长，单位ms （默认 0 ）\n\t * @property {String}\t\t\tformat\t\t时间格式，DD-日，HH-时，mm-分，ss-秒，SSS-毫秒  （默认 'HH:mm:ss' ）\n\t * @property {Boolean}\t\t\tautoStart\t是否自动开始倒计时 （默认 true ）\n\t * @property {Boolean}\t\t\tmillisecond\t是否展示毫秒倒计时 （默认 false ）\n\t * @event {Function} finish 倒计时结束时触发 \n\t * @event {Function} change 倒计时变化时触发 \n\t * @event {Function} start\t开始倒计时\n\t * @event {Function} pause\t暂停倒计时 \n\t * @event {Function} reset\t重设倒计时，若 auto-start 为 true，重设后会自动开始倒计时 \n\t * @example <u-count-down :time=\"time\"></u-count-down>\n\t */\n\texport default {\n\t\tname: 'u-count-down',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\ttimer: null,\n\t\t\t\t// 各单位(天，时，分等)剩余时间\n\t\t\t\ttimeData: parseTimeData(0),\n\t\t\t\t// 格式化后的时间，如\"03:23:21\"\n\t\t\t\tformattedTime: '0',\n\t\t\t\t// 倒计时是否正在进行中\n\t\t\t\truning: false,\n\t\t\t\tendTime: 0, // 结束的毫秒时间戳\n\t\t\t\tremainTime: 0, // 剩余的毫秒时间\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\ttime(n) {\n\t\t\t\tthis.reset()\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tthis.reset()\n\t\t\t},\n\t\t\t// 开始倒计时\n\t\t\tstart() {\n\t\t\t\tif (this.runing) return\n\t\t\t\t// 标识为进行中\n\t\t\t\tthis.runing = true\n\t\t\t\t// 结束时间戳 = 此刻时间戳 + 剩余的时间\n\t\t\t\tthis.endTime = Date.now() + this.remainTime\n\t\t\t\tthis.toTick()\n\t\t\t},\n\t\t\t// 根据是否展示毫秒，执行不同操作函数\n\t\t\ttoTick() {\n\t\t\t\tif (this.millisecond) {\n\t\t\t\t\tthis.microTick()\n\t\t\t\t} else {\n\t\t\t\t\tthis.macroTick()\n\t\t\t\t}\n\t\t\t},\n\t\t\tmacroTick() {\n\t\t\t\tthis.clearTimeout()\n\t\t\t\t// 每隔一定时间，更新一遍定时器的值\n\t\t\t\t// 同时此定时器的作用也能带来毫秒级的更新\n\t\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\t\t// 获取剩余时间\n\t\t\t\t\tconst remain = this.getRemainTime()\n\t\t\t\t\t// 重设剩余时间\n\t\t\t\t\tif (!isSameSecond(remain, this.remainTime) || remain === 0) {\n\t\t\t\t\t\tthis.setRemainTime(remain)\n\t\t\t\t\t}\n\t\t\t\t\t// 如果剩余时间不为0，则继续检查更新倒计时\n\t\t\t\t\tif (this.remainTime !== 0) {\n\t\t\t\t\t\tthis.macroTick()\n\t\t\t\t\t}\n\t\t\t\t}, 30)\n\t\t\t},\n\t\t\tmicroTick() {\n\t\t\t\tthis.clearTimeout()\n\t\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\t\tthis.setRemainTime(this.getRemainTime())\n\t\t\t\t\tif (this.remainTime !== 0) {\n\t\t\t\t\t\tthis.microTick()\n\t\t\t\t\t}\n\t\t\t\t}, 50)\n\t\t\t},\n\t\t\t// 获取剩余的时间\n\t\t\tgetRemainTime() {\n\t\t\t\t// 取最大值，防止出现小于0的剩余时间值\n\t\t\t\treturn Math.max(this.endTime - Date.now(), 0)\n\t\t\t},\n\t\t\t// 设置剩余的时间\n\t\t\tsetRemainTime(remain) {\n\t\t\t\tthis.remainTime = remain\n\t\t\t\t// 根据剩余的毫秒时间，得出该有天，小时，分钟等的值，返回一个对象\n\t\t\t\tconst timeData = parseTimeData(remain)\n\t\t\t\tthis.$emit('change', timeData)\n\t\t\t\t// 得出格式化后的时间\n\t\t\t\tthis.formattedTime = parseFormat(this.format, timeData)\n\t\t\t\t// 如果时间已到，停止倒计时\n\t\t\t\tif (remain <= 0) {\n\t\t\t\t\tthis.pause()\n\t\t\t\t\tthis.$emit('finish')\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 重置倒计时\n\t\t\treset() {\n\t\t\t\tthis.pause()\n\t\t\t\tthis.remainTime = this.time\n\t\t\t\tthis.setRemainTime(this.remainTime)\n\t\t\t\tif (this.autoStart) {\n\t\t\t\t\tthis.start()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 暂停倒计时\n\t\t\tpause() {\n\t\t\t\tthis.runing = false;\n\t\t\t\tthis.clearTimeout()\n\t\t\t},\n\t\t\t// 清空定时器\n\t\t\tclearTimeout() {\n\t\t\t\tclearTimeout(this.timer)\n\t\t\t\tthis.timer = null\n\t\t\t}\n\t\t},\n\t\tbeforeDestroy() {\n\t\t\tthis.clearTimeout()\n\t\t}\n\t}\n</script>\n\n<style\n\tlang=\"scss\"\n\tscoped\n>\n\t@import \"../../libs/css/components.scss\";\n\t$u-count-down-text-color:$u-content-color !default;\n\t$u-count-down-text-font-size:15px !default;\n\t$u-count-down-text-line-height:22px !default;\n\n\t.u-count-down {\n\t\t&__text {\n\t\t\tcolor: $u-count-down-text-color;\n\t\t\tfont-size: $u-count-down-text-font-size;\n\t\t\tline-height: $u-count-down-text-line-height;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-count-down/utils.js",
    "content": "// 补0，如1 -> 01\nfunction padZero(num, targetLength = 2) {\n    let str = `${num}`\n    while (str.length < targetLength) {\n        str = `0${str}`\n    }\n    return str\n}\nconst SECOND = 1000\nconst MINUTE = 60 * SECOND\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\nexport function parseTimeData(time) {\n    const days = Math.floor(time / DAY)\n    const hours = Math.floor((time % DAY) / HOUR)\n    const minutes = Math.floor((time % HOUR) / MINUTE)\n    const seconds = Math.floor((time % MINUTE) / SECOND)\n    const milliseconds = Math.floor(time % SECOND)\n    return {\n        days,\n        hours,\n        minutes,\n        seconds,\n        milliseconds\n    }\n}\nexport function parseFormat(format, timeData) {\n    let {\n        days,\n        hours,\n        minutes,\n        seconds,\n        milliseconds\n    } = timeData\n    // 如果格式化字符串中不存在DD(天)，则将天的时间转为小时中去\n    if (format.indexOf('DD') === -1) {\n        hours += days * 24\n    } else {\n        // 对天补0\n        format = format.replace('DD', padZero(days))\n    }\n    // 其他同理于DD的格式化处理方式\n    if (format.indexOf('HH') === -1) {\n        minutes += hours * 60\n    } else {\n        format = format.replace('HH', padZero(hours))\n    }\n    if (format.indexOf('mm') === -1) {\n        seconds += minutes * 60\n    } else {\n        format = format.replace('mm', padZero(minutes))\n    }\n    if (format.indexOf('ss') === -1) {\n        milliseconds += seconds * 1000\n    } else {\n        format = format.replace('ss', padZero(seconds))\n    }\n    return format.replace('SSS', padZero(milliseconds, 3))\n}\nexport function isSameSecond(time1, time2) {\n    return Math.floor(time1 / 1000) === Math.floor(time2 / 1000)\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-count-to/props.js",
    "content": "export default {\n    props: {\n        // 开始的数值，默认从0增长到某一个数\n        startVal: {\n            type: [String, Number],\n            default: uni.$u.props.countTo.startVal\n        },\n        // 要滚动的目标数值，必须\n        endVal: {\n            type: [String, Number],\n            default: uni.$u.props.countTo.endVal\n        },\n        // 滚动到目标数值的动画持续时间，单位为毫秒（ms）\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.countTo.duration\n        },\n        // 设置数值后是否自动开始滚动\n        autoplay: {\n            type: Boolean,\n            default: uni.$u.props.countTo.autoplay\n        },\n        // 要显示的小数位数\n        decimals: {\n            type: [String, Number],\n            default: uni.$u.props.countTo.decimals\n        },\n        // 是否在即将到达目标数值的时候，使用缓慢滚动的效果\n        useEasing: {\n            type: Boolean,\n            default: uni.$u.props.countTo.useEasing\n        },\n        // 十进制分割\n        decimal: {\n            type: [String, Number],\n            default: uni.$u.props.countTo.decimal\n        },\n        // 字体颜色\n        color: {\n            type: String,\n            default: uni.$u.props.countTo.color\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.countTo.fontSize\n        },\n        // 是否加粗字体\n        bold: {\n            type: Boolean,\n            default: uni.$u.props.countTo.bold\n        },\n        // 千位分隔符，类似金额的分割(￥23,321.05中的\",\")\n        separator: {\n            type: String,\n            default: uni.$u.props.countTo.separator\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-count-to/u-count-to.vue",
    "content": "<template>\n\t<text\n\t\tclass=\"u-count-num\"\n\t\t:style=\"{\n\t\t\tfontSize: $u.addUnit(fontSize),\n\t\t\tfontWeight: bold ? 'bold' : 'normal',\n\t\t\tcolor: color\n\t\t}\"\n\t>{{ displayValue }}</text>\n</template>\n\n<script>\n\timport props from './props.js';\n/**\n * countTo 数字滚动\n * @description 该组件一般用于需要滚动数字到某一个值的场景，目标要求是一个递增的值。\n * @tutorial https://www.uviewui.com/components/countTo.html\n * @property {String | Number}\tstartVal\t开始的数值，默认从0增长到某一个数（默认 0 ）\n * @property {String | Number}\tendVal\t\t要滚动的目标数值，必须 （默认 0 ）\n * @property {String | Number}\tduration\t滚动到目标数值的动画持续时间，单位为毫秒（ms） （默认 2000 ）\n * @property {Boolean}\t\t\tautoplay\t设置数值后是否自动开始滚动 （默认 true ）\n * @property {String | Number}\tdecimals\t要显示的小数位数，见官网说明（默认 0 ）\n * @property {Boolean}\t\t\tuseEasing\t滚动结束时，是否缓动结尾，见官网说明（默认 true ）\n * @property {String}\t\t\tdecimal\t\t十进制分割 （ 默认 \".\" ）\n * @property {String}\t\t\tcolor\t\t字体颜色（ 默认 '#606266' )\n * @property {String | Number}\tfontSize\t字体大小，单位px（ 默认 22 ）\n * @property {Boolean}\t\t\tbold\t\t字体是否加粗（默认 false ）\n * @property {String}\t\t\tseparator\t千位分隔符，见官网说明\n * @event {Function} end 数值滚动到目标值时触发\n * @example <u-count-to ref=\"uCountTo\" :end-val=\"endVal\" :autoplay=\"autoplay\"></u-count-to>\n */\nexport default {\n\tname: 'u-count-to',\n\tdata() {\n\t\treturn {\n\t\t\tlocalStartVal: this.startVal,\n\t\t\tdisplayValue: this.formatNumber(this.startVal),\n\t\t\tprintVal: null,\n\t\t\tpaused: false, // 是否暂停\n\t\t\tlocalDuration: Number(this.duration),\n\t\t\tstartTime: null, // 开始的时间\n\t\t\ttimestamp: null, // 时间戳\n\t\t\tremaining: null, // 停留的时间\n\t\t\trAF: null,\n\t\t\tlastTime: 0 // 上一次的时间\n\t\t};\n\t},\n\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\tcomputed: {\n\t\tcountDown() {\n\t\t\treturn this.startVal > this.endVal;\n\t\t}\n\t},\n\twatch: {\n\t\tstartVal() {\n\t\t\tthis.autoplay && this.start();\n\t\t},\n\t\tendVal() {\n\t\t\tthis.autoplay && this.start();\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.autoplay && this.start();\n\t},\n\tmethods: {\n\t\teasingFn(t, b, c, d) {\n\t\t\treturn (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;\n\t\t},\n\t\trequestAnimationFrame(callback) {\n\t\t\tconst currTime = new Date().getTime();\n\t\t\t// 为了使setTimteout的尽可能的接近每秒60帧的效果\n\t\t\tconst timeToCall = Math.max(0, 16 - (currTime - this.lastTime));\n\t\t\tconst id = setTimeout(() => {\n\t\t\t\tcallback(currTime + timeToCall);\n\t\t\t}, timeToCall);\n\t\t\tthis.lastTime = currTime + timeToCall;\n\t\t\treturn id;\n\t\t},\n\t\tcancelAnimationFrame(id) {\n\t\t\tclearTimeout(id);\n\t\t},\n\t\t// 开始滚动数字\n\t\tstart() {\n\t\t\tthis.localStartVal = this.startVal;\n\t\t\tthis.startTime = null;\n\t\t\tthis.localDuration = this.duration;\n\t\t\tthis.paused = false;\n\t\t\tthis.rAF = this.requestAnimationFrame(this.count);\n\t\t},\n\t\t// 暂定状态，重新再开始滚动；或者滚动状态下，暂停\n\t\treStart() {\n\t\t\tif (this.paused) {\n\t\t\t\tthis.resume();\n\t\t\t\tthis.paused = false;\n\t\t\t} else {\n\t\t\t\tthis.stop();\n\t\t\t\tthis.paused = true;\n\t\t\t}\n\t\t},\n\t\t// 暂停\n\t\tstop() {\n\t\t\tthis.cancelAnimationFrame(this.rAF);\n\t\t},\n\t\t// 重新开始(暂停的情况下)\n\t\tresume() {\n\t\t\tif (!this.remaining) return\n\t\t\tthis.startTime = 0;\n\t\t\tthis.localDuration = this.remaining;\n\t\t\tthis.localStartVal = this.printVal;\n\t\t\tthis.requestAnimationFrame(this.count);\n\t\t},\n\t\t// 重置\n\t\treset() {\n\t\t\tthis.startTime = null;\n\t\t\tthis.cancelAnimationFrame(this.rAF);\n\t\t\tthis.displayValue = this.formatNumber(this.startVal);\n\t\t},\n\t\tcount(timestamp) {\n\t\t\tif (!this.startTime) this.startTime = timestamp;\n\t\t\tthis.timestamp = timestamp;\n\t\t\tconst progress = timestamp - this.startTime;\n\t\t\tthis.remaining = this.localDuration - progress;\n\t\t\tif (this.useEasing) {\n\t\t\t\tif (this.countDown) {\n\t\t\t\t\tthis.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration);\n\t\t\t\t} else {\n\t\t\t\t\tthis.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.countDown) {\n\t\t\t\t\tthis.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration);\n\t\t\t\t} else {\n\t\t\t\t\tthis.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.countDown) {\n\t\t\t\tthis.printVal = this.printVal < this.endVal ? this.endVal : this.printVal;\n\t\t\t} else {\n\t\t\t\tthis.printVal = this.printVal > this.endVal ? this.endVal : this.printVal;\n\t\t\t}\n\t\t\tthis.displayValue = this.formatNumber(this.printVal) || 0;\n\t\t\tif (progress < this.localDuration) {\n\t\t\t\tthis.rAF = this.requestAnimationFrame(this.count);\n\t\t\t} else {\n\t\t\t\tthis.$emit('end');\n\t\t\t}\n\t\t},\n\t\t// 判断是否数字\n\t\tisNumber(val) {\n\t\t\treturn !isNaN(parseFloat(val));\n\t\t},\n\t\tformatNumber(num) {\n\t\t\t// 将num转为Number类型，因为其值可能为字符串数值，调用toFixed会报错\n\t\t\tnum = Number(num);\n\t\t\tnum = num.toFixed(Number(this.decimals));\n\t\t\tnum += '';\n\t\t\tconst x = num.split('.');\n\t\t\tlet x1 = x[0];\n\t\t\tconst x2 = x.length > 1 ? this.decimal + x[1] : '';\n\t\t\tconst rgx = /(\\d+)(\\d{3})/;\n\t\t\tif (this.separator && !this.isNumber(this.separator)) {\n\t\t\t\twhile (rgx.test(x1)) {\n\t\t\t\t\tx1 = x1.replace(rgx, '$1' + this.separator + '$2');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn x1 + x2;\n\t\t},\n\t\tdestroyed() {\n\t\t\tthis.cancelAnimationFrame(this.rAF);\n\t\t}\n\t}\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n.u-count-num {\n\t/* #ifndef APP-NVUE */\n\tdisplay: inline-flex;\n\t/* #endif */\n\ttext-align: center;\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-datetime-picker/props.js",
    "content": "export default {\n    props: {\n        // 是否打开组件\n        show: {\n            type: Boolean,\n            default: uni.$u.props.datetimePicker.show\n        },\n        // 是否展示顶部的操作栏\n        showToolbar: {\n            type: Boolean,\n            default: uni.$u.props.datetimePicker.showToolbar\n        },\n        // 绑定值\n        value: {\n            type: [String, Number],\n            default: uni.$u.props.datetimePicker.value\n        },\n        // 顶部标题\n        title: {\n            type: String,\n            default: uni.$u.props.datetimePicker.title\n        },\n        // 展示格式，mode=date为日期选择，mode=time为时间选择，mode=year-month为年月选择，mode=datetime为日期时间选择\n        mode: {\n            type: String,\n            default: uni.$u.props.datetimePicker.mode\n        },\n        // 可选的最大时间\n        maxDate: {\n            type: Number,\n            // 最大默认值为后10年\n            default: uni.$u.props.datetimePicker.maxDate\n        },\n        // 可选的最小时间\n        minDate: {\n            type: Number,\n            // 最小默认值为前10年\n            default: uni.$u.props.datetimePicker.minDate\n        },\n        // 可选的最小小时，仅mode=time有效\n        minHour: {\n            type: Number,\n            default: uni.$u.props.datetimePicker.minHour\n        },\n        // 可选的最大小时，仅mode=time有效\n        maxHour: {\n            type: Number,\n            default: uni.$u.props.datetimePicker.maxHour\n        },\n        // 可选的最小分钟，仅mode=time有效\n        minMinute: {\n            type: Number,\n            default: uni.$u.props.datetimePicker.minMinute\n        },\n        // 可选的最大分钟，仅mode=time有效\n        maxMinute: {\n            type: Number,\n            default: uni.$u.props.datetimePicker.maxMinute\n        },\n        // 选项过滤函数\n        filter: {\n            type: [Function, null],\n            default: uni.$u.props.datetimePicker.filter\n        },\n        // 选项格式化函数\n        formatter: {\n            type: [Function, null],\n            default: uni.$u.props.datetimePicker.formatter\n        },\n        // 是否显示加载中状态\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.datetimePicker.loading\n        },\n        // 各列中，单个选项的高度\n        itemHeight: {\n            type: [String, Number],\n            default: uni.$u.props.datetimePicker.itemHeight\n        },\n        // 取消按钮的文字\n        cancelText: {\n            type: String,\n            default: uni.$u.props.datetimePicker.cancelText\n        },\n        // 确认按钮的文字\n        confirmText: {\n            type: String,\n            default: uni.$u.props.datetimePicker.confirmText\n        },\n        // 取消按钮的颜色\n        cancelColor: {\n            type: String,\n            default: uni.$u.props.datetimePicker.cancelColor\n        },\n        // 确认按钮的颜色\n        confirmColor: {\n            type: String,\n            default: uni.$u.props.datetimePicker.confirmColor\n        },\n        // 每列中可见选项的数量\n        visibleItemCount: {\n            type: [String, Number],\n            default: uni.$u.props.datetimePicker.visibleItemCount\n        },\n        // 是否允许点击遮罩关闭选择器\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.datetimePicker.closeOnClickOverlay\n        },\n        // 各列的默认索引\n        defaultIndex: {\n            type: Array,\n            default: uni.$u.props.datetimePicker.defaultIndex\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue",
    "content": "<template>\n\t<u-picker\n\t\tref=\"picker\"\n\t\t:show=\"show\"\n\t\t:closeOnClickOverlay=\"closeOnClickOverlay\"\n\t\t:columns=\"columns\"\n\t\t:title=\"title\"\n\t\t:itemHeight=\"itemHeight\"\n\t\t:showToolbar=\"showToolbar\"\n\t\t:visibleItemCount=\"visibleItemCount\"\n\t\t:defaultIndex=\"innerDefaultIndex\"\n\t\t:cancelText=\"cancelText\"\n\t\t:confirmText=\"confirmText\"\n\t\t:cancelColor=\"cancelColor\"\n\t\t:confirmColor=\"confirmColor\"\n\t\t@close=\"close\"\n\t\t@cancel=\"cancel\"\n\t\t@confirm=\"confirm\"\n\t\t@change=\"change\"\n\t>\n\t</u-picker>\n</template>\n\n<script>\n\tfunction times(n, iteratee) {\n\t    let index = -1\n\t    const result = Array(n < 0 ? 0 : n)\n\t    while (++index < n) {\n\t        result[index] = iteratee(index)\n\t    }\n\t    return result\n\t}\n\timport props from './props.js';\n\timport dayjs from '../../libs/util/dayjs.js';\n\t/**\n\t * DatetimePicker 时间日期选择器\n\t * @description 此选择器用于时间日期\n\t * @tutorial https://www.uviewui.com/components/datetimePicker.html\n\t * @property {Boolean}\t\t\tshow\t\t\t\t用于控制选择器的弹出与收起 ( 默认 false )\n\t * @property {Boolean}\t\t\tshowToolbar\t\t\t是否显示顶部的操作栏  ( 默认 true )\n\t * @property {String | Number}\tvalue\t\t\t\t绑定值\n\t * @property {String}\t\t\ttitle\t\t\t\t顶部标题\n\t * @property {String}\t\t\tmode\t\t\t\t展示格式 mode=date为日期选择，mode=time为时间选择，mode=year-month为年月选择，mode=datetime为日期时间选择  ( 默认 ‘datetime )\n\t * @property {Number}\t\t\tmaxDate\t\t\t\t可选的最大时间  默认值为后10年\n\t * @property {Number}\t\t\tminDate\t\t\t\t可选的最小时间  默认值为前10年\n\t * @property {Number}\t\t\tminHour\t\t\t\t可选的最小小时，仅mode=time有效   ( 默认 0 )\n\t * @property {Number}\t\t\tmaxHour\t\t\t\t可选的最大小时，仅mode=time有效\t  ( 默认 23 )\n\t * @property {Number}\t\t\tminMinute\t\t\t可选的最小分钟，仅mode=time有效\t  ( 默认 0 )\n\t * @property {Number}\t\t\tmaxMinute\t\t\t可选的最大分钟，仅mode=time有效   ( 默认 59 )\n\t * @property {Function}\t\t\tfilter\t\t\t\t选项过滤函数\n\t * @property {Function}\t\t\tformatter\t\t\t选项格式化函数\n\t * @property {Boolean}\t\t\tloading\t\t\t\t是否显示加载中状态   ( 默认 false )\n\t * @property {String | Number}\titemHeight\t\t\t各列中，单个选项的高度   ( 默认 44 )\n\t * @property {String}\t\t\tcancelText\t\t\t取消按钮的文字  ( 默认 '取消' )\n\t * @property {String}\t\t\tconfirmText\t\t\t确认按钮的文字  ( 默认 '确认' )\n\t * @property {String}\t\t\tcancelColor\t\t\t取消按钮的颜色  ( 默认 '#909193' )\n\t * @property {String}\t\t\tconfirmColor\t\t确认按钮的颜色  ( 默认 '#3c9cff' )\n\t * @property {String | Number}\tvisibleItemCount\t每列中可见选项的数量  ( 默认 5 )\n\t * @property {Boolean}\t\t\tcloseOnClickOverlay\t是否允许点击遮罩关闭选择器  ( 默认 false )\n\t * @property {Array}\t\t\tdefaultIndex\t\t各列的默认索引\n\t * @event {Function} close 关闭选择器时触发\n\t * @event {Function} confirm 点击确定按钮，返回当前选择的值\n\t * @event {Function} change 当选择值变化时触发\n\t * @event {Function} cancel 点击取消按钮\n\t * @example  <u-datetime-picker :show=\"show\" :value=\"value1\"  mode=\"datetime\" ></u-datetime-picker>\n\t */\n\texport default {\n\t\tname: 'datetime-picker',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tcolumns: [],\n\t\t\t\tinnerDefaultIndex: [],\n\t\t\t\tinnerFormatter: (type, value) => value\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tshow(newValue, oldValue) {\n\t\t\t\tif (newValue) {\n\t\t\t\t\tthis.updateColumnValue(this.innerValue)\n\t\t\t\t}\n\t\t\t},\n\t\t\tpropsChange() {\n\t\t\t\tthis.init()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 如果以下这些变量发生了变化，意味着需要重新初始化各列的值\n\t\t\tpropsChange() {\n\t\t\t\treturn [this.mode, this.maxDate, this.minDate, this.minHour, this.maxHour, this.minMinute, this.maxMinute, this.filter, ]\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tthis.innerValue = this.correctValue(this.value)\n\t\t\t\tthis.updateColumnValue(this.innerValue)\n\t\t\t},\n\t\t\t// 在微信小程序中，不支持将函数当做props参数，故只能通过ref形式调用\n\t\t\tsetFormatter(e) {\n\t\t\t\tthis.innerFormatter = e\n\t\t\t},\n\t\t\t// 关闭选择器\n\t\t\tclose() {\n\t\t\t\tif (this.closeOnClickOverlay) {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 点击工具栏的取消按钮\n\t\t\tcancel() {\n\t\t\t\tthis.$emit('cancel')\n\t\t\t},\n\t\t\t// 点击工具栏的确定按钮\n\t\t\tconfirm() {\n\t\t\t\tthis.$emit('confirm', {\n\t\t\t\t\tvalue: this.innerValue,\n\t\t\t\t\tmode: this.mode\n\t\t\t\t})\n\t\t\t\tthis.$emit('input', this.innerValue)\n\t\t\t},\n\t\t\t//用正则截取输出值,当出现多组数字时,抛出错误\n\t\t\tintercept(e,type){\n\t\t\t\tlet judge = e.match(/\\d+/g)\n\t\t\t\t//判断是否掺杂数字\n\t\t\t\tif(judge.length>1){\n\t\t\t\t\tuni.$u.error(\"请勿在过滤或格式化函数时添加数字\")\n\t\t\t\t\treturn 0\n\t\t\t\t}else if(type&&judge[0].length==4){//判断是否是年份\n\t\t\t\t\treturn judge[0]\n\t\t\t\t}else if(judge[0].length>2){\n\t\t\t\t\tuni.$u.error(\"请勿在过滤或格式化函数时添加数字\")\n\t\t\t\t\treturn 0\n\t\t\t\t}else{\n\t\t\t\t\treturn judge[0]\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 列发生变化时触发\n\t\t\tchange(e) {\n\t\t\t\tconst { indexs, values } = e\n\t\t\t\tlet selectValue = ''\n\t\t\t\tif(this.mode === 'time') {\n\t\t\t\t\t// 根据value各列索引，从各列数组中，取出当前时间的选中值\n\t\t\t\t\tselectValue = `${this.intercept(values[0][indexs[0]])}:${this.intercept(values[1][indexs[1]])}`\n\t\t\t\t} else {\n\t\t\t\t\t// 将选择的值转为数值，比如'03'转为数值的3，'2019'转为数值的2019\n\t\t\t\t\tconst year = parseInt(this.intercept(values[0][indexs[0]],'year'))\n\t\t\t\t\tconst month = parseInt(this.intercept(values[1][indexs[1]]))\n\t\t\t\t\tlet date = parseInt(values[2] ? this.intercept(values[2][indexs[2]]) : 1)\n\t\t\t\t\tlet hour = 0, minute = 0\n\t\t\t\t\t// 此月份的最大天数\n\t\t\t\t\tconst maxDate = dayjs(`${year}-${month}`).daysInMonth()\n\t\t\t\t\t// year-month模式下，date不会出现在列中，设置为1，为了符合后边需要减1的需求\n\t\t\t\t\tif (this.mode === 'year-month') {\n\t\t\t\t\t    date = 1\n\t\t\t\t\t}\n\t\t\t\t\t// 不允许超过maxDate值\n\t\t\t\t\tdate = Math.min(maxDate, date)\n\t\t\t\t\tif (this.mode === 'datetime') {\n\t\t\t\t\t    hour = parseInt(this.intercept(values[3][indexs[3]]))\n\t\t\t\t\t    minute = parseInt(this.intercept(values[4][indexs[4]]))\n\t\t\t\t\t}\n\t\t\t\t\t// 转为时间模式\n\t\t\t\t\tselectValue = Number(new Date(year, month - 1, date, hour, minute))\n\t\t\t\t}\n\t\t\t\t// 取出准确的合法值，防止超越边界的情况\n\t\t\t\tselectValue = this.correctValue(selectValue)\n\t\t\t\tthis.innerValue = selectValue\n\t\t\t\tthis.updateColumnValue(selectValue)\n\t\t\t\t// 发出change时间，value为当前选中的时间戳\n\t\t\t\tthis.$emit('change', {\n\t\t\t\t\tvalue: selectValue,\n\t\t\t\t\t// #ifndef MP-WEIXIN\n\t\t\t\t\t// 微信小程序不能传递this实例，会因为循环引用而报错\n\t\t\t\t\tpicker: this.$refs.picker,\n\t\t\t\t\t// #endif\n\t\t\t\t\tmode: this.mode\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 更新各列的值，进行补0、格式化等操作\n\t\t\tupdateColumnValue(value) {\n\t\t\t\tthis.innerValue = value\n\t\t\t\tthis.updateColumns()\n\t\t\t\tthis.updateIndexs(value)\n\t\t\t},\n\t\t\t// 更新索引\n\t\t\tupdateIndexs(value) {\n\t\t\t\tlet values = []\n\t\t\t\tconst formatter = this.formatter || this.innerFormatter\n\t\t\t\tconst padZero = uni.$u.padZero\n\t\t\t\tif (this.mode === 'time') {\n\t\t\t\t\t// 将time模式的时间用:分隔成数组\n\t\t\t\t    const timeArr = value.split(':')\n\t\t\t\t\t// 使用formatter格式化方法进行管道处理\n\t\t\t\t    values = [formatter('hour', timeArr[0]), formatter('minute', timeArr[1])]\n\t\t\t\t} else {\n\t\t\t\t    const date = new Date(value)\n\t\t\t\t    values = [\n\t\t\t\t        formatter('year', `${dayjs(value).year()}`),\n\t\t\t\t\t\t// 月份补0\n\t\t\t\t        formatter('month', padZero(dayjs(value).month() + 1))\n\t\t\t\t    ]\n\t\t\t\t    if (this.mode === 'date') {\n\t\t\t\t\t\t// date模式，需要添加天列\n\t\t\t\t        values.push(formatter('day', padZero(dayjs(value).date())))\n\t\t\t\t    }\n\t\t\t\t    if (this.mode === 'datetime') {\n\t\t\t\t\t\t// 数组的push方法，可以写入多个参数\n\t\t\t\t        values.push(formatter('day', padZero(dayjs(value).date())), formatter('hour', padZero(dayjs(value).hour())), formatter('minute', padZero(dayjs(value).minute())))\n\t\t\t\t    }\n\t\t\t\t}\n\n\t\t\t\t// 根据当前各列的所有值，从各列默认值中找到默认值在各列中的索引\n\t\t\t\tconst indexs = this.columns.map((column, index) => {\n\t\t\t\t\t// 通过取大值，可以保证不会出现找不到索引的-1情况\n\t\t\t\t\treturn Math.max(0, column.findIndex(item => item === values[index]))\n\t\t\t\t})\n\t\t\t\tthis.innerDefaultIndex = indexs\n\t\t\t},\n\t\t\t// 更新各列的值\n\t\t\tupdateColumns() {\n\t\t\t    const formatter = this.formatter || this.innerFormatter\n\t\t\t\t// 获取各列的值，并且map后，对各列的具体值进行补0操作\n\t\t\t    const results = this.getOriginColumns().map((column) => column.values.map((value) => formatter(column.type, value)))\n\t\t\t\tthis.columns = results\n\t\t\t},\n\t\t\tgetOriginColumns() {\n\t\t\t    // 生成各列的值\n\t\t\t    const results = this.getRanges().map(({ type, range }) => {\n\t\t\t        let values = times(range[1] - range[0] + 1, (index) => {\n\t\t\t            let value = range[0] + index\n\t\t\t            value = type === 'year' ? `${value}` : uni.$u.padZero(value)\n\t\t\t            return value\n\t\t\t        })\n\t\t\t\t\t// 进行过滤\n\t\t\t        if (this.filter) {\n\t\t\t            values = this.filter(type, values)\n\t\t\t        }\n\t\t\t        return { type, values }\n\t\t\t    })\n\t\t\t    return results\n\t\t\t},\n\t\t\t// 通过最大值和最小值生成数组\n\t\t\tgenerateArray(start, end) {\n\t\t\t\treturn Array.from(new Array(end + 1).keys()).slice(start)\n\t\t\t},\n\t\t\t// 得出合法的时间\n\t\t\tcorrectValue(value) {\n\t\t\t\tconst isDateMode = this.mode !== 'time'\n\t\t\t\tif (isDateMode && !uni.$u.test.date(value)) {\n\t\t\t\t\t// 如果是日期类型，但是又没有设置合法的当前时间的话，使用最小时间为当前时间\n\t\t\t\t\tvalue = this.minDate\n\t\t\t\t} else if (!isDateMode && !value) {\n\t\t\t\t\t// 如果是时间类型，而又没有默认值的话，就用最小时间\n\t\t\t\t\tvalue = `${uni.$u.padZero(this.minHour)}:${uni.$u.padZero(this.minMinute)}`\n\t\t\t\t}\n\t\t\t\t// 时间类型\n\t\t\t\tif (!isDateMode) {\n\t\t\t\t\tif (String(value).indexOf(':') === -1) return uni.$u.error('时间错误，请传递如12:24的格式')\n\t\t\t\t\tlet [hour, minute] = value.split(':')\n\t\t\t\t\t// 对时间补零，同时控制在最小值和最大值之间\n\t\t\t\t\thour = uni.$u.padZero(uni.$u.range(this.minHour, this.maxHour, Number(hour)))\n\t\t\t\t\tminute = uni.$u.padZero(uni.$u.range(this.minMinute, this.maxMinute, Number(minute)))\n\t\t\t\t\treturn `${ hour }:${ minute }`\n\t\t\t\t} else {\n\t\t\t\t\t// 如果是日期格式，控制在最小日期和最大日期之间\n\t\t\t\t\tvalue = dayjs(value).isBefore(dayjs(this.minDate)) ? this.minDate : value\n\t\t\t\t\tvalue = dayjs(value).isAfter(dayjs(this.maxDate)) ? this.maxDate : value\n\t\t\t\t\treturn value\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 获取每列的最大和最小值\n\t\t\tgetRanges() {\n\t\t\t    if (this.mode === 'time') {\n\t\t\t        return [\n\t\t\t            {\n\t\t\t                type: 'hour',\n\t\t\t                range: [this.minHour, this.maxHour],\n\t\t\t            },\n\t\t\t            {\n\t\t\t                type: 'minute',\n\t\t\t                range: [this.minMinute, this.maxMinute],\n\t\t\t            },\n\t\t\t        ];\n\t\t\t    }\n\t\t\t    const { maxYear, maxDate, maxMonth, maxHour, maxMinute, } = this.getBoundary('max', this.innerValue);\n\t\t\t    const { minYear, minDate, minMonth, minHour, minMinute, } = this.getBoundary('min', this.innerValue);\n\t\t\t    const result = [\n\t\t\t        {\n\t\t\t            type: 'year',\n\t\t\t            range: [minYear, maxYear],\n\t\t\t        },\n\t\t\t        {\n\t\t\t            type: 'month',\n\t\t\t            range: [minMonth, maxMonth],\n\t\t\t        },\n\t\t\t        {\n\t\t\t            type: 'day',\n\t\t\t            range: [minDate, maxDate],\n\t\t\t        },\n\t\t\t        {\n\t\t\t            type: 'hour',\n\t\t\t            range: [minHour, maxHour],\n\t\t\t        },\n\t\t\t        {\n\t\t\t            type: 'minute',\n\t\t\t            range: [minMinute, maxMinute],\n\t\t\t        },\n\t\t\t    ];\n\t\t\t    if (this.mode === 'date')\n\t\t\t        result.splice(3, 2);\n\t\t\t    if (this.mode === 'year-month')\n\t\t\t        result.splice(2, 3);\n\t\t\t    return result;\n\t\t\t},\n\t\t\t// 根据minDate、maxDate、minHour、maxHour等边界值，判断各列的开始和结束边界值\n\t\t\tgetBoundary(type, innerValue) {\n\t\t\t    const value = new Date(innerValue)\n\t\t\t    const boundary = new Date(this[`${type}Date`])\n\t\t\t    const year = dayjs(boundary).year()\n\t\t\t    let month = 1\n\t\t\t    let date = 1\n\t\t\t    let hour = 0\n\t\t\t    let minute = 0\n\t\t\t    if (type === 'max') {\n\t\t\t        month = 12\n\t\t\t\t\t// 月份的天数\n\t\t\t        date = dayjs(value).daysInMonth()\n\t\t\t        hour = 23\n\t\t\t        minute = 59\n\t\t\t    }\n\t\t\t\t// 获取边界值，逻辑是：当年达到了边界值(最大或最小年)，就检查月允许的最大和最小值，以此类推\n\t\t\t    if (dayjs(value).year() === year) {\n\t\t\t        month = dayjs(boundary).month() + 1\n\t\t\t        if (dayjs(value).month() + 1 === month) {\n\t\t\t            date = dayjs(boundary).date()\n\t\t\t            if (dayjs(value).date() === date) {\n\t\t\t                hour = dayjs(boundary).hour()\n\t\t\t                if (dayjs(value).hour() === hour) {\n\t\t\t                    minute = dayjs(boundary).minute()\n\t\t\t                }\n\t\t\t            }\n\t\t\t        }\n\t\t\t    }\n\t\t\t    return {\n\t\t\t        [`${type}Year`]: year,\n\t\t\t        [`${type}Month`]: month,\n\t\t\t        [`${type}Date`]: date,\n\t\t\t        [`${type}Hour`]: hour,\n\t\t\t        [`${type}Minute`]: minute\n\t\t\t    }\n\t\t\t},\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-divider/props.js",
    "content": "export default {\n    props: {\n        // 是否虚线\n        dashed: {\n            type: Boolean,\n            default: uni.$u.props.divider.dashed\n        },\n        // 是否细线\n        hairline: {\n            type: Boolean,\n            default: uni.$u.props.divider.hairline\n        },\n        // 是否以点替代文字，优先于text字段起作用\n        dot: {\n            type: Boolean,\n            default: uni.$u.props.divider.dot\n        },\n        // 内容文本的位置，left-左边，center-中间，right-右边\n        textPosition: {\n            type: String,\n            default: uni.$u.props.divider.textPosition\n        },\n        // 文本内容\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.divider.text\n        },\n        // 文本大小\n        textSize: {\n            type: [String, Number],\n            default: uni.$u.props.divider.textSize\n        },\n        // 文本颜色\n        textColor: {\n            type: String,\n            default: uni.$u.props.divider.textColor\n        },\n        // 线条颜色\n        lineColor: {\n            type: String,\n            default: uni.$u.props.divider.lineColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-divider/u-divider.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-divider\"\n\t    :style=\"[$u.addStyle(customStyle)]\"\n\t\t@tap=\"click\"\n\t>\n\t\t<u-line\n\t\t    :color=\"lineColor\"\n\t\t    :customStyle=\"leftLineStyle\"\n\t\t    :hairline=\"hairline\"\n\t\t\t:dashed=\"dashed\"\n\t\t></u-line>\n\t\t<text\n\t\t    v-if=\"dot\"\n\t\t    class=\"u-divider__dot\"\n\t\t>●</text>\n\t\t<text\n\t\t    v-else-if=\"text\"\n\t\t    class=\"u-divider__text\"\n\t\t    :style=\"[textStyle]\"\n\t\t>{{text}}</text>\n\t\t<u-line\n\t\t    :color=\"lineColor\"\n\t\t    :customStyle=\"rightLineStyle\"\n\t\t    :hairline=\"hairline\"\n\t\t\t:dashed=\"dashed\"\n\t\t></u-line>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * divider 分割线\n\t * @description 区隔内容的分割线，一般用于页面底部\"没有更多\"的提示。\n\t * @tutorial https://www.uviewui.com/components/divider.html\n\t * @property {Boolean}\t\t\tdashed\t\t\t是否虚线 （默认 false ）\n\t * @property {Boolean}\t\t\thairline\t\t是否细线 （默认  true ）\n\t * @property {Boolean}\t\t\tdot\t\t\t\t是否以点替代文字，优先于text字段起作用 （默认 false ）\n\t * @property {String}\t\t\ttextPosition\t内容文本的位置，left-左边，center-中间，right-右边 （默认 'center' ）\n\t * @property {String | Number}\ttext\t\t\t文本内容\n\t * @property {String | Number}\ttextSize\t\t文本大小 （默认 14）\n\t * @property {String}\t\t\ttextColor\t\t文本颜色 （默认 '#909399' ）\n\t * @property {String}\t\t\tlineColor\t\t线条颜色 （默认 '#dcdfe6' ）\n\t * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t *\n\t * @event {Function}\tclick\tdivider组件被点击时触发\n\t * @example <u-divider :color=\"color\">锦瑟无端五十弦</u-divider>\n\t */\n\texport default {\n\t\tname:'u-divider',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\ttextStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.fontSize = uni.$u.addUnit(this.textSize)\n\t\t\t\tstyle.color = this.textColor\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 左边线条的的样式\n\t\t\tleftLineStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\t// 如果是在左边，设置左边的宽度为固定值\n\t\t\t\tif (this.textPosition === 'left') {\n\t\t\t\t\tstyle.width = '80rpx'\n\t\t\t\t} else {\n\t\t\t\t\tstyle.flex = 1\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 右边线条的的样式\n\t\t\trightLineStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\t// 如果是在右边，设置右边的宽度为固定值\n\t\t\t\tif (this.textPosition === 'right') {\n\t\t\t\t\tstyle.width = '80rpx'\n\t\t\t\t} else {\n\t\t\t\t\tstyle.flex = 1\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// divider组件被点击时触发\n\t\t\tclick() {\n\t\t\t\tthis.$emit('click');\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n\t$u-divider-margin:15px 0 !default;\n\t$u-divider-text-margin:0 15px !default;\n\t$u-divider-dot-font-size:12px !default;\n\t$u-divider-dot-margin:0 12px !default;\n\t$u-divider-dot-color: #c0c4cc !default;\n\n\t.u-divider {\n\t\t@include flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tmargin: $u-divider-margin;\n\n\t\t&__text {\n\t\t\tmargin: $u-divider-text-margin;\n\t\t}\n\n\t\t&__dot {\n\t\t\tfont-size: $u-divider-dot-font-size;\n\t\t\tmargin: $u-divider-dot-margin;\n\t\t\tcolor: $u-divider-dot-color;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-dropdown/props.js",
    "content": "export default {\n    props: {\n        // 标题选中时的样式\n        activeStyle: {\n            type: [String, Object],\n            default: () => ({\n                color: '#2979ff',\n                fontSize: '14px'\n            })\n        },\n        // 标题未选中时的样式\n        inactiveStyle: {\n            type: [String, Object],\n            default: () => ({\n                color: '#606266',\n                fontSize: '14px'\n            })\n        },\n        // 点击遮罩是否关闭菜单\n        closeOnClickMask: {\n            type: Boolean,\n            default: true\n        },\n        // 点击当前激活项标题是否关闭菜单\n        closeOnClickSelf: {\n            type: Boolean,\n            default: true\n        },\n        // 过渡时间\n        duration: {\n            type: [Number, String],\n            default: 300\n        },\n        // 标题菜单的高度\n        height: {\n            type: [Number, String],\n            default: 40\n        },\n        // 是否显示下边框\n        borderBottom: {\n            type: Boolean,\n            default: false\n        },\n        // 标题的字体大小\n        titleSize: {\n            type: [Number, String],\n            default: 14\n        },\n        // 下拉出来的内容部分的圆角值\n        borderRadius: {\n            type: [Number, String],\n            default: 0\n        },\n        // 菜单右侧的icon图标\n        menuIcon: {\n            type: String,\n            default: 'arrow-down'\n        },\n        // 菜单右侧图标的大小\n        menuIconSize: {\n            type: [Number, String],\n            default: 14\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-dropdown/u-dropdown.vue",
    "content": "<template>\n  <view class=\"u-drawdown\">\n    <view\n      class=\"u-dropdown__menu\"\n      :style=\"{\n\t\t\t\theight: $u.addUnit(height)\n\t\t\t}\"\n      ref=\"u-dropdown__menu\"\n    >\n      <view\n        class=\"u-dropdown__menu__item\"\n        v-for=\"(item, index) in menuList\"\n        :key=\"index\"\n        @tap.stop=\"clickHandler(item, index)\"\n      >\n        <view class=\"u-dropdown__menu__item__content\">\n          <text\n            class=\"u-dropdown__menu__item__content__text\"\n            :style=\"[index === current ? activeStyle : inactiveStyle]\"\n          >{{item.title}}</text>\n          <view\n            class=\"u-dropdown__menu__item__content__arrow\"\n            :class=\"[index === current && 'u-dropdown__menu__item__content__arrow--rotate']\"\n          >\n            <u-icon\n              :name=\"menuIcon\"\n              :size=\"$u.addUnit(menuIconSize)\"\n            ></u-icon>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"u-dropdown__content\">\n      <slot />\n    </view>\n  </view>\n</template>\n\n<script>\nimport props from './props.js';\n/**\n * Dropdown\n * @description\n * @tutorial url\n * @property {String}\n * @event {Function}\n * @example\n */\nexport default {\n  name: 'u-dropdown',\n  mixins: [uni.$u.mixin, props],\n  data() {\n    return {\n      // �˵�����\n      menuList: [],\n      current: 0\n    }\n  },\n  computed: {\n  \n  },\n  created() {\n    // �������������(u-dropdown-item)��this��������data������������������΢��С��������ѭ�����ö�����\n    this.children = [];\n  },\n  methods: {\n    clickHandler(item, index) {\n      this.children.map(child => {\n        if(child.title === item.title) {\n          // this.queryRect('u-dropdown__menu').then(size => {\n          child.$emit('click')\n          child.setContentAnimate(child.show ? 0 : 300)\n          child.show = !child.show\n          // })\n        } else {\n          child.show = false\n          child.setContentAnimate(0)\n        }\n      })\n    },\n    // ��ȡ��ǩ�ĳߴ�λ��\n    queryRect(el) {\n      // #ifndef APP-NVUE\n      // $uGetRectΪuView�Դ��Ľڵ��ѯ�򻯷���������ĵ����ܣ�https://www.uviewui.com/js/getRect.html\n      // ����ڲ�һ����this.$uGetRect�������Ϊthis.$u.getRect�����߹���һ�£����Ʋ�ͬ\n      return new Promise(resolve => {\n        this.$uGetRect(`.${el}`).then(size => {\n          resolve(size)\n        })\n      })\n      // #endif\n      \n      // #ifdef APP-NVUE\n      // nvue�£�ʹ��domģ���ѯԪ�ظ߶�\n      // ����һ��promise���õ��ô˷�����������ʹ��then�ص�\n      return new Promise(resolve => {\n        dom.getComponentRect(this.$refs[el], res => {\n          resolve(res.size)\n        })\n      })\n      // #endif\n    },\n  },\n}\n</script>\n\n<style lang=\"scss\">\n@import '../../libs/css/components.scss';\n\n.u-dropdown {\n  \n  &__menu {\n    @include flex;\n    \n    &__item {\n      flex: 1;\n      @include flex;\n      justify-content: center;\n      \n      &__content {\n        @include flex;\n        align-items: center;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-dropdown-item/props.js",
    "content": "export default {\n    props: {\n        // 当前选中项的value值\n        value: {\n            type: [Number, String, Array],\n            default: ''\n        },\n        // 菜单项标题\n        title: {\n            type: [String, Number],\n            default: ''\n        },\n        // 选项数据，如果传入了默认slot，此参数无效\n        options: {\n            type: Array,\n            default() {\n                return []\n            }\n        },\n        // 是否禁用此菜单项\n        disabled: {\n            type: Boolean,\n            default: false\n        },\n        // 下拉弹窗的高度\n        height: {\n            type: [Number, String],\n            default: 'auto'\n        },\n        // 点击遮罩是否可以收起弹窗\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: true\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue",
    "content": "<template>\n  <view class=\"u-drawdown\">\n    <view\n      class=\"u-dropdown__menu\"\n      :style=\"{\n\t\t\t\theight: $u.addUnit(height)\n\t\t\t}\"\n      ref=\"u-dropdown__menu\"\n    >\n      <view\n        class=\"u-dropdown__menu__item\"\n        v-for=\"(item, index) in menuList\"\n        :key=\"index\"\n        @tap.stop=\"clickHandler(item, index)\"\n      >\n        <view class=\"u-dropdown__menu__item__content\">\n          <text\n            class=\"u-dropdown__menu__item__content__text\"\n            :style=\"[index === current ? activeStyle : inactiveStyle]\"\n          >{{item.title}}</text>\n          <view\n            class=\"u-dropdown__menu__item__content__arrow\"\n            :class=\"[index === current && 'u-dropdown__menu__item__content__arrow--rotate']\"\n          >\n            <u-icon\n              :name=\"menuIcon\"\n              :size=\"$u.addUnit(menuIconSize)\"\n            ></u-icon>\n          </view>\n        </view>\n      </view>\n    </view>\n    <view class=\"u-dropdown__content\">\n      <slot />\n    </view>\n  </view>\n</template>\n\n<script>\nimport props from './props.js';\n/**\n * Dropdown\n * @description\n * @tutorial url\n * @property {String}\n * @event {Function}\n * @example\n */\nexport default {\n  name: 'u-dropdown',\n  mixins: [uni.$u.mixin, props],\n  data() {\n    return {\n      // �˵�����\n      menuList: [],\n      current: 0\n    }\n  },\n  computed: {\n  \n  },\n  created() {\n    // �������������(u-dropdown-item)��this��������data������������������΢��С��������ѭ�����ö�����\n    this.children = [];\n  },\n  methods: {\n    clickHandler(item, index) {\n      this.children.map(child => {\n        if(child.title === item.title) {\n          // this.queryRect('u-dropdown__menu').then(size => {\n          child.$emit('click')\n          child.setContentAnimate(child.show ? 0 : 300)\n          child.show = !child.show\n          // })\n        } else {\n          child.show = false\n          child.setContentAnimate(0)\n        }\n      })\n    },\n    // ��ȡ��ǩ�ĳߴ�λ��\n    queryRect(el) {\n      // #ifndef APP-NVUE\n      // $uGetRectΪuView�Դ��Ľڵ��ѯ�򻯷���������ĵ����ܣ�https://www.uviewui.com/js/getRect.html\n      // ����ڲ�һ����this.$uGetRect�������Ϊthis.$u.getRect�����߹���һ�£����Ʋ�ͬ\n      return new Promise(resolve => {\n        this.$uGetRect(`.${el}`).then(size => {\n          resolve(size)\n        })\n      })\n      // #endif\n      \n      // #ifdef APP-NVUE\n      // nvue�£�ʹ��domģ���ѯԪ�ظ߶�\n      // ����һ��promise���õ��ô˷�����������ʹ��then�ص�\n      return new Promise(resolve => {\n        dom.getComponentRect(this.$refs[el], res => {\n          resolve(res.size)\n        })\n      })\n      // #endif\n    },\n  },\n}\n</script>\n\n<style lang=\"scss\">\n@import '../../libs/css/components.scss';\n\n.u-dropdown {\n  \n  &__menu {\n    @include flex;\n    \n    &__item {\n      flex: 1;\n      @include flex;\n      justify-content: center;\n      \n      &__content {\n        @include flex;\n        align-items: center;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-empty/props.js",
    "content": "export default {\n    props: {\n        // 内置图标名称，或图片路径，建议绝对路径\n        icon: {\n            type: String,\n            default: uni.$u.props.empty.icon\n        },\n        // 提示文字\n        text: {\n            type: String,\n            default: uni.$u.props.empty.text\n        },\n        // 文字颜色\n        textColor: {\n            type: String,\n            default: uni.$u.props.empty.textColor\n        },\n        // 文字大小\n        textSize: {\n            type: [String, Number],\n            default: uni.$u.props.empty.textSize\n        },\n        // 图标的颜色\n        iconColor: {\n            type: String,\n            default: uni.$u.props.empty.iconColor\n        },\n        // 图标的大小\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.empty.iconSize\n        },\n        // 选择预置的图标类型\n        mode: {\n            type: String,\n            default: uni.$u.props.empty.mode\n        },\n        //  图标宽度，单位px\n        width: {\n            type: [String, Number],\n            default: uni.$u.props.empty.width\n        },\n        // 图标高度，单位px\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.empty.height\n        },\n        // 是否显示组件\n        show: {\n            type: Boolean,\n            default: uni.$u.props.empty.show\n        },\n        // 组件距离上一个元素之间的距离，默认px单位\n        marginTop: {\n            type: [String, Number],\n            default: uni.$u.props.empty.marginTop\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-empty/u-empty.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-empty\"\n\t    :style=\"[emptyStyle]\"\n\t    v-if=\"show\"\n\t>\n\t\t<u-icon\n\t\t    v-if=\"!isSrc\"\n\t\t    :name=\"mode === 'message' ? 'chat' : `empty-${mode}`\"\n\t\t    :size=\"iconSize\"\n\t\t    :color=\"iconColor\"\n\t\t    margin-top=\"14\"\n\t\t></u-icon>\n\t\t<image\n\t\t    v-else\n\t\t    :style=\"{\n\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\theight: $u.addUnit(height),\n\t\t\t}\"\n\t\t    :src=\"icon\"\n\t\t    mode=\"widthFix\"\n\t\t></image>\n\t\t<text\n\t\t    class=\"u-empty__text\"\n\t\t    :style=\"[textStyle]\"\n\t\t>{{text ? text : icons[mode]}}</text>\n\t\t<view class=\"u-empty__wrap\" v-if=\"$slots.default || $slots.$default\">\n\t\t\t<slot />\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * empty 内容为空\n\t * @description 该组件用于需要加载内容，但是加载的第一页数据就为空，提示一个\"没有内容\"的场景， 我们精心挑选了十几个场景的图标，方便您使用。\n\t * @tutorial https://www.uviewui.com/components/empty.html\n\t * @property {String}\t\t\ticon\t\t内置图标名称，或图片路径，建议绝对路径\n\t * @property {String}\t\t\ttext\t\t提示文字\n\t * @property {String}\t\t\ttextColor\t文字颜色 (默认 '#c0c4cc' )\n\t * @property {String | Number}\ttextSize\t文字大小 （默认 14 ）\n\t * @property {String}\t\t\ticonColor\t图标的颜色 （默认 '#c0c4cc' ）\n\t * @property {String | Number}\ticonSize\t图标的大小 （默认 90 ）\n\t * @property {String}\t\t\tmode\t\t选择预置的图标类型 （默认 'data' ）\n\t * @property {String | Number}\twidth\t\t图标宽度，单位px （默认 160 ）\n\t * @property {String | Number}\theight\t\t图标高度，单位px （默认 160 ）\n\t * @property {Boolean}\t\t\tshow\t\t是否显示组件 （默认 true ）\n\t * @property {String | Number}\tmarginTop\t组件距离上一个元素之间的距离，默认px单位 （默认 0 ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @event {Function} click 点击组件时触发\n\t * @event {Function} close 点击关闭按钮时触发\n\t * @example <u-empty text=\"所谓伊人，在水一方\" mode=\"list\"></u-empty>\n\t */\n\texport default {\n\t\tname: \"u-empty\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\ticons: {\n\t\t\t\t\tcar: '购物车为空',\n\t\t\t\t\tpage: '页面不存在',\n\t\t\t\t\tsearch: '没有搜索结果',\n\t\t\t\t\taddress: '没有收货地址',\n\t\t\t\t\twifi: '没有WiFi',\n\t\t\t\t\torder: '订单为空',\n\t\t\t\t\tcoupon: '没有优惠券',\n\t\t\t\t\tfavor: '暂无收藏',\n\t\t\t\t\tpermission: '无权限',\n\t\t\t\t\thistory: '无历史记录',\n\t\t\t\t\tnews: '无新闻列表',\n\t\t\t\t\tmessage: '消息列表为空',\n\t\t\t\t\tlist: '列表为空',\n\t\t\t\t\tdata: '数据为空',\n\t\t\t\t\tcomment: '暂无评论',\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 组件样式\n\t\t\temptyStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.marginTop = uni.$u.addUnit(this.marginTop)\n\t\t\t\t// 合并customStyle样式，此参数通过mixin中的props传递\n\t\t\t\treturn uni.$u.deepMerge(uni.$u.addStyle(this.customStyle), style)\n\t\t\t},\n\t\t\t// 文本样式\n\t\t\ttextStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.color = this.textColor\n\t\t\t\tstyle.fontSize = uni.$u.addUnit(this.textSize)\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 判断icon是否图片路径\n\t\t\tisSrc() {\n\t\t\t\treturn this.icon.indexOf('/') >= 0\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n\t$u-empty-text-margin-top:20rpx !default;\n\t$u-empty-slot-margin-top:20rpx !default;\n\n\t.u-empty {\n\t\t@include flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\n\t\t&__text {\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tmargin-top: $u-empty-text-margin-top;\n\t\t}\n\t}\n\t\t.u-slot-wrap {\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tmargin-top:$u-empty-slot-margin-top;\n\t\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-form/props.js",
    "content": "export default {\n    props: {\n        // 当前form的需要验证字段的集合\n        model: {\n            type: Object,\n            default: uni.$u.props.form.model\n        },\n        // 验证规则\n        rules: {\n            type: [Object, Function, Array],\n            default: uni.$u.props.form.rules\n        },\n        // 有错误时的提示方式，message-提示信息，toast-进行toast提示\n        // border-bottom-下边框呈现红色，none-无提示\n        errorType: {\n            type: String,\n            default: uni.$u.props.form.errorType\n        },\n        // 是否显示表单域的下划线边框\n        borderBottom: {\n            type: Boolean,\n            default: uni.$u.props.form.borderBottom\n        },\n        // label的位置，left-左边，top-上边\n        labelPosition: {\n            type: String,\n            default: uni.$u.props.form.labelPosition\n        },\n        // label的宽度，单位px\n        labelWidth: {\n            type: [String, Number],\n            default: uni.$u.props.form.labelWidth\n        },\n        // lable字体的对齐方式\n        labelAlign: {\n            type: String,\n            default: uni.$u.props.form.labelAlign\n        },\n        // lable的样式，对象形式\n        labelStyle: {\n            type: Object,\n            default: uni.$u.props.form.labelStyle\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-form/u-form.vue",
    "content": "<template>\n\t<view class=\"u-form\">\n\t\t<slot />\n\t</view>\n</template>\n\n<script>\n\timport props from \"./props.js\";\n\timport Schema from \"../../libs/util/async-validator\";\n\t// 去除警告信息\n\tSchema.warning = function() {};\n\t/**\n\t * Form 表单\n\t * @description 此组件一般用于表单场景，可以配置Input输入框，Select弹出框，进行表单验证等。\n\t * @tutorial https://www.uviewui.com/components/form.html\n\t * @property {Object}\t\t\t\t\t\tmodel\t\t\t当前form的需要验证字段的集合\n\t * @property {Object | Function | Array}\trules\t\t\t验证规则\n\t * @property {String}\t\t\t\t\t\terrorType\t\t错误的提示方式，见上方说明 ( 默认 message )\n\t * @property {Boolean}\t\t\t\t\t\tborderBottom\t是否显示表单域的下划线边框   ( 默认 true ）\n\t * @property {String}\t\t\t\t\t\tlabelPosition\t表单域提示文字的位置，left-左侧，top-上方 ( 默认 'left' ）\n\t * @property {String | Number}\t\t\t\tlabelWidth\t\t提示文字的宽度，单位px  ( 默认 45 ）\n\t * @property {String}\t\t\t\t\t\tlabelAlign\t\tlable字体的对齐方式   ( 默认 ‘left' ）\n\t * @property {Object}\t\t\t\t\t\tlabelStyle\t\tlable的样式，对象形式\n\t * @example <u--formlabelPosition=\"left\" :model=\"model1\" :rules=\"rules\" ref=\"form1\"></u--form>\n\t */\n\texport default {\n\t\tname: \"u-form\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tprovide() {\n\t\t\treturn {\n\t\t\t\tuForm: this,\n\t\t\t};\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tformRules: {},\n\t\t\t\t// 规则校验器\n\t\t\t\tvalidator: {},\n\t\t\t\t// 原始的model快照，用于resetFields方法重置表单时使用\n\t\t\t\toriginalModel: null,\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\t// 监听规则的变化\n\t\t\trules: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(n) {\n\t\t\t\t\tthis.setRules(n);\n\t\t\t\t},\n\t\t\t},\n\t\t\t// 监听属性的变化，通知子组件u-form-item重新获取信息\n\t\t\tpropsChange(n) {\n\t\t\t\tif (this.children?.length) {\n\t\t\t\t\tthis.children.map((child) => {\n\t\t\t\t\t\t// 判断子组件(u-form-item)如果有updateParentData方法的话，就就执行(执行的结果是子组件重新从父组件拉取了最新的值)\n\t\t\t\t\t\ttypeof child.updateParentData == \"function\" &&\n\t\t\t\t\t\t\tchild.updateParentData();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 监听model的初始值作为重置表单的快照\n\t\t\tmodel: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(n) {\n\t\t\t\t\tif (!this.originalModel) {\n\t\t\t\t\t\tthis.originalModel = uni.$u.deepClone(n);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcomputed: {\n\t\t\tpropsChange() {\n\t\t\t\treturn [\n\t\t\t\t\tthis.errorType,\n\t\t\t\t\tthis.borderBottom,\n\t\t\t\t\tthis.labelPosition,\n\t\t\t\t\tthis.labelWidth,\n\t\t\t\t\tthis.labelAlign,\n\t\t\t\t\tthis.labelStyle,\n\t\t\t\t];\n\t\t\t},\n\t\t},\n\t\tcreated() {\n\t\t\t// 存储当前form下的所有u-form-item的实例\n\t\t\t// 不能定义在data中，否则微信小程序会造成循环引用而报错\n\t\t\tthis.children = [];\n\t\t},\n\t\tmethods: {\n\t\t\t// 手动设置校验的规则，如果规则中有函数的话，微信小程序中会过滤掉，所以只能手动调用设置规则\n\t\t\tsetRules(rules) {\n\t\t\t\t// 判断是否有规则\n\t\t\t\tif (Object.keys(rules).length === 0) return;\n\t\t\t\tif (process.env.NODE_ENV === 'development' && Object.keys(this.model).length === 0) {\n\t\t\t\t\tuni.$u.error('设置rules，model必须设置！如果已经设置，请刷新页面。');\n\t\t\t\t\treturn;\n\t\t\t\t};\n\t\t\t\tthis.formRules = rules;\n\t\t\t\t// 重新将规则赋予Validator\n\t\t\t\tthis.validator = new Schema(rules);\n\t\t\t},\n\t\t\t// 清空所有u-form-item组件的内容，本质上是调用了u-form-item组件中的resetField()方法\n\t\t\tresetFields() {\n\t\t\t\tthis.resetModel();\n\t\t\t},\n\t\t\t// 重置model为初始值的快照\n\t\t\tresetModel(obj) {\n\t\t\t\t// 历遍所有u-form-item，根据其prop属性，还原model的原始快照\n\t\t\t\tthis.children.map((child) => {\n\t\t\t\t\tconst prop = child?.prop;\n\t\t\t\t\tconst value = uni.$u.getProperty(this.originalModel, prop);\n\t\t\t\t\tuni.$u.setProperty(this.model, prop, value);\n\t\t\t\t});\n\t\t\t},\n\t\t\t// 清空校验结果\n\t\t\tclearValidate(props) {\n\t\t\t\tprops = [].concat(props);\n\t\t\t\tthis.children.map((child) => {\n\t\t\t\t\t// 如果u-form-item的prop在props数组中，则清除对应的校验结果信息\n\t\t\t\t\tif (props[0] === undefined || props.includes(child.prop)) {\n\t\t\t\t\t\tchild.message = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\t// 对部分表单字段进行校验\n\t\t\tasync validateField(value, callback, event = null) {\n\t\t\t\t// $nextTick是必须的，否则model的变更，可能会延后于此方法的执行\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t// 校验错误信息，返回给回调方法，用于存放所有form-item的错误信息\n\t\t\t\t\tconst errorsRes = [];\n\t\t\t\t\t// 如果为字符串，转为数组\n\t\t\t\t\tvalue = [].concat(value);\n\t\t\t\t\t// 历遍children所有子form-item\n\t\t\t\t\tthis.children.map((child) => {\n\t\t\t\t\t\t// 用于存放form-item的错误信息\n\t\t\t\t\t\tconst childErrors = [];\n\t\t\t\t\t\tif (value.includes(child.prop)) {\n\t\t\t\t\t\t\t// 获取对应的属性，通过类似'a.b.c'的形式\n\t\t\t\t\t\t\tconst propertyVal = uni.$u.getProperty(\n\t\t\t\t\t\t\t\tthis.model,\n\t\t\t\t\t\t\t\tchild.prop\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// 属性链数组\n\t\t\t\t\t\t\tconst propertyChain = child.prop.split(\".\");\n\t\t\t\t\t\t\tconst propertyName =\n\t\t\t\t\t\t\t\tpropertyChain[propertyChain.length - 1];\n\n\t\t\t\t\t\t\tconst rule = this.formRules[child.prop];\n\t\t\t\t\t\t\t// 如果不存在对应的规则，直接返回，否则校验器会报错\n\t\t\t\t\t\t\tif (!rule) return;\n\t\t\t\t\t\t\t// rule规则可为数组形式，也可为对象形式，此处拼接成为数组\n\t\t\t\t\t\t\tconst rules = [].concat(rule);\n\n\t\t\t\t\t\t\t// 对rules数组进行校验\n\t\t\t\t\t\t\tfor (let i = 0; i < rules.length; i++) {\n\t\t\t\t\t\t\t\tconst ruleItem = rules[i];\n\t\t\t\t\t\t\t\t// 将u-form-item的触发器转为数组形式\n\t\t\t\t\t\t\t\tconst trigger = [].concat(ruleItem?.trigger);\n\t\t\t\t\t\t\t\t// 如果是有传入触发事件，但是此form-item却没有配置此触发器的话，不执行校验操作\n\t\t\t\t\t\t\t\tif (event && !trigger.includes(event)) continue;\n\t\t\t\t\t\t\t\t// 实例化校验对象，传入构造规则\n\t\t\t\t\t\t\t\tconst validator = new Schema({\n\t\t\t\t\t\t\t\t\t[propertyName]: ruleItem,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tvalidator.validate({\n\t\t\t\t\t\t\t\t\t\t[propertyName]: propertyVal,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t(errors, fields) => {\n\t\t\t\t\t\t\t\t\t\tif (uni.$u.test.array(errors)) {\n\t\t\t\t\t\t\t\t\t\t\terrorsRes.push(...errors);\n\t\t\t\t\t\t\t\t\t\t\tchildErrors.push(...errors);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tchild.message =\n\t\t\t\t\t\t\t\t\t\t\tchildErrors[0]?.message ?? null;\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}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t// 执行回调函数\n\t\t\t\t\ttypeof callback === \"function\" && callback(errorsRes);\n\t\t\t\t});\n\t\t\t},\n\t\t\t// 校验全部数据\n\t\t\tvalidate(callback) {\n\t\t\t\t// 开发环境才提示，生产环境不会提示\n\t\t\t\tif (process.env.NODE_ENV === 'development' && Object.keys(this.formRules).length === 0) {\n\t\t\t\t\tuni.$u.error('未设置rules，请看文档说明！如果已经设置，请刷新页面。');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t// $nextTick是必须的，否则model的变更，可能会延后于validate方法\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t// 获取所有form-item的prop，交给validateField方法进行校验\n\t\t\t\t\t\tconst formItemProps = this.children.map(\n\t\t\t\t\t\t\t(item) => item.prop\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.validateField(formItemProps, (errors) => {\n\t\t\t\t\t\t\tif(errors.length) {\n\t\t\t\t\t\t\t\t// 如果错误提示方式为toast，则进行提示\n\t\t\t\t\t\t\t\tthis.errorType === 'toast' && uni.$u.toast(errors[0].message)\n\t\t\t\t\t\t\t\treject(errors)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve(true)\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\t};\n</script>\n\n<style lang=\"scss\" scoped>\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-form-item/props.js",
    "content": "export default {\n    props: {\n        // input的label提示语\n        label: {\n            type: String,\n            default: uni.$u.props.formItem.label\n        },\n        // 绑定的值\n        prop: {\n            type: String,\n            default: uni.$u.props.formItem.prop\n        },\n        // 是否显示表单域的下划线边框\n        borderBottom: {\n            type: [String, Boolean],\n            default: uni.$u.props.formItem.borderBottom\n        },\n        // label的位置，left-左边，top-上边\n        labelPosition: {\n            type: String,\n            default: uni.$u.props.formItem.labelPosition\n        },\n        // label的宽度，单位px\n        labelWidth: {\n            type: [String, Number],\n            default: uni.$u.props.formItem.labelWidth\n        },\n        // 右侧图标\n        rightIcon: {\n            type: String,\n            default: uni.$u.props.formItem.rightIcon\n        },\n        // 左侧图标\n        leftIcon: {\n            type: String,\n            default: uni.$u.props.formItem.leftIcon\n        },\n        // 是否显示左边的必填星号，只作显示用，具体校验必填的逻辑，请在rules中配置\n        required: {\n            type: Boolean,\n            default: uni.$u.props.formItem.required\n        },\n        leftIconStyle: {\n            type: [String, Object],\n            default: uni.$u.props.formItem.leftIconStyle,\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-form-item/u-form-item.vue",
    "content": "<template>\n\t<view class=\"u-form-item\">\n\t\t<view\n\t\t\tclass=\"u-form-item__body\"\n\t\t\t@tap=\"clickHandler\"\n\t\t\t:style=\"[$u.addStyle(customStyle), {\n\t\t\t\tflexDirection: (labelPosition || parentData.labelPosition) === 'left' ? 'row' : 'column'\n\t\t\t}]\"\n\t\t>\n\t\t\t<!-- 微信小程序中，将一个参数设置空字符串，结果会变成字符串\"true\" -->\n\t\t\t<slot name=\"label\">\n\t\t\t\t<!-- {{required}} -->\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-form-item__body__left\"\n\t\t\t\t\tv-if=\"required || leftIcon || label\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\twidth: $u.addUnit(labelWidth || parentData.labelWidth),\n\t\t\t\t\t\tmarginBottom: parentData.labelPosition === 'left' ? 0 : '5px',\n\t\t\t\t\t}\"\n\t\t\t\t>\n\t\t\t\t\t<!-- 为了块对齐 -->\n\t\t\t\t\t<view class=\"u-form-item__body__left__content\">\n\t\t\t\t\t\t<!-- nvue不支持伪元素before -->\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tv-if=\"required\"\n\t\t\t\t\t\t\tclass=\"u-form-item__body__left__content__required\"\n\t\t\t\t\t\t>*</text>\n\t\t\t\t\t\t<view\n\t\t\t\t\t\t\tclass=\"u-form-item__body__left__content__icon\"\n\t\t\t\t\t\t\tv-if=\"leftIcon\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t\t\t:name=\"leftIcon\"\n\t\t\t\t\t\t\t\t:custom-style=\"leftIconStyle\"\n\t\t\t\t\t\t\t></u-icon>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tclass=\"u-form-item__body__left__content__label\"\n\t\t\t\t\t\t\t:style=\"[parentData.labelStyle, {\n\t\t\t\t\t\t\t\tjustifyContent: parentData.labelAlign === 'left' ? 'flex-start' : parentData.labelAlign === 'center' ? 'center' : 'flex-end'\n\t\t\t\t\t\t\t}]\"\n\t\t\t\t\t\t>{{ label }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</slot>\n\t\t\t<view class=\"u-form-item__body__right\">\n\t\t\t\t<view class=\"u-form-item__body__right__content\">\n\t\t\t\t\t<view class=\"u-form-item__body__right__content__slot\">\n\t\t\t\t\t\t<slot />\n\t\t\t\t\t</view>\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"item__body__right__content__icon\"\n\t\t\t\t\t\tv-if=\"$slots.right\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<slot name=\"right\" />\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t\t<slot name=\"error\">\n\t\t\t<text\n\t\t\t\tv-if=\"!!message && parentData.errorType === 'message'\"\n\t\t\t\tclass=\"u-form-item__body__right__message\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tmarginLeft:  $u.addUnit(parentData.labelPosition === 'top' ? 0 : (labelWidth || parentData.labelWidth))\n\t\t\t\t}\"\n\t\t\t>{{ message }}</text>\n\t\t</slot>\n\t\t<u-line\n\t\t\tv-if=\"borderBottom\"\n\t\t\t:color=\"message && parentData.errorType === 'border-bottom' ? $u.color.error : propsLine.color\"\n\t\t\t:customStyle=\"`margin-top: ${message && parentData.errorType === 'message' ? '5px' : 0}`\"\n\t\t></u-line>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Form 表单\n\t * @description 此组件一般用于表单场景，可以配置Input输入框，Select弹出框，进行表单验证等。\n\t * @tutorial https://www.uviewui.com/components/form.html\n\t * @property {String}\t\t\tlabel\t\t\tinput的label提示语\n\t * @property {String}\t\t\tprop\t\t\t绑定的值\n\t * @property {String | Boolean}\tborderBottom\t是否显示表单域的下划线边框\n\t * @property {String | Number}\tlabelWidth\t\tlabel的宽度，单位px\n\t * @property {String}\t\t\trightIcon\t\t右侧图标\n\t * @property {String}\t\t\tleftIcon\t\t左侧图标\n\t * @property {String | Object} leftIconStyle 左侧图标的样式\n\t * @property {Boolean}\t\t\trequired\t\t是否显示左边的必填星号，只作显示用，具体校验必填的逻辑，请在rules中配置 (默认 false )\n\t *\n\t * @example <u-form-item label=\"姓名\" prop=\"userInfo.name\" borderBottom ref=\"item1\"></u-form-item>\n\t */\n\texport default {\n\t\tname: 'u-form-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 错误提示语\n\t\t\t\tmessage: '',\n\t\t\t\tparentData: {\n\t\t\t\t\t// 提示文本的位置\n\t\t\t\t\tlabelPosition: 'left',\n\t\t\t\t\t// 提示文本对齐方式\n\t\t\t\t\tlabelAlign: 'left',\n\t\t\t\t\t// 提示文本的样式\n\t\t\t\t\tlabelStyle: {},\n\t\t\t\t\t// 提示文本的宽度\n\t\t\t\t\tlabelWidth: 45,\n\t\t\t\t\t// 错误提示方式\n\t\t\t\t\terrorType: 'message'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// 组件创建完成时，将当前实例保存到u-form中\n\t\tcomputed: {\n\t\t\tpropsLine() {\n\t\t\t\treturn uni.$u.props.line\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 父组件的实例\n\t\t\t\tthis.updateParentData()\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\tuni.$u.error('u-form-item需要结合u-form组件使用')\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 获取父组件的参数\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法写在mixin中\n\t\t\t\tthis.getParentData('u-form');\n\t\t\t},\n\t\t\t// 移除u-form-item的校验结果\n\t\t\tclearValidate() {\n\t\t\t\tthis.message = null\n\t\t\t},\n\t\t\t// 清空当前的组件的校验结果，并重置为初始值\n\t\t\tresetField() {\n\t\t\t\t// 找到原始值\n\t\t\t\tconst value = uni.$u.getProperty(this.parent.originalModel, this.prop)\n\t\t\t\t// 将u-form的model的prop属性链还原原始值\n\t\t\t\tuni.$u.setProperty(this.parent.model, this.prop, value)\n\t\t\t\t// 移除校验结果\n\t\t\t\tthis.message = null\n\t\t\t},\n\t\t\t// 点击组件\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('click')\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-form-item {\n\t\t@include flex(column);\n\t\tfont-size: 14px;\n\t\tcolor: $u-main-color;\n\n\t\t&__body {\n\t\t\t@include flex;\n\t\t\tpadding: 10px 0;\n\n\t\t\t&__left {\n\t\t\t\t@include flex;\n\t\t\t\talign-items: center;\n\n\t\t\t\t&__content {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\t@include flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tpadding-right: 10rpx;\n\t\t\t\t\tflex: 1;\n\n\t\t\t\t\t&__icon {\n\t\t\t\t\t\tmargin-right: 8rpx;\n\t\t\t\t\t}\n\n\t\t\t\t\t&__required {\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tleft: -9px;\n\t\t\t\t\t\tcolor: $u-error;\n\t\t\t\t\t\tline-height: 20px;\n\t\t\t\t\t\tfont-size: 20px;\n\t\t\t\t\t\ttop: 3px;\n\t\t\t\t\t}\n\n\t\t\t\t\t&__label {\n\t\t\t\t\t\t@include flex;\n\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\tflex: 1;\n\t\t\t\t\t\tcolor: $u-main-color;\n\t\t\t\t\t\tfont-size: 15px;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__right {\n\t\t\t\tflex: 1;\n\n\t\t\t\t&__content {\n\t\t\t\t\t@include flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tflex: 1;\n\n\t\t\t\t\t&__slot {\n\t\t\t\t\t\tflex: 1;\n\t\t\t\t\t\t/* #ifndef MP */\n\t\t\t\t\t\t@include flex;\n\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\t/* #endif */\n\t\t\t\t\t}\n\n\t\t\t\t\t&__icon {\n\t\t\t\t\t\tmargin-left: 10rpx;\n\t\t\t\t\t\tcolor: $u-light-color;\n\t\t\t\t\t\tfont-size: 30rpx;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&__message {\n\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\tline-height: 12px;\n\t\t\t\t\tcolor: $u-error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-gap/props.js",
    "content": "export default {\n    props: {\n        // 背景颜色（默认transparent）\n        bgColor: {\n            type: String,\n            default: uni.$u.props.gap.bgColor\n        },\n        // 分割槽高度，单位px（默认30）\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.gap.height\n        },\n        // 与上一个组件的距离\n        marginTop: {\n            type: [String, Number],\n            default: uni.$u.props.gap.marginTop\n        },\n        // 与下一个组件的距离\n        marginBottom: {\n            type: [String, Number],\n            default: uni.$u.props.gap.marginBottom\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-gap/u-gap.vue",
    "content": "<template>\n\t<view class=\"u-gap\" :style=\"[gapStyle]\"></view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * gap 间隔槽\n\t * @description 该组件一般用于内容块之间的用一个灰色块隔开的场景，方便用户风格统一，减少工作量\n\t * @tutorial https://www.uviewui.com/components/gap.html\n\t * @property {String}\t\t\tbgColor\t\t\t背景颜色 （默认 'transparent' ）\n\t * @property {String | Number}\theight\t\t\t分割槽高度，单位px （默认 20 ）\n\t * @property {String | Number}\tmarginTop\t\t与前一个组件的距离，单位px（ 默认 0 ）\n\t * @property {String | Number}\tmarginBottom\t与后一个组件的距离，单位px （默认 0 ）\n\t * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t * \n\t * @example <u-gap height=\"80\" bg-color=\"#bbb\"></u-gap>\n\t */\n\texport default {\n\t\tname: \"u-gap\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\tgapStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tbackgroundColor: this.bgColor,\n\t\t\t\t\theight: uni.$u.addUnit(this.height),\n\t\t\t\t\tmarginTop: uni.$u.addUnit(this.marginTop),\n\t\t\t\t\tmarginBottom: uni.$u.addUnit(this.marginBottom),\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-grid/props.js",
    "content": "export default {\n    props: {\n        // 分成几列\n        col: {\n            type: [String, Number],\n            default: uni.$u.props.grid.col\n        },\n        // 是否显示边框\n        border: {\n            type: Boolean,\n            default: uni.$u.props.grid.border\n        },\n        // 宫格对齐方式，表现为数量少的时候，靠左，居中，还是靠右\n        align: {\n            type: String,\n            default: uni.$u.props.grid.align\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-grid/u-grid.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-grid\"\n\t\tref='u-grid'\n\t    :style=\"[gridStyle]\"\n\t>\n\t\t<slot />\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * grid 宫格布局\n\t * @description 宫格组件一般用于同时展示多个同类项目的场景，可以给宫格的项目设置徽标组件(badge)，或者图标等，也可以扩展为左右滑动的轮播形式。\n\t * @tutorial https://www.uviewui.com/components/grid.html\n\t * @property {String | Number}\tcol\t\t\t宫格的列数（默认 3 ）\n\t * @property {Boolean}\t\t\tborder\t\t是否显示宫格的边框（默认 false ）\n\t * @property {String}\t\t\talign\t\t宫格对齐方式，表现为数量少的时候，靠左，居中，还是靠右 （默认 'left' ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * @event {Function} click 点击宫格触发\n\t * @example <u-grid :col=\"3\" @click=\"click\"></u-grid>\n\t */\n\texport default {\n\t\tname: 'u-grid',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\twidth: 0\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 当父组件需要子组件需要共享的参数发生了变化，手动通知子组件\n\t\t\tparentData() {\n\t\t\t\tif (this.children.length) {\n\t\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t\t// 判断子组件(u-radio)如果有updateParentData方法的话，就就执行(执行的结果是子组件重新从父组件拉取了最新的值)\n\t\t\t\t\t\ttypeof(child.updateParentData) == 'function' && child.updateParentData();\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tcreated() {\n\t\t\t// 如果将children定义在data中，在微信小程序会造成循环引用而报错\n\t\t\tthis.children = []\n\t\t},\n\t\tcomputed: {\n\t\t\t// 计算父组件的值是否发生变化\n\t\t\tparentData() {\n\t\t\t\treturn [this.hoverClass, this.col, this.size, this.border];\n\t\t\t},\n\t\t\t// 宫格对齐方式\n\t\t\tgridStyle() {\n\t\t\t\tlet style = {};\n\t\t\t\tswitch (this.align) {\n\t\t\t\t\tcase 'left':\n\t\t\t\t\t\tstyle.justifyContent = 'flex-start';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'center':\n\t\t\t\t\t\tstyle.justifyContent = 'center';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\tstyle.justifyContent = 'flex-end';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tstyle.justifyContent = 'flex-start';\n\t\t\t\t};\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 此方法由u-grid-item触发，用于在u-grid发出事件\n\t\t\tchildClick(name) {\n\t\t\t\tthis.$emit('click', name)\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n     $u-grid-width:100% !default;\n\t.u-grid {\n\t\t/* #ifdef MP */\n\t\twidth: $u-grid-width;\n\t\tposition: relative;\n\t\tbox-sizing: border-box;\n\t\toverflow: hidden;\n\t\tdisplay: block;\n\t\t/* #endif */\n\t\tjustify-content: center;\n\t\t@include flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: center;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-grid-item/props.js",
    "content": "export default {\n    props: {\n        // 宫格的name\n        name: {\n            type: [String, Number, null],\n            default: uni.$u.props.gridItem.name\n        },\n        // 背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.gridItem.bgColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue",
    "content": "<template>\n\t<!-- #ifndef APP-NVUE -->\n\t<view\n\t    class=\"u-grid-item\"\n\t    hover-class=\"u-grid-item--hover-class\"\n\t    :hover-stay-time=\"200\"\n\t    @tap=\"clickHandler\"\n\t    :class=\"classes\"\n\t    :style=\"[itemStyle]\"\n\t>\n\t\t<slot />\n\t</view>\n\t<!-- #endif -->\n\t<!-- #ifdef APP-NVUE -->\n\t<view\n\t    class=\"u-grid-item\"\n\t    :hover-stay-time=\"200\"\n\t    @tap=\"clickHandler\"\n\t    :class=\"classes\"\n\t    :style=\"[itemStyle]\"\n\t>\n\t\t<slot />\n\t</view>\n\t<!-- #endif -->\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * gridItem 提示\n\t * @description 宫格组件一般用于同时展示多个同类项目的场景，可以给宫格的项目设置徽标组件(badge)，或者图标等，也可以扩展为左右滑动的轮播形式。搭配u-grid使用\n\t * @tutorial https://www.uviewui.com/components/grid.html\n\t * @property {String | Number}\tname\t\t宫格的name ( 默认 null )\n\t * @property {String}\t\t\tbgColor\t\t宫格的背景颜色 （默认 'transparent' ）\n\t * @property {Object}\t\t\tcustomStyle\t自定义样式，对象形式\n\t * @event {Function} click 点击宫格触发\n\t * @example <u-grid-item></u-grid-item>\n\t */\n\texport default {\n\t\tname: \"u-grid-item\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tparentData: {\n\t\t\t\t\tcol: 3, // 父组件划分的宫格数\n\t\t\t\t\tborder: true, // 是否显示边框，根据父组件决定\n\t\t\t\t},\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\twidth: 0, // nvue下才这么计算，vue下放到computed中，否则会因为延时造成闪烁\n\t\t\t\t// #endif\n\t\t\t\tclasses: [], // 类名集合，用于判断是否显示右边和下边框\n\t\t\t};\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tcomputed: {\n\t\t\t// #ifndef APP-NVUE\n\t\t\t// vue下放到computed中，否则会因为延时造成闪烁\n\t\t\twidth() {\n\t\t\t\treturn 100 / Number(this.parentData.col) + '%'\n\t\t\t},\n\t\t\t// #endif\n\t\t\titemStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tbackground: this.bgColor,\n\t\t\t\t\twidth: this.width\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 用于在父组件u-grid的children中被添加入子组件时，\n\t\t\t\t// 重新计算item的边框\n\t\t\t\tuni.$on('$uGridItem', () => {\n\t\t\t\t\tthis.gridItemClasses()\n\t\t\t\t})\n\t\t\t\t// 父组件的实例\n\t\t\t\tthis.updateParentData()\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 获取元素该有的长度，nvue下要延时才准确\n\t\t\t\tthis.$nextTick(function(){\n\t\t\t\t\tthis.getItemWidth()\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t// 发出事件，通知所有的grid-item都重新计算自己的边框\n\t\t\t\tuni.$emit('$uGridItem')\n\t\t\t\tthis.gridItemClasses()\n\t\t\t},\n\t\t\t// 获取父组件的参数\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法写在mixin中\n\t\t\t\tthis.getParentData('u-grid');\n\t\t\t},\n\t\t\tclickHandler() {\n\t\t\t\tlet name = this.name\n\t\t\t\t// 如果没有设置name属性，历遍父组件的children数组，判断当前的元素是否和本实例this相等，找出当前组件的索引\n\t\t\t\tconst children = this.parent?.children\n\t\t\t\tif(children && this.name === null) {\n\t\t\t\t\tname = children.findIndex(child => child === this)\n\t\t\t\t}\n\t\t\t\t// 调用父组件方法，发出事件\n\t\t\t\tthis.parent && this.parent.childClick(name)\n\t\t\t\tthis.$emit('click', name)\n\t\t\t},\n\t\t\tasync getItemWidth() {\n\t\t\t\t// 如果是nvue，不能使用百分比，只能使用固定宽度\n\t\t\t\tlet width = 0\n\t\t\t\tif(this.parent) {\n\t\t\t\t\t// 获取父组件宽度后，除以栅格数，得出每个item的宽度\n\t\t\t\t\tconst parentWidth = await this.getParentWidth()\n\t\t\t\t\twidth = parentWidth / Number(this.parentData.col) + 'px'\n\t\t\t\t}\n\t\t\t\tthis.width = width\n\t\t\t},\n\t\t\t// 获取父元素的尺寸\n\t\t\tgetParentWidth() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 返回一个promise，让调用者可以用await同步获取\n\t\t\t\tconst dom = uni.requireNativePlugin('dom')\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\t// 调用父组件的ref\n\t\t\t\t\tdom.getComponentRect(this.parent.$refs['u-grid'], res => {\n\t\t\t\t\t\tresolve(res.size.width)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tgridItemClasses() {\n\t\t\t\tif(this.parentData.border) {\n\t\t\t\t\tconst classes = []\n\t\t\t\t\tthis.parent.children.map((child, index) =>{\n\t\t\t\t\t\tif(this === child) {\n\t\t\t\t\t\t\tconst len = this.parent.children.length\n\t\t\t\t\t\t\t// 贴近右边屏幕边沿的child，并且最后一个（比如只有横向2个的时候），无需右边框\n\t\t\t\t\t\t\tif((index + 1) % this.parentData.col !== 0 && index + 1 !== len) {\n\t\t\t\t\t\t\t\tclasses.push('u-border-right')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 总的宫格数量对列数取余的值\n\t\t\t\t\t\t\t// 如果取余后，值为0，则意味着要将最后一排的宫格，都不需要下边框\n\t\t\t\t\t\t\tconst lessNum = len % this.parentData.col === 0 ? this.parentData.col : len % this.parentData.col\n\t\t\t\t\t\t\t// 最下面的一排child，无需下边框\n\t\t\t\t\t\t\tif(index < len - lessNum) {\n\t\t\t\t\t\t\t\tclasses.push('u-border-bottom')\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\t// 支付宝，头条小程序无法动态绑定一个数组类名，否则解析出来的结果会带有\",\"，而导致失效\n\t\t\t\t\t// #ifdef MP-ALIPAY || MP-TOUTIAO\n\t\t\t\t\tclasses = classes.join(' ')\n\t\t\t\t\t// #endif\n\t\t\t\t\tthis.classes = classes\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbeforeDestroy() {\n\t\t\t// 移除事件监听，释放性能\n\t\t\tuni.$off('$uGridItem')\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n      $u-grid-item-hover-class-opcatiy:.5 !default;\n      $u-grid-item-margin-top:1rpx !default;\n      $u-grid-item-border-right-width:0.5px !default;\n      $u-grid-item-border-bottom-width:0.5px !default;\n      $u-grid-item-border-right-color:$u-border-color !default;\n      $u-grid-item-border-bottom-color:$u-border-color !default;\n\t.u-grid-item {\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tposition: relative;\n\t\tflex-direction: column;\n\t\t/* #ifndef APP-NVUE */\n\t\tbox-sizing: border-box;\n\t\tdisplay: flex;\n\t\t/* #endif */\n\n\t\t/* #ifdef MP */\n\t\tposition: relative;\n\t\tfloat: left;\n\t\t/* #endif */\n\n\t\t/* #ifdef MP-WEIXIN */\n\t\tmargin-top:$u-grid-item-margin-top;\n\t\t/* #endif */\n\n\t\t&--hover-class {\n\t\t\topacity:$u-grid-item-hover-class-opcatiy;\n\t\t}\n\t}\n\n\t/* #ifdef APP-NVUE */\n\t// 由于nvue不支持组件内引入app.vue中再引入的样式，所以需要写在这里\n\t.u-border-right {\n\t\tborder-right-width:$u-grid-item-border-right-width;\n\t\tborder-color: $u-grid-item-border-right-color;\n\t}\n\n\t.u-border-bottom {\n\t\tborder-bottom-width:$u-grid-item-border-bottom-width;\n\t\tborder-color:$u-grid-item-border-bottom-color;\n\t}\n\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-icon/icons.js",
    "content": "export default {\n    'uicon-level': '\\ue693',\n    'uicon-column-line': '\\ue68e',\n    'uicon-checkbox-mark': '\\ue807',\n    'uicon-folder': '\\ue7f5',\n    'uicon-movie': '\\ue7f6',\n    'uicon-star-fill': '\\ue669',\n    'uicon-star': '\\ue65f',\n    'uicon-phone-fill': '\\ue64f',\n    'uicon-phone': '\\ue622',\n    'uicon-apple-fill': '\\ue881',\n    'uicon-chrome-circle-fill': '\\ue885',\n    'uicon-backspace': '\\ue67b',\n    'uicon-attach': '\\ue632',\n    'uicon-cut': '\\ue948',\n    'uicon-empty-car': '\\ue602',\n    'uicon-empty-coupon': '\\ue682',\n    'uicon-empty-address': '\\ue646',\n    'uicon-empty-favor': '\\ue67c',\n    'uicon-empty-permission': '\\ue686',\n    'uicon-empty-news': '\\ue687',\n    'uicon-empty-search': '\\ue664',\n    'uicon-github-circle-fill': '\\ue887',\n    'uicon-rmb': '\\ue608',\n    'uicon-person-delete-fill': '\\ue66a',\n    'uicon-reload': '\\ue788',\n    'uicon-order': '\\ue68f',\n    'uicon-server-man': '\\ue6bc',\n    'uicon-search': '\\ue62a',\n    'uicon-fingerprint': '\\ue955',\n    'uicon-more-dot-fill': '\\ue630',\n    'uicon-scan': '\\ue662',\n    'uicon-share-square': '\\ue60b',\n    'uicon-map': '\\ue61d',\n    'uicon-map-fill': '\\ue64e',\n    'uicon-tags': '\\ue629',\n    'uicon-tags-fill': '\\ue651',\n    'uicon-bookmark-fill': '\\ue63b',\n    'uicon-bookmark': '\\ue60a',\n    'uicon-eye': '\\ue613',\n    'uicon-eye-fill': '\\ue641',\n    'uicon-mic': '\\ue64a',\n    'uicon-mic-off': '\\ue649',\n    'uicon-calendar': '\\ue66e',\n    'uicon-calendar-fill': '\\ue634',\n    'uicon-trash': '\\ue623',\n    'uicon-trash-fill': '\\ue658',\n    'uicon-play-left': '\\ue66d',\n    'uicon-play-right': '\\ue610',\n    'uicon-minus': '\\ue618',\n    'uicon-plus': '\\ue62d',\n    'uicon-info': '\\ue653',\n    'uicon-info-circle': '\\ue7d2',\n    'uicon-info-circle-fill': '\\ue64b',\n    'uicon-question': '\\ue715',\n    'uicon-error': '\\ue6d3',\n    'uicon-close': '\\ue685',\n    'uicon-checkmark': '\\ue6a8',\n    'uicon-android-circle-fill': '\\ue67e',\n    'uicon-android-fill': '\\ue67d',\n    'uicon-ie': '\\ue87b',\n    'uicon-IE-circle-fill': '\\ue889',\n    'uicon-google': '\\ue87a',\n    'uicon-google-circle-fill': '\\ue88a',\n    'uicon-setting-fill': '\\ue872',\n    'uicon-setting': '\\ue61f',\n    'uicon-minus-square-fill': '\\ue855',\n    'uicon-plus-square-fill': '\\ue856',\n    'uicon-heart': '\\ue7df',\n    'uicon-heart-fill': '\\ue851',\n    'uicon-camera': '\\ue7d7',\n    'uicon-camera-fill': '\\ue870',\n    'uicon-more-circle': '\\ue63e',\n    'uicon-more-circle-fill': '\\ue645',\n    'uicon-chat': '\\ue620',\n    'uicon-chat-fill': '\\ue61e',\n    'uicon-bag-fill': '\\ue617',\n    'uicon-bag': '\\ue619',\n    'uicon-error-circle-fill': '\\ue62c',\n    'uicon-error-circle': '\\ue624',\n    'uicon-close-circle': '\\ue63f',\n    'uicon-close-circle-fill': '\\ue637',\n    'uicon-checkmark-circle': '\\ue63d',\n    'uicon-checkmark-circle-fill': '\\ue635',\n    'uicon-question-circle-fill': '\\ue666',\n    'uicon-question-circle': '\\ue625',\n    'uicon-share': '\\ue631',\n    'uicon-share-fill': '\\ue65e',\n    'uicon-shopping-cart': '\\ue621',\n    'uicon-shopping-cart-fill': '\\ue65d',\n    'uicon-bell': '\\ue609',\n    'uicon-bell-fill': '\\ue640',\n    'uicon-list': '\\ue650',\n    'uicon-list-dot': '\\ue616',\n    'uicon-zhihu': '\\ue6ba',\n    'uicon-zhihu-circle-fill': '\\ue709',\n    'uicon-zhifubao': '\\ue6b9',\n    'uicon-zhifubao-circle-fill': '\\ue6b8',\n    'uicon-weixin-circle-fill': '\\ue6b1',\n    'uicon-weixin-fill': '\\ue6b2',\n    'uicon-twitter-circle-fill': '\\ue6ab',\n    'uicon-twitter': '\\ue6aa',\n    'uicon-taobao-circle-fill': '\\ue6a7',\n    'uicon-taobao': '\\ue6a6',\n    'uicon-weibo-circle-fill': '\\ue6a5',\n    'uicon-weibo': '\\ue6a4',\n    'uicon-qq-fill': '\\ue6a1',\n    'uicon-qq-circle-fill': '\\ue6a0',\n    'uicon-moments-circel-fill': '\\ue69a',\n    'uicon-moments': '\\ue69b',\n    'uicon-qzone': '\\ue695',\n    'uicon-qzone-circle-fill': '\\ue696',\n    'uicon-baidu-circle-fill': '\\ue680',\n    'uicon-baidu': '\\ue681',\n    'uicon-facebook-circle-fill': '\\ue68a',\n    'uicon-facebook': '\\ue689',\n    'uicon-car': '\\ue60c',\n    'uicon-car-fill': '\\ue636',\n    'uicon-warning-fill': '\\ue64d',\n    'uicon-warning': '\\ue694',\n    'uicon-clock-fill': '\\ue638',\n    'uicon-clock': '\\ue60f',\n    'uicon-edit-pen': '\\ue612',\n    'uicon-edit-pen-fill': '\\ue66b',\n    'uicon-email': '\\ue611',\n    'uicon-email-fill': '\\ue642',\n    'uicon-minus-circle': '\\ue61b',\n    'uicon-minus-circle-fill': '\\ue652',\n    'uicon-plus-circle': '\\ue62e',\n    'uicon-plus-circle-fill': '\\ue661',\n    'uicon-file-text': '\\ue663',\n    'uicon-file-text-fill': '\\ue665',\n    'uicon-pushpin': '\\ue7e3',\n    'uicon-pushpin-fill': '\\ue86e',\n    'uicon-grid': '\\ue673',\n    'uicon-grid-fill': '\\ue678',\n    'uicon-play-circle': '\\ue647',\n    'uicon-play-circle-fill': '\\ue655',\n    'uicon-pause-circle-fill': '\\ue654',\n    'uicon-pause': '\\ue8fa',\n    'uicon-pause-circle': '\\ue643',\n    'uicon-eye-off': '\\ue648',\n    'uicon-eye-off-outline': '\\ue62b',\n    'uicon-gift-fill': '\\ue65c',\n    'uicon-gift': '\\ue65b',\n    'uicon-rmb-circle-fill': '\\ue657',\n    'uicon-rmb-circle': '\\ue677',\n    'uicon-kefu-ermai': '\\ue656',\n    'uicon-server-fill': '\\ue751',\n    'uicon-coupon-fill': '\\ue8c4',\n    'uicon-coupon': '\\ue8ae',\n    'uicon-integral': '\\ue704',\n    'uicon-integral-fill': '\\ue703',\n    'uicon-home-fill': '\\ue964',\n    'uicon-home': '\\ue965',\n    'uicon-hourglass-half-fill': '\\ue966',\n    'uicon-hourglass': '\\ue967',\n    'uicon-account': '\\ue628',\n    'uicon-plus-people-fill': '\\ue626',\n    'uicon-minus-people-fill': '\\ue615',\n    'uicon-account-fill': '\\ue614',\n    'uicon-thumb-down-fill': '\\ue726',\n    'uicon-thumb-down': '\\ue727',\n    'uicon-thumb-up': '\\ue733',\n    'uicon-thumb-up-fill': '\\ue72f',\n    'uicon-lock-fill': '\\ue979',\n    'uicon-lock-open': '\\ue973',\n    'uicon-lock-opened-fill': '\\ue974',\n    'uicon-lock': '\\ue97a',\n    'uicon-red-packet-fill': '\\ue690',\n    'uicon-photo-fill': '\\ue98b',\n    'uicon-photo': '\\ue98d',\n    'uicon-volume-off-fill': '\\ue659',\n    'uicon-volume-off': '\\ue644',\n    'uicon-volume-fill': '\\ue670',\n    'uicon-volume': '\\ue633',\n    'uicon-red-packet': '\\ue691',\n    'uicon-download': '\\ue63c',\n    'uicon-arrow-up-fill': '\\ue6b0',\n    'uicon-arrow-down-fill': '\\ue600',\n    'uicon-play-left-fill': '\\ue675',\n    'uicon-play-right-fill': '\\ue676',\n    'uicon-rewind-left-fill': '\\ue679',\n    'uicon-rewind-right-fill': '\\ue67a',\n    'uicon-arrow-downward': '\\ue604',\n    'uicon-arrow-leftward': '\\ue601',\n    'uicon-arrow-rightward': '\\ue603',\n    'uicon-arrow-upward': '\\ue607',\n    'uicon-arrow-down': '\\ue60d',\n    'uicon-arrow-right': '\\ue605',\n    'uicon-arrow-left': '\\ue60e',\n    'uicon-arrow-up': '\\ue606',\n    'uicon-skip-back-left': '\\ue674',\n    'uicon-skip-forward-right': '\\ue672',\n    'uicon-rewind-right': '\\ue66f',\n    'uicon-rewind-left': '\\ue671',\n    'uicon-arrow-right-double': '\\ue68d',\n    'uicon-arrow-left-double': '\\ue68c',\n    'uicon-wifi-off': '\\ue668',\n    'uicon-wifi': '\\ue667',\n    'uicon-empty-data': '\\ue62f',\n    'uicon-empty-history': '\\ue684',\n    'uicon-empty-list': '\\ue68b',\n    'uicon-empty-page': '\\ue627',\n    'uicon-empty-order': '\\ue639',\n    'uicon-man': '\\ue697',\n    'uicon-woman': '\\ue69c',\n    'uicon-man-add': '\\ue61c',\n    'uicon-man-add-fill': '\\ue64c',\n    'uicon-man-delete': '\\ue61a',\n    'uicon-man-delete-fill': '\\ue66a',\n    'uicon-zh': '\\ue70a',\n    'uicon-en': '\\ue692'\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-icon/props.js",
    "content": "export default {\n    props: {\n        // 图标类名\n        name: {\n            type: String,\n            default: uni.$u.props.icon.name\n        },\n        // 图标颜色，可接受主题色\n        color: {\n            type: String,\n            default: uni.$u.props.icon.color\n        },\n        // 字体大小，单位px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.icon.size\n        },\n        // 是否显示粗体\n        bold: {\n            type: Boolean,\n            default: uni.$u.props.icon.bold\n        },\n        // 点击图标的时候传递事件出去的index（用于区分点击了哪一个）\n        index: {\n            type: [String, Number],\n            default: uni.$u.props.icon.index\n        },\n        // 触摸图标时的类名\n        hoverClass: {\n            type: String,\n            default: uni.$u.props.icon.hoverClass\n        },\n        // 自定义扩展前缀，方便用户扩展自己的图标库\n        customPrefix: {\n            type: String,\n            default: uni.$u.props.icon.customPrefix\n        },\n        // 图标右边或者下面的文字\n        label: {\n            type: [String, Number],\n            default: uni.$u.props.icon.label\n        },\n        // label的位置，只能右边或者下边\n        labelPos: {\n            type: String,\n            default: uni.$u.props.icon.labelPos\n        },\n        // label的大小\n        labelSize: {\n            type: [String, Number],\n            default: uni.$u.props.icon.labelSize\n        },\n        // label的颜色\n        labelColor: {\n            type: String,\n            default: uni.$u.props.icon.labelColor\n        },\n        // label与图标的距离\n        space: {\n            type: [String, Number],\n            default: uni.$u.props.icon.space\n        },\n        // 图片的mode\n        imgMode: {\n            type: String,\n            default: uni.$u.props.icon.imgMode\n        },\n        // 用于显示图片小图标时，图片的宽度\n        width: {\n            type: [String, Number],\n            default: uni.$u.props.icon.width\n        },\n        // 用于显示图片小图标时，图片的高度\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.icon.height\n        },\n        // 用于解决某些情况下，让图标垂直居中的用途\n        top: {\n            type: [String, Number],\n            default: uni.$u.props.icon.top\n        },\n        // 是否阻止事件传播\n        stop: {\n            type: Boolean,\n            default: uni.$u.props.icon.stop\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-icon/u-icon.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-icon\"\n\t    @tap=\"clickHandler\"\n\t    :class=\"['u-icon--' + labelPos]\"\n\t>\n\t\t<image\n\t\t    class=\"u-icon__img\"\n\t\t    v-if=\"isImg\"\n\t\t    :src=\"name\"\n\t\t    :mode=\"imgMode\"\n\t\t    :style=\"[imgStyle, $u.addStyle(customStyle)]\"\n\t\t></image>\n\t\t<text\n\t\t    v-else\n\t\t    class=\"u-icon__icon\"\n\t\t    :class=\"uClasses\"\n\t\t    :style=\"[iconStyle, $u.addStyle(customStyle)]\"\n\t\t    :hover-class=\"hoverClass\"\n\t\t>{{icon}}</text>\n\t\t<!-- 这里进行空字符串判断，如果仅仅是v-if=\"label\"，可能会出现传递0的时候，结果也无法显示 -->\n\t\t<text\n\t\t    v-if=\"label !== ''\" \n\t\t    class=\"u-icon__label\"\n\t\t    :style=\"{\n\t\t\tcolor: labelColor,\n\t\t\tfontSize: $u.addUnit(labelSize),\n\t\t\tmarginLeft: labelPos == 'right' ? $u.addUnit(space) : 0,\n\t\t\tmarginTop: labelPos == 'bottom' ? $u.addUnit(space) : 0,\n\t\t\tmarginRight: labelPos == 'left' ? $u.addUnit(space) : 0,\n\t\t\tmarginBottom: labelPos == 'top' ? $u.addUnit(space) : 0,\n\t\t}\"\n\t\t>{{ label }}</text>\n\t</view>\n</template>\n\n<script>\n\t// #ifdef APP-NVUE\n\t// nvue通过weex的dom模块引入字体，相关文档地址如下：\n\t// https://weex.apache.org/zh/docs/modules/dom.html#addrule\n\tconst fontUrl = 'https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf'\n\tconst domModule = weex.requireModule('dom')\n\tdomModule.addRule('fontFace', {\n\t\t'fontFamily': \"uicon-iconfont\",\n\t\t'src': `url('${fontUrl}')`\n\t})\n\t// #endif\n\n\t// 引入图标名称，已经对应的unicode\n\timport icons from './icons'\n\t\n\timport props from './props.js';;\n\n\t/**\n\t * icon 图标\n\t * @description 基于字体的图标集，包含了大多数常见场景的图标。\n\t * @tutorial https://www.uviewui.com/components/icon.html\n\t * @property {String}\t\t\tname\t\t\t图标名称，见示例图标集\n\t * @property {String}\t\t\tcolor\t\t\t图标颜色,可接受主题色 （默认 color['u-content-color'] ）\n\t * @property {String | Number}\tsize\t\t\t图标字体大小，单位px （默认 '16px' ）\n\t * @property {Boolean}\t\t\tbold\t\t\t是否显示粗体 （默认 false ）\n\t * @property {String | Number}\tindex\t\t\t点击图标的时候传递事件出去的index（用于区分点击了哪一个）\n\t * @property {String}\t\t\thoverClass\t\t图标按下去的样式类，用法同uni的view组件的hoverClass参数，详情见官网\n\t * @property {String}\t\t\tcustomPrefix\t自定义扩展前缀，方便用户扩展自己的图标库 （默认 'uicon' ）\n\t * @property {String | Number}\tlabel\t\t\t图标右侧的label文字\n\t * @property {String}\t\t\tlabelPos\t\tlabel相对于图标的位置，只能right或bottom （默认 'right' ）\n\t * @property {String | Number}\tlabelSize\t\tlabel字体大小，单位px （默认 '15px' ）\n\t * @property {String}\t\t\tlabelColor\t\t图标右侧的label文字颜色 （ 默认 color['u-content-color'] ）\n\t * @property {String | Number}\tspace\t\t\tlabel与图标的距离，单位px （默认 '3px' ）\n\t * @property {String}\t\t\timgMode\t\t\t图片的mode\n\t * @property {String | Number}\twidth\t\t\t显示图片小图标时的宽度\n\t * @property {String | Number}\theight\t\t\t显示图片小图标时的高度\n\t * @property {String | Number}\ttop\t\t\t\t图标在垂直方向上的定位 用于解决某些情况下，让图标垂直居中的用途  （默认 0 ）\n\t * @property {Boolean}\t\t\tstop\t\t\t是否阻止事件传播 （默认 false ）\n\t * @property {Object}\t\t\tcustomStyle\t\ticon的样式，对象形式\n\t * @event {Function} click 点击图标时触发\n\t * @event {Function} touchstart 事件触摸时触发\n\t * @example <u-icon name=\"photo\" color=\"#2979ff\" size=\"28\"></u-icon>\n\t */\n\texport default {\n\t\tname: 'u-icon',\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\tuClasses() {\n\t\t\t\tlet classes = []\n\t\t\t\tclasses.push(this.customPrefix + '-' + this.name)\n\t\t\t\t// // uView的自定义图标类名为u-iconfont\n\t\t\t\t// if (this.customPrefix == 'uicon') {\n\t\t\t\t// \tclasses.push('u-iconfont')\n\t\t\t\t// } else {\n\t\t\t\t// \tclasses.push(this.customPrefix)\n\t\t\t\t// }\n\t\t\t\t// 主题色，通过类配置\n\t\t\t\tif (this.color && uni.$u.config.type.includes(this.color)) classes.push('u-icon__icon--' + this.color)\n\t\t\t\t// 阿里，头条，百度小程序通过数组绑定类名时，无法直接使用[a, b, c]的形式，否则无法识别\n\t\t\t\t// 故需将其拆成一个字符串的形式，通过空格隔开各个类名\n\t\t\t\t//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU\n\t\t\t\tclasses = classes.join(' ')\n\t\t\t\t//#endif\n\t\t\t\treturn classes\n\t\t\t},\n\t\t\ticonStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\tstyle = {\n\t\t\t\t\tfontSize: uni.$u.addUnit(this.size),\n\t\t\t\t\tlineHeight: uni.$u.addUnit(this.size),\n\t\t\t\t\tfontWeight: this.bold ? 'bold' : 'normal',\n\t\t\t\t\t// 某些特殊情况需要设置一个到顶部的距离，才能更好的垂直居中\n\t\t\t\t\ttop: uni.$u.addUnit(this.top)\n\t\t\t\t}\n\t\t\t\t// 非主题色值时，才当作颜色值\n\t\t\t\tif (this.color && !uni.$u.config.type.includes(this.color)) style.color = this.color\n\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 判断传入的name属性，是否图片路径，只要带有\"/\"均认为是图片形式\n\t\t\tisImg() {\n\t\t\t\treturn this.name.indexOf('/') !== -1\n\t\t\t},\n\t\t\timgStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\t// 如果设置width和height属性，则优先使用，否则使用size属性\n\t\t\t\tstyle.width = this.width ? uni.$u.addUnit(this.width) : uni.$u.addUnit(this.size)\n\t\t\t\tstyle.height = this.height ? uni.$u.addUnit(this.height) : uni.$u.addUnit(this.size)\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 通过图标名，查找对应的图标\n\t\t\ticon() {\n\t\t\t\t// 如果内置的图标中找不到对应的图标，就直接返回name值，因为用户可能传入的是unicode代码\n\t\t\t\treturn icons['uicon-' + this.name] || this.name\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tclickHandler(e) {\n\t\t\t\tthis.$emit('click', this.index)\n\t\t\t\t// 是否阻止事件冒泡\n\t\t\t\tthis.stop && this.preventEvent(e)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t// 变量定义\n\t$u-icon-primary: $u-primary !default;\n\t$u-icon-success: $u-success !default;\n\t$u-icon-info: $u-info !default;\n\t$u-icon-warning: $u-warning !default;\n\t$u-icon-error: $u-error !default;\n\t$u-icon-label-line-height:1 !default;\n\n\t/* #ifndef APP-NVUE */\n\t// 非nvue下加载字体\n\t@font-face {\n\t\tfont-family: 'uicon-iconfont';\n\t\tsrc: url('https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf') format('truetype');\n\t}\n\n\t/* #endif */\n\n\t.u-icon {\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\talign-items: center;\n\n\t\t&--left {\n\t\t\tflex-direction: row-reverse;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t&--right {\n\t\t\tflex-direction: row;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t&--top {\n\t\t\tflex-direction: column-reverse;\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t&--bottom {\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t&__icon {\n\t\t\tfont-family: uicon-iconfont;\n\t\t\tposition: relative;\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\n\t\t\t&--primary {\n\t\t\t\tcolor: $u-icon-primary;\n\t\t\t}\n\n\t\t\t&--success {\n\t\t\t\tcolor: $u-icon-success;\n\t\t\t}\n\n\t\t\t&--error {\n\t\t\t\tcolor: $u-icon-error;\n\t\t\t}\n\n\t\t\t&--warning {\n\t\t\t\tcolor: $u-icon-warning;\n\t\t\t}\n\n\t\t\t&--info {\n\t\t\t\tcolor: $u-icon-info;\n\t\t\t}\n\t\t}\n\n\t\t&__img {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\theight: auto;\n\t\t\twill-change: transform;\n\t\t\t/* #endif */\n\t\t}\n\n\t\t&__label {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tline-height: $u-icon-label-line-height;\n\t\t\t/* #endif */\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-image/props.js",
    "content": "export default {\n    props: {\n        // 图片地址\n        src: {\n            type: String,\n            default: uni.$u.props.image.src\n        },\n        // 裁剪模式\n        mode: {\n            type: String,\n            default: uni.$u.props.image.mode\n        },\n        // 宽度，单位任意\n        width: {\n            type: [String, Number],\n            default: uni.$u.props.image.width\n        },\n        // 高度，单位任意\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.image.height\n        },\n        // 图片形状，circle-圆形，square-方形\n        shape: {\n            type: String,\n            default: uni.$u.props.image.shape\n        },\n        // 圆角，单位任意\n        radius: {\n            type: [String, Number],\n            default: uni.$u.props.image.radius\n        },\n        // 是否懒加载，微信小程序、App、百度小程序、字节跳动小程序\n        lazyLoad: {\n            type: Boolean,\n            default: uni.$u.props.image.lazyLoad\n        },\n        // 开启长按图片显示识别微信小程序码菜单\n        showMenuByLongpress: {\n            type: Boolean,\n            default: uni.$u.props.image.showMenuByLongpress\n        },\n        // 加载中的图标，或者小图片\n        loadingIcon: {\n            type: String,\n            default: uni.$u.props.image.loadingIcon\n        },\n        // 加载失败的图标，或者小图片\n        errorIcon: {\n            type: String,\n            default: uni.$u.props.image.errorIcon\n        },\n        // 是否显示加载中的图标或者自定义的slot\n        showLoading: {\n            type: Boolean,\n            default: uni.$u.props.image.showLoading\n        },\n        // 是否显示加载错误的图标或者自定义的slot\n        showError: {\n            type: Boolean,\n            default: uni.$u.props.image.showError\n        },\n        // 是否需要淡入效果\n        fade: {\n            type: Boolean,\n            default: uni.$u.props.image.fade\n        },\n        // 只支持网络资源，只对微信小程序有效\n        webp: {\n            type: Boolean,\n            default: uni.$u.props.image.webp\n        },\n        // 过渡时间，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.image.duration\n        },\n        // 背景颜色，用于深色页面加载图片时，为了和背景色融合\n        bgColor: {\n            type: String,\n            default: uni.$u.props.image.bgColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-image/u-image.vue",
    "content": "<template>\n\t<u-transition\n\t\tmode=\"fade\"\n\t\t:show=\"show\"\n\t\t:duration=\"fade ? 1000 : 0\"\n\t>\n\t\t<view\n\t\t\tclass=\"u-image\"\n\t\t\t@tap=\"onClick\"\n\t\t\t:style=\"[wrapStyle, backgroundStyle]\"\n\t\t>\n\t\t\t<image\n\t\t\t\tv-if=\"!isError\"\n\t\t\t\t:src=\"src\"\n\t\t\t\t:mode=\"mode\"\n\t\t\t\t@error=\"onErrorHandler\"\n\t\t\t\t@load=\"onLoadHandler\"\n\t\t\t\t:show-menu-by-longpress=\"showMenuByLongpress\"\n\t\t\t\t:lazy-load=\"lazyLoad\"\n\t\t\t\tclass=\"u-image__image\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tborderRadius: shape == 'circle' ? '10000px' : $u.addUnit(radius),\n\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t}\"\n\t\t\t></image>\n\t\t\t<view\n\t\t\t\tv-if=\"showLoading && loading\"\n\t\t\t\tclass=\"u-image__loading\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tborderRadius: shape == 'circle' ? '50%' : $u.addUnit(radius),\n\t\t\t\t\tbackgroundColor: this.bgColor,\n\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<slot name=\"loading\">\n\t\t\t\t\t<u-icon\n\t\t\t\t\t\t:name=\"loadingIcon\"\n\t\t\t\t\t\t:width=\"width\"\n\t\t\t\t\t\t:height=\"height\"\n\t\t\t\t\t></u-icon>\n\t\t\t\t</slot>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t\tv-if=\"showError && isError && !loading\"\n\t\t\t\tclass=\"u-image__error\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tborderRadius: shape == 'circle' ? '50%' : $u.addUnit(radius),\n\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<slot name=\"error\">\n\t\t\t\t\t<u-icon\n\t\t\t\t\t\t:name=\"errorIcon\"\n\t\t\t\t\t\t:width=\"width\"\n\t\t\t\t\t\t:height=\"height\"\n\t\t\t\t\t></u-icon>\n\t\t\t\t</slot>\n\t\t\t</view>\n\t\t</view>\n\t</u-transition>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Image 图片\n\t * @description 此组件为uni-app的image组件的加强版，在继承了原有功能外，还支持淡入动画、加载中、加载失败提示、圆角值和形状等。\n\t * @tutorial https://uviewui.com/components/image.html\n\t * @property {String}\t\t\tsrc \t\t\t\t图片地址\n\t * @property {String}\t\t\tmode \t\t\t\t裁剪模式，见官网说明 （默认 'aspectFill' ）\n\t * @property {String | Number}\twidth \t\t\t\t宽度，单位任意，如果为数值，则为px单位 （默认 '300' ）\n\t * @property {String | Number}\theight \t\t\t\t高度，单位任意，如果为数值，则为px单位 （默认 '225' ）\n\t * @property {String}\t\t\tshape \t\t\t\t图片形状，circle-圆形，square-方形 （默认 'square' ）\n\t * @property {String | Number}\tradius\t\t \t\t圆角值，单位任意，如果为数值，则为px单位 （默认 0 ）\n\t * @property {Boolean}\t\t\tlazyLoad\t\t\t是否懒加载，仅微信小程序、App、百度小程序、字节跳动小程序有效 （默认 true ）\n\t * @property {Boolean}\t\t\tshowMenuByLongpress\t是否开启长按图片显示识别小程序码菜单，仅微信小程序有效 （默认 true ）\n\t * @property {String}\t\t\tloadingIcon \t\t加载中的图标，或者小图片 （默认 'photo' ）\n\t * @property {String}\t\t\terrorIcon \t\t\t加载失败的图标，或者小图片 （默认 'error-circle' ）\n\t * @property {Boolean}\t\t\tshowLoading \t\t是否显示加载中的图标或者自定义的slot （默认 true ）\n\t * @property {Boolean}\t\t\tshowError \t\t\t是否显示加载错误的图标或者自定义的slot （默认 true ）\n\t * @property {Boolean}\t\t\tfade \t\t\t\t是否需要淡入效果 （默认 true ）\n\t * @property {Boolean}\t\t\twebp \t\t\t\t只支持网络资源，只对微信小程序有效 （默认 false ）\n\t * @property {String | Number}\tduration \t\t\t搭配fade参数的过渡时间，单位ms （默认 500 ）\n\t * @property {String}\t\t\tbgColor \t\t\t背景颜色，用于深色页面加载图片时，为了和背景色融合  (默认 '#f3f4f6' )\n\t * @property {Object}\t\t\tcustomStyle  \t\t定义需要用到的外部样式\n\t * @event {Function}\tclick\t点击图片时触发\n\t * @event {Function}\terror\t图片加载失败时触发\n\t * @event {Function} load 图片加载成功时触发\n\t * @example <u-image width=\"100%\" height=\"300px\" :src=\"src\"></u-image>\n\t */\n\texport default {\n\t\tname: 'u-image',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 图片是否加载错误，如果是，则显示错误占位图\n\t\t\t\tisError: false,\n\t\t\t\t// 初始化组件时，默认为加载中状态\n\t\t\t\tloading: true,\n\t\t\t\t// 不透明度，为了实现淡入淡出的效果\n\t\t\t\topacity: 1,\n\t\t\t\t// 过渡时间，因为props的值无法修改，故需要一个中间值\n\t\t\t\tdurationTime: this.duration,\n\t\t\t\t// 图片加载完成时，去掉背景颜色，因为如果是png图片，就会显示灰色的背景\n\t\t\t\tbackgroundStyle: {},\n\t\t\t\t// 用于fade模式的控制组件显示与否\n\t\t\t\tshow: false\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\tsrc: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(n) {\n\t\t\t\t\tif (!n) {\n\t\t\t\t\t\t// 如果传入null或者''，或者false，或者undefined，标记为错误状态\n\t\t\t\t\t\tthis.isError = true\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.isError = false;\n\t\t\t\t\t\tthis.loading = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\twrapStyle() {\n\t\t\t\tlet style = {};\n\t\t\t\t// 通过调用addUnit()方法，如果有单位，如百分比，px单位等，直接返回，如果是纯粹的数值，则加上rpx单位\n\t\t\t\tstyle.width = this.$u.addUnit(this.width);\n\t\t\t\tstyle.height = this.$u.addUnit(this.height);\n\t\t\t\t// 如果是显示圆形，设置一个很多的半径值即可\n\t\t\t\tstyle.borderRadius = this.shape == 'circle' ? '10000px' : uni.$u.addUnit(this.radius)\n\t\t\t\t// 如果设置圆角，必须要有hidden，否则可能圆角无效\n\t\t\t\tstyle.overflow = this.borderRadius > 0 ? 'hidden' : 'visible'\n\t\t\t\t// if (this.fade) {\n\t\t\t\t// \tstyle.opacity = this.opacity\n\t\t\t\t// \t// nvue下，这几个属性必须要分开写\n\t\t\t\t// \tstyle.transitionDuration = `${this.durationTime}ms`\n\t\t\t\t// \tstyle.transitionTimingFunction = 'ease-in-out'\n\t\t\t\t// \tstyle.transitionProperty = 'opacity'\n\t\t\t\t// }\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));\n\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.show = true\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击图片\n\t\t\tonClick() {\n\t\t\t\tthis.$emit('click')\n\t\t\t},\n\t\t\t// 图片加载失败\n\t\t\tonErrorHandler(err) {\n\t\t\t\tthis.loading = false\n\t\t\t\tthis.isError = true\n\t\t\t\tthis.$emit('error', err)\n\t\t\t},\n\t\t\t// 图片加载完成，标记loading结束\n\t\t\tonLoadHandler(event) {\n\t\t\t\tthis.loading = false\n\t\t\t\tthis.isError = false\n\t\t\t\tthis.$emit('load', event)\n\t\t\t\tthis.removeBgColor()\n\t\t\t\t// 如果不需要动画效果，就不执行下方代码，同时移除加载时的背景颜色\n\t\t\t\t// 否则无需fade效果时，png图片依然能看到下方的背景色\n\t\t\t\t// if (!this.fade) return this.removeBgColor();\n\t\t\t\t// // 原来opacity为1(不透明，是为了显示占位图)，改成0(透明，意味着该元素显示的是背景颜色，默认的灰色)，再改成1，是为了获得过渡效果\n\t\t\t\t// this.opacity = 0;\n\t\t\t\t// // 这里设置为0，是为了图片展示到背景全透明这个过程时间为0，延时之后延时之后重新设置为duration，是为了获得背景透明(灰色)\n\t\t\t\t// // 到图片展示的过程中的淡入效果\n\t\t\t\t// this.durationTime = 0;\n\t\t\t\t// // 延时50ms，否则在浏览器H5，过渡效果无效\n\t\t\t\t// setTimeout(() => {\n\t\t\t\t// \tthis.durationTime = this.duration;\n\t\t\t\t// \tthis.opacity = 1;\n\t\t\t\t// \tsetTimeout(() => {\n\t\t\t\t// \t\tthis.removeBgColor();\n\t\t\t\t// \t}, this.durationTime);\n\t\t\t\t// }, 50);\n\t\t\t},\n\t\t\t// 移除图片的背景色\n\t\t\tremoveBgColor() {\n\t\t\t\t// 淡入动画过渡完成后，将背景设置为透明色，否则png图片会看到灰色的背景\n\t\t\t\tthis.backgroundStyle = {\n\t\t\t\t\tbackgroundColor: 'transparent'\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n\n\t$u-image-error-top:0px !default;\n\t$u-image-error-left:0px !default;\n\t$u-image-error-width:100% !default;\n\t$u-image-error-hight:100% !default;\n\t$u-image-error-background-color:$u-bg-color !default;\n\t$u-image-error-color:$u-tips-color !default;\n\t$u-image-error-font-size: 46rpx !default;\n\n\t.u-image {\n\t\tposition: relative;\n\t\ttransition: opacity 0.5s ease-in-out;\n\n\t\t&__image {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t&__loading,\n\t\t&__error {\n\t\t\tposition: absolute;\n\t\t\ttop: $u-image-error-top;\n\t\t\tleft: $u-image-error-left;\n\t\t\twidth: $u-image-error-width;\n\t\t\theight: $u-image-error-hight;\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tbackground-color: $u-image-error-background-color;\n\t\t\tcolor: $u-image-error-color;\n\t\t\tfont-size: $u-image-error-font-size;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-index-anchor/props.js",
    "content": "export default {\n    props: {\n        // 列表锚点文本内容\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.indexAnchor.text\n        },\n        // 列表锚点文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.indexAnchor.color\n        },\n        // 列表锚点文字大小，单位默认px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.indexAnchor.size\n        },\n        // 列表锚点背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.indexAnchor.bgColor\n        },\n        // 列表锚点高度，单位默认px\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.indexAnchor.height\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue",
    "content": "<template>\n\t<!-- #ifdef APP-NVUE -->\n\t<header>\n\t<!-- #endif -->\n\t<view\n\t    class=\"u-index-anchor u-border-bottom\"\n\t\t:ref=\"`u-index-anchor-${text}`\"\n\t    :style=\"{\n\t\t\theight: $u.addUnit(height),\n\t\t\tbackgroundColor: bgColor\n\t\t}\"\n\t>\n\t\t<text\n\t\t    class=\"u-index-anchor__text\"\n\t\t    :style=\"{\n\t\t\t\tfontSize: $u.addUnit(size),\n\t\t\t\tcolor: color\n\t\t\t}\"\n\t\t>{{ text }}</text>\n\t</view>\n\t<!-- #ifdef APP-NVUE -->\n\t</header>\n\t<!-- #endif -->\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * IndexAnchor 列表锚点\n\t * @description \n\t * @tutorial https://uviewui.com/components/indexList.html\n\t * @property {String | Number}\ttext\t列表锚点文本内容\n\t * @property {String}\t\t\tcolor\t列表锚点文字颜色 ( 默认 '#606266' )\n\t * @property {String | Number}\tsize\t列表锚点文字大小，单位默认px ( 默认 14 )\n\t * @property {String}\t\t\tbgColor\t列表锚点背景颜色 ( 默认 '#dedede' )\n\t * @property {String | Number}\theight\t列表锚点高度，单位默认px ( 默认 32 )\n\t * @example <u-index-anchor :text=\"indexList[index]\"></u-index-anchor>\n\t */\n\texport default {\n\t\tname: 'u-index-anchor',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 此处会活动父组件实例，并赋值给实例的parent属性\n\t\t\t\tconst indexList = uni.$u.$parent.call(this, 'u-index-list')\n\t\t\t\tif (!indexList) { \n\t\t\t\t\treturn uni.$u.error('u-index-anchor必须要搭配u-index-list组件使用')\n\t\t\t\t}\n\t\t\t\t// 将当前实例放入到u-index-list中\n\t\t\t\tindexList.anchors.push(this)\n\t\t\t\tconst indexListItem = uni.$u.$parent.call(this, 'u-index-item')\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t// 只有在非nvue下，u-index-anchor才是嵌套在u-index-item中的\n\t\t\t\tif (!indexListItem) {\n\t\t\t\t\treturn uni.$u.error('u-index-anchor必须要搭配u-index-item组件使用')\n\t\t\t\t}\n\t\t\t\t// 设置u-index-item的id为anchor的text标识符，因为非nvue下滚动列表需要依赖scroll-view滚动到元素的特性\n\t\t\t\tindexListItem.id = this.text.charCodeAt(0)\n\t\t\t\t// #endif\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-index-anchor {\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\t@include flex;\n\t\talign-items: center;\n\t\tpadding-left: 15px;\n\t\tz-index: 1;\n\n\t\t&__text {\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-index-item/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-index-item/u-index-item.vue",
    "content": "<template>\n\t<!-- #ifdef APP-NVUE -->\n\t<cell ref=\"u-index-item\">\n\t\t<!-- #endif -->\n\t\t<view\n\t\t\tclass=\"u-index-item\"\n\t\t\t:id=\"`u-index-item-${id}`\"\n\t\t\t:class=\"[`u-index-item-${id}`]\"\n\t\t>\n\t\t\t<slot />\n\t\t</view>\n\t\t<!-- #ifdef APP-NVUE -->\n\t</cell>\n\t<!-- #endif -->\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\t// 由于weex为阿里的KPI业绩考核的产物，所以不支持百分比单位，这里需要通过dom查询组件的宽度\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * IndexItem \n\t * @description \n\t * @tutorial https://uviewui.com/components/indexList.html\n\t * @property {String}\n\t * @event {Function}\n\t * @example\n\t */\n\texport default {\n\t\tname: 'u-index-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 本组件到滚动条顶部的距离\n\t\t\t\ttop: 0,\n\t\t\t\theight: 0,\n\t\t\t\tid: ''\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\t// 子组件u-index-anchor的实例\n\t\t\tthis.anchor = {}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 此处会活动父组件实例，并赋值给实例的parent属性\n\t\t\t\tthis.getParentData('u-index-list')\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\treturn uni.$u.error('u-index-item必须要搭配u-index-list组件使用')\n\t\t\t\t}\n\t\t\t\tuni.$u.sleep().then(() =>{\n\t\t\t\t\tthis.getIndexItemRect().then(size => {\n\t\t\t\t\t\t// 由于对象的引用特性，此处会同时生效到父组件的children数组的本实例的top属性中，供父组件判断读取\n\t\t\t\t\t\tthis.top = Math.ceil(size.top)\n\t\t\t\t\t\tthis.height = Math.ceil(size.height)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t},\n\t\t\tgetIndexItemRect() {\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.$uGetRect('.u-index-item').then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tconst ref = this.$refs['u-index-item']\n\t\t\t\t\tdom.getComponentRect(ref, res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t}) \n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-index-list/props.js",
    "content": "export default {\n    props: {\n        // 右边锚点非激活的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.indexList.inactiveColor\n        },\n        // 右边锚点激活的颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.indexList.activeColor\n        },\n        // 索引字符列表，数组形式\n        indexList: {\n            type: Array,\n            default: uni.$u.props.indexList.indexList\n        },\n        // 是否开启锚点自动吸顶\n        sticky: {\n            type: Boolean,\n            default: uni.$u.props.indexList.sticky\n        },\n        // 自定义导航栏的高度\n        customNavHeight: {\n            type: [String, Number],\n            default: uni.$u.props.indexList.customNavHeight\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-index-list/u-index-list.vue",
    "content": "<template>\n\t<view class=\"u-index-list\">\n\t\t<!-- #ifdef APP-NVUE -->\n\t\t<list\n\t\t\t:scrollTop=\"scrollTop\"\n\t\t\tenable-back-to-top\n\t\t\t:offset-accuracy=\"1\"\n\t\t\t:style=\"{\n\t\t\t\tmaxHeight: $u.addUnit(scrollViewHeight)\n\t\t\t}\"\n\t\t\t@scroll=\"scrollHandler\"\n\t\t\tref=\"uList\"\n\t\t>\n\t\t\t<cell\n\t\t\t\tv-if=\"$slots.header\"\n\t\t\t\tref=\"header\"\n\t\t\t>\n\t\t\t\t<slot name=\"header\" />\n\t\t\t</cell>\n\t\t\t<slot />\n\t\t\t<cell v-if=\"$slots.footer\">\n\t\t\t\t<slot name=\"footer\" />\n\t\t\t</cell>\n\t\t</list>\n\t\t<!-- #endif -->\n\t\t<!-- #ifndef APP-NVUE -->\n\t\t<scroll-view\n\t\t\t:scrollTop=\"scrollTop\"\n\t\t\t:scrollIntoView=\"scrollIntoView\"\n\t\t\t:offset-accuracy=\"1\"\n\t\t\t:style=\"{\n\t\t\t\tmaxHeight: $u.addUnit(scrollViewHeight)\n\t\t\t}\"\n\t\t\tscroll-y\n\t\t\t@scroll=\"scrollHandler\"\n\t\t\tref=\"uList\"\n\t\t>\n\t\t\t<view v-if=\"$slots.header\">\n\t\t\t\t<slot name=\"header\" />\n\t\t\t</view>\n\t\t\t<slot />\n\t\t\t<view v-if=\"$slots.footer\">\n\t\t\t\t<slot name=\"footer\" />\n\t\t\t</view>\n\t\t</scroll-view>\n\t\t<!-- #endif -->\n\t\t<view\n\t\t\tclass=\"u-index-list__letter\"\n\t\t\tref=\"u-index-list__letter\"\n\t\t\t:style=\"{ top: $u.addUnit(letterInfo.top || 100) }\"\n\t\t\t@touchstart=\"touchStart\"\n\t\t\t@touchmove.stop.prevent=\"touchMove\"\n\t\t\t@touchend.stop.prevent=\"touchEnd\"\n\t\t\t@touchcancel.stop.prevent=\"touchEnd\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-index-list__letter__item\"\n\t\t\t\tv-for=\"(item, index) in uIndexList\"\n\t\t\t\t:key=\"index\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tbackgroundColor: activeIndex === index ? activeColor : 'transparent'\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<text\n\t\t\t\t\tclass=\"u-index-list__letter__item__index\"\n\t\t\t\t\t:style=\"{color: activeIndex === index ? '#fff' : inactiveColor}\"\n\t\t\t\t>{{ item }}</text>\n\t\t\t</view>\n\t\t</view>\n\t\t<u-transition\n\t\t\tmode=\"fade\"\n\t\t\t:show=\"touching\"\n\t\t\t:customStyle=\"{\n\t\t\t\tposition: 'fixed',\n\t\t\t\tright: '50px',\n\t\t\t\ttop: $u.addUnit(indicatorTop),\n\t\t\t\tzIndex: 2\n\t\t\t}\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-index-list__indicator\"\n\t\t\t\t:class=\"['u-index-list__indicator--show']\"\n\t\t\t\t:style=\"{\n\t\t\t\t\theight: $u.addUnit(indicatorHeight),\n\t\t\t\t\twidth: $u.addUnit(indicatorHeight)\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<text class=\"u-index-list__indicator__text\">{{ uIndexList[activeIndex] }}</text>\n\t\t\t</view>\n\t\t</u-transition>\n\t</view>\n</template>\n\n<script>\n\tconst indexList = () => {\n\t\tconst indexList = [];\n\t\tconst charCodeOfA = 'A'.charCodeAt(0);\n\t\tfor (let i = 0; i < 26; i++) {\n\t\t\tindexList.push(String.fromCharCode(charCodeOfA + i));\n\t\t}\n\t\treturn indexList;\n\t}\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\t// 由于weex为阿里的KPI业绩考核的产物，所以不支持百分比单位，这里需要通过dom查询组件的宽度\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * IndexList 索引列表\n\t * @description  通过折叠面板收纳内容区域\n\t * @tutorial https://uviewui.com/components/indexList.html\n\t * @property {String}\t\t\tinactiveColor\t右边锚点非激活的颜色 ( 默认 '#606266' )\n\t * @property {String}\t\t\tactiveColor\t\t右边锚点激活的颜色 ( 默认 '#5677fc' )\n\t * @property {Array}\t\t\tindexList\t\t索引字符列表，数组形式\n\t * @property {Boolean}\t\t\tsticky\t\t\t是否开启锚点自动吸顶 ( 默认 true )\n\t * @property {String | Number}\tcustomNavHeight\t自定义导航栏的高度 ( 默认 0 )\n\t * */ \n\texport default {\n\t\tname: 'u-index-list',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\t// #ifdef MP-WEIXIN\n\t\t// 将自定义节点设置成虚拟的，更加接近Vue组件的表现，能更好的使用flex属性\n\t\toptions: {\n\t\t\tvirtualHost: true\n\t\t},\n\t\t// #endif\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 当前正在被选中的字母索引\n\t\t\t\tactiveIndex: -1,\n\t\t\t\ttouchmoveIndex: 1,\n\t\t\t\t// 索引字母的信息\n\t\t\t\tletterInfo: {\n\t\t\t\t\theight: 0,\n\t\t\t\t\titemHeight: 0,\n\t\t\t\t\ttop: 0\n\t\t\t\t},\n\t\t\t\t// 设置字母指示器的高度，后面为了让指示器跟随字母，并将尖角部分指向字母的中部，需要依赖此值\n\t\t\t\tindicatorHeight: 50,\n\t\t\t\t// 字母放大指示器的top值，为了让其指向当前激活的字母\n\t\t\t\t// indicatorTop: 0\n\t\t\t\t// 当前是否正在被触摸状态\n\t\t\t\ttouching: false,\n\t\t\t\t// 滚动条顶部top值\n\t\t\t\tscrollTop: 0,\n\t\t\t\t// scroll-view的高度\n\t\t\t\tscrollViewHeight: 0,\n\t\t\t\t// 系统信息\n\t\t\t\tsys: uni.$u.sys(),\n\t\t\t\tscrolling: false,\n\t\t\t\tscrollIntoView: '',\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 如果有传入外部的indexList锚点数组则使用，否则使用内部生成A-Z字母\n\t\t\tuIndexList() {\n\t\t\t\treturn this.indexList.length ? this.indexList : indexList()\n\t\t\t},\n\t\t\t// 字母放大指示器的top值，为了让其指向当前激活的字母\n\t\t\tindicatorTop() {\n\t\t\t\tconst {\n\t\t\t\t\ttop,\n\t\t\t\t\titemHeight\n\t\t\t\t} = this.letterInfo\n\t\t\t\treturn Math.floor(top + itemHeight * this.activeIndex + itemHeight / 2 - this.indicatorHeight / 2)\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 监听字母索引的变化，重新设置尺寸\n\t\t\tuIndexList: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler() {\n\t\t\t\t\tuni.$u.sleep().then(() => {\n\t\t\t\t\t\tthis.setIndexListLetterInfo()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t\tthis.anchors = []\n\t\t\tthis.init()\n\t\t},\n\t\tmounted() {\n\t\t\tthis.setIndexListLetterInfo()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 设置列表的高度为整个屏幕的高度\n\t\t\t\t//减去this.customNavHeight，并将this.scrollViewHeight设置为maxHeight\n\t\t\t\t//解决当u-index-list组件放在tabbar页面时,scroll-view内容较少时，还能滚动\n\t\t\t\tthis.scrollViewHeight = this.sys.windowHeight - this.customNavHeight\n\t\t\t},\n\t\t\t// 索引列表被触摸\n\t\t\ttouchStart(e) {\n\t\t\t\t// 获取触摸点信息\n\t\t\t\tconst touchStart = e.changedTouches[0]\n\t\t\t\tif (!touchStart) return\n\t\t\t\tthis.touching = true\n\t\t\t\tconst {\n\t\t\t\t\tpageY\n\t\t\t\t} = touchStart\n\t\t\t\t// 根据当前触摸点的坐标，获取当前触摸的为第几个字母\n\t\t\t\tconst currentIndex = this.getIndexListLetter(pageY)\n\t\t\t\tthis.setValueForTouch(currentIndex)\n\t\t\t},\n\t\t\t// 索引字母列表被触摸滑动中\n\t\t\ttouchMove(e) {\n\t\t\t\t// 获取触摸点信息\n\t\t\t\tlet touchMove = e.changedTouches[0]\n\t\t\t\tif (!touchMove) return;\n\n\t\t\t\t// 滑动结束后迅速开始第二次滑动时候 touching 为 false 造成不显示 indicator 问题\n\t\t\t\tif (!this.touching) {\n\t\t\t\t\tthis.touching = true\n\t\t\t\t}\n\t\t\t\tconst {\n\t\t\t\t\tpageY\n\t\t\t\t} = touchMove\n\t\t\t\tconst currentIndex = this.getIndexListLetter(pageY)\n\t\t\t\tthis.setValueForTouch(currentIndex)\n\t\t\t},\n\t\t\t// 触摸结束\n\t\t\ttouchEnd(e) {\n\t\t\t\t// 延时一定时间后再隐藏指示器，为了让用户看的更直观，同时也是为了消除快速切换u-transition的show带来的影响\n\t\t\t\tuni.$u.sleep(300).then(() => {\n\t\t\t\t\tthis.touching = false\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取索引列表的尺寸以及单个字符的尺寸信息\n\t\t\tgetIndexListLetterRect() {\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\t// 延时一定时间，以获取dom尺寸\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.$uGetRect('.u-index-list__letter').then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tconst ref = this.$refs['u-index-list__letter']\n\t\t\t\t\tdom.getComponentRect(ref, res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 设置indexList索引的尺寸信息\n\t\t\tsetIndexListLetterInfo() {\n\t\t\t\tthis.getIndexListLetterRect().then(size => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\theight\n\t\t\t\t\t} = size\n\t\t\t\t\tconst sys = uni.$u.sys()\n\t\t\t\t\tconst windowHeight = sys.windowHeight\n\t\t\t\t\tlet customNavHeight = 0\n\t\t\t\t\t// 消除各端导航栏非原生和原生导致的差异，让索引列表字母对屏幕垂直居中\n\t\t\t\t\tif (this.customNavHeight == 0) {\n\t\t\t\t\t\t// #ifdef H5\n\t\t\t\t\t\tcustomNavHeight = sys.windowTop\n\t\t\t\t\t\t// #endif\n\t\t\t\t\t\t// #ifndef H5\n\t\t\t\t\t\t// 在非H5中，为原生导航栏，其高度不算在windowHeight内，这里设置为负值，后面相加时变成减去其高度的一半\n\t\t\t\t\t\tcustomNavHeight = -(sys.statusBarHeight + 44)\n\t\t\t\t\t\t// #endif\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomNavHeight = uni.$u.getPx(this.customNavHeight)\n\t\t\t\t\t}\n\t\t\t\t\tthis.letterInfo = {\n\t\t\t\t\t\theight,\n\t\t\t\t\t\t// 为了让字母列表对屏幕绝对居中，让其对导航栏进行修正，也即往上偏移导航栏的一半高度\n\t\t\t\t\t\ttop: (windowHeight - height) / 2 + customNavHeight / 2,\n\t\t\t\t\t\titemHeight: Math.floor(height / this.uIndexList.length)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取当前被触摸的索引字母\n\t\t\tgetIndexListLetter(pageY) {\n\t\t\t\tconst {\n\t\t\t\t\ttop,\n\t\t\t\t\theight,\n\t\t\t\t\titemHeight\n\t\t\t\t} = this.letterInfo\n\t\t\t\t// 对H5的pageY进行修正，这是由于uni-app自作多情在H5中将触摸点的坐标跟H5的导航栏结合导致的问题\n\t\t\t\t// #ifdef H5\n\t\t\t\tpageY += uni.$u.sys().windowTop\n\t\t\t\t// #endif\n\t\t\t\t// 对第一和最后一个字母做边界处理，因为用户可能在字母列表上触摸到两端的尽头后依然继续滑动\n\t\t\t\tif (pageY < top) {\n\t\t\t\t\treturn 0\n\t\t\t\t} else if (pageY >= top + height) {\n\t\t\t\t\t// 如果超出了，取最后一个字母\n\t\t\t\t\treturn this.uIndexList.length - 1\n\t\t\t\t} else {\n\t\t\t\t\t// 将触摸点的Y轴偏移值，减去索引字母的top值，除以每个字母的高度，即可得到当前触摸点落在哪个字母上\n\t\t\t\t\treturn Math.floor((pageY - top) / itemHeight);\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 设置各项由触摸而导致变化的值\n\t\t\tsetValueForTouch(currentIndex) {\n\t\t\t\t// 如果偏移量太小，前后得出的会是同一个索引字母，为了防抖，进行返回\n\t\t\t\tif (currentIndex === this.activeIndex) return\n\t\t\t\tthis.activeIndex = currentIndex\n\t\t\t\t// #ifndef APP-NVUE || MP-WEIXIN\n\t\t\t\t// 在非nvue中，由于anchor和item都在u-index-item中，所以需要对index-item进行偏移\n\t\t\t\tthis.scrollIntoView = `u-index-item-${this.uIndexList[currentIndex].charCodeAt(0)}`\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\t// 微信小程序下，scroll-view的scroll-into-view属性无法对slot中的内容的id生效，只能通过设置scrollTop的形式去移动滚动条\n\t\t\t\tthis.scrollTop = this.children[currentIndex].top\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 在nvue中，由于cell和header为同级元素，所以实际是需要对header(anchor)进行偏移\n\t\t\t\tconst anchor = `u-index-anchor-${this.uIndexList[currentIndex]}`\n\t\t\t\tdom.scrollToElement(this.anchors[currentIndex].$refs[anchor], {\n\t\t\t\t\toffset: 0,\n\t\t\t\t\tanimated: false\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tgetHeaderRect() {\n\t\t\t\t// 获取header slot的高度，因为list组件中获取元素的尺寸是没有top值的\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(this.$refs.header, res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t},\n\t\t\t// scroll-view的滚动事件\n\t\t\tasync scrollHandler(e) {\n\t\t\t\tif (this.touching || this.scrolling) return\n\t\t\t\t// 每过一定时间取样一次，减少资源损耗以及可能带来的卡顿\n\t\t\t\tthis.scrolling = true\n\t\t\t\tuni.$u.sleep(10).then(() => {\n\t\t\t\t\tthis.scrolling = false\n\t\t\t\t})\n\t\t\t\tlet scrollTop = 0\n\t\t\t\tconst len = this.children.length\n\t\t\t\tlet children = this.children\n\t\t\t\tconst anchors = this.anchors\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下获取的滚动条偏移为负数，需要转为正数\n\t\t\t\tscrollTop = Math.abs(e.contentOffset.y)\n\t\t\t\t// 获取header slot的尺寸信息\n\t\t\t\tconst header = await this.getHeaderRect()\n\t\t\t\t// item的top值，在nvue下，模拟出的anchor的top，类似非nvue下的index-item的top\n\t\t\t\tlet top = header.height\n\t\t\t\t// 由于list组件无法获取cell的top值，这里通过header slot和各个item之间的height，模拟出类似非nvue下的位置信息\n\t\t\t\tchildren = this.children.map((item, index) => {\n\t\t\t\t\tconst child = {\n\t\t\t\t\t\theight: item.height,\n\t\t\t\t\t\ttop\n\t\t\t\t\t}\n\t\t\t\t\t// 进行累加，给下一个item提供计算依据\n\t\t\t\t\ttop += item.height + anchors[index].height\n\t\t\t\t\treturn child\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t// 非nvue通过detail获取滚动条位移\n\t\t\t\tscrollTop = e.detail.scrollTop\n\t\t\t\t// #endif\n\t\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\t\tconst item = children[i],\n\t\t\t\t\t\tnextItem = children[i + 1]\n\t\t\t\t\t// 如果滚动条高度小于第一个item的top值，此时无需设置任意字母为高亮\n\t\t\t\t\tif (scrollTop <= children[0].top || scrollTop >= children[len - 1].top + children[len -\n\t\t\t\t\t\t\t1].height) {\n\t\t\t\t\t\tthis.activeIndex = -1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t} else if (!nextItem) { \n\t\t\t\t\t\t// 当不存在下一个item时，意味着历遍到了最后一个\n\t\t\t\t\t\tthis.activeIndex = len - 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t} else if (scrollTop > item.top && scrollTop < nextItem.top) {\n\t\t\t\t\t\tthis.activeIndex = i\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-index-list {\n\n\t\t&__letter {\n\t\t\tposition: fixed;\n\t\t\tright: 0;\n\t\t\ttext-align: center;\n\t\t\tz-index: 3;\n\t\t\tpadding: 0 6px;\n\n\t\t\t&__item {\n\t\t\t\twidth: 16px;\n\t\t\t\theight: 16px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t\tmargin: 1px 0;\n\t\t\t\t@include flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\t&--active {\n\t\t\t\t\tbackground-color: $u-primary;\n\t\t\t\t}\n\n\t\t\t\t&__index {\n\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\tline-height: 12px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__indicator {\n\t\t\twidth: 50px;\n\t\t\theight: 50px;\n\t\t\tborder-radius: 100px 100px 0 100px;\n\t\t\ttext-align: center;\n\t\t\tcolor: #ffffff;\n\t\t\tbackground-color: #c9c9c9;\n\t\t\ttransform: rotate(-45deg);\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\n\t\t\t&__text {\n\t\t\t\tfont-size: 28px;\n\t\t\t\tline-height: 28px;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tcolor: #fff;\n\t\t\t\ttransform: rotate(45deg);\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-input/props.js",
    "content": "export default {\n\tprops: {\n\t\t// 输入的值\n\t\tvalue: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.value\n\t\t},\n\t\t// 输入框类型\n\t\t// number-数字输入键盘，app-vue下可以输入浮点数，app-nvue和小程序平台下只能输入整数\n\t\t// idcard-身份证输入键盘，微信、支付宝、百度、QQ小程序\n\t\t// digit-带小数点的数字键盘，App的nvue页面、微信、支付宝、百度、头条、QQ小程序\n\t\t// text-文本输入键盘\n\t\ttype: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.type\n\t\t},\n\t\t// 如果 textarea 是在一个 position:fixed 的区域，需要显示指定属性 fixed 为 true，\n\t\t// 兼容性：微信小程序、百度小程序、字节跳动小程序、QQ小程序\n\t\tfixed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.fixed\n\t\t},\n\t\t// 是否禁用输入框\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.disabled\n\t\t},\n\t\t// 禁用状态时的背景色\n\t\tdisabledColor: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.disabledColor\n\t\t},\n\t\t// 是否显示清除控件\n\t\tclearable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.clearable\n\t\t},\n\t\t// 是否密码类型\n\t\tpassword: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.password\n\t\t},\n\t\t// 最大输入长度，设置为 -1 的时候不限制最大长度\n\t\tmaxlength: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.maxlength\n\t\t},\n\t\t// \t输入框为空时的占位符\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.placeholder\n\t\t},\n\t\t// 指定placeholder的样式类，注意页面或组件的style中写了scoped时，需要在类名前写/deep/\n\t\tplaceholderClass: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.placeholderClass\n\t\t},\n\t\t// 指定placeholder的样式\n\t\tplaceholderStyle: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: uni.$u.props.input.placeholderStyle\n\t\t},\n\t\t// 是否显示输入字数统计，只在 type =\"text\"或type =\"textarea\"时有效\n\t\tshowWordLimit: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.showWordLimit\n\t\t},\n\t\t// 设置右下角按钮的文字，有效值：send|search|next|go|done，兼容性详见uni-app文档\n\t\t// https://uniapp.dcloud.io/component/input\n\t\t// https://uniapp.dcloud.io/component/textarea\n\t\tconfirmType: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.confirmType\n\t\t},\n\t\t// 点击键盘右下角按钮时是否保持键盘不收起，H5无效\n\t\tconfirmHold: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.confirmHold\n\t\t},\n\t\t// focus时，点击页面的时候不收起键盘，微信小程序有效\n\t\tholdKeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.holdKeyboard\n\t\t},\n\t\t// 自动获取焦点\n\t\t// 在 H5 平台能否聚焦以及软键盘是否跟随弹出，取决于当前浏览器本身的实现。nvue 页面不支持，需使用组件的 focus()、blur() 方法控制焦点\n\t\tfocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.focus\n\t\t},\n\t\t// 键盘收起时，是否自动失去焦点，目前仅App3.0.0+有效\n\t\tautoBlur: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.autoBlur\n\t\t},\n\t\t// 是否去掉 iOS 下的默认内边距，仅微信小程序，且type=textarea时有效\n\t\tdisableDefaultPadding: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.disableDefaultPadding\n\t\t},\n\t\t// 指定focus时光标的位置\n\t\tcursor: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.cursor\n\t\t},\n\t\t// 输入框聚焦时底部与键盘的距离\n\t\tcursorSpacing: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.cursorSpacing\n\t\t},\n\t\t// 光标起始位置，自动聚集时有效，需与selection-end搭配使用\n\t\tselectionStart: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.selectionStart\n\t\t},\n\t\t// 光标结束位置，自动聚集时有效，需与selection-start搭配使用\n\t\tselectionEnd: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.selectionEnd\n\t\t},\n\t\t// 键盘弹起时，是否自动上推页面\n\t\tadjustPosition: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.adjustPosition\n\t\t},\n\t\t// 输入框内容对齐方式，可选值为：left|center|right\n\t\tinputAlign: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.inputAlign\n\t\t},\n\t\t// 输入框字体的大小\n\t\tfontSize: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.input.fontSize\n\t\t},\n\t\t// 输入框字体颜色\n\t\tcolor: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.color\n\t\t},\n\t\t// 输入框前置图标\n\t\tprefixIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.prefixIcon\n\t\t},\n\t\t// 前置图标样式，对象或字符串\n\t\tprefixIconStyle: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: uni.$u.props.input.prefixIconStyle\n\t\t},\n\t\t// 输入框后置图标\n\t\tsuffixIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.suffixIcon\n\t\t},\n\t\t// 后置图标样式，对象或字符串\n\t\tsuffixIconStyle: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: uni.$u.props.input.suffixIconStyle\n\t\t},\n\t\t// 边框类型，surround-四周边框，bottom-底部边框，none-无边框\n\t\tborder: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.border\n\t\t},\n\t\t// 是否只读，与disabled不同之处在于disabled会置灰组件，而readonly则不会\n\t\treadonly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.input.readonly\n\t\t},\n\t\t// 输入框形状，circle-圆形，square-方形\n\t\tshape: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.shape\n\t\t},\n\t\t// 用于处理或者过滤输入框内容的方法\n\t\tformatter: {\n\t\t\ttype: [Function, null],\n\t\t\tdefault: uni.$u.props.input.formatter\n\t\t},\n\t\t// 是否忽略组件内对文本合成系统事件的处理\n\t\tignoreCompositionEvent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-input/u-input.vue",
    "content": "<template>\n    <view class=\"u-input\" :class=\"inputClass\" :style=\"[wrapperStyle]\">\n        <view class=\"u-input__content\">\n            <view\n                class=\"u-input__content__prefix-icon\"\n                v-if=\"prefixIcon || $slots.prefix\"\n            >\n                <slot name=\"prefix\">\n                    <u-icon\n                        :name=\"prefixIcon\"\n                        size=\"18\"\n                        :customStyle=\"prefixIconStyle\"\n                    ></u-icon>\n                </slot>\n            </view>\n            <view class=\"u-input__content__field-wrapper\" @tap=\"clickHandler\">\n\t\t\t\t<!-- 根据uni-app的input组件文档，H5和APP中只要声明了password参数(无论true还是false)，type均失效，此时\n\t\t\t\t\t为了防止type=number时，又存在password属性，type无效，此时需要设置password为undefined\n                    -- APP动态修改password失效，需要改为 password || type === 'password' || false\n\t\t\t\t -->\n            \t<input\n            \t    class=\"u-input__content__field-wrapper__field\"\n            \t    :style=\"[inputStyle]\"\n            \t    :type=\"type\"\n            \t    :focus=\"focus\"\n            \t    :cursor=\"cursor\"\n            \t    :value=\"innerValue\"\n            \t    :auto-blur=\"autoBlur\"\n            \t    :disabled=\"disabled || readonly\"\n            \t    :maxlength=\"maxlength\"\n            \t    :placeholder=\"placeholder\"\n            \t    :placeholder-style=\"placeholderStyle\"\n            \t    :placeholder-class=\"placeholderClass\"\n            \t    :confirm-type=\"confirmType\"\n            \t    :confirm-hold=\"confirmHold\"\n            \t    :hold-keyboard=\"holdKeyboard\"\n            \t    :cursor-spacing=\"cursorSpacing\"\n            \t    :adjust-position=\"adjustPosition\"\n            \t    :selection-end=\"selectionEnd\"\n            \t    :selection-start=\"selectionStart\"\n            \t    :password=\"password || type === 'password' || false\"\n                    :ignoreCompositionEvent=\"ignoreCompositionEvent\"\n            \t    @input=\"onInput\"\n            \t    @blur=\"onBlur\"\n            \t    @focus=\"onFocus\"\n            \t    @confirm=\"onConfirm\"\n            \t    @keyboardheightchange=\"onkeyboardheightchange\"\n            \t/>\n            </view>\n            <view\n                class=\"u-input__content__clear\"\n                v-if=\"isShowClear\"\n                @tap=\"onClear\"\n            >\n                <u-icon\n                    name=\"close\"\n                    size=\"11\"\n                    color=\"#ffffff\"\n                    customStyle=\"line-height: 12px\"\n                ></u-icon>\n            </view>\n            <view\n                class=\"u-input__content__subfix-icon\"\n                v-if=\"suffixIcon || $slots.suffix\"\n            >\n                <slot name=\"suffix\">\n                    <u-icon\n                        :name=\"suffixIcon\"\n                        size=\"18\"\n                        :customStyle=\"suffixIconStyle\"\n                    ></u-icon>\n                </slot>\n            </view>\n        </view>\n    </view>\n</template>\n\n<script>\nimport props from \"./props.js\";\n/**\n * Input 输入框\n * @description  此组件为一个输入框，默认没有边框和样式，是专门为配合表单组件u-form而设计的，利用它可以快速实现表单验证，输入内容，下拉选择等功能。\n * @tutorial https://uviewui.com/components/input.html\n * @property {String | Number}\tvalue\t\t\t\t\t输入的值\n * @property {String}\t\t\ttype\t\t\t\t\t输入框类型，见上方说明 （ 默认 'text' ）\n * @property {Boolean}\t\t\tfixed\t\t\t\t\t如果 textarea 是在一个 position:fixed 的区域，需要显示指定属性 fixed 为 true，兼容性：微信小程序、百度小程序、字节跳动小程序、QQ小程序 （ 默认 false ）\n * @property {Boolean}\t\t\tdisabled\t\t\t\t是否禁用输入框 （ 默认 false ）\n * @property {String}\t\t\tdisabledColor\t\t\t禁用状态时的背景色（ 默认 '#f5f7fa' ）\n * @property {Boolean}\t\t\tclearable\t\t\t\t是否显示清除控件 （ 默认 false ）\n * @property {Boolean}\t\t\tpassword\t\t\t\t是否密码类型 （ 默认 false ）\n * @property {String | Number}\tmaxlength\t\t\t\t最大输入长度，设置为 -1 的时候不限制最大长度 （ 默认 -1 ）\n * @property {String}\t\t\tplaceholder\t\t\t\t输入框为空时的占位符\n * @property {String}\t\t\tplaceholderClass\t\t指定placeholder的样式类，注意页面或组件的style中写了scoped时，需要在类名前写/deep/ （ 默认 'input-placeholder' ）\n * @property {String | Object}\tplaceholderStyle\t\t指定placeholder的样式，字符串/对象形式，如\"color: red;\"\n * @property {Boolean}\t\t\tshowWordLimit\t\t\t是否显示输入字数统计，只在 type =\"text\"或type =\"textarea\"时有效 （ 默认 false ）\n * @property {String}\t\t\tconfirmType\t\t\t\t设置右下角按钮的文字，兼容性详见uni-app文档 （ 默认 'done' ）\n * @property {Boolean}\t\t\tconfirmHold\t\t\t\t点击键盘右下角按钮时是否保持键盘不收起，H5无效 （ 默认 false ）\n * @property {Boolean}\t\t\tholdKeyboard\t\t\tfocus时，点击页面的时候不收起键盘，微信小程序有效 （ 默认 false ）\n * @property {Boolean}\t\t\tfocus\t\t\t\t\t自动获取焦点，在 H5 平台能否聚焦以及软键盘是否跟随弹出，取决于当前浏览器本身的实现。nvue 页面不支持，需使用组件的 focus()、blur() 方法控制焦点 （ 默认 false ）\n * @property {Boolean}\t\t\tautoBlur\t\t\t\t键盘收起时，是否自动失去焦点，目前仅App3.0.0+有效 （ 默认 false ）\n * @property {Boolean}\t\t\tdisableDefaultPadding\t是否去掉 iOS 下的默认内边距，仅微信小程序，且type=textarea时有效 （ 默认 false ）\n * @property {String ｜ Number}\tcursor\t\t\t\t\t指定focus时光标的位置（ 默认 -1 ）\n * @property {String ｜ Number}\tcursorSpacing\t\t\t输入框聚焦时底部与键盘的距离 （ 默认 30 ）\n * @property {String ｜ Number}\tselectionStart\t\t\t光标起始位置，自动聚集时有效，需与selection-end搭配使用 （ 默认 -1 ）\n * @property {String ｜ Number}\tselectionEnd\t\t\t光标结束位置，自动聚集时有效，需与selection-start搭配使用 （ 默认 -1 ）\n * @property {Boolean}\t\t\tadjustPosition\t\t\t键盘弹起时，是否自动上推页面 （ 默认 true ）\n * @property {String}\t\t\tinputAlign\t\t\t\t输入框内容对齐方式（ 默认 'left' ）\n * @property {String | Number}\tfontSize\t\t\t\t输入框字体的大小 （ 默认 '15px' ）\n * @property {String}\t\t\tcolor\t\t\t\t\t输入框字体颜色\t（ 默认 '#303133' ）\n * @property {Function}\t\t\tformatter\t\t\t    内容式化函数\n * @property {String}\t\t\tprefixIcon\t\t\t\t输入框前置图标\n * @property {String | Object}\tprefixIconStyle\t\t\t前置图标样式，对象或字符串\n * @property {String}\t\t\tsuffixIcon\t\t\t\t输入框后置图标\n * @property {String | Object}\tsuffixIconStyle\t\t\t后置图标样式，对象或字符串\n * @property {String}\t\t\tborder\t\t\t\t\t边框类型，surround-四周边框，bottom-底部边框，none-无边框 （ 默认 'surround' ）\n * @property {Boolean}\t\t\treadonly\t\t\t\t是否只读，与disabled不同之处在于disabled会置灰组件，而readonly则不会 （ 默认 false ）\n * @property {String}\t\t\tshape\t\t\t\t\t输入框形状，circle-圆形，square-方形 （ 默认 'square' ）\n * @property {Object}\t\t\tcustomStyle\t\t\t\t定义需要用到的外部样式\n * @property {Boolean}\t\t\tignoreCompositionEvent\t是否忽略组件内对文本合成系统事件的处理。\n * @example <u-input v-model=\"value\" :password=\"true\" suffix-icon=\"lock-fill\" />\n */\nexport default {\n    name: \"u-input\",\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n    data() {\n        return {\n            // 输入框的值\n            innerValue: \"\",\n            // 是否处于获得焦点状态\n            focused: false,\n            // value是否第一次变化，在watch中，由于加入immediate属性，会在第一次触发，此时不应该认为value发生了变化\n            firstChange: true,\n            // value绑定值的变化是由内部还是外部引起的\n            changeFromInner: false,\n\t\t\t// 过滤处理方法\n\t\t\tinnerFormatter: value => value\n        };\n    },\n    watch: {\n        value: {\n            immediate: true,\n            handler(newVal, oldVal) {\n                this.innerValue = newVal;\n                /* #ifdef H5 */\n                // 在H5中，外部value变化后，修改input中的值，不会触发@input事件，此时手动调用值变化方法\n                if (\n                    this.firstChange === false &&\n                    this.changeFromInner === false\n                ) {\n                    this.valueChange();\n                }\n                /* #endif */\n                this.firstChange = false;\n                // 重置changeFromInner的值为false，标识下一次引起默认为外部引起的\n                this.changeFromInner = false;\n            },\n        },\n    },\n    computed: {\n        // 是否显示清除控件\n        isShowClear() {\n            const { clearable, readonly, focused, innerValue } = this;\n            return !!clearable && !readonly && !!focused && innerValue !== \"\";\n        },\n        // 组件的类名\n        inputClass() {\n            let classes = [],\n                { border, disabled, shape } = this;\n            border === \"surround\" &&\n                (classes = classes.concat([\"u-border\", \"u-input--radius\"]));\n            classes.push(`u-input--${shape}`);\n            border === \"bottom\" &&\n                (classes = classes.concat([\n                    \"u-border-bottom\",\n                    \"u-input--no-radius\",\n                ]));\n            return classes.join(\" \");\n        },\n        // 组件的样式\n        wrapperStyle() {\n            const style = {};\n            // 禁用状态下，被背景色加上对应的样式\n            if (this.disabled) {\n                style.backgroundColor = this.disabledColor;\n            }\n            // 无边框时，去除内边距\n            if (this.border === \"none\") {\n                style.padding = \"0\";\n            } else {\n                // 由于uni-app的iOS开发者能力有限，导致需要分开写才有效\n                style.paddingTop = \"6px\";\n                style.paddingBottom = \"6px\";\n                style.paddingLeft = \"9px\";\n                style.paddingRight = \"9px\";\n            }\n            return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));\n        },\n        // 输入框的样式\n        inputStyle() {\n            const style = {\n                color: this.color,\n                fontSize: uni.$u.addUnit(this.fontSize),\n\t\t\t\ttextAlign: this.inputAlign\n            };\n            return style;\n        },\n    },\n    methods: {\n\t\t// 在微信小程序中，不支持将函数当做props参数，故只能通过ref形式调用\n\t\tsetFormatter(e) {\n\t\t\tthis.innerFormatter = e\n\t\t},\n        // 当键盘输入时，触发input事件\n        onInput(e) {\n            let { value = \"\" } = e.detail || {};\n            // 格式化过滤方法\n            const formatter = this.formatter || this.innerFormatter\n            const formatValue = formatter(value)\n            // 为了避免props的单向数据流特性，需要先将innerValue值设置为当前值，再在$nextTick中重新赋予设置后的值才有效\n            this.innerValue = value\n            this.$nextTick(() => {\n            \tthis.innerValue = formatValue;\n            \tthis.valueChange();\n            })\n        },\n        // 输入框失去焦点时触发\n        onBlur(event) {\n            this.$emit(\"blur\", event.detail.value);\n            // H5端的blur会先于点击清除控件的点击click事件触发，导致focused\n            // 瞬间为false，从而隐藏了清除控件而无法被点击到\n            uni.$u.sleep(50).then(() => {\n                this.focused = false;\n            });\n            // 尝试调用u-form的验证方法\n            uni.$u.formValidate(this, \"blur\");\n        },\n        // 输入框聚焦时触发\n        onFocus(event) {\n            this.focused = true;\n            this.$emit(\"focus\");\n        },\n        // 点击完成按钮时触发\n        onConfirm(event) {\n            this.$emit(\"confirm\", this.innerValue);\n        },\n        // 键盘高度发生变化的时候触发此事件\n        // 兼容性：微信小程序2.7.0+、App 3.1.0+\n\t\tonkeyboardheightchange() {\n            this.$emit(\"keyboardheightchange\");\n        },\n        // 内容发生变化，进行处理\n        valueChange() {\n            const value = this.innerValue;\n            this.$nextTick(() => {\n                this.$emit(\"input\", value);\n                // 标识value值的变化是由内部引起的\n                this.changeFromInner = true;\n                this.$emit(\"change\", value);\n                // 尝试调用u-form的验证方法\n                uni.$u.formValidate(this, \"change\");\n            });\n        },\n        // 点击清除控件\n        onClear() {\n            this.innerValue = \"\";\n            this.$nextTick(() => {\n                this.valueChange();\n                this.$emit(\"clear\");\n            });\n        },\n        /**\n         * 在安卓nvue上，事件无法冒泡\n         * 在某些时间，我们希望监听u-from-item的点击事件，此时会导致点击u-form-item内的u-input后\n         * 无法触发u-form-item的点击事件，这里通过手动调用u-form-item的方法进行触发\n         */\n        clickHandler() {\n            // #ifdef APP-NVUE\n            if (uni.$u.os() === \"android\") {\n                const formItem = uni.$u.$parent.call(this, \"u-form-item\");\n                if (formItem) {\n                    formItem.clickHandler();\n                }\n            }\n            // #endif\n        },\n    },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n.u-input {\n    @include flex(row);\n    align-items: center;\n    justify-content: space-between;\n    flex: 1;\n\n    &--radius,\n    &--square {\n        border-radius: 4px;\n    }\n\n    &--no-radius {\n        border-radius: 0;\n    }\n\n    &--circle {\n        border-radius: 100px;\n    }\n\n    &__content {\n        flex: 1;\n        @include flex(row);\n        align-items: center;\n        justify-content: space-between;\n\n        &__field-wrapper {\n            position: relative;\n            @include flex(row);\n            margin: 0;\n            flex: 1;\n\t\t\t\n\t\t\t&__field {\n\t\t\t\tline-height: 26px;\n\t\t\t\ttext-align: left;\n\t\t\t\tcolor: $u-main-color;\n\t\t\t\theight: 24px;\n\t\t\t\tfont-size: 15px;\n\t\t\t\tflex: 1;\n\t\t\t}\n        }\n\n        &__clear {\n            width: 20px;\n            height: 20px;\n            border-radius: 100px;\n            background-color: #c6c7cb;\n            @include flex(row);\n            align-items: center;\n            justify-content: center;\n            transform: scale(0.82);\n            margin-left: 4px;\n        }\n\n        &__subfix-icon {\n            margin-left: 4px;\n        }\n\n        &__prefix-icon {\n            margin-right: 4px;\n        }\n    }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-keyboard/props.js",
    "content": "export default {\n    props: {\n        // 键盘的类型，number-数字键盘，card-身份证键盘，car-车牌号键盘\n        mode: {\n            type: String,\n            default: uni.$u.props.keyboard.mode\n        },\n        // 是否显示键盘的\".\"符号\n        dotDisabled: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.dotDisabled\n        },\n        // 是否显示顶部工具条\n        tooltip: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.tooltip\n        },\n        // 是否显示工具条中间的提示\n        showTips: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.showTips\n        },\n        // 工具条中间的提示文字\n        tips: {\n            type: String,\n            default: uni.$u.props.keyboard.tips\n        },\n        // 是否显示工具条左边的\"取消\"按钮\n        showCancel: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.showCancel\n        },\n        // 是否显示工具条右边的\"完成\"按钮\n        showConfirm: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.showConfirm\n        },\n        // 是否打乱键盘按键的顺序\n        random: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.random\n        },\n        // 是否开启底部安全区适配，开启的话，会在iPhoneX机型底部添加一定的内边距\n        safeAreaInsetBottom: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.safeAreaInsetBottom\n        },\n        // 是否允许通过点击遮罩关闭键盘\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.closeOnClickOverlay\n        },\n        // 控制键盘的弹出与收起\n        show: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.show\n        },\n        // 是否显示遮罩，某些时候数字键盘时，用户希望看到自己的数值，所以可能不想要遮罩\n        overlay: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.overlay\n        },\n        // z-index值\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.keyboard.zIndex\n        },\n        // 取消按钮的文字\n        cancelText: {\n            type: String,\n            default: uni.$u.props.keyboard.cancelText\n        },\n        // 确认按钮的文字\n        confirmText: {\n            type: String,\n            default: uni.$u.props.keyboard.confirmText\n        },\n        // 输入一个中文后，是否自动切换到英文\n        autoChange: {\n            type: Boolean,\n            default: uni.$u.props.keyboard.autoChange\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue",
    "content": "<template>\n\t<u-popup\n\t    :overlay=\"overlay\"\n\t    :closeOnClickOverlay=\"closeOnClickOverlay\"\n\t    mode=\"bottom\"\n\t    :popup=\"false\"\n\t    :show=\"show\"\n\t    :safeAreaInsetBottom=\"safeAreaInsetBottom\"\n\t    @close=\"popupClose\"\n\t    :zIndex=\"zIndex\"\n\t    :customStyle=\"{\n\t\t\tbackgroundColor: 'rgb(214, 218, 220)'\n\t\t}\"\n\t>\n\t\t<view class=\"u-keyboard\">\n\t\t\t<slot />\n\t\t\t<view\n\t\t\t    class=\"u-keyboard__tooltip\"\n\t\t\t    v-if=\"tooltip\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t    hover-class=\"u-hover-class\"\n\t\t\t\t    :hover-stay-time=\"100\"\n\t\t\t\t>\n\t\t\t\t\t<text\n\t\t\t\t\t    class=\"u-keyboard__tooltip__item u-keyboard__tooltip__cancel\"\n\t\t\t\t\t    v-if=\"showCancel\"\n\t\t\t\t\t    @tap=\"onCancel\"\n\t\t\t\t\t>{{showCancel && cancelText}}</text>\n\t\t\t\t</view>\n\t\t\t\t<view>\n\t\t\t\t\t<text\n\t\t\t\t\t    v-if=\"showTips\"\n\t\t\t\t\t    class=\"u-keyboard__tooltip__item u-keyboard__tooltip__tips\"\n\t\t\t\t\t>{{tips ? tips : mode == 'number' ? '数字键盘' : mode == 'card' ? '身份证键盘' : '车牌号键盘'}}</text>\n\t\t\t\t</view>\n\t\t\t\t<view\n\t\t\t\t    hover-class=\"u-hover-class\"\n\t\t\t\t    :hover-stay-time=\"100\"\n\t\t\t\t>\n\t\t\t\t\t<text\n\t\t\t\t\t    v-if=\"showConfirm\"\n\t\t\t\t\t    @tap=\"onConfirm\"\n\t\t\t\t\t    class=\"u-keyboard__tooltip__item u-keyboard__tooltip__submit\"\n\t\t\t\t\t    hover-class=\"u-hover-class\"\n\t\t\t\t\t>{{showConfirm && confirmText}}</text>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<template v-if=\"mode == 'number' || mode == 'card'\">\n\t\t\t\t<u-number-keyboard\n\t\t\t\t    :random=\"random\"\n\t\t\t\t    @backspace=\"backspace\"\n\t\t\t\t    @change=\"change\"\n\t\t\t\t    :mode=\"mode\"\n\t\t\t\t    :dotDisabled=\"dotDisabled\"\n\t\t\t\t></u-number-keyboard>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<u-car-keyboard\n\t\t\t\t    :random=\"random\"\n\t\t\t\t\t:autoChange=\"autoChange\"\n\t\t\t\t    @backspace=\"backspace\"\n\t\t\t\t    @change=\"change\"\n\t\t\t\t></u-car-keyboard>\n\t\t\t</template>\n\t\t</view>\n\t</u-popup>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * keyboard 键盘\n\t * @description 此为uViw自定义的键盘面板，内含了数字键盘，车牌号键，身份证号键盘3中模式，都有可以打乱按键顺序的选项。\n\t * @tutorial https://www.uviewui.com/components/keyboard.html\n\t * @property {String}\t\t\tmode\t\t\t\t键盘类型，见官网基本使用的说明 （默认 'number' ）\n\t * @property {Boolean}\t\t\tdotDisabled\t\t\t是否显示\".\"按键，只在mode=number时有效 （默认 false ）\n\t * @property {Boolean}\t\t\ttooltip\t\t\t\t是否显示键盘顶部工具条 （默认 true ）\n\t * @property {Boolean}\t\t\tshowTips\t\t\t是否显示工具条中间的提示 （默认 true ）\n\t * @property {String}\t\t\ttips\t\t\t\t工具条中间的提示文字，见上方基本使用的说明，如不需要，请传\"\"空字符\n\t * @property {Boolean}\t\t\tshowCancel\t\t\t是否显示工具条左边的\"取消\"按钮 （默认 true ）\n\t * @property {Boolean}\t\t\tshowConfirm\t\t\t是否显示工具条右边的\"完成\"按钮（ 默认 true ）\n\t * @property {Boolean}\t\t\trandom\t\t\t\t是否打乱键盘按键的顺序 （默认 false ）\n\t * @property {Boolean}\t\t\tsafeAreaInsetBottom\t是否开启底部安全区适配 （默认 true ）\n\t * @property {Boolean}\t\t\tcloseOnClickOverlay\t是否允许点击遮罩收起键盘 （默认 true ）\n\t * @property {Boolean}\t\t\tshow\t\t\t\t控制键盘的弹出与收起（默认 false ）\n\t * @property {Boolean}\t\t\toverlay\t\t\t\t是否显示遮罩 （默认 true ）\n\t * @property {String | Number}\tzIndex\t\t\t\t弹出键盘的z-index值 （默认 1075 ）\n\t * @property {String}\t\t\tcancelText\t\t\t取消按钮的文字 （默认 '取消' ）\n\t * @property {String}\t\t\tconfirmText\t\t\t确认按钮的文字 （默认 '确认' ）\n\t * @property {Object}\t\t\tcustomStyle\t\t\t自定义样式，对象形式\n\t * @event {Function} change 按键被点击(不包含退格键被点击)\n\t * @event {Function} cancel 键盘顶部工具条左边的\"取消\"按钮被点击\n\t * @event {Function} confirm 键盘顶部工具条右边的\"完成\"按钮被点击\n\t * @event {Function} backspace 键盘退格键被点击\n\t * @example <u-keyboard mode=\"number\" v-model=\"show\"></u-keyboard>\n\t */\n\texport default {\n\t\tname: \"u-keyboard\",\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tmethods: {\n\t\t\tchange(e) {\n\t\t\t\tthis.$emit('change', e);\n\t\t\t},\n\t\t\t// 键盘关闭\n\t\t\tpopupClose() {\n\t\t\t\tthis.$emit('close');\n\t\t\t},\n\t\t\t// 输入完成\n\t\t\tonConfirm() {\n\t\t\t\tthis.$emit('confirm');\n\t\t\t},\n\t\t\t// 取消输入\n\t\t\tonCancel() {\n\t\t\t\tthis.$emit('cancel');\n\t\t\t},\n\t\t\t// 退格键\n\t\t\tbackspace() {\n\t\t\t\tthis.$emit('backspace');\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-keyboard {\n\n\t\t&__tooltip {\n\t\t\t@include flex;\n\t\t\tjustify-content: space-between;\n\t\t\tbackground-color: #FFFFFF;\n\t\t\tpadding: 14px 12px;\n\n\t\t\t&__item {\n\t\t\t\tcolor: #333333;\n\t\t\t\tflex: 1;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 15px;\n\t\t\t}\n\n\t\t\t&__submit {\n\t\t\t\ttext-align: right;\n\t\t\t\tcolor: $u-primary;\n\t\t\t}\n\n\t\t\t&__cancel {\n\t\t\t\ttext-align: left;\n\t\t\t\tcolor: #888888;\n\t\t\t}\n\n\t\t\t&__tips {\n\t\t\t\tcolor: $u-tips-color;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-line/props.js",
    "content": "export default {\n    props: {\n        color: {\n            type: String,\n            default: uni.$u.props.line.color\n        },\n        // 长度，竖向时表现为高度，横向时表现为长度，可以为百分比，带px单位的值等\n        length: {\n            type: [String, Number],\n            default: uni.$u.props.line.length\n        },\n        // 线条方向，col-竖向，row-横向\n        direction: {\n            type: String,\n            default: uni.$u.props.line.direction\n        },\n        // 是否显示细边框\n        hairline: {\n            type: Boolean,\n            default: uni.$u.props.line.hairline\n        },\n        // 线条与上下左右元素的间距，字符串形式，如\"30px\"、\"20px 30px\"\n        margin: {\n            type: [String, Number],\n            default: uni.$u.props.line.margin\n        },\n        // 是否虚线，true-虚线，false-实线\n        dashed: {\n            type: Boolean,\n            default: uni.$u.props.line.dashed\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-line/u-line.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-line\"\n\t    :style=\"[lineStyle]\"\n\t>\n\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * line 线条\n\t * @description 此组件一般用于显示一根线条，用于分隔内容块，有横向和竖向两种模式，且能设置0.5px线条，使用也很简单\n\t * @tutorial https://www.uviewui.com/components/line.html\n\t * @property {String}\t\t\tcolor\t\t线条的颜色 ( 默认 '#d6d7d9' )\n\t * @property {String | Number}\tlength\t\t长度，竖向时表现为高度，横向时表现为长度，可以为百分比，带px单位的值等 ( 默认 '100%' )\n\t * @property {String}\t\t\tdirection\t线条的方向，row-横向，col-竖向 (默认 'row' )\n\t * @property {Boolean}\t\t\thairline\t是否显示细线条 (默认 true )\n\t * @property {String | Number}\tmargin\t\t线条与上下左右元素的间距，字符串形式，如\"30px\"  (默认 0 )\n\t * @property {Boolean}\t\t\tdashed\t\t是否虚线，true-虚线，false-实线 (默认 false )\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * @example <u-line color=\"red\"></u-line>\n\t */\n\texport default {\n\t\tname: 'u-line',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\tlineStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.margin = this.margin\n\t\t\t\t// 如果是水平线条，边框高度为1px，再通过transform缩小一半，就是0.5px了\n\t\t\t\tif (this.direction === 'row') {\n\t\t\t\t\t// 此处采用兼容分开写，兼容nvue的写法\n\t\t\t\t\tstyle.borderBottomWidth = '1px'\n\t\t\t\t\tstyle.borderBottomStyle = this.dashed ? 'dashed' : 'solid'\n\t\t\t\t\tstyle.width = uni.$u.addUnit(this.length)\n\t\t\t\t\tif (this.hairline) style.transform = 'scaleY(0.5)'\n\t\t\t\t} else {\n\t\t\t\t\t// 如果是竖向线条，边框宽度为1px，再通过transform缩小一半，就是0.5px了\n\t\t\t\t\tstyle.borderLeftWidth = '1px'\n\t\t\t\t\tstyle.borderLeftStyle = this.dashed ? 'dashed' : 'solid'\n\t\t\t\t\tstyle.height = uni.$u.addUnit(this.length)\n\t\t\t\t\tif (this.hairline) style.transform = 'scaleX(0.5)'\n\t\t\t\t}\n\n\t\t\t\tstyle.borderColor = this.color\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-line {\n\t\t/* #ifndef APP-NVUE */\n\t\tvertical-align: middle;\n\t\t/* #endif */\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-line-progress/props.js",
    "content": "export default {\n    props: {\n        // 激活部分的颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.lineProgress.activeColor\n        },\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.lineProgress.color\n        },\n        // 进度百分比，数值\n        percentage: {\n            type: [String, Number],\n            default: uni.$u.props.lineProgress.inactiveColor\n        },\n        // 是否在进度条内部显示百分比的值\n        showText: {\n            type: Boolean,\n            default: uni.$u.props.lineProgress.showText\n        },\n        // 进度条的高度，单位px\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.lineProgress.height\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-line-progress\"\n\t    :style=\"[$u.addStyle(customStyle)]\"\n\t>\n\t\t<view\n\t\t    class=\"u-line-progress__background\"\n\t\t    ref=\"u-line-progress__background\"\n\t\t    :style=\"[{\n\t\t\t\tbackgroundColor: inactiveColor,\n\t\t\t\theight: $u.addUnit(height),\n\t\t\t}]\"\n\t\t>\n\t\t</view>\n\t\t<view\n\t\t    class=\"u-line-progress__line\"\n\t\t    :style=\"[progressStyle]\"\n\t\t> \n\t\t\t<slot>\n\t\t\t\t<text v-if=\"showText && percentage >= 10\" class=\"u-line-progress__text\">{{innserPercentage + '%'}}</text>\n\t\t\t</slot> \n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * lineProgress 线型进度条\n\t * @description 展示操作或任务的当前进度，比如上传文件，是一个线形的进度条。\n\t * @tutorial https://www.uviewui.com/components/lineProgress.html\n\t * @property {String}\t\t\tactiveColor\t\t激活部分的颜色 ( 默认 '#19be6b' )\n\t * @property {String}\t\t\tinactiveColor\t背景色 ( 默认 '#ececec' )\n\t * @property {String | Number}\tpercentage\t\t进度百分比，数值 ( 默认 0 )\n\t * @property {Boolean}\t\t\tshowText\t\t是否在进度条内部显示百分比的值 ( 默认 true )\n\t * @property {String | Number}\theight\t\t\t进度条的高度，单位px ( 默认 12 )\n\t * \n\t * @example <u-line-progress :percent=\"70\" :show-percent=\"true\"></u-line-progress>\n\t */\n\texport default {\n\t\tname: \"u-line-progress\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tlineWidth: 0,\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tpercentage(n) {\n\t\t\t\tthis.resizeProgressWidth()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tprogressStyle() { \n\t\t\t\tlet style = {}\n\t\t\t\tstyle.width = this.lineWidth\n\t\t\t\tstyle.backgroundColor = this.activeColor\n\t\t\t\tstyle.height = uni.$u.addUnit(this.height)\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tinnserPercentage() {\n\t\t\t\t// 控制范围在0-100之间\n\t\t\t\treturn uni.$u.range(0, 100, this.percentage)\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tuni.$u.sleep(20).then(() => {\n\t\t\t\t\tthis.resizeProgressWidth()\n\t\t\t\t})\n\t\t\t},\n\t\t\tgetProgressWidth() {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\treturn this.$uGetRect('.u-line-progress__background')\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 返回一个promise\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(this.$refs['u-line-progress__background'], (res) => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tresizeProgressWidth() {\n\t\t\t\tthis.getProgressWidth().then(size => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\twidth\n\t\t\t\t\t} = size\n\t\t\t\t\t// 通过设置的percentage值，计算其所占总长度的百分比\n\t\t\t\t\tthis.lineWidth = width * this.innserPercentage / 100 + 'px'\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-line-progress {\n\t\talign-items: stretch;\n\t\tposition: relative;\n\t\t@include flex(row);\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\tborder-radius: 100px;\n\n\t\t&__background {\n\t\t\tbackground-color: #ececec;\n\t\t\tborder-radius: 100px;\n\t\t\tflex: 1;\n\t\t}\n\n\t\t&__line {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tbottom: 0;\n\t\t\talign-items: center;\n\t\t\t@include flex(row);\n\t\t\tcolor: #ffffff;\n\t\t\tborder-radius: 100px;\n\t\t\ttransition: width 0.5s ease;\n\t\t\tjustify-content: flex-end;\n\t\t}\n\n\t\t&__text {\n\t\t\tfont-size: 10px;\n\t\t\talign-items: center;\n\t\t\ttext-align: right;\n\t\t\tcolor: #FFFFFF;\n\t\t\tmargin-right: 5px;\n\t\t\ttransform: scale(0.9);\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-link/props.js",
    "content": "export default {\n    props: {\n        // 文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.link.color\n        },\n        // 字体大小，单位px\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.link.fontSize\n        },\n        // 是否显示下划线\n        underLine: {\n            type: Boolean,\n            default: uni.$u.props.link.underLine\n        },\n        // 要跳转的链接\n        href: {\n            type: String,\n            default: uni.$u.props.link.href\n        },\n        // 小程序中复制到粘贴板的提示语\n        mpTips: {\n            type: String,\n            default: uni.$u.props.link.mpTips\n        },\n        // 下划线颜色\n        lineColor: {\n            type: String,\n            default: uni.$u.props.link.lineColor\n        },\n        // 超链接的问题，不使用slot形式传入，是因为nvue下无法修改颜色\n        text: {\n            type: String,\n            default: uni.$u.props.link.text\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-link/u-link.vue",
    "content": "<template>\n\t<text\n\t    class=\"u-link\"\n\t    @tap.stop=\"openLink\"\n\t    :style=\"[linkStyle, $u.addStyle(customStyle)]\"\n\t>{{text}}</text>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * link 超链接\n\t * @description 该组件为超链接组件，在不同平台有不同表现形式：在APP平台会通过plus环境打开内置浏览器，在小程序中把链接复制到粘贴板，同时提示信息，在H5中通过window.open打开链接。\n\t * @tutorial https://www.uviewui.com/components/link.html\n\t * @property {String}\t\t\tcolor\t\t文字颜色 （默认 color['u-primary'] ）\n\t * @property {String ｜ Number}\tfontSize\t字体大小，单位px （默认 15 ）\n\t * @property {Boolean}\t\t\tunderLine\t是否显示下划线 （默认 false ）\n\t * @property {String}\t\t\thref\t\t跳转的链接，要带上http(s)\n\t * @property {String}\t\t\tmpTips\t\t各个小程序平台把链接复制到粘贴板后的提示语（默认“链接已复制，请在浏览器打开”）\n\t * @property {String}\t\t\tlineColor\t下划线颜色，默认同color参数颜色 \n\t * @property {String}\t\t\ttext\t\t超链接的问题，不使用slot形式传入，是因为nvue下无法修改颜色 \n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @example <u-link href=\"http://www.uviewui.com\">蜀道难，难于上青天</u-link>\n\t */\n\texport default {\n\t\tname: \"u-link\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\tlinkStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tcolor: this.color,\n\t\t\t\t\tfontSize: uni.$u.addUnit(this.fontSize),\n\t\t\t\t\t// line-height设置为比字体大小多2px\n\t\t\t\t\tlineHeight: uni.$u.addUnit(uni.$u.getPx(this.fontSize) + 2),\n\t\t\t\t\ttextDecoration: this.underLine ? 'underline' : 'none'\n\t\t\t\t}\n\t\t\t\t// if (this.underLine) {\n\t\t\t\t// \tstyle.borderBottomColor = this.lineColor || this.color\n\t\t\t\t// \tstyle.borderBottomWidth = '1px'\n\t\t\t\t// }\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\topenLink() {\n\t\t\t\t// #ifdef APP-PLUS\n\t\t\t\tplus.runtime.openURL(this.href)\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef H5\n\t\t\t\twindow.open(this.href)\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef MP\n\t\t\t\tuni.setClipboardData({\n\t\t\t\t\tdata: this.href,\n\t\t\t\t\tsuccess: () => {\n\t\t\t\t\t\tuni.hideToast();\n\t\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t\tuni.$u.toast(this.mpTips);\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// #endif\n\t\t\t\tthis.$emit('click')\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-link-line-height:1 !default;\n\n\t.u-link {\n\t\t/* #ifndef APP-NVUE */\n\t\tline-height: $u-link-line-height;\n\t\t/* #endif */\n\t\t@include flex;\n\t\tflex-wrap: wrap;\n\t\tflex: 1;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-list/props.js",
    "content": "export default {\n    props: {\n        // 控制是否出现滚动条，仅nvue有效\n        showScrollbar: {\n            type: Boolean,\n            default: uni.$u.props.list.showScrollbar\n        },\n        // 距底部多少时触发scrolltolower事件\n        lowerThreshold: {\n            type: [String, Number],\n            default: uni.$u.props.list.lowerThreshold\n        },\n        // 距顶部多少时触发scrolltoupper事件，非nvue有效\n        upperThreshold: {\n            type: [String, Number],\n            default: uni.$u.props.list.upperThreshold\n        },\n        // 设置竖向滚动条位置\n        scrollTop: {\n            type: [String, Number],\n            default: uni.$u.props.list.scrollTop\n        },\n        // 控制 onscroll 事件触发的频率，仅nvue有效\n        offsetAccuracy: {\n            type: [String, Number],\n            default: uni.$u.props.list.offsetAccuracy\n        },\n        // 启用 flexbox 布局。开启后，当前节点声明了display: flex就会成为flex container，并作用于其孩子节点，仅微信小程序有效\n        enableFlex: {\n            type: Boolean,\n            default: uni.$u.props.list.enableFlex\n        },\n        // 是否按分页模式显示List，默认值false\n        pagingEnabled: {\n            type: Boolean,\n            default: uni.$u.props.list.pagingEnabled\n        },\n        // 是否允许List滚动\n        scrollable: {\n            type: Boolean,\n            default: uni.$u.props.list.scrollable\n        },\n        // 值应为某子元素id（id不能以数字开头）\n        scrollIntoView: {\n            type: String,\n            default: uni.$u.props.list.scrollIntoView\n        },\n        // 在设置滚动条位置时使用动画过渡\n        scrollWithAnimation: {\n            type: Boolean,\n            default: uni.$u.props.list.scrollWithAnimation\n        },\n        // iOS点击顶部状态栏、安卓双击标题栏时，滚动条返回顶部，只对微信小程序有效\n        enableBackToTop: {\n            type: Boolean,\n            default: uni.$u.props.list.enableBackToTop\n        },\n        // 列表的高度\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.list.height\n        },\n        // 列表宽度\n        width: {\n            type: [String, Number],\n            default: uni.$u.props.list.width\n        },\n        // 列表前后预渲染的屏数，1代表一个屏幕的高度，1.5代表1个半屏幕高度\n        preLoadScreen: {\n            type: [String, Number],\n            default: uni.$u.props.list.preLoadScreen\n        }\n        // vue下，是否开启虚拟列表\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-list/u-list.vue",
    "content": "<template>\n\t<!-- #ifdef APP-NVUE -->\n\t<list\n\t\tclass=\"u-list\"\n\t\t:enableBackToTop=\"enableBackToTop\"\n\t\t:loadmoreoffset=\"lowerThreshold\"\n\t\t:showScrollbar=\"showScrollbar\"\n\t\t:style=\"[listStyle]\"\n\t\t:offset-accuracy=\"Number(offsetAccuracy)\"\n\t\t@scroll=\"onScroll\"\n\t\t@loadmore=\"scrolltolower\"\n\t>\n\t\t<slot />\n\t</list>\n\t<!-- #endif -->\n\t<!-- #ifndef APP-NVUE -->\n\t<scroll-view\n\t\tclass=\"u-list\"\n\t\tid=\"scroll_view\"\n\t\t:scroll-into-view=\"scrollIntoView\"\n\t\t:style=\"[listStyle]\"\n\t\tscroll-y\n\t\t:scroll-top=\"Number(scrollTop)\"\n\t\t:lower-threshold=\"Number(lowerThreshold)\"\n\t\t:upper-threshold=\"Number(upperThreshold)\"\n\t\t:show-scrollbar=\"showScrollbar\"\n\t\t:enable-back-to-top=\"enableBackToTop\"\n\t\t:scroll-with-animation=\"scrollWithAnimation\"\n\t\t@scroll=\"onScroll\"\n\t\t@scrolltolower=\"scrolltolower\"\n\t\t@scrolltoupper=\"scrolltoupper\"\n\t\t@touchmove.stop\n\t>\n\t\t<view id=\"scroll_wrap\">\n\t\t\t<slot />\n\t\t</view>\n\t</scroll-view>\n\t<!-- #endif -->\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * List 列表\n\t * @description 该组件为高性能列表组件\n\t * @tutorial https://www.uviewui.com/components/list.html\n\t * @property {Boolean}\t\t\tshowScrollbar\t\t控制是否出现滚动条，仅nvue有效 （默认 false ）\n\t * @property {String ｜ Number}\tlowerThreshold\t\t距底部多少时触发scrolltolower事件 （默认 50 ）\n\t * @property {String ｜ Number}\tupperThreshold\t\t距顶部多少时触发scrolltoupper事件，非nvue有效 （默认 0 ）\n\t * @property {String ｜ Number}\tscrollTop\t\t\t设置竖向滚动条位置（默认 0 ）\n\t * @property {String ｜ Number}\toffsetAccuracy\t\t控制 onscroll 事件触发的频率，仅nvue有效（默认 10 ）\n\t * @property {Boolean}\t\t\tenableFlex\t\t\t启用 flexbox 布局。开启后，当前节点声明了display: flex就会成为flex container，并作用于其孩子节点，仅微信小程序有效（默认 false ）\n\t * @property {Boolean}\t\t\tpagingEnabled\t\t是否按分页模式显示List，（默认 false ）\n\t * @property {Boolean}\t\t\tscrollable\t\t\t是否允许List滚动（默认 true ）\n\t * @property {String}\t\t\tscrollIntoView\t\t值应为某子元素id（id不能以数字开头）\n\t * @property {Boolean}\t\t\tscrollWithAnimation\t在设置滚动条位置时使用动画过渡 （默认 false ）\n\t * @property {Boolean}\t\t\tenableBackToTop\t\tiOS点击顶部状态栏、安卓双击标题栏时，滚动条返回顶部，只对微信小程序有效 （默认 false ）\n\t * @property {String ｜ Number}\theight\t\t\t\t列表的高度 （默认 0 ）\n\t * @property {String ｜ Number}\twidth\t\t\t\t列表宽度 （默认 0 ）\n\t * @property {String ｜ Number}\tpreLoadScreen\t\t列表前后预渲染的屏数，1代表一个屏幕的高度，1.5代表1个半屏幕高度  （默认 1 ）\n\t * @property {Object}\t\t\tcustomStyle\t\t\t定义需要用到的外部样式\n\t *\n\t * @example <u-list @scrolltolower=\"scrolltolower\"></u-list>\n\t */\n\texport default {\n\t\tname: 'u-list',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\twatch: {\n\t\t\tscrollIntoView(n) {\n\t\t\t\tthis.scrollIntoViewById(n)\n\t\t\t}\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 记录内部滚动的距离\n\t\t\t\tinnerScrollTop: 0,\n\t\t\t\t// vue下，scroll-view在上拉加载时的偏移值\n\t\t\t\toffset: 0,\n\t\t\t\tsys: uni.$u.sys()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tlistStyle() {\n\t\t\t\tconst style = {},\n\t\t\t\t\taddUnit = uni.$u.addUnit\n\t\t\t\tif (this.width != 0) style.width = addUnit(this.width)\n\t\t\t\tif (this.height != 0) style.height = addUnit(this.height)\n\t\t\t\t// 如果没有定义列表高度，则默认使用屏幕高度\n\t\t\t\tif (!style.height) style.height = addUnit(this.sys.windowHeight, 'px')\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tprovide() {\n\t\t\treturn {\n\t\t\t\tuList: this\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.refs = []\n\t\t\tthis.children = []\n\t\t\tthis.anchors = []\n\t\t},\n\t\tmounted() {},\n\t\tmethods: {\n\t\t\tupdateOffsetFromChild(top) {\n\t\t\t\tthis.offset = top\n\t\t\t},\n\t\t\tonScroll(e) {\n\t\t\t\tlet scrollTop = 0\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tscrollTop = e.contentOffset.y\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tscrollTop = e.detail.scrollTop\n\t\t\t\t// #endif\n\t\t\t\tthis.innerScrollTop = scrollTop\n\t\t\t\tthis.$emit('scroll', Math.abs(scrollTop))\n\t\t\t},\n\t\t\tscrollIntoViewById(id) {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 根据id参数，找到所有u-list-item中匹配的节点，再通过dom模块滚动到对应的位置\n\t\t\t\tconst item = this.refs.find(item => item.$refs[id] ? true : false)\n\t\t\t\tdom.scrollToElement(item.$refs[id], {\n\t\t\t\t\t// 是否需要滚动动画\n\t\t\t\t\tanimated: this.scrollWithAnimation\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 滚动到底部触发事件\n\t\t\tscrolltolower(e) {\n\t\t\t\tuni.$u.sleep(30).then(() => {\n\t\t\t\t\tthis.$emit('scrolltolower')\n\t\t\t\t})\n\t\t\t},\n\t\t\t// #ifndef APP-NVUE\n\t\t\t// 滚动到底部时触发，非nvue有效\n\t\t\tscrolltoupper(e) {\n\t\t\t\tuni.$u.sleep(30).then(() => {\n\t\t\t\t\tthis.$emit('scrolltoupper')\n\t\t\t\t\t// 这一句很重要，能绝对保证在性功能障碍的webview，滚动条到顶时，取消偏移值，让页面置顶\n\t\t\t\t\tthis.offset = 0\n\t\t\t\t})\n\t\t\t}\n\t\t\t// #endif\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-list {\n\t\t@include flex(column);\n\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-list-item/props.js",
    "content": "export default {\n    props: {\n        // 用于滚动到指定item\n        anchor: {\n            type: [String, Number],\n            default: uni.$u.props.listItem.anchor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-list-item/u-list-item.vue",
    "content": "<template>\n\t<!-- #ifdef APP-NVUE -->\n\t<cell>\n\t\t<!-- #endif -->\n\t\t<view\n\t\t\tclass=\"u-list-item\"\n\t\t\t:ref=\"`u-list-item-${anchor}`\"\n\t\t\t:anchor=\"`u-list-item-${anchor}`\"\n\t\t\t:class=\"[`u-list-item-${anchor}`]\"\n\t\t>\n\t\t\t<slot />\n\t\t</view>\n\t\t<!-- #ifdef APP-NVUE -->\n\t</cell>\n\t<!-- #endif -->\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * List 列表\n\t * @description 该组件为高性能列表组件\n\t * @tutorial https://www.uviewui.com/components/list.html\n\t * @property {String | Number}\tanchor\t用于滚动到指定item\n\t * @example <u-list-ite v-for=\"(item, index) in indexList\" :key=\"index\" ></u-list-item>\n\t */\n\texport default {\n\t\tname: 'u-list-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 节点信息\n\t\t\t\trect: {},\n\t\t\t\tindex: 0,\n\t\t\t\tshow: true,\n\t\t\t\tsys: uni.$u.sys()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\n\t\t},\n\t\tinject: ['uList'],\n\t\twatch: {\n\t\t\t// #ifndef APP-NVUE\n\t\t\t'uList.innerScrollTop'(n) {\n\t\t\t\tconst preLoadScreen = this.uList.preLoadScreen\n\t\t\t\tconst windowHeight = this.sys.windowHeight\n\t\t\t\tif(n <= windowHeight * preLoadScreen) {\n\t\t\t\t\tthis.parent.updateOffsetFromChild(0)\n\t\t\t\t} else if (this.rect.top <= n - windowHeight * preLoadScreen) {\n\t\t\t\t\tthis.parent.updateOffsetFromChild(this.rect.top)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t},\n\t\tcreated() {\n\t\t\tthis.parent = {}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 初始化数据\n\t\t\t\tthis.updateParentData()\n\t\t\t\tthis.index = this.parent.children.indexOf(this)\n\t\t\t\tthis.resize()\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法在mixin中\n\t\t\t\tthis.getParentData('u-list')\n\t\t\t},\n\t\t\tresize() {\n\t\t\t\tthis.queryRect(`u-list-item-${this.anchor}`).then(size => {\n\t\t\t\t\tconst lastChild = this.parent.children[this.index - 1]\n\t\t\t\t\tthis.rect = size\n\t\t\t\t\tconst preLoadScreen = this.uList.preLoadScreen\n\t\t\t\t\tconst windowHeight = this.sys.windowHeight\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tif (lastChild) {\n\t\t\t\t\t\tthis.rect.top = lastChild.rect.top + lastChild.rect.height\n\t\t\t\t\t}\n\t\t\t\t\tif (size.top >= this.uList.innerScrollTop + (1 + preLoadScreen) * windowHeight) this.show =\n\t\t\t\t\t\tfalse\n\t\t\t\t\t// #endif\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 查询元素尺寸\n\t\t\tqueryRect(el) {\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.$uGetRect(`.${el}`).then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tconst ref = this.$refs[el]\n\t\t\t\t\tdom.getComponentRect(ref, res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-list-item {}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-loading-icon/props.js",
    "content": "export default {\n    props: {\n        // 是否显示组件\n        show: {\n            type: Boolean,\n            default: uni.$u.props.loadingIcon.show\n        },\n        // 颜色\n        color: {\n            type: String,\n            default: uni.$u.props.loadingIcon.color\n        },\n        // 提示文字颜色\n        textColor: {\n            type: String,\n            default: uni.$u.props.loadingIcon.textColor\n        },\n        // 文字和图标是否垂直排列\n        vertical: {\n            type: Boolean,\n            default: uni.$u.props.loadingIcon.vertical\n        },\n        // 模式选择，circle-圆形，spinner-花朵形，semicircle-半圆形\n        mode: {\n            type: String,\n            default: uni.$u.props.loadingIcon.mode\n        },\n        // 图标大小，单位默认px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.loadingIcon.size\n        },\n        // 文字大小\n        textSize: {\n            type: [String, Number],\n            default: uni.$u.props.loadingIcon.textSize\n        },\n        // 文字内容\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.loadingIcon.text\n        },\n        // 动画模式\n        timingFunction: {\n            type: String,\n            default: uni.$u.props.loadingIcon.timingFunction\n        },\n        // 动画执行周期时间\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.loadingIcon.duration\n        },\n        // mode=circle时的暗边颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.loadingIcon.inactiveColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-loading-icon\"\n\t\t:style=\"[$u.addStyle(customStyle)]\"\n\t\t:class=\"[vertical && 'u-loading-icon--vertical']\"\n\t\tv-if=\"show\"\n\t>\n\t\t<view\n\t\t\tv-if=\"!webviewHide\"\n\t\t\tclass=\"u-loading-icon__spinner\"\n\t\t\t:class=\"[`u-loading-icon__spinner--${mode}`]\"\n\t\t\tref=\"ani\"\n\t\t\t:style=\"{\n\t\t\t\tcolor: color,\n\t\t\t\twidth: $u.addUnit(size),\n\t\t\t\theight: $u.addUnit(size),\n\t\t\t\tborderTopColor: color,\n\t\t\t\tborderBottomColor: otherBorderColor,\n\t\t\t\tborderLeftColor: otherBorderColor,\n\t\t\t\tborderRightColor: otherBorderColor,\n\t\t\t\t'animation-duration': `${duration}ms`,\n\t\t\t\t'animation-timing-function': mode === 'semicircle' || mode === 'circle' ? timingFunction : ''\n\t\t\t}\"\n\t\t>\n\t\t\t<block v-if=\"mode === 'spinner'\">\n\t\t\t\t<!-- #ifndef APP-NVUE -->\n\t\t\t\t<view\n\t\t\t\t\tv-for=\"(item, index) in array12\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"u-loading-icon__dot\"\n\t\t\t\t>\n\t\t\t\t</view>\n\t\t\t\t<!-- #endif -->\n\t\t\t\t<!-- #ifdef APP-NVUE -->\n\t\t\t\t<!-- 此组件内部图标部分无法设置宽高，即使通过width和height配置了也无效 -->\n\t\t\t\t<loading-indicator\n\t\t\t\t\tv-if=\"!webviewHide\"\n\t\t\t\t\tclass=\"u-loading-indicator\"\n\t\t\t\t\t:animating=\"true\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\tcolor: color,\n\t\t\t\t\t\twidth: $u.addUnit(size),\n\t\t\t\t\t\theight: $u.addUnit(size)\n\t\t\t\t\t}\"\n\t\t\t\t/>\n\t\t\t\t<!-- #endif -->\n\t\t\t</block>\n\t\t</view>\n\t\t<text\n\t\t\tv-if=\"text\"\n\t\t\tclass=\"u-loading-icon__text\"\n\t\t\t:style=\"{\n\t\t\t\tfontSize: $u.addUnit(textSize),\n\t\t\t\tcolor: textColor,\n\t\t\t}\"\n\t\t>{{text}}</text>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst animation = weex.requireModule('animation');\n\t// #endif\n\t/**\n\t * loading 加载动画\n\t * @description 警此组件为一个小动画，目前用在uView的loadmore加载更多和switch开关等组件的正在加载状态场景。\n\t * @tutorial https://www.uviewui.com/components/loading.html\n\t * @property {Boolean}\t\t\tshow\t\t\t是否显示组件  (默认 true)\n\t * @property {String}\t\t\tcolor\t\t\t动画活动区域的颜色，只对 mode = flower 模式有效（默认color['u-tips-color']）\n\t * @property {String}\t\t\ttextColor\t\t提示文本的颜色（默认color['u-tips-color']）\n\t * @property {Boolean}\t\t\tvertical\t\t文字和图标是否垂直排列 (默认 false )\n\t * @property {String}\t\t\tmode\t\t\t模式选择，见官网说明（默认 'circle' ）\n\t * @property {String | Number}\tsize\t\t\t加载图标的大小，单位px （默认 24 ）\n\t * @property {String | Number}\ttextSize\t\t文字大小（默认 15 ）\n\t * @property {String | Number}\ttext\t\t\t文字内容 \n\t * @property {String}\t\t\ttimingFunction\t动画模式 （默认 'ease-in-out' ）\n\t * @property {String | Number}\tduration\t\t动画执行周期时间（默认 1200）\n\t * @property {String}\t\t\tinactiveColor\tmode=circle时的暗边颜色 \n\t * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t * @example <u-loading mode=\"circle\"></u-loading>\n\t */\n\texport default {\n\t\tname: 'u-loading-icon',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// Array.form可以通过一个伪数组对象创建指定长度的数组\n\t\t\t\t// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from\n\t\t\t\tarray12: Array.from({\n\t\t\t\t\tlength: 12\n\t\t\t\t}),\n\t\t\t\t// 这里需要设置默认值为360，否则在安卓nvue上，会延迟一个duration周期后才执行\n\t\t\t\t// 在iOS nvue上，则会一开始默认执行两个周期的动画\n\t\t\t\taniAngel: 360, // 动画旋转角度\n\t\t\t\twebviewHide: false, // 监听webview的状态，如果隐藏了页面，则停止动画，以免性能消耗\n\t\t\t\tloading: false, // 是否运行中，针对nvue使用\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 当为circle类型时，给其另外三边设置一个更轻一些的颜色\n\t\t\t// 之所以需要这么做的原因是，比如父组件传了color为红色，那么需要另外的三个边为浅红色\n\t\t\t// 而不能是固定的某一个其他颜色(因为这个固定的颜色可能浅蓝，导致效果没有那么细腻良好)\n\t\t\totherBorderColor() {\n\t\t\t\tconst lightColor = uni.$u.colorGradient(this.color, '#ffffff', 100)[80]\n\t\t\t\tif (this.mode === 'circle') {\n\t\t\t\t\treturn this.inactiveColor ? this.inactiveColor : lightColor\n\t\t\t\t} else {\n\t\t\t\t\treturn 'transparent'\n\t\t\t\t}\n\t\t\t\t// return this.mode === 'circle' ? this.inactiveColor ? this.inactiveColor : lightColor : 'transparent'\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tshow(n) {\n\t\t\t\t// nvue中，show为true，且为非loading状态，就重新执行动画模块\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tif (n && !this.loading) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.startAnimate()\n\t\t\t\t\t}, 30)\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tthis.show && this.nvueAnimate()\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifdef APP-PLUS \n\t\t\t\t\tthis.show && this.addEventListenerToWebview()\n\t\t\t\t\t// #endif\n\t\t\t\t}, 20)\n\t\t\t},\n\t\t\t// 监听webview的显示与隐藏\n\t\t\taddEventListenerToWebview() {\n\t\t\t\t// webview的堆栈\n\t\t\t\tconst pages = getCurrentPages()\n\t\t\t\t// 当前页面\n\t\t\t\tconst page = pages[pages.length - 1]\n\t\t\t\t// 当前页面的webview实例\n\t\t\t\tconst currentWebview = page.$getAppWebview()\n\t\t\t\t// 监听webview的显示与隐藏，从而停止或者开始动画(为了性能)\n\t\t\t\tcurrentWebview.addEventListener('hide', () => {\n\t\t\t\t\tthis.webviewHide = true\n\t\t\t\t})\n\t\t\t\tcurrentWebview.addEventListener('show', () => {\n\t\t\t\t\tthis.webviewHide = false\n\t\t\t\t})\n\t\t\t},\n\t\t\t// #ifdef APP-NVUE\n\t\t\tnvueAnimate() {\n\t\t\t\t// nvue下，非spinner类型时才需要旋转，因为nvue的spinner类型，使用了weex的\n\t\t\t\t// loading-indicator组件，自带旋转功能\n\t\t\t\tthis.mode !== 'spinner' && this.startAnimate()\n\t\t\t},\n\t\t\t// 执行nvue的animate模块动画\n\t\t\tstartAnimate() {\n\t\t\t\tthis.loading = true\n\t\t\t\tconst ani = this.$refs.ani\n\t\t\t\tif (!ani) return\n\t\t\t\tanimation.transition(ani, {\n\t\t\t\t\t// 进行角度旋转\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\ttransform: `rotate(${this.aniAngel}deg)`,\n\t\t\t\t\t\ttransformOrigin: 'center center'\n\t\t\t\t\t},\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t\ttimingFunction: this.timingFunction,\n\t\t\t\t\t// delay: 10\n\t\t\t\t}, () => {\n\t\t\t\t\t// 每次增加360deg，为了让其重新旋转一周\n\t\t\t\t\tthis.aniAngel += 360\n\t\t\t\t\t// 动画结束后，继续循环执行动画，需要同时判断webviewHide变量\n\t\t\t\t\t// nvue安卓，页面隐藏后依然会继续执行startAnimate方法\n\t\t\t\t\tthis.show && !this.webviewHide ? this.startAnimate() : this.loading = false\n\t\t\t\t})\n\t\t\t}\n\t\t\t// #endif\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-loading-icon-color: #c8c9cc !default;\n\t$u-loading-icon-text-margin-left:4px !default;\n\t$u-loading-icon-text-color:$u-content-color !default;\n\t$u-loading-icon-text-font-size:14px !default;\n\t$u-loading-icon-text-line-height:20px !default;\n\t$u-loading-width:30px !default;\n\t$u-loading-height:30px !default;\n\t$u-loading-max-width:100% !default;\n\t$u-loading-max-height:100% !default;\n\t$u-loading-semicircle-border-width: 2px !default;\n\t$u-loading-semicircle-border-color:transparent !default;\n\t$u-loading-semicircle-border-top-right-radius: 100px !default;\n\t$u-loading-semicircle-border-top-left-radius: 100px !default;\n\t$u-loading-semicircle-border-bottom-left-radius: 100px !default;\n\t$u-loading-semicircle-border-bottom-right-radiu: 100px !default;\n\t$u-loading-semicircle-border-style: solid !default;\n\t$u-loading-circle-border-top-right-radius: 100px !default;\n\t$u-loading-circle-border-top-left-radius: 100px !default;\n\t$u-loading-circle-border-bottom-left-radius: 100px !default;\n\t$u-loading-circle-border-bottom-right-radiu: 100px !default;\n\t$u-loading-circle-border-width:2px !default;\n\t$u-loading-circle-border-top-color:#e5e5e5 !default;\n\t$u-loading-circle-border-right-color:$u-loading-circle-border-top-color !default;\n\t$u-loading-circle-border-bottom-color:$u-loading-circle-border-top-color !default;\n\t$u-loading-circle-border-left-color:$u-loading-circle-border-top-color !default;\n\t$u-loading-circle-border-style:solid !default;\n\t$u-loading-icon-host-font-size:0px !default;\n\t$u-loading-icon-host-line-height:1 !default;\n\t$u-loading-icon-vertical-margin:6px 0 0 !default;\n\t$u-loading-icon-dot-top:0 !default;\n\t$u-loading-icon-dot-left:0 !default;\n\t$u-loading-icon-dot-width:100% !default;\n\t$u-loading-icon-dot-height:100% !default;\n\t$u-loading-icon-dot-before-width:2px !default;\n\t$u-loading-icon-dot-before-height:25% !default;\n\t$u-loading-icon-dot-before-margin:0 auto !default;\n\t$u-loading-icon-dot-before-background-color:currentColor !default;\n\t$u-loading-icon-dot-before-border-radius:40% !default;\n\n\t.u-loading-icon {\n\t\t/* #ifndef APP-NVUE */\n\t\t// display: inline-flex;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcolor: $u-loading-icon-color;\n\n\t\t&__text {\n\t\t\tmargin-left: $u-loading-icon-text-margin-left;\n\t\t\tcolor: $u-loading-icon-text-color;\n\t\t\tfont-size: $u-loading-icon-text-font-size;\n\t\t\tline-height: $u-loading-icon-text-line-height;\n\t\t}\n\n\t\t&__spinner {\n\t\t\twidth: $u-loading-width;\n\t\t\theight: $u-loading-height;\n\t\t\tposition: relative;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tbox-sizing: border-box;\n\t\t\tmax-width: $u-loading-max-width;\n\t\t\tmax-height: $u-loading-max-height;\n\t\t\tanimation: u-rotate 1s linear infinite;\n\t\t\t/* #endif */\n\t\t}\n\n\t\t&__spinner--semicircle {\n\t\t\tborder-width: $u-loading-semicircle-border-width;\n\t\t\tborder-color: $u-loading-semicircle-border-color;\n\t\t\tborder-top-right-radius: $u-loading-semicircle-border-top-right-radius;\n\t\t\tborder-top-left-radius: $u-loading-semicircle-border-top-left-radius;\n\t\t\tborder-bottom-left-radius: $u-loading-semicircle-border-bottom-left-radius;\n\t\t\tborder-bottom-right-radius: $u-loading-semicircle-border-bottom-right-radiu;\n\t\t\tborder-style: $u-loading-semicircle-border-style;\n\t\t}\n\n\t\t&__spinner--circle {\n\t\t\tborder-top-right-radius: $u-loading-circle-border-top-right-radius;\n\t\t\tborder-top-left-radius: $u-loading-circle-border-top-left-radius;\n\t\t\tborder-bottom-left-radius: $u-loading-circle-border-bottom-left-radius;\n\t\t\tborder-bottom-right-radius: $u-loading-circle-border-bottom-right-radiu;\n\t\t\tborder-width: $u-loading-circle-border-width;\n\t\t\tborder-top-color: $u-loading-circle-border-top-color;\n\t\t\tborder-right-color: $u-loading-circle-border-right-color;\n\t\t\tborder-bottom-color: $u-loading-circle-border-bottom-color;\n\t\t\tborder-left-color: $u-loading-circle-border-left-color;\n\t\t\tborder-style: $u-loading-circle-border-style;\n\t\t}\n\n\t\t&--vertical {\n\t\t\tflex-direction: column\n\t\t}\n\t}\n\n\t/* #ifndef APP-NVUE */\n\t:host {\n\t\tfont-size: $u-loading-icon-host-font-size;\n\t\tline-height: $u-loading-icon-host-line-height;\n\t}\n\n\t.u-loading-icon {\n\t\t&__spinner--spinner {\n\t\t\tanimation-timing-function: steps(12)\n\t\t}\n\n\t\t&__text:empty {\n\t\t\tdisplay: none\n\t\t}\n\n\t\t&--vertical &__text {\n\t\t\tmargin: $u-loading-icon-vertical-margin;\n\t\t\tcolor: $u-content-color;\n\t\t}\n\n\t\t&__dot {\n\t\t\tposition: absolute;\n\t\t\ttop: $u-loading-icon-dot-top;\n\t\t\tleft: $u-loading-icon-dot-left;\n\t\t\twidth: $u-loading-icon-dot-width;\n\t\t\theight: $u-loading-icon-dot-height;\n\n\t\t\t&:before {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: $u-loading-icon-dot-before-width;\n\t\t\t\theight: $u-loading-icon-dot-before-height;\n\t\t\t\tmargin: $u-loading-icon-dot-before-margin;\n\t\t\t\tbackground-color: $u-loading-icon-dot-before-background-color;\n\t\t\t\tborder-radius: $u-loading-icon-dot-before-border-radius;\n\t\t\t\tcontent: \" \"\n\t\t\t}\n\t\t}\n\t}\n\n\t@for $i from 1 through 12 {\n\t\t.u-loading-icon__dot:nth-of-type(#{$i}) {\n\t\t\ttransform: rotate($i * 30deg);\n\t\t\topacity: 1 - 0.0625 * ($i - 1);\n\t\t}\n\t}\n\n\t@keyframes u-rotate {\n\t\t0% {\n\t\t\ttransform: rotate(0deg)\n\t\t}\n\n\t\tto {\n\t\t\ttransform: rotate(1turn)\n\t\t}\n\t}\n\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-loading-page/props.js",
    "content": "export default {\n    props: {\n        // 提示内容\n        loadingText: {\n            type: [String, Number],\n            default: uni.$u.props.loadingPage.loadingText\n        },\n        // 文字上方用于替换loading动画的图片\n        image: {\n            type: String,\n            default: uni.$u.props.loadingPage.image\n        },\n        // 加载动画的模式，circle-圆形，spinner-花朵形，semicircle-半圆形\n        loadingMode: {\n            type: String,\n            default: uni.$u.props.loadingPage.loadingMode\n        },\n        // 是否加载中\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.loadingPage.loading\n        },\n        // 背景色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.loadingPage.bgColor\n        },\n        // 文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.loadingPage.color\n        },\n        // 文字大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.loadingPage.fontSize\n        },\n\t\t// 图标大小\n\t\ticonSize: {\n\t\t    type: [String, Number],\n\t\t    default: uni.$u.props.loadingPage.fontSize\n\t\t},\n        // 加载中图标的颜色，只能rgb或者十六进制颜色值\n        loadingColor: {\n            type: String,\n            default: uni.$u.props.loadingPage.loadingColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-loading-page/u-loading-page.vue",
    "content": "<template>\n    <u-transition\n        :show=\"loading\"\n        :custom-style=\"{\n            position: 'fixed',\n            top: 0,\n            left: 0,\n            right: 0,\n            bottom: 0,\n            backgroundColor: bgColor,\n            display: 'flex',\n        }\"\n    >\n        <view class=\"u-loading-page\">\n            <view class=\"u-loading-page__warpper\">\n                <view class=\"u-loading-page__warpper__loading-icon\">\n                    <image\n                        v-if=\"image\"\n                        :src=\"image\"\n                        class=\"u-loading-page__warpper__loading-icon__img\"\n                        mode=\"widthFit\"\n\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\twidth: $u.addUnit(iconSize),\n\t\t\t\t\t\t    height: $u.addUnit(iconSize)\n\t\t\t\t\t\t}\"\n                    ></image>\n                    <u-loading-icon\n                        v-else\n                        :mode=\"loadingMode\"\n                        :size=\"$u.addUnit(iconSize)\"\n                        :color=\"loadingColor\"\n                    ></u-loading-icon>\n                </view>\n                <slot>\n                    <text\n                        class=\"u-loading-page__warpper__text\"\n                        :style=\"{\n                            fontSize: $u.addUnit(fontSize),\n                            color: color,\n                        }\"\n                        >{{ loadingText }}</text\n                    >\n                </slot>\n            </view>\n        </view>\n    </u-transition>\n</template>\n\n<script>\nimport props from \"./props.js\";\n/**\n * loadingPage 加载动画\n * @description 警此组件为一个小动画，目前用在uView的loadmore加载更多和switch开关等组件的正在加载状态场景。\n * @tutorial https://www.uviewui.com/components/loading.html\n * @property {String | Number}\tloadingText\t\t提示内容  (默认 '正在加载' )\n * @property {String}\t\t\timage\t\t\t文字上方用于替换loading动画的图片\n * @property {String}\t\t\tloadingMode\t\t加载动画的模式，circle-圆形，spinner-花朵形，semicircle-半圆形 （默认 'circle' ）\n * @property {Boolean}\t\t\tloading\t\t\t是否加载中 （默认 false ）\n * @property {String}\t\t\tbgColor\t\t\t背景色 （默认 '#ffffff' ）\n * @property {String}\t\t\tcolor\t\t\t文字颜色 （默认 '#C8C8C8' ）\n * @property {String | Number}\tfontSize\t\t文字大小 （默认 19 ）\n * @property {String | Number}\ticonSize\t\t图标大小 （默认 28 ）\n * @property {String}\t\t\tloadingColor\t加载中图标的颜色，只能rgb或者十六进制颜色值 （默认 '#C8C8C8' ）\n * @property {Object}\t\t\tcustomStyle\t\t自定义样式\n * @example <u-loading mode=\"circle\"></u-loading>\n */\nexport default {\n    name: \"u-loading-page\",\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n    data() {\n        return {};\n    },\n    methods: {},\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n$text-color: rgb(200, 200, 200) !default;\n$text-size: 19px !default;\n$u-loading-icon-margin-bottom: 10px !default;\n\n.u-loading-page {\n    @include flex(column);\n    flex: 1;\n    align-items: center;\n    justify-content: center;\n\n    &__warpper {\n        margin-top: -150px;\n        justify-content: center;\n        align-items: center;\n        /* #ifndef APP-NVUE */\n        color: $text-color;\n        font-size: $text-size;\n        /* #endif */\n        @include flex(column);\n\n        &__loading-icon {\n            margin-bottom: $u-loading-icon-margin-bottom;\n\n            &__img {\n                width: 40px;\n                height: 40px;\n            }\n        }\n\n        &__text {\n            font-size: $text-size;\n            color: $text-color;\n        }\n    }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-loadmore/props.js",
    "content": "export default {\n    props: {\n        // 组件状态，loadmore-加载前的状态，loading-加载中的状态，nomore-没有更多的状态\n        status: {\n            type: String,\n            default: uni.$u.props.loadmore.status\n        },\n        // 组件背景色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.loadmore.bgColor\n        },\n        // 是否显示加载中的图标\n        icon: {\n            type: Boolean,\n            default: uni.$u.props.loadmore.icon\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.loadmore.fontSize\n        },\n\t\t    // 图标大小\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.loadmore.iconSize\n        },\n        // 字体颜色\n        color: {\n            type: String,\n            default: uni.$u.props.loadmore.color\n        },\n        // 加载中状态的图标，spinner-花朵状图标，circle-圆圈状，semicircle-半圆\n        loadingIcon: {\n            type: String,\n            default: uni.$u.props.loadmore.loadingIcon\n        },\n        // 加载前的提示语\n        loadmoreText: {\n            type: String,\n            default: uni.$u.props.loadmore.loadmoreText\n        },\n        // 加载中提示语\n        loadingText: {\n            type: String,\n            default: uni.$u.props.loadmore.loadingText\n        },\n        // 没有更多的提示语\n        nomoreText: {\n            type: String,\n            default: uni.$u.props.loadmore.nomoreText\n        },\n        // 在“没有更多”状态下，是否显示粗点\n        isDot: {\n            type: Boolean,\n            default: uni.$u.props.loadmore.isDot\n        },\n        // 加载中图标的颜色\n        iconColor: {\n            type: String,\n            default: uni.$u.props.loadmore.iconColor\n        },\n        // 上边距\n        marginTop: {\n            type: [String, Number],\n            default: uni.$u.props.loadmore.marginTop\n        },\n        // 下边距\n        marginBottom: {\n            type: [String, Number],\n            default: uni.$u.props.loadmore.marginBottom\n        },\n        // 高度，单位px\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.loadmore.height\n        },\n        // 是否显示左边分割线\n        line: {\n            type: Boolean,\n            default: uni.$u.props.loadmore.line\n        },\n        // 线条颜色\n        lineColor: {\n            type: String,\n            default: uni.$u.props.loadmore.lineColor\n        },\n        // 是否虚线，true-虚线，false-实线\n        dashed: {\n            type: Boolean,\n            default: uni.$u.props.loadmore.dashed\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-loadmore/u-loadmore.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-loadmore\"\n\t    :style=\"[\n\t\t\t$u.addStyle(customStyle),\n\t\t\t{\n\t\t\t\tbackgroundColor: bgColor,\n\t\t\t\tmarginBottom: $u.addUnit(marginBottom),\n\t\t\t\tmarginTop: $u.addUnit(marginTop),\n\t\t\t\theight: $u.addUnit(height),\n\t\t\t},\n\t\t]\"\n\t>\n\t\t<u-line\n\t\t    length=\"140rpx\"\n\t\t    :color=\"lineColor\"\n\t\t    :hairline=\"false\"\n\t\t\t:dashed=\"dashed\"\n\t\t\tv-if=\"line\"\n\t\t></u-line>\n\t\t<!-- 加载中和没有更多的状态才显示两边的横线 -->\n\t\t<view\n\t\t    :class=\"status == 'loadmore' || status == 'nomore' ? 'u-more' : ''\"\n\t\t    class=\"u-loadmore__content\"\n\t\t>\n\t\t\t<view\n\t\t\t    class=\"u-loadmore__content__icon-wrap\"\n\t\t\t    v-if=\"status === 'loading' && icon\"\n\t\t\t>\n\t\t\t\t<u-loading-icon\n\t\t\t\t    :color=\"iconColor\"\n\t\t\t\t    :size=\"iconSize\"\n\t\t\t\t    :mode=\"loadingIcon\"\n\t\t\t\t></u-loading-icon>\n\t\t\t</view>\n\t\t\t<!-- 如果没有更多的状态下，显示内容为dot（粗点），加载特定样式 -->\n\t\t\t<text\n\t\t\t    class=\"u-line-1\"\n\t\t\t    :style=\"[loadTextStyle]\"\n\t\t\t    :class=\"[(status == 'nomore' && isDot == true) ? 'u-loadmore__content__dot-text' : 'u-loadmore__content__text']\"\n\t\t\t    @tap=\"loadMore\"\n\t\t\t>{{ showText }}</text>\n\t\t</view>\n\t\t<u-line\n\t\t    length=\"140rpx\"\n\t\t    :color=\"lineColor\"\n\t\t\t:hairline=\"false\"\n\t\t\t:dashed=\"dashed\"\n\t\t\tv-if=\"line\"\n\t\t></u-line>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * loadmore 加载更多\n\t * @description 此组件一般用于标识页面底部加载数据时的状态。\n\t * @tutorial https://www.uviewui.com/components/loadMore.html\n\t * @property {String}\t\t\tstatus\t\t\t组件状态（默认 'loadmore' ）\n\t * @property {String}\t\t\tbgColor\t\t\t组件背景颜色，在页面是非白色时会用到（默认 'transparent' ）\n\t * @property {Boolean}\t\t\ticon\t\t\t加载中时是否显示图标（默认 true ）\n\t * @property {String | Number}\tfontSize\t\t字体大小（默认 14 ）\n\t * @property {String | Number}\ticonSize\t\t图标大小（默认 17 ）\n\t * @property {String}\t\t\tcolor\t\t\t字体颜色（默认 '#606266' ）\n\t * @property {String}\t\t\tloadingIcon\t\t加载图标（默认 'circle' ）\n\t * @property {String}\t\t\tloadmoreText\t加载前的提示语（默认 '加载更多' ）\n\t * @property {String}\t\t\tloadingText\t\t加载中提示语（默认 '正在加载...' ）\n\t * @property {String}\t\t\tnomoreText\t\t没有更多的提示语（默认 '没有更多了' ）\n\t * @property {Boolean}\t\t\tisDot\t\t\t到上一个相邻元素的距离 （默认 false ）\n\t * @property {String}\t\t\ticonColor\t\t加载中图标的颜色 （默认 '#b7b7b7' ）\n\t * @property {String}\t\t\tlineColor\t\t线条颜色（默认 #E6E8EB ）\n\t * @property {String | Number}\tmarginTop\t\t上边距 （默认 10 ）\n\t * @property {String | Number}\tmarginBottom\t下边距 （默认 10 ）\n\t * @property {String | Number}\theight\t\t\t高度，单位px （默认 'auto' ）\n\t * @property {Boolean}\t\t\tline\t\t\t是否显示左边分割线  （默认 false ）\n\t * @property {Boolean}\t\t\tdashed\t\t// 是否虚线，true-虚线，false-实线  （默认 false ）\n\t * @event {Function} loadmore status为loadmore时，点击组件会发出此事件\n\t * @example <u-loadmore :status=\"status\" icon-type=\"iconType\" load-text=\"loadText\" />\n\t */\n\texport default {\n\t\tname: \"u-loadmore\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 粗点\n\t\t\t\tdotText: \"●\"\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 加载的文字显示的样式\n\t\t\tloadTextStyle() {\n\t\t\t\treturn {\n\t\t\t\t\tcolor: this.color,\n\t\t\t\t\tfontSize: uni.$u.addUnit(this.fontSize),\n\t\t\t\t\tlineHeight: uni.$u.addUnit(this.fontSize),\n\t\t\t\t\tbackgroundColor: this.bgColor,\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 显示的提示文字\n\t\t\tshowText() {\n\t\t\t\tlet text = '';\n\t\t\t\tif (this.status == 'loadmore') text = this.loadmoreText\n\t\t\t\telse if (this.status == 'loading') text = this.loadingText\n\t\t\t\telse if (this.status == 'nomore' && this.isDot) text = this.dotText;\n\t\t\t\telse text = this.nomoreText;\n\t\t\t\treturn text;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tloadMore() {\n\t\t\t\t// 只有在“加载更多”的状态下才发送点击事件，内容不满一屏时无法触发底部上拉事件，所以需要点击来触发\n\t\t\t\tif (this.status == 'loadmore') this.$emit('loadmore');\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-loadmore {\n\t\t@include flex(row);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: 1;\n\n\t\t&__content {\n\t\t\tmargin: 0 15px;\n\t\t\t@include flex(row);\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\n\t\t\t&__icon-wrap {\n\t\t\t\tmargin-right: 8px;\n\t\t\t}\n\n\t\t\t&__text {\n\t\t\t\tfont-size: 14px;\n\t\t\t\tcolor: $u-content-color;\n\t\t\t}\n\n\t\t\t&__dot-text {\n\t\t\t\tfont-size: 15px;\n\t\t\t\tcolor: $u-tips-color;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-modal/props.js",
    "content": "export default {\n    props: {\n        // 是否展示modal\n        show: {\n            type: Boolean,\n            default: uni.$u.props.modal.show\n        },\n        // 标题\n        title: {\n            type: [String],\n            default: uni.$u.props.modal.title\n        },\n        // 弹窗内容\n        content: {\n            type: String,\n            default: uni.$u.props.modal.content\n        },\n        // 确认文案\n        confirmText: {\n            type: String,\n            default: uni.$u.props.modal.confirmText\n        },\n        // 取消文案\n        cancelText: {\n            type: String,\n            default: uni.$u.props.modal.cancelText\n        },\n        // 是否显示确认按钮\n        showConfirmButton: {\n            type: Boolean,\n            default: uni.$u.props.modal.showConfirmButton\n        },\n        // 是否显示取消按钮\n        showCancelButton: {\n            type: Boolean,\n            default: uni.$u.props.modal.showCancelButton\n        },\n        // 确认按钮颜色\n        confirmColor: {\n            type: String,\n            default: uni.$u.props.modal.confirmColor\n        },\n        // 取消文字颜色\n        cancelColor: {\n            type: String,\n            default: uni.$u.props.modal.cancelColor\n        },\n        // 对调确认和取消的位置\n        buttonReverse: {\n            type: Boolean,\n            default: uni.$u.props.modal.buttonReverse\n        },\n        // 是否开启缩放效果\n        zoom: {\n            type: Boolean,\n            default: uni.$u.props.modal.zoom\n        },\n        // 是否异步关闭，只对确定按钮有效\n        asyncClose: {\n            type: Boolean,\n            default: uni.$u.props.modal.asyncClose\n        },\n        // 是否允许点击遮罩关闭modal\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.modal.closeOnClickOverlay\n        },\n        // 给一个负的margin-top，往上偏移，避免和键盘重合的情况\n        negativeTop: {\n            type: [String, Number],\n            default: uni.$u.props.modal.negativeTop\n        },\n        // modal宽度，不支持百分比，可以数值，px，rpx单位\n        width: {\n            type: [String, Number],\n            default: uni.$u.props.modal.width\n        },\n        // 确认按钮的样式，circle-圆形，square-方形，如设置，将不会显示取消按钮\n        confirmButtonShape: {\n            type: String,\n            default: uni.$u.props.modal.confirmButtonShape\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-modal/u-modal.vue",
    "content": "<template>\n\t<u-popup\n\t\tmode=\"center\"\n\t\t:zoom=\"zoom\"\n\t\t:show=\"show\"\n\t\t:customStyle=\"{\n\t\t\tborderRadius: '6px', \n\t\t\toverflow: 'hidden',\n\t\t\tmarginTop: `-${$u.addUnit(negativeTop)}`\n\t\t}\"\n\t\t:closeOnClickOverlay=\"closeOnClickOverlay\"\n\t\t:safeAreaInsetBottom=\"false\"\n\t\t:duration=\"400\"\n\t\t@click=\"clickHandler\"\n\t>\n\t\t<view\n\t\t\tclass=\"u-modal\"\n\t\t\t:style=\"{\n\t\t\t\twidth: $u.addUnit(width),\n\t\t\t}\"\n\t\t>\n\t\t\t<text\n\t\t\t\tclass=\"u-modal__title\"\n\t\t\t\tv-if=\"title\"\n\t\t\t>{{ title }}</text>\n\t\t\t<view\n\t\t\t\tclass=\"u-modal__content\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tpaddingTop: `${title ? 12 : 25}px`\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<slot>\n\t\t\t\t\t<text class=\"u-modal__content__text\">{{ content }}</text>\n\t\t\t\t</slot>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t\tclass=\"u-modal__button-group--confirm-button\"\n\t\t\t\tv-if=\"$slots.confirmButton\"\n\t\t\t>\n\t\t\t\t<slot name=\"confirmButton\"></slot>\n\t\t\t</view>\n\t\t\t<template v-else>\n\t\t\t\t<u-line></u-line>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-modal__button-group\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\tflexDirection: buttonReverse ? 'row-reverse' : 'row'\n\t\t\t\t\t}\"\n\t\t\t\t>\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"u-modal__button-group__wrapper u-modal__button-group__wrapper--cancel\"\n\t\t\t\t\t\t:hover-stay-time=\"150\"\n\t\t\t\t\t\thover-class=\"u-modal__button-group__wrapper--hover\"\n\t\t\t\t\t\t:class=\"[showCancelButton && !showConfirmButton && 'u-modal__button-group__wrapper--only-cancel']\"\n\t\t\t\t\t\tv-if=\"showCancelButton\"\n\t\t\t\t\t\t@tap=\"cancelHandler\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tclass=\"u-modal__button-group__wrapper__text\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\tcolor: cancelColor\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>{{ cancelText }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<u-line\n\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\tv-if=\"showConfirmButton && showCancelButton\"\n\t\t\t\t\t></u-line>\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"u-modal__button-group__wrapper u-modal__button-group__wrapper--confirm\"\n\t\t\t\t\t\t:hover-stay-time=\"150\"\n\t\t\t\t\t\thover-class=\"u-modal__button-group__wrapper--hover\"\n\t\t\t\t\t\t:class=\"[!showCancelButton && showConfirmButton && 'u-modal__button-group__wrapper--only-confirm']\"\n\t\t\t\t\t\tv-if=\"showConfirmButton\"\n\t\t\t\t\t\t@tap=\"confirmHandler\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<u-loading-icon v-if=\"loading\"></u-loading-icon>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\tclass=\"u-modal__button-group__wrapper__text\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\tcolor: confirmColor\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>{{ confirmText }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</template>\n\t\t</view>\n\t</u-popup>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Modal 模态框\n\t * @description 弹出模态框，常用于消息提示、消息确认、在当前页面内完成特定的交互操作。\n\t * @tutorial https://www.uviewui.com/components/modul.html\n\t * @property {Boolean}\t\t\tshow\t\t\t\t是否显示模态框，请赋值给show （默认 false ）\n\t * @property {String}\t\t\ttitle\t\t\t\t标题内容\n\t * @property {String}\t\t\tcontent\t\t\t\t模态框内容，如传入slot内容，则此参数无效\n\t * @property {String}\t\t\tconfirmText\t\t\t确认按钮的文字 （默认 '确认' ）\n\t * @property {String}\t\t\tcancelText\t\t\t取消按钮的文字 （默认 '取消' ）\n\t * @property {Boolean}\t\t\tshowConfirmButton\t是否显示确认按钮 （默认 true ）\n\t * @property {Boolean}\t\t\tshowCancelButton\t是否显示取消按钮 （默认 false ）\n\t * @property {String}\t\t\tconfirmColor\t\t确认按钮的颜色 （默认 '#2979ff' ）\n\t * @property {String}\t\t\tcancelColor\t\t\t取消按钮的颜色 （默认 '#606266' ）\n\t * @property {Boolean}\t\t\tbuttonReverse\t\t对调确认和取消的位置 （默认 false ）\n\t * @property {Boolean}\t\t\tzoom\t\t\t\t是否开启缩放模式 （默认 true ）\n\t * @property {Boolean}\t\t\tasyncClose\t\t\t是否异步关闭，只对确定按钮有效，见上方说明 （默认 false ）\n\t * @property {Boolean}\t\t\tcloseOnClickOverlay\t是否允许点击遮罩关闭Modal （默认 false ）\n\t * @property {String | Number}\tnegativeTop\t\t\t往上偏移的值，给一个负的margin-top，往上偏移，避免和键盘重合的情况，单位任意，数值则默认为px单位 （默认 0 ）\n\t * @property {String | Number}\twidth\t\t\t\tmodal宽度，不支持百分比，可以数值，px，rpx单位 （默认 '650rpx' ）\n\t * @property {String}\t\t\tconfirmButtonShape\t确认按钮的样式,如设置，将不会显示取消按钮\n\t * @event {Function} confirm\t点击确认按钮时触发\n\t * @event {Function} cancel\t\t点击取消按钮时触发\n\t * @event {Function} close\t\t点击遮罩关闭出发，closeOnClickOverlay为true有效\n\t * @example <u-loadmore :status=\"status\" icon-type=\"iconType\" load-text=\"loadText\" />\n\t */\n\texport default {\n\t\tname: 'u-modal',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tloading: false\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tshow(n) {\n\t\t\t\t// 为了避免第一次打开modal，又使用了异步关闭的loading\n\t\t\t\t// 第二次打开modal时，loading依然存在的情况\n\t\t\t\tif (n && this.loading) this.loading = false\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击确定按钮\n\t\t\tconfirmHandler() {\n\t\t\t\t// 如果配置了异步关闭，将按钮值为loading状态\n\t\t\t\tif (this.asyncClose) {\n\t\t\t\t\tthis.loading = true;\n\t\t\t\t}\n\t\t\t\tthis.$emit('confirm')\n\t\t\t},\n\t\t\t// 点击取消按钮\n\t\t\tcancelHandler() {\n\t\t\t\tthis.$emit('cancel')\n\t\t\t},\n\t\t\t// 点击遮罩\n\t\t\t// 从原理上来说，modal的遮罩点击，并不是真的点击到了遮罩\n\t\t\t// 因为modal依赖于popup的中部弹窗类型，中部弹窗比较特殊，虽有然遮罩，但是为了让弹窗内容能flex居中\n\t\t\t// 多了一个透明的遮罩，此透明的遮罩会覆盖在灰色的遮罩上，所以实际上是点击不到灰色遮罩的，popup内部在\n\t\t\t// 透明遮罩的子元素做了.stop处理，所以点击内容区，也不会导致误触发\n\t\t\tclickHandler() {\n\t\t\t\tif (this.closeOnClickOverlay) {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-modal-border-radius: 6px;\n\n\t.u-modal {\n\t\twidth: 650rpx;\n\t\tborder-radius: $u-modal-border-radius;\n\t\toverflow: hidden;\n\n\t\t&__title {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: bold;\n\t\t\tcolor: $u-content-color;\n\t\t\ttext-align: center;\n\t\t\tpadding-top: 25px;\n\t\t}\n\n\t\t&__content {\n\t\t\tpadding: 12px 25px 25px 25px;\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\n\t\t\t&__text {\n\t\t\t\tfont-size: 15px;\n\t\t\t\tcolor: $u-content-color;\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t}\n\n\t\t&__button-group {\n\t\t\t@include flex;\n\n\t\t\t&--confirm-button {\n\t\t\t\tflex-direction: column;\n\t\t\t\tpadding: 0px 25px 15px 25px;\n\t\t\t}\n\n\t\t\t&__wrapper {\n\t\t\t\tflex: 1;\n\t\t\t\t@include flex;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 48px;\n\t\t\t\t\n\t\t\t\t&--confirm,\n\t\t\t\t&--only-cancel {\n\t\t\t\t\tborder-bottom-right-radius: $u-modal-border-radius;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t&--cancel,\n\t\t\t\t&--only-confirm {\n\t\t\t\t\tborder-bottom-left-radius: $u-modal-border-radius;\n\t\t\t\t}\n\n\t\t\t\t&--hover {\n\t\t\t\t\tbackground-color: $u-bg-color;\n\t\t\t\t}\n\n\t\t\t\t&__text {\n\t\t\t\t\tcolor: $u-content-color;\n\t\t\t\t\tfont-size: 16px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-navbar/props.js",
    "content": "export default {\n\tprops: {\n\t\t// 是否开启顶部安全区适配\n\t\tsafeAreaInsetTop: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.navbar.safeAreaInsetTop\n\t\t},\n\t\t// 固定在顶部时，是否生成一个等高元素，以防止塌陷\n\t\tplaceholder: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.navbar.placeholder\n\t\t},\n\t\t// 是否固定在顶部\n\t\tfixed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.navbar.fixed\n\t\t},\n\t\t// 是否显示下边框\n\t\tborder: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.navbar.border\n\t\t},\n\t\t// 左边的图标\n\t\tleftIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.navbar.leftIcon\n\t\t},\n\t\t// 左边的提示文字\n\t\tleftText: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.navbar.leftText\n\t\t},\n\t\t// 左右的提示文字\n\t\trightText: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.navbar.rightText\n\t\t},\n\t\t// 右边的图标\n\t\trightIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.navbar.rightIcon\n\t\t},\n\t\t// 标题\n\t\ttitle: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.navbar.title\n\t\t},\n\t\t// 背景颜色\n\t\tbgColor: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.navbar.bgColor\n\t\t},\n\t\t// 标题的宽度\n\t\ttitleWidth: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.navbar.titleWidth\n\t\t},\n\t\t// 导航栏高度\n\t\theight: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.navbar.height\n\t\t},\n\t\t// 左侧返回图标的大小\n\t\tleftIconSize: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.navbar.leftIconSize\n\t\t},\n\t\t// 左侧返回图标的颜色\n\t\tleftIconColor: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.navbar.leftIconColor\n\t\t},\n\t\t// 点击左侧区域(返回图标)，是否自动返回上一页\n\t\tautoBack: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.navbar.autoBack\n\t\t},\n\t\t// 标题的样式，对象或字符串\n\t\ttitleStyle: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: uni.$u.props.navbar.titleStyle\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-navbar/u-navbar.vue",
    "content": "<template>\n\t<view @click=\"click\" class=\"u-navbar\">\n\t\t<view class=\"u-navbar__placeholder\" v-if=\"fixed && placeholder\" :style=\"{\n\t\t\t\theight: $u.addUnit($u.getPx(height) + $u.sys().statusBarHeight,'px'),\n\t\t\t}\"></view>\n\t\t<view :class=\"[fixed && 'u-navbar--fixed']\">\n\t\t\t<u-status-bar v-if=\"safeAreaInsetTop\" :bgColor=\"bgColor\"></u-status-bar>\n\t\t\t<view class=\"u-navbar__content\" :class=\"[border && 'u-border-bottom']\" :style=\"{\n\t\t\t\t\theight: $u.addUnit(height),\n\t\t\t\t\tbackgroundColor: bgColor,\n\t\t\t\t}\">\n\t\t\t\t<view class=\"u-navbar__content__left\" hover-class=\"u-navbar__content__left--hover\"\n\t\t\t\t\thover-start-time=\"150\" @tap=\"leftClick\">\n\t\t\t\t\t<slot name=\"left\">\n\t\t\t\t\t\t<u-icon v-if=\"leftIcon\" :name=\"leftIcon\" :size=\"leftIconSize\" :color=\"leftIconColor\"></u-icon>\n\t\t\t\t\t\t<text v-if=\"leftText\" :style=\"{\n\t\t\t\t\t\t\t\tcolor: leftIconColor\n\t\t\t\t\t\t\t}\" class=\"u-navbar__content__left__text\">{{ leftText }}</text>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t\t<slot name=\"center\">\n\t\t\t\t\t<text class=\"u-line-1 u-navbar__content__title\" :style=\"[{\n\t\t\t\t\t\t\twidth: $u.addUnit(titleWidth),\n\t\t\t\t\t\t}, $u.addStyle(titleStyle)]\">{{ title }}</text>\n\t\t\t\t</slot>\n\t\t\t\t<view class=\"u-navbar__content__right\" v-if=\"$slots.right || rightIcon || rightText\" @tap=\"rightClick\">\n\t\t\t\t\t<slot name=\"right\">\n\t\t\t\t\t\t<u-icon v-if=\"rightIcon\" :name=\"rightIcon\" size=\"20\"></u-icon>\n\t\t\t\t\t\t<text v-if=\"rightText\" class=\"u-navbar__content__right__text\">{{ rightText }}</text>\n\t\t\t\t\t</slot>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Navbar 自定义导航栏\n\t * @description 此组件一般用于在特殊情况下，需要自定义导航栏的时候用到，一般建议使用uni-app带的导航栏。\n\t * @tutorial https://www.uviewui.com/components/navbar.html\n\t * @property {Boolean}\t\t\tsafeAreaInsetTop\t是否开启顶部安全区适配  （默认 true ）\n\t * @property {Boolean}\t\t\tplaceholder\t\t\t固定在顶部时，是否生成一个等高元素，以防止塌陷 （默认 false ）\n\t * @property {Boolean}\t\t\tfixed\t\t\t\t导航栏是否固定在顶部 （默认 false ）\n\t * @property {Boolean}\t\t\tborder\t\t\t\t导航栏底部是否显示下边框 （默认 false ）\n\t * @property {String}\t\t\tleftIcon\t\t\t左边返回图标的名称，只能为uView自带的图标 （默认 'arrow-left' ）\n\t * @property {String}\t\t\tleftText\t\t\t左边的提示文字\n\t * @property {String}\t\t\trightText\t\t\t右边的提示文字\n\t * @property {String}\t\t\trightIcon\t\t\t右边返回图标的名称，只能为uView自带的图标\n\t * @property {String}\t\t\ttitle\t\t\t\t导航栏标题，如设置为空字符，将会隐藏标题占位区域\n\t * @property {String}\t\t\tbgColor\t\t\t\t导航栏背景设置 （默认 '#ffffff' ）\n\t * @property {String | Number}\ttitleWidth\t\t\t导航栏标题的最大宽度，内容超出会以省略号隐藏 （默认 '400rpx' ）\n\t * @property {String | Number}\theight\t\t\t\t导航栏高度(不包括状态栏高度在内，内部自动加上)（默认 '44px' ）\n\t * @property {String | Number}\tleftIconSize\t\t左侧返回图标的大小（默认 20px ）\n\t * @property {String | Number}\tleftIconColor\t\t左侧返回图标的颜色（默认 #303133 ）\n\t * @property {Boolean}\t        autoBack\t\t\t点击左侧区域(返回图标)，是否自动返回上一页（默认 false ）\n\t * @property {Object | String}\ttitleStyle\t\t\t标题的样式，对象或字符串\n\t * @event {Function} leftClick\t\t点击左侧区域\n\t * @event {Function} rightClick\t\t点击右侧区域\n\t * @example <u-navbar title=\"剑未配妥，出门已是江湖\" left-text=\"返回\" right-text=\"帮助\" @click-left=\"onClickBack\" @click-right=\"onClickRight\"></u-navbar>\n\t */\n\texport default {\n\t\tname: 'u-navbar',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tclick(e) {\n\t\t\t\tthis.$emit('click', e)\n\t\t\t},\n\t\t\t// 点击左侧区域\n\t\t\tleftClick() {\n\t\t\t\t// 如果配置了autoBack，自动返回上一页\n\t\t\t\tthis.$emit('leftClick')\n\t\t\t\tif (this.autoBack) {\n\t\t\t\t\tuni.navigateBack()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 点击右侧区域\n\t\t\trightClick() {\n\t\t\t\tthis.$emit('rightClick')\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-navbar {\n\n\t\t&--fixed {\n\t\t\tposition: fixed;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\ttop: 0;\n\t\t\tz-index: 11;\n\t\t}\n\n\t\t&__content {\n\t\t\t@include flex(row);\n\t\t\talign-items: center;\n\t\t\theight: 44px;\n\t\t\tbackground-color: #9acafc;\n\t\t\tposition: relative;\n\t\t\tjustify-content: center;\n\n\t\t\t&__left,\n\t\t\t&__right {\n\t\t\t\tpadding: 0 13px;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\t@include flex(row);\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t&__left {\n\t\t\t\tleft: 0;\n\n\t\t\t\t&--hover {\n\t\t\t\t\topacity: 0.7;\n\t\t\t\t}\n\n\t\t\t\t&__text {\n\t\t\t\t\tfont-size: 15px;\n\t\t\t\t\tmargin-left: 3px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__title {\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 16px;\n\t\t\t\tcolor: $u-main-color;\n\t\t\t}\n\n\t\t\t&__right {\n\t\t\t\tright: 0;\n\n\t\t\t\t&__text {\n\t\t\t\t\tfont-size: 15px;\n\t\t\t\t\tmargin-left: 3px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-no-network/props.js",
    "content": "export default {\n    props: {\n        // 页面文字提示\n        tips: {\n            type: String,\n            default: uni.$u.props.noNetwork.tips\n        },\n        // 一个z-index值，用于设置没有网络这个组件的层次，因为页面可能会有其他定位的元素层级过高，导致此组件被覆盖\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.noNetwork.zIndex\n        },\n        // image 没有网络的图片提示\n        image: {\n            type: String,\n            default: uni.$u.props.noNetwork.image\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-no-network/u-no-network.vue",
    "content": "<template>\n\t<u-overlay\n\t    :show=\"!isConnected\"\n\t\t:zIndex=\"zIndex\"\n\t    @touchmove.stop.prevent=\"noop\"\n\t\t:customStyle=\"{\n\t\t\tbackgroundColor: '#fff',\n\t\t\tdisplay: 'flex',\n\t\t\tjustifyContent: 'center',\n\t\t}\"\n\t>\n\t\t<view\n\t\t    class=\"u-no-network\"\n\t\t>\n\t\t\t<u-icon\n\t\t\t    :name=\"image\"\n\t\t\t    size=\"150\"\n\t\t\t    imgMode=\"widthFit\"\n\t\t\t    class=\"u-no-network__error-icon\"\n\t\t\t></u-icon>\n\t\t\t<text class=\"u-no-network__tips\">{{tips}}</text>\n\t\t\t<!-- 只有APP平台，才能跳转设置页，因为需要调用plus环境 -->\n\t\t\t<!-- #ifdef APP-PLUS -->\n\t\t\t<view class=\"u-no-network__app\">\n\t\t\t\t<text class=\"u-no-network__app__setting\">请检查网络，或前往</text>\n\t\t\t\t<text\n\t\t\t\t    class=\"u-no-network__app__to-setting\"\n\t\t\t\t    @tap=\"openSettings\"\n\t\t\t\t>设置</text>\n\t\t\t</view>\n\t\t\t<!-- #endif -->\n\t\t\t<view class=\"u-no-network__retry\">\n\t\t\t\t<u-button\n\t\t\t\t    size=\"mini\"\n\t\t\t\t    text=\"重试\"\n\t\t\t\t    type=\"primary\"\n\t\t\t\t\tplain\n\t\t\t\t    @click=\"retry\"\n\t\t\t\t></u-button>\n\t\t\t</view>\n\t\t</view>\n\t</u-overlay>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * noNetwork 无网络提示\n\t * @description 该组件无需任何配置，引入即可，内部自动处理所有功能和事件。\n\t * @tutorial https://www.uviewui.com/components/noNetwork.html\n\t * @property {String}\t\t\ttips \t没有网络时的提示语 （默认：'哎呀，网络信号丢失' ）\n\t * @property {String | Number}\tzIndex\t组件的z-index值 \n\t * @property {String}\t\t\timage\t无网络的图片提示，可用的src地址或base64图片 \n\t * @event {Function}\t\t\tretry\t用户点击页面的\"重试\"按钮时触发\n\t * @example <u-no-network></u-no-network>\n\t */\n\texport default {\n\t\tname: \"u-no-network\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisConnected: true, // 是否有网络连接\n\t\t\t\tnetworkType: \"none\", // 网络类型\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.isIOS = (uni.getSystemInfoSync().platform === 'ios')\n\t\t\tuni.onNetworkStatusChange((res) => {\n\t\t\t\tthis.isConnected = res.isConnected\n\t\t\t\tthis.networkType = res.networkType\n\t\t\t\tthis.emitEvent(this.networkType)\n\t\t\t})\n\t\t\tuni.getNetworkType({\n\t\t\t\tsuccess: (res) => {\n\t\t\t\t\tthis.networkType = res.networkType\n\t\t\t\t\tthis.emitEvent(this.networkType)\n\t\t\t\t\tif (res.networkType == 'none') {\n\t\t\t\t\t\tthis.isConnected = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.isConnected = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tmethods: {\n\t\t\tretry() {\n\t\t\t\t// 重新检查网络\n\t\t\t\tuni.getNetworkType({\n\t\t\t\t\tsuccess: (res) => {\n\t\t\t\t\t\tthis.networkType = res.networkType\n\t\t\t\t\t\tthis.emitEvent(this.networkType)\n\t\t\t\t\t\tif (res.networkType == 'none') {\n\t\t\t\t\t\t\tuni.$u.toast('无网络连接')\n\t\t\t\t\t\t\tthis.isConnected = false\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tuni.$u.toast('网络已连接')\n\t\t\t\t\t\t\tthis.isConnected = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.$emit('retry')\n\t\t\t},\n\t\t\t// 发出事件给父组件\n\t\t\temitEvent(networkType) {\n\t\t\t\tthis.$emit(networkType === 'none' ? 'disconnected' : 'connected')\n\t\t\t},\n\t\t\tasync openSettings() {\n\t\t\t\tif (this.networkType == \"none\") {\n\t\t\t\t\tthis.openSystemSettings()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t},\n\t\t\topenAppSettings() {\n\t\t\t\tthis.gotoAppSetting()\n\t\t\t},\n\t\t\topenSystemSettings() {\n\t\t\t\t// 以下方法来自5+范畴，如需深究，请自行查阅相关文档\n\t\t\t\t// https://ask.dcloud.net.cn/docs/\n\t\t\t\tif (this.isIOS) {\n\t\t\t\t\tthis.gotoiOSSetting()\n\t\t\t\t} else {\n\t\t\t\t\tthis.gotoAndroidSetting()\n\t\t\t\t}\n\t\t\t},\n\t\t\tnetwork() {\n\t\t\t\tvar result = null\n\t\t\t\tvar cellularData = plus.ios.newObject(\"CTCellularData\")\n\t\t\t\tvar state = cellularData.plusGetAttribute(\"restrictedState\")\n\t\t\t\tif (state == 0) {\n\t\t\t\t\tresult = null\n\t\t\t\t} else if (state == 2) {\n\t\t\t\t\tresult = 1\n\t\t\t\t} else if (state == 1) {\n\t\t\t\t\tresult = 2\n\t\t\t\t}\n\t\t\t\tplus.ios.deleteObject(cellularData)\n\t\t\t\treturn result\n\t\t\t},\n\t\t\tgotoAppSetting() {\n\t\t\t\tif (this.isIOS) {\n\t\t\t\t\tvar UIApplication = plus.ios.import(\"UIApplication\")\n\t\t\t\t\tvar application2 = UIApplication.sharedApplication()\n\t\t\t\t\tvar NSURL2 = plus.ios.import(\"NSURL\")\n\t\t\t\t\tvar setting2 = NSURL2.URLWithString(\"app-settings:\")\n\t\t\t\t\tapplication2.openURL(setting2)\n\t\t\t\t\tplus.ios.deleteObject(setting2)\n\t\t\t\t\tplus.ios.deleteObject(NSURL2)\n\t\t\t\t\tplus.ios.deleteObject(application2)\n\t\t\t\t} else {\n\t\t\t\t\tvar Intent = plus.android.importClass(\"android.content.Intent\")\n\t\t\t\t\tvar Settings = plus.android.importClass(\"android.provider.Settings\")\n\t\t\t\t\tvar Uri = plus.android.importClass(\"android.net.Uri\")\n\t\t\t\t\tvar mainActivity = plus.android.runtimeMainActivity()\n\t\t\t\t\tvar intent = new Intent()\n\t\t\t\t\tintent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)\n\t\t\t\t\tvar uri = Uri.fromParts(\"package\", mainActivity.getPackageName(), null)\n\t\t\t\t\tintent.setData(uri)\n\t\t\t\t\tmainActivity.startActivity(intent)\n\t\t\t\t}\n\t\t\t},\n\t\t\tgotoiOSSetting() {\n\t\t\t\tvar UIApplication = plus.ios.import(\"UIApplication\")\n\t\t\t\tvar application2 = UIApplication.sharedApplication()\n\t\t\t\tvar NSURL2 = plus.ios.import(\"NSURL\")\n\t\t\t\tvar setting2 = NSURL2.URLWithString(\"App-prefs:root=General\")\n\t\t\t\tapplication2.openURL(setting2)\n\t\t\t\tplus.ios.deleteObject(setting2)\n\t\t\t\tplus.ios.deleteObject(NSURL2)\n\t\t\t\tplus.ios.deleteObject(application2)\n\t\t\t},\n\t\t\tgotoAndroidSetting() {\n\t\t\t\tvar Intent = plus.android.importClass(\"android.content.Intent\")\n\t\t\t\tvar Settings = plus.android.importClass(\"android.provider.Settings\")\n\t\t\t\tvar mainActivity = plus.android.runtimeMainActivity()\n\t\t\t\tvar intent = new Intent(Settings.ACTION_SETTINGS)\n\t\t\t\tmainActivity.startActivity(intent)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-no-network {\n\t\t@include flex(column);\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-top: -100px;\n\n\t\t&__tips {\n\t\t\tcolor: $u-tips-color;\n\t\t\tfont-size: 14px;\n\t\t\tmargin-top: 15px;\n\t\t}\n\n\t\t&__app {\n\t\t\t@include flex(row);\n\t\t\tmargin-top: 6px;\n\n\t\t\t&__setting {\n\t\t\t\tcolor: $u-light-color;\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\n\t\t\t&__to-setting {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: $u-primary;\n\t\t\t\tmargin-left: 3px;\n\t\t\t}\n\t\t}\n\n\t\t&__retry {\n\t\t\t@include flex(row);\n\t\t\tjustify-content: center;\n\t\t\tmargin-top: 15px;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-notice-bar/props.js",
    "content": "export default {\n    props: {\n        // 显示的内容，数组\n        text: {\n            type: [Array, String],\n            default: uni.$u.props.noticeBar.text\n        },\n        // 通告滚动模式，row-横向滚动，column-竖向滚动\n        direction: {\n            type: String,\n            default: uni.$u.props.noticeBar.direction\n        },\n        // direction = row时，是否使用步进形式滚动\n        step: {\n            type: Boolean,\n            default: uni.$u.props.noticeBar.step\n        },\n        // 是否显示左侧的音量图标\n        icon: {\n            type: String,\n            default: uni.$u.props.noticeBar.icon\n        },\n        // 通告模式，link-显示右箭头，closable-显示右侧关闭图标\n        mode: {\n            type: String,\n            default: uni.$u.props.noticeBar.mode\n        },\n        // 文字颜色，各图标也会使用文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.noticeBar.color\n        },\n        // 背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.noticeBar.bgColor\n        },\n        // 水平滚动时的滚动速度，即每秒滚动多少px(px)，这有利于控制文字无论多少时，都能有一个恒定的速度\n        speed: {\n            type: [String, Number],\n            default: uni.$u.props.noticeBar.speed\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.noticeBar.fontSize\n        },\n        // 滚动一个周期的时间长，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.noticeBar.duration\n        },\n        // 是否禁止用手滑动切换\n        // 目前HX2.6.11，只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序\n        disableTouch: {\n            type: Boolean,\n            default: uni.$u.props.noticeBar.disableTouch\n        },\n        // 跳转的页面路径\n        url: {\n            type: String,\n            default: uni.$u.props.noticeBar.url\n        },\n        // 页面跳转的类型\n        linkType: {\n            type: String,\n            default: uni.$u.props.noticeBar.linkType\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-notice-bar\"\n\t\tv-if=\"show\"\n\t\t:style=\"[{\n\t\t\tbackgroundColor: bgColor\n\t\t}, $u.addStyle(customStyle)]\"\n\t>\n\t\t<template v-if=\"direction === 'column' || (direction === 'row' && step)\">\n\t\t\t<u-column-notice\n\t\t\t\t:color=\"color\"\n\t\t\t\t:bgColor=\"bgColor\"\n\t\t\t\t:text=\"text\"\n\t\t\t\t:mode=\"mode\"\n\t\t\t\t:step=\"step\"\n\t\t\t\t:icon=\"icon\"\n\t\t\t\t:disable-touch=\"disableTouch\"\n\t\t\t\t:fontSize=\"fontSize\"\n\t\t\t\t:duration=\"duration\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@click=\"click\"\n\t\t\t></u-column-notice>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<u-row-notice\n\t\t\t\t:color=\"color\"\n\t\t\t\t:bgColor=\"bgColor\"\n\t\t\t\t:text=\"text\"\n\t\t\t\t:mode=\"mode\"\n\t\t\t\t:fontSize=\"fontSize\"\n\t\t\t\t:speed=\"speed\"\n\t\t\t\t:url=\"url\"\n\t\t\t\t:linkType=\"linkType\"\n\t\t\t\t:icon=\"icon\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@click=\"click\"\n\t\t\t></u-row-notice>\n\t\t</template>\n\t</view>\n</template>\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * noticeBar 滚动通知\n\t * @description 该组件用于滚动通告场景，有多种模式可供选择\n\t * @tutorial https://www.uviewui.com/components/noticeBar.html\n\t * @property {Array | String}\ttext\t\t\t显示的内容，数组\n\t * @property {String}\t\t\tdirection\t\t通告滚动模式，row-横向滚动，column-竖向滚动 ( 默认 'row' )\n\t * @property {Boolean}\t\t\tstep\t\t\tdirection = row时，是否使用步进形式滚动  ( 默认 false )\n\t * @property {String}\t\t\ticon\t\t\t是否显示左侧的音量图标 ( 默认 'volume' )\n\t * @property {String}\t\t\tmode\t\t\t通告模式，link-显示右箭头，closable-显示右侧关闭图标\n\t * @property {String}\t\t\tcolor\t\t\t文字颜色，各图标也会使用文字颜色 ( 默认 '#f9ae3d' )\n\t * @property {String}\t\t\tbgColor\t\t\t背景颜色 ( 默认 '#fdf6ec' )\n\t * @property {String | Number}\tspeed\t\t\t水平滚动时的滚动速度，即每秒滚动多少px(px)，这有利于控制文字无论多少时，都能有一个恒定的速度 ( 默认 80 )\n\t * @property {String | Number}\tfontSize\t\t字体大小 ( 默认 14 )\n\t * @property {String | Number}\tduration\t\t滚动一个周期的时间长，单位ms ( 默认 2000 )\n\t * @property {Boolean}\t\t\tdisableTouch\t是否禁止用手滑动切换 目前HX2.6.11，只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序（默认34） ( 默认 true )\n\t * @property {String}\t\t\turl\t\t\t\t跳转的页面路径\n\t * @property {String}\t\t\tlinkType\t\t页面跳转的类型 ( 默认 navigateTo )\n\t * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t * \n\t * @event {Function}\t\t\tclick\t\t\t点击通告文字触发\n\t * @event {Function}\t\t\tclose\t\t\t点击右侧关闭图标触发\n\t * @example <u-notice-bar :more-icon=\"true\" :list=\"list\"></u-notice-bar>\n\t */\n\texport default {\n\t\tname: \"u-notice-bar\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tshow: true\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击通告栏\n\t\t\tclick(index) {\n\t\t\t\tthis.$emit('click', index)\n\t\t\t\tif (this.url && this.linkType) {\n\t\t\t\t\t// 此方法写在mixin中，另外跳转的url和linkType参数也在mixin的props中\n\t\t\t\t\tthis.openPage()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 点击关闭按钮\n\t\t\tclose() {\n\t\t\t\tthis.show = false\n\t\t\t\tthis.$emit('close')\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-notice-bar {\n\t\toverflow: hidden;\n\t\tpadding: 9px 12px;\n\t\tflex: 1;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-notify/props.js",
    "content": "export default {\n    props: {\n        // 到顶部的距离\n        top: {\n            type: [String, Number],\n            default: uni.$u.props.notify.top\n        },\n        // 是否展示组件\n        // show: {\n        // \ttype: Boolean,\n        // \tdefault: uni.$u.props.notify.show\n        // },\n        // type主题，primary，success，warning，error\n        type: {\n            type: String,\n            default: uni.$u.props.notify.type\n        },\n        // 字体颜色\n        color: {\n            type: String,\n            default: uni.$u.props.notify.color\n        },\n        // 背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.notify.bgColor\n        },\n        // 展示的文字内容\n        message: {\n            type: String,\n            default: uni.$u.props.notify.message\n        },\n        // 展示时长，为0时不消失，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.notify.duration\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.notify.fontSize\n        },\n        // 是否留出顶部安全距离（状态栏高度）\n        safeAreaInsetTop: {\n            type: Boolean,\n            default: uni.$u.props.notify.safeAreaInsetTop\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-notify/u-notify.vue",
    "content": "<template>\n\t<u-transition\n\t\tmode=\"slide-down\"\n\t\t:customStyle=\"containerStyle\"\n\t\t:show=\"open\"\n\t>\n\t\t<view\n\t\t\tclass=\"u-notify\"\n\t\t\t:class=\"[`u-notify--${tmpConfig.type}`]\"\n\t\t\t:style=\"[backgroundColor, $u.addStyle(customStyle)]\"\n\t\t>\n\t\t\t<u-status-bar v-if=\"tmpConfig.safeAreaInsetTop\"></u-status-bar>\n\t\t\t<view class=\"u-notify__warpper\">\n\t\t\t\t<slot name=\"icon\">\n\t\t\t\t\t<u-icon\n\t\t\t\t\t\tv-if=\"['success', 'warning', 'error'].includes(tmpConfig.type)\"\n\t\t\t\t\t\t:name=\"tmpConfig.icon\"\n\t\t\t\t\t\t:color=\"tmpConfig.color\"\n\t\t\t\t\t\t:size=\"1.3 * tmpConfig.fontSize\"\n\t\t\t\t\t\t:customStyle=\"{marginRight: '4px'}\"\n\t\t\t\t\t></u-icon>\n\t\t\t\t</slot>\n\t\t\t\t<text\n\t\t\t\t\tclass=\"u-notify__warpper__text\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\tfontSize: $u.addUnit(tmpConfig.fontSize),\n\t\t\t\t\t\tcolor: tmpConfig.color\n\t\t\t\t\t}\"\n\t\t\t\t>{{ tmpConfig.message }}</text>\n\t\t\t</view>\n\t\t</view>\n\t</u-transition>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * notify 顶部提示\n\t * @description 该组件一般用于页面顶部向下滑出一个提示，尔后自动收起的场景\n\t * @tutorial\n\t * @property {String | Number}\ttop\t\t\t\t\t到顶部的距离 ( 默认 0 )\n\t * @property {String}\t\t\ttype\t\t\t\t主题，primary，success，warning，error ( 默认 'primary' )\n\t * @property {String}\t\t\tcolor\t\t\t\t字体颜色 ( 默认 '#ffffff' )\n\t * @property {String}\t\t\tbgColor\t\t\t\t背景颜色\n\t * @property {String}\t\t\tmessage\t\t\t\t展示的文字内容\n\t * @property {String | Number}\tduration\t\t\t展示时长，为0时不消失，单位ms ( 默认 3000 )\n\t * @property {String | Number}\tfontSize\t\t\t字体大小 ( 默认 15 )\n\t * @property {Boolean}\t\t\tsafeAreaInsetTop\t是否留出顶部安全距离（状态栏高度） ( 默认 false )\n\t * @property {Object}\t\t\tcustomStyle\t\t\t组件的样式，对象形式\n\t * @event {Function}\topen\t开启组件时调用的函数\n\t * @event {Function}\tclose\t关闭组件式调用的函数\n\t * @example <u-notify message=\"Hi uView\"></u-notify>\n\t */\n\texport default {\n\t\tname: 'u-notify',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 是否展示组件\n\t\t\t\topen: false,\n\t\t\t\ttimer: null,\n\t\t\t\tconfig: {\n\t\t\t\t\t// 到顶部的距离\n\t\t\t\t\ttop: uni.$u.props.notify.top,\n\t\t\t\t\t// type主题，primary，success，warning，error\n\t\t\t\t\ttype: uni.$u.props.notify.type,\n\t\t\t\t\t// 字体颜色\n\t\t\t\t\tcolor: uni.$u.props.notify.color,\n\t\t\t\t\t// 背景颜色\n\t\t\t\t\tbgColor: uni.$u.props.notify.bgColor,\n\t\t\t\t\t// 展示的文字内容\n\t\t\t\t\tmessage: uni.$u.props.notify.message,\n\t\t\t\t\t// 展示时长，为0时不消失，单位ms\n\t\t\t\t\tduration: uni.$u.props.notify.duration,\n\t\t\t\t\t// 字体大小\n\t\t\t\t\tfontSize: uni.$u.props.notify.fontSize,\n\t\t\t\t\t// 是否留出顶部安全距离（状态栏高度）\n\t\t\t\t\tsafeAreaInsetTop: uni.$u.props.notify.safeAreaInsetTop\n\t\t\t\t},\n\t\t\t\t// 合并后的配置，避免多次调用组件后，可能会复用之前使用的配置参数\n\t\t\t\ttmpConfig: {}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tcontainerStyle() {\n\t\t\t\tlet top = 0\n\t\t\t\tif (this.tmpConfig.top === 0) {\n\t\t\t\t\t// #ifdef H5\n\t\t\t\t\t// H5端，导航栏为普通元素，需要将组件移动到导航栏的下边沿\n\t\t\t\t\t// H5的导航栏高度为44px\n\t\t\t\t\ttop = 44\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t\tconst style = {\n\t\t\t\t\ttop: uni.$u.addUnit(this.tmpConfig.top === 0 ? top : this.tmpConfig.top),\n\t\t\t\t\t// 因为组件底层为u-transition组件，必须将其设置为fixed定位\n\t\t\t\t\t// 让其出现在导航栏底部\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\tzIndex: 10076\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 组件背景颜色\n\t\t\tbackgroundColor() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (this.tmpConfig.bgColor) {\n\t\t\t\t\tstyle.backgroundColor = this.tmpConfig.bgColor\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 默认主题下的图标\n\t\t\ticon() {\n\t\t\t\tlet icon\n\t\t\t\tif (this.tmpConfig.type === 'success') {\n\t\t\t\t\ticon = 'checkmark-circle'\n\t\t\t\t} else if (this.tmpConfig.type === 'error') {\n\t\t\t\t\ticon = 'close-circle'\n\t\t\t\t} else if (this.tmpConfig.type === 'warning') {\n\t\t\t\t\ticon = 'error-circle'\n\t\t\t\t}\n\t\t\t\treturn icon\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\t// 通过主题的形式调用toast，批量生成方法函数\n\t\t\t['primary', 'success', 'error', 'warning'].map(item => {\n\t\t\t\tthis[item] = message => this.show({\n\t\t\t\t\ttype: item,\n\t\t\t\t\tmessage\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tmethods: {\n\t\t\tshow(options) {\n\t\t\t\t// 不将结果合并到this.config变量，避免多次调用u-toast，前后的配置造成混乱\n\t\t\t\tthis.tmpConfig = uni.$u.deepMerge(this.config, options)\n\t\t\t\t// 任何定时器初始化之前，都要执行清除操作，否则可能会造成混乱\n\t\t\t\tthis.clearTimer()\n\t\t\t\tthis.open = true\n\t\t\t\tif (this.tmpConfig.duration > 0) {\n\t\t\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\t\t\tthis.open = false\n\t\t\t\t\t\t// 倒计时结束，清除定时器，隐藏toast组件\n\t\t\t\t\t\tthis.clearTimer()\n\t\t\t\t\t\t// 判断是否存在callback方法，如果存在就执行\n\t\t\t\t\t\ttypeof(this.tmpConfig.complete) === 'function' && this.tmpConfig.complete()\n\t\t\t\t\t}, this.tmpConfig.duration)\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 关闭notify\n\t\t\tclose() {\n\t\t\t\tthis.clearTimer()\n\t\t\t},\n\t\t\tclearTimer() {\n\t\t\t\tthis.open = false\n\t\t\t\t// 清除定时器\n\t\t\t\tclearTimeout(this.timer)\n\t\t\t\tthis.timer = null\n\t\t\t}\n\t\t},\n\t\tbeforeDestroy() {\n\t\t\tthis.clearTimer()\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t$u-notify-padding: 8px 10px !default;\n\t$u-notify-text-font-size: 15px !default;\n\t$u-notify-primary-bgColor: $u-primary !default;\n\t$u-notify-success-bgColor: $u-success !default;\n\t$u-notify-error-bgColor: $u-error !default;\n\t$u-notify-warning-bgColor: $u-warning !default;\n\n\n\t.u-notify {\n\t\tpadding: $u-notify-padding;\n\n\t\t&__warpper {\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\ttext-align: center;\n\t\t\tjustify-content: center;\n\n\t\t\t&__text {\n\t\t\t\tfont-size: $u-notify-text-font-size;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t}\n\n\t\t&--primary {\n\t\t\tbackground-color: $u-notify-primary-bgColor;\n\t\t}\n\n\t\t&--success {\n\t\t\tbackground-color: $u-notify-success-bgColor;\n\t\t}\n\n\t\t&--error {\n\t\t\tbackground-color: $u-notify-error-bgColor;\n\t\t}\n\n\t\t&--warning {\n\t\t\tbackground-color: $u-notify-warning-bgColor;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-number-box/props.js",
    "content": "export default {\n    props: {\n        // 步进器标识符，在change回调返回\n        name: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.name\n        },\n        // 用于双向绑定的值，初始化时设置设为默认min值(最小值)\n        value: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.value\n        },\n        // 最小值\n        min: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.min\n        },\n        // 最大值\n        max: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.max\n        },\n        // 加减的步长，可为小数\n        step: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.step\n        },\n        // 是否只允许输入整数\n        integer: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.integer\n        },\n        // 是否禁用，包括输入框，加减按钮\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.disabled\n        },\n        // 是否禁用输入框\n        disabledInput: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.disabledInput\n        },\n        // 是否开启异步变更，开启后需要手动控制输入值\n        asyncChange: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.asyncChange\n        },\n        // 输入框宽度，单位为px\n        inputWidth: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.inputWidth\n        },\n        // 是否显示减少按钮\n        showMinus: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.showMinus\n        },\n        // 是否显示增加按钮\n        showPlus: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.showPlus\n        },\n        // 显示的小数位数\n        decimalLength: {\n            type: [String, Number, null],\n            default: uni.$u.props.numberBox.decimalLength\n        },\n        // 是否开启长按加减手势\n        longPress: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.longPress\n        },\n        // 输入框文字和加减按钮图标的颜色\n        color: {\n            type: String,\n            default: uni.$u.props.numberBox.color\n        },\n        // 按钮大小，宽高等于此值，单位px，输入框高度和此值保持一致\n        buttonSize: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.buttonSize\n        },\n        // 输入框和按钮的背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.numberBox.bgColor\n        },\n        // 指定光标于键盘的距离，避免键盘遮挡输入框，单位px\n        cursorSpacing: {\n            type: [String, Number],\n            default: uni.$u.props.numberBox.cursorSpacing\n        },\n        // 是否禁用增加按钮\n        disablePlus: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.disablePlus\n        },\n        // 是否禁用减少按钮\n        disableMinus: {\n            type: Boolean,\n            default: uni.$u.props.numberBox.disableMinus\n        },\n        // 加减按钮图标的样式\n        iconStyle: {\n            type: [Object, String],\n            default: uni.$u.props.numberBox.iconStyle\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-number-box/u-number-box.vue",
    "content": "<template>\n\t<view class=\"u-number-box\">\n\t\t<view\n\t\t    class=\"u-number-box__slot\"\n\t\t    @tap.stop=\"clickHandler('minus')\"\n\t\t    @touchstart=\"onTouchStart('minus')\"\n\t\t    @touchend.stop=\"clearTimeout\"\n\t\t    v-if=\"showMinus && $slots.minus\"\n\t\t>\n\t\t\t<slot name=\"minus\" />\n\t\t</view>\n\t\t<view\n\t\t    v-else-if=\"showMinus\"\n\t\t    class=\"u-number-box__minus\"\n\t\t    @tap.stop=\"clickHandler('minus')\"\n\t\t    @touchstart=\"onTouchStart('minus')\"\n\t\t    @touchend.stop=\"clearTimeout\"\n\t\t    hover-class=\"u-number-box__minus--hover\"\n\t\t    hover-stay-time=\"150\"\n\t\t    :class=\"{ 'u-number-box__minus--disabled': isDisabled('minus') }\"\n\t\t    :style=\"[buttonStyle('minus')]\"\n\t\t>\n\t\t\t<u-icon\n\t\t\t    name=\"minus\"\n\t\t\t    :color=\"isDisabled('minus') ? '#c8c9cc' : '#323233'\"\n\t\t\t    size=\"15\"\n\t\t\t    bold\n\t\t\t\t:customStyle=\"iconStyle\"\n\t\t\t></u-icon>\n\t\t</view>\n\n\t\t<slot name=\"input\">\n\t\t\t<input\n\t\t\t    :disabled=\"disabledInput || disabled\"\n\t\t\t    :cursor-spacing=\"getCursorSpacing\"\n\t\t\t    :class=\"{ 'u-number-box__input--disabled': disabled || disabledInput }\"\n\t\t\t    v-model=\"currentValue\"\n\t\t\t    class=\"u-number-box__input\"\n\t\t\t    @blur=\"onBlur\"\n\t\t\t    @focus=\"onFocus\"\n\t\t\t    @input=\"onInput\"\n\t\t\t    type=\"number\"\n\t\t\t    :style=\"[inputStyle]\"\n\t\t\t/>\n\t\t</slot>\n\t\t<view\n\t\t    class=\"u-number-box__slot\"\n\t\t    @tap.stop=\"clickHandler('plus')\"\n\t\t    @touchstart=\"onTouchStart('plus')\"\n\t\t    @touchend.stop=\"clearTimeout\"\n\t\t    v-if=\"showPlus && $slots.plus\"\n\t\t>\n\t\t\t<slot name=\"plus\" />\n\t\t</view>\n\t\t<view\n\t\t    v-else-if=\"showPlus\"\n\t\t    class=\"u-number-box__plus\"\n\t\t    @tap.stop=\"clickHandler('plus')\"\n\t\t    @touchstart=\"onTouchStart('plus')\"\n\t\t    @touchend.stop=\"clearTimeout\"\n\t\t    hover-class=\"u-number-box__plus--hover\"\n\t\t    hover-stay-time=\"150\"\n\t\t    :class=\"{ 'u-number-box__minus--disabled': isDisabled('plus') }\"\n\t\t    :style=\"[buttonStyle('plus')]\"\n\t\t>\n\t\t\t<u-icon\n\t\t\t    name=\"plus\"\n\t\t\t    :color=\"isDisabled('plus') ? '#c8c9cc' : '#323233'\"\n\t\t\t    size=\"15\"\n\t\t\t    bold\n\t\t\t\t:customStyle=\"iconStyle\"\n\t\t\t></u-icon>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * numberBox 步进器\n\t * @description 该组件一般用于商城购物选择物品数量的场景。\n\t * @tutorial https://uviewui.com/components/numberBox.html\n\t * @property {String | Number}\tname\t\t\t步进器标识符，在change回调返回\n\t * @property {String | Number}\tvalue\t\t\t用于双向绑定的值，初始化时设置设为默认min值(最小值)  （默认 0 ）\n\t * @property {String | Number}\tmin\t\t\t\t最小值 （默认 1 ）\n\t * @property {String | Number}\tmax\t\t\t\t最大值 （默认 Number.MAX_SAFE_INTEGER ）\n\t * @property {String | Number}\tstep\t\t\t加减的步长，可为小数 （默认 1 ）\n\t * @property {Boolean}\t\t\tinteger\t\t\t是否只允许输入整数 （默认 false ）\n\t * @property {Boolean}\t\t\tdisabled\t\t是否禁用，包括输入框，加减按钮 （默认 false ）\n\t * @property {Boolean}\t\t\tdisabledInput\t是否禁用输入框 （默认 false ）\n\t * @property {Boolean}\t\t\tasyncChange\t\t是否开启异步变更，开启后需要手动控制输入值 （默认 false ）\n\t * @property {String | Number}\tinputWidth\t\t输入框宽度，单位为px （默认 35 ）\n\t * @property {Boolean}\t\t\tshowMinus\t\t是否显示减少按钮 （默认 true ）\n\t * @property {Boolean}\t\t\tshowPlus\t\t是否显示增加按钮 （默认 true ）\n\t * @property {String | Number}\tdecimalLength\t显示的小数位数\n\t * @property {Boolean}\t\t\tlongPress\t\t是否开启长按加减手势 （默认 true ）\n\t * @property {String}\t\t\tcolor\t\t\t输入框文字和加减按钮图标的颜色 （默认 '#323233' ）\n\t * @property {String | Number}\tbuttonSize\t\t按钮大小，宽高等于此值，单位px，输入框高度和此值保持一致 （默认 30 ）\n\t * @property {String}\t\t\tbgColor\t\t\t输入框和按钮的背景颜色 （默认 '#EBECEE' ）\n\t * @property {String | Number}\tcursorSpacing\t指定光标于键盘的距离，避免键盘遮挡输入框，单位px （默认 100 ）\n\t * @property {Boolean}\t\t\tdisablePlus\t\t是否禁用增加按钮 （默认 false ）\n\t * @property {Boolean}\t\t\tdisableMinus\t是否禁用减少按钮 （默认 false ）\n\t * @property {Object ｜ String}\ticonStyle\t\t加减按钮图标的样式\n\t *\n\t * @event {Function}\tonFocus\t输入框活动焦点\n\t * @event {Function}\tonBlur\t输入框失去焦点\n\t * @event {Function}\tonInput\t输入框值发生变化\n\t * @event {Function}\tonChange\n\t * @example <u-number-box v-model=\"value\" @change=\"valChange\"></u-number-box>\n\t */\n\texport default {\n\t\tname: 'u-number-box',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 输入框实际操作的值\n\t\t\t\tcurrentValue: '',\n\t\t\t\t// 定时器\n\t\t\t\tlongPressTimer: null\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 多个值之间，只要一个值发生变化，都要重新检查check()函数\n\t\t\twatchChange(n) {\n\t\t\t\tthis.check()\n\t\t\t},\n\t\t\t// 监听v-mode的变化，重新初始化内部的值\n\t\t\tvalue(n) {\n\t\t\t\tif (n !== this.currentValue) {\n\t\t\t\t\tthis.currentValue = this.format(this.value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tgetCursorSpacing() {\n\t\t\t\t// 判断传入的单位，如果为px单位，需要转成px\n\t\t\t\treturn uni.$u.getPx(this.cursorSpacing)\n\t\t\t},\n\t\t\t// 按钮的样式\n\t\t\tbuttonStyle() {\n\t\t\t\treturn (type) => {\n\t\t\t\t\tconst style = {\n\t\t\t\t\t\tbackgroundColor: this.bgColor,\n\t\t\t\t\t\theight: uni.$u.addUnit(this.buttonSize),\n\t\t\t\t\t\tcolor: this.color\n\t\t\t\t\t}\n\t\t\t\t\tif (this.isDisabled(type)) {\n\t\t\t\t\t\tstyle.backgroundColor = '#f7f8fa'\n\t\t\t\t\t}\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 输入框的样式\n\t\t\tinputStyle() {\n\t\t\t\tconst disabled = this.disabled || this.disabledInput\n\t\t\t\tconst style = {\n\t\t\t\t\tcolor: this.color,\n\t\t\t\t\tbackgroundColor: this.bgColor,\n\t\t\t\t\theight: uni.$u.addUnit(this.buttonSize),\n\t\t\t\t\twidth: uni.$u.addUnit(this.inputWidth)\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 用于监听多个值发生变化\n\t\t\twatchChange() {\n\t\t\t\treturn [this.integer, this.decimalLength, this.min, this.max]\n\t\t\t},\n\t\t\tisDisabled() {\n\t\t\t\treturn (type) => {\n\t\t\t\t\tif (type === 'plus') {\n\t\t\t\t\t\t// 在点击增加按钮情况下，判断整体的disabled，是否单独禁用增加按钮，以及当前值是否大于最大的允许值\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tthis.disabled ||\n\t\t\t\t\t\t\tthis.disablePlus ||\n\t\t\t\t\t\t\tthis.currentValue >= this.max\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\t// 点击减少按钮同理\n\t\t\t\t\treturn (\n\t\t\t\t\t\tthis.disabled ||\n\t\t\t\t\t\tthis.disableMinus ||\n\t\t\t\t\t\tthis.currentValue <= this.min\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tthis.currentValue = this.format(this.value)\n\t\t\t},\n\t\t\t// 格式化整理数据，限制范围\n\t\t\tformat(value) {\n\t\t\t\tvalue = this.filter(value)\n\t\t\t\t// 如果为空字符串，那么设置为0，同时将值转为Number类型\n\t\t\t\tvalue = value === '' ? 0 : +value\n\t\t\t\t// 对比最大最小值，取在min和max之间的值\n\t\t\t\tvalue = Math.max(Math.min(this.max, value), this.min)\n\t\t\t\t// 如果设定了最大的小数位数，使用toFixed去进行格式化\n\t\t\t\tif (this.decimalLength !== null) {\n\t\t\t\t\tvalue = value.toFixed(this.decimalLength)\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t\t// 过滤非法的字符\n\t\t\tfilter(value) {\n\t\t\t\t// 只允许0-9之间的数字，\".\"为小数点，\"-\"为负数时候使用\n\t\t\t\tvalue = String(value).replace(/[^0-9.-]/g, '')\n\t\t\t\t// 如果只允许输入整数，则过滤掉小数点后的部分\n\t\t\t\tif (this.integer && value.indexOf('.') !== -1) {\n\t\t\t\t\tvalue = value.split('.')[0]\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\tcheck() {\n\t\t\t\t// 格式化了之后，如果前后的值不相等，那么设置为格式化后的值\n\t\t\t\tconst val = this.format(this.currentValue);\n\t\t\t\tif (val !== this.currentValue) {\n\t\t\t\t\tthis.currentValue = val\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 判断是否出于禁止操作状态\n\t\t\t// isDisabled(type) {\n\t\t\t// \tif (type === 'plus') {\n\t\t\t// \t\t// 在点击增加按钮情况下，判断整体的disabled，是否单独禁用增加按钮，以及当前值是否大于最大的允许值\n\t\t\t// \t\treturn (\n\t\t\t// \t\t\tthis.disabled ||\n\t\t\t// \t\t\tthis.disablePlus ||\n\t\t\t// \t\t\tthis.currentValue >= this.max\n\t\t\t// \t\t)\n\t\t\t// \t}\n\t\t\t// \t// 点击减少按钮同理\n\t\t\t// \treturn (\n\t\t\t// \t\tthis.disabled ||\n\t\t\t// \t\tthis.disableMinus ||\n\t\t\t// \t\tthis.currentValue <= this.min\n\t\t\t// \t)\n\t\t\t// },\n\t\t\t// 输入框活动焦点\n\t\t\tonFocus(event) {\n\t\t\t\tthis.$emit('focus', {\n\t\t\t\t\t...event.detail,\n\t\t\t\t\tname: this.name,\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 输入框失去焦点\n\t\t\tonBlur(event) {\n\t\t\t\t// 对输入值进行格式化\n\t\t\t\tconst value = this.format(event.detail.value)\n\t\t\t\t// 发出blur事件\n\t\t\t\tthis.$emit(\n\t\t\t\t\t'blur',{\n\t\t\t\t\t\t...event.detail,\n\t\t\t\t\t\tname: this.name,\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t},\n\t\t\t// 输入框值发生变化\n\t\t\tonInput(e) {\n\t\t\t\tconst {\n\t\t\t\t\tvalue = ''\n\t\t\t\t} = e.detail || {}\n\t\t\t\t// 为空返回\n\t\t\t\tif (value === '') return\n\t\t\t\tlet formatted = this.filter(value)\n\t\t\t\t// 最大允许的小数长度\n\t\t\t\tif (this.decimalLength !== null && formatted.indexOf('.') !== -1) {\n\t\t\t\t\tconst pair = formatted.split('.');\n\t\t\t\t\tformatted = `${pair[0]}.${pair[1].slice(0, this.decimalLength)}`\n\t\t\t\t}\n\t\t\t\tformatted = this.format(formatted)\n\t\t\t\tthis.emitChange(formatted);\n\t\t\t},\n\t\t\t// 发出change事件\n\t\t\temitChange(value) {\n\t\t\t\t// 如果开启了异步变更值，则不修改内部的值，需要用户手动在外部通过v-model变更\n\t\t\t\tif (!this.asyncChange) {\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.$emit('input', value)\n\t\t\t\t\t\tthis.currentValue = value\n\t\t\t\t\t\tthis.$forceUpdate()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tthis.$emit('change', {\n\t\t\t\t\tvalue,\n\t\t\t\t\tname: this.name,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonChange() {\n\t\t\t\tconst {\n\t\t\t\t\ttype\n\t\t\t\t} = this\n\t\t\t\tif (this.isDisabled(type)) {\n\t\t\t\t\treturn this.$emit('overlimit', type)\n\t\t\t\t}\n\t\t\t\tconst diff = type === 'minus' ? -this.step : +this.step\n\t\t\t\tconst value = this.format(this.add(+this.currentValue, diff))\n\t\t\t\tthis.emitChange(value)\n\t\t\t\tthis.$emit(type)\n\t\t\t},\n\t\t\t// 对值扩大后进行四舍五入，再除以扩大因子，避免出现浮点数操作的精度问题\n\t\t\tadd(num1, num2) {\n\t\t\t\tconst cardinal = Math.pow(10, 10);\n\t\t\t\treturn Math.round((num1 + num2) * cardinal) / cardinal\n\t\t\t},\n\t\t\t// 点击加减按钮\n\t\t\tclickHandler(type) {\n\t\t\t\tthis.type = type\n\t\t\t\tthis.onChange()\n\t\t\t},\n\t\t\tlongPressStep() {\n\t\t\t\t// 每隔一段时间，重新调用longPressStep方法，实现长按加减\n\t\t\t\tthis.clearTimeout()\n\t\t\t\tthis.longPressTimer = setTimeout(() => {\n\t\t\t\t\tthis.onChange()\n\t\t\t\t\tthis.longPressStep()\n\t\t\t\t}, 250);\n\t\t\t},\n\t\t\tonTouchStart(type) {\n\t\t\t\tif (!this.longPress) return\n\t\t\t\tthis.clearTimeout()\n\t\t\t\tthis.type = type\n\t\t\t\t// 一定时间后，默认达到长按状态\n\t\t\t\tthis.longPressTimer = setTimeout(() => {\n\t\t\t\t\tthis.onChange()\n\t\t\t\t\tthis.longPressStep()\n\t\t\t\t}, 600)\n\t\t\t},\n\t\t\t// 触摸结束，清除定时器，停止长按加减\n\t\t\tonTouchEnd() {\n\t\t\t\tif (!this.longPress) return\n\t\t\t\tthis.clearTimeout()\n\t\t\t},\n\t\t\t// 清除定时器\n\t\t\tclearTimeout() {\n\t\t\t\tclearTimeout(this.longPressTimer)\n\t\t\t\tthis.longPressTimer = null\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import '../../libs/css/components.scss';\n\n\t$u-numberBox-hover-bgColor: #E6E6E6 !default;\n\t$u-numberBox-disabled-color: #c8c9cc !default;\n\t$u-numberBox-disabled-bgColor: #f7f8fa !default;\n\t$u-numberBox-plus-radius: 4px !default;\n\t$u-numberBox-minus-radius: 4px !default;\n\t$u-numberBox-input-text-align: center !default;\n\t$u-numberBox-input-font-size: 15px !default;\n\t$u-numberBox-input-padding: 0 !default;\n\t$u-numberBox-input-margin: 0 2px !default;\n\t$u-numberBox-input-disabled-color: #c8c9cc !default;\n\t$u-numberBox-input-disabled-bgColor: #f2f3f5 !default;\n\n\t.u-number-box {\n\t\t@include flex(row);\n\t\talign-items: center;\n\n\t\t&__slot {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\ttouch-action: none;\n\t\t\t/* #endif */\n\t\t}\n\n\t\t&__plus,\n\t\t&__minus {\n\t\t\twidth: 35px;\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\ttouch-action: none;\n\t\t\t/* #endif */\n\n\t\t\t&--hover {\n\t\t\t\tbackground-color: $u-numberBox-hover-bgColor !important;\n\t\t\t}\n\n\t\t\t&--disabled {\n\t\t\t\tcolor: $u-numberBox-disabled-color;\n\t\t\t\tbackground-color: $u-numberBox-disabled-bgColor;\n\t\t\t}\n\t\t}\n\n\t\t&__plus {\n\t\t\tborder-top-right-radius: $u-numberBox-plus-radius;\n\t\t\tborder-bottom-right-radius: $u-numberBox-plus-radius;\n\t\t}\n\n\t\t&__minus {\n\t\t\tborder-top-left-radius: $u-numberBox-minus-radius;\n\t\t\tborder-bottom-left-radius: $u-numberBox-minus-radius;\n\t\t}\n\n\t\t&__input {\n\t\t\tposition: relative;\n\t\t\ttext-align: $u-numberBox-input-text-align;\n\t\t\tfont-size: $u-numberBox-input-font-size;\n\t\t\tpadding: $u-numberBox-input-padding;\n\t\t\tmargin: $u-numberBox-input-margin;\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\n\t\t\t&--disabled {\n\t\t\t\tcolor: $u-numberBox-input-disabled-color;\n\t\t\t\tbackground-color: $u-numberBox-input-disabled-bgColor;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-number-keyboard/props.js",
    "content": "export default {\n    props: {\n        // 键盘的类型，number-数字键盘，card-身份证键盘\n        mode: {\n            type: String,\n            default: uni.$u.props.numberKeyboard.value\n        },\n        // 是否显示键盘的\".\"符号\n        dotDisabled: {\n            type: Boolean,\n            default: uni.$u.props.numberKeyboard.dotDisabled\n        },\n        // 是否打乱键盘按键的顺序\n        random: {\n            type: Boolean,\n            default: uni.$u.props.numberKeyboard.random\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-keyboard\"\n\t\t@touchmove.stop.prevent=\"noop\"\n\t>\n\t\t<view\n\t\t\tclass=\"u-keyboard__button-wrapper\"\n\t\t\tv-for=\"(item, index) in numList\"\n\t\t\t:key=\"index\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-keyboard__button-wrapper__button\"\n\t\t\t\t:style=\"[itemStyle(index)]\"\n\t\t\t\t@tap=\"keyboardClick(item)\"\n\t\t\t\thover-class=\"u-hover-class\"\n\t\t\t\t:hover-stay-time=\"200\"\n\t\t\t>\n\t\t\t\t<text class=\"u-keyboard__button-wrapper__button__text\">{{ item }}</text>\n\t\t\t</view>\n\t\t</view>\n\t\t<view\n\t\t\tclass=\"u-keyboard__button-wrapper\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-keyboard__button-wrapper__button u-keyboard__button-wrapper__button--gray\"\n\t\t\t\thover-class=\"u-hover-class\"\n\t\t\t\t:hover-stay-time=\"200\"\n\t\t\t\t@touchstart.stop=\"backspaceClick\"\n\t\t\t\t@touchend=\"clearTimer\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t\tname=\"backspace\"\n\t\t\t\t\tcolor=\"#303133\"\n\t\t\t\t\tsize=\"28\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * keyboard 键盘组件\n\t * @description\n\t * @tutorial\n\t * @property {String}\tmode\t\t键盘的类型，number-数字键盘，card-身份证键盘\n\t * @property {Boolean}\tdotDisabled\t是否显示键盘的\".\"符号\n\t * @property {Boolean}\trandom\t\t是否打乱键盘按键的顺序\n\t * @event {Function} change\t\t点击键盘触发\n\t * @event {Function} backspace\t点击退格键触发\n\t * @example\n\t */\n\texport default {\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tbackspace: 'backspace', // 退格键内容\n\t\t\t\tdot: '.', // 点\n\t\t\t\ttimer: null, // 长按多次删除的事件监听\n\t\t\t\tcardX: 'X' // 身份证的X符号\n\t\t\t};\n\t\t},\n\t\tcomputed: {\n\t\t\t// 键盘需要显示的内容\n\t\t\tnumList() {\n\t\t\t\tlet tmp = [];\n\t\t\t\tif (this.dotDisabled && this.mode == 'number') {\n\t\t\t\t\tif (!this.random) {\n\t\t\t\t\t\treturn [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn uni.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);\n\t\t\t\t\t}\n\t\t\t\t} else if (!this.dotDisabled && this.mode == 'number') {\n\t\t\t\t\tif (!this.random) {\n\t\t\t\t\t\treturn [1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn uni.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0]);\n\t\t\t\t\t}\n\t\t\t\t} else if (this.mode == 'card') {\n\t\t\t\t\tif (!this.random) {\n\t\t\t\t\t\treturn [1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn uni.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 按键的样式，在非乱序&&数字键盘&&不显示点按钮时，index为9时，按键占位两个空间\n\t\t\titemStyle() {\n\t\t\t\treturn index => {\n\t\t\t\t\tlet style = {};\n\t\t\t\t\tif (this.mode == 'number' && this.dotDisabled && index == 9) style.width = '464rpx';\n\t\t\t\t\treturn style;\n\t\t\t\t};\n\t\t\t},\n\t\t\t// 是否让按键显示灰色，只在非乱序&&数字键盘&&且允许点按键的时候\n\t\t\tbtnBgGray() {\n\t\t\t\treturn index => {\n\t\t\t\t\tif (!this.random && index == 9 && (this.mode != 'number' || (this.mode == 'number' && !this\n\t\t\t\t\t\t\t.dotDisabled))) return true;\n\t\t\t\t\telse return false;\n\t\t\t\t};\n\t\t\t},\n\t\t},\n\t\tcreated() {\n\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击退格键\n\t\t\tbackspaceClick() {\n\t\t\t\tthis.$emit('backspace');\n\t\t\t\tclearInterval(this.timer); //再次清空定时器，防止重复注册定时器\n\t\t\t\tthis.timer = null;\n\t\t\t\tthis.timer = setInterval(() => {\n\t\t\t\t\tthis.$emit('backspace');\n\t\t\t\t}, 250);\n\t\t\t},\n\t\t\tclearTimer() {\n\t\t\t\tclearInterval(this.timer);\n\t\t\t\tthis.timer = null;\n\t\t\t},\n\t\t\t// 获取键盘显示的内容\n\t\t\tkeyboardClick(val) {\n\t\t\t\t// 允许键盘显示点模式和触发非点按键时，将内容转为数字类型\n\t\t\t\tif (!this.dotDisabled && val != this.dot && val != this.cardX) val = Number(val);\n\t\t\t\tthis.$emit('change', val);\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-number-keyboard-background-color:rgb(224, 228, 230) !default;\n\t$u-number-keyboard-padding:8px 10rpx 8px 10rpx !default;\n\t$u-number-keyboard-button-width:222rpx !default;\n\t$u-number-keyboard-button-margin:4px 6rpx !default;\n\t$u-number-keyboard-button-border-top-left-radius:4px !default;\n\t$u-number-keyboard-button-border-top-right-radius:4px !default;\n\t$u-number-keyboard-button-border-bottom-left-radius:4px !default;\n\t$u-number-keyboard-button-border-bottom-right-radius:4px !default;\n\t$u-number-keyboard-button-height: 90rpx!default;\n\t$u-number-keyboard-button-background-color:#FFFFFF !default;\n\t$u-number-keyboard-button-box-shadow:0 2px 0px #BBBCBE !default;\n\t$u-number-keyboard-text-font-size:20px !default;\n\t$u-number-keyboard-text-font-weight:500 !default;\n\t$u-number-keyboard-text-color:$u-main-color !default;\n\t$u-number-keyboard-gray-background-color:rgb(200, 202, 210) !default;\n\t$u-number-keyboard-u-hover-class-background-color: #BBBCC6 !default;\n\n\t.u-keyboard {\n\t\t@include flex;\n\t\tflex-direction: row;\n\t\tjustify-content: space-around;\n\t\tbackground-color: $u-number-keyboard-background-color;\n\t\tflex-wrap: wrap;\n\t\tpadding: $u-number-keyboard-padding;\n\n\t\t&__button-wrapper {\n\t\t\tbox-shadow: $u-number-keyboard-button-box-shadow;\n\t\t\tmargin: $u-number-keyboard-button-margin;\n\t\t\tborder-top-left-radius: $u-number-keyboard-button-border-top-left-radius;\n\t\t\tborder-top-right-radius: $u-number-keyboard-button-border-top-right-radius;\n\t\t\tborder-bottom-left-radius: $u-number-keyboard-button-border-bottom-left-radius;\n\t\t\tborder-bottom-right-radius: $u-number-keyboard-button-border-bottom-right-radius;\n\n\t\t\t&__button {\n\t\t\t\twidth: $u-number-keyboard-button-width;\n\t\t\t\theight: $u-number-keyboard-button-height;\n\t\t\t\tbackground-color: $u-number-keyboard-button-background-color;\n\t\t\t\t@include flex;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\t\t\t\tborder-top-left-radius: $u-number-keyboard-button-border-top-left-radius;\n\t\t\t\tborder-top-right-radius: $u-number-keyboard-button-border-top-right-radius;\n\t\t\t\tborder-bottom-left-radius: $u-number-keyboard-button-border-bottom-left-radius;\n\t\t\t\tborder-bottom-right-radius: $u-number-keyboard-button-border-bottom-right-radius;\n\n\t\t\t\t&__text {\n\t\t\t\t\tfont-size: $u-number-keyboard-text-font-size;\n\t\t\t\t\tfont-weight: $u-number-keyboard-text-font-weight;\n\t\t\t\t\tcolor: $u-number-keyboard-text-color;\n\t\t\t\t}\n\n\t\t\t\t&--gray {\n\t\t\t\t\tbackground-color: $u-number-keyboard-gray-background-color;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t.u-hover-class {\n\t\tbackground-color: $u-number-keyboard-u-hover-class-background-color;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-overlay/props.js",
    "content": "export default {\n    props: {\n        // 是否显示遮罩\n        show: {\n            type: Boolean,\n            default: uni.$u.props.overlay.show\n        },\n        // 层级z-index\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.overlay.zIndex\n        },\n        // 遮罩的过渡时间，单位为ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.overlay.duration\n        },\n        // 不透明度值，当做rgba的第四个参数\n        opacity: {\n            type: [String, Number],\n            default: uni.$u.props.overlay.opacity\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-overlay/u-overlay.vue",
    "content": "<template>\n\t<u-transition\n\t    :show=\"show\"\n\t    custom-class=\"u-overlay\"\n\t    :duration=\"duration\"\n\t    :custom-style=\"overlayStyle\"\n\t    @click=\"clickHandler\"\n\t>\n\t\t<slot />\n\t</u-transition>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * overlay 遮罩\n\t * @description 创建一个遮罩层，用于强调特定的页面元素，并阻止用户对遮罩下层的内容进行操作，一般用于弹窗场景\n\t * @tutorial https://www.uviewui.com/components/overlay.html\n\t * @property {Boolean}\t\t\tshow\t\t是否显示遮罩（默认 false ）\n\t * @property {String | Number}\tzIndex\t\tzIndex 层级（默认 10070 ）\n\t * @property {String | Number}\tduration\t动画时长，单位毫秒（默认 300 ）\n\t * @property {String | Number}\topacity\t\t不透明度值，当做rgba的第四个参数 （默认 0.5 ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * @event {Function} click 点击遮罩发送事件\n\t * @example <u-overlay :show=\"show\" @click=\"show = false\"></u-overlay>\n\t */\n\texport default {\n\t\tname: \"u-overlay\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\toverlayStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\tzIndex: this.zIndex,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\t'background-color': `rgba(0, 0, 0, ${this.opacity})`\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('click')\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n     $u-overlay-top:0 !default;\n     $u-overlay-left:0 !default;\n     $u-overlay-width:100% !default;\n     $u-overlay-height:100% !default;\n     $u-overlay-background-color:rgba(0, 0, 0, .7) !default;\n\t.u-overlay {\n\t\tposition: fixed;\n\t\ttop:$u-overlay-top;\n\t\tleft:$u-overlay-left;\n\t\twidth: $u-overlay-width;\n\t\theight:$u-overlay-height;\n\t\tbackground-color:$u-overlay-background-color;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-parse/node/node.vue",
    "content": "<template>\n  <view :id=\"attrs.id\" :class=\"'_'+name+' '+attrs.class\" :style=\"attrs.style\">\n    <block v-for=\"(n, i) in childs\" v-bind:key=\"i\">\n      <!-- 图片 -->\n      <!-- 占位图 -->\n      <image v-if=\"n.name=='img'&&((opts[1]&&!ctrl[i])||ctrl[i]<0)\" class=\"_img\" :style=\"n.attrs.style\" :src=\"ctrl[i]<0?opts[2]:opts[1]\" mode=\"widthFix\" />\n      <!-- 显示图片 -->\n      <!-- #ifdef H5 || APP-PLUS -->\n      <img v-if=\"n.name=='img'\" :id=\"n.attrs.id\" :class=\"'_img '+n.attrs.class\" :style=\"(ctrl[i]==-1?'display:none;':'')+n.attrs.style\" :src=\"n.attrs.src||(ctrl.load?n.attrs['data-src']:'')\" :data-i=\"i\" @load=\"imgLoad\" @error=\"mediaError\" @tap.stop=\"imgTap\" @longpress=\"imgLongTap\"/>\n      <!-- #endif -->\n      <!-- #ifndef H5 || APP-PLUS -->\n      <image v-if=\"n.name=='img'\" :id=\"n.attrs.id\" :class=\"'_img '+n.attrs.class\" :style=\"(ctrl[i]==-1?'display:none;':'')+'width:'+(ctrl[i]||1)+'px;height:1px;'+n.attrs.style\" :src=\"n.attrs.src\" :mode=\"n.h?'':'widthFix'\" :lazy-load=\"opts[0]\" :webp=\"n.webp\" :show-menu-by-longpress=\"opts[3]&&!n.attrs.ignore\" :image-menu-prevent=\"!opts[3]||n.attrs.ignore\" :data-i=\"i\" @load=\"imgLoad\" @error=\"mediaError\" @tap.stop=\"imgTap\" @longpress=\"imgLongTap\" />\n      <!-- #endif -->\n      <!-- 文本 -->\n      <!-- #ifndef MP-BAIDU -->\n      <text v-else-if=\"n.type=='text'\" decode>{{n.text}}</text>\n      <!-- #endif -->\n      <text v-else-if=\"n.name=='br'\">\\n</text>\n      <!-- 链接 -->\n      <view v-else-if=\"n.name=='a'\" :id=\"n.attrs.id\" :class=\"(n.attrs.href?'_a ':'')+n.attrs.class\" hover-class=\"_hover\" :style=\"'display:inline;'+n.attrs.style\" :data-i=\"i\" @tap.stop=\"linkTap\">\n        <node name=\"span\" :childs=\"n.children\" :opts=\"opts\" style=\"display:inherit\" />\n      </view>\n      <!-- 视频 -->\n      <!-- #ifdef APP-PLUS -->\n      <view v-else-if=\"n.html\" :id=\"n.attrs.id\" :class=\"'_video '+n.attrs.class\" :style=\"n.attrs.style\" v-html=\"n.html\" />\n      <!-- #endif -->\n      <!-- #ifndef APP-PLUS -->\n      <video v-else-if=\"n.name=='video'\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :autoplay=\"n.attrs.autoplay\" :controls=\"n.attrs.controls\" :loop=\"n.attrs.loop\" :muted=\"n.attrs.muted\" :poster=\"n.attrs.poster\" :src=\"n.src[ctrl[i]||0]\" :data-i=\"i\" @play=\"play\" @error=\"mediaError\" />\n      <!-- #endif -->\n      <!-- #ifdef H5 || APP-PLUS -->\n      <iframe v-else-if=\"n.name=='iframe'\" :style=\"n.attrs.style\" :allowfullscreen=\"n.attrs.allowfullscreen\" :frameborder=\"n.attrs.frameborder\" :src=\"n.attrs.src\" />\n      <embed v-else-if=\"n.name=='embed'\" :style=\"n.attrs.style\" :src=\"n.attrs.src\" />\n      <!-- #endif -->\n      <!-- #ifndef MP-TOUTIAO -->\n      <!-- 音频 -->\n      <audio v-else-if=\"n.name=='audio'\" :id=\"n.attrs.id\" :class=\"n.attrs.class\" :style=\"n.attrs.style\" :author=\"n.attrs.author\" :controls=\"n.attrs.controls\" :loop=\"n.attrs.loop\" :name=\"n.attrs.name\" :poster=\"n.attrs.poster\" :src=\"n.src[ctrl[i]||0]\" :data-i=\"i\" @play=\"play\" @error=\"mediaError\" />\n      <!-- #endif -->\n      <view v-else-if=\"(n.name=='table'&&n.c)||n.name=='li'\" :id=\"n.attrs.id\" :class=\"'_'+n.name+' '+n.attrs.class\" :style=\"n.attrs.style\">\n        <node v-if=\"n.name=='li'\" :childs=\"n.children\" :opts=\"opts\" />\n        <view v-else v-for=\"(tbody, x) in n.children\" v-bind:key=\"x\" :class=\"'_'+tbody.name+' '+tbody.attrs.class\" :style=\"tbody.attrs.style\">\n          <node v-if=\"tbody.name=='td'||tbody.name=='th'\" :childs=\"tbody.children\" :opts=\"opts\" />\n          <block v-else v-for=\"(tr, y) in tbody.children\" v-bind:key=\"y\">\n            <view v-if=\"tr.name=='td'||tr.name=='th'\" :class=\"'_'+tr.name+' '+tr.attrs.class\" :style=\"tr.attrs.style\">\n              <node :childs=\"tr.children\" :opts=\"opts\" />\n            </view>\n            <view v-else :class=\"'_'+tr.name+' '+tr.attrs.class\" :style=\"tr.attrs.style\">\n              <view v-for=\"(td, z) in tr.children\" v-bind:key=\"z\" :class=\"'_'+td.name+' '+td.attrs.class\" :style=\"td.attrs.style\">\n                <node :childs=\"td.children\" :opts=\"opts\" />\n              </view>\n            </view>\n          </block>\n        </view>\n      </view>\n      \n      <!-- 富文本 -->\n      <!-- #ifdef H5 || MP-WEIXIN || MP-QQ || APP-PLUS || MP-360 -->\n      <rich-text v-else-if=\"handler.use(n)\" :id=\"n.attrs.id\" :style=\"n.f\" :nodes=\"[n]\" />\n      <!-- #endif -->\n      <!-- #ifndef H5 || MP-WEIXIN || MP-QQ || APP-PLUS || MP-360 -->\n      <rich-text v-else-if=\"!n.c\" :id=\"n.attrs.id\" :style=\"n.f+';display:inline'\" :preview=\"false\" :nodes=\"[n]\" />\n      <!-- #endif -->\n      <!-- 继续递归 -->\n      <view v-else-if=\"n.c==2\" :id=\"n.attrs.id\" :class=\"'_'+n.name+' '+n.attrs.class\" :style=\"n.f+';'+n.attrs.style\">\n        <node v-for=\"(n2, j) in n.children\" v-bind:key=\"j\" :style=\"n2.f\" :name=\"n2.name\" :attrs=\"n2.attrs\" :childs=\"n2.children\" :opts=\"opts\" />\n      </view>\n      <node v-else :style=\"n.f\" :name=\"n.name\" :attrs=\"n.attrs\" :childs=\"n.children\" :opts=\"opts\" />\n    </block>\n  </view>\n</template>\n<script module=\"handler\" lang=\"wxs\">\n// 行内标签列表\nvar inlineTags = {\n  abbr: true,\n  b: true,\n  big: true,\n  code: true,\n  del: true,\n  em: true,\n  i: true,\n  ins: true,\n  label: true,\n  q: true,\n  small: true,\n  span: true,\n  strong: true,\n  sub: true,\n  sup: true\n}\n/**\n * @description 是否使用 rich-text 显示剩余内容\n */\nmodule.exports = {\n  use: function (item) {\n  // 微信和 QQ 的 rich-text inline 布局无效\n  if (inlineTags[item.name] || (item.attrs.style || '').indexOf('display:inline') != -1)\n    return false\n  return !item.c\n  }\n}\n</script>\n<script>\n\nimport node from './node'\nexport default {\n  name: 'node',\n  // #ifdef MP-WEIXIN\n  options: {\n    virtualHost: true\n  },\n  // #endif\n  data() {\n    return {\n      ctrl: {}\n    }\n  },\n  props: {\n    name: String,\n    attrs: {\n      type: Object,\n      default() {\n        return {}\n      }\n    },\n    childs: Array,\n    opts: Array\n  },\n  components: {\n\n    node\n  },\n  mounted() {\n    for (this.root = this.$parent; this.root.$options.name != 'mp-html'; this.root = this.root.$parent);\n    // #ifdef H5 || APP-PLUS\n    if (this.opts[0]) {\n      for (var i = this.childs.length; i--;)\n        if (this.childs[i].name == 'img')\n          break\n      if (i != -1) {\n        this.observer = uni.createIntersectionObserver(this).relativeToViewport({\n          top: 500,\n          bottom: 500\n        })\n        this.observer.observe('._img', res => {\n          if (res.intersectionRatio) {\n            this.$set(this.ctrl, 'load', 1)\n            this.observer.disconnect()\n          }\n        })\n      }\n    }\n    // #endif\n  },\n  beforeDestroy() {\n    // #ifdef H5 || APP-PLUS\n    if (this.observer)\n      this.observer.disconnect()\n    // #endif\n  },\n  methods:{\n    // #ifdef MP-WEIXIN\n    toJSON() { },\n    // #endif\n    /**\n     * @description 播放视频事件\n     * @param {Event} e \n     */\n    play(e) {\n      // #ifndef APP-PLUS\n      if (this.root.pauseVideo) {\n        var flag = false, id = e.target.id\n        for (var i = this.root._videos.length; i--;) {\n          if (this.root._videos[i].id == id)\n            flag = true\n          else\n            this.root._videos[i].pause() // 自动暂停其他视频\n        }\n        // 将自己加入列表\n        if (!flag) {\n          var ctx = uni.createVideoContext(id\n            // #ifndef MP-BAIDU\n            , this\n            // #endif\n          )\n          ctx.id = id\n          this.root._videos.push(ctx)\n        }\n      }\n      // #endif\n    },\n\n    /**\n     * @description 图片点击事件\n     * @param {Event} e \n     */\n    imgTap(e) {\n      var node = this.childs[e.currentTarget.dataset.i]\n      if (node.a)\n        return this.linkTap(node.a)\n      if (node.attrs.ignore)\n        return\n      // #ifdef H5 || APP-PLUS\n      node.attrs.src = node.attrs.src || node.attrs['data-src']\n      // #endif\n      this.root.$emit('imgTap', node.attrs)\n      // 自动预览图片\n      if (this.root.previewImg)\n        uni.previewImage({\n          current: parseInt(node.attrs.i),\n          urls: this.root.imgList\n        })\n    },\n\n    /**\n     * @description 图片长按\n     */\n    imgLongTap(e) {\n      // #ifdef APP-PLUS\n      var attrs = this.childs[e.currentTarget.dataset.i].attrs\n      if (!attrs.ignore)\n        uni.showActionSheet({\n          itemList: ['保存图片'],\n          success: () => {\n            uni.downloadFile({\n              url: this.root.imgList[attrs.i],\n              success: res => {\n                uni.saveImageToPhotosAlbum({\n                  filePath: res.tempFilePath,\n                  success() {\n                    uni.showToast({\n                      title: '保存成功'\n                    })\n                  }\n                })\n              }\n            })\n          }\n        })\n      // #endif\n    },\n\n    /**\n     * @description 图片加载完成事件\n     * @param {Event} e \n     */\n    imgLoad(e) {\n      var i = e.currentTarget.dataset.i\n      // #ifndef H5 || APP-PLUS\n      // 设置原宽度\n      if (!this.childs[i].w)\n        this.$set(this.ctrl, i, e.detail.width)\n      else\n        // #endif\n        // 加载完毕，取消加载中占位图\n        if ((this.opts[1] && !this.ctrl[i]) || this.ctrl[i] == -1)\n          this.$set(this.ctrl, i, 1)\n    },\n\n    /**\n     * @description 链接点击事件\n     * @param {Event} e \n     */\n    linkTap(e) {\n      var attrs = e.currentTarget ? this.childs[e.currentTarget.dataset.i].attrs : e,\n        href = attrs.href\n      this.root.$emit('linkTap', attrs)\n      if (href) {\n        // 跳转锚点\n        if (href[0] == '#')\n          this.root.navigateTo(href.substring(1)).catch(() => { })\n        // 复制外部链接\n        else if (href.includes('://')) {\n          if (this.root.copyLink) {\n            // #ifdef H5\n            window.open(href)\n            // #endif\n            // #ifdef MP\n            uni.setClipboardData({\n              data: href,\n              success: () =>\n                uni.showToast({\n                  title: '链接已复制'\n                })\n            })\n            // #endif\n            // #ifdef APP-PLUS\n            plus.runtime.openWeb(href)\n            // #endif\n          }\n        }\n        // 跳转页面\n        else\n          uni.navigateTo({\n            url: href,\n            fail() {\n              uni.switchTab({\n                url: href,\n                fail() { }\n              })\n            }\n          })\n      }\n    },\n\n    /**\n     * @description 错误事件\n     * @param {Event} e \n     */\n    mediaError(e) {\n      var i = e.currentTarget.dataset.i,\n        node = this.childs[i]\n      // 加载其他源\n      if (node.name == 'video' || node.name == 'audio') {\n        var index = (this.ctrl[i] || 0) + 1\n        if (index > node.src.length)\n          index = 0\n        if (index < node.src.length)\n          return this.$set(this.ctrl, i, index)\n      }\n      // 显示错误占位图\n      else if (node.name == 'img' && this.opts[2])\n        this.$set(this.ctrl, i, -1)\n      if (this.root)\n        this.root.$emit('error', {\n          source: node.name,\n          attrs: node.attrs,\n          errMsg: e.detail.errMsg\n        })\n    }\n  }\n}\n</script>\n<style>\n/* a 标签默认效果 */\n._a {\n  padding: 1.5px 0 1.5px 0;\n  color: #366092;\n  word-break: break-all;\n}\n\n/* a 标签点击态效果 */\n._hover {\n  text-decoration: underline;\n  opacity: 0.7;\n}\n\n/* 图片默认效果 */\n._img {\n  max-width: 100%;\n  -webkit-touch-callout: none;\n}\n\n/* 内部样式 */\n\n._b,\n._strong {\n  font-weight: bold;\n}\n\n._code {\n  font-family: monospace;\n}\n\n._del {\n  text-decoration: line-through;\n}\n\n._em,\n._i {\n  font-style: italic;\n}\n\n._h1 {\n  font-size: 2em;\n}\n\n._h2 {\n  font-size: 1.5em;\n}\n\n._h3 {\n  font-size: 1.17em;\n}\n\n._h5 {\n  font-size: 0.83em;\n}\n\n._h6 {\n  font-size: 0.67em;\n}\n\n._h1,\n._h2,\n._h3,\n._h4,\n._h5,\n._h6 {\n  display: block;\n  font-weight: bold;\n}\n\n._image {\n  height: 1px;\n}\n\n._ins {\n  text-decoration: underline;\n}\n\n._li {\n  display: list-item;\n}\n\n._ol {\n  list-style-type: decimal;\n}\n\n._ol,\n._ul {\n  display: block;\n  padding-left: 40px;\n  margin: 1em 0;\n}\n\n._q::before {\n  content: '\"';\n}\n\n._q::after {\n  content: '\"';\n}\n\n._sub {\n  font-size: smaller;\n  vertical-align: sub;\n}\n\n._sup {\n  font-size: smaller;\n  vertical-align: super;\n}\n\n._thead,\n._tbody,\n._tfoot {\n  display: table-row-group;\n}\n\n._tr {\n  display: table-row;\n}\n\n._td,\n._th {\n  display: table-cell;\n  vertical-align: middle;\n}\n\n._th {\n  font-weight: bold;\n  text-align: center;\n}\n\n._ul {\n  list-style-type: disc;\n}\n\n._ul ._ul {\n  margin: 0;\n  list-style-type: circle;\n}\n\n._ul ._ul ._ul {\n  list-style-type: square;\n}\n\n._abbr,\n._b,\n._code,\n._del,\n._em,\n._i,\n._ins,\n._label,\n._q,\n._span,\n._strong,\n._sub,\n._sup {\n  display: inline;\n}\n\n/* #ifdef APP-PLUS */\n._video {\n  width: 300px;\n  height: 225px;\n}\n/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-parse/parser.js",
    "content": "'use strict'\n\n/**\n * @fileoverview html 解析器\n */\n// 配置\nconst config = {\n    // 信任的标签（保持标签名不变）\n    trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),\n    // 块级标签（转为 div，其他的非信任标签转为 span）\n    blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),\n    // 要移除的标签\n    ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'),\n    // 自闭合的标签\n    voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),\n    // html 实体\n    entities: {\n        lt: '<',\n        gt: '>',\n        quot: '\"',\n        apos: \"'\",\n        ensp: '\\u2002',\n        emsp: '\\u2003',\n        nbsp: '\\xA0',\n        semi: ';',\n        ndash: '–',\n        mdash: '—',\n        middot: '·',\n        lsquo: '‘',\n        rsquo: '’',\n        ldquo: '“',\n        rdquo: '”',\n        bull: '•',\n        hellip: '…'\n    },\n    // 默认的标签样式\n    tagStyle: {\n    // #ifndef APP-PLUS-NVUE\n        address: 'font-style:italic',\n        big: 'display:inline;font-size:1.2em',\n        caption: 'display:table-caption;text-align:center',\n        center: 'text-align:center',\n        cite: 'font-style:italic',\n        dd: 'margin-left:40px',\n        mark: 'background-color:yellow',\n        pre: 'font-family:monospace;white-space:pre',\n        s: 'text-decoration:line-through',\n        small: 'display:inline;font-size:0.8em',\n        u: 'text-decoration:underline' // #endif\n\n    }\n}\nconst { windowWidth } = uni.getSystemInfoSync()\nconst blankChar = makeMap(' ,\\r,\\n,\\t,\\f')\nlet idIndex = 0 // #ifdef H5 || APP-PLUS\n\nconfig.ignoreTags.iframe = void 0\nconfig.trustTags.iframe = true\nconfig.ignoreTags.embed = void 0\nconfig.trustTags.embed = true // #endif\n// #ifdef APP-PLUS-NVUE\n\nconfig.ignoreTags.source = void 0\nconfig.ignoreTags.style = void 0 // #endif\n\n/**\n * @description 创建 map\n * @param {String} str 逗号分隔\n */\n\nfunction makeMap(str) {\n    const map = Object.create(null)\n    const list = str.split(',')\n\n    for (let i = list.length; i--;) {\n        map[list[i]] = true\n    }\n\n    return map\n}\n/**\n * @description 解码 html 实体\n * @param {String} str 要解码的字符串\n * @param {Boolean} amp 要不要解码 &amp;\n * @returns {String} 解码后的字符串\n */\n\nfunction decodeEntity(str, amp) {\n    let i = str.indexOf('&')\n\n    while (i != -1) {\n        const j = str.indexOf(';', i + 3)\n        let code = void 0\n        if (j == -1) break\n\n        if (str[i + 1] == '#') {\n            // &#123; 形式的实体\n            code = parseInt((str[i + 2] == 'x' ? '0' : '') + str.substring(i + 2, j))\n            if (!isNaN(code)) str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1)\n        } else {\n            // &nbsp; 形式的实体\n            code = str.substring(i + 1, j)\n            if (config.entities[code] || code == 'amp' && amp) str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1)\n        }\n\n        i = str.indexOf('&', i + 1)\n    }\n\n    return str\n}\n/**\n * @description html 解析器\n * @param {Object} vm 组件实例\n */\n\nfunction parser(vm) {\n    this.options = vm || {}\n    this.tagStyle = Object.assign(config.tagStyle, this.options.tagStyle)\n    this.imgList = vm.imgList || []\n    this.plugins = vm.plugins || []\n    this.attrs = Object.create(null)\n    this.stack = []\n    this.nodes = []\n}\n/**\n * @description 执行解析\n * @param {String} content 要解析的文本\n */\n\nparser.prototype.parse = function (content) {\n    // 插件处理\n    for (let i = this.plugins.length; i--;) {\n        if (this.plugins[i].onUpdate) content = this.plugins[i].onUpdate(content, config) || content\n    }\n\n    new lexer(this).parse(content) // 出栈未闭合的标签\n\n    while (this.stack.length) {\n        this.popNode()\n    }\n\n    return this.nodes\n}\n/**\n * @description 将标签暴露出来（不被 rich-text 包含）\n */\n\nparser.prototype.expose = function () {\n    // #ifndef APP-PLUS-NVUE\n    for (let i = this.stack.length; i--;) {\n        const item = this.stack[i]\n        if (item.name == 'a' || item.c) return\n        item.c = 1\n    } // #endif\n}\n/**\n * @description 处理插件\n * @param {Object} node 要处理的标签\n * @returns {Boolean} 是否要移除此标签\n */\n\nparser.prototype.hook = function (node) {\n    for (let i = this.plugins.length; i--;) {\n        if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) == false) return false\n    }\n\n    return true\n}\n/**\n * @description 将链接拼接上主域名\n * @param {String} url 需要拼接的链接\n * @returns {String} 拼接后的链接\n */\n\nparser.prototype.getUrl = function (url) {\n    const { domain } = this.options\n\n    if (url[0] == '/') {\n    // // 开头的补充协议名\n        if (url[1] == '/') url = `${domain ? domain.split('://')[0] : 'http'}:${url}` // 否则补充整个域名\n        else if (domain) url = domain + url\n    } else if (domain && !url.includes('data:') && !url.includes('://')) url = `${domain}/${url}`\n\n    return url\n}\n/**\n * @description 解析样式表\n * @param {Object} node 标签\n * @returns {Object}\n */\n\nparser.prototype.parseStyle = function (node) {\n    const { attrs } = node\n    const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';'))\n    const styleObj = {}\n    let tmp = ''\n\n    if (attrs.id) {\n    // 暴露锚点\n        if (this.options.useAnchor) this.expose(); else if (node.name != 'img' && node.name != 'a' && node.name != 'video' && node.name != 'audio') attrs.id = void 0\n    } // 转换 width 和 height 属性\n\n    if (attrs.width) {\n        styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px')\n        attrs.width = void 0\n    }\n\n    if (attrs.height) {\n        styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px')\n        attrs.height = void 0\n    }\n\n    for (let i = 0, len = list.length; i < len; i++) {\n        const info = list[i].split(':')\n        if (info.length < 2) continue\n        const key = info.shift().trim().toLowerCase()\n        let value = info.join(':').trim() // 兼容性的 css 不压缩\n\n        if (value[0] == '-' && value.lastIndexOf('-') > 0 || value.includes('safe')) tmp += ';'.concat(key, ':').concat(value) // 重复的样式进行覆盖\n        else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) {\n        // 填充链接\n            if (value.includes('url')) {\n                let j = value.indexOf('(') + 1\n\n                if (j) {\n                    while (value[j] == '\"' || value[j] == \"'\" || blankChar[value[j]]) {\n                        j++\n                    }\n\n                    value = value.substr(0, j) + this.getUrl(value.substr(j))\n                }\n            } // 转换 rpx（rich-text 内部不支持 rpx）\n            else if (value.includes('rpx')) {\n                value = value.replace(/[0-9.]+\\s*rpx/g, ($) => `${parseFloat($) * windowWidth / 750}px`)\n            }\n\n            styleObj[key] = value\n        }\n    }\n\n    node.attrs.style = tmp\n    return styleObj\n}\n/**\n * @description 解析到标签名\n * @param {String} name 标签名\n * @private\n */\n\nparser.prototype.onTagName = function (name) {\n    this.tagName = this.xml ? name : name.toLowerCase()\n    if (this.tagName == 'svg') this.xml = true // svg 标签内大小写敏感\n}\n/**\n * @description 解析到属性名\n * @param {String} name 属性名\n * @private\n */\n\nparser.prototype.onAttrName = function (name) {\n    name = this.xml ? name : name.toLowerCase()\n\n    if (name.substr(0, 5) == 'data-') {\n    // data-src 自动转为 src\n        if (name == 'data-src' && !this.attrs.src) this.attrName = 'src' // a 和 img 标签保留 data- 的属性，可以在 imgtap 和 linktap 事件中使用\n        else if (this.tagName == 'img' || this.tagName == 'a') this.attrName = name // 剩余的移除以减小大小\n        else this.attrName = void 0\n    } else {\n        this.attrName = name\n        this.attrs[name] = 'T' // boolean 型属性缺省设置\n    }\n}\n/**\n * @description 解析到属性值\n * @param {String} val 属性值\n * @private\n */\n\nparser.prototype.onAttrVal = function (val) {\n    const name = this.attrName || '' // 部分属性进行实体解码\n\n    if (name == 'style' || name == 'href') this.attrs[name] = decodeEntity(val, true) // 拼接主域名\n    else if (name.includes('src')) this.attrs[name] = this.getUrl(decodeEntity(val, true)); else if (name) this.attrs[name] = val\n}\n/**\n * @description 解析到标签开始\n * @param {Boolean} selfClose 是否有自闭合标识 />\n * @private\n */\n\nparser.prototype.onOpenTag = function (selfClose) {\n    // 拼装 node\n    const node = Object.create(null)\n    node.name = this.tagName\n    node.attrs = this.attrs\n    this.attrs = Object.create(null)\n    const { attrs } = node\n    const parent = this.stack[this.stack.length - 1]\n    const siblings = parent ? parent.children : this.nodes\n    const close = this.xml ? selfClose : config.voidTags[node.name] // 转换 embed 标签\n\n    if (node.name == 'embed') {\n    // #ifndef H5 || APP-PLUS\n        const src = attrs.src || '' // 按照后缀名和 type 将 embed 转为 video 或 audio\n\n        if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) node.name = 'video'; else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) node.name = 'audio'\n        if (attrs.autostart) attrs.autoplay = 'T'\n        attrs.controls = 'T' // #endif\n        // #ifdef H5 || APP-PLUS\n\n        this.expose() // #endif\n    } // #ifndef APP-PLUS-NVUE\n    // 处理音视频\n\n    if (node.name == 'video' || node.name == 'audio') {\n    // 设置 id 以便获取 context\n        if (node.name == 'video' && !attrs.id) attrs.id = `v${idIndex++}` // 没有设置 controls 也没有设置 autoplay 的自动设置 controls\n\n        if (!attrs.controls && !attrs.autoplay) attrs.controls = 'T' // 用数组存储所有可用的 source\n\n        node.src = []\n\n        if (attrs.src) {\n            node.src.push(attrs.src)\n            attrs.src = void 0\n        }\n\n        this.expose()\n    } // #endif\n    // 处理自闭合标签\n\n    if (close) {\n        if (!this.hook(node) || config.ignoreTags[node.name]) {\n            // 通过 base 标签设置主域名\n            if (node.name == 'base' && !this.options.domain) this.options.domain = attrs.href // #ifndef APP-PLUS-NVUE\n            // 设置 source 标签（仅父节点为 video 或 audio 时有效）\n            else if (node.name == 'source' && parent && (parent.name == 'video' || parent.name == 'audio') && attrs.src) parent.src.push(attrs.src) // #endif\n\n            return\n        } // 解析 style\n\n        const styleObj = this.parseStyle(node) // 处理图片\n\n        if (node.name == 'img') {\n            if (attrs.src) {\n                // 标记 webp\n                if (attrs.src.includes('webp')) node.webp = 'T' // data url 图片如果没有设置 original-src 默认为不可预览的小图片\n\n                if (attrs.src.includes('data:') && !attrs['original-src']) attrs.ignore = 'T'\n\n                if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) {\n                    for (let i = this.stack.length; i--;) {\n                        const item = this.stack[i]\n\n                        if (item.name == 'a') {\n                            node.a = item.attrs\n                            break\n                        } // #ifndef H5 || APP-PLUS\n\n                        const style = item.attrs.style || ''\n\n                        if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || !styleObj.width.includes('%'))) {\n                            styleObj.width = '100% !important'\n                            styleObj.height = ''\n\n                            for (let j = i + 1; j < this.stack.length; j++) {\n                                this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '')\n                            }\n                        } else if (style.includes('flex') && styleObj.width == '100%') {\n                            for (let _j = i + 1; _j < this.stack.length; _j++) {\n                                const _style = this.stack[_j].attrs.style || ''\n\n                                if (!_style.includes(';width') && !_style.includes(' width') && _style.indexOf('width') != 0) {\n                                    styleObj.width = ''\n                                    break\n                                }\n                            }\n                        } else if (style.includes('inline-block')) {\n                            if (styleObj.width && styleObj.width[styleObj.width.length - 1] == '%') {\n                                item.attrs.style += `;max-width:${styleObj.width}`\n                                styleObj.width = ''\n                            } else item.attrs.style += ';max-width:100%'\n                        } // #endif\n\n                        item.c = 1\n                    }\n\n                    attrs.i = this.imgList.length.toString()\n\n                    let _src = attrs['original-src'] || attrs.src // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360\n\n                    if (this.imgList.includes(_src)) {\n                        // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位\n                        let _i = _src.indexOf('://')\n\n                        if (_i != -1) {\n                            _i += 3\n\n                            let newSrc = _src.substr(0, _i)\n\n                            for (; _i < _src.length; _i++) {\n                                if (_src[_i] == '/') break\n                                newSrc += Math.random() > 0.5 ? _src[_i].toUpperCase() : _src[_i]\n                            }\n\n                            newSrc += _src.substr(_i)\n                            _src = newSrc\n                        }\n                    } // #endif\n\n                    this.imgList.push(_src) // #ifdef H5 || APP-PLUS\n\n                    if (this.options.lazyLoad) {\n                        attrs['data-src'] = attrs.src\n                        attrs.src = void 0\n                    } // #endif\n                }\n            }\n\n            if (styleObj.display == 'inline') styleObj.display = '' // #ifndef APP-PLUS-NVUE\n\n            if (attrs.ignore) {\n                styleObj['max-width'] = styleObj['max-width'] || '100%'\n                attrs.style += ';-webkit-touch-callout:none'\n            } // #endif\n            // 设置的宽度超出屏幕，为避免变形，高度转为自动\n\n            if (parseInt(styleObj.width) > windowWidth) styleObj.height = void 0 // 记录是否设置了宽高\n\n            if (styleObj.width) {\n                if (styleObj.width.includes('auto')) styleObj.width = ''; else {\n                    node.w = 'T'\n                    if (styleObj.height && !styleObj.height.includes('auto')) node.h = 'T'\n                }\n            }\n        } else if (node.name == 'svg') {\n            siblings.push(node)\n            this.stack.push(node)\n            this.popNode()\n            return\n        }\n\n        for (const key in styleObj) {\n            if (styleObj[key]) attrs.style += ';'.concat(key, ':').concat(styleObj[key].replace(' !important', ''))\n        }\n\n        attrs.style = attrs.style.substr(1) || void 0\n    } else {\n        if (node.name == 'pre' || (attrs.style || '').includes('white-space') && attrs.style.includes('pre')) this.pre = node.pre = true\n        node.children = []\n        this.stack.push(node)\n    } // 加入节点树\n\n    siblings.push(node)\n}\n/**\n * @description 解析到标签结束\n * @param {String} name 标签名\n * @private\n */\n\nparser.prototype.onCloseTag = function (name) {\n    // 依次出栈到匹配为止\n    name = this.xml ? name : name.toLowerCase()\n    let i\n\n    for (i = this.stack.length; i--;) {\n        if (this.stack[i].name == name) break\n    }\n\n    if (i != -1) {\n        while (this.stack.length > i) {\n            this.popNode()\n        }\n    } else if (name == 'p' || name == 'br') {\n        const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes\n        siblings.push({\n            name,\n            attrs: {}\n        })\n    }\n}\n/**\n * @description 处理标签出栈\n * @private\n */\n\nparser.prototype.popNode = function () {\n    const node = this.stack.pop()\n    let { attrs } = node\n    const { children } = node\n    const parent = this.stack[this.stack.length - 1]\n    const siblings = parent ? parent.children : this.nodes\n\n    if (!this.hook(node) || config.ignoreTags[node.name]) {\n    // 获取标题\n        if (node.name == 'title' && children.length && children[0].type == 'text' && this.options.setTitle) {\n            uni.setNavigationBarTitle({\n                title: children[0].text\n            })\n        }\n        siblings.pop()\n        return\n    }\n\n    if (node.pre) {\n    // 是否合并空白符标识\n        node.pre = this.pre = void 0\n\n        for (let i = this.stack.length; i--;) {\n            if (this.stack[i].pre) this.pre = true\n        }\n    }\n\n    const styleObj = {} // 转换 svg\n\n    if (node.name == 'svg') {\n    // #ifndef APP-PLUS-NVUE\n        let src = ''\n        const { style } = attrs\n        attrs.style = ''\n        attrs.xmlns = 'http://www.w3.org/2000/svg';\n\n        (function traversal(node) {\n            src += `<${node.name}`\n\n            for (let item in node.attrs) {\n                const val = node.attrs[item]\n\n                if (val) {\n                    if (item == 'viewbox') item = 'viewBox'\n                    src += ' '.concat(item, '=\"').concat(val, '\"')\n                }\n            }\n\n            if (!node.children) src += '/>'; else {\n                src += '>'\n\n                for (let _i2 = 0; _i2 < node.children.length; _i2++) {\n                    traversal(node.children[_i2])\n                }\n\n                src += `</${node.name}>`\n            }\n        }(node))\n\n        node.name = 'img'\n        node.attrs = {\n            src: `data:image/svg+xml;utf8,${src.replace(/#/g, '%23')}`,\n            style,\n            ignore: 'T'\n        }\n        node.children = void 0 // #endif\n\n        this.xml = false\n        return\n    } // #ifndef APP-PLUS-NVUE\n    // 转换 align 属性\n\n    if (attrs.align) {\n        if (node.name == 'table') {\n            if (attrs.align == 'center') styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto'; else styleObj.float = attrs.align\n        } else styleObj['text-align'] = attrs.align\n\n        attrs.align = void 0\n    } // 转换 font 标签的属性\n\n    if (node.name == 'font') {\n        if (attrs.color) {\n            styleObj.color = attrs.color\n            attrs.color = void 0\n        }\n\n        if (attrs.face) {\n            styleObj['font-family'] = attrs.face\n            attrs.face = void 0\n        }\n\n        if (attrs.size) {\n            let size = parseInt(attrs.size)\n\n            if (!isNaN(size)) {\n                if (size < 1) size = 1; else if (size > 7) size = 7\n                styleObj['font-size'] = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'][size - 1]\n            }\n\n            attrs.size = void 0\n        }\n    } // #endif\n    // 一些编辑器的自带 class\n\n    if ((attrs.class || '').includes('align-center')) styleObj['text-align'] = 'center'\n    Object.assign(styleObj, this.parseStyle(node))\n\n    if (parseInt(styleObj.width) > windowWidth) {\n        styleObj['max-width'] = '100%'\n        styleObj['box-sizing'] = 'border-box'\n    } // #ifndef APP-PLUS-NVUE\n\n    if (config.blockTags[node.name]) node.name = 'div' // 未知标签转为 span，避免无法显示\n    else if (!config.trustTags[node.name] && !this.xml) node.name = 'span'\n    if (node.name == 'a' || node.name == 'ad' // #ifdef H5 || APP-PLUS\n  || node.name == 'iframe' // #endif\n    ) this.expose() // #ifdef APP-PLUS\n    else if (node.name == 'video') {\n        let str = '<video style=\"width:100%;height:100%\"' // 空白图占位\n\n        if (!attrs.poster && !attrs.autoplay) attrs.poster = \"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'/>\"\n\n        for (const item in attrs) {\n            if (attrs[item]) str += ` ${item}=\"${attrs[item]}\"`\n        }\n\n        if (this.options.pauseVideo) str += ' onplay=\"for(var e=document.getElementsByTagName(\\'video\\'),t=0;t<e.length;t++)e[t]!=this&&e[t].pause()\"'\n        str += '>'\n\n        for (let _i3 = 0; _i3 < node.src.length; _i3++) {\n            str += `<source src=\"${node.src[_i3]}\">`\n        }\n\n        str += '</video>'\n        node.html = str\n    } // #endif\n    // 列表处理\n    else if ((node.name == 'ul' || node.name == 'ol') && node.c) {\n        const types = {\n            a: 'lower-alpha',\n            A: 'upper-alpha',\n            i: 'lower-roman',\n            I: 'upper-roman'\n        }\n\n        if (types[attrs.type]) {\n            attrs.style += `;list-style-type:${types[attrs.type]}`\n            attrs.type = void 0\n        }\n\n        for (let _i4 = children.length; _i4--;) {\n            if (children[_i4].name == 'li') children[_i4].c = 1\n        }\n    } // 表格处理\n    else if (node.name == 'table') {\n        // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现\n        let padding = parseFloat(attrs.cellpadding)\n        let spacing = parseFloat(attrs.cellspacing)\n        const border = parseFloat(attrs.border)\n\n        if (node.c) {\n            // padding 和 spacing 默认 2\n            if (isNaN(padding)) padding = 2\n            if (isNaN(spacing)) spacing = 2\n        }\n\n        if (border) attrs.style += `;border:${border}px solid gray`\n\n        if (node.flag && node.c) {\n            // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现\n            styleObj.display = 'grid'\n\n            if (spacing) {\n                styleObj['grid-gap'] = `${spacing}px`\n                styleObj.padding = `${spacing}px`\n            } // 无间隔的情况下避免边框重叠\n            else if (border) attrs.style += ';border-left:0;border-top:0'\n\n            const width = []\n            // 表格的列宽\n            const trList = []\n            // tr 列表\n            const cells = []\n            // 保存新的单元格\n            const map = {}; // 被合并单元格占用的格子\n\n            (function traversal(nodes) {\n                for (let _i5 = 0; _i5 < nodes.length; _i5++) {\n                    if (nodes[_i5].name == 'tr') trList.push(nodes[_i5]); else traversal(nodes[_i5].children || [])\n                }\n            }(children))\n\n            for (let row = 1; row <= trList.length; row++) {\n                let col = 1\n\n                for (let j = 0; j < trList[row - 1].children.length; j++, col++) {\n                    const td = trList[row - 1].children[j]\n\n                    if (td.name == 'td' || td.name == 'th') {\n                        // 这个格子被上面的单元格占用，则列号++\n                        while (map[`${row}.${col}`]) {\n                            col++\n                        }\n\n                        let _style2 = td.attrs.style || ''\n                        const start = _style2.indexOf('width') ? _style2.indexOf(';width') : 0 // 提取出 td 的宽度\n\n                        if (start != -1) {\n                            let end = _style2.indexOf(';', start + 6)\n\n                            if (end == -1) end = _style2.length\n                            if (!td.attrs.colspan) width[col] = _style2.substring(start ? start + 7 : 6, end)\n                            _style2 = _style2.substr(0, start) + _style2.substr(end)\n                        }\n\n                        _style2 += (border ? ';border:'.concat(border, 'px solid gray') + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? ';padding:'.concat(padding, 'px') : '') // 处理列合并\n\n                        if (td.attrs.colspan) {\n                            _style2 += ';grid-column-start:'.concat(col, ';grid-column-end:').concat(col + parseInt(td.attrs.colspan))\n                            if (!td.attrs.rowspan) _style2 += ';grid-row-start:'.concat(row, ';grid-row-end:').concat(row + 1)\n                            col += parseInt(td.attrs.colspan) - 1\n                        } // 处理行合并\n\n                        if (td.attrs.rowspan) {\n                            _style2 += ';grid-row-start:'.concat(row, ';grid-row-end:').concat(row + parseInt(td.attrs.rowspan))\n                            if (!td.attrs.colspan) _style2 += ';grid-column-start:'.concat(col, ';grid-column-end:').concat(col + 1) // 记录下方单元格被占用\n\n                            for (let k = 1; k < td.attrs.rowspan; k++) {\n                                map[`${row + k}.${col}`] = 1\n                            }\n                        }\n\n                        if (_style2) td.attrs.style = _style2\n                        cells.push(td)\n                    }\n                }\n\n                if (row == 1) {\n                    let temp = ''\n\n                    for (let _i6 = 1; _i6 < col; _i6++) {\n                        temp += `${width[_i6] ? width[_i6] : 'auto'} `\n                    }\n\n                    styleObj['grid-template-columns'] = temp\n                }\n            }\n\n            node.children = cells\n        } else {\n            // 没有使用合并单元格的表格通过 table 布局实现\n            if (node.c) styleObj.display = 'table'\n            if (!isNaN(spacing)) styleObj['border-spacing'] = `${spacing}px`\n\n            if (border || padding) {\n                // 遍历\n                (function traversal(nodes) {\n                    for (let _i7 = 0; _i7 < nodes.length; _i7++) {\n                        const _td = nodes[_i7]\n\n                        if (_td.name == 'th' || _td.name == 'td') {\n                            if (border) _td.attrs.style = 'border:'.concat(border, 'px solid gray;').concat(_td.attrs.style || '')\n                            if (padding) _td.attrs.style = 'padding:'.concat(padding, 'px;').concat(_td.attrs.style || '')\n                        } else if (_td.children) traversal(_td.children)\n                    }\n                }(children))\n            }\n        } // 给表格添加一个单独的横向滚动层\n\n        if (this.options.scrollTable && !(attrs.style || '').includes('inline')) {\n            const table = { ...node }\n            node.name = 'div'\n            node.attrs = {\n                style: 'overflow:auto'\n            }\n            node.children = [table]\n            attrs = table.attrs\n        }\n    } else if ((node.name == 'td' || node.name == 'th') && (attrs.colspan || attrs.rowspan)) {\n        for (let _i8 = this.stack.length; _i8--;) {\n            if (this.stack[_i8].name == 'table') {\n                this.stack[_i8].flag = 1 // 指示含有合并单元格\n\n                break\n            }\n        }\n    } // 转换 ruby\n    else if (node.name == 'ruby') {\n        node.name = 'span'\n\n        for (let _i9 = 0; _i9 < children.length - 1; _i9++) {\n            if (children[_i9].type == 'text' && children[_i9 + 1].name == 'rt') {\n                children[_i9] = {\n                    name: 'div',\n                    attrs: {\n                        style: 'display:inline-block'\n                    },\n                    children: [{\n                        name: 'div',\n                        attrs: {\n                            style: 'font-size:50%;text-align:start'\n                        },\n                        children: children[_i9 + 1].children\n                    }, children[_i9]]\n                }\n                children.splice(_i9 + 1, 1)\n            }\n        }\n    } else if (node.c) {\n        node.c = 2\n\n        for (let _i10 = node.children.length; _i10--;) {\n            if (!node.children[_i10].c || node.children[_i10].name == 'table') node.c = 1\n        }\n    }\n    if ((styleObj.display || '').includes('flex') && !node.c) {\n        for (let _i11 = children.length; _i11--;) {\n            const _item = children[_i11]\n\n            if (_item.f) {\n                _item.attrs.style = (_item.attrs.style || '') + _item.f\n                _item.f = void 0\n            }\n        }\n    } // flex 布局时部分样式需要提取到 rich-text 外层\n\n    const flex = parent && (parent.attrs.style || '').includes('flex') // #ifdef MP-WEIXIN\n  // 检查基础库版本 virtualHost 是否可用\n  && !(node.c && wx.getNFCAdapter) // #endif\n  // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO\n  && !node.c // #endif\n\n    if (flex) node.f = ';max-width:100%' // #endif\n\n    for (const key in styleObj) {\n        if (styleObj[key]) {\n            const val = ';'.concat(key, ':').concat(styleObj[key].replace(' !important', '')) // #ifndef APP-PLUS-NVUE\n\n            if (flex && (key.includes('flex') && key != 'flex-direction' || key == 'align-self' || styleObj[key][0] == '-' || key == 'width' && val.includes('%'))) {\n                node.f += val\n                if (key == 'width') attrs.style += ';width:100%'\n            } else // #endif\n            { attrs.style += val }\n        }\n    }\n\n    attrs.style = attrs.style.substr(1) || void 0\n}\n/**\n * @description 解析到文本\n * @param {String} text 文本内容\n */\n\nparser.prototype.onText = function (text) {\n    if (!this.pre) {\n    // 合并空白符\n        let trim = ''\n        let flag\n\n        for (let i = 0, len = text.length; i < len; i++) {\n            if (!blankChar[text[i]]) trim += text[i]; else {\n                if (trim[trim.length - 1] != ' ') trim += ' '\n                if (text[i] == '\\n' && !flag) flag = true\n            }\n        } // 去除含有换行符的空串\n\n        if (trim == ' ' && flag) return\n        text = trim\n    }\n\n    const node = Object.create(null)\n    node.type = 'text'\n    node.text = decodeEntity(text)\n\n    if (this.hook(node)) {\n        const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes\n        siblings.push(node)\n    }\n}\n/**\n * @description html 词法分析器\n * @param {Object} handler 高层处理器\n */\n\nfunction lexer(handler) {\n    this.handler = handler\n}\n/**\n * @description 执行解析\n * @param {String} content 要解析的文本\n */\n\nlexer.prototype.parse = function (content) {\n    this.content = content || ''\n    this.i = 0 // 标记解析位置\n\n    this.start = 0 // 标记一个单词的开始位置\n\n    this.state = this.text // 当前状态\n\n    for (let len = this.content.length; this.i != -1 && this.i < len;) {\n        this.state()\n    }\n}\n/**\n * @description 检查标签是否闭合\n * @param {String} method 如果闭合要进行的操作\n * @returns {Boolean} 是否闭合\n * @private\n */\n\nlexer.prototype.checkClose = function (method) {\n    const selfClose = this.content[this.i] == '/'\n\n    if (this.content[this.i] == '>' || selfClose && this.content[this.i + 1] == '>') {\n        if (method) this.handler[method](this.content.substring(this.start, this.i))\n        this.i += selfClose ? 2 : 1\n        this.start = this.i\n        this.handler.onOpenTag(selfClose)\n\n        if (this.handler.tagName == 'script') {\n            this.i = this.content.indexOf('</', this.i)\n\n            if (this.i != -1) {\n                this.i += 2\n                this.start = this.i\n            }\n\n            this.state = this.endTag\n        } else this.state = this.text\n\n        return true\n    }\n\n    return false\n}\n/**\n * @description 文本状态\n * @private\n */\n\nlexer.prototype.text = function () {\n    this.i = this.content.indexOf('<', this.i) // 查找最近的标签\n\n    if (this.i == -1) {\n    // 没有标签了\n        if (this.start < this.content.length) this.handler.onText(this.content.substring(this.start, this.content.length))\n        return\n    }\n\n    const c = this.content[this.i + 1]\n\n    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {\n    // 标签开头\n        if (this.start != this.i) this.handler.onText(this.content.substring(this.start, this.i))\n        this.start = ++this.i\n        this.state = this.tagName\n    } else if (c == '/' || c == '!' || c == '?') {\n        if (this.start != this.i) this.handler.onText(this.content.substring(this.start, this.i))\n        const next = this.content[this.i + 2]\n\n        if (c == '/' && (next >= 'a' && next <= 'z' || next >= 'A' && next <= 'Z')) {\n            // 标签结尾\n            this.i += 2\n            this.start = this.i\n            return this.state = this.endTag\n        } // 处理注释\n\n        let end = '-->'\n        if (c != '!' || this.content[this.i + 2] != '-' || this.content[this.i + 3] != '-') end = '>'\n        this.i = this.content.indexOf(end, this.i)\n\n        if (this.i != -1) {\n            this.i += end.length\n            this.start = this.i\n        }\n    } else this.i++\n}\n/**\n * @description 标签名状态\n * @private\n */\n\nlexer.prototype.tagName = function () {\n    if (blankChar[this.content[this.i]]) {\n    // 解析到标签名\n        this.handler.onTagName(this.content.substring(this.start, this.i))\n\n        while (blankChar[this.content[++this.i]]) {\n\n        }\n\n        if (this.i < this.content.length && !this.checkClose()) {\n            this.start = this.i\n            this.state = this.attrName\n        }\n    } else if (!this.checkClose('onTagName')) this.i++\n}\n/**\n * @description 属性名状态\n * @private\n */\n\nlexer.prototype.attrName = function () {\n    let c = this.content[this.i]\n\n    if (blankChar[c] || c == '=') {\n    // 解析到属性名\n        this.handler.onAttrName(this.content.substring(this.start, this.i))\n        let needVal = c == '='\n        const len = this.content.length\n\n        while (++this.i < len) {\n            c = this.content[this.i]\n\n            if (!blankChar[c]) {\n                if (this.checkClose()) return\n\n                if (needVal) {\n                    // 等号后遇到第一个非空字符\n                    this.start = this.i\n                    return this.state = this.attrVal\n                }\n\n                if (this.content[this.i] == '=') needVal = true; else {\n                    this.start = this.i\n                    return this.state = this.attrName\n                }\n            }\n        }\n    } else if (!this.checkClose('onAttrName')) this.i++\n}\n/**\n * @description 属性值状态\n * @private\n */\n\nlexer.prototype.attrVal = function () {\n    const c = this.content[this.i]\n    const len = this.content.length // 有冒号的属性\n\n    if (c == '\"' || c == \"'\") {\n        this.start = ++this.i\n        this.i = this.content.indexOf(c, this.i)\n        if (this.i == -1) return\n        this.handler.onAttrVal(this.content.substring(this.start, this.i))\n    } // 没有冒号的属性\n    else {\n        for (; this.i < len; this.i++) {\n            if (blankChar[this.content[this.i]]) {\n                this.handler.onAttrVal(this.content.substring(this.start, this.i))\n                break\n            } else if (this.checkClose('onAttrVal')) return\n        }\n    }\n\n    while (blankChar[this.content[++this.i]]) {\n\n    }\n\n    if (this.i < len && !this.checkClose()) {\n        this.start = this.i\n        this.state = this.attrName\n    }\n}\n/**\n * @description 结束标签状态\n * @returns {String} 结束的标签名\n * @private\n */\n\nlexer.prototype.endTag = function () {\n    const c = this.content[this.i]\n\n    if (blankChar[c] || c == '>' || c == '/') {\n        this.handler.onCloseTag(this.content.substring(this.start, this.i))\n\n        if (c != '>') {\n            this.i = this.content.indexOf('>', this.i)\n            if (this.i == -1) return\n        }\n\n        this.start = ++this.i\n        this.state = this.text\n    } else this.i++\n}\n\nmodule.exports = parser\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-parse/props.js",
    "content": "export default {\n    props: {\n        // #ifdef APP-PLUS-NVUE\n        bgColor: String,\n        // #endif\n        content: String,\n        copyLink: {\n\t\t  type: Boolean,\n\t\t  default: uni.$u.props.parse.copyLink\n        },\n        domain: String,\n        errorImg: {\n\t\t  type: String,\n\t\t  default: uni.$u.props.parse.errorImg\n        },\n        lazyLoad: {\n\t\t  type: Boolean,\n\t\t  default: uni.$u.props.parse.lazyLoad\n        },\n        loadingImg: {\n\t\t  type: String,\n\t\t  default: uni.$u.props.parse.loadingImg\n        },\n        pauseVideo: {\n\t\t  type: Boolean,\n\t\t  default: uni.$u.props.parse.pauseVideo\n        },\n        previewImg: {\n\t\t  type: Boolean,\n\t\t  default: uni.$u.props.parse.previewImg\n        },\n        scrollTable: Boolean,\n        selectable: Boolean,\n        setTitle: {\n\t\t  type: Boolean,\n\t\t  default: uni.$u.props.parse.setTitle\n        },\n        showImgMenu: {\n\t\t  type: Boolean,\n\t\t  default: uni.$u.props.parse.showImgMenu\n        },\n        tagStyle: Object,\n        useAnchor: null\n\t  }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-parse/u-parse.vue",
    "content": "<template>\n  <view id=\"_root\" :class=\"(selectable?'_select ':'')+'_root'\">\n    <slot v-if=\"!nodes[0]\" />\n    <!-- #ifndef APP-PLUS-NVUE -->\n    <node v-else :childs=\"nodes\" :opts=\"[lazyLoad,loadingImg,errorImg,showImgMenu]\" />\n    <!-- #endif -->\n    <!-- #ifdef APP-PLUS-NVUE -->\n    <web-view ref=\"web\" src=\"/static/app-plus/mp-html/local.html\" :style=\"'margin-top:-2px;height:' + height + 'px'\" @onPostMessage=\"_onMessage\" />\n    <!-- #endif -->\n  </view>\n</template>\n\n<script>\n\timport props from './props.js';\n/**\n * mp-html v2.0.4\n * @description 富文本组件\n * @tutorial https://github.com/jin-yufeng/mp-html\n * @property {String}\t\t\tbgColor\t\t背景颜色，只适用与APP-PLUS-NVUE\n * @property {String}\t\t\tcontent\t\t用于渲染的富文本字符串（默认 true ）\n * @property {Boolean}\t\t\tcopyLink\t是否允许外部链接被点击时自动复制\n * @property {String}\t\t\tdomain\t\t主域名，用于拼接链接\n * @property {String}\t\t\terrorImg\t图片出错时的占位图链接\n * @property {Boolean}\t\t\tlazyLoad\t是否开启图片懒加载（默认 true ）\n * @property {string}\t\t\tloadingImg\t图片加载过程中的占位图链接\n * @property {Boolean}\t\t\tpauseVideo\t是否在播放一个视频时自动暂停其它视频（默认 true ）\n * @property {Boolean}\t\t\tpreviewImg\t是否允许图片被点击时自动预览（默认 true ）\n * @property {Boolean}\t\t\tscrollTable\t是否给每个表格添加一个滚动层使其能单独横向滚动\n * @property {Boolean}\t\t\tselectable\t是否开启长按复制\n * @property {Boolean}\t\t\tsetTitle\t是否将 title 标签的内容设置到页面标题（默认 true ）\n * @property {Boolean}\t\t\tshowImgMenu\t是否允许图片被长按时显示菜单（默认 true ）\n * @property {Object}\t\t\ttagStyle\t标签的默认样式\n * @property {Boolean | Number}\tuseAnchor\t是否使用锚点链接\n * \n * @event {Function}\tload\tdom 结构加载完毕时触发\n * @event {Function}\tready\t所有图片加载完毕时触发\n * @event {Function}\timgTap\t图片被点击时触发\n * @event {Function}\tlinkTap\t链接被点击时触发\n * @event {Function}\terror\t媒体加载出错时触发\n */\nconst plugins=[]\nconst parser = require('./parser')\n// #ifndef APP-PLUS-NVUE\nimport node from './node/node'\n// #endif\n// #ifdef APP-PLUS-NVUE\nconst dom = weex.requireModule('dom')\n// #endif\nexport default {\n  name: 'mp-html',\n  data() {\n    return {\n      nodes: [],\n      // #ifdef APP-PLUS-NVUE\n      height: 0\n      // #endif\n    }\n  },\n  mixins:[props],\n  // #ifndef APP-PLUS-NVUE\n  components: {\n    node\n  },\n  // #endif\n  watch: {\n    content(content) {\n      this.setContent(content)\n    }\n  },\n  created() {\n    this.plugins = []\n    for (let i = plugins.length; i--;)\n      this.plugins.push(new plugins[i](this))\n  },\n  mounted() {\n    if (this.content && !this.nodes.length)\n      this.setContent(this.content)\n  },\n  beforeDestroy() {\n    this._hook('onDetached')\n    clearInterval(this._timer)\n  },\n  methods: {\n    /**\n     * @description 将锚点跳转的范围限定在一个 scroll-view 内\n     * @param {Object} page scroll-view 所在页面的示例\n     * @param {String} selector scroll-view 的选择器\n     * @param {String} scrollTop scroll-view scroll-top 属性绑定的变量名\n     */\n    in(page, selector, scrollTop) {\n      // #ifndef APP-PLUS-NVUE\n      if (page && selector && scrollTop)\n        this._in = {\n          page,\n          selector,\n          scrollTop\n        }\n      // #endif\n    },\n\n    /**\n     * @description 锚点跳转\n     * @param {String} id 要跳转的锚点 id\n     * @param {Number} offset 跳转位置的偏移量\n     * @returns {Promise}\n     */\n    navigateTo(id, offset) {\n      return new Promise((resolve, reject) => {\n        if (!this.useAnchor)\n          return reject('Anchor is disabled')\n        offset = offset || parseInt(this.useAnchor) || 0\n        // #ifdef APP-PLUS-NVUE\n        if (!id) {\n          dom.scrollToElement(this.$refs.web, {\n            offset\n          })\n          resolve()\n        } else {\n          this._navigateTo = {\n            resolve,\n            reject,\n            offset\n          }\n          this.$refs.web.evalJs('uni.postMessage({data:{action:\"getOffset\",offset:(document.getElementById(' + id + ')||{}).offsetTop}})')\n        }\n        // #endif\n        // #ifndef APP-PLUS-NVUE\n        let deep = ' '\n        // #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO\n        deep = '>>>'\n        // #endif\n        const selector = uni.createSelectorQuery()\n          // #ifndef MP-ALIPAY\n          .in(this._in ? this._in.page : this)\n          // #endif\n          .select((this._in ? this._in.selector : '._root') + (id ? `${deep}#${id}` : '')).boundingClientRect()\n        if (this._in)\n          selector.select(this._in.selector).scrollOffset()\n            .select(this._in.selector).boundingClientRect() // 获取 scroll-view 的位置和滚动距离\n        else\n          selector.selectViewport().scrollOffset() // 获取窗口的滚动距离\n        selector.exec(res => {\n          if (!res[0])\n            return reject('Label not found')\n          const scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + offset\n          if (this._in)\n            // scroll-view 跳转\n            this._in.page[this._in.scrollTop] = scrollTop\n          else\n            // 页面跳转\n            uni.pageScrollTo({\n              scrollTop,\n              duration: 300\n            })\n          resolve()\n        })\n        // #endif\n      })\n    },\n\n    /**\n     * @description 获取文本内容\n     * @return {String}\n     */\n    getText() {\n      let text = '';\n      (function traversal(nodes) {\n        for (let i = 0; i < nodes.length; i++) {\n          const node = nodes[i]\n          if (node.type == 'text')\n            text += node.text.replace(/&amp;/g, '&')\n          else if (node.name == 'br')\n            text += '\\n'\n          else {\n            // 块级标签前后加换行\n            const isBlock = node.name == 'p' || node.name == 'div' || node.name == 'tr' || node.name == 'li' || (node.name[0] == 'h' && node.name[1] > '0' && node.name[1] < '7')\n            if (isBlock && text && text[text.length - 1] != '\\n')\n              text += '\\n'\n            // 递归获取子节点的文本\n            if (node.children)\n              traversal(node.children)\n            if (isBlock && text[text.length - 1] != '\\n')\n              text += '\\n'\n            else if (node.name == 'td' || node.name == 'th')\n              text += '\\t'\n          }\n        }\n      })(this.nodes)\n      return text\n    },\n\n    /**\n     * @description 获取内容大小和位置\n     * @return {Promise}\n     */\n    getRect() {\n      return new Promise((resolve, reject) => {\n        uni.createSelectorQuery()\n          // #ifndef MP-ALIPAY\n          .in(this)\n          // #endif\n          .select('#_root').boundingClientRect().exec(res => res[0] ? resolve(res[0]) : reject('Root label not found'))\n      })\n    },\n\n    /**\n     * @description 设置内容\n     * @param {String} content html 内容\n     * @param {Boolean} append 是否在尾部追加\n     */\n    setContent(content, append) {\n      if (!append || !this.imgList)\n        this.imgList = []\n      const nodes = new parser(this).parse(content)\n      // #ifdef APP-PLUS-NVUE\n      if (this._ready)\n        this._set(nodes, append)\n      // #endif\n      this.$set(this, 'nodes', append ? (this.nodes || []).concat(nodes) : nodes)\n\n      // #ifndef APP-PLUS-NVUE\n      this._videos = []\n      this.$nextTick(() => {\n        this._hook('onLoad')\n        this.$emit('load')\n      })\n\n      // 等待图片加载完毕\n      let height\n      clearInterval(this._timer)\n      this._timer = setInterval(() => {\n        this.getRect().then(rect => {\n          // 350ms 总高度无变化就触发 ready 事件\n          if (rect.height == height) {\n            this.$emit('ready', rect)\n            clearInterval(this._timer)\n          }\n          height = rect.height\n        }).catch(() => { })\n      }, 350)\n      // #endif\n    },\n\n    /**\n     * @description 调用插件钩子函数\n     */\n    _hook(name) {\n      for (let i = plugins.length; i--;)\n        if (this.plugins[i][name])\n          this.plugins[i][name]()\n    },\n\n    // #ifdef APP-PLUS-NVUE\n    /**\n     * @description 设置内容\n     */\n    _set(nodes, append) {\n      this.$refs.web.evalJs('setContent(' + JSON.stringify(nodes) + ',' + JSON.stringify([this.bgColor, this.errorImg, this.loadingImg, this.pauseVideo, this.scrollTable, this.selectable]) + ',' + append + ')')\n    },\n\n    /**\n     * @description 接收到 web-view 消息\n     */\n    _onMessage(e) {\n      const message = e.detail.data[0]\n      switch (message.action) {\n        // web-view 初始化完毕\n        case 'onJSBridgeReady':\n          this._ready = true\n          if (this.nodes)\n            this._set(this.nodes)\n          break\n        // 内容 dom 加载完毕\n        case 'onLoad':\n          this.height = message.height\n          this._hook('onLoad')\n          this.$emit('load')\n          break\n        // 所有图片加载完毕\n        case 'onReady':\n          this.getRect().then(res => {\n            this.$emit('ready', res)\n          }).catch(() => { })\n          break\n        // 总高度发生变化\n        case 'onHeightChange':\n          this.height = message.height\n          break\n        // 图片点击\n        case 'onImgTap':\n          this.$emit('imgTap', message.attrs)\n          if (this.previewImg)\n            uni.previewImage({\n              current: parseInt(message.attrs.i),\n              urls: this.imgList\n            })\n          break\n        // 链接点击\n        case 'onLinkTap':\n          const href = message.attrs.href\n          this.$emit('linkTap', message.attrs)\n          if (href) {\n            // 锚点跳转\n            if (href[0] == '#') {\n              if (this.useAnchor)\n                dom.scrollToElement(this.$refs.web, {\n                  offset: message.offset\n                })\n            }\n            // 打开外链\n            else if (href.includes('://')) {\n              if (this.copyLink)\n                plus.runtime.openWeb(href)\n            }\n            else\n              uni.navigateTo({\n                url: href,\n                fail() {\n                  wx.switchTab({\n                    url: href\n                  })\n                }\n              })\n          }\n          break\n        // 获取到锚点的偏移量\n        case 'getOffset':\n          if (typeof message.offset == 'number') {\n            dom.scrollToElement(this.$refs.web, {\n              offset: message.offset + this._navigateTo.offset\n            })\n            this._navigateTo.resolve()\n          } else\n            this._navigateTo.reject('Label not found')\n          break\n        // 点击\n        case 'onClick':\n          this.$emit('tap')\n          break\n        // 出错\n        case 'onError':\n          this.$emit('error', {\n            source: message.source,\n            attrs: message.attrs\n          })\n      }\n    }\n    // #endif\n  }\n}\n</script>\n\n<style>\n/* #ifndef APP-PLUS-NVUE */\n/* 根节点样式 */\n._root {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n/* 长按复制 */\n._select {\n  user-select: text;\n}\n/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-picker/props.js",
    "content": "export default {\n    props: {\n        // 是否展示picker弹窗\n        show: {\n            type: Boolean,\n            default: uni.$u.props.picker.show\n        },\n        // 是否展示顶部的操作栏\n        showToolbar: {\n            type: Boolean,\n            default: uni.$u.props.picker.showToolbar\n        },\n        // 顶部标题\n        title: {\n            type: String,\n            default: uni.$u.props.picker.title\n        },\n        // 对象数组，设置每一列的数据\n        columns: {\n            type: Array,\n            default: uni.$u.props.picker.columns\n        },\n        // 是否显示加载中状态\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.picker.loading\n        },\n        // 各列中，单个选项的高度\n        itemHeight: {\n            type: [String, Number],\n            default: uni.$u.props.picker.itemHeight\n        },\n        // 取消按钮的文字\n        cancelText: {\n            type: String,\n            default: uni.$u.props.picker.cancelText\n        },\n        // 确认按钮的文字\n        confirmText: {\n            type: String,\n            default: uni.$u.props.picker.confirmText\n        },\n        // 取消按钮的颜色\n        cancelColor: {\n            type: String,\n            default: uni.$u.props.picker.cancelColor\n        },\n        // 确认按钮的颜色\n        confirmColor: {\n            type: String,\n            default: uni.$u.props.picker.confirmColor\n        },\n        // 每列中可见选项的数量\n        visibleItemCount: {\n            type: [String, Number],\n            default: uni.$u.props.picker.visibleItemCount\n        },\n        // 选项对象中，需要展示的属性键名\n        keyName: {\n            type: String,\n            default: uni.$u.props.picker.keyName\n        },\n        // 是否允许点击遮罩关闭选择器\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.picker.closeOnClickOverlay\n        },\n        // 各列的默认索引\n        defaultIndex: {\n            type: Array,\n            default: uni.$u.props.picker.defaultIndex\n        },\n\t\t// 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件，只在微信2.21.1及以上有效\n\t\timmediateChange: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.picker.immediateChange\n\t\t}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-picker/u-picker.vue",
    "content": "<template>\n\t<u-popup\n\t\t:show=\"show\"\n\t\t@close=\"closeHandler\"\n\t>\n\t\t<view class=\"u-picker\">\n\t\t\t<u-toolbar\n\t\t\t\tv-if=\"showToolbar\"\n\t\t\t\t:cancelColor=\"cancelColor\"\n\t\t\t\t:confirmColor=\"confirmColor\"\n\t\t\t\t:cancelText=\"cancelText\"\n\t\t\t\t:confirmText=\"confirmText\"\n\t\t\t\t:title=\"title\"\n\t\t\t\t@cancel=\"cancel\"\n\t\t\t\t@confirm=\"confirm\"\n\t\t\t></u-toolbar>\n\t\t\t<picker-view\n\t\t\t\tclass=\"u-picker__view\"\n\t\t\t\t:indicatorStyle=\"`height: ${$u.addUnit(itemHeight)}`\"\n\t\t\t\t:value=\"innerIndex\"\n\t\t\t\t:immediateChange=\"immediateChange\"\n\t\t\t\t:style=\"{\n\t\t\t\t\theight: `${$u.addUnit(visibleItemCount * itemHeight)}`\n\t\t\t\t}\"\n\t\t\t\t@change=\"changeHandler\"\n\t\t\t>\n\t\t\t\t<picker-view-column\n\t\t\t\t\tv-for=\"(item, index) in innerColumns\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"u-picker__view__column\"\n\t\t\t\t>\n\t\t\t\t\t<text\n\t\t\t\t\t\tv-if=\"$u.test.array(item)\"\n\t\t\t\t\t\tclass=\"u-picker__view__column__item u-line-1\"\n\t\t\t\t\t\tv-for=\"(item1, index1) in item\"\n\t\t\t\t\t\t:key=\"index1\"\n\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\theight: $u.addUnit(itemHeight),\n\t\t\t\t\t\t\tlineHeight: $u.addUnit(itemHeight),\n\t\t\t\t\t\t\tfontWeight: index1 === innerIndex[index] ? 'bold' : 'normal'\n\t\t\t\t\t\t}\"\n\t\t\t\t\t>{{ getItemText(item1) }}</text>\n\t\t\t\t</picker-view-column>\n\t\t\t</picker-view>\n\t\t\t<view\n\t\t\t\tv-if=\"loading\"\n\t\t\t\tclass=\"u-picker--loading\"\n\t\t\t>\n\t\t\t\t<u-loading-icon mode=\"circle\"></u-loading-icon>\n\t\t\t</view>\n\t\t</view>\n\t</u-popup>\n</template>\n\n<script>\n/**\n * u-picker\n * @description 选择器\n * @property {Boolean}\t\t\tshow\t\t\t\t是否显示picker弹窗（默认 false ）\n * @property {Boolean}\t\t\tshowToolbar\t\t\t是否显示顶部的操作栏（默认 true ）\n * @property {String}\t\t\ttitle\t\t\t\t顶部标题\n * @property {Array}\t\t\tcolumns\t\t\t\t对象数组，设置每一列的数据\n * @property {Boolean}\t\t\tloading\t\t\t\t是否显示加载中状态（默认 false ）\n * @property {String | Number}\titemHeight\t\t\t各列中，单个选项的高度（默认 44 ）\n * @property {String}\t\t\tcancelText\t\t\t取消按钮的文字（默认 '取消' ）\n * @property {String}\t\t\tconfirmText\t\t\t确认按钮的文字（默认 '确定' ）\n * @property {String}\t\t\tcancelColor\t\t\t取消按钮的颜色（默认 '#909193' ）\n * @property {String}\t\t\tconfirmColor\t\t确认按钮的颜色（默认 '#3c9cff' ）\n * @property {String | Number}\tvisibleItemCount\t每列中可见选项的数量（默认 5 ）\n * @property {String}\t\t\tkeyName\t\t\t\t选项对象中，需要展示的属性键名（默认 'text' ）\n * @property {Boolean}\t\t\tcloseOnClickOverlay\t是否允许点击遮罩关闭选择器（默认 false ）\n * @property {Array}\t\t\tdefaultIndex\t\t各列的默认索引\n * @property {Boolean}\t\t\timmediateChange\t\t是否在手指松开时立即触发change事件（默认 false ）\n * @event {Function} close\t\t关闭选择器时触发\n * @event {Function} cancel\t\t点击取消按钮触发\n * @event {Function} change\t\t当选择值变化时触发\n * @event {Function} confirm\t点击确定按钮，返回当前选择的值\n */\nimport props from './props.js';\nexport default {\n\tname: 'u-picker',\n\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\tdata() {\n\t\treturn {\n\t\t\t// 上一次选择的列索引\n\t\t\tlastIndex: [],\n\t\t\t// 索引值 ，对应picker-view的value\n\t\t\tinnerIndex: [],\n\t\t\t// 各列的值\n\t\t\tinnerColumns: [],\n\t\t\t// 上一次的变化列索引\n\t\t\tcolumnIndex: 0,\n\t\t}\n\t},\n\twatch: {\n\t\t// 监听默认索引的变化，重新设置对应的值\n\t\tdefaultIndex: {\n\t\t\timmediate: true,\n\t\t\thandler(n) {\n\t\t\t\tthis.setIndexs(n, true)\n\t\t\t}\n\t\t},\n\t\t// 监听columns参数的变化\n\t\tcolumns: {\n\t\t\timmediate: true,\n\t\t\thandler(n) {\n\t\t\t\tthis.setColumns(n)\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\t// 获取item需要显示的文字，判别为对象还是文本\n\t\tgetItemText(item) {\n\t\t\tif (uni.$u.test.object(item)) {\n\t\t\t\treturn item[this.keyName]\n\t\t\t} else {\n\t\t\t\treturn item\n\t\t\t}\n\t\t},\n\t\t// 关闭选择器\n\t\tcloseHandler() {\n\t\t\tif (this.closeOnClickOverlay) {\n\t\t\t\tthis.$emit('close')\n\t\t\t}\n\t\t},\n\t\t// 点击工具栏的取消按钮\n\t\tcancel() {\n\t\t\tthis.$emit('cancel')\n\t\t},\n\t\t// 点击工具栏的确定按钮\n\t\tconfirm() {\n\t\t\tthis.$emit('confirm', {\n\t\t\t\tindexs: this.innerIndex,\n\t\t\t\tvalue: this.innerColumns.map((item, index) => item[this.innerIndex[index]]),\n\t\t\t\tvalues: this.innerColumns\n\t\t\t})\n\t\t},\n\t\t// 选择器某一列的数据发生变化时触发\n\t\tchangeHandler(e) {\n\t\t\tconst {\n\t\t\t\tvalue\n\t\t\t} = e.detail\n\t\t\tlet index = 0,\n\t\t\t\tcolumnIndex = 0\n\t\t\t// 通过对比前后两次的列索引，得出当前变化的是哪一列\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tlet item = value[i]\n\t\t\t\tif (item !== (this.lastIndex[i] || 0)) { // 把undefined转为合法假值0\n\t\t\t\t\t// 设置columnIndex为当前变化列的索引\n\t\t\t\t\tcolumnIndex = i\n\t\t\t\t\t// index则为变化列中的变化项的索引\n\t\t\t\t\tindex = item\n\t\t\t\t\tbreak // 终止循环，即使少一次循环，也是性能的提升\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.columnIndex = columnIndex\n\t\t\tconst values = this.innerColumns\n\t\t\t// 将当前的各项变化索引，设置为\"上一次\"的索引变化值\n\t\t\tthis.setLastIndex(value)\n\t\t\tthis.setIndexs(value)\n\n\t\t\tthis.$emit('change', {\n\t\t\t\t// #ifndef MP-WEIXIN || MP-LARK\n\t\t\t\t// 微信小程序不能传递this，会因为循环引用而报错\n\t\t\t\tpicker: this,\n\t\t\t\t// #endif\n\t\t\t\tvalue: this.innerColumns.map((item, index) => item[value[index]]),\n\t\t\t\tindex,\n\t\t\t\tindexs: value,\n\t\t\t\t// values为当前变化列的数组内容\n\t\t\t\tvalues,\n\t\t\t\tcolumnIndex\n\t\t\t})\n\t\t},\n\t\t// 设置index索引，此方法可被外部调用设置\n\t\tsetIndexs(index, setLastIndex) {\n\t\t\tthis.innerIndex = uni.$u.deepClone(index)\n\t\t\tif (setLastIndex) {\n\t\t\t\tthis.setLastIndex(index)\n\t\t\t}\n\t\t},\n\t\t// 记录上一次的各列索引位置\n\t\tsetLastIndex(index) {\n\t\t\t// 当能进入此方法，意味着当前设置的各列默认索引，即为“上一次”的选中值，需要记录，是因为changeHandler中\n\t\t\t// 需要拿前后的变化值进行对比，得出当前发生改变的是哪一列\n\t\t\tthis.lastIndex = uni.$u.deepClone(index)\n\t\t},\n\t\t// 设置对应列选项的所有值\n\t\tsetColumnValues(columnIndex, values) {\n\t\t\t// 替换innerColumns数组中columnIndex索引的值为values，使用的是数组的splice方法\n\t\t\tthis.innerColumns.splice(columnIndex, 1, values)\n\t\t\t// 拷贝一份原有的innerIndex做临时变量，将大于当前变化列的所有的列的默认索引设置为0\n\t\t\tlet tmpIndex = uni.$u.deepClone(this.innerIndex)\n\t\t\tfor (let i = 0; i < this.innerColumns.length; i++) {\n\t\t\t\tif (i > this.columnIndex) {\n\t\t\t\t\ttmpIndex[i] = 0\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 一次性赋值，不能单个修改，否则无效\n\t\t\tthis.setIndexs(tmpIndex)\n\t\t},\n\t\t// 获取对应列的所有选项\n\t\tgetColumnValues(columnIndex) {\n\t\t\t// 进行同步阻塞，因为外部得到change事件之后，可能需要执行setColumnValues更新列的值\n\t\t\t// 索引如果在外部change的回调中调用getColumnValues的话，可能无法得到变更后的列值，这里进行一定延时，保证值的准确性\n\t\t\t(async () => {\n\t\t\t\tawait uni.$u.sleep()\n\t\t\t})()\n\t\t\treturn this.innerColumns[columnIndex]\n\t\t},\n\t\t// 设置整体各列的columns的值\n\t\tsetColumns(columns) {\n\t\t\tthis.innerColumns = uni.$u.deepClone(columns)\n\t\t\t// 如果在设置各列数据时，没有被设置默认的各列索引defaultIndex，那么用0去填充它，数组长度为列的数量\n\t\t\tif (this.innerIndex.length === 0) {\n\t\t\t\tthis.innerIndex = new Array(columns.length).fill(0)\n\t\t\t}\n\t\t},\n\t\t// 获取各列选中值对应的索引\n\t\tgetIndexs() {\n\t\t\treturn this.innerIndex\n\t\t},\n\t\t// 获取各列选中的值\n\t\tgetValues() {\n\t\t\t// 进行同步阻塞，因为外部得到change事件之后，可能需要执行setColumnValues更新列的值\n\t\t\t// 索引如果在外部change的回调中调用getValues的话，可能无法得到变更后的列值，这里进行一定延时，保证值的准确性\n\t\t\t(async () => {\n\t\t\t\tawait uni.$u.sleep()\n\t\t\t})()\n\t\t\treturn this.innerColumns.map((item, index) => item[this.innerIndex[index]])\n\t\t}\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-picker {\n\t\tposition: relative;\n\n\t\t&__view {\n\n\t\t\t&__column {\n\t\t\t\t@include flex;\n\t\t\t\tflex: 1;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\t&__item {\n\t\t\t\t\t@include flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tfont-size: 16px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\t/* #endif */\n\t\t\t\t\tcolor: $u-main-color;\n\n\t\t\t\t\t&--disabled {\n\t\t\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\t\t\tcursor: not-allowed;\n\t\t\t\t\t\t/* #endif */\n\t\t\t\t\t\topacity: 0.35;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&--loading {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tright: 0;\n\t\t\tleft: 0;\n\t\t\tbottom: 0;\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tbackground-color: rgba(255, 255, 255, 0.87);\n\t\t\tz-index: 1000;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-picker-column/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-picker-column/u-picker-column.vue",
    "content": "<template>\n\t<picker-view-column>\n\t\t<view class=\"u-picker-column\">\n\n\t\t</view>\n\t</picker-view-column>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * PickerColumn \n\t * @description \n\t * @tutorial url\n\t * @property {String}\n\t * @event {Function}\n\t * @example\n\t */\n\texport default {\n\t\tname: 'u-picker-column',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-popup/props.js",
    "content": "export default {\n    props: {\n        // 是否展示弹窗\n        show: {\n            type: Boolean,\n            default: uni.$u.props.popup.show\n        },\n        // 是否显示遮罩\n        overlay: {\n            type: Boolean,\n            default: uni.$u.props.popup.overlay\n        },\n        // 弹出的方向，可选值为 top bottom right left center\n        mode: {\n            type: String,\n            default: uni.$u.props.popup.mode\n        },\n        // 动画时长，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.popup.duration\n        },\n        // 是否显示关闭图标\n        closeable: {\n            type: Boolean,\n            default: uni.$u.props.popup.closeable\n        },\n        // 自定义遮罩的样式\n        overlayStyle: {\n            type: [Object, String],\n            default: uni.$u.props.popup.overlayStyle\n        },\n        // 点击遮罩是否关闭弹窗\n        closeOnClickOverlay: {\n            type: Boolean,\n            default: uni.$u.props.popup.closeOnClickOverlay\n        },\n        // 层级\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.popup.zIndex\n        },\n        // 是否为iPhoneX留出底部安全距离\n        safeAreaInsetBottom: {\n            type: Boolean,\n            default: uni.$u.props.popup.safeAreaInsetBottom\n        },\n        // 是否留出顶部安全距离（状态栏高度）\n        safeAreaInsetTop: {\n            type: Boolean,\n            default: uni.$u.props.popup.safeAreaInsetTop\n        },\n        // 自定义关闭图标位置，top-left为左上角，top-right为右上角，bottom-left为左下角，bottom-right为右下角\n        closeIconPos: {\n            type: String,\n            default: uni.$u.props.popup.closeIconPos\n        },\n        // 是否显示圆角\n        round: {\n            type: [Boolean, String, Number],\n            default: uni.$u.props.popup.round\n        },\n        // mode=center，也即中部弹出时，是否使用缩放模式\n        zoom: {\n            type: Boolean,\n            default: uni.$u.props.popup.zoom\n        },\n        // 弹窗背景色，设置为transparent可去除白色背景\n        bgColor: {\n            type: String,\n            default: uni.$u.props.popup.bgColor\n        },\n        // 遮罩的透明度，0-1之间\n        overlayOpacity: {\n            type: [Number, String],\n            default: uni.$u.props.popup.overlayOpacity\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-popup/u-popup.vue",
    "content": "<template>\n\t<view class=\"u-popup\">\n\t\t<u-overlay\n\t\t\t:show=\"show\"\n\t\t\t@click=\"overlayClick\"\n\t\t\tv-if=\"overlay\"\n\t\t\t:duration=\"overlayDuration\"\n\t\t\t:customStyle=\"overlayStyle\"\n\t\t\t:opacity=\"overlayOpacity\"\n\t\t></u-overlay>\n\t\t<u-transition\n\t\t\t:show=\"show\"\n\t\t\t:customStyle=\"transitionStyle\"\n\t\t\t:mode=\"position\"\n\t\t\t:duration=\"duration\"\n\t\t\t@afterEnter=\"afterEnter\"\n\t\t\t@click=\"clickHandler\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-popup__content\"\n\t\t\t\t:style=\"[contentStyle]\"\n\t\t\t\t@tap.stop=\"noop\"\n\t\t\t>\n\t\t\t\t<u-status-bar v-if=\"safeAreaInsetTop\"></u-status-bar>\n\t\t\t\t<slot></slot>\n\t\t\t\t<view\n\t\t\t\t\tv-if=\"closeable\"\n\t\t\t\t\t@tap.stop=\"close\"\n\t\t\t\t\tclass=\"u-popup__content__close\"\n\t\t\t\t\t:class=\"['u-popup__content__close--' + closeIconPos]\"\n\t\t\t\t\thover-class=\"u-popup__content__close--hover\"\n\t\t\t\t\thover-stay-time=\"150\"\n\t\t\t\t>\n\t\t\t\t\t<u-icon\n\t\t\t\t\t\tname=\"close\"\n\t\t\t\t\t\tcolor=\"#909399\"\n\t\t\t\t\t\tsize=\"18\"\n\t\t\t\t\t\tbold\n\t\t\t\t\t></u-icon>\n\t\t\t\t</view>\n\t\t\t\t<u-safe-bottom v-if=\"safeAreaInsetBottom\"></u-safe-bottom>\n\t\t\t</view>\n\t\t</u-transition>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * popup 弹窗\n\t * @description 弹出层容器，用于展示弹窗、信息提示等内容，支持上、下、左、右和中部弹出。组件只提供容器，内部内容由用户自定义\n\t * @tutorial https://www.uviewui.com/components/popup.html\n\t * @property {Boolean}\t\t\tshow\t\t\t\t是否展示弹窗 (默认 false )\n\t * @property {Boolean}\t\t\toverlay\t\t\t\t是否显示遮罩 （默认 true ）\n\t * @property {String}\t\t\tmode\t\t\t\t弹出方向（默认 'bottom' ）\n\t * @property {String | Number}\tduration\t\t\t动画时长，单位ms （默认 300 ）\n\t * @property {String | Number}\toverlayDuration\t\t\t遮罩层动画时长，单位ms （默认 350 ）\n\t * @property {Boolean}\t\t\tcloseable\t\t\t是否显示关闭图标（默认 false ）\n\t * @property {Object | String}\toverlayStyle\t\t自定义遮罩的样式\n\t * @property {String | Number}\toverlayOpacity\t\t遮罩透明度，0-1之间（默认 0.5）\n\t * @property {Boolean}\t\t\tcloseOnClickOverlay\t点击遮罩是否关闭弹窗 （默认  true ）\n\t * @property {String | Number}\tzIndex\t\t\t\t层级 （默认 10075 ）\n\t * @property {Boolean}\t\t\tsafeAreaInsetBottom\t是否为iPhoneX留出底部安全距离 （默认 true ）\n\t * @property {Boolean}\t\t\tsafeAreaInsetTop\t是否留出顶部安全距离（状态栏高度） （默认 false ）\n\t * @property {String}\t\t\tcloseIconPos\t\t自定义关闭图标位置（默认 'top-right' ）\n\t * @property {String | Number}\tround\t\t\t\t圆角值（默认 0）\n\t * @property {Boolean}\t\t\tzoom\t\t\t\t当mode=center时 是否开启缩放（默认 true ）\n\t * @property {Object}\t\t\tcustomStyle\t\t\t组件的样式，对象形式\n\t * @event {Function} open 弹出层打开\n\t * @event {Function} close 弹出层收起\n\t * @example <u-popup v-model=\"show\"><text>出淤泥而不染，濯清涟而不妖</text></u-popup>\n\t */\n\texport default {\n\t\tname: 'u-popup',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\toverlayDuration: this.duration + 50\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tshow(newValue, oldValue) {\n\t\t\t\tif (newValue === true) {\n\t\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\t\tconst children = this.$children\n\t\t\t\t\tthis.retryComputedComponentRect(children)\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttransitionStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tzIndex: this.zIndex,\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t}\n\t\t\t\tstyle[this.mode] = 0\n\t\t\t\tif (this.mode === 'left') {\n\t\t\t\t\treturn uni.$u.deepMerge(style, {\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t})\n\t\t\t\t} else if (this.mode === 'right') {\n\t\t\t\t\treturn uni.$u.deepMerge(style, {\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t})\n\t\t\t\t} else if (this.mode === 'top') {\n\t\t\t\t\treturn uni.$u.deepMerge(style, {\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0\n\t\t\t\t\t})\n\t\t\t\t} else if (this.mode === 'bottom') {\n\t\t\t\t\treturn uni.$u.deepMerge(style, {\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t})\n\t\t\t\t} else if (this.mode === 'center') {\n\t\t\t\t\treturn uni.$u.deepMerge(style, {\n\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t'justify-content': 'center',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontentStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\t// 通过设备信息的safeAreaInsets值来判断是否需要预留顶部状态栏和底部安全局的位置\n\t\t\t\t// 不使用css方案，是因为nvue不支持css的iPhoneX安全区查询属性\n\t\t\t\tconst {\n\t\t\t\t\tsafeAreaInsets\n\t\t\t\t} = uni.$u.sys()\n\t\t\t\tif (this.mode !== 'center') {\n\t\t\t\t\tstyle.flex = 1\n\t\t\t\t}\n\t\t\t\t// 背景色，一般用于设置为transparent，去除默认的白色背景\n\t\t\t\tif (this.bgColor) {\n\t\t\t\t\tstyle.backgroundColor = this.bgColor\n\t\t\t\t}\n\t\t\t\tif(this.round) {\n\t\t\t\t\tconst value = uni.$u.addUnit(this.round)\n\t\t\t\t\tif(this.mode === 'top') {\n\t\t\t\t\t\tstyle.borderBottomLeftRadius = value\n\t\t\t\t\t\tstyle.borderBottomRightRadius = value\n\t\t\t\t\t} else if(this.mode === 'bottom') {\n\t\t\t\t\t\tstyle.borderTopLeftRadius = value\n\t\t\t\t\t\tstyle.borderTopRightRadius = value\n\t\t\t\t\t} else if(this.mode === 'center') {\n\t\t\t\t\t\tstyle.borderRadius = value\n\t\t\t\t\t} \n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t},\n\t\t\tposition() {\n\t\t\t\tif (this.mode === 'center') {\n\t\t\t\t\treturn this.zoom ? 'fade-zoom' : 'fade'\n\t\t\t\t}\n\t\t\t\tif (this.mode === 'left') {\n\t\t\t\t\treturn 'slide-left'\n\t\t\t\t}\n\t\t\t\tif (this.mode === 'right') {\n\t\t\t\t\treturn 'slide-right'\n\t\t\t\t}\n\t\t\t\tif (this.mode === 'bottom') {\n\t\t\t\t\treturn 'slide-up'\n\t\t\t\t}\n\t\t\t\tif (this.mode === 'top') {\n\t\t\t\t\treturn 'slide-down'\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击遮罩\n\t\t\toverlayClick() {\n\t\t\t\tif (this.closeOnClickOverlay) {\n\t\t\t\t\tthis.$emit('close')\n\t\t\t\t}\n\t\t\t},\n\t\t\tclose(e) {\n\t\t\t\tthis.$emit('close')\n\t\t\t},\n\t\t\tafterEnter() {\n\t\t\t\tthis.$emit('open')\n\t\t\t},\n\t\t\tclickHandler() {\n\t\t\t\t// 由于中部弹出时，其u-transition占据了整个页面相当于遮罩，此时需要发出遮罩点击事件，是否无法通过点击遮罩关闭弹窗\n\t\t\t\tif(this.mode === 'center') {\n\t\t\t\t\tthis.overlayClick()\n\t\t\t\t}\n\t\t\t\tthis.$emit('click')\n\t\t\t},\n\t\t\t// #ifdef MP-WEIXIN\n\t\t\tretryComputedComponentRect(children) {\n\t\t\t\t// 组件内部需要计算节点的组件\n\t\t\t\tconst names = ['u-calendar-month', 'u-album', 'u-collapse-item', 'u-dropdown', 'u-index-item', 'u-index-list',\n\t\t\t\t\t'u-line-progress', 'u-list-item', 'u-rate', 'u-read-more', 'u-row', 'u-row-notice', 'u-scroll-list',\n\t\t\t\t\t'u-skeleton', 'u-slider', 'u-steps-item', 'u-sticky', 'u-subsection', 'u-swipe-action-item', 'u-tabbar',\n\t\t\t\t\t'u-tabs', 'u-tooltip'\n\t\t\t\t]\n\t\t\t\t// 历遍所有的子组件节点\n\t\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\t\tconst child = children[i]\n\t\t\t\t\t// 拿到子组件的子组件\n\t\t\t\t\tconst grandChild = child.$children\n\t\t\t\t\t// 判断如果在需要重新初始化的组件数组中名中，并且存在init方法的话，则执行\n\t\t\t\t\tif (names.includes(child.$options.name) && typeof child?.init === 'function') {\n\t\t\t\t\t\t// 需要进行一定的延时，因为初始化页面需要时间\n\t\t\t\t\t\tuni.$u.sleep(50).then(() => {\n\t\t\t\t\t\t\tchild.init()\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t// 如果子组件还有孙组件，进行递归历遍\n\t\t\t\t\tif (grandChild.length) {\n\t\t\t\t\t\tthis.retryComputedComponentRect(grandChild)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-popup-flex:1 !default;\n\t$u-popup-content-background-color: #fff !default;\n\n\t.u-popup {\n\t\tflex: $u-popup-flex;\n\n\t\t&__content {\n\t\t\tbackground-color: $u-popup-content-background-color;\n\t\t\tposition: relative;\n\n\t\t\t&--round-top {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 10px;\n\t\t\t\tborder-bottom-right-radius: 10px;\n\t\t\t}\n\n\t\t\t&--round-left {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 10px;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 10px;\n\t\t\t}\n\n\t\t\t&--round-right {\n\t\t\t\tborder-top-left-radius: 10px;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 10px;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\t&--round-bottom {\n\t\t\t\tborder-top-left-radius: 10px;\n\t\t\t\tborder-top-right-radius: 10px;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\t&--round-center {\n\t\t\t\tborder-top-left-radius: 10px;\n\t\t\t\tborder-top-right-radius: 10px;\n\t\t\t\tborder-bottom-left-radius: 10px;\n\t\t\t\tborder-bottom-right-radius: 10px;\n\t\t\t}\n\n\t\t\t&__close {\n\t\t\t\tposition: absolute;\n\n\t\t\t\t&--hover {\n\t\t\t\t\topacity: 0.4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__close--top-left {\n\t\t\t\ttop: 15px;\n\t\t\t\tleft: 15px;\n\t\t\t}\n\n\t\t\t&__close--top-right {\n\t\t\t\ttop: 15px;\n\t\t\t\tright: 15px;\n\t\t\t}\n\n\t\t\t&__close--bottom-left {\n\t\t\t\tbottom: 15px;\n\t\t\t\tleft: 15px;\n\t\t\t}\n\n\t\t\t&__close--bottom-right {\n\t\t\t\tright: 15px;\n\t\t\t\tbottom: 15px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-radio/props.js",
    "content": "export default {\n    props: {\n        // radio的名称\n        name: {\n            type: [String, Number, Boolean],\n            default: uni.$u.props.radio.name\n        },\n        // 形状，square为方形，circle为圆型\n        shape: {\n            type: String,\n            default: uni.$u.props.radio.shape\n        },\n        // 是否禁用\n        disabled: {\n            type: [String, Boolean],\n            default: uni.$u.props.radio.disabled\n        },\n        // 是否禁止点击提示语选中单选框\n        labelDisabled: {\n            type: [String, Boolean],\n            default: uni.$u.props.radio.labelDisabled\n        },\n        // 选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值\n        activeColor: {\n            type: String,\n            default: uni.$u.props.radio.activeColor\n        },\n        // 未选中的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.radio.inactiveColor\n        },\n        // 图标的大小，单位px\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.radio.iconSize\n        },\n        // label的字体大小，px单位\n        labelSize: {\n            type: [String, Number],\n            default: uni.$u.props.radio.labelSize\n        },\n        // label提示文字，因为nvue下，直接slot进来的文字，由于特殊的结构，无法修改样式\n        label: {\n            type: [String, Number],\n            default: uni.$u.props.radio.label\n        },\n        // 整体的大小\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.radio.size\n        },\n        // 图标颜色\n        color: {\n            type: String,\n            default: uni.$u.props.radio.color\n        },\n        // label的颜色\n        labelColor: {\n            type: String,\n            default: uni.$u.props.radio.labelColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-radio/u-radio.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-radio\"\n\t\t@tap.stop=\"wrapperClickHandler\"\n\t    :style=\"[radioStyle]\"\n\t    :class=\"[`u-radio-label--${parentData.iconPlacement}`, parentData.borderBottom && parentData.placement === 'column' && 'u-border-bottom']\"\n\t>\n\t\t<view\n\t\t    class=\"u-radio__icon-wrap\"\n\t\t    @tap.stop=\"iconClickHandler\"\n\t\t    :class=\"iconClasses\"\n\t\t    :style=\"[iconWrapStyle]\"\n\t\t>\n\t\t\t<slot name=\"icon\">\n\t\t\t\t<u-icon\n\t\t\t\t    class=\"u-radio__icon-wrap__icon\"\n\t\t\t\t    name=\"checkbox-mark\"\n\t\t\t\t    :size=\"elIconSize\"\n\t\t\t\t    :color=\"elIconColor\"\n\t\t\t\t/>\n\t\t\t</slot>\n\t\t</view>\n\t\t<slot>\n\t\t\t<text\n\t\t\t\tclass=\"u-radio__text\"\n\t\t\t\t@tap.stop=\"labelClickHandler\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tcolor: elDisabled ? elInactiveColor : elLabelColor,\n\t\t\t\t\tfontSize: elLabelSize,\n\t\t\t\t\tlineHeight: elLabelSize\n\t\t\t\t}\"\n\t\t\t>{{label}}</text>\n\t\t</slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * radio 单选框\n\t * @description 单选框用于有一个选择，用户只能选择其中一个的场景。搭配u-radio-group使用\n\t * @tutorial https://www.uviewui.com/components/radio.html\n\t * @property {String | Number}\tname\t\t\tradio的名称\n\t * @property {String}\t\t\tshape\t\t\t形状，square为方形，circle为圆型\n\t * @property {Boolean}\t\t\tdisabled\t\t是否禁用\n\t * @property {String | Boolean}\tlabelDisabled\t是否禁止点击提示语选中单选框\n\t * @property {String}\t\t\tactiveColor\t\t选中时的颜色，如设置parent的active-color将失效\n\t * @property {String}\t\t\tinactiveColor\t未选中的颜色\n\t * @property {String | Number}\ticonSize\t\t图标大小，单位px\n\t * @property {String | Number}\tlabelSize\t\tlabel字体大小，单位px\n\t * @property {String | Number}\tlabel\t\t\tlabel提示文字，因为nvue下，直接slot进来的文字，由于特殊的结构，无法修改样式\n\t * @property {String | Number}\tsize\t\t\t整体的大小\n\t * @property {String}\t\t\ticonColor\t\t图标颜色\n\t * @property {String}\t\t\tlabelColor\t\tlabel的颜色\n\t * @property {Object}\t\t\tcustomStyle\t\t组件的样式，对象形式\n\t * \n\t * @event {Function} change 某个radio状态发生变化时触发(选中状态)\n\t * @example <u-radio :labelDisabled=\"false\">门掩黄昏，无计留春住</u-radio>\n\t */\n\texport default {\n\t\tname: \"u-radio\",\n\t\t\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tchecked: false,\n\t\t\t\t// 当你看到这段代码的时候，\n\t\t\t\t// 父组件的默认值，因为头条小程序不支持在computed中使用this.parent.shape的形式\n\t\t\t\t// 故只能使用如此方法\n\t\t\t\tparentData: {\n\t\t\t\t\ticonSize: 12,\n\t\t\t\t\tlabelDisabled: null,\n\t\t\t\t\tdisabled: null,\n\t\t\t\t\tshape: null,\n\t\t\t\t\tactiveColor: null,\n\t\t\t\t\tinactiveColor: null,\n\t\t\t\t\tsize: 18,\n\t\t\t\t\tvalue: null,\n\t\t\t\t\ticonColor: null,\n\t\t\t\t\tplacement: 'row',\n\t\t\t\t\tborderBottom: false,\n\t\t\t\t\ticonPlacement: 'left'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 是否禁用，如果父组件u-raios-group禁用的话，将会忽略子组件的配置\n\t\t\telDisabled() {\n\t\t\t\treturn this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;\n\t\t\t},\n\t\t\t// 是否禁用label点击\n\t\t\telLabelDisabled() {\n\t\t\t\treturn this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled :\n\t\t\t\t\tfalse;\n\t\t\t},\n\t\t\t// 组件尺寸，对应size的值，默认值为21px\n\t\t\telSize() {\n\t\t\t\treturn this.size ? this.size : (this.parentData.size ? this.parentData.size : 21);\n\t\t\t},\n\t\t\t// 组件的勾选图标的尺寸，默认12px\n\t\t\telIconSize() {\n\t\t\t\treturn this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 12);\n\t\t\t},\n\t\t\t// 组件选中激活时的颜色\n\t\t\telActiveColor() {\n\t\t\t\treturn this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : '#2979ff');\n\t\t\t},\n\t\t\t// 组件选未中激活时的颜色\n\t\t\telInactiveColor() {\n\t\t\t\treturn this.inactiveColor ? this.inactiveColor : (this.parentData.inactiveColor ? this.parentData.inactiveColor :\n\t\t\t\t\t'#c8c9cc');\n\t\t\t},\n\t\t\t// label的颜色\n\t\t\telLabelColor() {\n\t\t\t\treturn this.labelColor ? this.labelColor : (this.parentData.labelColor ? this.parentData.labelColor : '#606266')\n\t\t\t},\n\t\t\t// 组件的形状\n\t\t\telShape() {\n\t\t\t\treturn this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');\n\t\t\t},\n\t\t\t// label大小\n\t\t\telLabelSize() {\n\t\t\t\treturn uni.$u.addUnit(this.labelSize ? this.labelSize : (this.parentData.labelSize ? this.parentData.labelSize :\n\t\t\t\t\t'15'))\n\t\t\t},\n\t\t\telIconColor() {\n\t\t\t\tconst iconColor = this.iconColor ? this.iconColor : (this.parentData.iconColor ? this.parentData.iconColor :\n\t\t\t\t\t'#ffffff');\n\t\t\t\t// 图标的颜色\n\t\t\t\tif (this.elDisabled) {\n\t\t\t\t\t// disabled状态下，已勾选的radio图标改为elInactiveColor\n\t\t\t\t\treturn this.checked ? this.elInactiveColor : 'transparent'\n\t\t\t\t} else {\n\t\t\t\t\treturn this.checked ? iconColor : 'transparent'\n\t\t\t\t}\n\t\t\t},\n\t\t\ticonClasses() {\n\t\t\t\tlet classes = []\n\t\t\t\t// 组件的形状\n\t\t\t\tclasses.push('u-radio__icon-wrap--' + this.elShape)\n\t\t\t\tif (this.elDisabled) {\n\t\t\t\t\tclasses.push('u-radio__icon-wrap--disabled')\n\t\t\t\t}\n\t\t\t\tif (this.checked && this.elDisabled) {\n\t\t\t\t\tclasses.push('u-radio__icon-wrap--disabled--checked')\n\t\t\t\t}\n\t\t\t\t// 支付宝，头条小程序无法动态绑定一个数组类名，否则解析出来的结果会带有\",\"，而导致失效\n\t\t\t\t// #ifdef MP-ALIPAY || MP-TOUTIAO\n\t\t\t\tclasses = classes.join(' ')\n\t\t\t\t// #endif\n\t\t\t\treturn classes\n\t\t\t},\n\t\t\ticonWrapStyle() {\n\t\t\t\t// radio的整体样式\n\t\t\t\tconst style = {}\n\t\t\t\tstyle.backgroundColor = this.checked && !this.elDisabled ? this.elActiveColor : '#ffffff'\n\t\t\t\tstyle.borderColor = this.checked && !this.elDisabled ? this.elActiveColor : this.elInactiveColor\n\t\t\t\tstyle.width = uni.$u.addUnit(this.elSize)\n\t\t\t\tstyle.height = uni.$u.addUnit(this.elSize)\n\t\t\t\t// 如果是图标在右边的话，移除它的右边距\n\t\t\t\tif (this.parentData.iconPlacement === 'right') {\n\t\t\t\t\tstyle.marginRight = 0\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tradioStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif(this.parentData.borderBottom && this.parentData.placement === 'row') {\n\t\t\t\t\tuni.$u.error('检测到您将borderBottom设置为true，需要同时将u-radio-group的placement设置为column才有效')\n\t\t\t\t}\n\t\t\t\t// 当父组件设置了显示下边框并且排列形式为纵向时，给内容和边框之间加上一定间隔\n\t\t\t\tif(this.parentData.borderBottom && this.parentData.placement === 'column') {\n\t\t\t\t\t// ios像素密度高，需要多一点的距离\n\t\t\t\t\tstyle.paddingBottom = uni.$u.os() === 'ios' ? '12px' : '8px'\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环引用\n\t\t\t\tthis.updateParentData()\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\tuni.$u.error('u-radio必须搭配u-radio-group组件使用')\n\t\t\t\t}\n\t\t\t\t// 设置初始化时，是否默认选中的状态\n\t\t\t\tthis.checked = this.name === this.parentData.value\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\tthis.getParentData('u-radio-group')\n\t\t\t},\n\t\t\t// 点击图标\n\t\t\ticonClickHandler(e) {\n\t\t\t\tthis.preventEvent(e)\n\t\t\t\t// 如果整体被禁用，不允许被点击\n\t\t\t\tif (!this.elDisabled) {\n\t\t\t\t\tthis.setRadioCheckedStatus()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 横向两端排列时，点击组件即可触发选中事件\n\t\t\twrapperClickHandler(e) {\n\t\t\t\tthis.parentData.iconPlacement === 'right' && this.iconClickHandler(e)\n\t\t\t},\n\t\t\t// 点击label\n\t\t\tlabelClickHandler(e) {\n\t\t\t\tthis.preventEvent(e)\n\t\t\t\t// 如果按钮整体被禁用或者label被禁用，则不允许点击文字修改状态\n\t\t\t\tif (!this.elLabelDisabled && !this.elDisabled) {\n\t\t\t\t\tthis.setRadioCheckedStatus()\n\t\t\t\t}\n\t\t\t},\n\t\t\temitEvent() {\n\t\t\t\t// u-radio的checked不为true时(意味着未选中)，才发出事件，避免多次点击触发事件\n\t\t\t\tif (!this.checked) {\n\t\t\t\t\tthis.$emit('change', this.name)\n\t\t\t\t\t// 尝试调用u-form的验证方法，进行一定延迟，否则微信小程序更新可能会不及时\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tuni.$u.formValidate(this, 'change')\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 改变组件选中状态\n\t\t\t// 这里的改变的依据是，更改本组件的checked值为true，同时通过父组件遍历所有u-radio实例\n\t\t\t// 将本组件外的其他u-radio的checked都设置为false(都被取消选中状态)，因而只剩下一个为选中状态\n\t\t\tsetRadioCheckedStatus() {\n\t\t\t\tthis.emitEvent()\n\t\t\t\t// 将本组件标记为选中状态\n\t\t\t\tthis.checked = true\n\t\t\t\ttypeof this.parent.unCheckedOther === 'function' && this.parent.unCheckedOther(this)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t$u-radio-wrap-margin-right:6px !default;\n\t$u-radio-wrap-font-size:20px !default;\n\t$u-radio-wrap-border-width:1px !default;\n\t$u-radio-wrap-border-color: #c8c9cc !default;\n\t$u-radio-line-height:0 !default;\n\t$u-radio-circle-border-radius:100% !default;\n\t$u-radio-square-border-radius:3px !default;\n\t$u-radio-checked-color:#fff !default;\n\t$u-radio-checked-background-color:red !default;\n\t$u-radio-checked-border-color: #2979ff !default;\n\t$u-radio-disabled-background-color:#ebedf0 !default;\n\t$u-radio-disabled--checked-color:#c8c9cc !default;\n\t$u-radio-label-margin-left: 5px !default;\n\t$u-radio-label-margin-right:12px !default;\n\t$u-radio-label-color:$u-content-color !default;\n\t$u-radio-label-font-size:15px !default;\n\t$u-radio-label-disabled-color:#c8c9cc !default;\n\t\n\t.u-radio {\n\t\t/* #ifndef APP-NVUE */\n\t\t@include flex(row);\n\t\t/* #endif */\n\t\toverflow: hidden;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\n\t\t&-label--left {\n\t\t\tflex-direction: row\n\t\t}\n\n\t\t&-label--right {\n\t\t\tflex-direction: row-reverse;\n\t\t\tjustify-content: space-between\n\t\t}\n\n\t\t&__icon-wrap {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tbox-sizing: border-box;\n\t\t\t// nvue下，border-color过渡有问题\n\t\t\ttransition-property: border-color, background-color, color;\n\t\t\ttransition-duration: 0.2s;\n\t\t\t/* #endif */\n\t\t\tcolor: $u-content-color;\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tcolor: transparent;\n\t\t\ttext-align: center;\n\t\t\tmargin-right: $u-radio-wrap-margin-right;\n\t\t\tfont-size: $u-radio-wrap-font-size;\n\t\t\tborder-width: $u-radio-wrap-border-width;\n\t\t\tborder-color: $u-radio-wrap-border-color;\n\t\t\tborder-style: solid;\n\n\t\t\t/* #ifdef MP-TOUTIAO */\n\t\t\t// 头条小程序兼容性问题，需要设置行高为0，否则图标偏下\n\t\t\t&__icon {\n\t\t\t\tline-height: $u-radio-line-height;\n\t\t\t}\n\n\t\t\t/* #endif */\n\n\t\t\t&--circle {\n\t\t\t\tborder-radius: $u-radio-circle-border-radius;\n\t\t\t}\n\n\t\t\t&--square {\n\t\t\t\tborder-radius: $u-radio-square-border-radius;\n\t\t\t}\n\n\t\t\t&--checked {\n\t\t\t\tcolor: $u-radio-checked-color;\n\t\t\t\tbackground-color: $u-radio-checked-background-color;\n\t\t\t\tborder-color: $u-radio-checked-border-color;\n\t\t\t}\n\n\t\t\t&--disabled {\n\t\t\t\tbackground-color: $u-radio-disabled-background-color !important;\n\t\t\t}\n\n\t\t\t&--disabled--checked {\n\t\t\t\tcolor: $u-radio-disabled--checked-color !important;\n\t\t\t}\n\t\t}\n\n\t\t&__label {\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tword-wrap: break-word;\n\t\t\t/* #endif */\n\t\t\tmargin-left: $u-radio-label-margin-left;\n\t\t\tmargin-right: $u-radio-label-margin-right;\n\t\t\tcolor: $u-radio-label-color;\n\t\t\tfont-size: $u-radio-label-font-size;\n\n\t\t\t&--disabled {\n\t\t\t\tcolor: $u-radio-label-disabled-color;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-radio-group/props.js",
    "content": "export default {\n    props: {\n        // 绑定的值\n        value: {\n            type: [String, Number, Boolean],\n            default: uni.$u.props.radioGroup.value\n        },\n\n        // 是否禁用全部radio\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.radioGroup.disabled\n        },\n        // 形状，circle-圆形，square-方形\n        shape: {\n            type: String,\n            default: uni.$u.props.radioGroup.shape\n        },\n        // 选中状态下的颜色，如设置此值，将会覆盖parent的activeColor值\n        activeColor: {\n            type: String,\n            default: uni.$u.props.radioGroup.activeColor\n        },\n        // 未选中的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.radioGroup.inactiveColor\n        },\n        // 标识符\n        name: {\n            type: String,\n            default: uni.$u.props.radioGroup.name\n        },\n        // 整个组件的尺寸，默认px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.radioGroup.size\n        },\n        // 布局方式，row-横向，column-纵向\n        placement: {\n            type: String,\n            default: uni.$u.props.radioGroup.placement\n        },\n        // label的文本\n        label: {\n            type: [String],\n            default: uni.$u.props.radioGroup.label\n        },\n        // label的颜色 （默认 '#303133' ）\n        labelColor: {\n            type: [String],\n            default: uni.$u.props.radioGroup.labelColor\n        },\n        // label的字体大小，px单位\n        labelSize: {\n            type: [String, Number],\n            default: uni.$u.props.radioGroup.labelSize\n        },\n        // 是否禁止点击文本操作checkbox(默认 false )\n        labelDisabled: {\n            type: Boolean,\n            default: uni.$u.props.radioGroup.labelDisabled\n        },\n        // 图标颜色\n        iconColor: {\n            type: String,\n            default: uni.$u.props.radioGroup.iconColor\n        },\n        // 图标的大小，单位px\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.radioGroup.iconSize\n        },\n        // 竖向配列时，是否显示下划线\n        borderBottom: {\n            type: Boolean,\n            default: uni.$u.props.radioGroup.borderBottom\n        },\n        // 图标与文字的对齐方式\n        iconPlacement: {\n            type: String,\n            default: uni.$u.props.radio.iconPlacement\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-radio-group/u-radio-group.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-radio-group\"\n\t    :class=\"bemClass\"\n\t>\n\t\t<slot></slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * radioRroup 单选框父组件\n\t * @description 单选框用于有一个选择，用户只能选择其中一个的场景。搭配u-radio使用\n\t * @tutorial https://www.uviewui.com/components/radio.html\n\t * @property {String | Number | Boolean}\tvalue \t\t\t绑定的值\n\t * @property {Boolean}\t\t\t\t\t\tdisabled\t\t是否禁用所有radio（默认 false ）\n\t * @property {String}\t\t\t\t\t\tshape\t\t\t外观形状，shape-方形，circle-圆形(默认 circle )\n\t * @property {String}\t\t\t\t\t\tactiveColor\t\t选中时的颜色，应用到所有子Radio组件（默认 '#2979ff' ）\n\t * @property {String}\t\t\t\t\t\tinactiveColor\t未选中的颜色 (默认 '#c8c9cc' )\n\t * @property {String}\t\t\t\t\t\tname\t\t\t标识符\n\t * @property {String | Number}\t\t\t\tsize\t\t\t组件整体的大小，单位px（默认 18 ）\n\t * @property {String}\t\t\t\t\t\tplacement\t\t布局方式，row-横向，column-纵向 （默认 'row' ）\n\t * @property {String}\t\t\t\t\t\tlabel\t\t\t文本\n\t * @property {String}\t\t\t\t\t\tlabelColor\t\tlabel的颜色 （默认 '#303133' ）\n\t * @property {String | Number}\t\t\t\tlabelSize\t\tlabel的字体大小，px单位 （默认 14 ）\n\t * @property {Boolean}\t\t\t\t\t\tlabelDisabled\t是否禁止点击文本操作checkbox(默认 false )\n\t * @property {String}\t\t\t\t\t\ticonColor\t\t图标颜色 （默认 '#ffffff' ）\n\t * @property {String | Number}\t\t\t\ticonSize\t\t图标的大小，单位px （默认 12 ）\n\t * @property {Boolean}\t\t\t\t\t\tborderBottom\tplacement为row时，是否显示下边框 （默认 false ）\n\t * @property {String}\t\t\t\t\t\ticonPlacement\t图标与文字的对齐方式 （默认 'left' ）\n     * @property {Object}\t\t\t\t\t\tcustomStyle\t\t组件的样式，对象形式\n\t * @event {Function} change 任一个radio状态发生变化时触发\n\t * @example <u-radio-group v-model=\"value\"></u-radio-group>\n\t */\n\texport default {\n\t\tname: 'u-radio-group',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tcomputed: {\n\t\t\t// 这里computed的变量，都是子组件u-radio需要用到的，由于头条小程序的兼容性差异，子组件无法实时监听父组件参数的变化\n\t\t\t// 所以需要手动通知子组件，这里返回一个parentData变量，供watch监听，在其中去通知每一个子组件重新从父组件(u-radio-group)\n\t\t\t// 拉取父组件新的变化后的参数\n\t\t\tparentData() {\n\t\t\t\treturn [this.value, this.disabled, this.inactiveColor, this.activeColor, this.size, this.labelDisabled, this.shape,\n\t\t\t\t\tthis.iconSize, this.borderBottom, this.placement\n\t\t\t\t]\n\t\t\t},\n\t\t\tbemClass() {\n\t\t\t\t// this.bem为一个computed变量，在mixin中\n\t\t\t\treturn this.bem('radio-group', ['placement'])\n\t\t\t},\n\t\t},\n\t\twatch: {\n\t\t\t// 当父组件需要子组件需要共享的参数发生了变化，手动通知子组件\n\t\t\tparentData() {\n\t\t\t\tif (this.children.length) {\n\t\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t\t// 判断子组件(u-radio)如果有init方法的话，就就执行(执行的结果是子组件重新从父组件拉取了最新的值)\n\t\t\t\t\t\ttypeof(child.init) === 'function' && child.init()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t},\n\t\tmethods: {\n\t\t\t// 将其他的radio设置为未选中的状态\n\t\t\tunCheckedOther(childInstance) {\n\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t// 所有子radio中，被操作组件实例的checked的值无需修改\n\t\t\t\t\tif (childInstance !== child) {\n\t\t\t\t\t\tchild.checked = false\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tconst {\n\t\t\t\t\tname\n\t\t\t\t} = childInstance\n\t\t\t\t// 通过emit事件，设置父组件通过v-model双向绑定的值\n\t\t\t\tthis.$emit('input', name)\n\t\t\t\t// 发出事件\n\t\t\t\tthis.$emit('change', name)\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-radio-group {\n\t\tflex: 1;\n\n\t\t&--row {\n\t\t\t@include flex;\n\t\t}\n\n\t\t&--column {\n\t\t\t@include flex(column);\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-rate/props.js",
    "content": "export default {\n    props: {\n        // 用于v-model双向绑定选中的星星数量\n        value: {\n            type: [String, Number],\n            default: uni.$u.props.rate.value\n        },\n        // 要显示的星星数量\n        count: {\n            type: [String, Number],\n            default: uni.$u.props.rate.count\n        },\n        // 是否不可选中\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.rate.disabled\n        },\n        // 是否只读\n        readonly: {\n            type: Boolean,\n            default: uni.$u.props.rate.readonly\n        },\n        // 星星的大小，单位px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.rate.size\n        },\n        // 未选中时的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.rate.inactiveColor\n        },\n        // 选中的颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.rate.activeColor\n        },\n        // 星星之间的间距，单位px\n        gutter: {\n            type: [String, Number],\n            default: uni.$u.props.rate.gutter\n        },\n        // 最少能选择的星星个数\n        minCount: {\n            type: [String, Number],\n            default: uni.$u.props.rate.minCount\n        },\n        // 是否允许半星\n        allowHalf: {\n            type: Boolean,\n            default: uni.$u.props.rate.allowHalf\n        },\n        // 选中时的图标(星星)\n        activeIcon: {\n            type: String,\n            default: uni.$u.props.rate.activeIcon\n        },\n        // 未选中时的图标(星星)\n        inactiveIcon: {\n            type: String,\n            default: uni.$u.props.rate.inactiveIcon\n        },\n        // 是否可以通过滑动手势选择评分\n        touchable: {\n            type: Boolean,\n            default: uni.$u.props.rate.touchable\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-rate/u-rate.vue",
    "content": "<template>\n    <view\n        class=\"u-rate\"\n        :id=\"elId\"\n        ref=\"u-rate\"\n        :style=\"[$u.addStyle(customStyle)]\"\n    >\n        <view\n            class=\"u-rate__content\"\n            @touchmove.stop=\"touchMove\"\n            @touchend.stop=\"touchEnd\"\n        >\n            <view\n                class=\"u-rate__content__item\"\n                v-for=\"(item, index) in Number(count)\"\n                :key=\"index\"\n                :class=\"[elClass]\"\n            >\n                <view\n                    class=\"u-rate__content__item__icon-wrap\"\n                    ref=\"u-rate__content__item__icon-wrap\"\n                    @tap.stop=\"clickHandler($event, index + 1)\"\n                >\n                    <u-icon\n                        :name=\"\n                            Math.floor(activeIndex) > index\n                                ? activeIcon\n                                : inactiveIcon\n                        \"\n                        :color=\"\n                            disabled\n                                ? '#c8c9cc'\n                                : Math.floor(activeIndex) > index\n                                ? activeColor\n                                : inactiveColor\n                        \"\n                        :custom-style=\"{\n                            'padding-left': $u.addUnit(gutter / 2),\n\t\t\t\t\t\t\t'padding-right': $u.addUnit(gutter / 2)\n                        }\"\n                        :size=\"size\"\n                    ></u-icon>\n                </view>\n                <view\n                    v-if=\"allowHalf\"\n                    @tap.stop=\"clickHandler($event, index + 1)\"\n                    class=\"u-rate__content__item__icon-wrap u-rate__content__item__icon-wrap--half\"\n                    :style=\"[{\n                        width: $u.addUnit(rateWidth / 2),\n                    }]\"\n                    ref=\"u-rate__content__item__icon-wrap\"\n                >\n                    <u-icon\n                        :name=\"\n                            Math.ceil(activeIndex) > index\n                                ? activeIcon\n                                : inactiveIcon\n                        \"\n                        :color=\"\n                            disabled\n                                ? '#c8c9cc'\n                                : Math.ceil(activeIndex) > index\n                                ? activeColor\n                                : inactiveColor\n                        \"\n                        :custom-style=\"{\n\t\t\t\t\t\t\t'padding-left': $u.addUnit(gutter / 2),\n\t\t\t\t\t\t\t'padding-right': $u.addUnit(gutter / 2)\n                        }\"\n                        :size=\"size\"\n                    ></u-icon>\n                </view>\n            </view>\n        </view>\n    </view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t// #ifdef APP-NVUE\n\tconst dom = weex.requireModule(\"dom\");\n\t// #endif\n\t/**\n\t * rate 评分\n\t * @description 该组件一般用于满意度调查，星型评分的场景\n\t * @tutorial https://www.uviewui.com/components/rate.html\n\t * @property {String | Number}\tvalue\t\t\t用于v-model双向绑定选中的星星数量 (默认 1 )\n\t * @property {String | Number}\tcount\t\t\t最多可选的星星数量 （默认 5 ）\n\t * @property {Boolean}\t\t\tdisabled\t\t是否禁止用户操作 （默认 false ）\n\t * @property {Boolean}\t\t\treadonly\t\t是否只读 （默认 false ）\n\t * @property {String | Number}\tsize\t\t\t星星的大小，单位px （默认 18 ）\n\t * @property {String}\t\t\tinactiveColor\t未选中星星的颜色 （默认 '#b2b2b2' ）\n\t * @property {String}\t\t\tactiveColor\t\t选中的星星颜色 （默认 '#FA3534' ）\n\t * @property {String | Number}\tgutter\t\t\t星星之间的距离 （默认 4 ）\n\t * @property {String | Number}\tminCount\t\t最少选中星星的个数 （默认 1 ）\n\t * @property {Boolean}\t\t\tallowHalf\t\t是否允许半星选择 （默认 false ）\n\t * @property {String}\t\t\tactiveIcon\t\t选中时的图标名，只能为uView的内置图标 （默认 'star-fill' ）\n\t * @property {String}\t\t\tinactiveIcon\t未选中时的图标名，只能为uView的内置图标 （默认 'star' ）\n\t * @property {Boolean}\t\t\ttouchable\t\t是否可以通过滑动手势选择评分 （默认 'true' ）\n\t * @property {Object}\t\t\tcustomStyle\t\t组件的样式，对象形式\n\t * @event {Function} change 选中的星星发生变化时触发\n\t * @example <u-rate :count=\"count\" :value=\"2\"></u-rate>\n\t */\n\texport default {\n\t\tname: \"u-rate\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 生成一个唯一id，否则一个页面多个评分组件，会造成冲突\n\t\t\t\telId: uni.$u.guid(),\n\t\t\t\telClass: uni.$u.guid(),\n\t\t\t\trateBoxLeft: 0, // 评分盒子左边到屏幕左边的距离，用于滑动选择时计算距离\n\t\t\t\tactiveIndex: this.value,\n\t\t\t\trateWidth: 0, // 每个星星的宽度\n\t\t\t\t// 标识是否正在滑动，由于iOS事件上touch比click先触发，导致快速滑动结束后，接着触发click，导致事件混乱而出错\n\t\t\t\tmoving: false,\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\tvalue(val) {\n\t\t\t\tthis.activeIndex = val;\n\t\t\t},\n\t\t\tactiveIndex: 'emitEvent'\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tuni.$u.sleep().then(() => {\n\t\t\t\t\tthis.getRateItemRect();\n\t\t\t\t\tthis.getRateIconWrapRect();\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取评分组件盒子的布局信息\n\t\t\tasync getRateItemRect() {\n\t\t\t\tawait uni.$u.sleep();\n\t\t\t\t// uView封装的获取节点的方法，详见文档\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect(\"#\" + this.elId).then((res) => {\n\t\t\t\t\tthis.rateBoxLeft = res.left;\n\t\t\t\t});\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tdom.getComponentRect(this.$refs[\"u-rate\"], (res) => {\n\t\t\t\t\tthis.rateBoxLeft = res.size.left;\n\t\t\t\t});\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 获取单个星星的尺寸\n\t\t\tgetRateIconWrapRect() {\n\t\t\t\t// uView封装的获取节点的方法，详见文档\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect(\".\" + this.elClass).then((res) => {\n\t\t\t\t\tthis.rateWidth = res.width;\n\t\t\t\t});\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tdom.getComponentRect(\n\t\t\t\t\tthis.$refs[\"u-rate__content__item__icon-wrap\"][0],\n\t\t\t\t\t(res) => {\n\t\t\t\t\t\tthis.rateWidth = res.size.width;\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 手指滑动\n\t\t\ttouchMove(e) {\n\t\t\t\t// 如果禁止通过手动滑动选择，返回\n\t\t\t\tif (!this.touchable) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.preventEvent(e);\n\t\t\t\tconst x = e.changedTouches[0].pageX;\n\t\t\t\tthis.getActiveIndex(x);\n\t\t\t},\n\t\t\t// 停止滑动\n\t\t\ttouchEnd(e) {\n\t\t\t\t// 如果禁止通过手动滑动选择，返回\n\t\t\t\tif (!this.touchable) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.preventEvent(e);\n\t\t\t\tconst x = e.changedTouches[0].pageX;\n\t\t\t\tthis.getActiveIndex(x);\n\t\t\t},\n\t\t\t// 通过点击，直接选中\n\t\t\tclickHandler(e, index) {\n\t\t\t\t// ios上，moving状态取消事件触发\n\t\t\t\tif (uni.$u.os() === \"ios\" && this.moving) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.preventEvent(e);\n\t\t\t\tlet x = 0;\n\t\t\t\t// 点击时，在nvue上，无法获得点击的坐标，所以无法实现点击半星选择\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tx = e.changedTouches[0].pageX;\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下，无法通过点击获得坐标信息，这里通过元素的位置尺寸值模拟坐标\n\t\t\t\tx = index * this.rateWidth + this.rateBoxLeft;\n\t\t\t\t// #endif\n\t\t\t\tthis.getActiveIndex(x,true);\n\t\t\t},\n\t\t\t// 发出事件\n\t\t\temitEvent() {\n\t\t\t\t// 发出change事件\n\t\t\t\tthis.$emit(\"change\", this.activeIndex);\n\t\t\t\t// 同时修改双向绑定的value的值\n\t\t\t\tthis.$emit(\"input\", this.activeIndex);\n\t\t\t},\n\t\t\t// 获取当前激活的评分图标\n\t\t\tgetActiveIndex(x,isClick = false) {\n\t\t\t\tif (this.disabled || this.readonly) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 判断当前操作的点的x坐标值，是否在允许的边界范围内\n\t\t\t\tconst allRateWidth = this.rateWidth * this.count + this.rateBoxLeft;\n\t\t\t\t// 如果小于第一个图标的左边界，设置为最小值，如果大于所有图标的宽度，则设置为最大值\n\t\t\t\tx = uni.$u.range(this.rateBoxLeft, allRateWidth, x) - this.rateBoxLeft\n\t\t\t\t// 滑动点相对于评分盒子左边的距离\n\t\t\t\tconst distance = x;\n\t\t\t\t// 滑动的距离，相当于多少颗星星\n\t\t\t\tlet index;\n\t\t\t\t// 判断是否允许半星\n\t\t\t\tif (this.allowHalf) {\n\t\t\t\t\tindex = Math.floor(distance / this.rateWidth);\n\t\t\t\t\t// 取余，判断小数的区间范围\n\t\t\t\t\tconst decimal = distance % this.rateWidth;\n\t\t\t\t\tif (decimal <= this.rateWidth / 2 && decimal > 0) {\n\t\t\t\t\t\tindex += 0.5;\n\t\t\t\t\t} else if (decimal > this.rateWidth / 2) {\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tindex = Math.floor(distance / this.rateWidth);\n\t\t\t\t\t// 取余，判断小数的区间范围\n\t\t\t\t\tconst decimal = distance % this.rateWidth;\n\t\t\t\t\t// 非半星时，只有超过了图标的一半距离，才认为是选择了这颗星\n\t\t\t\t\tif (isClick){\n\t\t\t\t\t\tif (decimal > 0) index++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (decimal > this.rateWidth / 2) index++;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tthis.activeIndex = Math.min(index, this.count);\n\t\t\t\t// 对最少颗星星的限制\n\t\t\t\tif (this.activeIndex < this.minCount) {\n\t\t\t\t\tthis.activeIndex = this.minCount;\n\t\t\t\t}\n\n\t\t\t\t// 设置延时为了让click事件在touchmove之前触发\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.moving = true;\n\t\t\t\t}, 10);\n\t\t\t\t// 一定时间后，取消标识为移动中状态，是为了让click事件无效\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.moving = false;\n\t\t\t\t}, 10);\n\t\t\t},\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init();\n\t\t},\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n$u-rate-margin: 0 !default;\n$u-rate-padding: 0 !default;\n$u-rate-item-icon-wrap-half-top: 0 !default;\n$u-rate-item-icon-wrap-half-left: 0 !default;\n\n.u-rate {\n    @include flex;\n    align-items: center;\n    margin: $u-rate-margin;\n    padding: $u-rate-padding;\n    /* #ifndef APP-NVUE */\n    touch-action: none;\n    /* #endif */\n\n    &__content {\n        @include flex;\n\n\t\t&__item {\n\t\t    position: relative;\n\n\t\t    &__icon-wrap {\n\t\t        &--half {\n\t\t            position: absolute;\n\t\t            overflow: hidden;\n\t\t            top: $u-rate-item-icon-wrap-half-top;\n\t\t            left: $u-rate-item-icon-wrap-half-left;\n\t\t        }\n\t\t    }\n\t\t}\n    }\n}\n\n.u-icon {\n    /* #ifndef APP-NVUE */\n    box-sizing: border-box;\n    /* #endif */\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-read-more/props.js",
    "content": "export default {\n    props: {\n        // 默认的显示占位高度\n        showHeight: {\n            type: [String, Number],\n            default: uni.$u.props.readMore.showHeight\n        },\n        // 展开后是否显示\"收起\"按钮\n        toggle: {\n            type: Boolean,\n            default: uni.$u.props.readMore.toggle\n        },\n        // 关闭时的提示文字\n        closeText: {\n            type: String,\n            default: uni.$u.props.readMore.closeText\n        },\n        // 展开时的提示文字\n        openText: {\n            type: String,\n            default: uni.$u.props.readMore.openText\n        },\n        // 提示的文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.readMore.color\n        },\n        // 提示文字的大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.readMore.fontSize\n        },\n        // 是否显示阴影\n        // 此参数不能写在props/readMore.js中进行默认配置，因为使用了条件编译，在外部js中\n        // uni无法准确识别当前是否处于nvue还是非nvue下\n        shadowStyle: {\n            type: Object,\n            default: () => ({\n                // #ifndef APP-NVUE\n                backgroundImage: 'linear-gradient(-180deg, rgba(255, 255, 255, 0) 0%, #fff 80%)',\n                // #endif\n                // #ifdef APP-NVUE\n                // nvue上不支持设置复杂的backgroundImage属性\n                backgroundImage: 'linear-gradient(to top, #fff, rgba(255, 255, 255, 0.5))',\n                // #endif\n                paddingTop: '100px',\n                marginTop: '-100px'\n            })\n        },\n        // 段落首行缩进的字符个数\n        textIndent: {\n            type: String,\n            default: uni.$u.props.readMore.textIndent\n        },\n        // open和close事件时，将此参数返回在回调参数中\n        name: {\n            type: [String, Number],\n            default: uni.$u.props.readMore.name\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-read-more/u-read-more.vue",
    "content": "<template>\n\t<view class=\"u-read-more\">\n\t\t<view\n\t\t    class=\"u-read-more__content\"\n\t\t    :style=\"{\n\t\t\t\theight: isLongContent && status === 'close' ? $u.addUnit(showHeight) : $u.addUnit(contentHeight),\n\t\t\t\ttextIndent: textIndent\n\t\t\t}\"\n\t\t>\n\t\t\t<view\n\t\t\t    class=\"u-read-more__content__inner\"\n\t\t\t    ref=\"u-read-more__content__inner\"\n\t\t\t    :class=\"[elId]\"\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t</view>\n\t\t</view>\n\t\t<view\n\t\t    class=\"u-read-more__toggle\"\n\t\t    :style=\"[innerShadowStyle]\"\n\t\t    v-if=\"isLongContent\"\n\t\t>\n\t\t\t<slot name=\"toggle\">\n\t\t\t\t<view\n\t\t\t\t    class=\"u-read-more__toggle__text\"\n\t\t\t\t    @tap=\"toggleReadMore\"\n\t\t\t\t>\n\t\t\t\t\t<u--text\n\t\t\t\t\t    :text=\"status === 'close' ? closeText : openText\"\n\t\t\t\t\t    :color=\"color\"\n\t\t\t\t\t    :size=\"fontSize\"\n\t\t\t\t\t    :lineHeight=\"fontSize\"\n\t\t\t\t\t    margin=\"0 5px 0 0\"\n\t\t\t\t\t></u--text>\n\t\t\t\t\t<view class=\"u-read-more__toggle__icon\">\n\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t    :color=\"color\"\n\t\t\t\t\t\t    :size=\"fontSize + 2\"\n\t\t\t\t\t\t    :name=\"status === 'close' ? 'arrow-down' : 'arrow-up'\"\n\t\t\t\t\t\t></u-icon>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</slot>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\timport props from './props.js';\n\t/**\n\t * readMore 阅读更多\n\t * @description 该组件一般用于内容较长，预先收起一部分，点击展开全部内容的场景。\n\t * @tutorial https://www.uviewui.com/components/readMore.html\n\t * @property {String | Number}\tshowHeight\t内容超出此高度才会显示展开全文按钮，单位px（默认 400 ）\n\t * @property {Boolean}\t\t\ttoggle\t\t展开后是否显示收起按钮（默认 false ）\n\t * @property {String}\t\t\tcloseText\t关闭时的提示文字（默认 '展开阅读全文' ）\n\t * @property {String}\t\t\topenText\t展开时的提示文字（默认 '收起' ）\n\t * @property {String}\t\t\tcolor\t\t提示文字的颜色（默认 '#2979ff' ）\n\t * @property {String | Number}\tfontSize\t提示文字的大小，单位px （默认 14 ）\n\t * @property {Object}\t\t\tshadowStyle\t显示阴影的样式\n\t * @property {String}\t\t\ttextIndent\t段落首行缩进的字符个数 （默认 '2em' ）\n\t * @property {String | Number}\tname\t\t用于在 open 和 close 事件中当作回调参数返回\n\t * @event {Function} open 内容被展开时触发\n\t * @event {Function} close 内容被收起时触发\n\t * @example <u-read-more><rich-text :nodes=\"content\"></rich-text></u-read-more>\n\t */\n\texport default {\n\t\tname: 'u-read-more',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisLongContent: false, // 是否需要隐藏一部分内容\n\t\t\t\tstatus: 'close', // 当前隐藏与显示的状态，close-收起状态，open-展开状态\n\t\t\t\telId: uni.$u.guid(), // 生成唯一class\n\t\t\t\tcontentHeight: 100, // 内容高度\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 展开后无需阴影，收起时才需要阴影样式\n\t\t\tinnerShadowStyle() {\n\t\t\t\tif (this.status === 'open') return {}\n\t\t\t\telse return this.shadowStyle\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tasync init() {\n\t\t\t\tthis.getContentHeight().then(height => {\n\t\t\t\t\tthis.contentHeight = height\n\t\t\t\t\t// 判断高度，如果真实内容高度大于占位高度，则显示收起与展开的控制按钮\n\t\t\t\t\tif (height > uni.$u.getPx(this.showHeight)) {\n\t\t\t\t\t\tthis.isLongContent = true\n\t\t\t\t\t\tthis.status = 'close'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取内容的高度\n\t\t\tasync getContentHeight() {\n\t\t\t\t// 延时一定时间再获取节点\n\t\t\t\tawait uni.$u.sleep(30)\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.$uGetRect('.' + this.elId).then(res => {\n\t\t\t\t\t\tresolve(res.height)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tconst ref = this.$refs['u-read-more__content__inner']\n\t\t\t\t\tdom.getComponentRect(ref, (res) => {\n\t\t\t\t\t\tresolve(res.size.height)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 展开或者收起\n\t\t\ttoggleReadMore() {\n\t\t\t\tthis.status = this.status === 'close' ? 'open' : 'close'\n\t\t\t\t// 如果toggle为false，隐藏\"收起\"部分的内容\n\t\t\t\tif (this.toggle == false) this.isLongContent = false\n\t\t\t\t// 发出打开或者收齐的事件\n\t\t\t\tthis.$emit(this.status, this.name)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n.u-read-more {\n\n\t&__content {\n\t\toverflow: hidden;\n\t\tcolor: $u-content-color;\n\t\tfont-size: 15px;\n\t\ttext-align: left;\n\t}\n\n\t&__toggle {\n\t\t@include flex;\n\t\tjustify-content: center;\n\n\t\t&__text {\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tmargin-top: 5px;\n\t\t}\n\t}\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-row/props.js",
    "content": "export default {\n    props: {\n        // 给col添加间距，左右边距各占一半\n        gutter: {\n            type: [String, Number],\n            default: uni.$u.props.row.gutter\n        },\n        // 水平排列方式，可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)\n        justify: {\n            type: String,\n            default: uni.$u.props.row.justify\n        },\n        // 垂直对齐方式，可选值为top、center、bottom\n        align: {\n            type: String,\n            default: uni.$u.props.row.align\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-row/u-row.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-row\"\n\t\tref=\"u-row\"\n\t    :style=\"[rowStyle]\"\n\t    @tap=\"clickHandler\"\n\t>\n\t\t<slot />\n\t</view>\n</template>\n\n<script>\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\timport props from './props.js';\n\t/**\n\t * Row 栅格系统中的行\n\t * @description 通过基础的 12 分栏，迅速简便地创建布局 \n\t * @tutorial https://www.uviewui.com/components/layout.html\n\t * @property {String | Number}\tgutter\t\t栅格间隔，左右各为此值的一半，单位px  (默认 0 )\n\t * @property {String}\t\t\tjustify\t\t水平排列方式(微信小程序暂不支持) 可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)  (默认 'start' )\n\t * @property {String}\t\t\talign\t\t垂直排列方式 (默认 'center' )\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @event {Function} click row被点击\n\t * @example <u-row justify=\"space-between\" customStyle=\"margin-bottom: 10px\"></u-row>\n\t */\n\texport default {\n\t\tname: \"u-row\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tuJustify() {\n\t\t\t\tif (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify\n\t\t\t\telse if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify\n\t\t\t\telse return this.justify\n\t\t\t},\n\t\t\tuAlignItem() {\n\t\t\t\tif (this.align == 'top') return 'flex-start'\n\t\t\t\tif (this.align == 'bottom') return 'flex-end'\n\t\t\t\telse return this.align\n\t\t\t},\n\t\t\trowStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\talignItems: this.uAlignItem,\n\t\t\t\t\tjustifyContent: this.uJustify\n\t\t\t\t}\n\t\t\t\t// 通过给u-row左右两边的负外边距，消除u-col在有gutter时，第一个和最后一个元素的左内边距和右内边距造成的影响\n\t\t\t\tif(this.gutter) {\n\t\t\t\t\tstyle.marginLeft = uni.$u.addUnit(-Number(this.gutter)/2)\n\t\t\t\t\tstyle.marginRight = uni.$u.addUnit(-Number(this.gutter)/2)\n\t\t\t\t}\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tclickHandler(e) {\n\t\t\t\tthis.$emit('click')\n\t\t\t},\n\t\t\tasync getComponentWidth() {\n\t\t\t\t// 延时一定时间，以确保节点渲染完成\n\t\t\t\tawait uni.$u.sleep()\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\t// uView封装的获取节点的方法，详见文档\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.$uGetRect('.u-row').then(res => {\n\t\t\t\t\t\tresolve(res.width)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\t// nvue的dom模块用于获取节点\n\t\t\t\t\tdom.getComponentRect(this.$refs['u-row'], (res) => {\n\t\t\t\t\t\tresolve(res.size.width)\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t\n\t.u-row {\n\t\t@include flex;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-row-notice/props.js",
    "content": "export default {\n    props: {\n        // 显示的内容，字符串\n        text: {\n            type: String,\n            default: uni.$u.props.rowNotice.text\n        },\n        // 是否显示左侧的音量图标\n        icon: {\n            type: String,\n            default: uni.$u.props.rowNotice.icon\n        },\n        // 通告模式，link-显示右箭头，closable-显示右侧关闭图标\n        mode: {\n            type: String,\n            default: uni.$u.props.rowNotice.mode\n        },\n        // 文字颜色，各图标也会使用文字颜色\n        color: {\n            type: String,\n            default: uni.$u.props.rowNotice.color\n        },\n        // 背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.rowNotice.bgColor\n        },\n        // 字体大小，单位px\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.rowNotice.fontSize\n        },\n        // 水平滚动时的滚动速度，即每秒滚动多少px(rpx)，这有利于控制文字无论多少时，都能有一个恒定的速度\n        speed: {\n            type: [String, Number],\n            default: uni.$u.props.rowNotice.speed\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-row-notice/u-row-notice.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-notice\"\n\t\t@tap=\"clickHandler\"\n\t>\n\t\t<slot name=\"icon\">\n\t\t\t<view\n\t\t\t\tclass=\"u-notice__left-icon\"\n\t\t\t\tv-if=\"icon\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t\t:name=\"icon\"\n\t\t\t\t\t:color=\"color\"\n\t\t\t\t\tsize=\"19\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t</slot>\n\t\t<view\n\t\t\tclass=\"u-notice__content\"\n\t\t\tref=\"u-notice__content\"\n\t\t>\n\t\t\t<view\n\t\t\t\tref=\"u-notice__content__text\"\n\t\t\t\tclass=\"u-notice__content__text\"\n\t\t\t\t:style=\"[animationStyle]\"\n\t\t\t>\n\t\t\t\t<text\n\t\t\t\t\tv-for=\"(item, index) in innerText\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t:style=\"[textStyle]\"\n\t\t\t\t>{{item}}</text>\n\t\t\t</view>\n\t\t</view>\n\t\t<view\n\t\t\tclass=\"u-notice__right-icon\"\n\t\t\tv-if=\"['link', 'closable'].includes(mode)\"\n\t\t>\n\t\t\t<u-icon\n\t\t\t\tv-if=\"mode === 'link'\"\n\t\t\t\tname=\"arrow-right\"\n\t\t\t\t:size=\"17\"\n\t\t\t\t:color=\"color\"\n\t\t\t></u-icon>\n\t\t\t<u-icon\n\t\t\t\tv-if=\"mode === 'closable'\"\n\t\t\t\t@click=\"close\"\n\t\t\t\tname=\"close\"\n\t\t\t\t:size=\"16\"\n\t\t\t\t:color=\"color\"\n\t\t\t></u-icon>\n\t\t</view>\n\t</view>\n</template>\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst animation = uni.requireNativePlugin('animation')\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * RowNotice 滚动通知中的水平滚动模式\n\t * @description 水平滚动\n\t * @tutorial https://www.uviewui.com/components/noticeBar.html\n\t * @property {String | Number}\ttext\t\t\t显示的内容，字符串\n\t * @property {String}\t\t\ticon\t\t\t是否显示左侧的音量图标 (默认 'volume' )\n\t * @property {String}\t\t\tmode\t\t\t通告模式，link-显示右箭头，closable-显示右侧关闭图标\n\t * @property {String}\t\t\tcolor\t\t\t文字颜色，各图标也会使用文字颜色 (默认 '#f9ae3d' )\n\t * @property {String}\t\t\tbgColor\t\t\t背景颜色 (默认 ''#fdf6ec' )\n\t * @property {String | Number}\tfontSize\t\t字体大小，单位px (默认 14 )\n\t * @property {String | Number}\tspeed\t\t\t水平滚动时的滚动速度，即每秒滚动多少px(rpx)，这有利于控制文字无论多少时，都能有一个恒定的速度  (默认 80 )\n\t * \n\t * @event {Function} click 点击通告文字触发\n\t * @event {Function} close 点击右侧关闭图标触发\n\t * @example \n\t */\n\texport default {\n\t\tname: 'u-row-notice',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tanimationDuration: '0', // 动画执行时间\n\t\t\t\tanimationPlayState: 'paused', // 动画的开始和结束执行\n\t\t\t\t// nvue下，内容发生变化，导致滚动宽度也变化，需要标志为是否需要重新计算宽度\n\t\t\t\t// 不能在内容变化时直接重新计算，因为nvue的animation模块上一次的滚动不是刚好结束，会有影响\n\t\t\t\tnvueInit: true,\n\t\t\t\tshow: true\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\ttext: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(newValue, oldValue) {\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tthis.nvueInit = true\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.vue()\n\t\t\t\t\t// #endif\n\t\t\t\t\t\n\t\t\t\t\tif(!uni.$u.test.string(newValue)) {\n\t\t\t\t\t\tuni.$u.error('noticebar组件direction为row时，要求text参数为字符串形式')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tfontSize() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.nvueInit = true\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.vue()\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tspeed() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.nvueInit = true\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.vue()\n\t\t\t\t// #endif\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 文字内容的样式\n\t\t\ttextStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\tstyle.color = this.color\n\t\t\t\tstyle.fontSize = uni.$u.addUnit(this.fontSize)\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tanimationStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\tstyle.animationDuration = this.animationDuration\n\t\t\t\tstyle.animationPlayState = this.animationPlayState\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 内部对用户传入的数据进一步分割，放到多个text标签循环，否则如果用户传入的字符串很长（100个字符以上）\n\t\t\t// 放在一个text标签中进行滚动，在低端安卓机上，动画可能会出现抖动现象，需要分割到多个text中可解决此问题\n\t\t\tinnerText() {\n\t\t\t\tlet result = [],\n\t\t\t\t\t// 每组text标签的字符长度\n\t\t\t\t\tlen = 20\n\t\t\t\tconst textArr = this.text.split('')\n\t\t\t\tfor (let i = 0; i < textArr.length; i += len) {\n\t\t\t\t\t// 对拆分的后的text进行slice分割，得到的为数组再进行join拼接为字符串\n\t\t\t\t\tresult.push(textArr.slice(i, i + len).join(''))\n\t\t\t\t}\n\t\t\t\treturn result\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\t// #ifdef APP-PLUS\n\t\t\t// 在APP上(含nvue)，监听当前webview是否处于隐藏状态(进入下一页时即为hide状态)\n\t\t\t// 如果webivew隐藏了，为了节省性能的损耗，应停止动画的执行，同时也是为了保持进入下一页返回后，滚动位置保持不变\n\t\t\tvar pages = getCurrentPages()\n\t\t\tvar page = pages[pages.length - 1]\n\t\t\tvar currentWebview = page.$getAppWebview()\n\t\t\tcurrentWebview.addEventListener('hide', () => {\n\t\t\t\tthis.webviewHide = true\n\t\t\t})\n\t\t\tcurrentWebview.addEventListener('show', () => {\n\t\t\t\tthis.webviewHide = false\n\t\t\t})\n\t\t\t// #endif\n\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.nvue()\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.vue()\n\t\t\t\t// #endif\n\t\t\t\t\n\t\t\t\tif(!uni.$u.test.string(this.text)) {\n\t\t\t\t\tuni.$u.error('noticebar组件direction为row时，要求text参数为字符串形式')\n\t\t\t\t}\n\t\t\t},\n\t\t\t// vue版处理\n\t\t\tasync vue() {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tlet boxWidth = 0,\n\t\t\t\t\ttextWidth = 0\n\t\t\t\t// 进行一定的延时\n\t\t\t\tawait uni.$u.sleep()\n\t\t\t\t// 查询盒子和文字的宽度\n\t\t\t\ttextWidth = (await this.$uGetRect('.u-notice__content__text')).width\n\t\t\t\tboxWidth = (await this.$uGetRect('.u-notice__content')).width\n\t\t\t\t// 根据t=s/v(时间=路程/速度)，这里为何不需要加上#u-notice-box的宽度，因为中设置了.u-notice-content样式中设置了padding-left: 100%\n\t\t\t\t// 恰巧计算出来的结果中已经包含了#u-notice-box的宽度\n\t\t\t\tthis.animationDuration = `${textWidth / uni.$u.getPx(this.speed)}s`\n\t\t\t\t// 这里必须这样开始动画，否则在APP上动画速度不会改变\n\t\t\t\tthis.animationPlayState = 'paused'\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.animationPlayState = 'running'\n\t\t\t\t}, 10)\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// nvue版处理\n\t\t\tasync nvue() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.nvueInit = false\n\t\t\t\tlet boxWidth = 0,\n\t\t\t\t\ttextWidth = 0\n\t\t\t\t// 进行一定的延时\n\t\t\t\tawait uni.$u.sleep()\n\t\t\t\t// 查询盒子和文字的宽度\n\t\t\t\ttextWidth = (await this.getNvueRect('u-notice__content__text')).width\n\t\t\t\tboxWidth = (await this.getNvueRect('u-notice__content')).width\n\t\t\t\t// 将文字移动到盒子的右边沿，之所以需要这么做，是因为nvue不支持100%单位，否则可以通过css设置\n\t\t\t\tanimation.transition(this.$refs['u-notice__content__text'], {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\ttransform: `translateX(${boxWidth}px)`\n\t\t\t\t\t},\n\t\t\t\t}, () => {\n\t\t\t\t\t// 如果非禁止动画，则开始滚动\n\t\t\t\t\t!this.stopAnimation && this.loopAnimation(textWidth, boxWidth)\n\t\t\t\t});\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tloopAnimation(textWidth, boxWidth) {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tanimation.transition(this.$refs['u-notice__content__text'], {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\t// 目标移动终点为-textWidth，也即当文字的最右边贴到盒子的左边框的位置\n\t\t\t\t\t\ttransform: `translateX(-${textWidth}px)`\n\t\t\t\t\t},\n\t\t\t\t\t// 滚动时间的计算为，时间 = 路程(boxWidth + textWidth) / 速度，最后转为毫秒\n\t\t\t\t\tduration: (boxWidth + textWidth) / uni.$u.getPx(this.speed) * 1000,\n\t\t\t\t\tdelay: 10\n\t\t\t\t}, () => {\n\t\t\t\t\tanimation.transition(this.$refs['u-notice__content__text'], {\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\t// 重新将文字移动到盒子的右边沿\n\t\t\t\t\t\t\ttransform: `translateX(${this.stopAnimation ? 0 : boxWidth}px)`\n\t\t\t\t\t\t},\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\t// 如果非禁止动画，则继续下一轮滚动\n\t\t\t\t\t\tif (!this.stopAnimation) {\n\t\t\t\t\t\t\t// 判断是否需要初始化计算尺寸\n\t\t\t\t\t\t\tif (this.nvueInit) {\n\t\t\t\t\t\t\t\tthis.nvue()\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.loopAnimation(textWidth, boxWidth)\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\t// #endif\n\t\t\t},\n\t\t\tgetNvueRect(el) {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 返回一个promise\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(this.$refs[el], (res) => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 点击通告栏\n\t\t\tclickHandler(index) {\n\t\t\t\tthis.$emit('click')\n\t\t\t},\n\t\t\t// 点击右侧按钮，需要判断点击的是关闭图标还是箭头图标\n\t\t\tclose() {\n\t\t\t\tthis.$emit('close')\n\t\t\t}\n\t\t},\n\t\t// #ifdef APP-NVUE\n\t\tbeforeDestroy() {\n\t\t\tthis.stopAnimation = true\n\t\t},\n\t\t// #endif\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-notice {\n\t\t@include flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\n\t\t&__left-icon {\n\t\t\talign-items: center;\n\t\t\tmargin-right: 5px;\n\t\t}\n\n\t\t&__right-icon {\n\t\t\tmargin-left: 5px;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t&__content {\n\t\t\ttext-align: right;\n\t\t\tflex: 1;\n\t\t\t@include flex;\n\t\t\tflex-wrap: nowrap;\n\t\t\toverflow: hidden;\n\n\t\t\t&__text {\n\t\t\t\tfont-size: 14px;\n\t\t\t\tcolor: $u-warning;\n\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\t// 这一句很重要，为了能让滚动左右连接起来\n\t\t\t\tpadding-left: 100%;\n\t\t\t\tword-break: keep-all;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tanimation: u-loop-animation 10s linear infinite both;\n\t\t\t\t/* #endif */\n\t\t\t\t@include flex(row);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t@keyframes u-loop-animation {\n\t\t0% {\n\t\t\ttransform: translate3d(0, 0, 0);\n\t\t}\n\n\t\t100% {\n\t\t\ttransform: translate3d(-100%, 0, 0);\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-safe-bottom/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-safe-bottom/u-safe-bottom.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-safe-bottom\"\n\t\t:style=\"[style]\"\n\t\t:class=\"[!isNvue && 'u-safe-area-inset-bottom']\"\n\t>\n\t</view>\n</template>\n\n<script>\n\timport props from \"./props.js\";\n\t/**\n\t * SafeBottom 底部安全区\n\t * @description 这个适配，主要是针对IPhone X等一些底部带指示条的机型，指示条的操作区域与页面底部存在重合，容易导致用户误操作，因此我们需要针对这些机型进行底部安全区适配。\n\t * @tutorial https://www.uviewui.com/components/safeAreaInset.html\n\t * @property {type}\t\tprop_name\n\t * @property {Object}\tcustomStyle\t定义需要用到的外部样式\n\t *\n\t * @event {Function()}\n\t * @example <u-status-bar></u-status-bar>\n\t */\n\texport default {\n\t\tname: \"u-safe-bottom\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tsafeAreaBottomHeight: 0,\n\t\t\t\tisNvue: false,\n\t\t\t};\n\t\t},\n\t\tcomputed: {\n\t\t\tstyle() {\n\t\t\t\tconst style = {};\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下，高度使用js计算填充\n\t\t\t\tstyle.height = uni.$u.addUnit(uni.$u.sys().safeAreaInsets.bottom, 'px');\n\t\t\t\t// #endif\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));\n\t\t\t},\n\t\t},\n\t\tmounted() {\n\t\t\t// #ifdef APP-NVUE\n\t\t\t// 标识为是否nvue\n\t\t\tthis.isNvue = true;\n\t\t\t// #endif\n\t\t},\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t.u-safe-bottom {\n\t\t/* #ifndef APP-NVUE */\n\t\twidth: 100%;\n\t\t/* #endif */\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-scroll-list/nvue.js",
    "content": "// 引入bindingx，此库类似于微信小程序wxs，目的是让js运行在视图层，减少视图层和逻辑层的通信折损\nconst BindingX = uni.requireNativePlugin('bindingx')\n\nexport default {\n    methods: {\n        // 此处不写注释，请自行体会\n        nvueScrollHandler(e) {\n            const anchor = this.$refs['u-scroll-list__scroll-view'].ref\n            const element = this.$refs['u-scroll-list__indicator__line__bar'].ref\n            const scrollLeft = e.contentOffset.x\n            const contentSize = e.contentSize.width\n            const { scrollWidth } = this\n            const barAllMoveWidth = this.indicatorWidth - this.indicatorBarWidth\n            // 在安卓和iOS上，需要除的倍数不一样，iOS需要除以2\n            const actionNum = uni.$u.os() === 'ios' ? 2 : 1\n            const expression = `(x / ${actionNum}) / ${contentSize - scrollWidth} * ${barAllMoveWidth}`\n            BindingX.bind({\n                anchor,\n                eventType: 'scroll',\n                props: [{\n                    element,\n                    property: 'transform.translateX',\n                    expression\n                }]\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-scroll-list/other.js",
    "content": ""
  },
  {
    "path": "uni_modules/uview-ui/components/u-scroll-list/props.js",
    "content": "export default {\n    props: {\n        // 指示器的整体宽度\n        indicatorWidth: {\n            type: [String, Number],\n            default: uni.$u.props.scrollList.indicatorWidth\n        },\n        // 滑块的宽度\n        indicatorBarWidth: {\n            type: [String, Number],\n            default: uni.$u.props.scrollList.indicatorBarWidth\n        },\n        // 是否显示面板指示器\n        indicator: {\n            type: Boolean,\n            default: uni.$u.props.scrollList.indicator\n        },\n        // 指示器非激活颜色\n        indicatorColor: {\n            type: String,\n            default: uni.$u.props.scrollList.indicatorColor\n        },\n        // 指示器的激活颜色\n        indicatorActiveColor: {\n            type: String,\n            default: uni.$u.props.scrollList.indicatorActiveColor\n        },\n        // 指示器样式，可通过bottom，left，right进行定位\n        indicatorStyle: {\n            type: [String, Object],\n            default: uni.$u.props.scrollList.indicatorStyle\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-scroll-list/scrollWxs.wxs",
    "content": "function scroll(event, ownerInstance) {\n\t// detail中含有scroll-view的信息，比如scroll-view的实际宽度，当前时间点scroll-view的移动距离等\n\tvar detail = event.detail\n\tvar scrollWidth = detail.scrollWidth\n\tvar scrollLeft = detail.scrollLeft\n\t// 获取当前组件的dataset，说白了就是祸国殃民的腾xun搞出来的垃ji\n\tvar dataset = event.currentTarget.dataset\n\t// 此为scroll-view外部包裹元素的宽度\n\t// 某些HX版本(3.1.18)，发现view元素中大写的data-scrollWidth，在wxs中，变成了全部小写，所以这里需要特别处理\n\tvar scrollComponentWidth = dataset.scrollWidth || dataset.scrollwidth || 0\n\t// 指示器和滑块的宽度\n\tvar indicatorWidth = dataset.indicatorWidth || dataset.indicatorwidth || 0\n\tvar barWidth = dataset.barWidth || dataset.barwidth || 0\n\t// 此处的计算理由为：scroll-view的滚动距离与目标滚动距离(scroll-view的实际宽度减去包裹元素的宽度)之比，等于滑块当前移动距离与总需\n\t// 滑动距离(指示器的总宽度减去滑块宽度)的比值\n\tvar x = scrollLeft / (scrollWidth - scrollComponentWidth) * (indicatorWidth - barWidth)\n\tsetBarStyle(ownerInstance, x)\n}\n\n// 由于webview的无能，无法保证scroll-view在滑动过程中，一直触发scroll事件，会导致\n// 无法监听到某些滚动值，当在首尾临界值无法监听到时，这是致命的，因为错失这些值会导致滑块无法回到起点和终点\n// 所以这里需要对临界值做监听并处理\nfunction scrolltolower(event, ownerInstance) {\n\townerInstance.callMethod('scrollEvent', 'right')\n\t// 获取当前组件的dataset\n\tvar dataset = event.currentTarget.dataset\n\t// 指示器和滑块的宽度\n\tvar indicatorWidth = dataset.indicatorWidth || dataset.indicatorwidth || 0\n\tvar barWidth = dataset.barWidth || dataset.barwidth || 0\n\t// scroll-view滚动到右边终点时，将滑块也设置为到右边的终点，它所需移动的距离为：指示器宽度 - 滑块宽度\n\tsetBarStyle(ownerInstance, indicatorWidth - barWidth)\n}\n\nfunction scrolltoupper(event, ownerInstance) {\n\townerInstance.callMethod('scrollEvent', 'left')\n\t// 滚动到左边时，将滑块设置为0的偏移距离，回到起点\n\tsetBarStyle(ownerInstance, 0)\n}\n\nfunction setBarStyle(ownerInstance, x) {\n\townerInstance.selectComponent('.u-scroll-list__indicator__line__bar') && ownerInstance.selectComponent('.u-scroll-list__indicator__line__bar').setStyle({\n\t\ttransform: 'translateX(' + x + 'px)'\n\t})\n}\n\nmodule.exports = {\n\tscroll: scroll,\n\tscrolltolower: scrolltolower,\n\tscrolltoupper: scrolltoupper\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-scroll-list/u-scroll-list.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-scroll-list\"\n\t\tref=\"u-scroll-list\"\n\t>\n\t\t<!-- #ifdef APP-NVUE -->\n\t\t<!-- nvue使用bindingX实现，以得到更好的性能 -->\n\t\t<scroller\n\t\t\tclass=\"u-scroll-list__scroll-view\"\n\t\t\tref=\"u-scroll-list__scroll-view\"\n\t\t\tscroll-direction=\"horizontal\"\n\t\t\t:show-scrollbar=\"false\"\n\t\t\t:offset-accuracy=\"1\"\n\t\t\t@scroll=\"nvueScrollHandler\"\n\t\t>\n\t\t\t<view class=\"u-scroll-list__scroll-view__content\">\n\t\t\t\t<slot />\n\t\t\t</view>\n\t\t</scroller>\n\t\t<!-- #endif -->\n\t\t<!-- #ifndef APP-NVUE -->\n\t\t<!-- #ifdef MP-WEIXIN || APP-VUE || H5 || MP-QQ -->\n\t\t<!-- 以上平台，支持wxs -->\n\t\t<scroll-view\n\t\t\tclass=\"u-scroll-list__scroll-view\"\n\t\t\tscroll-x\n\t\t\t@scroll=\"wxs.scroll\"\n\t\t\t@scrolltoupper=\"wxs.scrolltoupper\"\n\t\t\t@scrolltolower=\"wxs.scrolltolower\"\n\t\t\t:data-scrollWidth=\"scrollWidth\"\n\t\t\t:data-barWidth=\"$u.getPx(indicatorBarWidth)\"\n\t\t\t:data-indicatorWidth=\"$u.getPx(indicatorWidth)\"\n\t\t\t:show-scrollbar=\"false\"\n\t\t\t:upper-threshold=\"0\"\n\t\t\t:lower-threshold=\"0\"\n\t\t>\n\t\t\t<!-- #endif -->\n\t\t\t<!-- #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ -->\n\t\t\t<!-- 非以上平台，只能使用普通js实现 -->\n\t\t\t<scroll-view\n\t\t\t\tclass=\"u-scroll-list__scroll-view\"\n\t\t\t\tscroll-x\n\t\t\t\t@scroll=\"scrollHandler\"\n\t\t\t\t@scrolltoupper=\"scrolltoupperHandler\"\n\t\t\t\t@scrolltolower=\"scrolltolowerHandler\"\n\t\t\t\t:show-scrollbar=\"false\"\n\t\t\t\t:upper-threshold=\"0\"\n\t\t\t\t:lower-threshold=\"0\"\n\t\t\t>\n\t\t\t\t<!-- #endif -->\n\t\t\t\t<view class=\"u-scroll-list__scroll-view__content\">\n\t\t\t\t\t<slot />\n\t\t\t\t</view>\n\t\t\t</scroll-view>\n\t\t\t<!-- #endif -->\n\t\t\t<view\n\t\t\t\tclass=\"u-scroll-list__indicator\"\n\t\t\t\tv-if=\"indicator\"\n\t\t\t\t:style=\"[$u.addStyle(indicatorStyle)]\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-scroll-list__indicator__line\"\n\t\t\t\t\t:style=\"[lineStyle]\"\n\t\t\t\t>\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"u-scroll-list__indicator__line__bar\"\n\t\t\t\t\t\t:style=\"[barStyle]\"\n\t\t\t\t\t\tref=\"u-scroll-list__indicator__line__bar\"\n\t\t\t\t\t></view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t</view>\n</template>\n\n<script\n\tsrc=\"./scrollWxs.wxs\"\n\tmodule=\"wxs\"\n\tlang=\"wxs\"\n></script>\n\n<script>\n/**\n * scrollList 横向滚动列表\n * @description 该组件一般用于同时展示多个商品、分类的场景，也可以完成左右滑动的列表。\n * @tutorial https://www.uviewui.com/components/scrollList.html\n * @property {String | Number}\tindicatorWidth\t\t\t指示器的整体宽度 (默认 50 )\n * @property {String | Number}\tindicatorBarWidth\t\t滑块的宽度 (默认 20 )\n * @property {Boolean}\t\t\tindicator\t\t\t\t是否显示面板指示器 (默认 true )\n * @property {String}\t\t\tindicatorColor\t\t\t指示器非激活颜色 (默认 '#f2f2f2' )\n * @property {String}\t\t\tindicatorActiveColor\t指示器的激活颜色 (默认 '#3c9cff' )\n * @property {String | Object}\tindicatorStyle\t\t\t指示器样式，可通过bottom，left，right进行定位\n * @event {Function} left\t滑动到左边时触发\n * @event {Function} right\t滑动到右边时触发\n * @example\n */\n// #ifdef APP-NVUE\nconst dom = uni.requireNativePlugin('dom')\nimport nvueMixin from \"./nvue.js\"\n// #endif\nimport props from './props.js';\nexport default {\n\tname: 'u-scroll-list',\n\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t// #ifdef APP-NVUE\n\tmixins: [uni.$u.mpMixin, uni.$u.mixin, nvueMixin, props],\n\t// #endif\n\tdata() {\n\t\treturn {\n\t\t\tscrollInfo: {\n\t\t\t\tscrollLeft: 0,\n\t\t\t\tscrollWidth: 0\n\t\t\t},\n\t\t\tscrollWidth: 0\n\t\t}\n\t},\n\tcomputed: {\n\t\t// 指示器为线型的样式\n\t\tbarStyle() {\n\t\t\tconst style = {}\n\t\t\t// #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ\n\t\t\t// 此为普通js方案，只有在非nvue和不支持wxs方案的端才使用、\n\t\t\t// 此处的计算理由为：scroll-view的滚动距离与目标滚动距离(scroll-view的实际宽度减去包裹元素的宽度)之比，等于滑块当前移动距离与总需\n\t\t\t// 滑动距离(指示器的总宽度减去滑块宽度)的比值\n\t\t\tconst scrollLeft = this.scrollInfo.scrollLeft,\n\t\t\t\tscrollWidth = this.scrollInfo.scrollWidth,\n\t\t\t\tbarAllMoveWidth = this.indicatorWidth - this.indicatorBarWidth\n\t\t\tconst x = scrollLeft / (scrollWidth - this.scrollWidth) * barAllMoveWidth\n\t\t\tstyle.transform = `translateX(${ x }px)`\n\t\t\t// #endif\n\t\t\t// 设置滑块的宽度和背景色，是每个平台都需要的\n\t\t\tstyle.width = uni.$u.addUnit(this.indicatorBarWidth)\n\t\t\tstyle.backgroundColor = this.indicatorActiveColor\n\t\t\treturn style\n\t\t},\n\t\tlineStyle() {\n\t\t\tconst style = {}\n\t\t\t// 指示器整体的样式，需要设置其宽度和背景色\n\t\t\tstyle.width = uni.$u.addUnit(this.indicatorWidth)\n\t\t\tstyle.backgroundColor = this.indicatorColor\n\t\t\treturn style\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.init()\n\t},\n\tmethods: {\n\t\tinit() {\n\t\t\tthis.getComponentWidth()\n\t\t},\n\t\t// #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ\n\t\t// scroll-view触发滚动事件\n\t\tscrollHandler(e) {\n\t\t\tthis.scrollInfo = e.detail\n\t\t},\n\t\tscrolltoupperHandler() {\n\t\t\tthis.scrollEvent('left')\n\t\t\tthis.scrollInfo.scrollLeft = 0\n\t\t},\n\t\tscrolltolowerHandler() {\n\t\t\tthis.scrollEvent('right')\n\t\t\t// 在普通js方案中，滚动到右边时，通过设置this.scrollInfo，模拟出滚动到右边的情况\n\t\t\t// 因为上方是用过computed计算的，设置后，会自动调整滑块的位置\n\t\t\tthis.scrollInfo.scrollLeft = uni.$u.getPx(this.indicatorWidth) - uni.$u.getPx(this.indicatorBarWidth)\n\t\t},\n\t\t// #endif\n\t\t//\n\t\tscrollEvent(status) {\n\t\t\tthis.$emit(status)\n\t\t},\n\t\t// 获取组件的宽度\n\t\tasync getComponentWidth() {\n\t\t\t// 延时一定时间，以获取dom尺寸\n\t\t\tawait uni.$u.sleep(30)\n\t\t\t// #ifndef APP-NVUE\n\t\t\tthis.$uGetRect('.u-scroll-list').then(size => {\n\t\t\t\tthis.scrollWidth = size.width\n\t\t\t})\n\t\t\t// #endif\n\n\t\t\t// #ifdef APP-NVUE\n\t\t\tconst ref = this.$refs['u-scroll-list']\n\t\t\tref && dom.getComponentRect(ref, (res) => {\n\t\t\t\tthis.scrollWidth = res.size.width\n\t\t\t})\n\t\t\t// #endif\n\t\t},\n\t}\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n.u-scroll-list {\n\tpadding-bottom: 10px;\n\n\t&__scroll-view {\n\t\t@include flex;\n\n\t\t&__content {\n\t\t\t@include flex;\n\t\t}\n\t}\n\n\t&__indicator {\n\t\t@include flex;\n\t\tjustify-content: center;\n\t\tmargin-top: 15px;\n\n\t\t&__line {\n\t\t\twidth: 60px;\n\t\t\theight: 4px;\n\t\t\tborder-radius: 100px;\n\t\t\toverflow: hidden;\n\n\t\t\t&__bar {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 4px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-search/props.js",
    "content": "export default {\n    props: {\n        // 搜索框形状，round-圆形，square-方形\n        shape: {\n            type: String,\n            default: uni.$u.props.search.shape\n        },\n        // 搜索框背景色，默认值#f2f2f2\n        bgColor: {\n            type: String,\n            default: uni.$u.props.search.bgColor\n        },\n        // 占位提示文字\n        placeholder: {\n            type: String,\n            default: uni.$u.props.search.placeholder\n        },\n        // 是否启用清除控件\n        clearabled: {\n            type: Boolean,\n            default: uni.$u.props.search.clearabled\n        },\n        // 是否自动聚焦\n        focus: {\n            type: Boolean,\n            default: uni.$u.props.search.focus\n        },\n        // 是否在搜索框右侧显示取消按钮\n        showAction: {\n            type: Boolean,\n            default: uni.$u.props.search.showAction\n        },\n        // 右边控件的样式\n        actionStyle: {\n            type: Object,\n            default: uni.$u.props.search.actionStyle\n        },\n        // 取消按钮文字\n        actionText: {\n            type: String,\n            default: uni.$u.props.search.actionText\n        },\n        // 输入框内容对齐方式，可选值为 left|center|right\n        inputAlign: {\n            type: String,\n            default: uni.$u.props.search.inputAlign\n        },\n        // input输入框的样式，可以定义文字颜色，大小等，对象形式\n        inputStyle: {\n            type: Object,\n            default: uni.$u.props.search.inputStyle\n        },\n        // 是否启用输入框\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.search.disabled\n        },\n        // 边框颜色\n        borderColor: {\n            type: String,\n            default: uni.$u.props.search.borderColor\n        },\n        // 搜索图标的颜色，默认同输入框字体颜色\n        searchIconColor: {\n            type: String,\n            default: uni.$u.props.search.searchIconColor\n        },\n        // 输入框字体颜色\n        color: {\n            type: String,\n            default: uni.$u.props.search.color\n        },\n        // placeholder的颜色\n        placeholderColor: {\n            type: String,\n            default: uni.$u.props.search.placeholderColor\n        },\n        // 左边输入框的图标，可以为uView图标名称或图片路径\n        searchIcon: {\n            type: String,\n            default: uni.$u.props.search.searchIcon\n        },\n        searchIconSize: {\n            type: [Number, String],\n            default: uni.$u.props.search.searchIconSize\n        },\n        // 组件与其他上下左右元素之间的距离，带单位的字符串形式，如\"30px\"、\"30px 20px\"等写法\n        margin: {\n            type: String,\n            default: uni.$u.props.search.margin\n        },\n        // 开启showAction时，是否在input获取焦点时才显示\n        animation: {\n            type: Boolean,\n            default: uni.$u.props.search.animation\n        },\n        // 输入框的初始化内容\n        value: {\n            type: String,\n            default: uni.$u.props.search.value\n        },\n        // 输入框最大能输入的长度，-1为不限制长度(来自uniapp文档)\n        maxlength: {\n            type: [String, Number],\n            default: uni.$u.props.search.maxlength\n        },\n        // 搜索框高度，单位px\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.search.height\n        },\n        // 搜索框左侧文本\n        label: {\n            type: [String, Number, null],\n            default: uni.$u.props.search.label\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-search/u-search.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-search\"\n\t    @tap=\"clickHandler\"\n\t    :style=\"[{\n\t\t\tmargin: margin,\n\t\t}, $u.addStyle(customStyle)]\"\n\t>\n\t\t<view\n\t\t    class=\"u-search__content\"\n\t\t    :style=\"{\n\t\t\t\tbackgroundColor: bgColor,\n\t\t\t\tborderRadius: shape == 'round' ? '100px' : '4px',\n\t\t\t\tborderColor: borderColor,\n\t\t\t}\"\n\t\t>\n\t\t\t<template v-if=\"$slots.label || label !== null\">\n\t\t\t\t<slot name=\"label\">\n\t\t\t\t\t<text class=\"u-search__content__label\">{{ label }}</text>\n\t\t\t\t</slot>\n\t\t\t</template>\n\t\t\t<view class=\"u-search__content__icon\">\n\t\t\t\t<u-icon\n\t\t\t\t\t@tap=\"clickIcon\"\n\t\t\t\t    :size=\"searchIconSize\"\n\t\t\t\t    :name=\"searchIcon\"\n\t\t\t\t    :color=\"searchIconColor ? searchIconColor : color\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t\t<input\n\t\t\t    confirm-type=\"search\"\n\t\t\t    @blur=\"blur\"\n\t\t\t    :value=\"value\"\n\t\t\t    @confirm=\"search\"\n\t\t\t    @input=\"inputChange\"\n\t\t\t    :disabled=\"disabled\"\n\t\t\t    @focus=\"getFocus\"\n\t\t\t    :focus=\"focus\"\n\t\t\t    :maxlength=\"maxlength\"\n\t\t\t    placeholder-class=\"u-search__content__input--placeholder\"\n\t\t\t    :placeholder=\"placeholder\"\n\t\t\t    :placeholder-style=\"`color: ${placeholderColor}`\"\n\t\t\t    class=\"u-search__content__input\"\n\t\t\t    type=\"text\"\n\t\t\t    :style=\"[{\n\t\t\t\t\ttextAlign: inputAlign,\n\t\t\t\t\tcolor: color,\n\t\t\t\t\tbackgroundColor: bgColor,\n\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t}, inputStyle]\"\n\t\t\t/>\n\t\t\t<view\n\t\t\t    class=\"u-search__content__icon u-search__content__close\"\n\t\t\t    v-if=\"keyword && clearabled && focused\"\n\t\t\t    @tap=\"clear\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t    name=\"close\"\n\t\t\t\t    size=\"11\"\n\t\t\t\t    color=\"#ffffff\"\n\t\t\t\t\tcustomStyle=\"line-height: 12px\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t</view>\n\t\t<text\n\t\t    :style=\"[actionStyle]\"\n\t\t    class=\"u-search__action\"\n\t\t    :class=\"[(showActionBtn || show) && 'u-search__action--active']\"\n\t\t    @tap.stop.prevent=\"custom\"\n\t\t>{{ actionText }}</text>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\n\t/**\n\t * search 搜索框\n\t * @description 搜索组件，集成了常见搜索框所需功能，用户可以一键引入，开箱即用。\n\t * @tutorial https://www.uviewui.com/components/search.html\n\t * @property {String}\t\t\tshape\t\t\t\t搜索框形状，round-圆形，square-方形（默认 'round' ）\n\t * @property {String}\t\t\tbgColor\t\t\t\t搜索框背景颜色（默认 '#f2f2f2' ）\n\t * @property {String}\t\t\tplaceholder\t\t\t占位文字内容（默认 '请输入关键字' ）\n\t * @property {Boolean}\t\t\tclearabled\t\t\t是否启用清除控件（默认 true ）\n\t * @property {Boolean}\t\t\tfocus\t\t\t\t是否自动获得焦点（默认 false ）\n\t * @property {Boolean}\t\t\tshowAction\t\t\t是否显示右侧控件（默认 true ）\n\t * @property {Object}\t\t\tactionStyle\t\t\t右侧控件的样式，对象形式\n\t * @property {String}\t\t\tactionText\t\t\t右侧控件文字（默认 '搜索' ）\n\t * @property {String}\t\t\tinputAlign\t\t\t输入框内容水平对齐方式 （默认 'left' ）\n\t * @property {Object}\t\t\tinputStyle\t\t\t自定义输入框样式，对象形式\n\t * @property {Boolean}\t\t\tdisabled\t\t\t是否启用输入框（默认 false ）\n\t * @property {String}\t\t\tborderColor\t\t\t边框颜色，配置了颜色，才会有边框 (默认 'transparent' )\n\t * @property {String}\t\t\tsearchIconColor\t\t搜索图标的颜色，默认同输入框字体颜色 (默认 '#909399' )\n\t * @property {Number | String}\tsearchIconSize 搜索图标的字体，默认22\n\t * @property {String}\t\t\tcolor\t\t\t\t输入框字体颜色（默认 '#606266' ）\n\t * @property {String}\t\t\tplaceholderColor\tplaceholder的颜色（默认 '#909399' ）\n\t * @property {String}\t\t\tsearchIcon\t\t\t输入框左边的图标，可以为uView图标名称或图片路径  (默认 'search' )\n\t * @property {String}\t\t\tmargin\t\t\t\t组件与其他上下左右元素之间的距离，带单位的字符串形式，如\"30px\"   (默认 '0' )\n\t * @property {Boolean} \t\t\tanimation\t\t\t是否开启动画，见上方说明（默认 false ）\n\t * @property {String}\t\t\tvalue\t\t\t\t输入框初始值\n\t * @property {String | Number}\tmaxlength\t\t\t输入框最大能输入的长度，-1为不限制长度  (默认 '-1' )\n\t * @property {String | Number}\theight\t\t\t\t输入框高度，单位px（默认 64 ）\n\t * @property {String | Number}\tlabel\t\t\t\t搜索框左边显示内容\n\t * @property {Object}\t\t\tcustomStyle\t\t\t定义需要用到的外部样式\n\t *\n\t * @event {Function} change 输入框内容发生变化时触发\n\t * @event {Function} search 用户确定搜索时触发，用户按回车键，或者手机键盘右下角的\"搜索\"键时触发\n\t * @event {Function} custom 用户点击右侧控件时触发\n\t * @event {Function} clear 用户点击清除按钮时触发\n\t * @example <u-search placeholder=\"日照香炉生紫烟\" v-model=\"keyword\"></u-search>\n\t */\n\texport default {\n\t\tname: \"u-search\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tkeyword: '',\n\t\t\t\tshowClear: false, // 是否显示右边的清除图标\n\t\t\t\tshow: false,\n\t\t\t\t// 标记input当前状态是否处于聚焦中，如果是，才会显示右侧的清除控件\n\t\t\t\tfocused: this.focus\n\t\t\t\t// 绑定输入框的值\n\t\t\t\t// inputValue: this.value\n\t\t\t};\n\t\t},\n\t\twatch: {\n\t\t\tkeyword(nVal) {\n\t\t\t\t// 双向绑定值，让v-model绑定的值双向变化\n\t\t\t\tthis.$emit('input', nVal);\n\t\t\t\t// 触发change事件，事件效果和v-model双向绑定的效果一样，让用户多一个选择\n\t\t\t\tthis.$emit('change', nVal);\n\t\t\t},\n\t\t\tvalue: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(nVal) {\n\t\t\t\t\tthis.keyword = nVal;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tshowActionBtn() {\n\t\t\t\treturn !this.animation && this.showAction\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 目前HX2.6.9 v-model双向绑定无效，故监听input事件获取输入框内容的变化\n\t\t\tinputChange(e) {\n\t\t\t\tthis.keyword = e.detail.value;\n\t\t\t},\n\t\t\t// 清空输入\n\t\t\t// 也可以作为用户通过this.$refs形式调用清空输入框内容\n\t\t\tclear() {\n\t\t\t\tthis.keyword = '';\n\t\t\t\t// 延后发出事件，避免在父组件监听clear事件时，value为更新前的值(不为空)\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.$emit('clear');\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 确定搜索\n\t\t\tsearch(e) {\n\t\t\t\tthis.$emit('search', e.detail.value);\n\t\t\t\ttry {\n\t\t\t\t\t// 收起键盘\n\t\t\t\t\tuni.hideKeyboard();\n\t\t\t\t} catch (e) {}\n\t\t\t},\n\t\t\t// 点击右边自定义按钮的事件\n\t\t\tcustom() {\n\t\t\t\tthis.$emit('custom', this.keyword);\n\t\t\t\ttry {\n\t\t\t\t\t// 收起键盘\n\t\t\t\t\tuni.hideKeyboard();\n\t\t\t\t} catch (e) {}\n\t\t\t},\n\t\t\t// 获取焦点\n\t\t\tgetFocus() {\n\t\t\t\tthis.focused = true;\n\t\t\t\t// 开启右侧搜索按钮展开的动画效果\n\t\t\t\tif (this.animation && this.showAction) this.show = true;\n\t\t\t\tthis.$emit('focus', this.keyword);\n\t\t\t},\n\t\t\t// 失去焦点\n\t\t\tblur() {\n\t\t\t\t// 最开始使用的是监听图标@touchstart事件，自从hx2.8.4后，此方法在微信小程序出错\n\t\t\t\t// 这里改为监听点击事件，手点击清除图标时，同时也发生了@blur事件，导致图标消失而无法点击，这里做一个延时\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.focused = false;\n\t\t\t\t}, 100)\n\t\t\t\tthis.show = false;\n\t\t\t\tthis.$emit('blur', this.keyword);\n\t\t\t},\n\t\t\t// 点击搜索框，只有disabled=true时才发出事件，因为禁止了输入，意味着是想跳转真正的搜索页\n\t\t\tclickHandler() {\n\t\t\t\tif (this.disabled) this.$emit('click');\n\t\t\t},\n\t\t\t// 点击左边图标\n\t\t\tclickIcon() {\n\t\t\t\tthis.$emit('clickIcon');\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n$u-search-content-padding: 0 10px !default;\n$u-search-label-color: $u-main-color !default;\n$u-search-label-font-size: 14px !default;\n$u-search-label-margin: 0 4px !default;\n$u-search-close-size: 20px !default;\n$u-search-close-radius: 100px !default;\n$u-search-close-bgColor: #C6C7CB !default;\n$u-search-close-transform: scale(0.82) !default;\n$u-search-input-font-size: 14px !default;\n$u-search-input-margin: 0 5px !default;\n$u-search-input-color: $u-main-color !default;\n$u-search-input-placeholder-color: $u-tips-color !default;\n$u-search-action-font-size: 14px !default;\n$u-search-action-color: $u-main-color !default;\n$u-search-action-width: 0 !default;\n$u-search-action-active-width: 40px !default;\n$u-search-action-margin-left: 5px !default;\n\n/* #ifdef H5 */\n// iOS15在H5下，hx的某些版本，input type=search时，会多了一个搜索图标，进行移除\n[type=\"search\"]::-webkit-search-decoration {\n    display: none;\n}\n/* #endif */\n\n.u-search {\n\t@include flex(row);\n\talign-items: center;\n\tflex: 1;\n\n\t&__content {\n\t\t@include flex;\n\t\talign-items: center;\n\t\tpadding: $u-search-content-padding;\n\t\tflex: 1;\n\t\tjustify-content: space-between;\n\t\tborder-width: 1px;\n\t\tborder-color: transparent;\n\t\tborder-style: solid;\n\t\toverflow: hidden;\n\n\t\t&__icon {\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\t\t}\n\n\t\t&__label {\n\t\t\tcolor: $u-search-label-color;\n\t\t\tfont-size: $u-search-label-font-size;\n\t\t\tmargin: $u-search-label-margin;\n\t\t}\n\n\t\t&__close {\n\t\t\twidth: $u-search-close-size;\n\t\t\theight: $u-search-close-size;\n\t\t\tborder-top-left-radius: $u-search-close-radius;\n\t\t\tborder-top-right-radius: $u-search-close-radius;\n\t\t\tborder-bottom-left-radius: $u-search-close-radius;\n\t\t\tborder-bottom-right-radius: $u-search-close-radius;\n\t\t\tbackground-color: $u-search-close-bgColor;\n\t\t\t@include flex(row);\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\ttransform: $u-search-close-transform;\n\t\t}\n\n\t\t&__input {\n\t\t\tflex: 1;\n\t\t\tfont-size: $u-search-input-font-size;\n\t\t\tline-height: 1;\n\t\t\tmargin: $u-search-input-margin;\n\t\t\tcolor: $u-search-input-color;\n\n\t\t\t&--placeholder {\n\t\t\t\tcolor: $u-search-input-placeholder-color;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__action {\n\t\tfont-size: $u-search-action-font-size;\n\t\tcolor: $u-search-action-color;\n\t\twidth: $u-search-action-width;\n\t\toverflow: hidden;\n\t\ttransition-property: width;\n\t\ttransition-duration: 0.3s;\n\t\t/* #ifndef APP-NVUE */\n\t\twhite-space: nowrap;\n\t\t/* #endif */\n\t\ttext-align: center;\n\n\t\t&--active {\n\t\t\twidth: $u-search-action-active-width;\n\t\t\tmargin-left: $u-search-action-margin-left;\n\t\t}\n\t}\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-skeleton/props.js",
    "content": "export default {\n    props: {\n        // 是否展示骨架组件\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.skeleton.loading\n        },\n        // 是否开启动画效果\n        animate: {\n            type: Boolean,\n            default: uni.$u.props.skeleton.animate\n        },\n        // 段落占位图行数\n        rows: {\n            type: [String, Number],\n            default: uni.$u.props.skeleton.rows\n        },\n        // 段落占位图的宽度\n        rowsWidth: {\n            type: [String, Number, Array],\n            default: uni.$u.props.skeleton.rowsWidth\n        },\n        // 段落占位图的高度\n        rowsHeight: {\n            type: [String, Number, Array],\n            default: uni.$u.props.skeleton.rowsHeight\n        },\n        // 是否展示标题占位图\n        title: {\n            type: Boolean,\n            default: uni.$u.props.skeleton.title\n        },\n        // 段落标题的宽度\n        titleWidth: {\n            type: [String, Number],\n            default: uni.$u.props.skeleton.titleWidth\n        },\n        // 段落标题的高度\n        titleHeight: {\n            type: [String, Number],\n            default: uni.$u.props.skeleton.titleHeight\n        },\n        // 是否展示头像占位图\n        avatar: {\n            type: Boolean,\n            default: uni.$u.props.skeleton.avatar\n        },\n        // 头像占位图大小\n        avatarSize: {\n            type: [String, Number],\n            default: uni.$u.props.skeleton.avatarSize\n        },\n        // 头像占位图的形状，circle-圆形，square-方形\n        avatarShape: {\n            type: String,\n            default: uni.$u.props.skeleton.avatarShape\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue",
    "content": "<template>\n\t<view class=\"u-skeleton\">\n\t\t<view\n\t\t    class=\"u-skeleton__wrapper\"\n\t\t    ref=\"u-skeleton__wrapper\"\n\t\t    v-if=\"loading\"\n\t\t\tstyle=\"display: flex; flex-direction: row;\"\n\t\t>\n\t\t\t<view\n\t\t\t    class=\"u-skeleton__wrapper__avatar\"\n\t\t\t    v-if=\"avatar\"\n\t\t\t    :class=\"[`u-skeleton__wrapper__avatar--${avatarShape}`, animate && 'animate']\"\n\t\t\t    :style=\"{\n\t\t\t\t\t\theight: $u.addUnit(avatarSize),\n\t\t\t\t\t\twidth: $u.addUnit(avatarSize)\n\t\t\t\t\t}\"\n\t\t\t></view>\n\t\t\t<view\n\t\t\t    class=\"u-skeleton__wrapper__content\"\n\t\t\t    ref=\"u-skeleton__wrapper__content\"\n\t\t\t\tstyle=\"flex: 1;\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t    class=\"u-skeleton__wrapper__content__title\"\n\t\t\t\t    v-if=\"title\"\n\t\t\t\t    :style=\"{\n\t\t\t\t\t\t\twidth: uTitleWidth,\n\t\t\t\t\t\t\theight: $u.addUnit(titleHeight),\n\t\t\t\t\t\t}\"\n\t\t\t\t    :class=\"[animate && 'animate']\"\n\t\t\t\t></view>\n\t\t\t\t<view\n\t\t\t\t    class=\"u-skeleton__wrapper__content__rows\"\n\t\t\t\t    :class=\"[animate && 'animate']\"\n\t\t\t\t    v-for=\"(item, index) in rowsArray\"\n\t\t\t\t    :key=\"index\"\n\t\t\t\t    :style=\"{\n\t\t\t\t\t\t\t width: item.width,\n\t\t\t\t\t\t\t height: item.height,\n\t\t\t\t\t\t\t marginTop: item.marginTop\n\t\t\t\t\t\t}\"\n\t\t\t\t>\n\t\t\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</view>\n\t\t<slot v-else />\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\t// 由于weex为阿里的KPI业绩考核的产物，所以不支持百分比单位，这里需要通过dom查询组件的宽度\n\tconst dom = uni.requireNativePlugin('dom')\n\tconst animation = uni.requireNativePlugin('animation')\n\t// #endif\n\t/**\n\t * Skeleton 骨架屏\n\t * @description 骨架屏一般用于页面在请求远程数据尚未完成时，页面用灰色块预显示本来的页面结构，给用户更好的体验。\n\t * @tutorial https://www.uviewui.com/components/skeleton.html\n\t * @property {Boolean}\t\t\t\t\tloading\t\t是否显示骨架占位图，设置为false将会展示子组件内容 (默认 true )\n\t * @property {Boolean}\t\t\t\t\tanimate\t\t是否开启动画效果 (默认 true )\n\t * @property {String | Number}\t\t\trows\t\t段落占位图行数 (默认 0 )\n\t * @property {String | Number | Array}\trowsWidth\t段落占位图的宽度，可以为百分比，数值，带单位字符串等，可通过数组传入指定每个段落行的宽度 (默认 '100%' )\n\t * @property {String | Number | Array}\trowsHeight\t段落的高度 (默认 18 )\n\t * @property {Boolean}\t\t\t\t\ttitle\t\t是否展示标题占位图 (默认 true )\n\t * @property {String | Number}\t\t\ttitleWidth\t标题的宽度 (默认 '50%' )\n\t * @property {String | Number}\t\t\ttitleHeight\t标题的高度 (默认 18 )\n\t * @property {Boolean}\t\t\t\t\tavatar\t\t是否展示头像占位图 (默认 false )\n\t * @property {String | Number}\t\t\tavatarSize\t头像占位图大小 (默认 32 )\n\t * @property {String}\t\t\t\t\tavatarShape\t头像占位图的形状，circle-圆形，square-方形 (默认 'circle' )\n\t * @example <u-search placeholder=\"日照香炉生紫烟\" v-model=\"keyword\"></u-search>\n\t */\n\texport default {\n\t\tname: 'u-skeleton',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\twidth: 0,\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tloading() {\n\t\t\t\tthis.getComponentWidth()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\trowsArray() {\n\t\t\t\tif (/%$/.test(this.rowsHeight)) {\n\t\t\t\t\tuni.$u.error('rowsHeight参数不支持百分比单位')\n\t\t\t\t}\n\t\t\t\tconst rows = []\n\t\t\t\tfor (let i = 0; i < this.rows; i++) {\n\t\t\t\t\tlet item = {},\n\t\t\t\t\t\t// 需要预防超出数组边界的情况\n\t\t\t\t\t\trowWidth = uni.$u.test.array(this.rowsWidth) ? (this.rowsWidth[i] || (i === this.row - 1 ? '70%' : '100%')) : i ===\n\t\t\t\t\t\tthis.rows - 1 ? '70%' : this.rowsWidth,\n\t\t\t\t\t\trowHeight = uni.$u.test.array(this.rowsHeight) ? (this.rowsHeight[i] || '18px') : this.rowsHeight\n\t\t\t\t\t// 如果有title占位图，第一个段落占位图的外边距需要大一些，如果没有title占位图，第一个段落占位图则无需外边距\n\t\t\t\t\t// 之所以需要这么做，是因为weex的无能，以提升性能为借口不支持css的一些伪类\n\t\t\t\t\titem.marginTop = !this.title && i === 0 ? 0 : this.title && i === 0 ? '20px' : '12px'\n\t\t\t\t\t// 如果设置的为百分比的宽度，转换为px值，因为nvue不支持百分比单位\n\t\t\t\t\tif (/%$/.test(rowWidth)) {\n\t\t\t\t\t\t// 通过parseInt提取出百分比单位中的数值部分，除以100得到百分比的小数值\n\t\t\t\t\t\titem.width = uni.$u.addUnit(this.width * parseInt(rowWidth) / 100)\n\t\t\t\t\t} else {\n\t\t\t\t\t\titem.width = uni.$u.addUnit(rowWidth)\n\t\t\t\t\t}\n\t\t\t\t\titem.height = uni.$u.addUnit(rowHeight)\n\t\t\t\t\trows.push(item)\n\t\t\t\t}\n\t\t\t\t// console.log(rows);\n\t\t\t\treturn rows\n\t\t\t},\n\t\t\tuTitleWidth() {\n\t\t\t\tlet tWidth = 0\n\t\t\t\tif (/%$/.test(this.titleWidth)) {\n\t\t\t\t\t// 通过parseInt提取出百分比单位中的数值部分，除以100得到百分比的小数值\n\t\t\t\t\ttWidth = uni.$u.addUnit(this.width * parseInt(this.titleWidth) / 100)\n\t\t\t\t} else {\n\t\t\t\t\ttWidth = uni.$u.addUnit(this.titleWidth)\n\t\t\t\t}\n\t\t\t\treturn uni.$u.addUnit(tWidth)\n\t\t\t},\n\t\t\t\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tthis.getComponentWidth()\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.loading && this.animate && this.setNvueAnimation()\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tasync setNvueAnimation() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 为了让opacity:1的状态保持一定时间，这里做一个延时\n\t\t\t\tawait uni.$u.sleep(500)\n\t\t\t\tconst skeleton = this.$refs['u-skeleton__wrapper'];\n\t\t\t\tskeleton && this.loading && this.animate && animation.transition(skeleton, {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\topacity: 0.5\n\t\t\t\t\t},\n\t\t\t\t\tduration: 600,\n\t\t\t\t}, () => {\n\t\t\t\t\t// 这里无需判断是否loading和开启动画状态，因为最终的状态必须达到opacity: 1，否则可能\n\t\t\t\t\t// 会停留在opacity: 0.5的状态中\n\t\t\t\t\tanimation.transition(skeleton, {\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\topacity: 1\n\t\t\t\t\t\t},\n\t\t\t\t\t\tduration: 600,\n\t\t\t\t\t}, () => {\n\t\t\t\t\t\t// 只有在loading中时，才执行动画\n\t\t\t\t\t\tthis.loading && this.animate && this.setNvueAnimation()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 获取组件的宽度\n\t\t\tasync getComponentWidth() {\n\t\t\t\t// 延时一定时间，以获取dom尺寸\n\t\t\t\tawait uni.$u.sleep(20)\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect('.u-skeleton__wrapper__content').then(size => {\n\t\t\t\t\tthis.width = size.width\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tconst ref = this.$refs['u-skeleton__wrapper__content']\n\t\t\t\tref && dom.getComponentRect(ref, (res) => {\n\t\t\t\t\tthis.width = res.size.width\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t@mixin background {\n\t\t/* #ifdef APP-NVUE */\n\t\tbackground-color: #F1F2F4;\n\t\t/* #endif */\n\t\t/* #ifndef APP-NVUE */\n\t\tbackground: linear-gradient(90deg, #F1F2F4 25%, #e6e6e6 37%, #F1F2F4 50%);\n\t\tbackground-size: 400% 100%;\n\t\t/* #endif */\n\t}\n\n\t.u-skeleton {\n\t\tflex: 1;\n\t\t\n\t\t&__wrapper {\n\t\t\t@include flex(row);\n\t\t\t\n\t\t\t&__avatar {\n\t\t\t\t@include background;\n\t\t\t\tmargin-right: 15px;\n\t\t\t\n\t\t\t\t&--circle {\n\t\t\t\t\tborder-radius: 100px;\n\t\t\t\t}\n\t\t\t\n\t\t\t\t&--square {\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t&__content {\n\t\t\t\tflex: 1;\n\t\t\t\n\t\t\t\t&__rows,\n\t\t\t\t&__title {\n\t\t\t\t\t@include background;\n\t\t\t\t\tborder-radius: 3px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* #ifndef APP-NVUE */\n\t.animate {\n\t\tanimation: skeleton 1.8s ease infinite\n\t}\n\n\t@keyframes skeleton {\n\t\t0% {\n\t\t\tbackground-position: 100% 50%\n\t\t}\n\n\t\t100% {\n\t\t\tbackground-position: 0 50%\n\t\t}\n\t}\n\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/mpother.js",
    "content": "/**\n * 使用普通的js方案实现slider\n */\nexport default {\n    watch: {\n        value(n) {\n            // 只有在非滑动状态时，才可以通过value更新滑块值，这里监听，是为了让用户触发\n            if (this.status === 'end') {\n                this.updateSliderPlacement(n, true)\n            }\n        }\n    },\n    mounted() {\n        this.init()\n    },\n    methods: {\n        init() {\n            this.getSliderRect()\n        },\n        // 获取slider尺寸\n        getSliderRect() {\n            // 获取滑块条的尺寸信息\n            setTimeout(() => {\n                this.$uGetRect('.u-slider').then((rect) => {\n                    this.sliderRect = rect\n                    this.updateSliderPlacement(this.value, true)\n                })\n            }, 10)\n        },\n        // 是否可以操作\n        canNotDo() {\n            return this.disabled\n        },\n        // 获取当前手势点的X轴位移值\n        getTouchX(e) {\n            return e.touches[0].clientX\n        },\n        formatStep(value) {\n            // 移动点占总长度的百分比\n            return Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step\n        },\n        // 发出事件\n        emitEvent(event, value) {\n            this.$emit(event, value || this.value)\n        },\n        // 标记当前手势的状态\n        setTouchStatus(status) {\n            this.status = status\n        },\n        onTouchStart(e) {\n            if (this.canNotDo()) {\n                return\n            }\n            // 标示当前的状态为开始触摸滑动\n            this.emitEvent('start')\n            this.setTouchStatus('start')\n        },\n        onTouchMove(e) {\n            if (this.canNotDo()) {\n                return\n            }\n            // 滑块的左边不一定跟屏幕左边接壤，所以需要减去最外层父元素的左边值\n            const x = this.getTouchX(e)\n            const { left, width } = this.sliderRect\n            const distanceX = x - left\n            // 获得移动距离对整个滑块的百分比值，此为带有多位小数的值，不能用此更新视图\n            // 否则造成通信阻塞，需要每改变一个step值时修改一次视图\n            const percent = (distanceX / width) * 100\n            this.setTouchStatus('moving')\n            this.updateSliderPlacement(percent, true, 'moving')\n        },\n        onTouchEnd() {\n            if (this.canNotDo()) {\n                return\n            }\n            this.emitEvent('end')\n            this.setTouchStatus('end')\n        },\n        // 设置滑点的位置\n        updateSliderPlacement(value, drag, event) {\n            // 去掉小数部分，同时也是对step步进的处理\n            const { width } = this.sliderRect\n            const percent = this.formatStep(value)\n            // 设置移动的值\n            const barStyle = {\n                width: `${percent / 100 * width}px`\n            }\n            // 移动期间无需过渡动画\n            if (drag === true) {\n                barStyle.transition = 'none'\n            } else {\n                // 非移动期间，删掉对过渡为空的声明，让css中的声明起效\n                delete barStyle.transition\n            }\n            // 修改value值\n            this.$emit('input', percent)\n            // 事件的名称\n            if (event) {\n                this.emitEvent(event, percent)\n            }\n            this.barStyle = barStyle\n        },\n        onClick(e) {\n            if (this.canNotDo()) {\n                return\n            }\n            // 直接点击滑块的情况，计算方式与onTouchMove方法相同\n            const { left, width } = this.sliderRect\n            const value = ((e.detail.x - left) / width) * 100\n            this.updateSliderPlacement(value, false, 'click')\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/mpwxs.js",
    "content": "export default {\n    data() {\n        return {\n            sliderRect: {},\n            info: {\n                width: null,\n                left: null,\n                step: this.step,\n                disabled: this.disabled,\n                min: this.min,\n                max: this.max,\n                value: this.value\n            }\n        }\n    },\n    mounted() {\n        this.init()\n    },\n    methods: {\n        init() {\n            this.getSliderRect()\n        },\n        // 获取slider尺寸\n        getSliderRect() {\n            // 获取滑块条的尺寸信息\n            uni.$u.sleep().then(() => {\n                this.$uGetRect('.u-slider').then((rect) => {\n                    this.info.width = rect.width\n                    this.info.left = rect.left\n                })\n            })\n        },\n        // 此方法由wxs调用，用于修改v-model绑定的值\n        updateValue(value) {\n            this.$emit('input', value)\n        },\n        // 此方法由wxs调用，发出事件\n        emitEvent(e) {\n            this.$emit(e.event, e.value ? e.value : this.value)\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/mpwxs.wxs",
    "content": "/**\n * 使用wxs方案实现slider\n * 兼容微信，QQ，H5，Vue版的安卓和iOS\n */\n/**\n * 开始滑动操作\n * @param {Object} e\n * @param {Object} ownerInstance\n */\nfunction onTouchMove(e, ownerInstance) {\n\t// wxs事件对象下有一个instance属性，表示当前触发此事件的组件的实例，通过该实例，可以获取相关的dataset，设置样式等信息\n\t// https://developers.weixin.qq.com/miniprogram/dev/framework/view/interactive-animation.html\n\tvar instance = e.instance;\n\t// getState()为一个对象，挂载在instance上，类似组件的data一样，可以存放一些变量，供以后的触发事件中使用\n\tvar state = instance.getState()\n\n\t// 滑块组件的整体尺寸信息\n\tvar mp = state.mp\n\tif(mp.disabled) {\n\t\treturn\n\t}\n\t\n\tvar distanceX = getTouchX(e) - mp.left\n\t// 获得移动距离对整个滑块的百分比值，此为带有多位小数的值，step大于1时，不能用此更新视图\n\tvar percent = (distanceX / mp.width) * 100\n\n\tupdateSliderPlacement(instance, ownerInstance, percent, 'moving')\n\t\n\t// 阻止页面滚动，可以保证在滑动过程中，不让页面可以上下滚动，造成不好的体验\n\te.stopPropagation && e.stopPropagation() \n\te.preventDefault && e.preventDefault()\n}\n\nfunction onClick(e, ownerInstance) {\n\tvar instance = e.instance\n\tvar state = instance.getState()\n\tvar mp = state.mp\n\tif(mp.disabled) {\n\t\treturn\n\t}\n\t\n\t// 直接点击滑块的情况，计算方式与onTouchMove方法相同\n\tvar value = ((e.detail.x - mp.left) / mp.width) * 100\n\tupdateSliderPlacement(instance, ownerInstance, value, 'click')\n}\n\nfunction sizeReady(newValue, oldValue, ownerInstance, instance) {\n\t// 页面初始化时候，也会触发此方法，传递的值为空，这里不执行往后的逻辑\n\tif(!newValue || newValue.disabled) {\n\t\treturn \n\t}\n\tvar state = instance.getState()\n\tstate.mp = newValue\n\tupdateSliderPlacement(instance, ownerInstance, newValue.value)\n}\n\n// 设置滑点的位置\nfunction updateSliderPlacement(instance, ownerInstance, value, event) {\n\tvar state = instance.getState()\n\tvar mp = state.mp\n\tif(mp.disabled) {\n\t\treturn\n\t}\n\n\tvar percent = 0\n\tif (mp.step > 1) {\n\t\t// 如果step步进大于1，需要跳步，所以需要使用Math.round进行取整\n\t\tpercent = Math.round(Math.max(mp.min, Math.min(value, mp.max)) / mp.step) * mp.step\n\t} else {\n\t\t// 当step=1时，无需跳步，充分利用wxs性能，滑块实时跟随手势，达到丝滑的效果\n\t\tpercent = Math.max(mp.min, Math.min(value, mp.max))\n\t}\n\t// 返回组件的实例\n\tvar gapInstance = ownerInstance.selectComponent('.u-slider__gap')\n\t// 在移动期间，不允许transition动画，否则会造成卡顿\n\tgapInstance[event === 'click' ? 'addClass' : 'removeClass']('u-slider__gap--ani')\n\t// 调用逻辑层的方法，修改v-model绑定的值\n\townerInstance.callMethod('updateValue', Math.round(percent))\n\tif(event) {\n\t\townerInstance.callMethod('emitEvent', {\n\t\t\tevent: event,\n\t\t\tvalue: Math.round(percent)\n\t\t})\n\t}\n\t\n\t// 设置移动的值\n\tgapInstance.requestAnimationFrame(function() {\n\t\tgapInstance.setStyle({\n\t\t\twidth: percent / 100 * mp.width + 'px',\n\t\t})\n\t})\n}\n\n// 开始滑动\nfunction onTouchStart(e, ownerInstance) {\n\townerInstance.callMethod('emitEvent', {\n\t\tevent: 'start', \n\t\tvalue: null\n\t})\n}\n\n// 停止滑动\nfunction onTouchEnd(e, ownerInstance) {\n\townerInstance.callMethod('emitEvent', {\n\t\tevent: 'end', \n\t\tvalue: null\n\t})\n}\n\n// 获取当前手势点的X轴位移值\nfunction getTouchX(e) {\n\treturn e.touches[0].clientX\n}\n\nmodule.exports = {\n\tonTouchStart: onTouchStart,\n\tonTouchMove: onTouchMove,\n\tonTouchEnd: onTouchEnd,\n\tsizeReady: sizeReady,\n\tonClick: onClick\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/nvue - 副本.js",
    "content": "/**\n * 使用bindingx方案实现slider\n * 只能使用于nvue下\n */\n// 引入bindingx，此库类似于微信小程序wxs，目的是让js运行在视图层，减少视图层和逻辑层的通信折损\nconst BindingX = uni.requireNativePlugin('bindingx')\n// nvue操作dom的库，用于获取dom的尺寸信息\nconst dom = uni.requireNativePlugin('dom')\n// nvue中用于操作元素动画的库，类似于uni.animation，只不过uni.animation不能用于nvue\nconst animation = uni.requireNativePlugin('animation')\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\t// bindingx的回调值，用于取消绑定\n\t\t\tpanEvent: null,\n\t\t\t// 标记是否移动状态\n\t\t\tmoving: false,\n\t\t\t// 位移的偏移量\n\t\t\tx: 0,\n\t\t\t// 是否正在触摸过程中，用于标记动画类是否添加或移除\n\t\t\ttouching: false,\n\t\t\tchangeFromInside: false\n\t\t}\n\t},\n\twatch: {\n\t\t// 监听vlaue的变化，此变化可能是由于内部修改v-model的值，或者外部\n\t\t// 从服务端获取一个值后，赋值给slider的v-model而导致的\n\t\tvalue(n) {\n\t\t\tif (!this.changeFromInside) {\n\t\t\t\tthis.initX()\n\t\t\t} else {\n\t\t\t\tthis.changeFromInside = false\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.init()\n\t},\n\tmethods: {\n\t\tinit() {\n\t\t\tthis.getSliderRect()\n\t\t},\n\t\t// 获取节点信息\n\t\t// 获取slider尺寸\n\t\tgetSliderRect() {\n\t\t\t// 获取滑块条的尺寸信息\n\t\t\t// 通过nvue的dom模块，查询节点信息\n\t\t\tsetTimeout(() => {\n\t\t\t\tdom.getComponentRect(this.$refs['slider'], res => {\n\t\t\t\t\tthis.sliderRect = res.size\n\t\t\t\t\tthis.initX()\n\t\t\t\t})\n\t\t\t}, 10)\n\t\t},\n\t\t// 初始化按钮位置\n\t\tinitButtonStyle({\n\t\t\tbarStyle,\n\t\t\tbuttonWrapperStyle\n\t\t}) {\n\t\t\tthis.barStyle = barStyle\n\t\t\tthis.buttonWrapperStyle = buttonWrapperStyle\n\t\t},\n\t\temitEvent(event, value) {\n\t\t\tthis.$emit(event, value ? value : this.value)\n\t\t},\n\t\tformatStep(value) {\n\t\t\t// 移动点占总长度的百分比\n\t\t\treturn Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step\n\t\t},\n\t\t// 滑动开始\n\t\tonTouchStart(e) {\n\t\t\t// 阻止页面滚动，可以保证在滑动过程中，不让页面可以上下滚动，造成不好的体验\n\t\t\te.stopPropagation && e.stopPropagation()\n\t\t\te.preventDefault && e.preventDefault()\n\t\t\tif (this.moving || this.disabled) {\n\t\t\t\t// 释放上一次的资源\n\t\t\t\tif (this.panEvent?.token != 0) {\n\t\t\t\t\tBindingX.unbind({\n\t\t\t\t\t\ttoken: this.panEvent.token,\n\t\t\t\t\t\t// pan为手势事件\n\t\t\t\t\t\teventType: 'pan'\n\t\t\t\t\t})\n\t\t\t\t\tthis.gesToken = 0\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.moving = true\n\t\t\tthis.touching = true\n\n\t\t\t// 获取元素ref\n\t\t\tconst button = this.$refs['nvue-button'].ref\n\t\t\tconst gap = this.$refs['nvue-gap'].ref\n\n\t\t\tconst {\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\tstep\n\t\t\t} = this\n\t\t\tconst {\n\t\t\t\tleft,\n\t\t\t\twidth\n\t\t\t} = this.sliderRect\n\n\t\t\t// 初始值为本次偏移量x，加上次停止滑动时的结束值\n\t\t\tlet exporession = `(${this.x} + x)`\n\t\t\t// 将偏移的x值，转为总位移的百分比值，为了和min和max进行判断\n\t\t\texporession = `(${exporession} / ${width}) * 100`\n\t\t\tif (step > 1) {\n\t\t\t\t// 如果step步进大于1，需要跳步，所以需要使用Math.round进行取整\n\t\t\t\texporession = `round(max(${min}, min(${exporession}, ${max})) / ${step}) * ${step}`\n\t\t\t} else {\n\t\t\t\t// 当step=1时，无需跳步，充分利用bindingx性能，滑块实时跟随手势，达到丝滑的效果\n\t\t\t\texporession = `max(${min}, min(${exporession}, ${max}))`\n\t\t\t}\n\t\t\t// 将百分比最后转化为对应的px值\n\t\t\texporession = `${exporession} / 100 * ${width}`\n\t\t\t// 最大值不允许超过轨迹的宽度\n\t\t\tconst {\n\t\t\t\tsliderWidth\n\t\t\t} = this.sliderRect\n\t\t\texporession = `min(${sliderWidth}, ${exporession})`\n\t\t\t// 滑块点总是需要一个左偏移的值，为自身宽度的一半\n\t\t\tconst buttonExpression = `${exporession} - ${this.blockHeight / 2}`\n\t\t\t// 阿里为了KPI而开源的BindingX\n\t\t\tthis.panEvent = BindingX.bind({\n\t\t\t\tanchor: button,\n\t\t\t\teventType: 'pan',\n\t\t\t\tprops: [{\n\t\t\t\t\telement: gap,\n\t\t\t\t\t// 绑定width属性，设置其宽度值\n\t\t\t\t\tproperty: 'width',\n\t\t\t\t\texpression\n\t\t\t\t}, {\n\t\t\t\t\telement: button,\n\t\t\t\t\t// 绑定width属性，设置其宽度值\n\t\t\t\t\tproperty: 'transform.translateX',\n\t\t\t\t\texpression: buttonExpression\n\t\t\t\t}]\n\t\t\t}, (e) => {\n\t\t\t\tif (e.state === 'end' || e.state === 'exit') {\n\t\t\t\t\t// \n\t\t\t\t\tthis.x = uni.$u.range(0, left + width, e.deltaX + this.x)\n\t\t\t\t\t// 根据偏移值，得出移动的百分比，进而修改双向绑定的v-model的值\n\t\t\t\t\tconst value = (this.x / width) * 100\n\t\t\t\t\tconst percent = this.formatStep(value)\n\t\t\t\t\t// 修改value值\n\t\t\t\t\tthis.$emit('input', percent)\n\t\t\t\t\t// 标记下一次触发value的watch时，这个值的变化，是由内部改变的\n\t\t\t\t\tthis.changeFromInside = true\n\t\t\t\t\tthis.moving = false\n\t\t\t\t\tthis.touching = false\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t// 从value的变化，倒推得出x的值该为多少\n\t\tinitX() {\n\t\t\tconst {\n\t\t\t\tleft,\n\t\t\t\twidth\n\t\t\t} = this.sliderRect\n\t\t\t// 得出x的初始偏移值，之所以需要这么做，是因为在bindingX中，触摸滑动时，只能的值本次移动的偏移值\n\t\t\t// 而无法的值准确的前后移动的两个点的坐标值，weex纯粹为阿里巴巴的KPI(部门业绩考核)产物，也就这样了\n\t\t\tthis.x = this.value / 100 * width\n\t\t\t// 设置移动的值\n\t\t\tconst barStyle = {\n\t\t\t\twidth: this.x + 'px'\n\t\t\t}\n\t\t\t// 按钮的初始值\n\t\t\tconst buttonWrapperStyle = {\n\t\t\t\ttransform: `translateX(${this.x - this.blockHeight / 2}px)`\n\t\t\t}\n\t\t\tthis.initButtonStyle({\n\t\t\t\tbarStyle,\n\t\t\t\tbuttonWrapperStyle\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/nvue.js",
    "content": "/**\n * 使用bindingx方案实现slider\n * 只能使用于nvue下\n */\n// 引入bindingx，此库类似于微信小程序wxs，目的是让js运行在视图层，减少视图层和逻辑层的通信折损\nconst BindingX = uni.requireNativePlugin('bindingx')\n// nvue操作dom的库，用于获取dom的尺寸信息\nconst dom = uni.requireNativePlugin('dom')\n// nvue中用于操作元素动画的库，类似于uni.animation，只不过uni.animation不能用于nvue\nconst animation = uni.requireNativePlugin('animation')\n\nexport default {\n    data() {\n        return {\n            // 位移的偏移量\n            x: 0,\n            // 是否正在触摸过程中，用于标记动画类是否添加或移除\n            touching: false,\n            changeFromInside: false\n        }\n    },\n    watch: {\n        // 监听vlaue的变化，此变化可能是由于内部修改v-model的值，或者外部\n        // 从服务端获取一个值后，赋值给slider的v-model而导致的\n        value(n) {\n            if (!this.changeFromInside) {\n                this.initX()\n            } else {\n                this.changeFromInside = false\n            }\n        }\n    },\n    mounted() {\n        this.init()\n    },\n    methods: {\n        init() {\n            // 更新滑块尺寸信息\n            this.getSliderRect().then((size) => {\n                this.sliderRect = size\n                this.initX()\n            })\n        },\n        // 获取节点信息\n        // 获取slider尺寸\n        getSliderRect() {\n            // 获取滑块条的尺寸信息\n            // 通过nvue的dom模块，查询节点信息\n            return new Promise((resolve) => {\n                this.$nextTick(() => {\n                    dom.getComponentRect(this.$refs.slider, (res) => {\n                        resolve(res.size)\n                    })\n                })\n            })\n        },\n        // 初始化按钮位置\n        initButtonStyle({\n            barStyle,\n            buttonWrapperStyle\n        }) {\n            this.barStyle = barStyle\n            this.buttonWrapperStyle = buttonWrapperStyle\n        },\n        emitEvent(event, value) {\n            this.$emit(event, value || this.value)\n        },\n        // 滑动开始\n        async onTouchStart(e) {\n            // if (this.disabled) return\n            // // 阻止页面滚动，可以保证在滑动过程中，不让页面可以上下滚动，造成不好的体验\n            // e.stopPropagation && e.stopPropagation()\n            // e.preventDefault && e.preventDefault()\n            // // 更新滑块的尺寸信息\n            // this.sliderRect = await this.getSliderRect()\n            // // 标记滑动过程中触摸点的信息\n            // this.touchStart(e)\n            // this.startValue = this.format(this.value)\n            // this.dragStatus = 'start'\n\n            // 标记滑动过程中触摸点的信息\n            // this.touchStart(e)\n        },\n        // 开始滑动\n        onTouchMove(e) {\n            // if (this.disabled) return;\n            // if (this.dragStatus === 'start') {\n            // \tthis.$emit('drag-start')\n            // }\n            // // 标记当前滑动过程中的触点信息，此方法在touch mixin中\n            // this.touchMove(e)\n            // this.dragStatus = 'draging'\n            // const {\n            // \twidth: sliderWidth\n            // } = this.sliderRect\n            // const diff = (this.deltaX / sliderWidth) * this.getRange()\n            // this.newValue = this.startValue + diff\n            // this.updateValue(this.newValue, false, true)\n            // 获取元素ref\n            // const button = this.$refs['nvue-button'].ref\n            // const gap = this.$refs['nvue-gap'].ref\n\n            //          animation.transition(gap, {\n            // \tstyles: {\n            //                  width: `${this.startX + this.deltaX}px`\n            // \t}\n            // })\n            // // console.log(this.startX + this.deltaX);\n            // animation.transition(button, {\n            // \tstyles: {\n            //         transform: `translateX(${this.startX + this.deltaX}px)`\n            // \t}\n            // })\n            // this.barStyle = {\n            // \twidth: `${this.startX + this.deltaX}px`\n            // }\n            const {\n                x\n            } = this.getTouchPoint(e)\n            this.buttonWrapperStyle = {\n                transform: `translateX(${x}px)`\n            }\n            // this.buttonWrapperStyle = {\n            // \ttransform: `translateX(${this.format(this.startX + this.deltaX)}px)`\n            // }\n        },\n        // onTouchEnd() {\n        // \tif (this.disabled) return;\n        // \tif (this.dragStatus === 'draging') {\n        // \t\tthis.updateValue(this.newValue, true)\n        // \t\tthis.$emit('drag-end');\n        // \t}\n        // },\n        updateValue(value, end, drag) {\n            value = this.format(value)\n            const {\n                width: sliderWidth\n            } = this.sliderRect\n            const width = `${((value - this.min) * sliderWidth) / this.getRange()}`\n            this.value = value\n            this.barStyle = {\n                width: `${width}px`\n            }\n            // console.log('width', width);\n            if (drag) {\n                this.$emit('drag', {\n                    value\n                })\n            }\n            if (end) {\n                this.$emit('change', value)\n            }\n            if ((drag || end)) {\n                this.changeFromInside = true\n                this.$emit('update', value)\n            }\n        },\n        // 从value的变化，倒推得出x的值该为多少\n        initX() {\n            const {\n                left,\n                width\n            } = this.sliderRect\n            // 得出x的初始偏移值，之所以需要这么做，是因为在bindingX中，触摸滑动时，只能的值本次移动的偏移值\n            // 而无法的值准确的前后移动的两个点的坐标值，weex纯粹为阿里巴巴的KPI(部门业绩考核)产物，也就这样了\n            this.x = this.value / 100 * width\n            // 设置移动的值\n            const barStyle = {\n                width: `${this.x}px`\n            }\n            // 按钮的初始值\n            const buttonWrapperStyle = {\n                transform: `translateX(${this.x - this.blockHeight / 2}px)`\n            }\n            this.initButtonStyle({\n                barStyle,\n                buttonWrapperStyle\n            })\n        },\n        // 移动点占总长度的百分比，此处需要先除以step，是为了保证step大于1时，比如10，那么在滑动11,12px这样的\n        // 距离时，实际上滑块是不会滑动的，到了16,17px，经过四舍五入后，就变成了20px，进行了下一个跳变\n        format(value) {\n            return Math.round(uni.$u.range(this.min, this.max, value) / this.step) * this.step\n        },\n        getRange() {\n            const {\n                max,\n                min\n            } = this\n            return max - min\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/props.js",
    "content": "export default {\n    props: {\n        // 最小可选值\n        min: {\n            type: [Number, String],\n            default: uni.$u.props.slider.min\n        },\n        // 最大可选值\n        max: {\n            type: [Number, String],\n            default: uni.$u.props.slider.max\n        },\n        // 步长，取值必须大于 0，并且可被(max - min)整除\n        step: {\n            type: [Number, String],\n            default: uni.$u.props.slider.step\n        },\n        // 当前取值\n        value: {\n            type: [Number, String],\n            default: uni.$u.props.slider.value\n        },\n        // 滑块右侧已选择部分的背景色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.slider.activeColor\n        },\n        // 滑块左侧未选择部分的背景色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.slider.inactiveColor\n        },\n        // 滑块的大小，取值范围为 12 - 28\n        blockSize: {\n            type: [Number, String],\n            default: uni.$u.props.slider.blockSize\n        },\n        // 滑块的颜色\n        blockColor: {\n            type: String,\n            default: uni.$u.props.slider.blockColor\n        },\n\t\t// 禁用状态\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.slider.disabled\n\t\t},\n        // 是否显示当前的选择值\n        showValue: {\n            type: Boolean,\n            default: uni.$u.props.slider.showValue\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-slider/u-slider.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-slider\"\n\t\t:style=\"[$u.addStyle(customStyle)]\"\n\t>\n\t\t<slider\n\t\t\t:min=\"min\"\n\t\t\t:max=\"max\"\n\t\t\t:step=\"step\"\n\t\t\t:value=\"value\"\n\t\t\t:activeColor=\"activeColor\"\n\t\t\t:inactiveColor=\"inactiveColor\"\n\t\t\t:blockSize=\"$u.getPx(blockSize)\"\n\t\t\t:blockColor=\"blockColor\"\n\t\t\t:showValue=\"showValue\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t@changing=\"changingHandler\"\n\t\t\t@change=\"changeHandler\"\n\t\t></slider>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js'\n\texport default {\n\t\tname: 'u--slider',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tmethods: {\n\t\t\t// 拖动过程中触发\n\t\t\tchangingHandler(e) {\n\t\t\t\tconst {\n\t\t\t\t\tvalue\n\t\t\t\t} = e.detail\n\t\t\t\t// 更新v-model的值\n\t\t\t\tthis.$emit('input', value)\n\t\t\t\t// 触发事件\n\t\t\t\tthis.$emit('changing', value)\n\t\t\t},\n\t\t\t// 滑动结束时触发\n\t\t\tchangeHandler(e) {\n\t\t\t\tconst {\n\t\t\t\t\tvalue\n\t\t\t\t} = e.detail\n\t\t\t\t// 更新v-model的值\n\t\t\t\tthis.$emit('input', value)\n\t\t\t\t// 触发事件\n\t\t\t\tthis.$emit('change', value)\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-status-bar/props.js",
    "content": "export default {\n    props: {\n        bgColor: {\n            type: String,\n            default: uni.$u.props.statusBar.bgColor\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-status-bar/u-status-bar.vue",
    "content": "<template>\n\t<view\n\t    :style=\"[style]\"\n\t    class=\"u-status-bar\"\n\t>\n\t\t<slot />\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * StatbusBar 状态栏占位\n\t * @description 本组件主要用于状态填充，比如在自定导航栏的时候，它会自动适配一个恰当的状态栏高度。\n\t * @tutorial https://uviewui.com/components/statusBar.html\n\t * @property {String}\t\t\tbgColor\t\t\t背景色 (默认 'transparent' )\n\t * @property {String | Object}\tcustomStyle\t\t自定义样式 \n\t * @example <u-status-bar></u-status-bar>\n\t */\n\texport default {\n\t\tname: 'u-status-bar',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tstyle() {\n\t\t\t\tconst style = {}\n\t\t\t\t// 状态栏高度，由于某些安卓和微信开发工具无法识别css的顶部状态栏变量，所以使用js获取的方式\n\t\t\t\tstyle.height = uni.$u.addUnit(uni.$u.sys().statusBarHeight, 'px')\n\t\t\t\tstyle.backgroundColor = this.bgColor\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.u-status-bar {\n\t\t// nvue会默认100%，如果nvue下，显式写100%的话，会导致宽度不为100%而异常\n\t\t/* #ifndef APP-NVUE */\n\t\twidth: 100%;\n\t\t/* #endif */\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-steps/props.js",
    "content": "export default {\n    props: {\n        // 排列方向\n        direction: {\n            type: String,\n            default: uni.$u.props.steps.direction\n        },\n        // 设置第几个步骤\n        current: {\n            type: [String, Number],\n            default: uni.$u.props.steps.current\n        },\n        // 激活状态颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.steps.activeColor\n        },\n        // 未激活状态颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.steps.inactiveColor\n        },\n        // 激活状态的图标\n        activeIcon: {\n            type: String,\n            default: uni.$u.props.steps.activeIcon\n        },\n        // 未激活状态图标\n        inactiveIcon: {\n            type: String,\n            default: uni.$u.props.steps.inactiveIcon\n        },\n        // 是否显示点类型\n        dot: {\n            type: Boolean,\n            default: uni.$u.props.steps.dot\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-steps/u-steps.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-steps\"\n\t    :class=\"[`u-steps--${direction}`]\"\n\t>\n\t\t<slot></slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Steps 步骤条\n\t * @description 该组件一般用于完成一个任务要分几个步骤，标识目前处于第几步的场景。\n\t * @tutorial https://uviewui.com/components/steps.html\n\t * @property {String}\t\t\tdirection\t\trow-横向，column-竖向 (默认 'row' )\n\t * @property {String | Number}\tcurrent\t\t\t设置当前处于第几步 (默认 0 )\n\t * @property {String}\t\t\tactiveColor\t\t激活状态颜色 (默认 '#3c9cff' )\n\t * @property {String}\t\t\tinactiveColor\t未激活状态颜色 (默认 '#969799' )\n\t * @property {String}\t\t\tactiveIcon\t\t激活状态的图标\n\t * @property {String}\t\t\tinactiveIcon\t未激活状态图标 \n\t * @property {Boolean}\t\t\tdot\t\t\t\t是否显示点类型 (默认 false )\n\t * @example <u-steps current=\"0\"><u-steps-item title=\"已出库\" desc=\"10:35\" ></u-steps-item></u-steps>\n\t */\n\texport default {\n\t\tname: 'u-steps',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tchildren() {\n\t\t\t\tthis.updateChildData()\n\t\t\t},\n\t\t\tparentData() {\n\t\t\t\tthis.updateChildData()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 监听参数的变化，通过watch中，手动去更新子组件的数据，否则子组件不会自动变化\n\t\t\tparentData() {\n\t\t\t\treturn [this.current, this.direction, this.activeColor, this.inactiveColor, this.activeIcon, this.inactiveIcon, this.dot]\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 更新子组件的数据\n\t\t\tupdateChildData() {\n\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t// 先判断子组件是否存在对应的方法\n\t\t\t\t\tuni.$u.test.func((child || {}).updateFromParent()) && child.updateFromParent()\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 接受子组件的通知，去修改其他子组件的数据\n\t\t\tupdateFromChild() {\n\t\t\t\tthis.updateChildData()\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-steps {\n\t\t@include flex;\n\n\t\t&--column {\n\t\t\tflex-direction: column\n\t\t}\n\n\t\t&--row {\n\t\t\tflex-direction: row;\n\t\t\tflex: 1;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-steps-item/props.js",
    "content": "export default {\n    props: {\n        // 标题\n        title: {\n            type: [String, Number],\n            default: uni.$u.props.stepsItem.title\n        },\n        // 描述文本\n        desc: {\n            type: [String, Number],\n            default: uni.$u.props.stepsItem.desc\n        },\n        // 图标大小\n        iconSize: {\n            type: [String, Number],\n            default: uni.$u.props.stepsItem.iconSize\n        },\n        // 当前步骤是否处于失败状态\n        error: {\n            type: Boolean,\n            default: uni.$u.props.stepsItem.error\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-steps-item/u-steps-item.vue",
    "content": "<template>\n\t<view class=\"u-steps-item\" ref=\"u-steps-item\" :class=\"[`u-steps-item--${parentData.direction}`]\">\n\t\t<view class=\"u-steps-item__line\" v-if=\"index + 1 < childLength\"\n\t\t\t:class=\"[`u-steps-item__line--${parentData.direction}`]\" :style=\"[lineStyle]\"></view>\n\t\t<view class=\"u-steps-item__wrapper\"\n\t\t\t:class=\"[`u-steps-item__wrapper--${parentData.direction}`, parentData.dot && `u-steps-item__wrapper--${parentData.direction}--dot`]\">\n\t\t\t<slot name=\"icon\">\n\t\t\t\t<view class=\"u-steps-item__wrapper__dot\" v-if=\"parentData.dot\" :style=\"{\n\t\t\t\t\t\tbackgroundColor: statusColor\n\t\t\t\t\t}\">\n\n\t\t\t\t</view>\n\t\t\t\t<view class=\"u-steps-item__wrapper__icon\" v-else-if=\"parentData.activeIcon || parentData.inactiveIcon\">\n\t\t\t\t\t<u-icon :name=\"index <= parentData.current ? parentData.activeIcon : parentData.inactiveIcon\"\n\t\t\t\t\t\t:size=\"iconSize\"\n\t\t\t\t\t\t:color=\"index <= parentData.current ? parentData.activeColor : parentData.inactiveColor\">\n\t\t\t\t\t</u-icon>\n\t\t\t\t</view>\n\t\t\t\t<view v-else :style=\"{\n\t\t\t\t\t\tbackgroundColor: statusClass === 'process' ? parentData.activeColor : 'transparent',\n\t\t\t\t\t\tborderColor: statusColor\n\t\t\t\t\t}\" class=\"u-steps-item__wrapper__circle\">\n\t\t\t\t\t<text v-if=\"statusClass === 'process' || statusClass === 'wait'\"\n\t\t\t\t\t\tclass=\"u-steps-item__wrapper__circle__text\" :style=\"{\n\t\t\t\t\t\t\tcolor: index == parentData.current ? '#ffffff' : parentData.inactiveColor\n\t\t\t\t\t\t}\">{{ index + 1}}</text>\n\t\t\t\t\t<u-icon v-else :color=\"statusClass === 'error' ? 'error' : parentData.activeColor\" size=\"12\"\n\t\t\t\t\t\t:name=\"statusClass === 'error' ? 'close' : 'checkmark'\"></u-icon>\n\t\t\t\t</view>\n\t\t\t</slot>\n\t\t</view>\n\t\t<view class=\"u-steps-item__content\" :class=\"[`u-steps-item__content--${parentData.direction}`]\"\n\t\t\t:style=\"[contentStyle]\">\n\t\t\t<u--text :text=\"title\" :type=\"parentData.current == index ? 'main' : 'content'\" lineHeight=\"20px\"\n\t\t\t\t:size=\"parentData.current == index ? 14 : 13\"></u--text>\n\t\t\t<slot name=\"desc\">\n\t\t\t\t<u--text :text=\"desc\" type=\"tips\" size=\"12\"></u--text>\n\t\t\t</slot>\n\t\t</view>\n\t\t<!-- <view\n\t\t    class=\"u-steps-item__line\"\n\t\t    v-if=\"showLine && parentData.direction === 'column'\"\n\t\t\t:class=\"[`u-steps-item__line--${parentData.direction}`]\"\n\t\t    :style=\"[lineStyle]\"\n\t\t></view> -->\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * StepsItem 步骤条的子组件\n\t * @description 本组件需要和u-steps配合使用\n\t * @tutorial https://uviewui.com/components/steps.html\n\t * @property {String}\t\t\ttitle\t\t\t标题文字\n\t * @property {String}\t\t\tcurrent\t\t\t描述文本\n\t * @property {String | Number}\ticonSize\t\t图标大小  (默认 17 )\n\t * @property {Boolean}\t\t\terror\t\t\t当前步骤是否处于失败状态  (默认 false )\n\t * @example <u-steps current=\"0\"><u-steps-item title=\"已出库\" desc=\"10:35\" ></u-steps-item></u-steps>\n\t */\n\texport default {\n\t\tname: 'u-steps-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tindex: 0,\n\t\t\t\tchildLength: 0,\n\t\t\t\tshowLine: false,\n\t\t\t\tsize: {\n\t\t\t\t\theight: 0,\n\t\t\t\t\twidth: 0\n\t\t\t\t},\n\t\t\t\tparentData: {\n\t\t\t\t\tdirection: 'row',\n\t\t\t\t\tcurrent: 0,\n\t\t\t\t\tactiveColor: '',\n\t\t\t\t\tinactiveColor: '',\n\t\t\t\t\tactiveIcon: '',\n\t\t\t\t\tinactiveIcon: '',\n\t\t\t\t\tdot: false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t'parentData'(newValue, oldValue) {\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.init()\n\t\t},\n\t\tcomputed: {\n\t\t\tlineStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (this.parentData.direction === 'row') {\n\t\t\t\t\tstyle.width = this.size.width + 'px'\n\t\t\t\t\tstyle.left = this.size.width / 2 + 'px'\n\t\t\t\t} else {\n\t\t\t\t\tstyle.height = this.size.height + 'px'\n\t\t\t\t\t// style.top = this.size.height / 2 + 'px'\n\t\t\t\t}\n\t\t\t\tstyle.backgroundColor = this.parent.children?.[this.index + 1]?.error ? uni.$u.color.error : this.index <\n\t\t\t\t\tthis\n\t\t\t\t\t.parentData\n\t\t\t\t\t.current ? this.parentData.activeColor : this.parentData.inactiveColor\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tstatusClass() {\n\t\t\t\tconst {\n\t\t\t\t\tindex,\n\t\t\t\t\terror\n\t\t\t\t} = this\n\t\t\t\tconst {\n\t\t\t\t\tcurrent\n\t\t\t\t} = this.parentData\n\t\t\t\tif (current == index) {\n\t\t\t\t\treturn error === true ? 'error' : 'process'\n\t\t\t\t} else if (error) {\n\t\t\t\t\treturn 'error'\n\t\t\t\t} else if (current > index) {\n\t\t\t\t\treturn 'finish'\n\t\t\t\t} else {\n\t\t\t\t\treturn 'wait'\n\t\t\t\t}\n\t\t\t},\n\t\t\tstatusColor() {\n\t\t\t\tlet color = ''\n\t\t\t\tswitch (this.statusClass) {\n\t\t\t\t\tcase 'finish':\n\t\t\t\t\t\tcolor = this.parentData.activeColor\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\tcolor = uni.$u.color.error\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'process':\n\t\t\t\t\t\tcolor = this.parentData.dot ? this.parentData.activeColor : 'transparent'\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcolor = this.parentData.inactiveColor\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\treturn color\n\t\t\t},\n\t\t\tcontentStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (this.parentData.direction === 'column') {\n\t\t\t\t\tstyle.marginLeft = this.parentData.dot ? '2px' : '6px'\n\t\t\t\t\tstyle.marginTop = this.parentData.dot ? '0px' : '6px'\n\t\t\t\t} else {\n\t\t\t\t\tstyle.marginTop = this.parentData.dot ? '2px' : '6px'\n\t\t\t\t\tstyle.marginLeft = this.parentData.dot ? '2px' : '6px'\n\t\t\t\t}\n\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.parent && this.parent.updateFromChild()\n\t\t\tuni.$u.sleep().then(() => {\n\t\t\t\tthis.getStepsItemRect()\n\t\t\t})\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 初始化数据\n\t\t\t\tthis.updateParentData()\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\treturn uni.$u.error('u-steps-item必须要搭配u-steps组件使用')\n\t\t\t\t}\n\t\t\t\tthis.index = this.parent.children.indexOf(this)\n\t\t\t\tthis.childLength = this.parent.children.length\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法在mixin中\n\t\t\t\tthis.getParentData('u-steps')\n\t\t\t},\n\t\t\t// 父组件数据发生变化\n\t\t\tupdateFromParent() {\n\t\t\t\tthis.init()\n\t\t\t},\n\t\t\t// 获取组件的尺寸，用于设置横线的位置\n\t\t\tgetStepsItemRect() {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect('.u-steps-item').then(size => {\n\t\t\t\t\tthis.size = size\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tdom.getComponentRect(this.$refs['u-steps-item'], res => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsize\n\t\t\t\t\t} = res\n\t\t\t\t\tthis.size = size\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-steps-item {\n\t\tflex: 1;\n\t\t@include flex;\n\n\t\t&--row {\n\t\t\tflex-direction: column;\n\t\t\talign-items: center;\n\t\t\tposition: relative;\n\t\t}\n\n\t\t&--column {\n\t\t\tposition: relative;\n\t\t\tflex-direction: row;\n\t\t\tjustify-content: flex-start;\n\t\t\tpadding-bottom: 5px;\n\t\t}\n\n\t\t&__wrapper {\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tposition: relative;\n\t\t\tbackground-color: #fff;\n\n\t\t\t&--column {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 32px;\n\n\t\t\t\t&--dot {\n\t\t\t\t\theight: 20px;\n\t\t\t\t\twidth: 20px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&--row {\n\t\t\t\twidth: 32px;\n\t\t\t\theight: 20px;\n\n\t\t\t\t&--dot {\n\t\t\t\t\twidth: 20px;\n\t\t\t\t\theight: 20px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__circle {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\t/* #endif */\n\t\t\t\tborder-radius: 100px;\n\t\t\t\tborder-width: 1px;\n\t\t\t\tborder-color: $u-tips-color;\n\t\t\t\tborder-style: solid;\n\t\t\t\t@include flex(row);\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\ttransition: background-color 0.3s;\n\n\t\t\t\t&__text {\n\t\t\t\t\tcolor: $u-tips-color;\n\t\t\t\t\tfont-size: 11px;\n\t\t\t\t\t@include flex(row);\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\tline-height: 11px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__dot {\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t\tbackground-color: $u-content-color;\n\t\t\t}\n\t\t}\n\n\t\t&__content {\n\t\t\t@include flex;\n\t\t\tflex: 1;\n\n\t\t\t&--row {\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t&--column {\n\t\t\t\tflex-direction: column;\n\t\t\t\tmargin-left: 6px;\n\t\t\t}\n\t\t}\n\n\t\t&__line {\n\t\t\tposition: absolute;\n\t\t\tbackground: $u-tips-color;\n\n\t\t\t&--row {\n\t\t\t\ttop: 10px;\n\t\t\t\theight: 1px;\n\t\t\t}\n\n\t\t\t&--column {\n\t\t\t\twidth: 1px;\n\t\t\t\tleft: 10px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-sticky/props.js",
    "content": "export default {\n    props: {\n        // 吸顶容器到顶部某个距离的时候，进行吸顶，在H5平台，NavigationBar为44px\n        offsetTop: {\n            type: [String, Number],\n            default: uni.$u.props.sticky.offsetTop\n        },\n        // 自定义导航栏的高度\n        customNavHeight: {\n            type: [String, Number],\n            // #ifdef H5\n            // H5端的导航栏属于“自定义”导航栏的范畴，因为它是非原生的，与普通元素一致\n            default: 44,\n            // #endif\n            // #ifndef H5\n            default: uni.$u.props.sticky.customNavHeight\n            // #endif\n        },\n        // 是否开启吸顶功能\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.sticky.disabled\n        },\n        // 吸顶区域的背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.sticky.bgColor\n        },\n        // z-index值\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.sticky.zIndex\n        },\n        // 列表中的索引值\n        index: {\n            type: [String, Number],\n            default: uni.$u.props.sticky.index\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-sticky/u-sticky.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-sticky\"\n\t\t:id=\"elId\"\n\t\t:style=\"[style]\"\n\t>\n\t\t<view\n\t\t\t:style=\"[stickyContent]\"\n\t\t\tclass=\"u-sticky__content\"\n\t\t>\n\t\t\t<slot />\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';;\n\t/**\n\t * sticky 吸顶\n\t * @description 该组件与CSS中position: sticky属性实现的效果一致，当组件达到预设的到顶部距离时， 就会固定在指定位置，组件位置大于预设的顶部距离时，会重新按照正常的布局排列。\n\t * @tutorial https://www.uviewui.com/components/sticky.html\n\t * @property {String ｜ Number}\toffsetTop\t\t吸顶时与顶部的距离，单位px（默认 0 ）\n\t * @property {String ｜ Number}\tcustomNavHeight\t自定义导航栏的高度 （h5 默认44  其他默认 0 ）\n\t * @property {Boolean}\t\t\tdisabled\t\t是否开启吸顶功能 （默认 false ）\n\t * @property {String}\t\t\tbgColor\t\t\t组件背景颜色（默认 '#ffffff' ）\n\t * @property {String ｜ Number}\tzIndex\t\t\t吸顶时的z-index值\n\t * @property {String ｜ Number}\tindex\t\t\t自定义标识，用于区分是哪一个组件\n\t * @property {Object}\t\t\tcustomStyle\t\t组件的样式，对象形式\n\t * @event {Function} fixed\t\t组件吸顶时触发\n\t * @event {Function} unfixed\t组件取消吸顶时触发\n\t * @example <u-sticky offsetTop=\"200\"><view>塞下秋来风景异，衡阳雁去无留意</view></u-sticky>\n\t */\n\texport default {\n\t\tname: 'u-sticky',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tcssSticky: false, // 是否使用css的sticky实现\n\t\t\t\tstickyTop: 0, // 吸顶的top值，因为可能受自定义导航栏影响，最终的吸顶值非offsetTop值\n\t\t\t\telId: uni.$u.guid(),\n\t\t\t\tleft: 0, // js模式时，吸顶的内容因为处于postition: fixed模式，为了和原来保持一致的样式，需要记录并重新设置它的left，height，width属性\n\t\t\t\twidth: 'auto',\n\t\t\t\theight: 'auto',\n\t\t\t\tfixed: false, // js模式时，是否处于吸顶模式\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tstyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif(!this.disabled) {\n\t\t\t\t\tif (this.cssSticky) {\n\t\t\t\t\t\tstyle.position = 'sticky'\n\t\t\t\t\t\tstyle.zIndex = this.uZindex\n\t\t\t\t\t\tstyle.top = uni.$u.addUnit(this.stickyTop)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstyle.height = this.fixed ? this.height + 'px' : 'auto'\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// 无需吸顶时，设置会默认的relative(nvue)和非nvue的static静态模式即可\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tstyle.position = 'relative'\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tstyle.position = 'static'\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t\tstyle.backgroundColor = this.bgColor\n\t\t\t\treturn uni.$u.deepMerge(uni.$u.addStyle(this.customStyle), style)\n\t\t\t},\n\t\t\t// 吸顶内容的样式\n\t\t\tstickyContent() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (!this.cssSticky) {\n\t\t\t\t\tstyle.position = this.fixed ? 'fixed' : 'static'\n\t\t\t\t\tstyle.top = this.stickyTop + 'px'\n\t\t\t\t\tstyle.left = this.left + 'px'\n\t\t\t\t\tstyle.width = this.width == 'auto' ? 'auto' : this.width + 'px'\n\t\t\t\t\tstyle.zIndex = this.uZindex\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tuZindex() {\n\t\t\t\treturn this.zIndex ? this.zIndex : uni.$u.zIndex.sticky\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tthis.getStickyTop()\n\t\t\t\t// 判断使用的模式\n\t\t\t\tthis.checkSupportCssSticky()\n\t\t\t\t// 如果不支持css sticky，则使用js方案，此方案性能比不上css方案\n\t\t\t\tif (!this.cssSticky) {\n\t\t\t\t\t!this.disabled && this.initObserveContent()\n\t\t\t\t}\n\t\t\t},\n\t\t\tinitObserveContent() {\n\t\t\t\t// 获取吸顶内容的高度，用于在js吸顶模式时，给父元素一个填充高度，防止\"塌陷\"\n\t\t\t\tthis.$uGetRect('#' + this.elId).then((res) => {\n\t\t\t\t\tthis.height = res.height\n\t\t\t\t\tthis.left = res.left\n\t\t\t\t\tthis.width = res.width\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.observeContent()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t},\n\t\t\tobserveContent() {\n\t\t\t\t// 先断掉之前的观察\n\t\t\t\tthis.disconnectObserver('contentObserver')\n\t\t\t\tconst contentObserver = uni.createIntersectionObserver({\n\t\t\t\t\t// 检测的区间范围\n\t\t\t\t\tthresholds: [0.95, 0.98, 1]\n\t\t\t\t})\n\t\t\t\t// 到屏幕顶部的高度时触发\n\t\t\t\tcontentObserver.relativeToViewport({\n\t\t\t\t\ttop: -this.stickyTop\n\t\t\t\t})\n\t\t\t\t// 绑定观察的元素\n\t\t\t\tcontentObserver.observe(`#${this.elId}`, res => {\n\t\t\t\t\tthis.setFixed(res.boundingClientRect.top)\n\t\t\t\t})\n\t\t\t\tthis.contentObserver = contentObserver\n\t\t\t},\n\t\t\tsetFixed(top) {\n\t\t\t\t// 判断是否出于吸顶条件范围\n\t\t\t\tconst fixed = top <= this.stickyTop\n\t\t\t\tthis.fixed = fixed\n\t\t\t},\n\t\t\tdisconnectObserver(observerName) {\n\t\t\t\t// 断掉观察，释放资源\n\t\t\t\tconst observer = this[observerName]\n\t\t\t\tobserver && observer.disconnect()\n\t\t\t},\n\t\t\tgetStickyTop() {\n\t\t\t\tthis.stickyTop = uni.$u.getPx(this.offsetTop) + uni.$u.getPx(this.customNavHeight)\n\t\t\t},\n\t\t\tasync checkSupportCssSticky() {\n\t\t\t\t// #ifdef H5\n\t\t\t\t// H5，一般都是现代浏览器，是支持css sticky的，这里使用创建元素嗅探的形式判断\n\t\t\t\tif (this.checkCssStickyForH5()) {\n\t\t\t\t\tthis.cssSticky = true\n\t\t\t\t}\n\t\t\t\t// #endif\n\n\t\t\t\t// 如果安卓版本高于8.0，依然认为是支持css sticky的(因为安卓7在某些机型，可能不支持sticky)\n\t\t\t\tif (uni.$u.os() === 'android' && Number(uni.$u.sys().system) > 8) {\n\t\t\t\t\tthis.cssSticky = true\n\t\t\t\t}\n\n\t\t\t\t// APP-Vue和微信平台，通过computedStyle判断是否支持css sticky\n\t\t\t\t// #ifdef APP-VUE || MP-WEIXIN\n\t\t\t\tthis.cssSticky = await this.checkComputedStyle()\n\t\t\t\t// #endif\n\n\t\t\t\t// ios上，从ios6开始，都是支持css sticky的\n\t\t\t\tif (uni.$u.os() === 'ios') {\n\t\t\t\t\tthis.cssSticky = true\n\t\t\t\t}\n\n\t\t\t\t// nvue，是支持css sticky的\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.cssSticky = true\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 在APP和微信小程序上，通过uni.createSelectorQuery可以判断是否支持css sticky\n\t\t\tcheckComputedStyle() {\n\t\t\t\t// 方法内进行判断，避免在其他平台生成无用代码\n\t\t\t\t// #ifdef APP-VUE || MP-WEIXIN\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tuni.createSelectorQuery().in(this).select('.u-sticky').fields({\n\t\t\t\t\t\tcomputedStyle: [\"position\"]\n\t\t\t\t\t}).exec(e => {\n\t\t\t\t\t\tresolve('sticky' === e[0].position)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// H5通过创建元素的形式嗅探是否支持css sticky\n\t\t\t// 判断浏览器是否支持sticky属性\n\t\t\tcheckCssStickyForH5() {\n\t\t\t\t// 方法内进行判断，避免在其他平台生成无用代码\n\t\t\t\t// #ifdef H5\n\t\t\t\tconst vendorList = ['', '-webkit-', '-ms-', '-moz-', '-o-'],\n\t\t\t\t\tvendorListLength = vendorList.length,\n\t\t\t\t\tstickyElement = document.createElement('div')\n\t\t\t\tfor (let i = 0; i < vendorListLength; i++) {\n\t\t\t\t\tstickyElement.style.position = vendorList[i] + 'sticky'\n\t\t\t\t\tif (stickyElement.style.position !== '') {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t\t// #endif\n\t\t\t}\n\t\t},\n\t\tbeforeDestroy() {\n\t\t\tthis.disconnectObserver('contentObserver')\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.u-sticky {\n\t\t/* #ifdef APP-VUE || MP-WEIXIN */\n\t\t// 此处默认写sticky属性，是为了给微信和APP通过uni.createSelectorQuery查询是否支持css sticky使用\n\t\tposition: sticky;\n\t\t/* #endif */\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-subsection/props.js",
    "content": "export default {\n    props: {\n        // tab的数据\n        list: {\n            type: Array,\n            default: uni.$u.props.subsection.list\n        },\n        // 当前活动的tab的index\n        current: {\n            type: [String, Number],\n            default: uni.$u.props.subsection.current\n        },\n        // 激活的颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.subsection.activeColor\n        },\n        // 未激活的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.subsection.inactiveColor\n        },\n        // 模式选择，mode=button为按钮形式，mode=subsection时为分段模式\n        mode: {\n            type: String,\n            default: uni.$u.props.subsection.mode\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: uni.$u.props.subsection.fontSize\n        },\n        // 激活tab的字体是否加粗\n        bold: {\n            type: Boolean,\n            default: uni.$u.props.subsection.bold\n        },\n        // mode = button时，组件背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.subsection.bgColor\n        },\n\t\t// 从list元素对象中读取的键名\n\t\tkeyName: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.subsection.keyName\n\t\t}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-subsection/u-subsection.vue",
    "content": "<template>\n    <view\n        class=\"u-subsection\"\n        ref=\"u-subsection\"\n        :class=\"[`u-subsection--${mode}`]\"\n        :style=\"[$u.addStyle(customStyle), wrapperStyle]\"\n    >\n        <view\n            class=\"u-subsection__bar\"\n            ref=\"u-subsection__bar\"\n            :style=\"[barStyle]\"\n            :class=\"[\n                mode === 'button' && 'u-subsection--button__bar',\n                current === 0 &&\n                    mode === 'subsection' &&\n                    'u-subsection__bar--first',\n                current > 0 &&\n                    current < list.length - 1 &&\n                    mode === 'subsection' &&\n                    'u-subsection__bar--center',\n                current === list.length - 1 &&\n                    mode === 'subsection' &&\n                    'u-subsection__bar--last',\n            ]\"\n        ></view>\n        <view\n            class=\"u-subsection__item\"\n            :class=\"[\n                `u-subsection__item--${index}`,\n                index < list.length - 1 &&\n                    'u-subsection__item--no-border-right',\n                index === 0 && 'u-subsection__item--first',\n                index === list.length - 1 && 'u-subsection__item--last',\n            ]\"\n            :ref=\"`u-subsection__item--${index}`\"\n            :style=\"[itemStyle(index)]\"\n            @tap=\"clickHandler(index)\"\n            v-for=\"(item, index) in list\"\n            :key=\"index\"\n        >\n            <text\n                class=\"u-subsection__item__text\"\n                :style=\"[textStyle(index)]\"\n                >{{ getText(item) }}</text\n            >\n        </view>\n    </view>\n</template>\n\n<script>\n// #ifdef APP-NVUE\nconst dom = uni.requireNativePlugin(\"dom\");\nconst animation = uni.requireNativePlugin(\"animation\");\n// #endif\nimport props from \"./props.js\";\n/**\n * Subsection 分段器\n * @description 该分段器一般用于用户从几个选项中选择某一个的场景\n * @tutorial https://www.uviewui.com/components/subsection.html\n * @property {Array}\t\t\tlist\t\t\ttab的数据\n * @property {String ｜ Number}\tcurrent\t\t\t当前活动的tab的index（默认 0 ）\n * @property {String}\t\t\tactiveColor\t\t激活时的颜色（默认 '#3c9cff' ）\n * @property {String}\t\t\tinactiveColor\t未激活时的颜色（默认 '#303133' ）\n * @property {String}\t\t\tmode\t\t\t模式选择，mode=button为按钮形式，mode=subsection时为分段模式（默认 'button' ）\n * @property {String ｜ Number}\tfontSize\t\t字体大小，单位px（默认 12 ）\n * @property {Boolean}\t\t\tbold\t\t\t激活选项的字体是否加粗（默认 true ）\n * @property {String}\t\t\tbgColor\t\t\t组件背景颜色，mode为button时有效（默认 '#eeeeef' ）\n * @property {Object}\t\t\tcustomStyle\t\t定义需要用到的外部样式\n * @property {String}\t        keyName\t        从`list`元素对象中读取的键名（默认 'name' ）\n *\n * @event {Function} change\t\t分段器选项发生改变时触发  回调 index：选项的index索引值，从0开始\n * @example <u-subsection :list=\"list\" :current=\"curNow\" @change=\"sectionChange\"></u-subsection>\n */\nexport default {\n    name: \"u-subsection\",\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n    data() {\n        return {\n            // 组件尺寸\n            itemRect: {\n                width: 0,\n                height: 0,\n            },\n        };\n    },\n    watch: {\n        list(newValue, oldValue) {\n            this.init();\n        },\n        current: {\n            immediate: true,\n            handler(n) {\n                // #ifdef APP-NVUE\n                // 在安卓nvue上，如果通过translateX进行位移，到最后一个时，会导致右侧无法绘制圆角\n                // 故用animation模块进行位移\n                const ref = this.$refs?.[\"u-subsection__bar\"]?.ref;\n                // 不存在ref的时候(理解为第一次初始化时，需要渲染dom，进行一定延时再获取ref)，这里的100ms是经过测试得出的结果(某些安卓需要延时久一点)，勿随意修改\n                uni.$u.sleep(ref ? 0 : 100).then(() => {\n                    animation.transition(this.$refs[\"u-subsection__bar\"].ref, {\n                        styles: {\n                            transform: `translateX(${\n                                n * this.itemRect.width\n                            }px)`,\n                            transformOrigin: \"center center\",\n                        },\n                        duration: 300,\n                    });\n                });\n                // #endif\n            },\n        },\n    },\n    computed: {\n        wrapperStyle() {\n            const style = {};\n            // button模式时，设置背景色\n            if (this.mode === \"button\") {\n                style.backgroundColor = this.bgColor;\n            }\n            return style;\n        },\n        // 滑块的样式\n        barStyle() {\n            const style = {};\n            style.width = `${this.itemRect.width}px`;\n            style.height = `${this.itemRect.height}px`;\n            // 通过translateX移动滑块，其移动的距离为索引*item的宽度\n            // #ifndef APP-NVUE\n            style.transform = `translateX(${\n                this.current * this.itemRect.width\n            }px)`;\n            // #endif\n            if (this.mode === \"subsection\") {\n                // 在subsection模式下，需要动态设置滑块的圆角，因为移动滑块使用的是translateX，无法通过父元素设置overflow: hidden隐藏滑块的直角\n                style.backgroundColor = this.activeColor;\n            }\n            return style;\n        },\n        // 分段器item的样式\n        itemStyle(index) {\n            return (index) => {\n                const style = {};\n                if (this.mode === \"subsection\") {\n                    // 设置border的样式\n                    style.borderColor = this.activeColor;\n                    style.borderWidth = \"1px\";\n                    style.borderStyle = \"solid\";\n                }\n                return style;\n            };\n        },\n        // 分段器文字颜色\n        textStyle(index) {\n            return (index) => {\n                const style = {};\n                style.fontWeight =\n                    this.bold && this.current === index ? \"bold\" : \"normal\";\n                style.fontSize = uni.$u.addUnit(this.fontSize);\n                // subsection模式下，激活时默认为白色的文字\n                if (this.mode === \"subsection\") {\n                    style.color =\n                        this.current === index ? \"#fff\" : this.inactiveColor;\n                } else {\n                    // button模式下，激活时文字颜色默认为activeColor\n                    style.color =\n                        this.current === index\n                            ? this.activeColor\n                            : this.inactiveColor;\n                }\n                return style;\n            };\n        },\n    },\n    mounted() {\n        this.init();\n    },\n    methods: {\n        init() {\n            uni.$u.sleep().then(() => this.getRect());\n        },\n\t\t// 判断展示文本\n\t\tgetText(item) {\n\t\t\treturn typeof item === 'object' ? item[this.keyName] : item\n\t\t},\n        // 获取组件的尺寸\n        getRect() {\n            // #ifndef APP-NVUE\n            this.$uGetRect(\".u-subsection__item--0\").then((size) => {\n                this.itemRect = size;\n            });\n            // #endif\n\n            // #ifdef APP-NVUE\n            const ref = this.$refs[\"u-subsection__item--0\"][0];\n            ref &&\n                dom.getComponentRect(ref, (res) => {\n                    this.itemRect = res.size;\n                });\n            // #endif\n        },\n        clickHandler(index) {\n            this.$emit(\"change\", index);\n        },\n    },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n.u-subsection {\n    @include flex;\n    position: relative;\n    overflow: hidden;\n\t/* #ifndef APP-NVUE */\n\twidth: 100%;\n\tbox-sizing: border-box;\n\t/* #endif */\n\n    &--button {\n        height: 32px;\n        background-color: rgb(238, 238, 239);\n        padding: 3px;\n        border-radius: 3px;\n        align-items: stretch;\n\n        &__bar {\n            background-color: #ffffff;\n            border-radius: 3px !important;\n        }\n    }\n\n    &--subsection {\n        height: 30px;\n    }\n\n    &__bar {\n        position: absolute;\n        /* #ifndef APP-NVUE */\n        transition-property: transform, color;\n        transition-duration: 0.3s;\n        transition-timing-function: ease-in-out;\n        /* #endif */\n\n        &--first {\n            border-top-left-radius: 3px;\n            border-bottom-left-radius: 3px;\n            border-top-right-radius: 0px;\n            border-bottom-right-radius: 0px;\n        }\n\n        &--center {\n            border-top-left-radius: 0px;\n            border-bottom-left-radius: 0px;\n            border-top-right-radius: 0px;\n            border-bottom-right-radius: 0px;\n        }\n\n        &--last {\n            border-top-left-radius: 0px;\n            border-bottom-left-radius: 0px;\n            border-top-right-radius: 3px;\n            border-bottom-right-radius: 3px;\n        }\n    }\n\n    &__item {\n        @include flex;\n        flex: 1;\n        justify-content: center;\n        align-items: center;\n        // vue环境下，需要设置相对定位，因为滑块为绝对定位，item需要在滑块的上面\n        position: relative;\n\n        &--no-border-right {\n            border-right-width: 0 !important;\n        }\n\n        &--first {\n            border-top-left-radius: 3px;\n            border-bottom-left-radius: 3px;\n        }\n\n        &--last {\n            border-top-right-radius: 3px;\n            border-bottom-right-radius: 3px;\n        }\n\n        &__text {\n            font-size: 12px;\n            line-height: 12px;\n            @include flex;\n            align-items: center;\n            transition-property: color;\n            transition-duration: 0.3s;\n        }\n    }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action/props.js",
    "content": "export default {\n    props: {\n        // 是否自动关闭其他swipe按钮组\n        autoClose: {\n            type: Boolean,\n            default: uni.$u.props.swipeAction.autoClose\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue",
    "content": "<template>\n\t<view class=\"u-swipe-action\">\n\t\t<slot></slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * SwipeAction 滑动单元格 \n\t * @description 该组件一般用于左滑唤出操作菜单的场景，用的最多的是左滑删除操作\n\t * @tutorial https://www.uviewui.com/components/swipeAction.html\n\t * @property {Boolean}\tautoClose\t是否自动关闭其他swipe按钮组\n\t * @event {Function(index)}\tclick\t点击组件时触发\n\t * @example\t<u-swipe-action><u-swipe-action-item :rightOptions=\"options1\" ></u-swipe-action-item></u-swipe-action>\n\t */\n\texport default {\n\t\tname: 'u-swipe-action',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {}\n\t\t},\n\t\tprovide() {\n\t\t\treturn {\n\t\t\t\tswipeAction: this\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 这里computed的变量，都是子组件u-swipe-action-item需要用到的，由于头条小程序的兼容性差异，子组件无法实时监听父组件参数的变化\n\t\t\t// 所以需要手动通知子组件，这里返回一个parentData变量，供watch监听，在其中去通知每一个子组件重新从父组件(u-swipe-action-item)\n\t\t\t// 拉取父组件新的变化后的参数\n\t\t\tparentData() {\n\t\t\t\treturn [this.autoClose]\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 当父组件需要子组件需要共享的参数发生了变化，手动通知子组件\n\t\t\tparentData() {\n\t\t\t\tif (this.children.length) {\n\t\t\t\t\tthis.children.map(child => {\n\t\t\t\t\t\t// 判断子组件(u-swipe-action-item)如果有updateParentData方法的话，就就执行(执行的结果是子组件重新从父组件拉取了最新的值)\n\t\t\t\t\t\ttypeof(child.updateParentData) === 'function' && child.updateParentData()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t},\n\t\tmethods: {\n\t\t\tcloseOther(child) {\n\t\t\t\tif (this.autoClose) {\n\t\t\t\t\t// 历遍所有的单元格，找出非当前操作中的单元格，进行关闭\n\t\t\t\t\tthis.children.map((item, index) => {\n\t\t\t\t\t\tif (child !== item) {\n\t\t\t\t\t\t\titem.closeHandler()\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\tcloseAll() {\n\t\t\t\tthis.children.map((item, index) => item.closeHandler())\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/index - backup.wxs",
    "content": "/**\n * 此为wxs模块，只支持APP-VUE，微信和QQ小程序以及H5平台\n * wxs内部不支持es6语法，变量只能使用var定义，无法使用解构，箭头函数等特性\n */\n\n// 开始触摸\nfunction touchstart(event, ownerInstance) {\n\t// 触发事件的组件的ComponentDescriptor实例\n\tvar instance = event.instance\n\t// wxs内的局部变量快照，此快照是属于整个组件的，在touchstart和touchmove事件中都能获取到相同的结果\n\tvar state = instance.getState()\n\tif (state.disable) return\n\tvar touches = event.touches\n\t// 如果进行的是多指触控，不允许进行操作\n\tif (touches && touches.length > 1) return\n\t// 标识当前为滑动中状态\n\tstate.moving = true\n\t// 记录触摸开始点的坐标值\n\tstate.startX = touches[0].pageX\n\tstate.startY = touches[0].pageY\n}\n\n// 触摸滑动\nfunction touchmove(event, ownerInstance) {\n\t// 触发事件的组件的ComponentDescriptor实例\n\tvar instance = event.instance\n\t// wxs内的局部变量快照\n\tvar state = instance.getState()\n\tif (state.disabled || !state.moving) return\n\n\tvar touches = event.touches\n\tvar pageX = touches[0].pageX\n\tvar pageY = touches[0].pageY\n\tvar moveX = pageX - state.startX\n\tvar moveY = pageY - state.startY\n\tvar buttonsWidth = state.buttonsWidth\n\n\t// 移动的X轴距离大于Y轴距离，也即终点与起点位置连线，与X轴夹角小于45度时，禁止页面滚动\n\tif (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t}\n\t// 如果移动的X轴距离小于Y轴距离，也即终点位置与起点位置连线，与Y轴夹角小于45度时，认为是页面上下滑动，而不是左右滑动单元格\n\tif (Math.abs(moveX) < Math.abs(moveY)) return\n\n\t// 限制右滑的距离，不允许内容部分往右偏移，右滑会导致X轴偏移值大于0，以此做判断\n\t// 此处不能直接return，因为滑动过程中会缺失某些关键点坐标，会导致错乱，最好的办法就是\n\t// 在超出后，设置为0\n\tif (state.status === 'open') {\n\t\t// 在开启状态下，向左滑动，需忽略\n\t\tif (moveX < 0) moveX = 0\n\t\t// 想要收起菜单，最大能移动的距离为按钮的总宽度\n\t\tif (moveX > buttonsWidth) moveX = buttonsWidth\n\t\t// 如果是已经打开了的状态，向左滑动时，移动收起菜单\n\t\tmoveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance)\n\t} else {\n\t\t// 关闭状态下，右滑动需忽略\n\t\tif (moveX > 0) moveX = 0\n\t\t// 滑动的距离不允许超过所有按钮的总宽度，此时只能是左滑，最终设置按钮的总宽度，同时为负数\n\t\tif (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth\n\t\t// 只要是在滑过程中，就不断移动菜单的内容部分，从而使隐藏的菜单显示出来\n\t\tmoveSwipeAction(moveX, instance, ownerInstance)\n\t}\n}\n\n// 触摸结束\nfunction touchend(event, ownerInstance) {\n\t// 触发事件的组件的ComponentDescriptor实例\n\tvar instance = event.instance\n\t// wxs内的局部变量快照\n\tvar state = instance.getState()\n\tif (!state.moving || state.disabled) return\n\tvar touches = event.changedTouches ? event.changedTouches[0] : {}\n\tvar pageX = touches.pageX\n\tvar pageY = touches.pageY\n\tvar moveX = pageX - state.startX\n\tif (state.status === 'open') {\n\t\t// 在展开的状态下，继续左滑，无需操作\n\t\tif (moveX < 0) return\n\t\t// 在开启状态下，点击一下内容区域，moveX为0，也即没有进行移动，这时执行收起菜单逻辑\n\t\tif (moveX === 0) {\n\t\t\treturn closeSwipeAction(instance, ownerInstance)\n\t\t}\n\t\t// 在开启状态下，滑动距离小于阈值，则默认为不关闭，同时恢复原来的打开状态\n\t\tif (Math.abs(moveX) < state.threshold) {\n\t\t\topenSwipeAction(instance, ownerInstance)\n\t\t} else {\n\t\t\t// 如果滑动距离大于阈值，则执行收起逻辑\n\t\t\tcloseSwipeAction(instance, ownerInstance)\n\t\t}\n\t} else {\n\t\t// 在关闭的状态下，右滑，无需操作\n\t\tif (moveX > 0) return\n\t\t// 理由同上\n\t\tif (Math.abs(moveX) < state.threshold) {\n\t\t\tcloseSwipeAction(instance, ownerInstance)\n\t\t} else {\n\t\t\topenSwipeAction(instance, ownerInstance)\n\t\t}\n\t}\n}\n\n// 获取过渡时间\nfunction getDuration(value) {\n\tif (value.toString().indexOf('s') >= 0) return value\n\treturn value > 30 ? value + 'ms' : value + 's'\n}\n\n// 滑动结束时判断滑动的方向\nfunction getMoveDirection(instance, ownerInstance) {\n\tvar state = instance.getState()\n}\n\n// 移动滑动选择器内容区域，同时显示出其隐藏的菜单\nfunction moveSwipeAction(moveX, instance, ownerInstance) {\n\tvar state = instance.getState()\n\t// 获取所有按钮的实例，需要通过它去设置按钮的位移\n\tvar buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')\n\tvar len = buttons.length\n\tvar previewButtonsMoveX = 0\n\n\t// 设置菜单内容部分的偏移\n\tinstance.requestAnimationFrame(function() {\n\t\tinstance.setStyle({\n\t\t\t// 设置translateX的值\n\t\t\t'transition': 'none',\n\t\t\ttransform: 'translateX(' + moveX + 'px)',\n\t\t\t'-webkit-transform': 'translateX(' + moveX + 'px)'\n\t\t})\n\t\t// 折叠按钮动画\n\t\tfor (var i = len - 1; i >= 0; i--) {\n\t\t\t// 通过比例，得出元素自身该移动的距离\n\t\t\tvar translateX = state.buttons[i].width / state.buttonsWidth * moveX\n\t\t\t// 最终移动的距离，是通过自身比例算出的距离，再加上在它之前所有按钮移动的距离之和\n\t\t\tvar realTranslateX = translateX + previewButtonsMoveX\n\t\t\tbuttons[i].setStyle({\n\t\t\t\t// 在移动期间，不能使用过渡效果，否则会造成卡顿，本质原因是每次移动一点，就要花一定时间去过渡这个过程\n\t\t\t\t'transition': 'none',\n\t\t\t\t'transform': 'translateX(' + realTranslateX + 'px)',\n\t\t\t\t'-webkit-transform': 'translateX(' + realTranslateX + 'px)'\n\t\t\t})\n\t\t\t// 记录本按钮之前的所有按钮的移动距离之和\n\t\t\tpreviewButtonsMoveX += translateX\n\t\t}\n\t})\n}\n\n// 一次性展开滑动菜单\nfunction openSwipeAction(instance, ownerInstance) {\n\tvar state = instance.getState()\n\t// 获取所有按钮的实例，需要通过它去设置按钮的位移\n\tvar buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')\n\tvar len = buttons.length\n\t// 处理duration单位问题\n\tconst duration = getDuration(state.duration)\n\t// 展开过程中，是向左移动，所以X的偏移应该为负值\n\tvar buttonsWidth = -state.buttonsWidth\n\tvar previewButtonsMoveX = 0\n\tinstance.requestAnimationFrame(function() {\n\t\t// 设置菜单主体内容\n\t\tinstance.setStyle({\n\t\t\t'transition': 'transform ' + duration,\n\t\t\t'transform': 'translateX(' + buttonsWidth + 'px)',\n\t\t\t'-webkit-transform': 'translateX(' + buttonsWidth + 'px)',\n\t\t})\n\t\t// 设置各个隐藏的按钮为展开的状态\n\t\tfor (var i = len - 1; i >= 0; i--) {\n\t\t\t// 通过比例，得出元素自身该移动的距离\n\t\t\tvar translateX = state.buttons[i].width / state.buttonsWidth * buttonsWidth\n\t\t\t// 最终移动的距离，是通过自身比例算出的距离，再加上在它之前所有按钮移动的距离之和\n\t\t\tvar realTranslateX = translateX + previewButtonsMoveX\n\t\t\tbuttons[i].setStyle({\n\t\t\t\t// 在移动期间，需要加上动画效果\n\t\t\t\t'transition': 'transform ' + duration,\n\t\t\t\t'transform': 'translateX(' + realTranslateX + 'px)',\n\t\t\t\t'-webkit-transform': 'translateX(' + realTranslateX + 'px)'\n\t\t\t})\n\t\t\t// 记录本按钮之前的所有按钮的移动距离之和\n\t\t\tpreviewButtonsMoveX += translateX\n\t\t}\n\t})\n\tsetStatus('open', instance)\n}\n\n// 标记菜单的当前状态，open-已经打开，close-已经关闭\nfunction setStatus(status, instance) {\n\tvar state = instance.getState()\n\tstate.status = status\n}\n\n// 一次性收起滑动菜单\nfunction closeSwipeAction(instance, ownerInstance) {\n\tvar state = instance.getState()\n\t// 获取所有按钮的实例，需要通过它去设置按钮的位移\n\tvar buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')\n\tvar len = buttons.length\n\t// 处理duration单位问题\n\tconst duration = getDuration(state.duration)\n\tinstance.requestAnimationFrame(function() {\n\t\t// 设置菜单主体内容\n\t\tinstance.setStyle({\n\t\t\t'transition': 'transform ' + duration,\n\t\t\t'transform': 'translateX(0px)',\n\t\t\t'-webkit-transform': 'translateX(0px)'\n\t\t})\n\t\t// 设置各个隐藏的按钮为收起的状态\n\t\tfor (var i = len - 1; i >= 0; i--) {\n\t\t\tbuttons[i].setStyle({\n\t\t\t\t'transition': 'transform ' + duration,\n\t\t\t\t'transform': 'translateX(0px)',\n\t\t\t\t'-webkit-transform': 'translateX(0px)'\n\t\t\t})\n\t\t}\n\t})\n\tsetStatus('close', instance)\n}\n\n// show的状态发生变化\nfunction showChange(newValue, oldValue, ownerInstance, instance) {\n\tvar state = instance.getState()\n\tif (state.disabled) return\n\t// 打开或关闭单元格\n\tif (newValue) {\n\t\topenSwipeAction(instance, ownerInstance)\n\t} else {\n\t\tcloseSwipeAction(instance, ownerInstance)\n\t}\n}\n\n// 菜单尺寸发生变化\nfunction sizeChange(newValue, oldValue, ownerInstance, instance) {\n\t// wxs内的局部变量快照\n\tvar state = instance.getState()\n\tstate.disabled = newValue.disabled\n\tstate.duration = newValue.duration\n\tstate.show = newValue.show\n\tstate.threshold = newValue.threshold\n\tstate.buttons = newValue.buttons\n\n\tvar len = state.buttons.length\n\tif (len) {\n\t\tvar buttonsWidth = 0\n\t\tvar buttons = newValue.buttons\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tbuttonsWidth += buttons[i].width\n\t\t}\n\t}\n\tstate.buttonsWidth = buttonsWidth\n}\n\nmodule.exports = {\n\ttouchstart: touchstart,\n\ttouchmove: touchmove,\n\ttouchend: touchend,\n\tsizeChange: sizeChange\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/index.wxs",
    "content": "/**\n * 此为wxs模块，只支持APP-VUE，微信和QQ小程序以及H5平台\n * wxs内部不支持es6语法，变量只能使用var定义，无法使用解构，箭头函数等特性\n */\n\n// 开始触摸\nfunction touchstart(event, ownerInstance) {\n\t// 触发事件的组件的ComponentDescriptor实例\n\tvar instance = event.instance\n\t// wxs内的局部变量快照，此快照是属于整个组件的，在touchstart和touchmove事件中都能获取到相同的结果\n\tvar state = instance.getState()\n\tif (state.disabled) return\n\tvar touches = event.touches\n\t// 如果进行的是多指触控，不允许进行操作\n\tif (touches && touches.length > 1) return\n\t// 标识当前为滑动中状态\n\tstate.moving = true\n\t// 记录触摸开始点的坐标值\n\tstate.startX = touches[0].pageX\n\tstate.startY = touches[0].pageY\n\t\n\townerInstance.callMethod('closeOther')\n}\n\n// 触摸滑动\nfunction touchmove(event, ownerInstance) {\n\t// 触发事件的组件的ComponentDescriptor实例\n\tvar instance = event.instance\n\t// wxs内的局部变量快照\n\tvar state = instance.getState()\n\tif (state.disabled || !state.moving) return\n\tvar touches = event.touches\n\tvar pageX = touches[0].pageX\n\tvar pageY = touches[0].pageY\n\tvar moveX = pageX - state.startX\n\tvar moveY = pageY - state.startY\n\tvar buttonsWidth = state.buttonsWidth\n\n\t// 移动的X轴距离大于Y轴距离，也即终点与起点位置连线，与X轴夹角小于45度时，禁止页面滚动\n\tif (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {\n\t\tevent.preventDefault && event.preventDefault()\n\t\tevent.stopPropagation && event.stopPropagation()\n\t}\n\t// 如果移动的X轴距离小于Y轴距离，也即终点位置与起点位置连线，与Y轴夹角小于45度时，认为是页面上下滑动，而不是左右滑动单元格\n\tif (Math.abs(moveX) < Math.abs(moveY)) return\n\n\t// 限制右滑的距离，不允许内容部分往右偏移，右滑会导致X轴偏移值大于0，以此做判断\n\t// 此处不能直接return，因为滑动过程中会缺失某些关键点坐标，会导致错乱，最好的办法就是\n\t// 在超出后，设置为0\n\tif (state.status === 'open') {\n\t\t// 在开启状态下，向左滑动，需忽略\n\t\tif (moveX < 0) moveX = 0\n\t\t// 想要收起菜单，最大能移动的距离为按钮的总宽度\n\t\tif (moveX > buttonsWidth) moveX = buttonsWidth\n\t\t// 如果是已经打开了的状态，向左滑动时，移动收起菜单\n\t\tmoveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance)\n\t} else {\n\t\t// 关闭状态下，右滑动需忽略\n\t\tif (moveX > 0) moveX = 0\n\t\t// 滑动的距离不允许超过所有按钮的总宽度，此时只能是左滑，最终设置按钮的总宽度，同时为负数\n\t\tif (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth\n\t\t// 只要是在滑过程中，就不断移动单元格内容部分，从而使隐藏的菜单显示出来\n\t\tmoveSwipeAction(moveX, instance, ownerInstance)\n\t}\n}\n\n// 触摸结束\nfunction touchend(event, ownerInstance) {\n\t// 触发事件的组件的ComponentDescriptor实例\n\tvar instance = event.instance\n\t// wxs内的局部变量快照\n\tvar state = instance.getState()\n\tif (!state.moving || state.disabled) return\n\tvar touches = event.changedTouches ? event.changedTouches[0] : {}\n\tvar pageX = touches.pageX\n\tvar pageY = touches.pageY\n\tvar moveX = pageX - state.startX\n\tif (state.status === 'open') {\n\t\t// 在展开的状态下，继续左滑，无需操作\n\t\tif (moveX < 0) return\n\t\t// 在开启状态下，点击一下内容区域，moveX为0，也即没有进行移动，这时执行收起菜单逻辑\n\t\tif (moveX === 0) {\n\t\t\treturn closeSwipeAction(instance, ownerInstance)\n\t\t}\n\t\t// 在开启状态下，滑动距离小于阈值，则默认为不关闭，同时恢复原来的打开状态\n\t\tif (Math.abs(moveX) < state.threshold) {\n\t\t\topenSwipeAction(instance, ownerInstance)\n\t\t} else {\n\t\t\t// 如果滑动距离大于阈值，则执行收起逻辑\n\t\t\tcloseSwipeAction(instance, ownerInstance)\n\t\t}\n\t} else {\n\t\t// 在关闭的状态下，右滑，无需操作\n\t\tif (moveX > 0) return\n\t\t// 理由同上\n\t\tif (Math.abs(moveX) < state.threshold) {\n\t\t\tcloseSwipeAction(instance, ownerInstance)\n\t\t} else {\n\t\t\topenSwipeAction(instance, ownerInstance)\n\t\t}\n\t}\n}\n\n// 获取过渡时间\nfunction getDuration(value) {\n\tif (value.toString().indexOf('s') >= 0) return value\n\treturn value > 30 ? value + 'ms' : value + 's'\n}\n\n// 滑动结束时判断滑动的方向\nfunction getMoveDirection(instance, ownerInstance) {\n\tvar state = instance.getState()\n}\n\n// 移动滑动选择器内容区域，同时显示出其隐藏的菜单\nfunction moveSwipeAction(moveX, instance, ownerInstance) {\n\tvar state = instance.getState()\n\t// 获取所有按钮的实例，需要通过它去设置按钮的位移\n\tvar buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')\n\n\t// 设置菜单内容部分的偏移\n\tinstance.requestAnimationFrame(function() {\n\t\tinstance.setStyle({\n\t\t\t// 设置translateX的值\n\t\t\t'transition': 'none',\n\t\t\ttransform: 'translateX(' + moveX + 'px)',\n\t\t\t'-webkit-transform': 'translateX(' + moveX + 'px)'\n\t\t})\n\t})\n}\n\n// 一次性展开滑动菜单\nfunction openSwipeAction(instance, ownerInstance) {\n\tvar state = instance.getState()\n\t// 获取所有按钮的实例，需要通过它去设置按钮的位移\n\tvar buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')\n\t// 处理duration单位问题\n\tvar duration = getDuration(state.duration)\n\t// 展开过程中，是向左移动，所以X的偏移应该为负值\n\tvar buttonsWidth = -state.buttonsWidth\n\tinstance.requestAnimationFrame(function() {\n\t\t// 设置菜单主体内容\n\t\tinstance.setStyle({\n\t\t\t'transition': 'transform ' + duration,\n\t\t\t'transform': 'translateX(' + buttonsWidth + 'px)',\n\t\t\t'-webkit-transform': 'translateX(' + buttonsWidth + 'px)',\n\t\t})\n\t})\n\tsetStatus('open', instance, ownerInstance)\n}\n\n// 标记菜单的当前状态，open-已经打开，close-已经关闭\nfunction setStatus(status, instance, ownerInstance) {\n\tvar state = instance.getState()\n\tstate.status = status\n\townerInstance.callMethod('setState', status)\n}\n\n// 一次性收起滑动菜单\nfunction closeSwipeAction(instance, ownerInstance) {\n\tvar state = instance.getState()\n\t// 获取所有按钮的实例，需要通过它去设置按钮的位移\n\tvar buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button')\n\tvar len = buttons.length\n\t// 处理duration单位问题\n\tvar duration = getDuration(state.duration)\n\tinstance.requestAnimationFrame(function() {\n\t\t// 设置菜单主体内容\n\t\tinstance.setStyle({\n\t\t\t'transition': 'transform ' + duration,\n\t\t\t'transform': 'translateX(0px)',\n\t\t\t'-webkit-transform': 'translateX(0px)'\n\t\t})\n\t\t// 设置各个隐藏的按钮为收起的状态\n\t\tfor (var i = len - 1; i >= 0; i--) {\n\t\t\tbuttons[i].setStyle({\n\t\t\t\t'transition': 'transform ' + duration,\n\t\t\t\t'transform': 'translateX(0px)',\n\t\t\t\t'-webkit-transform': 'translateX(0px)'\n\t\t\t})\n\t\t}\n\t})\n\tsetStatus('close', instance, ownerInstance)\n}\n\n// status的状态发生变化\nfunction statusChange(newValue, oldValue, ownerInstance, instance) {\n\tvar state = instance.getState()\n\tif (state.disabled) return\n\t// 打开或关闭单元格\n\tif (newValue === 'close' && state.status === 'open') {\n\t\tcloseSwipeAction(instance, ownerInstance)\n\t} else if(newValue === 'open' && state.status === 'close') {\n\t\topenSwipeAction(instance, ownerInstance)\n\t}\n}\n\n// 菜单尺寸发生变化\nfunction sizeChange(newValue, oldValue, ownerInstance, instance) {\n\t// wxs内的局部变量快照\n\tvar state = instance.getState()\n\tstate.disabled = newValue.disabled\n\tstate.duration = newValue.duration\n\tstate.show = newValue.show\n\tstate.threshold = newValue.threshold\n\tstate.buttons = newValue.buttons\n\n\tif (state.buttons) {\n\t\tvar len = state.buttons.length\n\t\tvar buttonsWidth = 0\n\t\tvar buttons = newValue.buttons\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tbuttonsWidth += buttons[i].width\n\t\t}\n\t}\n\tstate.buttonsWidth = buttonsWidth\n}\n\nmodule.exports = {\n\ttouchstart: touchstart,\n\ttouchmove: touchmove,\n\ttouchend: touchend,\n\tsizeChange: sizeChange,\n\tstatusChange: statusChange\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/nvue - backup.js",
    "content": "// nvue操作dom的库，用于获取dom的尺寸信息\nconst dom = uni.requireNativePlugin('dom')\n// nvue中用于操作元素动画的库，类似于uni.animation，只不过uni.animation不能用于nvue\nconst animation = uni.requireNativePlugin('animation')\n\nexport default {\n    data() {\n        return {\n            // 是否滑动中\n            moving: false,\n            // 状态，open-打开状态，close-关闭状态\n            status: 'close',\n            // 开始触摸点的X和Y轴坐标\n            startX: 0,\n            startY: 0,\n            // 所有隐藏按钮的尺寸信息数组\n            buttons: [],\n            // 所有按钮的总宽度\n            buttonsWidth: 0,\n            // 记录上一次移动的位置值\n            moveX: 0,\n            // 记录上一次滑动的位置，用于前后两次做对比，如果移动的距离小于某一阈值，则认为前后之间没有移动，为了解决可能存在的通信阻塞问题\n            lastX: 0\n        }\n    },\n    computed: {\n        // 获取过渡时间\n        getDuratin() {\n            let duration = String(this.duration)\n            // 如果ms为单位，返回ms的数值部分\n            if (duration.indexOf('ms') >= 0) return parseInt(duration)\n            // 如果s为单位，为了得到ms的数值，需要乘以1000\n            if (duration.indexOf('s') >= 0) return parseInt(duration) * 1000\n            // 如果值传了数值，且小于30，认为是s单位\n            duration = Number(duration)\n            return duration < 30 ? duration * 1000 : duration\n        }\n    },\n    watch: {\n        show: {\n            immediate: true,\n            handler(n) {\n                // if(n === true) {\n                // \tuni.$u.sleep(50).then(() => {\n                // \t\tthis.openSwipeAction()\n                // \t})\n                // } else {\n                // \tthis.closeSwipeAction()\n                // }\n            }\n        }\n    },\n    mounted() {\n        uni.$u.sleep(20).then(() => {\n            this.queryRect()\n        })\n    },\n    methods: {\n        close() {\n            this.closeSwipeAction()\n        },\n        // 触摸单元格\n        touchstart(event) {\n            if (this.disabled) return\n            this.closeOther()\n            const { touches } = event\n            // 记录触摸开始点的坐标值\n            this.startX = touches[0].pageX\n            this.startY = touches[0].pageY\n        },\n        // // 触摸滑动\n        touchmove(event) {\n            if (this.disabled) return\n            const { touches } = event\n            const { pageX } = touches[0]\n            const { pageY } = touches[0]\n            let moveX = pageX - this.startX\n            const moveY = pageY - this.startY\n            const { buttonsWidth } = this\n            const len = this.buttons.length\n\n            // 判断前后两次的移动距离，如果小于一定值，则不进行移动处理\n            if (Math.abs(pageX - this.lastX) < 0.3) return\n            this.lastX = pageX\n\n            // 移动的X轴距离大于Y轴距离，也即终点与起点位置连线，与X轴夹角小于45度时，禁止页面滚动\n            if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > this.threshold) {\n                event.stopPropagation()\n            }\n            // 如果移动的X轴距离小于Y轴距离，也即终点位置与起点位置连线，与Y轴夹角小于45度时，认为是页面上下滑动，而不是左右滑动单元格\n            if (Math.abs(moveX) < Math.abs(moveY)) return\n\n            // 限制右滑的距离，不允许内容部分往右偏移，右滑会导致X轴偏移值大于0，以此做判断\n            // 此处不能直接return，因为滑动过程中会缺失某些关键点坐标，会导致错乱，最好的办法就是\n            // 在超出后，设置为0\n            if (this.status === 'open') {\n                // 在开启状态下，向左滑动，需忽略\n                if (moveX < 0) moveX = 0\n                // 想要收起菜单，最大能移动的距离为按钮的总宽度\n                if (moveX > buttonsWidth) moveX = buttonsWidth\n                // 如果是已经打开了的状态，向左滑动时，移动收起菜单\n                this.moveSwipeAction(-buttonsWidth + moveX)\n            } else {\n                // 关闭状态下，右滑动需忽略\n                if (moveX > 0) moveX = 0\n                // 滑动的距离不允许超过所有按钮的总宽度，此时只能是左滑，最终设置按钮的总宽度，同时为负数\n                if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth\n                // 只要是在滑过程中，就不断移动菜单的内容部分，从而使隐藏的菜单显示出来\n                this.moveSwipeAction(moveX)\n            }\n        },\n        // 单元格结束触摸\n        touchend(event) {\n            if (this.disabled) return\n            const touches = event.changedTouches ? event.changedTouches[0] : {}\n            const { pageX } = touches\n            const { pageY } = touches\n            const { buttonsWidth } = this\n            this.moveX = pageX - this.startX\n            if (this.status === 'open') {\n                // 在展开的状态下，继续左滑，无需操作\n                if (this.moveX < 0) this.moveX = 0\n                if (this.moveX > buttonsWidth) this.moveX = buttonsWidth\n                // 在开启状态下，点击一下内容区域，moveX为0，也即没有进行移动，这时执行收起菜单逻辑\n                if (this.moveX === 0) {\n                    return this.closeSwipeAction()\n                }\n                // 在开启状态下，滑动距离小于阈值，则默认为不关闭，同时恢复原来的打开状态\n                if (Math.abs(this.moveX) < this.threshold) {\n                    this.openSwipeAction()\n                } else {\n                    // 如果滑动距离大于阈值，则执行收起逻辑\n                    this.closeSwipeAction()\n                }\n            } else {\n                // 在关闭的状态下，右滑，无需操作\n                if (this.moveX >= 0) this.moveX = 0\n                if (this.moveX <= -buttonsWidth) this.moveX = -buttonsWidth\n                // 理由同上\n                if (Math.abs(this.moveX) < this.threshold) {\n                    this.closeSwipeAction()\n                } else {\n                    this.openSwipeAction()\n                }\n            }\n        },\n        // 移动滑动选择器内容区域，同时显示出其隐藏的菜单\n        moveSwipeAction(moveX) {\n            if (this.moving) return\n            this.moving = true\n\n            let previewButtonsMoveX = 0\n            const len = this.buttons.length\n            animation.transition(this.$refs['u-swipe-action-item__content'].ref, {\n                styles: {\n                    transform: `translateX(${moveX}px)`\n                },\n                timingFunction: 'linear'\n            }, () => {\n                this.moving = false\n            })\n            // 按钮的组的长度\n            for (let i = len - 1; i >= 0; i--) {\n                const buttonRef = this.$refs[`u-swipe-action-item__right__button-${i}`][0].ref\n                // 通过比例，得出元素自身该移动的距离\n                const translateX = this.buttons[i].width / this.buttonsWidth * moveX\n                // 最终移动的距离，是通过自身比例算出的距离，再加上在它之前所有按钮移动的距离之和\n                const realTranslateX = translateX + previewButtonsMoveX\n                animation.transition(buttonRef, {\n                    styles: {\n                        transform: `translateX(${realTranslateX}px)`\n                    },\n                    duration: 0,\n                    delay: 0,\n                    timingFunction: 'linear'\n                }, () => {})\n                // 记录本按钮之前的所有按钮的移动距离之和\n                previewButtonsMoveX += translateX\n            }\n        },\n        // 关闭菜单\n        closeSwipeAction() {\n            if (this.status === 'close') return\n            this.moving = true\n            const { buttonsWidth } = this\n            animation.transition(this.$refs['u-swipe-action-item__content'].ref, {\n                styles: {\n                    transform: 'translateX(0px)'\n                },\n                duration: this.getDuratin,\n                timingFunction: 'ease-in-out'\n            }, () => {\n                this.status = 'close'\n                this.moving = false\n                this.closeHandler()\n            })\n            // 按钮的组的长度\n            const len = this.buttons.length\n            for (let i = len - 1; i >= 0; i--) {\n                const buttonRef = this.$refs[`u-swipe-action-item__right__button-${i}`][0].ref\n                // 如果不满足边界条件，返回\n                if (this.buttons.length === 0 || !this.buttons[i] || !this.buttons[i].width) return\n\n                animation.transition(buttonRef, {\n                    styles: {\n                        transform: 'translateX(0px)'\n                    },\n                    duration: this.getDuratin,\n                    timingFunction: 'ease-in-out'\n                }, () => {})\n            }\n        },\n        // 打开菜单\n        openSwipeAction() {\n            if (this.status === 'open') return\n            this.moving = true\n            const buttonsWidth = -this.buttonsWidth\n            let previewButtonsMoveX = 0\n            animation.transition(this.$refs['u-swipe-action-item__content'].ref, {\n                styles: {\n                    transform: `translateX(${buttonsWidth}px)`\n                },\n                duration: this.getDuratin,\n                timingFunction: 'ease-in-out'\n            }, () => {\n                this.status = 'open'\n                this.moving = false\n                this.openHandler()\n            })\n            // 按钮的组的长度\n            const len = this.buttons.length\n            for (let i = len - 1; i >= 0; i--) {\n                const buttonRef = this.$refs[`u-swipe-action-item__right__button-${i}`][0].ref\n                // 如果不满足边界条件，返回\n                if (this.buttons.length === 0 || !this.buttons[i] || !this.buttons[i].width) return\n                // 通过比例，得出元素自身该移动的距离\n                const translateX = this.buttons[i].width / this.buttonsWidth * buttonsWidth\n                // 最终移动的距离，是通过自身比例算出的距离，再加上在它之前所有按钮移动的距离之和\n                const realTranslateX = translateX + previewButtonsMoveX\n                animation.transition(buttonRef, {\n                    styles: {\n                        transform: `translateX(${realTranslateX}px)`\n                    },\n                    duration: this.getDuratin,\n                    timingFunction: 'ease-in-out'\n                }, () => {})\n                previewButtonsMoveX += translateX\n            }\n        },\n        // 查询按钮节点信息\n        queryRect() {\n            // 历遍所有按钮数组，通过getRectByDom返回一个promise\n            const promiseAll = this.rightOptions.map((item, index) => this.getRectByDom(this.$refs[`u-swipe-action-item__right__button-${index}`][0]))\n            // 通过promise.all方法，让所有按钮的查询结果返回一个数组的形式\n            Promise.all(promiseAll).then((sizes) => {\n                this.buttons = sizes\n                // 计算所有按钮总宽度\n                this.buttonsWidth = sizes.reduce((sum, cur) => sum + cur.width, 0)\n            })\n        },\n        // 通过nvue的dom模块，查询节点信息\n        getRectByDom(ref) {\n            return new Promise((resolve) => {\n                dom.getComponentRect(ref, (res) => {\n                    resolve(res.size)\n                })\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/nvue.js",
    "content": "// nvue操作dom的库，用于获取dom的尺寸信息\nconst dom = uni.requireNativePlugin('dom');\nconst bindingX = uni.requireNativePlugin('bindingx');\nconst animation = uni.requireNativePlugin('animation');\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\t// 所有按钮的总宽度\n\t\t\tbuttonsWidth: 0,\n\t\t\t// 是否正在移动中\n\t\t\tmoving: false\n\t\t}\n\t},\n\tcomputed: {\n\t\t// 获取过渡时间\n\t\tgetDuratin() {\n\t\t\tlet duration = String(this.duration)\n\t\t\t// 如果ms为单位，返回ms的数值部分\n\t\t\tif (duration.indexOf('ms') >= 0) return parseInt(duration)\n\t\t\t// 如果s为单位，为了得到ms的数值，需要乘以1000\n\t\t\tif (duration.indexOf('s') >= 0) return parseInt(duration) * 1000\n\t\t\t// 如果值传了数值，且小于30，认为是s单位\n\t\t\tduration = Number(duration)\n\t\t\treturn duration < 30 ? duration * 1000 : duration\n\t\t}\n\t},\n\twatch: {\n\t\tshow(n) {\n\t\t\tif(n) {\n\t\t\t\tthis.moveCellByAnimation('open') \n\t\t\t} else {\n\t\t\t\tthis.moveCellByAnimation('close') \n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.initialize()\n\t},\n\tmethods: {\n\t\tinitialize() {\n\t\t\tthis.queryRect() \n\t\t},\n\t\t// 关闭单元格，用于打开一个，自动关闭其他单元格的场景\n\t\tcloseHandler() {\n\t\t\tif(this.status === 'open') {\n\t\t\t\t// 如果在打开状态下，进行点击的话，直接关闭单元格\n\t\t\t\treturn this.moveCellByAnimation('close') && this.unbindBindingX()\n\t\t\t}\n\t\t},\n\t\t// 点击单元格\n\t\tclickHandler() {\n\t\t\t// 如果在移动中被点击，进行忽略\n\t\t\tif(this.moving) return\n\t\t\t// 尝试关闭其他打开的单元格\n\t\t\tthis.parent && this.parent.closeOther(this)\n\t\t\tif(this.status === 'open') {\n\t\t\t\t// 如果在打开状态下，进行点击的话，直接关闭单元格\n\t\t\t\treturn this.moveCellByAnimation('close') && this.unbindBindingX()\n\t\t\t}\n\t\t},\n\t\t// 滑动单元格\n\t\tonTouchstart(e) {\n\t\t\t// 如果当前正在移动中，或者disabled状态，则返回\n\t\t\tif(this.moving || this.disabled) { \n\t\t\t\treturn this.unbindBindingX()   \n\t\t\t}\n\t\t\tif(this.status === 'open') {\n\t\t\t\t// 如果在打开状态下，进行点击的话，直接关闭单元格\n\t\t\t\treturn this.moveCellByAnimation('close') && this.unbindBindingX()\n\t\t\t}\n\t\t\t// 特殊情况下，e可能不为一个对象\n\t\t\te?.stopPropagation && e.stopPropagation() \n\t\t\te?.preventDefault && e.preventDefault()\n\t\t\tthis.moving = true\n\t\t\t// 获取元素ref\n\t\t\tconst content = this.getContentRef()\n\t\t\tlet expression = `min(max(${-this.buttonsWidth}, x), 0)`\n\t\t\t// 尝试关闭其他打开的单元格\n\t\t\tthis.parent && this.parent.closeOther(this)\n\t\t\t\n\t\t\t// 阿里为了KPI而开源的BindingX\n\t\t\tthis.panEvent = bindingX.bind({\n\t\t\t\tanchor: content,\n\t\t\t\teventType: 'pan',\n\t\t\t\tprops: [{\n\t\t\t\t\telement: content,\n\t\t\t\t\t// 绑定width属性，设置其宽度值\n\t\t\t\t\tproperty: 'transform.translateX',\n\t\t\t\t\texpression\n\t\t\t\t}]\n\t\t\t}, (res) => {\n\t\t\t\tthis.moving = false\n\t\t\t\tif (res.state === 'end' || res.state === 'exit') {\n\t\t\t\t\tconst deltaX = res.deltaX\n\t\t\t\t\tif(deltaX <= -this.buttonsWidth || deltaX >= 0) {\n\t\t\t\t\t\t// 如果触摸滑动的过程中，大于单元格的总宽度，或者大于0，意味着已经动过滑动达到了打开或者关闭的状态\n\t\t\t\t\t\t// 这里直接进行状态的标记\n\t\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t\tthis.status = deltaX <= -this.buttonsWidth ? 'open' : 'close'\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if(Math.abs(deltaX) > uni.$u.getPx(this.threshold)) {\n\t\t\t\t\t\t// 在移动大于阈值、并且小于总按钮宽度时，进行自动打开或者关闭\n\t\t\t\t\t\t// 移动距离大于0时，意味着需要关闭状态\n\t\t\t\t\t\tif(Math.abs(deltaX) < this.buttonsWidth) {\n\t\t\t\t\t\t\tthis.moveCellByAnimation(deltaX > 0 ? 'close' : 'open')\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// 在小于阈值时，进行关闭操作(如果在打开状态下，将不会执行bindingX)\n\t\t\t\t\t\tthis.moveCellByAnimation('close')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t// 释放bindingX\n\t\tunbindBindingX() {\n\t\t\t// 释放上一次的资源\n\t\t\tif (this?.panEvent?.token != 0) {\n\t\t\t\tbindingX.unbind({\n\t\t\t\t\ttoken: this.panEvent?.token,\n\t\t\t\t\t// pan为手势事件\n\t\t\t\t\teventType: 'pan'\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t// 查询按钮节点信息\n\t\tqueryRect() {\n\t\t\t// 历遍所有按钮数组，通过getRectByDom返回一个promise\n\t\t\tconst promiseAll = this.options.map((item, index) => {\n\t\t\t\treturn this.getRectByDom(this.$refs[`u-swipe-action-item__right__button-${index}`][0])\n\t\t\t})\n\t\t\t// 通过promise.all方法，让所有按钮的查询结果返回一个数组的形式\n\t\t\tPromise.all(promiseAll).then(sizes => {\n\t\t\t\tthis.buttons = sizes\n\t\t\t\t// 计算所有按钮总宽度\n\t\t\t\tthis.buttonsWidth = sizes.reduce((sum, cur) => sum + cur.width, 0)\n\t\t\t})\n\t\t},\n\t\t// 通过nvue的dom模块，查询节点信息\n\t\tgetRectByDom(ref) {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tdom.getComponentRect(ref, res => {\n\t\t\t\t\tresolve(res.size)\n\t\t\t\t})\n\t\t\t}) \n\t\t},\n\t\t// 移动单元格到左边或者右边尽头\n\t\tmoveCellByAnimation(status = 'open') {\n\t\t\tif(this.moving) return\n\t\t\t// 标识当前状态\n\t\t\tthis.moveing = true\n\t\t\tconst content = this.getContentRef()\n\t\t\tconst x = status === 'open' ? -this.buttonsWidth : 0 \n\t\t\tanimation.transition(content, {\n\t\t\t\tstyles: {\n\t\t\t\t\ttransform: `translateX(${x}px)`,\n\t\t\t\t},\n\t\t\t\tduration: uni.$u.getDuration(this.duration, false),\n\t\t\t\ttimingFunction: 'ease-in-out'\n\t\t\t}, () => {\n\t\t\t\tthis.moving = false\n\t\t\t\tthis.status = status\n\t\t\t\tthis.unbindBindingX()\n\t\t\t})\n\t\t},\n\t\t// 获取元素ref\n\t\tgetContentRef() {\n\t\t\treturn this.$refs['u-swipe-action-item__content'].ref\n\t\t},\n\t\tbeforeDestroy() {\n\t\t\tthis.unbindBindingX()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/props.js",
    "content": "export default {\n    props: {\n        // 控制打开或者关闭\n        show: {\n            type: Boolean,\n            default: uni.$u.props.swipeActionItem.show\n        },\n        // 标识符，如果是v-for，可用index索引值\n        name: {\n            type: [String, Number],\n            default: uni.$u.props.swipeActionItem.name\n        },\n        // 是否禁用\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.swipeActionItem.disabled\n        },\n        // 是否自动关闭其他swipe按钮组\n        autoClose: {\n            type: Boolean,\n            default: uni.$u.props.swipeActionItem.autoClose\n        },\n        // 滑动距离阈值，只有大于此值，才被认为是要打开菜单\n        threshold: {\n            type: Number,\n            default: uni.$u.props.swipeActionItem.threshold\n        },\n        // 右侧按钮内容\n        options: {\n            type: Array,\n            default() {\n                return uni.$u.props.swipeActionItem.rightOptions\n            }\n        },\n        // 动画过渡时间，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.swipeActionItem.duration\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue",
    "content": "<template>\n\t<view class=\"u-swipe-action-item\" ref=\"u-swipe-action-item\">\n\t\t<view class=\"u-swipe-action-item__right\">\n\t\t\t<slot name=\"button\">\n\t\t\t\t<view v-for=\"(item,index) in options\" :key=\"index\" class=\"u-swipe-action-item__right__button\"\n\t\t\t\t\t:ref=\"`u-swipe-action-item__right__button-${index}`\" :style=\"[{\n\t\t\t\t\t\talignItems: item.style && item.style.borderRadius ? 'center' : 'stretch'\n\t\t\t\t\t}]\" @tap=\"buttonClickHandler(item, index)\">\n\t\t\t\t\t<view class=\"u-swipe-action-item__right__button__wrapper\" :style=\"[{\n\t\t\t\t\t\t\tbackgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',\n\t\t\t\t\t\t\tborderRadius: item.style && item.style.borderRadius ? item.style.borderRadius : '0',\n\t\t\t\t\t\t\tpadding: item.style && item.style.borderRadius ? '0' : '0 15px',\n\t\t\t\t\t\t}, item.style]\">\n\t\t\t\t\t\t<u-icon v-if=\"item.icon\" :name=\"item.icon\"\n\t\t\t\t\t\t\t:color=\"item.style && item.style.color ? item.style.color : '#ffffff'\"\n\t\t\t\t\t\t\t:size=\"item.iconSize ? $u.addUnit(item.iconSize) : item.style && item.style.fontSize ? $u.getPx(item.style.fontSize) * 1.2 : 17\"\n\t\t\t\t\t\t\t:customStyle=\"{\n\t\t\t\t\t\t\t\tmarginRight: item.text ? '2px' : 0\n\t\t\t\t\t\t\t}\"></u-icon>\n\t\t\t\t\t\t<text v-if=\"item.text\" class=\"u-swipe-action-item__right__button__wrapper__text u-line-1\"\n\t\t\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\t\t\tcolor: item.style && item.style.color ? item.style.color : '#ffffff',\n\t\t\t\t\t\t\t\tfontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px',\n\t\t\t\t\t\t\t\tlineHeight: item.style && item.style.fontSize ? item.style.fontSize : '16px',\n\t\t\t\t\t\t\t}]\">{{ item.text }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</slot>\n\t\t</view>\n\t\t<!-- #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ -->\n\t\t<view class=\"u-swipe-action-item__content\" @touchstart=\"wxs.touchstart\" @touchmove=\"wxs.touchmove\"\n\t\t\t@touchend=\"wxs.touchend\" :status=\"status\" :change:status=\"wxs.statusChange\" :size=\"size\"\n\t\t\t:change:size=\"wxs.sizeChange\">\n\t\t\t<!-- #endif -->\n\t\t\t<!-- #ifdef APP-NVUE -->\n\t\t\t<view class=\"u-swipe-action-item__content\" ref=\"u-swipe-action-item__content\" @panstart=\"onTouchstart\"\n\t\t\t\t@tap=\"clickHandler\">\n\t\t\t\t<!-- #endif -->\n\t\t\t\t<slot />\n\t\t\t</view>\n\t\t</view>\n</template>\n<!-- #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ -->\n<script src=\"./index.wxs\" module=\"wxs\" lang=\"wxs\"></script>\n<!-- #endif -->\n<script>\n\timport touch from '../../libs/mixin/touch.js'\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\timport nvue from './nvue.js';\n\t// #endif\n\t// #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ\n\timport wxs from './wxs.js';\n\t// #endif\n\t/**\n\t * SwipeActionItem 滑动单元格子组件\n\t * @description 该组件一般用于左滑唤出操作菜单的场景，用的最多的是左滑删除操作\n\t * @tutorial https://www.uviewui.com/components/swipeAction.html\n\t * @property {Boolean}\t\t\tshow\t\t\t控制打开或者关闭（默认 false ）\n\t * @property {String | Number}\tindex\t\t\t标识符，如果是v-for，可用index索引\n\t * @property {Boolean}\t\t\tdisabled\t\t是否禁用（默认 false ）\n\t * @property {Boolean}\t\t\tautoClose\t\t是否自动关闭其他swipe按钮组（默认 true ）\n\t * @property {Number}\t\t\tthreshold\t\t滑动距离阈值，只有大于此值，才被认为是要打开菜单（默认 30 ）\n\t * @property {Array}\t\t\toptions\t\t\t右侧按钮内容\n\t * @property {String | Number}\tduration\t\t动画过渡时间，单位ms（默认 350 ）\n\t * @event {Function(index)}\topen\t组件打开时触发\n\t * @event {Function(index)}\tclose\t组件关闭时触发\n\t * @example\t<u-swipe-action><u-swipe-action-item :options=\"options1\" ></u-swipe-action-item></u-swipe-action>\n\t */\n\texport default {\n\t\tname: 'u-swipe-action-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props, touch],\n\t\t// #ifdef APP-NVUE\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props, nvue, touch],\n\t\t// #endif\n\t\t// #ifdef APP-VUE || MP-WEIXIN || H5 || MP-QQ\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props, touch, wxs],\n\t\t// #endif\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 按钮的尺寸信息\n\t\t\t\tsize: {},\n\t\t\t\t// 父组件u-swipe-action的参数\n\t\t\t\tparentData: {\n\t\t\t\t\tautoClose: true,\n\t\t\t\t},\n\t\t\t\t// 当前状态，open-打开，close-关闭\n\t\t\t\tstatus: 'close',\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 由于wxs无法直接读取外部的值，需要在外部值变化时，重新执行赋值逻辑\n\t\t\twxsInit(newValue, oldValue) {\n\t\t\t\tthis.queryRect()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\twxsInit() {\n\t\t\t\treturn [this.disabled, this.autoClose, this.threshold, this.options, this.duration]\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 初始化父组件数据\n\t\t\t\tthis.updateParentData()\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tuni.$u.sleep().then(() => {\n\t\t\t\t\tthis.queryRect()\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法在mixin中\n\t\t\t\tthis.getParentData('u-swipe-action')\n\t\t\t},\n\t\t\t// #ifndef APP-NVUE\n\t\t\t// 查询节点\n\t\t\tqueryRect() {\n\t\t\t\tthis.$uGetRect('.u-swipe-action-item__right__button', true).then(buttons => {\n\t\t\t\t\tthis.size = {\n\t\t\t\t\t\tbuttons,\n\t\t\t\t\t\tshow: this.show,\n\t\t\t\t\t\tdisabled: this.disabled,\n\t\t\t\t\t\tthreshold: this.threshold,\n\t\t\t\t\t\tduration: this.duration\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\t// #endif\n\t\t\t// 按钮被点击\n\t\t\tbuttonClickHandler(item, index) {\n\t\t\t\tthis.$emit('click', {\n\t\t\t\t\tindex,\n\t\t\t\t\tname: this.name\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-swipe-action-item {\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\t/* #ifndef APP-NVUE || MP-WEIXIN */\n\t\ttouch-action: pan-y;\n\t\t/* #endif */\n\n\t\t&__content {\n\t\t\tbackground-color: #FFFFFF;\n\t\t\tz-index: 10;\n\t\t}\n\n\t\t&__right {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tbottom: 0;\n\t\t\tright: 0;\n\t\t\t@include flex;\n\n\t\t\t&__button {\n\t\t\t\t@include flex;\n\t\t\t\tjustify-content: center;\n\t\t\t\toverflow: hidden;\n\t\t\t\talign-items: center;\n\n\t\t\t\t&__wrapper {\n\t\t\t\t\t@include flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\tpadding: 0 15px;\n\n\t\t\t\t\t&__text {\n\t\t\t\t\t\t@include flex;\n\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\tcolor: #FFFFFF;\n\t\t\t\t\t\tfont-size: 15px;\n\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\tjustify-content: center;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swipe-action-item/wxs.js",
    "content": "export default {\n    methods: {\n        // 关闭时执行\n        closeHandler() {\n            this.status = 'close'\n        },\n        setState(status) {\n            this.status = status\n        },\n        closeOther() {\n            // 尝试关闭其他打开的单元格\n            this.parent && this.parent.closeOther(this)\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swiper/props.js",
    "content": "export default {\n    props: {\n        // 列表数组，元素可为字符串，如为对象可通过keyName指定目标属性名\n        list: {\n            type: Array,\n            default: uni.$u.props.swiper.list\n        },\n        // 是否显示面板指示器\n        indicator: {\n            type: Boolean,\n            default: uni.$u.props.swiper.indicator\n        },\n        // 指示器非激活颜色\n        indicatorActiveColor: {\n            type: String,\n            default: uni.$u.props.swiper.indicatorActiveColor\n        },\n        // 指示器的激活颜色\n        indicatorInactiveColor: {\n            type: String,\n            default: uni.$u.props.swiper.indicatorInactiveColor\n        },\n        // 指示器样式，可通过bottom，left，right进行定位\n        indicatorStyle: {\n            type: [String, Object],\n            default: uni.$u.props.swiper.indicatorStyle\n        },\n        // 指示器模式，line-线型，dot-点型\n        indicatorMode: {\n            type: String,\n            default: uni.$u.props.swiper.indicatorMode\n        },\n        // 是否自动切换\n        autoplay: {\n            type: Boolean,\n            default: uni.$u.props.swiper.autoplay\n        },\n        // 当前所在滑块的 index\n        current: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.current\n        },\n        // 当前所在滑块的 item-id ，不能与 current 被同时指定\n        currentItemId: {\n            type: String,\n            default: uni.$u.props.swiper.currentItemId\n        },\n        // 滑块自动切换时间间隔\n        interval: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.interval\n        },\n        // 滑块切换过程所需时间\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.duration\n        },\n        // 播放到末尾后是否重新回到开头\n        circular: {\n            type: Boolean,\n            default: uni.$u.props.swiper.circular\n        },\n        // 前边距，可用于露出前一项的一小部分，nvue和支付宝不支持\n        previousMargin: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.previousMargin\n        },\n        // 后边距，可用于露出后一项的一小部分，nvue和支付宝不支持\n        nextMargin: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.nextMargin\n        },\n        // 当开启时，会根据滑动速度，连续滑动多屏，支付宝不支持\n        acceleration: {\n            type: Boolean,\n            default: uni.$u.props.swiper.acceleration\n        },\n        // 同时显示的滑块数量，nvue、支付宝小程序不支持\n        displayMultipleItems: {\n            type: Number,\n            default: uni.$u.props.swiper.displayMultipleItems\n        },\n        // 指定swiper切换缓动动画类型，有效值：default、linear、easeInCubic、easeOutCubic、easeInOutCubic\n        // 只对微信小程序有效\n        easingFunction: {\n            type: String,\n            default: uni.$u.props.swiper.easingFunction\n        },\n        // list数组中指定对象的目标属性名\n        keyName: {\n            type: String,\n            default: uni.$u.props.swiper.keyName\n        },\n        // 图片的裁剪模式\n        imgMode: {\n            type: String,\n            default: uni.$u.props.swiper.imgMode\n        },\n        // 组件高度\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.height\n        },\n        // 背景颜色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.swiper.bgColor\n        },\n        // 组件圆角，数值或带单位的字符串\n        radius: {\n            type: [String, Number],\n            default: uni.$u.props.swiper.radius\n        },\n        // 是否加载中\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.swiper.loading\n        },\n        // 是否显示标题，要求数组对象中有title属性\n        showTitle: {\n            type: Boolean,\n            default: uni.$u.props.swiper.showTitle\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swiper/u-swiper.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-swiper\"\n\t\t:style=\"{\n\t\t\tbackgroundColor: bgColor,\n\t\t\theight: $u.addUnit(height),\n\t\t\tborderRadius: $u.addUnit(radius)\n\t\t}\"\n\t>\n\t\t<view\n\t\t\tclass=\"u-swiper__loading\"\n\t\t\tv-if=\"loading\"\n\t\t>\n\t\t\t<u-loading-icon mode=\"circle\"></u-loading-icon>\n\t\t</view>\n\t\t<swiper\n\t\t\tv-else\n\t\t\tclass=\"u-swiper__wrapper\"\n\t\t\t:style=\"{\n\t\t\t\theight: $u.addUnit(height),\n\t\t\t}\"\n\t\t\t@change=\"change\"\n\t\t\t:circular=\"circular\"\n\t\t\t:interval=\"interval\"\n\t\t\t:duration=\"duration\"\n\t\t\t:autoplay=\"autoplay\"\n\t\t\t:current=\"current\"\n\t\t\t:currentItemId=\"currentItemId\"\n\t\t\t:previousMargin=\"$u.addUnit(previousMargin)\"\n\t\t\t:nextMargin=\"$u.addUnit(nextMargin)\"\n\t\t\t:acceleration=\"acceleration\"\n\t\t\t:displayMultipleItems=\"displayMultipleItems\"\n\t\t\t:easingFunction=\"easingFunction\"\n\t\t>\n\t\t\t<swiper-item\n\t\t\t\tclass=\"u-swiper__wrapper__item\"\n\t\t\t\tv-for=\"(item, index) in list\"\n\t\t\t\t:key=\"index\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-swiper__wrapper__item__wrapper\"\n\t\t\t\t\t:style=\"[itemStyle(index)]\"\n\t\t\t\t>\n\t\t\t\t\t<!-- 在nvue中，image图片的宽度默认为屏幕宽度，需要通过flex:1撑开，另外必须设置高度才能显示图片 -->\n\t\t\t\t\t<image\n\t\t\t\t\t\tclass=\"u-swiper__wrapper__item__wrapper__image\"\n\t\t\t\t\t\tv-if=\"getItemType(item) === 'image'\"\n\t\t\t\t\t\t:src=\"getSource(item)\"\n\t\t\t\t\t\t:mode=\"imgMode\"\n\t\t\t\t\t\t@tap=\"clickHandler(index)\"\n\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\theight: $u.addUnit(height),\n\t\t\t\t\t\t\tborderRadius: $u.addUnit(radius)\n\t\t\t\t\t\t}\"\n\t\t\t\t\t></image>\n\t\t\t\t\t<video\n\t\t\t\t\t\tclass=\"u-swiper__wrapper__item__wrapper__video\"\n\t\t\t\t\t\tv-if=\"getItemType(item) === 'video'\"\n\t\t\t\t\t\t:id=\"`video-${index}`\"\n\t\t\t\t\t\t:enable-progress-gesture=\"false\"\n\t\t\t\t\t\t:src=\"getSource(item)\"\n\t\t\t\t\t\t:poster=\"getPoster(item)\"\n\t\t\t\t\t\t:title=\"showTitle && $u.test.object(item) && item.title ? item.title : ''\"\n\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\tcontrols\n\t\t\t\t\t\t@tap=\"clickHandler(index)\"\n\t\t\t\t\t></video>\n\t\t\t\t\t<text\n\t\t\t\t\t\tv-if=\"showTitle && $u.test.object(item) && item.title && $u.test.image(getSource(item))\"\n\t\t\t\t\t\tclass=\"u-swiper__wrapper__item__wrapper__title u-line-1\"\n\t\t\t\t\t>{{ item.title }}</text>\n\t\t\t\t</view>\n\t\t\t</swiper-item>\n\t\t</swiper>\n\t\t<view class=\"u-swiper__indicator\" :style=\"[$u.addStyle(indicatorStyle)]\">\n\t\t\t<slot name=\"indicator\">\n\t\t\t\t<u-swiper-indicator\n\t\t\t\t\tv-if=\"!loading && indicator && !showTitle\"\n\t\t\t\t\t:indicatorActiveColor=\"indicatorActiveColor\"\n\t\t\t\t\t:indicatorInactiveColor=\"indicatorInactiveColor\"\n\t\t\t\t\t:length=\"list.length\"\n\t\t\t\t\t:current=\"currentIndex\"\n\t\t\t\t\t:indicatorMode=\"indicatorMode\"\n\t\t\t\t></u-swiper-indicator>\n\t\t\t</slot>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Swiper 轮播图\n\t * @description 该组件一般用于导航轮播，广告展示等场景,可开箱即用，\n\t * @tutorial https://www.uviewui.com/components/swiper.html\n\t * @property {Array}\t\t\tlist\t\t\t\t\t轮播图数据\n\t * @property {Boolean}\t\t\tindicator\t\t\t\t是否显示面板指示器（默认 false ）\n\t * @property {String}\t\t\tindicatorActiveColor\t指示器非激活颜色（默认 '#FFFFFF' ）\n\t * @property {String}\t\t\tindicatorInactiveColor\t指示器的激活颜色（默认 'rgba(255, 255, 255, 0.35)' ）\n\t * @property {String | Object}\tindicatorStyle\t\t\t指示器样式，可通过bottom，left，right进行定位\n\t * @property {String}\t\t\tindicatorMode\t\t\t指示器模式（默认 'line' ）\n\t * @property {Boolean}\t\t\tautoplay\t\t\t\t是否自动切换（默认 true ）\n\t * @property {String | Number}\tcurrent\t\t\t\t\t当前所在滑块的 index（默认 0 ）\n\t * @property {String}\t\t\tcurrentItemId\t\t\t当前所在滑块的 item-id ，不能与 current 被同时指定\n\t * @property {String | Number}\tinterval\t\t\t\t滑块自动切换时间间隔（ms）（默认 3000 ）\n\t * @property {String | Number}\tduration\t\t\t\t滑块切换过程所需时间（ms）（默认 300 ）\n\t * @property {Boolean}\t\t\tcircular\t\t\t\t播放到末尾后是否重新回到开头（默认 false ）\n\t * @property {String | Number}\tpreviousMargin\t\t\t前边距，可用于露出前一项的一小部分，nvue和支付宝不支持（默认 0 ）\n\t * @property {String | Number}\tnextMargin\t\t\t\t后边距，可用于露出后一项的一小部分，nvue和支付宝不支持（默认 0 ）\n\t * @property {Boolean}\t\t\tacceleration\t\t\t当开启时，会根据滑动速度，连续滑动多屏，支付宝不支持（默认 false ）\n\t * @property {Number}\t\t\tdisplayMultipleItems\t同时显示的滑块数量，nvue、支付宝小程序不支持（默认 1 ）\n\t * @property {String}\t\t\teasingFunction\t\t\t指定swiper切换缓动动画类型， 只对微信小程序有效（默认 'default' ）\n\t * @property {String}\t\t\tkeyName\t\t\t\t\tlist数组中指定对象的目标属性名（默认 'url' ）\n\t * @property {String}\t\t\timgMode\t\t\t\t\t图片的裁剪模式（默认 'aspectFill' ）\n\t * @property {String | Number}\theight\t\t\t\t\t组件高度（默认 130 ）\n\t * @property {String}\t\t\tbgColor\t\t\t\t\t背景颜色（默认 \t'#f3f4f6' ）\n\t * @property {String | Number}\tradius\t\t\t\t\t组件圆角，数值或带单位的字符串（默认 4 ）\n\t * @property {Boolean}\t\t\tloading\t\t\t\t\t是否加载中（默认 false ）\n\t * @property {Boolean}\t\t\tshowTitle\t\t\t\t是否显示标题，要求数组对象中有title属性（默认 false ）\n\t * @event {Function(index)}\tclick\t点击轮播图时触发\tindex：点击了第几张图片，从0开始\n\t * @event {Function(index)}\tchange\t轮播图切换时触发(自动或者手动切换)\tindex：切换到了第几张图片，从0开始\n\t * @example\t<u-swiper :list=\"list4\" keyName=\"url\" :autoplay=\"false\"></u-swiper>\n\t */\n\texport default {\n\t\tname: 'u-swiper',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tcurrentIndex: 0\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tcurrent(val, preVal) {\n\t\t\t\tif(val === preVal) return;\n\t\t\t\tthis.currentIndex = val; // 和上游数据关联上\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\titemStyle() {\n\t\t\t\treturn index => {\n\t\t\t\t\tconst style = {}\n\t\t\t\t\t// #ifndef APP-NVUE || MP-TOUTIAO\n\t\t\t\t\t// 左右流出空间的写法不支持nvue和头条\n\t\t\t\t\t// 只有配置了此二值，才加上对应的圆角，以及缩放\n\t\t\t\t\tif (this.nextMargin && this.previousMargin) {\n\t\t\t\t\t\tstyle.borderRadius = uni.$u.addUnit(this.radius)\n\t\t\t\t\t\tif (index !== this.currentIndex) style.transform = 'scale(0.92)'\n\t\t\t\t\t}\n\t\t\t\t\t// #endif\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmethods: {\n      getItemType(item) {\n        if (typeof item === 'string') return uni.$u.test.video(this.getSource(item)) ? 'video' : 'image'\n        if (typeof item === 'object' && this.keyName) {\n          if (!item.type) return uni.$u.test.video(this.getSource(item)) ? 'video' : 'image'\n          if (item.type === 'image') return 'image'\n          if (item.type === 'video') return 'video'\n          return 'image'\n        }\n      },\n\t\t\t// 获取目标路径，可能数组中为字符串，对象的形式，额外可指定对象的目标属性名keyName\n\t\t\tgetSource(item) {\n\t\t\t\tif (typeof item === 'string') return item\n\t\t\t\tif (typeof item === 'object' && this.keyName) return item[this.keyName]\n\t\t\t\telse uni.$u.error('请按格式传递列表参数')\n\t\t\t\treturn ''\n\t\t\t},\n\t\t\t// 轮播切换事件\n\t\t\tchange(e) {\n\t\t\t\t// 当前的激活索引\n\t\t\t\tconst {\n\t\t\t\t\tcurrent\n\t\t\t\t} = e.detail\n\t\t\t\tthis.pauseVideo(this.currentIndex)\n\t\t\t\tthis.currentIndex = current\n\t\t\t\tthis.$emit('change', e.detail)\n\t\t\t},\n\t\t\t// 切换轮播时，暂停视频播放\n\t\t\tpauseVideo(index) {\n\t\t\t\tconst lastItem = this.getSource(this.list[index])\n\t\t\t\tif (uni.$u.test.video(lastItem)) {\n\t\t\t\t\t// 当视频隐藏时，暂停播放\n\t\t\t\t\tconst video = uni.createVideoContext(`video-${index}`, this)\n\t\t\t\t\tvideo.pause()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 当一个轮播item为视频时，获取它的视频海报\n\t\t\tgetPoster(item) {\n\t\t\t\treturn typeof item === 'object' && item.poster ? item.poster : ''\n\t\t\t},\n\t\t\t// 点击某个item\n\t\t\tclickHandler(index) {\n\t\t\t\tthis.$emit('click', index)\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-swiper {\n\t\t@include flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\n\t\t&__wrapper {\n\t\t\tflex: 1;\n\n\t\t\t&__item {\n\t\t\t\tflex: 1;\n\n\t\t\t\t&__wrapper {\n\t\t\t\t\t@include flex;\n\t\t\t\t\tposition: relative;\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\ttransition: transform 0.3s;\n\t\t\t\t\tflex: 1;\n\n\t\t\t\t\t&__image {\n\t\t\t\t\t\tflex: 1;\n\t\t\t\t\t}\n\n\t\t\t\t\t&__video {\n\t\t\t\t\t\tflex: 1;\n\t\t\t\t\t}\n\n\t\t\t\t\t&__title {\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tbackground-color: rgba(0, 0, 0, 0.3);\n\t\t\t\t\t\tbottom: 0;\n\t\t\t\t\t\tleft: 0;\n\t\t\t\t\t\tright: 0;\n\t\t\t\t\t\tfont-size: 28rpx;\n\t\t\t\t\t\tpadding: 12rpx 24rpx;\n\t\t\t\t\t\tcolor: #FFFFFF;\n\t\t\t\t\t\tflex: 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__indicator {\n\t\t\tposition: absolute;\n\t\t\tbottom: 10px;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swiper-indicator/props.js",
    "content": "export default {\n    props: {\n        // 轮播的长度\n        length: {\n            type: [String, Number],\n            default: uni.$u.props.swiperIndicator.length\n        },\n        // 当前处于活动状态的轮播的索引\n        current: {\n            type: [String, Number],\n            default: uni.$u.props.swiperIndicator.current\n        },\n        // 指示器非激活颜色\n        indicatorActiveColor: {\n            type: String,\n            default: uni.$u.props.swiperIndicator.indicatorActiveColor\n        },\n        // 指示器的激活颜色\n        indicatorInactiveColor: {\n            type: String,\n            default: uni.$u.props.swiperIndicator.indicatorInactiveColor\n        },\n\t\t// 指示器模式，line-线型，dot-点型\n\t\tindicatorMode: {\n\t\t    type: String,\n\t\t    default: uni.$u.props.swiperIndicator.indicatorMode\n\t\t}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue",
    "content": "<template>\n\t<view class=\"u-swiper-indicator\">\n\t\t<view\n\t\t\tclass=\"u-swiper-indicator__wrapper\"\n\t\t\tv-if=\"indicatorMode === 'line'\"\n\t\t\t:class=\"[`u-swiper-indicator__wrapper--${indicatorMode}`]\"\n\t\t\t:style=\"{\n\t\t\t\twidth: $u.addUnit(lineWidth * length),\n\t\t\t\tbackgroundColor: indicatorInactiveColor\n\t\t\t}\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-swiper-indicator__wrapper--line__bar\"\n\t\t\t\t:style=\"[lineStyle]\"\n\t\t\t></view>\n\t\t</view>\n\t\t<view\n\t\t\tclass=\"u-swiper-indicator__wrapper\"\n\t\t\tv-if=\"indicatorMode === 'dot'\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-swiper-indicator__wrapper__dot\"\n\t\t\t\tv-for=\"(item, index) in length\"\n\t\t\t\t:key=\"index\"\n\t\t\t\t:class=\"[index === current && 'u-swiper-indicator__wrapper__dot--active']\"\n\t\t\t\t:style=\"[dotStyle(index)]\"\n\t\t\t>\n\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * SwiperIndicator 轮播图指示器\n\t * @description 该组件一般用于导航轮播，广告展示等场景,可开箱即用，\n\t * @tutorial https://www.uviewui.com/components/swiper.html\n\t * @property {String | Number}\tlength\t\t\t\t\t轮播的长度（默认 0 ）\n\t * @property {String | Number}\tcurrent\t\t\t\t\t当前处于活动状态的轮播的索引（默认 0 ）\n\t * @property {String}\t\t\tindicatorActiveColor\t指示器非激活颜色\n\t * @property {String}\t\t\tindicatorInactiveColor\t指示器的激活颜色\n\t * @property {String}\t\t\tindicatorMode\t\t\t指示器模式（默认 'line' ）\n\t * @example\t<u-swiper :list=\"list4\" indicator keyName=\"url\" :autoplay=\"false\"></u-swiper>\n\t */\n\texport default {\n\t\tname: 'u-swiper-indicator',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tlineWidth: 22\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 指示器为线型的样式\n\t\t\tlineStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\tstyle.width = uni.$u.addUnit(this.lineWidth)\n\t\t\t\tstyle.transform = `translateX(${ uni.$u.addUnit(this.current * this.lineWidth) })`\n\t\t\t\tstyle.backgroundColor = this.indicatorActiveColor\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// 指示器为点型的样式\n\t\t\tdotStyle() {\n\t\t\t\treturn index => {\n\t\t\t\t\tlet style = {}\n\t\t\t\t\tstyle.backgroundColor = index === this.current ? this.indicatorActiveColor : this.indicatorInactiveColor\n\t\t\t\t\treturn style\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-swiper-indicator {\n\n\t\t&__wrapper {\n\t\t\t@include flex;\n\n\t\t\t&--line {\n\t\t\t\tborder-radius: 100px;\n\t\t\t\theight: 4px;\n\n\t\t\t\t&__bar {\n\t\t\t\t\twidth: 22px;\n\t\t\t\t\theight: 4px;\n\t\t\t\t\tborder-radius: 100px;\n\t\t\t\t\tbackground-color: #FFFFFF;\n\t\t\t\t\ttransition: transform 0.3s;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&__dot {\n\t\t\t\twidth: 5px;\n\t\t\t\theight: 5px;\n\t\t\t\tborder-radius: 100px;\n\t\t\t\tmargin: 0 4px;\n\n\t\t\t\t&--active {\n\t\t\t\t\twidth: 12px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-switch/props.js",
    "content": "export default {\n    props: {\n        // 是否为加载中状态\n        loading: {\n            type: Boolean,\n            default: uni.$u.props.switch.loading\n        },\n        // 是否为禁用装填\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.switch.disabled\n        },\n        // 开关尺寸，单位px\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.switch.size\n        },\n        // 打开时的背景颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.switch.activeColor\n        },\n        // 关闭时的背景颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.switch.inactiveColor\n        },\n        // 通过v-model双向绑定的值\n        value: {\n            type: [Boolean, String, Number],\n            default: uni.$u.props.switch.value\n        },\n        // switch打开时的值\n        activeValue: {\n            type: [String, Number, Boolean],\n            default: uni.$u.props.switch.activeValue\n        },\n        // switch关闭时的值\n        inactiveValue: {\n            type: [String, Number, Boolean],\n            default: uni.$u.props.switch.inactiveValue\n        },\n        // 是否开启异步变更，开启后需要手动控制输入值\n        asyncChange: {\n            type: Boolean,\n            default: uni.$u.props.switch.asyncChange\n        },\n        // 圆点与外边框的距离\n        space: {\n            type: [String, Number],\n            default: uni.$u.props.switch.space\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-switch/u-switch.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-switch\"\n\t    :class=\"[disabled && 'u-switch--disabled']\"\n\t    :style=\"[switchStyle, $u.addStyle(customStyle)]\"\n\t    @tap=\"clickHandler\"\n\t>\n\t\t<view\n\t\t    class=\"u-switch__bg\"\n\t\t    :style=\"[bgStyle]\"\n\t\t>\n\t\t</view>\n\t\t<view\n\t\t    class=\"u-switch__node\"\n\t\t    :class=\"[value && 'u-switch__node--on']\"\n\t\t    :style=\"[nodeStyle]\"\n\t\t    ref=\"u-switch__node\"\n\t\t>\n\t\t\t<u-loading-icon\n\t\t\t    :show=\"loading\"\n\t\t\t    mode=\"circle\"\n\t\t\t    timingFunction='linear'\n\t\t\t    :color=\"value ? activeColor : '#AAABAD'\"\n\t\t\t    :size=\"size * 0.6\"\n\t\t\t/>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * switch 开关选择器\n\t * @description 选择开关一般用于只有两个选择，且只能选其一的场景。\n\t * @tutorial https://www.uviewui.com/components/switch.html\n\t * @property {Boolean}\t\t\t\t\t\tloading\t\t\t是否处于加载中（默认 false ）\n\t * @property {Boolean}\t\t\t\t\t\tdisabled\t\t是否禁用（默认 false ）\n\t * @property {String | Number}\t\t\t\tsize\t\t\t开关尺寸，单位px （默认 25 ）\n\t * @property {String}\t\t\t\t\t\tactiveColor\t\t打开时的背景色 （默认 '#2979ff' ）\n\t * @property {String} \t\t\t\t\t\tinactiveColor\t关闭时的背景色 （默认 '#ffffff' ）\n\t * @property {Boolean | String | Number}\tvalue\t\t\t通过v-model双向绑定的值 （默认 false ）\n\t * @property {Boolean | String | Number}\tactiveValue\t\t打开选择器时通过change事件发出的值 （默认 true ）\n\t * @property {Boolean | String | Number}\tinactiveValue\t关闭选择器时通过change事件发出的值 （默认 false ）\n\t * @property {Boolean}\t\t\t\t\t\tasyncChange\t\t是否开启异步变更，开启后需要手动控制输入值 （默认 false ）\n\t * @property {String | Number}\t\t\t\tspace\t\t\t圆点与外边框的距离 （默认 0 ）\n\t * @property {Object}\t\t\t\t\t\tcustomStyle\t\t定义需要用到的外部样式\n\t *\n\t * @event {Function} change 在switch打开或关闭时触发\n\t * @example <u-switch v-model=\"checked\" active-color=\"red\" inactive-color=\"#eee\"></u-switch>\n\t */\n\texport default {\n\t\tname: \"u-switch\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\twatch: {\n\t\t\tvalue: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler(n) {\n\t\t\t\t\tif(n !== this.inactiveValue && n !== this.activeValue) {\n\t\t\t\t\t\tuni.$u.error('v-model绑定的值必须为inactiveValue、activeValue二者之一')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tbgColor: '#ffffff'\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tisActive(){\n\t\t\t\treturn this.value === this.activeValue;\n\t\t\t},\n\t\t\tswitchStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\t// 这里需要加2，是为了腾出边框的距离，否则圆点node会和外边框紧贴在一起\n\t\t\t\tstyle.width = uni.$u.addUnit(this.size * 2 + 2)\n\t\t\t\tstyle.height = uni.$u.addUnit(Number(this.size) + 2)\n\t\t\t\t// style.borderColor = this.value ? 'rgba(0, 0, 0, 0)' : 'rgba(0, 0, 0, 0.12)'\n\t\t\t\t// 如果自定义了“非激活”演示，name边框颜色设置为透明(跟非激活颜色一致)\n\t\t\t\t// 这里不能简单的设置为非激活的颜色，否则打开状态时，会有边框，所以需要透明\n\t\t\t\tif(this.customInactiveColor) {\n\t\t\t\t\tstyle.borderColor = 'rgba(0, 0, 0, 0)'\n\t\t\t\t}\n\t\t\t\tstyle.backgroundColor = this.isActive ? this.activeColor : this.inactiveColor\n\t\t\t\treturn style;\n\t\t\t},\n\t\t\tnodeStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\t// 如果自定义非激活颜色，将node圆点的尺寸减少两个像素，让其与外边框距离更大一点\n\t\t\t\tstyle.width = uni.$u.addUnit(this.size - this.space)\n\t\t\t\tstyle.height = uni.$u.addUnit(this.size - this.space)\n\t\t\t\tconst translateX = this.isActive ? uni.$u.addUnit(this.space) : uni.$u.addUnit(this.size);\n\t\t\t\tstyle.transform = `translateX(-${translateX})`\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tbgStyle() {\n\t\t\t\tlet style = {}\n\t\t\t\t// 这里配置一个多余的元素在HTML中，是为了让switch切换时，有更良好的背景色扩充体验(见实际效果)\n\t\t\t\tstyle.width = uni.$u.addUnit(Number(this.size) * 2 - this.size / 2)\n\t\t\t\tstyle.height = uni.$u.addUnit(this.size)\n\t\t\t\tstyle.backgroundColor = this.inactiveColor\n\t\t\t\t// 打开时，让此元素收缩，否则反之\n\t\t\t\tstyle.transform = `scale(${this.isActive ? 0 : 1})`\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tcustomInactiveColor() {\n\t\t\t\t// 之所以需要判断是否自定义了“非激活”颜色，是为了让node圆点离外边框更宽一点的距离\n\t\t\t\treturn this.inactiveColor !== '#fff' && this.inactiveColor !== '#ffffff'\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tclickHandler() {\n\t\t\t\tif (!this.disabled && !this.loading) {\n\t\t\t\t\tconst oldValue = this.isActive ? this.inactiveValue : this.activeValue\n\t\t\t\t\tif(!this.asyncChange) {\n\t\t\t\t\t\tthis.$emit('input', oldValue)\n\t\t\t\t\t}\n\t\t\t\t\t// 放到下一个生命周期，因为双向绑定的value修改父组件状态需要时间，且是异步的\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.$emit('change', oldValue)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-switch {\n\t\t@include flex(row);\n\t\t/* #ifndef APP-NVUE */\n\t\tbox-sizing: border-box;\n\t\t/* #endif */\n\t\tposition: relative;\n\t\tbackground-color: #fff;\n\t\tborder-width: 1px;\n\t\tborder-radius: 100px;\n\t\ttransition: background-color 0.4s;\n\t\tborder-color: rgba(0, 0, 0, 0.12);\n\t\tborder-style: solid;\n\t\tjustify-content: flex-end;\n\t\talign-items: center;\n\t\t// 由于weex为阿里逗着玩的KPI项目，导致bug奇多，这必须要写这一行，\n\t\t// 否则在iOS上，点击页面任意地方，都会触发switch的点击事件\n\t\toverflow: hidden;\n\n\t\t&__node {\n\t\t\t@include flex(row);\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tborder-radius: 100px;\n\t\t\tbackground-color: #fff;\n\t\t\tborder-radius: 100px;\n\t\t\tbox-shadow: 1px 1px 1px 0 rgba(0, 0, 0, 0.25);\n\t\t\ttransition-property: transform;\n\t\t\ttransition-duration: 0.4s;\n\t\t\ttransition-timing-function: cubic-bezier(0.3, 1.05, 0.4, 1.05);\n\t\t}\n\n\t\t&__bg {\n\t\t\tposition: absolute;\n\t\t\tborder-radius: 100px;\n\t\t\tbackground-color: #FFFFFF;\n\t\t\ttransition-property: transform;\n\t\t\ttransition-duration: 0.4s;\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\ttransition-timing-function: ease;\n\t\t}\n\n\t\t&--disabled {\n\t\t\topacity: 0.6;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabbar/props.js",
    "content": "export default {\n    props: {\n        // 当前匹配项的name\n        value: {\n            type: [String, Number, null],\n            default: uni.$u.props.tabbar.value\n        },\n        // 是否为iPhoneX留出底部安全距离\n        safeAreaInsetBottom: {\n            type: Boolean,\n            default: uni.$u.props.tabbar.safeAreaInsetBottom\n        },\n        // 是否显示上方边框\n        border: {\n            type: Boolean,\n            default: uni.$u.props.tabbar.border\n        },\n        // 元素层级z-index\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.tabbar.zIndex\n        },\n        // 选中标签的颜色\n        activeColor: {\n            type: String,\n            default: uni.$u.props.tabbar.activeColor\n        },\n        // 未选中标签的颜色\n        inactiveColor: {\n            type: String,\n            default: uni.$u.props.tabbar.inactiveColor\n        },\n        // 是否固定在底部\n        fixed: {\n            type: Boolean,\n            default: uni.$u.props.tabbar.fixed\n        },\n        // fixed定位固定在底部时，是否生成一个等高元素防止塌陷\n        placeholder: {\n            type: Boolean,\n            default: uni.$u.props.tabbar.placeholder\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue",
    "content": "<template>\n\t<view class=\"u-tabbar\">\n\t\t<view\n\t\t    class=\"u-tabbar__content\"\n\t\t    ref=\"u-tabbar__content\"\n\t\t    @touchmove.stop.prevent=\"noop\"\n\t\t    :class=\"[border && 'u-border-top', fixed && 'u-tabbar--fixed']\"\n\t\t    :style=\"[tabbarStyle]\"\n\t\t>\n\t\t\t<view class=\"u-tabbar__content__item-wrapper\">\n\t\t\t\t<slot />\n\t\t\t</view>\n\t\t\t<u-safe-bottom v-if=\"safeAreaInsetBottom\"></u-safe-bottom>\n\t\t</view>\n\t\t<view\n\t\t    class=\"u-tabbar__placeholder\"\n\t\t\tv-if=\"placeholder\"\n\t\t    :style=\"{\n\t\t\t\theight: placeholderHeight + 'px',\n\t\t\t}\"\n\t\t></view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t/**\n\t * Tabbar 底部导航栏\n\t * @description 此组件提供了自定义tabbar的能力。\n\t * @tutorial https://www.uviewui.com/components/tabbar.html\n\t * @property {String | Number}\tvalue\t\t\t\t当前匹配项的name\n\t * @property {Boolean}\t\t\tsafeAreaInsetBottom\t是否为iPhoneX留出底部安全距离（默认 true ）\n\t * @property {Boolean}\t\t\tborder\t\t\t\t是否显示上方边框（默认 true ）\n\t * @property {String | Number}\tzIndex\t\t\t\t元素层级z-index（默认 1 ）\n\t * @property {String}\t\t\tactiveColor\t\t\t选中标签的颜色（默认 '#1989fa' ）\n\t * @property {String}\t\t\tinactiveColor\t\t未选中标签的颜色（默认 '#7d7e80' ）\n\t * @property {Boolean}\t\t\tfixed\t\t\t\t是否固定在底部（默认 true ）\n\t * @property {Boolean}\t\t\tplaceholder\t\t\tfixed定位固定在底部时，是否生成一个等高元素防止塌陷（默认 true ）\n\t * @property {Object}\t\t\tcustomStyle\t\t\t定义需要用到的外部样式\n\t * \n\t * @example <u-tabbar :value=\"value2\" :placeholder=\"false\" @change=\"name => value2 = name\" :fixed=\"false\" :safeAreaInsetBottom=\"false\"><u-tabbar-item text=\"首页\" icon=\"home\" dot ></u-tabbar-item></u-tabbar>\n\t */\n\texport default {\n\t\tname: 'u-tabbar',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tplaceholderHeight: 0\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttabbarStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tzIndex: this.zIndex\n\t\t\t\t}\n\t\t\t\t// 合并来自父组件的customStyle样式\n\t\t\t\treturn uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n\t\t\t},\n\t\t\t// 监听多个参数的变化，通过在computed执行对应的操作\n\t\t\tupdateChild() {\n\t\t\t\treturn [this.value, this.activeColor, this.inactiveColor]\n\t\t\t},\n\t\t\tupdatePlaceholder() {\n\t\t\t\treturn [this.fixed, this.placeholder]\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tupdateChild() {\n\t\t\t\t// 如果updateChildren中的元素发生了变化，则执行子元素初始化操作\n\t\t\t\tthis.updateChildren()\n\t\t\t},\n\t\t\tupdatePlaceholder() {\n\t\t\t\t// 如果fixed，placeholder等参数发生变化，重新计算占位元素的高度\n\t\t\t\tthis.setPlaceholderHeight()\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.children = []\n\t\t},\n\t\tmounted() {\n\t\t\tthis.setPlaceholderHeight()\n\t\t},\n\t\tmethods: {\n\t\t\tupdateChildren() {\n\t\t\t\t// 如果存在子元素，则执行子元素的updateFromParent进行更新数据\n\t\t\t\tthis.children.length && this.children.map(child => child.updateFromParent())\n\t\t\t},\n\t\t\t// 设置用于防止塌陷元素的高度\n\t\t\tasync setPlaceholderHeight() {\n\t\t\t\tif (!this.fixed || !this.placeholder) return\n\t\t\t\t// 延时一定时间\n\t\t\t\tawait uni.$u.sleep(20)\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$uGetRect('.u-tabbar__content').then(({height = 50}) => {\n\t\t\t\t\t// 修复IOS safearea bottom 未填充高度\n\t\t\t\t\tthis.placeholderHeight = height\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tdom.getComponentRect(this.$refs['u-tabbar__content'], (res) => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsize\n\t\t\t\t\t} = res\n\t\t\t\t\tthis.placeholderHeight = size.height\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-tabbar {\n\t\t@include flex(column);\n\t\tflex: 1;\n\t\tjustify-content: center;\n\t\t\n\t\t&__content {\n\t\t\t@include flex(column);\n\t\t\tbackground-color: #fff;\n\t\t\t\n\t\t\t&__item-wrapper {\n\t\t\t\theight: 50px;\n\t\t\t\t@include flex(row);\n\t\t\t}\n\t\t}\n\n\t\t&--fixed {\n\t\t\tposition: fixed;\n\t\t\tbottom: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabbar-item/props.js",
    "content": "export default {\n    props: {\n        // item标签的名称，作为与u-tabbar的value参数匹配的标识符\n        name: {\n            type: [String, Number, null],\n            default: uni.$u.props.tabbarItem.name\n        },\n        // uView内置图标或者绝对路径的图片\n        icon: {\n            icon: String,\n            default: uni.$u.props.tabbarItem.icon\n        },\n        // 右上角的角标提示信息\n        badge: {\n            type: [String, Number, null],\n            default: uni.$u.props.tabbarItem.badge\n        },\n        // 是否显示圆点，将会覆盖badge参数\n        dot: {\n            type: Boolean,\n            default: uni.$u.props.tabbarItem.dot\n        },\n        // 描述文本\n        text: {\n            type: String,\n            default: uni.$u.props.tabbarItem.text\n        },\n        // 控制徽标的位置，对象或者字符串形式，可以设置top和right属性\n        badgeStyle: {\n            type: [Object, String],\n            default: uni.$u.props.tabbarItem.badgeStyle\n        }\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue",
    "content": "<template>\n\t<view\n\t    class=\"u-tabbar-item\"\n\t    :style=\"[$u.addStyle(customStyle)]\"\n\t    @tap=\"clickHandler\"\n\t>\n\t\t<view class=\"u-tabbar-item__icon\">\n\t\t\t<u-icon\n\t\t\t    v-if=\"icon\"\n\t\t\t    :name=\"icon\"\n\t\t\t    :color=\"isActive? parentData.activeColor : parentData.inactiveColor\"\n\t\t\t    :size=\"20\"\n\t\t\t></u-icon>\n\t\t\t<template v-else>\n\t\t\t\t<slot\n\t\t\t\t    v-if=\"isActive\"\n\t\t\t\t    name=\"active-icon\"\n\t\t\t\t/>\n\t\t\t\t<slot\n\t\t\t\t    v-else\n\t\t\t\t    name=\"inactive-icon\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t\t<u-badge\n\t\t\t\tabsolute\n\t\t\t\t:offset=\"[0, dot ? '34rpx' : badge > 9 ? '14rpx' : '20rpx']\"\n\t\t\t    :customStyle=\"badgeStyle\"\n\t\t\t    :isDot=\"dot\"\n\t\t\t    :value=\"badge || (dot ? 1 : null)\"\n\t\t\t    :show=\"dot || badge > 0\"\n\t\t\t></u-badge>\n\t\t</view>\n\t\t\n\t\t<slot name=\"text\">\n\t\t\t<text\n\t\t\t    class=\"u-tabbar-item__text\"\n\t\t\t    :style=\"{\n\t\t\t\t\tcolor: isActive? parentData.activeColor : parentData.inactiveColor\n\t\t\t\t}\"\n\t\t\t>{{ text }}</text>\n\t\t</slot>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * TabbarItem 底部导航栏子组件\n\t * @description 此组件提供了自定义tabbar的能力。\n\t * @tutorial https://www.uviewui.com/components/tabbar.html\n\t * @property {String | Number}\tname\t\titem标签的名称，作为与u-tabbar的value参数匹配的标识符\n\t * @property {String}\t\t\ticon\t\tuView内置图标或者绝对路径的图片\n\t * @property {String | Number}\tbadge\t\t右上角的角标提示信息\n\t * @property {Boolean}\t\t\tdot\t\t\t是否显示圆点，将会覆盖badge参数（默认 false ）\n\t * @property {String}\t\t\ttext\t\t描述文本\n\t * @property {Object | String}\tbadgeStyle\t控制徽标的位置，对象或者字符串形式，可以设置top和right属性（默认 'top: 6px;right:2px;' ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @example <u-tabbar :value=\"value2\" :placeholder=\"false\" @change=\"name => value2 = name\" :fixed=\"false\" :safeAreaInsetBottom=\"false\"><u-tabbar-item text=\"首页\" icon=\"home\" dot ></u-tabbar-item></u-tabbar>\n\t */\n\texport default {\n\t\tname: 'u-tabbar-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisActive: false, // 是否处于激活状态\n\t\t\t\tparentData: {\n\t\t\t\t\tvalue: null,\n\t\t\t\t\tactiveColor: '',\n\t\t\t\t\tinactiveColor: ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\t// 支付宝小程序不支持provide/inject，所以使用这个方法获取整个父组件，在created定义，避免循环引用\n\t\t\t\tthis.updateParentData()\n\t\t\t\tif (!this.parent) {\n\t\t\t\t\tuni.$u.error('u-tabbar-item必须搭配u-tabbar组件使用')\n\t\t\t\t}\n\t\t\t\t// 本子组件在u-tabbar的children数组中的索引\n\t\t\t\tconst index = this.parent.children.indexOf(this)\n\t\t\t\t// 判断本组件的name(如果没有定义name，就用index索引)是否等于父组件的value参数\n\t\t\t\tthis.isActive = (this.name || index) === this.parentData.value\n\t\t\t},\n\t\t\tupdateParentData() {\n\t\t\t\t// 此方法在mixin中\n\t\t\t\tthis.getParentData('u-tabbar')\n\t\t\t},\n\t\t\t// 此方法将会被父组件u-tabbar调用\n\t\t\tupdateFromParent() {\n\t\t\t\t// 重新初始化\n\t\t\t\tthis.init()\n\t\t\t},\n\t\t\tclickHandler() {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tconst index = this.parent.children.indexOf(this)\n\t\t\t\t\tconst name = this.name || index\n\t\t\t\t\t// 点击的item为非激活的item才发出change事件\n\t\t\t\t\tif (name !== this.parent.value) {\n\t\t\t\t\t\tthis.parent.$emit('change', name)\n\t\t\t\t\t}\n\t\t\t\t\tthis.$emit('click', name)\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-tabbar-item {\n\t\t@include flex(column);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex: 1;\n\t\t\n\t\t&__icon {\n\t\t\t@include flex;\n\t\t\tposition: relative;\n\t\t\twidth: 150rpx;\n\t\t\tjustify-content: center;\n\t\t}\n\n\t\t&__text {\n\t\t\tmargin-top: 2px;\n\t\t\tfont-size: 12px;\n\t\t\tcolor: $u-content-color;\n\t\t}\n\t}\n\n\t/* #ifdef MP */\n\t// 由于小程序都使用shadow DOM形式实现，需要给影子宿主设置flex: 1才能让其撑开\n\t:host {\n\t\tflex: 1\n\t}\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-table/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-table/u-table.vue",
    "content": "<template>\n\t<view class=\"u-table\">\n\t\t\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Table 表格 \n\t * @description 表格组件一般用于展示大量结构化数据的场景 本组件标签类似HTML的table表格，由table、tr、th、td四个组件组成\n\t * @tutorial https://www.uviewui.com/components/table.html\n\t * @example <u-table><u-tr><u-th>学校</u-th </u-tr> <u-tr><u-td>浙江大学</u-td> </u-tr> <u-tr><u-td>清华大学</u-td> </u-tr></u-table>\n\t */\n\texport default {\n\t\tname: 'u-table',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabs/props.js",
    "content": "export default {\n    props: {\n        // 滑块的移动过渡时间，单位ms\n        duration: {\n            type: Number,\n            default: uni.$u.props.tabs.duration\n        },\n        // tabs标签数组\n        list: {\n            type: Array,\n            default: uni.$u.props.tabs.list\n        },\n        // 滑块颜色\n        lineColor: {\n            type: String,\n            default: uni.$u.props.tabs.lineColor\n        },\n        // 菜单选择中时的样式\n        activeStyle: {\n            type: [String, Object],\n            default: uni.$u.props.tabs.activeStyle\n        },\n        // 菜单非选中时的样式\n        inactiveStyle: {\n            type: [String, Object],\n            default: uni.$u.props.tabs.inactiveStyle\n        },\n        // 滑块长度\n        lineWidth: {\n            type: [String, Number],\n            default: uni.$u.props.tabs.lineWidth\n        },\n        // 滑块高度\n        lineHeight: {\n            type: [String, Number],\n            default: uni.$u.props.tabs.lineHeight\n        },\n        // 滑块背景显示大小，当滑块背景设置为图片时使用\n        lineBgSize: {\n            type: String,\n            default: uni.$u.props.tabs.lineBgSize\n        },\n        // 菜单item的样式\n        itemStyle: {\n            type: [String, Object],\n            default: uni.$u.props.tabs.itemStyle\n        },\n        // 菜单是否可滚动\n        scrollable: {\n            type: Boolean,\n            default: uni.$u.props.tabs.scrollable\n        },\n\t\t// 当前选中标签的索引\n\t\tcurrent: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: uni.$u.props.tabs.current\n\t\t},\n\t\t// 默认读取的键名\n\t\tkeyName: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.tabs.keyName\n\t\t}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabs/u-tabs.vue",
    "content": "<template>\n\t<view class=\"u-tabs\">\n\t\t<view class=\"u-tabs__wrapper\">\n\t\t\t<slot name=\"left\" />\n\t\t\t<view class=\"u-tabs__wrapper__scroll-view-wrapper\">\n\t\t\t\t<scroll-view\n\t\t\t\t\t:scroll-x=\"scrollable\"\n\t\t\t\t\t:scroll-left=\"scrollLeft\"\n\t\t\t\t\tscroll-with-animation\n\t\t\t\t\tclass=\"u-tabs__wrapper__scroll-view\"\n\t\t\t\t\t:show-scrollbar=\"false\"\n\t\t\t\t\tref=\"u-tabs__wrapper__scroll-view\"\n\t\t\t\t>\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"u-tabs__wrapper__nav\"\n\t\t\t\t\t\tref=\"u-tabs__wrapper__nav\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<view\n\t\t\t\t\t\t\tclass=\"u-tabs__wrapper__nav__item\"\n\t\t\t\t\t\t\tv-for=\"(item, index) in list\"\n\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\t@tap=\"clickHandler(item, index)\"\n\t\t\t\t\t\t\t:ref=\"`u-tabs__wrapper__nav__item-${index}`\"\n\t\t\t\t\t\t\t:style=\"[$u.addStyle(itemStyle), {flex: scrollable ? '' : 1}]\"\n\t\t\t\t\t\t\t:class=\"[`u-tabs__wrapper__nav__item-${index}`, item.disabled && 'u-tabs__wrapper__nav__item--disabled']\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t:class=\"[item.disabled && 'u-tabs__wrapper__nav__item__text--disabled']\"\n\t\t\t\t\t\t\t\tclass=\"u-tabs__wrapper__nav__item__text\"\n\t\t\t\t\t\t\t\t:style=\"[textStyle(index)]\"\n\t\t\t\t\t\t\t>{{ item[keyName] }}</text>\n\t\t\t\t\t\t\t<u-badge\n\t\t\t\t\t\t\t\t:show=\"!!(item.badge && (item.badge.show || item.badge.isDot || item.badge.value))\"\n\t\t\t\t\t\t\t\t:isDot=\"item.badge && item.badge.isDot || propsBadge.isDot\"\n\t\t\t\t\t\t\t\t:value=\"item.badge && item.badge.value || propsBadge.value\"\n\t\t\t\t\t\t\t\t:max=\"item.badge && item.badge.max || propsBadge.max\"\n\t\t\t\t\t\t\t\t:type=\"item.badge && item.badge.type || propsBadge.type\"\n\t\t\t\t\t\t\t\t:showZero=\"item.badge && item.badge.showZero || propsBadge.showZero\"\n\t\t\t\t\t\t\t\t:bgColor=\"item.badge && item.badge.bgColor || propsBadge.bgColor\"\n\t\t\t\t\t\t\t\t:color=\"item.badge && item.badge.color || propsBadge.color\"\n\t\t\t\t\t\t\t\t:shape=\"item.badge && item.badge.shape || propsBadge.shape\"\n\t\t\t\t\t\t\t\t:numberType=\"item.badge && item.badge.numberType || propsBadge.numberType\"\n\t\t\t\t\t\t\t\t:inverted=\"item.badge && item.badge.inverted || propsBadge.inverted\"\n\t\t\t\t\t\t\t\tcustomStyle=\"margin-left: 4px;\"\n\t\t\t\t\t\t\t></u-badge>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<!-- #ifdef APP-NVUE -->\n\t\t\t\t\t\t<view\n\t\t\t\t\t\t\tclass=\"u-tabs__wrapper__nav__line\"\n\t\t\t\t\t\t\tref=\"u-tabs__wrapper__nav__line\"\n\t\t\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\t\t\t\twidth: $u.addUnit(lineWidth),\n\t\t\t\t\t\t\t\t\theight: $u.addUnit(lineHeight),\n\t\t\t\t\t\t\t\t\tbackground: lineColor,\n\t\t\t\t\t\t\t\t\tbackgroundSize: lineBgSize,\n\t\t\t\t\t\t\t\t}]\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t\t<!-- #ifndef APP-NVUE -->\n\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t\tclass=\"u-tabs__wrapper__nav__line\"\n\t\t\t\t\t\t\t\tref=\"u-tabs__wrapper__nav__line\"\n\t\t\t\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\t\t\t\t\twidth: $u.addUnit(lineWidth),\n\t\t\t\t\t\t\t\t\t\ttransform: `translate(${lineOffsetLeft}px)`,\n\t\t\t\t\t\t\t\t\t\ttransitionDuration: `${firstTime ? 0 : duration}ms`,\n\t\t\t\t\t\t\t\t\t\theight: $u.addUnit(lineHeight),\n\t\t\t\t\t\t\t\t\t\tbackground: lineColor,\n\t\t\t\t\t\t\t\t\t\tbackgroundSize: lineBgSize,\n\t\t\t\t\t\t\t\t\t}]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t</view>\n\t\t\t\t</scroll-view>\n\t\t\t</view>\n\t\t\t<slot name=\"right\" />\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\t// #ifdef APP-NVUE\n\tconst animation = uni.requireNativePlugin('animation')\n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\timport props from './props.js';\n\t/**\n\t * Tabs 标签\n\t * @description tabs标签组件，在标签多的时候，可以配置为左右滑动，标签少的时候，可以禁止滑动。 该组件的一个特点是配置为滚动模式时，激活的tab会自动移动到组件的中间位置。\n\t * @tutorial https://www.uviewui.com/components/tabs.html\n\t * @property {String | Number}\tduration\t\t\t滑块移动一次所需的时间，单位秒（默认 200 ）\n\t * @property {String | Number}\tswierWidth\t\t\tswiper的宽度（默认 '750rpx' ）\n\t * @property {String}\tkeyName\t 从`list`元素对象中读取的键名（默认 'name' ）\n\t * @event {Function(index)} change 标签改变时触发 index: 点击了第几个tab，索引从0开始\n\t * @event {Function(index)} click 点击标签时触发 index: 点击了第几个tab，索引从0开始\n\t * @example <u-tabs :list=\"list\" :is-scroll=\"false\" :current=\"current\" @change=\"change\"></u-tabs>\n\t */\n\texport default {\n\t\tname: 'u-tabs',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tfirstTime: true,\n\t\t\t\tscrollLeft: 0,\n\t\t\t\tscrollViewWidth: 0,\n\t\t\t\tlineOffsetLeft: 0,\n\t\t\t\ttabsRect: {\n\t\t\t\t\tleft: 0\n\t\t\t\t},\n\t\t\t\tinnerCurrent: 0,\n\t\t\t\tmoving: false,\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tcurrent: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler (newValue, oldValue) {\n\t\t\t\t\t// 内外部值不相等时，才尝试移动滑块\n\t\t\t\t\tif (newValue !== this.innerCurrent) {\n\t\t\t\t\t\tthis.innerCurrent = newValue\n\t\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t\tthis.resize()\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\t// list变化时，重新渲染list各项信息\n\t\t\tlist() {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.resize()\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ttextStyle() {\n\t\t\t\treturn index => {\n\t\t\t\t\tconst style = {}\n\t\t\t\t\t// 取当期是否激活的样式\n\t\t\t\t\tconst customeStyle = index === this.innerCurrent ? uni.$u.addStyle(this.activeStyle) : uni.$u\n\t\t\t\t\t\t.addStyle(\n\t\t\t\t\t\t\tthis.inactiveStyle)\n\t\t\t\t\t// 如果当前菜单被禁用，则加上对应颜色，需要在此做处理，是因为nvue下，无法在style样式中通过!import覆盖标签的内联样式\n\t\t\t\t\tif (this.list[index].disabled) {\n\t\t\t\t\t\tstyle.color = '#c8c9cc'\n\t\t\t\t\t}\n\t\t\t\t\treturn uni.$u.deepMerge(customeStyle, style)\n\t\t\t\t}\n\t\t\t},\n\t\t\tpropsBadge() {\n\t\t\t\treturn uni.$u.props.badge\n\t\t\t}\n\t\t},\n\t\tasync mounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tsetLineLeft() {\n\t\t\t\tconst tabItem = this.list[this.innerCurrent];\n\t\t\t\tif (!tabItem) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 获取滑块该移动的位置\n\t\t\t\tlet lineOffsetLeft = this.list\n\t\t\t\t\t.slice(0, this.innerCurrent)\n\t\t\t\t\t.reduce((total, curr) => total + curr.rect.width, 0);\n                // 获取下划线的数值px表示法\n\t\t\t\tconst lineWidth = uni.$u.getPx(this.lineWidth);\n\t\t\t\tthis.lineOffsetLeft = lineOffsetLeft + (tabItem.rect.width - lineWidth) / 2\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// 第一次移动滑块，无需过渡时间\n\t\t\t\tthis.animation(this.lineOffsetLeft, this.firstTime ? 0 : parseInt(this.duration))\n\t\t\t\t// #endif\n\n\t\t\t\t// 如果是第一次执行此方法，让滑块在初始化时，瞬间滑动到第一个tab item的中间\n\t\t\t\t// 这里需要一个定时器，因为在非nvue下，是直接通过style绑定过渡时间，需要等其过渡完成后，再设置为false(非第一次移动滑块)\n\t\t\t\tif (this.firstTime) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.firstTime = false\n\t\t\t\t\t}, 10);\n\t\t\t\t}\n\t\t\t},\n\t\t\t// nvue下设置滑块的位置\n\t\t\tanimation(x, duration = 0) {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tconst ref = this.$refs['u-tabs__wrapper__nav__line']\n\t\t\t\tanimation.transition(ref, {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\ttransform: `translateX(${x}px)`\n\t\t\t\t\t},\n\t\t\t\t\tduration\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 点击某一个标签\n\t\t\tclickHandler(item, index) {\n\t\t\t\t// 因为标签可能为disabled状态，所以click是一定会发出的，但是change事件是需要可用的状态才发出\n\t\t\t\tthis.$emit('click', {\n\t\t\t\t\t...item,\n\t\t\t\t\tindex\n\t\t\t\t})\n\t\t\t\t// 如果disabled状态，返回\n\t\t\t\tif (item.disabled) return\n\t\t\t\tthis.innerCurrent = index\n\t\t\t\tthis.resize()\n\t\t\t\tthis.$emit('change', {\n\t\t\t\t\t...item,\n\t\t\t\t\tindex\n\t\t\t\t})\n\t\t\t},\n\t\t\tinit() {\n\t\t\t\tuni.$u.sleep().then(() => {\n\t\t\t\t\tthis.resize()\n\t\t\t\t})\n\t\t\t},\n\t\t\tsetScrollLeft() {\n\t\t\t\t// 当前活动tab的布局信息，有tab菜单的width和left(为元素左边界到父元素左边界的距离)等信息\n\t\t\t\tconst tabRect = this.list[this.innerCurrent]\n\t\t\t\t// 累加得到当前item到左边的距离\n\t\t\t\tconst offsetLeft = this.list\n\t\t\t\t\t.slice(0, this.innerCurrent)\n\t\t\t\t\t.reduce((total, curr) => {\n\t\t\t\t\t\treturn total + curr.rect.width\n\t\t\t\t\t}, 0)\n\t\t\t\t// 此处为屏幕宽度\n\t\t\t\tconst windowWidth = uni.$u.sys().windowWidth\n\t\t\t\t// 将活动的tabs-item移动到屏幕正中间，实际上是对scroll-view的移动\n\t\t\t\tlet scrollLeft = offsetLeft - (this.tabsRect.width - tabRect.rect.width) / 2 - (windowWidth - this.tabsRect\n\t\t\t\t\t.right) / 2 + this.tabsRect.left / 2\n\t\t\t\t// 这里做一个限制，限制scrollLeft的最大值为整个scroll-view宽度减去tabs组件的宽度\n\t\t\t\tscrollLeft = Math.min(scrollLeft, this.scrollViewWidth - this.tabsRect.width)\n\t\t\t\tthis.scrollLeft = Math.max(0, scrollLeft)\n\t\t\t},\n\t\t\t// 获取所有标签的尺寸\n\t\t\tresize() {\n\t\t\t\t// 如果不存在list，则不处理\n\t\t\t\tif(this.list.length === 0) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tPromise.all([this.getTabsRect(), this.getAllItemRect()]).then(([tabsRect, itemRect = []]) => {\n\t\t\t\t\tthis.tabsRect = tabsRect\n\t\t\t\t\tthis.scrollViewWidth = 0\n\t\t\t\t\titemRect.map((item, index) => {\n\t\t\t\t\t\t// 计算scroll-view的宽度，这里\n\t\t\t\t\t\tthis.scrollViewWidth += item.width\n\t\t\t\t\t\t// 另外计算每一个item的中心点X轴坐标\n\t\t\t\t\t\tthis.list[index].rect = item\n\t\t\t\t\t})\n\t\t\t\t\t// 获取了tabs的尺寸之后，设置滑块的位置\n\t\t\t\t\tthis.setLineLeft()\n\t\t\t\t\tthis.setScrollLeft()\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取导航菜单的尺寸\n\t\t\tgetTabsRect() {\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tthis.queryRect('u-tabs__wrapper__scroll-view').then(size => resolve(size))\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取所有标签的尺寸\n\t\t\tgetAllItemRect() {\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tconst promiseAllArr = this.list.map((item, index) => this.queryRect(\n\t\t\t\t\t\t`u-tabs__wrapper__nav__item-${index}`, true))\n\t\t\t\t\tPromise.all(promiseAllArr).then(sizes => resolve(sizes))\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 获取各个标签的尺寸\n\t\t\tqueryRect(el, item) {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t// $uGetRect为uView自带的节点查询简化方法，详见文档介绍：https://www.uviewui.com/js/getRect.html\n\t\t\t\t// 组件内部一般用this.$uGetRect，对外的为uni.$u.getRect，二者功能一致，名称不同\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tthis.$uGetRect(`.${el}`).then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下，使用dom模块查询元素高度\n\t\t\t\t// 返回一个promise，让调用此方法的主体能使用then回调\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(item ? this.$refs[el][0] : this.$refs[el], res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-tabs {\n\n\t\t&__wrapper {\n\t\t\t@include flex;\n\t\t\talign-items: center;\n\n\t\t\t&__scroll-view-wrapper {\n\t\t\t\tflex: 1;\n\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\toverflow: auto hidden;\n\t\t\t\t/* #endif */\n\t\t\t}\n\n\t\t\t&__scroll-view {\n\t\t\t\t@include flex;\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t&__nav {\n\t\t\t\t@include flex;\n\t\t\t\tposition: relative;\n\n\t\t\t\t&__item {\n\t\t\t\t\tpadding: 0 11px;\n\t\t\t\t\t@include flex;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: center;\n\n\t\t\t\t\t&--disabled {\n\t\t\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\t\t\tcursor: not-allowed;\n\t\t\t\t\t\t/* #endif */\n\t\t\t\t\t}\n\n\t\t\t\t\t&__text {\n\t\t\t\t\t\tfont-size: 15px;\n\t\t\t\t\t\tcolor: $u-content-color;\n\n\t\t\t\t\t\t&--disabled {\n\t\t\t\t\t\t\tcolor: $u-disabled-color !important;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&__line {\n\t\t\t\t\theight: 3px;\n\t\t\t\t\tbackground: $u-primary;\n\t\t\t\t\twidth: 30px;\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\tbottom: 2px;\n\t\t\t\t\tborder-radius: 100px;\n\t\t\t\t\ttransition-property: transform;\n\t\t\t\t\ttransition-duration: 300ms;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabs-item/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tabs-item/u-tabs-item.vue",
    "content": "<template>\n\t<swiper-item>\n\t\t<slot />\n\t</swiper-item>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * TabsItem  tabs标签组件的自组件\n\t * @description tabs标签组件，在标签多的时候，可以配置为左右滑动，标签少的时候，可以禁止滑动。 该组件的一个特点是配置为滚动模式时，激活的tab会自动移动到组件的中间位置。\n\t * @tutorial https://www.uviewui.com/components/tabs.html\n\t * @property {type}\tprop_name\n\t * @event {Function()} \n\t * @example \n\t */\n\texport default {\n\t\tname: 'u-tabs-item',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style>\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tag/props.js",
    "content": "export default {\n    props: {\n        // 标签类型info、primary、success、warning、error\n        type: {\n            type: String,\n            default: uni.$u.props.tag.type\n        },\n        // 不可用\n        disabled: {\n            type: [Boolean, String],\n            default: uni.$u.props.tag.disabled\n        },\n        // 标签的大小，large，medium，mini\n        size: {\n            type: String,\n            default: uni.$u.props.tag.size\n        },\n        // tag的形状，circle（两边半圆形）, square（方形，带圆角）\n        shape: {\n            type: String,\n            default: uni.$u.props.tag.shape\n        },\n        // 标签文字\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.tag.text\n        },\n        // 背景颜色，默认为空字符串，即不处理\n        bgColor: {\n            type: String,\n            default: uni.$u.props.tag.bgColor\n        },\n        // 标签字体颜色，默认为空字符串，即不处理\n        color: {\n            type: String,\n            default: uni.$u.props.tag.color\n        },\n        // 标签的边框颜色\n        borderColor: {\n            type: String,\n            default: uni.$u.props.tag.borderColor\n        },\n        // 关闭按钮图标的颜色\n        closeColor: {\n            type: String,\n            default: uni.$u.props.tag.closeColor\n        },\n        // 点击时返回的索引值，用于区分例遍的数组哪个元素被点击了\n        name: {\n            type: [String, Number],\n            default: uni.$u.props.tag.name\n        },\n        // // 模式选择，dark|light|plain\n        // mode: {\n        // \ttype: String,\n        // \tdefault: 'light'\n        // },\n        // 镂空时是否填充背景色\n        plainFill: {\n            type: Boolean,\n            default: uni.$u.props.tag.plainFill\n        },\n        // 是否镂空\n        plain: {\n            type: Boolean,\n            default: uni.$u.props.tag.plain\n        },\n        // 是否可关闭\n        closable: {\n            type: Boolean,\n            default: uni.$u.props.tag.closable\n        },\n        // 是否显示\n        show: {\n            type: Boolean,\n            default: uni.$u.props.tag.show\n        },\n        // 内置图标，或绝对路径的图片\n        icon: {\n            type: String,\n            default: uni.$u.props.tag.icon\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tag/u-tag.vue",
    "content": "<template>\n\t<u-transition\n\t\tmode=\"fade\"\n\t\t:show=\"show\"\n\t>\n\t\t<view class=\"u-tag-wrapper\">\n\t\t\t<view\n\t\t\t\tclass=\"u-tag\"\n\t\t\t\t:class=\"[`u-tag--${shape}`, !plain && `u-tag--${type}`, plain && `u-tag--${type}--plain`, `u-tag--${size}`, plain && plainFill && `u-tag--${type}--plain--fill`]\"\n\t\t\t\t@tap.stop=\"clickHandler\"\n\t\t\t\t:style=\"[{\n\t\t\t\t\tmarginRight: closable ? '10px' : 0,\n\t\t\t\t\tmarginTop: closable ? '10px' : 0,\n\t\t\t\t}, style]\"\n\t\t\t>\n\t\t\t\t<slot name=\"icon\">\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"u-tag__icon\"\n\t\t\t\t\t\tv-if=\"icon\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<image\n\t\t\t\t\t\t\tv-if=\"$u.test.image(icon)\"\n\t\t\t\t\t\t\t:src=\"icon\"\n\t\t\t\t\t\t\t:style=\"[imgStyle]\"\n\t\t\t\t\t\t></image>\n\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t:color=\"elIconColor\"\n\t\t\t\t\t\t\t:name=\"icon\"\n\t\t\t\t\t\t\t:size=\"iconSize\"\n\t\t\t\t\t\t></u-icon>\n\t\t\t\t\t</view>\n\t\t\t\t</slot>\n\t\t\t\t<text\n\t\t\t\t\tclass=\"u-tag__text\"\n\t\t\t\t\t:style=\"[textColor]\"\n\t\t\t\t\t:class=\"[`u-tag__text--${type}`, plain && `u-tag__text--${type}--plain`, `u-tag__text--${size}`]\"\n\t\t\t\t>{{ text }}</text>\n\t\t\t</view>\n\t\t\t<view\n\t\t\t\tclass=\"u-tag__close\"\n\t\t\t\t:class=\"[`u-tag__close--${size}`]\"\n\t\t\t\tv-if=\"closable\"\n\t\t\t\t@tap.stop=\"closeHandler\"\n\t\t\t\t:style=\"{backgroundColor: closeColor}\"\n\t\t\t>\n\t\t\t\t<u-icon\n\t\t\t\t\tname=\"close\"\n\t\t\t\t\t:size=\"closeSize\"\n\t\t\t\t\tcolor=\"#ffffff\"\n\t\t\t\t></u-icon>\n\t\t\t</view>\n\t\t</view>\n\t</u-transition>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Tag 标签\n\t * @description tag组件一般用于标记和选择，我们提供了更加丰富的表现形式，能够较全面的涵盖您的使用场景\n\t * @tutorial https://www.uviewui.com/components/tag.html\n\t * @property {String}\t\t\ttype\t\t标签类型info、primary、success、warning、error （默认 'primary' ）\n\t * @property {Boolean | String}\tdisabled\t不可用（默认 false ）\n\t * @property {String}\t\t\tsize\t\t标签的大小，large，medium，mini （默认 'medium' ）\n\t * @property {String}\t\t\tshape\t\ttag的形状，circle（两边半圆形）, square（方形，带圆角）（默认 'square' ）\n\t * @property {String | Number}\ttext\t\t标签的文字内容 \n\t * @property {String}\t\t\tbgColor\t\t背景颜色，默认为空字符串，即不处理\n\t * @property {String}\t\t\tcolor\t\t标签字体颜色，默认为空字符串，即不处理\n\t * @property {String}\t\t\tborderColor\t镂空形式标签的边框颜色\n\t * @property {String}\t\t\tcloseColor\t关闭按钮图标的颜色（默认 #C6C7CB）\n\t * @property {String | Number}\tname\t\t点击时返回的索引值，用于区分例遍的数组哪个元素被点击了\n\t * @property {Boolean}\t\t\tplainFill\t镂空时是否填充背景色（默认 false ）\n\t * @property {Boolean}\t\t\tplain\t\t是否镂空（默认 false ）\n\t * @property {Boolean}\t\t\tclosable\t是否可关闭，设置为true，文字右边会出现一个关闭图标（默认 false ）\n\t * @property {Boolean}\t\t\tshow\t\t标签显示与否（默认 true ）\n\t * @property {String}\t\t\ticon\t\t内置图标，或绝对路径的图片\n\t * @event {Function(index)} click 点击标签时触发 index: 传递的index参数值\n\t * @event {Function(index)} close closable为true时，点击标签关闭按钮触发 index: 传递的index参数值\t\n\t * @example <u-tag text=\"标签\" type=\"error\" plain plainFill></u-tag>\n\t */\n\texport default {\n\t\tname: 'u-tag',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\tstyle() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (this.bgColor) {\n\t\t\t\t\tstyle.backgroundColor = this.bgColor\n\t\t\t\t}\n\t\t\t\tif (this.color) {\n\t\t\t\t\tstyle.color = this.color\n\t\t\t\t}\n\t\t\t\tif(this.borderColor) {\n\t\t\t\t\tstyle.borderColor = this.borderColor\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\t// nvue下，文本颜色无法继承父元素\n\t\t\ttextColor() {\n\t\t\t\tconst style = {}\n\t\t\t\tif (this.color) {\n\t\t\t\t\tstyle.color = this.color\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t},\n\t\t\timgStyle() {\n\t\t\t\tconst width = this.size === 'large' ? '17px' : this.size === 'medium' ? '15px' : '13px'\n\t\t\t\treturn {\n\t\t\t\t\twidth,\n\t\t\t\t\theight: width\n\t\t\t\t}\n\t\t\t},\n\t\t\t// 文本的样式\n\t\t\tcloseSize() {\n\t\t\t\tconst size = this.size === 'large' ? 15 : this.size === 'medium' ? 13 : 12\n\t\t\t\treturn size\n\t\t\t},\n\t\t\t// 图标大小\n\t\t\ticonSize() {\n\t\t\t\tconst size = this.size === 'large' ? 21 : this.size === 'medium' ? 19 : 16\n\t\t\t\treturn size\n\t\t\t},\n\t\t\t// 图标颜色\n\t\t\telIconColor() {\n\t\t\t\treturn this.iconColor ? this.iconColor : this.plain ? this.type : '#ffffff'\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t// 点击关闭按钮\n\t\t\tcloseHandler() {\n\t\t\t\tthis.$emit('close', this.name)\n\t\t\t},\n\t\t\t// 点击标签\n\t\t\tclickHandler() {\n\t\t\t\tthis.$emit('click', this.name)\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style\n\tlang=\"scss\"\n\tscoped\n>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-tag-wrapper {\n\t\tposition: relative;\n\t}\n\n\t.u-tag {\n\t\t@include flex;\n\t\talign-items: center;\n\t\tborder-style: solid;\n\n\t\t&--circle {\n\t\t\tborder-radius: 100px;\n\t\t}\n\n\t\t&--square {\n\t\t\tborder-radius: 3px;\n\t\t}\n\n\t\t&__icon {\n\t\t\tmargin-right: 4px;\n\t\t}\n\n\t\t&__text {\n\t\t\t&--mini {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tline-height: 12px;\n\t\t\t}\n\n\t\t\t&--medium {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tline-height: 13px;\n\t\t\t}\n\n\t\t\t&--large {\n\t\t\t\tfont-size: 15px;\n\t\t\t\tline-height: 15px;\n\t\t\t}\n\t\t}\n\n\t\t&--mini {\n\t\t\theight: 22px;\n\t\t\tline-height: 22px;\n\t\t\tpadding: 0 5px;\n\t\t}\n\n\t\t&--medium {\n\t\t\theight: 26px;\n\t\t\tline-height: 22px;\n\t\t\tpadding: 0 10px;\n\t\t}\n\n\t\t&--large {\n\t\t\theight: 32px;\n\t\t\tline-height: 32px;\n\t\t\tpadding: 0 15px;\n\t\t}\n\n\t\t&--primary {\n\t\t\tbackground-color: $u-primary;\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-primary;\n\t\t}\n\n\t\t&--primary--plain {\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-primary;\n\t\t}\n\n\t\t&--primary--plain--fill {\n\t\t\tbackground-color: #ecf5ff;\n\t\t}\n\n\t\t&__text--primary {\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\n\t\t&__text--primary--plain {\n\t\t\tcolor: $u-primary;\n\t\t}\n\n\t\t&--error {\n\t\t\tbackground-color: $u-error;\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-error;\n\t\t}\n\n\t\t&--error--plain {\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-error;\n\t\t}\n\n\t\t&--error--plain--fill {\n\t\t\tbackground-color: #fef0f0;\n\t\t}\n\n\t\t&__text--error {\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\n\t\t&__text--error--plain {\n\t\t\tcolor: $u-error;\n\t\t}\n\n\t\t&--warning {\n\t\t\tbackground-color: $u-warning;\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-warning;\n\t\t}\n\n\t\t&--warning--plain {\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-warning;\n\t\t}\n\n\t\t&--warning--plain--fill {\n\t\t\tbackground-color: #fdf6ec;\n\t\t}\n\n\t\t&__text--warning {\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\n\t\t&__text--warning--plain {\n\t\t\tcolor: $u-warning;\n\t\t}\n\n\t\t&--success {\n\t\t\tbackground-color: $u-success;\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-success;\n\t\t}\n\n\t\t&--success--plain {\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-success;\n\t\t}\n\n\t\t&--success--plain--fill {\n\t\t\tbackground-color: #f5fff0;\n\t\t}\n\n\t\t&__text--success {\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\n\t\t&__text--success--plain {\n\t\t\tcolor: $u-success;\n\t\t}\n\n\t\t&--info {\n\t\t\tbackground-color: $u-info;\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-info;\n\t\t}\n\n\t\t&--info--plain {\n\t\t\tborder-width: 1px;\n\t\t\tborder-color: $u-info;\n\t\t}\n\n\t\t&--info--plain--fill {\n\t\t\tbackground-color: #f4f4f5;\n\t\t}\n\n\t\t&__text--info {\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\n\t\t&__text--info--plain {\n\t\t\tcolor: $u-info;\n\t\t}\n\n\t\t&__close {\n\t\t\tposition: absolute;\n\t\t\tz-index: 999;\n\t\t\ttop: 10px;\n\t\t\tright: 10px;\n\t\t\tborder-radius: 100px;\n\t\t\tbackground-color: #C6C7CB;\n\t\t\t@include flex(row);\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\ttransform: scale(0.6) translate(80%, -80%);\n\t\t\t/* #endif */\n\t\t\t/* #ifdef APP-NVUE */\n\t\t\ttransform: scale(0.6) translate(50%, -50%);\n\t\t\t/* #endif */\n\n\t\t\t&--mini {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t}\n\n\t\t\t&--medium {\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\n\t\t\t}\n\n\t\t\t&--large {\n\t\t\t\twidth: 25px;\n\t\t\t\theight: 25px;\n\t\t\t}\n\t\t}\n\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-td/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-td/u-td.vue",
    "content": "<template>\n\t<view class=\"u-td\">\n\t\t\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/** \n\t * Td 表格中的单元格\n\t * @description \n\t * @tutorial url\n\t * @property {String | Number} \n\t * @event {Function}\n\t * @example\n\t */\n\texport default {\n\t\tname: 'u-td',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-text/props.js",
    "content": "export default {\n    props: {\n        // 主题颜色\n        type: {\n            type: String,\n            default: uni.$u.props.text.type\n        },\n        // 是否显示\n        show: {\n            type: Boolean,\n            default: uni.$u.props.text.show\n        },\n        // 显示的值\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.text.text\n        },\n        // 前置图标\n        prefixIcon: {\n            type: String,\n            default: uni.$u.props.text.prefixIcon\n        },\n        // 后置图标\n        suffixIcon: {\n            type: String,\n            default: uni.$u.props.text.suffixIcon\n        },\n        // 文本处理的匹配模式\n        // text-普通文本，price-价格，phone-手机号，name-姓名，date-日期，link-超链接\n        mode: {\n            type: String,\n            default: uni.$u.props.text.mode\n        },\n        // mode=link下，配置的链接\n        href: {\n            type: String,\n            default: uni.$u.props.text.href\n        },\n        // 格式化规则\n        format: {\n            type: [String, Function],\n            default: uni.$u.props.text.format\n        },\n        // mode=phone时，点击文本是否拨打电话\n        call: {\n            type: Boolean,\n            default: uni.$u.props.text.call\n        },\n        // 小程序的打开方式\n        openType: {\n            type: String,\n            default: uni.$u.props.text.openType\n        },\n        // 是否粗体，默认normal\n        bold: {\n            type: Boolean,\n            default: uni.$u.props.text.bold\n        },\n        // 是否块状\n        block: {\n            type: Boolean,\n            default: uni.$u.props.text.block\n        },\n        // 文本显示的行数，如果设置，超出此行数，将会显示省略号\n        lines: {\n            type: [String, Number],\n            default: uni.$u.props.text.lines\n        },\n        // 文本颜色\n        color: {\n            type: String,\n            default: uni.$u.props.text.color\n        },\n        // 字体大小\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.text.size\n        },\n        // 图标的样式\n        iconStyle: {\n            type: [Object, String],\n            default: uni.$u.props.text.iconStyle\n        },\n        // 文字装饰，下划线，中划线等，可选值 none|underline|line-through\n        decoration: {\n            tepe: String,\n            default: uni.$u.props.text.decoration\n        },\n        // 外边距，对象、字符串，数值形式均可\n        margin: {\n            type: [Object, String, Number],\n            default: uni.$u.props.text.margin\n        },\n        // 文本行高\n        lineHeight: {\n            type: [String, Number],\n            default: uni.$u.props.text.lineHeight\n        },\n        // 文本对齐方式，可选值left|center|right\n        align: {\n            type: String,\n            default: uni.$u.props.text.align\n        },\n        // 文字换行，可选值break-word|normal|anywhere\n        wordWrap: {\n            type: String,\n            default: uni.$u.props.text.wordWrap\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-text/u-text.vue",
    "content": "<template>\n    <view\n        class=\"u-text\"\n        :class=\"[]\"\n        v-if=\"show\"\n        :style=\"{\n            margin: margin,\n\t\t\tjustifyContent: align === 'left' ? 'flex-start' : align === 'center' ? 'center' : 'flex-end'\n        }\"\n        @tap=\"clickHandler\"\n    >\n        <text\n            :class=\"['u-text__price', type && `u-text__value--${type}`]\"\n            v-if=\"mode === 'price'\"\n            :style=\"[valueStyle]\"\n            >￥</text\n        >\n        <view class=\"u-text__prefix-icon\" v-if=\"prefixIcon\">\n            <u-icon\n                :name=\"prefixIcon\"\n                :customStyle=\"$u.addStyle(iconStyle)\"\n            ></u-icon>\n        </view>\n        <u-link\n            v-if=\"mode === 'link'\"\n            :text=\"value\"\n            :href=\"href\"\n            underLine\n        ></u-link>\n        <template v-else-if=\"openType && isMp\">\n            <button\n                class=\"u-reset-button u-text__value\"\n                :style=\"[valueStyle]\"\n                :data-index=\"index\"\n                :openType=\"openType\"\n                @getuserinfo=\"onGetUserInfo\"\n                @contact=\"onContact\"\n                @getphonenumber=\"onGetPhoneNumber\"\n                @error=\"onError\"\n                @launchapp=\"onLaunchApp\"\n                @opensetting=\"onOpenSetting\"\n                :lang=\"lang\"\n                :session-from=\"sessionFrom\"\n                :send-message-title=\"sendMessageTitle\"\n                :send-message-path=\"sendMessagePath\"\n                :send-message-img=\"sendMessageImg\"\n                :show-message-card=\"showMessageCard\"\n                :app-parameter=\"appParameter\"\n            >\n                {{ value }}\n            </button>\n        </template>\n        <text\n            v-else\n            class=\"u-text__value\"\n            :style=\"[valueStyle]\"\n            :class=\"[\n                type && `u-text__value--${type}`,\n                lines && `u-line-${lines}`\n            ]\"\n            >{{ value }}</text\n        >\n        <view class=\"u-text__suffix-icon\" v-if=\"suffixIcon\">\n            <u-icon\n                :name=\"suffixIcon\"\n                :customStyle=\"$u.addStyle(iconStyle)\"\n            ></u-icon>\n        </view>\n    </view>\n</template>\n\n<script>\nimport value from './value.js'\nimport button from '../../libs/mixin/button.js'\nimport openType from '../../libs/mixin/openType.js'\nimport props from './props.js'\n/**\n * Text 文本\n * @description 此组件集成了文本类在项目中的常用功能，包括状态，拨打电话，格式化日期，*替换，超链接...等功能。 您大可不必在使用特殊文本时自己定义，text组件几乎涵盖您能使用的大部分场景。\n * @tutorial https://www.uviewui.com/components/loading.html\n * @property {String} \t\t\t\t\ttype\t\t主题颜色\n * @property {Boolean} \t\t\t\t\tshow\t\t是否显示（默认 true ）\n * @property {String | Number}\t\t\ttext\t\t显示的值\n * @property {String}\t\t\t\t\tprefixIcon\t前置图标\n * @property {String} \t\t\t\t\tsuffixIcon\t后置图标\n * @property {String} \t\t\t\t\tmode\t\t文本处理的匹配模式 text-普通文本，price-价格，phone-手机号，name-姓名，date-日期，link-超链接\n * @property {String} \t\t\t\t\thref\t\tmode=link下，配置的链接\n * @property {String | Function} \t\tformat\t\t格式化规则\n * @property {Boolean} \t\t\t\t\tcall\t\tmode=phone时，点击文本是否拨打电话（默认 false ）\n * @property {String} \t\t\t\t\topenType\t小程序的打开方式\n * @property {Boolean} \t\t\t\t\tbold\t\t是否粗体，默认normal（默认 false ）\n * @property {Boolean} \t\t\t\t\tblock\t\t是否块状（默认 false ）\n * @property {String | Number} \t\t\tlines\t\t文本显示的行数，如果设置，超出此行数，将会显示省略号\n * @property {String} \t\t\t\t\tcolor\t\t文本颜色（默认 '#303133' ）\n * @property {String | Number} \t\t\tsize\t\t字体大小（默认 15 ）\n * @property {Object | String} \t\t\ticonStyle\t图标的样式 （默认 {fontSize: '15px'} ）\n * @property {String} \t\t\t\t\tdecoration\t文字装饰，下划线，中划线等，可选值 none|underline|line-through（默认 'none' ）\n * @property {Object | String | Number}\tmargin\t\t外边距，对象、字符串，数值形式均可（默认 0 ）\n * @property {String | Number} \t\t\tlineHeight\t文本行高\n * @property {String} \t\t\t\t\talign\t\t文本对齐方式，可选值left|center|right（默认 'left' ）\n * @property {String} \t\t\t\t\twordWrap\t文字换行，可选值break-word|normal|anywhere（默认 'normal' ）\n * @event {Function} click  点击触发事件\n * @example <u--text text=\"我用十年青春,赴你最后之约\"></u--text>\n */\nexport default {\n    name: 'u--text',\n    // #ifdef MP\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, value, button, openType, props],\n    // #endif\n    // #ifndef MP\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, value, props],\n    // #endif\n    computed: {\n        valueStyle() {\n            const style = {\n                textDecoration: this.decoration,\n                fontWeight: this.bold ? 'bold' : 'normal',\n                wordWrap: this.wordWrap,\n                fontSize: uni.$u.addUnit(this.size)\n            }\n            !this.type && (style.color = this.color)\n            this.isNvue && this.lines && (style.lines = this.lines)\n            this.lineHeight &&\n                (style.lineHeight = uni.$u.addUnit(this.lineHeight))\n            !this.isNvue && this.block && (style.display = 'block')\n            return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n        },\n        isNvue() {\n            let nvue = false\n            // #ifdef APP-NVUE\n            nvue = true\n            // #endif\n            return nvue\n        },\n        isMp() {\n            let mp = false\n            // #ifdef MP\n            mp = true\n            // #endif\n            return mp\n        }\n    },\n    data() {\n        return {}\n    },\n    methods: {\n        clickHandler() {\n            // 如果为手机号模式，拨打电话\n            if (this.call && this.mode === 'phone') {\n                uni.makePhoneCall({\n                    phoneNumber: this.text\n                })\n            }\n            this.$emit('click')\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../libs/css/components.scss';\n\n.u-text {\n    @include flex(row);\n    align-items: center;\n    flex-wrap: nowrap;\n    flex: 1;\n\t/* #ifndef APP-NVUE */\n\twidth: 100%;\n\t/* #endif */\n\n    &__price {\n        font-size: 14px;\n        color: $u-content-color;\n    }\n\n    &__value {\n        font-size: 14px;\n        @include flex;\n        color: $u-content-color;\n        flex-wrap: wrap;\n        // flex: 1;\n        text-overflow: ellipsis;\n        align-items: center;\n\n        &--primary {\n            color: $u-primary;\n        }\n\n        &--warning {\n            color: $u-warning;\n        }\n\n        &--success {\n            color: $u-success;\n        }\n\n        &--info {\n            color: $u-info;\n        }\n\n        &--error {\n            color: $u-error;\n        }\n\n        &--main {\n            color: $u-main-color;\n        }\n\n        &--content {\n            color: $u-content-color;\n        }\n\n        &--tips {\n            color: $u-tips-color;\n        }\n\n        &--light {\n            color: $u-light-color;\n        }\n    }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-text/value.js",
    "content": "export default {\n    computed: {\n        // 经处理后需要显示的值\n        value() {\n            const {\n                text,\n                mode,\n                format,\n                href\n            } = this\n            // 价格类型\n            if (mode === 'price') {\n                // 如果text不为金额进行提示\n                if (!/^\\d+(\\.\\d+)?$/.test(text)) {\n                    uni.$u.error('金额模式下，text参数需要为金额格式');\n                }\n                // 进行格式化，判断用户传入的format参数为正则，或者函数，如果没有传入format，则使用默认的金额格式化处理\n                if (uni.$u.test.func(format)) {\n                    // 如果用户传入的是函数，使用函数格式化\n                    return format(text)\n                }\n                // 如果format非正则，非函数，则使用默认的金额格式化方法进行操作\n                return uni.$u.priceFormat(text, 2)\n            } if (mode === 'date') {\n                // 判断是否合法的日期或者时间戳\n                !uni.$u.test.date(text) && uni.$u.error('日期模式下，text参数需要为日期或时间戳格式')\n                // 进行格式化，判断用户传入的format参数为正则，或者函数，如果没有传入format，则使用默认的格式化处理\n                if (uni.$u.test.func(format)) {\n                    // 如果用户传入的是函数，使用函数格式化\n                    return format(text)\n                } if (format) {\n                    // 如果format非正则，非函数，则使用默认的时间格式化方法进行操作\n                    return uni.$u.timeFormat(text, format)\n                }\n                // 如果没有设置format，则设置为默认的时间格式化形式\n                return uni.$u.timeFormat(text, 'yyyy-mm-dd')\n            } if (mode === 'phone') {\n                // 判断是否合法的手机号\n                // !uni.$u.test.mobile(text) && uni.$u.error('手机号模式下，text参数需要为手机号码格式')\n                if (uni.$u.test.func(format)) {\n                    // 如果用户传入的是函数，使用函数格式化\n                    return format(text)\n                } if (format === 'encrypt') {\n                    // 如果format为encrypt，则将手机号进行星号加密处理\n                    return `${text.substr(0, 3)}****${text.substr(7)}`\n                }\n                return text\n            } if (mode === 'name') {\n                // 判断是否合法的字符粗\n                !(typeof (text) === 'string') && uni.$u.error('姓名模式下，text参数需要为字符串格式')\n                if (uni.$u.test.func(format)) {\n                    // 如果用户传入的是函数，使用函数格式化\n                    return format(text)\n                } if (format === 'encrypt') {\n                    // 如果format为encrypt，则将姓名进行星号加密处理\n                    return this.formatName(text)\n                }\n                return text\n            } if (mode === 'link') {\n                // 判断是否合法的字符粗\n                !uni.$u.test.url(href) && uni.$u.error('超链接模式下，href参数需要为URL格式')\n                return text\n            }\n            return text\n        }\n    },\n    methods: {\n        // 默认的姓名脱敏规则\n        formatName(name) {\n            let value = ''\n            if (name.length === 2) {\n                value = name.substr(0, 1) + '*'\n            } else if (name.length > 2) {\n                let char = ''\n                for (let i = 0, len = name.length - 2; i < len; i++) {\n                    char += '*'\n                }\n                value = name.substr(0, 1) + char + name.substr(-1, 1)\n            } else {\n                value = name\n            }\n            return value\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-textarea/props.js",
    "content": "export default {\n\tprops: {\n\t\t// 输入框的内容\n\t\tvalue: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.textarea.value\n\t\t},\n\t\t// 输入框为空时占位符\n\t\tplaceholder: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.textarea.placeholder\n\t\t},\n\t\t// 指定placeholder的样式类，注意页面或组件的style中写了scoped时，需要在类名前写/deep/\n\t\tplaceholderClass: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.input.placeholderClass\n\t\t},\n\t\t// 指定placeholder的样式\n\t\tplaceholderStyle: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: uni.$u.props.input.placeholderStyle\n\t\t},\n\t\t// 输入框高度\n\t\theight: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.textarea.height\n\t\t},\n\t\t// 设置键盘右下角按钮的文字，仅微信小程序，App-vue和H5有效\n\t\tconfirmType: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.textarea.confirmType\n\t\t},\n\t\t// 是否禁用\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.disabled\n\t\t},\n\t\t// 是否显示统计字数\n\t\tcount: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.count\n\t\t},\n\t\t// 是否自动获取焦点，nvue不支持，H5取决于浏览器的实现\n\t\tfocus: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.focus\n\t\t},\n\t\t// 是否自动增加高度\n\t\tautoHeight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.autoHeight\n\t\t},\n\t\t// 如果textarea是在一个position:fixed的区域，需要显示指定属性fixed为true\n\t\tfixed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.fixed\n\t\t},\n\t\t// 指定光标与键盘的距离\n\t\tcursorSpacing: {\n\t\t\ttype: Number,\n\t\t\tdefault: uni.$u.props.textarea.cursorSpacing\n\t\t},\n\t\t// 指定focus时的光标位置\n\t\tcursor: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.textarea.cursor\n\t\t},\n\t\t// 是否显示键盘上方带有”完成“按钮那一栏，\n\t\tshowConfirmBar: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.showConfirmBar\n\t\t},\n\t\t// 光标起始位置，自动聚焦时有效，需与selection-end搭配使用\n\t\tselectionStart: {\n\t\t\ttype: Number,\n\t\t\tdefault: uni.$u.props.textarea.selectionStart\n\t\t},\n\t\t// 光标结束位置，自动聚焦时有效，需与selection-start搭配使用\n\t\tselectionEnd: {\n\t\t\ttype: Number,\n\t\t\tdefault: uni.$u.props.textarea.selectionEnd\n\t\t},\n\t\t// 键盘弹起时，是否自动上推页面\n\t\tadjustPosition: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.adjustPosition\n\t\t},\n\t\t// 是否去掉 iOS 下的默认内边距，只微信小程序有效\n\t\tdisableDefaultPadding: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.disableDefaultPadding\n\t\t},\n\t\t// focus时，点击页面的时候不收起键盘，只微信小程序有效\n\t\tholdKeyboard: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: uni.$u.props.textarea.holdKeyboard\n\t\t},\n\t\t// 最大输入长度，设置为 -1 的时候不限制最大长度\n\t\tmaxlength: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: uni.$u.props.textarea.maxlength\n\t\t},\n\t\t// 边框类型，surround-四周边框，bottom-底部边框\n\t\tborder: {\n\t\t\ttype: String,\n\t\t\tdefault: uni.$u.props.textarea.border\n\t\t},\n\t\t// 用于处理或者过滤输入框内容的方法\n\t\tformatter: {\n\t\t\ttype: [Function, null],\n\t\t\tdefault: uni.$u.props.textarea.formatter\n\t\t},\n\t\t// 是否忽略组件内对文本合成系统事件的处理\n\t\tignoreCompositionEvent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-textarea/u-textarea.vue",
    "content": "<template>\n    <view class=\"u-textarea\" :class=\"textareaClass\" :style=\"[textareaStyle]\">\n        <textarea\n            class=\"u-textarea__field\"\n            :value=\"innerValue\"\n            :style=\"{ height: $u.addUnit(height) }\"\n            :placeholder=\"placeholder\"\n            :placeholder-style=\"$u.addStyle(placeholderStyle, 'string')\"\n            :placeholder-class=\"placeholderClass\"\n            :disabled=\"disabled\"\n            :focus=\"focus\"\n            :autoHeight=\"autoHeight\"\n            :fixed=\"fixed\"\n            :cursorSpacing=\"cursorSpacing\"\n            :cursor=\"cursor\"\n            :showConfirmBar=\"showConfirmBar\"\n            :selectionStart=\"selectionStart\"\n            :selectionEnd=\"selectionEnd\"\n            :adjustPosition=\"adjustPosition\"\n            :disableDefaultPadding=\"disableDefaultPadding\"\n            :holdKeyboard=\"holdKeyboard\"\n            :maxlength=\"maxlength\"\n            :confirmType=\"confirmType\"\n            :ignoreCompositionEvent=\"ignoreCompositionEvent\"\n            @focus=\"onFocus\"\n            @blur=\"onBlur\"\n            @linechange=\"onLinechange\"\n            @input=\"onInput\"\n            @confirm=\"onConfirm\"\n            @keyboardheightchange=\"onKeyboardheightchange\"\n        ></textarea>\n        <text\n            class=\"u-textarea__count\"\n            :style=\"{\n                'background-color': disabled ? 'transparent' : '#fff',\n            }\"\n            v-if=\"count\"\n            >{{ innerValue.length }}/{{ maxlength }}</text\n        >\n    </view>\n</template>\n\n<script>\nimport props from \"./props.js\";\n/**\n * Textarea 文本域\n * @description 文本域此组件满足了可能出现的表单信息补充，编辑等实际逻辑的功能，内置了字数校验等\n * @tutorial https://www.uviewui.com/components/textarea.html\n *\n * @property {String | Number} \t\tvalue\t\t\t\t\t输入框的内容\n * @property {String | Number}\t\tplaceholder\t\t\t\t输入框为空时占位符\n * @property {String}\t\t\t    placeholderClass\t\t指定placeholder的样式类，注意页面或组件的style中写了scoped时，需要在类名前写/deep/ （ 默认 'input-placeholder' ）\n * @property {String | Object}\t    placeholderStyle\t\t指定placeholder的样式，字符串/对象形式，如\"color: red;\"\n * @property {String | Number}\t\theight\t\t\t\t\t输入框高度（默认 70 ）\n * @property {String}\t\t\t\tconfirmType\t\t\t\t设置键盘右下角按钮的文字，仅微信小程序，App-vue和H5有效（默认 'done' ）\n * @property {Boolean}\t\t\t\tdisabled\t\t\t\t是否禁用（默认 false ）\n * @property {Boolean}\t\t\t\tcount\t\t\t\t\t是否显示统计字数（默认 false ）\n * @property {Boolean}\t\t\t\tfocus\t\t\t\t\t是否自动获取焦点，nvue不支持，H5取决于浏览器的实现（默认 false ）\n * @property {Boolean | Function}\tautoHeight\t\t\t\t是否自动增加高度（默认 false ）\n * @property {Boolean}\t\t\t\tfixed\t\t\t\t\t如果textarea是在一个position:fixed的区域，需要显示指定属性fixed为true（默认 false ）\n * @property {Number}\t\t\t\tcursorSpacing\t\t\t指定光标与键盘的距离（默认 0 ）\n * @property {String | Number}\t\tcursor\t\t\t\t\t指定focus时的光标位置\n * @property {Function}\t\t\t    formatter\t\t\t    内容式化函数\n * @property {Boolean}\t\t\t\tshowConfirmBar\t\t\t是否显示键盘上方带有”完成“按钮那一栏，（默认 true ）\n * @property {Number}\t\t\t\tselectionStart\t\t\t光标起始位置，自动聚焦时有效，需与selection-end搭配使用，（默认 -1 ）\n * @property {Number | Number}\t\tselectionEnd\t\t\t光标结束位置，自动聚焦时有效，需与selection-start搭配使用（默认 -1 ）\n * @property {Boolean}\t\t\t\tadjustPosition\t\t\t键盘弹起时，是否自动上推页面（默认 true ）\n * @property {Boolean | Number}\t\tdisableDefaultPadding\t是否去掉 iOS 下的默认内边距，只微信小程序有效（默认 false ）\n * @property {Boolean}\t\t\t\tholdKeyboard\t\t\tfocus时，点击页面的时候不收起键盘，只微信小程序有效（默认 false ）\n * @property {String | Number}\t\tmaxlength\t\t\t\t最大输入长度，设置为 -1 的时候不限制最大长度（默认 140 ）\n * @property {String}\t\t\t\tborder\t\t\t\t\t边框类型，surround-四周边框，none-无边框，bottom-底部边框（默认 'surround' ）\n * @property {Boolean}\t\t\t\tignoreCompositionEvent\t是否忽略组件内对文本合成系统事件的处理\n *\n * @event {Function(e)} focus\t\t\t\t\t输入框聚焦时触发，event.detail = { value, height }，height 为键盘高度\n * @event {Function(e)} blur\t\t\t\t\t输入框失去焦点时触发，event.detail = {value, cursor}\n * @event {Function(e)} linechange\t\t\t\t输入框行数变化时调用，event.detail = {height: 0, heightRpx: 0, lineCount: 0}\n * @event {Function(e)} input\t\t\t\t\t当键盘输入时，触发 input 事件\n * @event {Function(e)} confirm\t\t\t\t\t点击完成时， 触发 confirm 事件\n * @event {Function(e)} keyboardheightchange\t键盘高度发生变化的时候触发此事件\n * @example <u--textarea v-model=\"value1\" placeholder=\"请输入内容\" ></u--textarea>\n */\nexport default {\n    name: \"u-textarea\",\n    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\tdata() {\n\t\treturn {\n\t\t\t// 输入框的值\n\t\t\tinnerValue: \"\",\n\t\t\t// 是否处于获得焦点状态\n\t\t\tfocused: false,\n\t\t\t// value是否第一次变化，在watch中，由于加入immediate属性，会在第一次触发，此时不应该认为value发生了变化\n\t\t\tfirstChange: true,\n\t\t\t// value绑定值的变化是由内部还是外部引起的\n\t\t\tchangeFromInner: false,\n\t\t\t// 过滤处理方法\n\t\t\tinnerFormatter: value => value\n\t\t}\n\t},\n\twatch: {\n\t    value: {\n\t        immediate: true,\n\t        handler(newVal, oldVal) {\n\t            this.innerValue = newVal;\n\t            /* #ifdef H5 */\n\t            // 在H5中，外部value变化后，修改input中的值，不会触发@input事件，此时手动调用值变化方法\n\t            if (\n\t                this.firstChange === false &&\n\t                this.changeFromInner === false\n\t            ) {\n\t                this.valueChange();\n\t            }\n\t            /* #endif */\n\t            this.firstChange = false;\n\t            // 重置changeFromInner的值为false，标识下一次引起默认为外部引起的\n\t            this.changeFromInner = false;\n\t        },\n\t    },\n\t},\n    computed: {\n        // 组件的类名\n        textareaClass() {\n            let classes = [],\n                { border, disabled, shape } = this;\n            border === \"surround\" &&\n                (classes = classes.concat([\"u-border\", \"u-textarea--radius\"]));\n            border === \"bottom\" &&\n                (classes = classes.concat([\n                    \"u-border-bottom\",\n                    \"u-textarea--no-radius\",\n                ]));\n            disabled && classes.push(\"u-textarea--disabled\");\n            return classes.join(\" \");\n        },\n        // 组件的样式\n        textareaStyle() {\n            const style = {};\n            // #ifdef APP-NVUE\n            // 由于textarea在安卓nvue上的差异性，需要额外再调整其内边距\n            if (uni.$u.os() === \"android\") {\n                style.paddingTop = \"6px\";\n                style.paddingLeft = \"9px\";\n                style.paddingBottom = \"3px\";\n                style.paddingRight = \"6px\";\n            }\n            // #endif\n            return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));\n        },\n    },\n    methods: {\n\t\t// 在微信小程序中，不支持将函数当做props参数，故只能通过ref形式调用\n\t\tsetFormatter(e) {\n\t\t\tthis.innerFormatter = e\n\t\t},\n        onFocus(e) {\n            this.$emit(\"focus\", e);\n        },\n        onBlur(e) {\n            this.$emit(\"blur\", e);\n            // 尝试调用u-form的验证方法\n            uni.$u.formValidate(this, \"blur\");\n        },\n        onLinechange(e) {\n            this.$emit(\"linechange\", e);\n        },\n        onInput(e) {\n\t\t\tlet { value = \"\" } = e.detail || {};\n\t\t\t// 格式化过滤方法\n\t\t\tconst formatter = this.formatter || this.innerFormatter\n\t\t\tconst formatValue = formatter(value)\n\t\t\t// 为了避免props的单向数据流特性，需要先将innerValue值设置为当前值，再在$nextTick中重新赋予设置后的值才有效\n\t\t\tthis.innerValue = value\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.innerValue = formatValue;\n\t\t\t\tthis.valueChange();\n\t\t\t})\n        },\n\t\t// 内容发生变化，进行处理\n\t\tvalueChange() {\n\t\t    const value = this.innerValue;\n\t\t    this.$nextTick(() => {\n\t\t        this.$emit(\"input\", value);\n\t\t        // 标识value值的变化是由内部引起的\n\t\t        this.changeFromInner = true;\n\t\t        this.$emit(\"change\", value);\n\t\t        // 尝试调用u-form的验证方法\n\t\t        uni.$u.formValidate(this, \"change\");\n\t\t    });\n\t\t},\n        onConfirm(e) {\n            this.$emit(\"confirm\", e);\n        },\n        onKeyboardheightchange(e) {\n            this.$emit(\"keyboardheightchange\", e);\n        },\n    },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../libs/css/components.scss\";\n\n.u-textarea {\n    border-radius: 4px;\n    background-color: #fff;\n    position: relative;\n    @include flex;\n    flex: 1;\n\tpadding: 9px;\n\n    &--radius {\n        border-radius: 4px;\n    }\n\n    &--no-radius {\n        border-radius: 0;\n    }\n\n    &--disabled {\n        background-color: #f5f7fa;\n    }\n\n    &__field {\n        flex: 1;\n        font-size: 15px;\n        color: $u-content-color;\n\t\twidth: 100%;\n    }\n\n    &__count {\n        position: absolute;\n        right: 5px;\n        bottom: 2px;\n        font-size: 12px;\n        color: $u-tips-color;\n        background-color: #ffffff;\n        padding: 1px 4px;\n    }\n}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-toast/u-toast.vue",
    "content": "<template>\n\t<view class=\"u-toast\">\n\t\t<u-overlay\n\t\t\t:show=\"isShow\"\n\t\t\t:custom-style=\"overlayStyle\"\n\t\t>\n\t\t\t<view\n\t\t\t\tclass=\"u-toast__content\"\n\t\t\t\t:style=\"[contentStyle]\"\n\t\t\t\t:class=\"['u-type-' + tmpConfig.type, (tmpConfig.type === 'loading' || tmpConfig.loading) ?  'u-toast__content--loading' : '']\"\n\t\t\t>\n\t\t\t\t<u-loading-icon\n\t\t\t\t\tv-if=\"tmpConfig.type === 'loading'\"\n\t\t\t\t\tmode=\"circle\"\n\t\t\t\t\tcolor=\"rgb(255, 255, 255)\"\n\t\t\t\t\tinactiveColor=\"rgb(120, 120, 120)\"\n\t\t\t\t\tsize=\"25\"\n\t\t\t\t></u-loading-icon>\n\t\t\t\t<u-icon\n\t\t\t\t\tv-else-if=\"tmpConfig.type !== 'defalut' && iconName\"\n\t\t\t\t\t:name=\"iconName\"\n\t\t\t\t\tsize=\"17\"\n\t\t\t\t\t:color=\"tmpConfig.type\"\n\t\t\t\t\t:customStyle=\"iconStyle\"\n\t\t\t\t></u-icon>\n\t\t\t\t<u-gap\n\t\t\t\t\tv-if=\"tmpConfig.type === 'loading' || tmpConfig.loading\"\n\t\t\t\t\theight=\"12\"\n\t\t\t\t\tbgColor=\"transparent\"\n\t\t\t\t></u-gap>\n\t\t\t\t<text\n\t\t\t\t\tclass=\"u-toast__content__text\"\n\t\t\t\t\t:class=\"['u-toast__content__text--' + tmpConfig.type]\"\n\t\t\t\t\tstyle=\"max-width: 400rpx;\"\n\t\t\t\t>{{ tmpConfig.message }}</text>\n\t\t\t</view>\n\t\t</u-overlay>\n\t</view>\n</template>\n\n<script>\n\t/**\n\t * toast 消息提示\n\t * @description 此组件表现形式类似uni的uni.showToastAPI，但也有不同的地方。\n\t * @tutorial https://www.uviewui.com/components/toast.html\n\t * @property {String | Number}\tzIndex\t\ttoast展示时的zIndex值 (默认 10090 )\n\t * @property {Boolean}\t\t\tloading\t\t是否加载中 （默认 false ）\n\t * @property {String | Number}\tmessage\t\t显示的文字内容\n\t * @property {String}\t\t\ticon\t\t图标，或者绝对路径的图片\n\t * @property {String}\t\t\ttype\t\t主题类型 （默认 default）\n\t * @property {Boolean}\t\t\tshow\t\t是否显示该组件 （默认 false）\n\t * @property {Boolean}\t\t\toverlay\t\t是否显示透明遮罩，防止点击穿透 （默认 false ）\n\t * @property {String}\t\t\tposition\t位置 （默认 'center' ）\n\t * @property {Object}\t\t\tparams\t\t跳转的参数 \n\t * @property {String | Number}  duration\t展示时间，单位ms （默认 2000 ）\n\t * @property {Boolean}\t\t\tisTab\t\t是否返回的为tab页面 （默认 false ）\n\t * @property {String}\t\t\turl\t\t\ttoast消失后是否跳转页面，有则跳转，优先级高于back参数 \n\t * @property {Function}\t\t\tcomplete\t执行完后的回调函数 \n\t * @property {Boolean}\t\t\tback\t\t结束toast是否自动返回上一页 （默认 false ）\n\t * @property {Object}\t\t\tcustomStyle\t组件的样式，对象形式\n\t * @event {Function} show 显示toast，如需一进入页面就显示toast，请在onReady生命周期调用\n\t * @example <u-toast ref=\"uToast\" />\n\t */\n\texport default {\n\t\tname: 'u-toast',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tisShow: false,\n\t\t\t\ttimer: null, // 定时器\n\t\t\t\tconfig: {\n\t\t\t\t\tmessage: '', // 显示文本\n\t\t\t\t\ttype: '', // 主题类型，primary，success，error，warning，black\n\t\t\t\t\tduration: 2000, // 显示的时间，毫秒\n\t\t\t\t\ticon: true, // 显示的图标\n\t\t\t\t\tposition: 'center', // toast出现的位置\n\t\t\t\t\tcomplete: null, // 执行完后的回调函数\n\t\t\t\t\toverlay: false, // 是否防止触摸穿透\n\t\t\t\t\tloading: false, // 是否加载中状态\n\t\t\t\t},\n\t\t\t\ttmpConfig: {}, // 将用户配置和内置配置合并后的临时配置变量\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\ticonName() {\n\t\t\t\t// 只有不为none，并且type为error|warning|succes|info时候，才显示图标\n\t\t\t\tif(!this.tmpConfig.icon || this.tmpConfig.icon == 'none') {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\tif (['error', 'warning', 'success', 'primary'].includes(this.tmpConfig.type)) {\n\t\t\t\t\treturn uni.$u.type2icon(this.tmpConfig.type)\n\t\t\t\t} else {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\t\t\t},\n\t\t\toverlayStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tdisplay: 'flex'\n\t\t\t\t}\n\t\t\t\t// 将遮罩设置为100%透明度，避免出现灰色背景\n\t\t\t\tstyle.backgroundColor = 'rgba(0, 0, 0, 0)'\n\t\t\t\treturn style\n\t\t\t},\n\t\t\ticonStyle() {\n\t\t\t\tconst style = {}\n\t\t\t\t// 图标需要一个右边距，以跟右边的文字有隔开的距离\n\t\t\t\tstyle.marginRight = '4px'\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// iOSAPP下，图标有1px的向下偏移，这里进行修正\n\t\t\t\tif (uni.$u.os() === 'ios') {\n\t\t\t\t\tstyle.marginTop = '-1px'\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t\treturn style\n\t\t\t},\n\t\t\tloadingIconColor() {\n\t\t\t\tlet color = 'rgb(255, 255, 255)'\n\t\t\t\tif (['error', 'warning', 'success', 'primary'].includes(this.tmpConfig.type)) {\n\t\t\t\t\t// loading-icon组件内部会对color参数进行一个透明度处理，该方法要求传入的颜色值\n\t\t\t\t\t// 必须为rgb格式的，所以这里做一个处理\n\t\t\t\t\tcolor = uni.$u.hexToRgb(uni.$u.color[this.tmpConfig.type])\n\t\t\t\t}\n\t\t\t\treturn color\n\t\t\t},\n\t\t\t// 内容盒子的样式\n\t\t\tcontentStyle() {\n\t\t\t\tconst windowHeight = uni.$u.sys().windowHeight, style = {}\n\t\t\t\tlet value = 0\n\t\t\t\t// 根据top和bottom，对Y轴进行窗体高度的百分比偏移\n\t\t\t\tif(this.tmpConfig.position === 'top') {\n\t\t\t\t\tvalue = - windowHeight * 0.25\n\t\t\t\t} else if(this.tmpConfig.position === 'bottom') {\n\t\t\t\t\tvalue = windowHeight * 0.25\n\t\t\t\t}\n\t\t\t\tstyle.transform = `translateY(${value}px)`\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tcreated() {\n\t\t\t// 通过主题的形式调用toast，批量生成方法函数\n\t\t\t['primary', 'success', 'error', 'warning', 'default', 'loading'].map(item => {\n\t\t\t\tthis[item] = message => this.show({\n\t\t\t\t\ttype: item,\n\t\t\t\t\tmessage\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tmethods: {\n\t\t\t// 显示toast组件，由父组件通过this.$refs.xxx.show(options)形式调用\n\t\t\tshow(options) {\n\t\t\t\t// 不将结果合并到this.config变量，避免多次调用u-toast，前后的配置造成混乱\n\t\t\t\tthis.tmpConfig = uni.$u.deepMerge(this.config, options)\n\t\t\t\t// 清除定时器\n\t\t\t\tthis.clearTimer()\n\t\t\t\tthis.isShow = true\n\t\t\t\tthis.timer = setTimeout(() => {\n\t\t\t\t\t// 倒计时结束，清除定时器，隐藏toast组件\n\t\t\t\t\tthis.clearTimer()\n\t\t\t\t\t// 判断是否存在callback方法，如果存在就执行\n\t\t\t\t\ttypeof(this.tmpConfig.complete) === 'function' && this.tmpConfig.complete()\n\t\t\t\t}, this.tmpConfig.duration)\n\t\t\t},\n\t\t\t// 隐藏toast组件，由父组件通过this.$refs.xxx.hide()形式调用\n\t\t\thide() {\n\t\t\t\tthis.clearTimer()\n\t\t\t},\n\t\t\tclearTimer() {\n\t\t\t\tthis.isShow = false\n\t\t\t\t// 清除定时器\n\t\t\t\tclearTimeout(this.timer)\n\t\t\t\tthis.timer = null\n\t\t\t}\n\t\t},\n\t\tbeforeDestroy() {\n\t\t\tthis.clearTimer()\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t$u-toast-color:#fff !default;\n\t$u-toast-border-radius:4px !default;\n\t$u-toast-border-background-color:#585858 !default;\n\t$u-toast-border-font-size:14px !default;\n\t$u-toast-border-padding:12px 20px !default;\n\t$u-toast-loading-border-padding: 20px 20px !default;\n\t$u-toast-content-text-color:#fff !default;\n\t$u-toast-content-text-font-size:15px !default;\n\t$u-toast-u-icon:10rpx !default;\n\t$u-toast-u-type-primary-color:$u-primary !default;\n\t$u-toast-u-type-primary-background-color:#ecf5ff !default;\n\t$u-toast-u-type-primary-border-color:rgb(215, 234, 254) !default;\n\t$u-toast-u-type-primary-border-width:1px !default;\n\t$u-toast-u-type-success-color: $u-success !default;\n\t$u-toast-u-type-success-background-color: #dbf1e1 !default;\n\t$u-toast-u-type-success-border-color: #BEF5C8 !default;\n\t$u-toast-u-type-success-border-width: 1px !default;\n\t$u-toast-u-type-error-color:$u-error !default;\n\t$u-toast-u-type-error-background-color:#fef0f0 !default;\n\t$u-toast-u-type-error-border-color:#fde2e2 !default;\n\t$u-toast-u-type-error-border-width: 1px !default;\n\t$u-toast-u-type-warning-color:$u-warning !default;\n\t$u-toast-u-type-warning-background-color:#fdf6ec !default;\n\t$u-toast-u-type-warning-border-color:#faecd8 !default;\n\t$u-toast-u-type-warning-border-width: 1px !default;\n\t$u-toast-u-type-default-color:#fff !default;\n\t$u-toast-u-type-default-background-color:#585858 !default;\n\n\t.u-toast {\n\t\t&__content {\n\t\t\t@include flex;\n\t\t\tpadding: $u-toast-border-padding;\n\t\t\tborder-radius: $u-toast-border-radius;\n\t\t\tbackground-color: $u-toast-border-background-color;\n\t\t\tcolor: $u-toast-color;\n\t\t\talign-items: center;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tmax-width: 600rpx;\n\t\t\t/* #endif */\n\t\t\tposition: relative;\n\n\t\t\t&--loading {\n\t\t\t\tflex-direction: column;\n\t\t\t\tpadding: $u-toast-loading-border-padding;\n\t\t\t}\n\n\t\t\t&__text {\n\t\t\t\tcolor: $u-toast-content-text-color;\n\t\t\t\tfont-size: $u-toast-content-text-font-size;\n\t\t\t\tline-height: $u-toast-content-text-font-size;\n\n\t\t\t\t&--default {\n\t\t\t\t\tcolor: $u-toast-content-text-color;\n\t\t\t\t}\n\n\t\t\t\t&--error {\n\t\t\t\t\tcolor: $u-error;\n\t\t\t\t}\n\n\t\t\t\t&--primary {\n\t\t\t\t\tcolor: $u-primary;\n\t\t\t\t}\n\n\t\t\t\t&--success {\n\t\t\t\t\tcolor: $u-success;\n\t\t\t\t}\n\n\t\t\t\t&--warning {\n\t\t\t\t\tcolor: $u-warning;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t.u-type-primary {\n\t\tcolor: $u-toast-u-type-primary-color;\n\t\tbackground-color: $u-toast-u-type-primary-background-color;\n\t\tborder-color: $u-toast-u-type-primary-border-color;\n\t\tborder-width: $u-toast-u-type-primary-border-width;\n\t}\n\n\t.u-type-success {\n\t\tcolor: $u-toast-u-type-success-color;\n\t\tbackground-color: $u-toast-u-type-success-background-color;\n\t\tborder-color: $u-toast-u-type-success-border-color;\n\t\tborder-width: 1px;\n\t}\n\n\t.u-type-error {\n\t\tcolor: $u-toast-u-type-error-color;\n\t\tbackground-color: $u-toast-u-type-error-background-color;\n\t\tborder-color: $u-toast-u-type-error-border-color;\n\t\tborder-width: $u-toast-u-type-error-border-width;\n\t}\n\n\t.u-type-warning {\n\t\tcolor: $u-toast-u-type-warning-color;\n\t\tbackground-color: $u-toast-u-type-warning-background-color;\n\t\tborder-color: $u-toast-u-type-warning-border-color;\n\t\tborder-width: 1px;\n\t}\n\n\t.u-type-default {\n\t\tcolor: $u-toast-u-type-default-color;\n\t\tbackground-color: $u-toast-u-type-default-background-color;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-toolbar/props.js",
    "content": "export default {\n    props: {\n        // 是否展示工具条\n        show: {\n            type: Boolean,\n            default: uni.$u.props.toolbar.show\n        },\n        // 取消按钮的文字\n        cancelText: {\n            type: String,\n            default: uni.$u.props.toolbar.cancelText\n        },\n        // 确认按钮的文字\n        confirmText: {\n            type: String,\n            default: uni.$u.props.toolbar.confirmText\n        },\n        // 取消按钮的颜色\n        cancelColor: {\n            type: String,\n            default: uni.$u.props.toolbar.cancelColor\n        },\n        // 确认按钮的颜色\n        confirmColor: {\n            type: String,\n            default: uni.$u.props.toolbar.confirmColor\n        },\n        // 标题文字\n        title: {\n            type: String,\n            default: uni.$u.props.toolbar.title\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-toolbar\"\n\t\t@touchmove.stop.prevent=\"noop\"\n\t\tv-if=\"show\"\n\t>\n\t\t<view\n\t\t\tclass=\"u-toolbar__cancel__wrapper\"\n\t\t\thover-class=\"u-hover-class\"\n\t\t>\n\t\t\t<text\n\t\t\t\tclass=\"u-toolbar__wrapper__cancel\"\n\t\t\t\t@tap=\"cancel\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tcolor: cancelColor\n\t\t\t\t}\"\n\t\t\t>{{ cancelText }}</text>\n\t\t</view>\n\t\t<text\n\t\t\tclass=\"u-toolbar__title u-line-1\"\n\t\t\tv-if=\"title\"\n\t\t>{{ title }}</text>\n\t\t<view\n\t\t\tclass=\"u-toolbar__confirm__wrapper\"\n\t\t\thover-class=\"u-hover-class\"\n\t\t>\n\t\t\t<text\n\t\t\t\tclass=\"u-toolbar__wrapper__confirm\"\n\t\t\t\t@tap=\"confirm\"\n\t\t\t\t:style=\"{\n\t\t\t\tcolor: confirmColor\n\t\t\t}\"\n\t\t\t>{{ confirmText }}</text>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Toolbar 工具条\n\t * @description \n\t * @tutorial https://www.uviewui.com/components/toolbar.html\n\t * @property {Boolean}\tshow\t\t\t是否展示工具条（默认 true ）\n\t * @property {String}\tcancelText\t\t取消按钮的文字（默认 '取消' ）\n\t * @property {String}\tconfirmText\t\t确认按钮的文字（默认 '确认' ）\n\t * @property {String}\tcancelColor\t\t取消按钮的颜色（默认 '#909193' ）\n\t * @property {String}\tconfirmColor\t确认按钮的颜色（默认 '#3c9cff' ）\n\t * @property {String}\ttitle\t\t\t标题文字\n\t * @event {Function} \n\t * @example \n\t */\n\texport default {\n\t\tname: 'u-toolbar',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tmethods: {\n\t\t\t// 点击取消按钮\n\t\t\tcancel() {\n\t\t\t\tthis.$emit('cancel')\n\t\t\t},\n\t\t\t// 点击确定按钮\n\t\t\tconfirm() {\n\t\t\t\tthis.$emit('confirm')\n\t\t\t}\n\t\t},\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-toolbar {\n\t\theight: 42px;\n\t\t@include flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\n\t\t&__wrapper {\n\t\t\t&__cancel {\n\t\t\t\tcolor: $u-tips-color;\n\t\t\t\tfont-size: 15px;\n\t\t\t\tpadding: 0 15px;\n\t\t\t}\n\t\t}\n\n\t\t&__title {\n\t\t\tcolor: $u-main-color;\n\t\t\tpadding: 0 60rpx;\n\t\t\tfont-size: 16px;\n\t\t\tflex: 1;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t&__wrapper {\n\t\t\t&__confirm {\n\t\t\t\tcolor: $u-primary;\n\t\t\t\tfont-size: 15px;\n\t\t\t\tpadding: 0 15px;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tooltip/props.js",
    "content": "export default {\n    props: {\n        // 需要显示的提示文字\n        text: {\n            type: [String, Number],\n            default: uni.$u.props.tooltip.text\n        },\n        // 点击复制按钮时，复制的文本，为空则使用text值\n        copyText: {\n            type: [String, Number],\n            default: uni.$u.props.tooltip.copyText\n        },\n        // 文本大小\n        size: {\n            type: [String, Number],\n            default: uni.$u.props.tooltip.size\n        },\n        // 字体颜色\n        color: {\n            type: String,\n            default: uni.$u.props.tooltip.color\n        },\n        // 弹出提示框时，文本的背景色\n        bgColor: {\n            type: String,\n            default: uni.$u.props.tooltip.bgColor\n        },\n        // 弹出提示的方向，top-上方，bottom-下方\n        direction: {\n            type: String,\n            default: uni.$u.props.tooltip.direction\n        },\n        // 弹出提示的z-index，nvue无效\n        zIndex: {\n            type: [String, Number],\n            default: uni.$u.props.tooltip.zIndex\n        },\n        // 是否显示复制按钮\n        showCopy: {\n            type: Boolean,\n            default: uni.$u.props.tooltip.showCopy\n        },\n        // 扩展的按钮组\n        buttons: {\n            type: Array,\n            default: uni.$u.props.tooltip.buttons\n        },\n        // 是否显示透明遮罩以防止触摸穿透\n        overlay: {\n            type: Boolean,\n            default: uni.$u.props.tooltip.overlay\n        },\n        // 是否显示复制成功或者失败的toast\n        showToast: {\n            type: Boolean,\n            default: uni.$u.props.tooltip.showToast\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue",
    "content": "<template>\n\t<view\n\t\tclass=\"u-tooltip\"\n\t\t:style=\"[$u.addStyle(customStyle)]\"\n\t>\n\t\t<u-overlay\n\t\t\t:show=\"showTooltip && tooltipTop !== -10000 && overlay\"\n\t\t\tcustomStyle=\"backgroundColor: rgba(0, 0, 0, 0)\"\n\t\t\t@click=\"overlayClickHandler\"\n\t\t></u-overlay>\n\t\t<view class=\"u-tooltip__wrapper\">\n\t\t\t<text\n\t\t\t\tclass=\"u-tooltip__wrapper__text\"\n\t\t\t\t:id=\"textId\"\n\t\t\t\t:ref=\"textId\"\n\t\t\t\t:userSelect=\"false\"\n\t\t\t\t:selectable=\"false\"\n\t\t\t\t@longpress.stop=\"longpressHandler\"\n\t\t\t\t:style=\"{\n\t\t\t\t\tcolor: color,\n\t\t\t\t\tbackgroundColor: bgColor && showTooltip && tooltipTop !== -10000 ? bgColor : 'transparent'\n\t\t\t\t}\"\n\t\t\t>{{ text }}</text>\n\t\t\t<u-transition\n\t\t\t\tmode=\"fade\"\n\t\t\t\t:show=\"showTooltip\"\n\t\t\t\tduration=\"300\"\n\t\t\t\t:customStyle=\"{\n\t\t\t\t\tposition: 'absolute', \n\t\t\t\t\ttop: $u.addUnit(tooltipTop),\n\t\t\t\t\tzIndex: zIndex,\n\t\t\t\t\t...tooltipStyle\n\t\t\t\t}\"\n\t\t\t>\n\t\t\t\t<view\n\t\t\t\t\tclass=\"u-tooltip__wrapper__popup\"\n\t\t\t\t\t:id=\"tooltipId\"\n\t\t\t\t\t:ref=\"tooltipId\"\n\t\t\t\t>\n\t\t\t\t\t<view\n\t\t\t\t\t\tclass=\"u-tooltip__wrapper__popup__indicator\"\n\t\t\t\t\t\thover-class=\"u-tooltip__wrapper__popup__indicator--hover\"\n\t\t\t\t\t\tv-if=\"showCopy || buttons.length\"\n\t\t\t\t\t\t:style=\"[indicatorStyle, {\n\t\t\t\t\t\t\twidth: $u.addUnit(indicatorWidth),\n\t\t\t\t\t\t\theight: $u.addUnit(indicatorWidth),\n\t\t\t\t\t\t}]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- 由于nvue不支持三角形绘制，这里就做一个四方形，再旋转45deg，得到露出的一个三角 -->\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"u-tooltip__wrapper__popup__list\">\n\t\t\t\t\t\t<view\n\t\t\t\t\t\t\tv-if=\"showCopy\"\n\t\t\t\t\t\t\tclass=\"u-tooltip__wrapper__popup__list__btn\"\n\t\t\t\t\t\t\thover-class=\"u-tooltip__wrapper__popup__list__btn--hover\"\n\t\t\t\t\t\t\t@tap=\"setClipboardData\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\tclass=\"u-tooltip__wrapper__popup__list__btn__text\"\n\t\t\t\t\t\t\t>复制</text>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<u-line\n\t\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\t\tcolor=\"#8d8e90\"\n\t\t\t\t\t\t\tv-if=\"showCopy && buttons.length > 0\"\n\t\t\t\t\t\t\tlength=\"18\"\n\t\t\t\t\t\t></u-line>\n\t\t\t\t\t\t<block v-for=\"(item , index) in buttons\" :key=\"index\">\n\t\t\t\t\t\t\t<view\n\t\t\t\t\t\t\t\tclass=\"u-tooltip__wrapper__popup__list__btn\"\n\t\t\t\t\t\t\t\thover-class=\"u-tooltip__wrapper__popup__list__btn--hover\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\tclass=\"u-tooltip__wrapper__popup__list__btn__text\"\n\t\t\t\t\t\t\t\t\t@tap=\"btnClickHandler(index)\"\n\t\t\t\t\t\t\t\t>{{ item }}</text>\n\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t<u-line\n\t\t\t\t\t\t\t\tdirection=\"column\"\n\t\t\t\t\t\t\t\tcolor=\"#8d8e90\"\n\t\t\t\t\t\t\t\tv-if=\"index < buttons.length - 1\"\n\t\t\t\t\t\t\t\tlength=\"18\"\n\t\t\t\t\t\t\t></u-line>\n\t\t\t\t\t\t</block>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</u-transition>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t// #ifdef APP-NVUE \n\tconst dom = uni.requireNativePlugin('dom')\n\t// #endif\n\t// #ifdef H5\n\timport ClipboardJS from \"./clipboard.min.js\"\n\t// #endif\n\t/**\n\t * Tooltip \n\t * @description \n\t * @tutorial https://www.uviewui.com/components/tooltip.html\n\t * @property {String | Number}\ttext\t\t需要显示的提示文字\n\t * @property {String | Number}\tcopyText\t点击复制按钮时，复制的文本，为空则使用text值\n\t * @property {String | Number}\tsize\t\t文本大小（默认 14 ）\n\t * @property {String}\t\t\tcolor\t\t字体颜色（默认 '#606266' ）\n\t * @property {String}\t\t\tbgColor\t\t弹出提示框时，文本的背景色（默认 'transparent' ）\n\t * @property {String}\t\t\tdirection\t弹出提示的方向，top-上方，bottom-下方（默认 'top' ）\n\t * @property {String | Number}\tzIndex\t\t弹出提示的z-index，nvue无效（默认 10071 ）\n\t * @property {Boolean}\t\t\tshowCopy\t是否显示复制按钮（默认 true ）\n\t * @property {Array}\t\t\tbuttons\t\t扩展的按钮组\n\t * @property {Boolean}\t\t\toverlay\t\t是否显示透明遮罩以防止触摸穿透（默认 true ）\n\t * @property {Object}\t\t\tcustomStyle\t定义需要用到的外部样式\n\t * \n\t * @event {Function} \n\t * @example \n\t */\n\texport default {\n\t\tname: 'u-tooltip',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// 是否展示气泡\n\t\t\t\tshowTooltip: true,\n\t\t\t\t// 生成唯一id，防止一个页面多个组件，造成干扰\n\t\t\t\ttextId: uni.$u.guid(),\n\t\t\t\ttooltipId: uni.$u.guid(),\n\t\t\t\t// 初始时甚至为很大的值，让其移到屏幕外面，为了计算元素的尺寸\n\t\t\t\ttooltipTop: -10000,\n\t\t\t\t// 气泡的位置信息\n\t\t\t\ttooltipInfo: {\n\t\t\t\t\twidth: 0,\n\t\t\t\t\tleft: 0\n\t\t\t\t},\n\t\t\t\t// 文本的位置信息\n\t\t\t\ttextInfo: {\n\t\t\t\t\twidth: 0,\n\t\t\t\t\tleft: 0\n\t\t\t\t},\n\t\t\t\t// 三角形指示器的样式\n\t\t\t\tindicatorStyle: {},\n\t\t\t\t// 气泡在可能超出屏幕边沿范围时，重新定位后，距离屏幕边沿的距离\n\t\t\t\tscreenGap: 12,\n\t\t\t\t// 三角形指示器的宽高，由于对元素进行了角度旋转，精确计算指示器位置时，需要用到其尺寸信息\n\t\t\t\tindicatorWidth: 14,\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\tpropsChange() {\n\t\t\t\tthis.getElRect()\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\t// 特别处理H5的复制，因为H5浏览器是自带系统复制功能的，在H5环境\n\t\t\t// 当一些依赖参数变化时，需要重新计算气泡和指示器的位置信息\n\t\t\tpropsChange() {\n\t\t\t\treturn [this.text, this.buttons]\n\t\t\t},\n\t\t\t// 计算气泡和指示器的位置信息\n\t\t\ttooltipStyle() {\n\t\t\t\tconst style = {\n\t\t\t\t\t\ttransform: `translateY(${this.direction === 'top' ? '-100%' : '100%'})`,\n\t\t\t\t\t},\n\t\t\t\t\tsys = uni.$u.sys(),\n\t\t\t\t\tgetPx = uni.$u.getPx,\n\t\t\t\t\taddUnit = uni.$u.addUnit\n\t\t\t\tif (this.tooltipInfo.width / 2 > this.textInfo.left + this.textInfo.width / 2 - this.screenGap) {\n\t\t\t\t\tthis.indicatorStyle = {}\n\t\t\t\t\tstyle.left = `-${addUnit(this.textInfo.left - this.screenGap)}`\n\t\t\t\t\tthis.indicatorStyle.left = addUnit(this.textInfo.width / 2 - getPx(style.left) - this.indicatorWidth /\n\t\t\t\t\t\t2)\n\t\t\t\t} else if (this.tooltipInfo.width / 2 > sys.windowWidth - this.textInfo.right + this.textInfo.width / 2 -\n\t\t\t\t\tthis.screenGap) {\n\t\t\t\t\tthis.indicatorStyle = {}\n\t\t\t\t\tstyle.right = `-${addUnit(sys.windowWidth - this.textInfo.right - this.screenGap)}`\n\t\t\t\t\tthis.indicatorStyle.right = addUnit(this.textInfo.width / 2 - getPx(style.right) - this\n\t\t\t\t\t\t.indicatorWidth / 2)\n\t\t\t\t} else {\n\t\t\t\t\tconst left = Math.abs(this.textInfo.width / 2 - this.tooltipInfo.width / 2)\n\t\t\t\t\tstyle.left = this.textInfo.width > this.tooltipInfo.width ? addUnit(left) : -addUnit(left)\n\t\t\t\t\tthis.indicatorStyle = {}\n\t\t\t\t}\n\t\t\t\tif (this.direction === 'top') {\n\t\t\t\t\tstyle.marginTop = '-10px'\n\t\t\t\t\tthis.indicatorStyle.bottom = '-4px'\n\t\t\t\t} else {\n\t\t\t\t\tstyle.marginBottom = '-10px'\n\t\t\t\t\tthis.indicatorStyle.top = '-4px'\n\t\t\t\t}\n\t\t\t\treturn style\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.init()\n\t\t},\n\t\tmethods: {\n\t\t\tinit() {\n\t\t\t\tthis.getElRect()\n\t\t\t},\n\t\t\t// 长按触发事件\n\t\t\tasync longpressHandler() {\n\t\t\t\tthis.tooltipTop = 0\n\t\t\t\tthis.showTooltip = true\n\t\t\t},\n\t\t\t// 点击透明遮罩\n\t\t\toverlayClickHandler() {\n\t\t\t\tthis.showTooltip = false\n\t\t\t},\n\t\t\t// 点击弹出按钮\n\t\t\tbtnClickHandler(index) {\n\t\t\t\tthis.showTooltip = false\n\t\t\t\t// 如果需要展示复制按钮，此处index需要加1，因为复制按钮在第一个位置\n\t\t\t\tthis.$emit('click', this.showCopy ? index + 1 : index)\n\t\t\t},\n\t\t\t// 查询内容高度\n\t\t\tqueryRect(ref) {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t// $uGetRect为uView自带的节点查询简化方法，详见文档介绍：https://www.uviewui.com/js/getRect.html\n\t\t\t\t// 组件内部一般用this.$uGetRect，对外的为uni.$u.getRect，二者功能一致，名称不同\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tthis.$uGetRect(`#${ref}`).then(size => {\n\t\t\t\t\t\tresolve(size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t// nvue下，使用dom模块查询元素高度\n\t\t\t\t// 返回一个promise，让调用此方法的主体能使用then回调\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tdom.getComponentRect(this.$refs[ref], res => {\n\t\t\t\t\t\tresolve(res.size)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 元素尺寸\n\t\t\tgetElRect() {\n\t\t\t\t// 调用之前，先将指示器调整到屏幕外，方便获取尺寸\n\t\t\t\tthis.showTooltip = true\n\t\t\t\tthis.tooltipTop = -10000\n\t\t\t\tuni.$u.sleep(500).then(() => {\n\t\t\t\t\tthis.queryRect(this.tooltipId).then(size => {\n\t\t\t\t\t\tthis.tooltipInfo = size\n\t\t\t\t\t\t// 获取气泡尺寸之后，将其隐藏，为了让下次切换气泡显示与隐藏时，有淡入淡出的效果\n\t\t\t\t\t\tthis.showTooltip = false\n\t\t\t\t\t})\n\t\t\t\t\tthis.queryRect(this.textId).then(size => {\n\t\t\t\t\t\tthis.textInfo = size\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t},\n\t\t\t// 复制文本到粘贴板\n\t\t\tsetClipboardData() {\n\t\t\t\t// 关闭组件\n\t\t\t\tthis.showTooltip = false\n\t\t\t\tthis.$emit('click', 0)\n\t\t\t\t// #ifndef H5\n\t\t\t\tuni.setClipboardData({\n\t\t\t\t\t// 优先使用copyText字段，如果没有，则默认使用text字段当做复制的内容\n\t\t\t\t\tdata: this.copyText || this.text,\n\t\t\t\t\tsuccess: () => {\n\t\t\t\t\t\tthis.showToast && uni.$u.toast('复制成功')\n\t\t\t\t\t},\n\t\t\t\t\tfail: () => {\n\t\t\t\t\t\tthis.showToast && uni.$u.toast('复制失败')\n\t\t\t\t\t},\n\t\t\t\t\tcomplete: () => {\n\t\t\t\t\t\tthis.showTooltip = false\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t// #endif\n\n\t\t\t\t// #ifdef H5\n\t\t\t\tlet event = window.event || e || {}\n\t\t\t\tlet clipboard = new ClipboardJS('', {\n\t\t\t\t\ttext: () => this.copyText || this.text\n\t\t\t\t})\n\t\t\t\tclipboard.on('success', (e) => {\n\t\t\t\t\tthis.showToast && uni.$u.toast('复制成功')\n\t\t\t\t\tclipboard.off('success')\n\t\t\t\t\tclipboard.off('error')\n\t\t\t\t\t// 在单页应用中，需要销毁DOM的监听\n\t\t\t\t\tclipboard.destroy()\n\t\t\t\t})\n\t\t\t\tclipboard.on('error', (e) => {\n\t\t\t\t\tthis.showToast && uni.$u.toast('复制失败')\n\t\t\t\t\tclipboard.off('success')\n\t\t\t\t\tclipboard.off('error')\n\t\t\t\t\t// 在单页应用中，需要销毁DOM的监听\n\t\t\t\t\tclipboard.destroy()\n\t\t\t\t})\n\t\t\t\tclipboard.onClick(event)\n\t\t\t\t// #endif\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\n\t.u-tooltip {\n\t\tposition: relative;\n\t\t@include flex;\n\n\t\t&__wrapper {\n\t\t\t@include flex;\n\t\t\tjustify-content: center;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\twhite-space: nowrap;\n\t\t\t/* #endif */\n\n\t\t\t&__text {\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\n\t\t\t&__popup {\n\t\t\t\t@include flex;\n\t\t\t\tjustify-content: center;\n\n\t\t\t\t&__list {\n\t\t\t\t\tbackground-color: #060607;\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tflex: 1;\n\t\t\t\t\tborder-radius: 5px;\n\t\t\t\t\tpadding: 0px 0;\n\t\t\t\t\t@include flex(row);\n\t\t\t\t\talign-items: center;\n\t\t\t\t\toverflow: hidden;\n\n\t\t\t\t\t&__btn {\n\t\t\t\t\t\tpadding: 11px 13px;\n\n\t\t\t\t\t\t&--hover {\n\t\t\t\t\t\t\tbackground-color: #58595B;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t&__text {\n\t\t\t\t\t\t\tline-height: 12px;\n\t\t\t\t\t\t\tfont-size: 13px;\n\t\t\t\t\t\t\tcolor: #FFFFFF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t&__indicator {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\tbackground-color: #060607;\n\t\t\t\t\twidth: 14px;\n\t\t\t\t\theight: 14px;\n\t\t\t\t\tbottom: -4px;\n\t\t\t\t\ttransform: rotate(45deg);\n\t\t\t\t\tborder-radius: 2px;\n\t\t\t\t\tz-index: -1;\n\n\t\t\t\t\t&--hover {\n\t\t\t\t\t\tbackground-color: #58595B;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tr/props.js",
    "content": "export default {\n    props: {\n\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-tr/u-tr.vue",
    "content": "<template>\n\t<view class=\"u-tr\">\n\t\t\n\t</view>\n</template>\n\n<script>\n\timport props from './props.js';\n\t/**\n\t * Tr  \n\t * @description \n\t * @tutorial url\n\t * @property {String}\n\t * @event {Function}\n\t * @example\n\t */\n\texport default {\n\t\tname: 'u-tr',\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t@import \"../../libs/css/components.scss\";\n\t\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-transition/nvue.ani-map.js",
    "content": "export default {\n    fade: {\n        enter: { opacity: 0 },\n        'enter-to': { opacity: 1 },\n        leave: { opacity: 1 },\n        'leave-to': { opacity: 0 }\n    },\n    'fade-up': {\n        enter: { opacity: 0, transform: 'translateY(100%)' },\n        'enter-to': { opacity: 1, transform: 'translateY(0)' },\n        leave: { opacity: 1, transform: 'translateY(0)' },\n        'leave-to': { opacity: 0, transform: 'translateY(100%)' }\n    },\n    'fade-down': {\n        enter: { opacity: 0, transform: 'translateY(-100%)' },\n        'enter-to': { opacity: 1, transform: 'translateY(0)' },\n        leave: { opacity: 1, transform: 'translateY(0)' },\n        'leave-to': { opacity: 0, transform: 'translateY(-100%)' }\n    },\n    'fade-left': {\n        enter: { opacity: 0, transform: 'translateX(-100%)' },\n        'enter-to': { opacity: 1, transform: 'translateY(0)' },\n        leave: { opacity: 1, transform: 'translateY(0)' },\n        'leave-to': { opacity: 0, transform: 'translateX(-100%)' }\n    },\n    'fade-right': {\n        enter: { opacity: 0, transform: 'translateX(100%)' },\n        'enter-to': { opacity: 1, transform: 'translateY(0)' },\n        leave: { opacity: 1, transform: 'translateY(0)' },\n        'leave-to': { opacity: 0, transform: 'translateX(100%)' }\n    },\n    'slide-up': {\n        enter: { transform: 'translateY(100%)' },\n        'enter-to': { transform: 'translateY(0)' },\n        leave: { transform: 'translateY(0)' },\n        'leave-to': { transform: 'translateY(100%)' }\n    },\n    'slide-down': {\n        enter: { transform: 'translateY(-100%)' },\n        'enter-to': { transform: 'translateY(0)' },\n        leave: { transform: 'translateY(0)' },\n        'leave-to': { transform: 'translateY(-100%)' }\n    },\n    'slide-left': {\n        enter: { transform: 'translateX(-100%)' },\n        'enter-to': { transform: 'translateY(0)' },\n        leave: { transform: 'translateY(0)' },\n        'leave-to': { transform: 'translateX(-100%)' }\n    },\n    'slide-right': {\n        enter: { transform: 'translateX(100%)' },\n        'enter-to': { transform: 'translateY(0)' },\n        leave: { transform: 'translateY(0)' },\n        'leave-to': { transform: 'translateX(100%)' }\n    },\n    zoom: {\n        enter: { transform: 'scale(0.95)' },\n        'enter-to': { transform: 'scale(1)' },\n        leave: { transform: 'scale(1)' },\n        'leave-to': { transform: 'scale(0.95)' }\n    },\n    'fade-zoom': {\n        enter: { opacity: 0, transform: 'scale(0.95)' },\n        'enter-to': { opacity: 1, transform: 'scale(1)' },\n        leave: { opacity: 1, transform: 'scale(1)' },\n        'leave-to': { opacity: 0, transform: 'scale(0.95)' }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-transition/props.js",
    "content": "export default {\n    props: {\n        // 是否展示组件\n        show: {\n            type: Boolean,\n            default: uni.$u.props.transition.show\n        },\n        // 使用的动画模式\n        mode: {\n            type: String,\n            default: uni.$u.props.transition.mode\n        },\n        // 动画的执行时间，单位ms\n        duration: {\n            type: [String, Number],\n            default: uni.$u.props.transition.duration\n        },\n        // 使用的动画过渡函数\n        timingFunction: {\n            type: String,\n            default: uni.$u.props.transition.timingFunction\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-transition/transition.js",
    "content": "// 定义一个一定时间后自动成功的promise，让调用nextTick方法处，进入下一个then方法\nconst nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 50))\n// nvue动画模块实现细节抽离在外部文件\nimport animationMap from './nvue.ani-map.js'\n\n// #ifndef APP-NVUE\n// 定义类名，通过给元素动态切换类名，赋予元素一定的css动画样式\nconst getClassNames = (name) => ({\n    enter: `u-${name}-enter u-${name}-enter-active`,\n    'enter-to': `u-${name}-enter-to u-${name}-enter-active`,\n    leave: `u-${name}-leave u-${name}-leave-active`,\n    'leave-to': `u-${name}-leave-to u-${name}-leave-active`\n})\n// #endif\n\n// #ifdef APP-NVUE\n// 引入nvue(weex)的animation动画模块，文档见：\n// https://weex.apache.org/zh/docs/modules/animation.html#transition\nconst animation = uni.requireNativePlugin('animation')\nconst getStyle = (name) => animationMap[name]\n// #endif\n\nexport default {\n    methods: {\n        // 组件被点击发出事件\n        clickHandler() {\n            this.$emit('click')\n        },\n        // #ifndef APP-NVUE\n        // vue版本的组件进场处理\n         vueEnter() {\n            // 动画进入时的类名\n            const classNames = getClassNames(this.mode)\n            // 定义状态和发出动画进入前事件\n            this.status = 'enter'\n            this.$emit('beforeEnter')\n            this.inited = true\n            this.display = true\n            this.classes = classNames.enter\n            this.$nextTick(async () => {\n\t\t\t\t// #ifdef H5\n\t\t\t\tawait uni.$u.sleep(20)\n\t\t\t\t// #endif\n                // 标识动画尚未结束\n                this.$emit('enter')\n                this.transitionEnded = false\n\t\t\t\t// 组件动画进入后触发的事件\n                this.$emit('afterEnter')\n                // 赋予组件enter-to类名\n                this.classes = classNames['enter-to']\n            })\n        },\n        // 动画离场处理\n        vueLeave() {\n            // 如果不是展示状态，无需执行逻辑\n            if (!this.display) return\n            const classNames = getClassNames(this.mode)\n            // 标记离开状态和发出事件\n            this.status = 'leave'\n            this.$emit('beforeLeave')\n            // 获得类名\n            this.classes = classNames.leave\n\n            this.$nextTick(() => {\n               // 动画正在离场的状态\n               this.transitionEnded = false\n               this.$emit('leave')\n                // 组件执行动画，到了执行的执行时间后，执行一些额外处理\n                setTimeout(this.onTransitionEnd, this.duration)\n                this.classes = classNames['leave-to']\n            })\n        },\n        // #endif\n        // #ifdef APP-NVUE\n        // nvue版本动画进场\n        nvueEnter() {\n            // 获得样式的名称\n            const currentStyle = getStyle(this.mode)\n            // 组件动画状态和发出事件\n            this.status = 'enter'\n            this.$emit('beforeEnter')\n            // 展示生成组件元素\n            this.inited = true\n            this.display = true\n            // 在nvue安卓上，由于渲染速度慢，在弹窗，键盘，日历等组件中，渲染其中的内容需要时间\n            // 导致出现弹窗卡顿，这里让其一开始为透明状态，等一定时间渲染完成后，再让其隐藏起来，再让其按正常逻辑出现\n            this.viewStyle = {\n                opacity: 0\n            }\n            // 等待弹窗内容渲染完成\n            this.$nextTick(() => {\n                // 合并样式\n                this.viewStyle = currentStyle.enter\n                Promise.resolve()\n                    .then(nextTick)\n                    .then(() => {\n                        // 组件开始进入前的事件\n                        this.$emit('enter')\n                        // nvue的transition动画模块需要通过ref调用组件，注意此处的ref不同于vue的this.$refs['u-transition']用法\n                        animation.transition(this.$refs['u-transition'].ref, {\n                            styles: currentStyle['enter-to'],\n                            duration: this.duration,\n                            timingFunction: this.timingFunction,\n                            needLayout: false,\n                            delay: 0\n                        }, () => {\n                            // 动画执行完毕，发出事件\n                            this.$emit('afterEnter')\n                        })\n                    })\n                    .catch(() => {})\n            })\n        },\n        nvueLeave() {\n            if (!this.display) {\n                return\n            }\n            const currentStyle = getStyle(this.mode)\n            // 定义状态和事件\n            this.status = 'leave'\n            this.$emit('beforeLeave')\n            // 合并样式\n            this.viewStyle = currentStyle.leave\n            // 放到promise中处理执行过程\n            Promise.resolve()\n                .then(nextTick) // 等待几十ms\n                .then(() => {\n                    this.transitionEnded = false\n                    // 动画正在离场的状态\n                    this.$emit('leave')\n                    animation.transition(this.$refs['u-transition'].ref, {\n                        styles: currentStyle['leave-to'],\n                        duration: this.duration,\n                        timingFunction: this.timingFunction,\n                        needLayout: false,\n                        delay: 0\n                    }, () => {\n                        this.onTransitionEnd()\n                    })\n                })\n                .catch(() => {})\n        },\n        // #endif\n        // 完成过渡后触发\n        onTransitionEnd() {\n            // 如果已经是结束的状态，无需再处理\n            if (this.transitionEnded) return\n            this.transitionEnded = true\n            // 发出组件动画执行后的事件\n            this.$emit(this.status === 'leave' ? 'afterLeave' : 'afterEnter')\n            if (!this.show && this.display) {\n                this.display = false\n                this.inited = false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-transition/u-transition.vue",
    "content": "<template>\n\t<view\n\t\tv-if=\"inited\"\n\t\tclass=\"u-transition\"\n\t\tref=\"u-transition\"\n\t\t@tap.stop=\"clickHandler\"\n\t\t:class=\"classes\"\n\t\t:style=\"[mergeStyle]\"\n\t\t@touchmove=\"noop\"\n\t>\n\t\t<slot />\n\t</view>\n</template>\n\n<script>\nimport props from './props.js';\n// 组件的methods方法，由于内容较长，写在外部文件中通过mixin引入\nimport transition from \"./transition.js\";\n/**\n * transition  动画组件\n * @description\n * @tutorial\n * @property {String}\t\t\tshow\t\t\t是否展示组件 （默认 false ）\n * @property {String}\t\t\tmode\t\t\t使用的动画模式 （默认 'fade' ）\n * @property {String | Number}\tduration\t\t动画的执行时间，单位ms （默认 '300' ）\n * @property {String}\t\t\ttimingFunction\t使用的动画过渡函数 （默认 'ease-out' ）\n * @property {Object}\t\t\tcustomStyle\t\t自定义样式\n * @event {Function} before-enter\t进入前触发\n * @event {Function} enter\t\t\t进入中触发\n * @event {Function} after-enter\t进入后触发\n * @event {Function} before-leave\t离开前触发\n * @event {Function} leave\t\t\t离开中触发\n * @event {Function} after-leave\t离开后触发\n * @example\n */\nexport default {\n\tname: 'u-transition',\n\tdata() {\n\t\treturn {\n\t\t\tinited: false, // 是否显示/隐藏组件\n\t\t\tviewStyle: {}, // 组件内部的样式\n\t\t\tstatus: '', // 记录组件动画的状态\n\t\t\ttransitionEnded: false, // 组件是否结束的标记\n\t\t\tdisplay: false, // 组件是否展示\n\t\t\tclasses: '', // 应用的类名\n\t\t}\n\t},\n\tcomputed: {\n\t    mergeStyle() {\n\t        const { viewStyle, customStyle } = this\n\t        return {\n\t            // #ifndef APP-NVUE\n\t            transitionDuration: `${this.duration}ms`,\n\t            // display: `${this.display ? '' : 'none'}`,\n\t\t\t\ttransitionTimingFunction: this.timingFunction,\n\t            // #endif\n\t\t\t\t// 避免自定义样式影响到动画属性，所以写在viewStyle前面\n\t            ...uni.$u.addStyle(customStyle),\n\t            ...viewStyle\n\t        }\n\t    }\n\t},\n\t// 将mixin挂在到组件中，uni.$u.mixin实际上为一个vue格式对象\n\tmixins: [uni.$u.mpMixin, uni.$u.mixin, transition, props],\n\twatch: {\n\t\tshow: {\n\t\t\thandler(newVal) {\n\t\t\t\t// vue和nvue分别执行不同的方法\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tnewVal ? this.nvueEnter() : this.nvueLeave()\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tnewVal ? this.vueEnter() : this.vueLeave()\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\t// 表示同时监听初始化时的props的show的意思\n\t\t\timmediate: true\n\t\t}\n\t}\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../libs/css/components.scss';\n\n/* #ifndef APP-NVUE */\n// vue版本动画相关的样式抽离在外部文件\n@import './vue.ani-style.scss';\n/* #endif */\n\n.u-transition {}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-transition/vue.ani-style.scss",
    "content": "/**\n * vue版本动画内置的动画模式有如下：\n * fade：淡入\n * zoom：缩放\n * fade-zoom：缩放淡入\n * fade-up：上滑淡入\n * fade-down：下滑淡入\n * fade-left：左滑淡入\n * fade-right：右滑淡入\n * slide-up：上滑进入\n * slide-down：下滑进入\n * slide-left：左滑进入\n * slide-right：右滑进入\n */\n\n$u-zoom-scale: scale(0.95);\n\n.u-fade-enter-active,\n.u-fade-leave-active {\n\ttransition-property: opacity;\n}\n\n.u-fade-enter,\n.u-fade-leave-to {\n\topacity: 0\n}\n\n.u-fade-zoom-enter,\n.u-fade-zoom-leave-to {\n\ttransform: $u-zoom-scale;\n\topacity: 0;\n}\n\n.u-fade-zoom-enter-active,\n.u-fade-zoom-leave-active {\n\ttransition-property: transform, opacity;\n}\n\n.u-fade-down-enter-active,\n.u-fade-down-leave-active,\n.u-fade-left-enter-active,\n.u-fade-left-leave-active,\n.u-fade-right-enter-active,\n.u-fade-right-leave-active,\n.u-fade-up-enter-active,\n.u-fade-up-leave-active {\n\ttransition-property: opacity, transform;\n}\n\n.u-fade-up-enter,\n.u-fade-up-leave-to {\n\ttransform: translate3d(0, 100%, 0);\n\topacity: 0\n}\n\n.u-fade-down-enter,\n.u-fade-down-leave-to {\n\ttransform: translate3d(0, -100%, 0);\n\topacity: 0\n}\n\n.u-fade-left-enter,\n.u-fade-left-leave-to {\n\ttransform: translate3d(-100%, 0, 0);\n\topacity: 0\n}\n\n.u-fade-right-enter,\n.u-fade-right-leave-to {\n\ttransform: translate3d(100%, 0, 0);\n\topacity: 0\n}\n\n.u-slide-down-enter-active,\n.u-slide-down-leave-active,\n.u-slide-left-enter-active,\n.u-slide-left-leave-active,\n.u-slide-right-enter-active,\n.u-slide-right-leave-active,\n.u-slide-up-enter-active,\n.u-slide-up-leave-active {\n\ttransition-property: transform;\n}\n\n.u-slide-up-enter,\n.u-slide-up-leave-to {\n\ttransform: translate3d(0, 100%, 0)\n}\n\n.u-slide-down-enter,\n.u-slide-down-leave-to {\n\ttransform: translate3d(0, -100%, 0)\n}\n\n.u-slide-left-enter,\n.u-slide-left-leave-to {\n\ttransform: translate3d(-100%, 0, 0)\n}\n\n.u-slide-right-enter,\n.u-slide-right-leave-to {\n\ttransform: translate3d(100%, 0, 0)\n}\n\n.u-zoom-enter-active,\n.u-zoom-leave-active {\n\ttransition-property: transform\n}\n\n.u-zoom-enter,\n.u-zoom-leave-to {\n\ttransform: $u-zoom-scale\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-upload/mixin.js",
    "content": "export default {\n    watch: {\n        // 监听accept的变化，判断是否符合个平台要求\n        // 只有微信小程序才支持选择媒体，文件类型，所以这里做一个判断提示\n        accept: {\n            immediate: true,\n            handler(val) {\n                // #ifndef MP-WEIXIN\n                if (val === 'all' || val === 'media') {\n                    uni.$u.error('只有微信小程序才支持把accept配置为all、media之一')\n                }\n                // #endif\n                // #ifndef H5 || MP-WEIXIN\n                if (val === 'file') {\n                    uni.$u.error('只有微信小程序和H5(HX2.9.9)才支持把accept配置为file')\n                }\n                // #endif\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-upload/props.js",
    "content": "export default {\n    props: {\n        // 接受的文件类型, 可选值为all media image file video\n        accept: {\n            type: String,\n            default: uni.$u.props.upload.accept\n        },\n        // \t图片或视频拾取模式，当accept为image类型时设置capture可选额外camera可以直接调起摄像头\n        capture: {\n            type: [String, Array],\n            default: uni.$u.props.upload.capture\n        },\n        // 当accept为video时生效，是否压缩视频，默认为true\n        compressed: {\n            type: Boolean,\n            default: uni.$u.props.upload.compressed\n        },\n        // 当accept为video时生效，可选值为back或front\n        camera: {\n            type: String,\n            default: uni.$u.props.upload.camera\n        },\n        // 当accept为video时生效，拍摄视频最长拍摄时间，单位秒\n        maxDuration: {\n            type: Number,\n            default: uni.$u.props.upload.maxDuration\n        },\n        // 上传区域的图标，只能内置图标\n        uploadIcon: {\n            type: String,\n            default: uni.$u.props.upload.uploadIcon\n        },\n        // 上传区域的图标的颜色，默认\n        uploadIconColor: {\n            type: String,\n            default: uni.$u.props.upload.uploadIconColor\n        },\n        // 是否开启文件读取前事件\n        useBeforeRead: {\n            type: Boolean,\n            default: uni.$u.props.upload.useBeforeRead\n        },\n        // 读取后的处理函数\n        afterRead: {\n            type: Function,\n            default: null\n        },\n        // 读取前的处理函数\n        beforeRead: {\n            type: Function,\n            default: null\n        },\n        // 是否显示组件自带的图片预览功能\n        previewFullImage: {\n            type: Boolean,\n            default: uni.$u.props.upload.previewFullImage\n        },\n        // 最大上传数量\n        maxCount: {\n            type: [String, Number],\n            default: uni.$u.props.upload.maxCount\n        },\n        // 是否启用\n        disabled: {\n            type: Boolean,\n            default: uni.$u.props.upload.disabled\n        },\n        // 预览上传的图片时的裁剪模式，和image组件mode属性一致\n        imageMode: {\n            type: String,\n            default: uni.$u.props.upload.imageMode\n        },\n        // 标识符，可以在回调函数的第二项参数中获取\n        name: {\n            type: String,\n            default: uni.$u.props.upload.name\n        },\n        // 所选的图片的尺寸, 可选值为original compressed\n        sizeType: {\n            type: Array,\n            default: uni.$u.props.upload.sizeType\n        },\n        // 是否开启图片多选，部分安卓机型不支持\n        multiple: {\n            type: Boolean,\n            default: uni.$u.props.upload.multiple\n        },\n        // 是否展示删除按钮\n        deletable: {\n            type: Boolean,\n            default: uni.$u.props.upload.deletable\n        },\n        // 文件大小限制，单位为byte\n        maxSize: {\n            type: [String, Number],\n            default: uni.$u.props.upload.maxSize\n        },\n        // 显示已上传的文件列表\n        fileList: {\n            type: Array,\n            default: uni.$u.props.upload.fileList\n        },\n        // 上传区域的提示文字\n        uploadText: {\n            type: String,\n            default: uni.$u.props.upload.uploadText\n        },\n        // 内部预览图片区域和选择图片按钮的区域宽度\n        width: {\n            type: [String, Number],\n            default: uni.$u.props.upload.width\n        },\n        // 内部预览图片区域和选择图片按钮的区域高度\n        height: {\n            type: [String, Number],\n            default: uni.$u.props.upload.height\n        },\n        // 是否在上传完成后展示预览图\n        previewImage: {\n            type: Boolean,\n            default: uni.$u.props.upload.previewImage\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-upload/u-upload.vue",
    "content": "<template>\n\t<view class=\"u-upload\" :style=\"[$u.addStyle(customStyle)]\">\n\t\t<view class=\"u-upload__wrap\" >\n\t\t\t<template v-if=\"previewImage\">\n\t\t\t\t<view\n\t\t\t\t    class=\"u-upload__wrap__preview\"\n\t\t\t\t    v-for=\"(item, index) in lists\"\n\t\t\t\t    :key=\"index\"\n\t\t\t\t>\n\t\t\t\t\t<image\n\t\t\t\t\t    v-if=\"item.isImage || (item.type && item.type === 'image')\"\n\t\t\t\t\t    :src=\"item.thumb || item.url\"\n\t\t\t\t\t    :mode=\"imageMode\"\n\t\t\t\t\t    class=\"u-upload__wrap__preview__image\"\n\t\t\t\t\t    @tap=\"onPreviewImage(item)\"\n\t\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t\t\t}]\"\n\t\t\t\t\t/>\n\t\t\t\t\t<view  v-else-if=\"(item.type && item.type === 'video')\"\n\t\t\t\t\t class=\"u-upload__wrap__preview__image\"\n\t\t\t\t\t  :style=\"[{\n\t\t\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t\t\t}]\">\n\t\t\t\t\t\t\t<image\n\t\t\t\t\t\t\tstyle=\"position: absolute;z-index: 1;\"\n\t\t\t\t\t\t\t:src=\"item.thumb\"\n\t\t\t\t\t\t\t@tap=\"onPreviewVideo(item)\"\n\t\t\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t\t\t\t}]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<u-icon style=\"position: absolute;z-index: 2;  top: 50%;left: 50%;transform: translate(-50%, -50%); \"\n\t\t\t\t\t\t @tap=\"onPreviewVideo(item)\" name=\"play-circle\" color=\"#ffffff\" size=\"34\"></u-icon>\n\t\t\t\t\t</view>\n\t\t\t\t\t\n\t\t\t\t\t<view\n\t\t\t\t\t    v-else\n\t\t\t\t\t    class=\"u-upload__wrap__preview__other\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t    color=\"#80CBF9\"\n\t\t\t\t\t\t    size=\"26\"\n\t\t\t\t\t\t    :name=\"item.isVideo || (item.type && item.type === 'video') ? 'movie' : 'folder'\"\n\t\t\t\t\t\t></u-icon>\n\t\t\t\t\t\t<text class=\"u-upload__wrap__preview__other__text\">{{item.isVideo || (item.type && item.type === 'video') ? '视频' : '文件'}}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view\n\t\t\t\t\t    class=\"u-upload__status\"\n\t\t\t\t\t    v-if=\"item.status === 'uploading' || item.status === 'failed'\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<view class=\"u-upload__status__icon\">\n\t\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t\t    v-if=\"item.status === 'failed'\"\n\t\t\t\t\t\t\t    name=\"close-circle\"\n\t\t\t\t\t\t\t    color=\"#ffffff\"\n\t\t\t\t\t\t\t    size=\"25\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<u-loading-icon\n\t\t\t\t\t\t\t    size=\"22\"\n\t\t\t\t\t\t\t    mode=\"circle\"\n\t\t\t\t\t\t\t    color=\"#ffffff\"\n\t\t\t\t\t\t\t    v-else\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t    v-if=\"item.message\"\n\t\t\t\t\t\t    class=\"u-upload__status__message\"\n\t\t\t\t\t\t>{{ item.message }}</text>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view\n\t\t\t\t\t    class=\"u-upload__deletable\"\n\t\t\t\t\t    v-if=\"item.status !== 'uploading' && (deletable || item.deletable)\"\n\t\t\t\t\t    @tap.stop=\"deleteItem(index)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<view class=\"u-upload__deletable__icon\">\n\t\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t\t    name=\"close\"\n\t\t\t\t\t\t\t    color=\"#ffffff\"\n\t\t\t\t\t\t\t    size=\"10\"\n\t\t\t\t\t\t\t></u-icon>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view\n\t\t\t\t\t    class=\"u-upload__success\"\n\t\t\t\t\t    v-if=\"item.status === 'success'\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- #ifdef APP-NVUE -->\n\t\t\t\t\t\t<image\n\t\t\t\t\t\t    :src=\"successIcon\"\n\t\t\t\t\t\t    class=\"u-upload__success__icon\"\n\t\t\t\t\t\t></image>\n\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t<!-- #ifndef APP-NVUE -->\n\t\t\t\t\t\t<view class=\"u-upload__success__icon\">\n\t\t\t\t\t\t\t<u-icon\n\t\t\t\t\t\t\t    name=\"checkmark\"\n\t\t\t\t\t\t\t    color=\"#ffffff\"\n\t\t\t\t\t\t\t    size=\"12\"\n\t\t\t\t\t\t\t></u-icon>\n\t\t\t\t\t\t</view>\n\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-if=\"isInCount\">\n\t\t\t\t<view\n\t\t\t\t    v-if=\"$slots.default || $slots.$default\"\n\t\t\t\t    @tap=\"chooseFile\"\n\t\t\t\t>\n\t\t\t\t\t<slot />\n\t\t\t\t</view>\n\t\t\t\t<view\n\t\t\t\t    v-else\n\t\t\t\t    class=\"u-upload__button\"\n\t\t\t\t    :hover-class=\"!disabled ? 'u-upload__button--hover' : ''\"\n\t\t\t\t    hover-stay-time=\"150\"\n\t\t\t\t    @tap=\"chooseFile\"\n\t\t\t\t    :class=\"[disabled && 'u-upload__button--disabled']\"\n\t\t\t\t\t:style=\"[{\n\t\t\t\t\t\twidth: $u.addUnit(width),\n\t\t\t\t\t\theight: $u.addUnit(height)\n\t\t\t\t\t}]\"\n\t\t\t\t>\n\t\t\t\t\t<u-icon\n\t\t\t\t\t    :name=\"uploadIcon\"\n\t\t\t\t\t    size=\"26\"\n\t\t\t\t\t    :color=\"uploadIconColor\"\n\t\t\t\t\t></u-icon>\n\t\t\t\t\t<text\n\t\t\t\t\t    v-if=\"uploadText\"\n\t\t\t\t\t    class=\"u-upload__button__text\"\n\t\t\t\t\t>{{ uploadText }}</text>\n\t\t\t\t</view>\n\t\t\t</template>\n\t\t</view>\n\t\t<!-- 全屏预览视频 -->\n\t\t<view class=\"preview-full\" v-if=\"previewVideoSrc!=''\">\n\t\t\t<video :autoplay=\"true\" :src=\"previewVideoSrc\" :show-fullscreen-btn=\"false\">\n\t\t\t\t<!-- 退出全屏预览按钮 -->\n\t\t\t\t<cover-view class=\"preview-full-close\" @click=\"previewVideoClose\"> ×\n\t\t\t\t</cover-view>\n\t\t\t</video>\n\t\t</view>\n\t\t<!-- <video src=\"https://www.w3school.com.cn/i/movie.mp4\" autoplay=\"true\"></video> -->\n\t</view>\n</template>\n\n<script>\n\timport {\n\t\tchooseFile\n\t} from './utils';\n\timport mixin from './mixin.js';\n\timport props from './props.js';\n\n\t/**\n\t * upload 上传\n\t * @description 该组件用于上传图片场景\n\t * @tutorial https://uviewui.com/components/upload.html\n\t * @property {String}\t\t\taccept\t\t\t\t接受的文件类型, 可选值为all media image file video （默认 'image' ）\n\t * @property {String | Array}\tcapture\t\t\t\t图片或视频拾取模式，当accept为image类型时设置capture可选额外camera可以直接调起摄像头（默认 ['album', 'camera'] ）\n\t * @property {Boolean}\t\t\tcompressed\t\t\t当accept为video时生效，是否压缩视频，默认为true（默认 true ）\n\t * @property {String}\t\t\tcamera\t\t\t\t当accept为video时生效，可选值为back或front（默认 'back' ）\n\t * @property {Number}\t\t\tmaxDuration\t\t\t当accept为video时生效，拍摄视频最长拍摄时间，单位秒（默认 60 ）\n\t * @property {String}\t\t\tuploadIcon\t\t\t上传区域的图标，只能内置图标（默认 'camera-fill' ）\n\t * @property {String}\t\t\tuploadIconColor\t\t上传区域的图标的字体颜色，只能内置图标（默认 #D3D4D6 ）\n\t * @property {Boolean}\t\t\tuseBeforeRead\t\t是否开启文件读取前事件（默认 false ）\n\t * @property {Boolean}\t\t\tpreviewFullImage\t是否显示组件自带的图片预览功能（默认 true ）\n\t * @property {String | Number}\tmaxCount\t\t\t最大上传数量（默认 52 ）\n\t * @property {Boolean}\t\t\tdisabled\t\t\t是否启用（默认 false ）\n\t * @property {String}\t\t\timageMode\t\t\t预览上传的图片时的裁剪模式，和image组件mode属性一致（默认 'aspectFill' ）\n\t * @property {String}\t\t\tname\t\t\t\t标识符，可以在回调函数的第二项参数中获取\n\t * @property {Array}\t\t\tsizeType\t\t\t所选的图片的尺寸, 可选值为original compressed（默认 ['original', 'compressed'] ）\n\t * @property {Boolean}\t\t\tmultiple\t\t\t是否开启图片多选，部分安卓机型不支持 （默认 false ）\n\t * @property {Boolean}\t\t\tdeletable\t\t\t是否展示删除按钮（默认 true ）\n\t * @property {String | Number}\tmaxSize\t\t\t\t文件大小限制，单位为byte （默认 Number.MAX_VALUE ）\n\t * @property {Array}\t\t\tfileList\t\t\t显示已上传的文件列表\n\t * @property {String}\t\t\tuploadText\t\t\t上传区域的提示文字\n\t * @property {String | Number}\twidth\t\t\t\t内部预览图片区域和选择图片按钮的区域宽度（默认 80 ）\n\t * @property {String | Number}\theight\t\t\t\t内部预览图片区域和选择图片按钮的区域高度（默认 80 ）\n\t * @property {Object}\t\t\tcustomStyle\t\t\t组件的样式，对象形式\n\t * @event {Function} afterRead\t\t读取后的处理函数\n\t * @event {Function} beforeRead\t\t读取前的处理函数\n\t * @event {Function} oversize\t\t文件超出大小限制\n\t * @event {Function} clickPreview\t点击预览图片\n\t * @event {Function} delete \t\t删除图片\n\t * @example <u-upload :action=\"action\" :fileList=\"fileList\" ></u-upload>\n\t */\n\texport default {\n\t\tname: \"u-upload\",\n\t\tmixins: [uni.$u.mpMixin, uni.$u.mixin, mixin,props],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tsuccessIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAKKADAAQAAAABAAAAKAAAAAB65masAAACP0lEQVRYCc3YXygsURwH8K/dpcWyG3LF5u/6/+dKVylSypuUl6uUPMifKMWL8oKEB1EUT1KeUPdR3uTNUsSLxb2udG/cbvInNuvf2rVnazZ/ZndmZ87snjM1Z+Z3zpzfp9+Z5mEAhlvjRtZgCKs+gnPAOcAkkMOR4jEHfItjDvgRxxSQD8cM0BuOCaAvXNCBQrigAsXgggYUiwsK0B9cwIH+4gIKlIILGFAqLiBAOTjFgXJxigJp4BQD0sIpAqSJow6kjSNAFTnRaHJwLenD6Mud52VQAcrBfTd2oyq+HtGaGGWAcnAVcXWoM3bCZrdi+ncPfaAcXE5UKVpdW/vitGPqqAtn98d0gXJwX7Qp6MmegUYVhvmTIezdmHlxJCjpHRTCFerLkRRu4k0aqdajN3sWOo0BK//msHa+xDuPC/oNFMKRhTtM4xjIX0SCNpXL4+7VIaHuyiWEp2L7ahWLf8fejfPdqPmC3mJicORZUp1CQzm+GiphvljGk+PBvWRbxii+xVTj5M6CiZ/tsDufvaXyxEUDxeLIyvu3m0iOyEFWVAkydcVYdyFrE9tQk9iMq6f/GNlvwt3LjQfh60LUrw9/cFyyMJUW/XkLSNMV4Mi6C5ML+ui4x5ClAX9sB9w0wV6wglJwJCv5fOxcr6EstgbGiEw4XcfUry4cWrcEUW8n+ARKxXEJHhw2WG43UKSvwI/TSZgvl7kh0b3XLZaLEy0QmMgLZAVH7J+ALOE+AVnDvQOyiPMAWcW5gSzjCPAV+78S5WE0GrQAAAAASUVORK5CYII=',\n\t\t\t\t// #endif\n\t\t\t\tlists: [],\n\t\t\t\tisInCount: true,\n\t\t\t\tpreviewVideoSrc:\"\"\n\t\t\t}\n\t\t},\n\t\twatch: {\n\t\t\t// 监听文件列表的变化，重新整理内部数据\n\t\t\tfileList: {\n\t\t\t\timmediate: true,\n\t\t\t\thandler() {\n\t\t\t\t\tthis.formatFileList()\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tmethods: {\n\t\t\tformatFileList() {\n\t\t\t\tconst {\n\t\t\t\t\tfileList = [], maxCount\n\t\t\t\t} = this;\n\t\t\t\tconst lists = fileList.map((item) =>\n\t\t\t\t\tObject.assign(Object.assign({}, item), {\n\t\t\t\t\t\t// 如果item.url为本地选择的blob文件的话，无法判断其为video还是image，此处优先通过accept做判断处理\n\t\t\t\t\t\tisImage: this.accept === 'image' || uni.$u.test.image(item.url || item.thumb),\n\t\t\t\t\t\tisVideo: this.accept === 'video' || uni.$u.test.video(item.url || item.thumb),\n\t\t\t\t\t\tdeletable: typeof(item.deletable) === 'boolean' ? item.deletable : this.deletable,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\tthis.lists = lists\n\t\t\t\tthis.isInCount = lists.length < maxCount\n\t\t\t},\n\t\t\tchooseFile() {\n\t\t\t\tconst {\n\t\t\t\t\tmaxCount,\n\t\t\t\t\tmultiple,\n\t\t\t\t\tlists,\n\t\t\t\t\tdisabled\n\t\t\t\t} = this;\n\t\t\t\tif (disabled) return;\n\t\t\t\t// 如果用户传入的是字符串，需要格式化成数组\n\t\t\t\tlet capture;\n\t\t\t\ttry {\n\t\t\t\t\tcapture = uni.$u.test.array(this.capture) ? this.capture : this.capture.split(',');\n\t\t\t\t}catch(e) {\n\t\t\t\t\tcapture = [];\n\t\t\t\t}\n\t\t\t\tchooseFile(\n\t\t\t\t\t\tObject.assign({\n\t\t\t\t\t\t\taccept: this.accept,\n\t\t\t\t\t\t\tmultiple: this.multiple,\n\t\t\t\t\t\t\tcapture: capture,\n\t\t\t\t\t\t\tcompressed: this.compressed,\n\t\t\t\t\t\t\tmaxDuration: this.maxDuration,\n\t\t\t\t\t\t\tsizeType: this.sizeType,\n\t\t\t\t\t\t\tcamera: this.camera,\n\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\tmaxCount: maxCount - lists.length,\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\tthis.onBeforeRead(multiple ? res : res[0]);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tthis.$emit('error', error);\n\t\t\t\t\t});\n\t\t\t},\n\t\t\t// 文件读取之前\n\t\t\tonBeforeRead(file) {\n\t\t\t\tconst {\n\t\t\t\t\tbeforeRead,\n\t\t\t\t\tuseBeforeRead,\n\t\t\t\t} = this;\n\t\t\t\tlet res = true\n\t\t\t\t// beforeRead是否为一个方法\n\t\t\t\tif (uni.$u.test.func(beforeRead)) {\n\t\t\t\t\t// 如果用户定义了此方法，则去执行此方法，并传入读取的文件回调\n\t\t\t\t\tres = beforeRead(file, this.getDetail());\n\t\t\t\t}\n\t\t\t\tif (useBeforeRead) {\n\t\t\t\t\tres = new Promise((resolve, reject) => {\n\t\t\t\t\t\tthis.$emit(\n\t\t\t\t\t\t\t'beforeRead',\n\t\t\t\t\t\t\tObject.assign(Object.assign({\n\t\t\t\t\t\t\t\tfile\n\t\t\t\t\t\t\t}, this.getDetail()), {\n\t\t\t\t\t\t\t\tcallback: (ok) => {\n\t\t\t\t\t\t\t\t\tok ? resolve() : reject();\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}\n\t\t\t\tif (!res) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (uni.$u.test.promise(res)) {\n\t\t\t\t\tres.then((data) => this.onAfterRead(data || file));\n\t\t\t\t} else {\n\t\t\t\t\tthis.onAfterRead(file);\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetDetail(index) {\n\t\t\t\treturn {\n\t\t\t\t\tname: this.name,\n\t\t\t\t\tindex: index == null ? this.fileList.length : index,\n\t\t\t\t};\n\t\t\t},\n\t\t\tonAfterRead(file) {\n\t\t\t\tconst {\n\t\t\t\t\tmaxSize,\n\t\t\t\t\tafterRead\n\t\t\t\t} = this;\n\t\t\t\tconst oversize = Array.isArray(file) ?\n\t\t\t\t\tfile.some((item) => item.size > maxSize) :\n\t\t\t\t\tfile.size > maxSize;\n\t\t\t\tif (oversize) {\n\t\t\t\t\tthis.$emit('oversize', Object.assign({\n\t\t\t\t\t\tfile\n\t\t\t\t\t}, this.getDetail()));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (typeof afterRead === 'function') {\n\t\t\t\t\tafterRead(file, this.getDetail());\n\t\t\t\t}\n\t\t\t\tthis.$emit('afterRead', Object.assign({\n\t\t\t\t\tfile\n\t\t\t\t}, this.getDetail()));\n\t\t\t},\n\t\t\tdeleteItem(index) {\n\t\t\t\tthis.$emit(\n\t\t\t\t\t'delete',\n\t\t\t\t\tObject.assign(Object.assign({}, this.getDetail(index)), {\n\t\t\t\t\t\tfile: this.fileList[index],\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t},\n\t\t\t// 预览图片\n\t\t\tonPreviewImage(item) {\n\t\t\t\tif (!item.isImage || !this.previewFullImage) return\n\t\t\t\tuni.previewImage({\n\t\t\t\t\t// 先filter找出为图片的item，再返回filter结果中的图片url\n\t\t\t\t\turls: this.lists.filter((item) => this.accept === 'image' || uni.$u.test.image(item.url || item.thumb)).map((item) => item.url || item.thumb),\n\t\t\t\t\tcurrent: item.url || item.thumb,\n\t\t\t\t\tfail() {\n\t\t\t\t\t\tuni.$u.toast('预览图片失败')\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPreviewVideo(event) {\n\t\t\t\t// if (!this.data.previewFullImage) return;\n\t\t\t\tconsole.log(\"event\",event)\n\t\t\t\tthis.previewVideoSrc=event.url\n\t\t\t\t// const {\n\t\t\t\t// \tlists\n\t\t\t\t// } = this.data;\n\t\t\t\t// wx.previewMedia({\n\t\t\t\t// \tsources: lists\n\t\t\t\t// \t\t.filter((item) => isVideoFile(item))\n\t\t\t\t// \t\t.map((item) =>\n\t\t\t\t// \t\t\tObject.assign(Object.assign({}, item), {\n\t\t\t\t// \t\t\t\ttype: 'video'\n\t\t\t\t// \t\t\t})\n\t\t\t\t// \t\t),\n\t\t\t\t// \tcurrent: index,\n\t\t\t\t// \tfail() {\n\t\t\t\t// \t\tuni.$u.toast('预览视频失败')\n\t\t\t\t// \t},\n\t\t\t\t// });\n\t\t\t},\n\t\t\tpreviewVideoClose(){\n\t\t\t\tthis.previewVideoSrc=\"\"\n\t\t\t},\n\t\t\tonClickPreview(event) {\n\t\t\t\tconst {\n\t\t\t\t\tindex\n\t\t\t\t} = event.currentTarget.dataset;\n\t\t\t\tconst item = this.data.lists[index];\n\t\t\t\tthis.$emit(\n\t\t\t\t\t'clickPreview',\n\t\t\t\t\tObject.assign(Object.assign({}, item), this.getDetail(index))\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style lang=\"scss\" scoped>\n\t.preview-full {\n\t\t\tposition: fixed;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tbottom: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tz-index: 1002;\n\t\t}\n\t\t\n\t\t.preview-full video {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tz-index: 1002;\n\t\t}\n\t\t\n\t\t.preview-full-close {\n\t\t\tposition: fixed;\n\t\t\tright: 16px;\n\t\t\ttop: 20px;\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t\tline-height: 30px;\n\t\t\ttext-align: center;\n\t\t\tz-index: 1003;\n\t\t\tcolor: #fff;\n\t\t\tfont-size: 32px;\n\t\t\tfont-weight: bold;\n\t\t}\n\t\n\t@import '../../libs/css/components.scss';\n\t$u-upload-preview-border-radius: 2px !default;\n\t$u-upload-preview-margin: 0 8px 8px 0 !default;\n\t$u-upload-image-width:80px !default;\n\t$u-upload-image-height:$u-upload-image-width;\n\t$u-upload-other-bgColor: rgb(242, 242, 242) !default;\n\t$u-upload-other-flex:1 !default;\n\t$u-upload-text-font-size:11px !default;\n\t$u-upload-text-color:$u-tips-color !default;\n\t$u-upload-text-margin-top:2px !default;\n\t$u-upload-deletable-right:0 !default;\n\t$u-upload-deletable-top:0 !default;\n\t$u-upload-deletable-bgColor:rgb(55, 55, 55) !default;\n\t$u-upload-deletable-height:14px !default;\n\t$u-upload-deletable-width:$u-upload-deletable-height;\n\t$u-upload-deletable-boder-bottom-left-radius:100px !default;\n\t$u-upload-deletable-zIndex:3 !default;\n\t$u-upload-success-bottom:0 !default;\n\t$u-upload-success-right:0 !default;\n\t$u-upload-success-border-style:solid !default;\n\t$u-upload-success-border-top-color:transparent !default;\n\t$u-upload-success-border-left-color:transparent !default;\n\t$u-upload-success-border-bottom-color: $u-success !default;\n\t$u-upload-success-border-right-color:$u-upload-success-border-bottom-color;\n\t$u-upload-success-border-width:9px !default;\n\t$u-upload-icon-top:0px !default;\n\t$u-upload-icon-right:0px !default;\n\t$u-upload-icon-h5-top:1px !default;\n\t$u-upload-icon-h5-right:0 !default;\n\t$u-upload-icon-width:16px !default;\n\t$u-upload-icon-height:$u-upload-icon-width;\n\t$u-upload-success-icon-bottom:-10px !default;\n\t$u-upload-success-icon-right:-10px !default;\n\t$u-upload-status-right:0 !default;\n\t$u-upload-status-left:0 !default;\n\t$u-upload-status-bottom:0 !default;\n\t$u-upload-status-top:0 !default;\n\t$u-upload-status-bgColor:rgba(0, 0, 0, 0.5) !default;\n\t$u-upload-status-icon-Zindex:1 !default;\n\t$u-upload-message-font-size:12px !default;\n\t$u-upload-message-color:#FFFFFF !default;\n\t$u-upload-message-margin-top:5px !default;\n\t$u-upload-button-width:80px !default;\n\t$u-upload-button-height:$u-upload-button-width;\n\t$u-upload-button-bgColor:rgb(244, 245, 247) !default;\n\t$u-upload-button-border-radius:2px !default;\n\t$u-upload-botton-margin: 0 8px 8px 0 !default;\n\t$u-upload-text-font-size:11px !default;\n\t$u-upload-text-color:$u-tips-color !default;\n\t$u-upload-text-margin-top: 2px !default;\n\t$u-upload-hover-bgColor:rgb(230, 231, 233) !default;\n\t$u-upload-disabled-opacity:.5 !default;\n\n\t.u-upload {\n\t\t@include flex(column);\n\t\tflex: 1;\n\n\t\t&__wrap {\n\t\t\t@include flex;\n\t\t\tflex-wrap: wrap;\n\t\t\tflex: 1;\n\n\t\t\t&__preview {\n\t\t\t\tborder-radius: $u-upload-preview-border-radius;\n\t\t\t\tmargin: $u-upload-preview-margin;\n\t\t\t\tposition: relative;\n\t\t\t\toverflow: hidden;\n\t\t\t\t@include flex;\n\n\t\t\t\t&__image {\n\t\t\t\t\twidth: $u-upload-image-width;\n\t\t\t\t\theight: $u-upload-image-height;\n\t\t\t\t}\n\n\t\t\t\t&__other {\n\t\t\t\t\twidth: $u-upload-image-width;\n\t\t\t\t\theight: $u-upload-image-height;\n\t\t\t\t\tbackground-color: $u-upload-other-bgColor;\n\t\t\t\t\tflex: $u-upload-other-flex;\n\t\t\t\t\t@include flex(column);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\n\t\t\t\t\t&__text {\n\t\t\t\t\t\tfont-size: $u-upload-text-font-size;\n\t\t\t\t\t\tcolor: $u-upload-text-color;\n\t\t\t\t\t\tmargin-top: $u-upload-text-margin-top;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&__deletable {\n\t\t\tposition: absolute;\n\t\t\ttop: $u-upload-deletable-top;\n\t\t\tright: $u-upload-deletable-right;\n\t\t\tbackground-color: $u-upload-deletable-bgColor;\n\t\t\theight: $u-upload-deletable-height;\n\t\t\twidth: $u-upload-deletable-width;\n\t\t\t@include flex;\n\t\t\tborder-bottom-left-radius: $u-upload-deletable-boder-bottom-left-radius;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tz-index: $u-upload-deletable-zIndex;\n\n\t\t\t&__icon {\n\t\t\t\tposition: absolute;\n\t\t\t\ttransform: scale(0.7);\n\t\t\t\ttop: $u-upload-icon-top;\n\t\t\t\tright: $u-upload-icon-right;\n\t\t\t\t/* #ifdef H5 */\n\t\t\t\ttop: $u-upload-icon-h5-top;\n\t\t\t\tright: $u-upload-icon-h5-right;\n\t\t\t\t/* #endif */\n\t\t\t}\n\t\t}\n\n\t\t&__success {\n\t\t\tposition: absolute;\n\t\t\tbottom: $u-upload-success-bottom;\n\t\t\tright: $u-upload-success-right;\n\t\t\t@include flex;\n\t\t\t// 由于weex(nvue)为阿里巴巴的KPI(部门业绩考核)的laji产物，不支持css绘制三角形\n\t\t\t// 所以在nvue下使用图片，非nvue下使用css实现\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tborder-style: $u-upload-success-border-style;\n\t\t\tborder-top-color: $u-upload-success-border-top-color;\n\t\t\tborder-left-color: $u-upload-success-border-left-color;\n\t\t\tborder-bottom-color: $u-upload-success-border-bottom-color;\n\t\t\tborder-right-color: $u-upload-success-border-right-color;\n\t\t\tborder-width: $u-upload-success-border-width;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\t/* #endif */\n\n\t\t\t&__icon {\n\t\t\t\t/* #ifndef APP-NVUE */\n\t\t\t\tposition: absolute;\n\t\t\t\ttransform: scale(0.7);\n\t\t\t\tbottom: $u-upload-success-icon-bottom;\n\t\t\t\tright: $u-upload-success-icon-right;\n\t\t\t\t/* #endif */\n\t\t\t\t/* #ifdef APP-NVUE */\n\t\t\t\twidth: $u-upload-icon-width;\n\t\t\t\theight: $u-upload-icon-height;\n\t\t\t\t/* #endif */\n\t\t\t}\n\t\t}\n\n\t\t&__status {\n\t\t\tposition: absolute;\n\t\t\ttop: $u-upload-status-top;\n\t\t\tbottom: $u-upload-status-bottom;\n\t\t\tleft: $u-upload-status-left;\n\t\t\tright: $u-upload-status-right;\n\t\t\tbackground-color: $u-upload-status-bgColor;\n\t\t\t@include flex(column);\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\n\t\t\t&__icon {\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: $u-upload-status-icon-Zindex;\n\t\t\t}\n\n\t\t\t&__message {\n\t\t\t\tfont-size: $u-upload-message-font-size;\n\t\t\t\tcolor: $u-upload-message-color;\n\t\t\t\tmargin-top: $u-upload-message-margin-top;\n\t\t\t}\n\t\t}\n\n\t\t&__button {\n\t\t\t@include flex(column);\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: $u-upload-button-width;\n\t\t\theight: $u-upload-button-height;\n\t\t\tbackground-color: $u-upload-button-bgColor;\n\t\t\tborder-radius: $u-upload-button-border-radius;\n\t\t\tmargin: $u-upload-botton-margin;\n\t\t\t/* #ifndef APP-NVUE */\n\t\t\tbox-sizing: border-box;\n\t\t\t/* #endif */\n\n\t\t\t&__text {\n\t\t\t\tfont-size: $u-upload-text-font-size;\n\t\t\t\tcolor: $u-upload-text-color;\n\t\t\t\tmargin-top: $u-upload-text-margin-top;\n\t\t\t}\n\n\t\t\t&--hover {\n\t\t\t\tbackground-color: $u-upload-hover-bgColor;\n\t\t\t}\n\n\t\t\t&--disabled {\n\t\t\t\topacity: $u-upload-disabled-opacity;\n\t\t\t}\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/components/u-upload/utils.js",
    "content": "function pickExclude(obj, keys) {\n\t// 某些情况下，type可能会为\n    if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) {\n        return {}\n    }\n    return Object.keys(obj).reduce((prev, key) => {\n        if (!keys.includes(key)) {\n            prev[key] = obj[key]\n        }\n        return prev\n    }, {})\n}\n\nfunction formatImage(res) {\n    return res.tempFiles.map((item) => ({\n        ...pickExclude(item, ['path']),\n        type: 'image',\n        url: item.path,\n        thumb: item.path,\n\t\tsize: item.size,\n\t\t// #ifdef H5\n\t\tname: item.name\n\t\t// #endif\n    }))\n}\n\nfunction formatVideo(res) {\n    return [\n        {\n            ...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']),\n            type: 'video',\n            url: res.tempFilePath,\n            thumb: res.thumbTempFilePath,\n\t\t\tsize: res.size,\n\t\t\t// #ifdef H5\n\t\t\tname: res.name\n\t\t\t// #endif\n        }\n    ]\n}\n\nfunction formatMedia(res) {\n    return res.tempFiles.map((item) => ({\n        ...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']),\n        type: res.type,\n        url: item.tempFilePath,\n        thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath,\n\t\tsize: item.size\n    }))\n}\n\nfunction formatFile(res) {\n    return res.tempFiles.map((item) => ({ \n\t\t...pickExclude(item, ['path']), \n\t\turl: item.path, \n\t\tsize:item.size,\n\t\t// #ifdef H5\n\t\tname: item.name,\n\t\ttype: item.type\n\t\t// #endif \n\t}))\n}\nexport function chooseFile({\n    accept,\n    multiple,\n    capture,\n    compressed,\n    maxDuration,\n    sizeType,\n    camera,\n    maxCount\n}) {\n    return new Promise((resolve, reject) => {\n        switch (accept) {\n        case 'image':\n            uni.chooseImage({\n                count: multiple ? Math.min(maxCount, 9) : 1,\n                sourceType: capture,\n                sizeType,\n                success: (res) => resolve(formatImage(res)),\n                fail: reject\n            })\n            break\n            // #ifdef MP-WEIXIN\n            // 只有微信小程序才支持chooseMedia接口\n        case 'media':\n            wx.chooseMedia({\n                count: multiple ? Math.min(maxCount, 9) : 1,\n                sourceType: capture,\n                maxDuration,\n                sizeType,\n                camera,\n                success: (res) => resolve(formatMedia(res)),\n                fail: reject\n            })\n            break\n            // #endif\n        case 'video':\n            uni.chooseVideo({\n                sourceType: capture,\n                compressed,\n                maxDuration,\n                camera,\n                success: (res) => resolve(formatVideo(res)),\n                fail: reject\n            })\n            break\n            // #ifdef MP-WEIXIN || H5\n            // 只有微信小程序才支持chooseMessageFile接口\n        case 'file':\n            // #ifdef MP-WEIXIN\n            wx.chooseMessageFile({\n                count: multiple ? maxCount : 1,\n                type: accept,\n                success: (res) => resolve(formatFile(res)),\n                fail: reject\n            })\n            // #endif\n            // #ifdef H5\n            // 需要hx2.9.9以上才支持uni.chooseFile\n            uni.chooseFile({\n                count: multiple ? maxCount : 1,\n                type: accept,\n                success: (res) => resolve(formatFile(res)),\n                fail: reject\n            })\n            // #endif\n            break\n\t\t\t\t// #endif\n\t\tdefault: \n\t\t\t// 此为保底选项，在accept不为上面任意一项的时候选取全部文件\n\t\t\t// #ifdef MP-WEIXIN\n\t\t\twx.chooseMessageFile({\n\t\t\t    count: multiple ? maxCount : 1,\n\t\t\t    type: 'all',\n\t\t\t    success: (res) => resolve(formatFile(res)),\n\t\t\t    fail: reject\n\t\t\t})\n\t\t\t// #endif\n\t\t\t// #ifdef H5\n\t\t\t// 需要hx2.9.9以上才支持uni.chooseFile\n\t\t\tuni.chooseFile({\n\t\t\t\tcount: multiple ? maxCount : 1,\n\t\t\t\ttype: 'all',\n\t\t\t\tsuccess: (res) => resolve(formatFile(res)),\n\t\t\t\tfail: reject\n\t\t\t})\n\t\t\t// #endif\n        }\n    })\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/components/uview-ui/uview-ui.vue",
    "content": "<template>\n</template>\n\n<template>\n\t<view></view>\n</template>\n\n<script>\n\texport default {\n\t\t\n\t}\n</script>\n\n<style>\n</style>\n"
  },
  {
    "path": "uni_modules/uview-ui/index.js",
    "content": "// 看到此报错，是因为没有配置vue.config.js的【transpileDependencies】，详见：https://www.uviewui.com/components/npmSetting.html#_5-cli模式额外配置\nconst pleaseSetTranspileDependencies = {}, babelTest = pleaseSetTranspileDependencies?.test\n\n\n\n// 引入全局mixin\nimport mixin from './libs/mixin/mixin.js'\n// 小程序特有的mixin\nimport mpMixin from './libs/mixin/mpMixin.js'\n// 全局挂载引入http相关请求拦截插件\nimport Request from './libs/luch-request'\n\n// 路由封装\nimport route from './libs/util/route.js'\n// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制\nimport colorGradient from './libs/function/colorGradient.js'\n\n// 规则检验\nimport test from './libs/function/test.js'\n// 防抖方法\nimport debounce from './libs/function/debounce.js'\n// 节流方法\nimport throttle from './libs/function/throttle.js'\n// 公共文件写入的方法\nimport index from './libs/function/index.js'\n\n// 配置信息\nimport config from './libs/config/config.js'\n// props配置信息\nimport props from './libs/config/props.js'\n// 各个需要fixed的地方的z-index配置文件\nimport zIndex from './libs/config/zIndex.js'\n// 关于颜色的配置，特殊场景使用\nimport color from './libs/config/color.js'\n// 平台\nimport platform from './libs/function/platform'\n\nconst $u = {\n    route,\n    date: index.timeFormat, // 另名date\n    colorGradient: colorGradient.colorGradient,\n    hexToRgb: colorGradient.hexToRgb,\n    rgbToHex: colorGradient.rgbToHex,\n    colorToRgba: colorGradient.colorToRgba,\n    test,\n    type: ['primary', 'success', 'error', 'warning', 'info'],\n    http: new Request(),\n    config, // uView配置信息相关，比如版本号\n    zIndex,\n    debounce,\n    throttle,\n    mixin,\n    mpMixin,\n    props,\n    ...index,\n    color,\n    platform\n}\n\n// $u挂载到uni对象上\nuni.$u = $u\n\nconst install = (Vue) => {\n    // 时间格式化，同时两个名称，date和timeFormat\n    Vue.filter('timeFormat', (timestamp, format) => uni.$u.timeFormat(timestamp, format))\n    Vue.filter('date', (timestamp, format) => uni.$u.timeFormat(timestamp, format))\n    // 将多久以前的方法，注入到全局过滤器\n    Vue.filter('timeFrom', (timestamp, format) => uni.$u.timeFrom(timestamp, format))\n    // 同时挂载到uni和Vue.prototype中\n    // #ifndef APP-NVUE\n    // 只有vue，挂载到Vue.prototype才有意义，因为nvue中全局Vue.prototype和Vue.mixin是无效的\n    Vue.prototype.$u = $u\n    Vue.mixin(mixin)\n    // #endif\n}\n\nexport default {\n    install\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/index.scss",
    "content": "// 引入公共基础类\n@import \"./libs/css/common.scss\";\n@import \"./libs/css/color.scss\";\n\n// 非nvue的样式\n/* #ifndef APP-NVUE */\n@import \"./libs/css/vue.scss\";\n/* #endif */\n\n// nvue的特有样式\n/* #ifdef APP-NVUE */\n@import \"./libs/css/nvue.scss\";\n/* #endif */\n\n// 小程序特有的样式\n/* #ifdef MP */\n@import \"./libs/css/mp.scss\";\n/* #endif */\n\n// H5特有的样式\n/* #ifdef H5 */\n@import \"./libs/css/h5.scss\";\n/* #endif */"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/color.js",
    "content": "// 为了让用户能够自定义主题，会逐步弃用此文件，各颜色通过css提供\n// 为了给某些特殊场景使用和向后兼容，无需删除此文件(2020-06-20)\nconst color = {\n    primary: '#3c9cff',\n    info: '#909399',\n    default: '#909399',\n    warning: '#f9ae3d',\n    error: '#f56c6c',\n    success: '#5ac725',\n    mainColor: '#303133',\n    contentColor: '#606266',\n    tipsColor: '#909399',\n    lightColor: '#c0c4cc',\n    borderColor: '#e4e7ed'\n}\n\nexport default color\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/config.js",
    "content": "// 此版本发布于2022-00-24\nconst version = '2.0.34'\n\n// 开发环境才提示，生产环境不会提示\nif (process.env.NODE_ENV === 'development') {\n\tconsole.log(`\\n %c uView V${version} %c https://uviewui.com/ \\n\\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;');\n}\n\nexport default {\n    v: version,\n    version,\n    // 主题名称\n    type: [\n        'primary',\n        'success',\n        'info',\n        'error',\n        'warning'\n    ],\n    // 颜色部分，本来可以通过scss的:export导出供js使用，但是奈何nvue不支持\n    color: {\n        'u-primary': '#2979ff',\n        'u-warning': '#ff9900',\n        'u-success': '#19be6b',\n        'u-error': '#fa3534',\n        'u-info': '#909399',\n        'u-main-color': '#303133',\n        'u-content-color': '#606266',\n        'u-tips-color': '#909399',\n        'u-light-color': '#c0c4cc'\n    },\n\t// 默认单位，可以通过配置为rpx，那么在用于传入组件大小参数为数值时，就默认为rpx\n\tunit: 'px'\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/actionSheet.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:44:35\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/actionSheet.js\n */\nexport default {\n    // action-sheet组件\n    actionSheet: {\n        show: false,\n        title: '',\n        description: '',\n        actions: () => [],\n        index: '',\n        cancelText: '',\n        closeOnClickAction: true,\n        safeAreaInsetBottom: true,\n        openType: '',\n        closeOnClickOverlay: true,\n        round: 0\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/album.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:47:24\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/album.js\n */\nexport default {\n    // album 组件\n    album: {\n        urls: () => [],\n        keyName: '',\n        singleSize: 180,\n        multipleSize: 70,\n        space: 6,\n        singleMode: 'scaleToFill',\n        multipleMode: 'aspectFill',\n        maxCount: 9,\n        previewFullImage: true,\n        rowCount: 3,\n        showMore: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/alert.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:48:53\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/alert.js\n */\nexport default {\n    // alert警告组件\n    alert: {\n        title: '',\n        type: 'warning',\n        description: '',\n        closable: false,\n        showIcon: false,\n        effect: 'light',\n        center: false,\n        fontSize: 14\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/avatar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:49:22\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/avatar.js\n */\nexport default {\n    // avatar 组件\n    avatar: {\n        src: '',\n        shape: 'circle',\n        size: 40,\n        mode: 'scaleToFill',\n        text: '',\n        bgColor: '#c0c4cc',\n        color: '#ffffff',\n        fontSize: 18,\n        icon: '',\n        mpAvatar: false,\n        randomBgColor: false,\n        defaultUrl: '',\n        colorIndex: '',\n        name: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/avatarGroup.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:49:55\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/avatarGroup.js\n */\nexport default {\n    // avatarGroup 组件\n    avatarGroup: {\n        urls: () => [],\n        maxCount: 5,\n        shape: 'circle',\n        mode: 'scaleToFill',\n        showMore: true,\n        size: 40,\n        keyName: '',\n        gap: 0.5,\n\t\textraValue: 0\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/backtop.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:50:18\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/backtop.js\n */\nexport default {\n    // backtop组件\n    backtop: {\n        mode: 'circle',\n        icon: 'arrow-upward',\n        text: '',\n        duration: 100,\n        scrollTop: 0,\n        top: 400,\n        bottom: 100,\n        right: 20,\n        zIndex: 9,\n        iconStyle: () => ({\n            color: '#909399',\n            fontSize: '19px'\n        })\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/badge.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-23 19:51:50\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/badge.js\n */\nexport default {\n    // 徽标数组件\n    badge: {\n        isDot: false,\n        value: '',\n        show: true,\n        max: 999,\n        type: 'error',\n        showZero: false,\n        bgColor: null,\n        color: null,\n        shape: 'circle',\n        numberType: 'overflow',\n        offset: () => [],\n        inverted: false,\n        absolute: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/button.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:51:27\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/button.js\n */\nexport default {\n    // button组件\n    button: {\n        hairline: false,\n        type: 'info',\n        size: 'normal',\n        shape: 'square',\n        plain: false,\n        disabled: false,\n        loading: false,\n        loadingText: '',\n        loadingMode: 'spinner',\n        loadingSize: 15,\n        openType: '',\n        formType: '',\n        appParameter: '',\n        hoverStopPropagation: true,\n        lang: 'en',\n        sessionFrom: '',\n        sendMessageTitle: '',\n        sendMessagePath: '',\n        sendMessageImg: '',\n        showMessageCard: false,\n        dataName: '',\n        throttleTime: 0,\n        hoverStartTime: 0,\n        hoverStayTime: 200,\n        text: '',\n        icon: '',\n        iconColor: '',\n        color: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/calendar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:52:43\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/calendar.js\n */\nexport default {\n    // calendar 组件\n    calendar: {\n        title: '日期选择',\n        showTitle: true,\n        showSubtitle: true,\n        mode: 'single',\n        startText: '开始',\n        endText: '结束',\n        customList: () => [],\n        color: '#3c9cff',\n        minDate: 0,\n        maxDate: 0,\n        defaultDate: null,\n        maxCount: Number.MAX_SAFE_INTEGER, // Infinity\n        rowHeight: 56,\n        formatter: null,\n        showLunar: false,\n        showMark: true,\n        confirmText: '确定',\n        confirmDisabledText: '确定',\n        show: false,\n        closeOnClickOverlay: false,\n        readonly: false,\n        showConfirm: true,\n        maxRange: Number.MAX_SAFE_INTEGER, // Infinity\n        rangePrompt: '',\n        showRangePrompt: true,\n        allowSameDay: false,\n\t\tround: 0,\n\t\tmonthNum: 3\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/carKeyboard.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:53:20\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/carKeyboard.js\n */\nexport default {\n    // 车牌号键盘\n    carKeyboard: {\n        random: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/cell.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-23 20:53:09\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/cell.js\n */\nexport default {\n\t// cell组件的props\n\tcell: {\n\t\tcustomClass: '',\n\t\ttitle: '',\n\t\tlabel: '',\n\t\tvalue: '',\n\t\ticon: '',\n\t\tdisabled: false,\n\t\tborder: true,\n\t\tcenter: false,\n\t\turl: '',\n\t\tlinkType: 'navigateTo',\n\t\tclickable: false,\n\t\tisLink: false,\n\t\trequired: false,\n\t\tarrowDirection: '',\n\t\ticonStyle: {},\n\t\trightIconStyle: {},\n\t\trightIcon: 'arrow-right',\n\t\ttitleStyle: {},\n\t\tsize: '',\n\t\tstop: true,\n\t\tname: ''\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/cellGroup.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:54:16\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/cellGroup.js\n */\nexport default {\n    // cell-group组件的props\n    cellGroup: {\n        title: '',\n        border: true,\n        customStyle: {}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/checkbox.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-23 21:06:59\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/checkbox.js\n */\nexport default {\n    // checkbox组件\n    checkbox: {\n        name: '',\n        shape: '',\n        size: '',\n        checkbox: false,\n        disabled: '',\n        activeColor: '',\n        inactiveColor: '',\n        iconSize: '',\n        iconColor: '',\n        label: '',\n        labelSize: '',\n        labelColor: '',\n        labelDisabled: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/checkboxGroup.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:54:47\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/checkboxGroup.js\n */\nexport default {\n    // checkbox-group组件\n    checkboxGroup: {\n        name: '',\n        value: () => [],\n        shape: 'square',\n        disabled: false,\n        activeColor: '#2979ff',\n        inactiveColor: '#c8c9cc',\n        size: 18,\n        placement: 'row',\n        labelSize: 14,\n        labelColor: '#303133',\n        labelDisabled: false,\n        iconColor: '#ffffff',\n        iconSize: 12,\n        iconPlacement: 'left',\n        borderBottom: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/circleProgress.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:55:02\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/circleProgress.js\n */\nexport default {\n    // circleProgress 组件\n    circleProgress: {\n        percentage: 30\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/code.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:55:27\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/code.js\n */\n\nexport default {\n    // code 组件\n    code: {\n        seconds: 60,\n        startText: '获取验证码',\n        changeText: 'X秒重新获取',\n        endText: '重新获取',\n        keepRunning: false,\n        uniqueKey: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/codeInput.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:55:58\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/codeInput.js\n */\nexport default {\n    // codeInput 组件\n    codeInput: {\n\t\tadjustPosition: true,\n        maxlength: 6,\n        dot: false,\n        mode: 'box',\n        hairline: false,\n        space: 10,\n        value: '',\n        focus: false,\n        bold: false,\n        color: '#606266',\n        fontSize: 18,\n        size: 35,\n        disabledKeyboard: false,\n        borderColor: '#c9cacc',\n\t\tdisabledDot: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/col.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:56:12\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/col.js\n */\nexport default {\n    // col 组件\n    col: {\n        span: 12,\n        offset: 0,\n        justify: 'start',\n        align: 'stretch',\n        textAlign: 'left'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/collapse.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:56:30\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/collapse.js\n */\nexport default {\n    // collapse 组件\n    collapse: {\n        value: null,\n        accordion: false,\n        border: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/collapseItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:56:42\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/collapseItem.js\n */\nexport default {\n    // collapseItem 组件\n    collapseItem: {\n        title: '',\n        value: '',\n        label: '',\n        disabled: false,\n        isLink: true,\n        clickable: true,\n        border: true,\n        align: 'left',\n        name: '',\n        icon: '',\n        duration: 300\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/columnNotice.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:57:16\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/columnNotice.js\n */\nexport default {\n    // columnNotice 组件\n    columnNotice: {\n        text: '',\n        icon: 'volume',\n        mode: '',\n        color: '#f9ae3d',\n        bgColor: '#fdf6ec',\n        fontSize: 14,\n        speed: 80,\n        step: false,\n        duration: 1500,\n        disableTouch: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/countDown.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:11:29\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/countDown.js\n */\nexport default {\n    // u-count-down 计时器组件\n    countDown: {\n        time: 0,\n        format: 'HH:mm:ss',\n        autoStart: true,\n        millisecond: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/countTo.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:57:32\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/countTo.js\n */\nexport default {\n    // countTo 组件\n    countTo: {\n        startVal: 0,\n        endVal: 0,\n        duration: 2000,\n        autoplay: true,\n        decimals: 0,\n        useEasing: true,\n        decimal: '.',\n        color: '#606266',\n        fontSize: 22,\n        bold: false,\n        separator: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/datetimePicker.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:57:48\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/datetimePicker.js\n */\nexport default {\n    // datetimePicker 组件\n    datetimePicker: {\n        show: false,\n        showToolbar: true,\n        value: '',\n        title: '',\n        mode: 'datetime',\n        maxDate: new Date(new Date().getFullYear() + 10, 0, 1).getTime(),\n        minDate: new Date(new Date().getFullYear() - 10, 0, 1).getTime(),\n        minHour: 0,\n        maxHour: 23,\n        minMinute: 0,\n        maxMinute: 59,\n        filter: null,\n        formatter: null,\n        loading: false,\n        itemHeight: 44,\n        cancelText: '取消',\n        confirmText: '确认',\n        cancelColor: '#909193',\n        confirmColor: '#3c9cff',\n        visibleItemCount: 5,\n        closeOnClickOverlay: false,\n        defaultIndex: () => []\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/divider.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:58:03\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/divider.js\n */\nexport default {\n    // divider组件\n    divider: {\n        dashed: false,\n        hairline: true,\n        dot: false,\n        textPosition: 'center',\n        text: '',\n        textSize: 14,\n        textColor: '#909399',\n        lineColor: '#dcdfe6'\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/empty.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:03:27\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/empty.js\n */\nexport default {\n    // empty组件\n    empty: {\n        icon: '',\n        text: '',\n        textColor: '#c0c4cc',\n        textSize: 14,\n        iconColor: '#c0c4cc',\n        iconSize: 90,\n        mode: 'data',\n        width: 160,\n        height: 160,\n        show: true,\n        marginTop: 0\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/form.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:03:49\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/form.js\n */\nexport default {\n    // form 组件\n    form: {\n        model: () => ({}),\n        rules: () => ({}),\n        errorType: 'message',\n        borderBottom: true,\n        labelPosition: 'left',\n        labelWidth: 45,\n        labelAlign: 'left',\n        labelStyle: () => ({})\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/formItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:04:32\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/formItem.js\n */\nexport default {\n    // formItem 组件\n    formItem: {\n        label: '',\n        prop: '',\n        borderBottom: '',\n        labelPosition: '',\n        labelWidth: '',\n        rightIcon: '',\n        leftIcon: '',\n        required: false,\n        leftIconStyle: '',\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/gap.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:05:25\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/gap.js\n */\nexport default {\n    // gap组件\n    gap: {\n        bgColor: 'transparent',\n        height: 20,\n        marginTop: 0,\n        marginBottom: 0,\n        customStyle: {}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/grid.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:05:57\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/grid.js\n */\nexport default {\n    // grid组件\n    grid: {\n        col: 3,\n        border: false,\n        align: 'left'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/gridItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:06:13\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/gridItem.js\n */\nexport default {\n    // grid-item组件\n    gridItem: {\n        name: null,\n        bgColor: 'transparent'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/icon.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 18:00:14\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/icon.js\n */\nimport config from '../config'\n\nconst {\n    color\n} = config\nexport default {\n    // icon组件\n    icon: {\n        name: '',\n        color: color['u-content-color'],\n        size: '16px',\n        bold: false,\n        index: '',\n        hoverClass: '',\n        customPrefix: 'uicon',\n        label: '',\n        labelPos: 'right',\n        labelSize: '15px',\n        labelColor: color['u-content-color'],\n        space: '3px',\n        imgMode: '',\n        width: '',\n        height: '',\n        top: 0,\n        stop: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/image.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:01:51\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/image.js\n */\nexport default {\n    // image组件\n    image: {\n        src: '',\n        mode: 'aspectFill',\n        width: '300',\n        height: '225',\n        shape: 'square',\n        radius: 0,\n        lazyLoad: true,\n        showMenuByLongpress: true,\n        loadingIcon: 'photo',\n        errorIcon: 'error-circle',\n        showLoading: true,\n        showError: true,\n        fade: true,\n        webp: false,\n        duration: 500,\n        bgColor: '#f3f4f6'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/indexAnchor.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:13:15\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/indexAnchor.js\n */\nexport default {\n    // indexAnchor 组件\n    indexAnchor: {\n        text: '',\n        color: '#606266',\n        size: 14,\n        bgColor: '#dedede',\n        height: 32\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/indexList.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:13:35\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/indexList.js\n */\nexport default {\n    // indexList 组件\n    indexList: {\n        inactiveColor: '#606266',\n        activeColor: '#5677fc',\n        indexList: () => [],\n        sticky: true,\n        customNavHeight: 0\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/input.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:13:55\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/input.js\n */\nexport default {\n\t// index 组件\n\tinput: {\n\t\tvalue: '',\n\t\ttype: 'text',\n\t\tfixed: false,\n\t\tdisabled: false,\n\t\tdisabledColor: '#f5f7fa',\n\t\tclearable: false,\n\t\tpassword: false,\n\t\tmaxlength: -1,\n\t\tplaceholder: null,\n\t\tplaceholderClass: 'input-placeholder',\n\t\tplaceholderStyle: 'color: #c0c4cc',\n\t\tshowWordLimit: false,\n\t\tconfirmType: 'done',\n\t\tconfirmHold: false,\n\t\tholdKeyboard: false,\n\t\tfocus: false,\n\t\tautoBlur: false,\n\t\tdisableDefaultPadding: false,\n\t\tcursor: -1,\n\t\tcursorSpacing: 30,\n\t\tselectionStart: -1,\n\t\tselectionEnd: -1,\n\t\tadjustPosition: true,\n\t\tinputAlign: 'left',\n\t\tfontSize: '15px',\n\t\tcolor: '#303133',\n\t\tprefixIcon: '',\n\t\tprefixIconStyle: '',\n\t\tsuffixIcon: '',\n\t\tsuffixIconStyle: '',\n\t\tborder: 'surround',\n\t\treadonly: false,\n\t\tshape: 'square',\n\t\tformatter: null\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/keyboard.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:07:49\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/keyboard.js\n */\nexport default {\n    // 键盘组件\n    keyboard: {\n        mode: 'number',\n        dotDisabled: false,\n        tooltip: true,\n        showTips: true,\n        tips: '',\n        showCancel: true,\n        showConfirm: true,\n        random: false,\n        safeAreaInsetBottom: true,\n        closeOnClickOverlay: true,\n        show: false,\n        overlay: true,\n        zIndex: 10075,\n        cancelText: '取消',\n        confirmText: '确定',\n        autoChange: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/line.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:04:49\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/line.js\n */\nexport default {\n    // line组件\n    line: {\n        color: '#d6d7d9',\n        length: '100%',\n        direction: 'row',\n        hairline: true,\n        margin: 0,\n        dashed: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/lineProgress.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:14:11\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/lineProgress.js\n */\nexport default {\n    // lineProgress 组件\n    lineProgress: {\n        activeColor: '#19be6b',\n        inactiveColor: '#ececec',\n        percentage: 0,\n        showText: true,\n        height: 12\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/link.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:45:36\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/link.js\n */\nimport config from '../config'\n\nconst {\n    color\n} = config\nexport default {\n    // link超链接组件props参数\n    link: {\n        color: color['u-primary'],\n        fontSize: 15,\n        underLine: false,\n        href: '',\n        mpTips: '链接已复制，请在浏览器打开',\n        lineColor: '',\n        text: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/list.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:14:53\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/list.js\n */\nexport default {\n    // list 组件\n    list: {\n        showScrollbar: false,\n        lowerThreshold: 50,\n        upperThreshold: 0,\n        scrollTop: 0,\n        offsetAccuracy: 10,\n        enableFlex: false,\n        pagingEnabled: false,\n        scrollable: true,\n        scrollIntoView: '',\n        scrollWithAnimation: false,\n        enableBackToTop: false,\n        height: 0,\n        width: 0,\n        preLoadScreen: 1\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/listItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:15:40\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/listItem.js\n */\nexport default {\n    // listItem 组件\n    listItem: {\n        anchor: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/loadingIcon.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:45:47\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/loadingIcon.js\n */\nimport config from '../config'\n\nconst {\n    color\n} = config\nexport default {\n    // loading-icon加载中图标组件\n    loadingIcon: {\n        show: true,\n        color: color['u-tips-color'],\n        textColor: color['u-tips-color'],\n        vertical: false,\n        mode: 'spinner',\n        size: 24,\n        textSize: 15,\n        text: '',\n        timingFunction: 'ease-in-out',\n        duration: 1200,\n        inactiveColor: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/loadingPage.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:00:23\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/loadingPage.js\n */\nexport default {\n    // loading-page组件\n    loadingPage: {\n        loadingText: '正在加载',\n        image: '',\n        loadingMode: 'circle',\n        loading: false,\n        bgColor: '#ffffff',\n        color: '#C8C8C8',\n        fontSize: 19,\n        iconSize: 28,\n        loadingColor: '#C8C8C8'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/loadmore.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:15:26\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/loadmore.js\n */\nexport default {\n    // loadmore 组件\n    loadmore: {\n        status: 'loadmore',\n        bgColor: 'transparent',\n        icon: true,\n        fontSize: 14,\n\t\ticonSize: 17,\n        color: '#606266',\n        loadingIcon: 'spinner',\n        loadmoreText: '加载更多',\n        loadingText: '正在加载...',\n        nomoreText: '没有更多了',\n        isDot: false,\n        iconColor: '#b7b7b7',\n        marginTop: 10,\n        marginBottom: 10,\n        height: 'auto',\n        line: false,\n\t\tlineColor: '#E6E8EB',\n\t\tdashed: false,\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/modal.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:15:59\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/modal.js\n */\nexport default {\n    // modal 组件\n    modal: {\n        show: false,\n        title: '',\n        content: '',\n        confirmText: '确认',\n        cancelText: '取消',\n        showConfirmButton: true,\n        showCancelButton: false,\n        confirmColor: '#2979ff',\n        cancelColor: '#606266',\n        buttonReverse: false,\n        zoom: true,\n        asyncClose: false,\n        closeOnClickOverlay: false,\n        negativeTop: 0,\n        width: '650rpx',\n        confirmButtonShape: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/navbar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:16:18\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/navbar.js\n */\nimport color from '../color'\nexport default {\n    // navbar 组件\n    navbar: {\n        safeAreaInsetTop: true,\n        placeholder: false,\n        fixed: true,\n        border: false,\n        leftIcon: 'arrow-left',\n        leftText: '',\n        rightText: '',\n        rightIcon: '',\n        title: '',\n        bgColor: '#ffffff',\n        titleWidth: '400rpx',\n        height: '44px',\n\t\tleftIconSize: 20,\n\t\tleftIconColor: color.mainColor,\n\t\tautoBack: false,\n\t\ttitleStyle: ''\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/noNetwork.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:16:39\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/noNetwork.js\n */\nexport default {\n    // noNetwork\n    noNetwork: {\n        tips: '哎呀，网络信号丢失',\n        zIndex: '',\n        image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAADYYILnAABAAElEQVR4Ae29CZhkV3kefNeq6m2W7tn3nl0aCbHIAgmQPGB+sLCNzSID9g9PYrAf57d/+4+DiW0cy8QBJ06c2In/PLFDHJ78+MGCGNsYgyxwIwktwEijAc1ohtmnZ+2Z7p5eq6vu9r/vuXWrq25VdVV1V3dXVX9Hmj73nv285963vvOd75yraeIEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaD8E9PbrkvRopSMwMBBYRs+5O/yJS68cPnzYXel4tFP/jXbqjPRFEAiCQNe6Bw/6gdFn9Oy9Q90LLG2DgBBW2wyldIQIPPPCte2a5q3jtR+4ff/4wuBuXotrDwSEsNpjHKUXQODppy+udYJMEUEZgbd94DvnNwlA7YGAEFZ7jOOK78Xp06eTTkq7sxwQhmXuf/754VXl4iSstRAQwmqt8ZLWlkHg0UcD49qYfUjXfLtMtOZ7npExJu4iqZWLl7DWQUAIq3XGSlpaAYHD77q8xwuCOSUoXw8Sl0eMux977DGzQjES3AIICGG1wCBJEysj8PXnz230XXdr5RQFMYbRvWnv6w8UhMhliyGwYghr4Pjg3oEXL34ey9zyC9tiD2ml5h47dr1LN7S6CMjz/A3PvHh1Z6UyJby5EVgRhKUe7Kz/JU0LfvrJo5f+Y3MPibSuFgQGBgasYSd9l6GDsup0WS/T/9RTp9fXmU2SNwECdQ92E7S57iaMeJnPQLK6ixkDLfjlb7546RfrLkQyNBcC3dsP6oHWMd9G+V3JgwPHh7rnm1/yLQ8CbU9Y33zp0j+nZFUMb/DHmB7+SHGY3LUKAk8cObtD00xlHDrfNge+Z2ozU3c9dvx4Yr5lSL6lR6CtCWvg6OAPw9z538ZhhZRl6XrwhW8du1KX/iNejtwvPQIDR8+vSRqJ/obU7GupjdNdh2gW0ZDypJBFR6BtB2rg2OVtuub9JcmpHIpBoK1xfffLzx4f7C0XL2HNiYDp6bs9z23Ypn1fC1Y/9PCFDc3ZW2lVHIG2JKzTp4Ok7nv/G6Q054MIvda+bNb74pEgKGtwGAdL7pcfAa8vOKEZ2kyjWuLr7uDh+/qvN6o8KWdxEWhLwroyeek/g4zuqwU6kNrhyZcu/UktaSXN8iNwuL9/RuvVXtJ9PbPQ1vhmcP6t9+47u9ByJP/SIdB2hDVw9MJHQFYfrQdCph84evFX68kjaZcPAZJWwjMXRFpJ2zr91tfuvrh8vZCa54NA2xGWrunvmg8QWCJ/N4ir7fCYDxatkOeBB7an501agXbygVdvv9IK/ZQ2FiPQdi9osGbH+zRNf7y4m9Xu9Me7N9nv0HXdr5ZS4psHgXpJC9P/wDRTx0Vn1TxjWG9LGrbaUm/Fi5meSvcrkxf/Cg/ow9XqAUk91v3qHT97r6471dJKfHMi8Oyzgx1Z03t1YAQVT2MwgsC3u+yXHzi0faQ5eyGtqgWBtpOw2Ol9+/TM+sTOn8L08MtzgQCy+tOHXr3jA0JWc6HU/HF5Scssr4jXcYqfP6V/T8iq+ceyWgvbUsKKOn38eJAYyl56TAuCEr2WYei//9Crd/5GlFb81kdASVopSFrerKRlaoZj9HR+700H10+0fg+lB21NWBxe2lhNHsUpDZr27mi4dV379R9+za4/iO7Fbx8ECknLCPTsTDJ17O33bJpqnx6u7J60PWFxeAcCbMV56dJfQKf1bkMLfuGh1+76zMoe9vbuPUnLsb2DtmOe5HSxvXsrvWtLBEhaTx29+Ma27Jx0ShAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaEsEVoQdVluO3BJ06ptHL34b1XRjp4Ch6Rq24+kmjG4Nwwg+9uA9u/73EjRBqhAEihAoe3xwUQq5WTYEzp0b3ZnV/Ncf6O/9AvY9wlh/6dy3X7ncN512Zw9BVLXjuAP4np44vnQtkZoEgVkEhLBmsWiKqwsXpjbPBOn3gRfenwnc+7GBe+zsjclvonFDS9nA9Iy/u3x9+vAP3735VPk4CRUEFhcBIazFxbfm0k9fHD7k+v4nQFaPQIrx8Gmyx/GJ0J/t7ez7mw0b9MmaC2pQQgh0/ZSm4g5TwueWWtqLt0HuVy4CQljLPPYnB0depTn+b3t+8B4t0AdBUv93h2H9xc6da0aXs2m+r1WQsLRnl7NdUvfKRkAIa5nG//r1oGtsZvjTgev/kqYHF/TA+AXoqv4npJemOEiQU1Eo2l+G0movBK1UBBPU7s9E1+ILAkuNgKwSLjXiqO/khVtvARH8dxDBRkMzPrF/V+9/BlG5y9CUqlXinHv9mRPXtvuus88L9H3JPv2zD2yXExCqAicJBIFWRwAvv3Xqwq0/Pnn+lv/K+ZvfPH3p9p5W75O0fxaBp793ce3AwIDMWmYhafiVgNtwSMsXeHp4eNXJC8Nf0PAdRCiuf/XgrnWUqsqotcvnl9DmRkCdweX4b9N7+m/ih+mbMraLM14yJVwcXItKpT1VRve+ArC3Qqn+3gM7132jKEGZm6tXg86J7OhDfuA/iHwPUpfUZSfu2L59tXxEoQxeyxkEgjKeOnLxHb4RqC+NY5H3+2953d4XlrNN7Vq3ENYij+yZwbG9jpt9GkBPQ5H9zgP9607OVeWp87cOQtn9zwJf+xDMNFfj+jryPqXpxj8c2Nn7P+SXey70lidu4IXzb0DNB4tr9751+HV7zxSHyd1CERDCWiiCc+QPjUCnsaqmZ62O5IN7N/VUNP48ee7mAZDTf4Tt049iUG4Guv4ZfNLos9UIbo7qJWoJEHjy+bP7fNsoOcnW0A0/aacef8PdG28sQTNWTBVCWIs01OfPj66BpfqTmq732UnjgT1bei+Vq4pTv7HM8Ceg2/o1qLQug7T+FaaM3IqTLZdewpoHgYEjV9fphvOj+OShWa5V+CxvZtpzv/LwG/aNl4uXsPoRwI+4uEYjAJ2GmdG8L0FK2mYa+tsrkdXZy+P7x2ZuHdW14P+BLdank9q6Qwd3rf+ckFWjR6Tx5Q2cP58K9Jm3VCIr1ogt48lO237r3//96YofeG18y9q7RFklXITxPXV+5DchKb3ZDMy37Nu5tuxG4R9cHH6b42QfAzlds+3EPXu2rfrBIjRFilwkBIIR7SHoJDurFU89ZOd680Gke6JaWomvjoBIWNUxqivFD87fej0e0n8Fwvr0/t1rnyqX+QfnRz7g+8FX8Rv8vL3auF/IqhxKzR2WCPxXqKeq3krDTdj2ierpJEUtCIgOqxaUakwzNBR0D09yiqePHOjveyOkpxLr9VMXb73V97S/h3nDXx7Y2fdPkAYbncW1IgIDxy5vM7LZt/hgrnLtxyaBrJNxv/72N+6tuNhSLp+EVUZACKsyNnXHvHL+1qcgNf2KbSXu2bt9dcmS9qlzo/fARgcmCtpzB3b1/Vg5QiuslLowENyDWDn8cSjl98PgdBviu03N+rl9/WufLEwr18uDwLdevLTF1YK3xnVZ2HI1bUxrT7z5zTuXdRP78qCyeLUKYTUI25OXbm4JPO00TBj+6I7+db8ZL3ZwMOiYdG4dA1lN9HWte2iuI2NAVPapC8O/CGPR34Ip/AZIbIMo7yX8G9QMbcS09P+2b1vf5XgdrXaPfiYns9oeLLEd8D1/B7Dp0E1jGP042pXQj7RKf546cmGzp+tv1TRf6YQD35/QO3seP3xow5IfC9QqmM23naJ0ny9ysXwgq98BWc0kVhv/Nhalbqe8kd/Fr8MOSEr3zEVWrwyO3I29hl+E9LUHGf+nAXI6sGPdd8uV2YphIKnE5IyL6bLxk7cn3bdkHHefrpvJAExMZ1uBZmqeNzXtfzUzk/m/ens7LjV7Px+8d9e1579/44l0duZtge+Np5zEEw8c2pBu9na3YvtEwmrAqNE8IZvNHsep5//yjl3r/0O8yFOXbv0QCO05gP0JGIL+fjw+uj91YeRh/Dp/PtCDM7Zpfmjvjt6Xo7hW9ycmJjaYduf7Hdf/8HTGfa3rG9rYxLSWnsloPg7fijZV8oFM2Ja2a9t6EJd7bCztvHP7us4rrdD/r3/7ct9I99jEI4cOiQ3dIg2YEFYDgOUJDFj1e8TqX7cT4kImXuQr5279A4DeBEX8ayvprU4N3rovcALot/TH13T0fXDTJn0qXk4r3k9OTm4y7a6PzjjORzOOvn1kbEqbnEprPhRzwAKzwFLHk05hv6Yd6N+o3R6beG50aPSdr3qV6IJKkVp5ITIlXOCYn4Yexr0w/DO6YXymHFlR0e5r7tsM3fxgJbI6fW1ivTeT+SsYmr54cFff+5Cu5X+hb94Merp6/J/PusGvTE6724eGJ7RpSFOkKPCUZvBPBccoHBet3Rwe13rX9tw/PjXzZ5hKvr8SfhWKkeA2REAIa4GD6p0feRdWBnvxjv2PckVhVfBf4A29uG/X2i+Ui2eYn8n8NryuDr3jPfWSFV5k44UT137eshIP2K7/64cObbheqZ6lCp+Ydt8TBO7vTM5od1+/NR4SFVhoLpKKt410lnE8LTMzo3V2dLznxLkhYgQ9obiVjEDln7mVjEodfYcpw+MAsftg/7qSDbAnb97sCSb0Yei2fqOcbovVqKNnNO8HmAE9Cv3Wp+uoWjt27HpXNqH9WTKR+kBHKqEFbvo5y3N/avfu4g23R45f3WGa1k9ZicTd0zPTf/f6O7f8dT311Jp2fHzmgJlI/N70jPPe4bEZ6Kg4qw0lqlrLiNKBiLWerpTW25PUbkPXZViW62ecHz+4d8PXojTirzwEyhq8rTwYFtRjvpX/rlwJ+iSXugPbMuyKBOHo3geRJtuT7PujcmVUCuPJlhnL/9NUqvMD2eyM5sxMaIlE4n7XML907tyNjcxHQjty4sZv66Z1xEok/xNW5n4uZSf+8sT5m++vVO58wkEu5sR09pd9w/rWyET2vReujiqygrSopn/zKZN5qMeirotKeTyolm7p/+X06Wvr51ue5Gt9BISwFjiGsLl6N6SrvylXDNTK70D4mX071pwtF88w6Jd/DG/1E1u26NOV0pQL71y3/8PJVOcHMzPTWkcCH2YGOaTTaS2RTN6f1fQvvvDK1bdnbO2JZCr1SeRfn05Pa1PTU0gXJBKW+ecnzlxvCGndhFQ1NRP8bcY1/vjS9bF1V26MwHwsVKiXa3etYVw1TNhYJ3TDjQCO42jJVMcez7J+t9YyJF37ISCEtahjGjxkGDr2DJZ31D8h5vUQJL5RPkXlUMM07u3qSGidICvkzzuSlmlZb0olrK9hD9v9JCrPC196JoPMAolFg6CV+PPj54YeyWecx8Vk2v1Q0rSfhFT18LnBmzBRyNalp5qrSuq7kiAsh4SFa7oZ9M0wzI+cPHOjZPo9V1kS1z4ICGEt4lhiCvZrSa2jol7qzPXJPk6nIGbVbWfUvcr7hO9MP97ZVXpggOu6ajplYStj7l1XvbRMXbPAbp6HzSSBlkraNknrvfVCcPt2sHYi7f3pTDb47KUbYxuvKqkKpYBXKBnV869c3WgbDEixAck0FGFFfEzJzbIsO9C1TyrcymWWsLZGIHoW2rqTzdo5dXyykz0NC8l779i5vu4zwM+eHVntGP5jqVTq/6AkVc5NZ3wNH2lVxNWZNIukMSjiNd9z0+CHp5DXAdX4SAg203w8GB5IATtODHzdK8C15kEjhXvNS9rWA11dnfcMDY9prscss48RySakrOLWqODCoIKAgkuVgsS0urtD60haeV1YYVbbtjUn6/74HXvW/11huFy3PwKzT1r797Upe3jq4sib9u9Y+wxe+vh7W1N7jx49v6ZzbffnQD4/Cj1Pfjx54XiBls6GVuTUc9mQsOIO9mPQFdkIRlz4fy5JLm2ZMOqTcJaXIqpcqnixVe+rdbZ3dbc2OT0D0wZIibHSksmklslknvx+//q3PiKnXcTQae/b+LPQ3r1t0969cOL6G7o6E09qgZegdMJBpVQ1DbKCpyUt6oPKz/4NEJalCAuZFIuEVBJd+jgLh4rvAiFqUVGkhJZMWFp3Z0obGSu/d5gSnWmavuO6h+/cvYHSobgVgoAYjrb4QPMUiGtj1/79jBMkLBwiTlMASlYzTkhWCJyTrGAyMOFkst/BoYMmuIIyGJYcMXMMdNwHPhYN1qWS1t6ZLGaKZL8yzFXTr15BooLLMugHMBRNKgW+It8y9TEcJGt4rvcRFCCEVQbFdg0Swmrxkb0+cf2XOzq73kgdFieEXF2jdEUJKQH6SVWQrNjtZDKlpTPp38U58iUbthk/Ph7sN6zg/xudSGvD4xkq6otcnnjyF0XRRTflkyC0IIJE1JG0QbqGNpMNp5xFhRTcZDNoj66988SFm5vv3LX+WkGUXLYxAuXnCW3c4XbqGs9hwjv+a9lsuN+ahOJSCoLjNDAFvVUll0p1aNPp6adTweSflEszPO48oFn+4yOTmR+6enOshKyYhzWpf/jDuuf6x2aV/qNRaPG/1d0gUXWCA0uu7GhMmkqmerEc8KOVU0lMuyFQ+Ylut562YX9Sncmf7Ojo3BDZWbGLtMkiUVXSWTFNuMqWuYG530f7+/tnGFboxsfdd9mm8XdDo9O7rg6NFq0CFqZr5DWlK9qV0fZqGvZchSuPlevB2VmG/hOV4yWm3RAQwmrhEcW64qu4ykfJho52Vp3J8quBYQooqWDKADftBd6HD+5efyoKj/zR8ew/hWXY56/cnFh7a3RCTTGjuMX0SVB9qzu1qfQM+jO3dBW1g6uVSHv/qVNX10Vh4rc3AkJYLTy+WA/8ou9kJjo7bOh+DLVFZ64TEbCyBktxI5PJZj56R//Gx+NdH5vM4vuI+p8NXh9LjU1iw3EZhXc8TyPuuV9wDaaCfBjTM06N0hVWQmHBDzvSDZ5tvqYR7ZAymh8BIazmH6OKLbzv0KZvJEz3ZzEFnEolaEtV2XEaCLKadrIz//TQnk1/EU85NuH8th8Yf4j9gMZUOrNkZEVZCnsbtTU9KW18GqcKFyjh420sd2+j33pg3F8uTsLaDwEhrBYf04O7N/2t7/o/C2FoGnsIy/YGlvAwSfCvZzLOe+8oR1ZT3u/5uvHJC9dGtJlMrfqjslXVHwjpat2aLi2rjFFLjUSrFUjlO0juddXSSXx7ICCE1QbjiHO0/hofbPgwpnDTOR2V6hWNQqGUx34890noet5yaO+Gko3Y45PO7/uB/lvnrwxrWdha1absbgxo1FWtwplXqYSJY5Nn5lU3bLHQmGA/yko0plVSSjMjIITVzKNTR9sO7dv8RSeb/T9BWmMkKv4D+YzBXuljV7yxd+zfte6VeHGKrHTz4+cv38JWmyUmKzSGG5z7VndoE7kz3uPtq+Welvhwm39weVjOyaoFsBZPI4TV4gNY2Pw79mz8KyebeRIH+VEZTaX0sf27+v794TKmCxNTzr/2NOPj5wZBVjjdYSklq6jN69dyKuhqmWztivYob+RTSkPbe/xMdlMUJn77IiCE1W5jq+s4dYEO6mzsYAmvi/+CrH7LDYxPcBq4HGTFVcG1ULLT5orS1ULIkoSFI2cMHKG8obiXcteOCAhhtdmo6gaOh4EWWlkyYU9gvHswXfgV19d/7+LVkSWfBrItJJhObL/p7elQR8fUZnEV70XxPc01sM+xrzhU7toRgZIHuh07uZL6xA3LBaYB+Ar8rBsfz34YX1j+D5eu317QNGy2xPquSE4mDuXb2IujY2AgytNE67RiKFshzuwCR5s9ZSMlsK0QEMJqq+GkBKOF5yFzRoidK5BoFCeMjM/8mG+a//Xy0Li55KYLBRiTrGjwOQ1br4VMBQuKVJeQKVPxMLlvPwSEsNpsTEECmBLSgbHUpwD1YGwse59l2p+9fmuig4fiNZIowrqq/6Xeqm9Vh9JbjcOKvqFtACX7gV8kTVZvkaRoRQSEsFpx1OZoM2iKxxuHLtDcsZlgLzYZfv7m7XSv+r7fIm234XSP/8o5ktWqzqSyZr89PoXPYDTYkZvziw0NLluKayoEyq4iNVULpTF1IaDjHHZmoAW4aep9geN8fiLt998cGYdtVp7K6iqzXGJFUCAi7jdkuapsBJKcPBwgyP8YRyV7B04Q3dDbpY3jg6gupoMNla5U41BbUN9n0sr1ScKaHwEhrOYfo7paCAW0WiWknihhW/0Tabf/6tDtxpIVSIhGnz1dSXUkDL8fSHKi4/lWPId9Kp3Vxqegp8J/m9f14D6DQ/nmb281FwgkZ1Dj7bnSSFx7ICCE1R7jmO8FJJr8jCvjeNrIxFjDJBpKVaSlXhwDw384MyucBoLAGEfHI5ptO6n1YAq4FjorH9IWjUOnFlF3pj62aui3whbI33ZGQAir/UY3XCVEvzgdw/8NcSyGUhSlpVWQrFg2p39xp0JYLyIohaXxdZ2FGofG6yi85/QS32F0Asu8URgu1+2JgCjd22xcsVElPC85169Gaa1YTkRWJKpSqooBiQQzONvq9sRULKKxtzzAEJw1api2EFZjoW3K0oSwmnJY5tcoSD09HanEDztubnfO/IopyUWC6sUmZUpW5aSqkgwgK04DxxaZrFivacCaIdAuH9zaM1rSDgloOwSEsNpoSMenvU93dXb+EE5taFivKElRqd67qrNmsqIF+yjMF/i56MV2JqadYKxXMDXM6+4Wu04pf/kQEMJaPuwbWvPticwj4Il/NnTrdl7JrqaDC5wTUle1GmdWWVCw1+JotjA6PgnThsIdQrXknF8arkJi/+R355dbcrUaArU9ha3WqxXW3tHR9C5dN//T9eEJ3aGdUwP7T0V7F86Mr0VW4mF6o2NTS/ilaB2HDmb8wA2+08AuS1FNjIAQVhMPTi1NgwRkGKbxRxMz3uaJSRzVUkumOtLwo6Zc7aOkVdEhynN9NQ1cyuNqeEqD67mX9TXGyxXbJhFthYAQVosP58S0909czfqJqzdGODVqaG/IUbCWr2p0yukfp4FUtDfeir1yl8IPUGjPHFy/fqJyKolpJwSEsFp4NEfT6Z3YBvOp8MvMc0hAi9hHNQ1cBrJil5TUZxhfXsTuSdFNhoAQVpMNSD3NMTzzU1PZYAM/ProYkg3UV5rHT8lXmA7SwnwEq4FLLVkRI04HM+n0LdvzvlEPZpK2tREQwmrR8ZucCd7hePr7rw2N5PfxLUZXON1zHKz4kb0KnIttP6Njk8tyaimbwXPrsW/yq3v3bhoqaJZctjkCQlgtOMCYCnU4GedTI+NpQ32XbxH7QOmKG5nzdIWZJz8HNkKygqI9TmSL2JSiovGVn0A39c8WBcpN2yMghNWCQ4zPc0HRbr6GEs6chJFnmfl3knZO4/hmII1B6fiFG9br0s6qAeXPp2WUrhzHeXH/jr6n5pNf8rQuAkJYLTZ2kK7Wul7w6zeGx9DyUsZovOodOizosTg1TM9k1Wogpa7lIisOF+w48E/7E5B1Y/cgtdizsBKbK6c1tNioT6X9n3MDcyePOo7OoJqrC6S0+ZIYV+GSOHxvc18PJCxXG4ed13I727axqTp9yk9rX1jutkj9S4+ASFhLj/m8axwdDdbgELxfGsLpoZyqVXPVU1QugVJUV0dC27p+FaaBWWxknq6ceAljTNMiAf/BoUMbJpewWqmqSRAQCatJBqKWZpgJ731Zx9pJM4aK0hXe5vlKVFEbKFlxs3PvqpSSqpbzKztRm+gnEkktnU6/2GFMfa4wXK5XDgJCWC0y1iAR6/Z49iOjY7C5qkG6mk+3SFQGlEP8FFdnygrNFqBsn1OxP5+K5pGHbcBhqhT8fqu/v39mHkVIljZAQAirRQYx7Wj3Zj3tddQjVVJ4l50CMjHe8mqOTJCCvmoTyIrENXx7Uinbm4Gs2PZUqkObnp76i0N7N36tWl8kvn0RaGnCGhgILKPn3B3+xKVXDh8+nPseX3sOlpt13+P4uonv71WeDqLr1ampFB8S1JrulNaHc9rTMxltcpofOeWns0rTLkeIZUHRnpm5YibMf7kc9UudzYNAyyrd8ZLpWvfgQT8w+oyevXeo++bBtaEtQd9s1/ffRsV3I6eDJCp+nourgH04UZQnhIYfWm1o8xdUGCU8/E/bil89sH3dlQUVJplbHoGWJaxnXri2HTvd1nEEcCBS3z++MLi75UejQgcmJjL92ax/gNJPo6QekhVXAbdvXI3D+XQ1Bcxiu02zTAEjKFIdHTQS/S8Hd2/4YhQm/spFoCUJ6+mnL651gkwRQRmBt33gO+c3teNQYin/oG6aKX5rcKEukqqoWN+Ij5vy81v8UATDG0WGC21jlJ96K6wKPpWd8H8jChN/ZSPQcoR1+vTppJPS7iw3bIZl7n/++eFV5eJaOczX9Z2YvM1LPxWpocBHKv8qHHdMqSphGUqqahaThfj40ITBcbLnsDj6oXvu2bS4n96JVy73TYtASxHWo48GxrUx+5Cu+XY5RH3PMzLGxF0ktXLxrRoGNVPPfNtOolIrgElLGYH2wbZqcipdIFVFlDbfGhqfj9bskCaHHS/7gTt3r73Y+BqkxFZFoKUI6/C7Lu/Bl1jmlKB8PUhcHjHufuyxx/g5lbZw+BL7bX4EoiZqyS0T0uM0j1+82QSl+ua+bhxj7GjD2LicwWkLzaarigbKsmDJ7gcTmezMBw/t3ixntUfAiK8QaBmzhq8/f26j77pbaxo3w+jetPf1B5D2RE3pmzyR4/nH+Mti4Wx1dUrCHO0lSVGqskFUnakkpn6mhu086jgYHkWTW3Wbo4Tli6L5gqYHE47vfeDufVv+YflaIjU3KwItIWEdO3a9Szc0ElDNDqcLbHjmxas7a87QxAnX9ljfxcr+Mzs29ykpi1O8iJjoR/cm5o7dnUl89LRLW93dyWmVIip+Kp7pmlWqIvQ8Mga9Gslm3Efu3LX+K008HNK0ZUSgplnGMrZPGxgYsIKeXa/TA61jPu0w0+7xBx/cd3M+eZspD0wbDgWm+RXP13cODY/jWGKuGAb48jG+agNpilbqlKZoWDqDY2AyjtNUlupzYZlKpXgaxIVMNv0zd+/d+uxcaSVuZSPQ/IT13TN34QRvZW81n6HSDdMLUqmjh9tgd//Fi8OHEl3JL3Z2dh3MzGA7XU664llVWRz/QhLjNYmsmaWp/DjCjqIDdlaZTOZZ1/A+fGj7hjP5OLkQBMog0NSE9cSRszuswNhdpt31BRnazM3U9IuPHDrUuG+419eChqU+cvzqjp7u5P9KJpMPpqc51Zv9QntLkFQBEqZluVCw/7nhaP9i376+8YIouRQEyiLQtIQ1cPT8GjOw7vE8tyFtxBrb2MBXdh579FF99g0vC0nzB548ebNHT2l/aFmJj1BPBYyav9EFLaQ+jdPAVNL8/pZ13a8qiJLLOhAAjvrTRy/d0enbF+69d0tzHFhWR/vnk7Rple6mp+9uFFkRGF8LVj/08IUN8wGp2fIcPLh+4sCu9R+F3ucj0MLf4vaVVnChqYWmdaQS2jpY2vd0djh86Vqh7c3Yxm8dudTPxaW0lrn7yJEjZW0Tm7HdC2lT0xKW1xecgHE3FDWNcb7uDh6+r/96Y0prjlIO7ur7TOD5b3ayzt9ylY0Gl83qKFXZsCXrXdOlrV3djf2LBr556JOshLDmMWhPPXV6vav5O5jVxYLUhNl3iIbV8yiqpbI0bQcP85C2Xu0l3dczC0XUN4Pzb71339mFltOM+Q/0rzu5f2fvu1zH+QDOt3uZ0pbVRMRFouJK5qqeTkhVqyBdtdUmhGV5JI4cudrpd5kHiyp3tTU/8s6r+4rC2vCmaQmLWJO0Ep65INJK2tbpt75298U2HLuiLh3oX/95L+0/kHUyvwTieiUJHVEimVzy1UKeWMqv2pCoKEVFRNXT1aHawnBx80eAZj7TwcxdAc5Gi5fiaNnNT37nCk4xaV/X1IRF2B94YHt63qQVaCcfePX2K+07fMU9U7qtHev+xE/7r3cc70O+6w1gxuV0dHZiusgvJS/O7IskRXLs6KCxqj+B26t9a3uUREWi4plbQlTFYzXvu+7tB3EIUGel/L6e3TNw5NS8zYAqldss4YvzBC9C7559drAja3qvDoyg6pwCP+KBZaVOPPjazS1vMLpQKE9fuPnawDB+EqehPwzWuAuSl8LPg90WVxhJJPWQCUmPBAWTBEz1TFUGpqO3wYYvIPgr2az35a2b1/50V6f1e1NTlVcvEzB0xRekj67usu5FmS2/crvQcaol/zeeObfTSOj91dIq28PxiaOHDx9quy8LtQxhcZBqIS0Dhkl2l/3yA4e2j1Qb2JUUD1Iyz1waOQib0vsxKXsAFvH3wMB0JySwtZC+DBPTN5BOCEnhrI1BuKe9l6tIzsVCiD6E0DOabrwI2elZ09aP7N3aNxjheXvK+a1OENa0EFYEyYL9rz072Ju03ZpNQKj7Xd899cKhNrA9LASvZTY/s9GcHoK0XsrakLS8UklLxyl+/rj+/Qfu2367sJNyTS7SuZfneO7ffweBGScu3NwAqWgrTvTc5jjBZmw87tMCfRXYKQWOgula4OiBOQUZ7DZuhrAGdQXxV0zPuCaGnkv3VPGHOpPw7+QPR62OM5HhdNddGOeX2kmCbSnC4mDlSStVTFr4eLljdHV+702vWz9R66Cu5HS5h5hmHvz3QiOxwJTRo2BGgY06dm7OVhewYGAY6s75oD+ZDs4JPY9JyqSCQ7ABqftd5VFM3/j2Ja4mtsWpJQSq6ZXu5UZTKeJnsHpohiYPRqBn04nkS2+CQWW59BK2dAjwS0Y4IHDz2ERWG8Gnwm7iK9W3sFmbvrqGPzw6gW8eTmvTM07XmTPX28KYd7EQ3rjnvv1QFHbPt3zT9DcMPHd+13zzN1s+/hC2rKOo7NjeQdsxT5LEWrYjbdLw05eHtwWe9jl0542u62HZHZIVpalY/yIlP5X3MHYddLLZfy4fmYiBhNuB509vw+rG3tKY+kOwGHLi7W/cS91jS7v4s9TSnZHGLx8CICH9lXNDX+zpWfXuycnaBV2e3e567nAm4973qv0bzy1fD5qr5oEB7KXt0u7B3Loh7yhWVfypbOalh9+wr6U3mbfklLC5Hi1pDRE4ef7Wj+EEiZ+amqpvJT2bzWjJRLIPR3n9riA5i4DZg720DSIrlsrvHXSZ9p7ZGlrzSgirNcetqVp9/vz5FJTqj6JRejTdq6eBMzNpHP9s//QrF4bvrydfO6f1JrCX1mvcXlo98Kembjotr3wXwmrnp36J+pYNeh5JdqRem83O77gxkpxtW3bgOZ/g1HKJmt3U1Rw+3D+zrc89aunagnWzpq6PdxujLz388L4F78tdbtCEsJZ7BFq8/sHBoMPX/I9hyrGgnuDUUZzrnnz7yQu3HlxQQW2Ued++fZmJ1e5LoPB5k5ZpWCPXz+08du+99zrtAI0QVjuM4jL2YcIZeh+2+9wF49MFtYJSlgmHE0g/JlLWLJQPg7RmhtyXsJ18eja0tivsXhj6xy9ve/mRR5TRcG2ZmjyViN9NPkDN3Dz1FW5z9XM4i+s1ME1YcFNpUIrVLHzJzHnwjl0bn1twgW1UwPHjxxPXpztejR0HFTc+F3YXRwxdfdM9W08D0zrs4wtLaM5rkbCac1xaolWOvurhZIPIih0OdVm2haNTfqUlAFjCRnJP4HBn+iUqz6tVa2nGpTe/etsP2o2s2G8hrGqjL/FlEQC5GHghfplSUSMdvwaEA/9+4vjpa3c2stx2KIsfUek2dr+EuXNF2xEjSJx98w/tbFt7NiGsdniSl6EPp84O3W/Z1oPzXRms1GRKWdCJdeCIlJ+vlGYlh997r+70+EPH8NHJEtLCauCph+7bmj81ox1xEsJqx1Fdij4Zxi9AT2KSYBrtslgxhOD2gWOyz7AstFzx6zFHj1mGobYUYAgC9cHge3ddK5uhjQKFsNpoMJeqK6+8cm0X6noXiWUxHA8WxAdWNyQM45HFKL8dyiRpueM7jllmMGpnjO+1w9fNaxmXxiogaqlR0jQdAkeOBPjczrnOiQ6jw88ESSOA6KT7iQzOHEvavu1pZsLQg4QPP/DdZG9Xx/vWrOr+mfR03SvtNffdxleAQIgvTzjBT0w409Mpu2faufZy+vDhw5WPMa25dEnYqggIYbXqyNXY7i/jCyvdfmaVb5hdVsLp9LJGp43j1/1A7/RdvdMwPRzEboRnLVHe9vEvL3eXBOB4ZMta22H+TiqV2LJQ26u5u6Bju44Z3J7O/Lvp6cwPmBanOwQ4uNHRTWMK21bSvh1Mm642nTWCtKkH07rnTE72aOO0XZq7bIltVQSEsFp15HLthg5J/+aJE12m3tVjOPYq1/dW4cTjHnwMYhXOce8xDd3y/PJW6OpMdsTRVy4iK/rKMR/jwvz825VIHFzT3fkx13UW/dnhRy3GJyeeHEs7n1XNibUPFvY6vtGDw5vV9w0Vofn81qGhZfDhi3HX8SfQ/3HPMse9CWcCX0gel2OIFJIt+2fRH7qWRaYJG85NxldGzV4tGayFSLQ24+q9ULyu9gJfMU5ELTn6wUISTl03NHz1KzyiJLqmX657OLLdSJgoXTO7cBxyN172blier4YCvBsFdSNXV2dC35tKJrbzfPfFdjwvC/qs9MSMxxNRsSqmT6LhUDQHE+jUBE7UnATXTuLsrRn01K2l/x6+qItiR3TNG8V59KNB0DGSfNXGUXwJY2Gm+osNhpSvEBDCasIHgVLTt75/aQ0MnXpBNb2QgNYEntfr4wu/nBYpKQLtxtdwAh0SBX3VDe7nM/Ha5vf1Fb/CURS2bCTAWWuxR229qRsbQQQbUed61LfW14JVKKsTJ5sk8WUcHbtlNANyTOhgcmAGKH7p3m1FWpqtuZCu+LByVdKHVMjpKEQrBwIW9tnpXOIH+QTDSH/D9f0bmCLewDn1I4HmwtAypPDZ/oe9oXKf/aMPsWxSs/RR13FHrURiZE1gDR86tKHEdCDMKX+XCwEhrOVCvqBeHNaW6ui11/mWDtLQ1kEiWodXE4rwYgepAPssTPCMOjIdAk94TZ8pMZjch8HjDorGFUTUAwlkh64be0A9/ZCatiDZWtOyE7ClQmIdJICJFYhA+TRV4Fo5/QIHiUvrTEbkVRCxiJfsSBbfYk87OTExXxdazY5yUgiRKfpHQ1YSkONmAZY+gV4NIeVFfCXoLNA5h/Plb5LzWAyzF+IVXdNnvO/6GcsyhjC1vmWZ7s2pO3fdOqzriy9asnJxZREoerDLppDAhiIAEtCfO3F5rW0a6z1PX4/nf53nG5RqqrpieSnULEVh8cx4E7ugH78H8tG9eP/24oVezY+pkpA8b/abhPF8le75BqdsXUtaFeaTlTI2IByEoU1l8oq1mkokcZHElIRoWmpejMMCMyCvQXyy7JjjuUcgOl4tLCzCMpTHgFpcgkViX/dH/ax2Szf8m2Yqc/MN+1r7BM/C/rfCtRDWEozSkbMjq7NTY5t13dqE6dhG3wsSqlp+C9DDi0ifLrqmT1f6BgUaPjiHN0lJAGAfvpWcI4XjiHIMF6ocO/EjmMa9HeelQ1LT1PRpoce/sJwOTCQtc+kfGQp6Uxl+9JWtmL+jNEaJ0gKBgbsygR58B4sHfwV5aliVWg3vCHv6ymHcdG868IzrVsK6pnd71+/dsmXxbD3m3/W2ybn0T1/bQFe5I8euX+9ybuqbXMPbDA7ZCKV4uMOecyz+9OfmWvj9x9zEw6JW+JuOX298WhE6qtwLEV3TL1tb/AWj7sqwfqaro/sdmcyM+vBp2XzzDEzaBiQsNH+e+eeTjQ+ohwqnG0BYhfVzNYKrkOmpyauYYH8KvD8G6RPBszrC6Jq+ystl0ghzXEZjR5+O4+iZwTh+eG7Yqa5rq/3hGzzTSkXKn4YgIITVABjBP+ZzP7i8ydasrZCetuCHvIvFRs92SEdlpnCYE2LOQi12OA7RNf1yjrphHIyE9yOXPnfNMDg70DpdTf8DWDKs5rRvMVwChAWrUgh21HzllD0NrigqlxKVC7bKQuOOWeGiuI7OTkhb6T8C/Xw3xkel9cXxj6eIxiY3Hhx3X9dHsWJwDaa3l1+zd9Mt/F4tUk/ijWnP+/DBb8++LWqvnh0c7NDGta0pO7kl6zpb8AJzEUr91kYEFdeBRCt69Nm4+AsSl6jwjVGckY6VwPwUpLhLURx9xliWvxFHi/w+zB0SWCnLsVpxnoXesSI2ngp4zmRJXPgf/0IleGH51R6uwjeX5MR76qtITh7+8N9Cp4GF7Sm8Zl1s35pVXVomm/5c1vG+Wm284njHJeJq44/FjixUAld8w7uijW6+xo3MhW2S6+oIVHumqpewglJ87+LFtcFUcqur+1vxwPcZJqYPMOyhXw6GKI4+4/GwQpjCBhe+6XDIpFb06PM+np5hhS5eXzw9bLJ2pBLGv4Fe36BU4kA6IQGw8MUY6MJywVeqDs54Z69zrWdY7jI3G1ZtUiSV6zzDI3IqLLew/wu9jspl+yywrA1pEed5QceXPT3jBb/DLrA5ua5UHZ/4eMTbFx+fwvE3DJO8fANrjlctL7giJhRx9MrfR89R+VgJ1Y6currONuwd0FNsxwtV02mPlWGLy1TxlPHf6Hh8PH9xesvw9yRM+5PIRT2ZIgVKKZxWUY/PT8aTFPji0i3m4Ed1hDWV/7uY9bNGtiGqAyorJRWSqCgdkrQiR5KddrwPlsq8xfhG6efvx8dvtiQczDdmmPaldDBxSVYeZ3GJXxUMWzxq5d4fPz7Ym7X1HTAL2A7NqtJHEQ3qtCPjw3LoxB/v+OMZ5VVzR5aHWRuErYA+y4uu6fM+Xl9J/lh7bFvbY+vmv0bWos9tsXAWSLIiaSnyApHxJz6SbFSFuXTw8i86r5vVRW1m+6IHmUREAuI0lcREP5q2ztWPrO9/YK54xsXHI56+cePvj3qBfimZNS+J5FWMcrjptThsRd4dPX9+DcwEd5iQphwozfkCwJKaLv9ewHYKeicfSudwShcnJDBBOD3MTwGRO0cqLIj73jQTaejDBYaPHTBgJ/i5+HyYijd95sFhRzkzB7yL2IrCtGwezj9nOQVTUlfPwiicifnu5J0qHHd8mXHIG6ZD7JQqIk9kJK6QwAokMWRUhMaSeJ0vcfaiXNhs7PyuwpYV51Vh+EM/Pu2M9GckpyiOuZm2Wvtom+Y4me8xPbvIIujzPu6Wbvyt1ejL3U7Sv/v754ZHsORwaX3KGdwiJhO5pzY+Mivk/urVq52jTnIXlEc78LKu8qAMx/G8kHhyOicosz0ovM3IrIDKb15HSvDoOoqv+hMLYCOWI8ash0vmufryZVcqLz4u8fym3ov1xT/EVp4UDUTn4/iS0xW+sZTMojASmLqGp64iH4FRXJQ2TKj+lv7JVRTVxwQkm9APyaboGnGMzSVR6VR87ipsVT645ovOzi5tamb6zzB1/nqzjz+s9YetwLioZW5C8jq08K9+1IxS8yQsfF6ap1WL2BK8VOaJc6NbPcPrx7wJ++hmHQUPvOaQgMJ3ETtVlERDP0wVsQ19uPgcLQyt/Dc+p4jlL6k/1xa2qVyh5ApEzEoErm/DsPOTXV3de6anq36roFyRdYWVbVSshHJEMt98saIXfIu9koplYZL6m/hUz7kS/Jt0/PE8+Jj6X/Y6k+fv2tA1BKIvB/OC8WnGAmp5dpqx3XW36fjgYK/upXbhFd+BrRlqn16MfkrspkoC4hnirYjbUVWzs4rHx8uL3cerjwt0TA4RcBcsuX8Rn97q54okVsCKJJ9YkSvy1gJR4aOtnAr6OJP+L13d+BKBKMEzHhAfgDh6yzD+vqHjTDDvYpAxLqwEfVdbE9bpIEi6V27tdLP+LnzPrWS/XrRTnz5d4e79+LNY7r4kP+Z7Jv7z1LyPL0B4Tb+ci9cXLy+eJ54e8Rw//rqqcUR+HOrgYVprJbBl5E2w63oI64J7k8mUDZLGhmAXs19ucVkxP8gKQu4ptCxbMy2TW3KAGI4u1P207ztH3CDx/7bL+Cdse8h1Zy5ev7Dp8uHD7blJuy0J69TV8XW6l92Dl3cbLG6g98idbhDgdANcY1ZY9o2N4mpNr96GRf1Da3Wui0RW69F1bWslvp81LD2xDTOGu9DhQzBc7AcYfYlkAqo6A6ozqHNBYJTESGitTGShsp0qQSxT4AcoPJQw0LBlEPhBFakHDjoLvY+XgVIyg7WK77tG8n9pvpHXBbXL+OMBd7FN6KLu+uf27esbX9RHdIkLbxvCGhgYsDb3v2a7obt7YHakpKmYiqgE2ioqJbzIOszXcSov/DAzRRNehyJKvPx4+igv/ZLKEaCkoZxUFMYXE1I8f7Xyq/UHp9CkAlfbCF3NdlhS7IQguA0N2wiJYy1ktC5IISb1Okr5jSYruy2SGlYkIkKLSC3yy/WrUWGzSnjaTUX/QEhYQuNewLCdwBFKRkpOuAfr4sBnwwfDg6B0MHagORhBHNqHw5WxTwYav6lAt/42MBLfrYZXHO9w3Ftr/B0Hp0pY+tkD29ddAz5ln8NGjddSlNPyhHV8aKjbzAS7Dd3egRcvgRHJWyrHASw9Pyp+vlSxEluH0jWAGQF9VVZMpxHVRZ/xSKQU4PR5Xy0+/sLQZCFS9DN/XKtSeh5WrL2x+sMyZv+W67+vwz5eC7oDx12rm9pakNg639B68XL3Qh+2Bm94DySxHhg0daBHSQhiCbyyyMS9SDi8RhEHyYP1qD9qak0S4VGn5VYrSTRKEkKHWYYiHuQmCYb/YKYLqS+3H5LYckxJmz6qhSYJ5yNgzgtuclESpncBfN8Fj3lgJdCSGpHcGECoxrouMoHjzO+4evLLMB1VKxJV8Wyj8Q80Ix043jnTu32hlTdkh08Yn7UWcnio9Qs3pzZm0lN7LCOxIdIZxbuQ1+lAVFFxJB7aMeUIiPkiPRPjo2v6dPF4FVjHnxi/oQK0Az/bymf5uI7ayGLj6eM63nrbF5VNXzV7nv3HViQL3JAEaSV1z0iBNJIgJBCYkSKJYbdjEiSHw7a0BI5s6QBBbINUswMUsQ6E11UojZGccA9dcZDBdQY+TgyFTgkiEKYyIBvstAQzIRk8cBJ+A2j4gZFDFWAqjAp3V5IhQYYwwUJ57ByS0QINzMYK8FyrRxt3KNbXb2qG/UVNT5wDyCt6/A0boGbdqzPA4tD21SPquWihPy1FWHjQzYs3xnZkM95ePIZd8RccBx1xez/UPowp46I4+uVcLD9/8Plq0Gfy6Jp+uez5uqPyY+UtNN5DuVQc06drpv4bIDXsjtsMpdkOSC79QK4Xog3PzwF4IBNCBiIhpBSpoE8jioqWaM2KCRuOqwLXgIQItKIe0lCYD/lZjoqgGIo0+J++SsmMKA8eqQ21qHuUh2PfzQHN6vgG6vVK8GfmQhcbr3Yff+AEi3rtdCtNF8u/eIWD2ATXx4Mg0XH1Vr/hm7sDQw8PvyvTrriKWocEE0C6oM/kJRJHrAykgj6WGlq+JUifu6YfS6pu4/UVa6AgQcXKi78ApekhcWFBwMstEkTX9MvVHw+Lt2ex+4+Pg62CxgsHEwZbAdgWIJfA+ICkfDRYtyAwWWB7Ay8F8VT/KB0bOJ4Gx/CQfUKSwZGrJJs8iZHYgB0zMB+zk8hopQ8hEcEog2ERASIBAOL5fIrVIKLxXKtzKPZLgZUckvGf+/nH5HsK0+Uz3316zeAjj3D23Lwu90w0ZwNpiZ72UnvwfO/AXIFnXfLBxLOsHn6yiLqmr3oQ04LHX9hq6TFHI6txrlYWkHj98UT1lh8vryR/rIKq6aO204drdP8hRWF3itmLUw42QnW1CSTSA2IAIXkWOBYKLWw8wjVqNkEaFqjFwLQNJhWI4ZiFoiq6QX0SbsEo6HMoWVFCYprwjw6FP65BXCSoXJwiOwpnFK9A6yiWkQhRDwA9XAfpwLS/AqnqSKP7jwapquiznXFXMn6x8Yg/X/HySvLHKqiaPlZfvf0H6BloAM/v3tpzHkJwUx59Uxb4GE5Lfnt2ZGS16SX3+F5mq4llfegtwnaSR6J5EC8hPUV6IDaS6aDnoZ5DpYe6AtdgOr4pyhXLNPH0KKCo/DDP7N+S+mI6qHzbQr7AbdgW+iylWn0l5cf6E29ftfSN6L9lGl04x30tOtMHklmLhxpClW9BL4S1T+i2uNPRp+0FflD0AN9A9LHnmHGBBfJCE3QL9ALiguoJqiu+64gDzWGIIAlhzhaSDsMV/yjJi3BxyY9khP9BXBSzEMY/AFORGMmM1yyKZfmm+ZKuJf4uMHV1THEj+o+S864E7zYd/8Dliqp2MamvPbt9uw4dY/M4DnXTuMuXx/scK9iHLcbryzfKwvOJBSGNPl10Tb8WV0xYyMFymDdXXv46Kq+ueChJQI4WlSUqf8StOf5CNdXqr9afxe8/Gm6AoLAqGKyCGLSG350ACFzKM2FvaeOseEhFOsjItdQ2S6wYYmkOdl2+CfLBvmpIV55vYY2Qn6uAxAWC40zbhxSmWArcQj0TSIiSU37mx0kgVesgLereOSz8E5EWJa6Qzyh1hZEcO7xY4Ct9WLfNvwa+5xA2h6uGP6vMPxMsZ8WNf0Gf+cOCw9usq51a5+kNG9Sn1IjJsjoO0LI7EpVra/vxhPdFs7JyjYriohlbTAKGxO1C6oJEljseOLqmTxfPX66OucJK66OUNzuDjK7p05UIbGwX25I/vrj4BYrnD0uZ/Rtvfzz9fPsPIkgkbL0DZNMFRVEHFEY2ZCBTcwMLdfCsCCVN4SwpE9YG+ARNgD24IDHYSYB1yNCYDkLRFoC8oOUG40AKQx5IYyAmlQ6SF7dDoSof0hbJiApzqLs43aPc5UG+AvVQ/4T7nGQFQiJ5kdbAkmgH2Sz0FaWB4gLrad22v4nmuvPt/yzCc1+V4t0e4z93r8PYwDCvNANxLSthkai0jmCf5+jq6y6Y4SkjTfoKprgWufj9Dg3AozBmiK7pl3H8WDH3u0YfLY6u6c/HVS2vSvsxoygyTF2q/qNenEyjJ5NJPYGPRidME1M1/JYqwyoNq32Ihu4J0z5M+WA2DoqwEI9wfmEaEhQJzPNsKNOh0jJwrfRVJqbnNOrC6IGwQFzgHiKrpCuq2kE+FizrMXWE7IWCEKemg7hSiimOQchNIC3EchqpHlBO95TshQThkwF5TL9k+Mm/MZLGzVo3AlQdLzagDle1vCYd/wU9/5Z5ZcyZPnNow/J8ZHZZCGtsbKw3rdn7nIzTx42o0WfP1cPKuYJ6XPFs5q7p8zmKx5v8cdcxDeMPOR1fj+gh4X10TV/dukiC+nJPeLy8eH1hrtm/UVvpKxcrP2oL/dlcs1eQ9PCeo73wGcp+R2Xyvlp74vH19B9EkoA2CYKUlcQqJCQj6vkoyBjh/IurcJiy4Zxy2FMptRBO7sK3kClR0UYUZAX+wMqfC1ICiYHMYBsKSQsSFKaAUEqZLoiK00ASFsgpN0UEUWE6yOkiiArE6NmUb91OWwAAEuNJREFUszCNxA0c/uBoF04W86YOarWQAYjGmHBBEIkUiXEqib025hNmInWknv6zKo77Sh3/RvcfSx5Xl4O4yr5Y7NxiuEEQFT4uvs8yrF5VvosX28LLS185vsiRHkc9YPiJtrCbJIzHyx3gJdfpl80flZWPR6qIxJghus7xjSqj4E9UNn2VvN76Csqq6XIR+48OYEeGlcAaXhLfQwxNQcgQEI9IErOOxBUuCuDLz9Arm5iyOTaYy7Jty8hAb2VCm43ZmwnwQTbgFpAWyA4SGEKhaMdgYNpngKAcpeMCAfFjYGE4yAqco3RZ0LorUqOkxVkf6AgzvFBPFbISSsOUD+WRrWijpcwbmI4Gomj4yxAIv4bPVU+q9sfxk/EP36UlfP49N3vNWr/m9CZdX/zzjDDofAoW3XHVr9NPHdB8p2+uORl/mjFLUktMbBTtkSJbpLCRxYyD5OpJps/4+DJuvq5IIgoLqfi3pLzcRuloM7QSzKImsBSWG80LVKkxkSvOkFHaCjL5QvrPN9rwvaSVtEg2ICmQCNRQkGjwnlOpNktMxdds+GxcRFrIyCmhTQMEUJjl4qwtzPbAOVC8o0DUZroGiMmBpEUfRBZ4DvRUJC4/1GOpij1ML9XU0PJdFxIZGsOpJkkOQ0YdFh5CPodKl0WfRqQkVUhTIEf1iN4GkdJU4Rx/xsJfHkpfMv4cd+IAUJb1+YdkfSU7NXp6+/bti7qquKiEdfVq0Gl2TO2DonYzAcUTCv0slCB8FuGia/q8j7iAPl30aNIPHVKq55w+00MvjFLo05WmV8H5P9XLzydVF/H0xbGl9UGfjm226B98po2u6fO+0f3H9M7SbT1h+FoS00ybSmm+5/RZHxzbwWvVHtSvNuLRR4BKl0vPtHRhWh1SESUsNBkH0qjvNiAx4MA1JDBc4yBmTPmwJArJCFM+dA1SE5XsmFIqRTzKUrZYkMio78IUkauFoW6Mcbin1GWrOR8nqOEUEUQFmuK3ZdEw6NFg92s9j3XLp0CIsAuS8VdPkcKhCZ9/KAc81x/c3NdzFjy6KHZc0YPNh7VhDg9jYnh4co9n2dvx1nLalys7Rimx2xLGigfEJBQ0Xr149FkBVb04BQiTlPAFbTiDxRGKM1pJf5AgarPKG0sQu413N07hkCANO5m0fSebtCwziW5DqMISHTRMJCDF23inYbmsauNCHq+Vn1ta5dErzKN8psP/RiIXVpAegKJQ30Y06AQSEXdAIpdL0wbTNsLpoSIeCwRJHZYBpTusIFAIlPC0iqL5AxoCcmLPQkkLdITRCc0dSFqQD1A51g4pLOXmhZCwDMO2BpH9q6ZtDoU4oKQIy5yEynFnv+mzw+0+/q3Sf5yT4aYs89zq1alLIK7wYeQANcCpgW5AOaqIARzxcudrXrMTz+cuFAxBI1Rw06eLKz3xsnDikt+Mmr9mWBlXrbySeJAlTt8MXJImXHRNv0zx2GpWZ3r0KKqzXHlRHH26+fQf+mkbg56ADjppUuihMJl7BEhGtmnj+4Phj1lEUAzjaQcgJkzcqPPmlI/yjdJV8Trf/+hbeYyP0uMS0zSVF8SEaSELxkhR6a7IC1IVHkNMBWEkCljxYQ7YXgWKrDCHw2ohJDDKSkr5Tst3TANBp7DdgkTFKSOpxYMtV2i3hXQoJjwbBo3L4oibAajdXmSbCl01PEvi6x3PetMvwfi3cv+xHpPRk8GZvo6Oq5y5FvZlvtfqQZ5v5igfH7iRdHqrn/H24McyEb6ejCUxkCwqEATi8JDNKtWRIxI6wrLj+aOyQgIqLT/KTZ+OLYnCFGHE60PdSgzIgVmcfrbt5evjYkB97VeNyv8plx/UYoChElhYgB7KtD3PAUWRpejIVNzNAjNzyDuYRqnrMF5dIx4CkTrlAJQRps2FhZIX5lqYwfFLOygTBeSmkUhDEgNvIC7MR5ML6JhozoCpn+858G1utbH4j7BRT0Z9VlZzbTyOKJCKeCjkqYbkFBJh+DXCPVcKuXKIFURlm8WBoZSFOBCYmk6i33ioT+Kw1CegEMspcFfe+M8+rRySNum/YUwm9I7TPT04NWOBDg/nwtz16xMbEp3mPswIOuI6G7wBSlynz1pQWZEIP0smIcEEWN3QsfJDn+nj9FFSPh73wilgdE2f+eOumo4pPqWI2kI/LKu4RVXLq7H/kJopRUFhnkj4joNT9KC/BlZgAIVD1I+cwASVUBgCIsF1KEQxJLpGPKHGP5LYrAs5ikREnmJ61KF4K5cG1+REVS6HC1JauGroYYcOrLWUEp6MSF0UpoZgK5hV2dgEzeNLYbMBnRQZEUPnOwGMT6GOp57Kg/0WTCMYjnsQHpDmlJFTR5IcNt/alvV1PdF5NsKcLSpGG03L6QcjnWDpeIXqgFYb//A9wGi1+fMPDeqY7nae6uvT530KKp+JebkhHJyX6Fqz33X83tCgRr1d6gXBH+XnFtEwDmEVMBfAtbK7UvHxVTb1gGLQokbFVBZMDtUJHmT+dsPxmqSRU2nkrxkWxhfbOfEVwLov4sIaonSRr1qZy6vy8xliPbn+qPjYHxSm6mJwdB357DfaVtJ/BMLeW0/ayVQSR6TA5AB7h8kwmFeRrFBUSFYkJk7GsM+F5SuiCQmFBEriCskHYcxfEM9ozBjBS/yaKD//rBzndjD3BHswAcmqwFdhOWGugCw5owwpEt9sxMlVGWQEK4GlcAOi1XAcL6eLICfdcMFmNDnH7xdO/YTCHTkxM2B6EiSPbuXmHrZO5eJy4Iu6lfo2Gu8orFfA+PM9UMjnHpBIx9v+/Q9Wm8nMfcMTE1d7u7vP4Ec6fzy1wqOGP3xI63JHjgT2/rsy/boTbMP0pe78dVUWS5wjK0VUjIqNN3kA62ZYeIcfxofXDFNFUZBTT4W6m71mWBlXrb4yWSoEYWh0jVIUdJEmzA6o18mRDN7dCplCEkK8IiP4WRAU9OO8j5wimZB3SAhKYlJEphLkJCaSEP7PEdxsfVG5UWFxP6qPPngTlvBED6IWLN8dTPmg8ocFPPRXWBdlFWqqCEmLlhAgLRtKdLaAkpQNfRUM6DUQGOUiTimNEaT7FvRVw/F6K91XG4/mHf9KPaovvJ36jzfSS1mpc6mUdhnvhZL4a0GjZsKBKK+n0+kt0AHvztCAsIzjeeAeUKVPF1l101cBWCICxcGmcPalUeHRnyguIsJYej79fFnpKxdjrKhu+spVK69Ke+OW6SXlh7Xk/8b7D5umJKY6nUiQAEmp5ZKoD5Ay8kTFzcAsJIrL+ZREYCWAaU4ubXRNP8wfpuSuGubHMwCJhSuGPCiYJIMw5GV6xkfY0Wd+WoPiBAlEhvnzNluw3SKZYTkQHIQ5J1RQDg7Lw/QQGUIdFp4wcC9KgQ/7KkxjucEHROVmc3ZaCFfEjMxUvlPvBZ0WhT1Q1zG06hQKyGPA9qEh4bPRJuO/0p//WvoPyXpa77BPr9L1mn64QiJRT0vlP3jg1oyn0/th1dnN6VOkQyh8wVRuPpLUH9GHi+sckD4vLaj43NSHLwfv8cKjbGxdgc97JUpFpIRbpovKYHTUltkpHYkyEqNYf1gWfZU+Vn+JiMZERS4qKyTAMv1hmwoItLT/aL6OL9cn8A4mknhDkR5CUuh43ExhAXjnIQVxRQ9UwnU1JM73meHISINzlY/1Ir3jwNQBtui5IpU3K2mFZbEUEhgJiHlZhkqI8rws7hPFxBHlZ5romu1CGRSv2HyQEQiLPkwefJcSk2o0mU+F8Z46KswbKd8qvRUWiq7BsuoYlF/q+Jd839p4/KNnFHhw+Fbc819r/y3dHO7qsk9D2lLPBvEq59SLXC6CYSCq1OTk5F48g+FxLyQSvvyzhFK8taaYL1ACiYdkkSOg/HVO4irmAySLlR8+yHy5wnaWysTF7YmnRxdyecMXFDcxx3KjNCUEGUtb2r4Iixwh5qebxEG58v2Hkh0ERqlLp5kClNLkngLSyF8XExrZi089SYbFm9DRg1FCbEKyoxQE8sqFkTOgTwrDVIPCP/k8qpRcGrxMEXmxnpwjUeXbhjpgA2bBNsp0HPQWOiwNOnddw5YcNIdSFyzTlUKehEbrLDxDNn7osjCXPw5FO22qgPfKHn/pf8XxxxetvSvYlX8BxBVKCdGDmPPDhz0W+Oijjxof//jHt+Hh2oko/qKqFx4l0BJQmQIwS3RNn/fxZXqGFbq4nQzimI9tKFs+S1S1KJ9XoQkEfUQwtKg98fSzefMMwmx5F28/IqK2RLjM2b54/gX0H0v6+IiDZSVgHJogfYWNzDMUpCtsUkKg4pKIUJAsnNTlkjNWzfBCPMOhi8JAiCSqPBmyMFVQ1OdctQwLywNZ5cPCpDl80D6IhjzBASQF0sUeREpSJCyE4ceSpJXbEO2612AHepaTSRn/YrtEAD3n8xV/ntv4+S96nyGRO9gccQZmEPiBK3bRi5kPHcG+v2T32n2+53bxNY8oQyWIB0SR9OmqxMeTh5lm/8azx8srEbCQNSqTpUTX+eagwCiPqiWeQAXO/olHV2tPaYUFjWCxsQJjt7MV564K6iOB2Xj1adNGa3PqDMFl4XwSSnAQCUIibqFPlwtTwbiOkoSR+JvLx3KYv9BXaSrlLyifSegQBNMFTAWhiIeFArRZnoX+8Y2EzKhbnuNlYO9wFpZXkwoH5Kmj/6qOFTz+0n8+Y4Y/2pVIcJqY35+YJ6wjEN33ZzL9kPY3hWjx6Sv+RcByLIQAZZYQJSn2C944FRF/QkvjQ31XZDcV04GVPOGl+WdJEhVGbaNPV3d7Va7ZP83U/1ACgzTjkg4gjUFvHhGWkrPAPnnBLNeFSEKKfAbzOu9yBAUdVj6cZURpZuU3XOUILioD93x2IEnxxFGc9c6M+M93cHSNZVzHquBQDeMn4x898wQ2us7pgGvAbyU8/z5e5EupVEqtJirCgp4KHxVI7sbrQIYKHyKF3+yvIvEEX8FsQNk9qXwgBpgQwNo7p9OKrukzfdzF08+WTmYrV35YF+tU8bEpYImInGtLVH+8PkzZ8iQcVpjrawXCLOHH5uo/9JmWjbXHJMQcNhVW8bOklbsumnJw7Q+cgtVK2mJxAUNNKKncp54KHuzAwnjCE01B1UIHA1A80ik/IkdIfTj6mE8MXh2sSKZhdHUd+IcDykwFLj4eMv7Fv+il75c8/xEmeHaojD+jZ4LgbsPVVvO5iutg4oSAFCCiAqVp/jrUKRU8mzVexsube05ff3tiD0Q1wkP/ojrYgeiaftiheHsjLKL4GrudTxYvb0H9h94bpzeAwCD4cAqJf5SmlBjFH5D8ChVC1Q8KyIkrjtgbE64y4lqtINJHel5Hq4q4ZdsYzsWBWaU+rkFWtFzQbiNNnWciNbT/qD4+Hitq/FdE/3mWzmvQU+W4hZZPenQuRHRNfylcvfVjpUqz0Tj6dNE1/fm4euufTx1z5am3/hr6z6lj9A9ElneKwPJ3IYEVEpqKys0YFeUhoDBP4TV/+bjVIkfqKuu8/ixC/+tqR73111V4DYnrrb+G8a+h1tkk9dY/m7MxV7XUzwdP3ApBgCYG6Co+L6/+kcB4X0g0ERFFzwXjojBc5q8ZhqOKtWEoROmLEwSWBIHowVySyqSS5kIABEYhisRFEov8SgRWGD6K9OMgq8IwBIkTBBYXASGsxcW3pUoHgfF5iIiLPv9x+03kuLxMqaqsUj1KJL4gsFgICGEtFrJtUG6OwDhtJHHhqLOl+dBAG0AnXRAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBIGVhMD/D0fV/fpMMM+gAAAAAElFTkSuQmCC'\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/noticeBar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:17:13\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/noticeBar.js\n */\nexport default {\n    // noticeBar\n    noticeBar: {\n        text: () => [],\n        direction: 'row',\n        step: false,\n        icon: 'volume',\n        mode: '',\n        color: '#f9ae3d',\n        bgColor: '#fdf6ec',\n        speed: 80,\n        fontSize: 14,\n        duration: 2000,\n        disableTouch: true,\n        url: '',\n        linkType: 'navigateTo'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/notify.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:10:21\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/notify.js\n */\nexport default {\n    // notify组件\n    notify: {\n        top: 0,\n        type: 'primary',\n        color: '#ffffff',\n        bgColor: '',\n        message: '',\n        duration: 3000,\n        fontSize: 15,\n        safeAreaInsetTop: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/numberBox.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:11:46\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/numberBox.js\n */\nexport default {\n    // 步进器组件\n    numberBox: {\n        name: '',\n        value: 0,\n        min: 1,\n        max: Number.MAX_SAFE_INTEGER,\n        step: 1,\n        integer: false,\n        disabled: false,\n        disabledInput: false,\n        asyncChange: false,\n        inputWidth: 35,\n        showMinus: true,\n        showPlus: true,\n        decimalLength: null,\n        longPress: true,\n        color: '#323233',\n        buttonSize: 30,\n        bgColor: '#EBECEE',\n        cursorSpacing: 100,\n        disableMinus: false,\n        disablePlus: false,\n        iconStyle: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/numberKeyboard.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:08:05\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/numberKeyboard.js\n */\nexport default {\n    // 数字键盘\n    numberKeyboard: {\n        mode: 'number',\n        dotDisabled: false,\n        random: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/overlay.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:06:50\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/overlay.js\n */\nexport default {\n    // overlay组件\n    overlay: {\n        show: false,\n        zIndex: 10070,\n        duration: 300,\n        opacity: 0.5\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/parse.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:17:33\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/parse.js\n */\nexport default {\n    // parse\n    parse: {\n        copyLink: true,\n        errorImg: '',\n        lazyLoad: false,\n        loadingImg: '',\n        pauseVideo: true,\n        previewImg: true,\n        setTitle: true,\n        showImgMenu: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/picker.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:18:20\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/picker.js\n */\nexport default {\n    // picker\n    picker: {\n        show: false,\n        showToolbar: true,\n        title: '',\n        columns: () => [],\n        loading: false,\n        itemHeight: 44,\n        cancelText: '取消',\n        confirmText: '确定',\n        cancelColor: '#909193',\n        confirmColor: '#3c9cff',\n        visibleItemCount: 5,\n        keyName: 'text',\n        closeOnClickOverlay: false,\n        defaultIndex: () => [],\n\t\timmediateChange: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/popup.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:06:33\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/popup.js\n */\nexport default {\n    // popup组件\n    popup: {\n        show: false,\n        overlay: true,\n        mode: 'bottom',\n        duration: 300,\n        closeable: false,\n        overlayStyle: () => {},\n        closeOnClickOverlay: true,\n        zIndex: 10075,\n        safeAreaInsetBottom: true,\n        safeAreaInsetTop: false,\n        closeIconPos: 'top-right',\n        round: 0,\n        zoom: true,\n        bgColor: '',\n        overlayOpacity: 0.5\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/radio.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:02:34\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/radio.js\n */\nexport default {\n    // radio组件\n    radio: {\n        name: '',\n        shape: '',\n        disabled: '',\n        labelDisabled: '',\n        activeColor: '',\n        inactiveColor: '',\n        iconSize: '',\n        labelSize: '',\n        label: '',\n        labelColor: '',\n        size: '',\n        iconColor: '',\n        placement: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/radioGroup.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:03:12\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/radioGroup.js\n */\nexport default {\n    // radio-group组件\n    radioGroup: {\n        value: '',\n        disabled: false,\n        shape: 'circle',\n        activeColor: '#2979ff',\n        inactiveColor: '#c8c9cc',\n        name: '',\n        size: 18,\n        placement: 'row',\n        label: '',\n        labelColor: '#303133',\n        labelSize: 14,\n        labelDisabled: false,\n        iconColor: '#ffffff',\n        iconSize: 12,\n        borderBottom: false,\n        iconPlacement: 'left'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/rate.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:05:09\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/rate.js\n */\nexport default {\n    // rate组件\n    rate: {\n        value: 1,\n        count: 5,\n        disabled: false,\n        size: 18,\n        inactiveColor: '#b2b2b2',\n        activeColor: '#FA3534',\n        gutter: 4,\n        minCount: 1,\n        allowHalf: false,\n        activeIcon: 'star-fill',\n        inactiveIcon: 'star',\n        touchable: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/readMore.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:18:41\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/readMore.js\n */\nexport default {\n    // readMore\n    readMore: {\n        showHeight: 400,\n        toggle: false,\n        closeText: '展开阅读全文',\n        openText: '收起',\n        color: '#2979ff',\n        fontSize: 14,\n        textIndent: '2em',\n        name: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/row.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:18:58\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/row.js\n */\nexport default {\n    // row\n    row: {\n        gutter: 0,\n        justify: 'start',\n        align: 'center'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/rowNotice.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:19:13\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/rowNotice.js\n */\nexport default {\n    // rowNotice\n    rowNotice: {\n        text: '',\n        icon: 'volume',\n        mode: '',\n        color: '#f9ae3d',\n        bgColor: '#fdf6ec',\n        fontSize: 14,\n        speed: 80\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/scrollList.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:19:28\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/scrollList.js\n */\nexport default {\n    // scrollList\n    scrollList: {\n        indicatorWidth: 50,\n        indicatorBarWidth: 20,\n        indicator: true,\n        indicatorColor: '#f2f2f2',\n        indicatorActiveColor: '#3c9cff',\n        indicatorStyle: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/search.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:19:45\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/search.js\n */\nexport default {\n    // search\n    search: {\n        shape: 'round',\n        bgColor: '#f2f2f2',\n        placeholder: '请输入关键字',\n        clearabled: true,\n        focus: false,\n        showAction: true,\n        actionStyle: () => ({}),\n        actionText: '搜索',\n        inputAlign: 'left',\n        inputStyle: () => ({}),\n        disabled: false,\n        borderColor: 'transparent',\n        searchIconColor: '#909399',\n        searchIconSize: 22,\n        color: '#606266',\n        placeholderColor: '#909399',\n        searchIcon: 'search',\n        margin: '0',\n        animation: false,\n        value: '',\n        maxlength: '-1',\n        height: 32,\n        label: null\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/section.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:07:33\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/section.js\n */\nexport default {\n    // u-section组件\n    section: {\n        title: '',\n        subTitle: '更多',\n        right: true,\n        fontSize: 15,\n        bold: true,\n        color: '#303133',\n        subColor: '#909399',\n        showLine: true,\n        lineColor: '',\n        arrow: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/skeleton.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:20:14\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/skeleton.js\n */\nexport default {\n    // skeleton\n    skeleton: {\n        loading: true,\n        animate: true,\n        rows: 0,\n        rowsWidth: '100%',\n        rowsHeight: 18,\n        title: true,\n        titleWidth: '50%',\n        titleHeight: 18,\n        avatar: false,\n        avatarSize: 32,\n        avatarShape: 'circle'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/slider.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:08:25\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/slider.js\n */\nexport default {\n    // slider组件\n    slider: {\n        value: 0,\n        blockSize: 18,\n        min: 0,\n        max: 100,\n        step: 1,\n        activeColor: '#2979ff',\n        inactiveColor: '#c0c4cc',\n        blockColor: '#ffffff',\n        showValue: false,\n\t\tdisabled:false,\n        blockStyle: () => {}\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/statusBar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:20:39\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/statusBar.js\n */\nexport default {\n    // statusBar\n    statusBar: {\n        bgColor: 'transparent'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/steps.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:12:37\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/steps.js\n */\nexport default {\n    // steps组件\n    steps: {\n        direction: 'row',\n        current: 0,\n        activeColor: '#3c9cff',\n        inactiveColor: '#969799',\n        activeIcon: '',\n        inactiveIcon: '',\n        dot: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/stepsItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:12:55\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/stepsItem.js\n */\nexport default {\n    // steps-item组件\n    stepsItem: {\n        title: '',\n        desc: '',\n        iconSize: 17,\n        error: false\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/sticky.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:01:30\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/sticky.js\n */\nexport default {\n    // sticky组件\n    sticky: {\n        offsetTop: 0,\n        customNavHeight: 0,\n        disabled: false,\n        bgColor: 'transparent',\n        zIndex: '',\n        index: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/subsection.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:12:20\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/subsection.js\n */\nexport default {\n    // subsection组件\n    subsection: {\n        list: [],\n        current: 0,\n        activeColor: '#3c9cff',\n        inactiveColor: '#303133',\n        mode: 'button',\n        fontSize: 12,\n        bold: true,\n        bgColor: '#eeeeef',\n\t\tkeyName: 'name'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/swipeAction.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:00:42\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swipeAction.js\n */\nexport default {\n    // swipe-action组件\n    swipeAction: {\n        autoClose: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/swipeActionItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:01:13\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swipeActionItem.js\n */\nexport default {\n    // swipeActionItem 组件\n    swipeActionItem: {\n        show: false,\n        name: '',\n        disabled: false,\n        threshold: 20,\n        autoClose: true,\n        options: [],\n        duration: 300\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/swiper.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:21:38\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swiper.js\n */\nexport default {\n    // swiper 组件\n    swiper: {\n        list: () => [],\n        indicator: false,\n        indicatorActiveColor: '#FFFFFF',\n        indicatorInactiveColor: 'rgba(255, 255, 255, 0.35)',\n        indicatorStyle: '',\n        indicatorMode: 'line',\n        autoplay: true,\n        current: 0,\n        currentItemId: '',\n        interval: 3000,\n        duration: 300,\n        circular: false,\n        previousMargin: 0,\n        nextMargin: 0,\n        acceleration: false,\n        displayMultipleItems: 1,\n        easingFunction: 'default',\n        keyName: 'url',\n        imgMode: 'aspectFill',\n        height: 130,\n        bgColor: '#f3f4f6',\n        radius: 4,\n        loading: false,\n        showTitle: false\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/swipterIndicator.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:22:07\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/swiperIndicator.js\n */\nexport default {\n    // swiperIndicator 组件\n    swiperIndicator: {\n        length: 0,\n        current: 0,\n        indicatorActiveColor: '',\n        indicatorInactiveColor: '',\n\t\tindicatorMode: 'line'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/switch.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:22:24\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/switch.js\n */\nexport default {\n    // switch\n    switch: {\n        loading: false,\n        disabled: false,\n        size: 25,\n        activeColor: '#2979ff',\n        inactiveColor: '#ffffff',\n        value: false,\n        activeValue: true,\n        inactiveValue: false,\n        asyncChange: false,\n        space: 0\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/tabbar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:22:40\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tabbar.js\n */\nexport default {\n    // tabbar\n    tabbar: {\n        value: null,\n        safeAreaInsetBottom: true,\n        border: true,\n        zIndex: 1,\n        activeColor: '#1989fa',\n        inactiveColor: '#7d7e80',\n        fixed: true,\n        placeholder: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/tabbarItem.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:22:55\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tabbarItem.js\n */\nexport default {\n    //\n    tabbarItem: {\n        name: null,\n        icon: '',\n        badge: null,\n        dot: false,\n        text: '',\n        badgeStyle: 'top: 6px;right:2px;'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/tabs.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:23:14\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tabs.js\n */\nexport default {\n    //\n    tabs: {\n        duration: 300,\n        list: () => [],\n        lineColor: '#3c9cff',\n        activeStyle: () => ({\n            color: '#303133'\n        }),\n        inactiveStyle: () => ({\n            color: '#606266'\n        }),\n        lineWidth: 20,\n        lineHeight: 3,\n        lineBgSize: 'cover',\n        itemStyle: () => ({\n            height: '44px'\n        }),\n        scrollable: true,\n\t\tcurrent: 0,\n\t\tkeyName: 'name'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/tag.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:23:37\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tag.js\n */\nexport default {\n    // tag 组件\n    tag: {\n        type: 'primary',\n        disabled: false,\n        size: 'medium',\n        shape: 'square',\n        text: '',\n        bgColor: '',\n        color: '',\n        borderColor: '',\n        closeColor: '#C6C7CB',\n        name: '',\n        plainFill: false,\n        plain: false,\n        closable: false,\n        show: true,\n        icon: ''\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/text.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:23:58\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/text.js\n */\nexport default {\n    // text 组件\n    text: {\n        type: '',\n        show: true,\n        text: '',\n        prefixIcon: '',\n        suffixIcon: '',\n        mode: '',\n        href: '',\n        format: '',\n        call: false,\n        openType: '',\n        bold: false,\n        block: false,\n        lines: '',\n        color: '#303133',\n        size: 15,\n        iconStyle: () => ({\n            fontSize: '15px'\n        }),\n        decoration: 'none',\n        margin: 0,\n        lineHeight: '',\n        align: 'left',\n        wordWrap: 'normal'\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/textarea.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:24:32\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/textarea.js\n */\nexport default {\n\t// textarea 组件\n\ttextarea: {\n\t\tvalue: '',\n\t\tplaceholder: '',\n\t\tplaceholderClass: 'textarea-placeholder',\n\t\tplaceholderStyle: 'color: #c0c4cc',\n\t\theight: 70,\n\t\tconfirmType: 'done',\n\t\tdisabled: false,\n\t\tcount: false,\n\t\tfocus: false,\n\t\tautoHeight: false,\n\t\tfixed: false,\n\t\tcursorSpacing: 0,\n\t\tcursor: '',\n\t\tshowConfirmBar: true,\n\t\tselectionStart: -1,\n\t\tselectionEnd: -1,\n\t\tadjustPosition: true,\n\t\tdisableDefaultPadding: false,\n\t\tholdKeyboard: false,\n\t\tmaxlength: 140,\n\t\tborder: 'surround',\n\t\tformatter: null\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/toast.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:07:07\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/toast.js\n */\nexport default {\n    // toast组件\n    toast: {\n        zIndex: 10090,\n        loading: false,\n        text: '',\n        icon: '',\n        type: '',\n        loadingMode: '',\n        show: '',\n        overlay: false,\n        position: 'center',\n        params: () => {},\n        duration: 2000,\n        isTab: false,\n        url: '',\n        callback: null,\n        back: false\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/toolbar.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:24:55\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/toolbar.js\n */\nexport default {\n    // toolbar 组件\n    toolbar: {\n        show: true,\n        cancelText: '取消',\n        confirmText: '确认',\n        cancelColor: '#909193',\n        confirmColor: '#3c9cff',\n        title: ''\n    }\n\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/tooltip.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:25:14\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/tooltip.js\n */\nexport default {\n    // tooltip 组件\n    tooltip: {\n        text: '',\n        copyText: '',\n        size: 14,\n        color: '#606266',\n        bgColor: 'transparent',\n        direction: 'top',\n        zIndex: 10071,\n        showCopy: true,\n        buttons: () => [],\n        overlay: true,\n        showToast: true\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/transition.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 16:59:00\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/transition.js\n */\nexport default {\n    // transition动画组件的props\n    transition: {\n        show: false,\n        mode: 'fade',\n        duration: '300',\n        timingFunction: 'ease-out'\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props/upload.js",
    "content": "/*\n * @Author       : LQ\n * @Description  :\n * @version      : 1.0\n * @Date         : 2021-08-20 16:44:21\n * @LastAuthor   : LQ\n * @lastTime     : 2021-08-20 17:09:50\n * @FilePath     : /u-view2.0/uview-ui/libs/config/props/upload.js\n */\nexport default {\n\t// upload组件\n\tupload: {\n\t\taccept: 'image',\n\t\tcapture: () => ['album', 'camera'],\n\t\tcompressed: true,\n\t\tcamera: 'back',\n\t\tmaxDuration: 60,\n\t\tuploadIcon: 'camera-fill',\n\t\tuploadIconColor: '#D3D4D6',\n\t\tuseBeforeRead: false,\n\t\tpreviewFullImage: true,\n\t\tmaxCount: 52,\n\t\tdisabled: false,\n\t\timageMode: 'aspectFill',\n\t\tname: '',\n\t\tsizeType: () => ['original', 'compressed'],\n\t\tmultiple: false,\n\t\tdeletable: true,\n\t\tmaxSize: Number.MAX_VALUE,\n\t\tfileList: () => [],\n\t\tuploadText: '',\n\t\twidth: 80,\n\t\theight: 80,\n\t\tpreviewImage: true\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/props.js",
    "content": "/**\n * 此文件的作用为统一配置所有组件的props参数\n * 借此用户可以全局覆盖组件的props默认值\n * 无需在每个引入组件的页面中都配置一次\n */\nimport config from './config'\n\nimport actionSheet from './props/actionSheet.js'\nimport album from './props/album.js'\nimport alert from './props/alert.js'\nimport avatar from './props/avatar'\nimport avatarGroup from './props/avatarGroup'\nimport backtop from './props/backtop'\nimport badge from './props/badge'\nimport button from './props/button'\nimport calendar from './props/calendar'\nimport carKeyboard from './props/carKeyboard'\nimport cell from './props/cell'\nimport cellGroup from './props/cellGroup'\nimport checkbox from './props/checkbox'\nimport checkboxGroup from './props/checkboxGroup'\nimport circleProgress from './props/circleProgress'\nimport code from './props/code'\nimport codeInput from './props/codeInput'\nimport col from './props/col'\nimport collapse from './props/collapse'\nimport collapseItem from './props/collapseItem'\nimport columnNotice from './props/columnNotice'\nimport countDown from './props/countDown'\nimport countTo from './props/countTo'\nimport datetimePicker from './props/datetimePicker'\nimport divider from './props/divider'\nimport empty from './props/empty'\nimport form from './props/form'\nimport formItem from './props/formItem'\nimport gap from './props/gap'\nimport grid from './props/grid'\nimport gridItem from './props/gridItem'\nimport icon from './props/icon'\nimport image from './props/image'\nimport indexAnchor from './props/indexAnchor'\nimport indexList from './props/indexList'\nimport input from './props/input'\nimport keyboard from './props/keyboard'\nimport line from './props/line'\nimport lineProgress from './props/lineProgress'\nimport link from './props/link'\nimport list from './props/list'\nimport listItem from './props/listItem'\nimport loadingIcon from './props/loadingIcon'\nimport loadingPage from './props/loadingPage'\nimport loadmore from './props/loadmore'\nimport modal from './props/modal'\nimport navbar from './props/navbar'\nimport noNetwork from './props/noNetwork'\nimport noticeBar from './props/noticeBar'\nimport notify from './props/notify'\nimport numberBox from './props/numberBox'\nimport numberKeyboard from './props/numberKeyboard'\nimport overlay from './props/overlay'\nimport parse from './props/parse'\nimport picker from './props/picker'\nimport popup from './props/popup'\nimport radio from './props/radio'\nimport radioGroup from './props/radioGroup'\nimport rate from './props/rate'\nimport readMore from './props/readMore'\nimport row from './props/row'\nimport rowNotice from './props/rowNotice'\nimport scrollList from './props/scrollList'\nimport search from './props/search'\nimport section from './props/section'\nimport skeleton from './props/skeleton'\nimport slider from './props/slider'\nimport statusBar from './props/statusBar'\nimport steps from './props/steps'\nimport stepsItem from './props/stepsItem'\nimport sticky from './props/sticky'\nimport subsection from './props/subsection'\nimport swipeAction from './props/swipeAction'\nimport swipeActionItem from './props/swipeActionItem'\nimport swiper from './props/swiper'\nimport swipterIndicator from './props/swipterIndicator'\nimport _switch from './props/switch'\nimport tabbar from './props/tabbar'\nimport tabbarItem from './props/tabbarItem'\nimport tabs from './props/tabs'\nimport tag from './props/tag'\nimport text from './props/text'\nimport textarea from './props/textarea'\nimport toast from './props/toast'\nimport toolbar from './props/toolbar'\nimport tooltip from './props/tooltip'\nimport transition from './props/transition'\nimport upload from './props/upload'\n\nconst {\n    color\n} = config\n\nexport default {\n    ...actionSheet,\n    ...album,\n    ...alert,\n    ...avatar,\n    ...avatarGroup,\n    ...backtop,\n    ...badge,\n    ...button,\n    ...calendar,\n    ...carKeyboard,\n    ...cell,\n    ...cellGroup,\n    ...checkbox,\n    ...checkboxGroup,\n    ...circleProgress,\n    ...code,\n    ...codeInput,\n    ...col,\n    ...collapse,\n    ...collapseItem,\n    ...columnNotice,\n    ...countDown,\n    ...countTo,\n    ...datetimePicker,\n    ...divider,\n    ...empty,\n    ...form,\n    ...formItem,\n    ...gap,\n    ...grid,\n    ...gridItem,\n    ...icon,\n    ...image,\n    ...indexAnchor,\n    ...indexList,\n    ...input,\n    ...keyboard,\n    ...line,\n    ...lineProgress,\n    ...link,\n    ...list,\n    ...listItem,\n    ...loadingIcon,\n    ...loadingPage,\n    ...loadmore,\n    ...modal,\n    ...navbar,\n    ...noNetwork,\n    ...noticeBar,\n    ...notify,\n    ...numberBox,\n    ...numberKeyboard,\n    ...overlay,\n    ...parse,\n    ...picker,\n    ...popup,\n    ...radio,\n    ...radioGroup,\n    ...rate,\n    ...readMore,\n    ...row,\n    ...rowNotice,\n    ...scrollList,\n    ...search,\n    ...section,\n    ...skeleton,\n    ...slider,\n    ...statusBar,\n    ...steps,\n    ...stepsItem,\n    ...sticky,\n    ...subsection,\n    ...swipeAction,\n    ...swipeActionItem,\n    ...swiper,\n    ...swipterIndicator,\n    ..._switch,\n    ...tabbar,\n    ...tabbarItem,\n    ...tabs,\n    ...tag,\n    ...text,\n    ...textarea,\n    ...toast,\n    ...toolbar,\n    ...tooltip,\n    ...transition,\n    ...upload\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/config/zIndex.js",
    "content": "// uniapp在H5中各API的z-index值如下：\n/**\n * actionsheet: 999\n * modal: 999\n * navigate: 998\n * tabbar: 998\n * toast: 999\n */\n\nexport default {\n    toast: 10090,\n    noNetwork: 10080,\n    // popup包含popup，actionsheet，keyboard，picker的值\n    popup: 10075,\n    mask: 10070,\n    navbar: 980,\n    topTips: 975,\n    sticky: 970,\n    indexListSticky: 965\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/css/color.scss",
    "content": ".u-primary-light {\n\tcolor: $u-primary-light;\n}\n\n.u-warning-light {\n\tcolor: $u-warning-light;\n}\n\n.u-success-light {\n\tcolor: $u-success-light;\n}\n\n.u-error-light {\n\tcolor: $u-error-light;\n}\n\n.u-info-light {\n\tcolor: $u-info-light;\n}\n\n.u-primary-light-bg {\n\tbackground-color: $u-primary-light;\n}\n\n.u-warning-light-bg {\n\tbackground-color: $u-warning-light;\n}\n\n.u-success-light-bg {\n\tbackground-color: $u-success-light;\n}\n\n.u-error-light-bg {\n\tbackground-color: $u-error-light;\n}\n\n.u-info-light-bg {\n\tbackground-color: $u-info-light;\n}\n\n.u-primary-dark {\n\tcolor: $u-primary-dark;\n}\n\n.u-warning-dark {\n\tcolor: $u-warning-dark;\n}\n\n.u-success-dark {\n\tcolor: $u-success-dark;\n}\n\n.u-error-dark {\n\tcolor: $u-error-dark;\n}\n\n.u-info-dark {\n\tcolor: $u-info-dark;\n}\n\n.u-primary-dark-bg {\n\tbackground-color: $u-primary-dark;\n}\n\n.u-warning-dark-bg {\n\tbackground-color: $u-warning-dark;\n}\n\n.u-success-dark-bg {\n\tbackground-color: $u-success-dark;\n}\n\n.u-error-dark-bg {\n\tbackground-color: $u-error-dark;\n}\n\n.u-info-dark-bg {\n\tbackground-color: $u-info-dark;\n}\n\n.u-primary-disabled {\n\tcolor: $u-primary-disabled;\n}\n\n.u-warning-disabled {\n\tcolor: $u-warning-disabled;\n}\n\n.u-success-disabled {\n\tcolor: $u-success-disabled;\n}\n\n.u-error-disabled {\n\tcolor: $u-error-disabled;\n}\n\n.u-info-disabled {\n\tcolor: $u-info-disabled;\n}\n\n.u-primary {\n\tcolor: $u-primary;\n}\n\n.u-warning {\n\tcolor: $u-warning;\n}\n\n.u-success {\n\tcolor: $u-success;\n}\n\n.u-error {\n\tcolor: $u-error;\n}\n\n.u-info {\n\tcolor: $u-info;\n}\n\n.u-primary-bg {\n\tbackground-color: $u-primary;\n}\n\n.u-warning-bg {\n\tbackground-color: $u-warning;\n}\n\n.u-success-bg {\n\tbackground-color: $u-success;\n}\n\n.u-error-bg {\n\tbackground-color: $u-error;\n}\n\n.u-info-bg {\n\tbackground-color: $u-info;\n}\n\n.u-main-color {\n\tcolor: $u-main-color;\n}\n\n.u-content-color {\n\tcolor: $u-content-color;\n}\n\n.u-tips-color {\n\tcolor: $u-tips-color;\n}\n\n.u-light-color {\n\tcolor: $u-light-color;\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/css/common.scss",
    "content": "// 超出行数，自动显示行尾省略号，最多5行\n// 来自uView的温馨提示：当您在控制台看到此报错，说明需要在App.vue的style标签加上【lang=\"scss\"】\n@for $i from 1 through 5 {\n\t.u-line-#{$i} {\n\t\t/* #ifdef APP-NVUE */\n\t\t// nvue下，可以直接使用lines属性，这是weex特有样式\n\t\tlines: $i;\n\t\ttext-overflow: ellipsis;\n\t\toverflow: hidden;\n\t\tflex: 1;\n\t\t/* #endif */\n\n\t\t/* #ifndef APP-NVUE */\n\t\t// vue下，单行和多行显示省略号需要单独处理\n\t\t@if $i == '1' {\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\ttext-overflow: ellipsis;\n\t\t} @else {\n\t\t\tdisplay: -webkit-box!important;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tword-break: break-all;\n\t\t\t-webkit-line-clamp: $i;\n\t\t\t-webkit-box-orient: vertical!important;\n\t\t}\n\t\t/* #endif */\n\t}\n}\n\n\n// 此处加上!important并非随意乱用，而是因为目前*.nvue页面编译到H5时，\n// App.vue的样式会被uni-app的view元素的自带border属性覆盖，导致无效\n// 综上，这是uni-app的缺陷导致我们为了多端兼容，而必须要加上!important\n// 移动端兼容性较好，直接使用0.5px去实现细边框，不使用伪元素形式实现\n.u-border {\n\tborder-width: 0.5px!important;\n\tborder-color: $u-border-color!important;\n    border-style: solid;\n}\n\n.u-border-top {\n\tborder-top-width: 0.5px!important;\n\tborder-color: $u-border-color!important;\n    border-top-style: solid;\n}\n\n.u-border-left {\n\tborder-left-width: 0.5px!important;\n\tborder-color: $u-border-color!important;\n    border-left-style: solid;\n}\n\n.u-border-right {\n\tborder-right-width: 0.5px!important;\n\tborder-color: $u-border-color!important;\n    border-right-style: solid;\n}\n\n.u-border-bottom {\n\tborder-bottom-width: 0.5px!important;\n\tborder-color: $u-border-color!important;\n    border-bottom-style: solid;\n}\n\n.u-border-top-bottom {\n\tborder-top-width: 0.5px!important;\n\tborder-bottom-width: 0.5px!important;\n\tborder-color: $u-border-color!important;\n    border-top-style: solid;\n    border-bottom-style: solid;\n}\n\n// 去除button的所有默认样式，让其表现跟普通的view、text元素一样\n.u-reset-button {\n\tpadding: 0;\n\tbackground-color: transparent;\n\t/* #ifndef APP-PLUS */\n\tfont-size: inherit;\n\tline-height: inherit;\n\tcolor: inherit;\n\t/* #endif */\n\t/* #ifdef APP-NVUE */\n\tborder-width: 0;\n\t/* #endif */\n}\n\n/* #ifndef APP-NVUE */\n.u-reset-button::after {\n   border: none;\n}\n/* #endif */\n\n.u-hover-class {\n\topacity: 0.7;\n}\n\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/css/components.scss",
    "content": "@import \"./mixin.scss\";\n\n/* #ifndef APP-NVUE */\n// 由于uView是基于nvue环境进行开发的，此环境中普通元素默认为flex-direction: column;\n// 所以在非nvue中，需要对元素进行重置为flex-direction: column; 否则可能会表现异常\nview, scroll-view, swiper-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-shrink: 0;\n\tflex-grow: 0;\n\tflex-basis: auto;\n\talign-items: stretch;\n\talign-content: flex-start;\n}\n/* #endif */\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/css/flex.scss",
    "content": "// .u-flex {\n// \t@include vue-flex(row);\n// }\n\n// .u-flex-x {\n// \t@include vue-flex(row);\n// }\n\n// .u-flex-y {\n// \t@include vue-flex(column);\n// }\n\n// .u-flex-xy-center {\n// \t@include vue-flex(row);\n// \tjustify-content: center;\n// \talign-items: center;\n// }\n\n// .u-flex-x-center {\n// \t@include vue-flex(row);\n// \tjustify-content: center;\n// }\n\n// .u-flex-y-center {\n// \t@include vue-flex(column);\n// \tjustify-content: center;\n// }\n\n\n// flex布局\n.u-flex,\n.u-flex-row,\n.u-flex-x {\n\t@include flex;\n}\n\n.u-flex-y,\n.u-flex-column {\n\t@include flex(column);\n}\n\n.u-flex-x-center {\n\t@include flex;\n\tjustify-content: center;\n}\n\n.u-flex-xy-center {\n\t@include flex;\n\tjustify-content: center;\n\talign-items: center;\n}\n\n.u-flex-y-center {\n\t@include flex;\n\talign-items: center;\n}\n\n.u-flex-x-left {\n\t@include flex;\n}\n\n.u-flex-x-reverse,\n.u-flex-row-reverse {\n\tflex-direction: row-reverse;\n}\n\n.u-flex-y-reverse,\n.u-flex-column-reverse {\n\tflex-direction: column-reverse;\n}\n\n/* #ifndef APP-NVUE */\n// 此处为vue版本的简写，因为nvue不支持同时作用于两个类名的样式写法\n// nvue下只能写成class=\"u-flex-x u-flex-x-reverse的形式\"\n.u-flex.u-flex-reverse,\n.u-flex-row.u-flex-reverse,\n.u-flex-x.u-flex-reverse {\n\tflex-direction: row-reverse;\n}\n\n.u-flex-column.u-flex-reverse,\n.u-flex-y.u-flex-reverse {\n\tflex-direction: column-reverse;\n}\n\n// 自动伸缩\n.u-flex-fill {\n\tflex: 1 1 auto\n}\n\n// 边界自动伸缩\n.u-margin-top-auto,\n.u-m-t-auto {\n\tmargin-top: auto !important\n}\n\n.u-margin-right-auto,\n.u-m-r-auto {\n\tmargin-right: auto !important\n}\n\n.u-margin-bottom-auto,\n.u-m-b-auto {\n\tmargin-bottom: auto !important\n}\n\n.u-margin-left-auto,\n.u-m-l-auto {\n\tmargin-left: auto !important\n}\n\n.u-margin-center-auto,\n.u-m-c-auto {\n\tmargin-left: auto !important;\n\tmargin-right: auto !important\n}\n\n.u-margin-middle-auto,\n.u-m-m-auto {\n\tmargin-top: auto !important;\n\tmargin-bottom: auto !important\n}\n/* #endif */\n\n// 换行\n.u-flex-wrap {\n\tflex-wrap: wrap;\n}\n\n// 反向换行\n.u-flex-wrap-reverse {\n\tflex-wrap: wrap-reverse;\n}\n\n// 主轴起点对齐\n.u-flex-start {\n\tjustify-content: flex-start\n}\n\n// 主轴中间对齐\n.u-flex-center {\n\tjustify-content: center\n}\n\n// 主轴终点对齐\n.u-flex-end {\n\tjustify-content: flex-end\n}\n\n// 主轴等比间距\n.u-flex-between {\n\tjustify-content: space-between\n}\n\n// 主轴均分间距\n.u-flex-around {\n\tjustify-content: space-around\n}\n\n// 交叉轴起点对齐\n.u-flex-items-start {\n\talign-items: flex-start\n}\n\n// 交叉轴中间对齐\n.u-flex-items-center {\n\talign-items: center\n}\n\n// 交叉轴终点对齐\n.u-flex-items-end {\n\talign-items: flex-end\n}\n\n// 交叉轴第一行文字基线对齐\n.u-flex-items-baseline {\n\talign-items: baseline\n}\n\n// 交叉轴方向拉伸对齐\n.u-flex-items-stretch {\n\talign-items: stretch\n}\n\n\n// 以下属于项目(子元素)的类\n\n// 子元素交叉轴起点对齐\n.u-flex-self-start {\n\talign-self: flex-start\n}\n\n// 子元素交叉轴居中对齐\n.u-flex-self-center {\n\talign-self: center\n}\n\n// 子元素交叉轴终点对齐\n.u-flex-self-end {\n\talign-self: flex-end\n}\n\n// 子元素交叉轴第一行文字基线对齐\n.u-flex-self-baseline {\n\talign-self: baseline\n}\n\n// 子元素交叉轴方向拉伸对齐\n.u-flex-self-stretch {\n\talign-self: stretch\n}\n\n// 多轴交叉时的对齐方式\n\n// 起点对齐\n.u-flex-content-start {\n\talign-content: flex-start\n}\n\n// 居中对齐\n.u-flex-content-center {\n\talign-content: center\n}\n\n// 终点对齐\n.u-flex-content-end {\n\talign-content: flex-end\n}\n\n// 两端对齐\n.u-flex-content-between {\n\talign-content: space-between\n}\n\n// 均分间距\n.u-flex-content-around {\n\talign-content: space-around\n}\n\n// 全部居中对齐\n.u-flex-middle {\n\tjustify-content: center;\n\talign-items: center;\n\talign-self: center;\n\talign-content: center\n}\n\n// 是否可以放大\n.u-flex-grow {\n\tflex-grow: 1\n}\n\n// 是否可以缩小\n.u-flex-shrink {\n\tflex-shrink: 1\n}\n\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/css/h5.scss",
    "content": ""
  },
  {
    "path": "uni_modules/uview-ui/libs/css/mixin.scss",
    "content": "// 通过scss的mixin功能，把原来需要写4行的css，变成一行\n// 目的是保持代码干净整洁，不至于在nvue下，到处都要写display:flex的条件编译\n@mixin flex($direction: row) {\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: $direction;\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/css/mp.scss",
    "content": ""
  },
  {
    "path": "uni_modules/uview-ui/libs/css/nvue.scss",
    "content": ""
  },
  {
    "path": "uni_modules/uview-ui/libs/css/vue.scss",
    "content": "// 历遍生成4个方向的底部安全区\n@each $d in top, right, bottom, left {\n\t.u-safe-area-inset-#{$d} {\n\t\tpadding-#{$d}: 0;\n\t\tpadding-#{$d}: constant(safe-area-inset-#{$d});  \n\t\tpadding-#{$d}: env(safe-area-inset-#{$d});  \n\t}\n}\n\n//提升H5端uni.toast()的层级，避免被uView的modal等遮盖\n/* #ifdef H5 */\nuni-toast {\n    z-index: 10090;\n}\nuni-toast .uni-toast {\n   z-index: 10090;\n}\n/* #endif */\n\n// 隐藏scroll-view的滚动条\n::-webkit-scrollbar {\n    display: none;  \n    width: 0 !important;  \n    height: 0 !important;  \n    -webkit-appearance: none;  \n    background: transparent;  \n}"
  },
  {
    "path": "uni_modules/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    const startRGB = hexToRgb(startColor, false) // 转换为rgb数组模式\n    const startR = startRGB[0]\n    const startG = startRGB[1]\n    const startB = startRGB[2]\n\n    const endRGB = hexToRgb(endColor, false)\n    const endR = endRGB[0]\n    const endG = endRGB[1]\n    const endB = endRGB[2]\n\n    const sR = (endR - startR) / step // 总差值\n    const sG = (endG - startG) / step\n    const sB = (endB - startB) / step\n    const colorArr = []\n    for (let i = 0; i < step; i++) {\n        // 计算每一步的hex值\n        let hex = rgbToHex(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB\n\t\t\t* i + startB))})`)\n        // 确保第一个颜色值为startColor的值\n        if (i === 0) hex = rgbToHex(startColor)\n        // 确保最后一个颜色值为endColor的值\n        if (i === step - 1) hex = rgbToHex(endColor)\n        colorArr.push(hex)\n    }\n    return colorArr\n}\n\n// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)\nfunction hexToRgb(sColor, str = true) {\n    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/\n    sColor = String(sColor).toLowerCase()\n    if (sColor && reg.test(sColor)) {\n        if (sColor.length === 4) {\n            let sColorNew = '#'\n            for (let i = 1; i < 4; i += 1) {\n                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))\n            }\n            sColor = sColorNew\n        }\n        // 处理六位的颜色值\n        const sColorChange = []\n        for (let i = 1; i < 7; i += 2) {\n            sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))\n        }\n        if (!str) {\n            return sColorChange\n        }\n        return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`\n    } if (/^(rgb|RGB)/.test(sColor)) {\n        const arr = sColor.replace(/(?:\\(|\\)|rgb|RGB)*/g, '').split(',')\n        return arr.map((val) => Number(val))\n    }\n    return sColor\n}\n\n// 将rgb表示方式转换为hex表示方式\nfunction rgbToHex(rgb) {\n    const _this = rgb\n    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/\n    if (/^(rgb|RGB)/.test(_this)) {\n        const aColor = _this.replace(/(?:\\(|\\)|rgb|RGB)*/g, '').split(',')\n        let strHex = '#'\n        for (let i = 0; i < aColor.length; i++) {\n            let hex = Number(aColor[i]).toString(16)\n            hex = String(hex).length == 1 ? `${0}${hex}` : hex // 保证每个rgb的值为2位\n            if (hex === '0') {\n                hex += hex\n            }\n            strHex += hex\n        }\n        if (strHex.length !== 7) {\n            strHex = _this\n        }\n        return strHex\n    } if (reg.test(_this)) {\n        const aNum = _this.replace(/#/, '').split('')\n        if (aNum.length === 6) {\n            return _this\n        } if (aNum.length === 3) {\n            let numHex = '#'\n            for (let i = 0; i < aNum.length; i += 1) {\n                numHex += (aNum[i] + aNum[i])\n            }\n            return numHex\n        }\n    } else {\n        return _this\n    }\n}\n\n/**\n* JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba（255，255，255，0.5）字符串\n* sHex为传入的十六进制的色值\n* alpha为rgba的透明度\n*/\nfunction colorToRgba(color, alpha) {\n    color = rgbToHex(color)\n    // 十六进制颜色值的正则表达式\n    const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/\n    /* 16进制颜色转为RGB格式 */\n    let sColor = String(color).toLowerCase()\n    if (sColor && reg.test(sColor)) {\n        if (sColor.length === 4) {\n            let sColorNew = '#'\n            for (let i = 1; i < 4; i += 1) {\n                sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))\n            }\n            sColor = sColorNew\n        }\n        // 处理六位的颜色值\n        const sColorChange = []\n        for (let i = 1; i < 7; i += 2) {\n            sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`))\n        }\n        // return sColorChange.join(',')\n        return `rgba(${sColorChange.join(',')},${alpha})`\n    }\n\n    return sColor\n}\n\nexport default {\n    colorGradient,\n    hexToRgb,\n    rgbToHex,\n    colorToRgba\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/function/debounce.js",
    "content": "let timeout = null\n\n/**\n * 防抖原理：一定时间内，只有最后一次操作，再过wait毫秒后才执行函数\n *\n * @param {Function} func 要执行的回调函数\n * @param {Number} wait 延时的时间\n * @param {Boolean} immediate 是否立即执行\n * @return null\n */\nfunction debounce(func, wait = 500, immediate = false) {\n    // 清除定时器\n    if (timeout !== null) clearTimeout(timeout)\n    // 立即执行，此类情况一般用不到\n    if (immediate) {\n        const callNow = !timeout\n        timeout = setTimeout(() => {\n            timeout = null\n        }, wait)\n        if (callNow) typeof func === 'function' && func()\n    } else {\n        // 设置定时器，当最后一次操作后，timeout不会再被清除，所以在延时wait毫秒后执行func回调方法\n        timeout = setTimeout(() => {\n            typeof func === 'function' && func()\n        }, wait)\n    }\n}\n\nexport default debounce\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/function/digit.js",
    "content": "let _boundaryCheckingState = true; // 是否进行越界检查的全局开关\n\n/**\n * 把错误的数据转正\n * @private\n * @example strip(0.09999999999999998)=0.1\n */\nfunction strip(num, precision = 15) {\n  return +parseFloat(Number(num).toPrecision(precision));\n}\n\n/**\n * Return digits length of a number\n * @private\n * @param {*number} num Input number\n */\nfunction digitLength(num) {\n  // Get digit length of e\n  const eSplit = num.toString().split(/[eE]/);\n  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n  return len > 0 ? len : 0;\n}\n\n/**\n * 把小数转成整数,如果是小数则放大成整数\n * @private\n * @param {*number} num 输入数\n */\nfunction float2Fixed(num) {\n  if (num.toString().indexOf('e') === -1) {\n    return Number(num.toString().replace('.', ''));\n  }\n  const dLen = digitLength(num);\n  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);\n}\n\n/**\n * 检测数字是否越界，如果越界给出提示\n * @private\n * @param {*number} num 输入数\n */\nfunction checkBoundary(num) {\n  if (_boundaryCheckingState) {\n    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {\n      console.warn(`${num} 超出了精度限制，结果可能不正确`);\n    }\n  }\n}\n\n/**\n * 把递归操作扁平迭代化\n * @param {number[]} arr 要操作的数字数组\n * @param {function} operation 迭代操作\n * @private\n */\nfunction iteratorOperation(arr, operation) {\n  const [num1, num2, ...others] = arr;\n  let res = operation(num1, num2);\n\n  others.forEach((num) => {\n    res = operation(res, num);\n  });\n\n  return res;\n}\n\n/**\n * 高精度乘法\n * @export\n */\nexport function times(...nums) {\n  if (nums.length > 2) {\n    return iteratorOperation(nums, times);\n  }\n\n  const [num1, num2] = nums;\n  const num1Changed = float2Fixed(num1);\n  const num2Changed = float2Fixed(num2);\n  const baseNum = digitLength(num1) + digitLength(num2);\n  const leftValue = num1Changed * num2Changed;\n\n  checkBoundary(leftValue);\n\n  return leftValue / Math.pow(10, baseNum);\n}\n\n/**\n * 高精度加法\n * @export\n */\nexport function plus(...nums) {\n  if (nums.length > 2) {\n    return iteratorOperation(nums, plus);\n  }\n\n  const [num1, num2] = nums;\n  // 取最大的小数位\n  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n  // 把小数都转为整数然后再计算\n  return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\n}\n\n/**\n * 高精度减法\n * @export\n */\nexport function minus(...nums) {\n  if (nums.length > 2) {\n    return iteratorOperation(nums, minus);\n  }\n\n  const [num1, num2] = nums;\n  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n  return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\n}\n\n/**\n * 高精度除法\n * @export\n */\nexport function divide(...nums) {\n  if (nums.length > 2) {\n    return iteratorOperation(nums, divide);\n  }\n\n  const [num1, num2] = nums;\n  const num1Changed = float2Fixed(num1);\n  const num2Changed = float2Fixed(num2);\n  checkBoundary(num1Changed);\n  checkBoundary(num2Changed);\n  // 重要，这里必须用strip进行修正\n  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\n}\n\n/**\n * 四舍五入\n * @export\n */\nexport function round(num, ratio) {\n  const base = Math.pow(10, ratio);\n  let result = divide(Math.round(Math.abs(times(num, base))), base);\n  if (num < 0 && result !== 0) {\n    result = times(result, -1);\n  }\n  // 位数不足则补0\n  return result;\n}\n\n/**\n * 是否进行边界检查，默认开启\n * @param flag 标记开关，true 为开启，false 为关闭，默认为 true\n * @export\n */\nexport function enableBoundaryChecking(flag = true) {\n  _boundaryCheckingState = flag;\n}\n\n\nexport default {\n  times,\n  plus,\n  minus,\n  divide,\n  round,\n  enableBoundaryChecking,\n};\n\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/function/index.js",
    "content": "import test from './test.js'\nimport { round } from './digit.js'\n/**\n * @description 如果value小于min，取min；如果value大于max，取max\n * @param {number} min \n * @param {number} max \n * @param {number} value\n */\nfunction range(min = 0, max = 0, value = 0) {\n\treturn Math.max(min, Math.min(max, Number(value)))\n}\n\n/**\n * @description 用于获取用户传递值的px值  如果用户传递了\"xxpx\"或者\"xxrpx\"，取出其数值部分，如果是\"xxxrpx\"还需要用过uni.upx2px进行转换\n * @param {number|string} value 用户传递值的px值\n * @param {boolean} unit \n * @returns {number|string}\n */\nfunction getPx(value, unit = false) {\n\tif (test.number(value)) {\n\t\treturn unit ? `${value}px` : Number(value)\n\t}\n\t// 如果带有rpx，先取出其数值部分，再转为px值\n\tif (/(rpx|upx)$/.test(value)) {\n\t\treturn unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))\n\t}\n\treturn unit ? `${parseInt(value)}px` : parseInt(value)\n}\n\n/**\n * @description 进行延时，以达到可以简写代码的目的 比如: await uni.$u.sleep(20)将会阻塞20ms\n * @param {number} value 堵塞时间 单位ms 毫秒\n * @returns {Promise} 返回promise\n */\nfunction sleep(value = 30) {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(() => {\n\t\t\tresolve()\n\t\t}, value)\n\t})\n}\n/**\n * @description 运行期判断平台\n * @returns {string} 返回所在平台(小写) \n * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台\n */\nfunction os() {\n\treturn uni.getSystemInfoSync().platform.toLowerCase()\n}\n/**\n * @description 获取系统信息同步接口\n * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync \n */\nfunction sys() {\n\treturn uni.getSystemInfoSync()\n}\n\n/**\n * @description 取一个区间数\n * @param {Number} min 最小值\n * @param {Number} max 最大值\n */\nfunction random(min, max) {\n\tif (min >= 0 && max > 0 && max >= min) {\n\t\tconst gab = max - min + 1\n\t\treturn Math.floor(Math.random() * gab + min)\n\t}\n\treturn 0\n}\n\n/**\n * @param {Number} len uuid的长度\n * @param {Boolean} firstU 将返回的首字母置为\"u\"\n * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制\n */\nfunction guid(len = 32, firstU = true, radix = null) {\n\tconst chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')\n\tconst uuid = []\n\tradix = radix || chars.length\n\n\tif (len) {\n\t\t// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位\n\t\tfor (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]\n\t} else {\n\t\tlet r\n\t\t// rfc4122标准要求返回的uuid中,某些位为固定的字符\n\t\tuuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'\n\t\tuuid[14] = '4'\n\n\t\tfor (let i = 0; i < 36; i++) {\n\t\t\tif (!uuid[i]) {\n\t\t\t\tr = 0 | Math.random() * 16\n\t\t\t\tuuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]\n\t\t\t}\n\t\t}\n\t}\n\t// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class\n\tif (firstU) {\n\t\tuuid.shift()\n\t\treturn `u${uuid.join('')}`\n\t}\n\treturn uuid.join('')\n}\n\n/**\n* @description 获取父组件的参数，因为支付宝小程序不支持provide/inject的写法\n   this.$parent在非H5中，可以准确获取到父组件，但是在H5中，需要多次this.$parent.$parent.xxx\n   这里默认值等于undefined有它的含义，因为最顶层元素(组件)的$parent就是undefined，意味着不传name\n   值(默认为undefined)，就是查找最顶层的$parent\n*  @param {string|undefined} name 父组件的参数名\n*/\nfunction $parent(name = undefined) {\n\tlet parent = this.$parent\n\t// 通过while历遍，这里主要是为了H5需要多层解析的问题\n\twhile (parent) {\n\t\t// 父组件\n\t\tif (parent.$options && parent.$options.name !== name) {\n\t\t\t// 如果组件的name不相等，继续上一级寻找\n\t\t\tparent = parent.$parent\n\t\t} else {\n\t\t\treturn parent\n\t\t}\n\t}\n\treturn false\n}\n\n/**\n * @description 样式转换\n * 对象转字符串，或者字符串转对象\n * @param {object | string} customStyle 需要转换的目标\n * @param {String} target 转换的目的，object-转为对象，string-转为字符串\n * @returns {object|string}\n */\nfunction addStyle(customStyle, target = 'object') {\n\t// 字符串转字符串，对象转对象情形，直接返回\n\tif (test.empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' &&\n\t\ttypeof(customStyle) === 'string') {\n\t\treturn customStyle\n\t}\n\t// 字符串转对象\n\tif (target === 'object') {\n\t\t// 去除字符串样式中的两端空格(中间的空格不能去掉，比如padding: 20px 0如果去掉了就错了)，空格是无用的\n\t\tcustomStyle = trim(customStyle)\n\t\t// 根据\";\"将字符串转为数组形式\n\t\tconst styleArray = customStyle.split(';')\n\t\tconst style = {}\n\t\t// 历遍数组，拼接成对象\n\t\tfor (let i = 0; i < styleArray.length; i++) {\n\t\t\t// 'font-size:20px;color:red;'，如此最后字符串有\";\"的话，会导致styleArray最后一个元素为空字符串，这里需要过滤\n\t\t\tif (styleArray[i]) {\n\t\t\t\tconst item = styleArray[i].split(':')\n\t\t\t\tstyle[trim(item[0])] = trim(item[1])\n\t\t\t}\n\t\t}\n\t\treturn style\n\t}\n\t// 这里为对象转字符串形式\n\tlet string = ''\n\tfor (const i in customStyle) {\n\t\t// 驼峰转为中划线的形式，否则css内联样式，无法识别驼峰样式属性名\n\t\tconst key = i.replace(/([A-Z])/g, '-$1').toLowerCase()\n\t\tstring += `${key}:${customStyle[i]};`\n\t}\n\t// 去除两端空格\n\treturn trim(string)\n}\n\n/**\n * @description 添加单位，如果有rpx，upx，%，px等单位结尾或者值为auto，直接返回，否则加上px单位结尾\n * @param {string|number} value 需要添加单位的值\n * @param {string} unit 添加的单位名 比如px\n */\nfunction addUnit(value = 'auto', unit = uni?.$u?.config?.unit ?? 'px') {\n\tvalue = String(value)\n\t// 用uView内置验证规则中的number判断是否为数值\n\treturn test.number(value) ? `${value}${unit}` : value\n}\n\n/**\n * @description 深度克隆\n * @param {object} obj 需要深度克隆的对象\n * @returns {*} 克隆后的对象或者原值（不是对象）\n */\nfunction deepClone(obj) {\n\t// 对常见的“非”值，直接返回原来值\n\tif ([null, undefined, NaN, false].includes(obj)) return obj\n\tif (typeof obj !== 'object' && typeof obj !== 'function') {\n\t\t// 原始类型直接返回\n\t\treturn obj\n\t}\n\tconst o = test.array(obj) ? [] : {}\n\tfor (const i in obj) {\n\t\tif (obj.hasOwnProperty(i)) {\n\t\t\to[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]\n\t\t}\n\t}\n\treturn o\n}\n\n/**\n * @description JS对象深度合并\n * @param {object} target 需要拷贝的对象\n * @param {object} source 拷贝的来源对象\n * @returns {object|boolean} 深度合并后的对象或者false（入参有不是对象）\n */\nfunction deepMerge(target = {}, source = {}) {\n\ttarget = deepClone(target)\n\tif (typeof target !== 'object' || typeof source !== 'object') return false\n\tfor (const prop in source) {\n\t\tif (!source.hasOwnProperty(prop)) continue\n\t\tif (prop in target) {\n\t\t\tif (typeof target[prop] !== 'object') {\n\t\t\t\ttarget[prop] = source[prop]\n\t\t\t} else if (typeof source[prop] !== 'object') {\n\t\t\t\ttarget[prop] = source[prop]\n\t\t\t} else if (target[prop].concat && source[prop].concat) {\n\t\t\t\ttarget[prop] = target[prop].concat(source[prop])\n\t\t\t} else {\n\t\t\t\ttarget[prop] = deepMerge(target[prop], source[prop])\n\t\t\t}\n\t\t} else {\n\t\t\ttarget[prop] = source[prop]\n\t\t}\n\t}\n\treturn target\n}\n\n/**\n * @description error提示\n * @param {*} err 错误内容\n */\nfunction error(err) {\n\t// 开发环境才提示，生产环境不会提示\n\tif (process.env.NODE_ENV === 'development') {\n\t\tconsole.error(`uView提示：${err}`)\n\t}\n}\n\n/**\n * @description 打乱数组\n * @param {array} array 需要打乱的数组\n * @returns {array} 打乱后的数组\n */\nfunction randomArray(array = []) {\n\t// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0\n\treturn array.sort(() => Math.random() - 0.5)\n}\n\n// padStart 的 polyfill，因为某些机型或情况，还无法支持es7的padStart，比如电脑版的微信小程序\n// 所以这里做一个兼容polyfill的兼容处理\nif (!String.prototype.padStart) {\n\t// 为了方便表示这里 fillString 用了ES6 的默认参数，不影响理解\n\tString.prototype.padStart = function(maxLength, fillString = ' ') {\n\t\tif (Object.prototype.toString.call(fillString) !== '[object String]') {\n\t\t\tthrow new TypeError(\n\t\t\t\t'fillString must be String'\n\t\t\t)\n\t\t}\n\t\tconst str = this\n\t\t// 返回 String(str) 这里是为了使返回的值是字符串字面量，在控制台中更符合直觉\n\t\tif (str.length >= maxLength) return String(str)\n\n\t\tconst fillLength = maxLength - str.length\n\t\tlet times = Math.ceil(fillLength / fillString.length)\n\t\twhile (times >>= 1) {\n\t\t\tfillString += fillString\n\t\t\tif (times === 1) {\n\t\t\t\tfillString += fillString\n\t\t\t}\n\t\t}\n\t\treturn fillString.slice(0, fillLength) + str\n\t}\n}\n\n/**\n * @description 格式化时间\n * @param {String|Number} dateTime 需要格式化的时间戳\n * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd\n * @returns {string} 返回格式化后的字符串\n */\n function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {\n  let date\n\t// 若传入时间为假值，则取当前时间\n  if (!dateTime) {\n    date = new Date()\n  }\n  // 若为unix秒时间戳，则转为毫秒时间戳（逻辑有点奇怪，但不敢改，以保证历史兼容）\n  else if (/^\\d{10}$/.test(dateTime?.toString().trim())) {\n    date = new Date(dateTime * 1000)\n  }\n  // 若用户传入字符串格式时间戳，new Date无法解析，需做兼容\n  else if (typeof dateTime === 'string' && /^\\d+$/.test(dateTime.trim())) {\n    date = new Date(Number(dateTime))\n  }\n\t// 处理平台性差异，在Safari/Webkit中，new Date仅支持/作为分割符的字符串时间\n\t// 处理 '2022-07-10 01:02:03'，跳过 '2022-07-10T01:02:03'\n\telse if (typeof dateTime === 'string' && dateTime.includes('-') && !dateTime.includes('T')) {\n\t\tdate = new Date(dateTime.replace(/-/g, '/'))\n\t}\n\t// 其他都认为符合 RFC 2822 规范\n\telse {\n\t\tdate = new Date(dateTime)\n\t}\n\n\tconst timeSource = {\n\t\t'y': date.getFullYear().toString(), // 年\n\t\t'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月\n\t\t'd': date.getDate().toString().padStart(2, '0'), // 日\n\t\t'h': date.getHours().toString().padStart(2, '0'), // 时\n\t\t'M': date.getMinutes().toString().padStart(2, '0'), // 分\n\t\t's': date.getSeconds().toString().padStart(2, '0') // 秒\n\t\t// 有其他格式化字符需求可以继续添加，必须转化成字符串\n\t}\n\n  for (const key in timeSource) {\n    const [ret] = new RegExp(`${key}+`).exec(formatStr) || []\n    if (ret) {\n      // 年可能只需展示两位\n      const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0\n      formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))\n    }\n  }\n\n  return formatStr\n}\n\n/**\n * @description 时间戳转为多久之前\n * @param {String|Number} timestamp 时间戳\n * @param {String|Boolean} format \n * 格式化规则如果为时间格式字符串，超出一定时间范围，返回固定的时间格式；\n * 如果为布尔值false，无论什么时间，都返回多久以前的格式\n * @returns {string} 转化后的内容\n */\nfunction timeFrom(timestamp = null, format = 'yyyy-mm-dd') {\n\tif (timestamp == null) timestamp = Number(new Date())\n\ttimestamp = parseInt(timestamp)\n\t// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)\n\tif (timestamp.toString().length == 10) timestamp *= 1000\n\tlet timer = (new Date()).getTime() - timestamp\n\ttimer = parseInt(timer / 1000)\n\t// 如果小于5分钟,则返回\"刚刚\",其他以此类推\n\tlet tips = ''\n\tswitch (true) {\n\t\tcase timer < 300:\n\t\t\ttips = '刚刚'\n\t\t\tbreak\n\t\tcase timer >= 300 && timer < 3600:\n\t\t\ttips = `${parseInt(timer / 60)}分钟前`\n\t\t\tbreak\n\t\tcase timer >= 3600 && timer < 86400:\n\t\t\ttips = `${parseInt(timer / 3600)}小时前`\n\t\t\tbreak\n\t\tcase timer >= 86400 && timer < 2592000:\n\t\t\ttips = `${parseInt(timer / 86400)}天前`\n\t\t\tbreak\n\t\tdefault:\n\t\t\t// 如果format为false，则无论什么时间戳，都显示xx之前\n\t\t\tif (format === false) {\n\t\t\t\tif (timer >= 2592000 && timer < 365 * 86400) {\n\t\t\t\t\ttips = `${parseInt(timer / (86400 * 30))}个月前`\n\t\t\t\t} else {\n\t\t\t\t\ttips = `${parseInt(timer / (86400 * 365))}年前`\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttips = timeFormat(timestamp, format)\n\t\t\t}\n\t}\n\treturn tips\n}\n\n/**\n * @description 去除空格\n * @param String str 需要去除空格的字符串\n * @param String pos both(左右)|left|right|all 默认both\n */\nfunction trim(str, pos = 'both') {\n\tstr = String(str)\n\tif (pos == 'both') {\n\t\treturn str.replace(/^\\s+|\\s+$/g, '')\n\t}\n\tif (pos == 'left') {\n\t\treturn str.replace(/^\\s*/, '')\n\t}\n\tif (pos == 'right') {\n\t\treturn str.replace(/(\\s*$)/g, '')\n\t}\n\tif (pos == 'all') {\n\t\treturn str.replace(/\\s+/g, '')\n\t}\n\treturn str\n}\n\n/**\n * @description 对象转url参数\n * @param {object} data,对象\n * @param {Boolean} isPrefix,是否自动加上\"?\"\n * @param {string} arrayFormat 规则 indices|brackets|repeat|comma\n */\nfunction queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {\n\tconst prefix = isPrefix ? '?' : ''\n\tconst _result = []\n\tif (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'\n\tfor (const key in data) {\n\t\tconst value = data[key]\n\t\t// 去掉为空的参数\n\t\tif (['', undefined, null].indexOf(value) >= 0) {\n\t\t\tcontinue\n\t\t}\n\t\t// 如果值为数组，另行处理\n\t\tif (value.constructor === Array) {\n\t\t\t// e.g. {ids: [1, 2, 3]}\n\t\t\tswitch (arrayFormat) {\n\t\t\t\tcase 'indices':\n\t\t\t\t\t// 结果: ids[0]=1&ids[1]=2&ids[2]=3\n\t\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\t\t_result.push(`${key}[${i}]=${value[i]}`)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase 'brackets':\n\t\t\t\t\t// 结果: ids[]=1&ids[]=2&ids[]=3\n\t\t\t\t\tvalue.forEach((_value) => {\n\t\t\t\t\t\t_result.push(`${key}[]=${_value}`)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'repeat':\n\t\t\t\t\t// 结果: ids=1&ids=2&ids=3\n\t\t\t\t\tvalue.forEach((_value) => {\n\t\t\t\t\t\t_result.push(`${key}=${_value}`)\n\t\t\t\t\t})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'comma':\n\t\t\t\t\t// 结果: ids=1,2,3\n\t\t\t\t\tlet commaStr = ''\n\t\t\t\t\tvalue.forEach((_value) => {\n\t\t\t\t\t\tcommaStr += (commaStr ? ',' : '') + _value\n\t\t\t\t\t})\n\t\t\t\t\t_result.push(`${key}=${commaStr}`)\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tvalue.forEach((_value) => {\n\t\t\t\t\t\t_result.push(`${key}[]=${_value}`)\n\t\t\t\t\t})\n\t\t\t}\n\t\t} else {\n\t\t\t_result.push(`${key}=${value}`)\n\t\t}\n\t}\n\treturn _result.length ? prefix + _result.join('&') : ''\n}\n\n/**\n * 显示消息提示框\n * @param {String} title 提示的内容，长度与 icon 取值有关。\n * @param {Number} duration 提示的延迟时间，单位毫秒，默认：2000\n */\nfunction toast(title, duration = 2000) {\n\tuni.showToast({\n\t\ttitle: String(title),\n\t\ticon: 'none',\n\t\tduration\n\t})\n}\n\n/**\n * @description 根据主题type值,获取对应的图标\n * @param {String} type 主题名称,primary|info|error|warning|success\n * @param {boolean} fill 是否使用fill填充实体的图标\n */\nfunction type2icon(type = 'success', fill = false) {\n\t// 如果非预置值,默认为success\n\tif (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'\n\tlet iconName = ''\n\t// 目前(2019-12-12),info和primary使用同一个图标\n\tswitch (type) {\n\t\tcase 'primary':\n\t\t\ticonName = 'info-circle'\n\t\t\tbreak\n\t\tcase 'info':\n\t\t\ticonName = 'info-circle'\n\t\t\tbreak\n\t\tcase 'error':\n\t\t\ticonName = 'close-circle'\n\t\t\tbreak\n\t\tcase 'warning':\n\t\t\ticonName = 'error-circle'\n\t\t\tbreak\n\t\tcase 'success':\n\t\t\ticonName = 'checkmark-circle'\n\t\t\tbreak\n\t\tdefault:\n\t\t\ticonName = 'checkmark-circle'\n\t}\n\t// 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的\n\tif (fill) iconName += '-fill'\n\treturn iconName\n}\n\n/**\n * @description 数字格式化\n * @param {number|string} number 要格式化的数字\n * @param {number} decimals 保留几位小数\n * @param {string} decimalPoint 小数点符号\n * @param {string} thousandsSeparator 千分位符号\n * @returns {string} 格式化后的数字\n */\nfunction priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {\n\tnumber = (`${number}`).replace(/[^0-9+-Ee.]/g, '')\n\tconst n = !isFinite(+number) ? 0 : +number\n\tconst prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)\n\tconst sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator\n\tconst dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint\n\tlet s = ''\n\n\ts = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')\n\tconst re = /(-?\\d+)(\\d{3})/\n\twhile (re.test(s[0])) {\n\t\ts[0] = s[0].replace(re, `$1${sep}$2`)\n\t}\n\t\n\tif ((s[1] || '').length < prec) {\n\t\ts[1] = s[1] || ''\n\t\ts[1] += new Array(prec - s[1].length + 1).join('0')\n\t}\n\treturn s.join(dec)\n}\n\n/**\n * @description 获取duration值\n * 如果带有ms或者s直接返回，如果大于一定值，认为是ms单位，小于一定值，认为是s单位\n * 比如以30位阈值，那么300大于30，可以理解为用户想要的是300ms，而不是想花300s去执行一个动画\n * @param {String|number} value 比如: \"1s\"|\"100ms\"|1|100\n * @param {boolean} unit  提示: 如果是false 默认返回number\n * @return {string|number} \n */\nfunction getDuration(value, unit = true) {\n\tconst valueNum = parseInt(value)\n\tif (unit) {\n\t\tif (/s$/.test(value)) return value\n\t\treturn value > 30 ? `${value}ms` : `${value}s`\n\t}\n\tif (/ms$/.test(value)) return valueNum\n\tif (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000\n\treturn valueNum\n}\n\n/**\n * @description 日期的月或日补零操作\n * @param {String} value 需要补零的值\n */\nfunction padZero(value) {\n\treturn `00${value}`.slice(-2)\n}\n\n/**\n * @description 在u-form的子组件内容发生变化，或者失去焦点时，尝试通知u-form执行校验方法\n * @param {*} instance\n * @param {*} event\n */\nfunction formValidate(instance, event) {\n\tconst formItem = uni.$u.$parent.call(instance, 'u-form-item')\n\tconst form = uni.$u.$parent.call(instance, 'u-form')\n\t// 如果发生变化的input或者textarea等，其父组件中有u-form-item或者u-form等，就执行form的validate方法\n\t// 同时将form-item的pros传递给form，让其进行精确对象验证\n\tif (formItem && form) {\n\t\tform.validateField(formItem.prop, () => {}, event)\n\t}\n}\n\n/**\n * @description 获取某个对象下的属性，用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式\n * @param {object} obj 对象\n * @param {string} key 需要获取的属性字段\n * @returns {*}\n */\nfunction getProperty(obj, key) {\n\tif (!obj) {\n\t\treturn\n\t}\n\tif (typeof key !== 'string' || key === '') {\n\t\treturn ''\n\t}\n\tif (key.indexOf('.') !== -1) {\n\t\tconst keys = key.split('.')\n\t\tlet firstObj = obj[keys[0]] || {}\n\n\t\tfor (let i = 1; i < keys.length; i++) {\n\t\t\tif (firstObj) {\n\t\t\t\tfirstObj = firstObj[keys[i]]\n\t\t\t}\n\t\t}\n\t\treturn firstObj\n\t}\n\treturn obj[key]\n}\n\n/**\n * @description 设置对象的属性值，如果'a.b.c'的形式进行设置\n * @param {object} obj 对象\n * @param {string} key 需要设置的属性\n * @param {string} value 设置的值\n */\nfunction setProperty(obj, key, value) {\n\tif (!obj) {\n\t\treturn\n\t}\n\t// 递归赋值\n\tconst inFn = function(_obj, keys, v) {\n\t\t// 最后一个属性key\n\t\tif (keys.length === 1) {\n\t\t\t_obj[keys[0]] = v\n\t\t\treturn\n\t\t}\n\t\t// 0~length-1个key\n\t\twhile (keys.length > 1) {\n\t\t\tconst k = keys[0]\n\t\t\tif (!_obj[k] || (typeof _obj[k] !== 'object')) {\n\t\t\t\t_obj[k] = {}\n\t\t\t}\n\t\t\tconst key = keys.shift()\n\t\t\t// 自调用判断是否存在属性，不存在则自动创建对象\n\t\t\tinFn(_obj[k], keys, v)\n\t\t}\n\t}\n\n\tif (typeof key !== 'string' || key === '') {\n\n\t} else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作\n\t\tconst keys = key.split('.')\n\t\tinFn(obj, keys, value)\n\t} else {\n\t\tobj[key] = value\n\t}\n}\n\n/**\n * @description 获取当前页面路径\n */\nfunction page() {\n\tconst pages = getCurrentPages()\n\t// 某些特殊情况下(比如页面进行redirectTo时的一些时机)，pages可能为空数组\n\treturn `/${pages[pages.length - 1]?.route ?? ''}`\n}\n\n/**\n * @description 获取当前路由栈实例数组\n */\nfunction pages() {\n\tconst pages = getCurrentPages()\n\treturn pages\n}\n\n/**\n * @description 修改uView内置属性值\n * @param {object} props 修改内置props属性\n * @param {object} config 修改内置config属性\n * @param {object} color 修改内置color属性\n * @param {object} zIndex 修改内置zIndex属性\n */\nfunction setConfig({\n\tprops = {},\n\tconfig = {},\n\tcolor = {},\n\tzIndex = {}\n}) {\n\tconst {\n\t\tdeepMerge,\n\t} = uni.$u\n\tuni.$u.config = deepMerge(uni.$u.config, config)\n\tuni.$u.props = deepMerge(uni.$u.props, props)\n\tuni.$u.color = deepMerge(uni.$u.color, color)\n\tuni.$u.zIndex = deepMerge(uni.$u.zIndex, zIndex)\n}\n\nexport default {\n\trange,\n\tgetPx,\n\tsleep,\n\tos,\n\tsys,\n\trandom,\n\tguid,\n\t$parent,\n\taddStyle,\n\taddUnit,\n\tdeepClone,\n\tdeepMerge,\n\terror,\n\trandomArray,\n\ttimeFormat,\n\ttimeFrom,\n\ttrim,\n\tqueryParams,\n\ttoast,\n\ttype2icon,\n\tpriceFormat,\n\tgetDuration,\n\tpadZero,\n\tformValidate,\n\tgetProperty,\n\tsetProperty,\n\tpage,\n\tpages,\n\tsetConfig\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/function/platform.js",
    "content": "/**\n * 注意：\n * 此部分内容，在vue-cli模式下，需要在vue.config.js加入如下内容才有效：\n * module.exports = {\n *     transpileDependencies: ['uview-v2']\n * }\n */\n\nlet platform = 'none'\n\n// #ifdef VUE3\nplatform = 'vue3'\n// #endif\n\n// #ifdef VUE2\nplatform = 'vue2'\n// #endif\n\n// #ifdef APP-PLUS\nplatform = 'plus'\n// #endif\n\n// #ifdef APP-NVUE\nplatform = 'nvue'\n// #endif\n\n// #ifdef H5\nplatform = 'h5'\n// #endif\n\n// #ifdef MP-WEIXIN\nplatform = 'weixin'\n// #endif\n\n// #ifdef MP-ALIPAY\nplatform = 'alipay'\n// #endif\n\n// #ifdef MP-BAIDU\nplatform = 'baidu'\n// #endif\n\n// #ifdef MP-TOUTIAO\nplatform = 'toutiao'\n// #endif\n\n// #ifdef MP-QQ\nplatform = 'qq'\n// #endif\n\n// #ifdef MP-KUAISHOU\nplatform = 'kuaishou'\n// #endif\n\n// #ifdef MP-360\nplatform = '360'\n// #endif\n\n// #ifdef MP\nplatform = 'mp'\n// #endif\n\n// #ifdef QUICKAPP-WEBVIEW\nplatform = 'quickapp-webview'\n// #endif\n\n// #ifdef QUICKAPP-WEBVIEW-HUAWEI\nplatform = 'quickapp-webview-huawei'\n// #endif\n\n// #ifdef QUICKAPP-WEBVIEW-UNION\nplatform = 'quckapp-webview-union'\n// #endif\n\nexport default platform\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/function/test.js",
    "content": "/**\n * 验证电子邮箱格式\n */\nfunction email(value) {\n    return /^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$/.test(value)\n}\n\n/**\n * 验证手机格式\n */\nfunction mobile(value) {\n    return /^1([3589]\\d|4[5-9]|6[1-2,4-7]|7[0-8])\\d{8}$/.test(value)\n}\n\n/**\n * 验证URL格式\n */\nfunction url(value) {\n    return /^((https|http|ftp|rtsp|mms):\\/\\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\\/?)|(\\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\\/?)$/\n        .test(value)\n}\n\n/**\n * 验证日期格式\n */\nfunction date(value) {\n    if (!value) return false\n    // 判断是否数值或者字符串数值(意味着为时间戳)，转为数值，否则new Date无法识别字符串时间戳\n    if (number(value)) value = +value\n    return !/Invalid|NaN/.test(new Date(value).toString())\n}\n\n/**\n * 验证ISO类型的日期格式\n */\nfunction dateISO(value) {\n    return /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)\n}\n\n/**\n * 验证十进制数字\n */\nfunction number(value) {\n    return /^[\\+-]?(\\d+\\.?\\d*|\\.\\d+|\\d\\.\\d+e\\+\\d+)$/.test(value)\n}\n\n/**\n * 验证字符串\n */\nfunction string(value) {\n    return typeof value === 'string'\n}\n\n/**\n * 验证整数\n */\nfunction digits(value) {\n    return /^\\d+$/.test(value)\n}\n\n/**\n * 验证身份证号码\n */\nfunction idCard(value) {\n    return /^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$/.test(\n        value\n    )\n}\n\n/**\n * 是否车牌号\n */\nfunction carNo(value) {\n    // 新能源车牌\n    const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/\n    // 旧车牌\n    const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/\n    if (value.length === 7) {\n        return creg.test(value)\n    } if (value.length === 8) {\n        return xreg.test(value)\n    }\n    return false\n}\n\n/**\n * 金额,只允许2位小数\n */\nfunction amount(value) {\n    // 金额，只允许保留两位小数\n    return /^[1-9]\\d*(,\\d{3})*(\\.\\d{1,2})?$|^0\\.\\d{1,2}$/.test(value)\n}\n\n/**\n * 中文\n */\nfunction chinese(value) {\n    const reg = /^[\\u4e00-\\u9fa5]+$/gi\n    return reg.test(value)\n}\n\n/**\n * 只能输入字母\n */\nfunction letter(value) {\n    return /^[a-zA-Z]*$/.test(value)\n}\n\n/**\n * 只能是字母或者数字\n */\nfunction enOrNum(value) {\n    // 英文或者数字\n    const reg = /^[0-9a-zA-Z]*$/g\n    return reg.test(value)\n}\n\n/**\n * 验证是否包含某个值\n */\nfunction contains(value, param) {\n    return value.indexOf(param) >= 0\n}\n\n/**\n * 验证一个值范围[min, max]\n */\nfunction range(value, param) {\n    return value >= param[0] && value <= param[1]\n}\n\n/**\n * 验证一个长度范围[min, max]\n */\nfunction rangeLength(value, param) {\n    return value.length >= param[0] && value.length <= param[1]\n}\n\n/**\n * 是否固定电话\n */\nfunction landline(value) {\n    const reg = /^\\d{3,4}-\\d{7,8}(-\\d{3,4})?$/\n    return reg.test(value)\n}\n\n/**\n * 判断是否为空\n */\nfunction empty(value) {\n    switch (typeof value) {\n    case 'undefined':\n        return true\n    case 'string':\n        if (value.replace(/(^[ \\t\\n\\r]*)|([ \\t\\n\\r]*$)/g, '').length == 0) return true\n        break\n    case 'boolean':\n        if (!value) return true\n        break\n    case 'number':\n        if (value === 0 || isNaN(value)) return true\n        break\n    case 'object':\n        if (value === null || value.length === 0) return true\n        for (const i in value) {\n            return false\n        }\n        return true\n    }\n    return false\n}\n\n/**\n * 是否json字符串\n */\nfunction jsonString(value) {\n    if (typeof value === 'string') {\n        try {\n            const obj = JSON.parse(value)\n            if (typeof obj === 'object' && obj) {\n                return true\n            }\n            return false\n        } catch (e) {\n            return false\n        }\n    }\n    return false\n}\n\n/**\n * 是否数组\n */\nfunction array(value) {\n    if (typeof Array.isArray === 'function') {\n        return Array.isArray(value)\n    }\n    return Object.prototype.toString.call(value) === '[object Array]'\n}\n\n/**\n * 是否对象\n */\nfunction object(value) {\n    return Object.prototype.toString.call(value) === '[object Object]'\n}\n\n/**\n * 是否短信验证码\n */\nfunction code(value, len = 6) {\n    return new RegExp(`^\\\\d{${len}}$`).test(value)\n}\n\n/**\n * 是否函数方法\n * @param {Object} value\n */\nfunction func(value) {\n    return typeof value === 'function'\n}\n\n/**\n * 是否promise对象\n * @param {Object} value\n */\nfunction promise(value) {\n    return object(value) && func(value.then) && func(value.catch)\n}\n\n/** 是否图片格式\n * @param {Object} value\n */\nfunction image(value) {\n    const newValue = value.split('?')[0]\n    const IMAGE_REGEXP = /\\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i\n    return IMAGE_REGEXP.test(newValue)\n}\n\n/**\n * 是否视频格式\n * @param {Object} value\n */\nfunction video(value) {\n    const VIDEO_REGEXP = /\\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i\n    return VIDEO_REGEXP.test(value)\n}\n\n/**\n * 是否为正则对象\n * @param {Object}\n * @return {Boolean}\n */\nfunction regExp(o) {\n    return o && Object.prototype.toString.call(o) === '[object RegExp]'\n}\n\nexport default {\n    email,\n    mobile,\n    url,\n    date,\n    dateISO,\n    number,\n    digits,\n    idCard,\n    carNo,\n    amount,\n    chinese,\n    letter,\n    enOrNum,\n    contains,\n    range,\n    rangeLength,\n    empty,\n    isEmpty: empty,\n    jsonString,\n    landline,\n    object,\n    array,\n    code,\n    func,\n    promise,\n    video,\n    image,\n    regExp,\n    string\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/function/throttle.js",
    "content": "let timer; let\n    flag\n/**\n * 节流原理：在一定时间内，只能触发一次\n *\n * @param {Function} func 要执行的回调函数\n * @param {Number} wait 延时的时间\n * @param {Boolean} immediate 是否立即执行\n * @return null\n */\nfunction throttle(func, wait = 500, immediate = true) {\n    if (immediate) {\n        if (!flag) {\n            flag = true\n            // 如果是立即执行，则在wait毫秒内开始时执行\n            typeof func === 'function' && func()\n            timer = setTimeout(() => {\n                flag = false\n            }, wait)\n        }\n    } else if (!flag) {\n        flag = true\n        // 如果是非立即执行，则在wait毫秒内的结束处执行\n        timer = setTimeout(() => {\n            flag = false\n            typeof func === 'function' && func()\n        }, wait)\n    }\n}\nexport default throttle\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/adapters/index.js",
    "content": "import buildURL from '../helpers/buildURL'\nimport buildFullPath from '../core/buildFullPath'\nimport settle from '../core/settle'\nimport { isUndefined } from '../utils'\n\n/**\n * 返回可选值存在的配置\n * @param {Array} keys - 可选值数组\n * @param {Object} config2 - 配置\n * @return {{}} - 存在的配置项\n */\nconst mergeKeys = (keys, config2) => {\n    const config = {}\n    keys.forEach((prop) => {\n        if (!isUndefined(config2[prop])) {\n            config[prop] = config2[prop]\n        }\n    })\n    return config\n}\nexport default (config) => new Promise((resolve, reject) => {\n    const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)\n    const _config = {\n        url: fullPath,\n        header: config.header,\n        complete: (response) => {\n            config.fullPath = fullPath\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        delete _config.header['content-type']\n        delete _config.header['Content-Type']\n        const 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            // #ifdef H5 || APP-PLUS\n            'timeout',\n            // #endif\n            'formData'\n        ]\n        requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) })\n    } else if (config.method === 'DOWNLOAD') {\n        // #ifdef H5 || APP-PLUS\n        if (!isUndefined(config.timeout)) {\n            _config.timeout = config.timeout\n        }\n        // #endif\n        requestTask = uni.downloadFile(_config)\n    } else {\n        const optionalKeys = [\n            'data',\n            'method',\n            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN\n            'timeout',\n            // #endif\n            'dataType',\n            // #ifndef MP-ALIPAY\n            'responseType',\n            // #endif\n            // #ifdef APP-PLUS\n            'sslVerify',\n            // #endif\n            // #ifdef H5\n            'withCredentials',\n            // #endif\n            // #ifdef APP-PLUS\n            'firstIpv4'\n        // #endif\n        ]\n        requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) })\n    }\n    if (config.getTask) {\n        config.getTask(requestTask, config)\n    }\n})\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js",
    "content": "'use strict'\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,\n        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": "uni_modules/uview-ui/libs/luch-request/core/Request.js",
    "content": "/**\n * @Class Request\n * @description luch-request http请求插件\n * @version 3.0.7\n * @Author lu-ch\n * @Date 2021-09-04\n * @Email webwork.s@qq.com\n * 文档: https://www.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: beat-3.0.4 alpha-3.0.4\n */\n\nimport dispatchRequest from './dispatchRequest'\nimport InterceptorManager from './InterceptorManager'\nimport mergeConfig from './mergeConfig'\nimport defaults from './defaults'\nimport { isPlainObject } from '../utils'\nimport clone from '../utils/clone'\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。支付宝小程序不支持\n   * @param {Object} arg.custom - 全局默认的自定义参数\n   * @param {Number} arg.timeout - 全局默认的超时时间，单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序（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 {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)\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 = clone({ ...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        const chain = [dispatchRequest, undefined]\n        let promise = Promise.resolve(config)\n\n        this.interceptors.request.forEach((interceptor) => {\n            chain.unshift(interceptor.fulfilled, interceptor.rejected)\n        })\n\n        this.interceptors.response.forEach((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.middleware({\n            url,\n            method: 'GET',\n            ...options\n        })\n    }\n\n    post(url, data, options = {}) {\n        return this.middleware({\n            url,\n            data,\n            method: 'POST',\n            ...options\n        })\n    }\n\n    // #ifndef MP-ALIPAY\n    put(url, data, options = {}) {\n        return this.middleware({\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.middleware({\n            url,\n            data,\n            method: 'DELETE',\n            ...options\n        })\n    }\n\n    // #endif\n\n    // #ifdef H5 || MP-WEIXIN\n    connect(url, data, options = {}) {\n        return this.middleware({\n            url,\n            data,\n            method: 'CONNECT',\n            ...options\n        })\n    }\n\n    // #endif\n\n    // #ifdef  H5 || MP-WEIXIN || MP-BAIDU\n    head(url, data, options = {}) {\n        return this.middleware({\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.middleware({\n            url,\n            data,\n            method: 'OPTIONS',\n            ...options\n        })\n    }\n\n    // #endif\n\n    // #ifdef H5 || MP-WEIXIN\n    trace(url, data, options = {}) {\n        return this.middleware({\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 * setConfig回调\n * @return {Object} - 返回操作后的config\n * @callback Request~setConfigCallback\n * @param {Object} config - 全局默认config\n */\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-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": "uni_modules/uview-ui/libs/luch-request/core/defaults.js",
    "content": "/**\n * 默认的全局配置\n */\n\nexport default {\n    baseURL: '',\n    header: {},\n    method: 'GET',\n    dataType: 'json',\n    // #ifndef MP-ALIPAY\n    responseType: 'text',\n    // #endif\n    custom: {},\n    // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN\n    timeout: 60000,\n    // #endif\n    // #ifdef APP-PLUS\n    sslVerify: true,\n    // #endif\n    // #ifdef H5\n    withCredentials: false,\n    // #endif\n    // #ifdef APP-PLUS\n    firstIpv4: false,\n    // #endif\n    validateStatus: function validateStatus(status) {\n        return status >= 200 && status < 300\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js",
    "content": "import adapter from '../adapters/index'\n\nexport default (config) => adapter(config)\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js",
    "content": "import { deepMerge, isUndefined } 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    const config = {}\n    keys.forEach((prop) => {\n        if (!isUndefined(config2[prop])) {\n            config[prop] = config2[prop]\n        } else if (!isUndefined(globalsConfig[prop])) {\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,\n        url: config2.url || '',\n        params: config2.params || {},\n        custom: { ...(globalsConfig.custom || {}), ...(config2.custom || {}) },\n        header: deepMerge(globalsConfig.header || {}, config2.header || {})\n    }\n    const defaultToConfig2Keys = ['getTask', 'validateStatus']\n    config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) }\n\n    // eslint-disable-next-line no-empty\n    if (method === 'DOWNLOAD') {\n    // #ifdef H5 || APP-PLUS\n        if (!isUndefined(config2.timeout)) {\n            config.timeout = config2.timeout\n        } else if (!isUndefined(globalsConfig.timeout)) {\n            config.timeout = globalsConfig.timeout\n        }\n    // #endif\n    } else if (method === 'UPLOAD') {\n        delete config.header['content-type']\n        delete config.header['Content-Type']\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            // #ifdef H5 || APP-PLUS\n            'timeout',\n            // #endif\n            'formData'\n        ]\n        uploadKeys.forEach((prop) => {\n            if (!isUndefined(config2[prop])) {\n                config[prop] = config2[prop]\n            }\n        })\n        // #ifdef H5 || APP-PLUS\n        if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {\n            config.timeout = globalsConfig.timeout\n        }\n    // #endif\n    } else {\n        const defaultsKeys = [\n            'data',\n            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN\n            'timeout',\n            // #endif\n            'dataType',\n            // #ifndef MP-ALIPAY\n            'responseType',\n            // #endif\n            // #ifdef APP-PLUS\n            'sslVerify',\n            // #endif\n            // #ifdef H5\n            'withCredentials',\n            // #endif\n            // #ifdef APP-PLUS\n            'firstIpv4'\n            // #endif\n        ]\n        config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) }\n    }\n\n    return config\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-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\n    const status = response.statusCode\n    if (status && (!validateStatus || validateStatus(status))) {\n        resolve(response)\n    } else {\n        reject(response)\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-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    let serializedParams\n    if (utils.isURLSearchParams(params)) {\n        serializedParams = params.toString()\n    } else {\n        const parts = []\n\n        utils.forEach(params, (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, (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        const 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": "uni_modules/uview-ui/libs/luch-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": "uni_modules/uview-ui/libs/luch-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": "uni_modules/uview-ui/libs/luch-request/index.d.ts",
    "content": "type AnyObject = Record<string | number | symbol, any>\ntype HttpPromise<T> = Promise<HttpResponse<T>>;\ntype Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask\nexport interface RequestTask {\n  abort: () => void;\n  offHeadersReceived: () => void;\n  onHeadersReceived: () => void;\n}\nexport interface HttpRequestConfig<T = Tasks> {\n  /** 请求基地址 */\n  baseURL?: string;\n  /** 请求服务器接口地址 */\n  url?: string;\n\n  /** 请求查询参数，自动拼接为查询字符串 */\n  params?: AnyObject;\n  /** 请求体参数 */\n  data?: AnyObject;\n\n  /** 文件对应的 key */\n  name?: string;\n  /** HTTP 请求中其他额外的 form data */\n  formData?: AnyObject;\n  /** 要上传文件资源的路径。 */\n  filePath?: string;\n  /** 需要上传的文件列表。使用 files 时，filePath 和 name 不生效，App、H5（ 2.6.15+） */\n  files?: Array<{\n    name?: string;\n    file?: File;\n    uri: string;\n  }>;\n  /** 要上传的文件对象，仅H5（2.6.15+）支持 */\n  file?: File;\n\n  /** 请求头信息 */\n  header?: AnyObject;\n  /** 请求方式 */\n  method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"CONNECT\" | \"HEAD\" | \"OPTIONS\" | \"TRACE\" | \"UPLOAD\" | \"DOWNLOAD\";\n  /** 如果设为 json，会尝试对返回的数据做一次 JSON.parse */\n  dataType?: string;\n  /** 设置响应的数据类型，支付宝小程序不支持 */\n  responseType?: \"text\" | \"arraybuffer\";\n  /** 自定义参数 */\n  custom?: AnyObject;\n  /** 超时时间，仅微信小程序（2.10.0）、支付宝小程序支持 */\n  timeout?: number;\n  /** DNS解析时优先使用ipv4，仅 App-Android 支持 (HBuilderX 2.8.0+) */\n  firstIpv4?: boolean;\n  /** 验证 ssl 证书 仅5+App安卓端支持（HBuilderX 2.3.3+） */\n  sslVerify?: boolean;\n  /** 跨域请求时是否携带凭证（cookies）仅H5支持（HBuilderX 2.6.15+） */\n  withCredentials?: boolean;\n\n  /** 返回当前请求的task, options。请勿在此处修改options。 */\n  getTask?: (task: T, options: HttpRequestConfig<T>) => void;\n  /**  全局自定义验证器 */\n  validateStatus?: (statusCode: number) => boolean | void;\n}\nexport interface HttpResponse<T = any> {\n  config: HttpRequestConfig;\n  statusCode: number;\n  cookies: Array<string>;\n  data: T;\n  errMsg: string;\n  header: AnyObject;\n}\nexport interface HttpUploadResponse<T = any> {\n  config: HttpRequestConfig;\n  statusCode: number;\n  data: T;\n  errMsg: string;\n}\nexport interface HttpDownloadResponse extends HttpResponse {\n  tempFilePath: string;\n}\nexport interface HttpError {\n  config: HttpRequestConfig;\n  statusCode?: number;\n  cookies?: Array<string>;\n  data?: any;\n  errMsg: string;\n  header?: AnyObject;\n}\nexport interface HttpInterceptorManager<V, E = V> {\n  use(\n    onFulfilled?: (config: V) => Promise<V> | V,\n    onRejected?: (config: E) => Promise<E> | E\n  ): void;\n  eject(id: number): void;\n}\nexport abstract class HttpRequestAbstract {\n  constructor(config?: HttpRequestConfig);\n  config: HttpRequestConfig;\n  interceptors: {\n    request: HttpInterceptorManager<HttpRequestConfig, HttpRequestConfig>;\n    response: HttpInterceptorManager<HttpResponse, HttpError>;\n  }\n  middleware<T = any>(config: HttpRequestConfig): HttpPromise<T>;\n  request<T = any>(config: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  get<T = any>(url: string, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  upload<T = any>(url: string, config?: HttpRequestConfig<UniApp.UploadTask>): HttpPromise<T>;\n  delete<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  head<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  post<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  put<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  connect<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  options<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n  trace<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;\n\n  download(url: string, config?: HttpRequestConfig<UniApp.DownloadTask>): Promise<HttpDownloadResponse>;\n\n  setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;\n}\n\ndeclare class HttpRequest extends HttpRequestAbstract { }\nexport default HttpRequest;\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/index.js",
    "content": "import Request from './core/Request'\n\nexport default Request\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/utils/clone.js",
    "content": "/* eslint-disable */\nvar clone = (function() {\n  'use strict';\n\n  function _instanceof(obj, type) {\n    return type != null && obj instanceof type;\n  }\n\n  var nativeMap;\n  try {\n    nativeMap = Map;\n  } catch(_) {\n    // maybe a reference error because no `Map`. Give it a dummy value that no\n    // value will ever be an instanceof.\n    nativeMap = function() {};\n  }\n\n  var nativeSet;\n  try {\n    nativeSet = Set;\n  } catch(_) {\n    nativeSet = function() {};\n  }\n\n  var nativePromise;\n  try {\n    nativePromise = Promise;\n  } catch(_) {\n    nativePromise = function() {};\n  }\n\n  /**\n   * Clones (copies) an Object using deep copying.\n   *\n   * This function supports circular references by default, but if you are certain\n   * there are no circular references in your object, you can save some CPU time\n   * by calling clone(obj, false).\n   *\n   * Caution: if `circular` is false and `parent` contains circular references,\n   * your program may enter an infinite loop and crash.\n   *\n   * @param `parent` - the object to be cloned\n   * @param `circular` - set to true if the object to be cloned may contain\n   *    circular references. (optional - true by default)\n   * @param `depth` - set to a number if the object is only to be cloned to\n   *    a particular depth. (optional - defaults to Infinity)\n   * @param `prototype` - sets the prototype to be used when cloning an object.\n   *    (optional - defaults to parent prototype).\n   * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n   *    should be cloned as well. Non-enumerable properties on the prototype\n   *    chain will be ignored. (optional - false by default)\n   */\n  function clone(parent, circular, depth, prototype, includeNonEnumerable) {\n    if (typeof circular === 'object') {\n      depth = circular.depth;\n      prototype = circular.prototype;\n      includeNonEnumerable = circular.includeNonEnumerable;\n      circular = circular.circular;\n    }\n    // maintain two arrays for circular references, where corresponding parents\n    // and children have the same index\n    var allParents = [];\n    var allChildren = [];\n\n    var useBuffer = typeof Buffer != 'undefined';\n\n    if (typeof circular == 'undefined')\n      circular = true;\n\n    if (typeof depth == 'undefined')\n      depth = Infinity;\n\n    // recurse this function so we don't reset allParents and allChildren\n    function _clone(parent, depth) {\n      // cloning null always returns null\n      if (parent === null)\n        return null;\n\n      if (depth === 0)\n        return parent;\n\n      var child;\n      var proto;\n      if (typeof parent != 'object') {\n        return parent;\n      }\n\n      if (_instanceof(parent, nativeMap)) {\n        child = new nativeMap();\n      } else if (_instanceof(parent, nativeSet)) {\n        child = new nativeSet();\n      } else if (_instanceof(parent, nativePromise)) {\n        child = new nativePromise(function (resolve, reject) {\n          parent.then(function(value) {\n            resolve(_clone(value, depth - 1));\n          }, function(err) {\n            reject(_clone(err, depth - 1));\n          });\n        });\n      } else if (clone.__isArray(parent)) {\n        child = [];\n      } else if (clone.__isRegExp(parent)) {\n        child = new RegExp(parent.source, __getRegExpFlags(parent));\n        if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n      } else if (clone.__isDate(parent)) {\n        child = new Date(parent.getTime());\n      } else if (useBuffer && Buffer.isBuffer(parent)) {\n        if (Buffer.from) {\n          // Node.js >= 5.10.0\n          child = Buffer.from(parent);\n        } else {\n          // Older Node.js versions\n          child = new Buffer(parent.length);\n          parent.copy(child);\n        }\n        return child;\n      } else if (_instanceof(parent, Error)) {\n        child = Object.create(parent);\n      } else {\n        if (typeof prototype == 'undefined') {\n          proto = Object.getPrototypeOf(parent);\n          child = Object.create(proto);\n        }\n        else {\n          child = Object.create(prototype);\n          proto = prototype;\n        }\n      }\n\n      if (circular) {\n        var index = allParents.indexOf(parent);\n\n        if (index != -1) {\n          return allChildren[index];\n        }\n        allParents.push(parent);\n        allChildren.push(child);\n      }\n\n      if (_instanceof(parent, nativeMap)) {\n        parent.forEach(function(value, key) {\n          var keyChild = _clone(key, depth - 1);\n          var valueChild = _clone(value, depth - 1);\n          child.set(keyChild, valueChild);\n        });\n      }\n      if (_instanceof(parent, nativeSet)) {\n        parent.forEach(function(value) {\n          var entryChild = _clone(value, depth - 1);\n          child.add(entryChild);\n        });\n      }\n\n      for (var i in parent) {\n        var attrs = Object.getOwnPropertyDescriptor(parent, i);\n        if (attrs) {\n          child[i] = _clone(parent[i], depth - 1);\n        }\n\n        try {\n          var objProperty = Object.getOwnPropertyDescriptor(parent, i);\n          if (objProperty.set === 'undefined') {\n            // no setter defined. Skip cloning this property\n            continue;\n          }\n          child[i] = _clone(parent[i], depth - 1);\n        } catch(e){\n          if (e instanceof TypeError) {\n            // when in strict mode, TypeError will be thrown if child[i] property only has a getter\n            // we can't do anything about this, other than inform the user that this property cannot be set.\n            continue\n          } else if (e instanceof ReferenceError) {\n            //this may happen in non strict mode\n            continue\n          }\n        }\n\n      }\n\n      if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(parent);\n        for (var i = 0; i < symbols.length; i++) {\n          // Don't need to worry about cloning a symbol because it is a primitive,\n          // like a number or string.\n          var symbol = symbols[i];\n          var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n          if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n            continue;\n          }\n          child[symbol] = _clone(parent[symbol], depth - 1);\n          Object.defineProperty(child, symbol, descriptor);\n        }\n      }\n\n      if (includeNonEnumerable) {\n        var allPropertyNames = Object.getOwnPropertyNames(parent);\n        for (var i = 0; i < allPropertyNames.length; i++) {\n          var propertyName = allPropertyNames[i];\n          var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n          if (descriptor && descriptor.enumerable) {\n            continue;\n          }\n          child[propertyName] = _clone(parent[propertyName], depth - 1);\n          Object.defineProperty(child, propertyName, descriptor);\n        }\n      }\n\n      return child;\n    }\n\n    return _clone(parent, depth);\n  }\n\n  /**\n   * Simple flat clone using prototype, accepts only objects, usefull for property\n   * override on FLAT configuration object (no nested props).\n   *\n   * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n   * works.\n   */\n  clone.clonePrototype = function clonePrototype(parent) {\n    if (parent === null)\n      return null;\n\n    var c = function () {};\n    c.prototype = parent;\n    return new c();\n  };\n\n// private utility functions\n\n  function __objToStr(o) {\n    return Object.prototype.toString.call(o);\n  }\n  clone.__objToStr = __objToStr;\n\n  function __isDate(o) {\n    return typeof o === 'object' && __objToStr(o) === '[object Date]';\n  }\n  clone.__isDate = __isDate;\n\n  function __isArray(o) {\n    return typeof o === 'object' && __objToStr(o) === '[object Array]';\n  }\n  clone.__isArray = __isArray;\n\n  function __isRegExp(o) {\n    return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n  }\n  clone.__isRegExp = __isRegExp;\n\n  function __getRegExpFlags(re) {\n    var flags = '';\n    if (re.global) flags += 'g';\n    if (re.ignoreCase) flags += 'i';\n    if (re.multiline) flags += 'm';\n    return flags;\n  }\n  clone.__getRegExpFlags = __getRegExpFlags;\n\n  return clone;\n})();\n\nexport default clone\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/luch-request/utils.js",
    "content": "'use strict'\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst { toString } = Object.prototype\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 * 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 * 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 (let 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 (const 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 * 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    const 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\nexport function isUndefined(val) {\n    return typeof val === 'undefined'\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/button.js",
    "content": "export default {\n    props: {\n        lang: String,\n        sessionFrom: String,\n        sendMessageTitle: String,\n        sendMessagePath: String,\n        sendMessageImg: String,\n        showMessageCard: Boolean,\n        appParameter: String,\n        formType: String,\n        openType: String\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/mixin.js",
    "content": "module.exports = {\n    // 定义每个组件都可能需要用到的外部样式以及类名\n    props: {\n        // 每个组件都有的父组件传递的样式，可以为字符串或者对象形式\n        customStyle: {\n            type: [Object, String],\n            default: () => ({})\n        },\n        customClass: {\n            type: String,\n            default: ''\n        },\n        // 跳转的页面路径\n        url: {\n            type: String,\n            default: ''\n        },\n        // 页面跳转的类型\n        linkType: {\n            type: String,\n            default: 'navigateTo'\n        }\n    },\n    data() {\n        return {}\n    },\n    onLoad() {\n        // getRect挂载到$u上，因为这方法需要使用in(this)，所以无法把它独立成一个单独的文件导出\n        this.$u.getRect = this.$uGetRect\n    },\n    created() {\n        // 组件当中，只有created声明周期，为了能在组件使用，故也在created中将方法挂载到$u\n        this.$u.getRect = this.$uGetRect\n    },\n    computed: {\n        // 在2.x版本中，将会把$u挂载到uni对象下，导致在模板中无法使用uni.$u.xxx形式\n        // 所以这里通过computed计算属性将其附加到this.$u上，就可以在模板或者js中使用uni.$u.xxx\n        // 只在nvue环境通过此方式引入完整的$u，其他平台会出现性能问题，非nvue则按需引入（主要原因是props过大）\n        $u() {\n            // #ifndef APP-NVUE\n            // 在非nvue端，移除props，http，mixin等对象，避免在小程序setData时数据过大影响性能\n            return uni.$u.deepMerge(uni.$u, {\n                props: undefined,\n                http: undefined,\n                mixin: undefined\n            })\n            // #endif\n            // #ifdef APP-NVUE\n            return uni.$u\n            // #endif\n        },\n        /**\n         * 生成bem规则类名\n         * 由于微信小程序，H5，nvue之间绑定class的差异，无法通过:class=\"[bem()]\"的形式进行同用\n         * 故采用如下折中做法，最后返回的是数组（一般平台）或字符串（支付宝和字节跳动平台），类似['a', 'b', 'c']或'a b c'的形式\n         * @param {String} name 组件名称\n         * @param {Array} fixed 一直会存在的类名\n         * @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名\n         * @returns {Array|string}\n         */\n        bem() {\n            return function (name, fixed, change) {\n                // 类名前缀\n                const prefix = `u-${name}--`\n                const classes = {}\n                if (fixed) {\n                    fixed.map((item) => {\n                        // 这里的类名，会一直存在\n                        classes[prefix + this[item]] = true\n                    })\n                }\n                if (change) {\n                    change.map((item) => {\n                        // 这里的类名，会根据this[item]的值为true或者false，而进行添加或者移除某一个类\n                        this[item] ? (classes[prefix + item] = this[item]) : (delete classes[prefix + item])\n                    })\n                }\n                return Object.keys(classes)\n                    // 支付宝，头条小程序无法动态绑定一个数组类名，否则解析出来的结果会带有\",\"，而导致失效\n                    // #ifdef MP-ALIPAY || MP-TOUTIAO || MP-LARK\n                    .join(' ')\n                    // #endif\n            }\n        }\n    },\n    methods: {\n        // 跳转某一个页面\n        openPage(urlKey = 'url') {\n            const url = this[urlKey]\n            if (url) {\n                // 执行类似uni.navigateTo的方法\n                uni[this.linkType]({\n                    url\n                })\n            }\n        },\n        // 查询节点信息\n        // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸，为支付宝的bug(2020-07-21)\n        // 解决办法为在组件根部再套一个没有任何作用的view元素\n        $uGetRect(selector, all) {\n            return new Promise((resolve) => {\n                uni.createSelectorQuery()\n                    .in(this)[all ? 'selectAll' : 'select'](selector)\n                    .boundingClientRect((rect) => {\n                        if (all && Array.isArray(rect) && rect.length) {\n                            resolve(rect)\n                        }\n                        if (!all && rect) {\n                            resolve(rect)\n                        }\n                    })\n                    .exec()\n            })\n        },\n        getParentData(parentName = '') {\n            // 避免在created中去定义parent变量\n            if (!this.parent) this.parent = {}\n            // 这里的本质原理是，通过获取父组件实例(也即类似u-radio的父组件u-radio-group的this)\n            // 将父组件this中对应的参数，赋值给本组件(u-radio的this)的parentData对象中对应的属性\n            // 之所以需要这么做，是因为所有端中，头条小程序不支持通过this.parent.xxx去监听父组件参数的变化\n            // 此处并不会自动更新子组件的数据，而是依赖父组件u-radio-group去监听data的变化，手动调用更新子组件的方法去重新获取\n            this.parent = uni.$u.$parent.call(this, parentName)\n            if (this.parent.children) {\n                // 如果父组件的children不存在本组件的实例，才将本实例添加到父组件的children中\n                this.parent.children.indexOf(this) === -1 && this.parent.children.push(this)\n            }\n            if (this.parent && this.parentData) {\n                // 历遍parentData中的属性，将parent中的同名属性赋值给parentData\n                Object.keys(this.parentData).map((key) => {\n                    this.parentData[key] = this.parent[key]\n                })\n            }\n        },\n        // 阻止事件冒泡\n        preventEvent(e) {\n            e && typeof (e.stopPropagation) === 'function' && e.stopPropagation()\n        },\n        // 空操作\n        noop(e) {\n            this.preventEvent(e)\n        }\n    },\n    onReachBottom() {\n        uni.$emit('uOnReachBottom')\n    },\n    beforeDestroy() {\n        // 判断当前页面是否存在parent和chldren，一般在checkbox和checkbox-group父子联动的场景会有此情况\n        // 组件销毁时，移除子组件在父组件children数组中的实例，释放资源，避免数据混乱\n        if (this.parent && uni.$u.test.array(this.parent.children)) {\n            // 组件销毁时，移除父组件中的children数组中对应的实例\n            const childrenList = this.parent.children\n            childrenList.map((child, index) => {\n                // 如果相等，则移除\n                if (child === this) {\n                    childrenList.splice(index, 1)\n                }\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/mpMixin.js",
    "content": "export default {\n    // #ifdef MP-WEIXIN\n    // 将自定义节点设置成虚拟的，更加接近Vue组件的表现，能更好的使用flex属性\n    options: {\n        virtualHost: true\n    }\n    // #endif\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/mpShare.js",
    "content": "module.exports = {\n    onLoad() {\n        // 设置默认的转发参数\n        uni.$u.mpShare = {\n            title: '', // 默认为小程序名称\n            path: '', // 默认为当前页面路径\n            imageUrl: '' // 默认为当前页面的截图\n        }\n    },\n    onShareAppMessage() {\n        return uni.$u.mpShare\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/openType.js",
    "content": "export default {\n    props: {\n        openType: String\n    },\n    methods: {\n        onGetUserInfo(event) {\n            this.$emit('getuserinfo', event.detail)\n        },\n        onContact(event) {\n            this.$emit('contact', event.detail)\n        },\n        onGetPhoneNumber(event) {\n            this.$emit('getphonenumber', event.detail)\n        },\n        onError(event) {\n            this.$emit('error', event.detail)\n        },\n        onLaunchApp(event) {\n            this.$emit('launchapp', event.detail)\n        },\n        onOpenSetting(event) {\n            this.$emit('opensetting', event.detail)\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/style.js",
    "content": "export default {\n    props: {\n        // flex排列方式\n        flexDirection: {\n            type: String,\n            default: ''\n        },\n        // flex-direction的简写\n        fd: {\n            type: String,\n            default: ''\n        },\n        // 展示类型\n        display: {\n            type: String,\n            default: ''\n        },\n        // display简写\n        d: {\n            type: String,\n            default: ''\n        },\n        // 主轴排列方式\n        justifyContent: {\n            type: String,\n            default: ''\n        },\n        // justifyContent的简写\n        jc: {\n            type: String,\n            default: ''\n        },\n        // 纵轴排列方式\n        alignItems: {\n            type: String,\n            default: ''\n        },\n        // align-items的简写\n        ai: {\n            type: String,\n            default: ''\n        },\n        color: {\n            type: String,\n            default: ''\n        },\n        // color简写\n        c: {\n            type: String,\n            default: ''\n        },\n        // 字体大小\n        fontSize: {\n            type: [String, Number],\n            default: 0\n        },\n        // font-size简写\n        fs: {\n            type: [String, Number],\n            default: ''\n        },\n        margin: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin简写\n        m: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-top\n        marginTop: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-top简写\n        mt: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-right\n        marginRight: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-right简写\n        mr: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-bottom\n        marginBottom: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-bottom简写\n        mb: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-left\n        marginLeft: {\n            type: [String, Number],\n            default: 0\n        },\n        // margin-left简写\n        ml: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-left\n        paddingLeft: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-left简写\n        pl: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-top\n        paddingTop: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-top简写\n        pt: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-right\n        paddingRight: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-right简写\n        pr: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-bottom\n        paddingBottom: {\n            type: [String, Number],\n            default: 0\n        },\n        // padding-bottom简写\n        pb: {\n            type: [String, Number],\n            default: 0\n        },\n        // border-radius\n        borderRadius: {\n            type: [String, Number],\n            default: 0\n        },\n        // border-radius简写\n        radius: {\n            type: [String, Number],\n            default: 0\n        },\n        // transform\n        transform: {\n            type: String,\n            default: ''\n        },\n        // 定位\n        position: {\n            type: String,\n            default: ''\n        },\n        // position简写\n        pos: {\n            type: String,\n            default: ''\n        },\n        // 宽度\n        width: {\n            type: [String, Number],\n            default: null\n        },\n        // width简写\n        w: {\n            type: [String, Number],\n            default: null\n        },\n        // 高度\n        height: {\n            type: [String, Number],\n            default: null\n        },\n        // height简写\n        h: {\n            type: [String, Number],\n            default: null\n        },\n        top: {\n            type: [String, Number],\n            default: 0\n        },\n        right: {\n            type: [String, Number],\n            default: 0\n        },\n        bottom: {\n            type: [String, Number],\n            default: 0\n        },\n        left: {\n            type: [String, Number],\n            default: 0\n        }\n    },\n    computed: {\n        viewStyle() {\n            const style = {}\n            const addStyle = uni.$u.addStyle(this.width || this.w) && (style.width = addStyle(this.width || this.w))(this.height || this.h) && (style.height = addStyle(this.height || this.h))(this.margin || this.m) && (style.margin = addStyle(this.margin || this.m))(this.marginTop || this.mt) && (style.marginTop = addStyle(this.marginTop || this.mt))(this.marginRight || this.mr) && (style.marginRight = addStyle(this.marginRight || this.mr))(this.marginBottom || this.mb) && (style.marginBottom = addStyle(this.marginBottom || this.mb))(this.marginLeft || this.ml) && (style.marginLeft = addStyle(this.marginLeft || this.ml))(this.padding || this.p) && (style.padding = addStyle(this.padding || this.p))(this.paddingTop || this.pt) && (style.paddingTop = addStyle(this.paddingTop || this.pt))(this.paddingRight || this.pr) && (style.paddingRight = addStyle(this.paddingRight || this.pr))(this.paddingBottom || this.pb) && (style.paddingBottom = addStyle(this.paddingBottom || this.pb))(this.paddingLeft || this.pl) && (style.paddingLeft = addStyle(this.paddingLeft || this.pl))(this.color || this.c) && (style.color = this.color || this.c)(this.fontSize || this.fs) && (style.fontSize = this.fontSize || this.fs)(this.borderRadius || this.radius) && (style.borderRadius = this.borderRadius || this.radius)(this.position || this.pos) && (this.position = this.position || this.pos)(this.flexDirection || this.fd) && (this.flexDirection = this.flexDirection || this.fd)(this.justifyContent || jc) && (this.justifyContent = this.justifyContent || jc)(this.alignItems || ai) && (this.alignItems = this.alignItems || ai)\n\n            return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))\n        }\n    },\n    methods: {\n        // 获取margin或者padding的单位，比如padding: 0 20转为padding: 0 20px\n        getUnit(unit = '') {\n            // 取出两端空格，分隔成数组，再对数组的每个元素添加单位，最后再合并成字符串\n            return uni.$u.trim(unit).split(' ').map((item) => uni.$u.addUnit(item)).join(' ')\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/mixin/touch.js",
    "content": "const MIN_DISTANCE = 10\n\nfunction getDirection(x, y) {\n    if (x > y && x > MIN_DISTANCE) {\n        return 'horizontal'\n    }\n    if (y > x && y > MIN_DISTANCE) {\n        return 'vertical'\n    }\n    return ''\n}\n\nexport default {\n    methods: {\n        getTouchPoint(e) {\n            if (!e) {\n                return {\n                    x: 0,\n                    y: 0\n                }\n            } if (e.touches && e.touches[0]) {\n                return {\n                    x: e.touches[0].pageX,\n                    y: e.touches[0].pageY\n                }\n            } if (e.changedTouches && e.changedTouches[0]) {\n                return {\n                    x: e.changedTouches[0].pageX,\n                    y: e.changedTouches[0].pageY\n                }\n            }\n            return {\n                x: e.clientX || 0,\n                y: e.clientY || 0\n            }\n        },\n        resetTouchStatus() {\n            this.direction = ''\n            this.deltaX = 0\n            this.deltaY = 0\n            this.offsetX = 0\n            this.offsetY = 0\n        },\n        touchStart(event) {\n            this.resetTouchStatus()\n            const touch = this.getTouchPoint(event)\n            this.startX = touch.x\n            this.startY = touch.y\n        },\n        touchMove(event) {\n            const touch = this.getTouchPoint(event)\n            this.deltaX = touch.x - this.startX\n            this.deltaY = touch.y - this.startY\n            this.offsetX = Math.abs(this.deltaX)\n            this.offsetY = Math.abs(this.deltaY)\n            this.direction =\t\t\t\tthis.direction || getDirection(this.offsetX, this.offsetY)\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/util/async-validator.js",
    "content": "function _extends() {\n    _extends = Object.assign || function (target) {\n        for (let i = 1; i < arguments.length; i++) {\n            const source = arguments[i]\n\n            for (const key in source) {\n                if (Object.prototype.hasOwnProperty.call(source, key)) {\n                    target[key] = source[key]\n                }\n            }\n        }\n\n        return target\n    }\n\n    return _extends.apply(this, arguments)\n}\n\n/* eslint no-console:0 */\nconst formatRegExp = /%[sdj%]/g\nlet warning = function warning() {} // don't print warning message when in production env or node runtime\n\nif (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window\n\t!== 'undefined' && typeof document !== 'undefined') {\n    warning = function warning(type, errors) {\n        if (typeof console !== 'undefined' && console.warn) {\n            if (errors.every((e) => typeof e === 'string')) {\n                console.warn(type, errors)\n            }\n        }\n    }\n}\n\nfunction convertFieldsError(errors) {\n    if (!errors || !errors.length) return null\n    const fields = {}\n    errors.forEach((error) => {\n        const { field } = error\n        fields[field] = fields[field] || []\n        fields[field].push(error)\n    })\n    return fields\n}\n\nfunction format() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key]\n    }\n\n    let i = 1\n    const f = args[0]\n    const len = args.length\n\n    if (typeof f === 'function') {\n        return f.apply(null, args.slice(1))\n    }\n\n    if (typeof f === 'string') {\n        let str = String(f).replace(formatRegExp, (x) => {\n            if (x === '%%') {\n                return '%'\n            }\n\n            if (i >= len) {\n                return x\n            }\n\n            switch (x) {\n            case '%s':\n                return String(args[i++])\n\n            case '%d':\n                return Number(args[i++])\n\n            case '%j':\n                try {\n                    return JSON.stringify(args[i++])\n                } catch (_) {\n                    return '[Circular]'\n                }\n\n                break\n\n            default:\n                return x\n            }\n        })\n\n        for (let arg = args[i]; i < len; arg = args[++i]) {\n            str += ` ${arg}`\n        }\n\n        return str\n    }\n\n    return f\n}\n\nfunction isNativeStringType(type) {\n    return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern'\n}\n\nfunction isEmptyValue(value, type) {\n    if (value === undefined || value === null) {\n        return true\n    }\n\n    if (type === 'array' && Array.isArray(value) && !value.length) {\n        return true\n    }\n\n    if (isNativeStringType(type) && typeof value === 'string' && !value) {\n        return true\n    }\n\n    return false\n}\n\nfunction asyncParallelArray(arr, func, callback) {\n    const results = []\n    let total = 0\n    const arrLength = arr.length\n\n    function count(errors) {\n        results.push.apply(results, errors)\n        total++\n\n        if (total === arrLength) {\n            callback(results)\n        }\n    }\n\n    arr.forEach((a) => {\n        func(a, count)\n    })\n}\n\nfunction asyncSerialArray(arr, func, callback) {\n    let index = 0\n    const arrLength = arr.length\n\n    function next(errors) {\n        if (errors && errors.length) {\n            callback(errors)\n            return\n        }\n\n        const original = index\n        index += 1\n\n        if (original < arrLength) {\n            func(arr[original], next)\n        } else {\n            callback([])\n        }\n    }\n\n    next([])\n}\n\nfunction flattenObjArr(objArr) {\n    const ret = []\n    Object.keys(objArr).forEach((k) => {\n        ret.push.apply(ret, objArr[k])\n    })\n    return ret\n}\n\nfunction asyncMap(objArr, option, func, callback) {\n    if (option.first) {\n        const _pending = new Promise((resolve, reject) => {\n            const next = function next(errors) {\n                callback(errors)\n                return errors.length ? reject({\n                    errors,\n                    fields: convertFieldsError(errors)\n                }) : resolve()\n            }\n\n            const flattenArr = flattenObjArr(objArr)\n            asyncSerialArray(flattenArr, func, next)\n        })\n\n        _pending.catch((e) => e)\n\n        return _pending\n    }\n\n    let firstFields = option.firstFields || []\n\n    if (firstFields === true) {\n        firstFields = Object.keys(objArr)\n    }\n\n    const objArrKeys = Object.keys(objArr)\n    const objArrLength = objArrKeys.length\n    let total = 0\n    const results = []\n    const pending = new Promise((resolve, reject) => {\n        const next = function next(errors) {\n            results.push.apply(results, errors)\n            total++\n\n            if (total === objArrLength) {\n                callback(results)\n                return results.length ? reject({\n                    errors: results,\n                    fields: convertFieldsError(results)\n                }) : resolve()\n            }\n        }\n\n        if (!objArrKeys.length) {\n            callback(results)\n            resolve()\n        }\n\n        objArrKeys.forEach((key) => {\n            const arr = objArr[key]\n\n            if (firstFields.indexOf(key) !== -1) {\n                asyncSerialArray(arr, func, next)\n            } else {\n                asyncParallelArray(arr, func, next)\n            }\n        })\n    })\n    pending.catch((e) => e)\n    return pending\n}\n\nfunction complementError(rule) {\n    return function (oe) {\n        if (oe && oe.message) {\n            oe.field = oe.field || rule.fullField\n            return oe\n        }\n\n        return {\n            message: typeof oe === 'function' ? oe() : oe,\n            field: oe.field || rule.fullField\n        }\n    }\n}\n\nfunction deepMerge(target, source) {\n    if (source) {\n        for (const s in source) {\n            if (source.hasOwnProperty(s)) {\n                const value = source[s]\n\n                if (typeof value === 'object' && typeof target[s] === 'object') {\n                    target[s] = { ...target[s], ...value }\n                } else {\n                    target[s] = value\n                }\n            }\n        }\n    }\n\n    return target\n}\n\n/**\n *  Rule for validating required fields.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param source The source object being validated.\n *  @param errors An array of errors that this rule may add\n *  validation errors to.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction required(rule, value, source, errors, options, type) {\n    if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {\n        errors.push(format(options.messages.required, rule.fullField))\n    }\n}\n\n/**\n *  Rule for validating whitespace.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param source The source object being validated.\n *  @param errors An array of errors that this rule may add\n *  validation errors to.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction whitespace(rule, value, source, errors, options) {\n    if (/^\\s+$/.test(value) || value === '') {\n        errors.push(format(options.messages.whitespace, rule.fullField))\n    }\n}\n\n/* eslint max-len:0 */\n\nconst pattern = {\n    // http://emailregex.com/\n    email: /^(([^<>()\\[\\]\\\\.,;:\\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,}))$/,\n    url: new RegExp(\n        '^(?!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]*)?$',\n        'i'\n    ),\n    hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i\n}\nvar types = {\n    integer: function integer(value) {\n        return /^(-)?\\d+$/.test(value);\n    },\n    float: function float(value) {\n        return /^(-)?\\d+(\\.\\d+)?$/.test(value);\n    },\n    array: function array(value) {\n        return Array.isArray(value)\n    },\n    regexp: function regexp(value) {\n        if (value instanceof RegExp) {\n            return true\n        }\n\n        try {\n            return !!new RegExp(value)\n        } catch (e) {\n            return false\n        }\n    },\n    date: function date(value) {\n        return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear\n\t\t\t=== 'function'\n    },\n    number: function number(value) {\n        if (isNaN(value)) {\n            return false\n        }\n\n        // 修改源码，将字符串数值先转为数值\n        return typeof +value === 'number'\n    },\n    object: function object(value) {\n        return typeof value === 'object' && !types.array(value)\n    },\n    method: function method(value) {\n        return typeof value === 'function'\n    },\n    email: function email(value) {\n        return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255\n    },\n    url: function url(value) {\n        return typeof value === 'string' && !!value.match(pattern.url)\n    },\n    hex: function hex(value) {\n        return typeof value === 'string' && !!value.match(pattern.hex)\n    }\n}\n/**\n *  Rule for validating the type of a value.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param source The source object being validated.\n *  @param errors An array of errors that this rule may add\n *  validation errors to.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction type(rule, value, source, errors, options) {\n    if (rule.required && value === undefined) {\n        required(rule, value, source, errors, options)\n        return\n    }\n\n    const custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex']\n    const ruleType = rule.type\n\n    if (custom.indexOf(ruleType) > -1) {\n        if (!types[ruleType](value)) {\n            errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type))\n        } // straight typeof check\n    } else if (ruleType && typeof value !== rule.type) {\n        errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type))\n    }\n}\n\n/**\n *  Rule for validating minimum and maximum allowed values.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param source The source object being validated.\n *  @param errors An array of errors that this rule may add\n *  validation errors to.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction range(rule, value, source, errors, options) {\n    const len = typeof rule.len === 'number'\n    const min = typeof rule.min === 'number'\n    const max = typeof rule.max === 'number' // 正则匹配码点范围从U+010000一直到U+10FFFF的文字（补充平面Supplementary Plane）\n\n    const spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\n    let val = value\n    let key = null\n    const num = typeof value === 'number'\n    const str = typeof value === 'string'\n    const arr = Array.isArray(value)\n\n    if (num) {\n        key = 'number'\n    } else if (str) {\n        key = 'string'\n    } else if (arr) {\n        key = 'array'\n    } // if the value is not of a supported type for range validation\n    // the validation rule rule should use the\n    // type property to also test for a particular type\n\n    if (!key) {\n        return false\n    }\n\n    if (arr) {\n        val = value.length\n    }\n\n    if (str) {\n        // 处理码点大于U+010000的文字length属性不准确的bug，如\"𠮷𠮷𠮷\".lenght !== 3\n        val = value.replace(spRegexp, '_').length\n    }\n\n    if (len) {\n        if (val !== rule.len) {\n            errors.push(format(options.messages[key].len, rule.fullField, rule.len))\n        }\n    } else if (min && !max && val < rule.min) {\n        errors.push(format(options.messages[key].min, rule.fullField, rule.min))\n    } else if (max && !min && val > rule.max) {\n        errors.push(format(options.messages[key].max, rule.fullField, rule.max))\n    } else if (min && max && (val < rule.min || val > rule.max)) {\n        errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max))\n    }\n}\n\nconst ENUM = 'enum'\n/**\n *  Rule for validating a value exists in an enumerable list.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param source The source object being validated.\n *  @param errors An array of errors that this rule may add\n *  validation errors to.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction enumerable(rule, value, source, errors, options) {\n    rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : []\n\n    if (rule[ENUM].indexOf(value) === -1) {\n        errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')))\n    }\n}\n\n/**\n *  Rule for validating a regular expression pattern.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param source The source object being validated.\n *  @param errors An array of errors that this rule may add\n *  validation errors to.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction pattern$1(rule, value, source, errors, options) {\n    if (rule.pattern) {\n        if (rule.pattern instanceof RegExp) {\n            // if a RegExp instance is passed, reset `lastIndex` in case its `global`\n            // flag is accidentally set to `true`, which in a validation scenario\n            // is not necessary and the result might be misleading\n            rule.pattern.lastIndex = 0\n\n            if (!rule.pattern.test(value)) {\n                errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern))\n            }\n        } else if (typeof rule.pattern === 'string') {\n            const _pattern = new RegExp(rule.pattern)\n\n            if (!_pattern.test(value)) {\n                errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern))\n            }\n        }\n    }\n}\n\nconst rules = {\n    required,\n    whitespace,\n    type,\n    range,\n    enum: enumerable,\n    pattern: pattern$1\n}\n\n/**\n *  Performs validation for string types.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction string(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value, 'string') && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options, 'string')\n\n        if (!isEmptyValue(value, 'string')) {\n            rules.type(rule, value, source, errors, options)\n            rules.range(rule, value, source, errors, options)\n            rules.pattern(rule, value, source, errors, options)\n\n            if (rule.whitespace === true) {\n                rules.whitespace(rule, value, source, errors, options)\n            }\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates a function.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction method(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules.type(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates a number.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction number(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (value === '') {\n            value = undefined\n        }\n\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules.type(rule, value, source, errors, options)\n            rules.range(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates a boolean.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction _boolean(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules.type(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates the regular expression type.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction regexp(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (!isEmptyValue(value)) {\n            rules.type(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates a number is an integer.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction integer(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules.type(rule, value, source, errors, options)\n            rules.range(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates a number is a floating point number.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction floatFn(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules.type(rule, value, source, errors, options)\n            rules.range(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates an array.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction array(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value, 'array') && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options, 'array')\n\n        if (!isEmptyValue(value, 'array')) {\n            rules.type(rule, value, source, errors, options)\n            rules.range(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates an object.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction object(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules.type(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\nconst ENUM$1 = 'enum'\n/**\n *  Validates an enumerable list.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction enumerable$1(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (value !== undefined) {\n            rules[ENUM$1](rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Validates a regular expression pattern.\n *\n *  Performs validation when a rule only contains\n *  a pattern property but is not declared as a string type.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction pattern$2(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value, 'string') && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (!isEmptyValue(value, 'string')) {\n            rules.pattern(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\nfunction date(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n\n        if (!isEmptyValue(value)) {\n            let dateObject\n\n            if (typeof value === 'number') {\n                dateObject = new Date(value)\n            } else {\n                dateObject = value\n            }\n\n            rules.type(rule, dateObject, source, errors, options)\n\n            if (dateObject) {\n                rules.range(rule, dateObject.getTime(), source, errors, options)\n            }\n        }\n    }\n\n    callback(errors)\n}\n\nfunction required$1(rule, value, callback, source, options) {\n    const errors = []\n    const type = Array.isArray(value) ? 'array' : typeof value\n    rules.required(rule, value, source, errors, options, type)\n    callback(errors)\n}\n\nfunction type$1(rule, value, callback, source, options) {\n    const ruleType = rule.type\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value, ruleType) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options, ruleType)\n\n        if (!isEmptyValue(value, ruleType)) {\n            rules.type(rule, value, source, errors, options)\n        }\n    }\n\n    callback(errors)\n}\n\n/**\n *  Performs validation for any type.\n *\n *  @param rule The validation rule.\n *  @param value The value of the field on the source object.\n *  @param callback The callback function.\n *  @param source The source object being validated.\n *  @param options The validation options.\n *  @param options.messages The validation messages.\n */\n\nfunction any(rule, value, callback, source, options) {\n    const errors = []\n    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)\n\n    if (validate) {\n        if (isEmptyValue(value) && !rule.required) {\n            return callback()\n        }\n\n        rules.required(rule, value, source, errors, options)\n    }\n\n    callback(errors)\n}\n\nconst validators = {\n    string,\n    method,\n    number,\n    boolean: _boolean,\n    regexp,\n    integer,\n    float: floatFn,\n    array,\n    object,\n    enum: enumerable$1,\n    pattern: pattern$2,\n    date,\n    url: type$1,\n    hex: type$1,\n    email: type$1,\n    required: required$1,\n    any\n}\n\nfunction newMessages() {\n    return {\n        default: 'Validation error on field %s',\n        required: '%s is required',\n        enum: '%s must be one of %s',\n        whitespace: '%s cannot be empty',\n        date: {\n            format: '%s date %s is invalid for format %s',\n            parse: '%s date could not be parsed, %s is invalid ',\n            invalid: '%s date %s is invalid'\n        },\n        types: {\n            string: '%s is not a %s',\n            method: '%s is not a %s (function)',\n            array: '%s is not an %s',\n            object: '%s is not an %s',\n            number: '%s is not a %s',\n            date: '%s is not a %s',\n            boolean: '%s is not a %s',\n            integer: '%s is not an %s',\n            float: '%s is not a %s',\n            regexp: '%s is not a valid %s',\n            email: '%s is not a valid %s',\n            url: '%s is not a valid %s',\n            hex: '%s is not a valid %s'\n        },\n        string: {\n            len: '%s must be exactly %s characters',\n            min: '%s must be at least %s characters',\n            max: '%s cannot be longer than %s characters',\n            range: '%s must be between %s and %s characters'\n        },\n        number: {\n            len: '%s must equal %s',\n            min: '%s cannot be less than %s',\n            max: '%s cannot be greater than %s',\n            range: '%s must be between %s and %s'\n        },\n        array: {\n            len: '%s must be exactly %s in length',\n            min: '%s cannot be less than %s in length',\n            max: '%s cannot be greater than %s in length',\n            range: '%s must be between %s and %s in length'\n        },\n        pattern: {\n            mismatch: '%s value %s does not match pattern %s'\n        },\n        clone: function clone() {\n            const cloned = JSON.parse(JSON.stringify(this))\n            cloned.clone = this.clone\n            return cloned\n        }\n    }\n}\nconst messages = newMessages()\n\n/**\n *  Encapsulates a validation schema.\n *\n *  @param descriptor An object declaring validation rules\n *  for this schema.\n */\n\nfunction Schema(descriptor) {\n    this.rules = null\n    this._messages = messages\n    this.define(descriptor)\n}\n\nSchema.prototype = {\n    messages: function messages(_messages) {\n        if (_messages) {\n            this._messages = deepMerge(newMessages(), _messages)\n        }\n\n        return this._messages\n    },\n    define: function define(rules) {\n        if (!rules) {\n            throw new Error('Cannot configure a schema with no rules')\n        }\n\n        if (typeof rules !== 'object' || Array.isArray(rules)) {\n            throw new Error('Rules must be an object')\n        }\n\n        this.rules = {}\n        let z\n        let item\n\n        for (z in rules) {\n            if (rules.hasOwnProperty(z)) {\n                item = rules[z]\n                this.rules[z] = Array.isArray(item) ? item : [item]\n            }\n        }\n    },\n    validate: function validate(source_, o, oc) {\n        const _this = this\n\n        if (o === void 0) {\n            o = {}\n        }\n\n        if (oc === void 0) {\n            oc = function oc() {}\n        }\n\n        let source = source_\n        let options = o\n        let callback = oc\n\n        if (typeof options === 'function') {\n            callback = options\n            options = {}\n        }\n\n        if (!this.rules || Object.keys(this.rules).length === 0) {\n            if (callback) {\n                callback()\n            }\n\n            return Promise.resolve()\n        }\n\n        function complete(results) {\n            let i\n            let errors = []\n            let fields = {}\n\n            function add(e) {\n                if (Array.isArray(e)) {\n                    let _errors\n\n                    errors = (_errors = errors).concat.apply(_errors, e)\n                } else {\n                    errors.push(e)\n                }\n            }\n\n            for (i = 0; i < results.length; i++) {\n                add(results[i])\n            }\n\n            if (!errors.length) {\n                errors = null\n                fields = null\n            } else {\n                fields = convertFieldsError(errors)\n            }\n\n            callback(errors, fields)\n        }\n\n        if (options.messages) {\n            let messages$1 = this.messages()\n\n            if (messages$1 === messages) {\n                messages$1 = newMessages()\n            }\n\n            deepMerge(messages$1, options.messages)\n            options.messages = messages$1\n        } else {\n            options.messages = this.messages()\n        }\n\n        let arr\n        let value\n        const series = {}\n        const keys = options.keys || Object.keys(this.rules)\n        keys.forEach((z) => {\n            arr = _this.rules[z]\n            value = source[z]\n            arr.forEach((r) => {\n                let rule = r\n\n                if (typeof rule.transform === 'function') {\n                    if (source === source_) {\n                        source = { ...source }\n                    }\n\n                    value = source[z] = rule.transform(value)\n                }\n\n                if (typeof rule === 'function') {\n                    rule = {\n                        validator: rule\n                    }\n                } else {\n                    rule = { ...rule }\n                }\n\n                rule.validator = _this.getValidationMethod(rule)\n                rule.field = z\n                rule.fullField = rule.fullField || z\n                rule.type = _this.getType(rule)\n\n                if (!rule.validator) {\n                    return\n                }\n\n                series[z] = series[z] || []\n                series[z].push({\n                    rule,\n                    value,\n                    source,\n                    field: z\n                })\n            })\n        })\n        const errorFields = {}\n        return asyncMap(series, options, (data, doIt) => {\n            const { rule } = data\n            let deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField\n\t\t\t\t=== 'object')\n            deep = deep && (rule.required || !rule.required && data.value)\n            rule.field = data.field\n\n            function addFullfield(key, schema) {\n                return { ...schema, fullField: `${rule.fullField}.${key}` }\n            }\n\n            function cb(e) {\n                if (e === void 0) {\n                    e = []\n                }\n\n                let errors = e\n\n                if (!Array.isArray(errors)) {\n                    errors = [errors]\n                }\n\n                if (!options.suppressWarning && errors.length) {\n                    Schema.warning('async-validator:', errors)\n                }\n\n                if (errors.length && rule.message) {\n                    errors = [].concat(rule.message)\n                }\n\n                errors = errors.map(complementError(rule))\n\n                if (options.first && errors.length) {\n                    errorFields[rule.field] = 1\n                    return doIt(errors)\n                }\n\n                if (!deep) {\n                    doIt(errors)\n                } else {\n                    // if rule is required but the target object\n                    // does not exist fail at the rule level and don't\n                    // go deeper\n                    if (rule.required && !data.value) {\n                        if (rule.message) {\n                            errors = [].concat(rule.message).map(complementError(rule))\n                        } else if (options.error) {\n                            errors = [options.error(rule, format(options.messages.required, rule.field))]\n                        } else {\n                            errors = []\n                        }\n\n                        return doIt(errors)\n                    }\n\n                    let fieldsSchema = {}\n\n                    if (rule.defaultField) {\n                        for (const k in data.value) {\n                            if (data.value.hasOwnProperty(k)) {\n                                fieldsSchema[k] = rule.defaultField\n                            }\n                        }\n                    }\n\n                    fieldsSchema = { ...fieldsSchema, ...data.rule.fields }\n\n                    for (const f in fieldsSchema) {\n                        if (fieldsSchema.hasOwnProperty(f)) {\n                            const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]]\n                            fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f))\n                        }\n                    }\n\n                    const schema = new Schema(fieldsSchema)\n                    schema.messages(options.messages)\n\n                    if (data.rule.options) {\n                        data.rule.options.messages = options.messages\n                        data.rule.options.error = options.error\n                    }\n\n                    schema.validate(data.value, data.rule.options || options, (errs) => {\n                        const finalErrors = []\n\n                        if (errors && errors.length) {\n                            finalErrors.push.apply(finalErrors, errors)\n                        }\n\n                        if (errs && errs.length) {\n                            finalErrors.push.apply(finalErrors, errs)\n                        }\n\n                        doIt(finalErrors.length ? finalErrors : null)\n                    })\n                }\n            }\n\n            let res\n\n            if (rule.asyncValidator) {\n                res = rule.asyncValidator(rule, data.value, cb, data.source, options)\n            } else if (rule.validator) {\n                res = rule.validator(rule, data.value, cb, data.source, options)\n\n                if (res === true) {\n                    cb()\n                } else if (res === false) {\n                    cb(rule.message || `${rule.field} fails`)\n                } else if (res instanceof Array) {\n                    cb(res)\n                } else if (res instanceof Error) {\n                    cb(res.message)\n                }\n            }\n\n            if (res && res.then) {\n                res.then(() => cb(), (e) => cb(e))\n            }\n        }, (results) => {\n            complete(results)\n        })\n    },\n    getType: function getType(rule) {\n        if (rule.type === undefined && rule.pattern instanceof RegExp) {\n            rule.type = 'pattern'\n        }\n\n        if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {\n            throw new Error(format('Unknown rule type %s', rule.type))\n        }\n\n        return rule.type || 'string'\n    },\n    getValidationMethod: function getValidationMethod(rule) {\n        if (typeof rule.validator === 'function') {\n            return rule.validator\n        }\n\n        const keys = Object.keys(rule)\n        const messageIndex = keys.indexOf('message')\n\n        if (messageIndex !== -1) {\n            keys.splice(messageIndex, 1)\n        }\n\n        if (keys.length === 1 && keys[0] === 'required') {\n            return validators.required\n        }\n\n        return validators[this.getType(rule)] || false\n    }\n}\n\nSchema.register = function register(type, validator) {\n    if (typeof validator !== 'function') {\n        throw new Error('Cannot register a validator by type, validator is not a function')\n    }\n\n    validators[type] = validator\n}\n\nSchema.warning = warning\nSchema.messages = messages\n\nexport default Schema\n// # sourceMappingURL=index.js.map\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/util/calendar.js",
    "content": "/**\n* @1900-2100区间内的公历、农历互转\n* @charset UTF-8\n* @github  https://github.com/jjonline/calendar.js\n* @Author  Jea杨(JJonline@JJonline.Cn)\n* @Time    2014-7-21\n* @Time    2016-8-13 Fixed 2033hex、Attribution Annals\n* @Time    2016-9-25 Fixed lunar LeapMonth Param Bug\n* @Time    2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year\n* @Version 1.0.3\n* @公历转农历：calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]\n* @农历转公历：calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]\n*/\n/* eslint-disable */\nvar calendar = {\n\n    /**\n        * 农历1900-2100的润大小信息表\n        * @Array Of Property\n        * @return Hex\n        */\n    lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909\n        0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919\n        0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929\n        0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939\n        0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949\n        0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959\n        0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969\n        0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979\n        0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989\n        0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999\n        0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009\n        0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019\n        0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029\n        0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039\n        0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049\n        /** Add By JJonline@JJonline.Cn**/\n        0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059\n        0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069\n        0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079\n        0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089\n        0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099\n        0x0d520], // 2100\n\n    /**\n        * 公历每个月份的天数普通表\n        * @Array Of Property\n        * @return Number\n        */\n    solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n\n    /**\n        * 天干地支之天干速查表\n        * @Array Of Property trans[\"甲\",\"乙\",\"丙\",\"丁\",\"戊\",\"己\",\"庚\",\"辛\",\"壬\",\"癸\"]\n        * @return Cn string\n        */\n    Gan: ['\\u7532', '\\u4e59', '\\u4e19', '\\u4e01', '\\u620a', '\\u5df1', '\\u5e9a', '\\u8f9b', '\\u58ec', '\\u7678'],\n\n    /**\n        * 天干地支之地支速查表\n        * @Array Of Property\n        * @trans[\"子\",\"丑\",\"寅\",\"卯\",\"辰\",\"巳\",\"午\",\"未\",\"申\",\"酉\",\"戌\",\"亥\"]\n        * @return Cn string\n        */\n    Zhi: ['\\u5b50', '\\u4e11', '\\u5bc5', '\\u536f', '\\u8fb0', '\\u5df3', '\\u5348', '\\u672a', '\\u7533', '\\u9149', '\\u620c', '\\u4ea5'],\n\n    /**\n        * 天干地支之地支速查表<=>生肖\n        * @Array Of Property\n        * @trans[\"鼠\",\"牛\",\"虎\",\"兔\",\"龙\",\"蛇\",\"马\",\"羊\",\"猴\",\"鸡\",\"狗\",\"猪\"]\n        * @return Cn string\n        */\n    Animals: ['\\u9f20', '\\u725b', '\\u864e', '\\u5154', '\\u9f99', '\\u86c7', '\\u9a6c', '\\u7f8a', '\\u7334', '\\u9e21', '\\u72d7', '\\u732a'],\n\n    /**\n        * 24节气速查表\n        * @Array Of Property\n        * @trans[\"小寒\",\"大寒\",\"立春\",\"雨水\",\"惊蛰\",\"春分\",\"清明\",\"谷雨\",\"立夏\",\"小满\",\"芒种\",\"夏至\",\"小暑\",\"大暑\",\"立秋\",\"处暑\",\"白露\",\"秋分\",\"寒露\",\"霜降\",\"立冬\",\"小雪\",\"大雪\",\"冬至\"]\n        * @return Cn string\n        */\n    solarTerm: ['\\u5c0f\\u5bd2', '\\u5927\\u5bd2', '\\u7acb\\u6625', '\\u96e8\\u6c34', '\\u60ca\\u86f0', '\\u6625\\u5206', '\\u6e05\\u660e', '\\u8c37\\u96e8', '\\u7acb\\u590f', '\\u5c0f\\u6ee1', '\\u8292\\u79cd', '\\u590f\\u81f3', '\\u5c0f\\u6691', '\\u5927\\u6691', '\\u7acb\\u79cb', '\\u5904\\u6691', '\\u767d\\u9732', '\\u79cb\\u5206', '\\u5bd2\\u9732', '\\u971c\\u964d', '\\u7acb\\u51ac', '\\u5c0f\\u96ea', '\\u5927\\u96ea', '\\u51ac\\u81f3'],\n\n    /**\n        * 1900-2100各年的24节气日期速查表\n        * @Array Of Property\n        * @return 0x string For splice\n        */\n    sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',\n        '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',\n        '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',\n        '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',\n        'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',\n        '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',\n        '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',\n        '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',\n        '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',\n        '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',\n        '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',\n        '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',\n        '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',\n        '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',\n        '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',\n        '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',\n        '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',\n        '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',\n        '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',\n        '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',\n        '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',\n        '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',\n        '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',\n        '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',\n        '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',\n        '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',\n        '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',\n        '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',\n        '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',\n        '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',\n        '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',\n        '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',\n        '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',\n        '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',\n        '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',\n        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',\n        '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',\n        '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',\n        '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',\n        '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',\n        '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',\n        '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',\n        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',\n        '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',\n        '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',\n        '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',\n        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',\n        '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',\n        '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',\n        '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',\n        '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',\n        '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',\n        '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',\n        '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',\n        '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',\n        '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',\n        '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',\n        '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',\n        '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',\n        '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',\n        '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',\n        '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',\n        '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',\n        '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',\n        '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',\n        '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',\n        '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],\n\n    /**\n        * 数字转中文速查表\n        * @Array Of Property\n        * @trans ['日','一','二','三','四','五','六','七','八','九','十']\n        * @return Cn string\n        */\n    nStr1: ['\\u65e5', '\\u4e00', '\\u4e8c', '\\u4e09', '\\u56db', '\\u4e94', '\\u516d', '\\u4e03', '\\u516b', '\\u4e5d', '\\u5341'],\n\n    /**\n        * 日期转农历称呼速查表\n        * @Array Of Property\n        * @trans ['初','十','廿','卅']\n        * @return Cn string\n        */\n    nStr2: ['\\u521d', '\\u5341', '\\u5eff', '\\u5345'],\n\n    /**\n        * 月份转农历称呼速查表\n        * @Array Of Property\n        * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']\n        * @return Cn string\n        */\n    nStr3: ['\\u6b63', '\\u4e8c', '\\u4e09', '\\u56db', '\\u4e94', '\\u516d', '\\u4e03', '\\u516b', '\\u4e5d', '\\u5341', '\\u51ac', '\\u814a'],\n\n    /**\n        * 返回农历y年一整年的总天数\n        * @param lunar Year\n        * @return Number\n        * @eg:var count = calendar.lYearDays(1987) ;//count=387\n        */\n    lYearDays: function (y) {\n        var i; var sum = 348\n        for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }\n        return (sum + this.leapDays(y))\n    },\n\n    /**\n        * 返回农历y年闰月是哪个月；若y年没有闰月 则返回0\n        * @param lunar Year\n        * @return Number (0-12)\n        * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6\n        */\n    leapMonth: function (y) { // 闰字编码 \\u95f0\n        return (this.lunarInfo[y - 1900] & 0xf)\n    },\n\n    /**\n        * 返回农历y年闰月的天数 若该年没有闰月则返回0\n        * @param lunar Year\n        * @return Number (0、29、30)\n        * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29\n        */\n    leapDays: function (y) {\n        if (this.leapMonth(y)) {\n            return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)\n        }\n        return (0)\n    },\n\n    /**\n        * 返回农历y年m月（非闰月）的总天数，计算m为闰月时的天数请使用leapDays方法\n        * @param lunar Year\n        * @return Number (-1、29、30)\n        * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29\n        */\n    monthDays: function (y, m) {\n        if (m > 12 || m < 1) { return -1 }// 月份参数从1至12，参数错误返回-1\n        return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)\n    },\n\n    /**\n        * 返回公历(!)y年m月的天数\n        * @param solar Year\n        * @return Number (-1、28、29、30、31)\n        * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30\n        */\n    solarDays: function (y, m) {\n        if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1\n        var ms = m - 1\n        if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29\n            return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)\n        } else {\n            return (this.solarMonth[ms])\n        }\n    },\n\n    /**\n       * 农历年份转换为干支纪年\n       * @param  lYear 农历年的年份数\n       * @return Cn string\n       */\n    toGanZhiYear: function (lYear) {\n        var ganKey = (lYear - 3) % 10\n        var zhiKey = (lYear - 3) % 12\n        if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干\n        if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支\n        return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]\n    },\n\n    /**\n       * 公历月、日判断所属星座\n       * @param  cMonth [description]\n       * @param  cDay [description]\n       * @return Cn string\n       */\n    toAstro: function (cMonth, cDay) {\n        var s = '\\u9b54\\u7faf\\u6c34\\u74f6\\u53cc\\u9c7c\\u767d\\u7f8a\\u91d1\\u725b\\u53cc\\u5b50\\u5de8\\u87f9\\u72ee\\u5b50\\u5904\\u5973\\u5929\\u79e4\\u5929\\u874e\\u5c04\\u624b\\u9b54\\u7faf'\n        var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]\n        return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\\u5ea7'// 座\n    },\n\n    /**\n        * 传入offset偏移量返回干支\n        * @param offset 相对甲子的偏移量\n        * @return Cn string\n        */\n    toGanZhi: function (offset) {\n        return this.Gan[offset % 10] + this.Zhi[offset % 12]\n    },\n\n    /**\n        * 传入公历(!)y年获得该年第n个节气的公历日期\n        * @param y公历年(1900-2100)；n二十四节气中的第几个节气(1~24)；从n=1(小寒)算起\n        * @return day Number\n        * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春\n        */\n    getTerm: function (y, n) {\n        if (y < 1900 || y > 2100) { return -1 }\n        if (n < 1 || n > 24) { return -1 }\n        var _table = this.sTermInfo[y - 1900]\n        var _info = [\n            parseInt('0x' + _table.substr(0, 5)).toString(),\n            parseInt('0x' + _table.substr(5, 5)).toString(),\n            parseInt('0x' + _table.substr(10, 5)).toString(),\n            parseInt('0x' + _table.substr(15, 5)).toString(),\n            parseInt('0x' + _table.substr(20, 5)).toString(),\n            parseInt('0x' + _table.substr(25, 5)).toString()\n        ]\n        var _calday = [\n            _info[0].substr(0, 1),\n            _info[0].substr(1, 2),\n            _info[0].substr(3, 1),\n            _info[0].substr(4, 2),\n\n            _info[1].substr(0, 1),\n            _info[1].substr(1, 2),\n            _info[1].substr(3, 1),\n            _info[1].substr(4, 2),\n\n            _info[2].substr(0, 1),\n            _info[2].substr(1, 2),\n            _info[2].substr(3, 1),\n            _info[2].substr(4, 2),\n\n            _info[3].substr(0, 1),\n            _info[3].substr(1, 2),\n            _info[3].substr(3, 1),\n            _info[3].substr(4, 2),\n\n            _info[4].substr(0, 1),\n            _info[4].substr(1, 2),\n            _info[4].substr(3, 1),\n            _info[4].substr(4, 2),\n\n            _info[5].substr(0, 1),\n            _info[5].substr(1, 2),\n            _info[5].substr(3, 1),\n            _info[5].substr(4, 2)\n        ]\n        return parseInt(_calday[n - 1])\n    },\n\n    /**\n        * 传入农历数字月份返回汉语通俗表示法\n        * @param lunar month\n        * @return Cn string\n        * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'\n        */\n    toChinaMonth: function (m) { // 月 => \\u6708\n        if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1\n        var s = this.nStr3[m - 1]\n        s += '\\u6708'// 加上月字\n        return s\n    },\n\n    /**\n        * 传入农历日期数字返回汉字表示法\n        * @param lunar day\n        * @return Cn string\n        * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'\n        */\n    toChinaDay: function (d) { // 日 => \\u65e5\n        var s\n        switch (d) {\n            case 10:\n                s = '\\u521d\\u5341'; break\n            case 20:\n                s = '\\u4e8c\\u5341'; break\n                break\n            case 30:\n                s = '\\u4e09\\u5341'; break\n                break\n            default:\n                s = this.nStr2[Math.floor(d / 10)]\n                s += this.nStr1[d % 10]\n        }\n        return (s)\n    },\n\n    /**\n        * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”\n        * @param y year\n        * @return Cn string\n        * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'\n        */\n    getAnimal: function (y) {\n        return this.Animals[(y - 4) % 12]\n    },\n\n    /**\n        * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON\n        * @param y  solar year\n        * @param m  solar month\n        * @param d  solar day\n        * @return JSON object\n        * @eg:console.log(calendar.solar2lunar(1987,11,01));\n        */\n    solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31\n        // 年份限定、上限\n        if (y < 1900 || y > 2100) {\n            return -1// undefined转换为数字变为NaN\n        }\n        // 公历传参最下限\n        if (y == 1900 && m == 1 && d < 31) {\n            return -1\n        }\n        // 未传参  获得当天\n        if (!y) {\n            var objDate = new Date()\n        } else {\n            var objDate = new Date(y, parseInt(m) - 1, d)\n        }\n        var i; var leap = 0; var temp = 0\n        // 修正ymd参数\n        var y = objDate.getFullYear()\n        var m = objDate.getMonth() + 1\n        var d = objDate.getDate()\n        var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000\n        for (i = 1900; i < 2101 && offset > 0; i++) {\n            temp = this.lYearDays(i)\n            offset -= temp\n        }\n        if (offset < 0) {\n            offset += temp; i--\n        }\n\n        // 是否今天\n        var isTodayObj = new Date()\n        var isToday = false\n        if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {\n            isToday = true\n        }\n        // 星期几\n        var nWeek = objDate.getDay()\n        var cWeek = this.nStr1[nWeek]\n        // 数字表示周几顺应天朝周一开始的惯例\n        if (nWeek == 0) {\n            nWeek = 7\n        }\n        // 农历年\n        var year = i\n        var leap = this.leapMonth(i) // 闰哪个月\n        var isLeap = false\n\n        // 效验闰月\n        for (i = 1; i < 13 && offset > 0; i++) {\n            // 闰月\n            if (leap > 0 && i == (leap + 1) && isLeap == false) {\n                --i\n                isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数\n            } else {\n                temp = this.monthDays(year, i)// 计算农历普通月天数\n            }\n            // 解除闰月\n            if (isLeap == true && i == (leap + 1)) { isLeap = false }\n            offset -= temp\n        }\n        // 闰月导致数组下标重叠取反\n        if (offset == 0 && leap > 0 && i == leap + 1) {\n            if (isLeap) {\n                isLeap = false\n            } else {\n                isLeap = true; --i\n            }\n        }\n        if (offset < 0) {\n            offset += temp; --i\n        }\n        // 农历月\n        var month = i\n        // 农历日\n        var day = offset + 1\n        // 天干地支处理\n        var sm = m - 1\n        var gzY = this.toGanZhiYear(year)\n\n        // 当月的两个节气\n        // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`\n        var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始\n        var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始\n\n        // 依据12节气修正干支月\n        var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)\n        if (d >= firstNode) {\n            gzM = this.toGanZhi((y - 1900) * 12 + m + 12)\n        }\n\n        // 传入的日期的节气与否\n        var isTerm = false\n        var Term = null\n        if (firstNode == d) {\n            isTerm = true\n            Term = this.solarTerm[m * 2 - 2]\n        }\n        if (secondNode == d) {\n            isTerm = true\n            Term = this.solarTerm[m * 2 - 1]\n        }\n        // 日柱 当月一日与 1900/1/1 相差天数\n        var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10\n        var gzD = this.toGanZhi(dayCyclical + d - 1)\n        // 该日期所属的星座\n        var astro = this.toAstro(m, d)\n\n        return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\\u661f\\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }\n    },\n\n    /**\n        * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON\n        * @param y  lunar year\n        * @param m  lunar month\n        * @param d  lunar day\n        * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]\n        * @return JSON object\n        * @eg:console.log(calendar.lunar2solar(1987,9,10));\n        */\n    lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1\n        var isLeapMonth = !!isLeapMonth\n        var leapOffset = 0\n        var leapMonth = this.leapMonth(y)\n        var leapDay = this.leapDays(y)\n        if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同\n        if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值\n        var day = this.monthDays(y, m)\n        var _day = day\n        // bugFix 2016-9-25\n        // if month is leap, _day use leapDays method\n        if (isLeapMonth) {\n            _day = this.leapDays(y, m)\n        }\n        if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验\n\n        // 计算农历的时间差\n        var offset = 0\n        for (var i = 1900; i < y; i++) {\n            offset += this.lYearDays(i)\n        }\n        var leap = 0; var isAdd = false\n        for (var i = 1; i < m; i++) {\n            leap = this.leapMonth(y)\n            if (!isAdd) { // 处理闰月\n                if (leap <= i && leap > 0) {\n                    offset += this.leapDays(y); isAdd = true\n                }\n            }\n            offset += this.monthDays(y, i)\n        }\n        // 转换闰月农历 需补充该年闰月的前一个月的时差\n        if (isLeapMonth) { offset += day }\n        // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)\n        var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)\n        var calObj = new Date((offset + d - 31) * 86400000 + stmap)\n        var cY = calObj.getUTCFullYear()\n        var cM = calObj.getUTCMonth() + 1\n        var cD = calObj.getUTCDate()\n\n        return this.solar2lunar(cY, cM, cD)\n    }\n}\n\nexport default calendar\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/util/dayjs.js",
    "content": "!(function (t, e) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = e() : typeof define === 'function'\n\t\t&& define.amd ? define(e) : t.dayjs = e()\n}(this, () => {\n    'use strict'\n\n    const t = 'millisecond'\n    const e = 'second'\n    const n = 'minute'\n    const r = 'hour'\n    const i = 'day'\n    const s = 'week'\n    const u = 'month'\n    const a = 'quarter'\n    const o = 'year'\n    const f = 'date'\n    const h = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[^0-9]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?.?(\\d+)?$/\n    const c = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g\n    const d = {\n        name: 'en',\n        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_')\n    }\n    const $ = function (t, e, n) {\n        const r = String(t)\n        return !r || r.length >= e ? t : `${Array(e + 1 - r.length).join(n)}${t}`\n    }\n    const l = {\n        s: $,\n        z(t) {\n            const e = -t.utcOffset()\n            const n = Math.abs(e)\n            const r = Math.floor(n / 60)\n            const i = n % 60\n            return `${(e <= 0 ? '+' : '-') + $(r, 2, '0')}:${$(i, 2, '0')}`\n        },\n        m: function t(e, n) {\n            if (e.date() < n.date()) return -t(n, e)\n            const r = 12 * (n.year() - e.year()) + (n.month() - e.month())\n            const i = e.clone().add(r, u)\n            const s = n - i < 0\n            const a = e.clone().add(r + (s ? -1 : 1), u)\n            return +(-(r + (n - i) / (s ? i - a : a - i)) || 0)\n        },\n        a(t) {\n            return t < 0 ? Math.ceil(t) || 0 : Math.floor(t)\n        },\n        p(h) {\n            return {\n                M: u,\n                y: o,\n                w: s,\n                d: i,\n                D: f,\n                h: r,\n                m: n,\n                s: e,\n                ms: t,\n                Q: a\n            }[h] || String(h || '').toLowerCase().replace(/s$/, '')\n        },\n        u(t) {\n            return void 0 === t\n        }\n    }\n    let y = 'en'\n    const M = {}\n    M[y] = d\n    const m = function (t) {\n        return t instanceof S\n    }\n    const D = function (t, e, n) {\n        let r\n        if (!t) return y\n        if (typeof t === 'string') M[t] && (r = t), e && (M[t] = e, r = t)\n        else {\n            const i = t.name\n            M[i] = t, r = i\n        }\n        return !n && r && (y = r), r || !n && y\n    }\n    const v = function (t, e) {\n        if (m(t)) return t.clone()\n        const n = typeof e === 'object' ? e : {}\n        return n.date = t, n.args = arguments, new S(n)\n    }\n    const g = l\n    g.l = D, g.i = m, g.w = function (t, e) {\n        return v(t, {\n            locale: e.$L,\n            utc: e.$u,\n            x: e.$x,\n            $offset: e.$offset\n        })\n    }\n    var S = (function () {\n        function d(t) {\n            this.$L = D(t.locale, null, !0), this.parse(t)\n        }\n        const $ = d.prototype\n        return $.parse = function (t) {\n            this.$d = (function (t) {\n                const e = t.date\n                const n = t.utc\n                if (e === null) return new Date(NaN)\n                if (g.u(e)) return new Date()\n                if (e instanceof Date) return new Date(e)\n                if (typeof e === 'string' && !/Z$/i.test(e)) {\n                    const r = e.match(h)\n                    if (r) {\n                        const i = r[2] - 1 || 0\n                        const s = (r[7] || '0').substring(0, 3)\n                        return n ? new Date(Date.UTC(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s)) : new Date(r[1], i, r[3]\n\t\t\t\t\t\t\t\t|| 1, r[4] || 0, r[5] || 0, r[6] || 0, s)\n                    }\n                }\n                return new Date(e)\n            }(t)), this.$x = t.x || {}, this.init()\n        }, $.init = function () {\n            const t = this.$d\n            this.$y = t.getFullYear(), this.$M = t.getMonth(), this.$D = t.getDate(), this.$W = t.getDay(), this.$H = t.getHours(),\n            this.$m = t.getMinutes(), this.$s = t.getSeconds(), this.$ms = t.getMilliseconds()\n        }, $.$utils = function () {\n            return g\n        }, $.isValid = function () {\n            return !(this.$d.toString() === 'Invalid Date')\n        }, $.isSame = function (t, e) {\n            const n = v(t)\n            return this.startOf(e) <= n && n <= this.endOf(e)\n        }, $.isAfter = function (t, e) {\n            return v(t) < this.startOf(e)\n        }, $.isBefore = function (t, e) {\n            return this.endOf(e) < v(t)\n        }, $.$g = function (t, e, n) {\n            return g.u(t) ? this[e] : this.set(n, t)\n        }, $.unix = function () {\n            return Math.floor(this.valueOf() / 1e3)\n        }, $.valueOf = function () {\n            return this.$d.getTime()\n        }, $.startOf = function (t, a) {\n            const h = this\n            const c = !!g.u(a) || a\n            const d = g.p(t)\n            const $ = function (t, e) {\n                const n = g.w(h.$u ? Date.UTC(h.$y, e, t) : new Date(h.$y, e, t), h)\n                return c ? n : n.endOf(i)\n            }\n            const l = function (t, e) {\n                return g.w(h.toDate()[t].apply(h.toDate('s'), (c ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e)), h)\n            }\n            const y = this.$W\n            const M = this.$M\n            const m = this.$D\n            const D = `set${this.$u ? 'UTC' : ''}`\n            switch (d) {\n            case o:\n                return c ? $(1, 0) : $(31, 11)\n            case u:\n                return c ? $(1, M) : $(0, M + 1)\n            case s:\n                var v = this.$locale().weekStart || 0\n                var S = (y < v ? y + 7 : y) - v\n                return $(c ? m - S : m + (6 - S), M)\n            case i:\n            case f:\n                return l(`${D}Hours`, 0)\n            case r:\n                return l(`${D}Minutes`, 1)\n            case n:\n                return l(`${D}Seconds`, 2)\n            case e:\n                return l(`${D}Milliseconds`, 3)\n            default:\n                return this.clone()\n            }\n        }, $.endOf = function (t) {\n            return this.startOf(t, !1)\n        }, $.$set = function (s, a) {\n            let h; const c = g.p(s)\n            const d = `set${this.$u ? 'UTC' : ''}`\n            const $ = (h = {}, h[i] = `${d}Date`, h[f] = `${d}Date`, h[u] = `${d}Month`, h[o] = `${d}FullYear`, h[r] = `${d}Hours`,\n            h[n] = `${d}Minutes`, h[e] = `${d}Seconds`, h[t] = `${d}Milliseconds`, h)[c]\n            const l = c === i ? this.$D + (a - this.$W) : a\n            if (c === u || c === o) {\n                const y = this.clone().set(f, 1)\n                y.$d[$](l), y.init(), this.$d = y.set(f, Math.min(this.$D, y.daysInMonth())).$d\n            } else $ && this.$d[$](l)\n            return this.init(), this\n        }, $.set = function (t, e) {\n            return this.clone().$set(t, e)\n        }, $.get = function (t) {\n            return this[g.p(t)]()\n        }, $.add = function (t, a) {\n            let f; const\n                h = this\n            t = Number(t)\n            const c = g.p(a)\n            const d = function (e) {\n                const n = v(h)\n                return g.w(n.date(n.date() + Math.round(e * t)), h)\n            }\n            if (c === u) return this.set(u, this.$M + t)\n            if (c === o) return this.set(o, this.$y + t)\n            if (c === i) return d(1)\n            if (c === s) return d(7)\n            const $ = (f = {}, f[n] = 6e4, f[r] = 36e5, f[e] = 1e3, f)[c] || 1\n            const l = this.$d.getTime() + t * $\n            return g.w(l, this)\n        }, $.subtract = function (t, e) {\n            return this.add(-1 * t, e)\n        }, $.format = function (t) {\n            const e = this\n            if (!this.isValid()) return 'Invalid Date'\n            const n = t || 'YYYY-MM-DDTHH:mm:ssZ'\n            const r = g.z(this)\n            const i = this.$locale()\n            const s = this.$H\n            const u = this.$m\n            const a = this.$M\n            const o = i.weekdays\n            const f = i.months\n            const h = function (t, r, i, s) {\n                return t && (t[r] || t(e, n)) || i[r].substr(0, s)\n            }\n            const d = function (t) {\n                return g.s(s % 12 || 12, t, '0')\n            }\n            const $ = i.meridiem || function (t, e, n) {\n                const r = t < 12 ? 'AM' : 'PM'\n                return n ? r.toLowerCase() : r\n            }\n            const l = {\n                YY: String(this.$y).slice(-2),\n                YYYY: this.$y,\n                M: a + 1,\n                MM: g.s(a + 1, 2, '0'),\n                MMM: h(i.monthsShort, a, f, 3),\n                MMMM: h(f, a),\n                D: this.$D,\n                DD: g.s(this.$D, 2, '0'),\n                d: String(this.$W),\n                dd: h(i.weekdaysMin, this.$W, o, 2),\n                ddd: h(i.weekdaysShort, this.$W, o, 3),\n                dddd: o[this.$W],\n                H: String(s),\n                HH: g.s(s, 2, '0'),\n                h: d(1),\n                hh: d(2),\n                a: $(s, u, !0),\n                A: $(s, u, !1),\n                m: String(u),\n                mm: g.s(u, 2, '0'),\n                s: String(this.$s),\n                ss: g.s(this.$s, 2, '0'),\n                SSS: g.s(this.$ms, 3, '0'),\n                Z: r\n            }\n            return n.replace(c, (t, e) => e || l[t] || r.replace(':', ''))\n        }, $.utcOffset = function () {\n            return 15 * -Math.round(this.$d.getTimezoneOffset() / 15)\n        }, $.diff = function (t, f, h) {\n            let c; const d = g.p(f)\n            const $ = v(t)\n            const l = 6e4 * ($.utcOffset() - this.utcOffset())\n            const y = this - $\n            let M = g.m(this, $)\n            return M = (c = {}, c[o] = M / 12, c[u] = M, c[a] = M / 3, c[s] = (y - l) / 6048e5, c[i] = (y - l) / 864e5, c[r] =\t\t\t\t\ty / 36e5, c[n] = y / 6e4, c[e] = y / 1e3, c)[d] || y, h ? M : g.a(M)\n        }, $.daysInMonth = function () {\n            return this.endOf(u).$D\n        }, $.$locale = function () {\n            return M[this.$L]\n        }, $.locale = function (t, e) {\n            if (!t) return this.$L\n            const n = this.clone()\n            const r = D(t, e, !0)\n            return r && (n.$L = r), n\n        }, $.clone = function () {\n            return g.w(this.$d, this)\n        }, $.toDate = function () {\n            return new Date(this.valueOf())\n        }, $.toJSON = function () {\n            return this.isValid() ? this.toISOString() : null\n        }, $.toISOString = function () {\n            return this.$d.toISOString()\n        }, $.toString = function () {\n            return this.$d.toUTCString()\n        }, d\n    }())\n    const p = S.prototype\n    return v.prototype = p, [\n        ['$ms', t],\n        ['$s', e],\n        ['$m', n],\n        ['$H', r],\n        ['$W', i],\n        ['$M', u],\n        ['$y', o],\n        ['$D', f]\n    ].forEach((t) => {\n        p[t[1]] = function (e) {\n            return this.$g(e, t[0], t[1])\n        }\n    }), v.extend = function (t, e) {\n        return t.$i || (t(e, S, v), t.$i = !0), v\n    }, v.locale = D, v.isDayjs = m, v.unix = function (t) {\n        return v(1e3 * t)\n    }, v.en = M[y], v.Ls = M, v.p = {}, v\n}))\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/util/emitter.js",
    "content": "/**\n * 递归使用 call 方式this指向\n * @param componentName // 需要找的组件的名称\n * @param eventName // 事件名称\n * @param params // 需要传递的参数\n */\nfunction broadcast(componentName, eventName, params) {\n    // 循环子节点找到名称一样的子节点 否则 递归 当前子节点\n    this.$children.map((child) => {\n        if (componentName === child.$options.name) {\n            child.$emit.apply(child, [eventName].concat(params))\n        } else {\n            broadcast.apply(child, [componentName, eventName].concat(params))\n        }\n    })\n}\nexport default {\n    methods: {\n        /**\n         * 派发 (向上查找) (一个)\n         * @param componentName // 需要找的组件的名称\n         * @param eventName // 事件名称\n         * @param params // 需要传递的参数\n         */\n        dispatch(componentName, eventName, params) {\n            let parent = this.$parent || this.$root// $parent 找到最近的父节点 $root 根节点\n            let { name } = parent.$options // 获取当前组件实例的name\n            // 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点\n            // 循环出当前名称的一样的组件实例\n            while (parent && (!name || name !== componentName)) {\n                parent = parent.$parent\n                if (parent) {\n                    name = parent.$options.name\n                }\n            }\n            // 有节点表示当前找到了name一样的实例\n            if (parent) {\n                parent.$emit.apply(parent, [eventName].concat(params))\n            }\n        },\n        /**\n         * 广播 (向下查找) (广播多个)\n         * @param componentName // 需要找的组件的名称\n         * @param eventName // 事件名称\n         * @param params // 需要传递的参数\n         */\n        broadcast(componentName, eventName, params) {\n            broadcast.call(this, componentName, eventName, params)\n        }\n    }\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/libs/util/route.js",
    "content": "/**\n * 路由跳转方法，该方法相对于直接使用uni.xxx的好处是使用更加简单快捷\n * 并且带有路由拦截功能\n */\n\nclass Router {\n    constructor() {\n        // 原始属性定义\n        this.config = {\n            type: 'navigateTo',\n            url: '',\n            delta: 1, // navigateBack页面后退时,回退的层数\n            params: {}, // 传递的参数\n            animationType: 'pop-in', // 窗口动画,只在APP有效\n            animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效\n            intercept: false // 是否需要拦截\n        }\n        // 因为route方法是需要对外赋值给另外的对象使用，同时route内部有使用this，会导致route失去上下文\n        // 这里在构造函数中进行this绑定\n        this.route = this.route.bind(this)\n    }\n\n    // 判断url前面是否有\"/\"，如果没有则加上，否则无法跳转\n    addRootPath(url) {\n        return url[0] === '/' ? url : `/${url}`\n    }\n\n    // 整合路由参数\n    mixinParam(url, params) {\n        url = url && this.addRootPath(url)\n\n        // 使用正则匹配，主要依据是判断是否有\"/\",\"?\",\"=\"等，如“/page/index/index?name=mary\"\n        // 如果有url中有get参数，转换后无需带上\"?\"\n        let query = ''\n        if (/.*\\/.*\\?.*=.*/.test(url)) {\n            // object对象转为get类型的参数\n            query = uni.$u.queryParams(params, false)\n            // 因为已有get参数,所以后面拼接的参数需要带上\"&\"隔开\n            return url += `&${query}`\n        }\n        // 直接拼接参数，因为此处url中没有后面的query参数，也就没有\"?/&\"之类的符号\n        query = uni.$u.queryParams(params)\n        return url += query\n    }\n\n    // 对外的方法名称\n    async route(options = {}, params = {}) {\n        // 合并用户的配置和内部的默认配置\n        let mergeConfig = {}\n\n        if (typeof options === 'string') {\n            // 如果options为字符串，则为route(url, params)的形式\n            mergeConfig.url = this.mixinParam(options, params)\n            mergeConfig.type = 'navigateTo'\n        } else {\n            mergeConfig = uni.$u.deepMerge(options, this.config)\n            // 否则正常使用mergeConfig中的url和params进行拼接\n            mergeConfig.url = this.mixinParam(options.url, options.params)\n        }\n\n        // 如果本次跳转的路径和本页面路径一致，不执行跳转，防止用户快速点击跳转按钮，造成多次跳转同一个页面的问题\n        if (mergeConfig.url === uni.$u.page()) return\n\n        if (params.intercept) {\n            this.config.intercept = params.intercept\n        }\n        // params参数也带给拦截器\n        mergeConfig.params = params\n        // 合并内外部参数\n        mergeConfig = uni.$u.deepMerge(this.config, mergeConfig)\n        // 判断用户是否定义了拦截器\n        if (typeof uni.$u.routeIntercept === 'function') {\n            // 定一个promise，根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转\n            const isNext = await new Promise((resolve, reject) => {\n                uni.$u.routeIntercept(mergeConfig, resolve)\n            })\n            // 如果isNext为true，则执行路由跳转\n            isNext && this.openPage(mergeConfig)\n        } else {\n            this.openPage(mergeConfig)\n        }\n    }\n\n    // 执行路由跳转\n    openPage(config) {\n        // 解构参数\n        const {\n            url,\n            type,\n            delta,\n            animationType,\n            animationDuration\n        } = config\n        if (config.type == 'navigateTo' || config.type == 'to') {\n            uni.navigateTo({\n                url,\n                animationType,\n                animationDuration\n            })\n        }\n        if (config.type == 'redirectTo' || config.type == 'redirect') {\n            uni.redirectTo({\n                url\n            })\n        }\n        if (config.type == 'switchTab' || config.type == 'tab') {\n            uni.switchTab({\n                url\n            })\n        }\n        if (config.type == 'reLaunch' || config.type == 'launch') {\n            uni.reLaunch({\n                url\n            })\n        }\n        if (config.type == 'navigateBack' || config.type == 'back') {\n            uni.navigateBack({\n                delta\n            })\n        }\n    }\n}\n\nexport default (new Router()).route\n"
  },
  {
    "path": "uni_modules/uview-ui/package.json",
    "content": "{\n\t\"id\": \"uview-ui\",\n\t\"name\": \"uview-ui\",\n\t\"displayName\": \"uView2.0重磅发布，利剑出鞘，一统江湖\",\n\t\"version\": \"2.0.34\",\n\t\"description\": \"uView UI已完美兼容nvue，全面的组件和便捷的工具会让您信手拈来，如鱼得水\",\n\t\"keywords\": [\n        \"uview\",\n        \"uview\",\n        \"ui\",\n        \"ui\",\n        \"uni-app\",\n        \"uni-app\",\n        \"ui\"\n    ],\n\t\"repository\": \"https://github.com/umicro/uView2.0\",\n\t\"engines\": {\n\t\t\"HBuilderX\": \"^3.1.0\"\n\t},\n    \"dcloudext\": {\n        \"sale\": {\n\t\t\t\"regular\": {\n\t\t\t\t\"price\": \"0.00\"\n\t\t\t},\n\t\t\t\"sourcecode\": {\n\t\t\t\t\"price\": \"0.00\"\n\t\t\t}\n\t\t},\n\t\t\"contact\": {\n\t\t\t\"qq\": \"1416956117\"\n\t\t},\n\t\t\"declaration\": {\n\t\t\t\"ads\": \"无\",\n\t\t\t\"data\": \"无\",\n\t\t\t\"permissions\": \"无\"\n\t\t},\n        \"npmurl\": \"https://www.npmjs.com/package/uview-ui\",\n        \"type\": \"component-vue\"\n\t},\n\t\"uni_modules\": {\n\t\t\"dependencies\": [],\n\t\t\"encrypt\": [],\n\t\t\"platforms\": {\n\t\t\t\"cloud\": {\n\t\t\t\t\"tcb\": \"y\",\n\t\t\t\t\"aliyun\": \"y\"\n\t\t\t},\n\t\t\t\"client\": {\n\t\t\t\t\"Vue\": {\n\t\t\t\t\t\"vue2\": \"y\",\n\t\t\t\t\t\"vue3\": \"n\"\n\t\t\t\t},\n\t\t\t\t\"App\": {\n\t\t\t\t\t\"app-vue\": \"y\",\n\t\t\t\t\t\"app-nvue\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"H5-mobile\": {\n\t\t\t\t\t\"Safari\": \"y\",\n\t\t\t\t\t\"Android Browser\": \"y\",\n\t\t\t\t\t\"微信浏览器(Android)\": \"y\",\n\t\t\t\t\t\"QQ浏览器(Android)\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"H5-pc\": {\n\t\t\t\t\t\"Chrome\": \"y\",\n\t\t\t\t\t\"IE\": \"y\",\n\t\t\t\t\t\"Edge\": \"y\",\n\t\t\t\t\t\"Firefox\": \"y\",\n\t\t\t\t\t\"Safari\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"小程序\": {\n\t\t\t\t\t\"微信\": \"y\",\n\t\t\t\t\t\"阿里\": \"y\",\n\t\t\t\t\t\"百度\": \"y\",\n\t\t\t\t\t\"字节跳动\": \"y\",\n\t\t\t\t\t\"QQ\": \"y\"\n\t\t\t\t},\n\t\t\t\t\"快应用\": {\n\t\t\t\t\t\"华为\": \"y\",\n\t\t\t\t\t\"联盟\": \"y\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/uview-ui/theme.scss",
    "content": "// 此文件为uView的主题变量，这些变量目前只能通过uni.scss引入才有效，另外由于\n// uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中，造成微信程序包太大，\n// 故uni.scss只建议放scss变量名相关样式，其他的样式可以通过main.js或者App.vue引入\n\n$u-main-color: #303133;\n$u-content-color: #606266;\n$u-tips-color: #909193;\n$u-light-color: #c0c4cc;\n$u-border-color: #dadbde;\n$u-bg-color: #f3f4f6;\n$u-disabled-color: #c8c9cc;\n\n$u-primary: #3c9cff;\n$u-primary-dark: #398ade;\n$u-primary-disabled: #9acafc;\n$u-primary-light: #ecf5ff;\n\n$u-warning: #f9ae3d;\n$u-warning-dark: #f1a532;\n$u-warning-disabled: #f9d39b;\n$u-warning-light: #fdf6ec;\n\n$u-success: #5ac725;\n$u-success-dark: #53c21d;\n$u-success-disabled: #a9e08f;\n$u-success-light: #f5fff0;\n\n$u-error: #f56c6c;\n$u-error-dark: #e45656;\n$u-error-disabled: #f7b2b2;\n$u-error-light: #fef0f0;\n\n$u-info: #909399;\n$u-info-dark: #767a82;\n$u-info-disabled: #c4c6c9;\n$u-info-light: #f4f4f5;\n\n// scss混入，为了少写几行#ifndef\n@mixin flex($direction: row) {\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: $direction;\n}\n"
  },
  {
    "path": "uni_modules/z-paging/changelog.md",
    "content": "## 2.5.3（2023-02-13）\n1.`新增` `reload`、`refresh`、`complete`、`completeByTotal`、`completeByNoMore`、`completeByKey`、`setLocalPaging`等方法的返回值添加请求结果promise，可以通过方法名().then()获取本次操作请求结束后的【总列表】和【是否有更多数据】。  \n2.`修复` 由`v2.5.0`引出的在vue2 + 钉钉小程序中，`slot=\"top\"`插入无效的问题。  \n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue",
    "content": "<!-- [z-paging]上拉加载更多view -->\n<template>\n\t<view class=\"zp-l-container\" :style=\"[c.customStyle]\" @click=\"doClick\">\n\t\t<template v-if=\"!c.hideContent\">\n\t\t\t<text v-if=\"c.showNoMoreLine&&finalStatus===M.NoMore\" class=\"zp-l-line\" :style=\"[{backgroundColor:zTheme.line[ts]},c.noMoreLineCustomStyle]\" />\n\t\t\t<!-- #ifndef APP-NVUE -->\n\t\t\t<image v-if=\"finalStatus===M.Loading&&!!c.loadingIconCustomImage\"\n\t\t\t\t:src=\"c.loadingIconCustomImage\" :style=\"[c.iconCustomStyle]\" :class=\"{'zp-l-line-loading-custom-image':true,'zp-l-line-loading-custom-image-animated':c.loadingAnimated}\" />\n\t\t\t<image v-if=\"finalStatus===M.Loading&&finalLoadingIconType==='flower'&&!c.loadingIconCustomImage.length\"\n\t\t\t\tclass=\"zp-line-loading-image\" :style=\"[c.iconCustomStyle]\" :src=\"zTheme.flower[ts]\" />\n\t\t\t<!-- #endif -->\n\t\t\t<!-- #ifdef APP-NVUE -->\n\t\t\t<view>\n\t\t\t\t<loading-indicator v-if=\"finalStatus===M.Loading&&finalLoadingIconType!=='circle'\" class=\"zp-line-loading-image\" :style=\"[{color:zTheme.indicator[ts]}]\" :animating=\"true\" />\n\t\t\t</view>\n\t\t\t<!-- #endif -->\n\t\t\t<text v-if=\"finalStatus===M.Loading&&finalLoadingIconType==='circle'&&!c.loadingIconCustomImage.length\"\n\t\t\t\tclass=\"zp-l-circle-loading-view\" :style=\"[{borderColor:zTheme.circleBorder[ts],borderTopColor:zTheme.circleBorderTop[ts]},c.iconCustomStyle]\" />\n\t\t\t<text class=\"zp-l-text\" :style=\"[{color:zTheme.title[ts]},c.titleCustomStyle]\">{{ownLoadingMoreText}}</text>\n\t\t\t<text v-if=\"c.showNoMoreLine&&finalStatus===M.NoMore\" class=\"zp-l-line\" :style=\"[{backgroundColor:zTheme.line[ts]},c.noMoreLineCustomStyle]\" />\n\t\t</template>\n\t</view>\n</template>\n<script>\n\timport zStatic from '../js/z-paging-static'\n\timport Enum from '../js/z-paging-enum'\n\texport default {\n\t\tname: 'z-paging-load-more',\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tM: Enum.More,\n\t\t\t\tzTheme: {\n\t\t\t\t\ttitle: { white: '#efefef', black: '#a4a4a4' },\n\t\t\t\t\tline: { white: '#efefef', black: '#eeeeee' },\n\t\t\t\t\tcircleBorder: { white: '#aaaaaa', black: '#c8c8c8' },\n\t\t\t\t\tcircleBorderTop: { white: '#ffffff', black: '#444444' },\n\t\t\t\t\tflower: { white: zStatic.base64FlowerWhite, black: zStatic.base64Flower },\n\t\t\t\t\tindicator: { white: '#eeeeee', black: '#777777' }\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\tprops: ['zConfig'],\n\t\tcomputed: {\n\t\t\tts() {\n\t\t\t\treturn this.c.defaultThemeStyle;\n\t\t\t},\n\t\t\tc() {\n\t\t\t\treturn this.zConfig;\n\t\t\t},\n\t\t\townLoadingMoreText() {\n\t\t\t\tconst statusTextArr = [this.c.defaultText,this.c.loadingText,this.c.noMoreText,this.c.failText];\n\t\t\t\treturn statusTextArr[this.finalStatus];\n\t\t\t},\n\t\t\tfinalStatus() {\n\t\t\t\tif (this.c.defaultAsLoading && this.c.status === this.M.Default) return this.M.Loading;\n\t\t\t\treturn this.c.status;\n\t\t\t},\n\t\t\tfinalLoadingIconType() {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\treturn 'flower';\n\t\t\t\t// #endif\n\t\t\t\treturn this.c.loadingIconType;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tdoClick() {\n\t\t\t\tthis.$emit('doClick');\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t@import \"../css/z-paging-static.css\";\n\n\t.zp-l-container {\n\t\theight: 80rpx;\n\t\tfont-size: 27rpx;\n\t\t/* #ifndef APP-NVUE */\n\t\tclear: both;\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}\n\n\t.zp-l-line-loading-custom-image {\n\t\tcolor: #a4a4a4;\n\t\tmargin-right: 8rpx;\n\t\twidth: 28rpx;\n\t\theight: 28rpx;\n\t}\n\t\n\t.zp-l-line-loading-custom-image-animated{\n\t\t/* #ifndef APP-NVUE */\n\t\tanimation: loading-circle 1s linear infinite;\n\t\t/* #endif */\n\t}\n\n\t.zp-l-circle-loading-view {\n\t\tmargin-right: 8rpx;\n\t\twidth: 23rpx;\n\t\theight: 23rpx;\n\t\tborder: 3rpx solid #dddddd;\n\t\tborder-radius: 50%;\n\t\t/* #ifndef APP-NVUE */\n\t\tanimation: loading-circle 1s linear infinite;\n\t\t/* #endif */\n\t\t/* #ifdef APP-NVUE */\n\t\twidth: 30rpx;\n\t\theight: 30rpx;\n\t\t/* #endif */\n\t}\n\n\t.zp-l-text {\n\t\t/* #ifdef APP-NVUE */\n\t\tfont-size: 30rpx;\n\t\tmargin: 0rpx 10rpx;\n\t\t/* #endif */\n\t}\n\n\t.zp-l-line {\n\t\theight: 1px;\n\t\twidth: 100rpx;\n\t\tmargin: 0rpx 10rpx;\n\t}\n\n\t/* #ifndef APP-NVUE */\n\t@keyframes loading-circle {\n\t\t0% {\n\t\t\t-webkit-transform: rotate(0deg);\n\t\t\ttransform: rotate(0deg);\n\t\t}\n\t\t100% {\n\t\t\t-webkit-transform: rotate(360deg);\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n\t/* #endif */\n</style>\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue",
    "content": "<!-- [z-paging]下拉刷新view -->\n<template>\n\t<view style=\"height: 100%;\">\n\t\t<view :class=\"showUpdateTime?'zp-r-container zp-r-container-padding':'zp-r-container'\">\n\t\t\t<view class=\"zp-r-left\">\n\t\t\t\t<image v-if=\"status!==R.Loading\" :class=\"leftImageClass\" :style=\"[leftImageStyle,imgStyle]\" :src=\"leftImageSrc\" />\n\t\t\t\t<!-- #ifndef APP-NVUE -->\n\t\t\t\t<image v-else class=\"zp-line-loading-image zp-r-left-image\" :style=\"[leftImageStyle,imgStyle]\" :src=\"leftImageSrc\" />\n\t\t\t\t<!-- #endif -->\n\t\t\t\t<!-- #ifdef APP-NVUE -->\n\t\t\t\t<view v-else :style=\"[{'margin-right':showUpdateTime?'18rpx':'12rpx'}]\">\n\t\t\t\t\t<loading-indicator :class=\"isIos?'zp-loading-image-ios':'zp-loading-image-android'\" \n\t\t\t\t\t:style=\"[{color:zTheme.indicator[ts]},imgStyle]\" :animating=\"true\" />\n\t\t\t\t</view>\n\t\t\t\t<!-- #endif -->\n\t\t\t</view>\n\t\t\t<view class=\"zp-r-right\">\n\t\t\t\t<text class=\"zp-r-right-text\" :style=\"[rightTextStyle,titleStyle]\">{{currentTitle}}</text>\n\t\t\t\t<text v-if=\"showUpdateTime&&refresherTimeText.length\" class=\"zp-r-right-text zp-r-right-time-text\" :style=\"[rightTextStyle,updateTimeStyle]\">\n\t\t\t\t\t{{refresherTimeText}}\n\t\t\t\t</text>\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</template>\n<script>\n\timport zStatic from '../js/z-paging-static'\n\timport u from '../js/z-paging-utils'\n\timport Enum from '../js/z-paging-enum'\n\t\n\texport default {\n\t\tname: 'z-paging-refresh',\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tR: Enum.Refresher,\n\t\t\t\tisIos: uni.getSystemInfoSync().platform === 'ios',\n\t\t\t\trefresherTimeText: '',\n\t\t\t\tzTheme: {\n\t\t\t\t\ttitle: { white: '#efefef', black: '#555555' },\n\t\t\t\t\tarrow: { white: zStatic.base64ArrowWhite, black: zStatic.base64Arrow },\n\t\t\t\t\tflower: { white: zStatic.base64FlowerWhite, black: zStatic.base64Flower },\n\t\t\t\t\tsuccess: { white: zStatic.base64SuccessWhite, black: zStatic.base64Success },\n\t\t\t\t\tindicator: { white: '#eeeeee', black: '#777777' }\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\tprops: ['status', 'defaultThemeStyle', 'defaultText', 'pullingText', 'refreshingText', 'completeText', 'defaultImg', 'pullingImg', \n\t\t\t'refreshingImg', 'completeImg', 'showUpdateTime', 'updateTimeKey', 'imgStyle', 'titleStyle', 'updateTimeStyle', 'updateTimeTextMap'\n\t\t],\n\t\tcomputed: {\n\t\t\tts() {\n\t\t\t\treturn this.defaultThemeStyle;\n\t\t\t},\n\t\t\tstatusTextArr() {\n\t\t\t\tthis.updateTime();\n\t\t\t\treturn [this.defaultText,this.pullingText,this.refreshingText,this.completeText];\n\t\t\t},\n\t\t\tcurrentTitle() {\n\t\t\t\treturn this.statusTextArr[this.status] || this.defaultText;\n\t\t\t},\n\t\t\tleftImageClass() {\n\t\t\t\tif (this.status === this.R.Complete) return 'zp-r-left-image-pre-size';\n\t\t\t\treturn `zp-r-left-image zp-r-left-image-pre-size ${this.status === this.R.Default ? 'zp-r-arrow-down' : 'zp-r-arrow-top'}`;\n\t\t\t},\n\t\t\tleftImageStyle() {\n\t\t\t\tconst showUpdateTime = this.showUpdateTime;\n\t\t\t\tconst size = showUpdateTime ? '36rpx' : '30rpx';\n\t\t\t\treturn {width: size,height: size,'margin-right': showUpdateTime ? '20rpx' : '9rpx'};\n\t\t\t},\n\t\t\tleftImageSrc() {\n\t\t\t\tconst R = this.R;\n\t\t\t\tconst status = this.status;\n\t\t\t\tif (status === R.Default) {\n\t\t\t\t\tif (!!this.defaultImg) return this.defaultImg;\n\t\t\t\t\treturn this.zTheme.arrow[this.ts];\n\t\t\t\t} else if (status  === R.ReleaseToRefresh) {\n\t\t\t\t\tif (!!this.pullingImg) return this.pullingImg;\n\t\t\t\t\tif (!!this.defaultImg) return this.defaultImg;\n\t\t\t\t\treturn this.zTheme.arrow[this.ts];\n\t\t\t\t} else if (status  === R.Loading) {\n\t\t\t\t\tif (!!this.refreshingImg) return this.refreshingImg;\n\t\t\t\t\treturn this.zTheme.flower[this.ts];;\n\t\t\t\t} else if (status  === R.Complete) {\n\t\t\t\t\tif (!!this.completeImg) return this.completeImg;\n\t\t\t\t\treturn this.zTheme.success[this.ts];;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t},\n\t\t\trightTextStyle() {\n\t\t\t\tlet stl = {};\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tconst textHeight = this.showUpdateTime ? '40rpx' : '80rpx';\n\t\t\t\tstl = {'height': textHeight, 'line-height': textHeight}\n\t\t\t\t// #endif\n\t\t\t\tstl['color'] = this.zTheme.title[this.ts];\n\t\t\t\treturn stl;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\tupdateTime() {\n\t\t\t\tif (this.showUpdateTime) {\n\t\t\t\t\tthis.refresherTimeText = u.getRefesrherFormatTimeByKey(this.updateTimeKey, this.updateTimeTextMap);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t@import \"../css/z-paging-static.css\";\n\n\t.zp-r-container {\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\theight: 100%;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t}\n\n\t.zp-r-container-padding {\n\t\t/* #ifdef APP-NVUE */\n\t\tpadding: 15rpx 0rpx;\n\t\t/* #endif */\n\t}\n\n\t.zp-r-left {\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\toverflow: hidden;\n\t\t/* #ifdef MP-ALIPAY */\n\t\tmargin-top: -4rpx;\n\t\t/* #endif */\n\t}\n\n\t.zp-r-left-image {\n\t\ttransition-duration: .2s;\n\t\ttransition-property: transform;\n\t\tcolor: #666666;\n\t}\n\t\n\t.zp-r-left-image-pre-size{\n\t\t/* #ifndef APP-NVUE */\n\t\twidth: 30rpx;\n\t\theight: 30rpx;\n\t\toverflow: hidden;\n\t\t/* #endif */\n\t}\n\n\t.zp-r-arrow-top {\n\t\ttransform: rotate(0deg);\n\t}\n\n\t.zp-r-arrow-down {\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.zp-r-right {\n\t\tfont-size: 27rpx;\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.zp-r-right-text {\n\t\t/* #ifdef APP-NVUE */\n\t\tfont-size: 28rpx;\n\t\t/* #endif */\n\t}\n\n\t.zp-r-right-time-text {\n\t\tmargin-top: 10rpx;\n\t\tfont-size: 24rpx;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/config/index.js",
    "content": "// z-paging全局配置文件，注意避免更新时此文件被覆盖，若被覆盖，可在此文件中右键->点击本地历史记录，找回覆盖前的配置\n\nexport default {}"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/css/z-paging-main.css",
    "content": "/* [z-paging]公共css*/\n\n.z-paging-content {\n\tposition: relative;\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t/* #endif */\n\tflex-direction: column;\n}\n\n.z-paging-content-fixed, .zp-loading-fixed {\n\tposition: fixed;\n\t/* #ifndef APP-NVUE */\n\theight: auto;\n\twidth: auto;\n\t/* #endif */\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 0;\n}\n\n.zp-page-top,.zp-page-bottom {\n\t/* #ifndef APP-NVUE */\n\twidth: auto;\n\t/* #endif */\n\tposition: fixed;\n\tleft: 0;\n\tright: 0;\n\tz-index: 999;\n}\n\n.zp-page-left,.zp-page-right{\n\t/* #ifndef APP-NVUE */\n\theight: 100%;\n\t/* #endif */\n}\n\n.zp-scroll-view-super {\n\tflex: 1;\n\tposition: relative;\n}\n\n.zp-view-super{\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: row;\n}\n\n.zp-custom-refresher-container {\n\toverflow: hidden;\n}\n\n.zp-scroll-view-container,.zp-scroll-view {\n\tposition: relative;\n\t/* #ifndef APP-NVUE */\n\theight: 100%;\n\twidth: 100%;\n\t/* #endif */\n}\n\n.zp-absoulte{\n\t/* #ifndef APP-NVUE */\n\tposition: absolute;\n\ttop: 0;\n\twidth: auto;\n\t/* #endif */\n}\n\n.zp-right{\n\tright: 0;\n}\n\n.zp-scroll-view-absolute {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n/* #ifndef APP-NVUE */\n.zp-scroll-view-hide-scrollbar ::-webkit-scrollbar {\n\tdisplay: none;\n\t-webkit-appearance: none;\n\twidth: 0 !important;\n\theight: 0 !important;\n\tbackground: transparent;\n}\n/* #endif */\n\n.zp-paging-touch-view {\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n\n.zp-fixed-bac-view {\n\tposition: absolute;\n\twidth: 100%;\n\ttop: 0;\n\tleft: 0;\n\theight: 200px;\n}\n\n.zp-paging-main {\n\theight: 100%;\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: column;\n}\n\n.zp-paging-container {\n\tflex: 1;\n\tposition: relative;\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: column;\n}\n\n.zp-chat-record-loading-container {\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\twidth: 100%;\n\t/* #endif */\n\t/* #ifdef APP-NVUE */\n\twidth: 750rpx;\n\t/* #endif */\n\talign-items: center;\n\tjustify-content: center;\n\theight: 60rpx;\n\tfont-size: 26rpx;\n}\n\n.zp-chat-record-loading-custom-image {\n\twidth: 35rpx;\n\theight: 35rpx;\n\t/* #ifndef APP-NVUE */\n\tanimation: loading-flower 1s linear infinite;\n\t/* #endif */\n}\n\n.zp-custom-refresher-container {\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: row;\n\tjustify-content: center;\n\talign-items: center;\n}\n\n.zp-back-to-top {\n\twidth: 76rpx;\n\theight: 76rpx;\n\tz-index: 999;\n\tposition: absolute;\n\tbottom: 0rpx;\n\tright: 25rpx;\n\ttransition-duration: .3s;\n\ttransition-property: opacity;\n}\n\n.zp-back-to-top-show {\n\topacity: 1;\n}\n\n.zp-back-to-top-hide {\n\topacity: 0;\n}\n\n.zp-back-to-top-img {\n\t/* #ifndef APP-NVUE */\n\twidth: 100%;\n\theight: 100%;\n\t/* #endif */\n\t/* #ifdef APP-NVUE */\n\tflex: 1;\n\t/* #endif */\n\tz-index: 999;\n}\n\n.zp-empty-view {\n\t/* #ifdef APP-NVUE */\n\theight: 100%;\n\t/* #endif */\n\tflex: 1;\n}\n\n.zp-empty-view-center {\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.zp-loading-fixed {\n\tz-index: 9999;\n}\n\n.zp-safe-area-inset-bottom {\n\tposition: absolute;\n\t/* #ifndef APP-PLUS */\n\theight: env(safe-area-inset-bottom);\n\t/* #endif */\n}\n\n.zp-n-refresh-container {\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tjustify-content: center;\n\twidth: 750rpx;\n}\n\n.zp-n-list-container{\n\t/* #ifndef APP-NVUE */\n\tdisplay: flex;\n\t/* #endif */\n\tflex-direction: row;\n\tflex: 1;\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/css/z-paging-static.css",
    "content": "/* [z-paging]公用的静态css资源 */\n\n.zp-line-loading-image {\n\tmargin-right: 8rpx;\n\twidth: 28rpx;\n\theight: 28rpx;\n\t/* #ifndef APP-NVUE */\n\tanimation: loading-flower 1s steps(12) infinite;\n\t/* #endif */\n\tcolor: #666666;\n}\n\n.zp-loading-image-ios{\n\twidth: 20px;\n\theight: 20px;\n}\n\n.zp-loading-image-android{\n\twidth: 32rpx;\n\theight: 32rpx;\n}\n\n/* #ifndef APP-NVUE */\n@keyframes loading-flower {\n\t0% {\n\t\t-webkit-transform: rotate(0deg);\n\t\ttransform: rotate(0deg);\n\t}\n\tto {\n\t\t-webkit-transform: rotate(1turn);\n\t\ttransform: rotate(1turn);\n\t}\n}\n/* #endif */\n\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/i18n/en.json",
    "content": "{\t\n\t\"zp.refresher.default\": \"Pull down to refresh\",\n\t\"zp.refresher.pulling\": \"Release to refresh\",\n\t\"zp.refresher.refreshing\": \"Refreshing...\",\n\t\"zp.refresher.complete\": \"Refresh succeeded\",\n\t\n\t\"zp.loadingMore.default\": \"Click to load more\",\n\t\"zp.loadingMore.loading\": \"Loading...\",\n\t\"zp.loadingMore.noMore\": \"No more data\",\n\t\"zp.loadingMore.fail\": \"Load failed,click to reload\",\n\t\n\t\"zp.emptyView.title\": \"No data\",\n\t\"zp.emptyView.reload\": \"Reload\",\n\t\"zp.emptyView.error\": \"Sorry,load failed\",\n\t\n\t\"zp.refresherUpdateTime.title\": \"Last update: \",\n\t\"zp.refresherUpdateTime.none\": \"None\",\n\t\"zp.refresherUpdateTime.today\": \"Today\",\n\t\"zp.refresherUpdateTime.yesterday\": \"Yesterday\",\n\t\n\t\"zp.systemLoading.title\": \"Loading...\"\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/i18n/index.js",
    "content": "import en from './en.json'\nimport zhHans from './zh-Hans.json'\nimport zhHant from './zh-Hant.json'\nexport default {\n\ten,\n\t'zh-Hans': zhHans,\n\t'zh-Hant': zhHant\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/i18n/zh-Hans.json",
    "content": "{\t\n\t\"zp.refresher.default\": \"继续下拉刷新\",\n\t\"zp.refresher.pulling\": \"松开立即刷新\",\n\t\"zp.refresher.refreshing\": \"正在刷新...\",\n\t\"zp.refresher.complete\": \"刷新成功\",\n\t\n\t\"zp.loadingMore.default\": \"点击加载更多\",\n\t\"zp.loadingMore.loading\": \"正在加载...\",\n\t\"zp.loadingMore.noMore\": \"没有更多了\",\n\t\"zp.loadingMore.fail\": \"加载失败，点击重新加载\",\n\t\n\t\"zp.emptyView.title\": \"没有数据哦~\",\n\t\"zp.emptyView.reload\": \"重新加载\",\n\t\"zp.emptyView.error\": \"很抱歉，加载失败\",\n\t\n\t\"zp.refresherUpdateTime.title\": \"最后更新：\",\n\t\"zp.refresherUpdateTime.none\": \"无\",\n\t\"zp.refresherUpdateTime.today\": \"今天\",\n\t\"zp.refresherUpdateTime.yesterday\": \"昨天\",\n\t\n\t\"zp.systemLoading.title\": \"加载中...\"\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/i18n/zh-Hant.json",
    "content": "{\t\n\t\"zp.refresher.default\": \"繼續下拉重繪\",\n\t\"zp.refresher.pulling\": \"鬆開立即重繪\",\n\t\"zp.refresher.refreshing\": \"正在重繪...\",\n\t\"zp.refresher.complete\": \"重繪成功\",\n\t\n\t\"zp.loadingMore.default\": \"點擊加載更多\",\n\t\"zp.loadingMore.loading\": \"正在加載...\",\n\t\"zp.loadingMore.noMore\": \"沒有更多了\",\n\t\"zp.loadingMore.fail\": \"加載失敗，點擊重新加載\",\n\t\n\t\"zp.emptyView.title\": \"沒有數據哦~\",\n\t\"zp.emptyView.reload\": \"重新加載\",\n\t\"zp.emptyView.error\": \"很抱歉，加載失敗\",\n\t\n\t\"zp.refresherUpdateTime.title\": \"最後更新：\",\n\t\"zp.refresherUpdateTime.none\": \"無\",\n\t\"zp.refresherUpdateTime.today\": \"今天\",\n\t\"zp.refresherUpdateTime.yesterday\": \"昨天\",\n\t\n\t\"zp.systemLoading.title\": \"加載中...\"\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/back-to-top.js",
    "content": "// [z-paging]点击返回顶部view模块\nimport u from '.././z-paging-utils'\n\nexport default {\n\tprops: {\n\t\t//自动显示点击返回顶部按钮，默认为否\n\t\tautoShowBackToTop: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoShowBackToTop', false)\n\t\t},\n\t\t//点击返回顶部按钮显示/隐藏的阈值(滚动距离)，单位为px，默认为400rpx\n\t\tbackToTopThreshold: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('backToTopThreshold', '400rpx')\n\t\t},\n\t\t//点击返回顶部按钮的自定义图片地址，默认使用z-paging内置的图片\n\t\tbackToTopImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('backToTopImg', '')\n\t\t},\n\t\t//点击返回顶部按钮返回到顶部时是否展示过渡动画，默认为是\n\t\tbackToTopWithAnimate: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('backToTopWithAnimate', true)\n\t\t},\n\t\t//点击返回顶部按钮与底部的距离，注意添加单位px或rpx，默认为160rpx\n\t\tbackToTopBottom: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('backToTopBottom', '160rpx')\n\t\t},\n\t\t//点击返回顶部按钮的自定义样式\n\t\tbackToTopStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('backToTopStyle', {});\n\t\t\t},\n\t\t},\n\t\t//iOS点击顶部状态栏、安卓双击标题栏时，滚动条返回顶部，只支持竖向，默认为是\n\t\tenableBackToTop: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('enableBackToTop', true)\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbackToTopClass: 'zp-back-to-top zp-back-to-top-hide',\n\t\t\tlastBackToTopShowTime: 0,\n\t\t\tshowBackToTopClass: false,\n\t\t}\n\t},\n\tcomputed: {\n\t\tfinalEnableBackToTop() {\n\t\t\treturn this.usePageScroll ? false : this.enableBackToTop;\n\t\t},\n\t\tfinalBackToTopThreshold() {\n\t\t\treturn u.convertToPx(this.backToTopThreshold);\n\t\t},\n\t\tfinalBackToTopStyle() {\n\t\t\tconst backToTopStyle = this.backToTopStyle;\n\t\t\tif (!backToTopStyle.bottom) {\n\t\t\t\tbackToTopStyle.bottom = this.windowBottom + u.convertToPx(this.backToTopBottom) + 'px';\n\t\t\t}\n\t\t\tif(!backToTopStyle.position){\n\t\t\t\tbackToTopStyle.position = this.usePageScroll ? 'fixed': 'absolute';\n\t\t\t}\n\t\t\treturn backToTopStyle;\n\t\t},\n\t},\n\tmethods: {\n\t\t//点击返回顶部\n\t\t_backToTopClick() {\n\t\t\t!this.backToTopWithAnimate && this._checkShouldShowBackToTop(0);\n\t\t\tthis.scrollToTop(this.backToTopWithAnimate);\n\t\t},\n\t\t//判断是否要显示返回顶部按钮\n\t\t_checkShouldShowBackToTop(scrollTop) {\n\t\t\tif (!this.autoShowBackToTop) {\n\t\t\t\tthis.showBackToTopClass = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (scrollTop > this.finalBackToTopThreshold) {\n\t\t\t\tif (!this.showBackToTopClass) {\n\t\t\t\t\tthis.showBackToTopClass = true;\n\t\t\t\t\tthis.lastBackToTopShowTime = new Date().getTime();\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.backToTopClass = 'zp-back-to-top zp-back-to-top-show';\n\t\t\t\t\t}, 300)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.showBackToTopClass) {\n\t\t\t\t\tthis.backToTopClass = 'zp-back-to-top zp-back-to-top-hide';\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.showBackToTopClass = false;\n\t\t\t\t\t}, new Date().getTime() - this.lastBackToTopShowTime < 500 ? 0 : 300)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n}\n\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/data-handle.js",
    "content": "// [z-paging]数据处理模块\nimport u from '.././z-paging-utils'\nimport c from '.././z-paging-constant'\nimport Enum from '.././z-paging-enum'\nimport interceptor from '../z-paging-interceptor'\n\nexport default {\n\tprops: {\n\t\t//自定义初始的pageNo，默认为1\n\t\tdefaultPageNo: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('defaultPageNo', 1),\n\t\t\tobserver: function(newVal) {\n\t\t\t\tthis.pageNo = newVal;\n\t\t\t},\n\t\t},\n\t\t//自定义pageSize，默认为10\n\t\tdefaultPageSize: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('defaultPageSize', 10),\n\t\t\tvalidator: (value) => {\n\t\t\t\tif(value <= 0) u.consoleErr('default-page-size必须大于0！');\n\t\t\t\treturn value > 0;\n\t\t\t}\n\t\t},\n\t\t//为保证数据一致，设置当前tab切换时的标识key，并在complete中传递相同key，若二者不一致，则complete将不会生效\n\t\tdataKey: {\n\t\t\ttype: [Number, String, Object],\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('dataKey', null);\n\t\t\t},\n\t\t},\n\t\t//使用缓存，若开启将自动缓存第一页的数据，默认为否。请注意，因考虑到切换tab时不同tab数据不同的情况，默认仅会缓存组件首次加载时第一次请求到的数据，后续的下拉刷新操作不会更新缓存。\n\t\tuseCache: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useCache', false)\n\t\t},\n\t\t//使用缓存时缓存的key，用于区分不同列表的缓存数据，useCache为true时必须设置，否则缓存无效\n\t\tcacheKey: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('cacheKey', null)\n\t\t},\n\t\t//缓存模式，默认仅会缓存组件首次加载时第一次请求到的数据，可设置为always，即代表总是缓存，每次列表刷新(下拉刷新、调用reload等)都会更新缓存\n\t\tcacheMode: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('cacheMode', Enum.CacheMode.Default)\n\t\t},\n\t\t//自动注入的list名，可自动修改父view(包含ref=\"paging\")中对应name的list值\n\t\tautowireListName: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('autowireListName', '')\n\t\t},\n\t\t//自动注入的query名，可自动调用父view(包含ref=\"paging\")中的query方法\n\t\tautowireQueryName: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('autowireQueryName', '')\n\t\t},\n\t\t//z-paging mounted后自动调用reload方法(mounted后自动调用接口)，默认为是\n\t\tauto: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('auto', true)\n\t\t},\n\t\t//用户下拉刷新时是否触发reload方法，默认为是\n\t\treloadWhenRefresh: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('reloadWhenRefresh', true)\n\t\t},\n\t\t//reload时自动滚动到顶部，默认为是\n\t\tautoScrollToTopWhenReload: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoScrollToTopWhenReload', true)\n\t\t},\n\t\t//reload时立即自动清空原list，默认为是，若立即自动清空，则在reload之后、请求回调之前页面是空白的\n\t\tautoCleanListWhenReload: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoCleanListWhenReload', true)\n\t\t},\n\t\t//列表刷新时自动显示下拉刷新view，默认为否\n\t\tshowRefresherWhenReload: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showRefresherWhenReload', false)\n\t\t},\n\t\t//列表刷新时自动显示加载更多view，且为加载中状态，默认为否\n\t\tshowLoadingMoreWhenReload: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showLoadingMoreWhenReload', false)\n\t\t},\n\t\t//组件created时立即触发reload(可解决一些情况下先看到页面再看到loading的问题)，auto为true时有效。为否时将在mounted+nextTick后触发reload，默认为否\n\t\tcreatedReload: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('createdReload', false)\n\t\t},\n\t\t//本地分页时上拉加载更多延迟时间，单位为毫秒，默认200毫秒\n\t\tlocalPagingLoadingTime: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('localPagingLoadingTime', 200)\n\t\t},\n\t\t//使用聊天记录模式，默认为否\n\t\tuseChatRecordMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useChatRecordMode', false)\n\t\t},\n\t\t//使用聊天记录模式时是否自动隐藏键盘：在用户触摸列表时候自动隐藏键盘，默认为是\n\t\tautoHideKeyboardWhenChat: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoHideKeyboardWhenChat', true)\n\t\t},\n\t\t//自动拼接complete中传过来的数组(使用聊天记录模式时无效)\n\t\tconcat: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('concat', true)\n\t\t},\n\t\t//父组件v-model所绑定的list的值\n\t\tvalue: {\n\t\t\ttype: Array,\n\t\t\tdefault: function() {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t},\n\t\t// #ifdef VUE3\n\t\tmodelValue: {\n\t\t\ttype: Array,\n\t\t\tdefault: function() {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\t\t// #endif\n\t},\n\tdata (){\n\t\treturn {\n\t\t\tcurrentData: [],\n\t\t\ttotalData: [],\n\t\t\trealTotalData: [],\n\t\t\ttotalLocalPagingList: [],\n\t\t\tdataPromiseResultMap: {\n\t\t\t\treload: null,\n\t\t\t\tcomplete: null,\n\t\t\t\tlocalPaging: null\n\t\t\t},\n\t\t\tisSettingCacheList: false,\n\t\t\tpageNo: 1,\n\t\t\tcurrentRefreshPageSize: 0,\n\t\t\tisLocalPaging: false,\n\t\t\tisAddedData: false,\n\t\t\tisTotalChangeFromAddData: false,\n\t\t\tprivateConcat: true,\n\t\t\tmyParentQuery: -1,\n\t\t\tfirstPageLoaded: false,\n\t\t\tpagingLoaded: false,\n\t\t\tloaded: false,\n\t\t\tisUserReload: true,\n\t\t\tfromEmptyViewReload: false,\n\t\t\tqueryFrom: '',\n\t\t\tlistRendering: false,\n\t\t\tlistRenderingTimeout: null\n\t\t}\n\t},\n\tcomputed: {\n\t\tpageSize() {\n\t\t\treturn this.defaultPageSize;\n\t\t},\n\t\tfinalConcat() {\n\t\t\treturn this.concat && this.privateConcat;\n\t\t},\n\t\tfinalUseCache() {\n\t\t\tif (this.useCache && !this.cacheKey) {\n\t\t\t\tu.consoleErr('use-cache为true时，必须设置cache-key，否则缓存无效！');\n\t\t\t}\n\t\t\treturn this.useCache && !!this.cacheKey;\n\t\t},\n\t\tfinalCacheKey() {\n\t\t\tif (!this.cacheKey) return null;\n\t\t\treturn `${c.cachePrefixKey}-${this.cacheKey}`; \n\t\t},\n\t\tisFirstPage() {\n\t\t\treturn this.pageNo === this.defaultPageNo;\n\t\t}\n\t},\n\twatch: {\n\t\ttotalData(newVal, oldVal) {\n\t\t\tthis._totalDataChange(newVal, oldVal);\n\t\t},\n\t\tcurrentData(newVal, oldVal) {\n\t\t\tthis._currentDataChange(newVal, oldVal);\n\t\t},\n\t\tuseChatRecordMode(newVal, oldVal) {\n\t\t\tif (newVal) {\n\t\t\t\tthis.nLoadingMoreFixedHeight = false;\n\t\t\t}\n\t\t},\n\t\tvalue: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.realTotalData = newVal;\n\t\t\t},\n\t\t\timmediate: true\n\t\t},\n\t\t// #ifdef VUE3\n\t\tmodelValue: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.realTotalData = newVal;\n\t\t\t},\n\t\t\timmediate: true\n\t\t}\n\t\t// #endif\n\t},\n\tmethods: {\n\t\t//请求结束(成功或者失败)调用此方法，将请求的结果传递给z-paging处理，第一个参数为请求结果数组，第二个参数为是否成功(默认是是）\n\t\tcomplete(data, success = true) {\n\t\t\tthis.customNoMore = -1;\n\t\t\treturn this.addData(data, success);\n\t\t},\n\t\t//【保证数据一致】请求结束(成功或者失败)调用此方法，将请求的结果传递给z-paging处理，第一个参数为请求结果数组，第二个参数为dataKey，需与:data-key绑定的一致，第三个参数为是否成功(默认为是）\n\t\tcompleteByKey(data, dataKey = null, success = true) {\n\t\t\tif (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) {\n\t\t\t\tif (this.isFirstPage) {\n\t\t\t\t\tthis.endRefresh();\n\t\t\t\t}\n\t\t\t\treturn new Promise(resolve => resolve());\n\t\t\t}\n\t\t\tthis.customNoMore = -1;\n\t\t\treturn this.addData(data, success);\n\t\t},\n\t\t//【通过total判断是否有更多数据】请求结束(成功或者失败)调用此方法，将请求的结果传递给z-paging处理，第一个参数为请求结果数组，第二个参数为total(列表总数)，第三个参数为是否成功(默认为是）\n\t\tcompleteByTotal(data, total, success = true) {\n\t\t\tif (total == 'undefined') {\n\t\t\t\tthis.customNoMore = -1;\n\t\t\t} else {\n\t\t\t\tconst dataTypeRes = this._checkDataType(data, success, false);\n\t\t\t\tdata = dataTypeRes.data;\n\t\t\t\tsuccess = dataTypeRes.success;\n\t\t\t\tif (total >= 0 && success) {\n\t\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t\tlet nomore = false;\n\t\t\t\t\t\t\tlet realTotalDataCount = this.realTotalData.length;\n\t\t\t\t\t\t\tif (this.pageNo == this.defaultPageNo) {\n\t\t\t\t\t\t\t\trealTotalDataCount = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst dataLength = this.privateConcat ? data.length : 0;\n\t\t\t\t\t\t\tlet exceedCount = realTotalDataCount + dataLength - total;\n\t\t\t\t\t\t\tif (exceedCount >= 0) {\n\t\t\t\t\t\t\t\tnomore = true;\n\t\t\t\t\t\t\t\texceedCount = this.defaultPageSize - exceedCount;\n\t\t\t\t\t\t\t\tif (exceedCount > 0 && exceedCount < data.length && this.privateConcat) {\n\t\t\t\t\t\t\t\t\tdata = data.splice(0, exceedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.completeByNoMore(data, nomore, success).then(res => resolve(res)).catch(() => reject());\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\treturn this.addData(data, success);\n\t\t},\n\t\t//【自行判断是否有更多数据】请求结束(成功或者失败)调用此方法，将请求的结果传递给z-paging处理，第一个参数为请求结果数组，第二个参数为是否有更多数据，第三个参数为是否成功(默认是是）\n\t\tcompleteByNoMore(data, nomore, success = true) {\n\t\t\tif (nomore != 'undefined') {\n\t\t\t\tthis.customNoMore = nomore == true ? 1 : 0;\n\t\t\t}\n\t\t\treturn this.addData(data, success);\n\t\t},\n\t\t//与上方complete方法功能一致，新版本中设置服务端回调数组请使用complete方法\n\t\taddData(data, success = true) {\n\t\t\tif (!this.fromCompleteEmit) {\n\t\t\t\tthis.disabledCompleteEmit = true;\n\t\t\t\tthis.fromCompleteEmit = false;\n\t\t\t}\n\t\t\tconst currentTimeStamp = u.getTime();\n\t\t\tconst disTime = currentTimeStamp - this.requestTimeStamp;\n\t\t\tlet minDelay = this.minDelay;\n\t\t\tif (this.isFirstPage && this.finalShowRefresherWhenReload) {\n\t\t\t\tminDelay = Math.max(400, minDelay);\n\t\t\t}\n\t\t\tconst addDataDalay = (this.requestTimeStamp > 0 && disTime < minDelay) ? minDelay - disTime : 0;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._addData(data, success, false);\n\t\t\t\t}, this.delay > 0 ? this.delay : addDataDalay)\n\t\t\t})\n\t\t\t\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis.dataPromiseResultMap.complete = { resolve, reject };\n\t\t\t});\n\t\t},\n\t\t//从顶部添加数据，不会影响分页的pageNo和pageSize\n\t\taddDataFromTop(data, toTop = true, toTopWithAnimate = true) {\n\t\t\tlet dataType = Object.prototype.toString.call(data);\n\t\t\tif (dataType !== '[object Array]') {\n\t\t\t\tdata = [data];\n\t\t\t}\n\t\t\tthis.totalData = [...data, ...this.totalData];\n\t\t\tif (toTop) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._scrollToTop(toTopWithAnimate);\n\t\t\t\t}, c.delayTime)\n\t\t\t}\n\t\t},\n\t\t//重新设置列表数据，调用此方法不会影响pageNo和pageSize，也不会触发请求。适用场景：当需要删除列表中某一项时，将删除对应项后的数组通过此方法传递给z-paging。(当出现类似的需要修改列表数组的场景时，请使用此方法，请勿直接修改page中:list.sync绑定的数组)\n\t\tresetTotalData(data) {\n\t\t\tthis.isTotalChangeFromAddData = true;\n\t\t\tlet dataType = Object.prototype.toString.call(data);\n\t\t\tif (dataType !== '[object Array]') {\n\t\t\t\tdata = [data];\n\t\t\t}\n\t\t\tthis.totalData = data;\n\t\t},\n\t\t//添加聊天记录\n\t\taddChatRecordData(data, toBottom = true, toBottomWithAnimate = true) {\n\t\t\tlet dataType = Object.prototype.toString.call(data);\n\t\t\tif (dataType !== '[object Array]') {\n\t\t\t\tdata = [data];\n\t\t\t}\n\t\t\tif (!this.useChatRecordMode) return;\n\t\t\tthis.isTotalChangeFromAddData = true;\n\t\t\t//#ifndef APP-NVUE\n\t\t\tthis.totalData = [...this.totalData, ...data];\n\t\t\t//#endif\n\t\t\t//#ifdef APP-NVUE\n\t\t\tthis.totalData = this.nIsFirstPageAndNoMore ? [...this.totalData, ...data] : [...data, ...this.totalData];\n\t\t\t//#endif\n\t\t\tif (toBottom) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t//#ifndef APP-NVUE\n\t\t\t\t\tthis._scrollToBottom(toBottomWithAnimate);\n\t\t\t\t\t//#endif\n\t\t\t\t\t//#ifdef APP-NVUE\n\t\t\t\t\tif (this.nIsFirstPageAndNoMore) {\n\t\t\t\t\t\tthis._scrollToBottom(toBottomWithAnimate);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._scrollToTop(toBottomWithAnimate);\n\t\t\t\t\t}\n\t\t\t\t\t//#endif\n\t\t\t\t}, c.delayTime)\n\t\t\t}\n\t\t},\n\t\t//设置本地分页数据，请求结束(成功或者失败)调用此方法，将请求的结果传递给z-paging作分页处理（若调用了此方法，则上拉加载更多时内部会自动分页，不会触发@query所绑定的事件）\n\t\tsetLocalPaging(data, success = true) {\n\t\t\tthis.isLocalPaging = true;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._addData(data, success, true);\n\t\t\t})\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis.dataPromiseResultMap.localPaging = { resolve, reject };\n\t\t\t});\n\t\t},\n\t\t//重新加载分页数据，pageNo会恢复为默认值，相当于下拉刷新的效果(animate为true时会展示下拉刷新动画，默认为false)\n\t\treload(animate = this.showRefresherWhenReload) {\n\t\t\tif (animate) {\n\t\t\t\tthis.privateShowRefresherWhenReload = animate;\n\t\t\t\tthis.isUserPullDown = true;\n\t\t\t}\n\t\t\tthis.listRendering = true;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._preReload(animate, false);\n\t\t\t})\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis.dataPromiseResultMap.reload = { resolve, reject };\n\t\t\t});\n\t\t},\n\t\t//刷新列表数据，pageNo和pageSize不会重置，列表数据会重新从服务端获取。必须保证@query绑定的方法中的pageNo和pageSize和传给服务端的一致\n\t\trefresh() {\n\t\t\tif (!this.realTotalData.length) {\n\t\t\t\treturn this.reload();\n\t\t\t}\n\t\t\tconst disPageNo = this.pageNo - this.defaultPageNo + 1;\n\t\t\tif (disPageNo >= 1) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tthis.privateConcat = false;\n\t\t\t\tconst totalPageSize = disPageNo * this.pageSize;\n\t\t\t\tthis.currentRefreshPageSize = totalPageSize;\n\t\t\t\tthis._emitQuery(this.defaultPageNo, totalPageSize, Enum.QueryFrom.Refresh);\n\t\t\t\tthis._callMyParentQuery(this.defaultPageNo, totalPageSize);\n\t\t\t}\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tthis.dataPromiseResultMap.reload = { resolve, reject };\n\t\t\t});\n\t\t},\n\t\t//手动更新列表缓存数据，将自动截取v-model绑定的list中的前pageSize条覆盖缓存，请确保在list数据更新到预期结果后再调用此方法\n\t\tupdateCache() {\n\t\t\tif (this.finalUseCache && this.totalData.length) {\n\t\t\t\tthis._saveLocalCache(this.totalData.slice(0, Math.min(this.totalData.length, this.pageSize)));\n\t\t\t}\n\t\t},\n\t\t//清空分页数据\n\t\tclean() {\n\t\t\tthis._reload(true);\n\t\t\tthis._addData([], true, false);\n\t\t},\n\t\t//清空分页数据\n\t\tclear() {\n\t\t\tthis.clean();\n\t\t},\n\t\t//手动触发滚动到顶部加载更多，聊天记录模式时有效\n\t\tdoChatRecordLoadMore() {\n\t\t\tthis.useChatRecordMode && this._onLoadingMore('click');\n\t\t},\n\t\t//reload之前的一些处理\n\t\t_preReload(animate = this.showRefresherWhenReload, isFromMounted = true) {\n\t\t\tthis.isUserReload = true;\n\t\t\tthis.loadingType = Enum.LoadingType.Refresher;\n\t\t\tif (animate) {\n\t\t\t\tthis.privateShowRefresherWhenReload = animate;\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tif (this.useCustomRefresher) {\n\t\t\t\t\tthis._doRefresherRefreshAnimate();\n\t\t\t\t} else {\n\t\t\t\t\tthis.refresherTriggered = true;\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.refresherStatus = Enum.Refresher.Loading;\n\t\t\t\tthis.refresherRevealStackCount ++;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._getNodeClientRect('zp-n-refresh-container', false).then((node) => {\n\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\tlet nodeHeight = node[0].height;\n\t\t\t\t\t\t\tthis.nShowRefresherReveal = true;\n\t\t\t\t\t\t\tthis.nShowRefresherRevealHeight = nodeHeight;\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tthis._nDoRefresherEndAnimation(0, -nodeHeight, false, false);\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tthis._nDoRefresherEndAnimation(nodeHeight, 0);\n\t\t\t\t\t\t\t\t}, 10)\n\t\t\t\t\t\t\t}, 10)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._reload(false, isFromMounted);\n\t\t\t\t\t\tthis._doRefresherLoad(false);\n\t\t\t\t\t});\n\t\t\t\t}, this.pagingLoaded ? 10 : 100)\n\t\t\t\treturn;\n\t\t\t\t// #endif\n\t\t\t} else {\n\t\t\t\tthis._refresherEnd(false, false, false, false);\n\t\t\t}\n\t\t\tthis._reload(false, isFromMounted);\n\t\t},\n\t\t//重新加载分页数据\n\t\t_reload(isClean = false, isFromMounted = false, isUserPullDown = false) {\n\t\t\tthis.isAddedData = false;\n\t\t\tthis.insideOfPaging = -1;\n\t\t\tthis.cacheScrollNodeHeight = -1;\n\t\t\tthis.pageNo = this.defaultPageNo;\n\t\t\tthis._cleanRefresherEndTimeout();\n\t\t\t!this.privateShowRefresherWhenReload && !isClean && this._startLoading(true);\n\t\t\tthis.firstPageLoaded = true;\n\t\t\tthis.isTotalChangeFromAddData = false;\n\t\t\tif (!this.isSettingCacheList) {\n\t\t\t\tthis.totalData = [];\n\t\t\t}\n\t\t\tif (!isClean) {\n\t\t\t\tthis._emitQuery(this.pageNo, this.defaultPageSize, isUserPullDown ? Enum.QueryFrom.UserPullDown : Enum.QueryFrom.Reload);\n\t\t\t\tlet delay = 0;\n\t\t\t\t// #ifdef MP-TOUTIAO\n\t\t\t\tdelay = 5;\n\t\t\t\t// #endif\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._callMyParentQuery();\n\t\t\t\t}, delay)\n\t\t\t\tif (!isFromMounted && this.autoScrollToTopWhenReload) {\n\t\t\t\t\tlet checkedNRefresherLoading = true;\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tcheckedNRefresherLoading = !this.nRefresherLoading;\n\t\t\t\t\t// #endif\n\t\t\t\t\tcheckedNRefresherLoading && this._scrollToTop(false);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$nextTick(() => {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis.nShowBottom = this.realTotalData.length > 0;\n\t\t\t\t// #endif\n\t\t\t})\n\t\t},\n\t\t//处理服务端返回的数组\n\t\t_addData(data, success, isLocal) {\n\t\t\tthis.isAddedData = true;\n\t\t\tthis.fromEmptyViewReload = false;\n\t\t\tthis.isTotalChangeFromAddData = true;\n\t\t\tthis.refresherTriggered = false;\n\t\t\tthis._endSystemLoadingAndRefresh();\n\t\t\tconst tempIsUserPullDown = this.isUserPullDown;\n\t\t\tif (this.showRefresherUpdateTime && this.isFirstPage) {\n\t\t\t\tu.setRefesrherTime(u.getTime(), this.refresherUpdateTimeKey);\n\t\t\t\tthis.$refs.refresh && this.$refs.refresh.updateTime();\n\t\t\t}\n\t\t\tif (!isLocal && tempIsUserPullDown && this.isFirstPage) {\n\t\t\t\tthis.isUserPullDown = false;\n\t\t\t}\n\t\t\tlet dataTypeRes = this._checkDataType(data, success, isLocal);\n\t\t\tdata = dataTypeRes.data;\n\t\t\tsuccess = dataTypeRes.success;\n\t\t\tlet delayTime = c.delayTime;\n\t\t\t// #ifdef APP-NVUE\n\t\t\tif (this.useChatRecordMode) delayTime = 0;\n\t\t\t// #endif\n\t\t\tthis.loadingForNow = false;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.pagingLoaded = true;\n\t\t\t\tthis.$nextTick(()=>{\n\t\t\t\t\t!isLocal && this._refresherEnd(delayTime > 0, true, tempIsUserPullDown);\n\t\t\t\t})\n\t\t\t}, delayTime)\n\t\t\tif (this.isFirstPage) {\n\t\t\t\tthis.isLoadFailed = !success;\n\t\t\t\tthis.$emit('isLoadFailedChange', this.isLoadFailed);\n\t\t\t\tif (this.finalUseCache && success && (this.cacheMode === Enum.CacheMode.Always ? true : this.isSettingCacheList)) {\n\t\t\t\t\tthis._saveLocalCache(data);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.isSettingCacheList = false;\n\t\t\tif (success) {\n\t\t\t\tif (!(this.privateConcat === false && this.loadingStatus === Enum.More.NoMore)) {\n\t\t\t\t\tthis.loadingStatus = Enum.More.Default;\n\t\t\t\t}\n\t\t\t\tif (isLocal) {\n\t\t\t\t\tthis.totalLocalPagingList = data;\n\t\t\t\t\tconst localPageNo = this.defaultPageNo;\n\t\t\t\t\tconst localPageSize = this.queryFrom !== Enum.QueryFrom.Refresh ? this.defaultPageSize : this.currentRefreshPageSize;\n\t\t\t\t\tthis._localPagingQueryList(localPageNo, localPageSize, 0, res => {\n\t\t\t\t\t\tthis.completeByTotal(res, this.totalLocalPagingList.length);\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tlet dataChangeDelayTime = 0;\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tif (this.privateShowRefresherWhenReload && this.finalNvueListIs === 'waterfall') {\n\t\t\t\t\t\tdataChangeDelayTime = 150;\n\t\t\t\t\t}\n\t\t\t\t\t// #endif\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._currentDataChange(data, this.currentData);\n\t\t\t\t\t\tthis._callDataPromise(true, this.totalData);\n\t\t\t\t\t}, dataChangeDelayTime)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._currentDataChange(data, this.currentData);\n\t\t\t\tthis._callDataPromise(false);\n\t\t\t\tthis.loadingStatus = Enum.More.Fail;\n\t\t\t\tif (this.loadingType === Enum.LoadingType.LoadingMore) {\n\t\t\t\t\tthis.pageNo --;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//所有数据改变时调用\n\t\t_totalDataChange(newVal, oldVal, eventThrow=true) {\n\t\t\tif ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length && oldVal.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._doCheckScrollViewShouldFullHeight(newVal);\n\t\t\tif(!this.realTotalData.length && !newVal.length){\n\t\t\t\teventThrow = false;\n\t\t\t}\n\t\t\tthis.realTotalData = newVal;\n\t\t\tif (eventThrow) {\n\t\t\t\tthis.$emit('input', newVal);\n\t\t\t\t// #ifdef VUE3\n\t\t\t\tthis.$emit('update:modelValue', newVal);\n\t\t\t\t// #endif\n\t\t\t\tthis.$emit('update:list', newVal);\n\t\t\t\tthis.$emit('listChange', newVal);\n\t\t\t\tthis._callMyParentList(newVal);\n\t\t\t}\n\t\t\tthis.firstPageLoaded = false;\n\t\t\tthis.isTotalChangeFromAddData = false;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\tthis._getNodeClientRect('.zp-paging-container-content').then(res => {\n\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\tthis.$emit('contentHeightChanged', res[0].height);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},this.isIos ? 100 : 300)\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tif (this.useChatRecordMode && this.nIsFirstPageAndNoMore && this.isFirstPage && !this.nFirstPageAndNoMoreChecked) {\n\t\t\t\t\tthis.nFirstPageAndNoMoreChecked = true;\n\t\t\t\t\tthis._scrollToBottom(false);\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t})\n\t\t},\n\t\t//当前数据改变时调用\n\t\t_currentDataChange(newVal, oldVal) {\n\t\t\tnewVal = [...newVal];\n\t\t\tif (!this.isFirstPage) {\n\t\t\t\tthis.listRendering = true;\n\t\t\t\tthis.listRenderingTimeout && clearTimeout(this.listRenderingTimeout);\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.listRenderingTimeout = setTimeout(() => {\n\t\t\t\t\t\tthis.listRendering = false;\n\t\t\t\t\t}, c.delayTime)\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthis.listRendering = false;\n\t\t\t}\n\t\t\t// #ifndef APP-NVUE\n\t\t\tthis.finalUseVirtualList && this._setCellIndex(newVal, this.totalData.length === 0)\n\t\t\tthis.useChatRecordMode && newVal.reverse();\n\t\t\t// #endif\n\t\t\tif (this.isFirstPage && this.finalConcat) {\n\t\t\t\tthis.totalData = [];\n\t\t\t}\n\t\t\tif (this.customNoMore !== -1) {\n\t\t\t\tif (this.customNoMore === 1 || !newVal.length) {\n\t\t\t\t\tthis.loadingStatus = Enum.More.NoMore;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!newVal.length || (newVal.length && newVal.length < this.defaultPageSize)) {\n\t\t\t\t\tthis.loadingStatus = Enum.More.NoMore;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!this.totalData.length) {\n\t\t\t\tif (this.finalConcat) {\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tif (this.useChatRecordMode && this.isFirstPage && this.loadingStatus === Enum.More.NoMore) {\n\t\t\t\t\t\tnewVal.reverse();\n\t\t\t\t\t}\n\t\t\t\t\t// #endif\n\t\t\t\t\tthis.totalData = newVal;\n\t\t\t\t}\n\t\t\t\tif (this.useChatRecordMode) {\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis._scrollToBottom(false);\n\t\t\t\t\t})\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.useChatRecordMode) {\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tthis.totalData = [...this.totalData, ...newVal];\n\t\t\t\t\t// #endif\n\t\t\t\t\t//#ifndef APP-NVUE\n\t\t\t\t\tconst idIndex = newVal.length;\n\t\t\t\t\tlet idIndexStr = `z-paging-${idIndex}`;\n\t\t\t\t\tthis.totalData = [...newVal, ...this.totalData];\n\t\t\t\t\tif (this.pageNo !== this.defaultPageNo) {\n\t\t\t\t\t\tthis.privateScrollWithAnimation = 0;\n\t\t\t\t\t\tthis.$emit('update:chatIndex', idIndex);\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._scrollIntoView(idIndexStr, 30 + Math.max(0, this.cacheTopHeight), false, () => {\n\t\t\t\t\t\t\t\tthis.$emit('update:chatIndex', 0);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, this.usePageScroll ? this.isIos ? 50 : 100 : 200)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t\tthis._scrollToBottom(false);\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t//#endif\n\t\t\n\t\t\t\t} else {\n\t\t\t\t\tif (this.finalConcat) {\n\t\t\t\t\t\tconst currentScrollTop = this.oldScrollTop;\n\t\t\t\t\t\tthis.totalData = [...this.totalData, ...newVal];\n\t\t\t\t\t\t// #ifdef MP-WEIXIN\n\t\t\t\t\t\tif (!this.isIos && !this.refresherOnly && !this.usePageScroll && newVal.length) {\n\t\t\t\t\t\t\tthis.loadingMoreTimeStamp = u.getTime();\n\t\t\t\t\t\t\tthis.$nextTick(()=>{\n\t\t\t\t\t\t\t\tthis.scrollToY(currentScrollTop);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// #endif\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.totalData = newVal;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.privateConcat = true;\n\t\t},\n\t\t//本地分页请求\n\t\t_localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) {\n\t\t\tpageNo = Math.max(1, pageNo);\n\t\t\tpageSize = Math.max(1, pageSize);\n\t\t\tconst totalPagingList = [...this.totalLocalPagingList];\n\t\t\tconst pageNoIndex = (pageNo - 1) * pageSize;\n\t\t\tconst finalPageNoIndex = Math.min(totalPagingList.length, pageNoIndex + pageSize);\n\t\t\tconst resultPagingList = totalPagingList.splice(pageNoIndex, finalPageNoIndex - pageNoIndex);\n\t\t\tsetTimeout(() => callback(resultPagingList), localPagingLoadingTime)\n\t\t},\n\t\t//存储列表缓存数据\n\t\t_saveLocalCache(data) {\n\t\t\tuni.setStorageSync(this.finalCacheKey, data);\n\t\t},\n\t\t//通过缓存数据填充列表数据\n\t\t_setListByLocalCache() {\n\t\t\tthis.totalData = uni.getStorageSync(this.finalCacheKey) || [];\n\t\t\tthis.isSettingCacheList = true;\n\t\t},\n\t\t//修改父view的list\n\t\t_callMyParentList(newVal) {\n\t\t\tif (this.autowireListName.length) {\n\t\t\t\tconst myParent = u.getParent(this.$parent);\n\t\t\t\tif (myParent && myParent[this.autowireListName]) {\n\t\t\t\t\tmyParent[this.autowireListName] = newVal;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//调用父view的query\n\t\t_callMyParentQuery(customPageNo = 0, customPageSize = 0) {\n\t\t\tif (this.autowireQueryName) {\n\t\t\t\tif (this.myParentQuery === -1) {\n\t\t\t\t\tconst myParent = u.getParent(this.$parent);\n\t\t\t\t\tif (myParent && myParent[this.autowireQueryName]) {\n\t\t\t\t\t\tthis.myParentQuery = myParent[this.autowireQueryName];\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\tif (this.myParentQuery !== -1) {\n\t\t\t\t\tif (customPageSize > 0) {\n\t\t\t\t\t\tthis.myParentQuery(customPageNo, customPageSize);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.myParentQuery(this.pageNo, this.defaultPageSize);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//emit query事件\n\t\t_emitQuery(pageNo, pageSize, from){\n\t\t\tthis.queryFrom = from;\n\t\t\tthis.requestTimeStamp = u.getTime();\n\t\t\tthis.$emit('query', ...interceptor._handleQuery(pageNo, pageSize, from));\n\t\t},\n\t\t//触发数据改变promise\n\t\t_callDataPromise(success, totalList) {\n\t\t\tfor (const key in this.dataPromiseResultMap) {\n\t\t\t\tconst obj = this.dataPromiseResultMap[key];\n\t\t\t\tsuccess ? (!!obj && obj.resolve({ totalList, noMore: this.loadingStatus === Enum.More.NoMore })) : (!!obj && obj.reject());\n\t\t\t}\n\t\t},\n\t\t//检查complete data的类型\n\t\t_checkDataType(data, success, isLocal) {\n\t\t\tconst dataType = Object.prototype.toString.call(data);\n\t\t\tif (dataType === '[object Boolean]') {\n\t\t\t\tsuccess = data;\n\t\t\t\tdata = [];\n\t\t\t} else if (dataType === '[object Null]') {\n\t\t\t\tdata = [];\n\t\t\t} else if (dataType !== '[object Array]') {\n\t\t\t\tdata = [];\n\t\t\t\tif (dataType !== '[object Undefined]') {\n\t\t\t\t\tu.consoleErr(`${isLocal ? 'setLocalPaging' : 'complete'}参数类型不正确，第一个参数类型必须为Array!`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {data,success};\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/empty.js",
    "content": "// [z-paging]空数据图view模块\nimport u from '.././z-paging-utils'\n\nexport default {\n\tprops: {\n\t\t//是否强制隐藏空数据图，默认为否\n\t\thideEmptyView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('hideEmptyView', false)\n\t\t},\n\t\t//空数据图描述文字，默认为“没有数据哦~”\n\t\temptyViewText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('emptyViewText', null)\n\t\t},\n\t\t//是否显示空数据图重新加载按钮(无数据时)，默认为否\n\t\tshowEmptyViewReload: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showEmptyViewReload', false)\n\t\t},\n\t\t//加载失败时是否显示空数据图重新加载按钮，默认为是\n\t\tshowEmptyViewReloadWhenError: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showEmptyViewReloadWhenError', true)\n\t\t},\n\t\t//空数据图点击重新加载文字，默认为“重新加载”\n\t\temptyViewReloadText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('emptyViewReloadText', null)\n\t\t},\n\t\t//空数据图图片，默认使用z-paging内置的图片\n\t\temptyViewImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('emptyViewImg', '')\n\t\t},\n\t\t//空数据图“加载失败”描述文字，默认为“很抱歉，加载失败”\n\t\temptyViewErrorText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('emptyViewErrorText', null)\n\t\t},\n\t\t//空数据图“加载失败”图片，默认使用z-paging内置的图片\n\t\temptyViewErrorImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('emptyViewErrorImg', '')\n\t\t},\n\t\t//空数据图样式\n\t\temptyViewStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('emptyViewStyle', {});\n\t\t\t}\n\t\t},\n\t\t//空数据图容器样式\n\t\temptyViewSuperStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('emptyViewSuperStyle', {});\n\t\t\t}\n\t\t},\n\t\t//空数据图img样式\n\t\temptyViewImgStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('emptyViewImgStyle', {});\n\t\t\t}\n\t\t},\n\t\t//空数据图描述文字样式\n\t\temptyViewTitleStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('emptyViewTitleStyle', {});\n\t\t\t}\n\t\t},\n\t\t//空数据图重新加载按钮样式\n\t\temptyViewReloadStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('emptyViewReloadStyle', {});\n\t\t\t}\n\t\t},\n\t\t//空数据图片是否铺满z-paging，默认为是。若设置为否，则为填充满z-paging的剩余部分\n\t\temptyViewFixed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('emptyViewFixed', false)\n\t\t},\n\t\t//空数据图片是否垂直居中，默认为是。emptyViewFixed为false时有效\n\t\temptyViewCenter: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('emptyViewCenter', true)\n\t\t},\n\t\t//加载中时是否自动隐藏空数据图，默认为是\n\t\tautoHideEmptyViewWhenLoading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoHideEmptyViewWhenLoading', true)\n\t\t},\n\t\t//用户下拉列表触发下拉刷新加载中时是否自动隐藏空数据图，默认为是\n\t\tautoHideEmptyViewWhenPull: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoHideEmptyViewWhenPull', true)\n\t\t},\n\t\t//空数据view的z-index，默认为9\n\t\temptyViewZIndex: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('emptyViewZIndex', 9)\n\t\t},\n\t},\n\tcomputed: {\n\t\tfinalEmptyViewImg() {\n\t\t\treturn this.isLoadFailed ? this.emptyViewErrorImg : this.emptyViewImg;\n\t\t},\n\t\tfinalShowEmptyViewReload() {\n\t\t\treturn this.isLoadFailed ? this.showEmptyViewReloadWhenError : this.showEmptyViewReload;\n\t\t},\n\t\tshowEmpty() {\n\t\t\tif (this.refresherOnly || this.hideEmptyView || this.realTotalData.length) return false;\n\t\t\tif (this.autoHideEmptyViewWhenLoading) {\n\t\t\t\tif (this.isAddedData && !this.firstPageLoaded && !this.loading) return true;\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !this.autoHideEmptyViewWhenPull && !this.isUserReload;\n\t\t},\n\t},\n\tmethods: {\n\t\t//点击了空数据view重新加载按钮\n\t\t_emptyViewReload() {\n\t\t\tlet callbacked = false;\n\t\t\tthis.$emit('emptyViewReload', reload => {\n\t\t\t\tif (reload === undefined || reload === true) {\n\t\t\t\t\tthis.fromEmptyViewReload = true;\n\t\t\t\t\tthis.reload();\n\t\t\t\t}\n\t\t\t\tcallbacked = true;\n\t\t\t});\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tif (!callbacked) {\n\t\t\t\t\tthis.fromEmptyViewReload = true;\n\t\t\t\t\tthis.reload();\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t//点击了空数据view\n\t\t_emptyViewClick() {\n\t\t\tthis.$emit('emptyViewClick');\n\t\t},\n\t}\n}"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/i18n.js",
    "content": "// [z-paging]i18n模块\nimport { initVueI18n } from '@dcloudio/uni-i18n'\nimport messages from '../../i18n/index.js'\nconst { t } = initVueI18n(messages)\n\nimport u from '.././z-paging-utils'\nimport c from '.././z-paging-constant'\nimport interceptor from '../z-paging-interceptor'\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tlanguage: uni.getSystemInfoSync().language\n\t\t}\n\t},\n\tcomputed: {\n\t\tfinalLanguage() {\n\t\t\ttry {\n\t\t\t\tconst local = uni.getLocale();\n\t\t\t\tconst language = this.language;\n\t\t\t\treturn local === 'auto' ? interceptor._handleLanguage2Local(language, this._language2Local(language)) : local;\n\t\t\t} catch (e) {\n\t\t\t\treturn 'zh-Hans';\n\t\t\t}\n\t\t},\n\t\tfinalRefresherDefaultText() {\n\t\t\treturn this._getI18nText('zp.refresher.default', this.refresherDefaultText);\n\t\t},\n\t\tfinalRefresherPullingText() {\n\t\t\treturn this._getI18nText('zp.refresher.pulling', this.refresherPullingText);\n\t\t},\n\t\tfinalRefresherRefreshingText() {\n\t\t\treturn this._getI18nText('zp.refresher.refreshing', this.refresherRefreshingText);\n\t\t},\n\t\tfinalRefresherCompleteText() {\n\t\t\treturn this._getI18nText('zp.refresher.complete', this.refresherCompleteText);\n\t\t},\n\t\tfinalRefresherUpdateTimeTextMap() {\n\t\t\treturn {\n\t\t\t\ttitle: t('zp.refresherUpdateTime.title'),\n\t\t\t\tnone: t('zp.refresherUpdateTime.none'),\n\t\t\t\ttoday: t('zp.refresherUpdateTime.today'),\n\t\t\t\tyesterday: t('zp.refresherUpdateTime.yesterday')\n\t\t\t};\n\t\t},\n\t\tfinalLoadingMoreDefaultText() {\n\t\t\treturn this._getI18nText('zp.loadingMore.default', this.loadingMoreDefaultText);\n\t\t},\n\t\tfinalLoadingMoreLoadingText() {\n\t\t\treturn this._getI18nText('zp.loadingMore.loading', this.loadingMoreLoadingText);\n\t\t},\n\t\tfinalLoadingMoreNoMoreText() {\n\t\t\treturn this._getI18nText('zp.loadingMore.noMore', this.loadingMoreNoMoreText);\n\t\t},\n\t\tfinalLoadingMoreFailText() {\n\t\t\treturn this._getI18nText('zp.loadingMore.fail', this.loadingMoreFailText);\n\t\t},\n\t\tfinalEmptyViewText() {\n\t\t\treturn this.isLoadFailed ? this.finalEmptyViewErrorText : this._getI18nText('zp.emptyView.title', this.emptyViewText);\n\t\t},\n\t\tfinalEmptyViewReloadText() {\n\t\t\treturn this._getI18nText('zp.emptyView.reload', this.emptyViewReloadText);\n\t\t},\n\t\tfinalEmptyViewErrorText() {\n\t\t\treturn this._getI18nText('zp.emptyView.error', this.emptyViewErrorText);\n\t\t},\n\t\tfinalSystemLoadingText() {\n\t\t\treturn this._getI18nText('zp.systemLoading.title', this.systemLoadingText);\n\t\t},\n\t},\n\tmethods: {\n\t\t//获取当前z-paging的语言\n\t\tgetLanguage() {\n\t\t\treturn this.finalLanguage;\n\t\t},\n\t\t//获取国际化转换后的文本\n\t\t_getI18nText(key, value) {\n\t\t\tconst dataType = Object.prototype.toString.call(value);\n\t\t\tif (dataType === '[object Object]') {\n\t\t\t\tconst nextValue = value[this.finalLanguage];\n\t\t\t\tif (nextValue) return nextValue;\n\t\t\t} else if (dataType === '[object String]') {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\treturn t(key);\n\t\t},\n\t\t//系统language转i18n local\n\t\t_language2Local(language) {\n\t\t\tconst formatedLanguage = language.toLowerCase().replace(new RegExp('_', ''), '-');\n\t\t\tif (formatedLanguage.indexOf('zh') !== -1) {\n\t\t\t\tif (formatedLanguage === 'zh' || formatedLanguage === 'zh-cn' || formatedLanguage.indexOf('zh-hans') !== -1) {\n\t\t\t\t\treturn 'zh-Hans';\n\t\t\t\t}\n\t\t\t\treturn 'zh-Hant';\n\t\t\t}\n\t\t\tif (formatedLanguage.indexOf('en') !== -1) return 'en';\n\t\t\treturn language;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/load-more.js",
    "content": "// [z-paging]滚动到底部加载更多模块\nimport u from '.././z-paging-utils'\nimport Enum from '.././z-paging-enum'\n\nexport default {\n\tprops: {\n\t\t//自定义底部加载更多样式\n\t\tloadingMoreCustomStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('loadingMoreCustomStyle', {});\n\t\t\t}\n\t\t},\n\t\t//自定义底部加载更多文字样式\n\t\tloadingMoreTitleCustomStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('loadingMoreTitleCustomStyle', {});\n\t\t\t}\n\t\t},\n\t\t//自定义底部加载更多加载中动画样式\n\t\tloadingMoreLoadingIconCustomStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('loadingMoreLoadingIconCustomStyle', {});\n\t\t\t}\n\t\t},\n\t\t//自定义底部加载更多加载中动画图标类型，可选flower或circle，默认为flower\n\t\tloadingMoreLoadingIconType: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('loadingMoreLoadingIconType', 'flower')\n\t\t},\n\t\t//自定义底部加载更多加载中动画图标图片\n\t\tloadingMoreLoadingIconCustomImage: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('loadingMoreLoadingIconCustomImage', '')\n\t\t},\n\t\t//底部加载更多加载中view是否展示旋转动画，默认为是\n\t\tloadingMoreLoadingAnimated: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('loadingMoreLoadingAnimated', true)\n\t\t},\n\t\t//是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据)，默认为是\n\t\tloadingMoreEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('loadingMoreEnabled', true)\n\t\t},\n\t\t//是否启用滑动到底部加载更多数据，默认为是\n\t\ttoBottomLoadingMoreEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('toBottomLoadingMoreEnabled', true)\n\t\t},\n\t\t//滑动到底部状态为默认状态时，以加载中的状态展示，默认为否。若设置为是，可避免滚动到底部看到默认状态然后立刻变为加载中状态的问题，但分页数量未超过一屏时，不会显示【点击加载更多】\n\t\tloadingMoreDefaultAsLoading: {\n\t\t\ttype: [Boolean],\n\t\t\tdefault: u.gc('loadingMoreDefaultAsLoading', false)\n\t\t},\n\t\t//滑动到底部\"默认\"文字，默认为【点击加载更多】\n\t\tloadingMoreDefaultText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('loadingMoreDefaultText', null)\n\t\t},\n\t\t//滑动到底部\"加载中\"文字，默认为【正在加载...】\n\t\tloadingMoreLoadingText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('loadingMoreLoadingText', null)\n\t\t},\n\t\t//滑动到底部\"没有更多\"文字，默认为【没有更多了】\n\t\tloadingMoreNoMoreText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('loadingMoreNoMoreText', null)\n\t\t},\n\t\t//滑动到底部\"加载失败\"文字，默认为【加载失败，点击重新加载】\n\t\tloadingMoreFailText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('loadingMoreFailText', null)\n\t\t},\n\t\t//当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view，默认为否\n\t\thideNoMoreInside: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('hideNoMoreInside', false)\n\t\t},\n\t\t//当没有更多数据且分页数组长度少于这个值时，隐藏没有更多数据的view，默认为0，代表不限制。\n\t\thideNoMoreByLimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('hideNoMoreByLimit', 0)\n\t\t},\n\t\t//是否显示默认的加载更多text，默认为是\n\t\tshowDefaultLoadingMoreText: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showDefaultLoadingMoreText', true)\n\t\t},\n\t\t//是否显示没有更多数据的view\n\t\tshowLoadingMoreNoMoreView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showLoadingMoreNoMoreView', true)\n\t\t},\n\t\t//是否显示没有更多数据的分割线，默认为是\n\t\tshowLoadingMoreNoMoreLine: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showLoadingMoreNoMoreLine', true)\n\t\t},\n\t\t//自定义底部没有更多数据的分割线样式\n\t\tloadingMoreNoMoreLineCustomStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('loadingMoreNoMoreLineCustomStyle', {});\n\t\t\t},\n\t\t},\n\t\t//当分页未满一屏时，是否自动加载更多，默认为否(nvue无效)\n\t\tinsideMore: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('insideMore', false)\n\t\t},\n\t\t//距底部/右边多远时（单位px），触发 scrolltolower 事件，默认为100rpx\n\t\tlowerThreshold: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('lowerThreshold', '100rpx')\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tM: Enum.More,\n\t\t\t//底部加载更多状态\n\t\t\tloadingStatus: Enum.More.Default,\n\t\t\tloadingStatusAfterRender: Enum.More.Default,\n\t\t\tloadingMoreTimeStamp: 0,\n\t\t\tloadingMoreDefaultSlot: null,\n\t\t\tshowLoadingMore: false,\n\t\t\tcustomNoMore: -1,\n\t\t}\n\t},\n\tcomputed: {\n\t\tzLoadMoreConfig() {\n\t\t\treturn {\n\t\t\t\tstatus: this.loadingStatusAfterRender,\n\t\t\t\tdefaultAsLoading: this.loadingMoreDefaultAsLoading,\n\t\t\t\tdefaultThemeStyle: this.finalLoadingMoreThemeStyle,\n\t\t\t\tcustomStyle: this.loadingMoreCustomStyle,\n\t\t\t\ttitleCustomStyle: this.loadingMoreTitleCustomStyle,\n\t\t\t\ticonCustomStyle: this.loadingMoreLoadingIconCustomStyle,\n\t\t\t\tloadingIconType: this.loadingMoreLoadingIconType,\n\t\t\t\tloadingIconCustomImage: this.loadingMoreLoadingIconCustomImage,\n\t\t\t\tloadingAnimated: this.loadingMoreLoadingAnimated,\n\t\t\t\tshowNoMoreLine: this.showLoadingMoreNoMoreLine,\n\t\t\t\tnoMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle,\n\t\t\t\tdefaultText: this.finalLoadingMoreDefaultText,\n\t\t\t\tloadingText: this.finalLoadingMoreLoadingText,\n\t\t\t\tnoMoreText: this.finalLoadingMoreNoMoreText,\n\t\t\t\tfailText: this.finalLoadingMoreFailText,\n\t\t\t\thideContent: !this.loadingMoreDefaultAsLoading && this.listRendering,\n\t\t\t};\n\t\t},\n\t\tfinalLoadingMoreThemeStyle() {\n\t\t\treturn this.loadingMoreThemeStyle.length ? this.loadingMoreThemeStyle : this.defaultThemeStyle;\n\t\t},\n\t\tshowLoadingMoreDefault() {\n\t\t\treturn this._showLoadingMore('Default');\n\t\t},\n\t\tshowLoadingMoreLoading() {\n\t\t\treturn this._showLoadingMore('Loading');\n\t\t},\n\t\tshowLoadingMoreNoMore() {\n\t\t\treturn this._showLoadingMore('NoMore');\n\t\t},\n\t\tshowLoadingMoreFail() {\n\t\t\treturn this._showLoadingMore('Fail');\n\t\t},\n\t\tshowLoadingMoreCustom() {\n\t\t\treturn this._showLoadingMore('Custom');\n\t\t}\n\t},\n\tmethods: {\n\t\t//页面滚动到底部时通知z-paging进行进一步处理\n\t\tpageReachBottom() {\n\t\t\t!this.useChatRecordMode && this._onLoadingMore('toBottom');\n\t\t},\n\t\t//手动触发上拉加载更多(非必须，可依据具体需求使用)\n\t\tdoLoadMore(type) {\n\t\t\tthis._onLoadingMore(type);\n\t\t},\n\t\t//通过@scroll事件检测是否滚动到了底部\n\t\t_checkScrolledToBottom(scrollDiff, checked = false) {\n\t\t\tif (this.checkScrolledToBottomTimeOut) {\n\t\t\t\tclearTimeout(this.checkScrolledToBottomTimeOut);\n\t\t\t\tthis.checkScrolledToBottomTimeOut = null;\n\t\t\t}\n\t\t\tif (this.cacheScrollNodeHeight === -1) {\n\t\t\t\tthis._getNodeClientRect('.zp-scroll-view').then((res) => {\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\tlet pageScrollNodeHeight = res[0].height;\n\t\t\t\t\t\tthis.cacheScrollNodeHeight = pageScrollNodeHeight;\n\t\t\t\t\t\tif (scrollDiff - pageScrollNodeHeight <= this.finalLowerThreshold) {\n\t\t\t\t\t\t\tthis._onLoadingMore('toBottom');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (scrollDiff - this.cacheScrollNodeHeight <= this.finalLowerThreshold) {\n\t\t\t\t\tthis._onLoadingMore('toBottom');\n\t\t\t\t} else if (scrollDiff - this.cacheScrollNodeHeight <= 500 && !checked) {\n\t\t\t\t\tthis.checkScrolledToBottomTimeOut = setTimeout(() => {\n\t\t\t\t\t\tthis._getNodeClientRect('.zp-scroll-view', true, true).then((res) => {\n\t\t\t\t\t\t\tthis.oldScrollTop = res[0].scrollTop;\n\t\t\t\t\t\t\tconst newScrollDiff = res[0].scrollHeight - this.oldScrollTop;\n\t\t\t\t\t\t\tthis._checkScrolledToBottom(newScrollDiff, true);\n\t\t\t\t\t\t})\n\t\t\t\t\t}, 150)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//触发加载更多时调用,from:0-滑动到底部触发；1-点击加载更多触发\n\t\t_onLoadingMore(from = 'click') {\n\t\t\tif (from === 'toBottom' && !this.scrollToBottomBounceEnabled && this.scrollEnable) {\n\t\t\t\tthis.scrollEnable = false;\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.scrollEnable = true;\n\t\t\t\t})\n\t\t\t}\n\t\t\tthis.$emit('scrolltolower', from);\n\t\t\tif (from === 'toBottom' && (!this.toBottomLoadingMoreEnabled || this.useChatRecordMode)) return;\n\t\t\tif (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === Enum.More.Default || this.loadingStatus === Enum.More.Fail) || this.loading) return;\n\t\t\t// #ifdef MP-WEIXIN\n\t\t\tif (!this.isIos && !this.refresherOnly && !this.usePageScroll) {\n\t\t\t\tconst currentTimestamp = u.getTime();\n\t\t\t\tif (this.loadingMoreTimeStamp > 0 && currentTimestamp - this.loadingMoreTimeStamp < 100) {\n\t\t\t\t\tthis.loadingMoreTimeStamp = 0;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t\tthis._doLoadingMore();\n\t\t},\n\t\t//处理开始加载更多\n\t\t_doLoadingMore() {\n\t\t\tif (this.pageNo >= this.defaultPageNo && this.loadingStatus !== Enum.More.NoMore) {\n\t\t\t\tthis.pageNo ++;\n\t\t\t\tthis._startLoading(false);\n\t\t\t\tif (this.isLocalPaging) {\n\t\t\t\t\tthis._localPagingQueryList(this.pageNo, this.defaultPageSize, this.localPagingLoadingTime, res => {\n\t\t\t\t\t\tthis.completeByTotal(res, this.totalLocalPagingList.length);\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tthis._emitQuery(this.pageNo, this.defaultPageSize, Enum.QueryFrom.LoadingMore);\n\t\t\t\t\tthis._callMyParentQuery();\n\t\t\t\t}\n\t\t\t\tthis.loadingType = Enum.LoadingType.LoadingMore;\n\t\t\t}\n\t\t},\n\t\t//(预处理)判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view\n\t\t_preCheckShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode) {\n\t\t\tif (this.loadingStatus === Enum.More.NoMore && this.hideNoMoreByLimit > 0 && newVal.length) {\n\t\t\t\tthis.showLoadingMore = newVal.length > this.hideNoMoreByLimit;\n\t\t\t} else if ((this.loadingStatus === Enum.More.NoMore && this.hideNoMoreInside && newVal.length) || (this.insideMore && this.insideOfPaging !== false && newVal.length)) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis._checkShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode);\n\t\t\t\t})\n\t\t\t\tif (this.insideMore && this.insideOfPaging !== false && newVal.length) {\n\t\t\t\t\tthis.showLoadingMore = newVal.length;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.showLoadingMore = newVal.length;\n\t\t\t}\n\t\t},\n\t\t//判断当没有更多数据且分页内容未超出z-paging时是否显示没有更多数据的view\n\t\tasync _checkShowNoMoreInside(totalData, oldScrollViewNode, oldPagingContainerNode) {\n\t\t\ttry {\n\t\t\t\tconst scrollViewNode = oldScrollViewNode || await this._getNodeClientRect('.zp-scroll-view');\n\t\t\t\tif (this.usePageScroll) {\n\t\t\t\t\tif (scrollViewNode) {\n\t\t\t\t\t\tconst scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height;\n\t\t\t\t\t\tthis.insideOfPaging = scrollViewTotalH < this.windowHeight;\n\t\t\t\t\t\tif (this.hideNoMoreInside) {\n\t\t\t\t\t\t\tthis.showLoadingMore = !this.insideOfPaging;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._updateInsideOfPaging();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst pagingContainerNode = oldPagingContainerNode || await this._getNodeClientRect('.zp-paging-container-content');\n\t\t\t\t\tconst pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0;\n\t\t\t\t\tconst scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0;\n\t\t\t\t\tthis.insideOfPaging = pagingContainerH < scrollViewH;\n\t\t\t\t\tif (this.hideNoMoreInside) {\n\t\t\t\t\t\tthis.showLoadingMore = !this.insideOfPaging;\n\t\t\t\t\t}\n\t\t\t\t\tthis._updateInsideOfPaging();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.insideOfPaging = !totalData.length;\n\t\t\t\tif (this.hideNoMoreInside) {\n\t\t\t\t\tthis.showLoadingMore = !this.insideOfPaging;\n\t\t\t\t}\n\t\t\t\tthis._updateInsideOfPaging();\n\t\t\t}\n\t\t},\n\t\t//是否要展示上拉加载更多view\n\t\t_showLoadingMore(type) {\n\t\t\tif (!this.showLoadingMoreWhenReload && (!(this.loadingStatus === Enum.More.Default ? this.nShowBottom : true) || !this.realTotalData.length)) return false;\n\t\t\tif (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading) && !this.showLoadingMore) || \n\t\t\t(!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading)) || this.refresherOnly) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this.useChatRecordMode && type !== 'Loading') return false;\n\t\t\tif (!this.$slots) return false;\n\t\t\tif (type === 'Custom') {\n\t\t\t\treturn this.showDefaultLoadingMoreText && !(this.loadingStatus === Enum.More.NoMore && !this.showLoadingMoreNoMoreView);\n\t\t\t}\n\t\t\tconst res = this.loadingStatus === Enum.More[type] && this.$slots[`loadingMore${type}`] && (type === 'NoMore' ? this.showLoadingMoreNoMoreView : true);\n\t\t\tif (res) {\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tif (!this.isIos) {\n\t\t\t\t\tthis.nLoadingMoreFixedHeight = false;\n\t\t\t\t}\n\t\t\t\t//  #endif\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/loading.js",
    "content": "// [z-paging]loading相关模块\nimport u from '.././z-paging-utils'\nimport Enum from '.././z-paging-enum'\n\nexport default {\n\tprops: {\n\t\t//第一次加载后自动隐藏loading slot，默认为是\n\t\tautoHideLoadingAfterFirstLoaded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoHideLoadingAfterFirstLoaded', true)\n\t\t},\n\t\t//loading slot是否铺满屏幕并固定，默认为否\n\t\tloadingFullFixed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('loadingFullFixed', false)\n\t\t},\n\t\t//是否自动显示系统Loading：即uni.showLoading，若开启则将在刷新列表时(调用reload、refresh时)显示，下拉刷新和滚动到底部加载更多不会显示，默认为false。\n\t\tautoShowSystemLoading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoShowSystemLoading', false)\n\t\t},\n\t\t//显示系统Loading时是否显示透明蒙层，防止触摸穿透，默认为是(H5、App、微信小程序、百度小程序有效)\n\t\tsystemLoadingMask: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('systemLoadingMask', true)\n\t\t},\n\t\t//显示系统Loading时显示的文字，默认为\"加载中\"\n\t\tsystemLoadingText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('systemLoadingText', null)\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tloadingForNow: false,\n\t\t}\n\t},\n\twatch: {\n\t\tloadingStatus(newVal) {\n\t\t\tthis.$emit('loadingStatusChange', newVal);\n\t\t\tthis.$nextTick(()=>{\n\t\t\t\tthis.loadingStatusAfterRender = newVal;\n\t\t\t})\n\t\t\t// #ifdef APP-NVUE\n\t\t\tif (this.useChatRecordMode) {\n\t\t\t\tif (this.pageNo === this.defaultPageNo && newVal === Enum.More.NoMore) {\n\t\t\t\t\tthis.nIsFirstPageAndNoMore = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.nIsFirstPageAndNoMore = false;\n\t\t\t//  #endif\n\t\t},\n\t\tloading(newVal){\n\t\t\tif (newVal) {\n\t\t\t\tthis.loadingForNow = newVal;\n\t\t\t}\n\t\t},\n\t},\n\tcomputed: {\n\t\tshowLoading() {\n\t\t\tif (this.firstPageLoaded || !this.loading || !this.loadingForNow) return false;\n\t\t\tif (this.finalShowSystemLoading){\n\t\t\t\tuni.showLoading({\n\t\t\t\t\ttitle: this.finalSystemLoadingText,\n\t\t\t\t\tmask: this.systemLoadingMask\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn this.autoHideLoadingAfterFirstLoaded ? (this.fromEmptyViewReload ? true : !this.pagingLoaded) : this.loadingType === Enum.LoadingType.Refresher;\n\t\t},\n\t\tfinalShowSystemLoading() {\n\t\t\treturn this.autoShowSystemLoading && this.loadingType === Enum.LoadingType.Refresher;\n\t\t}\n\t},\n\tmethods: {\n\t\t//处理开始加载更多状态\n\t\t_startLoading(isReload = false) {\n\t\t\tif ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) {\n\t\t\t\tthis.loadingStatus = Enum.More.Loading;\n\t\t\t}\n\t\t\tthis.loading = true;\n\t\t},\n\t\t//停止系统loading和refresh\n\t\t_endSystemLoadingAndRefresh(){\n\t\t\tthis.finalShowSystemLoading && uni.hideLoading();\n\t\t\t!this.useCustomRefresher && uni.stopPullDownRefresh();\n\t\t\t// #ifdef APP-NVUE\n\t\t\tthis.usePageScroll && uni.stopPullDownRefresh();\n\t\t\t// #endif\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/nvue.js",
    "content": "// [z-paging]nvue独有部分模块\nimport u from '.././z-paging-utils'\nimport c from '.././z-paging-constant'\nimport Enum from '.././z-paging-enum'\n\n// #ifdef APP-NVUE\nconst weexAnimation = weex.requireModule('animation');\n// #endif\nexport default {\n\tprops: {\n\t\t// #ifdef APP-NVUE\n\t\t//nvue中修改列表类型，可选值有list、waterfall和scroller，默认为list\n\t\tnvueListIs: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('nvueListIs', 'list')\n\t\t},\n\t\t//nvue waterfall配置，仅在nvue中且nvueListIs=waterfall时有效，配置参数详情参见：https://uniapp.dcloud.io/component/waterfall\n\t\tnvueWaterfallConfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('nvueWaterfallConfig', {});\n\t\t\t}\n\t\t},\n\t\t//nvue 控制是否回弹效果，iOS不支持动态修改\n\t\tnvueBounce: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('nvueBounce', true)\n\t\t},\n\t\t//nvue中通过代码滚动到顶部/底部时，是否加快动画效果(无滚动动画时无效)，默认为否\n\t\tnvueFastScroll: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('nvueFastScroll', false)\n\t\t},\n\t\t//nvue中list的id\n\t\tnvueListId: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('nvueListId', '')\n\t\t},\n\t\t//nvue中refresh组件的样式\n\t\tnvueRefresherStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('nvueRefresherStyle', {});\n\t\t\t}\n\t\t},\n\t\t//nvue中是否按分页模式(类似竖向swiper)显示List，默认为false\n\t\tnvuePagingEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('nvuePagingEnabled', false)\n\t\t},\n\t\t//是否隐藏nvue列表底部的tagView，此view用于标识滚动到底部位置，若隐藏则滚动到底部功能将失效，在nvue中实现吸顶+swiper功能时需将最外层z-paging的此属性设置为true。默认为否\n\t\thideNvueBottomTag: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('hideNvueBottomTag', false)\n\t\t},\n\t\t//nvue中控制onscroll事件触发的频率：表示两次onscroll事件之间列表至少滚动了10px。注意，将该值设置为较小的数值会提高滚动事件采样的精度，但同时也会降低页面的性能\n\t\toffsetAccuracy: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('offsetAccuracy', 10)\n\t\t},\n\t\t// #endif\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnRefresherLoading: false,\n\t\t\tnListIsDragging: false,\n\t\t\tnShowBottom: true,\n\t\t\tnFixFreezing: false,\n\t\t\tnShowRefresherReveal: false,\n\t\t\tnIsFirstPageAndNoMore: false,\n\t\t\tnFirstPageAndNoMoreChecked: false,\n\t\t\tnLoadingMoreFixedHeight: false,\n\t\t\tnShowRefresherRevealHeight: 0,\n\t\t\tnOldShowRefresherRevealHeight: -1,\n\t\t\tnRefresherWidth: uni.upx2px(750),\n\t\t}\n\t},\n\twatch: {\n\t\tnIsFirstPageAndNoMore: {\n\t\t\thandler(newVal) {\n\t\t\t\tconst cellStyle = !this.useChatRecordMode || newVal ? {} : { transform: 'rotate(180deg)' };\n\t\t\t\tthis.$emit('update:cellStyle', cellStyle);\n\t\t\t\tthis.$emit('cellStyleChange', cellStyle);\n\t\t\t},\n\t\t\timmediate: true\n\t\t}\n\t},\n\tcomputed: {\n\t\t// #ifdef APP-NVUE\n\t\tnScopedSlots() {\n\t\t\t// #ifdef VUE2\n\t\t\treturn this.$scopedSlots;\n\t\t\t// #endif\n\t\t\t// #ifdef VUE3\n\t\t\treturn null;\n\t\t\t// #endif\n\t\t},\n\t\tnWaterfallColumnCount() {\n\t\t\tif (this.finalNvueListIs !== 'waterfall') return 0;\n\t\t\treturn this._nGetWaterfallConfig('column-count', 2);\n\t\t},\n\t\tnWaterfallColumnWidth() {\n\t\t\treturn this._nGetWaterfallConfig('column-width', 'auto');\n\t\t},\n\t\tnWaterfallColumnGap() {\n\t\t\treturn this._nGetWaterfallConfig('column-gap', 'normal');\n\t\t},\n\t\tnWaterfallLeftGap() {\n\t\t\treturn this._nGetWaterfallConfig('left-gap', 0);\n\t\t},\n\t\tnWaterfallRightGap() {\n\t\t\treturn this._nGetWaterfallConfig('right-gap', 0);\n\t\t},\n\t\tnViewIs() {\n\t\t\tconst is = this.finalNvueListIs;\n\t\t\treturn is === 'scroller' || is === 'view' ? 'view' : is === 'waterfall' ? 'header' : 'cell';\n\t\t},\n\t\tnSafeAreaBottomHeight() {\n\t\t\treturn this.safeAreaInsetBottom ? this.safeAreaBottom : 0;\n\t\t},\n\t\tnChatRecordRotateStyle() {\n\t\t\treturn this.useChatRecordMode ? { transform: this.nIsFirstPageAndNoMore ? 'rotate(0deg)' : 'rotate(180deg)' } : {};\n\t\t},\n\t\tfinalNvueListIs() {\n\t\t\tif (this.usePageScroll) return 'view';\n\t\t\tconst nvueListIsLowerCase = this.nvueListIs.toLowerCase();\n\t\t\tif (['list','waterfall','scroller'].indexOf(nvueListIsLowerCase) !== -1) return nvueListIsLowerCase;\n\t\t\treturn 'list';\n\t\t},\n\t\tfinalNvueSuperListIs() {\n\t\t\treturn this.usePageScroll ? 'view' : 'scroller';\n\t\t},\n\t\tfinalNvueRefresherEnabled() {\n\t\t\treturn this.finalNvueListIs !== 'view' && this.finalRefresherEnabled && !this.nShowRefresherReveal && !this.useChatRecordMode;\n\t\t},\n\t\t// #endif\n\t},\n\tmounted(){\n\t\t// #ifdef APP-NVUE\n\t\t//旋转屏幕时更新宽度\n\t\tuni.onWindowResize((res) => {\n\t\t\t// this._nUpdateRefresherWidth();\n\t\t})\n\t\t// #endif\n\t},\n\tmethods: {\n\t\t// #ifdef APP-NVUE\n\t\t//列表滚动时触发\n\t\t_nOnScroll(e) {\n\t\t\tthis.$emit('scroll', e);\n\t\t\tconst contentOffsetY = -e.contentOffset.y;\n\t\t\tthis.oldScrollTop = contentOffsetY;\n\t\t\tthis.nListIsDragging = e.isDragging;\n\t\t\tthis._checkShouldShowBackToTop(contentOffsetY, contentOffsetY - 1);\n\t\t},\n\t\t//下拉刷新刷新中\n\t\t_nOnRrefresh() {\n\t\t\tif (this.nShowRefresherReveal) return;\n\t\t\tthis.nRefresherLoading = true;\n\t\t\tthis.refresherStatus = Enum.Refresher.Loading;\n\t\t\tthis._doRefresherLoad();\n\t\t},\n\t\t//下拉刷新下拉中\n\t\t_nOnPullingdown(e) {\n\t\t\tif (this.refresherStatus === Enum.Refresher.Loading || (this.isIos && !this.nListIsDragging)) return;\n\t\t\tthis._emitTouchmove(e);\n\t\t\tconst { viewHeight, pullingDistance } = e;\n\t\t\tthis.refresherStatus = pullingDistance >= viewHeight ? Enum.Refresher.ReleaseToRefresh : Enum.Refresher.Default;\n\t\t},\n\t\t//下拉刷新结束\n\t\t_nRefresherEnd(doEnd = true) {\n\t\t\tif (doEnd) {\n\t\t\t   this._nDoRefresherEndAnimation(0, -this.nShowRefresherRevealHeight); \n\t\t\t   !this.usePageScroll && this.$refs['zp-n-list'].resetLoadmore();\n\t\t\t   this.nRefresherLoading = false;\n\t\t\t}\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tsetTimeout(()=> {\n\t\t\t\t\tthis.nShowBottom = true;\n\t\t\t\t}, 10);\n\t\t\t})\n\t\t},\n\t\t//执行主动触发下拉刷新动画\n\t\t_nDoRefresherEndAnimation(height, translateY, animate = true, checkStack = true) {\n\t\t\tthis._cleanRefresherCompleteTimeout();\n\t\t\tthis._cleanRefresherEndTimeout();\n\t\t\t\n\t\t\tif (!this.finalShowRefresherWhenReload) {\n\t\t\t\tthis.refresherEndTimeout = setTimeout(() => {\n\t\t\t\t\tthis.refresherStatus = Enum.Refresher.Default;\n\t\t\t\t}, this.refresherCompleteDuration);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst stackCount = this.refresherRevealStackCount;\n\t\t\tif (height === 0 && checkStack) {\n\t\t\t\tthis.refresherRevealStackCount --;\n\t\t\t\tif (stackCount > 1) return;\n\t\t\t\tthis.refresherEndTimeout = setTimeout(() => {\n\t\t\t\t\tthis.refresherStatus = Enum.Refresher.Default;\n\t\t\t\t}, this.refresherCompleteDuration);\n\t\t\t}\n\t\t\tif (stackCount > 1) {\n\t\t\t\tthis.refresherStatus = Enum.Refresher.Loading;\n\t\t\t}\n\t\t\t\n\t\t\tconst duration = animate ? 200 : 0;\n\t\t\tif (this.nOldShowRefresherRevealHeight !== height) {\n\t\t\t\tif (height > 0) {\n\t\t\t\t\tthis.nShowRefresherReveal = true;\n\t\t\t\t}\n\t\t\t\tweexAnimation.transition(this.$refs['zp-n-list-refresher-reveal'], {\n\t\t\t\t\tstyles: {\n\t\t\t\t\t\theight: `${height}px`,\n\t\t\t\t\t\ttransform: `translateY(${translateY}px)`,\n\t\t\t\t\t},\n\t\t\t\t\tduration,\n\t\t\t\t\ttimingFunction: 'linear',\n\t\t\t\t\tneedLayout: true,\n\t\t\t\t\tdelay: 0\n\t\t\t\t})\n\t\t\t}\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (animate) {\n\t\t\t\t\tthis.nShowRefresherReveal = height > 0;\n\t\t\t\t}\n\t\t\t}, duration > 0 ? duration - 60 : 0);\n\t\t\tthis.nOldShowRefresherRevealHeight = height;\n\t\t},\n\t\t//滚动到底部加载更多\n\t\t_nOnLoadmore() {\n\t\t\tif (this.nShowRefresherReveal || !this.totalData.length) return;\n\t\t\tthis.useChatRecordMode ? this.doChatRecordLoadMore() : this._onLoadingMore('toBottom');\n\t\t},\n\t\t//获取nvue waterfall单项配置\n\t\t_nGetWaterfallConfig(key, defaultValue) {\n\t\t\treturn this.nvueWaterfallConfig[key] || defaultValue;\n\t\t},\n\t\t//更新nvue 下拉刷新view容器的宽度\n\t\t_nUpdateRefresherWidth() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$nextTick(()=>{\n\t\t\t\t\tthis._getNodeClientRect('.zp-n-list').then(node => {\n\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\tthis.nRefresherWidth = node[0].width ? node[0].width : this.nRefresherWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t},c.delayTime)\t\n\t\t}\n\t\t// #endif\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/refresher.js",
    "content": "// [z-paging]下拉刷新view模块\nimport u from '.././z-paging-utils'\nimport c from '.././z-paging-constant'\nimport Enum from '.././z-paging-enum'\n\nexport default {\n\tprops: {\n\t\t//下拉刷新的主题样式，支持black，white，默认black\n\t\trefresherThemeStyle: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherThemeStyle', '')\n\t\t},\n\t\t//自定义下拉刷新中左侧图标的样式\n\t\trefresherImgStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('refresherImgStyle', {});\n\t\t\t}\n\t\t},\n\t\t//自定义下拉刷新中右侧状态描述文字的样式\n\t\trefresherTitleStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('refresherTitleStyle', {});\n\t\t\t}\n\t\t},\n\t\t//自定义下拉刷新中右侧最后更新时间文字的样式(show-refresher-update-time为true时有效)\n\t\trefresherUpdateTimeStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('refresherUpdateTimeStyle', {});\n\t\t\t}\n\t\t},\n\t\t//在微信小程序和QQ小程序中，是否实时监听下拉刷新中进度，默认为否\n\t\twatchRefresherTouchmove: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('watchRefresherTouchmove', false)\n\t\t},\n\t\t//底部加载更多的主题样式，支持black，white，默认black\n\t\tloadingMoreThemeStyle: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('loadingMoreThemeStyle', '')\n\t\t},\n\t\t//是否只使用下拉刷新，设置为true后将关闭mounted自动请求数据、关闭滚动到底部加载更多，强制隐藏空数据图。默认为否\n\t\trefresherOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('refresherOnly', false)\n\t\t},\n\t\t//自定义下拉刷新默认状态下回弹动画时间，单位为毫秒，默认为100毫秒，nvue无效\n\t\trefresherDefaultDuration: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherDefaultDuration', 100)\n\t\t},\n\t\t//自定义下拉刷新结束以后延迟回弹的时间，单位为毫秒，默认为0\n\t\trefresherCompleteDelay: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherCompleteDelay', 0)\n\t\t},\n\t\t//自定义下拉刷新结束回弹动画时间，单位为毫秒，默认为300毫秒(refresherEndBounceEnabled为false时，refresherCompleteDuration为设定值的1/3)，nvue无效\n\t\trefresherCompleteDuration: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherCompleteDuration', 300)\n\t\t},\n\t\t//自定义下拉刷新结束状态下是否允许列表滚动，默认为否\n\t\trefresherCompleteScrollable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('refresherCompleteScrollable', false)\n\t\t},\n\t\t//是否使用自定义的下拉刷新，默认为是，即使用z-paging的下拉刷新。设置为false即代表使用uni scroll-view自带的下拉刷新，h5、App、微信小程序以外的平台不支持uni scroll-view自带的下拉刷新\n\t\tuseCustomRefresher: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useCustomRefresher', true)\n\t\t},\n\t\t//自定义下拉刷新下拉帧率，默认为40，过高可能会出现抖动问题\n\t\trefresherFps: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherFps', 40)\n\t\t},\n\t\t//自定义下拉刷新允许触发的最大下拉角度，默认为40度，当下拉角度小于设定值时，自定义下拉刷新动画不会被触发\n\t\trefresherMaxAngle: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherMaxAngle', 40)\n\t\t},\n\t\t//自定义下拉刷新的角度由未达到最大角度变到达到最大角度时，是否继续下拉刷新手势，默认为否\n\t\trefresherAngleEnableChangeContinued: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('refresherAngleEnableChangeContinued', false)\n\t\t},\n\t\t//自定义下拉刷新默认状态下的文字\n\t\trefresherDefaultText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('refresherDefaultText', null)\n\t\t},\n\t\t//自定义下拉刷新松手立即刷新状态下的文字\n\t\trefresherPullingText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('refresherPullingText', null)\n\t\t},\n\t\t//自定义下拉刷新刷新中状态下的文字\n\t\trefresherRefreshingText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('refresherRefreshingText', null)\n\t\t},\n\t\t//自定义下拉刷新刷新结束状态下的文字\n\t\trefresherCompleteText: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: u.gc('refresherCompleteText', null)\n\t\t},\n\t\t//自定义下拉刷新默认状态下的图片\n\t\trefresherDefaultImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherDefaultImg', null)\n\t\t},\n\t\t//自定义下拉刷新松手立即刷新状态下的图片，默认与refresherDefaultImg一致\n\t\trefresherPullingImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherPullingImg', null)\n\t\t},\n\t\t//自定义下拉刷新刷新中状态下的图片\n\t\trefresherRefreshingImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherRefreshingImg', null)\n\t\t},\n\t\t//自定义下拉刷新刷新结束状态下的图片\n\t\trefresherCompleteImg: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherCompleteImg', null)\n\t\t},\n\t\t//是否开启自定义下拉刷新刷新结束回弹效果，默认为是\n\t\trefresherEndBounceEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('refresherEndBounceEnabled', true)\n\t\t},\n\t\t//是否开启自定义下拉刷新，默认为是\n\t\trefresherEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('refresherEnabled', true)\n\t\t},\n\t\t//设置自定义下拉刷新阈值，默认为80rpx\n\t\trefresherThreshold: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherThreshold', '80rpx')\n\t\t},\n\t\t//设置系统下拉刷新默认样式，支持设置 black，white，none，none 表示不使用默认样式，默认为black\n\t\trefresherDefaultStyle: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherDefaultStyle', 'black')\n\t\t},\n\t\t//设置自定义下拉刷新区域背景\n\t\trefresherBackground: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherBackground', 'transparent')\n\t\t},\n\t\t//设置固定的自定义下拉刷新区域背景\n\t\trefresherFixedBackground: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherFixedBackground', 'transparent')\n\t\t},\n\t\t//设置固定的自定义下拉刷新区域高度，默认为0\n\t\trefresherFixedBacHeight: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('refresherFixedBacHeight', 0)\n\t\t},\n\t\t//设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例，范围0-1，值越大代表衰减越多。默认为0.65(nvue无效)\n\t\trefresherOutRate: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('refresherOutRate', 0.65)\n\t\t},\n\t\t//设置自定义下拉刷新下拉时实际下拉位移与用户下拉距离的比值，默认为0.75，即代表若用户下拉10px，则实际位移为7.5px(nvue无效)\n\t\trefresherPullRate: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('refresherPullRate', 0.75)\n\t\t},\n\t\t//是否显示最后更新时间，默认为否\n\t\tshowRefresherUpdateTime: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showRefresherUpdateTime', false)\n\t\t},\n\t\t//如果需要区别不同页面的最后更新时间，请为不同页面的z-paging的`refresher-update-time-key`设置不同的字符串\n\t\trefresherUpdateTimeKey: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('refresherUpdateTimeKey', 'default')\n\t\t},\n\t\t//下拉刷新时下拉到“松手立即刷新”状态时是否使手机短振动，默认为否（h5无效）\n\t\trefresherVibrate: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('refresherVibrate', false)\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tR: Enum.Refresher,\n\t\t\t//下拉刷新状态\n\t\t\trefresherStatus: Enum.Refresher.Default,\n\t\t\trefresherTouchstartY: 0,\n\t\t\tlastRefresherTouchmove: null,\n\t\t\trefresherReachMaxAngle: true,\n\t\t\trefresherTransform: 'translateY(0px)',\n\t\t\trefresherTransition: '',\n\t\t\tfinalRefresherDefaultStyle: 'black',\n\t\t\trefresherRevealStackCount: 0,\n\t\t\trefresherCompleteTimeout: null,\n\t\t\trefresherCompleteSubTimeout: null,\n\t\t\trefresherEndTimeout: null,\n\t\t\tisTouchmovingTimeout: null,\n\t\t\trefresherTriggered: false,\n\t\t\tisTouchmoving: false,\n\t\t\tisTouchEnded: false,\n\t\t\tisUserPullDown: false,\n\t\t\tprivateRefresherEnabled: -1,\n\t\t\tprivateShowRefresherWhenReload: false,\n\t\t\tcustomRefresherHeight: -1,\n\t\t\tshowCustomRefresher: false,\n\t\t\tdoRefreshAnimateAfter: false,\n\t\t\tisRefresherInComplete: false,\n\t\t\tpullDownTimeStamp: 0,\n\t\t\tmoveDis: 0,\n\t\t\toldMoveDis: 0,\n\t\t\tcurrentDis: 0,\n\t\t\toldCurrentMoveDis: 0,\n\t\t\toldRefresherTouchmoveY: 0,\n\t\t\toldTouchDirection: '',\n\t\t\toldPullingDistance: -1\n\t\t}\n\t},\n\twatch: {\n\t\trefresherDefaultStyle: {\n\t\t\thandler(newVal) {\n\t\t\t\tif (newVal.length) {\n\t\t\t\t\tthis.finalRefresherDefaultStyle = newVal;\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true\n\t\t},\n\t\trefresherStatus(newVal) {\n\t\t\tnewVal === Enum.Refresher.Loading && this._cleanRefresherEndTimeout();\n\t\t\tthis.refresherVibrate && newVal === Enum.Refresher.ReleaseToRefresh && this._doVibrateShort();\n\t\t\tthis.$emit('refresherStatusChange', newVal);\n\t\t\tthis.$emit('update:refresherStatus', newVal);\n\t\t}\n\t},\n\tcomputed: {\n\t\tpullDownDisTimeStamp() {\n\t\t\treturn 1000 / this.refresherFps;\n\t\t},\n\t\tfinalRefresherEnabled() {\n\t\t\tif (this.useChatRecordMode) return false;\n\t\t\tif (this.privateRefresherEnabled === -1) return this.refresherEnabled;\n\t\t\treturn this.privateRefresherEnabled === 1;\n\t\t},\n\t\tfinalRefresherThreshold() {\n\t\t\tlet refresherThreshold = this.refresherThreshold;\n\t\t\tlet idDefault = false;\n\t\t\tif (refresherThreshold === '80rpx') {\n\t\t\t\tidDefault = true;\n\t\t\t\tif (this.showRefresherUpdateTime) {\n\t\t\t\t\trefresherThreshold = '120rpx';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (idDefault && this.customRefresherHeight > 0) return this.customRefresherHeight;\n\t\t\treturn u.convertToPx(refresherThreshold);\n\t\t},\n\t\tfinalRefresherFixedBacHeight() {\n\t\t\treturn u.convertToPx(this.refresherFixedBacHeight);\n\t\t},\n\t\tfinalRefresherThemeStyle() {\n\t\t\treturn this.refresherThemeStyle.length ? this.refresherThemeStyle : this.defaultThemeStyle;\n\t\t},\n\t\tfinalRefresherOutRate() {\n\t\t\tlet rate = this.refresherOutRate;\n\t\t\trate = Math.max(0,rate);\n\t\t\trate = Math.min(1,rate);\n\t\t\treturn rate;\n\t\t},\n\t\tfinalRefresherPullRate() {\n\t\t\tlet rate = this.refresherPullRate;\n\t\t\trate = Math.max(0,rate);\n\t\t\treturn rate;\n\t\t},\n\t\tfinalRefresherTransform() {\n\t\t\tif (this.refresherTransform === 'translateY(0px)') return 'none';\n\t\t\treturn this.refresherTransform;\n\t\t},\n\t\tfinalShowRefresherWhenReload() {\n\t\t\treturn this.showRefresherWhenReload || this.privateShowRefresherWhenReload;\n\t\t},\n\t\tfinalRefresherTriggered() {\n\t\t\tif (!(this.finalRefresherEnabled && !this.useCustomRefresher)) return false;\n\t\t\treturn this.refresherTriggered;\n\t\t},\n\t\tshowRefresher() {\n\t\t\tconst showRefresher = this.finalRefresherEnabled && this.useCustomRefresher;\n\t\t\t// #ifndef APP-NVUE\n\t\t\tif (this.customRefresherHeight === -1 && showRefresher) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$nextTick(()=>{\n\t\t\t\t\t\tthis._updateCustomRefresherHeight();\n\t\t\t\t\t})\n\t\t\t\t}, c.delayTime)\n\t\t\t}\n\t\t\t// #endif\n\t\t\treturn showRefresher;\n\t\t},\n\t\thasTouchmove(){\n\t\t\t// #ifdef VUE2\n\t\t\t// #ifdef APP-VUE || H5\n\t\t\tif (this.$listeners && !this.$listeners.refresherTouchmove) return false;\n\t\t\t// #endif\n\t\t\t// #ifdef MP-WEIXIN || MP-QQ\n\t\t\treturn this.watchRefresherTouchmove;\n\t\t\t// #endif\n\t\t\treturn true;\n\t\t\t// #endif\n\t\t\treturn this.watchRefresherTouchmove;\n\t\t},\n\t},\n\tmethods: {\n\t\t//终止下拉刷新状态\n\t\tendRefresh(){\n\t\t\tthis.totalData = this.realTotalData;\n\t\t\tthis._refresherEnd();\n\t\t\tthis._endSystemLoadingAndRefresh();\n\t\t},\n\t\thandleRefresherStatusChanged(func) {\n\t\t\tthis.refresherStatusChangedFunc = func;\n\t\t},\n\t\t//自定义下拉刷新被触发\n\t\t_onRefresh(fromScrollView = false,isUserPullDown = true) {\n\t\t\tif (fromScrollView && !(this.finalRefresherEnabled && !this.useCustomRefresher)) return;\n\t\t\tthis.$emit('onRefresh');\n\t\t\tthis.$emit('Refresh');\n\t\t\t// #ifdef APP-NVUE\n\t\t\tif (this.loading) {\n\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\tthis._nRefresherEnd();\n\t\t\t\t},500)\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// #endif\n\t\t\tif (this.loading || this.isRefresherInComplete) return;\n\t\t\tthis.loadingType = Enum.LoadingType.Refresher;\n\t\t\tif (this.nShowRefresherReveal) return;\n\t\t\tthis.isUserPullDown = isUserPullDown;\n\t\t\tthis.isUserReload = !isUserPullDown;\n\t\t\tthis._startLoading(true);\n\t\t\tthis.refresherTriggered = true;\n\t\t\tif(this.reloadWhenRefresh && isUserPullDown){\n\t\t\t\tthis.useChatRecordMode ? this._onLoadingMore('click') : this._reload(false, false, isUserPullDown);\n\t\t\t}\n\t\t},\n\t\t//自定义下拉刷新被复位\n\t\t_onRestore() {\n\t\t\tthis.refresherTriggered = 'restore';\n\t\t\tthis.$emit('onRestore');\n\t\t\tthis.$emit('Restore');\n\t\t},\n\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t//拖拽开始\n\t\t_refresherTouchstart(e) {\n\t\t\tthis._handleListTouchstart();\n\t\t\tif (this._touchDisabled()) return;\n\t\t\tconst touch = u.getTouch(e);\n\t\t\tthis._handleRefresherTouchstart(touch);\n\t\t},\n\t\t// #endif\n\t\t//进一步处理拖拽开始结果\n\t\t_handleRefresherTouchstart(touch) {\n\t\t\tif (!this.loading && this.isTouchEnded) {\n\t\t\t\tthis.isTouchmoving = false;\n\t\t\t}\n\t\t\tthis.loadingType = Enum.LoadingType.Refresher;\n\t\t\tthis.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout);\n\t\t\tthis.isTouchEnded = false;\n\t\t\tthis.refresherTransition = '';\n\t\t\tthis.refresherTouchstartY = touch.touchY;\n\t\t\tthis.$emit('refresherTouchstart', this.refresherTouchstartY);\n\t\t\tthis.lastRefresherTouchmove = touch;\n\t\t\tthis._cleanRefresherCompleteTimeout();\n\t\t\tthis._cleanRefresherEndTimeout();\n\t\t},\n\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t//拖拽中\n\t\t_refresherTouchmove(e) {\n\t\t\tconst currentTimeStamp = u.getTime();\n\t\t\tlet touch = null;\n\t\t\tlet refresherTouchmoveY = 0;\n\t\t\tif (this.watchTouchDirectionChange) {\n\t\t\t\ttouch = u.getTouch(e);\n\t\t\t\trefresherTouchmoveY = touch.touchY;\n\t\t\t\tconst direction  = refresherTouchmoveY > this.oldRefresherTouchmoveY ? 'top' : 'bottom';\n\t\t\t\tdirection === this.oldTouchDirection && this._handleTouchDirectionChange({direction});\n\t\t\t\tthis.oldTouchDirection = direction;\n\t\t\t\tthis.oldRefresherTouchmoveY = refresherTouchmoveY;\n\t\t\t}\n\t\t\tif (this.pullDownTimeStamp && currentTimeStamp - this.pullDownTimeStamp <= this.pullDownDisTimeStamp) return;\n\t\t\tif (this._touchDisabled()) return;\n\t\t\tthis.pullDownTimeStamp = Number(currentTimeStamp);\n\t\t\ttouch = u.getTouch(e);\n\t\t\trefresherTouchmoveY = touch.touchY;\n\t\t\tlet moveDis = refresherTouchmoveY - this.refresherTouchstartY;\n\t\t\tif (moveDis < 0) return;\n\t\t\tif (this.refresherMaxAngle >= 0 && this.refresherMaxAngle <= 90 && this.lastRefresherTouchmove && this.lastRefresherTouchmove.touchY <= refresherTouchmoveY) {\n\t\t\t\tif (!moveDis && !this.refresherAngleEnableChangeContinued && this.moveDis < 1 && !this.refresherReachMaxAngle) return;\n\t\t\t\tconst x = Math.abs(touch.touchX - this.lastRefresherTouchmove.touchX);\n\t\t\t\tconst y = Math.abs(refresherTouchmoveY - this.lastRefresherTouchmove.touchY);\n\t\t\t\tconst z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n\t\t\t\tif ((x || y) && x > 1) {\n\t\t\t\t\tconst angle = Math.asin(y / z) / Math.PI * 180;\n\t\t\t\t\tif (angle < this.refresherMaxAngle) {\n\t\t\t\t\t\tthis.lastRefresherTouchmove = touch;\n\t\t\t\t\t\tthis.refresherReachMaxAngle = false;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmoveDis = this._getFinalRefresherMoveDis(moveDis);\n\t\t\tthis._handleRefresherTouchmove(moveDis, touch);\n\t\t\tif (!this.disabledBounce) {\n\t\t\t\tif(this.isIos){\n\t\t\t\t\t// #ifndef MP-LARK\n\t\t\t\t\tthis._handleScrollViewDisableBounce({ bounce: false });\n\t\t\t\t\t// #endif\n\t\t\t\t}\n\t\t\t\tthis.disabledBounce = true;\n\t\t\t}\n\t\t\tthis._emitTouchmove({ pullingDistance: moveDis, dy: this.moveDis - this.oldMoveDis });\n\t\t},\n\t\t// #endif\n\t\t//进一步处理拖拽中结果\n\t\t_handleRefresherTouchmove(moveDis, touch) {\n\t\t\tthis.refresherReachMaxAngle = true;\n\t\t\tthis.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout);\n\t\t\tthis.isTouchmoving = true;\n\t\t\tthis.isTouchEnded = false;\n\t\t\tthis.refresherStatus = moveDis >= this.finalRefresherThreshold ? Enum.Refresher.ReleaseToRefresh : this.refresherStatus = Enum.Refresher.Default;\n\t\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5\n\t\t\t// this.scrollEnable = false;\n\t\t\tthis.refresherTransform = `translateY(${moveDis}px)`;\n\t\t\tthis.lastRefresherTouchmove = touch;\n\t\t\t// #endif\n\t\t\tthis.moveDis = moveDis;\n\t\t},\n\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t//拖拽结束\n\t\t_refresherTouchend(e) {\n\t\t\tif (this._touchDisabled() || !this.isTouchmoving) return;\n\t\t\tconst touch = u.getTouch(e);\n\t\t\tlet refresherTouchendY = touch.touchY;\n\t\t\tlet moveDis = refresherTouchendY - this.refresherTouchstartY;\n\t\t\tmoveDis = this._getFinalRefresherMoveDis(moveDis);\n\t\t\tthis._handleRefresherTouchend(moveDis);\n\t\t\tthis._handleScrollViewDisableBounce({bounce: true});\n\t\t\tthis.disabledBounce = false;\n\t\t},\n\t\t// #endif\n\t\t//进一步处理拖拽结束结果\n\t\t_handleRefresherTouchend(moveDis) {\n\t\t\t// #ifndef APP-PLUS || H5 || MP-WEIXIN\n\t\t\tif (!this.isTouchmoving) return;\n\t\t\t// #endif\n\t\t\tthis.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout);\n\t\t\tthis.refresherReachMaxAngle = true;\n\t\t\tthis.isTouchEnded = true;\n\t\t\tconst refresherThreshold = this.finalRefresherThreshold;\n\t\t\tif (moveDis >= refresherThreshold && this.refresherStatus === Enum.Refresher.ReleaseToRefresh) {\n\t\t\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t\t\tthis.refresherTransform = `translateY(${refresherThreshold}px)`;\n\t\t\t\tthis.refresherTransition = 'transform .1s linear';\n\t\t\t\t// #endif\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._emitTouchmove({ pullingDistance: refresherThreshold, dy: this.moveDis - refresherThreshold });\n\t\t\t\t}, 0.1);\n\t\t\t\tthis.moveDis = refresherThreshold;\n\t\t\t\tthis.refresherStatus = Enum.Refresher.Loading;\n\t\t\t\tthis._doRefresherLoad();\n\t\t\t} else {\n\t\t\t\tthis._refresherEnd();\n\t\t\t\tthis.isTouchmovingTimeout = setTimeout(() => {\n\t\t\t\t\tthis.isTouchmoving = false;\n\t\t\t\t}, this.refresherDefaultDuration);\n\t\t\t}\n\t\t\tthis.scrollEnable = true;\n\t\t\tthis.$emit('refresherTouchend', moveDis);\n\t\t},\n\t\t//处理列表触摸开始事件\n\t\t_handleListTouchstart() {\n\t\t\tif (this.useChatRecordMode && this.autoHideKeyboardWhenChat) {\n\t\t\t\tuni.hideKeyboard();\n\t\t\t\tthis.$emit('hidedKeyboard');\n\t\t\t}\n\t\t},\n\t\t//处理scroll-view bounce是否生效\n\t\t_handleScrollViewDisableBounce({ bounce }) {\n\t\t\tif (!this.usePageScroll && !this.scrollToTopBounceEnabled) {\n\t\t\t\t// #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t\t\tthis.refresherTransition = '';\n\t\t\t\t// #endif\n\t\t\t\tthis.scrollEnable = bounce;\n\t\t\t}\n\t\t},\n\t\t//wxs正在下拉状态改变处理\n\t\t_handleWxsPullingDownStatusChange(onPullingDown) {\n\t\t\tthis.wxsOnPullingDown = onPullingDown;\n\t\t\tif (onPullingDown && !this.useChatRecordMode) {\n\t\t\t\tthis.renderPropScrollTop = 0;\n\t\t\t}\n\t\t},\n\t\t//wxs正在下拉处理\n\t\t_handleWxsPullingDown({ moveDis, diffDis }){\n\t\t\tthis._emitTouchmove({ pullingDistance: moveDis,dy: diffDis });\n\t\t},\n\t\t//wxs触摸方向改变\n\t\t_handleTouchDirectionChange({ direction }) {\n\t\t\tthis.$emit('touchDirectionChange',direction);\n\t\t},\n\t\t//wxs通知更新其props\n\t\t_handlePropUpdate(){\n\t\t\tthis.wxsPropType = u.getTime().toString();\n\t\t},\n\t\t//下拉刷新结束\n\t\t_refresherEnd(shouldEndLoadingDelay = true, fromAddData = false, isUserPullDown = false, setLoading = true) {\n\t\t\tif (this.loadingType === Enum.LoadingType.Refresher) {\n\t\t\t\tconst refresherCompleteDelay = (fromAddData && (isUserPullDown || this.showRefresherWhenReload)) ? this.refresherCompleteDelay : 0;\n\t\t\t\tconst refresherStatus = refresherCompleteDelay > 0 ? Enum.Refresher.Complete : Enum.Refresher.Default;\n\t\t\t\tif (this.finalShowRefresherWhenReload) {\n\t\t\t\t\tconst stackCount = this.refresherRevealStackCount;\n\t\t\t\t\tthis.refresherRevealStackCount --;\n\t\t\t\t\tif (stackCount > 1) return;\n\t\t\t\t}\n\t\t\t\tthis._cleanRefresherEndTimeout();\n\t\t\t\tthis.refresherEndTimeout = setTimeout(() => {\n\t\t\t\t\tthis.refresherStatus = refresherStatus;\n\t\t\t\t}, this.refresherStatus !== Enum.Refresher.Default && refresherStatus === Enum.Refresher.Default ? this.refresherCompleteDuration : 0);\n\t\t\t\t\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tif (refresherCompleteDelay > 0) {\n\t\t\t\t\tthis.isRefresherInComplete = true;\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t\tthis._cleanRefresherCompleteTimeout();\n\t\t\t\tthis.refresherCompleteTimeout = setTimeout(() => {\n\t\t\t\t\tlet animateDuration = 1;\n\t\t\t\t\tconst animateType = this.refresherEndBounceEnabled && fromAddData ? 'cubic-bezier(0.19,1.64,0.42,0.72)' : 'linear';\n\t\t\t\t\tif (fromAddData) {\n\t\t\t\t\t\tanimateDuration = this.refresherEndBounceEnabled ? this.refresherCompleteDuration / 1000 : this.refresherCompleteDuration / 3000;\n\t\t\t\t\t}\n\t\t\t\t\tthis.refresherTransition = `transform ${fromAddData ? animateDuration : this.refresherDefaultDuration / 1000}s ${animateType}`;\n\t\t\t\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5\n\t\t\t\t\tthis.refresherTransform = 'translateY(0px)';\n\t\t\t\t\tthis.currentDis = 0;\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t\t\t\tthis.wxsPropType = this.refresherTransition + 'end' + u.getTime();\n\t\t\t\t\t// #endif\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tthis._nRefresherEnd();\n\t\t\t\t\t// #endif\n\t\t\t\t\tthis.moveDis = 0;\n\t\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\t\tif (refresherStatus === Enum.Refresher.Complete) {\n\t\t\t\t\t\tif (this.refresherCompleteSubTimeout) {\n\t\t\t\t\t\t\tclearTimeout(this.refresherCompleteSubTimeout);\n\t\t\t\t\t\t\tthis.refresherCompleteSubTimeout = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.refresherCompleteSubTimeout = setTimeout(() => {\n\t\t\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\t\t\tthis.refresherStatus = Enum.Refresher.Default;\n\t\t\t\t\t\t\t\tthis.isRefresherInComplete = false;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, animateDuration * 800);\n\t\t\t\t\t}\n\t\t\t\t\t// #endif\n\t\t\t\t\tthis._emitTouchmove({ pullingDistance: 0, dy: this.moveDis });\n\t\t\t\t}, refresherCompleteDelay);\n\t\t\t}\n\t\t\tif (setLoading) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t}, shouldEndLoadingDelay ? c.delayTime : 0);\n\t\t\t\tisUserPullDown && this._onRestore();\n\t\t\t}\n\t\t},\n\t\t//模拟用户手动触发下拉刷新\n\t\t_doRefresherRefreshAnimate() {\n\t\t\tthis._cleanRefresherCompleteTimeout();\n\t\t\t// #ifndef APP-NVUE\n\t\t\tconst doRefreshAnimateAfter = !this.doRefreshAnimateAfter && (this.finalShowRefresherWhenReload) && this\n\t\t\t\t.customRefresherHeight === -1 && this.refresherThreshold === '80rpx';\n\t\t\tif (doRefreshAnimateAfter) {\n\t\t\t\tthis.doRefreshAnimateAfter = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// #endif\n\t\t\tthis.refresherRevealStackCount ++;\n\t\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5\n\t\t\tthis.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`;\n\t\t\t// #endif\n\t\t\t// #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t\tthis.wxsPropType = 'begin' + u.getTime();\n\t\t\t// #endif\n\t\t\tthis.moveDis = this.finalRefresherThreshold;\n\t\t\tthis.refresherStatus = Enum.Refresher.Loading;\n\t\t\tthis.isTouchmoving = true;\n\t\t\tthis.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout);\n\t\t\tthis._doRefresherLoad(false);\n\t\t},\n\t\t//触发下拉刷新\n\t\t_doRefresherLoad(isUserPullDown = true) {\n\t\t\tthis._onRefresh(false,isUserPullDown);\n\t\t\tthis.loading = true;\n\t\t},\n\t\t// #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5\n\t\t//获取处理后的moveDis\n\t\t_getFinalRefresherMoveDis(moveDis) {\n\t\t\tlet diffDis = moveDis - this.oldCurrentMoveDis;\n\t\t\tthis.oldCurrentMoveDis = moveDis;\n\t\t\tif (diffDis > 0) {\n\t\t\t\tdiffDis = diffDis * this.finalRefresherPullRate;\n\t\t\t\tif (this.currentDis > this.finalRefresherThreshold) {\n\t\t\t\t\tdiffDis = diffDis * (1 - this.finalRefresherOutRate);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdiffDis = diffDis > 100 ? diffDis / 100 : diffDis;\n\t\t\tthis.currentDis += diffDis;\n\t\t\tthis.currentDis = Math.max(0, this.currentDis);\n\t\t\treturn this.currentDis;\n\t\t},\n\t\t//判断touch手势是否要触发\n\t\t_touchDisabled() {\n\t\t\tconst checkOldScrollTop = this.oldScrollTop > 5;\n\t\t\treturn this.loading || this.isRefresherInComplete || this.useChatRecordMode || !this.refresherEnabled || !this.useCustomRefresher ||(this.usePageScroll && this.useCustomRefresher && this.pageScrollTop > 10) || (!(this.usePageScroll && this.useCustomRefresher) && checkOldScrollTop);\n\t\t},\n\t\t// #endif\n\t\t//更新自定义下拉刷新view高度\n\t\t_updateCustomRefresherHeight() {\n\t\t\tthis._getNodeClientRect('.zp-custom-refresher-slot-view').then((res) => {\n\t\t\t\tthis.customRefresherHeight = res ? res[0].height : 0;\n\t\t\t\tthis.showCustomRefresher = this.customRefresherHeight > 0;\n\t\t\t\tif (this.doRefreshAnimateAfter) {\n\t\t\t\t\tthis.doRefreshAnimateAfter = false;\n\t\t\t\t\tthis._doRefresherRefreshAnimate();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t//发射pullingDown事件\n\t\t_emitTouchmove(e) {\n\t\t\t// #ifndef APP-NVUE\n\t\t\te.viewHeight = this.finalRefresherThreshold;\n\t\t\t// #endif\n\t\t\te.rate = e.viewHeight > 0 ? e.pullingDistance / e.viewHeight : 0;\n\t\t\tthis.hasTouchmove && this.oldPullingDistance !== e.pullingDistance && this.$emit('refresherTouchmove', e);\n\t\t\tthis.oldPullingDistance = e.pullingDistance;\n\t\t},\n\t\t//清除refresherCompleteTimeout\n\t\t_cleanRefresherCompleteTimeout() {\n\t\t\tthis.refresherCompleteTimeout = this._cleanTimeout(this.refresherCompleteTimeout);\n\t\t\t// #ifdef APP-NVUE\n\t\t\tthis._nRefresherEnd(false);\n\t\t\t// #endif\n\t\t},\n\t\t//清除refresherEndTimeout\n\t\t_cleanRefresherEndTimeout() {\n\t\t\tthis.refresherEndTimeout = this._cleanTimeout(this.refresherEndTimeout);\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/scroller.js",
    "content": "// [z-paging]scroll相关模块\nimport u from '.././z-paging-utils'\nimport Enum from '.././z-paging-enum'\n\n// #ifdef APP-NVUE\nconst weexDom = weex.requireModule('dom');\n// #endif\nexport default {\n\tprops: {\n\t\t//使用页面滚动，默认为否，当设置为是时则使用页面的滚动而非此组件内部的scroll-view的滚动，使用页面滚动时z-paging无需设置确定的高度且对于长列表展示性能更高，但配置会略微繁琐\n\t\tusePageScroll: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('usePageScroll', false)\n\t\t},\n\t\t//是否可以滚动，使用内置scroll-view和nvue时有效，默认为是\n\t\tscrollable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('scrollable', true)\n\t\t},\n\t\t//控制是否出现滚动条，默认为是\n\t\tshowScrollbar: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('showScrollbar', true)\n\t\t},\n\t\t//是否允许横向滚动，默认为否\n\t\tscrollX: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('scrollX', false)\n\t\t},\n\t\t//iOS设备上滚动到顶部时是否允许回弹效果，默认为否。关闭回弹效果后可使滚动到顶部与下拉刷新更连贯，但是有吸顶view时滚动到顶部时可能出现抖动。\n\t\tscrollToTopBounceEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('scrollToTopBounceEnabled', false)\n\t\t},\n\t\t//iOS设备上滚动到底部时是否允许回弹效果，默认为是。\n\t\tscrollToBottomBounceEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('scrollToBottomBounceEnabled', true)\n\t\t},\n\t\t//在设置滚动条位置时使用动画过渡，默认为否\n\t\tscrollWithAnimation: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('scrollWithAnimation', false)\n\t\t},\n\t\t//值应为某子元素id（id不能以数字开头）。设置哪个方向可滚动，则在哪个方向滚动到该元素\n\t\tscrollIntoView: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('scrollIntoView', '')\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tscrollTop: 0,\n\t\t\toldScrollTop: 0,\n\t\t\tscrollViewStyle: {},\n\t\t\tscrollViewContainerStyle: {},\n\t\t\tscrollViewInStyle: {},\n\t\t\tpageScrollTop: -1,\n\t\t\tscrollEnable: true,\n\t\t\tprivateScrollWithAnimation: -1,\n\t\t\tcacheScrollNodeHeight: -1\n\t\t}\n\t},\n\twatch: {\n\t\toldScrollTop(newVal) {\n\t\t\t!this.usePageScroll && this._scrollTopChange(newVal,false);\n\t\t},\n\t\tpageScrollTop(newVal) {\n\t\t\tthis.usePageScroll && this._scrollTopChange(newVal,true);\n\t\t},\n\t\tusePageScroll: {\n\t\t\thandler(newVal) {\n\t\t\t\tthis.loaded && this.autoHeight && this._setAutoHeight(!newVal);\n\t\t\t\t// #ifdef H5\n\t\t\t\tif (newVal) {\n\t\t\t\t\tthis.$nextTick(()=>{\n\t\t\t\t\t\tconst mainScrollRef = this.$refs['zp-scroll-view'].$refs.main;\n\t\t\t\t\t\tif (mainScrollRef) {\n\t\t\t\t\t\t\tmainScrollRef.style = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t},\n\t\t\timmediate: true\n\t\t},\n\t\tfinalScrollTop(newVal) {\n\t\t\tif (!this.useChatRecordMode) {\n\t\t\t\tthis.renderPropScrollTop = newVal < 6 ? 0 : 10;\n\t\t\t}\n\t\t},\n\t},\n\tcomputed: {\n\t\tfinalScrollWithAnimation() {\n\t\t\tif (this.privateScrollWithAnimation !== -1) {\n\t\t\t\tconst scrollWithAnimation = this.privateScrollWithAnimation === 1;\n\t\t\t\tthis.privateScrollWithAnimation = -1;\n\t\t\t\treturn scrollWithAnimation;\n\t\t\t}\n\t\t\treturn this.scrollWithAnimation;\n\t\t},\n\t\tfinalScrollViewStyle() {\n\t\t\tif (this.superContentZIndex != 1) {\n\t\t\t\tthis.scrollViewStyle['z-index'] = this.superContentZIndex;\n\t\t\t\tthis.scrollViewStyle['position'] = 'relative';\n\t\t\t}\n\t\t\treturn this.scrollViewStyle;\n\t\t},\n\t\tfinalScrollTop() {\n\t\t\treturn this.usePageScroll ? this.pageScrollTop : this.oldScrollTop;\n\t\t},\n\t\tfinalIsOldWebView() {\n\t\t\treturn this.isOldWebView && !this.usePageScroll;\n\t\t}\n\t},\n\tmethods: {\n\t\t//滚动到顶部，animate为是否展示滚动动画，默认为是\n\t\tscrollToTop(animate, checkReverse = true) {\n\t\t\t// #ifdef APP-NVUE\n\t\t\tif (checkReverse && this.useChatRecordMode) {\n\t\t\t\tif(!this.nIsFirstPageAndNoMore){\n\t\t\t\t\tthis.scrollToBottom(animate, false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._scrollToTop(animate, false);\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tif (this.nvueFastScroll && animate) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._scrollToTop(false, false);\n\t\t\t\t\t}, 150);\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t})\n\t\t},\n\t\t//滚动到底部，animate为是否展示滚动动画，默认为是\n\t\tscrollToBottom(animate, checkReverse = true) {\n\t\t\t// #ifdef APP-NVUE\n\t\t\tif (checkReverse && this.useChatRecordMode) {\n\t\t\t\tif(!this.nIsFirstPageAndNoMore){\n\t\t\t\t\tthis.scrollToTop(animate, false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// #endif\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._scrollToBottom(animate);\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tif (this.nvueFastScroll && animate) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._scrollToBottom(false);\n\t\t\t\t\t}, 150);\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t})\n\t\t},\n\t\t//滚动到指定view(vue中有效)。sel为需要滚动的view的id值，不包含\"#\"；offset为偏移量，单位为px；animate为是否展示滚动动画，默认为否\n\t\tscrollIntoViewById(sel, offset, animate) {\n\t\t\tthis._scrollIntoView(sel, offset, animate);\n\t\t},\n\t\t//滚动到指定view(vue中有效)。nodeTop为需要滚动的view的top值(通过uni.createSelectorQuery()获取)；offset为偏移量，单位为px；animate为是否展示滚动动画，默认为否\n\t\tscrollIntoViewByNodeTop(nodeTop, offset, animate) {\n\t\t\tthis.scrollTop = this.oldScrollTop;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._scrollIntoViewByNodeTop(nodeTop, offset, animate);\n\t\t\t})\n\t\t},\n\t\t//滚动到指定位置(vue中有效)。y为与顶部的距离，单位为px；offset为偏移量，单位为px；animate为是否展示滚动动画，默认为否\n\t\tscrollToY(y, offset, animate) {\n\t\t\tthis.scrollTop = this.oldScrollTop;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._scrollToY(y, offset, animate);\n\t\t\t})\n\t\t},\n\t\t//滚动到指定view(nvue中有效)。index为需要滚动的view的index(第几个)；offset为偏移量，单位为px；animate为是否展示滚动动画，默认为否\n\t\tscrollIntoViewByIndex(index, offset, animate) {\n\t\t\tthis._scrollIntoView(index, offset, animate);\n\t\t},\n\t\t//滚动到指定view(nvue中有效)。view为需要滚动的view(通过`this.$refs.xxx`获取)，不包含\"#\"；offset为偏移量，单位为px；animate为是否展示滚动动画，默认为否\n\t\tscrollIntoViewByView(view, offset, animate) {\n\t\t\tthis._scrollIntoView(view, offset, animate);\n\t\t},\n\t\t//当使用页面滚动并且自定义下拉刷新时，请在页面的onPageScroll中调用此方法，告知z-paging当前的pageScrollTop，否则会导致在任意位置都可以下拉刷新\n\t\tupdatePageScrollTop(value) {\n\t\t\tthis.pageScrollTop = value;\n\t\t},\n\t\t//当使用页面滚动并且设置了slot=\"top\"时，默认初次加载会自动获取其高度，并使内部容器下移，当slot=\"top\"的view高度动态改变时，在其高度需要更新时调用此方法\n\t\tupdatePageScrollTopHeight() {\n\t\t\tthis._updatePageScrollTopOrBottomHeight('top');\n\t\t},\n\t\t//当使用页面滚动并且设置了slot=\"bottom\"时，默认初次加载会自动获取其高度，并使内部容器下移，当slot=\"bottom\"的view高度动态改变时，在其高度需要更新时调用此方法\n\t\tupdatePageScrollBottomHeight() {\n\t\t\tthis._updatePageScrollTopOrBottomHeight('bottom');\n\t\t},\n\t\t//更新slot=\"left\"和slot=\"right\"宽度，当slot=\"left\"或slot=\"right\"宽度动态改变时调用\n\t\tupdateLeftAndRightWidth() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._updateLeftAndRightWidth();\n\t\t\t})\n\t\t},\n\t\t//更新z-paging内置scroll-view的scrollTop\n\t\tupdateScrollViewScrollTop(scrollTop, animate = true) {\n\t\t\tthis.privateScrollWithAnimation = animate ? 1 : 0;\n\t\t\tthis.scrollTop = this.oldScrollTop;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.scrollTop = scrollTop;\n\t\t\t\tthis.oldScrollTop = this.scrollTop;\n\t\t\t});\n\t\t},\n\t\t\n\t\t//当滚动到顶部时\n\t\t_onScrollToUpper() {\n\t\t\tthis.$emit('scrolltoupper');\n\t\t\tthis.$emit('scrollTopChange', 0);\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.oldScrollTop = 0;\n\t\t\t})\n\t\t\tif (!this.useChatRecordMode) return;\n\t\t\tif (this.loadingStatus === Enum.More.NoMore) return;\n\t\t\tthis._onLoadingMore('click');\n\t\t},\n\t\t//当滚动到底部时\n\t\t_onScrollToLower(e) {\n\t\t\t(!e.detail || !e.detail.direction || e.detail.direction === 'bottom') && this._onLoadingMore('toBottom')\n\t\t},\n\t\t//滚动到顶部\n\t\t_scrollToTop(animate = true, isPrivate = true) {\n\t\t\t// #ifdef APP-NVUE\n\t\t\tconst el = this.$refs['zp-n-list-top-tag'];\n\t\t\tif (this.usePageScroll) {\n\t\t\t\tthis._getNodeClientRect('zp-page-scroll-top', false).then(node => {\n\t\t\t\t\tconst nodeHeight = node ? node[0].height : 0;\n\t\t\t\t\tweexDom.scrollToElement(el, {\n\t\t\t\t\t\toffset: -nodeHeight,\n\t\t\t\t\t\tanimated: animate\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (!this.isIos && this.nvueListIs === 'scroller') {\n\t\t\t\t\tthis._getNodeClientRect('zp-n-refresh-container', false).then(node => {\n\t\t\t\t\t\tconst nodeHeight = node ? node[0].height : 0;\n\t\t\t\t\t\tweexDom.scrollToElement(el, {\n\t\t\t\t\t\t\toffset: -nodeHeight,\n\t\t\t\t\t\t\tanimated: animate\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tweexDom.scrollToElement(el, {\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\tanimated: animate\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t\t// #endif\n\t\t\tif (this.usePageScroll) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tuni.pageScrollTo({\n\t\t\t\t\t\tscrollTop: 0,\n\t\t\t\t\t\tduration: animate ? 100 : 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.privateScrollWithAnimation = animate ? 1 : 0;\n\t\t\tthis.scrollTop = this.oldScrollTop;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.scrollTop = 0;\n\t\t\t\tthis.oldScrollTop = this.scrollTop;\n\t\t\t});\n\t\t},\n\t\t//滚动到底部\n\t\tasync _scrollToBottom(animate = true) {\n\t\t\t// #ifdef APP-NVUE\n\t\t\tconst el = this.$refs['zp-n-list-bottom-tag'];\n\t\t\tif (el) {\n\t\t\t\tweexDom.scrollToElement(el, {\n\t\t\t\t\toffset: 0,\n\t\t\t\t\tanimated: animate\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tu.consoleErr('滚动到底部失败，因为您设置了hideNvueBottomTag为true');\n\t\t\t}\n\t\t\treturn;\n\t\t\t// #endif\n\t\t\tif (this.usePageScroll) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tuni.pageScrollTo({\n\t\t\t\t\t\tscrollTop: Number.MAX_VALUE,\n\t\t\t\t\t\tduration: animate ? 100 : 0,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tthis.privateScrollWithAnimation = animate ? 1 : 0;\n\t\t\t\tconst pagingContainerNode = await this._getNodeClientRect('.zp-paging-container');\n\t\t\t\tconst scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');\n\t\t\t\tconst pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0;\n\t\t\t\tconst scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0;\n\t\t\t\tif (pagingContainerH > scrollViewH) {\n\t\t\t\t\tthis.scrollTop = this.oldScrollTop;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.scrollTop = pagingContainerH - scrollViewH + this.virtualPlaceholderTopHeight;\n\t\t\t\t\t\tthis.oldScrollTop = this.scrollTop;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\t//滚动到指定view\n\t\t_scrollIntoView(sel, offset = 0, animate = false, finishCallback) {\n\t\t\ttry {\n\t\t\t\tthis.scrollTop = this.oldScrollTop;\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\t\tconst refs = this.$parent.$refs;\n\t\t\t\t\tif (!refs) return;\n\t\t\t\t\tconst dataType = Object.prototype.toString.call(sel);\n\t\t\t\t\tlet el = null;\n\t\t\t\t\tif (dataType === '[object Number]') {\n\t\t\t\t\t\tconst els = refs[`z-paging-${sel}`];\n\t\t\t\t\t\tel = els ? els[0] : null;\n\t\t\t\t\t} else if (dataType === '[object Array]') {\n\t\t\t\t\t\tel = sel[0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel = sel;\n\t\t\t\t\t}\n\t\t\t\t\tif (el) {\n\t\t\t\t\t\tweexDom.scrollToElement(el, {\n\t\t\t\t\t\t\toffset: -offset,\n\t\t\t\t\t\t\tanimated: animate\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tu.consoleErr('在nvue中滚动到指定位置，cell必须设置 :ref=\"`z-paging-${index}`\"');\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t\t// #endif\n\t\t\t\t\tthis._getNodeClientRect('#' + sel.replace('#', ''), this.$parent).then((node) => {\n\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\tlet nodeTop = node[0].top;\n\t\t\t\t\t\t\tthis._scrollIntoViewByNodeTop(nodeTop, offset, animate);\n\t\t\t\t\t\t\tfinishCallback && finishCallback();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} catch (e) {}\n\t\t},\n\t\t//通过nodeTop滚动到指定view\n\t\t_scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) {\n\t\t\tthis._scrollToY(nodeTop, offset, animate, true);\n\t\t},\n\t\t//滚动到指定位置\n\t\t_scrollToY(y, offset = 0, animate = false, addScrollTop = false) {\n\t\t\tthis.privateScrollWithAnimation = animate ? 1 : 0;\n\t\t\tif (this.usePageScroll) {\n\t\t\t\tuni.pageScrollTo({\n\t\t\t\t\tscrollTop: y - offset,\n\t\t\t\t\tduration: animate ? 100 : 0\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif(addScrollTop){\n\t\t\t\t   y += this.oldScrollTop; \n\t\t\t\t}\n\t\t\t\tthis.scrollTop = y - offset;\n\t\t\t\tthis.oldScrollTop = this.scrollTop;\n\t\t\t}\n\t\t},\n\t\t//scroll-view滚动中\n\t\t_scroll(e) {\n\t\t\tthis.$emit('scroll', e);\n\t\t\tconst scrollTop = e.detail.scrollTop;\n\t\t\t// #ifndef APP-NVUE\n\t\t\tthis.finalUseVirtualList && this._updateVirtualScroll(scrollTop, this.oldScrollTop - scrollTop);\n\t\t\t// #endif\n\t\t\tthis.oldScrollTop = scrollTop;\n\t\t\tconst scrollDiff = e.detail.scrollHeight - this.oldScrollTop;\n\t\t\t!this.isIos && this._checkScrolledToBottom(scrollDiff);\n\t\t},\n\t\t//检测scrollView是否要铺满屏幕\n\t\t_doCheckScrollViewShouldFullHeight(totalData) {\n\t\t\tif (this.autoFullHeight && this.usePageScroll && this.isTotalChangeFromAddData) {\n\t\t\t\t// #ifndef APP-NVUE\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis._checkScrollViewShouldFullHeight((scrollViewNode, pagingContainerNode) => {\n\t\t\t\t\t\tthis._preCheckShowNoMoreInside(totalData, scrollViewNode, pagingContainerNode)\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t// #endif\n\t\t\t\t// #ifdef APP-NVUE\n\t\t\t\tthis._preCheckShowNoMoreInside(totalData)\n\t\t\t\t// #endif\n\t\t\t} else {\n\t\t\t\tthis._preCheckShowNoMoreInside(totalData)\n\t\t\t} \n\t\t},\n\t\t//检测z-paging是否要全屏覆盖(当使用页面滚动并且不满全屏时，默认z-paging需要铺满全屏，避免数据过少时内部的empty-view无法正确展示)\n\t\tasync _checkScrollViewShouldFullHeight(callback) {\n\t\t\ttry {\n\t\t\t\tconst scrollViewNode = await this._getNodeClientRect('.zp-scroll-view');\n\t\t\t\tconst pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content');\n\t\t\t\tif (!scrollViewNode || !pagingContainerNode) return;\n\t\t\t\tconst scrollViewHeight = pagingContainerNode[0].height;\n\t\t\t\tconst scrollViewTop = scrollViewNode[0].top;\n\t\t\t\tif (this.isAddedData && scrollViewHeight + scrollViewTop <= this.windowHeight) {\n\t\t\t\t\tthis._setAutoHeight(true, scrollViewNode);\n\t\t\t\t\tcallback(scrollViewNode, pagingContainerNode);\n\t\t\t\t} else {\n\t\t\t\t\tthis._setAutoHeight(false);\n\t\t\t\t\tcallback(null, null);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcallback(null, null);\n\t\t\t}\n\t\t},\n\t\t//scrollTop改变时触发\n\t\t_scrollTopChange(newVal, isPageScrollTop){\n\t\t\tthis.$emit('scrollTopChange', newVal);\n\t\t\tthis.$emit('update:scrollTop', newVal);\n\t\t\tthis._checkShouldShowBackToTop(newVal);\n\t\t\tconst scrollTop = this.isIos ? (newVal > 5 ? 6 : 0) : newVal;\n\t\t\tif (isPageScrollTop) {\n\t\t\t\tthis.wxsPageScrollTop = scrollTop;\n\t\t\t} else {\n\t\t\t\tthis.wxsScrollTop = scrollTop;\n\t\t\t}\n\t\t},\n\t\t//更新使用页面滚动时slot=\"top\"或\"bottom\"插入view的高度\n\t\t_updatePageScrollTopOrBottomHeight(type) {\n\t\t\t// #ifndef APP-NVUE\n\t\t\tif (!this.usePageScroll) return;\n\t\t\t// #endif\n\t\t\tthis._doCheckScrollViewShouldFullHeight(this.realTotalData);\n\t\t\tconst node = `.zp-page-${type}`;\n\t\t\tconst marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`;\n\t\t\tlet safeAreaInsetBottomAdd = this.safeAreaInsetBottom;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tlet delayTime = 0;\n\t\t\t\t// #ifdef MP-BAIDU || APP-NVUE\n\t\t\t\tdelayTime = 50;\n\t\t\t\t// #endif\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._getNodeClientRect(node).then((res) => {\n\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\tlet pageScrollNodeHeight = res[0].height;\n\t\t\t\t\t\t\tif (type === 'bottom') {\n\t\t\t\t\t\t\t\tif (safeAreaInsetBottomAdd) {\n\t\t\t\t\t\t\t\t\tpageScrollNodeHeight += this.safeAreaBottom;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.cacheTopHeight = pageScrollNodeHeight;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.$set(this.scrollViewStyle, marginText, `${pageScrollNodeHeight}px`);\n\t\t\t\t\t\t} else if (safeAreaInsetBottomAdd) {\n\t\t\t\t\t\t\tthis.$set(this.scrollViewStyle, marginText, `${this.safeAreaBottom}px`);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, delayTime)\n\t\t\t})\n\t\t},\n\t\t//获取slot=\"left\"和slot=\"right\"宽度并且更新布局\n\t\t_updateLeftAndRightWidth(){\n\t\t\tif (!this.finalIsOldWebView) return;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tlet delayTime = 0;\n\t\t\t\t// #ifdef MP-BAIDU\n\t\t\t\tdelayTime = 10;\n\t\t\t\t// #endif\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t['left','right'].map(position => {\n\t\t\t\t\t\tthis._getNodeClientRect(`.zp-page-${position}`).then((res) => {\n\t\t\t\t\t\t\tthis.$set(this.scrollViewContainerStyle, position, res ? res[0].width + 'px' : '0px');\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t}, delayTime)\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/modules/virtual-list.js",
    "content": "// [z-paging]虚拟列表模块\nimport u from '.././z-paging-utils'\nimport c from '.././z-paging-constant'\nimport Enum from '.././z-paging-enum'\n\nexport default {\n\tprops: {\n\t\t//是否使用虚拟列表，默认为否\n\t\tuseVirtualList: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useVirtualList', false)\n\t\t},\n\t\t//在使用虚拟列表时，是否使用兼容模式，默认为否\n\t\tuseCompatibilityMode: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useCompatibilityMode', false)\n\t\t},\n\t\t//使用兼容模式时传递的附加数据\n\t\textraData: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('extraData', {});\n\t\t\t}\n\t\t},\n\t\t//是否在z-paging内部循环渲染列表(内置列表)，默认为否。若use-virtual-list为true，则此项恒为true\n\t\tuseInnerList: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useInnerList', false)\n\t\t},\n\t\t//强制关闭inner-list，默认为false，如果为true将强制关闭innerList，适用于开启了虚拟列表后需要强制关闭inner-list的情况\n\t\tforceCloseInnerList: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('forceCloseInnerList', false)\n\t\t},\n\t\t//内置列表cell的key名称，仅nvue有效，在nvue中开启use-inner-list时必须填此项\n\t\tcellKeyName: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('cellKeyName', '')\n\t\t},\n\t\t//innerList样式\n\t\tinnerListStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('innerListStyle', {});\n\t\t\t}\n\t\t},\n\t\t//innerCell样式\n\t\tinnerCellStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('innerCellStyle', {});\n\t\t\t}\n\t\t},\n\t\t//预加载的列表可视范围(列表高度)页数，默认为7，即预加载当前页及上下各7页的cell。此数值越大，则虚拟列表中加载的dom越多，内存消耗越大(会维持在一个稳定值)，但增加预加载页面数量可缓解快速滚动短暂白屏问题\n\t\tpreloadPage: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('preloadPage', 7),\n\t\t\tvalidator: (value) => {\n\t\t\t\tif (value <= 0) u.consoleErr('preload-page必须大于0！');\n\t\t\t\treturn value > 0;\n\t\t\t}\n\t\t},\n\t\t//虚拟列表cell高度模式，默认为fixed，也就是每个cell高度完全相同，将以第一个cell高度为准进行计算。可选值【dynamic】，即代表高度是动态非固定的，【dynamic】性能低于【fixed】。\n\t\tcellHeightMode: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('cellHeightMode', Enum.CellHeightMode.Fixed)\n\t\t},\n\t\t//虚拟列表列数，默认为1。常用于每行有多列的情况，例如每行有2列数据，需要将此值设置为2\n\t\tvirtualListCol: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('virtualListCol', 1)\n\t\t},\n\t\t//虚拟列表scroll取样帧率，默认为80，过低容易出现白屏问题，过高容易出现卡顿问题\n\t\tvirtualScrollFps: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('virtualScrollFps', 80)\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tvirtualListKey: u.getInstanceId(),\n\t\t\tvirtualPageHeight: 0,\n\t\t\tvirtualCellHeight: 0,\n\t\t\tvirtualScrollTimeStamp: 0,\n\t\t\t\n\t\t\tvirtualList: [],\n\t\t\tvirtualPlaceholderTopHeight: 0,\n\t\t\tvirtualPlaceholderBottomHeight: 0,\n\t\t\tvirtualTopRangeIndex: 0,\n\t\t\tvirtualBottomRangeIndex: 0,\n\t\t\tlastVirtualTopRangeIndex: 0,\n\t\t\tlastVirtualBottomRangeIndex: 0,\n\t\t\t\n\t\t\tvirtualHeightCacheList: [],\n\t\t\t\n\t\t\tgetCellHeightRetryCount: {\n\t\t\t\tfixed: 0,\n\t\t\t\tdynamic: 0\n\t\t\t},\n\t\t\tpagingOrgTop: -1,\n\t\t\tupdateVirtualListFromDataChange: false\n\t\t}\n\t},\n\twatch: {\n\t\trealTotalData(newVal) {\n\t\t\t// #ifndef APP-NVUE\n\t\t\tif (this.finalUseVirtualList) {\n\t\t\t\tthis.updateVirtualListFromDataChange = true;\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tif (!newVal.length) {\n\t\t\t\t\t\tthis._resetDynamicListState(!this.isUserPullDown);\n\t\t\t\t\t}\n\t\t\t\t\tthis.getCellHeightRetryCount.fixed = 0;\n\t\t\t\t\tnewVal.length && this.cellHeightMode === Enum.CellHeightMode.Fixed && this.isFirstPage && this._updateFixedCellHeight();\n\t\t\t\t\tthis._updateVirtualScroll(this.oldScrollTop);\n\t\t\t\t})\n\t\t\t}\n\t\t\t// #endif\n\t\t},\n\t\tvirtualList(newVal){\n\t\t\tthis.$emit('update:virtualList', newVal);\n\t\t\tthis.$emit('virtualListChange', newVal);\n\t\t}\n\t},\n\tcomputed: {\n\t\tfinalUseVirtualList() {\n\t\t\tif (this.useVirtualList && this.usePageScroll){\n\t\t\t\tu.consoleErr('使用页面滚动时，开启虚拟列表无效！');\n\t\t\t}\n\t\t\treturn this.useVirtualList && !this.usePageScroll;\n\t\t},\n\t\tfinalUseInnerList() {\n\t\t\treturn this.useInnerList || (this.finalUseVirtualList && !this.forceCloseInnerList);\n\t\t},\n\t\tfinalCellKeyName() {\n\t\t\t// #ifdef APP-NVUE\n\t\t\tif (this.finalUseVirtualList && !this.cellKeyName.length){\n\t\t\t\tu.consoleErr('在nvue中开启use-virtual-list必须设置cell-key-name，否则将可能导致列表渲染错误！');\n\t\t\t}\n\t\t\t// #endif\n\t\t\treturn this.cellKeyName;\n\t\t},\n\t\tfinalVirtualPageHeight(){\n\t\t\treturn this.virtualPageHeight > 0 ? this.virtualPageHeight : this.windowHeight;\n\t\t},\n\t\tvirtualRangePageHeight(){\n\t\t\treturn this.finalVirtualPageHeight * this.preloadPage;\n\t\t},\n\t\tvirtualScrollDisTimeStamp() {\n\t\t\treturn 1000 / this.virtualScrollFps;\n\t\t},\n\t},\n\tmethods: {\n\t\t//在使用动态高度虚拟列表时，手动更新指定cell的缓存高度(当cell高度在初始化之后再次改变时调用)，index代表需要更新的cell在列表中的位置，从0开始\n\t\tdidUpdateVirtualListCell(index) {\n\t\t\tif (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return;\n\t\t\tconst currentNode = this.virtualHeightCacheList[index];\n\t\t\tthis._getNodeClientRect(`#zp-id-${index}`,this.finalUseInnerList).then(cellNode => {\n\t\t\t\tconst cellNodeHeight = cellNode ? cellNode[0].height : 0;\n\t\t\t\t\n\t\t\t\tconst heightDis = cellNodeHeight - currentNode.height;\n\t\t\t\tcurrentNode.height = cellNodeHeight;\n\t\t\t\tcurrentNode.totalHeight = currentNode.lastHeight + cellNodeHeight;\n\t\t\t\t\n\t\t\t\tfor (let i = index + 1; i < this.virtualHeightCacheList.length; i++) {\n\t\t\t\t\tconst thisNode = this.virtualHeightCacheList[i];\n\t\t\t\t\tif (i === index + 1) {\n\t\t\t\t\t\tthisNode.lastHeight = cellNodeHeight;\n\t\t\t\t\t}\n\t\t\t\t\tthisNode.totalHeight += heightDis;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t//在使用动态高度虚拟列表时，若删除了列表数组中的某个item，需要调用此方法以更新高度缓存数组，index代表需要更新的cell在列表中的位置，从0开始\n\t\tdidDeleteVirtualListCell(index) {\n\t\t\tif (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return;\n\t\t\tconst currentNode = this.virtualHeightCacheList[index];\n\t\t\tfor (let i = index + 1; i < this.virtualHeightCacheList.length; i++) {\n\t\t\t\tconst thisNode = this.virtualHeightCacheList[i];\n\t\t\t\tif (i === index + 1) {\n\t\t\t\t\tthisNode.lastHeight = currentNode.lastHeight;\n\t\t\t\t}\n\t\t\t\tthisNode.totalHeight -= currentNode.height;\n\t\t\t}\n\t\t\tthis.virtualHeightCacheList.splice(index, 1);\n\t\t},\n\t\t//初始化虚拟列表\n\t\t_virtualListInit() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._getNodeClientRect('.zp-scroll-view').then(node => {\n\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\tthis.pagingOrgTop = node[0].top;\n\t\t\t\t\t\t\tthis.virtualPageHeight = node[0].height;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, c.delayTime);\n\t\t\t})\n\t\t},\n\t\t//cellHeightMode为fixed时获取第一个cell高度\n\t\t_updateFixedCellHeight() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst updateFixedCellHeightTimeout = setTimeout(() => {\n\t\t\t\t\tthis._getNodeClientRect(`#zp-id-${0}`,this.finalUseInnerList).then(cellNode => {\n\t\t\t\t\t\tif (!cellNode) {\n\t\t\t\t\t\t\tclearTimeout(updateFixedCellHeightTimeout);\n\t\t\t\t\t\t\tif (this.getCellHeightRetryCount.fixed > 10) return;\n\t\t\t\t\t\t\tthis.getCellHeightRetryCount.fixed ++;\n\t\t\t\t\t\t\tthis._updateFixedCellHeight();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.virtualCellHeight = cellNode[0].height;\n\t\t\t\t\t\t\tthis._updateVirtualScroll(this.oldScrollTop);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, c.delayTime);\n\t\t\t})\n\t\t},\n\t\t//cellHeightMode为dynamic时获取每个cell高度\n\t\t_updateDynamicCellHeight(list) {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst updateDynamicCellHeightTimeout = setTimeout(async () => {\n\t\t\t\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\t\t\t\tlet item = list[i];\n\t\t\t\t\t\tconst cellNode = await this._getNodeClientRect(`#zp-id-${item[c.listCellIndexKey]}`, this.finalUseInnerList);\n\t\t\t\t\t\tconst currentHeight = cellNode ? cellNode[0].height : 0;\n\t\t\t\t\t\tif (!cellNode) {\n\t\t\t\t\t\t\tclearTimeout(updateDynamicCellHeightTimeout);\n\t\t\t\t\t\t\tthis.virtualHeightCacheList = this.virtualHeightCacheList.slice(-i);\n\t\t\t\t\t\t\tif (this.getCellHeightRetryCount.dynamic > 10) return;\n\t\t\t\t\t\t\tthis.getCellHeightRetryCount.dynamic ++;\n\t\t\t\t\t\t\tthis._updateDynamicCellHeight(list);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst lastHeightCache = this.virtualHeightCacheList.length ? this.virtualHeightCacheList.slice(-1)[0] : null;\n\t\t\t\t\t\tconst lastHeight = lastHeightCache ? lastHeightCache.totalHeight : 0;\n\t\t\t\t\t\tthis.virtualHeightCacheList.push({\n\t\t\t\t\t\t\theight: currentHeight,\n\t\t\t\t\t\t\tlastHeight,\n\t\t\t\t\t\t\ttotalHeight: lastHeight + currentHeight\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis._updateVirtualScroll(this.oldScrollTop);\n\t\t\t\t}, c.delayTime)\n\t\t\t})\n\t\t},\n\t\t//设置cellItem的index\n\t\t_setCellIndex(list, isFirstPage) {\n\t\t\tlet lastItemIndex = 0;\n\t\t\tif (!isFirstPage) {\n\t\t\t\tlastItemIndex = this.realTotalData.length;\n\t\t\t\tconst lastItem = this.realTotalData.length ? this.realTotalData.slice(-1)[0] : null;\n\t\t\t\tif (lastItem && lastItem[c.listCellIndexKey] !== undefined) {\n\t\t\t\t\tlastItemIndex = lastItem[c.listCellIndexKey] + 1;\n\t\t\t\t}\n\t\t\t} else {\t\t\t\n\t\t\t\tthis._resetDynamicListState();\n\t\t\t}\n\t\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\t\tlet item = list[i];\n\t\t\t\tif (!item || Object.prototype.toString.call(item) !== '[object Object]') {\n\t\t\t\t\titem = {item};\n\t\t\t\t}\n\t\t\t\titem[c.listCellIndexKey] = lastItemIndex + i;\n\t\t\t\titem[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[c.listCellIndexKey]}`;\n\t\t\t\tlist[i] = item;\n\t\t\t}\n\t\t\tthis.getCellHeightRetryCount.dynamic = 0;\n\t\t\tthis.cellHeightMode === Enum.CellHeightMode.Dynamic && this._updateDynamicCellHeight(list);\n\t\t},\n\t\t//更新scroll滚动\n\t\t_updateVirtualScroll(scrollTop, scrollDiff = 0) {\n\t\t\tconst currentTimeStamp = u.getTime();\n\t\t\tscrollTop === 0 && this._resetTopRange();\n\t\t\tif (scrollTop !== 0 && this.virtualScrollTimeStamp && currentTimeStamp - this.virtualScrollTimeStamp <= this.virtualScrollDisTimeStamp) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.virtualScrollTimeStamp = currentTimeStamp;\n\t\t\t\n\t\t\tlet scrollIndex = 0;\n\t\t\tconst cellHeightMode = this.cellHeightMode;\n\t\t\tif (cellHeightMode === Enum.CellHeightMode.Fixed) {\n\t\t\t\tscrollIndex = parseInt(scrollTop / this.virtualCellHeight) || 0;\n\t\t\t\tthis._updateFixedTopRangeIndex(scrollIndex);\n\t\t\t\tthis._updateFixedBottomRangeIndex(scrollIndex);\n\t\t\t} else if(cellHeightMode === Enum.CellHeightMode.Dynamic) {\n\t\t\t\tconst scrollDirection = scrollDiff > 0 ? 'top' : 'bottom';\n\t\t\t\tconst rangePageHeight = this.virtualRangePageHeight;\n\t\t\t\tconst topRangePageOffset = scrollTop - rangePageHeight;\n\t\t\t\tconst bottomRangePageOffset = scrollTop + this.finalVirtualPageHeight + rangePageHeight;\n\t\t\t\t\n\t\t\t\tlet virtualBottomRangeIndex = 0;\n\t\t\t\tlet virtualPlaceholderBottomHeight = 0;\n\t\t\t\tlet reachedLimitBottom = false;\n\t\t\t\tconst heightCacheList = this.virtualHeightCacheList;\n\t\t\t\tconst lastHeightCache = !!heightCacheList ? heightCacheList.slice(-1)[0] : null;\n\t\t\t\t\n\t\t\t\tlet startTopRangeIndex = this.virtualTopRangeIndex;\n\t\t\t\tif (scrollDirection === 'bottom') {\n\t\t\t\t\tfor (let i = startTopRangeIndex; i < heightCacheList.length; i++){\n\t\t\t\t\t\tconst heightCacheItem = heightCacheList[i];\n\t\t\t\t\t\tif (heightCacheItem && heightCacheItem.totalHeight > topRangePageOffset) {\n\t\t\t\t\t\t\tthis.virtualTopRangeIndex = i;\n\t\t\t\t\t\t\tthis.virtualPlaceholderTopHeight = heightCacheItem.lastHeight;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet topRangeMatched = false;\n\t\t\t\t\tfor (let i = startTopRangeIndex; i >= 0; i--){\n\t\t\t\t\t\tconst heightCacheItem = heightCacheList[i];\n\t\t\t\t\t\tif (heightCacheItem && heightCacheItem.totalHeight < topRangePageOffset) {\n\t\t\t\t\t\t\tthis.virtualTopRangeIndex = i;\n\t\t\t\t\t\t\tthis.virtualPlaceholderTopHeight = heightCacheItem.lastHeight;\n\t\t\t\t\t\t\ttopRangeMatched = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t!topRangeMatched && this._resetTopRange();\n\t\t\t\t}\n\t\t\t\tfor (let i = this.virtualTopRangeIndex; i < heightCacheList.length; i++){\n\t\t\t\t\tconst heightCacheItem = heightCacheList[i];\n\t\t\t\t\tif (heightCacheItem && heightCacheItem.totalHeight > bottomRangePageOffset) {\n\t\t\t\t\t\tvirtualBottomRangeIndex = i;\n\t\t\t\t\t\tvirtualPlaceholderBottomHeight = lastHeightCache.totalHeight - heightCacheItem.totalHeight;\n\t\t\t\t\t\treachedLimitBottom = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!reachedLimitBottom || this.virtualBottomRangeIndex === 0) {\n\t\t\t\t\tthis.virtualBottomRangeIndex = this.realTotalData.length ? this.realTotalData.length - 1 : this.pageSize;\n\t\t\t\t\tthis.virtualPlaceholderBottomHeight = 0;\n\t\t\t\t} else {\n\t\t\t\t\tthis.virtualBottomRangeIndex = virtualBottomRangeIndex;\n\t\t\t\t\tthis.virtualPlaceholderBottomHeight = virtualPlaceholderBottomHeight;\n\t\t\t\t}\n\t\t\t\tthis._updateVirtualList();\n\t\t\t}\n\t\t},\n\t\t//更新fixedCell模式下topRangeIndex&placeholderTopHeight\n\t\t_updateFixedTopRangeIndex(scrollIndex) {\n\t\t\tlet virtualTopRangeIndex = this.virtualCellHeight === 0 ? 0 : scrollIndex - parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) * this.preloadPage;\n\t\t\tvirtualTopRangeIndex *= this.virtualListCol;\n\t\t\tvirtualTopRangeIndex = Math.max(0, virtualTopRangeIndex);\n\t\t\tthis.virtualTopRangeIndex = virtualTopRangeIndex;\n\t\t\tthis.virtualPlaceholderTopHeight = (virtualTopRangeIndex / this.virtualListCol) * this.virtualCellHeight;\n\t\t},\n\t\t//更新fixedCell模式下bottomRangeIndex&placeholderBottomHeight\n\t\t_updateFixedBottomRangeIndex(scrollIndex) {\n\t\t\tlet virtualBottomRangeIndex = this.virtualCellHeight === 0 ? this.pageSize : scrollIndex + parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) * (this.preloadPage + 1);\n\t\t\tvirtualBottomRangeIndex *= this.virtualListCol;\n\t\t\tvirtualBottomRangeIndex = Math.min(this.realTotalData.length, virtualBottomRangeIndex);\n\t\t\tthis.virtualBottomRangeIndex = virtualBottomRangeIndex;\n\t\t\tthis.virtualPlaceholderBottomHeight = (this.realTotalData.length - virtualBottomRangeIndex) * this.virtualCellHeight / this.virtualListCol;\n\t\t\tthis._updateVirtualList();\n\t\t},\n\t\t//更新virtualList\n\t\t_updateVirtualList() {\n\t\t\tconst shouldUpdateList = this.updateVirtualListFromDataChange || (this.lastVirtualTopRangeIndex !== this.virtualTopRangeIndex || this.lastVirtualBottomRangeIndex !== this.virtualBottomRangeIndex);\n\t\t\tif (shouldUpdateList) {\n\t\t\t\tthis.updateVirtualListFromDataChange = false;\n\t\t\t\tthis.lastVirtualTopRangeIndex =  this.virtualTopRangeIndex;\n\t\t\t\tthis.lastVirtualBottomRangeIndex = this.virtualBottomRangeIndex;\n\t\t\t\tthis.virtualList = this.realTotalData.slice(this.virtualTopRangeIndex, this.virtualBottomRangeIndex + 1);\n\t\t\t}\n\t\t},\n\t\t//重置动态cell模式下的高度缓存数据、虚拟列表和滚动状态\n\t\t_resetDynamicListState(resetVirtualList = false) {\n\t\t\tthis.virtualHeightCacheList = [];\n\t\t\tif (resetVirtualList) {\n\t\t\t\tthis.virtualList = [];\n\t\t\t}\n\t\t\tthis.virtualTopRangeIndex = 0;\n\t\t\tthis.virtualPlaceholderTopHeight = 0;\n\t\t},\n\t\t//重置topRangeIndex和placeholderTopHeight\n\t\t_resetTopRange() {\n\t\t\tthis.virtualTopRangeIndex = 0;\n\t\t\tthis.virtualPlaceholderTopHeight = 0;\n\t\t\tthis._updateVirtualList();\n\t\t},\n\t\t//检测虚拟列表当前滚动位置，如发现滚动位置不正确则重新计算虚拟列表相关参数(为解决在App中可能出现的长时间进入后台后打开App白屏的问题)\n\t\t_checkVirtualListScroll() {\n\t\t\tif (this.finalUseVirtualList) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis._getNodeClientRect('.zp-paging-touch-view').then(node => {\n\t\t\t\t\t\tconst currentTop = node ? node[0].top : 0;\n\t\t\t\t\t\tif (!node || (currentTop === this.pagingOrgTop && this.virtualPlaceholderTopHeight !== 0)) {\n\t\t\t\t\t\t\tthis._updateVirtualScroll(0);\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\t\t//处理使用内置列表时点击了cell事件\n\t\t_innerCellClick(item, index) {\n\t\t\tthis.$emit('innerCellClick', item, index);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-config.js",
    "content": "// [z-paging]处理main.js中的配置信息工具\n\nlet config = null;\nlet getedStorage = false;\nconst storageKey = 'Z-PAGING-CONFIG-STORAGE-KEY'\n\nfunction setConfig(value) {\n\tuni.setStorageSync(storageKey, value);\n}\n\nfunction getConfig() {\n\tif (getedStorage) return config;\n\tconfig = uni.getStorageSync(storageKey);\n\tgetedStorage = true;\n\treturn config;\n}\n\nexport default {\n\tsetConfig,\n\tgetConfig\n};\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-constant.js",
    "content": "// [z-paging]常量\n\nexport default {\n\tversion: '2.5.3',\n\tdelayTime: 100,\n\terrorUpdateKey: 'z-paging-error-emit',\n\tcompleteUpdateKey: 'z-paging-complete-emit',\n\tcachePrefixKey: 'z-paging-cache',\n\t\n\tlistCellIndexKey: 'zp_index',\n\tlistCellIndexUniqueKey: 'zp_unique_index'\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-enum.js",
    "content": "// [z-paging]枚举\n\nexport default {\n\t//当前加载类型 0.下拉刷新 1.上拉加载更多\n\tLoadingType: {\n\t\tRefresher: 0,\n\t\tLoadingMore: 1\n\t},\n\t//下拉刷新状态 0.默认状态 1.松手立即刷新 2.刷新中 3.刷新结束\n\tRefresher: {\n\t\tDefault: 0,\n\t\tReleaseToRefresh: 1,\n\t\tLoading: 2,\n\t\tComplete: 3\n\t},\n\t//底部加载更多状态 0.默认状态 1.加载中 2.没有更多数据 3.加载失败\n\tMore: {\n\t\tDefault: 0,\n\t\tLoading: 1,\n\t\tNoMore: 2,\n\t\tFail: 3\n\t},\n\t//@query触发来源 0.用户主动下拉刷新 1.通过reload触发 2.通过refresh触发 3.通过滚动到底部加载更多或点击底部加载更多触发\n\tQueryFrom: {\n\t\tUserPullDown: 0,\n\t\tReload: 1,\n\t\tRefresh: 2,\n\t\tLoadingMore: 3\n\t},\n\t//虚拟列表cell高度模式\n\tCellHeightMode: {\n\t\t//固定高度\n\t\tFixed: 'fixed',\n\t\t//动态高度\n\t\tDynamic: 'dynamic'\n\t},\n\t//列表缓存模式\n\tCacheMode: {\n\t\t//默认模式，只会缓存一次\n\t\tDefault: 'default',\n\t\t//总是缓存，每次列表刷新(下拉刷新、调用reload等)都会更新缓存\n\t\tAlways: 'always'\n\t}\n}"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-interceptor.js",
    "content": "// [z-paging]拦截器\n\n//拦截&处理@query事件\nfunction handleQuery(callback) {\n\ttry {\n\t\tsetTimeout(function() {\n\t\t\t_getApp().globalData.zp_handleQueryCallback = callback;\n\t\t}, 1);\n\t} catch (e) {}\n}\n\n//拦截&处理@query事件(私有，请勿调用)\nfunction _handleQuery(pageNo, pageSize, from){\n\tconst handleQueryCallback = _getApp().globalData.zp_handleQueryCallback;\n\tif (handleQueryCallback) {\n\t\treturn handleQueryCallback(pageNo, pageSize, from);\n\t}\n\treturn [pageNo, pageSize, from];\n}\n\n//拦截&处理系统language转i18n local\nfunction handleLanguage2Local(callback) {\n\ttry {\n\t\tsetTimeout(function() {\n\t\t\t_getApp().globalData.zp_handleLanguage2LocalCallback = callback;\n\t\t}, 1);\n\t} catch (e) {}\n}\n\n//拦截&处理系统language转i18n local(私有，请勿调用)\nfunction _handleLanguage2Local(language, local){\n\tconst handleLanguage2LocalCallback = _getApp().globalData.zp_handleLanguage2LocalCallback;\n\tif (handleLanguage2LocalCallback) {\n\t\treturn handleLanguage2LocalCallback(language, local);\n\t}\n\treturn local;\n}\n\n//获取当前app对象\nfunction _getApp(){\n\t// #ifndef APP-NVUE\n\treturn getApp();\n\t// #endif\n\t// #ifdef APP-NVUE\n\treturn getApp({allowDefault: true});\n\t// #endif\n}\n\nexport default {\n\thandleQuery,\n\t_handleQuery,\n\thandleLanguage2Local,\n\t_handleLanguage2Local\n};\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-main.js",
    "content": "// [z-paging]核心js\n\nimport zStatic from './z-paging-static'\nimport c from './z-paging-constant'\nimport u from './z-paging-utils'\n\nimport zPagingRefresh from '../components/z-paging-refresh'\nimport zPagingLoadMore from '../components/z-paging-load-more'\nimport zPagingEmptyView from '../../z-paging-empty-view/z-paging-empty-view'\n\n// modules\nimport dataHandleModule from './modules/data-handle'\nimport i18nModule from './modules/i18n'\nimport nvueModule from './modules/nvue'\nimport emptyModule from './modules/empty'\nimport refresherModule from './modules/refresher'\nimport loadMoreModule from './modules/load-more'\nimport loadingModule from './modules/loading'\nimport scrollerModule from './modules/scroller'\nimport backToTopModule from './modules/back-to-top'\nimport virtualListModule from './modules/virtual-list'\n\nimport Enum from './z-paging-enum'\n\nconst systemInfo = uni.getSystemInfoSync();\n\n// #ifdef APP-NVUE\nconst weexDom = weex.requireModule('dom');\n// #endif\n\nexport default {\n\tname: \"z-paging\",\n\tcomponents: {\n\t\tzPagingRefresh,\n\t\tzPagingLoadMore,\n\t\tzPagingEmptyView\n\t},\n\tmixins: [\n\t\tdataHandleModule,\n\t\ti18nModule,\n\t\tnvueModule,\n\t\temptyModule,\n\t\trefresherModule,\n\t\tloadMoreModule,\n\t\tloadingModule,\n\t\tscrollerModule,\n\t\tbackToTopModule,\n\t\tvirtualListModule\n\t],\n\tdata() {\n\t\treturn {\n\t\t\t//--------------静态资源---------------\n\t\t\tbase64Arrow: zStatic.base64Arrow,\n\t\t\tbase64Flower: zStatic.base64Flower,\n\t\t\tbase64BackToTop: zStatic.base64BackToTop,\n\n\t\t\t//-------------全局数据相关--------------\n\t\t\t//当前加载类型\n\t\t\tloadingType: Enum.LoadingType.Refresher,\n\t\t\trequestTimeStamp: 0,\n\t\t\tchatRecordLoadingMoreText: '',\n\t\t\twxsPropType: '',\n\t\t\trenderPropScrollTop: -1,\n\t\t\tcheckScrolledToBottomTimeOut: null,\n\t\t\tsystemInfo: null,\n\t\t\tcssSafeAreaInsetBottom: -1,\n\t\t\tcacheTopHeight: -1,\n\n\t\t\t//--------------状态&判断---------------\n\t\t\tinsideOfPaging: -1,\n\t\t\tisLoadFailed: false,\n\t\t\tisIos: systemInfo.platform === 'ios',\n\t\t\tdisabledBounce: false,\n\t\t\tfromCompleteEmit: false,\n\t\t\tdisabledCompleteEmit: false,\n\t\t\t\n\t\t\t//---------------wxs相关---------------\n\t\t\twxsIsScrollTopInTopRange: true,\n\t\t\twxsScrollTop: 0,\n\t\t\twxsPageScrollTop: 0,\n\t\t\twxsOnPullingDown: false,\n\t\t};\n\t},\n\tprops: {\n\t\t//调用complete后延迟处理的时间，单位为毫秒，默认0毫秒，优先级高于minDelay\n\t\tdelay: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('delay', 0),\n\t\t},\n\t\t//触发@query后最小延迟处理的时间，单位为毫秒，默认0毫秒，优先级低于delay（假设设置为300毫秒，若分页请求时间小于300毫秒，则在调用complete后延迟[300毫秒-请求时长]；若请求时长大于300毫秒，则不延迟），当show-refresher-when-reload为true或reload(true)时，其最小值为400\n\t\tminDelay: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('minDelay', 0),\n\t\t},\n\t\t//设置z-paging的style，部分平台(如微信小程序)无法直接修改组件的style，可使用此属性代替\n\t\tpagingStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('pagingStyle', {});\n\t\t\t},\n\t\t},\n\t\t//z-paging的高度，优先级低于pagingStyle中设置的height；传字符串，如100px、100rpx、100%\n\t\theight: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('height', '')\n\t\t},\n\t\t//z-paging的宽度，优先级低于pagingStyle中设置的width；传字符串，如100px、100rpx、100%\n\t\twidth: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('width', '')\n\t\t},\n\t\t//z-paging的背景色，优先级低于pagingStyle中设置的background。传字符串，如\"#ffffff\"\n\t\tbgColor: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('bgColor', '')\n\t\t},\n\t\t//设置z-paging的容器(插槽的父view)的style\n\t\tpagingContentStyle: {\n\t\t\ttype: Object,\n\t\t\tdefault: function() {\n\t\t\t\treturn u.gc('pagingContentStyle', {});\n\t\t\t},\n\t\t},\n\t\t//z-paging是否自动高度，若自动高度则会自动铺满屏幕\n\t\tautoHeight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoHeight', false)\n\t\t},\n\t\t//z-paging是否自动高度时，附加的高度，注意添加单位px或rpx，若需要减少高度，则传负数\n\t\tautoHeightAddition: {\n\t\t\ttype: [Number, String],\n\t\t\tdefault: u.gc('autoHeightAddition', '0px')\n\t\t},\n\t\t//loading(下拉刷新、上拉加载更多)的主题样式，支持black，white，默认black\n\t\tdefaultThemeStyle: {\n\t\t\ttype: String,\n\t\t\tdefault: u.gc('defaultThemeStyle', 'black')\n\t\t},\n\t\t//z-paging是否使用fixed布局，若使用fixed布局，则z-paging的父view无需固定高度，z-paging高度默认为100%，默认为是(当使用内置scroll-view滚动时有效)\n\t\tfixed: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('fixed', true)\n\t\t},\n\t\t//是否开启底部安全区域适配\n\t\tsafeAreaInsetBottom: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('safeAreaInsetBottom', false)\n\t\t},\n\t\t//开启底部安全区域适配后，是否使用placeholder形式实现，默认为否。为否时滚动区域会自动避开底部安全区域，也就是所有滚动内容都不会挡住底部安全区域，若设置为是，则滚动时滚动内容会挡住底部安全区域，但是当滚动到底部时才会避开底部安全区域\n\t\tuseSafeAreaPlaceholder: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('useSafeAreaPlaceholder', false)\n\t\t},\n\t\t//slot=\"top\"的view的z-index，默认为99，仅使用页面滚动时有效\n\t\ttopZIndex: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('topZIndex', 99)\n\t\t},\n\t\t//z-paging内容容器父view的z-index，默认为1\n\t\tsuperContentZIndex: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('superContentZIndex', 1)\n\t\t},\n\t\t//z-paging内容容器部分的z-index，默认为10\n\t\tcontentZIndex: {\n\t\t\ttype: Number,\n\t\t\tdefault: u.gc('contentZIndex', 10)\n\t\t},\n\t\t//使用页面滚动时，是否在不满屏时自动填充满屏幕，默认为是\n\t\tautoFullHeight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('autoFullHeight', true)\n\t\t},\n\t\t//是否监听列表触摸方向改变，默认为否\n\t\twatchTouchDirectionChange: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: u.gc('watchTouchDirectionChange', false)\n\t\t},\n\t},\n\tcreated(){\n\t\tif (this.createdReload && !this.refresherOnly && this.auto) {\n\t\t\tthis._startLoading();\n\t\t\tthis._preReload();\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.wxsPropType = u.getTime().toString();\n\t\tthis.renderJsIgnore;\n\t\tif (!this.createdReload && !this.refresherOnly && this.auto) {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis._preReload();\n\t\t\t})\n\t\t}\n\t\tthis.finalUseCache && this._setListByLocalCache();\n\t\tlet delay = 0;\n\t\t// #ifdef H5 || MP\n\t\tdelay = 100;\n\t\t// #endif\n\t\tthis.$nextTick(() => {\n\t\t\tthis.systemInfo = uni.getSystemInfoSync();\n\t\t\t!this.usePageScroll && this.autoHeight && this._setAutoHeight();\n\t\t\tthis.loaded = true;\n\t\t})\n\t\tthis.updatePageScrollTopHeight();\n\t\tthis.updatePageScrollBottomHeight();\n\t\tthis._updateLeftAndRightWidth();\n\t\tif (this.finalRefresherEnabled && this.useCustomRefresher) {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.isTouchmoving = true;\n\t\t\t})\n\t\t}\n\t\tthis._onEmit();\n\t\t// #ifdef APP-NVUE\n\t\tif (!this.isIos && !this.useChatRecordMode) {\n\t\t\tthis.nLoadingMoreFixedHeight = true;\n\t\t}\n\t\tthis._nUpdateRefresherWidth();\n\t\t// #endif\n\t\t// #ifndef APP-NVUE\n\t\tthis.finalUseVirtualList && this._virtualListInit();\n\t\t// #endif\n\t\t// #ifndef APP-PLUS\n\t\tthis.$nextTick(() => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._getCssSafeAreaInsetBottom();\n\t\t\t},delay)\n\t\t})\n\t\t// #endif\n\t},\n\tdestroyed() {\n\t\tthis._offEmit();\n\t},\n\t// #ifdef VUE3\n\tunmounted() {\n\t\tthis._offEmit();\n\t},\n\t// #endif\n\twatch: {\n\t\tdefaultThemeStyle: {\n\t\t\thandler(newVal) {\n\t\t\t\tif (newVal.length) {\n\t\t\t\t\tthis.finalRefresherDefaultStyle = newVal;\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true\n\t\t},\n\t\tautoHeight(newVal) {\n\t\t\tthis.loaded && !this.usePageScroll && this._setAutoHeight(newVal);\n\t\t},\n\t\tautoHeightAddition(newVal) {\n\t\t\tthis.loaded && !this.usePageScroll && this.autoHeight && this._setAutoHeight(newVal);\n\t\t},\n\t},\n\tcomputed: {\n\t\tfinalPagingStyle() {\n\t\t\tconst pagingStyle = this.pagingStyle;\n\t\t\tif (!this.systemInfo) return pagingStyle;\n\t\t\tconst windowTop = this.windowTop;\n\t\t\tconst windowBottom = this.windowBottom;\n\t\t\tif (!this.usePageScroll && this.fixed) {\n\t\t\t\tif (windowTop && !pagingStyle.top) {\n\t\t\t\t\tpagingStyle.top = windowTop + 'px';\n\t\t\t\t}\n\t\t\t\tif (windowBottom && !pagingStyle.bottom) {\n\t\t\t\t\tpagingStyle.bottom = windowBottom + 'px';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.bgColor.length && !pagingStyle['background']) {\n\t\t\t\tpagingStyle['background'] = this.bgColor;\n\t\t\t}\n\t\t\tif (this.height.length && !pagingStyle['height']) {\n\t\t\t\tpagingStyle['height'] = this.height;\n\t\t\t}\n\t\t\tif (this.width.length && !pagingStyle['width']) {\n\t\t\t\tpagingStyle['width'] = this.width;\n\t\t\t}\n\t\t\treturn pagingStyle;\n\t\t},\n\t\tfinalLowerThreshold() {\n\t\t\treturn u.convertToPx(this.lowerThreshold);\n\t\t},\n\t\tfinalPagingContentStyle() {\n\t\t\tif (this.contentZIndex != 1) {\n\t\t\t\tthis.pagingContentStyle['z-index'] = this.contentZIndex;\n\t\t\t\tthis.pagingContentStyle['position'] = 'relative';\n\t\t\t}\n\t\t\treturn this.pagingContentStyle;\n\t\t},\n\t\tsafeAreaBottom() {\n\t\t\tif (!this.systemInfo) return 0;\n\t\t\tlet safeAreaBottom = 0;\n\t\t\t// #ifdef APP-PLUS\n\t\t\tsafeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;\n\t\t\t// #endif\n\t\t\t// #ifndef APP-PLUS\n\t\t\tsafeAreaBottom = this.cssSafeAreaInsetBottom === -1 ? 0 : this.cssSafeAreaInsetBottom;\n\t\t\t// #endif\n\t\t\treturn safeAreaBottom;\n\t\t},\n\t\trenderJsIgnore() {\n\t\t\tif ((this.usePageScroll && this.useChatRecordMode) || !this.refresherEnabled || !this.useCustomRefresher) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.renderPropScrollTop = 10;\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\t\twindowHeight() {\n\t\t\treturn !this.systemInfo ? 0 : this.systemInfo.windowHeight || 0;\n\t\t},\n\t\twindowTop() {\n\t\t\t//暂时修复vue3中隐藏系统导航栏后windowTop获取不正确的问题，具体bug详见https://ask.dcloud.net.cn/question/141634\n\t\t\t//感谢litangyu！！https://github.com/SmileZXLee/uni-z-paging/issues/25\n\t\t\t// #ifdef VUE3 && H5\n\t\t\tconst pageHeadNode = document.getElementsByTagName(\"uni-page-head\");\n\t\t\tif (!pageHeadNode.length) return 0;\n\t\t\t// #endif\n\t\t\treturn !this.systemInfo ? 0 : this.systemInfo.windowTop || 0;\n\t\t},\n\t\twindowBottom() {\n\t\t\tif (!this.systemInfo) return 0;\n\t\t\tlet windowBottom = this.systemInfo.windowBottom || 0;\n\t\t\tif (this.safeAreaInsetBottom && !this.useSafeAreaPlaceholder) {\n\t\t\t\twindowBottom += this.safeAreaBottom;\n\t\t\t}\n\t\t\treturn windowBottom;\n\t\t},\n\t\tisOldWebView() {\n\t\t\t// #ifndef APP-NVUE || MP-KUAISHOU\n\t\t\ttry {\n\t\t\t\tconst systemInfos = systemInfo.system.split(' ');\n\t\t\t\tconst deviceType = systemInfos[0];\n\t\t\t\tconst version = parseInt(systemInfos[1].slice(0,1));\n\t\t\t\tif ((deviceType === 'iOS' && version <= 10) || (deviceType === 'Android' && version <= 6)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch(e){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// #endif\n\t\t\treturn false;\n\t\t},\n\t\tisIosAndH5() {\n\t\t\t// #ifndef H5\n\t\t\treturn false;\n\t\t\t// #endif\n\t\t\treturn this.isIos;\n\t\t},\n\t\tzSlots() {\n\t\t\t// #ifdef VUE2\n\t\t\t\n\t\t\t// #ifdef MP-ALIPAY\n\t\t\treturn this.$slots;\n\t\t\t// #endif\n\t\t\t\n\t\t\treturn this.$scopedSlots ? this.$scopedSlots : this.$slots;\n\t\t\t// #endif\n\t\t\t\n\t\t\treturn this.$slots;\n\t\t}\n\t},\n\tmethods: {\n\t\t//当前版本号\n\t\tgetVersion() {\n\t\t\treturn `z-paging v${c.version}`;\n\t\t},\n\t\t//设置nvue List的specialEffects\n\t\tsetSpecialEffects(args) {\n\t\t\tthis.setListSpecialEffects(args);\n\t\t},\n\t\t//与setSpecialEffects等效，兼容旧版本\n\t\tsetListSpecialEffects(args) {\n\t\t\tthis.nFixFreezing = args && Object.keys(args).length;\n\t\t\tif (this.isIos) {\n\t\t\t\tthis.privateRefresherEnabled = 0;\n\t\t\t}\n\t\t\tif (!this.usePageScroll) {\n\t\t\t\tthis.$refs['zp-n-list'].setSpecialEffects(args);\n\t\t\t}\n\t\t},\n\t\t//使手机发生较短时间的振动（15ms）\n\t\t_doVibrateShort() {\n\t\t\t// #ifdef APP-PLUS\n\t\t\tif (this.isIos) {\n\t\t\t\tconst UISelectionFeedbackGenerator = plus.ios.importClass('UISelectionFeedbackGenerator');\n\t\t\t\tconst feedbackGenerator = new UISelectionFeedbackGenerator();\n\t\t\t\tfeedbackGenerator.init();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tfeedbackGenerator.selectionChanged();\n\t\t\t\t},0)\n\t\t\t} else {\n\t\t\t\tplus.device.vibrate(15);\n\t\t\t}\n\t\t\t// #endif\n\t\t\t// #ifndef APP-PLUS\n\t\t\tuni.vibrateShort();\n\t\t\t// #endif\n\t\t},\n\t\t//设置z-paging高度\n\t\tasync _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) {\n\t\t\tlet heightKey = 'min-height';\n\t\t\t// #ifndef APP-NVUE\n\t\t\theightKey = 'min-height';\n\t\t\t// #endif\n\t\t\ttry {\n\t\t\t\tif (shouldFullHeight) {\n\t\t\t\t\tlet finalScrollViewNode = scrollViewNode ? scrollViewNode : await this._getNodeClientRect('.zp-scroll-view');\n\t\t\t\t\tlet finalScrollBottomNode = await this._getNodeClientRect('.zp-page-bottom');\n\t\t\t\t\tif (finalScrollViewNode) {\n\t\t\t\t\t\tconst scrollViewTop = finalScrollViewNode[0].top;\n\t\t\t\t\t\tlet scrollViewHeight = this.windowHeight - scrollViewTop;\n\t\t\t\t\t\tif(finalScrollBottomNode){\n\t\t\t\t\t\t\tscrollViewHeight -= finalScrollBottomNode[0].height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst additionHeight = u.convertToPx(this.autoHeightAddition);\n\t\t\t\t\t\tconst finalHeight = scrollViewHeight + additionHeight - (this.insideMore ? 1 : 0) + 'px !important';\n\t\t\t\t\t\tthis.$set(this.scrollViewStyle, heightKey, finalHeight);\n\t\t\t\t\t\tthis.$set(this.scrollViewInStyle, heightKey, finalHeight);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.$delete(this.scrollViewStyle, heightKey);\n\t\t\t\t\tthis.$delete(this.scrollViewInStyle, heightKey);\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\t//通过获取css设置的底部安全区域占位view高度设置bottom距离\n\t\t_getCssSafeAreaInsetBottom(){\n\t\t\tthis._getNodeClientRect('.zp-safe-area-inset-bottom').then((res) => {\n\t\t\t\tif (res) {\n\t\t\t\t\tthis.cssSafeAreaInsetBottom = res[0].height;\n\t\t\t\t\tif (this.safeAreaInsetBottom) {\n\t\t\t\t\t\tthis.updatePageScrollBottomHeight();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t//触发更新是否超出页面状态\n\t\t_updateInsideOfPaging() {\n\t\t\tif (this.insideMore && this.insideOfPaging === true) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.doLoadMore();\n\t\t\t\t}, 200)\n\t\t\t}\n\t\t},\n\t\t//获取节点尺寸\n\t\t_getNodeClientRect(select, inDom = true, scrollOffset = false) {\n\t\t\t// #ifdef APP-NVUE\n\t\t\tselect = select.replace('.', '').replace('#', '');\n\t\t\tconst ref = this.$refs[select];\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tif (ref) {\n\t\t\t\t\tweexDom.getComponentRect(ref, option => {\n\t\t\t\t\t\tresolve(option && option.result ? [option.size] : false);\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tresolve(false);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t\t// #endif\n\t\t\t//#ifdef MP-ALIPAY\n\t\t\tinDom = false;\n\t\t\t//#endif\n\t\t\tlet res = !!inDom ? uni.createSelectorQuery().in(inDom === true ? this : inDom) : uni.createSelectorQuery();\n\t\t\tscrollOffset ? res.select(select).scrollOffset() : res.select(select).boundingClientRect();\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tres.exec(data => {\n\t\t\t\t\tresolve((data && data != '' && data != undefined && data.length) ? data : false);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\t//清除timeout\n\t\t_cleanTimeout(timeout) {\n\t\t\tif (timeout) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\ttimeout = null;\n\t\t\t}\n\t\t\treturn timeout;\n\t\t},\n\t\t//添加全局emit监听\n\t\t_onEmit() {\n\t\t\tuni.$on(c.errorUpdateKey, () => {\n\t\t\t\tif (this.loading) {\n\t\t\t\t\tthis.complete(false);\n\t\t\t\t}\n\t\t\t})\n\t\t\tuni.$on(c.completeUpdateKey, (data) => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.loading) {\n\t\t\t\t\t\tif (!this.disabledCompleteEmit) {\n\t\t\t\t\t\t\tconst type = data.type || 'normal';\n\t\t\t\t\t\t\tconst list = data.list || data;\n\t\t\t\t\t\t\tconst rule = data.rule;\n\t\t\t\t\t\t\tthis.fromCompleteEmit = true;\n\t\t\t\t\t\t\tswitch (type){\n\t\t\t\t\t\t\t\tcase 'normal':\n\t\t\t\t\t\t\t\t\tthis.complete(list);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'total':\n\t\t\t\t\t\t\t\t\tthis.completeByTotal(list, rule);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'nomore':\n\t\t\t\t\t\t\t\t\tthis.completeByNoMore(list, rule);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase 'key':\n\t\t\t\t\t\t\t\t\tthis.completeByKey(list, rule);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.disabledCompleteEmit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, 1);\n\t\t\t})\n\t\t},\n\t\t//销毁全局emit和listener监听\n\t\t_offEmit(){\n\t\t\tuni.$off(c.errorUpdateKey);\n\t\t\tuni.$off(c.completeUpdateKey);\n\t\t}\n\t},\n};\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js",
    "content": "// [z-paging]使用页面滚动时引入此mixin，用于监听和处理onPullDownRefresh等页面生命周期方法\n\nexport default {\n\tonPullDownRefresh() {\n\t\tif (this.isPagingRefNotFound()) return;\n\t\tthis.$refs.paging.reload();\n\t},\n\tonPageScroll(e) {\n\t\tif (this.isPagingRefNotFound()) return;\n\t\tthis.$refs.paging.updatePageScrollTop(e.scrollTop);\n\t\tif (e.scrollTop < 10) {\n\t\t\tthis.$refs.paging.doChatRecordLoadMore();\n\t\t}\n\t},\n\tonReachBottom() {\n\t\tif (this.isPagingRefNotFound()) return;\n\t\tthis.$refs.paging.pageReachBottom();\n\t},\n\tmethods: {\n\t\tisPagingRefNotFound() {\n\t\t\treturn !this.$refs.paging;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-static.js",
    "content": "// [z-paging]公用的静态图片资源\n\nexport default {\n\tbase64Arrow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAD1BMVEVHcExRUVFMTExRUVFRUVE9CdWsAAAABHRSTlMAjjrY9ZnUjwAAAQFJREFUWMPt2MsNgzAMgGEEE1B1gKJmAIRYoCH7z9RCXrabh33iYktcIv35EEg5ZBh07pvxJU6MFSPOSRnjnBUjUsaciRUjMsb4xIoRCWNiYsUInzE5sWKEyxiYWDbyefqHx1zIeiYTk7mQYziTYecxHvEJjwmIT3hMQELCYSISEg4TkZj0mYTEpM8kJCU9JiMp6TEZyUmbAUhO2gxAQNJiIAKSFgMRmNQZhMCkziAEJTUGIyipMRjBSZkhCE7KDEFIUmTeGCHJxWz0zXaE0GTCG8ZFtEaS347r/1fe11YyHYVfubxayfjoHmc0YYwmmmiiiSaaaKLJ7ckyz5ve+dw3Xw2emdwm9xSbAAAAAElFTkSuQmCC',\n\tbase64ArrowWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVHcEz///////////////////+IGTx/AAAABnRSTlMA/dAkXZOhASU/AAABYElEQVRYw+2YwXLCIBCGsdAHWGbyAKZ4zxi9O017rxLf/1UaWFAgA1m8dcpedNSPf/l/Vh0Ya/Wn6hN0JcGvoCqRM4C8VBFiDwBqqNuJKV0rAnCgy3AUqZE57x0iqTL8Br4U3WBf/YWaIlTKfAcELU/h9w72CSVPa3C3OCDvhpHbRp/s2vq4fHhCeiCl2A3m4Qd71DQR257mFBlMcTlbFnFWzNtHxewYEfSiaLS4el8d8nyhmKJd1CF4eOS0keLMAuSxubLBIeIGQW8YHCFFo7EH9+YDcQt9FMZEswTheaNxTHwHT8SZorJjMrEVwo4Zo0U8HSEyZvJMOg4RjnmmRr8nDYeIz3OMkbfE/QhBo+U9RnZJxjGCRh/WKmHEMWLNkfPKsGh/CWJk1JjG0kcuJggTt34VDP8aWAFhp4nybVb5+9qQhjSkIQ1pSEMa8k+Q5U9rV3dF8MpFBK+/7miVq1/HZ2qmo9D+pAAAAABJRU5ErkJggg==',\n\tbase64Flower: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC',\n\tbase64FlowerWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEX///9HcEz///////////////84chYNAAAABnRSTlP/AGzCOYZj5g1nAAACfklEQVRYw+2YTVPDIBCGtza9Jw25a0bvcax30o73OOr//yvma2F3YWlpPTijXNpAHrK8LLALVPFium2vNIFSbwGKTGQA2GUiHcD29yDNy3sMIdUBQl7r2H8mOEVqAHgPkYZUS6Qc2zYhQqtjyDZEximCZwWZLIBeIgYShs2NzxKpSUehYpMJhURGb+O+w5BpMCAREKPnCDHbIY20SzhM5yxziAXpOiBXydrekT9i5XDEq4NIIHHgyU5mRGqviII4mREJJA4QJzMiILwlRJzpKxJKvCBm8OsBBbLux0tsPl4RKYm5aPu6jw1U4mGxEUR9g8M1PcqBEp/WJliNgYOXueBzS4jZSIcgY5lCtevgDSgyzE+rAfuOTQMq0yzvoGH18qju27Mayzs4fPyMziCx81NJa5RNfW7vPYK9KOfDiVkBxFHG8hAj9txuoBuSWORsFfkpBf7xKFLSeaOefEojh5jz22DJEqMP8fUyaKdQx+RnG+yXMpe8Aars8ueR1pVH/bW3FyyvPRw90upLDHwpgBDtg4aUBNkxRLXMAi03IhcZtr1m+FeI/O/JNyDmmL1djLOauSlNflBpW18RQ2bPqXI22MXXEk75KRHTnkPkYbESbdKP2ZFk0r5sIwffAjy1lx+vx7NLjB6/E7Jfv5ERKhzpN0w8IDE8IGFDv5dhz10s7GFiXRZcUeLCEG5P5nDq9k4PFDcoMpE3GY4OuxuCXhmuyNB6k0RsLIAvqp9NE5r8ZCSS8gxnUp7ODdYhZTqxuiJ9uyJJtPmpqJ7wVj+XVieS903iViHziqAhchLEJAyb7jWU647EpUofQ0ziUuXXXhDddtlllSwjgSQu7r4BRWhQqfDPMVwAAAAASUVORK5CYII=',\n\tbase64Success: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVRUVFHcExTU1NRUVFRUVFRUVFOSlSUAAAABnRSTlP/AI6+VySB3ZENAAACcElEQVRYw+2YyYKCMAyGI8hdpdxdZu7gcpdZ7jL6/s8yYheSNi0aPdqbwOffpGmaFOYPD3gj4bisN7vddv17N/JVgxn5x12IWgIaWTuO/IE3PseQbwjGPo2cgRmHFLJwdm/X643zwiqOKPPJ1nj3sjEP2iiifZWj5bhopSyGaEO2HX5fbQJzwJ+W7x/jw5ZFjsEU0PMph9xE8i5EqprKALW95eJQURkgzw98uJ/JvwGecR7bIjWWsUgVrrIfFZ2HlLy3sKETD1mmRLRMRhGVssRa0xJkdn3SpJBymBkM8+pSSDXMDNyDaToVHd2fgpNt0sjwiUZO19+jGQ+gQEg9Oq+bufmAVGihomNmjQG7UG3020vrlm7lkFnKFGU3kZ0KGAdmKe821pipQ+qEKcrZeTL2g5FsUks4cStjEZWwXg0b0n4GxmEpkWwIs5VBynjgK7xZaz1/0D7OxkVuLpsY5BQNFyLS84VBjjbg0iL2r2EQHBOxBhikuUOkdxODVF1cxHoWtPPsiyXO455Iv34hssCO8EV4ZIYTjS8SR4qYSHRiTiYQ4ZFbHi0iIhhBTi6dTCgSWRcnw4h4yGTuyTAiOGBIWGoZTgSHJQl+LcOJ4OCnW6yX2bMnJ9pidCOXtkTkTrIGpYuOynAiOF14SamMiOCk5Ke+mq8BcOrrvym8d0zKIQnWT+M1WwOQNO4fFiWb18hhERxJPx2fblbPHHyC41VyiAtKBUFBIih7JMWVoIQTFIr3lKPN80WvoLSWFPC653ioTZA0I0FrQ7qU6asaK0H7JmkSJa2ooOGVtNUsc3j9FYHkIkJy3SG6VHnfXKXGP9t4N9Q4Ye98AAAAAElFTkSuQmCC',\n\tbase64SuccessWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAGFBMVEVHcEz///////////////////////////8dS1W+AAAAB3RSTlMAiVYk6KvDHLfaegAAAo1JREFUWMPtWEtzmzAQNhCTq910ytXpiyvxTNOr60zrayepx9d02gnX4sTm7xcEiJX2gdnkGJ1A4tOnfWqXyeR1vMRYzrcPD9v5h5MBl3/Ldvx4cxIg/FWC8X0xjLjalM54uhhCfCrRuJURX0pi3EmIqZV7O59vrRZmguStHL9b7S7ftfLwOtiZDw7AHMtmquAQ12b5Wwbnordm8g9zLLO49qc/m2n6aKnhwPOGZ08hAiNHhheiHae1lOUPGZpQkPKa3q0mOUjaRzSRaGUjpy/mmWSwySSpllcEteBKAT52KEnSbblA51pJEPxBQoiH1FP4E3s5+FJv07h6/ylD6ui7B+9fq/ehrFB98ghec9EoVtyjK8pqCHLmCBOwMWSCeWFNN4MbPAk55NhsvoFHSSVR0k5TCTTEzlUGcqV/nVp7n9oIVkmtaqbAEqEgfdgHJPwsEAyZ9r4VAZXFjpEwyaw3+H2v42KYxKhs1XvY/gSSGv+IHyUSuHXCeZhLAgVI3EjgSGo1Fb3xO0tGGU9S2/KAIbtjxpJASG73qox6w5LUq0cEOa+iIONIWIilQSQ0pPa2jgaRQAgQP7c0mITRWGxpMAmEQFN2NAQJNCV0mI6GIIEO47hlQ0ORQLd0nL+hoUjg1m6I1TRr8uYEAriBHLcVFQ5UEMiBe3XkTBEG04WXlGKGxPnMS305XQPA1Ocn2JiuAZwE66fxnKwBnDTuXxZTMq85lwW6kt5ndLqZPefiU1yvmktcUSooChJF2aMprhQlnKJQ5FxRKkcVRa+itNYU8Io2oVkY14w0NMWYlqft91Bj9VHq+ca3b43BxjWJmla0sfKohlfTVpPN+93L/yLQ/IjQ/O5Q/VR5HdL4D7mlxmjwVdELAAAAAElFTkSuQmCC',\n\tbase64Empty: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAbUExURdvc3EdwTMLBwcjIyLSzs/Hx8ff39////19dXXz7IJEAAAAFdFJOU/4A6J9QDyyutAAAB5VJREFUeNrtnM1z4jYYxhUHkR4hdu9eU7Z75Ct7jgPbs9ZZmSuTrUWPmXTA186e+LMrf0uWLMtf2WkHXQgzln88et5XeiVMwPQdGrhCrpAr5Aq5Qv4TkJ07OGQFMLp1B4VYCz+kDblDQhJGeH4eEDLBYdLOHwaDWNBPIeHLYJAJ3meQ83IoCMTHDBKOBoKYGOeM8G0gyD0LObnDQB5ZSCtTNCBfsM9AboaBPLCQcDAIM1zht/dQEkMsd1DjI4hpw2YzMtBJeBbydWpCTJs3YDKGX62YgfGoVwi9KwtZJAzcYHHRm7sYCKD390nQSIoO5JGZIEOYxNoZ4+deISYLyeL5hLHbJ2QK98W0kudMgJe9Qh73odhO+KZHyNYGvgQS9gmJKhUigwSj3iBPUhXxePWmxBqHw0Mej9WQ3qILVjLC177yxNxXQ/7uK+Mn1aNVLsGsBTaWrSAPobYl0aUHt2fIs2Rgz7c9QYL0pSTkSzILLFtAJMH1cidN998T9E0/Sg73/pEEwrgkYRh86wlC949gJsR6EobBcz8hHOVgKYi2m6kZtodIkjEQvF3QjbGpmplB4/lRgJhxgRS2N15iijAvPmByDtCxfQhPJ8J4CR82rgCCBILarScw6X0OcMUyYrFVmbxErl0ZacFIoloOLdJAO42qY+NMDss2kKS8xmiZxcCpFKXWvpRGbQqJp5ixyRfJMmR6x0Fk+z29kmgWDYI5ziFbdug/84HxvduhWhLOJ2StPDQrMJPSjNANklh8QhB7dBO0yTGRwn1fkOk8rbQjiB8Ymww+JuiuN0icmSccK4naLMWYa/euL0+m23GyM8kgAc6sYeL4z04Qa4WjGepcKIliO8EUGSk7d9OGWOsoK31OSdy8TQZ59Y/hWbaV1IVs5/Ed6UzGK4nANAJiyGhRsZPUg2yzLe9hLyiJIyCaDU7udC2uy9pnkKvidlBUEltzFAqxRhBrBZm7HfZnjEQI3boqTsJq15PUDEaKZLgiJYc8OZtCtnM/4G93OFYooXpvdy0guwWWNQkEHl/j7Jw1XRmtlS9HYJkSPjk1IUnyyRqUKQn45NSDlP1mcg9i6En1ZU2IADnEtHF1Q+JwIcS/d5YakPuDUamEShGUHHikAz9oQCaE0CsrpYjDBVkEHQYdyK+EkKPhVErxqh1xbJ/oQf4gEeVsOIEc41WJNAwcd9GBfCZJezXsJhAvH+ImEEIOzlwXgpw5wQ0gH3MIOcsiQAahZuSD69/UQyxcQEggiQARQseVFO/ASAMCgM9gjkHZmhLENzi1AOhA7ullkMWUrfHKfpMiDBHtDIx6yCS6jseEnDUe7zcT6DGCtnrIY3olZw1hrPHkfucIAJa1EDu/lsVEyVmGGA67coKijeogFnMxlEaAV5ghRdDm1kDuuatZTJBGgJdOthIzsvZbDWRRuh6ScgR4EQLgagQvRQIxxQ4sxqcR4GE+c4CkjZQQW9YF89Y4OFAjOCki5KmiDxsBL3PlSJWlAFVogaoIePlYi2ClCJAHRa/cmre5eqTii4uvisqQJxqnip6pNd68DhEvyEs5xIyHBNdh4thCKhU++10kD7Gy1Up1A/o56FKuRJQWSFCuf8dpbisxhqHSKlSSgvG7VTaFKO5TzYD5VMPUxEB2YJNiqq3xYJ0KrroH8mq7xpoXqEZgfgNRUQsDtTVvUOk3sLUKbqrBr7YGvkCkQNC/9SA+vTYtvERrxiKEmcogk4ZqCLUd59MIEiFYHlIoxelCaJWDMmtOPIa80XVLbkb6hzaEwwTcPEmV4AIRlBGNIEmuJBFwLAZoHClJ36J8h+wxihpCqJosAnJrSKwEcQOFAFeWN4RQMYc0Ao4Jhg5gpASzyWcDvjpuDIlTkrGGJEro1rHIjHKR3wJCAj+z5oyi11gJBkXy9QFJIiAu78d+pgSjuWhGN0gUAZAcEncSJf4LRrZ8I94WEmcNCJJqBWYjVbE9bg2JxiyrViBWty6QvO56D8jPVWLA4ZX8dfkxvJJPl8t8aCX+pU/Iz1SCf7lc4OBK0OWfQaKLP0TKjj96VvIp+/BDZjwNKF2ItV2vN7sWStAl87oWkm3dZ+k3lEMoYXe8cT1eq2TOePJDD8KfQdxu6iEPxanUZa4HmZRq3dunGsj3BzFq6yD3wnZNX4n2emI2hXyXQpi6RRZdfSgxHNuxVZBFdyVeBPDmCsiksxKUiDAUEKuzkvRUEs0V08pjVyU2/yqFmF2VZGYop3peitdUiQd1pnrL7qTE01tPzE6eaEKm23dQwh2jNlbiay+/245zl94abw45CzNPyqYQ2++kxHGV1crWzg4A2yvR+BY7wziwnRLN7+O36aA54+ZKGjxZYK3txJpxQyUNn5GwtquII4+ACiWtnvawduu1A3SVtH5uhTvAVSpBG7fDYz6RQ+M6JWjmKm6g+RvTla9UMtspu+s+37VbVCupNqPx43CsNawSb1PbtcmDfQWmUILW7rRXSPHtSq5k5ur0a/hb7DQCUiW3G71ejX/wvV1kSoyNbp8Wvyqn1lCIKvl6gNDkNBYzt0GHdr+Pt9xGl1//ncAVcoVcIVfIFXKFXCFXyP8I8i8SyTW4yTz2lwAAAABJRU5ErkJggg==',\n\tbase64Error: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAJFBMVEVHcEzo6Oibm5ukpKSbm5uampqbm5ubm5u5ubnn5+fm5ub6+vpGpDPdAAAAC3RSTlMA/v4hb+u20dq8aQhnHL4AAATwSURBVHja7ZvNb+JGGMbdjjdVe3NPodzeMhj1ZMUGujkh28B9wKR7iwwBqafWSbPqsbm0uTWtVlrTS9v0Et9yqLQS/1zHNiTZMMB4bO92d+dRUITt8c/PvPPx2h4URUpKSkpKSkpK6m3K6lFN73Q+S/+es3W3fzabTh2Dl0FAXEM+BgrgeXxRsdILTDU9n7J0vz/+EsCYC9KEiSFc06pf5zouqAkjkGWo0OG5Fq6j2IwZ6I4/4DhyTxc20oUjAj5PRTTrwvGAZ9p+ADzlD4RDctCoLhb7JUP87xeLxS3BZUIQ+YNCFi8wRwc4GIqGRK/GkM+5ILV8kFflOmkkkH/LddJ4c05eSSfSyTvrZPEmnCw+UCeuk84QvTSnUF0uCL68fBle/swF+RL1QZ/EpU6gHtOsAM64pnjPwxgTLsjoBM58ODNaAXYBT5QeGdr0KwcEA8He0TkPBLCjUDNHpG4qlg8eTCzXht1FVd1MxTPHj5LTtUiSrKK+7iDf8wBGxk4If3arLv/HF4Tox0A2nlFIGp+CIA+LzSamgbp4TNvZjECtDAjyMcB5HybLO6NxsRA1vmFCNjguNXDGWygbRPXh/B+zn9zPWK5RCkT18QxA57YgAqE+HGS6/tAoD4JO0ts+M2tbyQJpc95a5oI0xXNhCZGQ/x8E0VSCkUZY6Z6CIE/qdO5eL+yPlW6tMMgefPs3o7Bdt8iguJj4DThlZSY/rJ0yB+RraLDK2jAQCHyr4zIhT9mQ7vowygMZjpgQG+CYUV2E1EWqixyzICr8eFFnBB5ba1Y4IIfeKQvysW7ssZrwQLEFmvCBM2U6oRkdI5Wgm1QnO8RUTDlASoiESIiESMh7BDHKhlhu/LbSNUuEqL3lu1p945vO3BArADiaum7vBGDUKQfSIjBykooyrRPQnTIglHFfSagHeqd4iErwa9duEebpckGQjx/VT4v5fC0XhJHAd1mPRvJAVMZiAeQzTpgHYrPKqkGnUEiX+dCoNS4UgniHMTnUS4iESIiE7IS0x+mnVAidglDwVcmQJpy2WQ8VC4UgogfbA1RE4Nuw3UghEBV2rKl7V5ygAJPSY9KGQbP01mVjA5Fa2f1kQN2U3k+M9POWB8gnJUNMZJioWTMzKwOklyxgDrCXVcMMEF90tXM9C2TiCqmfCdIRi/jeewNpyerKok9WkGuzfCdYC+fXRsmBxxpVGG2zY0ZBbieJKvPrDQce3lxppBhIjGFWGkVoxUEoZt0Mukn2XBQH0bTHZpaMIp2sU/6qasU70W6/eHjM09VmYSc6C6Jpvz+orKvVxot8kL3HkMr9IZ9qeZ2o6RrO9mOI9ufdIR9peZ2gNIW31yC/MpyI9ngUDNIsezPks3vIsWDGdYA7cZa9pbqUVeCr/neiaR3U3R4BfXPg75vwb8I/b7HjxChobDZCO+Ny4wuxxaVxPPowcoNnrzPmzGFlX3RJHz2FafbhJ41n8PLx2DCM7KkwQgpqka1DVzKdJNHfJwBe9l/n0eSZFsIPjVSY8xZKZpSXnogwled98wAx3xRcdBNq1f1fhFVdIcL5tvaDolC7XaqaWStEtLOJHkbhlSauMLrma4yHEa03AVUoIUs/M2NQFkchBZiGUPeKonAnqhLOo4hrKf0WTyZ1FcU0Ki0hVrSr+Mucnvya7jYUKSkpKSkpKSmpD0f/AXq+Umj5XnXDAAAAAElFTkSuQmCC',\n\tbase64BackToTop: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAElBMVEVRUVH+/v5HcEyZmZlRUVFRUVGm1ByOAAAABnRSTlPMzADMTZAJBBGsAAAEnElEQVR42t2cS27jMAyGf7/2U+QCQeDsbeQCgZDujaC5/1UmkzaJn+JDFGcw3LdfflKibJkkDnxrL7dbg7sNt6+L4O8OYBM+B0ys+QrGkHZG+OEEQ8g6go8Bx1GIGMdpNOQyIG6XdMgnSPtKhLQDGEZFBgYMkhKFtGBb0EIEjDgFRowoBVaMGAWpMedEfxMiZtwpUsgZCqtlkCNUdpVAWigtCCCDFtLwIWeoreZCWiRYYEKGFEjDg+yRZCUH0iLRAgNyToXUNCRZyMqWhGnUN2IPm3wSlwJ7IUspyCBkIQUZhCykIIeQuRTkEDKXAuM9srrtYbrZN7Y98giZSoFd+t1OxmMITG0dcrSFXFchZ1tIvQZpYWxhBbK3hpQrkMEa0iwh5t4a+QvZvDXyF7J5a+Qv5PPW21/I5623v5DPW29/IaO3Xv5Clrw1y1/Ikrdm+Qs5svw83yNnSJ5BQb4F/F7EIEJSnThGBAXxkFQfLOviQUE8JAUPsosHBfGQfDAtHhREQ1JxIV00KIgmrnRI84S0yAd5BAXxxJUck0f6Qnwr9qmr6xF5xLMjcwn/iudIEAdWnyjkEXlQKZiRVzoqRyLbgeUKKR8Q4alY7cSnoxzSf2ggsqehKr6YVpcXpOd7H93f60cKhOd7Re2LteUF4eLqiVS1mr0ge4io6C2+soaFkJ7MuuuQs1yITEp9hwwKISIpzR2iESKSIoT0rLNwuVHQqoSIpAQJpGce60vIUSdEIuUqgPTsJ5QFZK8UIpBS8iG94GFrDjlrhfCl8CG96Llxmle4kEr6vKWBPIVo9kqDQSRk9/3cWoikcCFPAd33v4dIChPyEvLzBA6RlEYWke4JEUnhKXkLeUEKxRHJFfKCQHGucIW8IdZSRkLeEGMpYyEjiK2UsZARxFTKRMgYYillImQMMZQyFTKB2EmZCplAuFLIHT8TMoWwpQwiIVMIUwqpZP5bp5CCvCTiQKr5f5lCQN+tPCBn2ZvVDFJwIDUP0m1BYAfZYRNSsCB7BqTbhoARePIxtZ9tgwWkoJcwCalmv3MBAemtO4R6dah2HaKQqj8Zvp9sQDjvJ21+SPCBHPJDDk6QITekEV7gqCC19CpKAym9IMfckKv4olMBCeIrWwVEfvkshzQekO9r9P1/ALk+IG1eSPCDiCJfyG+FyU+A6ZCa/piZDinpz7LpkCv5gdkAEshP5emQhv7onw6pGeULyZCSUYiRDAmMkpJkCKs4JhFSq8p8hJBSVbAkhARV6ZUQoisik0FqXTmcDHLVFfbJIEFXoiiCNMpiSxGkVJaNiiBBWQArgTTaUl4JpNQWJUsgQVteXQg+AKkLxQWFGKW+5J2+eVp4S168X3CF1CltCKdTJ8lb84YK2bUBO+wZW0Pqv9nk4tKu49N45NJC5dMM5tLW5tOg59Jq6NM06dL+abFXwr/RkuvTXJwae1abtE/Dt0/ruksTvs84AZ/BCC4jHnyGVfiM3VBQFANEXEah+Ax18RlP4zNox2dkkM/wI58xTn8yDCXGYCDV3W5RGSajtXyGhG1jbpbjzpwGt/0MJft8jqC7iUbQ/QZaxdnKqcIftwAAAABJRU5ErkJggg==',\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/js/z-paging-utils.js",
    "content": "// [z-paging]工具类\n\nimport zConfig from './z-paging-config'\nimport zLocalConfig from '../config/index'\n\nconst storageKey = 'Z-PAGING-REFRESHER-TIME-STORAGE-KEY'\nlet config = null;\n\n/*\n当z-paging未使用uni_modules管理时，控制台会有警告：WARNING: Module not found: Error: Can't resolve '@/uni_modules/z-paging'...\n此时注释下方try中的代码即可\n*/\n// #ifdef VUE2\ntry {\n\tconst contextKeys = require.context('@/uni_modules/z-paging', false, /\\z-paging-config$/).keys();\n\tif (contextKeys.length) {\n\t\tconst suffix = '.js';\n\t\tconfig = require('@/uni_modules/z-paging/z-paging-config' + suffix);\n\t}\n} catch (e) {}\n// #endif\n\n//获取默认配置信息\nfunction gc(key, defaultValue) {\n\tif (!config) {\n\t\tif (zLocalConfig && Object.keys(zLocalConfig).length) {\n\t\t\tconfig = zLocalConfig;\n\t\t} else {\n\t\t\tconst temConfig = zConfig.getConfig();\n\t\t\tif (zConfig && temConfig) {\n\t\t\t\tconfig = temConfig;\n\t\t\t}\n\t\t}\n\t}\n\tif (!config) return defaultValue;\n\tconst value = config[_toKebab(key)];\n\treturn value === undefined ? defaultValue : value;\n}\n\n\n//获取最终的touch位置\nfunction getTouch(e) {\n\tlet touch = null;\n\tif (e.touches && e.touches.length) {\n\t\ttouch = e.touches[0];\n\t} else if (e.changedTouches && e.changedTouches.length) {\n\t\ttouch = e.changedTouches[0];\n\t} else if (e.datail && e.datail != {}) {\n\t\ttouch = e.datail;\n\t} else {\n\t\treturn {\n\t\t\ttouchX: 0,\n\t\t\ttouchY: 0\n\t\t}\n\t}\n\treturn {\n\t\ttouchX: touch.clientX,\n\t\ttouchY: touch.clientY\n\t};\n}\n\n//判断当前手势是否在z-paging内触发\nfunction getTouchFromZPaging(target) {\n\tif (target && target.tagName && target.tagName !== 'BODY' && target.tagName !== 'UNI-PAGE-BODY') {\n\t\tconst classList = target.classList;\n\t\tif (classList && classList.contains('z-paging-content')) {\n\t\t\treturn {\n\t\t\t\tisFromZp: true, \n\t\t\t\tisPageScroll: classList.contains('z-paging-content-page'), \n\t\t\t\tisReachedTop: classList.contains('z-paging-reached-top')\n\t\t\t};\n\t\t} else {\n\t\t\treturn getTouchFromZPaging(target.parentNode);\n\t\t}\n\t} else {\n\t\treturn {isFromZp: false};\n\t}\n}\n\n//获取z-paging所在的parent\nfunction getParent(parent) {\n\tif (!parent) return null;\n\tif (parent.$refs.paging) return parent;\n\treturn getParent(parent.$parent);\n}\n\n//打印错误信息\nfunction consoleErr(err) {\n\tconsole.error(`[z-paging]${err}`);\n}\n\n//设置下拉刷新时间\nfunction setRefesrherTime(time, key) {\n\tconst datas = getRefesrherTime() || {};\n\tdatas[key] = time;\n\tuni.setStorageSync(storageKey, datas);\n}\n\n//获取下拉刷新时间\nfunction getRefesrherTime() {\n\treturn uni.getStorageSync(storageKey);\n}\n\n//通过下拉刷新标识key获取下拉刷新时间\nfunction getRefesrherTimeByKey(key) {\n\tconst datas = getRefesrherTime();\n\treturn datas && datas[key] ? datas[key] : null;\n}\n\n//通过下拉刷新标识key获取下拉刷新时间(格式化之后)\nfunction getRefesrherFormatTimeByKey(key, textMap) {\n\tconst time = getRefesrherTimeByKey(key);\n\tconst timeText = time ? _timeFormat(time, textMap) : textMap.none;\n\treturn `${textMap.title}${timeText}`;\n}\n\n//将文本的px或者rpx转为px的值\nfunction convertToPx(text) {\n\tconst dataType = Object.prototype.toString.call(text);\n\tif (dataType === '[object Number]') return text;\n\tlet isRpx = false;\n\tif (text.indexOf('rpx') !== -1 || text.indexOf('upx') !== -1) {\n\t\ttext = text.replace('rpx', '').replace('upx', '');\n\t\tisRpx = true;\n\t} else if (text.indexOf('px') !== -1) {\n\t\ttext = text.replace('px', '');\n\t}\n\tif (!isNaN(text)) {\n\t\tif (isRpx) return Number(uni.upx2px(text));\n\t\treturn Number(text);\n\t}\n\treturn 0;\n}\n\n//获取当前时间\nfunction getTime() {\n\treturn (new Date()).getTime();\n}\n\n//获取z-paging实例id\nfunction getInstanceId() {\n    const s = [];\n    const hexDigits = \"0123456789abcdef\";\n    for (let i = 0; i < 10; i++) {\n        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\n    }\n    return s.join('') + getTime();\n}\n\n//------------------ 私有方法 ------------------------\n//时间格式化\nfunction _timeFormat(time, textMap) {\n\tconst date = new Date(time);\n\tconst currentDate = new Date();\n\tconst dateDay = new Date(time).setHours(0, 0, 0, 0);\n\tconst currentDateDay = new Date().setHours(0, 0, 0, 0);\n\tconst disTime = dateDay - currentDateDay;\n\tlet dayStr = '';\n\tconst timeStr = _dateTimeFormat(date);\n\tif (disTime === 0) {\n\t\tdayStr = textMap.today;\n\t} else if (disTime === -86400000) {\n\t\tdayStr = textMap.yesterday;\n\t} else {\n\t\tdayStr = _dateDayFormat(date, date.getFullYear() !== currentDate.getFullYear());\n\t}\n\treturn `${dayStr} ${timeStr}`;\n}\n\n//date格式化为年月日\nfunction _dateDayFormat(date, showYear = true) {\n\tconst year = date.getFullYear();\n\tconst month = date.getMonth() + 1;\n\tconst day = date.getDate();\n\treturn showYear ? `${year}-${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}` : `${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`;\n}\n\n//data格式化为时分\nfunction _dateTimeFormat(date) {\n\tconst hour = date.getHours();\n\tconst minute = date.getMinutes();\n\treturn `${_fullZeroToTwo(hour)}:${_fullZeroToTwo(minute)}`;\n}\n\n//不满2位在前面填充0\nfunction _fullZeroToTwo(str) {\n\tstr = str.toString();\n\treturn str.length === 1 ? '0' + str : str;\n}\n\n//驼峰转短横线\nfunction _toKebab(value) {\n\treturn value.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\nexport default {\n\tgc,\n\tsetRefesrherTime,\n\tgetRefesrherFormatTimeByKey,\n\tgetTouch,\n\tgetTouchFromZPaging,\n\tgetParent,\n\tconvertToPx,\n\tgetTime,\n\tgetInstanceId,\n\tconsoleErr\n};\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js",
    "content": "// [z-paging]使用renderjs在app-vue和h5中对touchmove事件冒泡进行处理\n\nimport u from '../js/z-paging-utils'\nvar data = {\n\tstartY: 0,\n\tisTouchFromZPaging: false,\n\tisUsePageScroll: false,\n\tisReachedTop: true,\n\tisIosAndH5: false\n}\n\nexport default {\n\tmounted() {\n\t\tthis._handleTouch();\n\t\t// #ifdef APP-VUE\n\t\tthis.$ownerInstance && this.$ownerInstance.callMethod('_checkVirtualListScroll');\n\t\t// #endif\n\t},\n\tmethods: {\n\t\t//接收逻辑层发送的数据\n\t\trenderPropIsIosAndH5Change(newVal) {\n\t\t\tif (newVal === -1) return;\n\t\t\tdata.isIosAndH5 = newVal;\n\t\t},\n\t\t//拦截处理touch事件\n\t\t_handleTouch() {\n\t\t\tif (window && !window.$zPagingRenderJsInited) {\n\t\t\t\twindow.$zPagingRenderJsInited = true;\n\t\t\t\twindow.addEventListener('touchstart', this._handleTouchstart, {\n\t\t\t\t\tpassive: true\n\t\t\t\t})\n\t\t\t\twindow.addEventListener('touchmove', this._handleTouchmove, {\n\t\t\t\t\tpassive: false\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t_handleTouchstart(e) {\n\t\t\tconst touch = u.getTouch(e);\n\t\t\tdata.startY = touch.touchY;\n\t\t\tconst touchResult = u.getTouchFromZPaging(e.target);\n\t\t\tdata.isTouchFromZPaging = touchResult.isFromZp;\n\t\t\tdata.isUsePageScroll = touchResult.isPageScroll;\n\t\t\tdata.isReachedTop = touchResult.isReachedTop;\n\t\t},\n\t\t_handleTouchmove(e) {\n\t\t\tconst touch = u.getTouch(e);\n\t\t\tvar moveY = touch.touchY - data.startY;\n\t\t\tif (data.isTouchFromZPaging && ((data.isReachedTop && moveY > 0)  || (data.isIosAndH5 && !data.isUsePageScroll && moveY < 0))) {\n\t\t\t\tif (e.cancelable && !e.defaultPrevented) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t_removeAllEventListener(){\n\t\t\twindow.removeEventListener('touchstart');\n\t\t\twindow.removeEventListener('touchmove');\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs",
    "content": "// [z-paging]微信小程序、QQ小程序、app-vue、h5上使用wxs实现自定义下拉刷新，降低逻辑层与视图层的通信折损，提升性能\n\nvar currentDis = 0;\nvar isPCFlag = -1;\nvar startY = -1;\n\nfunction propObserver(newValue, oldValue, ownerIns, ins) {\n\tvar state = ownerIns.getState() || {};\n\tstate.currentIns = ins;\n\tvar dataset = ins.getDataset();\n\tvar loading = dataset.loading == true;\n\tif (newValue && newValue.indexOf('end') != -1) {\n\t\tvar transition = newValue.split('end')[0];\n\t\t_setTransform('translateY(0px)', ins, false, transition);\n\t\tstate.moveDis = 0;\n\t\tstate.oldMoveDis = 0;\n\t\tcurrentDis = 0;\n\t} else if (newValue && newValue.indexOf('begin') != -1) {\n\t\tvar refresherThreshold = ins.getDataset().refresherthreshold;\n\t\t_setTransformValue(refresherThreshold, ins, state, false);\n\t}\n}\n\nfunction touchstart(e, ownerIns) {\n\tvar ins = _getIns(ownerIns);\n\tvar state = {};\n\tvar dataset = {};\n\townerIns.callMethod('_handleListTouchstart');\n\tif (ins) {\n\t\tstate = ins.getState();\n\t\tdataset = ins.getDataset();\n\t\tif (_touchDisabled(e, ins, 0)) return;\n\t}\n\tvar isTouchEnded = state.isTouchEnded;\n\tstate.oldMoveDis = 0;\n\tvar touch = _getTouch(e);\n\tvar loading = _getIsTrue(dataset.loading);\n\tstate.startY = touch.touchY;\n\tstartY = state.startY;\n\tstate.lastTouch = touch;\n\tif (!loading && isTouchEnded) {\n\t\tstate.isTouchmoving = false;\n\t}\n\tstate.isTouchEnded = false;\n\townerIns.callMethod('_handleRefresherTouchstart', touch);\n}\n\nfunction touchmove(e, ownerIns) {\n\tvar touch = _getTouch(e);\n\tvar ins = _getIns(ownerIns);\n\tvar dataset = ins.getDataset();\n\tvar refresherThreshold = dataset.refresherthreshold;\n\tvar isIos = _getIsTrue(dataset.isios);\n\tvar state = ins.getState();\n\tvar watchTouchDirectionChange = _getIsTrue(dataset.watchtouchdirectionchange);\n\tvar moveDisObj = {};\n\tvar moveDis = 0;\n\tvar prevent = false;\n\tif (watchTouchDirectionChange) {\n\t\tmoveDisObj = _getMoveDis(e, ins);\n\t\tmoveDis = moveDisObj.currentDis;\n\t\tprevent = moveDisObj.isDown;\n\t\tif(state.oldAcceptedIsDown == prevent){\n\t\t\townerIns.callMethod('_handleTouchDirectionChange', {direction: prevent ? 'top' : 'bottom'}); \n\t\t\tstate.oldIsDown = prevent;\n\t\t}\n\t\tstate.oldAcceptedIsDown = prevent;\n\t}\n\tif (_touchDisabled(e, ins, 1)) {\n\t\t_handlePullingDown(state, ownerIns, false);\n\t\treturn true;\n\t}\n\tif (!_getAngleIsInRange(e, touch, state, dataset)) {\n\t\t_handlePullingDown(state, ownerIns, false);\n\t\treturn true;\n\t}\n\tmoveDisObj = _getMoveDis(e, ins);\n\tmoveDis = moveDisObj.currentDis;\n\tprevent = moveDisObj.isDown;\n\tif (moveDis < 0) {\n\t\t_setTransformValue(0, ins, state, false);\n\t\t_handlePullingDown(state, ownerIns, false);\n\t\treturn true;\n\t}\n\tif (prevent && !state.disabledBounce) {\n\t\tif (isIos) {\n\t\t\townerIns.callMethod('_handleScrollViewDisableBounce', {bounce: false}); \n\t\t}\n\t\tstate.disabledBounce = true;\n\t\t_handlePullingDown(state, ownerIns, prevent);\n\t\treturn !prevent;\n\t}\n\t_setTransformValue(moveDis, ins, state, false);\n\tvar oldRefresherStatus = state.refresherStatus;\n\tvar oldIsTouchmoving = _getIsTrue(dataset.oldistouchmoving);\n\tvar hasTouchmove = _getIsTrue(dataset.hastouchmove);\n\tvar isTouchmoving = state.isTouchmoving;\n\tstate.refresherStatus = moveDis >= refresherThreshold ? 1 : 0;\n\tif (!isTouchmoving) {\n\t\tstate.isTouchmoving = true;\n\t\tisTouchmoving = true;\n\t}\n\tif (state.isTouchEnded) {\n\t\tstate.isTouchEnded = false;\n\t}\n\tif (hasTouchmove) {\n\t\townerIns.callMethod('_handleWxsPullingDown', {moveDis:moveDis, diffDis:moveDisObj.diffDis});\n\t}\n\tif (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || oldIsTouchmoving != isTouchmoving) {\n\t\townerIns.callMethod('_handleRefresherTouchmove', moveDis, touch);\n\t}\n\t_handlePullingDown(state, ownerIns, prevent);\n\treturn !prevent;\n}\n\nfunction touchend(e, ownerIns) {\n\tvar touch = _getTouch(e);\n\tvar ins = _getIns(ownerIns);\n\tvar dataset = ins.getDataset();\n\tvar state = ins.getState();\n\tif (_touchDisabled(e, ins, 2)) return;\n\tstate.reachMaxAngle = true;\n\tstate.hitReachMaxAngleCount = 0;\n\tstate.disabledBounce = false;\n\tstate.fixedIsTopHitCount = 0;\n\t//ownerIns.callMethod('_handleScrollViewDisableBounce', {bounce:true});\n\tif (!state.isTouchmoving) return;\n\tvar oldRefresherStatus = state.refresherStatus;\n\tvar oldMoveDis = state.moveDis;\n\tvar refresherThreshold = ins.getDataset().refresherthreshold\n\tvar moveDis = _getMoveDis(e, ins).currentDis;\n\tif (!(moveDis >= refresherThreshold && oldRefresherStatus === 1)) {\n\t\tstate.isTouchmoving = false;\n\t}\n\townerIns.callMethod('_handleRefresherTouchend', moveDis);\n\tstate.isTouchEnded = true;\n\tif (oldMoveDis < refresherThreshold) return;\n\tvar animate = false;\n\tif (moveDis >= refresherThreshold) {\n\t\tmoveDis = refresherThreshold;\n\t\tanimate = true;\n\t}\n\t_setTransformValue(moveDis, ins, state, animate);\n}\n\n// #ifdef H5\nfunction isPC() {\n\tif (!navigator) return false;\n\tif (isPCFlag != -1) return isPCFlag;\n\tvar userAgentInfo = navigator.userAgent;\n\tvar Agents = [\"Android\", \"iPhone\", \"SymbianOS\", \"Windows Phone\", \"iPad\", \"iPod\"];\n\tvar flag = true;\n\tfor (var i = 0; i < Agents.length; i++) {\n\t\tif (userAgentInfo.indexOf(Agents[i]) > 0) {\n\t\t\tflag = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\tisPCFlag = flag;\n\treturn isPCFlag;\n}\n\nvar movable = false;\n\nfunction mousedown(e, ins) {\n\tif (!isPC()) return;\n\ttouchstart(e, ins);\n\tmovable = true;\n}\n\nfunction mousemove(e, ins) {\n\tif (!isPC()) return;\n\tif (!movable) return;\n\ttouchmove(e, ins);\n}\n\nfunction mouseup(e, ins) {\n\tif (!isPC()) return;\n\ttouchend(e, ins);\n\tmovable = false;\n}\n\nfunction mouseleave(e, ins) {\n\tif (!isPC()) return;\n\tmovable = false;\n}\n// #endif\n\n\nfunction _setTransformValue(value, ins, state, animate) {\n\tvalue = value || 0;\n\tif (state.moveDis == value) return;\n\tstate.moveDis = value;\n\t_setTransform('translateY(' + value + 'px)', ins, animate, '');\n}\n\nfunction _setTransform(transform, ins, animate, transition) {\n\tif (transform == 'translateY(0px)') {\n\t\ttransform = 'none';\n\t}\n\tins.requestAnimationFrame(function() {\n\t\tvar stl = { 'transform': transform };\n\t\tif (animate) {\n\t\t\tstl['transition'] = 'transform .1s linear';\n\t\t}\n\t\tif (transition.length) {\n\t\t\tstl['transition'] = transition;\n\t\t}\n\t\tins.setStyle(stl);\n\t})\n}\n\nfunction _getMoveDis(e, ins) {\n\tvar state = ins.getState();\n\tvar refresherThreshold = parseFloat(ins.getDataset().refresherthreshold);\n\tvar refresherOutRate = parseFloat(ins.getDataset().refresheroutrate);\n\tvar refresherPullRate = parseFloat(ins.getDataset().refresherpullrate);\n\tvar touch = _getTouch(e);\n\tvar currentStartY = !state.startY || state.startY == 'NaN' ? startY : state.startY;\n\tvar moveDis = touch.touchY - currentStartY;\n\tvar oldMoveDis = state.oldMoveDis || 0;\n\tstate.oldMoveDis = moveDis;\n\tvar diffDis = moveDis - oldMoveDis;\n\tif (diffDis > 0) {\n\t\tdiffDis = diffDis * refresherPullRate;\n\t\tif (currentDis > refresherThreshold) {\n\t\t\tdiffDis = diffDis * (1 - refresherOutRate);\n\t\t}\n\t}\n\tdiffDis = diffDis > 100 ? diffDis / 100 : diffDis;\n\tcurrentDis += diffDis;\n\tcurrentDis = Math.max(0, currentDis);\n\treturn {\n\t\tcurrentDis: currentDis,\n\t\tdiffDis: diffDis,\n\t\tisDown: diffDis > 0\n\t};\n}\n\nfunction _getTouch(e) {\n\tvar touch = e;\n\tif (e.touches && e.touches.length) {\n\t\ttouch = e.touches[0];\n\t} else if (e.changedTouches && e.changedTouches.length) {\n\t\ttouch = e.changedTouches[0];\n\t} else if (e.datail && e.datail != {}) {\n\t\ttouch = e.datail;\n\t}\n\treturn {\n\t\ttouchX: touch.clientX,\n\t\ttouchY: touch.clientY\n\t};\n}\n\nfunction _getIns(ownerIns) {\n\tvar ins = ownerIns.getState().currentIns;\n\tif (!ins) {\n\t\townerIns.callMethod('_handlePropUpdate');\n\t}\n\treturn ins;\n}\n\nfunction _touchDisabled(e, ins, processTag) {\n\tvar dataset = ins.getDataset();\n\tvar state = ins.getState();\n\tvar loading = _getIsTrue(dataset.loading);\n\tvar useChatRecordMode = _getIsTrue(dataset.usechatrecordmode);\n\tvar refresherEnabled = _getIsTrue(dataset.refresherenabled);\n\tvar useCustomRefresher = _getIsTrue(dataset.usecustomrefresher);\n\tvar usePageScroll = _getIsTrue(dataset.usepagescroll);\n\tvar pageScrollTop = parseFloat(dataset.pagescrolltop);\n\tvar scrollTop = parseFloat(dataset.scrolltop);\n\tvar finalScrollTop = usePageScroll ? pageScrollTop : scrollTop;\n\tvar fixedIsTop = false;\n\tvar isIos = _getIsTrue(dataset.isios);\n\tif (!isIos && finalScrollTop == (state.startScrollTop || 0) && finalScrollTop <= 105) {\n\t\tfixedIsTop = true;\n\t}\n\tvar fixedIsTopHitCount = state.fixedIsTopHitCount || 0;\n\tif (fixedIsTop) {\n\t\tfixedIsTopHitCount ++;\n\t\tif (fixedIsTopHitCount <= 3) {\n\t\t\tfixedIsTop = false;\n\t\t}\n\t\tstate.fixedIsTopHitCount = fixedIsTopHitCount;\n\t} else {\n\t\tstate.fixedIsTopHitCount = 0;\n\t}\n\tif (!isIos && processTag === 0) {\n\t\tstate.startScrollTop = finalScrollTop || 0;\n\t}\n\tif (!isIos && processTag === 2) {\n\t\tfixedIsTop = true;\n\t}\n\treturn loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || \n\t((usePageScroll && useCustomRefresher && pageScrollTop > 5) && !fixedIsTop) || \n\t((!usePageScroll && useCustomRefresher && scrollTop > 5) && !fixedIsTop);\n}\n\nfunction _getAngleIsInRange(e, touch, state, dataset) {\n\tvar maxAngle = dataset.refreshermaxangle;\n\tvar refresherAecc = _getIsTrue(dataset.refresheraecc);\n\tvar lastTouch = state.lastTouch;\n\tvar reachMaxAngle = state.reachMaxAngle;\n\tvar moveDis = state.oldMoveDis;\n\tif (!lastTouch) return true;\n\tif (maxAngle >= 0 && maxAngle <= 90 && lastTouch) {\n\t\tif ((!moveDis || moveDis < 1) && !refresherAecc && reachMaxAngle != null && !reachMaxAngle) return false;\n\t\tvar x = Math.abs(touch.touchX - lastTouch.touchX);\n\t\tvar y = Math.abs(touch.touchY - lastTouch.touchY);\n\t\tvar z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n\t\tif ((x || y) && x > 1) {\n\t\t\tvar angle = Math.asin(y / z) / Math.PI * 180;\n\t\t\tif (angle < maxAngle) {\n\t\t\t\tvar hitReachMaxAngleCount = state.hitReachMaxAngleCount || 0;\n\t\t\t\tstate.hitReachMaxAngleCount = ++hitReachMaxAngleCount;\n\t\t\t\tif (state.hitReachMaxAngleCount > 2) {\n\t\t\t\t\tstate.lastTouch = touch;\n\t\t\t\t\tstate.reachMaxAngle = false;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\tstate.lastTouch = touch;\n\treturn true;\n}\n\nfunction _handlePullingDown(state, ins, onPullingDown) {\n\tvar oldOnPullingDown = state.onPullingDown || false;\n\tif (oldOnPullingDown != onPullingDown) {\n\t\tins.callMethod('_handleWxsPullingDownStatusChange', onPullingDown);\n\t}\n\tstate.onPullingDown = onPullingDown;\n}\n\nfunction _getIsTrue(value) {\n\tvalue = (typeof(value) === 'string' ? JSON.parse(value) : value) || false;\n\treturn value == true || value == 'true';\n}\n\nmodule.exports = {\n\ttouchstart: touchstart,\n\ttouchmove: touchmove,\n\ttouchend: touchend,\n\tmousedown: mousedown,\n\tmousemove: mousemove,\n\tmouseup: mouseup,\n\tmouseleave: mouseleave,\n\tpropObserver: propObserver\n}\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging/z-paging.vue",
    "content": " <!--                        _             \n  ____     _ __   __ _  __ _(_)_ __   __ _ \n |_  /____| '_ \\ / _` |/ _` | | '_ \\ / _` |\n  / /_____| |_) | (_| | (_| | | | | | (_| |\n /___|    | .__/ \\__,_|\\__, |_|_| |_|\\__, |\n          |_|          |___/         |___/ \nv2.5.3 (2023-02-13)\nby ZXLee\n-->\n<!-- 文档地址：https://z-paging.zxlee.cn -->\n<!-- github地址：https://github.com/SmileZXLee/uni-z-paging -->\n<!-- dcloud地址：https://ext.dcloud.net.cn/plugin?id=3935 -->\n<!-- 反馈QQ群：790460711 -->\n\n<template name=\"z-paging\">\n\t<!-- #ifndef APP-NVUE -->\n\t<view :class=\"{'z-paging-content':true,'z-paging-content-fixed':!usePageScroll&&fixed,'z-paging-content-page':usePageScroll,'z-paging-reached-top':renderPropScrollTop<1}\" :style=\"[finalPagingStyle]\">\n\t\t<!-- #ifndef APP-PLUS -->\n\t\t<view v-if=\"cssSafeAreaInsetBottom===-1\" class=\"zp-safe-area-inset-bottom\"></view>\n\t\t<!-- #endif -->\n\t\t<!-- 顶部固定的slot -->\n\t\t<slot v-if=\"!usePageScroll&&zSlots.top\" name=\"top\" />\n\t\t<view class=\"zp-page-top\" v-else-if=\"usePageScroll&&zSlots.top\" :style=\"[{'top':`${windowTop}px`,'z-index':topZIndex}]\">\n\t\t\t<slot name=\"top\" />\n\t\t</view>\n\t\t<view :class=\"{'zp-view-super':true,'zp-scroll-view-super':!usePageScroll}\" :style=\"[finalScrollViewStyle]\">\n\t\t\t<view v-if=\"zSlots.left\" :class=\"{'zp-page-left':true,'zp-absoulte':finalIsOldWebView}\">\n\t\t\t\t<slot name=\"left\" />\n\t\t\t</view>\n\t\t\t<view :class=\"{'zp-scroll-view-container':true,'zp-absoulte':finalIsOldWebView}\" :style=\"[scrollViewContainerStyle]\">\n\t\t\t\t<scroll-view\n\t\t\t\t\tref=\"zp-scroll-view\" :class=\"{'zp-scroll-view':true,'zp-scroll-view-absolute':!usePageScroll,'zp-scroll-view-hide-scrollbar':!showScrollbar}\"\n\t\t\t\t\t:scroll-top=\"scrollTop\" :scroll-x=\"scrollX\"\n\t\t\t\t\t:scroll-y=\"scrollable&&!usePageScroll&&scrollEnable&&(refresherCompleteScrollable?true:refresherStatus!==R.Complete)\" :enable-back-to-top=\"finalEnableBackToTop\"\n\t\t\t\t\t:show-scrollbar=\"showScrollbar\" :scroll-with-animation=\"finalScrollWithAnimation\"\n\t\t\t\t\t:scroll-into-view=\"scrollIntoView\" :lower-threshold=\"finalLowerThreshold\" :upper-threshold=\"5\"\n\t\t\t\t\t:refresher-enabled=\"finalRefresherEnabled&&!useCustomRefresher\" :refresher-threshold=\"finalRefresherThreshold\"\n\t\t\t\t\t:refresher-default-style=\"finalRefresherDefaultStyle\" :refresher-background=\"refresherBackground\"\n\t\t\t\t\t:refresher-triggered=\"finalRefresherTriggered\" @scroll=\"_scroll\" @scrolltolower=\"_onScrollToLower\"\n\t\t\t\t\t@scrolltoupper=\"_onScrollToUpper\" @refresherrestore=\"_onRestore\" @refresherrefresh=\"_onRefresh(true)\"\n\t\t\t\t\t>\t\n\t\t\t\t\t<view class=\"zp-paging-touch-view\"\n\t\t\t\t\t<!-- #ifndef APP-VUE || MP-WEIXIN || MP-QQ  || H5 -->\n\t\t\t\t\t@touchstart=\"_refresherTouchstart\" @touchmove=\"_refresherTouchmove\" @touchend=\"_refresherTouchend\" @touchcancel=\"_refresherTouchend\"\n\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->\n\t\t\t\t\t@touchstart=\"pagingWxs.touchstart\" @touchmove.stop=\"pagingWxs.touchmove\" @touchend=\"pagingWxs.touchend\" @touchcancel=\"pagingWxs.touchend\"\n\t\t\t\t\t@mousedown=\"pagingWxs.mousedown\" @mousemove=\"pagingWxs.mousemove\" @mouseup=\"pagingWxs.mouseup\" @mouseleave=\"pagingWxs.mouseleave\"\n\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t>\t\n\t\t\t\t\t\t<view v-if=\"finalRefresherFixedBacHeight>0\" class=\"zp-fixed-bac-view\" :style=\"[{'background': refresherFixedBackground,'height': `${finalRefresherFixedBacHeight}px`}]\"></view>\n\t\t\t\t\t\t<view class=\"zp-paging-main\" :style=\"[scrollViewInStyle,{'transform': finalRefresherTransform,'transition': refresherTransition}]\"\n\t\t\t\t\t\t<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->\n\t\t\t\t\t\t:change:prop=\"pagingWxs.propObserver\" :prop=\"wxsPropType\"\n\t\t\t\t\t\t:data-refresherThreshold=\"finalRefresherThreshold\" :data-isIos=\"isIos\"\n\t\t\t\t\t\t:data-loading=\"loading||isRefresherInComplete\" :data-useChatRecordMode=\"useChatRecordMode\" \n\t\t\t\t\t\t:data-refresherEnabled=\"refresherEnabled\" :data-useCustomRefresher=\"useCustomRefresher\" :data-pageScrollTop=\"wxsPageScrollTop\"\n\t\t\t\t\t\t:data-scrollTop=\"wxsScrollTop\" :data-refresherMaxAngle=\"refresherMaxAngle\" \n\t\t\t\t\t\t:data-refresherAecc=\"refresherAngleEnableChangeContinued\" :data-usePageScroll=\"usePageScroll\" :data-watchTouchDirectionChange=\"watchTouchDirectionChange\"\n\t\t\t\t\t\t:data-oldIsTouchmoving=\"isTouchmoving\" :data-refresherOutRate=\"finalRefresherOutRate\" :data-refresherPullRate=\"finalRefresherPullRate\" :data-hasTouchmove=\"hasTouchmove\"\n\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t<!-- #ifdef APP-VUE || H5 -->\n\t\t\t\t\t\t:change:renderPropIsIosAndH5=\"pagingRenderjs.renderPropIsIosAndH5Change\" :renderPropIsIosAndH5=\"isIosAndH5\"\n\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t>\t\n\t\t\t\t\t\t\t<view v-if=\"showRefresher\" class=\"zp-custom-refresher-view\" :style=\"[{'margin-top': `-${finalRefresherThreshold}px`,'background': refresherBackground,'opacity': isTouchmoving ? 1 : 0}]\">\n\t\t\t\t\t\t\t\t<view class=\"zp-custom-refresher-container\" :style=\"[{'height': `${finalRefresherThreshold}px`,'background': refresherBackground}]\">\n\t\t\t\t\t\t\t\t\t<!-- 下拉刷新view -->\n\t\t\t\t\t\t\t\t\t<view class=\"zp-custom-refresher-slot-view\">\n\t\t\t\t\t\t\t\t\t\t<slot v-if=\"!(zSlots.refresherComplete&&refresherStatus===R.Complete)\" :refresherStatus=\"refresherStatus\" name=\"refresher\" />\n\t\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t\t\t<slot v-if=\"zSlots.refresherComplete&&refresherStatus===R.Complete\" name=\"refresherComplete\" />\n\t\t\t\t\t\t\t\t\t<z-paging-refresh ref=\"refresh\" v-else-if=\"!showCustomRefresher\" :style=\"[{'height': `${finalRefresherThreshold}px`}]\" :status=\"refresherStatus\"\n\t\t\t\t\t\t\t\t\t\t:defaultThemeStyle=\"finalRefresherThemeStyle\" :defaultText=\"finalRefresherDefaultText\"\n\t\t\t\t\t\t\t\t\t\t:pullingText=\"finalRefresherPullingText\" :refreshingText=\"finalRefresherRefreshingText\" :completeText=\"finalRefresherCompleteText\"\n\t\t\t\t\t\t\t\t\t\t:defaultImg=\"refresherDefaultImg\" :pullingImg=\"refresherPullingImg\" :refreshingImg=\"refresherRefreshingImg\" :completeImg=\"refresherCompleteImg\"\n\t\t\t\t\t\t\t\t\t\t:showUpdateTime=\"showRefresherUpdateTime\" :updateTimeKey=\"refresherUpdateTimeKey\" :updateTimeTextMap=\"finalRefresherUpdateTimeTextMap\"\n\t\t\t\t\t\t\t\t\t\t:imgStyle=\"refresherImgStyle\" :titleStyle=\"refresherTitleStyle\" :updateTimeStyle=\"refresherUpdateTimeStyle\" />\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\t<view class=\"zp-paging-container\">\n\t\t\t\t\t\t\t\t<slot v-if=\"useChatRecordMode&&zSlots.chatLoading&&loadingStatus!==M.NoMore&&realTotalData.length\" name=\"chatLoading\" />\n\t\t\t\t\t\t\t\t<view v-else-if=\"useChatRecordMode&&loadingStatus!==M.NoMore&&realTotalData.length\" class=\"zp-chat-record-loading-container\">\n\t\t\t\t\t\t\t\t\t<text v-if=\"loadingStatus!==M.Loading\" @click=\"_onScrollToUpper\"\n\t\t\t\t\t\t\t\t\t\t:class=\"defaultThemeStyle==='white'?'zp-loading-more-text zp-loading-more-text-white':'zp-loading-more-text zp-loading-more-text-black'\">{{chatRecordLoadingMoreText}}</text>\n\t\t\t\t\t\t\t\t\t<image v-else :src=\"base64Flower\" class=\"zp-chat-record-loading-custom-image\" />\n\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t\t<!-- 全屏Loading -->\n\t\t\t\t\t\t\t\t<slot v-if=\"showLoading&&zSlots.loading&&!loadingFullFixed\" name=\"loading\" />\n\t\t\t\t\t\t\t\t<!-- 主体内容 -->\n\t\t\t\t\t\t\t\t<view class=\"zp-paging-container-content\" :style=\"[{transform:virtualPlaceholderTopHeight>0?`translateY(${virtualPlaceholderTopHeight}px)`:'none'},finalPagingContentStyle]\">\n\t\t\t\t\t\t\t\t\t<slot />\n\t\t\t\t\t\t\t\t\t<!-- 内置列表&虚拟列表 -->\n\t\t\t\t\t\t\t\t\t<template v-if=\"finalUseInnerList\">\n\t\t\t\t\t\t\t\t\t\t<slot name=\"header\"/>\n\t\t\t\t\t\t\t\t\t\t<view class=\"zp-list-container\" :style=\"[innerListStyle]\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"finalUseVirtualList\">\n\t\t\t\t\t\t\t\t\t\t\t\t<view class=\"zp-list-cell\" :style=\"[innerCellStyle]\" :id=\"`zp-id-${item['zp_index']}`\" v-for=\"(item,index) in virtualList\" :key=\"item['zp_unique_index']\" @click=\"_innerCellClick(item,virtualTopRangeIndex+index)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<view v-if=\"useCompatibilityMode\">使用兼容模式请在组件源码z-paging.vue第99行中注释这一行，并打开下面一行注释</view>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- <zp-public-virtual-cell v-if=\"useCompatibilityMode\" :extraData=\"extraData\" :item=\"item\" :index=\"virtualTopRangeIndex+index\" /> -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t<slot v-else name=\"cell\" :item=\"item\" :index=\"virtualTopRangeIndex+index\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t\t\t<view class=\"zp-list-cell\" v-for=\"(item,index) in realTotalData\" :key=\"index\" @click=\"_innerCellClick(item,index)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<slot name=\"cell\" :item=\"item\" :index=\"index\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t\t\t\t<slot name=\"footer\"/>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<view v-if=\"useVirtualList\" class=\"zp-virtual-placeholder\" :style=\"[{height:virtualPlaceholderBottomHeight+'px'}]\"/>\n\t\t\t\t\t\t\t\t\t<!-- 上拉加载更多view -->\n\t\t\t\t\t\t\t\t\t<!-- #ifndef MP-ALIPAY -->\n\t\t\t\t\t\t\t\t\t<slot v-if=\"showLoadingMoreDefault\" name=\"loadingMoreDefault\" />\n\t\t\t\t\t\t\t\t\t<slot v-else-if=\"showLoadingMoreLoading\" name=\"loadingMoreLoading\" />\n\t\t\t\t\t\t\t\t\t<slot v-else-if=\"showLoadingMoreNoMore\" name=\"loadingMoreNoMore\" />\n\t\t\t\t\t\t\t\t\t<slot v-else-if=\"showLoadingMoreFail\" name=\"loadingMoreFail\" />\n\t\t\t\t\t\t\t\t\t<z-paging-load-more @doClick=\"_onLoadingMore('click')\" v-else-if=\"showLoadingMoreCustom\" :zConfig=\"zLoadMoreConfig\" />\n\t\t\t\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t\t\t\t<!-- #ifdef MP-ALIPAY -->\n\t\t\t\t\t\t\t\t\t<slot v-if=\"loadingStatus===M.Default&&zSlots.loadingMoreDefault&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode\" name=\"loadingMoreDefault\" />\n\t\t\t\t\t\t\t\t\t<slot v-else-if=\"loadingStatus===M.Loading&&zSlots.loadingMoreLoading&&showLoadingMore&&loadingMoreEnabled\" name=\"loadingMoreLoading\" />\n\t\t\t\t\t\t\t\t\t<slot v-else-if=\"loadingStatus===M.NoMore&&zSlots.loadingMoreNoMore&&showLoadingMore&&showLoadingMoreNoMoreView&&loadingMoreEnabled&&!useChatRecordMode\" name=\"loadingMoreNoMore\" />\n\t\t\t\t\t\t\t\t\t<slot v-else-if=\"loadingStatus===M.Fail&&zSlots.loadingMoreFail&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode\" name=\"loadingMoreFail\" />\n\t\t\t\t\t\t\t\t\t<z-paging-load-more @doClick=\"_onLoadingMore('click')\" v-else-if=\"showLoadingMore&&showDefaultLoadingMoreText&&!(loadingStatus===M.NoMore&&!showLoadingMoreNoMoreView)&&loadingMoreEnabled&&!useChatRecordMode\" :zConfig=\"zLoadMoreConfig\" />\n\t\t\t\t\t\t\t\t\t<!-- #endif -->\n\t\t\t\t\t\t\t\t\t<view v-if=\"safeAreaInsetBottom && useSafeAreaPlaceholder\" class=\"zp-safe-area-placeholder\" :style=\"[{height:safeAreaBottom+'px'}]\" />\n\t\t\t\t\t\t\t\t</view>\n\t\t\t\t\t\t\t\t<!-- 空数据图 -->\n\t\t\t\t\t\t\t\t<view :class=\"{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}\" :style=\"[{emptyViewSuperStyle}]\" v-if=\"showEmpty\">\n\t\t\t\t\t\t\t\t\t<slot v-if=\"zSlots.empty\" name=\"empty\" :isLoadFailed=\"isLoadFailed\"/>\n\t\t\t\t\t\t\t\t\t<z-paging-empty-view v-else :emptyViewImg=\"finalEmptyViewImg\" :emptyViewText=\"finalEmptyViewText\" :showEmptyViewReload=\"finalShowEmptyViewReload\" \n\t\t\t\t\t\t\t\t\t:emptyViewReloadText=\"finalEmptyViewReloadText\" :isLoadFailed=\"isLoadFailed\" :emptyViewStyle=\"emptyViewStyle\" :emptyViewTitleStyle=\"emptyViewTitleStyle\" \n\t\t\t\t\t\t\t\t\t:emptyViewImgStyle=\"emptyViewImgStyle\" :emptyViewReloadStyle=\"emptyViewReloadStyle\" :emptyViewZIndex=\"emptyViewZIndex\" :emptyViewFixed=\"emptyViewFixed\" \n\t\t\t\t\t\t\t\t\t@reload=\"_emptyViewReload\" @viewClick=\"_emptyViewClick\" />\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</scroll-view>\n\t\t\t</view>\n\t\t\t<view v-if=\"zSlots.right\" :class=\"{'zp-page-right':true,'zp-absoulte zp-right':finalIsOldWebView}\">\n\t\t\t\t<slot name=\"right\" />\n\t\t\t</view>\n\t\t</view>\n\t\t<!-- 底部固定的slot -->\n\t\t<slot v-if=\"!usePageScroll&&zSlots.bottom\" name=\"bottom\" />\n\t\t<view class=\"zp-page-bottom\" v-else-if=\"usePageScroll&&zSlots.bottom\" :style=\"[{'bottom': `${windowBottom}px`}]\">\n\t\t\t<slot name=\"bottom\" />\n\t\t</view>\n\t\t<!-- 点击返回顶部view -->\n\t\t<view v-if=\"showBackToTopClass\" :class=\"backToTopClass\" :style=\"[finalBackToTopStyle]\" @click.stop=\"_backToTopClick\">\n\t\t\t<slot v-if=\"zSlots.backToTop\" name=\"backToTop\" />\n\t\t\t<image v-else class=\"zp-back-to-top-img\" :src=\"backToTopImg.length?backToTopImg:base64BackToTop\" />\n\t\t</view>\n\t\t<!-- 全屏Loading(铺满z-paging并固定) -->\n\t\t<view v-if=\"showLoading&&zSlots.loading&&loadingFullFixed\" class=\"zp-loading-fixed\">\n\t\t\t<slot name=\"loading\" />\n\t\t</view>\n\t</view>\n\t<!-- #endif -->\n\t<!-- #ifdef APP-NVUE -->\n\t<component :is=\"finalNvueSuperListIs\" :style=\"[finalPagingStyle]\" :class=\"{'z-paging-content-fixed':fixed&&!usePageScroll}\" :scrollable=\"false\">\n\t\t<!-- 顶部固定的slot -->\n\t\t<view ref=\"zp-page-top\" v-if=\"zSlots.top\" :class=\"{'zp-page-top':usePageScroll}\" :style=\"[usePageScroll?{'top':`${windowTop}px`,'z-index':topZIndex}:{}]\">\n\t\t\t<slot name=\"top\" />\n\t\t</view>\n\t\t<component :is=\"finalNvueSuperListIs\" class=\"zp-n-list-container\" :scrollable=\"false\">\n\t\t\t<view v-if=\"zSlots.left\" class=\"zp-page-left\">\n\t\t\t\t<slot name=\"left\" />\n\t\t\t</view>\n\t\t\t<component :is=\"finalNvueListIs\" ref=\"zp-n-list\" :id=\"nvueListId\" :style=\"[{'flex': 1,'top':isIos?'0px':'-1px'},usePageScroll?scrollViewStyle:{},nChatRecordRotateStyle]\" :alwaysScrollableVertical=\"true\"\n\t\t\t\t:fixFreezing=\"nFixFreezing\" :show-scrollbar=\"showScrollbar&&!useChatRecordMode\" :loadmoreoffset=\"finalLowerThreshold\" :enable-back-to-top=\"enableBackToTop\"\n\t\t\t\t:scrollable=\"scrollable&&scrollEnable&&(refresherCompleteScrollable?true:refresherStatus!==R.Complete)\" :bounce=\"nvueBounce\" :column-count=\"nWaterfallColumnCount\" :column-width=\"nWaterfallColumnWidth\"\n\t\t\t\t:column-gap=\"nWaterfallColumnGap\" :left-gap=\"nWaterfallLeftGap\" :right-gap=\"nWaterfallRightGap\" :pagingEnabled=\"nvuePagingEnabled\" :offset-accuracy=\"offsetAccuracy\"\n\t\t\t\t@loadmore=\"_nOnLoadmore\" @scroll=\"_nOnScroll\">\n\t\t\t\t<refresh v-if=\"(zSlots.top?cacheTopHeight!==-1:true)&&finalNvueRefresherEnabled\" class=\"zp-n-refresh\" :style=\"[nvueRefresherStyle]\" :display=\"nRefresherLoading?'show':'hide'\" @refresh=\"_nOnRrefresh\" @pullingdown=\"_nOnPullingdown\">\n\t\t\t\t\t<view ref=\"zp-n-refresh-container\" class=\"zp-n-refresh-container\" :style=\"[{background:refresherBackground,width:nRefresherWidth}]\" id=\"zp-n-refresh-container\">\n\t\t\t\t\t\t<!-- 下拉刷新view -->\n\t\t\t\t\t\t<slot v-if=\"zSlots.refresherComplete&&refresherStatus===R.Complete\" name=\"refresherComplete\" />\n\t\t\t\t\t\t<slot v-else-if=\"(nScopedSlots?nScopedSlots:zSlots).refresher\" :refresherStatus=\"refresherStatus\" name=\"refresher\" />\n\t\t\t\t\t\t<z-paging-refresh ref=\"refresh\" v-else :status=\"refresherStatus\" :defaultThemeStyle=\"finalRefresherThemeStyle\"\n\t\t\t\t\t\t\t:defaultText=\"finalRefresherDefaultText\" :pullingText=\"finalRefresherPullingText\" :refreshingText=\"finalRefresherRefreshingText\" :completeText=\"finalRefresherCompleteText\"\n\t\t\t\t\t\t\t:defaultImg=\"refresherDefaultImg\" :pullingImg=\"refresherPullingImg\" :refreshingImg=\"refresherRefreshingImg\" :completeImg=\"refresherCompleteImg\"\n\t\t\t\t\t\t\t:showUpdateTime=\"showRefresherUpdateTime\" :updateTimeKey=\"refresherUpdateTimeKey\" :updateTimeTextMap=\"finalRefresherUpdateTimeTextMap\"\n\t\t\t\t\t\t\t:imgStyle=\"refresherImgStyle\" :titleStyle=\"refresherTitleStyle\" :updateTimeStyle=\"refresherUpdateTimeStyle\" />\n\t\t\t\t\t</view>\n\t\t\t\t</refresh>\n\t\t\t\t<component :is=\"nViewIs\" v-if=\"isIos&&!useChatRecordMode?oldScrollTop>10:true\" ref=\"zp-n-list-top-tag\" class=\"zp-n-list-top-tag\" style=\"margin-top: -1rpx;\" :style=\"[{height:finalNvueRefresherEnabled?'0px':'1px'}]\"></component>\n\t\t\t\t<component :is=\"nViewIs\" v-if=\"nShowRefresherReveal\" ref=\"zp-n-list-refresher-reveal\" :style=\"[{transform:`translateY(-${nShowRefresherRevealHeight}px)`},{background:refresherBackground}]\">\n\t\t\t\t\t<!-- 下拉刷新view -->\n\t\t\t\t\t<slot v-if=\"zSlots.refresherComplete&&refresherStatus===R.Complete\" name=\"refresherComplete\" />\n\t\t\t\t\t<slot v-else-if=\"(nScopedSlots?nScopedSlots:$slots).refresher\" :refresherStatus=\"R.Loading\" name=\"refresher\" />\n\t\t\t\t\t<z-paging-refresh ref=\"refresh\" v-else :status=\"R.Loading\" :defaultThemeStyle=\"finalRefresherThemeStyle\"\n\t\t\t\t\t\t:defaultText=\"finalRefresherDefaultText\" :pullingText=\"finalRefresherPullingText\" :refreshingText=\"finalRefresherRefreshingText\" :completeText=\"finalRefresherCompleteText\" \n\t\t\t\t\t\t:defaultImg=\"refresherDefaultImg\" :pullingImg=\"refresherPullingImg\" :refreshingImg=\"refresherRefreshingImg\" :completeImg=\"refresherCompleteImg\"\n\t\t\t\t\t\t:showUpdateTime=\"showRefresherUpdateTime\" :updateTimeKey=\"refresherUpdateTimeKey\" :updateTimeTextMap=\"finalRefresherUpdateTimeTextMap\"\n\t\t\t\t\t\t:imgStyle=\"refresherImgStyle\" :titleStyle=\"refresherTitleStyle\" :updateTimeStyle=\"refresherUpdateTimeStyle\" />\n\t\t\t\t</component>\n\t\t\t\t<template v-if=\"finalUseInnerList\">\n\t\t\t\t\t<component :is=\"nViewIs\">\n\t\t\t\t\t\t<slot name=\"header\"/>\n\t\t\t\t\t</component>\t\n\t\t\t\t\t<component :is=\"nViewIs\" class=\"zp-list-cell\" v-for=\"(item,index) in realTotalData\" :key=\"finalCellKeyName.length?item[finalCellKeyName]:index\">\n\t\t\t\t\t\t<slot name=\"cell\" :item=\"item\" :index=\"index\"/>\n\t\t\t\t\t</component>\n\t\t\t\t\t<component :is=\"nViewIs\">\n\t\t\t\t\t\t<slot name=\"footer\"/>\n\t\t\t\t\t</component>\t\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<slot />\n\t\t\t\t</template>\n\t\t\t\t<!-- 全屏Loading -->\n\t\t\t\t<component :is=\"nViewIs\" v-if=\"showLoading&&zSlots.loading&&!loadingFullFixed\" :class=\"{'z-paging-content-fixed':usePageScroll}\" style=\"flex: 1;\" :style=\"[nChatRecordRotateStyle]\">\n\t\t\t\t\t<slot name=\"loading\" />\n\t\t\t\t</component>\n\t\t\t\t<!-- 空数据图 -->\n\t\t\t\t<component :is=\"nViewIs\" v-if=\"showEmpty\" :class=\"{'z-paging-content-fixed':usePageScroll}\" :style=\"[{flex:emptyViewCenter?1:0},emptyViewSuperStyle,nChatRecordRotateStyle]\">\n\t\t\t\t\t<view :class=\"{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}\">\n\t\t\t\t\t\t<slot v-if=\"zSlots.empty\" name=\"empty\" :isLoadFailed=\"isLoadFailed\" />\n\t\t\t\t\t\t<z-paging-empty-view v-else :emptyViewImg=\"finalEmptyViewImg\" :emptyViewText=\"finalEmptyViewText\" :showEmptyViewReload=\"finalShowEmptyViewReload\" \n\t\t\t\t\t\t:emptyViewReloadText=\"finalEmptyViewReloadText\" :isLoadFailed=\"isLoadFailed\" :emptyViewStyle=\"emptyViewStyle\" :emptyViewTitleStyle=\"emptyViewTitleStyle\" \n\t\t\t\t\t\t:emptyViewImgStyle=\"emptyViewImgStyle\" :emptyViewReloadStyle=\"emptyViewReloadStyle\" :emptyViewZIndex=\"emptyViewZIndex\" :emptyViewFixed=\"emptyViewFixed\" \n\t\t\t\t\t\t@reload=\"_emptyViewReload\" @viewClick=\"_emptyViewClick\" />\n\t\t\t\t\t</view>\n\t\t\t\t</component>\n\t\t\t\t<component is=\"header\" v-if=\"!hideNvueBottomTag\" ref=\"zp-n-list-bottom-tag\" class=\"zp-n-list-bottom-tag\"></component>\n\t\t\t\t<!-- 上拉加载更多view -->\n\t\t\t\t<component :is=\"nViewIs\" v-if=\"!refresherOnly&&loadingMoreEnabled\">\n\t\t\t\t\t<view v-if=\"useChatRecordMode\">\n\t\t\t\t\t\t<view v-if=\"loadingStatus!==M.NoMore&&realTotalData.length\">\n\t\t\t\t\t\t\t<slot v-if=\"zSlots.chatLoading\" name=\"chatLoading\" />\n\t\t\t\t\t\t\t<view v-else class=\"zp-chat-record-loading-container\">\n\t\t\t\t\t\t\t\t<text v-if=\"loadingStatus!==M.Loading\" @click=\"_onScrollToUpper\"\n\t\t\t\t\t\t\t\t\t:class=\"defaultThemeStyle==='white'?'zp-loading-more-text zp-loading-more-text-white':'zp-loading-more-text zp-loading-more-text-black'\">{{chatRecordLoadingMoreText}}</text>\n\t\t\t\t\t\t\t\t<view>\n\t\t\t\t\t\t\t\t\t<loading-indicator v-if=\"loadingStatus===M.Loading\" class=\"zp-line-loading-image\" animating />\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\t<view :style=\"nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:'80rpx'}:{}\">\n\t\t\t\t\t\t<slot v-if=\"showLoadingMoreDefault\" name=\"loadingMoreDefault\" />\n\t\t\t\t\t\t<slot v-else-if=\"showLoadingMoreLoading\" name=\"loadingMoreLoading\" />\n\t\t\t\t\t\t<slot v-else-if=\"showLoadingMoreNoMore\" name=\"loadingMoreNoMore\" />\n\t\t\t\t\t\t<slot v-else-if=\"showLoadingMoreFail\" name=\"loadingMoreFail\" />\n\t\t\t\t\t\t<z-paging-load-more @doClick=\"_onLoadingMore('click')\" v-else-if=\"showLoadingMoreCustom\" :zConfig=\"zLoadMoreConfig\" />\n\t\t\t\t\t\t<view v-if=\"safeAreaInsetBottom && useSafeAreaPlaceholder\" class=\"zp-safe-area-placeholder\" :style=\"[{height:safeAreaBottom+'px'}]\" />\n\t\t\t\t\t</view>\n\t\t\t\t</component>\n\t\t\t</component>\n\t\t\t<view v-if=\"zSlots.right\" class=\"zp-page-right\">\n\t\t\t\t<slot name=\"right\" />\n\t\t\t</view>\n\t\t</component>\n\t\t<!-- 底部固定的slot -->\n\t\t<slot name=\"bottom\" />\n\t\t<!-- 点击返回顶部view -->\n\t\t<view v-if=\"showBackToTopClass\" :class=\"backToTopClass\" :style=\"[finalBackToTopStyle]\" @click.stop=\"_backToTopClick\">\n\t\t\t<slot v-if=\"zSlots.backToTop\" name=\"backToTop\" />\n\t\t\t<image v-else class=\"zp-back-to-top-img\" :src=\"backToTopImg.length?backToTopImg:base64BackToTop\" />\n\t\t</view>\n\t\t<!-- 全屏Loading(铺满z-paging并固定) -->\n\t\t<view v-if=\"showLoading&&zSlots.loading&&loadingFullFixed\" class=\"zp-loading-fixed\">\n\t\t\t<slot name=\"loading\" />\n\t\t</view>\n\t</component>\n\t<!-- #endif -->\n</template>\n<!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->\n<script src=\"./wxs/z-paging-wxs.wxs\" module=\"pagingWxs\" lang=\"wxs\"></script>\n<!-- #endif -->\n<script module=\"pagingRenderjs\" lang=\"renderjs\">\n\timport pagingRenderjs from './wxs/z-paging-renderjs.js';\n\t/**\n\t * z-paging 分页组件\n\t * @description 高性能，全平台兼容。支持虚拟列表，支持nvue、vue3\n\t * @tutorial https://z-paging.zxlee.cn\n\t * @notice 以下仅为部分常用属性、方法和事件，完整文档请查阅z-paging官网\n\t * @property {Number|String} default-page-no 自定义初始的pageNo，默认为1\n\t * @property {Number|String} default-page-size 自定义pageSize，默认为10\n\t * @property {Object} paging-style 设置z-paging的style，部分平台(如微信小程序)无法直接修改组件的style，可使用此属性代替\n\t * @property {String} height z-paging的高度，优先级低于pagingStyle中设置的height，传字符串，如100px、100rpx、100%\n\t * @property {String} width z-paging的宽度，优先级低于pagingStyle中设置的width，传字符串，如100px、100rpx、100%\n\t * @property {String} bg-color z-paging的背景色，优先级低于pagingStyle中设置的background。传字符串，如\"#ffffff\"\n\t * @property {Boolean} use-page-scroll 使用页面滚动，默认为否\n\t * @property {Boolean} use-virtual-list 是否使用虚拟列表，默认为否\n\t * @property {Boolean} fixed z-paging是否使用fixed布局，若使用fixed布局，则z-paging的父view无需固定高度，z-paging高度默认为100%，默认为是(当使用内置scroll-view滚动时有效)\n\t * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区域适配，默认为否\n\t * @property {Boolean} auto [z-paging]mounted后是否自动调用reload方法(mounted后自动调用接口)，默认为是\n\t * @property {Boolean} use-chat-record-mode 使用聊天记录模式，默认为否\n\t * @event {Function} query 下拉刷新或滚动到底部时会自动触发此方法。z-paging加载时也会触发(若要禁止，请设置:auto=\"false\")。pageNo和pageSize会自动计算好，直接传给服务器即可。\n\t * @example <z-paging ref=\"paging\" v-model=\"dataList\" @query=\"queryList\"></z-paging>\n\t */\n\texport default {\n\t\tname:\"z-paging\",\n\t\t// #ifdef APP-VUE || H5\n\t\tmixins: [pagingRenderjs],\n\t\t// #endif\n\t}\n</script>\n<script src=\"./js/z-paging-main.js\" />\n\t\n<style scoped>\n\t@import \"./css/z-paging-main.css\";\n\t@import \"./css/z-paging-static.css\";\n</style>\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging-cell/z-paging-cell.vue",
    "content": "<!-- z-paging -->\n<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->\n<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->\n<!-- 反馈QQ群：790460711 -->\n\n<!-- z-paging-cell，用于在nvue中使用cell包裹，vue中使用view包裹 -->\n<template>\n\t<!-- #ifdef APP-NVUE -->\n\t<cell :style=\"[cellStyle]\">\n\t\t<slot />\n\t</cell>\n\t<!-- #endif -->\n\t<!-- #ifndef APP-NVUE -->\n\t<view :style=\"[cellStyle]\">\n\t\t<slot />\n\t</view>\n\t<!-- #endif -->\n</template>\n\n<script>\n\texport default {\n\t\tname: \"z-paging-cell\",\n\t\tprops: {\n\t\t\t//cellStyle\n\t\t\tcellStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n                    return {}\n                }\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue",
    "content": "<!-- z-paging -->\n<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->\n<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->\n<!-- 反馈QQ群：790460711 -->\n\n<!-- 空数据占位view，此组件支持easycom规范，可以在项目中直接引用 -->\n<template>\n\t<view :class=\"{'zp-container':true,'zp-container-fixed':emptyViewFixed}\" :style=\"[finalEmptyViewStyle]\" @click=\"emptyViewClick\">\n\t\t<view class=\"zp-main\">\n\t\t\t<image v-if=\"!emptyViewImg.length\" class=\"zp-main-image\" :style=\"[emptyViewImgStyle]\" :src=\"emptyImg\" />\n\t\t\t<image v-else class=\"zp-main-image\" mode=\"aspectFit\" :style=\"[emptyViewImgStyle]\" :src=\"emptyViewImg\" />\n\t\t\t<text class=\"zp-main-title\" :style=\"[emptyViewTitleStyle]\">{{emptyViewText}}</text>\n\t\t\t<text v-if=\"showEmptyViewReload\" class=\"zp-main-error-btn\" :style=\"[emptyViewReloadStyle]\" @click.stop=\"reloadClick\">{{emptyViewReloadText}}</text>\n\t\t</view>\n\t</view>\n</template>\n\n<script>\n\timport zStatic from '../z-paging/js/z-paging-static'\n\texport default {\n\t\tname: \"z-paging-empty-view\",\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\t\n\t\t\t};\n\t\t},\n\t\tprops: {\n\t\t\t//空数据描述文字\n\t\t\temptyViewText: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '没有数据哦~'\n\t\t\t},\n\t\t\t//空数据图片\n\t\t\temptyViewImg: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: ''\n\t\t\t},\n\t\t\t//是否显示空数据图重新加载按钮\n\t\t\tshowEmptyViewReload: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: false\n\t\t\t},\n\t\t\t//空数据点击重新加载文字\n\t\t\temptyViewReloadText: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: '重新加载'\n\t\t\t},\n\t\t\t//是否是加载失败\n\t\t\tisLoadFailed: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: false\n\t\t\t},\n\t\t\t//空数据图样式\n\t\t\temptyViewStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n                    return {}\n                }\n\t\t\t},\n\t\t\t//空数据图img样式\n\t\t\temptyViewImgStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n\t\t\t\t    return {}\n\t\t\t\t}\n\t\t\t},\n\t\t\t//空数据图描述文字样式\n\t\t\temptyViewTitleStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n\t\t\t\t    return {}\n\t\t\t\t}\n\t\t\t},\n\t\t\t//空数据图重新加载按钮样式\n\t\t\temptyViewReloadStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n\t\t\t\t    return {}\n\t\t\t\t}\n\t\t\t},\n\t\t\t//空数据图z-index\n\t\t\temptyViewZIndex: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: 9\n\t\t\t},\n\t\t\t//空数据图片是否使用fixed布局并铺满z-paging\n\t\t\temptyViewFixed: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t}\n\t\t},\n\t\tcomputed: {\n\t\t\temptyImg() {\n                return this.isLoadFailed ? zStatic.base64Error : zStatic.base64Empty;\n\t\t\t},\n\t\t\tfinalEmptyViewStyle(){\n\t\t\t\tthis.emptyViewStyle['z-index'] = this.emptyViewZIndex;\n\t\t\t\treturn this.emptyViewStyle;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\treloadClick() {\n\t\t\t\tthis.$emit('reload');\n\t\t\t},\n\t\t\temptyViewClick() {\n\t\t\t\tthis.$emit('viewClick');\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t.zp-container{\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\t.zp-container-fixed {\n\t\t/* #ifndef APP-NVUE */\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\t/* #endif */\n\t\t/* #ifdef APP-NVUE */\n\t\tflex: 1;\n\t\t/* #endif */\n\t}\n\n\t.zp-main{\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: column;\n\t\talign-items: center;\n        padding: 50rpx 0rpx;\n\t}\n\n\t.zp-main-image {\n\t\twidth: 200rpx;\n\t\theight: 200rpx;\n\t}\n\n\t.zp-main-title {\n\t\tfont-size: 26rpx;\n\t\tcolor: #aaaaaa;\n\t\ttext-align: center;\n\t\tmargin-top: 10rpx;\n\t}\n\n\t.zp-main-error-btn {\n\t\tfont-size: 26rpx;\n\t\tpadding: 8rpx 24rpx;\n\t\tborder: solid 1px #dddddd;\n\t\tborder-radius: 6rpx;\n\t\tcolor: #aaaaaa;\n\t\tmargin-top: 50rpx;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue",
    "content": "<!-- z-paging -->\n<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->\n<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->\n<!-- 反馈QQ群：790460711 -->\n\n<!-- 滑动切换选项卡swiper，此组件支持easycom规范，可以在项目中直接引用 -->\n<template>\n\t<view :class=\"fixed?'zp-swiper-container zp-swiper-container-fixed':'zp-swiper-container'\" :style=\"[finalSwiperStyle]\">\n\t\t<!-- #ifndef APP-PLUS -->\n\t\t<view v-if=\"cssSafeAreaInsetBottom===-1\" class=\"zp-safe-area-inset-bottom\"></view>\n\t\t<!-- #endif -->\n\t\t<slot v-if=\"zSlots.top\" name=\"top\" />\n\t\t<view class=\"zp-swiper-super\">\n\t\t\t<view v-if=\"zSlots.left\" :class=\"{'zp-swiper-left':true,'zp-absoulte':isOldWebView}\">\n\t\t\t\t<slot name=\"left\" />\n\t\t\t</view>\n\t\t\t<view :class=\"{'zp-swiper':true,'zp-absoulte':isOldWebView}\" :style=\"[swiperContentStyle]\">\n\t\t\t\t<slot />\n\t\t\t</view>\n\t\t\t<view v-if=\"zSlots.right\" :class=\"{'zp-swiper-right':true,'zp-absoulte zp-right':isOldWebView}\">\n\t\t\t\t<slot name=\"right\" />\n\t\t\t</view>\n\t\t</view>\n\t\t<slot v-if=\"zSlots.bottom\" name=\"bottom\" />\n\t</view>\n</template>\n\n<script>\n\texport default {\n\t\tname: \"z-paging-swiper\",\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tsystemInfo: null,\n\t\t\t\tcssSafeAreaInsetBottom: -1,\n\t\t\t\tswiperContentStyle: {}\n\t\t\t};\n\t\t},\n\t\tprops: {\n\t\t\t//是否使用fixed布局，默认为是\n\t\t\tfixed: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: true\n\t\t\t},\n\t\t\t//是否开启底部安全区域适配\n\t\t\tsafeAreaInsetBottom: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: false\n\t\t\t},\n\t\t\t//z-paging-swiper样式\n\t\t\tswiperStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n\t\t\t\t\treturn {};\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\t\tmounted() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.systemInfo = uni.getSystemInfoSync();\n\t\t\t})\n\t\t\t// #ifndef APP-PLUS\n\t\t\tthis._getCssSafeAreaInsetBottom();\n\t\t\t// #endif\n\t\t\tthis._updateLeftAndRightWidth();\n\n\t\t\tthis.swiperContentStyle = {'flex': '1'};\n\t\t\t// #ifndef APP-NVUE\n\t\t\tthis.swiperContentStyle = {width: '100%',height: '100%'};\n\t\t\t// #endif\n\t\t},\n\t\tcomputed: {\n\t\t\tfinalSwiperStyle() {\n\t\t\t\tconst swiperStyle = this.swiperStyle;\n\t\t\t\tif (!this.systemInfo) return swiperStyle;\n\t\t\t\tlet windowTop = this.systemInfo.windowTop;\n\t\t\t\t//暂时修复vue3中隐藏系统导航栏后windowTop获取不正确的问题，具体bug详见https://ask.dcloud.net.cn/question/141634\n\t\t\t\t//感谢litangyu！！https://github.com/SmileZXLee/uni-z-paging/issues/25\n\t\t\t\t// #ifdef VUE3 && H5\n\t\t\t\tconst pageHeadNode = document.getElementsByTagName(\"uni-page-head\");\n\t\t\t\tif (!pageHeadNode.length) windowTop = 0;\n\t\t\t\t// #endif\n\t\t\t\tconst windowBottom = this.systemInfo.windowBottom;\n\t\t\t\tif (this.fixed) {\n\t\t\t\t\tif (windowTop && !swiperStyle.top) {\n\t\t\t\t\t\tswiperStyle.top = windowTop + 'px';\n\t\t\t\t\t}\n\t\t\t\t\tif (!swiperStyle.bottom) {\n\t\t\t\t\t\tlet bottom = windowBottom ? windowBottom : 0;\n\t\t\t\t\t\tif (this.safeAreaInsetBottom) {\n\t\t\t\t\t\t\tbottom += this.safeAreaBottom;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(bottom > 0){\n\t\t\t\t\t\t\tswiperStyle.bottom = bottom + 'px';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn swiperStyle;\n\t\t\t},\n\t\t\tsafeAreaBottom() {\n\t\t\t\tif (!this.systemInfo) return 0;\n\t\t\t\tlet safeAreaBottom = 0;\n\t\t\t\t// #ifdef APP-PLUS\n\t\t\t\tsafeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0;\n\t\t\t\t// #endif\n\t\t\t\t// #ifndef APP-PLUS\n\t\t\t\tsafeAreaBottom = this.cssSafeAreaInsetBottom === -1 ? 0 : this.cssSafeAreaInsetBottom;\n\t\t\t\t// #endif\n\t\t\t\treturn safeAreaBottom;\n\t\t\t},\n\t\t\tisOldWebView() {\n\t\t\t\t// #ifndef APP-NVUE || MP-KUAISHOU\n\t\t\t\ttry {\n\t\t\t\t\tconst systemInfos = uni.getSystemInfoSync().system.split(' ');\n\t\t\t\t\tconst deviceType = systemInfos[0];\n\t\t\t\t\tconst version = parseInt(systemInfos[1].slice(0,1));\n\t\t\t\t\tif ((deviceType === 'iOS' && version <= 10) || (deviceType === 'Android' && version <= 6)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t} catch(e){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// #endif\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tzSlots() {\n\t\t\t\t// #ifdef VUE2\n\t\t\t\t\n\t\t\t\t// #ifdef MP-ALIPAY\n\t\t\t\treturn this.$slots;\n\t\t\t\t// #endif\n\t\t\t\t\n\t\t\t\treturn this.$scopedSlots ? this.$scopedSlots : this.$slots;\n\t\t\t\t// #endif\n\t\t\t\t\n\t\t\t\treturn this.$slots;\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\t//更新slot=\"left\"和slot=\"right\"宽度，当slot=\"left\"或slot=\"right\"宽度动态改变时调用\n\t\t\tupdateLeftAndRightWidth() {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis._updateLeftAndRightWidth();\n\t\t\t\t})\n\t\t\t},\n\t\t\t//通过获取css设置的底部安全区域占位view高度设置bottom距离\n\t\t\t_getCssSafeAreaInsetBottom() {\n\t\t\t\tconst query = uni.createSelectorQuery().in(this);\n\t\t\t\tquery.select('.zp-safe-area-inset-bottom').boundingClientRect(res => {\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\tthis.cssSafeAreaInsetBottom = res.height;\n\t\t\t\t\t}\n\t\t\t\t}).exec();\n\t\t\t},\n\t\t\t//获取slot=\"left\"和slot=\"right\"宽度并且更新布局\n\t\t\t_updateLeftAndRightWidth() {\n\t\t\t\tif (!this.isOldWebView) return;\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tlet delayTime = 0;\n\t\t\t\t\t// #ifdef MP-BAIDU\n\t\t\t\t\tdelayTime = 10;\n\t\t\t\t\t// #endif\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t['left','right'].map(position => {\n\t\t\t\t\t\t\tconst query = uni.createSelectorQuery().in(this);\n\t\t\t\t\t\t\tquery.select(`.zp-swiper-${position}`).boundingClientRect(res => {\n\t\t\t\t\t\t\t\tthis.$set(this.swiperContentStyle, position, res ? res.width + 'px' : '0px');\n\t\t\t\t\t\t\t}).exec();\n\t\t\t\t\t\t})\n\t\t\t\t\t}, delayTime)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t.zp-swiper-container {\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: column;\n\t\tflex: 1;\n\t}\n\n\t.zp-swiper-container-fixed {\n\t\tposition: fixed;\n\t\t/* #ifndef APP-NVUE */\n\t\theight: auto;\n\t\twidth: auto;\n\t\t/* #endif */\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t\tright: 0;\n\t}\n\t\n\t.zp-safe-area-inset-bottom {\n\t\tposition: absolute;\n\t\t/* #ifndef APP-PLUS */\n\t\theight: env(safe-area-inset-bottom);\n\t\t/* #endif */\n\t}\n\n\t.zp-swiper-super {\n\t\tflex: 1;\n\t\tposition: relative;\n\t\t/* #ifndef APP-NVUE */\n\t\tdisplay: flex;\n\t\t/* #endif */\n\t\tflex-direction: row;\n\t}\n\t\n\t.zp-swiper-left,.zp-swiper-right{\n\t\t/* #ifndef APP-NVUE */\n\t\theight: 100%;\n\t\t/* #endif */\n\t}\n\n\t.zp-swiper {\n\t\tflex: 1;\n\t\t/* #ifndef APP-NVUE */\n\t\theight: 100%;\n\t\twidth: 100%;\n\t\t/* #endif */\n\t}\n\t\n\t.zp-absoulte {\n\t\t/* #ifndef APP-NVUE */\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\twidth: auto;\n\t\t/* #endif */\n\t}\n\t\n\t.zp-right{\n\t\tright: 0;\n\t}\n\t\n\t.zp-swiper-item {\n\t\theight: 100%;\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue",
    "content": "<!-- z-paging -->\n<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->\n<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->\n<!-- 反馈QQ群：790460711 -->\n\n<!-- 滑动切换选项卡swiper-item，此组件支持easycom规范，可以在项目中直接引用 -->\n<template>\n\t<view class=\"zp-swiper-item-container\">\n\t\t<z-paging ref=\"paging\" :fixed=\"false\" \n\t\t\t:useVirtualList=\"useVirtualList\" :useInnerList=\"useInnerList\" :cellKeyName=\"cellKeyName\" :innerListStyle=\"innerListStyle\" \n\t\t\t:preloadPage=\"preloadPage\" :cellHeightMode=\"cellHeightMode\" :virtualScrollFps=\"virtualScrollFps\" :virtualListCol=\"virtualListCol\"\n\t\t\t@query=\"_queryList\" @listChange=\"_updateList\" :mounted-auto-call-reload=\"false\" style=\"height: 100%;\">\n\t\t\t<slot />\n\t\t\t<template #header>\n\t\t\t\t<slot name=\"header\"/>\n\t\t\t</template>\n\t\t\t<template #cell=\"{item,index}\">\n\t\t\t\t<slot name=\"cell\" :item=\"item\" :index=\"index\"/>\n\t\t\t</template>\n\t\t\t<template #footer>\n\t\t\t\t<slot name=\"footer\"/>\n\t\t\t</template>\n\t\t</z-paging>\n\t</view>\n</template>\n\n<script>\n\timport zPaging from '../z-paging/z-paging'\n\texport default {\n\t\tname: \"z-paging-swiper-item\",\n\t\tcomponents: { zPaging },\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tfirstLoaded: false\n\t\t\t}\n\t\t},\n\t\tprops: {\n\t\t\t//当前组件的index，也就是当前组件是swiper中的第几个\n\t\t\ttabIndex: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: function() {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t},\n\t\t\t//当前swiper切换到第几个index\n\t\t\tcurrentIndex: {\n\t\t\t\ttype: Number,\n\t\t\t\tdefault: function() {\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t},\n\t\t\t//是否使用虚拟列表，默认为否\n\t\t\tuseVirtualList: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: false\n\t\t\t},\n\t\t\t//是否在z-paging内部循环渲染列表(内置列表)，默认为否。若use-virtual-list为true，则此项恒为true\n\t\t\tuseInnerList: {\n\t\t\t\ttype: Boolean,\n\t\t\t\tdefault: false\n\t\t\t},\n\t\t\t//内置列表cell的key名称，仅nvue有效，在nvue中开启use-inner-list时必须填此项\n\t\t\tcellKeyName: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: ''\n\t\t\t},\n\t\t\t//innerList样式\n\t\t\tinnerListStyle: {\n\t\t\t\ttype: Object,\n\t\t\t\tdefault: function() {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t},\n\t\t\t//预加载的列表可视范围(列表高度)页数，默认为7，即预加载当前页及上下各7页的cell。此数值越大，则虚拟列表中加载的dom越多，内存消耗越大(会维持在一个稳定值)，但增加预加载页面数量可缓解快速滚动短暂白屏问题\n\t\t\tpreloadPage: {\n\t\t\t\ttype: [Number, String],\n\t\t\t\tdefault: 7\n\t\t\t},\n\t\t\t//虚拟列表cell高度模式，默认为fixed，也就是每个cell高度完全相同，将以第一个cell高度为准进行计算。可选值【dynamic】，即代表高度是动态非固定的，【dynamic】性能低于【fixed】。\n\t\t\tcellHeightMode: {\n\t\t\t\ttype: String,\n\t\t\t\tdefault: 'fixed'\n\t\t\t},\n\t\t\t//虚拟列表列数，默认为1。常用于每行有多列的情况，例如每行有2列数据，需要将此值设置为2\n\t\t\tvirtualListCol: {\n\t\t\t\ttype: [Number, String],\n\t\t\t\tdefault: 1\n\t\t\t},\n\t\t\t//虚拟列表scroll取样帧率，默认为60，过高可能出现卡顿等问题\n\t\t\tvirtualScrollFps: {\n\t\t\t\ttype: [Number, String],\n\t\t\t\tdefault: 60\n\t\t\t},\n\t\t},\n\t\twatch: {\n\t\t\tcurrentIndex: {\n\t\t\t\thandler(newVal, oldVal) {\n\t\t\t\t\tif (newVal === this.tabIndex) {\n\t\t\t\t\t\t//懒加载，当滑动到当前的item时，才去加载\n\t\t\t\t\t\tif (!this.firstLoaded) {\n\t\t\t\t\t\t\tthis.$nextTick(()=>{\n\t\t\t\t\t\t\t\tlet delay = 5;\n\t\t\t\t\t\t\t\t// #ifdef MP-TOUTIAO\n\t\t\t\t\t\t\t\tdelay = 100;\n\t\t\t\t\t\t\t\t// #endif\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tthis.$refs.paging.reload();\n\t\t\t\t\t\t\t\t}, delay);\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\timmediate: true\n\t\t\t}\n\t\t},\n\t\tmethods: {\n\t\t\treload(data) {\n\t\t\t\tthis.$refs.paging.reload(data);\n\t\t\t},\n\t\t\tcomplete(data) {\n\t\t\t\tthis.firstLoaded = true;\n\t\t\t\tthis.$refs.paging.complete(data);\n\t\t\t},\n\t\t\t_queryList(pageNo, pageSize, from) {\n\t\t\t\tthis.$emit('query', pageNo, pageSize, from);\n\t\t\t},\n\t\t\t_updateList(list) {\n\t\t\t\tthis.$emit('updateList', list);\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n<style scoped>\n\t.zp-swiper-item-container {\n\t\t/* #ifndef APP-NVUE */\n\t\theight: 100%;\n\t\t/* #endif */\n\t\t/* #ifdef APP-NVUE */\n\t\tflex: 1;\n\t\t/* #endif */\n\t}\n</style>\n"
  },
  {
    "path": "uni_modules/z-paging/package.json",
    "content": "{\n  \"id\": \"z-paging\",\n  \"name\": \"z-paging\",\n  \"displayName\": \"【z-paging下拉刷新、上拉加载】高性能，全平台兼容。支持虚拟列表，支持nvue、vue3\",\n  \"version\": \"2.5.3\",\n  \"description\": \"超简单、低耦合！使用wxs+renderjs实现。支持长列表优化，支持自定义下拉刷新、上拉加载更多，支持自动管理空数据图、点击返回顶部，支持聊天分页、本地分页，支持国际化等100+项配置\",\n  \"keywords\": [\n    \"下拉刷新\",\n    \"上拉加载\",\n    \"分页器\",\n    \"nvue\",\n    \"虚拟列表\"\n],\n  \"repository\": \"https://github.com/SmileZXLee/uni-z-paging\",\n  \"engines\": {\n    \"HBuilderX\": \"^3.0.7\"\n  },\n\"dcloudext\": {\n    \"sale\": {\n      \"regular\": {\n        \"price\": \"0.00\"\n      },\n      \"sourcecode\": {\n        \"price\": \"0.00\"\n      }\n    },\n    \"contact\": {\n      \"qq\": \"393727164\"\n    },\n    \"declaration\": {\n      \"ads\": \"无\",\n      \"data\": \"无\",\n      \"permissions\": \"无\"\n    },\n    \"npmurl\": \"https://www.npmjs.com/package/z-paging\",\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\": \"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\t\t  \"钉钉\": \"y\",\n\t\t  \"快手\": \"y\",\n\t\t  \"飞书\": \"y\",\n\t\t  \"京东\": \"y\"\n        },\n        \"快应用\": {\n          \"华为\": \"y\",\n          \"联盟\": \"y\"\n        },\n        \"Vue\": {\n            \"vue2\": \"y\",\n            \"vue3\": \"y\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "uni_modules/z-paging/readme.md",
    "content": "# z-paging\n\n<p align=\"center\">\n    <img alt=\"logo\" src=\"https://z-paging.zxlee.cn/img/title-logo.png\" height=\"100\" style=\"margin-bottom: 50px;\">\n</p>\n\n[![version](https://img.shields.io/badge/version-2.5.3-blue)](https://github.com/SmileZXLee/uni-z-paging)\n[![license](https://img.shields.io/github/license/SmileZXLee/uni-z-paging)](https://en.wikipedia.org/wiki/MIT_License)\n\n### 文档地址：[https://z-paging.zxlee.cn](https://z-paging.zxlee.cn)\n\n### 更新组件前，请注意[版本差异](https://z-paging.zxlee.cn/start/upgrade-guide.html)\n\n***  \n### 功能&特点\n* 【配置简单】仅需两步（绑定网络请求方法、绑定分页结果数组）轻松完成完整下拉刷新，上拉加载更多功能。\n* 【低耦合，低侵入】分页自动管理。在page中无需处理任何分页相关逻辑，无需在data中定义任何分页相关变量，全由z-paging内部处理。\n* 【超灵活，支持各种类型自定义】支持自定义下拉刷新，自定义上拉加载更多，自带自定义下拉刷新效果，及其他数十种自定义属性。\n* 【功能丰富】支持国际化，支持自定义且自动管理空数据图，支持主题模式切换，支持本地分页，支持聊天分页模式，支持展示最后更新时间，支持吸顶效果，支持内部scroll-view滚动与页面滚动，支持一键滚动到顶部等诸多功能。\n* 【全平台兼容】支持nvue，vue3，支持h5、app及各家小程序。\n* 【高性能】在app-vue、h5、微信小程序、QQ小程序上使用wxs+renderjs从视图层实现下拉刷新；支持虚拟列表，轻松渲染万级数据！\n\n*** \n### 反馈qq群(点击加群)：[790460711](https://jq.qq.com/?_wv=1027&k=vU2fKZZH)\n \n*** \n\n### 预览\n\n***\n\n|                 自定义下拉刷新效果+分页演示                  |                      吸顶效果+分页演示                       |\n| :----------------------------------------------------------: | :----------------------------------------------------------: |\n| ![](https://z-paging.zxlee.cn/public/img/uni-z-paging.gif) | ![](https://z-paging.zxlee.cn/public/img/uni-z-paging2.gif) |\n\n|                   滑动切换选项卡+分页演示                    |                    聊天记录模式+分页演示                     |\n| :----------------------------------------------------------: | :----------------------------------------------------------: |\n| ![](https://z-paging.zxlee.cn/public/img/z-paging-demo3.gif) | ![](https://z-paging.zxlee.cn/public/img/z-paging-demo4.gif) |\n\n### 在线demo体验地址：\n\n* [https://demo.z-paging.zxlee.cn](https://demo.z-paging.zxlee.cn)\n\n| 扫码体验                                                     |\n| ------------------------------------------------------------ |\n| ![](https://z-paging.zxlee.cn/public/img/code.png) |\n"
  },
  {
    "path": "util/common.js",
    "content": "import PinYin from \"./pinyin\";\n\nexport const html2Text = (html) => {\n  if (!html) {\n    return \"\";\n  }\n  return html\n    .replace(/<\\/p><p>/g, \"\\n\")\n    .replace(/\\&nbsp;/g, \" \")\n    .replace(/<p>/g, \"\")\n    .replace(/<\\/p>/g, \"\")\n    .replace(/<br>/g, \"\")\n    .trim();\n};\n\nexport const parseBr = (content) => {\n  if (!content) {\n    return \"\";\n  }\n  return content.replace(/\\n/g, \"\\\\n\").trim();\n};\n\nexport const getEl = (el) => {\n  return new Promise((resolve) => {\n    const query = uni.createSelectorQuery().in(this);\n    query\n      .select(el)\n      .boundingClientRect((data) => {\n        // 存在data，且存在宽和高，视为渲染完毕\n        resolve(data);\n      })\n      .exec();\n  });\n};\n\nexport const getDbDir = () => {\n  return new Promise((resolve, reject) => {\n    plus.io.requestFileSystem(plus.io.PRIVATE_DOC, (fs) => {\n      fs.root.getDirectory(\n        \"user\",\n        {\n          create: true,\n        },\n        (entry) => {\n          resolve(entry.fullPath);\n        },\n        (error) => {\n          reject(error);\n        },\n      );\n    });\n  });\n};\n\nexport const formatChooseData = (data, key = \"nickname\") => {\n  const ucfirst = (l1) => {\n    if (l1.length > 0) {\n      var first = l1.substr(0, 1).toUpperCase();\n      var spare = l1.substr(1, l1.length);\n      return first + spare;\n    }\n  };\n\n  const arraySearch = (l1, l2) => {\n    for (var name in PinYin) {\n      if (PinYin[name].indexOf(l1) != -1) {\n        return ucfirst(name);\n        break;\n      }\n    }\n    return false;\n  };\n\n  const codefans = (l1) => {\n    l1 = l1 ?? \"unkown\";\n    var l2 = l1.length;\n    var I1 = \"\";\n    var reg = new RegExp(\"[a-zA-Z0-9- ]\");\n    for (var i = 0; i < l2; i++) {\n      var val = l1.substr(i, 1);\n      var name = arraySearch(val, PinYin);\n      if (reg.test(val)) {\n        I1 += val;\n      } else if (name !== false) {\n        I1 += name;\n      }\n    }\n    I1 = I1.replace(/ /g, \"-\");\n    while (I1.indexOf(\"--\") > 0) {\n      I1 = I1.replace(\"--\", \"-\");\n    }\n    return I1;\n  };\n\n  var arr = [],\n    firstName;\n\n  for (var i = 0; i < data.length; i++) {\n    firstName = data[i].initial = codefans(data[i][key]).substr(0, 1);\n    arr.push(firstName.toUpperCase());\n  }\n\n  var arrlist = [];\n  for (i = 0; i < arr.length; i++) {\n    if (arrlist.indexOf(arr[i]) == -1) {\n      arrlist.push(arr[i]);\n    }\n  }\n\n  var dataSort = [];\n  for (var i = 0; i < arrlist.length; i++) {\n    dataSort[i] = {\n      initial: arrlist[i],\n    };\n    dataSort[i].data = [];\n    for (var j = 0; j < data.length; j++) {\n      if (data[j].initial.toUpperCase() == dataSort[i].initial) {\n        dataSort[i].data.push(data[j]);\n      }\n    }\n  }\n  for (var i = 0; i < dataSort.length - 1; i++) {\n    for (var j = 1; j < dataSort.length - i; j++) {\n      if (dataSort[j - 1].initial > dataSort[j].initial) {\n        var a = dataSort[j];\n        dataSort[j] = dataSort[j - 1];\n        dataSort[j - 1] = a;\n      }\n    }\n  }\n  const NomalInitial = \"QWERTYUIOPLKJHGFDSAZXCVBNM\".split(\"\");\n  const special = {\n    initial: \"#\",\n    data: [],\n  };\n  const newFilterData = dataSort.filter((d) => {\n    if (!NomalInitial.includes(d.initial)) {\n      special.data = [...special.data, ...d.data];\n    } else {\n      return d;\n    }\n  });\n  if (special.data.length > 0) {\n    newFilterData.push(special);\n  }\n  const indexList = newFilterData.map((item) => item.initial);\n  const dataList = newFilterData.map((item) => item.data);\n  return {\n    indexList,\n    dataList,\n  };\n};\n\nexport const getPurePath = (path) => {\n  const prefix = \"file://\";\n  const relativeRrefix = \"_doc/\";\n  if (path.includes(prefix)) {\n    path = path.replace(prefix, \"\");\n  }\n  if (path.includes(relativeRrefix)) {\n    path = plus.io.convertLocalFileSystemURL(path);\n  }\n  return path;\n};\n\nexport const filterEmptyValue = (obj) => {\n  for (let key in obj) {\n    if (obj[key] === \"\") {\n      delete obj[key];\n    }\n  }\n};\n\nexport const toastWithCallback = (message, callBack, duration = 1000) => {\n  uni.$u.toast(message);\n  setTimeout(callBack, duration);\n};\n\nexport const checkLoginError = (error) => {\n  if (!error?.errCode) {\n    return \"操作失败\";\n  }\n  switch (error.errCode) {\n    case 20001:\n      return \"密码错误\";\n    case 20002:\n      return \"账号不存在\";\n    case 20003:\n      return \"手机号已经注册\";\n    case 20004:\n      return \"账号已注册\";\n    case 20005:\n      return \"操作过于频繁，请稍后再试\";\n    case 20006:\n      return \"验证码错误\";\n    case 20007:\n      return \"验证码过期\";\n    case 20008:\n      return \"验证码错误次数超过限制，请稍后再试\";\n    case 20009:\n      return \"验证码已被使用\";\n    case 20010:\n      return \"邀请码已被使用\";\n    case 20011:\n      return \"邀请码不存在\";\n    case 20012:\n      return \"操作限制\";\n    case 20014:\n      return \"账号已注册\";\n    default:\n      return \"操作失败\";\n  }\n};"
  },
  {
    "path": "util/imCommon.js",
    "content": "import store from \"@/store\";\nimport {\n  CustomType,\n  GroupSystemMessageTypes,\n  AddFriendQrCodePrefix,\n  AddGroupQrCodePrefix,\n} from \"@/constant\";\nimport IMSDK, {\n  GroupAtType,\n  MessageType,\n  SessionType,\n} from \"openim-uniapp-polyfill\";\nimport dayjs from \"dayjs\";\nimport { isThisYear } from \"date-fns\";\n\nimport calendar from \"dayjs/plugin/calendar\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport updateLocale from \"dayjs/plugin/updateLocale\";\nimport \"dayjs/locale/zh-cn\";\n\ndayjs.extend(calendar);\ndayjs.extend(relativeTime);\ndayjs.extend(updateLocale);\ndayjs.locale(\"zh-cn\");\n\ndayjs.updateLocale(\"en\", {\n  calendar: {\n    sameElse: \"YYYY-MM-DD\",\n  },\n});\ndayjs.updateLocale(\"zh-cn\", {\n  calendar: {\n    sameDay: \"HH:mm\",\n    nextDay: \"[明天]\",\n    nextWeek: \"dddd\",\n    lastDay: \"[昨天] HH:mm\",\n    lastWeek: \"dddd HH:mm\",\n    sameElse: \"YYYY年M月D日 HH:mm\",\n  },\n});\n\nexport const formatMessageTime = (timestemp, keepSameYear = false) => {\n  if (!timestemp) return \"\";\n\n  const isRecent = dayjs().diff(timestemp, \"day\") < 7;\n  const keepYear = keepSameYear || !isThisYear(timestemp);\n\n  if (!isRecent && !keepYear) {\n    return dayjs(timestemp).format(\"M月D日 HH:mm\");\n  }\n\n  return dayjs(timestemp).calendar();\n};\n\nexport const conversationSort = (conversationList) => {\n  const arr = [];\n  const filterArr = conversationList.filter(\n    (c) => !arr.includes(c.conversationID) && arr.push(c.conversationID),\n  );\n  filterArr.sort((a, b) => {\n    if (a.isPinned === b.isPinned) {\n      const aCompare =\n        a.draftTextTime > a.latestMsgSendTime\n          ? a.draftTextTime\n          : a.latestMsgSendTime;\n      const bCompare =\n        b.draftTextTime > b.latestMsgSendTime\n          ? b.draftTextTime\n          : b.latestMsgSendTime;\n      if (aCompare > bCompare) {\n        return -1;\n      } else if (aCompare < bCompare) {\n        return 1;\n      } else {\n        return 0;\n      }\n    } else if (a.isPinned && !b.isPinned) {\n      return -1;\n    } else {\n      return 1;\n    }\n  });\n  return filterArr;\n};\n\n\nexport const sec2Time = (seconds) => {\n  var theTime1 = 0; // min\n  var theTime2 = 0; // hour\n  var theTime3 = 0; // day\n  if (seconds > 60) {\n    theTime1 = parseInt(seconds / 60);\n    seconds = parseInt(seconds % 60);\n    if (theTime1 > 60) {\n      theTime2 = parseInt(theTime1 / 60);\n      theTime1 = parseInt(theTime1 % 60);\n      if (theTime2 > 24) {\n        theTime3 = parseInt(theTime2 / 24);\n        theTime2 = parseInt(theTime2 % 24);\n      }\n    }\n  }\n  var result = \"\";\n  if (seconds > 0) {\n    result = \"\" + parseInt(seconds) + \"秒\";\n  }\n  if (theTime1 > 0) {\n    result = \"\" + parseInt(theTime1) + \"分钟\" + result;\n  }\n  if (theTime2 > 0) {\n    result = \"\" + parseInt(theTime2) + \"小时\" + result;\n  }\n  if (theTime3 > 0) {\n    result = \"\" + parseInt(theTime3) + \"天\" + result;\n  }\n  return result;\n};\n\nexport const parseMessageByType = (pmsg) => {\n  const getName = (user) => {\n    return user.userID === store.getters.storeCurrentUserID\n      ? \"你\"\n      : user.nickname;\n  };\n\n  switch (pmsg.contentType) {\n    case MessageType.TextMessage:\n      return pmsg.textElem.content;\n    case MessageType.PictureMessage:\n      return `[图片]`;\n    case MessageType.FriendAdded:\n      return \"你们已经是好友了，开始聊天吧~\";\n    case MessageType.MemberEnter:\n      const enterDetails = JSON.parse(pmsg.notificationElem.detail);\n      const enterUser = enterDetails.entrantUser;\n      return `${getName(enterUser)}进入了群聊`;\n    case MessageType.GroupCreated:\n      const groupCreatedDetail = JSON.parse(pmsg.notificationElem.detail);\n      const groupCreatedUser = groupCreatedDetail.opUser;\n      return `${getName(groupCreatedUser)}创建了群聊`;\n    case MessageType.MemberInvited:\n      const inviteDetails = JSON.parse(pmsg.notificationElem.detail);\n      const inviteOpUser = inviteDetails.opUser;\n      const invitedUserList = inviteDetails.invitedUserList ?? [];\n      let inviteStr = \"\";\n      invitedUserList.find(\n        (user, idx) => (inviteStr += getName(user) + \"、\") && idx > 3,\n      );\n      inviteStr = inviteStr.slice(0, -1);\n      return `${getName(inviteOpUser)}邀请了${inviteStr}${\n        invitedUserList.length > 3 ? \"...\" : \"\"\n      }进入群聊`;\n\n    case MessageType.MemberKicked:\n      const kickDetails = JSON.parse(pmsg.notificationElem.detail);\n      const kickOpUser = kickDetails.opUser;\n      const kickdUserList = kickDetails.kickedUserList ?? [];\n      let kickStr = \"\";\n      kickdUserList.find(\n        (user, idx) => (kickStr += getName(user) + \"、\") && idx > 3,\n      );\n      kickStr = kickStr.slice(0, -1);\n      return `${getName(kickOpUser)}踢出了${kickStr}${\n        kickdUserList.length > 3 ? \"...\" : \"\"\n      }`;\n    case MessageType.MemberQuit:\n      const quitDetails = JSON.parse(pmsg.notificationElem.detail);\n      const quitUser = quitDetails.quitUser;\n      return `${getName(quitUser)}退出了群聊`;\n    case MessageType.GroupInfoUpdated:\n      const groupUpdateDetail = JSON.parse(pmsg.notificationElem.detail);\n      const groupUpdateUser = groupUpdateDetail.opUser;\n      return `${getName(groupUpdateUser)}修改了群信息`;\n    case MessageType.GroupOwnerTransferred:\n      const transferDetails = JSON.parse(pmsg.notificationElem.detail);\n      const transferOpUser = transferDetails.opUser;\n      const newOwner = transferDetails.newGroupOwner;\n      return `${getName(transferOpUser)}将群主转让给${getName(newOwner)}`;\n    case MessageType.GroupDismissed:\n      const dismissDetails = JSON.parse(pmsg.notificationElem.detail);\n      const dismissUser = dismissDetails.opUser;\n      return `${getName(dismissUser)}解散了群聊`;\n    case MessageType.GroupNameUpdated:\n      const groupNameUpdateDetail = JSON.parse(pmsg.notificationElem.detail);\n      const groupNameUpdateUser = groupNameUpdateDetail.opUser;\n      return `${getName(groupNameUpdateUser)}修改了群名称为${\n        groupNameUpdateDetail.group.groupName\n      }`;\n    default:\n      return \"[暂未支持的消息类型]\";\n  }\n};\n\nexport const formatConversionTime = (timestemp) => {\n  const fromNowStr = dayjs(timestemp).fromNow();\n\n  if (fromNowStr.includes(\"秒\")) {\n    return \"刚刚\";\n  }\n\n  if (!fromNowStr.includes(\"秒\") && !fromNowStr.includes(\"分钟\")) {\n    return dayjs(timestemp).calendar();\n  }\n\n  return fromNowStr;\n};\n\nexport const secFormat = (sec) => {\n  let h;\n  let s;\n  h = Math.floor(sec / 60);\n  s = sec % 60;\n  h += \"\";\n  s += \"\";\n  h = h.length === 1 ? \"0\" + h : h;\n  s = s.length === 1 ? \"0\" + s : s;\n  return h + \":\" + s;\n};\n\nexport const bytesToSize = (bytes) => {\n  if (bytes === 0) return \"0 B\";\n  var k = 1024,\n    sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"],\n    i = Math.floor(Math.log(bytes) / Math.log(k));\n\n  return (bytes / Math.pow(k, i)).toPrecision(3) + \" \" + sizes[i];\n};\n\nexport const tipMessaggeFormat = (msg, currentUserID) => {\n\n  const getName = (user) =>\n    user.userID === currentUserID ? \"你\" : user.nickname;\n\n  switch (msg.contentType) {\n    case MessageType.FriendAdded:\n      return `你们已经是好友了~`;\n    case MessageType.GroupCreated:\n      const groupCreatedDetail = JSON.parse(msg.notificationElem.detail);\n      const groupCreatedUser = groupCreatedDetail.opUser;\n      return `${getName(groupCreatedUser)}创建了群聊`;\n    case MessageType.GroupInfoUpdated:\n      const groupUpdateDetail = JSON.parse(msg.notificationElem.detail);\n      const groupUpdateUser = groupUpdateDetail.opUser;\n      return `${parseInfo(groupUpdateUser)}修改了群信息`;\n    case MessageType.GroupOwnerTransferred:\n      const transferDetails = JSON.parse(msg.notificationElem.detail);\n      const transferOpUser = transferDetails.opUser;\n      const newOwner = transferDetails.newGroupOwner;\n      return `${parseInfo(transferOpUser)}转让群主给${parseInfo(newOwner)}`;\n    case MessageType.MemberQuit:\n      const quitDetails = JSON.parse(msg.notificationElem.detail);\n      const quitUser = quitDetails.quitUser;\n      return `${parseInfo(quitUser)}退出了群组`;\n    case MessageType.MemberInvited:\n      const inviteDetails = JSON.parse(msg.notificationElem.detail);\n      const inviteOpUser = inviteDetails.opUser;\n      const invitedUserList = inviteDetails.invitedUserList ?? [];\n      let inviteStr = \"\";\n      invitedUserList.find(\n        (user, idx) => (inviteStr += parseInfo(user) + \"、\") && idx > 3,\n      );\n      inviteStr = inviteStr.slice(0, -1);\n      return `${parseInfo(inviteOpUser)} 邀请了${inviteStr}${\n        invitedUserList.length > 3 ? \"...\" : \"\"\n      }加入群聊`;\n    case MessageType.MemberKicked:\n      const kickDetails = JSON.parse(msg.notificationElem.detail);\n      const kickOpUser = kickDetails.opUser;\n      const kickdUserList = kickDetails.kickedUserList ?? [];\n      let kickStr = \"\";\n      kickdUserList.find(\n        (user, idx) => (kickStr += parseInfo(user) + \"、\") && idx > 3,\n      );\n      kickStr = kickStr.slice(0, -1);\n      return `${parseInfo(kickOpUser)} 踢出了${kickStr}${\n        kickdUserList.length > 3 ? \"...\" : \"\"\n      }`;\n    case MessageType.MemberEnter:\n      const enterDetails = JSON.parse(msg.notificationElem.detail);\n      const enterUser = enterDetails.entrantUser;\n      return `${parseInfo(enterUser)}加入了群聊`;\n    case MessageType.GroupDismissed:\n      const dismissDetails = JSON.parse(msg.notificationElem.detail);\n      const dismissUser = dismissDetails.opUser;\n      return `${parseInfo(dismissUser)}解散了群聊`;\n    default:\n      return \"\";\n  }\n};\n\nexport const markConversationAsRead = (conversation, fromChating = false) => {\n  if (conversation.unreadCount !== 0) {\n    IMSDK.asyncApi(\n      IMSDK.IMMethods.MarkConversationMessageAsRead,\n      IMSDK.uuid(),\n      conversation.conversationID,\n    );\n  }\n};\n\nexport const prepareConversationState = (conversation, back2Tab = false) => {\n  markConversationAsRead(conversation);\n\n  if (conversation.conversationType === SessionType.WorkingGroup) {\n    store.dispatch(\"conversation/getCurrentGroup\", conversation.groupID);\n    store.dispatch(\n      \"conversation/getCurrentMemberInGroup\",\n      conversation.groupID,\n    );\n  }\n  store.dispatch(\"message/resetMessageState\");\n  store.commit(\"conversation/SET_CURRENT_CONVERSATION\", conversation);\n\n  let url = `/pages/conversation/chating/index?back2Tab=${back2Tab}`;\n  setTimeout(() => {\n    uni.navigateTo({\n      url,\n    });\n  }, 300)\n};\n\nexport const navigateToDesignatedConversation = (\n  sourceID,\n  sessionType,\n  back2Tab = false,\n) => {\n  return new Promise(async (resolve, reject) => {\n    try {\n      const { data } = await IMSDK.asyncApi(\n        IMSDK.IMMethods.GetOneConversation,\n        IMSDK.uuid(),\n        {\n          sessionType,\n          sourceID,\n        },\n      );\n      prepareConversationState(data, back2Tab);\n      resolve();\n    } catch (e) {\n      reject(e);\n    }\n  });\n};\n\nexport const offlinePushInfo = {\n  title: \"you have a new message\",\n  desc: \"you have a new message\",\n  ex: \"\",\n  iOSPushSound: \"\",\n  iOSBadgeCount: true,\n};\n\nexport const getConversationContent = (message) => {\n  if (\n    !message.groupID ||\n    message.sendID === store.getters.storeCurrentUserID\n  ) {\n    return parseMessageByType(message);\n  }\n  return `${message.senderNickname}：${parseMessageByType(message)}`;\n};"
  },
  {
    "path": "util/pinyin.js",
    "content": "export default {\n  a: \"\\u554a\\u963f\\u9515\",\n  ai: \"\\u57c3\\u6328\\u54ce\\u5509\\u54c0\\u7691\\u764c\\u853c\\u77ee\\u827e\\u788d\\u7231\\u9698\\u8bf6\\u6371\\u55f3\\u55cc\\u5ad2\\u7477\\u66a7\\u7839\\u953f\\u972d\",\n  an: \"\\u978d\\u6c28\\u5b89\\u4ffa\\u6309\\u6697\\u5cb8\\u80fa\\u6848\\u8c19\\u57ef\\u63de\\u72b4\\u5eb5\\u6849\\u94f5\\u9e4c\\u9878\\u9eef\",\n  ang: \"\\u80ae\\u6602\\u76ce\",\n  ao: \"\\u51f9\\u6556\\u71ac\\u7ff1\\u8884\\u50b2\\u5965\\u61ca\\u6fb3\\u5773\\u62d7\\u55f7\\u5662\\u5c99\\u5ed2\\u9068\\u5aaa\\u9a9c\\u8071\\u87af\\u93ca\\u9ccc\\u93d6\",\n  ba: \"\\u82ad\\u634c\\u6252\\u53ed\\u5427\\u7b06\\u516b\\u75a4\\u5df4\\u62d4\\u8dcb\\u9776\\u628a\\u8019\\u575d\\u9738\\u7f62\\u7238\\u8307\\u83dd\\u8406\\u636d\\u5c9c\\u705e\\u6777\\u94af\\u7c91\\u9c85\\u9b43\",\n  bai: \"\\u767d\\u67cf\\u767e\\u6446\\u4f70\\u8d25\\u62dc\\u7a17\\u859c\\u63b0\\u97b4\",\n  ban: \"\\u6591\\u73ed\\u642c\\u6273\\u822c\\u9881\\u677f\\u7248\\u626e\\u62cc\\u4f34\\u74e3\\u534a\\u529e\\u7eca\\u962a\\u5742\\u8c73\\u94a3\\u7622\\u764d\\u8228\",\n  bang: \"\\u90a6\\u5e2e\\u6886\\u699c\\u8180\\u7ed1\\u68d2\\u78c5\\u868c\\u9551\\u508d\\u8c24\\u84a1\\u8783\",\n  bao: \"\\u82de\\u80de\\u5305\\u8912\\u96f9\\u4fdd\\u5821\\u9971\\u5b9d\\u62b1\\u62a5\\u66b4\\u8c79\\u9c8d\\u7206\\u52f9\\u8446\\u5b80\\u5b62\\u7172\\u9e28\\u8913\\u8db5\\u9f85\",\n  bo: \"\\u5265\\u8584\\u73bb\\u83e0\\u64ad\\u62e8\\u94b5\\u6ce2\\u535a\\u52c3\\u640f\\u94c2\\u7b94\\u4f2f\\u5e1b\\u8236\\u8116\\u818a\\u6e24\\u6cca\\u9a73\\u4eb3\\u8543\\u5575\\u997d\\u6a97\\u64d8\\u7934\\u94b9\\u9e41\\u7c38\\u8ddb\",\n  bei: \"\\u676f\\u7891\\u60b2\\u5351\\u5317\\u8f88\\u80cc\\u8d1d\\u94a1\\u500d\\u72c8\\u5907\\u60eb\\u7119\\u88ab\\u5b5b\\u9642\\u90b6\\u57e4\\u84d3\\u5457\\u602b\\u6096\\u789a\\u9e4e\\u8919\\u943e\",\n  ben: \"\\u5954\\u82ef\\u672c\\u7b28\\u755a\\u574c\\u951b\",\n  beng: \"\\u5d29\\u7ef7\\u752d\\u6cf5\\u8e66\\u8ff8\\u552a\\u5623\\u750f\",\n  bi: \"\\u903c\\u9f3b\\u6bd4\\u9119\\u7b14\\u5f7c\\u78a7\\u84d6\\u853d\\u6bd5\\u6bd9\\u6bd6\\u5e01\\u5e87\\u75f9\\u95ed\\u655d\\u5f0a\\u5fc5\\u8f9f\\u58c1\\u81c2\\u907f\\u965b\\u5315\\u4ef3\\u4ffe\\u8298\\u835c\\u8378\\u5421\\u54d4\\u72f4\\u5eb3\\u610e\\u6ed7\\u6fde\\u5f3c\\u59a3\\u5a62\\u5b16\\u74a7\\u8d32\\u7540\\u94cb\\u79d5\\u88e8\\u7b5a\\u7b85\\u7be6\\u822d\\u895e\\u8df8\\u9ac0\",\n  bian: \"\\u97ad\\u8fb9\\u7f16\\u8d2c\\u6241\\u4fbf\\u53d8\\u535e\\u8fa8\\u8fa9\\u8fab\\u904d\\u533e\\u5f01\\u82c4\\u5fed\\u6c74\\u7f0f\\u7178\\u782d\\u78a5\\u7a39\\u7a86\\u8759\\u7b3e\\u9cca\",\n  biao: \"\\u6807\\u5f6a\\u8198\\u8868\\u5a4a\\u9aa0\\u98d1\\u98d9\\u98da\\u706c\\u9556\\u9573\\u762d\\u88f1\\u9cd4\",\n  bie: \"\\u9cd6\\u618b\\u522b\\u762a\\u8e69\\u9cd8\",\n  bin: \"\\u5f6c\\u658c\\u6fd2\\u6ee8\\u5bbe\\u6448\\u50a7\\u6d5c\\u7f24\\u73a2\\u6ba1\\u8191\\u9554\\u9acc\\u9b13\",\n  bing: \"\\u5175\\u51b0\\u67c4\\u4e19\\u79c9\\u997c\\u70b3\\u75c5\\u5e76\\u7980\\u90b4\\u6452\\u7ee0\\u678b\\u69df\\u71f9\",\n  bu: \"\\u6355\\u535c\\u54fa\\u8865\\u57e0\\u4e0d\\u5e03\\u6b65\\u7c3f\\u90e8\\u6016\\u62ca\\u535f\\u900b\\u74ff\\u6661\\u949a\\u91ad\",\n  ca: \"\\u64e6\\u5693\\u7924\",\n  cai: \"\\u731c\\u88c1\\u6750\\u624d\\u8d22\\u776c\\u8e29\\u91c7\\u5f69\\u83dc\\u8521\",\n  can: \"\\u9910\\u53c2\\u8695\\u6b8b\\u60ed\\u60e8\\u707f\\u9a96\\u74a8\\u7cb2\\u9eea\",\n  cang: \"\\u82cd\\u8231\\u4ed3\\u6ca7\\u85cf\\u4f27\",\n  cao: \"\\u64cd\\u7cd9\\u69fd\\u66f9\\u8349\\u8279\\u5608\\u6f15\\u87ac\\u825a\",\n  ce: \"\\u5395\\u7b56\\u4fa7\\u518c\\u6d4b\\u5202\\u5e3b\\u607b\",\n  ceng: \"\\u5c42\\u8e6d\\u564c\",\n  cha: \"\\u63d2\\u53c9\\u832c\\u8336\\u67e5\\u78b4\\u643d\\u5bdf\\u5c94\\u5dee\\u8be7\\u7339\\u9987\\u6c4a\\u59f9\\u6748\\u6942\\u69ce\\u6aab\\u9497\\u9538\\u9572\\u8869\",\n  chai: \"\\u62c6\\u67f4\\u8c7a\\u4faa\\u8308\\u7625\\u867f\\u9f87\",\n  chan: \"\\u6400\\u63ba\\u8749\\u998b\\u8c17\\u7f20\\u94f2\\u4ea7\\u9610\\u98a4\\u5181\\u8c04\\u8c36\\u8487\\u5edb\\u5fcf\\u6f7a\\u6fb6\\u5b71\\u7fbc\\u5a75\\u5b17\\u9aa3\\u89c7\\u7985\\u9561\\u88e3\\u87fe\\u8e94\",\n  chang:\n    \"\\u660c\\u7316\\u573a\\u5c1d\\u5e38\\u957f\\u507f\\u80a0\\u5382\\u655e\\u7545\\u5531\\u5021\\u4f25\\u9b2f\\u82cc\\u83d6\\u5f9c\\u6005\\u60dd\\u960a\\u5a3c\\u5ae6\\u6636\\u6c05\\u9cb3\",\n  chao: \"\\u8d85\\u6284\\u949e\\u671d\\u5632\\u6f6e\\u5de2\\u5435\\u7092\\u600a\\u7ec9\\u6641\\u8016\",\n  che: \"\\u8f66\\u626f\\u64a4\\u63a3\\u5f7b\\u6f88\\u577c\\u5c6e\\u7817\",\n  chen: \"\\u90f4\\u81e3\\u8fb0\\u5c18\\u6668\\u5ff1\\u6c89\\u9648\\u8d81\\u886c\\u79f0\\u8c0c\\u62bb\\u55d4\\u5bb8\\u741b\\u6987\\u809c\\u80c2\\u789c\\u9f80\",\n  cheng:\n    \"\\u6491\\u57ce\\u6a59\\u6210\\u5448\\u4e58\\u7a0b\\u60e9\\u6f84\\u8bda\\u627f\\u901e\\u9a8b\\u79e4\\u57d5\\u5d4a\\u5fb5\\u6d48\\u67a8\\u67fd\\u6a18\\u665f\\u584d\\u77a0\\u94d6\\u88ce\\u86cf\\u9172\",\n  chi: \"\\u5403\\u75f4\\u6301\\u5319\\u6c60\\u8fdf\\u5f1b\\u9a70\\u803b\\u9f7f\\u4f88\\u5c3a\\u8d64\\u7fc5\\u65a5\\u70bd\\u50ba\\u5880\\u82aa\\u830c\\u640b\\u53f1\\u54e7\\u557b\\u55e4\\u5f73\\u996c\\u6cb2\\u5ab8\\u6555\\u80dd\\u7719\\u7735\\u9e31\\u761b\\u892b\\u86a9\\u87ad\\u7b1e\\u7bea\\u8c49\\u8e05\\u8e1f\\u9b51\",\n  chong: \"\\u5145\\u51b2\\u866b\\u5d07\\u5ba0\\u833a\\u5fe1\\u61a7\\u94f3\\u825f\",\n  chou: \"\\u62bd\\u916c\\u7574\\u8e0c\\u7a20\\u6101\\u7b79\\u4ec7\\u7ef8\\u7785\\u4e11\\u4fe6\\u5733\\u5e31\\u60c6\\u6eb4\\u59af\\u7633\\u96e0\\u9c8b\",\n  chu: \"\\u81ed\\u521d\\u51fa\\u6a71\\u53a8\\u8e87\\u9504\\u96cf\\u6ec1\\u9664\\u695a\\u7840\\u50a8\\u77d7\\u6410\\u89e6\\u5904\\u4e8d\\u520d\\u61b7\\u7ecc\\u6775\\u696e\\u6a17\\u870d\\u8e70\\u9edc\",\n  chuan:\n    \"\\u63e3\\u5ddd\\u7a7f\\u693d\\u4f20\\u8239\\u5598\\u4e32\\u63be\\u821b\\u60f4\\u9044\\u5ddb\\u6c1a\\u948f\\u9569\\u8221\",\n  chuang: \"\\u75ae\\u7a97\\u5e62\\u5e8a\\u95ef\\u521b\\u6006\",\n  chui: \"\\u5439\\u708a\\u6376\\u9524\\u5782\\u9672\\u68f0\\u69cc\",\n  chun: \"\\u6625\\u693f\\u9187\\u5507\\u6df3\\u7eaf\\u8822\\u4fc3\\u83bc\\u6c8c\\u80ab\\u6710\\u9e51\\u877d\",\n  chuo: \"\\u6233\\u7ef0\\u851f\\u8fb6\\u8f8d\\u955e\\u8e14\\u9f8a\",\n  ci: \"\\u75b5\\u8328\\u78c1\\u96cc\\u8f9e\\u6148\\u74f7\\u8bcd\\u6b64\\u523a\\u8d50\\u6b21\\u8360\\u5472\\u5d6f\\u9e5a\\u8785\\u7ccd\\u8d91\",\n  cong: \"\\u806a\\u8471\\u56f1\\u5306\\u4ece\\u4e1b\\u506c\\u82c1\\u6dd9\\u9aa2\\u742e\\u7481\\u679e\",\n  cu: \"\\u51d1\\u7c97\\u918b\\u7c07\\u731d\\u6b82\\u8e59\",\n  cuan: \"\\u8e7f\\u7be1\\u7a9c\\u6c46\\u64ba\\u6615\\u7228\",\n  cui: \"\\u6467\\u5d14\\u50ac\\u8106\\u7601\\u7cb9\\u6dec\\u7fe0\\u8403\\u60b4\\u7480\\u69b1\\u96b9\",\n  cun: \"\\u6751\\u5b58\\u5bf8\\u78cb\\u5fd6\\u76b4\",\n  cuo: \"\\u64ae\\u6413\\u63aa\\u632b\\u9519\\u539d\\u811e\\u9509\\u77ec\\u75e4\\u9e7e\\u8e49\\u8e9c\",\n  da: \"\\u642d\\u8fbe\\u7b54\\u7629\\u6253\\u5927\\u8037\\u54d2\\u55d2\\u601b\\u59b2\\u75b8\\u8921\\u7b2a\\u977c\\u9791\",\n  dai: \"\\u5446\\u6b79\\u50a3\\u6234\\u5e26\\u6b86\\u4ee3\\u8d37\\u888b\\u5f85\\u902e\\u6020\\u57ed\\u7519\\u5454\\u5cb1\\u8fe8\\u902f\\u9a80\\u7ed0\\u73b3\\u9edb\",\n  dan: \"\\u803d\\u62c5\\u4e39\\u5355\\u90f8\\u63b8\\u80c6\\u65e6\\u6c2e\\u4f46\\u60ee\\u6de1\\u8bde\\u5f39\\u86cb\\u4ebb\\u510b\\u5369\\u840f\\u5556\\u6fb9\\u6a90\\u6b9a\\u8d55\\u7708\\u7605\\u8043\\u7baa\",\n  dang: \"\\u5f53\\u6321\\u515a\\u8361\\u6863\\u8c20\\u51fc\\u83ea\\u5b95\\u7800\\u94db\\u88c6\",\n  dao: \"\\u5200\\u6363\\u8e48\\u5012\\u5c9b\\u7977\\u5bfc\\u5230\\u7a3b\\u60bc\\u9053\\u76d7\\u53e8\\u5541\\u5fc9\\u6d2e\\u6c18\\u7118\\u5fd1\\u7e9b\",\n  de: \"\\u5fb7\\u5f97\\u7684\\u951d\",\n  deng: \"\\u8e6c\\u706f\\u767b\\u7b49\\u77aa\\u51f3\\u9093\\u5654\\u5d9d\\u6225\\u78f4\\u956b\\u7c26\",\n  di: \"\\u5824\\u4f4e\\u6ef4\\u8fea\\u654c\\u7b1b\\u72c4\\u6da4\\u7fdf\\u5ae1\\u62b5\\u5e95\\u5730\\u8482\\u7b2c\\u5e1d\\u5f1f\\u9012\\u7f14\\u6c10\\u7c74\\u8bcb\\u8c1b\\u90b8\\u577b\\u839c\\u837b\\u5600\\u5a23\\u67e2\\u68e3\\u89cc\\u7825\\u78b2\\u7747\\u955d\\u7f9d\\u9ab6\",\n  dian: \"\\u98a0\\u6382\\u6ec7\\u7898\\u70b9\\u5178\\u975b\\u57ab\\u7535\\u4f43\\u7538\\u5e97\\u60e6\\u5960\\u6dc0\\u6bbf\\u4e36\\u963d\\u576b\\u57dd\\u5dc5\\u73b7\\u765c\\u766b\\u7c1f\\u8e2e\",\n  diao: \"\\u7889\\u53fc\\u96d5\\u51cb\\u5201\\u6389\\u540a\\u9493\\u8c03\\u8f7a\\u94de\\u8729\\u7c9c\\u8c82\",\n  die: \"\\u8dcc\\u7239\\u789f\\u8776\\u8fed\\u8c0d\\u53e0\\u4f5a\\u57a4\\u581e\\u63f2\\u558b\\u6e2b\\u8f76\\u7252\\u74de\\u8936\\u800b\\u8e40\\u9cbd\\u9cce\",\n  ding: \"\\u4e01\\u76ef\\u53ee\\u9489\\u9876\\u9f0e\\u952d\\u5b9a\\u8ba2\\u4e22\\u4ec3\\u5576\\u738e\\u815a\\u7887\\u753a\\u94e4\\u7594\\u8035\\u914a\",\n  dong: \"\\u4e1c\\u51ac\\u8463\\u61c2\\u52a8\\u680b\\u4f97\\u606b\\u51bb\\u6d1e\\u578c\\u549a\\u5cbd\\u5cd2\\u5902\\u6c21\\u80e8\\u80f4\\u7850\\u9e2b\",\n  dou: \"\\u515c\\u6296\\u6597\\u9661\\u8c46\\u9017\\u75d8\\u8538\\u94ad\\u7aa6\\u7aac\\u86aa\\u7bfc\\u9161\",\n  du: \"\\u90fd\\u7763\\u6bd2\\u728a\\u72ec\\u8bfb\\u5835\\u7779\\u8d4c\\u675c\\u9540\\u809a\\u5ea6\\u6e21\\u5992\\u828f\\u561f\\u6e0e\\u691f\\u6a50\\u724d\\u8839\\u7b03\\u9ad1\\u9ee9\",\n  duan: \"\\u7aef\\u77ed\\u953b\\u6bb5\\u65ad\\u7f0e\\u5f56\\u6934\\u7145\\u7c16\",\n  dui: \"\\u5806\\u5151\\u961f\\u5bf9\\u603c\\u619d\\u7893\",\n  dun: \"\\u58a9\\u5428\\u8e72\\u6566\\u987f\\u56e4\\u949d\\u76fe\\u9041\\u7096\\u7818\\u7905\\u76f9\\u9566\\u8db8\",\n  duo: \"\\u6387\\u54c6\\u591a\\u593a\\u579b\\u8eb2\\u6735\\u8dfa\\u8235\\u5241\\u60f0\\u5815\\u5484\\u54da\\u7f0d\\u67c1\\u94ce\\u88f0\\u8e31\",\n  e: \"\\u86fe\\u5ce8\\u9e45\\u4fc4\\u989d\\u8bb9\\u5a25\\u6076\\u5384\\u627c\\u904f\\u9102\\u997f\\u5669\\u8c14\\u57a9\\u57ad\\u82ca\\u83aa\\u843c\\u5443\\u6115\\u5c59\\u5a40\\u8f6d\\u66f7\\u816d\\u786a\\u9507\\u9537\\u9e57\\u989a\\u9cc4\",\n  en: \"\\u6069\\u84bd\\u6441\\u5514\\u55ef\",\n  er: \"\\u800c\\u513f\\u8033\\u5c14\\u9975\\u6d31\\u4e8c\\u8d30\\u8fe9\\u73e5\\u94d2\\u9e38\\u9c95\",\n  fa: \"\\u53d1\\u7f5a\\u7b4f\\u4f10\\u4e4f\\u9600\\u6cd5\\u73d0\\u57a1\\u781d\",\n  fan: \"\\u85e9\\u5e06\\u756a\\u7ffb\\u6a0a\\u77fe\\u9492\\u7e41\\u51e1\\u70e6\\u53cd\\u8fd4\\u8303\\u8d29\\u72af\\u996d\\u6cdb\\u8629\\u5e61\\u72ad\\u68b5\\u6535\\u71d4\\u7548\\u8e6f\",\n  fang: \"\\u574a\\u82b3\\u65b9\\u80aa\\u623f\\u9632\\u59a8\\u4eff\\u8bbf\\u7eba\\u653e\\u531a\\u90a1\\u5f77\\u94ab\\u822b\\u9c82\",\n  fei: \"\\u83f2\\u975e\\u5561\\u98de\\u80a5\\u532a\\u8bfd\\u5420\\u80ba\\u5e9f\\u6cb8\\u8d39\\u82be\\u72d2\\u60b1\\u6ddd\\u5983\\u7ecb\\u7eef\\u69a7\\u8153\\u6590\\u6249\\u7953\\u7829\\u9544\\u75f1\\u871a\\u7bda\\u7fe1\\u970f\\u9cb1\",\n  fen: \"\\u82ac\\u915a\\u5429\\u6c1b\\u5206\\u7eb7\\u575f\\u711a\\u6c7e\\u7c89\\u594b\\u4efd\\u5fff\\u6124\\u7caa\\u507e\\u7035\\u68fc\\u610d\\u9cbc\\u9f22\",\n  feng: \"\\u4e30\\u5c01\\u67ab\\u8702\\u5cf0\\u950b\\u98ce\\u75af\\u70fd\\u9022\\u51af\\u7f1d\\u8bbd\\u5949\\u51e4\\u4ff8\\u9146\\u8451\\u6ca3\\u781c\",\n  fu: \"\\u4f5b\\u5426\\u592b\\u6577\\u80a4\\u5b75\\u6276\\u62c2\\u8f90\\u5e45\\u6c1f\\u7b26\\u4f0f\\u4fd8\\u670d\\u6d6e\\u6daa\\u798f\\u88b1\\u5f17\\u752b\\u629a\\u8f85\\u4fef\\u91dc\\u65a7\\u812f\\u8151\\u5e9c\\u8150\\u8d74\\u526f\\u8986\\u8d4b\\u590d\\u5085\\u4ed8\\u961c\\u7236\\u8179\\u8d1f\\u5bcc\\u8ba3\\u9644\\u5987\\u7f1a\\u5490\\u5310\\u51eb\\u90db\\u8299\\u82fb\\u832f\\u83a9\\u83d4\\u544b\\u5e5e\\u6ecf\\u8274\\u5b5a\\u9a78\\u7ec2\\u6874\\u8d59\\u9efb\\u9efc\\u7f58\\u7a03\\u99a5\\u864d\\u86a8\\u8709\\u8760\\u876e\\u9eb8\\u8dba\\u8dd7\\u9cc6\",\n  ga: \"\\u5676\\u560e\\u86e4\\u5c2c\\u5477\\u5c15\\u5c1c\\u65ee\\u9486\",\n  gai: \"\\u8be5\\u6539\\u6982\\u9499\\u76d6\\u6e89\\u4e10\\u9654\\u5793\\u6224\\u8d45\\u80f2\",\n  gan: \"\\u5e72\\u7518\\u6746\\u67d1\\u7aff\\u809d\\u8d76\\u611f\\u79c6\\u6562\\u8d63\\u5769\\u82f7\\u5c34\\u64c0\\u6cd4\\u6de6\\u6f89\\u7ec0\\u6a44\\u65f0\\u77f8\\u75b3\\u9150\",\n  gang: \"\\u5188\\u521a\\u94a2\\u7f38\\u809b\\u7eb2\\u5c97\\u6e2f\\u6206\\u7f61\\u9883\\u7b7b\",\n  gong: \"\\u6760\\u5de5\\u653b\\u529f\\u606d\\u9f9a\\u4f9b\\u8eac\\u516c\\u5bab\\u5f13\\u5de9\\u6c5e\\u62f1\\u8d21\\u5171\\u857b\\u5efe\\u54a3\\u73d9\\u80b1\\u86a3\\u86e9\\u89e5\",\n  gao: \"\\u7bd9\\u768b\\u9ad8\\u818f\\u7f94\\u7cd5\\u641e\\u9550\\u7a3f\\u544a\\u777e\\u8bf0\\u90dc\\u84bf\\u85c1\\u7f1f\\u69d4\\u69c1\\u6772\\u9506\",\n  ge: \"\\u54e5\\u6b4c\\u6401\\u6208\\u9e3d\\u80f3\\u7599\\u5272\\u9769\\u845b\\u683c\\u9601\\u9694\\u94ec\\u4e2a\\u5404\\u9b32\\u4ee1\\u54ff\\u5865\\u55dd\\u7ea5\\u643f\\u8188\\u784c\\u94ea\\u9549\\u88bc\\u988c\\u867c\\u8238\\u9abc\\u9ac2\",\n  gei: \"\\u7ed9\",\n  gen: \"\\u6839\\u8ddf\\u4e98\\u831b\\u54cf\\u826e\",\n  geng: \"\\u8015\\u66f4\\u5e9a\\u7fb9\\u57c2\\u803f\\u6897\\u54fd\\u8d53\\u9ca0\",\n  gou: \"\\u94a9\\u52fe\\u6c9f\\u82df\\u72d7\\u57a2\\u6784\\u8d2d\\u591f\\u4f5d\\u8bdf\\u5ca3\\u9058\\u5abe\\u7f11\\u89cf\\u5f40\\u9e32\\u7b31\\u7bdd\\u97b2\",\n  gu: \"\\u8f9c\\u83c7\\u5495\\u7b8d\\u4f30\\u6cbd\\u5b64\\u59d1\\u9f13\\u53e4\\u86ca\\u9aa8\\u8c37\\u80a1\\u6545\\u987e\\u56fa\\u96c7\\u560f\\u8bc2\\u83f0\\u54cc\\u5d2e\\u6c69\\u688f\\u8f71\\u726f\\u727f\\u80cd\\u81cc\\u6bc2\\u77bd\\u7f5f\\u94b4\\u9522\\u74e0\\u9e2a\\u9e44\\u75fc\\u86c4\\u9164\\u89da\\u9cb4\\u9ab0\\u9e58\",\n  gua: \"\\u522e\\u74dc\\u5250\\u5be1\\u6302\\u8902\\u5366\\u8bd6\\u5471\\u681d\\u9e39\",\n  guai: \"\\u4e56\\u62d0\\u602a\\u54d9\",\n  guan: \"\\u68fa\\u5173\\u5b98\\u51a0\\u89c2\\u7ba1\\u9986\\u7f50\\u60ef\\u704c\\u8d2f\\u500c\\u839e\\u63bc\\u6dab\\u76e5\\u9e73\\u9ccf\",\n  guang: \"\\u5149\\u5e7f\\u901b\\u72b7\\u6844\\u80f1\\u7592\",\n  gui: \"\\u7470\\u89c4\\u572d\\u7845\\u5f52\\u9f9f\\u95fa\\u8f68\\u9b3c\\u8be1\\u7678\\u6842\\u67dc\\u8dea\\u8d35\\u523d\\u5326\\u523f\\u5e8b\\u5b84\\u59ab\\u6867\\u7085\\u6677\\u7688\\u7c0b\\u9c91\\u9cdc\",\n  gun: \"\\u8f8a\\u6eda\\u68cd\\u4e28\\u886e\\u7ef2\\u78d9\\u9ca7\",\n  guo: \"\\u9505\\u90ed\\u56fd\\u679c\\u88f9\\u8fc7\\u9998\\u8803\\u57da\\u63b4\\u5459\\u56d7\\u5e3c\\u5d1e\\u7313\\u6901\\u8662\\u951e\\u8052\\u872e\\u873e\\u8748\",\n  ha: \"\\u54c8\",\n  hai: \"\\u9ab8\\u5b69\\u6d77\\u6c26\\u4ea5\\u5bb3\\u9a87\\u54b4\\u55e8\\u988f\\u91a2\",\n  han: \"\\u9163\\u61a8\\u90af\\u97e9\\u542b\\u6db5\\u5bd2\\u51fd\\u558a\\u7f55\\u7ff0\\u64bc\\u634d\\u65f1\\u61be\\u608d\\u710a\\u6c57\\u6c49\\u9097\\u83e1\\u6496\\u961a\\u701a\\u6657\\u7113\\u9894\\u86b6\\u9f3e\",\n  hen: \"\\u592f\\u75d5\\u5f88\\u72e0\\u6068\",\n  hang: \"\\u676d\\u822a\\u6c86\\u7ed7\\u73e9\\u6841\",\n  hao: \"\\u58d5\\u568e\\u8c6a\\u6beb\\u90dd\\u597d\\u8017\\u53f7\\u6d69\\u8585\\u55e5\\u5686\\u6fe0\\u704f\\u660a\\u7693\\u98a2\\u869d\",\n  he: \"\\u5475\\u559d\\u8377\\u83cf\\u6838\\u79be\\u548c\\u4f55\\u5408\\u76d2\\u8c89\\u9602\\u6cb3\\u6db8\\u8d6b\\u8910\\u9e64\\u8d3a\\u8bc3\\u52be\\u58d1\\u85ff\\u55d1\\u55ec\\u9616\\u76cd\\u86b5\\u7fee\",\n  hei: \"\\u563f\\u9ed1\",\n  heng: \"\\u54fc\\u4ea8\\u6a2a\\u8861\\u6052\\u8a07\\u8605\",\n  hong: \"\\u8f70\\u54c4\\u70d8\\u8679\\u9e3f\\u6d2a\\u5b8f\\u5f18\\u7ea2\\u9ec9\\u8ba7\\u836d\\u85a8\\u95f3\\u6cd3\",\n  hou: \"\\u5589\\u4faf\\u7334\\u543c\\u539a\\u5019\\u540e\\u5820\\u5f8c\\u9005\\u760a\\u7bcc\\u7cc7\\u9c8e\\u9aba\",\n  hu: \"\\u547c\\u4e4e\\u5ffd\\u745a\\u58f6\\u846b\\u80e1\\u8774\\u72d0\\u7cca\\u6e56\\u5f27\\u864e\\u552c\\u62a4\\u4e92\\u6caa\\u6237\\u51b1\\u553f\\u56eb\\u5cb5\\u7322\\u6019\\u60da\\u6d52\\u6ef9\\u7425\\u69f2\\u8f77\\u89f3\\u70c0\\u7173\\u623d\\u6248\\u795c\\u9e55\\u9e71\\u7b0f\\u9190\\u659b\",\n  hua: \"\\u82b1\\u54d7\\u534e\\u733e\\u6ed1\\u753b\\u5212\\u5316\\u8bdd\\u5290\\u6d4d\\u9a85\\u6866\\u94e7\\u7a1e\",\n  huai: \"\\u69d0\\u5f8a\\u6000\\u6dee\\u574f\\u8fd8\\u8e1d\",\n  huan: \"\\u6b22\\u73af\\u6853\\u7f13\\u6362\\u60a3\\u5524\\u75ea\\u8c62\\u7115\\u6da3\\u5ba6\\u5e7b\\u90c7\\u5942\\u57b8\\u64d0\\u571c\\u6d39\\u6d63\\u6f36\\u5bf0\\u902d\\u7f33\\u953e\\u9ca9\\u9b1f\",\n  huang:\n    \"\\u8352\\u614c\\u9ec4\\u78fa\\u8757\\u7c27\\u7687\\u51f0\\u60f6\\u714c\\u6643\\u5e4c\\u604d\\u8c0e\\u968d\\u5fa8\\u6e5f\\u6f62\\u9051\\u749c\\u8093\\u7640\\u87e5\\u7bc1\\u9cc7\",\n  hui: \"\\u7070\\u6325\\u8f89\\u5fbd\\u6062\\u86d4\\u56de\\u6bc1\\u6094\\u6167\\u5349\\u60e0\\u6666\\u8d3f\\u79fd\\u4f1a\\u70e9\\u6c47\\u8bb3\\u8bf2\\u7ed8\\u8bd9\\u8334\\u835f\\u8559\\u54d5\\u5599\\u96b3\\u6d04\\u5f57\\u7f0b\\u73f2\\u6656\\u605a\\u867a\\u87ea\\u9ebe\",\n  hun: \"\\u8364\\u660f\\u5a5a\\u9b42\\u6d51\\u6df7\\u8be8\\u9984\\u960d\\u6eb7\\u7f17\",\n  huo: \"\\u8c41\\u6d3b\\u4f19\\u706b\\u83b7\\u6216\\u60d1\\u970d\\u8d27\\u7978\\u6509\\u56af\\u5925\\u94ac\\u952a\\u956c\\u8020\\u8816\",\n  ji: \"\\u51fb\\u573e\\u57fa\\u673a\\u7578\\u7a3d\\u79ef\\u7b95\\u808c\\u9965\\u8ff9\\u6fc0\\u8ba5\\u9e21\\u59ec\\u7ee9\\u7f09\\u5409\\u6781\\u68d8\\u8f91\\u7c4d\\u96c6\\u53ca\\u6025\\u75be\\u6c72\\u5373\\u5ac9\\u7ea7\\u6324\\u51e0\\u810a\\u5df1\\u84df\\u6280\\u5180\\u5b63\\u4f0e\\u796d\\u5242\\u60b8\\u6d4e\\u5bc4\\u5bc2\\u8ba1\\u8bb0\\u65e2\\u5fcc\\u9645\\u5993\\u7ee7\\u7eaa\\u5c45\\u4e0c\\u4e69\\u525e\\u4f76\\u4f74\\u8114\\u58bc\\u82a8\\u82b0\\u8401\\u84ba\\u857a\\u638e\\u53fd\\u54ad\\u54dc\\u5527\\u5c8c\\u5d74\\u6d0e\\u5f50\\u5c50\\u9aa5\\u757f\\u7391\\u696b\\u6b9b\\u621f\\u6222\\u8d4d\\u89ca\\u7284\\u9f51\\u77f6\\u7f81\\u5d47\\u7a37\\u7620\\u7635\\u866e\\u7b08\\u7b04\\u66a8\\u8dfb\\u8dfd\\u9701\\u9c9a\\u9cab\\u9afb\\u9e82\",\n  jia: \"\\u5609\\u67b7\\u5939\\u4f73\\u5bb6\\u52a0\\u835a\\u988a\\u8d3e\\u7532\\u94be\\u5047\\u7a3c\\u4ef7\\u67b6\\u9a7e\\u5ac1\\u4f3d\\u90cf\\u62ee\\u5cac\\u6d43\\u8fe6\\u73c8\\u621b\\u80db\\u605d\\u94d7\\u9553\\u75c2\\u86f1\\u7b33\\u8888\\u8dcf\",\n  jian: \"\\u6b7c\\u76d1\\u575a\\u5c16\\u7b3a\\u95f4\\u714e\\u517c\\u80a9\\u8270\\u5978\\u7f04\\u8327\\u68c0\\u67ec\\u78b1\\u7877\\u62e3\\u6361\\u7b80\\u4fed\\u526a\\u51cf\\u8350\\u69db\\u9274\\u8df5\\u8d31\\u89c1\\u952e\\u7bad\\u4ef6\\u5065\\u8230\\u5251\\u996f\\u6e10\\u6e85\\u6da7\\u5efa\\u50ed\\u8c0f\\u8c2b\\u83c5\\u84b9\\u641b\\u56dd\\u6e54\\u8e47\\u8b07\\u7f23\\u67a7\\u67d9\\u6957\\u620b\\u622c\\u726e\\u728d\\u6bfd\\u8171\\u7751\\u950f\\u9e63\\u88e5\\u7b15\\u7bb4\\u7fe6\\u8dbc\\u8e3a\\u9ca3\\u97af\",\n  jiang:\n    \"\\u50f5\\u59dc\\u5c06\\u6d46\\u6c5f\\u7586\\u848b\\u6868\\u5956\\u8bb2\\u5320\\u9171\\u964d\\u8333\\u6d1a\\u7edb\\u7f30\\u729f\\u7913\\u8029\\u7ce8\\u8c47\",\n  jiao: \"\\u8549\\u6912\\u7901\\u7126\\u80f6\\u4ea4\\u90ca\\u6d47\\u9a84\\u5a07\\u56bc\\u6405\\u94f0\\u77eb\\u4fa5\\u811a\\u72e1\\u89d2\\u997a\\u7f34\\u7ede\\u527f\\u6559\\u9175\\u8f7f\\u8f83\\u53eb\\u4f7c\\u50ec\\u832d\\u6322\\u564d\\u5ce4\\u5fbc\\u59e3\\u7e9f\\u656b\\u768e\\u9e6a\\u86df\\u91ae\\u8de4\\u9c9b\",\n  jie: \"\\u7a96\\u63ed\\u63a5\\u7686\\u79f8\\u8857\\u9636\\u622a\\u52ab\\u8282\\u6854\\u6770\\u6377\\u776b\\u7aed\\u6d01\\u7ed3\\u89e3\\u59d0\\u6212\\u85c9\\u82a5\\u754c\\u501f\\u4ecb\\u75a5\\u8beb\\u5c4a\\u5048\\u8ba6\\u8bd8\\u5588\\u55df\\u736c\\u5a55\\u5b51\\u6840\\u7352\\u78a3\\u9534\\u7596\\u88b7\\u9889\\u86a7\\u7faf\\u9c92\\u9ab1\\u9aeb\",\n  jin: \"\\u5dfe\\u7b4b\\u65a4\\u91d1\\u4eca\\u6d25\\u895f\\u7d27\\u9526\\u4ec5\\u8c28\\u8fdb\\u9773\\u664b\\u7981\\u8fd1\\u70ec\\u6d78\\u5c3d\\u537a\\u8369\\u5807\\u5664\\u9991\\u5ed1\\u5997\\u7f19\\u747e\\u69ff\\u8d46\\u89d0\\u9485\\u9513\\u887f\\u77dc\",\n  jing: \"\\u52b2\\u8346\\u5162\\u830e\\u775b\\u6676\\u9cb8\\u4eac\\u60ca\\u7cbe\\u7cb3\\u7ecf\\u4e95\\u8b66\\u666f\\u9888\\u9759\\u5883\\u656c\\u955c\\u5f84\\u75c9\\u9756\\u7adf\\u7ade\\u51c0\\u522d\\u5106\\u9631\\u83c1\\u734d\\u61ac\\u6cfe\\u8ff3\\u5f2a\\u5a67\\u80bc\\u80eb\\u8148\\u65cc\",\n  jiong: \"\\u70af\\u7a98\\u5182\\u8fe5\\u6243\",\n  jiu: \"\\u63ea\\u7a76\\u7ea0\\u7396\\u97ed\\u4e45\\u7078\\u4e5d\\u9152\\u53a9\\u6551\\u65e7\\u81fc\\u8205\\u548e\\u5c31\\u759a\\u50e6\\u557e\\u9604\\u67e9\\u6855\\u9e6b\\u8d73\\u9b0f\",\n  ju: \"\\u97a0\\u62d8\\u72d9\\u75bd\\u9a79\\u83ca\\u5c40\\u5480\\u77e9\\u4e3e\\u6cae\\u805a\\u62d2\\u636e\\u5de8\\u5177\\u8ddd\\u8e1e\\u952f\\u4ff1\\u53e5\\u60e7\\u70ac\\u5267\\u5028\\u8bb5\\u82e3\\u82f4\\u8392\\u63ac\\u907d\\u5c66\\u741a\\u67b8\\u6910\\u6998\\u6989\\u6a58\\u728b\\u98d3\\u949c\\u9514\\u7aad\\u88fe\\u8d84\\u91b5\\u8e3d\\u9f83\\u96ce\\u97ab\",\n  juan: \"\\u6350\\u9e43\\u5a1f\\u5026\\u7737\\u5377\\u7ee2\\u9104\\u72f7\\u6d93\\u684a\\u8832\\u9529\\u954c\\u96bd\",\n  jue: \"\\u6485\\u652b\\u6289\\u6398\\u5014\\u7235\\u89c9\\u51b3\\u8bc0\\u7edd\\u53a5\\u5282\\u8c32\\u77cd\\u8568\\u5658\\u5d1b\\u7357\\u5b53\\u73cf\\u6877\\u6a5b\\u721d\\u9562\\u8e76\\u89d6\",\n  jun: \"\\u5747\\u83cc\\u94a7\\u519b\\u541b\\u5cfb\\u4fca\\u7ae3\\u6d5a\\u90e1\\u9a8f\\u6343\\u72fb\\u76b2\\u7b60\\u9e87\",\n  ka: \"\\u5580\\u5496\\u5361\\u4f67\\u5494\\u80e9\",\n  ke: \"\\u54af\\u5777\\u82db\\u67ef\\u68f5\\u78d5\\u9897\\u79d1\\u58f3\\u54b3\\u53ef\\u6e34\\u514b\\u523b\\u5ba2\\u8bfe\\u5ca2\\u606a\\u6e98\\u9a92\\u7f02\\u73c2\\u8f72\\u6c2a\\u778c\\u94b6\\u75b4\\u7aa0\\u874c\\u9ac1\",\n  kai: \"\\u5f00\\u63e9\\u6977\\u51ef\\u6168\\u5240\\u57b2\\u8488\\u5ffe\\u607a\\u94e0\\u950e\",\n  kan: \"\\u520a\\u582a\\u52d8\\u574e\\u780d\\u770b\\u4f83\\u51f5\\u83b0\\u83b6\\u6221\\u9f9b\\u77b0\",\n  kang: \"\\u5eb7\\u6177\\u7ce0\\u625b\\u6297\\u4ea2\\u7095\\u5751\\u4f09\\u95f6\\u94aa\",\n  kao: \"\\u8003\\u62f7\\u70e4\\u9760\\u5c3b\\u6832\\u7292\\u94d0\",\n  ken: \"\\u80af\\u5543\\u57a6\\u6073\\u57a0\\u88c9\\u9880\",\n  keng: \"\\u542d\\u5fd0\\u94ff\",\n  kong: \"\\u7a7a\\u6050\\u5b54\\u63a7\\u5025\\u5d06\\u7b9c\",\n  kou: \"\\u62a0\\u53e3\\u6263\\u5bc7\\u82a4\\u853b\\u53e9\\u770d\\u7b58\",\n  ku: \"\\u67af\\u54ed\\u7a9f\\u82e6\\u9177\\u5e93\\u88e4\\u5233\\u5800\\u55be\\u7ed4\\u9ab7\",\n  kua: \"\\u5938\\u57ae\\u630e\\u8de8\\u80ef\\u4f89\",\n  kuai: \"\\u5757\\u7b77\\u4fa9\\u5feb\\u84af\\u90d0\\u8489\\u72ef\\u810d\",\n  kuan: \"\\u5bbd\\u6b3e\\u9acb\",\n  kuang:\n    \"\\u5321\\u7b50\\u72c2\\u6846\\u77ff\\u7736\\u65f7\\u51b5\\u8bd3\\u8bf3\\u909d\\u5739\\u593c\\u54d0\\u7ea9\\u8d36\",\n  kui: \"\\u4e8f\\u76d4\\u5cbf\\u7aa5\\u8475\\u594e\\u9b41\\u5080\\u9988\\u6127\\u6e83\\u9997\\u532e\\u5914\\u9697\\u63c6\\u55b9\\u559f\\u609d\\u6126\\u9615\\u9035\\u668c\\u777d\\u8069\\u8770\\u7bd1\\u81fe\\u8dec\",\n  kun: \"\\u5764\\u6606\\u6346\\u56f0\\u6083\\u9603\\u7428\\u951f\\u918c\\u9cb2\\u9ae1\",\n  kuo: \"\\u62ec\\u6269\\u5ed3\\u9614\\u86de\",\n  la: \"\\u5783\\u62c9\\u5587\\u8721\\u814a\\u8fa3\\u5566\\u524c\\u647a\\u908b\\u65ef\\u782c\\u760c\",\n  lai: \"\\u83b1\\u6765\\u8d56\\u5d03\\u5f95\\u6d9e\\u6fd1\\u8d49\\u7750\\u94fc\\u765e\\u7c41\",\n  lan: \"\\u84dd\\u5a6a\\u680f\\u62e6\\u7bee\\u9611\\u5170\\u6f9c\\u8c30\\u63fd\\u89c8\\u61d2\\u7f06\\u70c2\\u6ee5\\u5549\\u5c9a\\u61d4\\u6f24\\u6984\\u6593\\u7f71\\u9567\\u8934\",\n  lang: \"\\u7405\\u6994\\u72fc\\u5eca\\u90ce\\u6717\\u6d6a\\u83a8\\u8497\\u5577\\u9606\\u9512\\u7a02\\u8782\",\n  lao: \"\\u635e\\u52b3\\u7262\\u8001\\u4f6c\\u59e5\\u916a\\u70d9\\u6d9d\\u5520\\u5d02\\u6833\\u94d1\\u94f9\\u75e8\\u91aa\",\n  le: \"\\u52d2\\u4e50\\u808b\\u4ec2\\u53fb\\u561e\\u6cd0\\u9cd3\",\n  lei: \"\\u96f7\\u956d\\u857e\\u78ca\\u7d2f\\u5121\\u5792\\u64c2\\u7c7b\\u6cea\\u7fb8\\u8bd4\\u837d\\u54a7\\u6f2f\\u5ad8\\u7f27\\u6a91\\u8012\\u9179\",\n  ling: \"\\u68f1\\u51b7\\u62ce\\u73b2\\u83f1\\u96f6\\u9f84\\u94c3\\u4f36\\u7f9a\\u51cc\\u7075\\u9675\\u5cad\\u9886\\u53e6\\u4ee4\\u9143\\u5844\\u82d3\\u5464\\u56f9\\u6ce0\\u7eeb\\u67c3\\u68c2\\u74f4\\u8046\\u86c9\\u7fce\\u9cae\",\n  leng: \"\\u695e\\u6123\",\n  li: \"\\u5398\\u68a8\\u7281\\u9ece\\u7bf1\\u72f8\\u79bb\\u6f13\\u7406\\u674e\\u91cc\\u9ca4\\u793c\\u8389\\u8354\\u540f\\u6817\\u4e3d\\u5389\\u52b1\\u783e\\u5386\\u5229\\u5088\\u4f8b\\u4fd0\\u75e2\\u7acb\\u7c92\\u6ca5\\u96b6\\u529b\\u7483\\u54e9\\u4fea\\u4fda\\u90e6\\u575c\\u82c8\\u8385\\u84e0\\u85dc\\u6369\\u5456\\u5533\\u55b1\\u7301\\u6ea7\\u6fa7\\u9026\\u5a0c\\u5ae0\\u9a8a\\u7f21\\u73de\\u67a5\\u680e\\u8f79\\u623e\\u783a\\u8a48\\u7f79\\u9502\\u9e42\\u75a0\\u75ac\\u86ce\\u870a\\u8821\\u7b20\\u7be5\\u7c9d\\u91b4\\u8dde\\u96f3\\u9ca1\\u9ce2\\u9ee7\",\n  lian: \"\\u4fe9\\u8054\\u83b2\\u8fde\\u9570\\u5ec9\\u601c\\u6d9f\\u5e18\\u655b\\u8138\\u94fe\\u604b\\u70bc\\u7ec3\\u631b\\u8539\\u5941\\u6f4b\\u6fc2\\u5a08\\u740f\\u695d\\u6b93\\u81c1\\u81a6\\u88e2\\u880a\\u9ca2\",\n  liang:\n    \"\\u7cae\\u51c9\\u6881\\u7cb1\\u826f\\u4e24\\u8f86\\u91cf\\u667e\\u4eae\\u8c05\\u589a\\u690b\\u8e09\\u9753\\u9b49\",\n  liao: \"\\u64a9\\u804a\\u50da\\u7597\\u71ce\\u5be5\\u8fbd\\u6f66\\u4e86\\u6482\\u9563\\u5ed6\\u6599\\u84fc\\u5c25\\u5639\\u7360\\u5bee\\u7f2d\\u948c\\u9e69\\u8022\",\n  lie: \"\\u5217\\u88c2\\u70c8\\u52a3\\u730e\\u51bd\\u57d2\\u6d0c\\u8d94\\u8e90\\u9b23\",\n  lin: \"\\u7433\\u6797\\u78f7\\u9716\\u4e34\\u90bb\\u9cde\\u6dcb\\u51db\\u8d41\\u541d\\u853a\\u5d99\\u5eea\\u9074\\u6aa9\\u8f9a\\u77b5\\u7cbc\\u8e8f\\u9e9f\",\n  liu: \"\\u6e9c\\u7409\\u69b4\\u786b\\u998f\\u7559\\u5218\\u7624\\u6d41\\u67f3\\u516d\\u62a1\\u507b\\u848c\\u6cd6\\u6d4f\\u905b\\u9a9d\\u7efa\\u65d2\\u7198\\u950d\\u954f\\u9e68\\u938f\",\n  long: \"\\u9f99\\u804b\\u5499\\u7b3c\\u7abf\\u9686\\u5784\\u62e2\\u9647\\u5f04\\u5785\\u830f\\u6cf7\\u73d1\\u680a\\u80e7\\u783b\\u7643\",\n  lou: \"\\u697c\\u5a04\\u6402\\u7bd3\\u6f0f\\u964b\\u55bd\\u5d5d\\u9542\\u7618\\u8027\\u877c\\u9ac5\",\n  lu: \"\\u82a6\\u5362\\u9885\\u5e90\\u7089\\u63b3\\u5364\\u864f\\u9c81\\u9e93\\u788c\\u9732\\u8def\\u8d42\\u9e7f\\u6f5e\\u7984\\u5f55\\u9646\\u622e\\u5786\\u6445\\u64b8\\u565c\\u6cf8\\u6e0c\\u6f09\\u7490\\u680c\\u6a79\\u8f73\\u8f82\\u8f98\\u6c07\\u80ea\\u9565\\u9e2c\\u9e6d\\u7c0f\\u823b\\u9c88\",\n  lv: \"\\u9a74\\u5415\\u94dd\\u4fa3\\u65c5\\u5c65\\u5c61\\u7f15\\u8651\\u6c2f\\u5f8b\\u7387\\u6ee4\\u7eff\\u634b\\u95fe\\u6988\\u8182\\u7a06\\u891b\",\n  luan: \"\\u5ce6\\u5b6a\\u6ee6\\u5375\\u4e71\\u683e\\u9e3e\\u92ae\",\n  lue: \"\\u63a0\\u7565\\u950a\",\n  lun: \"\\u8f6e\\u4f26\\u4ed1\\u6ca6\\u7eb6\\u8bba\\u56f5\",\n  luo: \"\\u841d\\u87ba\\u7f57\\u903b\\u9523\\u7ba9\\u9aa1\\u88f8\\u843d\\u6d1b\\u9a86\\u7edc\\u502e\\u8366\\u645e\\u7321\\u6cfa\\u6924\\u8136\\u9559\\u7630\\u96d2\",\n  ma: \"\\u5988\\u9ebb\\u739b\\u7801\\u8682\\u9a6c\\u9a82\\u561b\\u5417\\u551b\\u72b8\\u5b37\\u6769\\u9ebd\",\n  mai: \"\\u57cb\\u4e70\\u9ea6\\u5356\\u8fc8\\u8109\\u52a2\\u836c\\u54aa\\u973e\",\n  man: \"\\u7792\\u9992\\u86ee\\u6ee1\\u8513\\u66fc\\u6162\\u6f2b\\u8c29\\u5881\\u5e54\\u7f26\\u71b3\\u9558\\u989f\\u87a8\\u9cd7\\u9794\",\n  mang: \"\\u8292\\u832b\\u76f2\\u5fd9\\u83bd\\u9099\\u6f2d\\u6726\\u786d\\u87d2\",\n  meng: \"\\u6c13\\u840c\\u8499\\u6aac\\u76df\\u9530\\u731b\\u68a6\\u5b5f\\u52d0\\u750d\\u77a2\\u61f5\\u791e\\u867b\\u8722\\u8813\\u824b\\u8268\\u9efe\",\n  miao: \"\\u732b\\u82d7\\u63cf\\u7784\\u85d0\\u79d2\\u6e3a\\u5e99\\u5999\\u55b5\\u9088\\u7f08\\u7f2a\\u676a\\u6dfc\\u7707\\u9e4b\\u8731\",\n  mao: \"\\u8305\\u951a\\u6bdb\\u77db\\u94c6\\u536f\\u8302\\u5192\\u5e3d\\u8c8c\\u8d38\\u4f94\\u88a4\\u52d6\\u8306\\u5cc1\\u7441\\u6634\\u7266\\u8004\\u65c4\\u61cb\\u7780\\u86d1\\u8765\\u87ca\\u9ae6\",\n  me: \"\\u4e48\",\n  mei: \"\\u73ab\\u679a\\u6885\\u9176\\u9709\\u7164\\u6ca1\\u7709\\u5a92\\u9541\\u6bcf\\u7f8e\\u6627\\u5bd0\\u59b9\\u5a9a\\u5776\\u8393\\u5d4b\\u7338\\u6d7c\\u6e44\\u6963\\u9545\\u9e5b\\u8882\\u9b45\",\n  men: \"\\u95e8\\u95f7\\u4eec\\u626a\\u739f\\u7116\\u61d1\\u9494\",\n  mi: \"\\u772f\\u919a\\u9761\\u7cdc\\u8ff7\\u8c1c\\u5f25\\u7c73\\u79d8\\u89c5\\u6ccc\\u871c\\u5bc6\\u5e42\\u8288\\u5196\\u8c27\\u863c\\u5627\\u7315\\u736f\\u6c68\\u5b93\\u5f2d\\u8112\\u6549\\u7cf8\\u7e3b\\u9e8b\",\n  mian: \"\\u68c9\\u7720\\u7ef5\\u5195\\u514d\\u52c9\\u5a29\\u7f05\\u9762\\u6c94\\u6e4e\\u817c\\u7704\",\n  mie: \"\\u8511\\u706d\\u54a9\\u881b\\u7bfe\",\n  min: \"\\u6c11\\u62bf\\u76bf\\u654f\\u60af\\u95fd\\u82e0\\u5cb7\\u95f5\\u6cef\\u73c9\",\n  ming: \"\\u660e\\u879f\\u9e23\\u94ed\\u540d\\u547d\\u51a5\\u8317\\u6e9f\\u669d\\u7791\\u9169\",\n  miu: \"\\u8c2c\",\n  mo: \"\\u6478\\u6479\\u8611\\u6a21\\u819c\\u78e8\\u6469\\u9b54\\u62b9\\u672b\\u83ab\\u58a8\\u9ed8\\u6cab\\u6f20\\u5bde\\u964c\\u8c1f\\u8309\\u84e6\\u998d\\u5aeb\\u9546\\u79e3\\u763c\\u8031\\u87c6\\u8c8a\\u8c98\",\n  mou: \"\\u8c0b\\u725f\\u67d0\\u53b6\\u54de\\u5a7a\\u7738\\u936a\",\n  mu: \"\\u62c7\\u7261\\u4ea9\\u59c6\\u6bcd\\u5893\\u66ae\\u5e55\\u52df\\u6155\\u6728\\u76ee\\u7766\\u7267\\u7a46\\u4eeb\\u82dc\\u5452\\u6c90\\u6bea\\u94bc\",\n  na: \"\\u62ff\\u54ea\\u5450\\u94a0\\u90a3\\u5a1c\\u7eb3\\u5185\\u637a\\u80ad\\u954e\\u8872\\u7bac\",\n  nai: \"\\u6c16\\u4e43\\u5976\\u8010\\u5948\\u9f10\\u827f\\u8418\\u67f0\",\n  nan: \"\\u5357\\u7537\\u96be\\u56ca\\u5583\\u56e1\\u6960\\u8169\\u877b\\u8d67\",\n  nao: \"\\u6320\\u8111\\u607c\\u95f9\\u5b6c\\u57b4\\u7331\\u7459\\u7847\\u94d9\\u86f2\",\n  ne: \"\\u6dd6\\u5462\\u8bb7\",\n  nei: \"\\u9981\",\n  nen: \"\\u5ae9\\u80fd\\u6798\\u6041\",\n  ni: \"\\u59ae\\u9713\\u502a\\u6ce5\\u5c3c\\u62df\\u4f60\\u533f\\u817b\\u9006\\u6eba\\u4f32\\u576d\\u730a\\u6029\\u6ee0\\u6635\\u65ce\\u7962\\u615d\\u7768\\u94cc\\u9cb5\",\n  nian: \"\\u852b\\u62c8\\u5e74\\u78be\\u64b5\\u637b\\u5ff5\\u5eff\\u8f87\\u9ecf\\u9c87\\u9cb6\",\n  niang: \"\\u5a18\\u917f\",\n  niao: \"\\u9e1f\\u5c3f\\u8311\\u5b32\\u8132\\u8885\",\n  nie: \"\\u634f\\u8042\\u5b7d\\u556e\\u954a\\u954d\\u6d85\\u4e5c\\u9667\\u8616\\u55eb\\u8080\\u989e\\u81ec\\u8e51\",\n  nin: \"\\u60a8\\u67e0\",\n  ning: \"\\u72de\\u51dd\\u5b81\\u62e7\\u6cde\\u4f5e\\u84e5\\u549b\\u752f\\u804d\",\n  niu: \"\\u725b\\u626d\\u94ae\\u7ebd\\u72c3\\u5ff8\\u599e\\u86b4\",\n  nong: \"\\u8113\\u6d53\\u519c\\u4fac\",\n  nu: \"\\u5974\\u52aa\\u6012\\u5476\\u5e11\\u5f29\\u80ec\\u5b65\\u9a7d\",\n  nv: \"\\u5973\\u6067\\u9495\\u8844\",\n  nuan: \"\\u6696\",\n  nuenue: \"\\u8650\",\n  nue: \"\\u759f\\u8c11\",\n  nuo: \"\\u632a\\u61e6\\u7cef\\u8bfa\\u50a9\\u6426\\u558f\\u9518\",\n  ou: \"\\u54e6\\u6b27\\u9e25\\u6bb4\\u85d5\\u5455\\u5076\\u6ca4\\u6004\\u74ef\\u8026\",\n  pa: \"\\u556a\\u8db4\\u722c\\u5e15\\u6015\\u7436\\u8469\\u7b62\",\n  pai: \"\\u62cd\\u6392\\u724c\\u5f98\\u6e43\\u6d3e\\u4ff3\\u848e\",\n  pan: \"\\u6500\\u6f58\\u76d8\\u78d0\\u76fc\\u7554\\u5224\\u53db\\u723f\\u6cee\\u88a2\\u897b\\u87e0\\u8e52\",\n  pang: \"\\u4e53\\u5e9e\\u65c1\\u802a\\u80d6\\u6ec2\\u9004\",\n  pao: \"\\u629b\\u5486\\u5228\\u70ae\\u888d\\u8dd1\\u6ce1\\u530f\\u72cd\\u5e96\\u812c\\u75b1\",\n  pei: \"\\u5478\\u80da\\u57f9\\u88f4\\u8d54\\u966a\\u914d\\u4f69\\u6c9b\\u638a\\u8f94\\u5e14\\u6de0\\u65c6\\u952b\\u9185\\u9708\",\n  pen: \"\\u55b7\\u76c6\\u6e53\",\n  peng: \"\\u7830\\u62a8\\u70f9\\u6f8e\\u5f6d\\u84ec\\u68da\\u787c\\u7bf7\\u81a8\\u670b\\u9e4f\\u6367\\u78b0\\u576f\\u580b\\u562d\\u6026\\u87db\",\n  pi: \"\\u7812\\u9739\\u6279\\u62ab\\u5288\\u7435\\u6bd7\\u5564\\u813e\\u75b2\\u76ae\\u5339\\u75de\\u50fb\\u5c41\\u8b6c\\u4e15\\u9674\\u90b3\\u90eb\\u572e\\u9f19\\u64d7\\u567c\\u5e80\\u5ab2\\u7eb0\\u6787\\u7513\\u7765\\u7f74\\u94cd\\u75e6\\u7656\\u758b\\u868d\\u8c94\",\n  pian: \"\\u7bc7\\u504f\\u7247\\u9a97\\u8c1d\\u9a88\\u728f\\u80fc\\u890a\\u7fe9\\u8e41\",\n  piao: \"\\u98d8\\u6f02\\u74e2\\u7968\\u527d\\u560c\\u5ad6\\u7f25\\u6b8d\\u779f\\u87b5\",\n  pie: \"\\u6487\\u77a5\\u4e3f\\u82e4\\u6c15\",\n  pin: \"\\u62fc\\u9891\\u8d2b\\u54c1\\u8058\\u62da\\u59d8\\u5ad4\\u6980\\u725d\\u98a6\",\n  ping: \"\\u4e52\\u576a\\u82f9\\u840d\\u5e73\\u51ed\\u74f6\\u8bc4\\u5c4f\\u4fdc\\u5a09\\u67b0\\u9c86\",\n  po: \"\\u5761\\u6cfc\\u9887\\u5a46\\u7834\\u9b44\\u8feb\\u7c95\\u53f5\\u9131\\u6ea5\\u73c0\\u948b\\u94b7\\u76a4\\u7b38\",\n  pou: \"\\u5256\\u88d2\\u8e23\",\n  pu: \"\\u6251\\u94fa\\u4ec6\\u8386\\u8461\\u83e9\\u84b2\\u57d4\\u6734\\u5703\\u666e\\u6d66\\u8c31\\u66dd\\u7011\\u530d\\u5657\\u6fee\\u749e\\u6c06\\u9564\\u9568\\u8e7c\",\n  qi: \"\\u671f\\u6b3a\\u6816\\u621a\\u59bb\\u4e03\\u51c4\\u6f06\\u67d2\\u6c8f\\u5176\\u68cb\\u5947\\u6b67\\u7566\\u5d0e\\u8110\\u9f50\\u65d7\\u7948\\u7941\\u9a91\\u8d77\\u5c82\\u4e5e\\u4f01\\u542f\\u5951\\u780c\\u5668\\u6c14\\u8fc4\\u5f03\\u6c7d\\u6ce3\\u8bab\\u4e9f\\u4e93\\u573b\\u8291\\u840b\\u847a\\u5601\\u5c7a\\u5c90\\u6c54\\u6dc7\\u9a90\\u7eee\\u742a\\u7426\\u675e\\u6864\\u69ed\\u6b39\\u797a\\u61a9\\u789b\\u86f4\\u871e\\u7da6\\u7dae\\u8dbf\\u8e4a\\u9ccd\\u9e92\",\n  qia: \"\\u6390\\u6070\\u6d3d\\u845c\",\n  qian: \"\\u7275\\u6266\\u948e\\u94c5\\u5343\\u8fc1\\u7b7e\\u4edf\\u8c26\\u4e7e\\u9ed4\\u94b1\\u94b3\\u524d\\u6f5c\\u9063\\u6d45\\u8c34\\u5811\\u5d4c\\u6b20\\u6b49\\u4f65\\u9621\\u828a\\u82a1\\u8368\\u63ae\\u5c8d\\u60ad\\u614a\\u9a9e\\u6434\\u8930\\u7f31\\u6920\\u80b7\\u6106\\u94a4\\u8654\\u7b9d\",\n  qiang:\n    \"\\u67aa\\u545b\\u8154\\u7f8c\\u5899\\u8537\\u5f3a\\u62a2\\u5af1\\u6a2f\\u6217\\u709d\\u9516\\u9535\\u956a\\u8941\\u8723\\u7f9f\\u8deb\\u8dc4\",\n  qiao: \"\\u6a47\\u9539\\u6572\\u6084\\u6865\\u77a7\\u4e54\\u4fa8\\u5de7\\u9798\\u64ac\\u7fd8\\u5ced\\u4fcf\\u7a8d\\u5281\\u8bee\\u8c2f\\u835e\\u6100\\u6194\\u7f32\\u6a35\\u6bf3\\u7857\\u8df7\\u9792\",\n  qie: \"\\u5207\\u8304\\u4e14\\u602f\\u7a83\\u90c4\\u553c\\u60ec\\u59be\\u6308\\u9532\\u7ba7\",\n  qin: \"\\u94a6\\u4fb5\\u4eb2\\u79e6\\u7434\\u52e4\\u82b9\\u64d2\\u79bd\\u5bdd\\u6c81\\u82a9\\u84c1\\u8572\\u63ff\\u5423\\u55ea\\u5659\\u6eb1\\u6a8e\\u8793\\u887e\",\n  qing: \"\\u9752\\u8f7b\\u6c22\\u503e\\u537f\\u6e05\\u64ce\\u6674\\u6c30\\u60c5\\u9877\\u8bf7\\u5e86\\u5029\\u82d8\\u570a\\u6aa0\\u78ec\\u873b\\u7f44\\u7b90\\u8b26\\u9cad\\u9ee5\",\n  qiong: \"\\u743c\\u7a77\\u909b\\u8315\\u7a79\\u7b47\\u928e\",\n  qiu: \"\\u79cb\\u4e18\\u90b1\\u7403\\u6c42\\u56da\\u914b\\u6cc5\\u4fc5\\u6c3d\\u5def\\u827d\\u72b0\\u6e6b\\u9011\\u9052\\u6978\\u8d47\\u9e20\\u866c\\u86af\\u8764\\u88d8\\u7cd7\\u9cc5\\u9f3d\",\n  qu: \"\\u8d8b\\u533a\\u86c6\\u66f2\\u8eaf\\u5c48\\u9a71\\u6e20\\u53d6\\u5a36\\u9f8b\\u8da3\\u53bb\\u8bce\\u52ac\\u8556\\u8627\\u5c96\\u8862\\u9612\\u74a9\\u89d1\\u6c0d\\u795b\\u78f2\\u766f\\u86d0\\u883c\\u9eb4\\u77bf\\u9ee2\",\n  quan: \"\\u5708\\u98a7\\u6743\\u919b\\u6cc9\\u5168\\u75ca\\u62f3\\u72ac\\u5238\\u529d\\u8be0\\u8343\\u737e\\u609b\\u7efb\\u8f81\\u754e\\u94e8\\u8737\\u7b4c\\u9b08\",\n  que: \"\\u7f3a\\u7094\\u7638\\u5374\\u9e4a\\u69b7\\u786e\\u96c0\\u9619\\u60ab\",\n  qun: \"\\u88d9\\u7fa4\\u9021\",\n  ran: \"\\u7136\\u71c3\\u5189\\u67d3\\u82d2\\u9aef\",\n  rang: \"\\u74e4\\u58e4\\u6518\\u56b7\\u8ba9\\u79b3\\u7a70\",\n  rao: \"\\u9976\\u6270\\u7ed5\\u835b\\u5a06\\u6861\",\n  ruo: \"\\u60f9\\u82e5\\u5f31\",\n  re: \"\\u70ed\\u504c\",\n  ren: \"\\u58ec\\u4ec1\\u4eba\\u5fcd\\u97e7\\u4efb\\u8ba4\\u5203\\u598a\\u7eab\\u4ede\\u834f\\u845a\\u996a\\u8f6b\\u7a14\\u887d\",\n  reng: \"\\u6254\\u4ecd\",\n  ri: \"\\u65e5\",\n  rong: \"\\u620e\\u8338\\u84c9\\u8363\\u878d\\u7194\\u6eb6\\u5bb9\\u7ed2\\u5197\\u5d58\\u72e8\\u7f1b\\u6995\\u877e\",\n  rou: \"\\u63c9\\u67d4\\u8089\\u7cc5\\u8e42\\u97a3\",\n  ru: \"\\u8339\\u8815\\u5112\\u5b7a\\u5982\\u8fb1\\u4e73\\u6c5d\\u5165\\u8925\\u84d0\\u85b7\\u5685\\u6d33\\u6ebd\\u6fe1\\u94f7\\u8966\\u98a5\",\n  ruan: \"\\u8f6f\\u962e\\u670a\",\n  rui: \"\\u854a\\u745e\\u9510\\u82ae\\u8564\\u777f\\u868b\",\n  run: \"\\u95f0\\u6da6\",\n  sa: \"\\u6492\\u6d12\\u8428\\u5345\\u4ee8\\u6332\\u98d2\",\n  sai: \"\\u816e\\u9cc3\\u585e\\u8d5b\\u567b\",\n  san: \"\\u4e09\\u53c1\\u4f1e\\u6563\\u5f61\\u9993\\u6c35\\u6bf5\\u7cc1\\u9730\",\n  sang: \"\\u6851\\u55d3\\u4e27\\u6421\\u78c9\\u98a1\",\n  sao: \"\\u6414\\u9a9a\\u626b\\u5ac2\\u57fd\\u81ca\\u7619\\u9ccb\",\n  se: \"\\u745f\\u8272\\u6da9\\u556c\\u94e9\\u94ef\\u7a51\",\n  sen: \"\\u68ee\",\n  seng: \"\\u50e7\",\n  sha: \"\\u838e\\u7802\\u6740\\u5239\\u6c99\\u7eb1\\u50bb\\u5565\\u715e\\u810e\\u6b43\\u75e7\\u88df\\u970e\\u9ca8\",\n  shai: \"\\u7b5b\\u6652\\u917e\",\n  shan: \"\\u73ca\\u82eb\\u6749\\u5c71\\u5220\\u717d\\u886b\\u95ea\\u9655\\u64c5\\u8d61\\u81b3\\u5584\\u6c55\\u6247\\u7f2e\\u5261\\u8baa\\u912f\\u57cf\\u829f\\u6f78\\u59d7\\u9a9f\\u81bb\\u9490\\u759d\\u87ee\\u8222\\u8dda\\u9cdd\",\n  shang:\n    \"\\u5892\\u4f24\\u5546\\u8d4f\\u664c\\u4e0a\\u5c1a\\u88f3\\u57a7\\u7ef1\\u6b87\\u71b5\\u89de\",\n  shao: \"\\u68a2\\u634e\\u7a0d\\u70e7\\u828d\\u52fa\\u97f6\\u5c11\\u54e8\\u90b5\\u7ecd\\u52ad\\u82d5\\u6f72\\u86f8\\u7b24\\u7b72\\u8244\",\n  she: \"\\u5962\\u8d4a\\u86c7\\u820c\\u820d\\u8d66\\u6444\\u5c04\\u6151\\u6d89\\u793e\\u8bbe\\u538d\\u4f58\\u731e\\u7572\\u9e9d\",\n  shen: \"\\u7837\\u7533\\u547b\\u4f38\\u8eab\\u6df1\\u5a20\\u7ec5\\u795e\\u6c88\\u5ba1\\u5a76\\u751a\\u80be\\u614e\\u6e17\\u8bdc\\u8c02\\u5432\\u54c2\\u6e16\\u6939\\u77e7\\u8703\",\n  sheng:\n    \"\\u58f0\\u751f\\u7525\\u7272\\u5347\\u7ef3\\u7701\\u76db\\u5269\\u80dc\\u5723\\u4e1e\\u6e11\\u5ab5\\u771a\\u7b19\",\n  shi: \"\\u5e08\\u5931\\u72ee\\u65bd\\u6e7f\\u8bd7\\u5c38\\u8671\\u5341\\u77f3\\u62fe\\u65f6\\u4ec0\\u98df\\u8680\\u5b9e\\u8bc6\\u53f2\\u77e2\\u4f7f\\u5c4e\\u9a76\\u59cb\\u5f0f\\u793a\\u58eb\\u4e16\\u67ff\\u4e8b\\u62ed\\u8a93\\u901d\\u52bf\\u662f\\u55dc\\u566c\\u9002\\u4ed5\\u4f8d\\u91ca\\u9970\\u6c0f\\u5e02\\u6043\\u5ba4\\u89c6\\u8bd5\\u8c25\\u57d8\\u83b3\\u84cd\\u5f11\\u5511\\u9963\\u8f7c\\u8006\\u8d33\\u70bb\\u793b\\u94c8\\u94ca\\u87ab\\u8210\\u7b6e\\u8c55\\u9ca5\\u9cba\",\n  shou: \"\\u6536\\u624b\\u9996\\u5b88\\u5bff\\u6388\\u552e\\u53d7\\u7626\\u517d\\u624c\\u72e9\\u7ef6\\u824f\",\n  shu: \"\\u852c\\u67a2\\u68b3\\u6b8a\\u6292\\u8f93\\u53d4\\u8212\\u6dd1\\u758f\\u4e66\\u8d4e\\u5b70\\u719f\\u85af\\u6691\\u66d9\\u7f72\\u8700\\u9ecd\\u9f20\\u5c5e\\u672f\\u8ff0\\u6811\\u675f\\u620d\\u7ad6\\u5885\\u5eb6\\u6570\\u6f31\\u6055\\u500f\\u587e\\u83fd\\u5fc4\\u6cad\\u6d91\\u6f8d\\u59dd\\u7ebe\\u6bf9\\u8167\\u6bb3\\u956f\\u79eb\\u9e6c\",\n  shua: \"\\u5237\\u800d\\u5530\\u6dae\",\n  shuai: \"\\u6454\\u8870\\u7529\\u5e05\\u87c0\",\n  shuan: \"\\u6813\\u62f4\\u95e9\",\n  shuang: \"\\u971c\\u53cc\\u723d\\u5b40\",\n  shui: \"\\u8c01\\u6c34\\u7761\\u7a0e\",\n  shun: \"\\u542e\\u77ac\\u987a\\u821c\\u6042\",\n  shuo: \"\\u8bf4\\u7855\\u6714\\u70c1\\u84b4\\u6420\\u55cd\\u6fef\\u5981\\u69ca\\u94c4\",\n  si: \"\\u65af\\u6495\\u5636\\u601d\\u79c1\\u53f8\\u4e1d\\u6b7b\\u8086\\u5bfa\\u55e3\\u56db\\u4f3a\\u4f3c\\u9972\\u5df3\\u53ae\\u4fdf\\u5155\\u83e5\\u549d\\u6c5c\\u6cd7\\u6f8c\\u59d2\\u9a77\\u7f0c\\u7940\\u7960\\u9536\\u9e36\\u801c\\u86f3\\u7b25\",\n  song: \"\\u677e\\u8038\\u6002\\u9882\\u9001\\u5b8b\\u8bbc\\u8bf5\\u51c7\\u83d8\\u5d27\\u5d69\\u5fea\\u609a\\u6dde\\u7ae6\",\n  sou: \"\\u641c\\u8258\\u64de\\u55fd\\u53df\\u55d6\\u55fe\\u998a\\u6eb2\\u98d5\\u778d\\u953c\\u878b\",\n  su: \"\\u82cf\\u9165\\u4fd7\\u7d20\\u901f\\u7c9f\\u50f3\\u5851\\u6eaf\\u5bbf\\u8bc9\\u8083\\u5919\\u8c21\\u850c\\u55c9\\u612b\\u7c0c\\u89eb\\u7a23\",\n  suan: \"\\u9178\\u849c\\u7b97\",\n  sui: \"\\u867d\\u968b\\u968f\\u7ee5\\u9ad3\\u788e\\u5c81\\u7a57\\u9042\\u96a7\\u795f\\u84d1\\u51ab\\u8c07\\u6fc9\\u9083\\u71e7\\u772d\\u7762\",\n  sun: \"\\u5b59\\u635f\\u7b0b\\u836a\\u72f2\\u98e7\\u69ab\\u8de3\\u96bc\",\n  suo: \"\\u68ad\\u5506\\u7f29\\u7410\\u7d22\\u9501\\u6240\\u5522\\u55e6\\u5a11\\u686b\\u7743\\u7fa7\",\n  ta: \"\\u584c\\u4ed6\\u5b83\\u5979\\u5854\\u736d\\u631e\\u8e4b\\u8e0f\\u95fc\\u6ebb\\u9062\\u69bb\\u6c93\",\n  tai: \"\\u80ce\\u82d4\\u62ac\\u53f0\\u6cf0\\u915e\\u592a\\u6001\\u6c70\\u90b0\\u85b9\\u80bd\\u70b1\\u949b\\u8dc6\\u9c90\",\n  tan: \"\\u574d\\u644a\\u8d2a\\u762b\\u6ee9\\u575b\\u6a80\\u75f0\\u6f6d\\u8c2d\\u8c08\\u5766\\u6bef\\u8892\\u78b3\\u63a2\\u53f9\\u70ad\\u90ef\\u8548\\u6619\\u94bd\\u952c\\u8983\",\n  tang: \"\\u6c64\\u5858\\u642a\\u5802\\u68e0\\u819b\\u5510\\u7cd6\\u50a5\\u9967\\u6e8f\\u746d\\u94f4\\u9557\\u8025\\u8797\\u87b3\\u7fb0\\u91a3\",\n  thang: \"\\u5018\\u8eba\\u6dcc\",\n  theng: \"\\u8d9f\\u70eb\",\n  tao: \"\\u638f\\u6d9b\\u6ed4\\u7ee6\\u8404\\u6843\\u9003\\u6dd8\\u9676\\u8ba8\\u5957\\u6311\\u9f17\\u5555\\u97ec\\u9955\",\n  te: \"\\u7279\",\n  teng: \"\\u85e4\\u817e\\u75bc\\u8a8a\\u6ed5\",\n  ti: \"\\u68af\\u5254\\u8e22\\u9511\\u63d0\\u9898\\u8e44\\u557c\\u4f53\\u66ff\\u568f\\u60d5\\u6d95\\u5243\\u5c49\\u8351\\u608c\\u9016\\u7ee8\\u7f07\\u9e48\\u88fc\\u918d\",\n  tian: \"\\u5929\\u6dfb\\u586b\\u7530\\u751c\\u606c\\u8214\\u8146\\u63ad\\u5fdd\\u9617\\u6b84\\u754b\\u94bf\\u86ba\",\n  tiao: \"\\u6761\\u8fe2\\u773a\\u8df3\\u4f7b\\u7967\\u94eb\\u7a95\\u9f86\\u9ca6\",\n  tie: \"\\u8d34\\u94c1\\u5e16\\u841c\\u992e\",\n  ting: \"\\u5385\\u542c\\u70c3\\u6c40\\u5ef7\\u505c\\u4ead\\u5ead\\u633a\\u8247\\u839b\\u8476\\u5a77\\u6883\\u8713\\u9706\",\n  tong: \"\\u901a\\u6850\\u916e\\u77b3\\u540c\\u94dc\\u5f64\\u7ae5\\u6876\\u6345\\u7b52\\u7edf\\u75db\\u4f5f\\u50ee\\u4edd\\u833c\\u55f5\\u6078\\u6f7c\\u783c\",\n  tou: \"\\u5077\\u6295\\u5934\\u900f\\u4ea0\",\n  tu: \"\\u51f8\\u79c3\\u7a81\\u56fe\\u5f92\\u9014\\u6d82\\u5c60\\u571f\\u5410\\u5154\\u580d\\u837c\\u83df\\u948d\\u9174\",\n  tuan: \"\\u6e4d\\u56e2\\u7583\",\n  tui: \"\\u63a8\\u9893\\u817f\\u8715\\u892a\\u9000\\u5fd2\\u717a\",\n  tun: \"\\u541e\\u5c6f\\u81c0\\u9968\\u66be\\u8c5a\\u7a80\",\n  tuo: \"\\u62d6\\u6258\\u8131\\u9e35\\u9640\\u9a6e\\u9a7c\\u692d\\u59a5\\u62d3\\u553e\\u4e47\\u4f57\\u5768\\u5eb9\\u6cb1\\u67dd\\u7823\\u7ba8\\u8204\\u8dce\\u9f0d\",\n  wa: \"\\u6316\\u54c7\\u86d9\\u6d3c\\u5a03\\u74e6\\u889c\\u4f64\\u5a32\\u817d\",\n  wai: \"\\u6b6a\\u5916\",\n  wan: \"\\u8c4c\\u5f2f\\u6e7e\\u73a9\\u987d\\u4e38\\u70f7\\u5b8c\\u7897\\u633d\\u665a\\u7696\\u60cb\\u5b9b\\u5a49\\u4e07\\u8155\\u525c\\u8284\\u82cb\\u83c0\\u7ea8\\u7efe\\u742c\\u8118\\u7579\\u873f\\u7ba2\",\n  wang: \"\\u6c6a\\u738b\\u4ea1\\u6789\\u7f51\\u5f80\\u65fa\\u671b\\u5fd8\\u5984\\u7f54\\u5c22\\u60d8\\u8f8b\\u9b4d\",\n  wei: \"\\u5a01\\u5dcd\\u5fae\\u5371\\u97e6\\u8fdd\\u6845\\u56f4\\u552f\\u60df\\u4e3a\\u6f4d\\u7ef4\\u82c7\\u840e\\u59d4\\u4f1f\\u4f2a\\u5c3e\\u7eac\\u672a\\u851a\\u5473\\u754f\\u80c3\\u5582\\u9b4f\\u4f4d\\u6e2d\\u8c13\\u5c09\\u6170\\u536b\\u502d\\u504e\\u8bff\\u9688\\u8473\\u8587\\u5e0f\\u5e37\\u5d34\\u5d6c\\u7325\\u732c\\u95f1\\u6ca9\\u6d27\\u6da0\\u9036\\u5a13\\u73ae\\u97ea\\u8ece\\u709c\\u7168\\u71a8\\u75ff\\u8249\\u9c94\",\n  wen: \"\\u761f\\u6e29\\u868a\\u6587\\u95fb\\u7eb9\\u543b\\u7a33\\u7d0a\\u95ee\\u520e\\u6120\\u960c\\u6c76\\u74ba\\u97eb\\u6b81\\u96ef\",\n  weng: \"\\u55e1\\u7fc1\\u74ee\\u84ca\\u8579\",\n  wo: \"\\u631d\\u8717\\u6da1\\u7a9d\\u6211\\u65a1\\u5367\\u63e1\\u6c83\\u83b4\\u5e44\\u6e25\\u674c\\u809f\\u9f8c\",\n  wu: \"\\u5deb\\u545c\\u94a8\\u4e4c\\u6c61\\u8bec\\u5c4b\\u65e0\\u829c\\u68a7\\u543e\\u5434\\u6bcb\\u6b66\\u4e94\\u6342\\u5348\\u821e\\u4f0d\\u4fae\\u575e\\u620a\\u96fe\\u6664\\u7269\\u52ff\\u52a1\\u609f\\u8bef\\u5140\\u4ef5\\u9622\\u90ac\\u572c\\u82b4\\u5e91\\u6003\\u5fe4\\u6d6f\\u5be4\\u8fd5\\u59a9\\u9a9b\\u727e\\u7110\\u9e49\\u9e5c\\u8708\\u92c8\\u9f2f\",\n  xi: \"\\u6614\\u7199\\u6790\\u897f\\u7852\\u77fd\\u6670\\u563b\\u5438\\u9521\\u727a\\u7a00\\u606f\\u5e0c\\u6089\\u819d\\u5915\\u60dc\\u7184\\u70ef\\u6eaa\\u6c50\\u7280\\u6a84\\u88ad\\u5e2d\\u4e60\\u5ab3\\u559c\\u94e3\\u6d17\\u7cfb\\u9699\\u620f\\u7ec6\\u50d6\\u516e\\u96b0\\u90d7\\u831c\\u8478\\u84f0\\u595a\\u550f\\u5f99\\u9969\\u960b\\u6d60\\u6dc5\\u5c63\\u5b09\\u73ba\\u6a28\\u66e6\\u89cb\\u6b37\\u71b9\\u798a\\u79a7\\u94b8\\u7699\\u7a78\\u8725\\u87cb\\u823e\\u7fb2\\u7c9e\\u7fd5\\u91af\\u9f37\",\n  xia: \"\\u778e\\u867e\\u5323\\u971e\\u8f96\\u6687\\u5ce1\\u4fa0\\u72ed\\u4e0b\\u53a6\\u590f\\u5413\\u6380\\u846d\\u55c4\\u72ce\\u9050\\u7455\\u7856\\u7615\\u7f45\\u9ee0\",\n  xian: \"\\u9528\\u5148\\u4ed9\\u9c9c\\u7ea4\\u54b8\\u8d24\\u8854\\u8237\\u95f2\\u6d8e\\u5f26\\u5acc\\u663e\\u9669\\u73b0\\u732e\\u53bf\\u817a\\u9985\\u7fa1\\u5baa\\u9677\\u9650\\u7ebf\\u51bc\\u85d3\\u5c98\\u7303\\u66b9\\u5a34\\u6c19\\u7946\\u9e47\\u75eb\\u86ac\\u7b45\\u7c7c\\u9170\\u8df9\",\n  xiang:\n    \"\\u76f8\\u53a2\\u9576\\u9999\\u7bb1\\u8944\\u6e58\\u4e61\\u7fd4\\u7965\\u8be6\\u60f3\\u54cd\\u4eab\\u9879\\u5df7\\u6a61\\u50cf\\u5411\\u8c61\\u8297\\u8459\\u9977\\u5ea0\\u9aa7\\u7f03\\u87d3\\u9c9e\\u98e8\",\n  xiao: \"\\u8427\\u785d\\u9704\\u524a\\u54ee\\u56a3\\u9500\\u6d88\\u5bb5\\u6dc6\\u6653\\u5c0f\\u5b5d\\u6821\\u8096\\u5578\\u7b11\\u6548\\u54d3\\u54bb\\u5d24\\u6f47\\u900d\\u9a81\\u7ee1\\u67ad\\u67b5\\u7b71\\u7bab\\u9b48\",\n  xie: \"\\u6954\\u4e9b\\u6b47\\u874e\\u978b\\u534f\\u631f\\u643a\\u90aa\\u659c\\u80c1\\u8c10\\u5199\\u68b0\\u5378\\u87f9\\u61c8\\u6cc4\\u6cfb\\u8c22\\u5c51\\u5055\\u4eb5\\u52f0\\u71ee\\u85a4\\u64b7\\u5ee8\\u7023\\u9082\\u7ec1\\u7f2c\\u69ad\\u698d\\u6b59\\u8e9e\",\n  xin: \"\\u85aa\\u82af\\u950c\\u6b23\\u8f9b\\u65b0\\u5ffb\\u5fc3\\u4fe1\\u8845\\u56df\\u99a8\\u8398\\u6b46\\u94fd\\u946b\",\n  xing: \"\\u661f\\u8165\\u7329\\u60fa\\u5174\\u5211\\u578b\\u5f62\\u90a2\\u884c\\u9192\\u5e78\\u674f\\u6027\\u59d3\\u9649\\u8347\\u8365\\u64e4\\u60bb\\u784e\",\n  xiong: \"\\u5144\\u51f6\\u80f8\\u5308\\u6c79\\u96c4\\u718a\\u828e\",\n  xiu: \"\\u4f11\\u4fee\\u7f9e\\u673d\\u55c5\\u9508\\u79c0\\u8896\\u7ee3\\u83a0\\u5cab\\u9990\\u5ea5\\u9e3a\\u8c85\\u9af9\",\n  xu: \"\\u589f\\u620c\\u9700\\u865a\\u5618\\u987b\\u5f90\\u8bb8\\u84c4\\u9157\\u53d9\\u65ed\\u5e8f\\u755c\\u6064\\u7d6e\\u5a7f\\u7eea\\u7eed\\u8bb4\\u8be9\\u5729\\u84ff\\u6035\\u6d2b\\u6e86\\u987c\\u6829\\u7166\\u7809\\u76f1\\u80e5\\u7cc8\\u9191\",\n  xuan: \"\\u8f69\\u55a7\\u5ba3\\u60ac\\u65cb\\u7384\\u9009\\u7663\\u7729\\u7eda\\u5107\\u8c16\\u8431\\u63ce\\u9994\\u6ceb\\u6d35\\u6e32\\u6f29\\u7487\\u6966\\u6684\\u70ab\\u714a\\u78b9\\u94c9\\u955f\\u75c3\",\n  xue: \"\\u9774\\u859b\\u5b66\\u7a74\\u96ea\\u8840\\u5671\\u6cf6\\u9cd5\",\n  xun: \"\\u52cb\\u718f\\u5faa\\u65ec\\u8be2\\u5bfb\\u9a6f\\u5de1\\u6b89\\u6c5b\\u8bad\\u8baf\\u900a\\u8fc5\\u5dfd\\u57d9\\u8340\\u85b0\\u5ccb\\u5f87\\u6d54\\u66db\\u7aa8\\u91ba\\u9c9f\",\n  ya: \"\\u538b\\u62bc\\u9e26\\u9e2d\\u5440\\u4e2b\\u82bd\\u7259\\u869c\\u5d16\\u8859\\u6daf\\u96c5\\u54d1\\u4e9a\\u8bb6\\u4f22\\u63e0\\u5416\\u5c88\\u8fd3\\u5a05\\u740a\\u6860\\u6c29\\u7811\\u775a\\u75d6\",\n  yan: \"\\u7109\\u54bd\\u9609\\u70df\\u6df9\\u76d0\\u4e25\\u7814\\u8712\\u5ca9\\u5ef6\\u8a00\\u989c\\u960e\\u708e\\u6cbf\\u5944\\u63a9\\u773c\\u884d\\u6f14\\u8273\\u5830\\u71d5\\u538c\\u781a\\u96c1\\u5501\\u5f66\\u7130\\u5bb4\\u8c1a\\u9a8c\\u53a3\\u9765\\u8d5d\\u4fe8\\u5043\\u5156\\u8ba0\\u8c33\\u90fe\\u9122\\u82ab\\u83f8\\u5d26\\u6079\\u95eb\\u960f\\u6d07\\u6e6e\\u6edf\\u598d\\u5ae3\\u7430\\u664f\\u80ed\\u814c\\u7131\\u7f68\\u7b75\\u917d\\u9b47\\u990d\\u9f39\",\n  yang: \"\\u6b83\\u592e\\u9e2f\\u79e7\\u6768\\u626c\\u4f6f\\u75a1\\u7f8a\\u6d0b\\u9633\\u6c27\\u4ef0\\u75d2\\u517b\\u6837\\u6f3e\\u5f89\\u600f\\u6cf1\\u7080\\u70ca\\u6059\\u86d8\\u9785\",\n  yao: \"\\u9080\\u8170\\u5996\\u7476\\u6447\\u5c27\\u9065\\u7a91\\u8c23\\u59da\\u54ac\\u8200\\u836f\\u8981\\u8000\\u592d\\u723b\\u5406\\u5d3e\\u5fad\\u7039\\u5e7a\\u73e7\\u6773\\u66dc\\u80b4\\u9e5e\\u7a88\\u7e47\\u9cd0\",\n  ye: \"\\u6930\\u564e\\u8036\\u7237\\u91ce\\u51b6\\u4e5f\\u9875\\u6396\\u4e1a\\u53f6\\u66f3\\u814b\\u591c\\u6db2\\u8c12\\u90ba\\u63f6\\u9980\\u6654\\u70e8\\u94d8\",\n  yi: \"\\u4e00\\u58f9\\u533b\\u63d6\\u94f1\\u4f9d\\u4f0a\\u8863\\u9890\\u5937\\u9057\\u79fb\\u4eea\\u80f0\\u7591\\u6c82\\u5b9c\\u59e8\\u5f5d\\u6905\\u8681\\u501a\\u5df2\\u4e59\\u77e3\\u4ee5\\u827a\\u6291\\u6613\\u9091\\u5c79\\u4ebf\\u5f79\\u81c6\\u9038\\u8084\\u75ab\\u4ea6\\u88d4\\u610f\\u6bc5\\u5fc6\\u4e49\\u76ca\\u6ea2\\u8be3\\u8bae\\u8c0a\\u8bd1\\u5f02\\u7ffc\\u7fcc\\u7ece\\u5208\\u5293\\u4f7e\\u8bd2\\u572a\\u572f\\u57f8\\u61ff\\u82e1\\u858f\\u5f08\\u5955\\u6339\\u5f0b\\u5453\\u54a6\\u54bf\\u566b\\u5cc4\\u5db7\\u7317\\u9974\\u603f\\u6021\\u6092\\u6f2a\\u8fe4\\u9a7f\\u7f22\\u6baa\\u8d3b\\u65d6\\u71a0\\u9487\\u9552\\u9571\\u75cd\\u7617\\u7654\\u7fca\\u8864\\u8734\\u8223\\u7fbf\\u7ff3\\u914f\\u9edf\",\n  yin: \"\\u8335\\u836b\\u56e0\\u6bb7\\u97f3\\u9634\\u59fb\\u541f\\u94f6\\u6deb\\u5bc5\\u996e\\u5c39\\u5f15\\u9690\\u5370\\u80e4\\u911e\\u5819\\u831a\\u5591\\u72fa\\u5924\\u6c24\\u94df\\u763e\\u8693\\u972a\\u9f88\",\n  ying: \"\\u82f1\\u6a31\\u5a74\\u9e70\\u5e94\\u7f28\\u83b9\\u8424\\u8425\\u8367\\u8747\\u8fce\\u8d62\\u76c8\\u5f71\\u9896\\u786c\\u6620\\u5b34\\u90e2\\u8314\\u83ba\\u8426\\u6484\\u5624\\u81ba\\u6ee2\\u6f46\\u701b\\u745b\\u748e\\u6979\\u9e66\\u763f\\u988d\\u7f42\",\n  yo: \"\\u54df\\u5537\",\n  yong: \"\\u62e5\\u4f63\\u81c3\\u75c8\\u5eb8\\u96cd\\u8e0a\\u86f9\\u548f\\u6cf3\\u6d8c\\u6c38\\u607f\\u52c7\\u7528\\u4fd1\\u58c5\\u5889\\u6175\\u9095\\u955b\\u752c\\u9cd9\\u9954\",\n  you: \"\\u5e7d\\u4f18\\u60a0\\u5fe7\\u5c24\\u7531\\u90ae\\u94c0\\u72b9\\u6cb9\\u6e38\\u9149\\u6709\\u53cb\\u53f3\\u4f51\\u91c9\\u8bf1\\u53c8\\u5e7c\\u5363\\u6538\\u4f91\\u83b8\\u5466\\u56ff\\u5ba5\\u67da\\u7337\\u7256\\u94d5\\u75a3\\u8763\\u9c7f\\u9edd\\u9f2c\",\n  yu: \"\\u8fc2\\u6de4\\u4e8e\\u76c2\\u6986\\u865e\\u611a\\u8206\\u4f59\\u4fde\\u903e\\u9c7c\\u6109\\u6e1d\\u6e14\\u9685\\u4e88\\u5a31\\u96e8\\u4e0e\\u5c7f\\u79b9\\u5b87\\u8bed\\u7fbd\\u7389\\u57df\\u828b\\u90c1\\u5401\\u9047\\u55bb\\u5cea\\u5fa1\\u6108\\u6b32\\u72f1\\u80b2\\u8a89\\u6d74\\u5bd3\\u88d5\\u9884\\u8c6b\\u9a6d\\u79ba\\u6bd3\\u4f1b\\u4fe3\\u8c00\\u8c15\\u8438\\u84e3\\u63c4\\u5581\\u5704\\u5709\\u5d5b\\u72f3\\u996b\\u5ebe\\u9608\\u59aa\\u59a4\\u7ea1\\u745c\\u6631\\u89ce\\u8174\\u6b24\\u65bc\\u715c\\u71e0\\u807f\\u94b0\\u9e46\\u7610\\u7600\\u7ab3\\u8753\\u7afd\\u8201\\u96e9\\u9f89\",\n  yuan: \"\\u9e33\\u6e0a\\u51a4\\u5143\\u57a3\\u8881\\u539f\\u63f4\\u8f95\\u56ed\\u5458\\u5706\\u733f\\u6e90\\u7f18\\u8fdc\\u82d1\\u613f\\u6028\\u9662\\u586c\\u6c85\\u5a9b\\u7457\\u6a7c\\u7230\\u7722\\u9e22\\u8788\\u9f0b\",\n  yue: \"\\u66f0\\u7ea6\\u8d8a\\u8dc3\\u94a5\\u5cb3\\u7ca4\\u6708\\u60a6\\u9605\\u9fa0\\u6a3e\\u5216\\u94ba\",\n  yun: \"\\u8018\\u4e91\\u90e7\\u5300\\u9668\\u5141\\u8fd0\\u8574\\u915d\\u6655\\u97f5\\u5b55\\u90d3\\u82b8\\u72c1\\u607d\\u7ead\\u6b92\\u6600\\u6c32\",\n  za: \"\\u531d\\u7838\\u6742\\u62f6\\u5482\",\n  zai: \"\\u683d\\u54c9\\u707e\\u5bb0\\u8f7d\\u518d\\u5728\\u54b1\\u5d3d\\u753e\",\n  zan: \"\\u6512\\u6682\\u8d5e\\u74d2\\u661d\\u7c2a\\u7ccc\\u8db1\\u933e\",\n  zang: \"\\u8d43\\u810f\\u846c\\u5958\\u6215\\u81e7\",\n  zao: \"\\u906d\\u7cdf\\u51ff\\u85fb\\u67a3\\u65e9\\u6fa1\\u86a4\\u8e81\\u566a\\u9020\\u7682\\u7076\\u71e5\\u5523\\u7f2b\",\n  ze: \"\\u8d23\\u62e9\\u5219\\u6cfd\\u4ec4\\u8d5c\\u5567\\u8fee\\u6603\\u7b2e\\u7ba6\\u8234\",\n  zei: \"\\u8d3c\",\n  zen: \"\\u600e\\u8c2e\",\n  zeng: \"\\u589e\\u618e\\u66fe\\u8d60\\u7f2f\\u7511\\u7f7e\\u9503\",\n  zha: \"\\u624e\\u55b3\\u6e23\\u672d\\u8f67\\u94e1\\u95f8\\u7728\\u6805\\u69a8\\u548b\\u4e4d\\u70b8\\u8bc8\\u63f8\\u5412\\u54a4\\u54f3\\u600d\\u781f\\u75c4\\u86b1\\u9f44\",\n  zhai: \"\\u6458\\u658b\\u5b85\\u7a84\\u503a\\u5be8\\u7826\",\n  zhan: \"\\u77bb\\u6be1\\u8a79\\u7c98\\u6cbe\\u76cf\\u65a9\\u8f97\\u5d2d\\u5c55\\u8638\\u6808\\u5360\\u6218\\u7ad9\\u6e5b\\u7efd\\u8c35\\u640c\\u65c3\",\n  zhang:\n    \"\\u6a1f\\u7ae0\\u5f70\\u6f33\\u5f20\\u638c\\u6da8\\u6756\\u4e08\\u5e10\\u8d26\\u4ed7\\u80c0\\u7634\\u969c\\u4ec9\\u9123\\u5e5b\\u5d82\\u7350\\u5adc\\u748b\\u87d1\",\n  zhao: \"\\u62db\\u662d\\u627e\\u6cbc\\u8d75\\u7167\\u7f69\\u5146\\u8087\\u53ec\\u722a\\u8bcf\\u68f9\\u948a\\u7b0a\",\n  zhe: \"\\u906e\\u6298\\u54f2\\u86f0\\u8f99\\u8005\\u9517\\u8517\\u8fd9\\u6d59\\u8c2a\\u966c\\u67d8\\u8f84\\u78d4\\u9e67\\u891a\\u8707\\u8d6d\",\n  zhen: \"\\u73cd\\u659f\\u771f\\u7504\\u7827\\u81fb\\u8d1e\\u9488\\u4fa6\\u6795\\u75b9\\u8bca\\u9707\\u632f\\u9547\\u9635\\u7f1c\\u6862\\u699b\\u8f78\\u8d48\\u80d7\\u6715\\u796f\\u755b\\u9e29\",\n  zheng:\n    \"\\u84b8\\u6323\\u7741\\u5f81\\u72f0\\u4e89\\u6014\\u6574\\u62ef\\u6b63\\u653f\\u5e27\\u75c7\\u90d1\\u8bc1\\u8be4\\u5ce5\\u94b2\\u94ee\\u7b5d\",\n  zhi: \"\\u829d\\u679d\\u652f\\u5431\\u8718\\u77e5\\u80a2\\u8102\\u6c41\\u4e4b\\u7ec7\\u804c\\u76f4\\u690d\\u6b96\\u6267\\u503c\\u4f84\\u5740\\u6307\\u6b62\\u8dbe\\u53ea\\u65e8\\u7eb8\\u5fd7\\u631a\\u63b7\\u81f3\\u81f4\\u7f6e\\u5e1c\\u5cd9\\u5236\\u667a\\u79e9\\u7a1a\\u8d28\\u7099\\u75d4\\u6ede\\u6cbb\\u7a92\\u536e\\u965f\\u90c5\\u57f4\\u82b7\\u646d\\u5e19\\u5fee\\u5f58\\u54ab\\u9a98\\u6809\\u67b3\\u6800\\u684e\\u8f75\\u8f7e\\u6534\\u8d3d\\u81a3\\u7949\\u7957\\u9ef9\\u96c9\\u9e37\\u75e3\\u86ed\\u7d77\\u916f\\u8dd6\\u8e2c\\u8e2f\\u8c78\\u89ef\",\n  zhong:\n    \"\\u4e2d\\u76c5\\u5fe0\\u949f\\u8877\\u7ec8\\u79cd\\u80bf\\u91cd\\u4ef2\\u4f17\\u51a2\\u953a\\u87bd\\u8202\\u822f\\u8e35\",\n  zhou: \"\\u821f\\u5468\\u5dde\\u6d32\\u8bcc\\u7ca5\\u8f74\\u8098\\u5e1a\\u5492\\u76b1\\u5b99\\u663c\\u9aa4\\u5544\\u7740\\u501c\\u8bf9\\u836e\\u9b3b\\u7ea3\\u80c4\\u78a1\\u7c40\\u8233\\u914e\\u9cb7\",\n  zhu: \"\\u73e0\\u682a\\u86db\\u6731\\u732a\\u8bf8\\u8bdb\\u9010\\u7af9\\u70db\\u716e\\u62c4\\u77a9\\u5631\\u4e3b\\u8457\\u67f1\\u52a9\\u86c0\\u8d2e\\u94f8\\u7b51\\u4f4f\\u6ce8\\u795d\\u9a7b\\u4f2b\\u4f8f\\u90be\\u82ce\\u8331\\u6d19\\u6e1a\\u6f74\\u9a7a\\u677c\\u69e0\\u6a65\\u70b7\\u94e2\\u75b0\\u7603\\u86b0\\u7afa\\u7bb8\\u7fe5\\u8e85\\u9e88\",\n  zhua: \"\\u6293\",\n  zhuai: \"\\u62fd\",\n  zhuan: \"\\u4e13\\u7816\\u8f6c\\u64b0\\u8d5a\\u7bc6\\u629f\\u556d\\u989b\",\n  zhuang: \"\\u6869\\u5e84\\u88c5\\u5986\\u649e\\u58ee\\u72b6\\u4e2c\",\n  zhui: \"\\u690e\\u9525\\u8ffd\\u8d58\\u5760\\u7f00\\u8411\\u9a93\\u7f12\",\n  zhun: \"\\u8c06\\u51c6\",\n  zhuo: \"\\u6349\\u62d9\\u5353\\u684c\\u7422\\u8301\\u914c\\u707c\\u6d4a\\u502c\\u8bfc\\u5ef4\\u855e\\u64e2\\u555c\\u6d5e\\u6dbf\\u6753\\u712f\\u799a\\u65ab\",\n  zi: \"\\u5179\\u54a8\\u8d44\\u59ff\\u6ecb\\u6dc4\\u5b5c\\u7d2b\\u4ed4\\u7c7d\\u6ed3\\u5b50\\u81ea\\u6e0d\\u5b57\\u8c18\\u5d6b\\u59ca\\u5b73\\u7f01\\u6893\\u8f8e\\u8d40\\u6063\\u7726\\u9531\\u79ed\\u8014\\u7b2b\\u7ca2\\u89dc\\u8a3e\\u9cbb\\u9aed\",\n  zong: \"\\u9b03\\u68d5\\u8e2a\\u5b97\\u7efc\\u603b\\u7eb5\\u8159\\u7cbd\",\n  zou: \"\\u90b9\\u8d70\\u594f\\u63cd\\u9139\\u9cb0\",\n  zu: \"\\u79df\\u8db3\\u5352\\u65cf\\u7956\\u8bc5\\u963b\\u7ec4\\u4fce\\u83f9\\u5550\\u5f82\\u9a75\\u8e74\",\n  zuan: \"\\u94bb\\u7e82\\u6525\\u7f35\",\n  zui: \"\\u5634\\u9189\\u6700\\u7f6a\",\n  zun: \"\\u5c0a\\u9075\\u6499\\u6a3d\\u9cdf\",\n  zuo: \"\\u6628\\u5de6\\u4f50\\u67de\\u505a\\u4f5c\\u5750\\u5ea7\\u961d\\u963c\\u80d9\\u795a\\u9162\",\n  cou: \"\\u85ae\\u6971\\u8f8f\\u8160\",\n  nang: \"\\u652e\\u54dd\\u56d4\\u9995\\u66e9\",\n  o: \"\\u5594\",\n  dia: \"\\u55f2\",\n  chuai: \"\\u562c\\u81aa\\u8e39\",\n  cen: \"\\u5c91\\u6d94\",\n  diu: \"\\u94e5\",\n  nou: \"\\u8028\",\n  fou: \"\\u7f36\",\n  bia: \"\\u9adf\",\n};\n"
  },
  {
    "path": "util/request/index.js",
    "content": "// 引入配置\nimport config from \"@/common/config\";\n// 初始化请求配置\nuni.$u.http.setConfig((defaultConfig) => {\n  /* defaultConfig 为默认全局配置 */\n  defaultConfig.baseURL = config.getRegisterUrl(); /* 根域名 */\n  return defaultConfig;\n});\n\nmodule.exports = (vm) => {\n  require(\"./requestInterceptors\")(vm);\n  require(\"./responseInterceptors\")(vm);\n};\n"
  },
  {
    "path": "util/request/requestInterceptors.js",
    "content": "import appConfig from \"@/common/config\";\nimport { v4 as uuidV4 } from \"uuid\";\n/**\n * 请求拦截\n * @param {Object} http\n */\nmodule.exports = (vm) => {\n  uni.$u.http.interceptors.request.use(\n    (config) => {\n      // 可使用async await 做异步操作\n      // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}\n      config.data = config.data || {};\n      if (config.custom.isIMApi) {\n        config.baseURL = appConfig.getApiUrl();\n      }\n      if (config.custom.isPgyerApi) {\n        config.baseURL = \"https://www.pgyer.com\";\n      }\n      config.header = {\n        ...config.header,\n        operationID: uuidV4(),\n      };\n      // 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中\n      return config;\n    },\n    (\n      config, // 可使用async await 做异步操作\n    ) => Promise.reject(config),\n  );\n};\n"
  },
  {
    "path": "util/request/responseInterceptors.js",
    "content": "/**\n * 响应拦截\n * @param {Object} http\n */\nmodule.exports = (vm) => {\n  uni.$u.http.interceptors.response.use(\n    (response) => {\n      /* 对响应成功做点什么 可使用async await 做异步操作*/\n      const data = response.data;\n      // 自定义参数\n      const custom = response.config?.custom;\n      if (data.errCode !== 0 && data.code !== 0) {\n        // 服务端返回的状态码不等于200，则reject()\n        // 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示\n        // if (custom.toast !== false) {\n        //     uni.$u.toast(data.message)\n        // }\n        // 如果需要catch返回，则进行reject\n        // if (custom?.catch) {\n        console.error('http catch rejected', data)\n        return Promise.reject(data);\n        // } else {\n        //     // 否则返回一个pending中的promise\n        //     return new Promise(() => { })\n        // }\n      }\n      return data.data || {};\n    },\n    (response) => {\n      /*  对响应错误做点什么 （statusCode !== 200）*/\n      return Promise.reject(response);\n    },\n  );\n};\n"
  }
]