From c9ceac9f3737c7ab349eb50d7777f834c031be07 Mon Sep 17 00:00:00 2001 From: lifizer <913626195@qq.com> Date: Wed, 20 Sep 2023 21:49:33 +0800 Subject: [PATCH] Init project --- .gitignore | 15 + .hbuilderx/launch.json | 16 + App.vue | 26 + api/activity.js | 153 + api/admin.js | 73 + api/goods.js | 92 + api/inn.js | 200 + api/join.js | 50 + api/luck.js | 59 + api/order.js | 163 + api/product.js | 43 + api/public.js | 202 + api/shop.js | 72 + api/store.js | 191 + api/user.js | 525 + api/wenwan.js | 21 + assets/css/base.less | 293 + assets/css/goods.less | 173 + assets/css/pkg_join.less | 142 + assets/css/product.less | 131 + assets/css/reset.less | 43 + assets/css/store.less | 39 + assets/css/style.less | 8193 ++++++++++ assets/iconfont/iconfont.css | 661 + assets/script/global.js | 54 + components/AddressWindow.vue | 77 + components/CitySelect.vue | 335 + components/CountDown.vue | 98 + components/CouponListWindow.vue | 122 + components/CouponPop.vue | 75 + components/CouponWindow.vue | 88 + components/DataFormat.vue | 24 + components/DataFormatT.vue | 24 + components/GoodList.vue | 54 + components/Loading.vue | 27 + components/OrderGoods.vue | 88 + components/Payment.vue | 174 + components/PriceChange.vue | 133 + components/ProductConSwiper.vue | 87 + components/ProductWindow.vue | 122 + components/PromotionGood.vue | 36 + components/Recommend.vue | 89 + components/ShareInfo.vue | 45 + components/StorePoster.vue | 165 + components/UserEvaluation.vue | 56 + components/WriteOff.vue | 128 + components/blPaymentPasswordInput.vue | 435 + components/chose-city/chose-city.vue | 368 + components/drag-button/drag-button.vue | 142 + components/drop-down/drop-down.vue | 116 + components/easy-upload/easy-upload.vue | 343 + components/easy-upload/readme.md | 51 + components/hx-navbar/README.md | 240 + components/hx-navbar/hx-navbar.vue | 650 + components/imageTypeSet/imagebox.vue | 160 + components/ls-swiper/index.md | 40 + components/ls-swiper/index.vue | 180 + .../maramlee-waterfalls-flow.vue | 173 + .../mescroll-uni/components/mescroll-down.css | 55 + .../mescroll-uni/components/mescroll-down.vue | 47 + .../components/mescroll-empty.vue | 91 + .../mescroll-uni/components/mescroll-top.vue | 81 + .../mescroll-uni/components/mescroll-up.css | 46 + .../mescroll-uni/components/mescroll-up.vue | 39 + components/mescroll-uni/mescroll-body.css | 10 + components/mescroll-uni/mescroll-body.vue | 292 + components/mescroll-uni/mescroll-mixins.js | 60 + .../mescroll-uni/mescroll-uni-option.js | 36 + components/mescroll-uni/mescroll-uni.css | 29 + components/mescroll-uni/mescroll-uni.js | 862 ++ components/mescroll-uni/mescroll-uni.vue | 364 + .../mescroll-uni/mixins/mescroll-comp.js | 23 + .../mescroll-uni/mixins/mescroll-more-item.js | 48 + .../mescroll-uni/mixins/mescroll-more.js | 56 + components/simple-address/city-data/area.js | 12548 ++++++++++++++++ components/simple-address/city-data/city.js | 1507 ++ .../simple-address/city-data/province.js | 143 + components/simple-address/simple-address.nvue | 381 + components/uni-popup/message.js | 22 + components/uni-popup/popup.js | 25 + components/uni-popup/uni-popup-dialog.vue | 243 + components/uni-popup/uni-popup-message.vue | 116 + components/uni-popup/uni-popup-share.vue | 165 + components/uni-popup/uni-popup.vue | 294 + .../uni-segmented-control.vue | 134 + components/uni-transition/uni-transition.vue | 279 + components/v-tabs/readme.md | 182 + components/v-tabs/v-tabs.vue | 358 + .../yzc-paykeyboard/yzc-paykeyboard.vue | 287 + config/index.js | 13 + libs/chat.js | 51 + libs/order.js | 161 + libs/wechat.js | 397 + main.js | 187 + manifest.json | 172 + mixins/SendVerifyCode.js | 27 + mixins/mescroll-mixins.js | 46 + mixins/share-mixins.js | 34 + package.json | 123 + pages.json | 894 ++ pages/LiveAndShortVideo/LiveAndShortVideo.vue | 266 + pages/LiveBroadcastList/LiveBroadcastList.vue | 246 + pages/Loading/index.vue | 144 + pages/NotDefined/index.vue | 60 + .../VideoPlayBackList/VideoPlayBackDetail.vue | 47 + pages/VideoPlayBackList/VideoPlayBackList.vue | 175 + pages/activity/BargainRecord/index.vue | 131 + pages/activity/DargainDetails/index.vue | 617 + pages/activity/GoodsBargain/index.vue | 84 + pages/activity/GoodsGroup/index.vue | 91 + pages/activity/GoodsSeckill/index.vue | 261 + pages/activity/GroupDetails/index.vue | 375 + pages/activity/GroupRule/index.vue | 248 + pages/activity/Poster/index.vue | 79 + pages/activity/SeckillDetails/index.vue | 235 + pages/authorization/index.vue | 408 + pages/authorization/index_bak.vue | 310 + pages/authorization/pass.vue | 346 + pages/cloud/cloud.vue | 376 + pages/cloud/haveFun.vue | 341 + pages/foodInfomation/foodInfomation.vue | 973 ++ pages/foodInfomation/foodInfomationDetail.vue | 210 + pages/foodInfomation/information.vue | 163 + pages/home/index.vue | 2046 +++ pages/map/index.vue | 57 + pages/order/GoodsReturn/index.vue | 140 + pages/order/Logistics/index.vue | 398 + pages/order/MyOrder/index.vue | 506 + pages/order/OrderDetails/index.vue | 771 + pages/order/OrderSubmission/index.vue | 925 ++ pages/order/PaymentStatus/index.vue | 34 + pages/order/ReturnList/index.vue | 104 + pages/orderAdmin/AdminOrder/index.vue | 354 + pages/orderAdmin/AdminOrderList/index.vue | 330 + pages/orderAdmin/GoodsDeliver/index.vue | 231 + pages/orderAdmin/OrderCancellation/index.vue | 184 + pages/orderAdmin/OrderIndex/index.vue | 167 + pages/orderAdmin/Statistics/index.vue | 446 + pages/shop/EvaluateList/index.vue | 115 + pages/shop/GoodSearch/index.vue | 131 + pages/shop/GoodsClass/index.vue | 578 + pages/shop/GoodsCollection/index.vue | 102 + pages/shop/GoodsCon/index.vue | 1892 +++ pages/shop/GoodsEvaluate/index.vue | 198 + pages/shop/GoodsList/index.vue | 384 + pages/shop/GoodsPromotion/index.vue | 78 + pages/shop/HotNewGoods/index.vue | 99 + pages/shop/ShoppingCart/index.vue | 721 + pages/shop/StoreList/index.vue | 196 + pages/user/CustomerList/index.vue | 73 + pages/user/Login/index.vue | 332 + .../MemberUpgradeIntro/MemberUpgradeIntro.vue | 39 + pages/user/Message/Message.vue | 164 + pages/user/MessageDetail/MessageDetail.vue | 90 + .../ModifyPayPassword/ModifyPayPassword.vue | 217 + pages/user/Recharge/index.vue | 335 + pages/user/RetrievePassword/index.vue | 153 + .../UpgradeElectronicProtocol.vue | 368 + .../UpgradeProtocolDetail.vue | 211 + pages/user/User/index.vue | 1115 ++ pages/user/UserAccount/index.vue | 111 + pages/user/UserBill/index.vue | 114 + pages/user/UserFavorite/UserFavorite.vue | 316 + pages/user/UserVip/index.vue | 209 + pages/user/address/AddAddress/index.vue | 375 + .../user/address/AddressManagement/index.vue | 273 + pages/user/coupon/GetCoupon/index.vue | 107 + pages/user/coupon/UserCoupon/index.vue | 79 + pages/user/promotion/CashAudit/index.vue | 33 + pages/user/promotion/CashRecord/index.vue | 162 + .../promotion/CommissionDetails/index.vue | 113 + pages/user/promotion/Poster/index.vue | 160 + pages/user/promotion/PromoterList/index.vue | 356 + pages/user/promotion/PromoterOrder/index.vue | 123 + pages/user/promotion/UserCash/index.vue | 212 + pages/user/promotion/UserPromotion/index.vue | 241 + pages/user/signIn/Integral/index.vue | 151 + pages/user/signIn/Sign/index.vue | 186 + pages/user/signIn/SignRecord/index.vue | 65 + pagesInn/components/tm-upload/tm-upload.vue | 484 + pagesInn/inn/innApply.vue | 782 + pagesInn/inn/innHome.vue | 1114 ++ pagesInn/inn/innInfoDetail.vue | 387 + pagesInn/inn/innInfoPublish.vue | 198 + pagesInn/inn/innPartnerAgreement.vue | 48 + pagesInn/inn/innProfileEdit.vue | 433 + pkg_common/views/pdf.vue | 17 + pkg_common/views/room.vue | 374 + pkg_common/views/roomLogs.vue | 109 + pkg_discard/components/Footer.vue | 65 + pkg_discard/components/Home.vue | 59 + pkg_discard/components/Mask.vue | 74 + pkg_discard/components/SwitchWindow.vue | 155 + pkg_discard/views/launch/index.vue | 88 + pkg_join/views/index.vue | 154 + pkg_join/views/shop.vue | 497 + pkg_join/views/supplier.vue | 780 + pkg_orders/views/refund.vue | 264 + pkg_product/components/CountDownUnit.vue | 110 + pkg_product/views/famousHot.vue | 185 + pkg_product/views/famousList.vue | 212 + pkg_product/views/famousStory.vue | 60 + pkg_product/views/findJoy.vue | 13 + pkg_product/views/giftList.vue | 156 + pkg_product/views/healthList.vue | 246 + pkg_product/views/nativeList.vue | 177 + pkg_product/views/nativeList_bak.vue | 191 + pkg_product/views/scenicSpot.vue | 157 + pkg_product/views/seckill.vue | 515 + pkg_product/views/sharpList.vue | 152 + .../invinbg-image-cropper.vue | 759 + pkg_user/views/addBankCard.vue | 209 + pkg_user/views/bankCardList.vue | 274 + pkg_user/views/bindPhone.vue | 222 + pkg_user/views/payPassword.vue | 285 + pkg_user/views/personalData.vue | 366 + pkg_user/views/withdrawal.vue | 467 + static/images/down.png | Bin 0 -> 1247 bytes static/images/enter.png | Bin 0 -> 1218 bytes static/images/horn.png | Bin 0 -> 1245 bytes static/images/img_nodata.png | Bin 0 -> 4349 bytes static/images/num_minus_icon.png | Bin 0 -> 1384 bytes static/images/num_plus_icon.png | Bin 0 -> 1452 bytes static/images/orderdetail-finish-icon.png | Bin 0 -> 4366 bytes .../images/orderdetail-waitdelivery-icon.png | Bin 0 -> 3598 bytes static/images/orderdetail-waitpay-icon.png | Bin 0 -> 5159 bytes static/images/orderdetail-waitreceive.png | Bin 0 -> 3896 bytes static/images/poster-close.png | Bin 0 -> 2130 bytes static/images/start.png | Bin 0 -> 2970 bytes static/images/up.png | Bin 0 -> 1248 bytes static/images/v6/btn_active_left.png | Bin 0 -> 2927 bytes static/images/v6/btn_active_right.png | Bin 0 -> 3083 bytes static/images/v6/btn_left.png | Bin 0 -> 2795 bytes static/images/v6/btn_right.png | Bin 0 -> 2877 bytes static/images/waitcomment-order-icon.png | Bin 0 -> 1818 bytes static/images/waitdelivery-order-icon.png | Bin 0 -> 553 bytes static/images/waitpay-order-icon.png | Bin 0 -> 2465 bytes static/images/waitreceive-order-icon.png | Bin 0 -> 1841 bytes static/tabbar/icon-cart-hot.png | Bin 0 -> 2292 bytes static/tabbar/icon-cart.png | Bin 0 -> 2811 bytes static/tabbar/icon-class-hot.png | Bin 0 -> 2581 bytes static/tabbar/icon-class.png | Bin 0 -> 3338 bytes static/tabbar/icon-cloud-hot.png | Bin 0 -> 1691 bytes static/tabbar/icon-cloud.png | Bin 0 -> 3042 bytes static/tabbar/icon-home-hot.png | Bin 0 -> 3540 bytes static/tabbar/icon-home.png | Bin 0 -> 3212 bytes static/tabbar/icon-user-hot.png | Bin 0 -> 1781 bytes static/tabbar/icon-user.png | Bin 0 -> 2516 bytes store/index.js | 162 + store/modules/switchCity.js | 239 + store/mutation-types.js | 19 + uni.scss | 78 + .../custom-waterfalls-flow/changelog.md | 15 + .../custom-waterfalls-flow.vue | 309 + .../custom-waterfalls-flow/package.json | 81 + uni_modules/custom-waterfalls-flow/readme.md | 445 + uni_modules/d-swiper-type/changelog.md | 25 + .../d-swiper-type/d-swiper-type.vue | 478 + .../d-swiper-type/pages/home/hometype.vue | 478 + .../d-swiper-type/pages/home/readme.md | 10 + .../pages/static/icon_img/bing.png | Bin 0 -> 373442 bytes .../pages/static/icon_img/del.png | Bin 0 -> 1269 bytes .../pages/static/icon_img/del2.png | Bin 0 -> 765 bytes .../pages/static/icon_img/mangguo.png | Bin 0 -> 407525 bytes .../pages/static/icon_img/search.png | Bin 0 -> 4067 bytes .../pages/static/icon_img/xigua.png | Bin 0 -> 641219 bytes .../pages/static/icon_img/yan_close.png | Bin 0 -> 1039 bytes .../pages/static/icon_img/yan_open.png | Bin 0 -> 1300 bytes uni_modules/d-swiper-type/package.json | 89 + uni_modules/d-swiper-type/readme.md | 30 + uni_modules/uni-icons/changelog.md | 22 + .../uni-icons/components/uni-icons/icons.js | 1169 ++ .../components/uni-icons/uni-icons.vue | 96 + .../components/uni-icons/uniicons.css | 663 + .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 86 + uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-search-bar/changelog.md | 27 + .../components/uni-search-bar/i18n/en.json | 4 + .../components/uni-search-bar/i18n/index.js | 8 + .../uni-search-bar/i18n/zh-Hans.json | 4 + .../uni-search-bar/i18n/zh-Hant.json | 4 + .../uni-search-bar/uni-search-bar.vue | 287 + uni_modules/uni-search-bar/package.json | 89 + uni_modules/uni-search-bar/readme.md | 14 + uni_modules/uview-ui/LICENSE | 21 + uni_modules/uview-ui/README.md | 66 + uni_modules/uview-ui/changelog.md | 357 + .../uview-ui/components/u--form/u--form.vue | 78 + .../uview-ui/components/u--image/u--image.vue | 47 + .../uview-ui/components/u--input/u--input.vue | 73 + .../uview-ui/components/u--text/u--text.vue | 44 + .../components/u--textarea/u--textarea.vue | 48 + .../components/u-action-sheet/props.js | 54 + .../u-action-sheet/u-action-sheet.vue | 278 + .../uview-ui/components/u-album/props.js | 59 + .../uview-ui/components/u-album/u-album.vue | 259 + .../uview-ui/components/u-alert/props.js | 44 + .../uview-ui/components/u-alert/u-alert.vue | 243 + .../components/u-avatar-group/props.js | 52 + .../u-avatar-group/u-avatar-group.vue | 103 + .../uview-ui/components/u-avatar/props.js | 78 + .../uview-ui/components/u-avatar/u-avatar.vue | 172 + .../uview-ui/components/u-back-top/props.js | 54 + .../components/u-back-top/u-back-top.vue | 129 + .../uview-ui/components/u-badge/props.js | 72 + .../uview-ui/components/u-badge/u-badge.vue | 171 + .../uview-ui/components/u-button/nvue.scss | 46 + .../uview-ui/components/u-button/props.js | 161 + .../uview-ui/components/u-button/u-button.vue | 490 + .../uview-ui/components/u-button/vue.scss | 80 + .../uview-ui/components/u-calendar/header.vue | 99 + .../uview-ui/components/u-calendar/month.vue | 621 + .../uview-ui/components/u-calendar/props.js | 144 + .../components/u-calendar/u-calendar.vue | 385 + .../uview-ui/components/u-calendar/util.js | 85 + .../components/u-car-keyboard/props.js | 14 + .../u-car-keyboard/u-car-keyboard.vue | 311 + .../uview-ui/components/u-cell-group/props.js | 14 + .../components/u-cell-group/u-cell-group.vue | 61 + .../uview-ui/components/u-cell/props.js | 110 + .../uview-ui/components/u-cell/u-cell.vue | 229 + .../components/u-checkbox-group/props.js | 82 + .../u-checkbox-group/u-checkbox-group.vue | 103 + .../uview-ui/components/u-checkbox/props.js | 69 + .../components/u-checkbox/u-checkbox.vue | 344 + .../components/u-circle-progress/props.js | 8 + .../u-circle-progress/u-circle-progress.vue | 198 + .../uview-ui/components/u-code-input/props.js | 79 + .../components/u-code-input/u-code-input.vue | 252 + .../uview-ui/components/u-code/props.js | 34 + .../uview-ui/components/u-code/u-code.vue | 129 + .../uview-ui/components/u-col/props.js | 29 + .../uview-ui/components/u-col/u-col.vue | 162 + .../components/u-collapse-item/props.js | 59 + .../u-collapse-item/u-collapse-item.vue | 225 + .../uview-ui/components/u-collapse/props.js | 19 + .../components/u-collapse/u-collapse.vue | 90 + .../components/u-column-notice/props.js | 55 + .../u-column-notice/u-column-notice.vue | 160 + .../uview-ui/components/u-count-down/props.js | 24 + .../components/u-count-down/u-count-down.vue | 163 + .../uview-ui/components/u-count-down/utils.js | 62 + .../uview-ui/components/u-count-to/props.js | 59 + .../components/u-count-to/u-count-to.vue | 184 + .../components/u-datetime-picker/props.js | 116 + .../u-datetime-picker/u-datetime-picker.vue | 360 + .../uview-ui/components/u-divider/props.js | 44 + .../components/u-divider/u-divider.vue | 116 + .../components/u-dropdown-item/props.js | 36 + .../u-dropdown-item/u-dropdown-item.vue | 127 + .../uview-ui/components/u-dropdown/props.js | 65 + .../components/u-dropdown/u-dropdown.vue | 127 + .../uview-ui/components/u-empty/props.js | 59 + .../uview-ui/components/u-empty/u-empty.vue | 128 + .../uview-ui/components/u-form-item/props.js | 48 + .../components/u-form-item/u-form-item.vue | 235 + .../uview-ui/components/u-form/props.js | 45 + .../uview-ui/components/u-form/u-form.vue | 214 + .../uview-ui/components/u-gap/props.js | 24 + .../uview-ui/components/u-gap/u-gap.vue | 38 + .../uview-ui/components/u-grid-item/props.js | 14 + .../components/u-grid-item/u-grid-item.vue | 209 + .../uview-ui/components/u-grid/props.js | 19 + .../uview-ui/components/u-grid/u-grid.vue | 97 + .../uview-ui/components/u-icon/icons.js | 214 + .../uview-ui/components/u-icon/props.js | 89 + .../uview-ui/components/u-icon/u-icon.vue | 234 + .../uview-ui/components/u-image/props.js | 84 + .../uview-ui/components/u-image/u-image.vue | 232 + .../components/u-index-anchor/props.js | 29 + .../u-index-anchor/u-index-anchor.vue | 91 + .../uview-ui/components/u-index-item/props.js | 5 + .../components/u-index-item/u-index-item.vue | 87 + .../uview-ui/components/u-index-list/props.js | 29 + .../components/u-index-list/u-index-list.vue | 440 + .../uview-ui/components/u-input/props.js | 187 + .../uview-ui/components/u-input/u-input.vue | 354 + .../uview-ui/components/u-keyboard/props.js | 84 + .../components/u-keyboard/u-keyboard.vue | 164 + .../components/u-line-progress/props.js | 28 + .../u-line-progress/u-line-progress.vue | 144 + .../uview-ui/components/u-line/props.js | 33 + .../uview-ui/components/u-line/u-line.vue | 62 + .../uview-ui/components/u-link/props.js | 39 + .../uview-ui/components/u-link/u-link.vue | 83 + .../uview-ui/components/u-list-item/props.js | 9 + .../components/u-list-item/u-list-item.vue | 116 + .../uview-ui/components/u-list/props.js | 76 + .../uview-ui/components/u-list/u-list.vue | 157 + .../components/u-loading-icon/props.js | 59 + .../u-loading-icon/u-loading-icon.vue | 343 + .../components/u-loading-page/props.js | 49 + .../u-loading-page/u-loading-page.vue | 115 + .../uview-ui/components/u-loadmore/props.js | 94 + .../components/u-loadmore/u-loadmore.vue | 150 + .../uview-ui/components/u-modal/props.js | 84 + .../uview-ui/components/u-modal/u-modal.vue | 227 + .../uview-ui/components/u-navbar/props.js | 91 + .../uview-ui/components/u-navbar/u-navbar.vue | 191 + .../uview-ui/components/u-no-network/props.js | 19 + .../components/u-no-network/u-no-network.vue | 220 + .../uview-ui/components/u-notice-bar/props.js | 70 + .../components/u-notice-bar/u-notice-bar.vue | 101 + .../uview-ui/components/u-notify/props.js | 49 + .../uview-ui/components/u-notify/u-notify.vue | 211 + .../uview-ui/components/u-number-box/props.js | 109 + .../components/u-number-box/u-number-box.vue | 416 + .../components/u-number-keyboard/props.js | 19 + .../u-number-keyboard/u-number-keyboard.vue | 196 + .../uview-ui/components/u-overlay/props.js | 24 + .../components/u-overlay/u-overlay.vue | 68 + .../uview-ui/components/u-parse/node/node.vue | 499 + .../uview-ui/components/u-parse/parser.js | 1075 ++ .../uview-ui/components/u-parse/props.js | 45 + .../uview-ui/components/u-parse/u-parse.vue | 366 + .../components/u-picker-column/props.js | 5 + .../u-picker-column/u-picker-column.vue | 27 + .../uview-ui/components/u-picker/props.js | 79 + .../uview-ui/components/u-picker/u-picker.vue | 283 + .../uview-ui/components/u-popup/props.js | 79 + .../uview-ui/components/u-popup/u-popup.vue | 304 + .../components/u-radio-group/props.js | 85 + .../u-radio-group/u-radio-group.vue | 108 + .../uview-ui/components/u-radio/props.js | 64 + .../uview-ui/components/u-radio/u-radio.vue | 339 + .../uview-ui/components/u-rate/props.js | 69 + .../uview-ui/components/u-rate/u-rate.vue | 306 + .../uview-ui/components/u-read-more/props.js | 61 + .../components/u-read-more/u-read-more.vue | 157 + .../uview-ui/components/u-row-notice/props.js | 39 + .../components/u-row-notice/u-row-notice.vue | 330 + .../uview-ui/components/u-row/props.js | 19 + .../uview-ui/components/u-row/u-row.vue | 93 + .../components/u-safe-bottom/props.js | 5 + .../u-safe-bottom/u-safe-bottom.vue | 56 + .../uview-ui/components/u-scroll-list/nvue.js | 28 + .../components/u-scroll-list/other.js | 0 .../components/u-scroll-list/props.js | 34 + .../components/u-scroll-list/scrollWxs.wxs | 50 + .../u-scroll-list/u-scroll-list.vue | 224 + .../uview-ui/components/u-search/props.js | 118 + .../uview-ui/components/u-search/u-search.vue | 303 + .../uview-ui/components/u-skeleton/props.js | 59 + .../components/u-skeleton/u-skeleton.vue | 244 + .../uview-ui/components/u-slider/mpother.js | 113 + .../uview-ui/components/u-slider/mpwxs.js | 42 + .../uview-ui/components/u-slider/mpwxs.wxs | 121 + .../components/u-slider/nvue - 副本.js | 180 + .../uview-ui/components/u-slider/nvue.js | 193 + .../uview-ui/components/u-slider/props.js | 54 + .../uview-ui/components/u-slider/u-slider.vue | 55 + .../uview-ui/components/u-status-bar/props.js | 8 + .../components/u-status-bar/u-status-bar.vue | 46 + .../uview-ui/components/u-steps-item/props.js | 24 + .../components/u-steps-item/u-steps-item.vue | 316 + .../uview-ui/components/u-steps/props.js | 39 + .../uview-ui/components/u-steps/u-steps.vue | 80 + .../uview-ui/components/u-sticky/props.js | 40 + .../uview-ui/components/u-sticky/u-sticky.vue | 212 + .../uview-ui/components/u-subsection/props.js | 49 + .../components/u-subsection/u-subsection.vue | 299 + .../u-swipe-action-item/index - backup.wxs | 256 + .../components/u-swipe-action-item/index.wxs | 225 + .../u-swipe-action-item/nvue - backup.js | 270 + .../components/u-swipe-action-item/nvue.js | 174 + .../components/u-swipe-action-item/props.js | 41 + .../u-swipe-action-item.vue | 190 + .../components/u-swipe-action-item/wxs.js | 15 + .../components/u-swipe-action/props.js | 9 + .../u-swipe-action/u-swipe-action.vue | 67 + .../components/u-swiper-indicator/props.js | 29 + .../u-swiper-indicator/u-swiper-indicator.vue | 110 + .../uview-ui/components/u-swiper/props.js | 125 + .../uview-ui/components/u-swiper/u-swiper.vue | 255 + .../uview-ui/components/u-switch/props.js | 54 + .../uview-ui/components/u-switch/u-switch.vue | 177 + .../components/u-tabbar-item/props.js | 39 + .../u-tabbar-item/u-tabbar-item.vue | 142 + .../uview-ui/components/u-tabbar/props.js | 44 + .../uview-ui/components/u-tabbar/u-tabbar.vue | 141 + .../uview-ui/components/u-table/props.js | 5 + .../uview-ui/components/u-table/u-table.vue | 29 + .../uview-ui/components/u-tabs-item/props.js | 5 + .../components/u-tabs-item/u-tabs-item.vue | 29 + .../uview-ui/components/u-tabs/props.js | 64 + .../uview-ui/components/u-tabs/u-tabs.vue | 354 + .../uview-ui/components/u-tag/props.js | 84 + .../uview-ui/components/u-tag/u-tag.vue | 358 + uni_modules/uview-ui/components/u-td/props.js | 5 + uni_modules/uview-ui/components/u-td/u-td.vue | 31 + .../uview-ui/components/u-text/props.js | 110 + .../uview-ui/components/u-text/u-text.vue | 223 + .../uview-ui/components/u-text/value.js | 85 + .../uview-ui/components/u-textarea/props.js | 119 + .../components/u-textarea/u-textarea.vue | 239 + .../uview-ui/components/u-toast/u-toast.vue | 291 + .../uview-ui/components/u-toolbar/props.js | 34 + .../components/u-toolbar/u-toolbar.vue | 102 + .../components/u-tooltip/clipboard.min.js | 58 + .../uview-ui/components/u-tooltip/props.js | 59 + .../components/u-tooltip/u-tooltip.vue | 365 + uni_modules/uview-ui/components/u-tr/props.js | 5 + uni_modules/uview-ui/components/u-tr/u-tr.vue | 31 + .../components/u-transition/nvue.ani-map.js | 68 + .../uview-ui/components/u-transition/props.js | 24 + .../components/u-transition/transition.js | 157 + .../components/u-transition/u-transition.vue | 92 + .../u-transition/vue.ani-style.scss | 113 + .../uview-ui/components/u-upload/mixin.js | 21 + .../uview-ui/components/u-upload/props.js | 124 + .../uview-ui/components/u-upload/u-upload.vue | 558 + .../uview-ui/components/u-upload/utils.js | 151 + .../uview-ui/components/uview-ui/uview-ui.vue | 15 + uni_modules/uview-ui/index.js | 79 + uni_modules/uview-ui/index.scss | 23 + uni_modules/uview-ui/libs/config/color.js | 17 + uni_modules/uview-ui/libs/config/config.js | 34 + uni_modules/uview-ui/libs/config/props.js | 190 + .../uview-ui/libs/config/props/actionSheet.js | 25 + .../uview-ui/libs/config/props/album.js | 25 + .../uview-ui/libs/config/props/alert.js | 22 + .../uview-ui/libs/config/props/avatar.js | 28 + .../uview-ui/libs/config/props/avatarGroup.js | 23 + .../uview-ui/libs/config/props/backtop.js | 27 + .../uview-ui/libs/config/props/badge.js | 27 + .../uview-ui/libs/config/props/button.js | 42 + .../uview-ui/libs/config/props/calendar.js | 42 + .../uview-ui/libs/config/props/carKeyboard.js | 15 + .../uview-ui/libs/config/props/cell.js | 35 + .../uview-ui/libs/config/props/cellGroup.js | 17 + .../uview-ui/libs/config/props/checkbox.js | 27 + .../libs/config/props/checkboxGroup.js | 29 + .../libs/config/props/circleProgress.js | 15 + .../uview-ui/libs/config/props/code.js | 21 + .../uview-ui/libs/config/props/codeInput.js | 29 + uni_modules/uview-ui/libs/config/props/col.js | 19 + .../uview-ui/libs/config/props/collapse.js | 17 + .../libs/config/props/collapseItem.js | 25 + .../libs/config/props/columnNotice.js | 24 + .../uview-ui/libs/config/props/countDown.js | 18 + .../uview-ui/libs/config/props/countTo.js | 25 + .../libs/config/props/datetimePicker.js | 36 + .../uview-ui/libs/config/props/divider.js | 23 + .../uview-ui/libs/config/props/empty.js | 26 + .../uview-ui/libs/config/props/form.js | 22 + .../uview-ui/libs/config/props/formItem.js | 23 + uni_modules/uview-ui/libs/config/props/gap.js | 19 + .../uview-ui/libs/config/props/grid.js | 17 + .../uview-ui/libs/config/props/gridItem.js | 16 + .../uview-ui/libs/config/props/icon.js | 36 + .../uview-ui/libs/config/props/image.js | 30 + .../uview-ui/libs/config/props/indexAnchor.js | 19 + .../uview-ui/libs/config/props/indexList.js | 19 + .../uview-ui/libs/config/props/input.js | 48 + .../uview-ui/libs/config/props/keyboard.js | 30 + .../uview-ui/libs/config/props/line.js | 20 + .../libs/config/props/lineProgress.js | 19 + .../uview-ui/libs/config/props/link.js | 26 + .../uview-ui/libs/config/props/list.js | 28 + .../uview-ui/libs/config/props/listItem.js | 15 + .../uview-ui/libs/config/props/loadingIcon.js | 30 + .../uview-ui/libs/config/props/loadingPage.js | 23 + .../uview-ui/libs/config/props/loadmore.js | 32 + .../uview-ui/libs/config/props/modal.js | 30 + .../uview-ui/libs/config/props/navbar.js | 32 + .../uview-ui/libs/config/props/noNetwork.js | 18 + .../uview-ui/libs/config/props/noticeBar.js | 27 + .../uview-ui/libs/config/props/notify.js | 22 + .../uview-ui/libs/config/props/numberBox.js | 35 + .../libs/config/props/numberKeyboard.js | 17 + .../uview-ui/libs/config/props/overlay.js | 18 + .../uview-ui/libs/config/props/parse.js | 22 + .../uview-ui/libs/config/props/picker.js | 29 + .../uview-ui/libs/config/props/popup.js | 29 + .../uview-ui/libs/config/props/radio.js | 27 + .../uview-ui/libs/config/props/radioGroup.js | 30 + .../uview-ui/libs/config/props/rate.js | 26 + .../uview-ui/libs/config/props/readMore.js | 22 + uni_modules/uview-ui/libs/config/props/row.js | 17 + .../uview-ui/libs/config/props/rowNotice.js | 21 + .../uview-ui/libs/config/props/scrollList.js | 20 + .../uview-ui/libs/config/props/search.js | 37 + .../uview-ui/libs/config/props/section.js | 24 + .../uview-ui/libs/config/props/skeleton.js | 25 + .../uview-ui/libs/config/props/slider.js | 25 + .../uview-ui/libs/config/props/statusBar.js | 15 + .../uview-ui/libs/config/props/steps.js | 21 + .../uview-ui/libs/config/props/stepsItem.js | 18 + .../uview-ui/libs/config/props/sticky.js | 20 + .../uview-ui/libs/config/props/subsection.js | 23 + .../uview-ui/libs/config/props/swipeAction.js | 15 + .../libs/config/props/swipeActionItem.js | 21 + .../uview-ui/libs/config/props/swiper.js | 39 + .../libs/config/props/swipterIndicator.js | 19 + .../uview-ui/libs/config/props/switch.js | 24 + .../uview-ui/libs/config/props/tabbar.js | 22 + .../uview-ui/libs/config/props/tabbarItem.js | 20 + .../uview-ui/libs/config/props/tabs.js | 32 + uni_modules/uview-ui/libs/config/props/tag.js | 29 + .../uview-ui/libs/config/props/text.js | 38 + .../uview-ui/libs/config/props/textarea.js | 36 + .../uview-ui/libs/config/props/toast.js | 30 + .../uview-ui/libs/config/props/toolbar.js | 21 + .../uview-ui/libs/config/props/tooltip.js | 25 + .../uview-ui/libs/config/props/transition.js | 18 + .../uview-ui/libs/config/props/upload.js | 36 + uni_modules/uview-ui/libs/config/zIndex.js | 20 + uni_modules/uview-ui/libs/css/color.scss | 155 + uni_modules/uview-ui/libs/css/common.scss | 97 + uni_modules/uview-ui/libs/css/components.scss | 15 + uni_modules/uview-ui/libs/css/flex.scss | 257 + uni_modules/uview-ui/libs/css/h5.scss | 0 uni_modules/uview-ui/libs/css/mixin.scss | 8 + uni_modules/uview-ui/libs/css/mp.scss | 0 uni_modules/uview-ui/libs/css/nvue.scss | 0 uni_modules/uview-ui/libs/css/vue.scss | 27 + .../uview-ui/libs/function/colorGradient.js | 134 + .../uview-ui/libs/function/debounce.js | 29 + uni_modules/uview-ui/libs/function/digit.js | 167 + uni_modules/uview-ui/libs/function/index.js | 705 + .../uview-ui/libs/function/platform.js | 75 + uni_modules/uview-ui/libs/function/test.js | 288 + .../uview-ui/libs/function/throttle.js | 30 + .../libs/luch-request/adapters/index.js | 97 + .../luch-request/core/InterceptorManager.js | 50 + .../libs/luch-request/core/Request.js | 198 + .../libs/luch-request/core/buildFullPath.js | 20 + .../libs/luch-request/core/defaults.js | 29 + .../libs/luch-request/core/dispatchRequest.js | 3 + .../libs/luch-request/core/mergeConfig.js | 103 + .../uview-ui/libs/luch-request/core/settle.js | 16 + .../libs/luch-request/helpers/buildURL.js | 69 + .../libs/luch-request/helpers/combineURLs.js | 14 + .../luch-request/helpers/isAbsoluteURL.js | 14 + .../uview-ui/libs/luch-request/index.d.ts | 116 + .../uview-ui/libs/luch-request/index.js | 3 + .../uview-ui/libs/luch-request/utils.js | 131 + .../uview-ui/libs/luch-request/utils/clone.js | 264 + uni_modules/uview-ui/libs/mixin/button.js | 13 + uni_modules/uview-ui/libs/mixin/mixin.js | 160 + uni_modules/uview-ui/libs/mixin/mpMixin.js | 8 + uni_modules/uview-ui/libs/mixin/mpShare.js | 13 + uni_modules/uview-ui/libs/mixin/openType.js | 25 + uni_modules/uview-ui/libs/mixin/style.js | 228 + uni_modules/uview-ui/libs/mixin/touch.js | 59 + .../uview-ui/libs/util/async-validator.js | 1343 ++ uni_modules/uview-ui/libs/util/calendar.js | 546 + uni_modules/uview-ui/libs/util/dayjs.js | 308 + uni_modules/uview-ui/libs/util/emitter.js | 51 + uni_modules/uview-ui/libs/util/route.js | 124 + uni_modules/uview-ui/package.json | 84 + uni_modules/uview-ui/theme.scss | 44 + utils/bc.js | 115 + utils/common.js | 23 + utils/dialog.js | 92 + utils/index.js | 1115 ++ utils/mapConfig.js | 7 + utils/querystring.js | 63 + utils/request.js | 112 + utils/store/cookie.js | 62 + utils/store/index.js | 7 + utils/store/localStorage.js | 42 + utils/validate.js | 177 + utils/vue-jsonp.umd.js | 187 + v4/components/@lucky-canvas/uni/LICENSE | 201 + v4/components/@lucky-canvas/uni/README.md | 138 + .../@lucky-canvas/uni/lucky-grid.vue | 317 + .../@lucky-canvas/uni/lucky-wheel.vue | 255 + v4/components/@lucky-canvas/uni/package.json | 53 + .../@lucky-canvas/uni/slot-machine.vue | 214 + v4/components/@lucky-canvas/uni/utils.js | 82 + v4/components/lucky-canvas/LICENSE | 201 + v4/components/lucky-canvas/README.md | 42 + v4/components/lucky-canvas/index.js | 1 + v4/components/lucky-canvas/package.json | 96 + v4/components/lucky-canvas/types/index.d.ts | 761 + v4/components/select-city.vue | 213 + v4/views/attract/attract.vue | 360 + v4/views/attract/project.vue | 129 + v4/views/attract/projectList.vue | 166 + v4/views/live/live.vue | 104 + v4/views/luck/logs.vue | 117 + v4/views/luck/luck.vue | 379 + v4/views/luck/receive.vue | 159 + v4/views/offer/offer.vue | 249 + v4/views/preSale/preSale.vue | 178 + v4/views/seckill/seckill.vue | 349 + v4/views/shop/detail.vue | 241 + v4/views/shop/shop.vue | 129 + v4/views/specialty/specialty.vue | 265 + v4/views/trial/trial.vue | 146 + wenwan/views/goodsClass.vue | 476 + wenwan/views/store.vue | 1075 ++ wenwan/views/storeList.vue | 216 + 710 files changed, 125705 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 api/activity.js create mode 100644 api/admin.js create mode 100644 api/goods.js create mode 100644 api/inn.js create mode 100644 api/join.js create mode 100644 api/luck.js create mode 100644 api/order.js create mode 100644 api/product.js create mode 100644 api/public.js create mode 100644 api/shop.js create mode 100644 api/store.js create mode 100644 api/user.js create mode 100644 api/wenwan.js create mode 100644 assets/css/base.less create mode 100644 assets/css/goods.less create mode 100644 assets/css/pkg_join.less create mode 100644 assets/css/product.less create mode 100644 assets/css/reset.less create mode 100644 assets/css/store.less create mode 100644 assets/css/style.less create mode 100644 assets/iconfont/iconfont.css create mode 100644 assets/script/global.js create mode 100644 components/AddressWindow.vue create mode 100644 components/CitySelect.vue create mode 100644 components/CountDown.vue create mode 100644 components/CouponListWindow.vue create mode 100644 components/CouponPop.vue create mode 100644 components/CouponWindow.vue create mode 100644 components/DataFormat.vue create mode 100644 components/DataFormatT.vue create mode 100644 components/GoodList.vue create mode 100644 components/Loading.vue create mode 100644 components/OrderGoods.vue create mode 100644 components/Payment.vue create mode 100644 components/PriceChange.vue create mode 100644 components/ProductConSwiper.vue create mode 100644 components/ProductWindow.vue create mode 100644 components/PromotionGood.vue create mode 100644 components/Recommend.vue create mode 100644 components/ShareInfo.vue create mode 100644 components/StorePoster.vue create mode 100644 components/UserEvaluation.vue create mode 100644 components/WriteOff.vue create mode 100644 components/blPaymentPasswordInput.vue create mode 100644 components/chose-city/chose-city.vue create mode 100644 components/drag-button/drag-button.vue create mode 100644 components/drop-down/drop-down.vue create mode 100644 components/easy-upload/easy-upload.vue create mode 100644 components/easy-upload/readme.md create mode 100644 components/hx-navbar/README.md create mode 100644 components/hx-navbar/hx-navbar.vue create mode 100644 components/imageTypeSet/imagebox.vue create mode 100644 components/ls-swiper/index.md create mode 100644 components/ls-swiper/index.vue create mode 100644 components/maramlee-waterfalls-flow/maramlee-waterfalls-flow.vue create mode 100644 components/mescroll-uni/components/mescroll-down.css create mode 100644 components/mescroll-uni/components/mescroll-down.vue create mode 100644 components/mescroll-uni/components/mescroll-empty.vue create mode 100644 components/mescroll-uni/components/mescroll-top.vue create mode 100644 components/mescroll-uni/components/mescroll-up.css create mode 100644 components/mescroll-uni/components/mescroll-up.vue create mode 100644 components/mescroll-uni/mescroll-body.css create mode 100644 components/mescroll-uni/mescroll-body.vue create mode 100644 components/mescroll-uni/mescroll-mixins.js create mode 100644 components/mescroll-uni/mescroll-uni-option.js create mode 100644 components/mescroll-uni/mescroll-uni.css create mode 100644 components/mescroll-uni/mescroll-uni.js create mode 100644 components/mescroll-uni/mescroll-uni.vue create mode 100644 components/mescroll-uni/mixins/mescroll-comp.js create mode 100644 components/mescroll-uni/mixins/mescroll-more-item.js create mode 100644 components/mescroll-uni/mixins/mescroll-more.js create mode 100644 components/simple-address/city-data/area.js create mode 100644 components/simple-address/city-data/city.js create mode 100644 components/simple-address/city-data/province.js create mode 100644 components/simple-address/simple-address.nvue create mode 100644 components/uni-popup/message.js create mode 100644 components/uni-popup/popup.js create mode 100644 components/uni-popup/uni-popup-dialog.vue create mode 100644 components/uni-popup/uni-popup-message.vue create mode 100644 components/uni-popup/uni-popup-share.vue create mode 100644 components/uni-popup/uni-popup.vue create mode 100644 components/uni-segmented-control/uni-segmented-control.vue create mode 100644 components/uni-transition/uni-transition.vue create mode 100644 components/v-tabs/readme.md create mode 100644 components/v-tabs/v-tabs.vue create mode 100644 components/yzc-paykeyboard/yzc-paykeyboard.vue create mode 100644 config/index.js create mode 100644 libs/chat.js create mode 100644 libs/order.js create mode 100644 libs/wechat.js create mode 100644 main.js create mode 100644 manifest.json create mode 100644 mixins/SendVerifyCode.js create mode 100644 mixins/mescroll-mixins.js create mode 100644 mixins/share-mixins.js create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/LiveAndShortVideo/LiveAndShortVideo.vue create mode 100644 pages/LiveBroadcastList/LiveBroadcastList.vue create mode 100644 pages/Loading/index.vue create mode 100644 pages/NotDefined/index.vue create mode 100644 pages/VideoPlayBackList/VideoPlayBackDetail.vue create mode 100644 pages/VideoPlayBackList/VideoPlayBackList.vue create mode 100644 pages/activity/BargainRecord/index.vue create mode 100644 pages/activity/DargainDetails/index.vue create mode 100644 pages/activity/GoodsBargain/index.vue create mode 100644 pages/activity/GoodsGroup/index.vue create mode 100644 pages/activity/GoodsSeckill/index.vue create mode 100644 pages/activity/GroupDetails/index.vue create mode 100644 pages/activity/GroupRule/index.vue create mode 100644 pages/activity/Poster/index.vue create mode 100644 pages/activity/SeckillDetails/index.vue create mode 100644 pages/authorization/index.vue create mode 100644 pages/authorization/index_bak.vue create mode 100644 pages/authorization/pass.vue create mode 100644 pages/cloud/cloud.vue create mode 100644 pages/cloud/haveFun.vue create mode 100644 pages/foodInfomation/foodInfomation.vue create mode 100644 pages/foodInfomation/foodInfomationDetail.vue create mode 100644 pages/foodInfomation/information.vue create mode 100644 pages/home/index.vue create mode 100644 pages/map/index.vue create mode 100644 pages/order/GoodsReturn/index.vue create mode 100644 pages/order/Logistics/index.vue create mode 100644 pages/order/MyOrder/index.vue create mode 100644 pages/order/OrderDetails/index.vue create mode 100644 pages/order/OrderSubmission/index.vue create mode 100644 pages/order/PaymentStatus/index.vue create mode 100644 pages/order/ReturnList/index.vue create mode 100644 pages/orderAdmin/AdminOrder/index.vue create mode 100644 pages/orderAdmin/AdminOrderList/index.vue create mode 100644 pages/orderAdmin/GoodsDeliver/index.vue create mode 100644 pages/orderAdmin/OrderCancellation/index.vue create mode 100644 pages/orderAdmin/OrderIndex/index.vue create mode 100644 pages/orderAdmin/Statistics/index.vue create mode 100644 pages/shop/EvaluateList/index.vue create mode 100644 pages/shop/GoodSearch/index.vue create mode 100644 pages/shop/GoodsClass/index.vue create mode 100644 pages/shop/GoodsCollection/index.vue create mode 100644 pages/shop/GoodsCon/index.vue create mode 100644 pages/shop/GoodsEvaluate/index.vue create mode 100644 pages/shop/GoodsList/index.vue create mode 100644 pages/shop/GoodsPromotion/index.vue create mode 100644 pages/shop/HotNewGoods/index.vue create mode 100644 pages/shop/ShoppingCart/index.vue create mode 100644 pages/shop/StoreList/index.vue create mode 100644 pages/user/CustomerList/index.vue create mode 100644 pages/user/Login/index.vue create mode 100644 pages/user/MemberUpgradeIntro/MemberUpgradeIntro.vue create mode 100644 pages/user/Message/Message.vue create mode 100644 pages/user/MessageDetail/MessageDetail.vue create mode 100644 pages/user/ModifyPayPassword/ModifyPayPassword.vue create mode 100644 pages/user/Recharge/index.vue create mode 100644 pages/user/RetrievePassword/index.vue create mode 100644 pages/user/UpgradeElectronicProtocol/UpgradeElectronicProtocol.vue create mode 100644 pages/user/UpgradeProtocolDetail/UpgradeProtocolDetail.vue create mode 100644 pages/user/User/index.vue create mode 100644 pages/user/UserAccount/index.vue create mode 100644 pages/user/UserBill/index.vue create mode 100644 pages/user/UserFavorite/UserFavorite.vue create mode 100644 pages/user/UserVip/index.vue create mode 100644 pages/user/address/AddAddress/index.vue create mode 100644 pages/user/address/AddressManagement/index.vue create mode 100644 pages/user/coupon/GetCoupon/index.vue create mode 100644 pages/user/coupon/UserCoupon/index.vue create mode 100644 pages/user/promotion/CashAudit/index.vue create mode 100644 pages/user/promotion/CashRecord/index.vue create mode 100644 pages/user/promotion/CommissionDetails/index.vue create mode 100644 pages/user/promotion/Poster/index.vue create mode 100644 pages/user/promotion/PromoterList/index.vue create mode 100644 pages/user/promotion/PromoterOrder/index.vue create mode 100644 pages/user/promotion/UserCash/index.vue create mode 100644 pages/user/promotion/UserPromotion/index.vue create mode 100644 pages/user/signIn/Integral/index.vue create mode 100644 pages/user/signIn/Sign/index.vue create mode 100644 pages/user/signIn/SignRecord/index.vue create mode 100644 pagesInn/components/tm-upload/tm-upload.vue create mode 100644 pagesInn/inn/innApply.vue create mode 100644 pagesInn/inn/innHome.vue create mode 100644 pagesInn/inn/innInfoDetail.vue create mode 100644 pagesInn/inn/innInfoPublish.vue create mode 100644 pagesInn/inn/innPartnerAgreement.vue create mode 100644 pagesInn/inn/innProfileEdit.vue create mode 100644 pkg_common/views/pdf.vue create mode 100644 pkg_common/views/room.vue create mode 100644 pkg_common/views/roomLogs.vue create mode 100644 pkg_discard/components/Footer.vue create mode 100644 pkg_discard/components/Home.vue create mode 100644 pkg_discard/components/Mask.vue create mode 100644 pkg_discard/components/SwitchWindow.vue create mode 100644 pkg_discard/views/launch/index.vue create mode 100644 pkg_join/views/index.vue create mode 100644 pkg_join/views/shop.vue create mode 100644 pkg_join/views/supplier.vue create mode 100644 pkg_orders/views/refund.vue create mode 100644 pkg_product/components/CountDownUnit.vue create mode 100644 pkg_product/views/famousHot.vue create mode 100644 pkg_product/views/famousList.vue create mode 100644 pkg_product/views/famousStory.vue create mode 100644 pkg_product/views/findJoy.vue create mode 100644 pkg_product/views/giftList.vue create mode 100644 pkg_product/views/healthList.vue create mode 100644 pkg_product/views/nativeList.vue create mode 100644 pkg_product/views/nativeList_bak.vue create mode 100644 pkg_product/views/scenicSpot.vue create mode 100644 pkg_product/views/seckill.vue create mode 100644 pkg_product/views/sharpList.vue create mode 100644 pkg_user/components/invinbg-image-cropper/invinbg-image-cropper.vue create mode 100644 pkg_user/views/addBankCard.vue create mode 100644 pkg_user/views/bankCardList.vue create mode 100644 pkg_user/views/bindPhone.vue create mode 100644 pkg_user/views/payPassword.vue create mode 100644 pkg_user/views/personalData.vue create mode 100644 pkg_user/views/withdrawal.vue create mode 100644 static/images/down.png create mode 100644 static/images/enter.png create mode 100644 static/images/horn.png create mode 100644 static/images/img_nodata.png create mode 100644 static/images/num_minus_icon.png create mode 100644 static/images/num_plus_icon.png create mode 100644 static/images/orderdetail-finish-icon.png create mode 100644 static/images/orderdetail-waitdelivery-icon.png create mode 100644 static/images/orderdetail-waitpay-icon.png create mode 100644 static/images/orderdetail-waitreceive.png create mode 100644 static/images/poster-close.png create mode 100644 static/images/start.png create mode 100644 static/images/up.png create mode 100644 static/images/v6/btn_active_left.png create mode 100644 static/images/v6/btn_active_right.png create mode 100644 static/images/v6/btn_left.png create mode 100644 static/images/v6/btn_right.png create mode 100644 static/images/waitcomment-order-icon.png create mode 100644 static/images/waitdelivery-order-icon.png create mode 100644 static/images/waitpay-order-icon.png create mode 100644 static/images/waitreceive-order-icon.png create mode 100644 static/tabbar/icon-cart-hot.png create mode 100644 static/tabbar/icon-cart.png create mode 100644 static/tabbar/icon-class-hot.png create mode 100644 static/tabbar/icon-class.png create mode 100644 static/tabbar/icon-cloud-hot.png create mode 100644 static/tabbar/icon-cloud.png create mode 100644 static/tabbar/icon-home-hot.png create mode 100644 static/tabbar/icon-home.png create mode 100644 static/tabbar/icon-user-hot.png create mode 100644 static/tabbar/icon-user.png create mode 100644 store/index.js create mode 100644 store/modules/switchCity.js create mode 100644 store/mutation-types.js create mode 100644 uni.scss create mode 100644 uni_modules/custom-waterfalls-flow/changelog.md create mode 100644 uni_modules/custom-waterfalls-flow/components/custom-waterfalls-flow/custom-waterfalls-flow.vue create mode 100644 uni_modules/custom-waterfalls-flow/package.json create mode 100644 uni_modules/custom-waterfalls-flow/readme.md create mode 100644 uni_modules/d-swiper-type/changelog.md create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/d-swiper-type.vue create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/home/hometype.vue create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/home/readme.md create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/bing.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/del.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/del2.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/mangguo.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/search.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/xigua.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/yan_close.png create mode 100644 uni_modules/d-swiper-type/components/d-swiper-type/pages/static/icon_img/yan_open.png create mode 100644 uni_modules/d-swiper-type/package.json create mode 100644 uni_modules/d-swiper-type/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uni-search-bar/changelog.md create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue create mode 100644 uni_modules/uni-search-bar/package.json create mode 100644 uni_modules/uni-search-bar/readme.md create mode 100644 uni_modules/uview-ui/LICENSE create mode 100644 uni_modules/uview-ui/README.md create mode 100644 uni_modules/uview-ui/changelog.md create mode 100644 uni_modules/uview-ui/components/u--form/u--form.vue create mode 100644 uni_modules/uview-ui/components/u--image/u--image.vue create mode 100644 uni_modules/uview-ui/components/u--input/u--input.vue create mode 100644 uni_modules/uview-ui/components/u--text/u--text.vue create mode 100644 uni_modules/uview-ui/components/u--textarea/u--textarea.vue create mode 100644 uni_modules/uview-ui/components/u-action-sheet/props.js create mode 100644 uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue create mode 100644 uni_modules/uview-ui/components/u-album/props.js create mode 100644 uni_modules/uview-ui/components/u-album/u-album.vue create mode 100644 uni_modules/uview-ui/components/u-alert/props.js create mode 100644 uni_modules/uview-ui/components/u-alert/u-alert.vue create mode 100644 uni_modules/uview-ui/components/u-avatar-group/props.js create mode 100644 uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue create mode 100644 uni_modules/uview-ui/components/u-avatar/props.js create mode 100644 uni_modules/uview-ui/components/u-avatar/u-avatar.vue create mode 100644 uni_modules/uview-ui/components/u-back-top/props.js create mode 100644 uni_modules/uview-ui/components/u-back-top/u-back-top.vue create mode 100644 uni_modules/uview-ui/components/u-badge/props.js create mode 100644 uni_modules/uview-ui/components/u-badge/u-badge.vue create mode 100644 uni_modules/uview-ui/components/u-button/nvue.scss create mode 100644 uni_modules/uview-ui/components/u-button/props.js create mode 100644 uni_modules/uview-ui/components/u-button/u-button.vue create mode 100644 uni_modules/uview-ui/components/u-button/vue.scss create mode 100644 uni_modules/uview-ui/components/u-calendar/header.vue create mode 100644 uni_modules/uview-ui/components/u-calendar/month.vue create mode 100644 uni_modules/uview-ui/components/u-calendar/props.js create mode 100644 uni_modules/uview-ui/components/u-calendar/u-calendar.vue create mode 100644 uni_modules/uview-ui/components/u-calendar/util.js create mode 100644 uni_modules/uview-ui/components/u-car-keyboard/props.js create mode 100644 uni_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue create mode 100644 uni_modules/uview-ui/components/u-cell-group/props.js create mode 100644 uni_modules/uview-ui/components/u-cell-group/u-cell-group.vue create mode 100644 uni_modules/uview-ui/components/u-cell/props.js create mode 100644 uni_modules/uview-ui/components/u-cell/u-cell.vue create mode 100644 uni_modules/uview-ui/components/u-checkbox-group/props.js create mode 100644 uni_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue create mode 100644 uni_modules/uview-ui/components/u-checkbox/props.js create mode 100644 uni_modules/uview-ui/components/u-checkbox/u-checkbox.vue create mode 100644 uni_modules/uview-ui/components/u-circle-progress/props.js create mode 100644 uni_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue create mode 100644 uni_modules/uview-ui/components/u-code-input/props.js create mode 100644 uni_modules/uview-ui/components/u-code-input/u-code-input.vue create mode 100644 uni_modules/uview-ui/components/u-code/props.js create mode 100644 uni_modules/uview-ui/components/u-code/u-code.vue create mode 100644 uni_modules/uview-ui/components/u-col/props.js create mode 100644 uni_modules/uview-ui/components/u-col/u-col.vue create mode 100644 uni_modules/uview-ui/components/u-collapse-item/props.js create mode 100644 uni_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue create mode 100644 uni_modules/uview-ui/components/u-collapse/props.js create mode 100644 uni_modules/uview-ui/components/u-collapse/u-collapse.vue create mode 100644 uni_modules/uview-ui/components/u-column-notice/props.js create mode 100644 uni_modules/uview-ui/components/u-column-notice/u-column-notice.vue create mode 100644 uni_modules/uview-ui/components/u-count-down/props.js create mode 100644 uni_modules/uview-ui/components/u-count-down/u-count-down.vue create mode 100644 uni_modules/uview-ui/components/u-count-down/utils.js create mode 100644 uni_modules/uview-ui/components/u-count-to/props.js create mode 100644 uni_modules/uview-ui/components/u-count-to/u-count-to.vue create mode 100644 uni_modules/uview-ui/components/u-datetime-picker/props.js create mode 100644 uni_modules/uview-ui/components/u-datetime-picker/u-datetime-picker.vue create mode 100644 uni_modules/uview-ui/components/u-divider/props.js create mode 100644 uni_modules/uview-ui/components/u-divider/u-divider.vue create mode 100644 uni_modules/uview-ui/components/u-dropdown-item/props.js create mode 100644 uni_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue create mode 100644 uni_modules/uview-ui/components/u-dropdown/props.js create mode 100644 uni_modules/uview-ui/components/u-dropdown/u-dropdown.vue create mode 100644 uni_modules/uview-ui/components/u-empty/props.js create mode 100644 uni_modules/uview-ui/components/u-empty/u-empty.vue create mode 100644 uni_modules/uview-ui/components/u-form-item/props.js create mode 100644 uni_modules/uview-ui/components/u-form-item/u-form-item.vue create mode 100644 uni_modules/uview-ui/components/u-form/props.js create mode 100644 uni_modules/uview-ui/components/u-form/u-form.vue create mode 100644 uni_modules/uview-ui/components/u-gap/props.js create mode 100644 uni_modules/uview-ui/components/u-gap/u-gap.vue create mode 100644 uni_modules/uview-ui/components/u-grid-item/props.js create mode 100644 uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue create mode 100644 uni_modules/uview-ui/components/u-grid/props.js create mode 100644 uni_modules/uview-ui/components/u-grid/u-grid.vue create mode 100644 uni_modules/uview-ui/components/u-icon/icons.js create mode 100644 uni_modules/uview-ui/components/u-icon/props.js create mode 100644 uni_modules/uview-ui/components/u-icon/u-icon.vue create mode 100644 uni_modules/uview-ui/components/u-image/props.js create mode 100644 uni_modules/uview-ui/components/u-image/u-image.vue create mode 100644 uni_modules/uview-ui/components/u-index-anchor/props.js create mode 100644 uni_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue create mode 100644 uni_modules/uview-ui/components/u-index-item/props.js create mode 100644 uni_modules/uview-ui/components/u-index-item/u-index-item.vue create mode 100644 uni_modules/uview-ui/components/u-index-list/props.js create mode 100644 uni_modules/uview-ui/components/u-index-list/u-index-list.vue create mode 100644 uni_modules/uview-ui/components/u-input/props.js create mode 100644 uni_modules/uview-ui/components/u-input/u-input.vue create mode 100644 uni_modules/uview-ui/components/u-keyboard/props.js create mode 100644 uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue create mode 100644 uni_modules/uview-ui/components/u-line-progress/props.js create mode 100644 uni_modules/uview-ui/components/u-line-progress/u-line-progress.vue create mode 100644 uni_modules/uview-ui/components/u-line/props.js create mode 100644 uni_modules/uview-ui/components/u-line/u-line.vue create mode 100644 uni_modules/uview-ui/components/u-link/props.js create mode 100644 uni_modules/uview-ui/components/u-link/u-link.vue create mode 100644 uni_modules/uview-ui/components/u-list-item/props.js create mode 100644 uni_modules/uview-ui/components/u-list-item/u-list-item.vue create mode 100644 uni_modules/uview-ui/components/u-list/props.js create mode 100644 uni_modules/uview-ui/components/u-list/u-list.vue create mode 100644 uni_modules/uview-ui/components/u-loading-icon/props.js create mode 100644 uni_modules/uview-ui/components/u-loading-icon/u-loading-icon.vue create mode 100644 uni_modules/uview-ui/components/u-loading-page/props.js create mode 100644 uni_modules/uview-ui/components/u-loading-page/u-loading-page.vue create mode 100644 uni_modules/uview-ui/components/u-loadmore/props.js create mode 100644 uni_modules/uview-ui/components/u-loadmore/u-loadmore.vue create mode 100644 uni_modules/uview-ui/components/u-modal/props.js create mode 100644 uni_modules/uview-ui/components/u-modal/u-modal.vue create mode 100644 uni_modules/uview-ui/components/u-navbar/props.js create mode 100644 uni_modules/uview-ui/components/u-navbar/u-navbar.vue create mode 100644 uni_modules/uview-ui/components/u-no-network/props.js create mode 100644 uni_modules/uview-ui/components/u-no-network/u-no-network.vue create mode 100644 uni_modules/uview-ui/components/u-notice-bar/props.js create mode 100644 uni_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue create mode 100644 uni_modules/uview-ui/components/u-notify/props.js create mode 100644 uni_modules/uview-ui/components/u-notify/u-notify.vue create mode 100644 uni_modules/uview-ui/components/u-number-box/props.js create mode 100644 uni_modules/uview-ui/components/u-number-box/u-number-box.vue create mode 100644 uni_modules/uview-ui/components/u-number-keyboard/props.js create mode 100644 uni_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue create mode 100644 uni_modules/uview-ui/components/u-overlay/props.js create mode 100644 uni_modules/uview-ui/components/u-overlay/u-overlay.vue create mode 100644 uni_modules/uview-ui/components/u-parse/node/node.vue create mode 100644 uni_modules/uview-ui/components/u-parse/parser.js create mode 100644 uni_modules/uview-ui/components/u-parse/props.js create mode 100644 uni_modules/uview-ui/components/u-parse/u-parse.vue create mode 100644 uni_modules/uview-ui/components/u-picker-column/props.js create mode 100644 uni_modules/uview-ui/components/u-picker-column/u-picker-column.vue create mode 100644 uni_modules/uview-ui/components/u-picker/props.js create mode 100644 uni_modules/uview-ui/components/u-picker/u-picker.vue create mode 100644 uni_modules/uview-ui/components/u-popup/props.js create mode 100644 uni_modules/uview-ui/components/u-popup/u-popup.vue create mode 100644 uni_modules/uview-ui/components/u-radio-group/props.js create mode 100644 uni_modules/uview-ui/components/u-radio-group/u-radio-group.vue create mode 100644 uni_modules/uview-ui/components/u-radio/props.js create mode 100644 uni_modules/uview-ui/components/u-radio/u-radio.vue create mode 100644 uni_modules/uview-ui/components/u-rate/props.js create mode 100644 uni_modules/uview-ui/components/u-rate/u-rate.vue create mode 100644 uni_modules/uview-ui/components/u-read-more/props.js create mode 100644 uni_modules/uview-ui/components/u-read-more/u-read-more.vue create mode 100644 uni_modules/uview-ui/components/u-row-notice/props.js create mode 100644 uni_modules/uview-ui/components/u-row-notice/u-row-notice.vue create mode 100644 uni_modules/uview-ui/components/u-row/props.js create mode 100644 uni_modules/uview-ui/components/u-row/u-row.vue create mode 100644 uni_modules/uview-ui/components/u-safe-bottom/props.js create mode 100644 uni_modules/uview-ui/components/u-safe-bottom/u-safe-bottom.vue create mode 100644 uni_modules/uview-ui/components/u-scroll-list/nvue.js create mode 100644 uni_modules/uview-ui/components/u-scroll-list/other.js create mode 100644 uni_modules/uview-ui/components/u-scroll-list/props.js create mode 100644 uni_modules/uview-ui/components/u-scroll-list/scrollWxs.wxs create mode 100644 uni_modules/uview-ui/components/u-scroll-list/u-scroll-list.vue create mode 100644 uni_modules/uview-ui/components/u-search/props.js create mode 100644 uni_modules/uview-ui/components/u-search/u-search.vue create mode 100644 uni_modules/uview-ui/components/u-skeleton/props.js create mode 100644 uni_modules/uview-ui/components/u-skeleton/u-skeleton.vue create mode 100644 uni_modules/uview-ui/components/u-slider/mpother.js create mode 100644 uni_modules/uview-ui/components/u-slider/mpwxs.js create mode 100644 uni_modules/uview-ui/components/u-slider/mpwxs.wxs create mode 100644 uni_modules/uview-ui/components/u-slider/nvue - 副本.js create mode 100644 uni_modules/uview-ui/components/u-slider/nvue.js create mode 100644 uni_modules/uview-ui/components/u-slider/props.js create mode 100644 uni_modules/uview-ui/components/u-slider/u-slider.vue create mode 100644 uni_modules/uview-ui/components/u-status-bar/props.js create mode 100644 uni_modules/uview-ui/components/u-status-bar/u-status-bar.vue create mode 100644 uni_modules/uview-ui/components/u-steps-item/props.js create mode 100644 uni_modules/uview-ui/components/u-steps-item/u-steps-item.vue create mode 100644 uni_modules/uview-ui/components/u-steps/props.js create mode 100644 uni_modules/uview-ui/components/u-steps/u-steps.vue create mode 100644 uni_modules/uview-ui/components/u-sticky/props.js create mode 100644 uni_modules/uview-ui/components/u-sticky/u-sticky.vue create mode 100644 uni_modules/uview-ui/components/u-subsection/props.js create mode 100644 uni_modules/uview-ui/components/u-subsection/u-subsection.vue create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/index - backup.wxs create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/index.wxs create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/nvue - backup.js create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/nvue.js create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/props.js create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue create mode 100644 uni_modules/uview-ui/components/u-swipe-action-item/wxs.js create mode 100644 uni_modules/uview-ui/components/u-swipe-action/props.js create mode 100644 uni_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue create mode 100644 uni_modules/uview-ui/components/u-swiper-indicator/props.js create mode 100644 uni_modules/uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue create mode 100644 uni_modules/uview-ui/components/u-swiper/props.js create mode 100644 uni_modules/uview-ui/components/u-swiper/u-swiper.vue create mode 100644 uni_modules/uview-ui/components/u-switch/props.js create mode 100644 uni_modules/uview-ui/components/u-switch/u-switch.vue create mode 100644 uni_modules/uview-ui/components/u-tabbar-item/props.js create mode 100644 uni_modules/uview-ui/components/u-tabbar-item/u-tabbar-item.vue create mode 100644 uni_modules/uview-ui/components/u-tabbar/props.js create mode 100644 uni_modules/uview-ui/components/u-tabbar/u-tabbar.vue create mode 100644 uni_modules/uview-ui/components/u-table/props.js create mode 100644 uni_modules/uview-ui/components/u-table/u-table.vue create mode 100644 uni_modules/uview-ui/components/u-tabs-item/props.js create mode 100644 uni_modules/uview-ui/components/u-tabs-item/u-tabs-item.vue create mode 100644 uni_modules/uview-ui/components/u-tabs/props.js create mode 100644 uni_modules/uview-ui/components/u-tabs/u-tabs.vue create mode 100644 uni_modules/uview-ui/components/u-tag/props.js create mode 100644 uni_modules/uview-ui/components/u-tag/u-tag.vue create mode 100644 uni_modules/uview-ui/components/u-td/props.js create mode 100644 uni_modules/uview-ui/components/u-td/u-td.vue create mode 100644 uni_modules/uview-ui/components/u-text/props.js create mode 100644 uni_modules/uview-ui/components/u-text/u-text.vue create mode 100644 uni_modules/uview-ui/components/u-text/value.js create mode 100644 uni_modules/uview-ui/components/u-textarea/props.js create mode 100644 uni_modules/uview-ui/components/u-textarea/u-textarea.vue create mode 100644 uni_modules/uview-ui/components/u-toast/u-toast.vue create mode 100644 uni_modules/uview-ui/components/u-toolbar/props.js create mode 100644 uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue create mode 100644 uni_modules/uview-ui/components/u-tooltip/clipboard.min.js create mode 100644 uni_modules/uview-ui/components/u-tooltip/props.js create mode 100644 uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue create mode 100644 uni_modules/uview-ui/components/u-tr/props.js create mode 100644 uni_modules/uview-ui/components/u-tr/u-tr.vue create mode 100644 uni_modules/uview-ui/components/u-transition/nvue.ani-map.js create mode 100644 uni_modules/uview-ui/components/u-transition/props.js create mode 100644 uni_modules/uview-ui/components/u-transition/transition.js create mode 100644 uni_modules/uview-ui/components/u-transition/u-transition.vue create mode 100644 uni_modules/uview-ui/components/u-transition/vue.ani-style.scss create mode 100644 uni_modules/uview-ui/components/u-upload/mixin.js create mode 100644 uni_modules/uview-ui/components/u-upload/props.js create mode 100644 uni_modules/uview-ui/components/u-upload/u-upload.vue create mode 100644 uni_modules/uview-ui/components/u-upload/utils.js create mode 100644 uni_modules/uview-ui/components/uview-ui/uview-ui.vue create mode 100644 uni_modules/uview-ui/index.js create mode 100644 uni_modules/uview-ui/index.scss create mode 100644 uni_modules/uview-ui/libs/config/color.js create mode 100644 uni_modules/uview-ui/libs/config/config.js create mode 100644 uni_modules/uview-ui/libs/config/props.js create mode 100644 uni_modules/uview-ui/libs/config/props/actionSheet.js create mode 100644 uni_modules/uview-ui/libs/config/props/album.js create mode 100644 uni_modules/uview-ui/libs/config/props/alert.js create mode 100644 uni_modules/uview-ui/libs/config/props/avatar.js create mode 100644 uni_modules/uview-ui/libs/config/props/avatarGroup.js create mode 100644 uni_modules/uview-ui/libs/config/props/backtop.js create mode 100644 uni_modules/uview-ui/libs/config/props/badge.js create mode 100644 uni_modules/uview-ui/libs/config/props/button.js create mode 100644 uni_modules/uview-ui/libs/config/props/calendar.js create mode 100644 uni_modules/uview-ui/libs/config/props/carKeyboard.js create mode 100644 uni_modules/uview-ui/libs/config/props/cell.js create mode 100644 uni_modules/uview-ui/libs/config/props/cellGroup.js create mode 100644 uni_modules/uview-ui/libs/config/props/checkbox.js create mode 100644 uni_modules/uview-ui/libs/config/props/checkboxGroup.js create mode 100644 uni_modules/uview-ui/libs/config/props/circleProgress.js create mode 100644 uni_modules/uview-ui/libs/config/props/code.js create mode 100644 uni_modules/uview-ui/libs/config/props/codeInput.js create mode 100644 uni_modules/uview-ui/libs/config/props/col.js create mode 100644 uni_modules/uview-ui/libs/config/props/collapse.js create mode 100644 uni_modules/uview-ui/libs/config/props/collapseItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/columnNotice.js create mode 100644 uni_modules/uview-ui/libs/config/props/countDown.js create mode 100644 uni_modules/uview-ui/libs/config/props/countTo.js create mode 100644 uni_modules/uview-ui/libs/config/props/datetimePicker.js create mode 100644 uni_modules/uview-ui/libs/config/props/divider.js create mode 100644 uni_modules/uview-ui/libs/config/props/empty.js create mode 100644 uni_modules/uview-ui/libs/config/props/form.js create mode 100644 uni_modules/uview-ui/libs/config/props/formItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/gap.js create mode 100644 uni_modules/uview-ui/libs/config/props/grid.js create mode 100644 uni_modules/uview-ui/libs/config/props/gridItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/icon.js create mode 100644 uni_modules/uview-ui/libs/config/props/image.js create mode 100644 uni_modules/uview-ui/libs/config/props/indexAnchor.js create mode 100644 uni_modules/uview-ui/libs/config/props/indexList.js create mode 100644 uni_modules/uview-ui/libs/config/props/input.js create mode 100644 uni_modules/uview-ui/libs/config/props/keyboard.js create mode 100644 uni_modules/uview-ui/libs/config/props/line.js create mode 100644 uni_modules/uview-ui/libs/config/props/lineProgress.js create mode 100644 uni_modules/uview-ui/libs/config/props/link.js create mode 100644 uni_modules/uview-ui/libs/config/props/list.js create mode 100644 uni_modules/uview-ui/libs/config/props/listItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/loadingIcon.js create mode 100644 uni_modules/uview-ui/libs/config/props/loadingPage.js create mode 100644 uni_modules/uview-ui/libs/config/props/loadmore.js create mode 100644 uni_modules/uview-ui/libs/config/props/modal.js create mode 100644 uni_modules/uview-ui/libs/config/props/navbar.js create mode 100644 uni_modules/uview-ui/libs/config/props/noNetwork.js create mode 100644 uni_modules/uview-ui/libs/config/props/noticeBar.js create mode 100644 uni_modules/uview-ui/libs/config/props/notify.js create mode 100644 uni_modules/uview-ui/libs/config/props/numberBox.js create mode 100644 uni_modules/uview-ui/libs/config/props/numberKeyboard.js create mode 100644 uni_modules/uview-ui/libs/config/props/overlay.js create mode 100644 uni_modules/uview-ui/libs/config/props/parse.js create mode 100644 uni_modules/uview-ui/libs/config/props/picker.js create mode 100644 uni_modules/uview-ui/libs/config/props/popup.js create mode 100644 uni_modules/uview-ui/libs/config/props/radio.js create mode 100644 uni_modules/uview-ui/libs/config/props/radioGroup.js create mode 100644 uni_modules/uview-ui/libs/config/props/rate.js create mode 100644 uni_modules/uview-ui/libs/config/props/readMore.js create mode 100644 uni_modules/uview-ui/libs/config/props/row.js create mode 100644 uni_modules/uview-ui/libs/config/props/rowNotice.js create mode 100644 uni_modules/uview-ui/libs/config/props/scrollList.js create mode 100644 uni_modules/uview-ui/libs/config/props/search.js create mode 100644 uni_modules/uview-ui/libs/config/props/section.js create mode 100644 uni_modules/uview-ui/libs/config/props/skeleton.js create mode 100644 uni_modules/uview-ui/libs/config/props/slider.js create mode 100644 uni_modules/uview-ui/libs/config/props/statusBar.js create mode 100644 uni_modules/uview-ui/libs/config/props/steps.js create mode 100644 uni_modules/uview-ui/libs/config/props/stepsItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/sticky.js create mode 100644 uni_modules/uview-ui/libs/config/props/subsection.js create mode 100644 uni_modules/uview-ui/libs/config/props/swipeAction.js create mode 100644 uni_modules/uview-ui/libs/config/props/swipeActionItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/swiper.js create mode 100644 uni_modules/uview-ui/libs/config/props/swipterIndicator.js create mode 100644 uni_modules/uview-ui/libs/config/props/switch.js create mode 100644 uni_modules/uview-ui/libs/config/props/tabbar.js create mode 100644 uni_modules/uview-ui/libs/config/props/tabbarItem.js create mode 100644 uni_modules/uview-ui/libs/config/props/tabs.js create mode 100644 uni_modules/uview-ui/libs/config/props/tag.js create mode 100644 uni_modules/uview-ui/libs/config/props/text.js create mode 100644 uni_modules/uview-ui/libs/config/props/textarea.js create mode 100644 uni_modules/uview-ui/libs/config/props/toast.js create mode 100644 uni_modules/uview-ui/libs/config/props/toolbar.js create mode 100644 uni_modules/uview-ui/libs/config/props/tooltip.js create mode 100644 uni_modules/uview-ui/libs/config/props/transition.js create mode 100644 uni_modules/uview-ui/libs/config/props/upload.js create mode 100644 uni_modules/uview-ui/libs/config/zIndex.js create mode 100644 uni_modules/uview-ui/libs/css/color.scss create mode 100644 uni_modules/uview-ui/libs/css/common.scss create mode 100644 uni_modules/uview-ui/libs/css/components.scss create mode 100644 uni_modules/uview-ui/libs/css/flex.scss create mode 100644 uni_modules/uview-ui/libs/css/h5.scss create mode 100644 uni_modules/uview-ui/libs/css/mixin.scss create mode 100644 uni_modules/uview-ui/libs/css/mp.scss create mode 100644 uni_modules/uview-ui/libs/css/nvue.scss create mode 100644 uni_modules/uview-ui/libs/css/vue.scss create mode 100644 uni_modules/uview-ui/libs/function/colorGradient.js create mode 100644 uni_modules/uview-ui/libs/function/debounce.js create mode 100644 uni_modules/uview-ui/libs/function/digit.js create mode 100644 uni_modules/uview-ui/libs/function/index.js create mode 100644 uni_modules/uview-ui/libs/function/platform.js create mode 100644 uni_modules/uview-ui/libs/function/test.js create mode 100644 uni_modules/uview-ui/libs/function/throttle.js create mode 100644 uni_modules/uview-ui/libs/luch-request/adapters/index.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/Request.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/defaults.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js create mode 100644 uni_modules/uview-ui/libs/luch-request/core/settle.js create mode 100644 uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js create mode 100644 uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js create mode 100644 uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js create mode 100644 uni_modules/uview-ui/libs/luch-request/index.d.ts create mode 100644 uni_modules/uview-ui/libs/luch-request/index.js create mode 100644 uni_modules/uview-ui/libs/luch-request/utils.js create mode 100644 uni_modules/uview-ui/libs/luch-request/utils/clone.js create mode 100644 uni_modules/uview-ui/libs/mixin/button.js create mode 100644 uni_modules/uview-ui/libs/mixin/mixin.js create mode 100644 uni_modules/uview-ui/libs/mixin/mpMixin.js create mode 100644 uni_modules/uview-ui/libs/mixin/mpShare.js create mode 100644 uni_modules/uview-ui/libs/mixin/openType.js create mode 100644 uni_modules/uview-ui/libs/mixin/style.js create mode 100644 uni_modules/uview-ui/libs/mixin/touch.js create mode 100644 uni_modules/uview-ui/libs/util/async-validator.js create mode 100644 uni_modules/uview-ui/libs/util/calendar.js create mode 100644 uni_modules/uview-ui/libs/util/dayjs.js create mode 100644 uni_modules/uview-ui/libs/util/emitter.js create mode 100644 uni_modules/uview-ui/libs/util/route.js create mode 100644 uni_modules/uview-ui/package.json create mode 100644 uni_modules/uview-ui/theme.scss create mode 100644 utils/bc.js create mode 100644 utils/common.js create mode 100644 utils/dialog.js create mode 100644 utils/index.js create mode 100644 utils/mapConfig.js create mode 100644 utils/querystring.js create mode 100644 utils/request.js create mode 100644 utils/store/cookie.js create mode 100644 utils/store/index.js create mode 100644 utils/store/localStorage.js create mode 100644 utils/validate.js create mode 100644 utils/vue-jsonp.umd.js create mode 100644 v4/components/@lucky-canvas/uni/LICENSE create mode 100644 v4/components/@lucky-canvas/uni/README.md create mode 100644 v4/components/@lucky-canvas/uni/lucky-grid.vue create mode 100644 v4/components/@lucky-canvas/uni/lucky-wheel.vue create mode 100644 v4/components/@lucky-canvas/uni/package.json create mode 100644 v4/components/@lucky-canvas/uni/slot-machine.vue create mode 100644 v4/components/@lucky-canvas/uni/utils.js create mode 100644 v4/components/lucky-canvas/LICENSE create mode 100644 v4/components/lucky-canvas/README.md create mode 100644 v4/components/lucky-canvas/index.js create mode 100644 v4/components/lucky-canvas/package.json create mode 100644 v4/components/lucky-canvas/types/index.d.ts create mode 100644 v4/components/select-city.vue create mode 100644 v4/views/attract/attract.vue create mode 100644 v4/views/attract/project.vue create mode 100644 v4/views/attract/projectList.vue create mode 100644 v4/views/live/live.vue create mode 100644 v4/views/luck/logs.vue create mode 100644 v4/views/luck/luck.vue create mode 100644 v4/views/luck/receive.vue create mode 100644 v4/views/offer/offer.vue create mode 100644 v4/views/preSale/preSale.vue create mode 100644 v4/views/seckill/seckill.vue create mode 100644 v4/views/shop/detail.vue create mode 100644 v4/views/shop/shop.vue create mode 100644 v4/views/specialty/specialty.vue create mode 100644 v4/views/trial/trial.vue create mode 100644 wenwan/views/goodsClass.vue create mode 100644 wenwan/views/store.vue create mode 100644 wenwan/views/storeList.vue diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..510dac0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +unpackage/ + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..81f13f4 --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,16 @@ +{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version": "0.0", + "configurations": [{ + "default" : + { + "launchtype" : "local" + }, + "mp-weixin" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..248b708 --- /dev/null +++ b/App.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/api/activity.js b/api/activity.js new file mode 100644 index 0000000..949e487 --- /dev/null +++ b/api/activity.js @@ -0,0 +1,153 @@ +import request from "@/utils/request"; + +/** + * 拼团列表 + */ +export function getCombinationList(data) { + return request.get("/combination/list", data, { login: false }); +} + +/** + * 拼团产品详情 + * @param {*} id + */ +export function getCombinationDetail(id) { + return request.get("/combination/detail/" + id, {}, { login: true }); +} + +/** + * 拼团 开团 + * @param {*} id + */ +export function getCombinationPink(id) { + return request.get("/combination/pink/" + id); +} + +/** + * 拼团 取消开团 + */ +export function getCombinationRemove(data) { + return request.post("/combination/remove", data); +} + +/** + * 拼团海报 + * @param {*} id + */ +export function getCombinationPoster(data) { + return request.post("/combination/poster", data); +} + +/** + * 秒杀列表配置 + */ +export function getSeckillConfig() { + return request.get("/seckill/index", {}, { login: false }); +} + +/** + * 秒杀列表 + */ +export function getSeckillList(time, data) { + return request.get("/seckill/list/" + time, data, { login: false }); +} + +/** + * 秒杀产品详情 + */ +export function getSeckillDetail(id) { + return request.get("/seckill/detail/" + id, {}, { login: false }); +} + +/** + * 砍价列表 + * @param {*} data + */ +export function getBargainList(data) { + return request.get("/bargain/list", data, { login: false }); +} + +/** + * 砍价产品详情 + */ +export function getBargainDetail(id) { + return request.get("/bargain/detail/" + id); +} + +/** + * 砍价 观看/分享/参与次数 + */ +export function getBargainShare(data) { + return request.post("/bargain/share", data); +} + +/** + * 砍价开启 + * @param {*} data + */ +export function getBargainStart(data) { + return request.post("/bargain/start", data); +} + +/** + * 砍价 帮助好友砍价 + * @param {*} data + */ +export function getBargainHelp(data) { + return request.post("/bargain/help", data); +} + +/** + * 砍价 砍掉金额 + * @param {*} data + */ +export function getBargainHelpPrice(data) { + return request.post("/bargain/help/price", data); +} + +/** + * 砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格 + * @param {*} data + */ +export function getBargainHelpCount(data) { + return request.post("/bargain/help/count", data); +} + +/** + * 砍价 开启砍价用户信息 + * @param {*} data + */ +export function getBargainStartUser(data) { + return request.post("/bargain/start/user", data); +} + +/** + * 砍价 砍价帮 + * @param {*} data + */ +export function getBargainHelpList(data) { + return request.post("/bargain/help/list", data); +} + +/** + * 砍价海报 + * @param {*} data + */ +export function getBargainPoster(data) { + return request.post("/bargain/poster", data); +} + +/** + * 砍价列表(已参与) + * @param {*} data + */ +export function getBargainUserList(data) { + return request.get("/bargain/user/list", data); +} + +/** + * 砍价取消 + */ +export function getBargainUserCancel(data) { + return request.post("/bargain/user/cancel", data); +} diff --git a/api/admin.js b/api/admin.js new file mode 100644 index 0000000..52f52eb --- /dev/null +++ b/api/admin.js @@ -0,0 +1,73 @@ +import request from "@/utils/request"; + +/** + * 统计数据 + */ +export function getStatisticsInfo() { + return request.get("/admin/order/statistics", {}, { login: true }); +} +/** + * 订单月统计 + */ +export function getStatisticsMonth(where) { + return request.get("/admin/order/data", where, { login: true }); +} +/** + * 订单月统计 + */ +export function getAdminOrderList(where) { + return request.get("/admin/order/list", where, { login: true }); +} +/** + * 订单改价 + */ +export function setAdminOrderPrice(data) { + return request.post("/admin/order/price", data, { login: true }); +} +/** + * 订单备注 + */ +export function setAdminOrderRemark(data) { + return request.post("/admin/order/remark", data, { login: true }); +} +/** + * 订单详情 + */ +export function getAdminOrderDetail(orderId) { + return request.get("/admin/order/detail/" + orderId, {}, { login: true }); +} +/** + * 订单发货信息获取 + */ +export function getAdminOrderDelivery(orderId) { + return request.get( + "/admin/order/detail/" + orderId, + {}, + { login: true } + ); +} + +/** + * 订单发货保存 + */ +export function setAdminOrderDelivery(data) { + return request.post("/admin/order/delivery/keep", data, { login: true }); +} +/** + * 订单统计图 + */ +export function getStatisticsTime(data) { + return request.get("/admin/order/time", data, { login: true }); +} +/** + * 线下付款订单确认付款 + */ +export function setOfflinePay(data) { + return request.post("/admin/order/offline", data, { login: true }); +} +/** + * 订单确认退款 + */ +export function setOrderRefund(data) { + return request.post("/admin/order/refund", data, { login: true }); +} diff --git a/api/goods.js b/api/goods.js new file mode 100644 index 0000000..0052399 --- /dev/null +++ b/api/goods.js @@ -0,0 +1,92 @@ +import request from "@/utils/request"; + +// 预售商品列表 +export function getPreSaleList(page, limit) { + return request.get( + "/preSale/list", { + page, + limit + }, { + login: true + } + ); +} + +// 每日特价列表 +export function getDailyGoodsList(page, limit) { + return request.get( + "/dailyGoods/list", { + page, + limit + }, { + login: true + } + ); +} + +// 秒杀产品时间区间 +export function getYxStoreSeckillIndex() { + return request.get("/seckill/index", {}, { + login: true + }); +} + +// 秒杀产品列表 +export function getSeckillTopList(page, limit) { + return request.get("/seckill/limitTime", {page, limit}, {login: true}) +} + +// 秒杀产品列表 +export function getYxStoreSeckillPageList(page, limit, timeId) { + return request.get("/seckill/list", { + page, + limit, + timeId + }, { + login: true + }) +} + +// 秒杀活动规则 +export function getSeckillRule() { + return request.get("/seckill/rule", {}, {login: false}) +} + +// 预售商品详情 +export function getPreSale(id) { + return request.get(`/preSale/detail/${id}`, {}, { + login: true + }) +} + +// 每日特价详情 +export function getDailyGoods(id) { + return request.get(`/dailyGoods/detail/${id}`, {}, { + login: true + }) +} + +// 秒杀产品详情 +export function getYxStoreSeckill(id) { + return request.get(`/seckill/detail/${id}`, {}, { + login: true + }) +} + +// 尖货推荐横幅 +export function sharpBannar() { + return request.get("/productRecommend/index", {}, { + login: false + }) +} + +// 尖货推荐-商品列表 +export function getSharpList(keyword) { + let param = ""; + if (keyword.trim().length > 0) { + param = `?keyword=${keyword}`; + } + return request.get("/product/hot" + param, {}, { + login: false + }) +} diff --git a/api/inn.js b/api/inn.js new file mode 100644 index 0000000..dbd61a4 --- /dev/null +++ b/api/inn.js @@ -0,0 +1,200 @@ +/* + * 客栈接口 + * */ +import request from "@/utils/request"; + + +/** + * 客栈申请 + * @param data + * @returns {*} + */ +export function postHotelApply(data) { + return request.post("/api/hotelMain/apply", data, { + login: true + }); +} + +/** + * 客栈重新申请 + * @param data + * @returns {*} + */ +export function postHotelReApply(data) { + return request.post("/api/hotelMain/reApply", data, { + login: true + }); +} + +/** + * 客栈点赞/取消 + * @param data + * @returns {*} + */ +export function getHotelZan(innId) { + return request.get("/api/hotelMain/zan/" + innId, {}, { + login: true + }); +} + +/** + * 客栈信息修改 + * @param data + * @returns {*} + */ +export function postHotelInfoEdit(data) { + return request.post("/api/hotelMain/edit", data, { + login: true + }); +} + +/** + * 客栈详情 + * @param innId 客栈id + * @returns {*} + */ +export function getHotelDetail(innId) { + return request.get("/api/hotelMain/info/" + innId, {}, { + login: true + }); +} + +/** + * 客栈列表 + * @param data + * @returns {*} + */ +export function getHotelList(data) { + return request.get("/api/hotelMain/list", data, { + login: true + }); +} + +/** + * 客栈商品列表 + * @param data + */ +export function goodsList(data) { + return request.get("/api/hotelMain/goodsList", data, { + login: false + }); +} + +/** + * 首页客栈列表(不需要登录) + * @param data + * @returns {*} + */ +export function getHomeHotelList(data) { + return request.get("/api/hotelMain/listIndex", data, { + login: false + }); +} + +/** + * 首页客栈详情(不需要登录) + * @param innId 客栈id + * @returns {*} + */ +export function getHomeHotelDetail(innId) { + return request.get("/api/hotelMain/infoIndex/" + innId, {}, { + login: false + }); +} + + +/** + * 客栈新增资讯 + * @param data + * @returns {*} + */ +export function postHotelNewsAdd(data) { + return request.post("/api/hotelNews/add", data, { + login: true + }); +} + +/** + * 客栈删除资讯 + * @param data + * @returns {*} + */ +export function postHotelNewsDel(data) { + return request.post("/api/hotelNews/del", data, { + login: true + }); +} + +/** + * 客栈资讯列表 + * @param data + * @returns {*} + */ +export function getHotelNewsList(data) { + return request.get("/api/hotelNews/list", data, { + login: false + }); +} + +/** + * 客栈资讯详情 + * @param data + * @returns {*} + */ +export function getHotelNewsDetail(id) { + return request.get("/api/hotelNews/info/" + id, {}, { + login: true + }); +} + +/** + * 客栈资讯点赞/取消 + * @param id + * @returns {*} + */ +export function getHotelNewsZan(id) { + return request.get("/api/hotelNews/zan/" + id, {}, { + login: true + }); +} + +/** + * 我的喜欢列表 + * @param id + * @returns {*} + */ +export function getHotelNewsZanList(data) { + return request.get("/api/hotelNews/zan/list", data, { + login: true + }); +} + +/** + * 获取有客栈的入驻的城市列表 + * @param id + * @returns {*} + */ +export function getHotelCityList() { + return request.get("/api/hotelMain/listCity", {}, { + login: true + }); +} + +/** + * 获取客栈类型列表 + * @param null + * @returns {*} + */ +export function getHotelTypeList() { + return request.get("/api/hotelMain/listType", {}, { + login: false + }); +} + +/** + * 店铺详情海报 + * @param id 店铺ID int + * */ +export function getPoster(id) { + return request.get("/api/hotelMain/poster/" + id, {}, {login: true}) +} \ No newline at end of file diff --git a/api/join.js b/api/join.js new file mode 100644 index 0000000..4da2e56 --- /dev/null +++ b/api/join.js @@ -0,0 +1,50 @@ +import request from "@/utils/request"; + +// 商户申请人数统计 +export function getCount() { + return request.get("/merchantApply/count", {}, {login: true}) +} + +// 商户申请入口页图片 +export function getImages() { + return request.get("/merchantApply/images", {}, {login: true}) +} + +// 商户申请页面数据 +export function getShopData(partnerId) { + let param = {}; + if (partnerId) param.partnerId = partnerId; + return request.get("/merchantApply/index", param, {login: true}) +} + +// 查看商户申请 +// 1-特产供应商 2-店铺 3-文玩供应商 +export function getShopInfo() { + return request.get("/merchantApply/info", {}, {login: true}) +} + +// 提交店铺入驻申请 +export function saveShop(hotelInfo, partnerId) { + let param = {hotelInfo}; + if (partnerId && partnerId.length > 0) param.partnerId = partnerId; + return request.post("/merchantApply/hotel/submit", param, {login: true}) +} + +// 提交特产供应商入驻申请 +export function saveSupplier(hotelInfo, supplierInfo, partnerId) { + let param = {hotelInfo, supplierInfo}; + if (partnerId && partnerId.length > 0) param.partnerId = partnerId; + return request.post("/merchantApply/goodSupplier/submit", param, {login: true}) +} + +// 提交文玩供应商入驻申请 +export function saveWenwanSupplier(hotelInfo, supplierInfo, partnerId) { + let param = {hotelInfo, supplierInfo}; + if (partnerId && partnerId.length > 0) param.partnerId = partnerId; + return request.post("/merchantApply/wenwanSupplier/submit", param, {login: true}) +} + +// 撤销入驻申请 +export function removeApply() { + return request.post("/merchantApply/revoke") +} \ No newline at end of file diff --git a/api/luck.js b/api/luck.js new file mode 100644 index 0000000..4e7ad86 --- /dev/null +++ b/api/luck.js @@ -0,0 +1,59 @@ +import request from "@/utils/request"; + +/** + * NIGHT V4 API + */ + +// 获取抽奖活动详情 +export function getLotteryInfo() { + return request.get("/lottery/detail", {}, { + login: true + }) +} + +// 抽奖 +export function draw(id) { + return request.post("/lottery/draw", { + lotteryId: id + }, { + login: true + }) +} + +// 加入抽奖活动 +export function join(id) { + return request.post("/lottery/join", { + lotteryId: id + }, { + login: true + }) +} + +// 获取我的抽奖记录 +export function getLotteryRecordsMy(id, page) { + return request.get("/lottery/records/my", { + lotteryId: id, + page + }, { + login: true + }) +} + +// 获取最新抽奖记录 +export function getLotteryRecordsNew(id) { + return request.get("/lottery/records/new", { + lotteryId: id + }, { + login: true + }) +} + +// 领奖 +export function takePrize(lotteryRecordId, addressId) { + return request.post("/lottery/takePrize", { + addressId, + lotteryRecordId + }, { + login: true + }) +} diff --git a/api/order.js b/api/order.js new file mode 100644 index 0000000..8684475 --- /dev/null +++ b/api/order.js @@ -0,0 +1,163 @@ +/* + * 订单确认 + * */ +import request from "@/utils/request"; + +/** + * 通过购物车 id 获取订单信息 + * @param cartId + * @returns {*} + */ +export function postOrderConfirm(cartId) { + return request.post("/order/confirm", { + cartId + }); +} + +/** + * 计算订单金额 + * @param key + * @param data + * @returns {*} + */ +export function postOrderComputed(key, data) { + return request.post("/order/computed/" + key, data); +} + +/** + * 获取指定金额可用优惠券 + * @param price + * @returns {*} + */ +export function getOrderCoupon(cartId) { + return request.get("/coupons/order/" + cartId); +} + +/** + * 生成订单 + * @param key + * @param data + * @returns {*} + */ +export function createOrder(key, data) { + return request.post("/order/create/" + key, data || {}); +} + +/** + * 订单统计数据 + * @returns {*} + */ +export function getOrderData() { + return request.get("/order/data"); +} + +/** + * 订单列表 + * @param data.type 0 全部,1 待付款,2 待发货,3 待发货,4 待评价,5 已完成,-1 退款中,-2 已退款,-3 退款(退款中+已退款+已驳回),-4 已驳回 + * @return _status._type 0 待付款,1 待发货,2 待收货,3 待评价,4 已完成,-1 退款中,-2 已退款,-3 已驳回 + */ +export function getOrderList(data) { + return request.get("/order/list", data); +} + +/** + * 取消订单 + * @returns {*} + */ +export function cancelOrder(id) { + return request.post("/order/cancel", { + id + }); +} + +/** + * 订单详情 + * @returns {*} + */ +export function orderDetail(id) { + return request.get("/order/detail/" + id); +} + +/** + * 退款理由 + * @returns {*} + */ +export function getRefundReason() { + return request.get("/order/refund/reason"); +} + +/** + * 提交退款 + * @returns {*} + */ +export function postOrderRefund(data) { + return request.post("/order/refund/verify", data); +} + +/** + * 确认收货 + * @returns {*} + */ +export function takeOrder(uni) { + return request.post("/order/take", { + uni + }); +} + +/** + * 删除订单 + * @returns {*} + */ +export function delOrder(uni) { + return request.post("/order/del", { + uni + }); +} + +/** + * 订单查询物流信息 + * @returns {*} + */ +export function express(params) { + return request.post("order/express", params); +} + +/** + * 订单支付 + * @returns {*} + */ +export function payOrder(uni, paytype, from) { + return request.post("order/pay", { + uni, + paytype, + from + }); +} + +/** + * 订单支付(余额) + * @returns {*} + */ +export function yuePayOrder(uni, paytype, from, passwordPay) { + return request.post("order/pay", { + uni, + paytype, + from, + passwordPay + }); +} + + +/** + * 订单核销 + * @returns {*} + */ + +export function orderVerific(verifyCode, isConfirm) { + return request.post("order/order_verific", {verifyCode, isConfirm}); +} + +// 延迟收货 +export function orderDelay(uni) { + return request.post("/order/extendedDelivery", {uni}) +} \ No newline at end of file diff --git a/api/product.js b/api/product.js new file mode 100644 index 0000000..69efb6a --- /dev/null +++ b/api/product.js @@ -0,0 +1,43 @@ +import request from "@/utils/request"; + +/** + * 康养食材首页 + * */ +export function wellnessFood() { + return request.get("/wellnessFood/index", {}, {login: true}) +} + +/** + * 养生圣地列表 + * */ +export function wellnessPlaceList(param) { + return request.get("/api/hotelMain/wellnessPlaceList", param, {login: true}) +} + +/** + * 定制礼品首页 + * */ +export function customizedGift() { + return request.get("/customizedGift/index", {}, {login: true}) +} + +/** + * 千县名品首页 + * */ +export function countyFamous() { + return request.get("/countyFamous/index", {}, {login: true}) +} + +/** + * 名品故事列表 + * */ +export function getStoryList(page) { + return request.get("/countyFamous/content/list?page=" + page, {}, {login: true}) +} + +/** + * 故事详情 + * */ +export function getStoryDetail(id) { + return request.get("/countyFamous/content/" + id, {}, {login: true}) +} diff --git a/api/public.js b/api/public.js new file mode 100644 index 0000000..11b5338 --- /dev/null +++ b/api/public.js @@ -0,0 +1,202 @@ +import request from "@/utils/request"; + +/** + * 首页 + * @returns {*} + */ +export function getHomeData() { + return request.get("index", {}, { + login: false + }); +} + +// 用户协议与隐私政策 +export function getAgree() { + return request.get("/agreement", {}, {login: false}) +} + +/** + * 获取视频分类 + * @returns {*} + */ +export function getStoreVideoType() { + return request.get("/dict/getStoreVideoType", {}, { + login: false + }); +} + +/** + * 获取客栈资讯分类 + * @returns {*} + */ +export function getHotelNewsCategory() { + return request.get("/dict/getHotelNewsCategory", {}, { + login: false + }); +} + + +/** + * 同步直播数据 + * @returns {*} + */ +export function wxLiveSynchro() { + return request.get("/synchro", {}, { + login: false + }); +} + +/** + * 查询直播间 + * @returns {*} + */ +export function getWxLiveList(q) { + return request.get("/yxWechatLive", q, { + login: false + }); +} + +/** + * 查询直播间回放列表 + * @returns {*} + */ +export function getWxLiveReplayList(id) { + return request.get("/yxWechatLive/getLiveReplay/", id, { + login: false + }); +} + +/** + * 文章 轮播列表 + * @returns {*} + */ +export function getArticleBanner() { + return request.get("/article/banner/list", {}, { + login: false + }); +} + +/** + * 文章分类列表 + * @returns {*} + */ +export function getArticleCategory() { + return request.get("/article/category/list", {}, { + login: false + }); +} + +/** + * 文章 热门列表 + * @returns {*} + */ +export function getArticleHotList() { + return request.get("/article/hot/list", {}, { + login: false + }); +} + +/** + * 文章列表 + * @returns {*} + */ +export function getArticleList(q) { + return request.get("/article/list/", q, { + login: false + }); +} + +/** + * 分享 + * @returns {*} + */ +export function getShare() { + return request.get("/share", {}, { + login: false + }); +} + +/** + * 文章详情 + * @returns {*} + */ +export function getArticleDetails(id) { + return request.get("/article/details/" + id, {}, { + login: false + }); +} + +/** + * 获取微信sdk配置 + * @returns {*} + */ +export function getWechatConfig() { + // return request.get( + // "/wechat/config", + // { url: document.location.href }, + // { login: false } + // ); +} + +/** + * 获取微信sdk配置 + * @returns {*} + */ +export function wechatAuth(code, spread, login_type) { + return request.get( + "/wechat/auth", { + code, + spread, + login_type + }, { + login: false + } + ); +} + +/** + * 获取快递公司 + * @returns {*} + */ +export function getLogistics() { + return request.get("/logistics", {}, { + login: false + }); +} + +/** + * 获取图片base64 + * @retins {*} + * */ +export function imageBase64(image, code) { + return request.post( + "/image_base64", { + image: image, + code: code + }, { + login: false + } + ); +} + +/** + * 数据字典 + * @param code 编码 + */ +export function queryByType(code) { + return request.get("/dict/queryByType/" + code, {}, { + login: true + }) +} + +// 获取用户UnionId +export function userUnionId() { + return request.get("/userUnionId", {}, { + login: true + }) +} + +// 获取分享图片 +export function getShareImage() { + return request.get("/shareImage", {}, {login: false}) +} \ No newline at end of file diff --git a/api/shop.js b/api/shop.js new file mode 100644 index 0000000..ce364c6 --- /dev/null +++ b/api/shop.js @@ -0,0 +1,72 @@ +import request from "@/utils/request"; + +/** + * NIGHT V4 API + */ + +// 店铺列表 +export function fetchShop(merchantName) { + return request.post("/merchant/products", { + merchantName + }, { + login: false + }) +} + +// 店铺内商品列表 +export function fetchGoods(merId, orderBy) { + return request.post("/merchant/productList", { + merId, + orderBy + }, { + login: false + }) +} + +// 特产列表 +export function fetchSpecialty(page, cityName) { + return request.get("/products/normal", { + isGood: 1, + page, + cityName, + limit: 20 + }, { + login: true + }) +} + +// 获取特产商品城市列表 +export function fetchCity() { + return request.post("/yxStoreProductGoods/list", {}, { + login: true + }) +} + +// 招商信息 +export function getAttract() { + return request.get("/api/businessApply/index", {}, { + login: false + }) +} + +// 提交招商信息 +export function saveAttract(data) { + return request.post("/api/businessApply/apply", data, { + login: true + }) +} + +// 招商项目入口页 +export function investment() { + return request.get("/investment/index", {}, {login: true}) +} + +// 招商项目列表 +export function investmentList(page, keyword) { + return request.get("/investment/list", {page, keyword}, {login: true}) +} + +// 招商项目详情 +export function investmentInfo(id) { + return request.get("/investment/info/" + id, {}, {login: true}) +} \ No newline at end of file diff --git a/api/store.js b/api/store.js new file mode 100644 index 0000000..ab0fe2f --- /dev/null +++ b/api/store.js @@ -0,0 +1,191 @@ +import request from "@/utils/request"; + +/** + * 商品分类 + * @param pid 35、文玩 + * @param excludePid 排除ID + * */ +export function getCategory(pid, excludePid, cityId, isGood) { + let param = {}; + if (pid) param.pid = pid; + if (excludePid) param.excludePid = excludePid; + if (cityId) param.cityId = cityId; + if (isGood) param.isGood = 1; + return request.get("/category", param, { + login: false + }); +} + +/* + * 商品详情 + * */ +export function getProductDetail(id, data) { + return request.get("/product/detail/" + id, data, { + login: true + }); +} + +/* + * 商品分销二维码 + * */ +export function getProductCode(id) { + return request.get("/product/code/" + id, {}, { + login: true + }); +} + +// 商品列表 +export function getProducts(q) { + return request.get("/products", q, { + login: false + }); +} + +// 普通商品 +export function fetchNormal(q) { + return request.get("/products/normal", q, {login: false}) +} + +// 文玩商品 +export function fetchWenwan(q) { + return request.get("/products/wenwan", q, {login: false}) +} + +/* + * 购物车数量 + * */ +export function getCartNum() { + return request.get("/cart/count"); +} + +/* + * 添加收藏 + * */ +export function toCollect(id, category) { + return request.get("/collect/add/" + id + "/" + category); +} + +/* + * 为你推荐 + * */ +export function getHostProducts(page, limit) { + return request.get( + "/product/hot", { + page: page, + limit: limit + }, { + login: false + } + ); +} + +/* + * 精品、热门、首发列表 + * */ +export function getGroomList(type) { + return request.get("/groom/list/" + type, {}, { + login: true + }); +} + +/* + * 获取商品海报 + * */ +export function getProductPoster(id) { + return request.get("/product/poster/" + id, {}, { + login: true + }); +} + +/* + * 购物车 添加 + * */ +export function postCartAdd(data) { + return request.post("/cart/add", data); +} + +/* + * 购物车列表 + * */ +export function getCartList() { + return request.get("/cart/list"); +} + +/* + * 购物车 删除 + * */ +export function postCartDel(ids) { + return request.post("/cart/del", { + ids + }); +} + +/* + * 购物车 获取数量 + * */ +export function getCartCount(data) { + return request.get("/cart/count", data); +} + +/* + * 购物车 修改商品数量 + * */ +export function changeCartNum(id, number) { + return request.post("/cart/num", { + id, + number + }); +} + +/** + * 搜索推荐关键字 + */ +export function getSearchKeyword() { + return request.get("/search/keyword", {}, { + login: false + }); +} + +/** + * 产品评论列表 + */ +export function getReplyList(id, q) { + return request.get("/reply/list/" + id, q, { + login: true + }); +} + +/** + * 产品评价数量和好评度 + */ +export function getReplyConfig(id) { + return request.get("/reply/config/" + id, {}, { + login: true + }); +} + +/** + * 评价页面获取单个产品详情 + */ +export function postOrderProduct(unique) { + return request.post("/order/product", { + unique + }, { + login: true + }); +} + +/** + * 提交评价页面; + */ +export function postOrderComment(data) { + return request.post("/order/comment", data, { + login: true + }); +} + +export function storeListApi(data) { + return request.get("store_list", data, { + login: false + }); +} diff --git a/api/user.js b/api/user.js new file mode 100644 index 0000000..13b9bb9 --- /dev/null +++ b/api/user.js @@ -0,0 +1,525 @@ +import request from "@/utils/request"; + +/** + * 省市区 + */ +export function getCity(data) { + return request.get("/city_list", data, { + login: false + }); +} + +export function district(data) { + // return request.get("/city_list", data, { + return request.get("/citys", data, { + login: false + }); +} + +/** + * 用户登录 + * @param data object 用户账号密码 + */ +export function login(data) { + return request.post("/login", data, { + login: false + }); +} + +/** + * 用户手机号登录 + * @param data object 用户手机号 也只能 + */ +export function loginMobile(data) { + return request.post("/login/mobile", data, { + login: false + }); +} + +/** + * 用户发送验证码 + * @param data object 用户手机号 + */ +export function registerVerify(data) { + return request.post("/register/verify", data, { + login: false + }); +} + +/** + * 用户手机号注册 + * @param data object 用户手机号 验证码 密码 + */ +export function register(data) { + return request.post("/register", data, { + login: false + }); +} + +/** + * 用户手机号修改密码 + * @param data object 用户手机号 验证码 密码 + */ +export function registerReset(data) { + return request.post("/register/reset", data, { + login: false + }); +} + +/** + * 用户绑定上级 + * @param nil + */ +export function userBindParent(data) { + return request.post("/user/spread", data); +} + +/** + * 获取用户等级信息 + * @param nil + */ +export function getUserLevelInfo() { + return request.get("/user/levelInfo"); +} + +/** + * 用户升级协议保存 + * @param nil + */ +export function saveUserProtocol(data) { + return request.post("/user/saveGd", data); +} + + +/* + * 视频回放列表 + * */ +export function getVideoList(q) { + return request.get("/video_list", q, { + login: false + }); +} + + + +/* + * 领取优惠券列表 + * */ +export function getCoupon(q) { + return request.get("/coupons", q, { + login: true + }); +} + + +/* + * 点击领取优惠券 + * */ +export function getCouponReceive(id) { + return request.post("/coupon/receive", { + couponId: id + }, { + login: true + }); +} + +/* + * 批量领取优惠券 + * */ +export function couponReceiveBatch(couponId) { + return request.post("/coupon/receive/batch", { + couponId + }); +} + +/* + * 我的优惠券 + * */ +export function getCouponsUser(type) { + return request.get("/coupons/user/" + type); +} + +/* + * 个人中心 + * */ +export function getUser() { + return request.get("/user"); +} + +/* + * 用户信息 + * */ +export function getUserInfo() { + return request.get("/userinfo", { + login: true + }); +} + +/* + * 小程序检查授权 + * */ +export function wxappCheckAuth(data) { + return request.post("/wxapp/checkAuthCode", data, { + login: false + }); +} + +/* + * 小程序登陆 + * */ +export function wxappAuth(data) { + return request.post("/wxapp/auth", data, { + login: false + }); +} + +/* + * 个人中心(功能列表) + * */ +export function getMenuUser() { + return request.get("/menu/user"); +} + +/* + * 用户设置支付密码 + * */ +export function setUserPayPwd(data) { + return request.post("/user/savePayPass", data); +} + +/* + * 通知消息列表 + * */ +export function noticeList(data) { + return request.get("/platNoticeSend/list", data, { login: true }); +} + +/* + * 通知消息详情 + * */ +export function noticeDetail(data) { + return request.post("/platNoticeSend/read", data, { login: true }); +} + +/* + * 用户修改支付密码 + * */ +export function modifyUserPayPwd(data) { + return request.post("/user/updatePayPass", data); +} + +export function bankList(data) { + return request.get("/api/yxBank/bank/list", data, { login: true }); +} + +export function bankCardList(data) { + return request.get("/api/yxBankCard/bankCard/list", data, { login: true }); +} + +export function addBankCard(data) { + return request.post("/api/yxBankCard/bankCard/add", data, { login: true }); +} + +export function deleteBankCard(data) { + return request.post("/api/yxBankCard/bankCard/del", data, { login: true }); +} + +/* + * 地址列表 + * */ +export function getAddressList(data) { + return request.get("/address/list", data || {}); +} + +/* + * 删除地址 + * */ +export function getAddressRemove(id) { + return request.post("/address/del", { + id: id + }); +} + +/* + * 设置默认地址 + * */ +export function getAddressDefaultSet(id) { + return request.post("/address/default/set", { + id: id + }); +} + +/* + * 获取默认地址 + * */ +export function getAddressDefault() { + return request.get("/address/default"); +} + +/* + * 获取单个地址 + * */ +export function getAddress(id) { + return request.get("/address/detail/" + id); +} + +/* + * 修改 添加地址 + * */ +export function postAddress(data) { + return request.post("/address/edit", data); +} + +/* + * 获取收藏产品 + * */ +export function getCollectUser(page, limit) { + return request.get("/collect/user", { + page: page, + limit: limit + }); +} + +/* + * 删除收藏产品 + * */ +export function getCollectDel(id, category) { + return request.post("/collect/del", { + id: id, + category: category + }); +} + +/* + * 批量收藏产品 + * */ +export function postCollectAll(data) { + return request.post("/collect/all", data); +} + +/* + * 添加收藏产品 + * */ +export function getCollectAdd(id, category) { + return request.post("collect/add", { + id: id, + category: category + }); +} + +/* + * 签到配置 + * */ +export function getSignConfig() { + return request.get("/sign/config"); +} + +/* + * 签到里的签到列表 + * */ +export function getSignList(page, limit) { + return request.get("/sign/list", { + page: page, + limit: limit + }); +} + +/* + * 签到列表 + * */ +export function getSignMonth(page, limit) { + return request.get("/sign/month", { + page: page, + limit: limit + }); +} + +/* + * 签到用户信息 + * */ +export function postSignUser(sign) { + return request.post("/sign/user", sign); +} + +/* + * 签到 + * */ +export function postSignIntegral(sign) { + return request.post("/sign/integral", sign); +} + +/* + * 推广数据 + * */ +export function getSpreadInfo() { + return request.get("/commission"); +} + +/* + * 推广人列表 + * */ +export function getSpreadUser(screen) { + return request.post("/spread/people", screen); +} + +/* + * 推广人订单 + * */ +export function getSpreadOrder(where) { + return request.post("/spread/order", where); +} + +/* + * 资金明细(types|0=全部,1=消费,2=充值,3=返佣,4=提现) + * */ +export function getCommissionInfo(q, types) { + return request.get("/spread/commission/" + types, q); +} + +/* + * 积分记录 + * */ +export function getIntegralList(q) { + return request.get("/integral/list", q); +} + +/* + * 提现记录 + * */ +export function getWithdrawalRecordList(q) { + return request.get("/list", q); +} + +/* + * 提现银行 + * */ +export function getBank() { + return request.get("/extract/bank"); +} + +/* + * 提现申请 + * */ +export function postCashInfo(cash) { + return request.post("/extract/cash", cash); +} + +/* + * 会员中心 + * */ +export function getVipInfo() { + return request.get("/user/level/grade"); +} + +/* + * 会员等级任务 + * */ +export function getVipTask(id) { + return request.get("/user/level/task/" + id); +} + +/* + * 资金统计 + * */ +export function getBalance() { + return request.get("/user/balance"); +} + +/* + * 活动状态 + * */ +export function getActivityStatus() { + return request.get("/user/activity", {}, { + login: false + }); +} + +/* + * 活动状态 + * */ +export function getSpreadImg(data) { + + return request.get("/spread/banner", data); +} + +/* + * 用户修改信息 + * */ +export function postUserEdit(data) { + return request.post("/user/edit", data); +} + +/* + * 用户修改信息 + * */ +export function getChatRecord(to_uid, data) { + return request.get("user/service/record/" + to_uid, data); +} + +/* + * 用户修改信息 + * */ +export function serviceList() { + return request.get("user/service/list"); +} + +/* + * 公众号充值 + * */ +export function rechargeWechat(data) { + return request.post("/recharge/wechat", data); +} + +/* + * 退出登录 + * */ +export function getLogout() { + return request.post("/auth/logout"); +} + +/* + * 绑定手机号(小程序方式) + * */ +export function bindingPhone(data) { + return request.post("wxapp/binding", data); +} + +/* + * 绑定手机号(手机号,验证码方式) + * */ +export function bindingPhoneByInput(data) { + return request.post("/binding", data); +} + +/* + * h5切换公众号登陆 + * */ +export function switchH5Login() { + return request.post("switch_h5", { + from: "wechat" + }); +} +/* + * 获取推广人排行 + * */ +export function getRankList(q) { + return request.get("rank", q); +} +/* + * 获取佣金排名 + * */ +export function getBrokerageRank(q) { + return request.get("brokerage_rank", q); +} + +/** + * 检测会员等级 + */ +export function setDetection() { + return request.get("user/level/detection"); +} + + +export function getRechargeApi() { + return request.get("recharge/index"); +} diff --git a/api/wenwan.js b/api/wenwan.js new file mode 100644 index 0000000..f2a57af --- /dev/null +++ b/api/wenwan.js @@ -0,0 +1,21 @@ +import request from "@/utils/request"; + +// 文玩店铺列表 +export function fetchStore(page, cityName, name) { + return request.get("/api/hotelMain/wenwanList", { + limit: 10, + page, + cityName, + name + }, {login: true}) +} + +/** + * 获取商品城市列表 + * @param type 类型:0、特产;1、文玩;2、七彩云上;3、定制礼品;4、康养食材;5、千县名品;6、景点门票 + * */ +export function fetchCity(type) { + return request.get(`/wenwan/cityList/${type}`, {}, { + login: true + }) +} \ No newline at end of file diff --git a/assets/css/base.less b/assets/css/base.less new file mode 100644 index 0000000..78111a7 --- /dev/null +++ b/assets/css/base.less @@ -0,0 +1,293 @@ +@charset "UTF-8"; +/** + *相关初始化 +*/ + +/*重置uni-checkbox样式开始*/ +uni-checkbox .uni-checkbox-input{ + border-radius: 50% !important; +} + +uni-checkbox .uni-checkbox-input:hover { + border-color: #FE5261 !important; +} + +uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked{ + background-color: #FE5261 !important; + border: 1px solid #FE5261 !important; + color: #fff !important; +} + + +checkbox .wx-checkbox-input { + border-radius: 50% !important; +} + +checkbox .wx-checkbox-input:hover { + border-color: #FE5261 !important; +} + +checkbox .wx-checkbox-input.wx-checkbox-input-checked { + background-color: #FE5261 !important; + border: 1px solid #FE5261 !important; + color: #fff !important; +} + +/*重置uni-checkbox样式结束*/ +.font-color-lightred{ + color:#FE5261 !important; +} + +.font-color-white{ + color: #fff !important; +} +.font-color-red { + color: #FE5261 !important; +} +.font-color-green{ + color: #00c17b !important; +} + +.bg-color-lightred{ + background-color:#FE5261 !important; +} +.bg-color-green{ + background-color: #00c17b !important; +} +.bg-color-red { + background-color: #FE5261 !important; +} +.nav-bg-color-red{ + background-color: #FE5261 !important; +} +.icon-color { + color: #FE5261; +} +.cart-color { + color: #FE5261 !important; + border: 1px solid #FE5261 !important; +} +/* padding20 */ +.padding20 { + padding: 0.2*100rpx; +} +/* pad20 */ +.pad20 { + padding: 0 0.2*100rpx; +} +/* padding30 */ +.padding30 { + padding: 0.3*100rpx; +} +/*pad30 */ +.pad30 { + padding: 0 0.3*100rpx; +} +/* layout */ +.acea-row { + display: flex; + flex-wrap: wrap; + /* 辅助类 */ +} +.acea-row.row-middle { + align-items: center; +} +.acea-row.row-top { + align-items: flex-start; +} +.acea-row.row-bottom { + align-items: flex-end; +} +.acea-row.row-center { + justify-content: center; +} +.acea-row.row-right { + justify-content: flex-end; +} +.acea-row.row-left { + justify-content: flex-start; +} +.acea-row.row-between { + justify-content: space-between; +} +.acea-row.row-around { + justify-content: space-around; +} +.acea-row.row-column-around { + flex-direction: column; + justify-content: space-around; +} +.acea-row.row-column { + flex-direction: column; +} +.acea-row.row-column-between { + flex-direction: column; + justify-content: space-between; +} +/* 上下左右垂直居中 */ +.acea-row.row-center-wrapper { + align-items: center; + justify-content: center; +} +/* 上下两边居中对齐 */ +.acea-row.row-between-wrapper { + align-items: center; + justify-content: space-between; +} + +/* 轮播图 */ +.slider-banner { + position: relative; + width: 100%; + /* height:750rpx; */ + overflow: hidden; +} +.slider-banner{ + +} +.slider-banner .swiper-container { + height: 100%; +} +.slider-banner image{ + display: block; + width: 100%; + height: 100%; +} +.start { + width: 1.22*100rpx; + height: 0.3*100rpx; + background-image: url("~@/static/images/start.png"); + background-repeat: no-repeat; + background-size: 1.22*100rpx auto; +} +.start.star5 { + background-position: 0 0.03*100rpx; +} +.start.star4 { + background-position: 0 -0.3*100rpx; +} +.start.star3 { + background-position: 0 -0.7*100rpx; +} +.start.star2 { + background-position: 0 -1.05*100rpx; +} +.start.star1 { + background-position: 0 -1.4*100rpx; +} +.start.star0 { + background-position: 0 -1.75*100rpx; +} +/* 单选框和多选框 */ +.checkbox-wrapper { + position: relative; +} +.checkbox-wrapper input { + display: none; +} +.checkbox-wrapper .icon { + position: absolute; + left: 0; + top: 50%; + display: inline-block; + width: 18px; + height: 18px; + border: 1px solid #cccccc; + border-radius: 50%; + transform: translate(0, -50%); +} +.checkbox-wrapper input:checked + .icon { + background-color: #e93323; + border-color: #e93323; + background-image: url("/static/images/enter.png"); + background-size: 0.21*100rpx 0.15*100rpx; + background-repeat: no-repeat; + background-position: center center; +} +.Loads { + height: 0.8*100rpx; + font-size: 0.25*100rpx; + color: #000; +} +.Loads .iconfont { + font-size: 0.3*100rpx; + margin-right: 0.1*100rpx; + height: 0.32*100rpx; + line-height: 0.32*100rpx; +} +/*加载动画*/ +@keyframes load { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} +.loadingpic { + animation: load 3s linear 1s infinite; +} +.loading { + animation: load linear 1s infinite; +} + +.page-v4{ + background: #F5F5FA; +} + +.bold{ + font-weight: bold; +} + +.tc{ + text-align: center; +} + +// flex布局 +.flex { + display: flex; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.flex-col { + flex-direction: column; +} + +.flex-0 { + flex-shrink: 0; +} + +.jc-start { + justify-content: flex-start; +} + +.jc-end { + justify-content: flex-end; +} + +.jc-center { + justify-content: center; +} + +.jc-around { + justify-content: space-around; +} + +.jc-between { + justify-content: space-between; +} + +.ai-start { + align-items: flex-start; +} + +.ai-end { + align-items: flex-end; +} + +.ai-center { + align-items: center; +} \ No newline at end of file diff --git a/assets/css/goods.less b/assets/css/goods.less new file mode 100644 index 0000000..c25509c --- /dev/null +++ b/assets/css/goods.less @@ -0,0 +1,173 @@ +.change-section { + margin: 24rpx; + padding: 20rpx 24rpx; + border-radius: 20rpx; + + .introduce { + font-size: 34rpx; + } + + .subInfo { + margin-top: 20rpx; + font-size: 26rpx; + color: #8B8F99; + } + + .share { + margin-top: 20rpx; + + .money { + .num { + font-size: 32rpx; + } + } + } +} + +.goods-section { + margin: 24rpx; + padding: 30rpx 24rpx; + border-radius: 20rpx; + background: #fff; +} + +.service-section { + .cell { + margin-bottom: 30rpx; + font-size: 26rpx; + line-height: 1; + + .after-title { + width: 120rpx; + color: #ADADAD; + } + + .title { + color: #333333; + } + + .sub-title { + position: relative; + margin-top: 20rpx; + color: #9D9D9D; + font-size: 22rpx; + } + + .value { + color: #9D9D9D; + font-size: 24rpx; + } + + .red { + color: #FF564A; + } + + .icon-time { + position: relative; + top: 6rpx; + width: 32rpx; + height: 32rpx; + vertical-align: middle; + } + } + + .cell:last-child { + margin-bottom: 0; + } +} + +.store-section { + .logo { + width: 70rpx; + height: 70rpx; + margin-right: 10rpx; + border-radius: 50%; + vertical-align: middle; + } + + .title { + width: 500rpx; + color: #333; + font-size: 30rpx; + } + + .value { + color: #666; + font-size: 22rpx; + line-height: 40rpx; + } + + .product-list { + margin-top: 30rpx; + + .item { + width: 198rpx; + height: 318rpx; + margin-right: 30rpx; + + .cover-box { + position: relative; + width: 198rpx; + height: 198rpx; + overflow: hidden; + + .tag{ + position: absolute; + top: 0; + left: 0; + width: 92rpx; + height: 40rpx; + } + .cover{ + width: 100%; + height: 100%; + border-radius: 12rpx; + } + + image { + vertical-align: middle; + } + } + + .more-t { + margin-top: 10rpx; + color: #333; + font-size: 24rpx; + } + + .price { + margin-top: 10rpx; + color: #DA0000; + font-size: 26rpx; + } + } + } +} + +.param-section { + color: #333; + font-size: 26rpx; + + .table { + margin-top: 30rpx; + border: 2rpx solid #D2D2D2; + + .row { + border-bottom: 2rpx solid #D2D2D2; + + .title { + width: 160rpx; + padding: 16rpx; + border-right: 2rpx solid #D2D2D2; + color: #ADADAD; + } + } + .row:last-child{ + border-bottom: none; + } + .value { + width: 100%; + padding: 16rpx; + } + } +} diff --git a/assets/css/pkg_join.less b/assets/css/pkg_join.less new file mode 100644 index 0000000..9c468fc --- /dev/null +++ b/assets/css/pkg_join.less @@ -0,0 +1,142 @@ +.u-form { + margin-top: 8rpx; + + .u-form-item__body { + padding: 0 !important; + } +} + +.u-cell-group { + margin-bottom: 16rpx; + padding: 40rpx 0; + background: #FFFFFF; + + .u-cell-group__title { + padding-top: 0; + + .u-cell-group__title__text { + font-weight: bold; + font-size: 40rpx; + line-height: 58rpx; + color: #333333; + } + } +} + +.u-cell { + .u-cell__body__content { + flex: 0 !important; + } + + .u-cell__title { + width: 216rpx !important; + + .u-cell__title-text { + color: #666666; + } + } + + .u-text__value { + width: 398rpx !important; + } +} + +.required { + color: #EF1C1C; + font-size: 28rpx; +} + +.content-section { + .line { + width: 690rpx; + } + + .u-textarea { + padding-left: 0 !important; + padding-right: 0 !important; + } +} + +.area-item { + .uni-input { + color: #c0c4cc; + } +} + +.btn-submit { + position: fixed; + bottom: 0; + display: flex; + justify-content: center; + align-items: center; + width: 750rpx; + height: 80rpx; + background: #FF564A; + color: #FFFFFF; + font-size: 36rpx; + z-index: 10; +} + +.btn-disabled { + background: #DDDDDD; +} + +.btn-remove{ + background: #FF9696; +} + +.btn-upload { + display: flex; + justify-content: center; + align-items: center; + width: 176rpx; + height: 64rpx; + border: 2rpx solid #1F77EE; + border-radius: 32rpx; + background: rgba(245, 245, 245, 0.39); + color: #1F77EE; + font-size: 32rpx; +} + +.box-upload { + //margin-top: 12rpx; + + .img-preview { + width: 160rpx; + height: 160rpx; + border-radius: 8rpx; + margin: 0 20rpx 20rpx 0; + } + + .pics-box { + width: 690rpx; + } +} + +.u-upload__wrap{ + width: 690rpx; +} + +.popup-body { + width: 80vw; + height: 80vh; + padding: 30rpx; + overflow: hidden; + + .content { + height: 52vh; + overflow-y: auto; + margin: 30rpx 0; + } + + .agree-box { + margin: 60rpx 0; + font-size: 28rpx; + color: #666; + } +} + +.box-state { + padding: 16rpx 32rpx 0; + background: #FFFFFF; +} \ No newline at end of file diff --git a/assets/css/product.less b/assets/css/product.less new file mode 100644 index 0000000..f76037e --- /dev/null +++ b/assets/css/product.less @@ -0,0 +1,131 @@ +.pkg-product-list { + image { + vertical-align: middle; + } + + .swiper-box { + width: 686rpx; + height: 360rpx; + margin: 0 auto; + border-radius: 16rpx; + + image { + width: 100%; + height: 100%; + border-radius: 16rpx; + } + } + + .search-box { + width: 686rpx; + height: 60rpx; + margin: 0 auto; + padding: 0 24rpx 0 32rpx; + box-sizing: border-box; + background: #F7F7F7; + border-radius: 30rpx; + + input { + width: 560rpx; + font-size: 24rpx; + } + + .icon { + width: 32rpx; + height: 32rpx; + } + } + + .body-box { + width: 100%; + display: flex; + position: relative; + border-top: 2rpx solid #D2D2D2; + + ::-webkit-scrollbar { + width: 0 !important + } + + .aside-box { + position: relative; + left: 0; + width: 194rpx; + box-sizing: border-box; + border-right: 2rpx solid #D2D2D2; + overflow-y: auto; + + .item { + height: 94rpx; + box-sizing: border-box; + border-bottom: 2rpx solid #D2D2D2; + color: #033333; + + text { + font-size: 28rpx; + } + } + + .active { + border-left: 6rpx solid #FD574B; + color: #FD574B; + font-weight: bold; + } + } + + .article-box { + position: relative; + width: calc(100vw - 194rpx); + overflow-y: auto; + + .empty { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%,-50%); + + image { + width: 280rpx; + height: 280rpx; + } + + view { + color: gray; + font-size: 24rpx; + } + } + + .item { + position: relative; + width: 242rpx; + height: 376rpx; + box-sizing: border-box; + margin: 20rpx 0 0 20rpx; + + .cover { + width: 242rpx; + height: 242rpx; + margin-bottom: 8rpx; + border-radius: 8rpx; + } + + .name { + color: #333; + font-size: 26rpx; + line-height: 36rpx; + } + + .price { + position: absolute; + bottom: 4rpx; + color: #DA0000; + font-size: 28rpx; + line-height: 36rpx; + } + } + .item-store{ + height: 336rpx; + } + } + } + +} diff --git a/assets/css/reset.less b/assets/css/reset.less new file mode 100644 index 0000000..d15c36f --- /dev/null +++ b/assets/css/reset.less @@ -0,0 +1,43 @@ +input{line-height: normal; box-sizing:border-box;} +@font-face { + font-family: 'GuildfordProBook 5'; + src: url('https://h5.yixiang.co/static/iconfont/GuildfordProBook5.otf'); +} +[v-cloak] { + display: none; +} +.iconfont{ + font-size: .36*100rpx; +} +/* 一像素边框 */ +@media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5) { + .border-1px::after { + transform: scaleY(0.7); + } + .border-1px::before { + transform: scaleY(0.7); + } +} +@media (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) { + .border-1px::after { + transform: scaleY(0.5); + } + .border-1px::before { + transform: scaleY(0.5); + } +} +@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) { + .border-1px::after { + transform: scaleY(0.33); + } + .border-1px::before { + transform: scaleY(0.33); + } +} +.line1{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width: 100%;} +.line2{word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;} +.mask{position:fixed;top:0;left:0;right:0;bottom:0;z-index:55;background-color:rgba(0,0,0,0.5);} + + + + diff --git a/assets/css/store.less b/assets/css/store.less new file mode 100644 index 0000000..cf22ce0 --- /dev/null +++ b/assets/css/store.less @@ -0,0 +1,39 @@ +.fixed-share { + position: fixed; + right: 0; + bottom: 200rpx; + width: 184rpx; + height: 62rpx; + vertical-align: middle; + z-index: 100; +} + +.box-share { + .box-img { + position: relative; + width: 500rpx; + height: 632rpx; + border-radius: 40rpx; + overflow: hidden; + } + + .icon { + position: absolute; + top: 22rpx; + right: 22rpx; + width: 32.5rpx; + height: 32.5rpx; + } + + .main-img { + width: 500rpx; + height: 632rpx; + border-radius: 40rpx; + } + + .btn { + width: 500rpx; + height: 100rpx; + margin-top: 20rpx; + } +} \ No newline at end of file diff --git a/assets/css/style.less b/assets/css/style.less new file mode 100644 index 0000000..054e923 --- /dev/null +++ b/assets/css/style.less @@ -0,0 +1,8193 @@ +page { + background: #f5f5f5; +} + +// ios底部安全距离-padding +.savepadding{ + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + box-sizing: content-box; +} + +// ios底部安全距离-bottom +.savebottom{ + bottom: constant(safe-area-inset-bottom); + bottom: env(safe-area-inset-bottom); +} + +.newsList .newsSwitch .van-hairline--top-bottom::after { + border: 0; +} + +.newsList .newsSwitch .van-tab { + font-size: 0.32*100rpx; + padding: 0; + flex-basis: unset !important; + margin-right: 0.46*100rpx; +} + +.newsList .newsSwitch .van-tabs__wrap { + padding: 0 0.3*100rpx; +} + +.newsList .newsSwitch.van-tabs--line { + padding-top: 0.9*100rpx; +} + +#footer { + position: fixed; + width: 100%; + height: 100rpx; + bottom: 0; + left: 0; + background-color: #fff; + border-top: 1px solid #eee; + z-index: 9999; +} + +#footer.iphonex-footer { + height: 100rpx; + padding-bottom: 68rpx; +} + +.footer-bg { + height: 100rpx; +} + +.iphonex-footer-bg { + height: 168rpx; +} + +#footer .item { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; + font-size: 0.2*100rpx; + color: #282828; +} + +#footer .item.on { + color: #eb3729; +} + +#footer .item .iconfont { + font-size: 0.45*100rpx; + height: 0.55*100rpx; + line-height: 0.55*100rpx; +} + +.goodList .item { + position: relative; + padding-left: 0.3*100rpx; + background-color: #fff; +} + +.goodList .item .pictrue { + width: 1.8*100rpx; + height: 1.8*100rpx; + position: relative; +} + +.goodList .item .pictrue .image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.goodList .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.goodList .item .underline { + padding: 0.3*100rpx 0.3*100rpx 0.3*100rpx 0; + border-bottom: 1px solid #f5f5f5; +} + +.goodList .item:nth-last-child(1) .underline { + border-bottom: 0; +} + +.goodList .item .text { + font-size: 0.3*100rpx; + color: #222; + width: 4.89*100rpx; + text-align: left; +} + +.goodList .item .text .money .num { + font-size: 0.34*100rpx; +} + +.goodList .item .text .vip-money { + font-size: 0.24*100rpx; + color: #282828; + font-weight: bold; + margin-top: 0.1*100rpx; +} + +.goodList .item .text .vip-money .vip { + margin-right: 0.22*100rpx; + text-decoration: line-through; +} + +.goodList .item .text .vip-money .image { + width: 0.46*100rpx; + height: 0.21*100rpx; + margin-left: 0.05*100rpx; +} + +.goodList .item .text .vip-money .num { + font-size: 0.22*100rpx; + color: #aaa; + font-weight: normal; + margin: -0.02*100rpx 0 0 0; +} + +.goodList .item .iconfont { + position: absolute; + right: 0.3*100rpx; + width: 0.5*100rpx; + height: 0.5*100rpx; + border-radius: 50%; + font-size: 0.3*100rpx; + bottom: 0.38*100rpx; +} + +.promotionGood { + padding: 0 0.3*100rpx; + background-color: #fff; +} + +.promotionGood .item { + border-bottom: 1px solid #eee; + height: 2.5*100rpx; +} + +.promotionGood .item .pictrue { + width: 1.88*100rpx; + height: 1.88*100rpx; +} + +.promotionGood .item .pictrue .image { + width: 100%; + height: 100%; + border-radius: 0.08*100rpx; +} + +.promotionGood .item .text { + font-size: 0.24*100rpx; + color: #999; + width: 4.72*100rpx; + text-align: left; +} + +.promotionGood .item .text .name { + font-size: 0.3*100rpx; + color: #333; +} + +.promotionGood .item .text .sp-money { + margin: 0.34*100rpx 0 0.2*100rpx 0; +} + +.promotionGood .item .text .sp-money .moneyCon { + padding: 0 0.18*100rpx; + background-color: #eb3729; + height: 0.46*100rpx; + line-height: 0.46*100rpx; + background-image: linear-gradient(to right, #eb3729 0%, #eb3729 100%); + font-size: 0.2*100rpx; + color: #fff; + background-image: -moz-linear-gradient(to right, #eb3729 0%, #eb3729 100%); + border-radius: 0.24*100rpx 0.03*100rpx 0.24*100rpx 0.03*100rpx; +} + +.promotionGood .item .text .sp-money .moneyCon .num { + font-size: 0.24*100rpx; +} + +.promotionGood .item .text .money { + text-decoration: line-through; +} + +.recommend { + background-color: #fff; +} + +.recommend .title { + height: 1.35*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.recommend .title .name { + margin: 0 0.28*100rpx; +} + +.recommend .title .iconfont { + font-size: 1.7*100rpx; + color: #454545; + height: 0.5*100rpx; + line-height: 0.5*100rpx; +} + +.recommend .title .iconfont.lefticon { + transform: rotate(180deg); +} + +.recommend .recommendList { + padding: 0 0.3*100rpx; +} + +.recommend .recommendList .item { + width: 3.35*100rpx; + margin-bottom: 0.3*100rpx; +} + +.recommend .recommendList .item .pictrue { + width: 100%; + height: 3.35*100rpx; +} + +.recommend .recommendList .item .pictrue .image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.recommend .recommendList .item .name { + font-size: 0.28*100rpx; + color: #282828; + margin-top: 0.2*100rpx; +} + +.recommend .recommendList .item .money { + font-size: 0.2*100rpx; + margin-top: 0.03*100rpx; +} + +.recommend .recommendList .item .money .num { + font-size: 0.28*100rpx; +} + +.noCommodity { + padding-top: 0.75*100rpx; +} + +.noCommodity .noPictrue { + width: 4.14*100rpx; + height: 3.36*100rpx; + margin: 0 auto 0.3*100rpx auto; +} + +.noCommodity .noPictrue .image { + width: 100%; + height: 100%; +} + +/*产品详情轮播*/ +.product-bg { + height: 7.5*100rpx; +} + +.product-bg swiper { + height: 7.5*100rpx; + +} + +.product-bg .slide-image { + width: 100%; + height: 100%; +} + +.product-bg .pages { + position: absolute; + background-color: #fff; + height: 0.34*100rpx; + padding: 0 0.1*100rpx; + border-radius: 0.03*100rpx; + right: 0.3*100rpx; + bottom: 0.3*100rpx; + line-height: 0.34*100rpx; + font-size: 0.24*100rpx; + color: #050505; + z-index: 9; +} + +/*评价列表公共*/ +.evaluateWtapper .evaluateItem { + background-color: #fff; + padding-bottom: 0.25*100rpx; +} + +.evaluateWtapper .evaluateItem~.evaluateItem { + border-top: 1px solid #f5f5f5; +} + +.evaluateWtapper .evaluateItem .pic-text { + font-size: 0.26*100rpx; + color: #282828; + height: 0.95*100rpx; + padding: 0 0.3*100rpx; +} + +.evaluateWtapper .evaluateItem .pic-text .pictrue { + width: 0.56*100rpx; + height: 0.56*100rpx; + margin-right: 0.2*100rpx; +} + +.evaluateWtapper .evaluateItem .pic-text .pictrue .image { + width: 100%; + height: 100%; + border-radius: 50%; +} + +.evaluateWtapper .evaluateItem .pic-text .name { + max-width: 4.5*100rpx; + margin-right: 0.15*100rpx; +} + +.evaluateWtapper .evaluateItem .time { + font-size: 0.24*100rpx; + color: #82848f; + padding: 0 0.3*100rpx; +} + +.evaluateWtapper .evaluateItem .evaluate-infor { + font-size: 0.28*100rpx; + color: #282828; + margin-top: 0.19*100rpx; + padding: 0 0.3*100rpx; +} + +.evaluateWtapper .evaluateItem .imgList { + padding: 0 0.3*100rpx 0 0.15*100rpx; + margin-top: 0.25*100rpx; +} + +.evaluateWtapper .evaluateItem .imgList .pictrue { + width: 1.56*100rpx; + height: 1.56*100rpx; + margin: 0 0 0.15*100rpx 0.15*100rpx; +} + +.evaluateWtapper .evaluateItem .imgList .pictrue .image { + width: 100%; + height: 100%; +} + +.evaluateWtapper .evaluateItem .reply { + font-size: 0.26*100rpx; + color: #454545; + background-color: #f7f7f7; + border-radius: 0.05*100rpx; + margin: 0.2*100rpx 0.3*100rpx 0 0.3*100rpx; + padding: 0.3*100rpx; + position: relative; +} + +.evaluateWtapper .evaluateItem .reply::before { + content: ""; + width: 0; + height: 0; + border-left: 0.1*100rpx solid transparent; + border-right: 0.1*100rpx solid transparent; + border-bottom: 0.2*100rpx solid #f7f7f7; + position: absolute; + top: -0.2*100rpx; + left: 1*100rpx; +} + +/*优惠券列表公共*/ + +.coupon-list { + padding: 0 0.3*100rpx; + margin-top: 0.25*100rpx; + box-sizing: border-box; +} + +.coupon-list .item { + width: 100%; + height: 1.7*100rpx; + margin-bottom: 0.16*100rpx; +} + +.coupon-list .item .money { + background-image: url('https://h5.yixiang.co/static/images/coupon1.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 2.4*100rpx; + height: 100%; + color: #fff; + font-size: 0.36*100rpx; + font-weight: bold; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.coupon-list .item .money.moneyGray { + background-image: url('https://h5.yixiang.co/static/images/coupon2.png'); +} + +.coupon-list .item .money .num { + font-size: 0.6*100rpx; +} + +.coupon-list .item .text { + width: 4.5*100rpx; + padding: 0 0.17*100rpx 0 0.24*100rpx; + background-color: #fff; + box-sizing: border-box; +} + +.coupon-list .item .text .condition { + font-size: 0.3*100rpx; + color: #282828; + height: 0.93*100rpx; + line-height: 0.93*100rpx; + border-bottom: 1px solid #f0f0f0; +} + +.coupon-list .item .text .data { + font-size: 0.2*100rpx; + color: #999; + height: 0.76*100rpx; +} + +.coupon-list .item .text .data .bnt { + width: 1.36*100rpx; + height: 0.44*100rpx; + border-radius: 0.22*100rpx; + font-size: 0.22*100rpx; + color: #fff; + text-align: center; + line-height: 0.44*100rpx; +} + +.coupon-list .item .text .data .bnt.gray { + background-color: #ccc; +} + +.condition .line-title { + width: 0.9*100rpx; + height: 0.3*100rpx; + line-height: 0.3*100rpx; + padding: 0 0.1*100rpx; + box-sizing: border-box; + background: rgba(255, 247, 247, 1); + border: 1rpx solid rgba(232, 51, 35, 1); + opacity: 1; + border-radius: 0.22*100rpx; + font-size: 0.2*100rpx !important; + color: #e83323; + margin-right: 0.12*100rpx; +} + +.coupon-list .pic-num { + color: #ffffff !important; + font-size: 0.24*100rpx !important; +} + +/*优惠券列表弹窗*/ +.coupon-list-window { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + background-color: #f5f5f5; + border-radius: 0.16*100rpx 0.16*100rpx 0 0; + z-index: 111; + transition: all .3s cubic-bezier(.25, .5, .5, .9); + -webkit-transition: all .3s cubic-bezier(.25, .5, .5, .9); + -moz-transition: all .3s cubic-bezier(.25, .5, .5, .9); + -o-transition: all .3s cubic-bezier(.25, .5, .5, .9); + transform: translate3d(0, 100%, 0); + -webkit-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); +} + +.coupon-list-window.on { + transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); +} + +.coupon-list-window .title { + height: 1.24*100rpx; + width: 100%; + text-align: center; + line-height: 1.24*100rpx; + font-size: 0.32*100rpx; + font-weight: bold; + position: relative; + color: #333; +} + +.coupon-list-window .title .iconfont { + position: absolute; + right: 0.3*100rpx; + top: 50%; + transform: translateY(-50%); + font-size: 0.35*100rpx; + color: #8a8a8a; + font-weight: normal; +} + +.coupon-list-window .coupon-list { + margin: 0 0 0.5*100rpx 0; + height: 5.5*100rpx; + overflow: auto; +} + +.coupon-list-window .pictrue { + width: 4.14*100rpx; + height: 3.36*100rpx; + margin: 0 auto 0.5*100rpx auto; +} + +.coupon-list-window .pictrue .image { + width: 100%; + height: 100%; +} + +/*详情首页弹窗*/ +.product-window { + position: fixed; + bottom: 0; + width: 100%; + left: 0; + background-color: #fff; + z-index: 88; + border-radius: 0.16*100rpx 0.16*100rpx 0 0; + padding-bottom: 1.4*100rpx; + transform: translate3d(0, 100%, 0); + transition: all .3s cubic-bezier(.25, .5, .5, .9); +} + +.product-window.on { + transform: translate3d(0, 0, 0); +} + +.product-window .textpic { + padding: 0 1.3*100rpx 0 0.3*100rpx; + margin-top: 0.29*100rpx; + position: relative; +} + +.product-window .textpic .pictrue { + width: 1.5*100rpx; + height: 1.5*100rpx; +} + +.product-window .textpic .pictrue .image { + width: 100%; + height: 100%; + border-radius: 0.1*100rpx; +} + +.product-window .textpic .text { + width: 4.1*100rpx; + font-size: 0.32*100rpx; + color: #202020; +} + +.product-window .textpic .text .money { + font-size: 0.24*100rpx; + margin-top: 0.4*100rpx; +} + +.product-window .textpic .text .money .num { + font-size: 0.36*100rpx; +} + +.product-window .textpic .text .money .stock { + color: #999; + margin-left: 0.18*100rpx; +} + +.product-window .textpic .iconfont { + position: absolute; + right: 0.3*100rpx; + top: -0.05*100rpx; + font-size: 0.35*100rpx; + color: #8a8a8a; +} + +.product-window .productWinList { + max-height: 3.95*100rpx; + overflow: auto; + margin-top: 0.36*100rpx; +} + +.product-window .productWinList .item~.item { + margin-top: 0.36*100rpx; +} + +.product-window .productWinList .item .title { + font-size: 0.3*100rpx; + color: #999; + padding: 0 0.3*100rpx; +} + +.product-window .productWinList .item .listn { + padding: 0 0.3*100rpx 0 0.16*100rpx; +} + +.product-window .productWinList .item .listn .itemn { + border: 1px solid #bbb; + font-size: 0.26*100rpx; + color: #282828; + padding: 0.07*100rpx 0.33*100rpx; + border-radius: 0.06*100rpx; + margin: 0.14*100rpx 0 0 0.14*100rpx; +} + +.product-window .productWinList .item .listn .itemn.on { + color: #fff; + background-color: #eb3729; + border-color: #eb3729; +} + +.product-window .cart { + margin-top: 0.36*100rpx; + padding: 0 0.3*100rpx; +} + +.product-window .cart .title { + font-size: 0.3*100rpx; + color: #999; +} + +.product-window .cart .carnum { + height: 0.54*100rpx; + margin-top: 0.24*100rpx; +} + +.product-window .cart .carnum .item { + border: 1px solid #a4a4a4; + width: 0.84*100rpx; + text-align: center; + height: 100%; + line-height: 0.54*100rpx; + color: #a4a4a4; + font-size: 0.45*100rpx; +} + +.product-window .cart .carnum .reduce { + border-right: 0; + border-radius: 0.06*100rpx 0 0 0.06*100rpx; + line-height: 0.48*100rpx; +} + +.product-window .cart .carnum .reduce.on { + border-color: #e3e3e3; + color: #dedede; +} + +.product-window .cart .carnum .plus { + border-left: 0; + border-radius: 0 0.06*100rpx 0.06*100rpx 0; + line-height: 0.46*100rpx; +} + +.product-window .cart .carnum .plus.on { + border-color: #e3e3e3; + color: #dedede; +} + +.product-window .cart .carnum .num { + color: #282828; + font-size: 0.28*100rpx; +} + +/*产品详情的分享红包*/ +.sharing-packets { + position: fixed; + left: 0.3*100rpx; + bottom: 1.5*100rpx; + z-index: 5; + transition: all 0.3s ease-in-out 0s; + opacity: 1; + transform: scale(1); +} + +.sharing-packets.on { + transform: scale(0); + opacity: 0; +} + +.sharing-packets .iconfont { + width: 0.44*100rpx; + height: 0.44*100rpx; + border-radius: 50%; + background-color: #999; + font-size: 0.2*100rpx; + color: #fff; + margin: 0 auto; + padding-left: 0.01*100rpx; +} + +.sharing-packets .line { + width: 0.02*100rpx; + height: 0.4*100rpx; + background-color: #999; + margin: 0 auto; +} + +.sharing-packets .sharing-con { + width: 1.87*100rpx; + height: 2.1*100rpx; + position: relative; +} + +.sharing-packets .sharing-con .image { + width: 100%; + height: 100%; +} + +.sharing-packets .sharing-con .text { + position: absolute; + top: 0.2*100rpx; + font-size: 0.2*100rpx; + width: 100%; + text-align: center; +} + +.sharing-packets .sharing-con .text .money { + font-size: 0.32*100rpx; + font-weight: bold; +} + +.sharing-packets .sharing-con .text .money .label { + font-size: 0.2*100rpx; +} + +.sharing-packets .sharing-con .text .tip { + font-size: 0.18*100rpx; + color: #999; +} + +.sharing-packets .sharing-con .text .shareBut { + font-size: 0.22*100rpx; + color: #fff; + margin-top: 0.27*100rpx; + height: 0.5*100rpx; + line-height: 0.5*100rpx; +} + +/*订单产品*/ +.orderGoods { + background-color: #fff; + margin-top: 0.12*100rpx; +} + +.orderGoods .total { + box-sizing: border-box; + + width: 100%; + height: 0.86*100rpx; + padding: 0 0.3*100rpx; + border-bottom: 0.01*100rpx solid #eee; + font-size: 0.3*100rpx; + color: #282828; + line-height: 0.86*100rpx; +} + +.goodWrapper .item { + margin-left: 0.3*100rpx; + padding-right: 0.3*100rpx; + border-bottom: 0.02*100rpx solid #f0f0f0; + height: 1.8*100rpx; +} + +.goodWrapper .item .pictrue { + width: 1.3*100rpx; + height: 1.3*100rpx; +} + +.goodWrapper .item .pictrue .image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.goodWrapper .item .text { + width: 5.37*100rpx; + position: relative; +} + +.goodWrapper .item .text .name { + font-size: 0.28*100rpx; + color: #282828; + width: 4.53*100rpx; +} + +.goodWrapper .item .text .num { + font-size: 0.26*100rpx; + color: #868686; +} + +.goodWrapper .item .text .attr { + font-size: 0.2*100rpx; + color: #868686; + margin-top: 0.07*100rpx; +} + +.goodWrapper .item .text .money { + font-size: 0.26*100rpx; + margin-top: 0.17*100rpx; +} + +.goodWrapper .item .text .evaluate { + position: absolute; + width: 1.14*100rpx; + height: 0.46*100rpx; + border: 1px solid #e93323; + color: #e93323; + border-radius: 0.04*100rpx; + text-align: center; + line-height: 0.46*100rpx; + right: 0; + bottom: -.1*100rpx; +} + +.goodWrapper .item .text .evaluate.userEvaluated { + font-size: 0.26*100rpx; + color: #aaa; + background-color: #f7f7f7; + border-color: #f7f7f7; +} + +/*地址弹窗*/ +.address-window { + background-color: #fff; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + z-index: 99; + transform: translate3d(0, 100%, 0); + transition: all .3s cubic-bezier(.25, .5, .5, .9); +} + +.address-window.on { + transform: translate3d(0, 0, 0); +} + +.address-window .title { + font-size: 0.32*100rpx; + font-weight: bold; + text-align: center; + height: 1.23*100rpx; + line-height: 1.23*100rpx; + position: relative; + color: #333; +} + +.address-window .title .iconfont { + position: absolute; + right: 0.3*100rpx; + color: #8a8a8a; + font-size: 0.35*100rpx; +} + +.address-window .list { + max-height: 6*100rpx; + overflow-y: auto; + overflow-x: hidden; +} + +.address-window .list .item { + margin-left: 0.3*100rpx; + padding-right: 0.3*100rpx; + border-bottom: 1px solid #eee; + height: 1.29*100rpx; + font-size: 0.25*100rpx; + color: #333; +} + +.address-window .list .item .iconfont { + font-size: 0.37*100rpx; + color: #2c2c2c; +} + +.address-window .list .item .iconfont.icon-complete { + font-size: 0.3*100rpx; + color: #fff; +} + +.address-window .list .item .addressTxt { + width: 5.6*100rpx; +} + +.address-window .list .item .addressTxt .name { + font-size: 0.28*100rpx; + font-weight: bold; + color: #282828; + margin-bottom: 0.04*100rpx; +} + +.address-window .list .item .addressTxt .name .phone { + margin-left: 0.18*100rpx; +} + +.address-window .addressBnt { + font-size: 0.3*100rpx; + font-weight: bold; + color: #fff; + width: 6.9*100rpx; + height: 0.86*100rpx; + border-radius: 0.43*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin: 0.85*100rpx auto; +} + +.address-window .pictrue { + width: 4.14*100rpx; + height: 3.36*100rpx; + margin: 0.8*100rpx auto; +} + +.address-window .pictrue .image { + width: 100%; + height: 100%; +} + +/*轮播图*/ +.swiper { + height: 2.82*100rpx; +} + +.swiper .slide-image { + width: 100%; + height: 100%; +} + +.swiper .swiper-pagination { + text-align: right; + padding-right: 0.4*100rpx; + bottom: 0.1*100rpx; + width: 100%; +} + +.swiper .swiper-pagination-bullet { + width: 0.12*100rpx; + height: 0.12*100rpx; + border: 0.02*100rpx solid #fff; + border-radius: 50%; + background-color: rgba(0, 0, 0, 0); + opacity: 1; +} + +.swiper .swiper-pagination-bullet~.swiper-pagination-bullet { + margin-left: 0.12*100rpx; +} + +.swiper .swiper-pagination-bullet-active { + border-color: #e93323; + background-color: #e93323; +} + +/**/ +.goodsStyle { + background-color: #fff; + padding: 0.22*100rpx 0.3*100rpx; +} + +.goodsStyle .pictrue { + width: 1.2*100rpx; + height: 1.2*100rpx; +} + +.goodsStyle .pictrue .image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.goodsStyle .text { + width: 5.45*100rpx; + font-size: 0.28*100rpx; + color: #999; +} + +.goodsStyle .text .name { + width: 3.6*100rpx; + color: #282828; +} + +.goodsStyle .text .money { + text-align: right; +} + +.goodsStyle .text .money .num { + margin-top: 0.07*100rpx; +} + +/*所有推广头部样式*/ +.promoterHeader { + width: 100%; + height: 2.2*100rpx; +} + +.promoterHeader .headerCon { + width: 100%; + height: 100%; + padding: 0 0.88*100rpx 0 0.55*100rpx; + font-size: 0.28*100rpx; + color: #fff; + background-image: url('https://h5.yixiang.co/static/images/transparent.png'); + background-repeat: no-repeat; + background-size: 100% 100%; +} + +.promoterHeader .headerCon .name { + margin-bottom: 0.02*100rpx; +} + +.promoterHeader .headerCon .num { + font-size: 0.5*100rpx; +} + +.promoterHeader .headerCon .iconfont { + font-size: 1.25*100rpx; +} + +/*首页优惠券弹窗*/ +.coupon-window { + background-image: url('http://admin-api.xdd618.com/file/pic/20210203151924111404.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 6.3*100rpx; + height: 6.49*100rpx; + position: fixed; + top: 20%; + z-index: 99; + left: 50%; + margin-left: -3.05*100rpx; + transform: translate3d(0, -200%, 0); + transition: all .3s cubic-bezier(.25, .5, .5, .9); +} + +.coupon-window.on { + transform: translate3d(0, 0, 0); +} + +.coupon-window .couponWinList { + width: 4.8*100rpx; + margin: 1.57*100rpx 0 0 0.6*100rpx; + height: 4.15*100rpx; + overflow: auto; +} + +.coupon-window .couponWinList .item { + width: 100%; + height: 1.2*100rpx; + background-color: #fff; + position: relative; + margin-bottom: 0.17*100rpx; +} + +.coupon-window .couponWinList .item::after { + content: ''; + position: absolute; + width: 0.18*100rpx; + height: 0.18*100rpx; + border-radius: 50%; + background-color: #eb3729; + left: 25.5%; + bottom: 0; + margin-bottom: -0.09*100rpx; +} + +.coupon-window .couponWinList .item::before { + content: ''; + position: absolute; + width: 0.18*100rpx; + height: 0.18*100rpx; + border-radius: 50%; + background-color: #eb3729; + left: 25.5%; + top: 0; + margin-top: -0.09*100rpx; +} + +.coupon-window .couponWinList .item .money { + width: 1.3*100rpx; + border-right: 1px dashed #ddd; + height: 100%; + text-align: center; + line-height: 1.2*100rpx; + font-size: 0.26*100rpx; + font-weight: bold; +} + +.coupon-window .couponWinList .item .money .num { + font-size: 0.4*100rpx; +} + +.coupon-window .couponWinList .item .text { + width: 3.49*100rpx; + font-size: 0.22*100rpx; + color: #999; + padding: 0 0.29*100rpx; +} + +.coupon-window .couponWinList .item .text .name { + font-size: 0.26*100rpx; + color: #282828; + font-weight: bold; + margin-bottom: 0.09*100rpx; +} + +.coupon-window .lid { + background-image: url('https://h5.yixiang.co/static/images/coupon-window2.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 5.73*100rpx; + height: 2.24*100rpx; + position: fixed; + left: 50%; + top: 20%; + margin: 4.24*100rpx 0 0 -2.96*100rpx; +} + +.coupon-window .lid .bnt { + font-size: 0.29*100rpx; + width: 4.4*100rpx; + height: 0.8*100rpx; + border-radius: 0.4*100rpx; + background-color: #f9f1d3; + text-align: center; + line-height: 0.8*100rpx; + font-weight: bold; + margin: 0.98*100rpx auto 0 auto; +} + +.coupon-window .lid .iconfont { + color: #fff; + font-size: 0.6*100rpx; + text-align: center; + margin-top: 0.87*100rpx; +} + +/*首页*/ +.index .header { + // height: 0.98*100rpx; + // width: 100%; + padding: 0 30rpx; + height: 364rpx; + box-sizing: border-box; + background-color: #FE5560; + position: relative; + // background-image: url('~@/static/images/paper-cuts-img.png'); + // background-position: center; + // background-repeat: no-repeat; + +} + +.index .header .logo { + width: 1.27*100rpx; + height: 0.45*100rpx; + margin-right: 0.25*100rpx; +} + +.index .header .logo image { + width: 100%; + height: 100%; + display: block; +} + +.index .header .search { + // width: 100%; + flex: 1; + box-sizing: border-box; + height: 0.64*100rpx; + background-color: rgba(255,255,255,0.2); + // border-radius: 0.5*100rpx; + padding: 0 0.28*100rpx; + font-size: 0.28*100rpx; + color: #fff; + + border:1px solid rgba(255,255,255,1); + border-radius:10*2rpx; +} + +.index .header .qr { + width: 0.34*150rpx; + height: 0.34*150rpx; + font-size: 0.34*100rpx; + margin-left: 0.16*100rpx; + margin-right: 0.16*100rpx; +} + +.index .header .qr image { + width: 0.34*150rpx; + height: 0.34*150rpx; +} + + +.index .header .search .iconfont { + font-size: 0.34*100rpx; + margin-right: 0.16*100rpx; +} + +.index .banner { + height: 3.75*100rpx; + +} + +.index .banner swiper { + height: 3.75*100rpx; + +} + +.index .banner image { + width: 100%; + height: 3.75*100rpx; + +} + +.index .banner .swiper-pagination { + bottom: 0.07*100rpx; +} + +.index .banner .swiper-pagination-bullet { + width: 0.2*100rpx; + height: 0.04*100rpx; + border-radius: 0.03*100rpx; + background-color: #fff; + opacity: 0.6; +} + +.index .banner .swiper-pagination-bullet-active { + opacity: 1; +} + +.index .nav { + padding-top: 0.26*100rpx; +} + +.index .nav .item { + width: 25%; + text-align: center; + font-size: 0.26*100rpx; + margin-bottom: 0.35*100rpx; +} + +.index .nav .item .pictrue { + width: 0.9*100rpx; + height: 0.9*100rpx; + margin: 0 auto 0.15*100rpx auto; +} + +.index .nav .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; +} + +.index .news { + height: 0.8*100rpx; + border-top: 1px solid #f4f4f4; + padding: 0 0.3*100rpx; + margin: 30rpx; + box-shadow: 0 0.1*100rpx 0.3*100rpx #f5f5f5; + -moz-box-shadow: 0 0.1*100rpx 0.3*100rpx #f5f5f5; + -o-box-shadow: 0 0.1*100rpx 0.3*100rpx #f5f5f5; + background:rgba(255,86,74,0.1); + border-radius:0px 20*2rpx 20*2rpx 20*2rpx; +} + +.index .news .pictrue { + width: 1.24*100rpx; + height: 0.28*100rpx; + border-right: 1px solid #ddd; + padding-right: 0.23*100rpx; + box-sizing: content-box; + -moz-box-sizing: content-box; +} + +.index .news .pictrue image { + width: 100%; + height: 100%; + display: block; +} + +.index .news .new-banner { + // width: 5.23*100rpx; + flex: 1; + overflow: hidden; + height: 0.8*100rpx; +} + +.index .news .new-banner .swiper-wrapper { + height: 0.8*100rpx; + width: 100%; +} + +.index .news .new-banner .swiper-slide { + height: 0.8*100rpx; + width: 100%; +} + +.index .news .new-banner .swiper-slide .swiper-item { + height: 0.8*100rpx; + width: 100%; +} + +.index .news .new-banner .text { + width: 4.8*100rpx; + height: 0.8*100rpx; +} + +.index .news .new-banner .text .label { + font-size: 0.2*100rpx; + color: #eb3729; + width: 0.68*100rpx; + height: 0.34*100rpx; + border-radius: 0.2*100rpx; + text-align: center; + line-height: 0.34*100rpx; + border: 0.02*100rpx solid #eb3729; +} + +.index .news .new-banner .text .newsTitle { + // width: 3.97*100rpx; + font-size: 0.28*100rpx; + color: #FF2E66; +} + +.index .news .new-banner .iconfont { + font-size: 0.28*100rpx; + color: #888; +} + +.index .specialArea { + padding: 0.3*100rpx; +} + +.index .specialArea .assemble { + width: 2.6*100rpx; + height: 2.6*100rpx; + position: relative; +} + +.index .specialArea .assemble image { + width: 100%; + height: 100%; + border-radius: 0.05*100rpx; +} + +.index .specialArea .assemble .text { + position: absolute; + top: 0.37*100rpx; + left: 0.22*100rpx; +} + +.index .specialArea .name { + font-size: 0.3*100rpx; + color: #fff; +} + +.index .specialArea .infor { + font-size: 0.22*100rpx; + color: rgba(255, 255, 255, 0.8); + margin-top: 0.05*100rpx; +} + +.index .specialArea .list { + height: 2.6*100rpx; + width: 4.16*100rpx; +} + +.index .specialArea .item { + width: 100%; + height: 1.24*100rpx; + position: relative; +} + +.index .specialArea .item image { + width: 100%; + height: 100%; +} + +.index .specialArea .item .text { + position: absolute; + top: 0.23*100rpx; + left: 0.28*100rpx; +} + +.index .wrapper .title { + border-top: 1px solid #eee; + padding-top: 0.34*100rpx; + margin: 0 0.3*100rpx; + + &.no-border { + border: 0; + } +} + +.index .wrapper.hot+.wrapper { + border-top: 0; +} + +.index .wrapper .goodList { + margin-bottom: 0.34*100rpx; +} + +.index .wrapper .title .text { + font-size: 0.24*100rpx; + color: #999; + width: 5.3*100rpx; + text-align: left; +} + +.index .wrapper .title .text .name { + color: #282828; + font-size: 0.3*100rpx; + font-weight: bold; + margin-bottom: 0.05*100rpx; + position: relative; +} + +.index .wrapper .title .text .name .new { + position: absolute; + top: 0.02*100rpx; + left: 1.3*100rpx; + font-size: 0.16*100rpx; + font-weight: bold; +} + +.index .wrapper .title .more { + font-size: 0.26*100rpx; + color: #333; +} + +.index .wrapper .title .more .iconfont { + margin-left: 0.02*100rpx; + font-size: 0.26*100rpx; +} + +.index .wrapper .scroll-product { + white-space: nowrap; + margin-top: 0.38*100rpx; + padding: 0 0.3*100rpx 0.37*100rpx 0.3*100rpx; + overflow: hidden; +} + +.index .wrapper .scroll-product .swiper-slide { + width: 1.8*100rpx; + display: inline-block; + margin-right: 0.19*100rpx; + border-bottom: 0.04*100rpx solid #47b479; + box-shadow: 0 0.15*100rpx 0.15*100rpx -0.1*100rpx #eee; + -moz-box-shadow: 0 0.15*100rpx 0.15*100rpx -0.1*100rpx #eee; + -o-box-shadow: 0 0.15*100rpx 0.15*100rpx -0.1*100rpx #eee; +} + +.index .wrapper .scroll-product .swiper-slide:nth-of-type(3n) { + border-bottom: 0.04*100rpx solid #ff6960; +} + +.index .wrapper .scroll-product .swiper-slide:nth-of-type(3n-1) { + border-bottom: 0.04*100rpx solid #579afe; +} + +.index .wrapper .scroll-product .swiper-slide:nth-last-child(1) { + margin-right: 0; +} + +.index .wrapper .scroll-product .swiper-slide .img-box { + width: 100%; + height: 1.8*100rpx; +} + +.index .wrapper .scroll-product .swiper-slide .img-box image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx 0.06*100rpx 0 0; +} + +.index .wrapper .scroll-product .swiper-slide .pro-info { + font-size: 0.24*100rpx; + color: #282828; + text-align: center; + height: 0.6*100rpx; + line-height: 0.6*100rpx; + border: 1px solid #f5f5f5; + border-bottom: 0; + border-top: 0; + padding: 0 0.1*100rpx; +} + +.index .wrapper .boutique { + width: 6.9*100rpx; + height: 2.9*100rpx; + margin: 0.28*100rpx auto 0 auto; +} + +.index .wrapper .boutique { + width: 6.9*100rpx; + height: 2.9*100rpx; + margin: 0.28*100rpx auto 0 auto; +} + +.index .wrapper .boutique image { + width: 100%; + height: 2.6*100rpx; +} + +.index .wrapper .boutique .swiper-pagination { + bottom: -0.08*100rpx; + width: 100%; +} + +.index .wrapper .boutique .swiper-pagination-bullet { + width: 0.07*100rpx; + height: 0.07*100rpx; + border-radius: 50%; + background-color: #fc4141; + opacity: 0.3; +} + +.index .wrapper .boutique .swiper-pagination-bullet~.swiper-pagination-bullet { + margin-left: 0.1*100rpx; +} + +.index .wrapper .boutique .swiper-pagination-bullet-active { + width: 0.2*100rpx; + height: 0.07*100rpx; + border-radius: 0.035*100rpx; + opacity: 1 +} + +.index .hotList .hot-bg { + width: 100%; + height: 2.15*100rpx; + background-image: url('https://h5.yixiang.co/static/images/index-bg.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + padding: 0 0.3*100rpx; + font-size: 0.24*100rpx; + color: #fff; + margin-top: 0.15*100rpx; +} + +.index .hotList .hot-bg .title { + height: 0.87*100rpx; +} + +.index .hotList .hot-bg .title .text { + width: 5.75*100rpx; +} + +.index .hotList .hot-bg .title .text .label { + font-size: 0.3*100rpx; + font-weight: bold; + margin-right: 0.2*100rpx; +} + +.index .hotList .hot-bg .title .more { + font-size: 0.26*100rpx; + color: #fff; +} + +.index .hotList .hot-bg .title .more .iconfont { + font-size: 0.25*100rpx; + vertical-align: 0.02*100rpx; + margin-left: 0.1*100rpx; +} + +.index .hotList .list { + width: 6.9*100rpx; + height: 3.3*100rpx; + border-radius: 0.2*100rpx; + background-color: #fff; + margin: -1.28*100rpx auto 0 auto; + padding: 0 0.22*100rpx; + box-shadow: 0 0 0.2*100rpx -0.1*100rpx #aaa; + -moz-box-shadow: 0 0 0.2*100rpx -0.1*100rpx #aaa; + -o-box-shadow: 0 0 0.2*100rpx -0.1*100rpx #aaa; +} + +.index .hotList .list .item { + width: 2*100rpx; + text-align: left; +} + +.index .hotList .list .item~.item { + margin-left: 0.23*100rpx; +} + +.index .hotList .list .item .pictrue { + width: 100%; + height: 2*100rpx; + position: relative; +} + +.index .hotList .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.1*100rpx; +} + +.index .hotList .list .item .pictrue .numPic { + width: 0.5*100rpx; + height: 0.5*100rpx; + border-radius: 50%; + position: absolute; + top: 0.07*100rpx; + left: 0.07*100rpx; +} + +.index .hotList .list .item .name { + font-size: 0.26*100rpx; + color: #282828; + margin-top: 0.12*100rpx; +} + +.index .hotList .list .item .money { + font-size: 0.2*100rpx; + font-weight: bold; + margin-top: 0.02*100rpx; +} + +.index .hotList .list .item .money .num { + font-size: 0.28*100rpx; +} + +.index .adver { + width: 100%; + height: 1.8*100rpx; + margin-top: 0.37*100rpx; +} + +.index .adver image { + width: 100%; + height: 100%; + display: block; +} + +.index .hot { + position: relative; + background: none; +} + +.index .hot .title { + position: relative; + z-index: 9; +} + +.index .hot .title .text .name { + color: #fff; +} + +.index .hot .title .more { + color: #fff; +} + +.index .hot .title .more .iconfont { + color: #fff; +} + +.index .hot .bg { + width: 100%; + position: absolute; + left: 0; + top: 0; + right: 0; +} + +.index .wrapper.hot .newProducts .newProductsItem { + border: 0; +} + +.index .wrapper.hot .newProducts { + white-space: nowrap; + padding: 0 0.3*100rpx; + margin: 0.35*100rpx; + overflow: hidden; + background-color: #fff; + padding: .3*100rpx; + z-index: 99; + position: relative; + margin-bottom: 0; + border-radius: .2*100rpx; + box-shadow: 0 0 .2*100rpx -.1*100rpx #aaa; +} + +.index .wrapper .newProducts { + white-space: nowrap; + padding: 0 0.3*100rpx; + margin: 0.35*100rpx 0 0.42*100rpx 0; + overflow: hidden; +} + +.index .wrapper .newProducts .swiper-wrapper { + height: 350rpx; +} + +.index .wrapper .newProducts {} + +.index .wrapper.hot .newProducts .newProductsItem { + width: 2.4*100rpx; + min-width: 2.4*100rpx; + margin-right: 0.2*100rpx; + flex: 0 2.4*100rpx; +} + +.index .wrapper .newProducts .newProductsScroll { + display: flex; + flex-direction: row; +} + +.index .wrapper.hot .newProducts .newProductsItem image { + width: 2.4*100rpx; + height: 2.4*100rpx; +} + +.index .wrapper .newProducts .newProductsItem { + border: 1rpx solid #eee; + width: 2.4*100rpx; + min-width: 2.4*100rpx; + border-radius: 0.12*100rpx; + overflow: hidden; + margin-right: .2*100rpx; + flex: 0 2.4*100rpx; +} + +.index .wrapper .newProducts:nth-last-child(1) {} + +.index .wrapper .newProducts .img-box { + width: 100%; + height: 2.4*100rpx; +} + +.index .wrapper.hot .newProducts .img-box { + width: 2.4*100rpx; +} + +.index .wrapper .newProducts .img-box image { + width: 100%; + height: 100%; + border-radius: 0.12*100rpx 0.12*100rpx 0 0; +} + +.index .wrapper.hot .newProducts .img-box image { + border-radius: 0.12*100rpx; +} + +.index .wrapper .newProducts .pro-info { + font-size: 0.28*100rpx; + color: #333; + text-align: center; + padding: 0.15*100rpx 0.1*100rpx 0 0.1*100rpx; +} + +.index .wrapper .newProducts .money { + padding: 0 0.1*100rpx 0.18*100rpx 0.1*100rpx; + text-align: center; + font-size: 0.26*100rpx; + font-weight: bold; +} + +.index .wrapper.hot .newProducts .pro-info { + text-align: left; +} + +.index .wrapper.hot .newProducts .money { + text-align: left; +} + +/*商品列表*/ +.productList .search { + width: 100%; + height: 0.86*100rpx; + padding-left: 0.23*100rpx; + padding-right: 0.23*100rpx; + position: fixed; + left: 0; + top: 0; + z-index: 5; + box-sizing: border-box; +} + +.productList .search .input { + flex: 1; + height: 0.6*100rpx; + background-color: #fff; + border-radius: 0.5*100rpx; + padding: 0 0.2*100rpx; + margin-right: 0.23*100rpx; +} + +.productList .search .input input { + width: 5.48*100rpx; + height: 100%; + font-size: 0.26*100rpx; +} + +.productList .search .input input::placeholder { + color: #999; +} + +.productList .search .input .iconfont { + font-size: 0.35*100rpx; + color: #555; +} + +.productList .search .icon-pailie, +.productList .search .icon-tupianpailie { + margin: 0 auto; + color: #fff; + width: 0.4*100rpx; + font-size: 0.4*100rpx; + height: 0.86*100rpx; + line-height: 0.86*100rpx; +} + +.productList .nav { + height: 0.86*100rpx; + color: #454545; + position: fixed; + left: 0; + width: 100%; + font-size: 0.28*100rpx; + background-color: #fff; + top: 0.86*100rpx; + z-index: 5; +} + +.productList .nav .item { + width: 25%; + text-align: center; +} + +.productList .nav .item.font-color { + font-weight: bold; +} + +.productList .nav .item image { + width: 0.15*100rpx; + height: 0.19*100rpx; + margin-left: 0.1*100rpx; +} + +.productList .list { + padding: 0 0.2*100rpx; + margin-top: 1.72*100rpx; +} + +.productList .list.on { + background-color: #fff; + border-top: 1px solid #f6f6f6; +} + +.productList .list .item { + width: 3.45*100rpx; + margin-top: 0.2*100rpx; + background-color: #fff; + border-radius: 0.1*100rpx; +} + +.productList .list .item.on { + width: 100%; + display: flex; + border-bottom: 1px solid #f6f6f6; + padding: 0.3*100rpx 0; + margin: 0; +} + +.productList .list .item .pictrue { + width: 100%; + height: 3.45*100rpx; +} + +.productList .list .item .pictrue.on { + width: 1.8*100rpx; + height: 1.8*100rpx; +} + +.productList .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.1*100rpx 0.1*100rpx 0 0; +} + +.productList .list .item .pictrue img.on { + border-radius: 0.06*100rpx; +} + +.productList .list .item .text { + padding: 0.2*100rpx 0.17*100rpx 0.26*100rpx 0.17*100rpx; + font-size: 0.3*100rpx; + color: #222; + text-align: left; +} + +.productList .list .item .text.on { + width: 5.08*100rpx; + padding: 0 0 0 0.22*100rpx; +} + +.productList .list .item .text .money { + font-size: 0.26*100rpx; + font-weight: bold; + margin-top: 0.08*100rpx; +} + +.productList .list .item .text .money.on { + margin-top: 0.4*100rpx; +} + +.productList .list .item .text .money .num { + font-size: 0.34*100rpx; +} + +.productList .list .item .text .vip { + font-size: 0.22*100rpx; + color: #aaa; + margin-top: 0.07*100rpx; +} + +.productList .list .item .text .vip.on { + margin-top: 0.11*100rpx; +} + +.productList .list .item .text .vip .vip-money { + font-size: 0.24*100rpx; + color: #282828; + font-weight: bold; + text-decoration: line-through; +} + +.productList .list .item .text .vip .vip-money image { + width: 0.46*100rpx; + height: 0.21*100rpx; + margin-left: 0.04*100rpx; +} + +/*购物车*/ +.shoppingCart .labelNav { + box-sizing: border-box; + height: 0.76*100rpx; + padding: 0 0.3*100rpx; + font-size: 0.22*100rpx; + color: #8c8c8c; + position: fixed; + left: 0; + width: 100%; + background-color: #f5f5f5; + z-index: 5; + top: 0; +} + +.shoppingCart .labelNav .item .iconfont { + font-size: 0.25*100rpx; + margin-right: 0.1*100rpx; +} + +.shoppingCart .nav { + box-sizing: border-box; + width: 100%; + height: 0.8*100rpx; + background-color: #fff; + padding: 0 0.3*100rpx; + font-size: 0.28*100rpx; + color: #282828; + position: fixed; + left: 0; + z-index: 5; + //top: 0.88*100rpx; + // top: 1.28*100rpx; + border-bottom: 1px solid #f5f5f5; +} + +.shoppingCart .nav .administrate { + font-size: 0.26*100rpx; + color: #282828; + width: 1.1*100rpx; + height: 0.46*100rpx; + // border-radius: 0.06*100rpx; + // border: 1px solid #868686; +} + +.shoppingCart .noCart { + //margin-top: 1.71*100rpx; + margin-top: 0.88*100rpx; + background-color: #fff; + padding: 0.78*100rpx 0 0.56*100rpx 0; +} + +.shoppingCart .noCart .pictrue { + width: 4.14*100rpx; + height: 3.36*100rpx; + margin: 0 auto; +} + +.shoppingCart .noCart .pictrue image { + width: 100%; + height: 100%; +} + +.shoppingCart .list { + // margin-top: 1.71*100rpx; + //padding-top: 0.8*100rpx; +} + +.shoppingCart .list .item { + padding: 0.25*100rpx 0.3*100rpx; + background-color: #fff; + margin-bottom: 0.15*100rpx; +} + +.shoppingCart .list .item .picTxt { + width: 6.27*100rpx; + position: relative; +} + +.shoppingCart .list .item .picTxt .pictrue { + width: 1.6*100rpx; + height: 1.6*100rpx; +} + +.shoppingCart .list .item .picTxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.shoppingCart .list .item .picTxt .text { + width: 4.44*100rpx; + font-size: 0.28*100rpx; + color: #282828; + text-align: left; +} + +.shoppingCart .list .item .picTxt .text .infor { + font-size: 0.24*100rpx; + color: #868686; + margin-top: 0.16*100rpx; +} + +.shoppingCart .list .item .picTxt .text .money { + font-size: 0.32*100rpx; + color: #282828; + margin-top: 0.26*100rpx; +} + +.shoppingCart .list .item .picTxt .carnum { + height: 0.44*100rpx; + position: absolute; + bottom: 0.05*100rpx; + right: 0; +} + +.shoppingCart .list .item .picTxt .carnum view { + // border: 1px solid #a4a4a4; + width: 0.66*100rpx; + text-align: center; + height: 100%; + line-height: 0.44*100rpx; + font-size: 0.28*100rpx; + color: #a4a4a4; +} + +.shoppingCart .list .item .picTxt .carnum .reduce { + border-right: 0; + border-radius: 0.03*100rpx 0 0 0.03*100rpx; + line-height: 0.39*100rpx; +} + +.shoppingCart .list .item .picTxt .carnum .reduce.on { + border-color: #e3e3e3; + color: #dedede; +} + +.shoppingCart .list .item .picTxt .carnum .plus { + border-left: 0; + border-radius: 0 0.03*100rpx 0.03*100rpx 0; + line-height: 0.38*100rpx; +} + +.shoppingCart .list .item .picTxt .carnum .num { + color: #282828; +} + +.shoppingCart .invalidGoods { + background-color: #fff; +} + +.shoppingCart .invalidGoods .goodsNav { + box-sizing: border-box; + width: 100%; + height: 0.66*100rpx; + padding: 0 0.3*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.shoppingCart .invalidGoods .goodsNav .iconfont { + color: #424242; + font-size: 0.28*100rpx; + margin-right: 0.17*100rpx; +} + +.shoppingCart .invalidGoods .goodsNav .del { + font-size: 0.26*100rpx; + color: #999; +} + +.shoppingCart .invalidGoods .goodsNav .del .icon-shanchu1 { + color: #999; + font-size: 0.33*100rpx; + vertical-align: -0.02*100rpx; + margin-right: 0.08*100rpx; +} + +.shoppingCart .invalidGoods .goodsList .item { + padding: 0.2*100rpx 0.3*100rpx; + border-top: 1px solid #f5f5f5; +} + +.shoppingCart .invalidGoods .goodsList .item .invalid { + font-size: 0.22*100rpx; + color: #fff; + width: 0.7*100rpx; + height: 0.36*100rpx; + background-color: #aaa; + border-radius: 0.03*100rpx; +} + +.shoppingCart .invalidGoods .goodsList .item .pictrue { + width: 1.4*100rpx; + height: 1.4*100rpx; +} + +.shoppingCart .invalidGoods .goodsList .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.shoppingCart .invalidGoods .goodsList .item .text { + width: 4.33*100rpx; + font-size: 0.28*100rpx; + color: #999; + height: 1.4*100rpx; + text-align: left; +} + +.shoppingCart .invalidGoods .goodsList .item .text .infor { + font-size: 0.24*100rpx; +} + +.shoppingCart .invalidGoods .goodsList .item .text .end { + font-size: 0.26*100rpx; + color: #bbb; +} + +.shoppingCart .footer { + box-sizing: border-box; + width: 100%; + height: 1.26*100rpx; + // background-color: #fafafa; + position: fixed; + bottom: 0; + /* #ifdef H5 */ + bottom: var(--window-bottom); + /* #endif */ + + +} + +.shoppingCart .footer-content{ + padding: 0 0.3*100rpx; + margin-left: 0.3*100rpx; + margin-right: 0.3*100rpx; + height: 0.96*100rpx; + box-sizing: border-box; + + background:linear-gradient(139deg,rgba(255,149,141,1) 0%,rgba(255,92,138,1) 100%); + border-radius:0.48*100rpx; + +} + +.shoppingCart .iphonex-footer { + bottom: 168rpx; + +} + +.shoppingCart .footer .checkAll { + font-size: 0.28*100rpx; + color: #fff; + margin-left: 0.1*100rpx; +} + +.shoppingCart .footer .money { + font-size: 0.3*100rpx; +} + +.shoppingCart .footer .placeOrder { + color: #fff; + font-size: 0.3*100rpx; + // width: 2.26*100rpx; + // height: 0.7*100rpx; + // border-radius: 0.5*100rpx; + // text-align: center; + // line-height: 0.7*100rpx; + // margin-left: 0.22*100rpx; +} + +.shoppingCart .footer .button .bnt { + font-size: 0.28*100rpx; + color: #fff; + // border-radius: 0.5*100rpx; + // border: 1px solid #999; + // width: 1.6*100rpx; + // height: 0.6*100rpx; + // line-height: 0.6*100rpx; + text-align: center; +} + +.shoppingCart .footer .button .bnt~.bnt { + margin-left: 0.17*100rpx; +} + +/*个人中心*/ +.user .header { + padding: 0 0.3*100rpx; + // height: 1.9*100rpx; + position: relative; +} + +// .user .header:after { +// position: absolute; +// left: 0; +// right: 0; +// bottom: -0.98*100rpx; +// z-index: -1; +// content: ''; +// height: 1*100rpx; +// width: 100%; +// border-radius: 0 0 50% 50%; +// background-color: #eb3729; +// } + +.user .header .picTxt .pictrue { + width: 1.2*100rpx; + height: 1.2*100rpx; +} + +.user .header .picTxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; + border: 0.03*100rpx solid #f5f5f5; +} + +.user .header .picTxt .text { + width: 4.34*100rpx; + color: rgba(255, 255, 255, 1); + margin-left: 0.35*100rpx; + text-align: left; +} + +.user .header .picTxt .text .name { + font-size: 0.32*100rpx; + max-width: 2.6*100rpx; + width: unset; +} + +.user .header .picTxt .text .member { + padding: 0 0.1*100rpx; + height: 0.36*100rpx; + background-color: rgba(0, 0, 0, 0.2); + font-size: 0.2*100rpx; + border-radius: 0.3*100rpx; + margin-left: 0.17*100rpx; +} + +.user .header .picTxt .text .member image { + width: 0.28*100rpx; + height: 0.28*100rpx; + font-size: 0.2*100rpx; + margin-right: 0.08*100rpx; +} + +.user .header .picTxt .text .id { + color: rgba(255, 255, 255, 0.6); + font-size: 0.26*100rpx; + margin-top: 0.15*100rpx; +} + +.user .header .picTxt .text .id .iconfont { + font-size: 0.3*100rpx; + margin-left: 0.12*100rpx; +} + +.user .header .icon-shezhi { + font-size: 0.36*100rpx; + color: #fff; + margin-top: -0.52*100rpx; +} + +.user .wrapper { + padding: 0 0.2*100rpx; +} + +.user .wrapper .nav { + background-color: #fff; + border-radius: 0.06*100rpx; + height: 1.4*100rpx; +} + +.user .wrapper .nav .item { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; + font-size: 0.26*100rpx; + color: #aaa; + position: relative; + +} + +.user .wrapper .nav .item text { + display: block; + +} + +.user .wrapper .nav .item~.item:after { + position: absolute; + content: ''; + left: 0; + width: 1px; + height: 0.7*100rpx; + background-color: #eee; + top: 50%; + margin-top: -0.35*100rpx; +} + +.user .wrapper .nav .item .num { + margin-top: 0.1*100rpx; + font-size: 0.36*100rpx; + color: #282828; +} + +.user .wrapper .myOrder { + background-color: #fff; + border-radius: 0.1*100rpx; + margin-top: 0.15*100rpx; +} + +.user .wrapper .myOrder .title, +.user .wrapper .myService .title { + height: 0.88*100rpx; + padding: 0 0.3*100rpx; + border-bottom: 1px dashed #eee; + font-size: 0.3*100rpx; + color: #282828; +} + +.user .wrapper .myOrder .title .allOrder { + font-size: 0.26*100rpx; + color: #666; +} + +.user .wrapper .myOrder .title .allOrder .iconfont { + font-size: 0.25*100rpx; + margin-left: 0.07*100rpx; +} + +.user .wrapper .myOrder .orderState { + height: 1.6*100rpx; +} + +.user .wrapper .myOrder .orderState .item { + font-size: 0.26*100rpx; + color: #454545; + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; +} + +.user .wrapper .myOrder .orderState .item .pictrue { + width: 0.49*100rpx; + height: 0.42*100rpx; + margin: 0 auto 0.18*100rpx auto; +} + +.user .wrapper .myOrder .orderState .item .pictrue image { + width: 100%; + height: 100%; +} + +.user .wrapper .myService { + background-color: #fff; + margin-top: 0.15*100rpx; + border-radius: 0.1*100rpx; +} + +.user .wrapper .myService .serviceList { + padding: 0.08*100rpx 0 0.27*100rpx 0; +} + +.user .wrapper .myService .serviceList .item { + width: 100%; + text-align: left; + font-size: 0.26*100rpx; + color: #333; + display: flex; + align-items: center; + padding: 0.2*100rpx 0.3*100rpx; + position: relative; + + .iconfont { + font-size: .26*100rpx; + color: #666; + } + + &::after { + content: ""; + display: block; + position: absolute; + left: 0.3*100rpx; + right: 0; + bottom: 0; + border-bottom: 1rpx solid #f5f5f5; + z-index: 999; + height: 1rpx; + + } +} + +.user .wrapper .myService .serviceList .item .pictrue { + width: 0.52*100rpx; + height: 0.52*100rpx; + margin-right: 0.16*100rpx; +} + +.user .wrapper .myService .serviceList .item .cell { + flex: 1 +} + +.user .wrapper .myService .serviceList .item .pictrue image { + width: 100%; + height: 100%; +} + +.user .support { + width: 2.19*100rpx; + height: 0.74*100rpx; + margin: 0.54*100rpx auto; + display: block; +} + +/*所有产品的详情公用部分*/ +.product-con .wrapper { + background-color: #fff; +} + +//.product-con .wrapper .share { +// margin: 0 0.3*100rpx; +// padding-top: 0.25*100rpx; +//} + +.product-con .wrapper .share .money { + font-size: 0.28*100rpx; + font-weight: bold; +} + +//.product-con .wrapper .share .money .num { +// font-size: 0.48*100rpx; +//} + +.product-con .wrapper .share .money .vip-money { + color: #282828; + margin-left: 0.13*100rpx; +} + +.product-con .wrapper .share .money .image { + width: 0.46*100rpx; + height: 0.21*100rpx; + margin-left: 0.07*100rpx; +} + +.product-con .wrapper .share .money .vip-money { + color: #282828; + margin-left: 0.13*100rpx; +} + +.product-con .wrapper .share .iconfont { + color: #515151; + font-size: 0.4*100rpx; + margin-bottom: 0.1*100rpx; +} + +//.product-con .wrapper .introduce { +// font-size: 0.32*100rpx; +// font-weight: bold; +// margin: 0.1*100rpx 0.3*100rpx 0 0.3*100rpx; +//} + +.product-con .wrapper .label { + margin: 0.22*100rpx 0.3*100rpx 0 0.3*100rpx; + font-size: 0.24*100rpx; + color: #82848f; + padding-bottom: 0.25*100rpx; +} + +.product-con .wrapper .coupon { + padding: 0 0.3*100rpx; + border-top: 1px solid #f5f5f5; + height: 0.8*100rpx; + font-size: 0.26*100rpx; + color: #82848f; +} + +.product-con .wrapper .coupon .hide { + width: 5.4*100rpx; + height: 0.8*100rpx; + line-height: 0.8*100rpx; +} + +.product-con .wrapper .coupon .activity { + height: 0.4*100rpx; + padding: 0 0.2*100rpx; + border: 1px solid #f2857b; + color: #e93323; + font-size: 0.24*100rpx; + line-height: 0.4*100rpx; + position: relative; + margin: 0.19*100rpx 0 0.19*100rpx 0.15*100rpx; +} + +.product-con .wrapper .coupon .activity:before { + content: ' '; + position: absolute; + width: 0.07*100rpx; + height: 0.1*100rpx; + border-radius: 0 0.07*100rpx 0.07*100rpx 0; + border: 1px solid #f2857b; + background-color: #fff; + bottom: 50%; + left: -0.02*100rpx; + margin-bottom: -0.07*100rpx; + border-left-color: #fff; +} + +.product-con .wrapper .coupon .activity:after { + content: ' '; + position: absolute; + width: 0.07*100rpx; + height: 0.1*100rpx; + border-radius: 0.07*100rpx 0 0 0.07*100rpx; + border: 1px solid #f2857b; + background-color: #fff; + right: -0.02*100rpx; + bottom: 50%; + margin-bottom: -0.05*100rpx; + border-right-color: #fff; +} + +.product-con .wrapper .coupon .iconfont { + color: #7a7a7a; + font-size: 0.28*100rpx; +} + +.product-con .attribute { + background-color: #fff; + padding: 0 0.3*100rpx; + font-size: 0.26*100rpx; + color: #82848f; + margin-top: 0.2*100rpx; + height: 0.8*100rpx; +} + +.product-con .attribute .atterTxt { + font-size: 0.28*100rpx; + color: #282828; +} + +.product-con .attribute .iconfont { + font-size: 0.28*100rpx; + color: #7a7a7a; +} + +.product-con .userEvaluation { + margin-top: 0.2*100rpx; + background-color: #fff; +} + +.product-con .userEvaluation .title { + height: 0.86*100rpx; + border-bottom: 1px solid #eee; + font-size: 0.28*100rpx; + color: #282828; + margin-left: 0.3*100rpx; + padding-right: 0.3*100rpx; +} + +.product-con .userEvaluation .title .praise { + font-size: 0.28*100rpx; + color: #808080; +} + +.product-con .userEvaluation .title .praise .iconfont { + color: #7a7a7a; + font-size: 0.28*100rpx; + vertical-align: 0.01*100rpx; + margin-left: 0.08*100rpx; +} + +.product-con .product-intro { + margin-top: 0.2*100rpx; +} + +.product-con .product-intro .title { + font-size: 0.3*100rpx; + color: #282828; + height: 0.86*100rpx; + width: 100%; + background-color: #fff; + text-align: center; + line-height: 0.86*100rpx; +} + +.product-con .product-intro .conter { + width: 100%; +} + +.product-con .product-intro .conter * { + width: 100% !important; + display: block !important; +} + +/*产品详情*/ +.product-con .footer { + box-sizing: border-box; + padding: 0 0.2*100rpx 0 0.3*100rpx; + position: fixed; + bottom: 0; + width: 100%; + height: 1*100rpx; + background-color: #fff; + z-index: 99; + border-top: 1px solid #f0f0f0; +} + +.product-con .footer .item { + font-size: 0.18*100rpx; + color: #666; + margin-top: 0.07*100rpx; +} + +.product-con .footer .item .iconfont { + text-align: center; + font-size: 0.4*100rpx; + height: 0.4*100rpx; + line-height: 0.4*100rpx; +} + +.product-con .footer .item .iconfont.icon-gouwuche1 { + position: relative; +} + +.product-con .footer .item .iconfont.icon-gouwuche1 .num { + color: #fff; + position: absolute; + font-size: 0.18*100rpx; + border-radius: 2*100rpx; + top: -0.1*100rpx; + right: 0; + height: 0.3*100rpx; + line-height: 0.3*100rpx; + padding: 0 0.08*100rpx; + min-width: 0.3*100rpx; +} + +.product-con .footer .bnt { + width: 4.44*100rpx; + height: 0.76*100rpx; + color: #fff; + font-size: 0.28*100rpx; +} + +.product-con .footer .bnt>view { + width: 2.22*100rpx; + text-align: center; + line-height: 0.76*100rpx; +} + +//.product-con .footer .bnt .joinCart { + // border-radius: 0.5*100rpx 0 0 0.5*100rpx; + // background-image: linear-gradient(to right, #fea10f 0%, #fea10f 100%); + // background-image: -moz-linear-gradient(to right, #eb3729 0%, #eb3729 100%); +//} + +//.product-con .footer .bnt .buy { + // border-radius: 0 0.5*100rpx 0.5*100rpx 0; + // background-image: linear-gradient(to right, #eb3729 0%, #eb3729 100%); + // background-image: -moz-linear-gradient(to right, #eb3729 0%, #eb3729 100%); +//} + +/*订单提交*/ +.order-submission .line { + width: 100%; + height: 0.03*100rpx; +} + +.order-submission .line image { + width: 100%; + height: 100%; + display: block; +} + +.order-submission .address { + padding: 0.28*100rpx 0.3*100rpx; + background-color: #fff; +} + +.order-submission .address .addressCon { + width: 6.1*100rpx; + font-size: 0.26*100rpx; + color: #666; +} + +.order-submission .address .addressCon .name { + font-size: 0.3*100rpx; + color: #282828; + font-weight: bold; + margin-bottom: 0.1*100rpx; +} + +.order-submission .address .addressCon .name .phone { + margin-left: 0.5*100rpx; +} + +.order-submission .address .addressCon .default { + margin-right: 0.12*100rpx; +} + +.order-submission .address .addressCon .setaddress { + color: #333; + font-size: 0.28*100rpx; +} + +.order-submission .address .iconfont { + font-size: 0.35*100rpx; + color: #707070; +} + +.order-submission .wrapper { + background-color: #fff; + margin-top: 0.13*100rpx; +} + +.order-submission .wrapper .item { + padding: 0.27*100rpx 0.3*100rpx; + font-size: 0.3*100rpx; + color: #282828; + border-bottom: 1px solid #f0f0f0; +} + +.order-submission .wrapper .item .discount { + font-size: 0.3*100rpx; + color: #999; + width: 5*100rpx; + text-align: right; +} + +.order-submission .wrapper .item .discount .integral { + margin-right: 0.4*100rpx; +} + +.order-submission .wrapper .item .discount .checkbox-wrapper .icon { + right: 0; + left: unset; +} + +.order-submission .wrapper .item .discount .iconfont { + color: #515151; + font-size: 0.3*100rpx; + margin-left: 0.15*100rpx; +} + +.order-submission .wrapper .item .discount .num { + font-size: 0.32*100rpx; + margin-right: 0.2*100rpx; +} + +.order-submission .wrapper .item textarea { + box-sizing: border-box; + background-color: #f9f9f9; + width: 100%; + height: 1.4*100rpx; + border-radius: 0.03*100rpx; + margin-top: 0.3*100rpx; + padding: 0.25*100rpx 0.28*100rpx; +} + +.order-submission .wrapper .item textarea::placeholder { + color: #ccc; +} + +.order-submission .wrapper .item .list { + margin-top: 0.35*100rpx; +} + +.order-submission .wrapper .item .list .payItem { + border: 1px solid #eee; + border-radius: 0.06*100rpx; + height: 0.86*100rpx; + width: 100%; + margin-top: 0.2*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.order-submission .wrapper .item .list .payItem.on { + border-color: #fc5445; + color: #e93323; +} + +.order-submission .wrapper .item .list .payItem .name { + width: 50%; + text-align: center; + border-right: 1px solid #eee; +} + +.order-submission .wrapper .item .list .payItem .name .iconfont { + width: 0.44*100rpx; + height: 0.44*100rpx; + border-radius: 50%; + text-align: center; + line-height: 0.44*100rpx; + background-color: #fe960f; + color: #fff; + font-size: 0.3*100rpx; + margin-right: 0.15*100rpx; +} + +.order-submission .wrapper .item .list .payItem .name .iconfont.icon-weixin2 { + background-color: #41b035; +} + +.order-submission .wrapper .item .list .payItem .name .iconfont.icon-yinhangqia { + background-color: #eb3729; +} + +.order-submission .wrapper .item .list .payItem .tip { + width: 49%; + text-align: center; + font-size: 0.26*100rpx; + color: #aaa; +} + +.order-submission .moneyList { + margin-top: 0.12*100rpx; + background-color: #fff; + padding: 0.3*100rpx; +} + +.order-submission .moneyList .item { + font-size: 0.28*100rpx; + color: #282828; +} + +.order-submission .moneyList .item~.item { + margin-top: 0.2*100rpx; +} + +.order-submission .moneyList .item .money { + color: #868686; +} + +.order-submission .footer { + box-sizing: border-box; + width: 100%; + height: 1*100rpx; + background-color: #fff; + padding: 0 0.3*100rpx; + font-size: 0.28*100rpx; + color: #333; + position: fixed; + bottom: 0; + left: 0; +} + +.order-submission .footer .settlement { + font-size: 0.3*100rpx; + color: #fff; + width: 2.4*100rpx; + height: 0.7*100rpx; + background-color: #e93323; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.7*100rpx; +} + +/*地址管理*/ +.address-management .line { + width: 100%; + height: 0.03*100rpx; +} + +.address-management .line image { + width: 100%; + height: 100%; + display: block; +} + +.address-management .item { + background-color: #fff; + padding: 0 0.3*100rpx; + margin-bottom: 0.12*100rpx; +} + +.address-management .item .address { + padding: 0.3*100rpx 0; + border-bottom: 1px solid #eee; + font-size: 0.28*100rpx; + color: #282828; +} + +.address-management .item .address .consignee { + font-size: 0.28*100rpx; + font-weight: bold; + margin-bottom: 0.08*100rpx; +} + +.address-management .item .address .consignee .phone { + margin-left: 0.25*100rpx; +} + +.address-management .item .operation { + height: 0.83*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.address-management .item .operation .default { + margin-left: 0.1*100rpx; +} + +.address-management .item .operation .iconfont { + color: #2c2c2c; + font-size: 0.3*100rpx; + vertical-align: -0.02*100rpx; + margin-right: 0.1*100rpx; +} + +.address-management .item .operation .iconfont.icon-shanchu { + margin-left: 0.4*100rpx; + font-size: 0.33*100rpx; +} + +.address-management .footer { + box-sizing: border-box; + position: fixed; + width: 100%; + background-color: #fff; + bottom: 0; + height: 1.06*100rpx; + padding: 0 0.3*100rpx; +} + +.address-management .footer .addressBnt { + width: 3.3*100rpx; + height: 0.76*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.76*100rpx; + font-size: 0.3*100rpx; + color: #fff; +} + +.address-management .footer .addressBnt.on { + width: 6.9*100rpx; + margin: 0 auto; +} + +.address-management .footer .addressBnt .iconfont { + font-size: 0.35*100rpx; + margin-right: 0.08*100rpx; + vertical-align: -0.01*100rpx; +} + +.address-management .footer .addressBnt.wxbnt { + background-color: #eb3729; +} + +/*添加地址*/ +.addAddress .list { + background-color: #fff; +} + +.addAddress .list .item { + padding: 0 0.3*100rpx; + min-height: 0.9*100rpx; + border-top: 0.01*100rpx solid #eee; + font-size: 0.3*100rpx; +} + +.addAddress .list .item .name { + width: 1.95*100rpx; + color: #333; +} + +.addAddress .list .item input { + width: 4.75*100rpx; + font-size: 0.3*100rpx; +} + +.addAddress .list .item input::placeholder { + color: #ccc; +} + +.addAddress .list .item .picker { + width: 4.75*100rpx; +} + +.addAddress .list .item .address { + width: 4.1*100rpx; +} + +.addAddress .list .item .picker .iconfont { + font-size: 0.43*100rpx; +} + +.addAddress .default { + padding: 0 0.3*100rpx; + height: 0.9*100rpx; + background-color: #fff; + margin-top: 0.23*100rpx; +} + +.addAddress .default .def { + margin-left: 0.1*100rpx; + height: 0.83*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.addAddress .keepBnt { + width: 6.9*100rpx; + height: 0.86*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin: 0.5*100rpx auto 0.3*100rpx auto; + font-size: 0.32*100rpx; + color: #fff; +} + +.addAddress .wechatAddress { + width: 6.9*100rpx; + height: 0.86*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin: 0 auto; + font-size: 0.32*100rpx; + color: #eb3729; + border: 1px solid #eb3729; +} + +/*我的订单*/ +.my-order .header { + height: 2.6*100rpx; + padding: 0 0.3*100rpx; +} + +.my-order .header .picTxt { + height: 1.9*100rpx; +} + +.my-order .header .picTxt .text { + color: rgba(255, 255, 255, 0.8); + font-size: 0.26*100rpx; + font-family: 'GuildfordProBook 5'; +} + +.my-order .header .picTxt .text .name { + font-size: 0.34*100rpx; + font-weight: bold; + color: #fff; + margin-bottom: 0.2*100rpx; +} + +.my-order .header .picTxt .pictrue { + width: 1.22*100rpx; + height: 1.09*100rpx; +} + +.my-order .header .picTxt .pictrue image { + width: 100%; + height: 100%; +} + +.my-order .nav { + background-color: #fff; + width: 6.9*100rpx; + height: 1.4*100rpx; + border-radius: 0.06*100rpx; + margin: -0.73*100rpx auto 0 auto; +} + +.my-order .nav .item { + text-align: center; + font-size: 0.26*100rpx; + color: #282828; + padding: 0.29*100rpx 0 0.2*100rpx 0; +} + +.my-order .nav .item.on { + font-weight: bold; + border-bottom: 0.05*100rpx solid #eb3729; +} + +.my-order .nav .item .num { + margin-top: 0.1*100rpx; +} + +.my-order .list { + width: 6.9*100rpx; + margin: 0.14*100rpx auto 0 auto; +} + +.my-order .list .item { + background-color: #fff; + border-radius: 0.06*100rpx; + margin-bottom: 0.14*100rpx; +} + +.my-order .list .item .title { + height: 0.84*100rpx; + padding: 0 0.3*100rpx; + border-bottom: 0.01*100rpx solid #eee; + font-size: 0.28*100rpx; + color: #282828; +} + +.my-order .list .item .title .sign { + font-size: 0.24*100rpx; + padding: 0 0.07*100rpx; + height: 0.36*100rpx; + margin-right: 0.15*100rpx; +} + +.my-order .list .item .item-info { + padding: 0 0.3*100rpx; + margin-top: 0.22*100rpx; +} + +.my-order .list .item .item-info .pictrue { + width: 1.2*100rpx; + height: 1.2*100rpx; +} + +.my-order .list .item .item-info .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.my-order .list .item .item-info .text { + width: 4.86*100rpx; + font-size: 0.28*100rpx; + color: #999; + margin-top: 0.06*100rpx; +} + +.my-order .list .item .item-info .text .name { + width: 3.06*100rpx; + color: #282828; +} + +.my-order .list .item .item-info .text .money { + text-align: right; +} + +.my-order .list .item .totalPrice { + font-size: 0.26*100rpx; + color: #282828; + text-align: right; + margin: 0.27*100rpx 0 0 0.3*100rpx; + padding: 0 0.3*100rpx 0.3*100rpx 0; + border-bottom: 0.01*100rpx solid #eee; +} + +.my-order .list .item .totalPrice .money { + font-size: 0.28*100rpx; + font-weight: bold; +} + +.my-order .list .item .bottom { + height: 1.07*100rpx; + padding: 0 0.3*100rpx; +} + +.my-order .list .item .bottom .bnt { + width: 1.76*100rpx; + height: 0.6*100rpx; + text-align: center; + line-height: 0.6*100rpx; + color: #fff; + border-radius: 0.5*100rpx; + font-size: 0.27*100rpx; +} + +.my-order .list .item .bottom .bnt.cancelBnt { + border: 1px solid #ddd; + color: #aaa; +} + +.my-order .list .item .bottom .bnt.default { + color: #444; + border: 1px solid #444; +} + +.my-order .list .item .bottom .bnt~.bnt { + margin-left: 0.17*100rpx; +} + +/*订单详情*/ +.order-details .header { + padding: 0 0.3*100rpx; + height: 1.5*100rpx; +} + +.order-details .header.on { + background-color: #666 !important; +} + +.order-details .header .pictrue { + width: 1.1*100rpx; + height: 1.1*100rpx; +} + +.order-details .header .pictrue image { + width: 100%; + height: 100%; +} + +.order-details .header .data { + color: rgba(255, 255, 255, 0.8); + font-size: 0.24*100rpx; + margin-left: 0.27*100rpx; +} + +.order-details .header.on .data { + margin-left: 0; +} + +.order-details .header .data .state { + font-size: 0.3*100rpx; + font-weight: bold; + color: #fff; + margin-bottom: 0.07*100rpx; +} + +.order-details .header .data .time { + margin-left: 0.2*100rpx; +} + +.order-details .nav { + background-color: #fff; + font-size: 0.26*100rpx; + color: #282828; + padding: 0.25*100rpx 0; +} + +.order-details .nav .navCon { + padding: 0 0.4*100rpx; +} + +.order-details .nav .navCon .on { + font-weight: bold; + color: #eb3729; +} + +.order-details .nav .progress { + padding: 0 0.65*100rpx; + margin-top: 0.1*100rpx; +} + +.order-details .nav .progress .line { + width: 1*100rpx; + height: 0.02*100rpx; + background-color: #939390; +} + +.order-details .nav .progress .iconfont { + font-size: 0.25*100rpx; + color: #939390; + margin-top: -0.02*100rpx; + width: 0.3*100rpx; + height: 0.3*100rpx; + line-height: 0.33*100rpx; + text-align: center; +} + +.order-details .address { + font-size: 0.26*100rpx; + color: #868686; + background-color: #fff; + padding: 0.25*100rpx 0.3*100rpx 0.3*100rpx 0.3*100rpx; +} + +.order-details .address .name { + font-size: 0.3*100rpx; + color: #282828; + margin-bottom: 0.1*100rpx; +} + +.order-details .address .name .phone { + margin-left: 0.4*100rpx; +} + +.order-details .line { + width: 100%; + height: 0.03*100rpx; +} + +.order-details .line image { + width: 100%; + height: 100%; + display: block; +} + +.order-details .wrapper { + background-color: #fff; + margin-top: 0.12*100rpx; + padding: 0.3*100rpx; +} + +.order-details .wrapper .item { + font-size: 0.28*100rpx; + color: #282828; +} + +.order-details .wrapper .item~.item { + margin-top: 0.2*100rpx; +} + +.order-details .wrapper .item .conter { + color: #868686; + width: 5*100rpx; + text-align: right; +} + +.order-details .wrapper .item .conter .copy { + font-size: 0.2*100rpx; + color: #333; + border-radius: 0.03*100rpx; + border: 1px solid #666; + padding: 0.03*100rpx 0.15*100rpx; + margin-left: 0.24*100rpx; +} + +.order-details .wrapper .actualPay { + border-top: 0.01*100rpx solid #eee; + margin-top: 0.3*100rpx; + padding-top: 0.3*100rpx; +} + +.order-details .wrapper .actualPay .money { + font-weight: bold; + font-size: 0.3*100rpx; +} + +.order-details .footer { + box-sizing: border-box; + width: 100%; + height: 1*100rpx; + position: fixed; + bottom: 0; + left: 0; + background-color: #fff; + padding: 0 0.3*100rpx; + border-top: 1px solid #eee; +} + +.order-details .footer .bnt { + width: 1.76*100rpx; + height: 0.6*100rpx; + text-align: center; + line-height: 0.6*100rpx; + border-radius: 0.5*100rpx; + color: #fff; + font-size: 0.27*100rpx; +} + +.order-details .footer .bnt.cancel { + color: #aaa; + border: 1px solid #ddd; +} + +.order-details .footer .bnt.default { + color: #444; + border: 1px solid #444; +} + +.order-details .footer .bnt~.bnt { + margin-left: 0.18*100rpx; +} + +/*物流信息*/ +.logistics .header { + padding: 0.23*100rpx 0.3*100rpx; + background-color: #fff; + height: 1.66*100rpx; +} + +.logistics .header .pictrue { + width: 1.2*100rpx; + height: 1.2*100rpx; +} + +.logistics .header .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.logistics .header .text { + width: 5.4*100rpx; + font-size: 0.28*100rpx; + color: #999; + margin-top: 0.06*100rpx; +} + +.logistics .header .text .name { + width: 3.65*100rpx; + color: #282828; +} + +.logistics .header .text .money { + text-align: right; +} + +.logistics .logisticsCon { + background-color: #fff; + margin: 0.12*100rpx 0; +} + +.logistics .logisticsCon .company { + height: 1.2*100rpx; + margin: 0 0 0.45*100rpx 0.3*100rpx; + padding-right: 0.3*100rpx; + border-bottom: 1px solid #f5f5f5; +} + +.logistics .logisticsCon .company .picTxt { + width: 5.2*100rpx; +} + +.logistics .logisticsCon .company .picTxt .iconfont { + width: 0.5*100rpx; + height: 0.5*100rpx; + background-color: #666; + text-align: center; + line-height: 0.5*100rpx; + color: #fff; + font-size: 0.35*100rpx; +} + +.logistics .logisticsCon .company .picTxt .text { + width: 4.5*100rpx; + font-size: 0.26*100rpx; + color: #282828; +} + +.logistics .logisticsCon .company .picTxt .text .name { + color: #999; +} + +.logistics .logisticsCon .company .picTxt .text .express { + margin-top: 0.05*100rpx; +} + +.logistics .logisticsCon .company .copy { + font-size: 0.2*100rpx; + width: 1.06*100rpx; + height: 0.4*100rpx; + border-radius: 0.03*100rpx; + border: 1px solid #999; +} + +.logistics .logisticsCon .item { + padding: 0 0.4*100rpx; + position: relative; +} + +.logistics .logisticsCon .item .circular { + width: 0.2*100rpx; + height: 0.2*100rpx; + border-radius: 50%; + position: absolute; + top: -0.01*100rpx; + left: 0.315*100rpx; + background-color: #ddd; +} + +.logistics .logisticsCon .item .circular.on { + background-color: #eb3729; +} + +.logistics .logisticsCon .item .text { + font-size: 0.26*100rpx; + color: #666; + width: 6.15*100rpx; + border-left: 1px solid #e6e6e6; + padding: 0 0 0.6*100rpx 0.38*100rpx; +} + +.logistics .logisticsCon .item .text.on { + border-left-color: #f8c1bd; +} + +.logistics .logisticsCon .item .text .data { + font-size: 0.24*100rpx; + color: #999; + margin-top: 0.1*100rpx; +} + +.logistics .logisticsCon .item .text .data .time { + margin-left: 0.15*100rpx; +} + +/*支付状态*/ +.payment-status { + background-color: #fff; + margin: 1.95*100rpx auto 0 auto; + border-radius: 0.1*100rpx; + padding: 0.01*100rpx 0 0.28*100rpx 0; + width: 6.9*100rpx; + left: 50%; + margin-left: -3.45*100rpx; +} + +.payment-status .iconfont { + font-size: 0.7*100rpx; + width: 1.4*100rpx; + height: 1.4*100rpx; + border-radius: 50%; + color: #fff; + text-align: center; + line-height: 1.3*100rpx; + text-shadow: 0 4px 0 #eb3729; + border: 0.06*100rpx solid #f5f5f5; + margin: -0.76*100rpx auto 0 auto; + background-color: #999; +} + +.payment-status .iconfont.fail { + text-shadow: 0 4px 0 #7a7a7a; +} + +.payment-status .status { + font-size: 0.32*100rpx; + font-weight: bold; + text-align: center; + margin: 0.25*100rpx 0 0.37*100rpx 0; +} + +.payment-status .wrapper { + border: 1px solid #eee; + margin: 0 0.3*100rpx 0.47*100rpx 0.3*100rpx; + padding: 0.35*100rpx 0; + border-left: 0; + border-right: 0; +} + +.payment-status .wrapper .item { + font-size: 0.28*100rpx; + color: #282828; +} + +.payment-status .wrapper .item~.item { + margin-top: 0.2*100rpx; +} + +.payment-status .wrapper .item .itemCom { + color: #666; +} + +.payment-status .returnBnt { + width: 6.3*100rpx; + height: 0.86*100rpx; + border-radius: 0.5*100rpx; + color: #fff; + font-size: 0.3*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin: 0 auto 0.2*100rpx auto; +} + +/*拼团海报*/ +.poster-poster .tip { + height: 0.8*100rpx; + font-size: 0.26*100rpx; + color: #e8c787; + text-align: center; + line-height: 0.8*100rpx; +} + +.poster-poster .tip .iconfont { + font-size: 0.36*100rpx; + vertical-align: -0.04*100rpx; + margin-right: 0.18*100rpx; +} + +.poster-poster .poster { + width: 6.9*100rpx; + height: 100%; + margin: 0 auto; +} + +.poster-poster .poster image { + width: 100%; + height: 100%; + display: block; +} + +/*分销海报*/ +.distribution-posters .slider-banner { + width: 100%; + box-sizing: border-box; + height: 100%; + padding: .4*100rpx; + position: relative; +} + +.distribution-posters .slider-banner .swiper-slide { + width: 6*100rpx !important; + height: 100%; +} + +.distribution-posters .slide-image { + width: 100%; + height: 100%; + border-radius: 0.15*100rpx; +} + +.distribution-posters .keep { + font-size: 0.3*100rpx; + color: #fff; + width: 6*100rpx; + height: 0.8*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.8*100rpx; + margin: 0.38*100rpx auto; +} + +/*积分详情*/ +.integral-details .header { + background-image: url('https://h5.yixiang.co/static/images/integralbg.jpg'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 100%; + height: 3.6*100rpx; + font-size: 0.72*100rpx; + color: #fff; + padding: 0.31*100rpx 0 0.45*100rpx 0; + text-align: center; + font-family: 'GuildfordProBook 5'; +} + +.integral-details .header .currentScore { + font-size: 0.26*100rpx; + color: rgba(255, 255, 255, 0.8); + text-align: center; + margin-bottom: 0.05*100rpx; +} + +.integral-details .header .line { + width: 0.6*100rpx; + height: 0.03*100rpx; + background-color: #fff; + margin: 0.2*100rpx auto 0 auto; +} + +.integral-details .header .nav { + font-size: 0.22*100rpx; + color: rgba(255, 255, 255, 0.8); + flex: 1; + -o-flex: 1; + -ms-flex: 1; + margin-top: 0.35*100rpx; +} + +.integral-details .header .nav .item { + width: 33.33%; + text-align: center; +} + +.integral-details .header .nav .item .num { + color: #fff; + font-size: 0.4*100rpx; +} + +.integral-details .wrapper .nav { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + width: 6.9*100rpx; + border-radius: 0.2*100rpx 0.2*100rpx 0 0; + margin: -0.96*100rpx auto 0 auto; + background-color: #f7f7f7; + height: 0.96*100rpx; + font-size: 0.3*100rpx; + color: #bbb; +} + +.integral-details .wrapper .nav .item { + text-align: center; + width: 100%; +} + +/*.integral-details .wrapper .nav .item{text-align:center;width:50%;}*/ +.integral-details .wrapper .nav .item.on { + background-color: #fff; + color: #eb3729; + font-weight: bold; + border-radius: 0.2*100rpx .2*100rpx 0 0; +} + +.integral-details .wrapper .nav .item .iconfont { + font-size: 0.38*100rpx; + margin-right: 0.1*100rpx; +} + +.integral-details .wrapper .list { + background-color: #fff; + padding: 0.24*100rpx 0.3*100rpx; +} + +.integral-details .wrapper .list .tip { + font-size: 0.25*100rpx; + width: 6.9*100rpx; + height: 0.6*100rpx; + border-radius: 0.5*100rpx; + background-color: #fff5e2; + border: 1px solid #ffeac1; + color: #c8a86b; + padding: 0 0.2*100rpx; + margin-bottom: 0.24*100rpx; +} + +.integral-details .wrapper .list .tip .iconfont { + font-size: 0.35*100rpx; + margin-right: 0.15*100rpx; +} + +.integral-details .wrapper .list .item { + height: 1.24*100rpx; + border-bottom: 1px solid #eee; + font-size: 0.24*100rpx; + color: #999; +} + +.integral-details .wrapper .list .item .state { + font-size: 0.28*100rpx; + color: #282828; + margin-bottom: 0.08*100rpx; +} + +.integral-details .wrapper .list .item .num { + font-size: 0.36*100rpx; + font-family: 'GuildfordProBook 5'; + color: #16ac57; +} + +.integral-details .wrapper .list2 { + background-color: #fff; + padding: 0.24*100rpx 0; +} + +.integral-details .wrapper .list2 .item { + background-image: linear-gradient(to right, #fff7e7 0%, #fffdf9 100%); + background-image: -moz-linear-gradient(to right, #fff7e7 0%, #fffdf9 100%); + width: 6.9*100rpx; + height: 1.8*100rpx; + position: relative; + border-radius: 0.1*100rpx; + margin: 0 auto 0.2*100rpx auto; + padding: 0 0.25*100rpx 0 1.8*100rpx; +} + +.integral-details .wrapper .list2 .item .pictrue { + width: 0.9*100rpx; + height: 1.5*100rpx; + position: absolute; + bottom: 0; + left: 0.45*100rpx; +} + +.integral-details .wrapper .list2 .item .pictrue image { + width: 100%; + height: 100%; +} + +.integral-details .wrapper .list2 .item .name { + width: 2.85*100rpx; + font-size: 0.3*100rpx; + font-weight: bold; + color: #c8a86b; +} + +.integral-details .wrapper .list2 .item .earn { + font-size: 0.26*100rpx; + color: #c8a86b; + border: 0.02*100rpx solid #c8a86b; + text-align: center; + line-height: 0.52*100rpx; + height: 0.52*100rpx; + width: 1.6*100rpx; + border-radius: 0.5*100rpx; +} + +/*金品推荐*/ +.quality-recommend .title { + height: 1.2*100rpx; + font-size: 0.32*100rpx; + color: #282828; + background-color: #f5f5f5; +} + +.quality-recommend .title .line { + width: 2.3*100rpx; + height: 0.02*100rpx; + background-color: #e9e9e9; +} + +.quality-recommend .title .name { + margin: 0 0.2*100rpx; +} + +.quality-recommend .title .name .iconfont { + margin-right: 0.13*100rpx; + font-size: 0.38*100rpx; + vertical-align: -0.04*100rpx; +} + +/*砍价列表*/ +.bargain-list .icon-xiangzuo { + font-size: 0.4*100rpx; + color: #fff; + position: fixed; + top: 0.51*100rpx; + left: 0.3*100rpx; + z-index: 99; +} + +.bargain-list .header { + background-repeat: no-repeat; + background-size: 100% 100%; + width: 7.5*100rpx; + height: 7.13*100rpx; +} + +.bargain-list .list { + border-radius: 0.3*100rpx; + margin: .3*100rpx 0.3*100rpx 0.66*100rpx 0.3*100rpx; +} + +.bargain-list .list .item { + border-bottom: 1px solid #eee; + position: relative; + height: 2.23*100rpx; + background-color: #fff; + padding: 0 .24*100rpx; + margin: 0 auto .2*100rpx auto; +} + +.bargain-list .list .item .pictrue { + width: 1.6*100rpx; + height: 1.6*100rpx; +} + +.bargain-list .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.bargain-list .list .item .text { + width: 4.5*100rpx; + font-size: 0.3*100rpx; + color: #282828; + height: 1.6*100rpx; +} + +.bargain-list .list .item .text .num { + font-size: 0.26*100rpx; + color: #999; +} + +.bargain-list .list .item .text .num .iconfont { + font-size: 0.35*100rpx; + margin-right: 0.07*100rpx; +} + +.bargain-list .list .item .text .money { + font-size: 0.24*100rpx; + font-weight: bold; +} + +.bargain-list .list .item .text .money .price { + font-size: 0.32*100rpx; +} + +.bargain-list .list .item .cutBnt { + position: absolute; + width: 1.8*100rpx; + height: 0.5*100rpx; + border-radius: 0.5*100rpx; + font-size: 0.24*100rpx; + color: #fff; + text-align: center; + line-height: 0.46*100rpx; + right: 0.24*100rpx; + bottom: 0.28*100rpx; + box-shadow: 0 0.07*100rpx 0 #f8c1bd; + -moz-box-shadow: 0 0.07*100rpx 0 #f8c1bd; + -o-box-shadow: 0 0.07*100rpx 0 #f8c1bd; +} + +.bargain-list .list .item .cutBnt .iconfont { + margin-right: 0.08*100rpx; + font-size: 0.3*100rpx; +} + +.bargain-list .list .load { + font-size: 0.24*100rpx; + height: 0.85*100rpx; + text-align: center; + line-height: 0.85*100rpx; +} + +/*砍价*/ +.bargain .icon-xiangzuo { + font-size: 0.4*100rpx; + color: #fff; + position: fixed; + top: 0.51*100rpx; + left: 0.3*100rpx; + z-index: 99; +} + +.bargain .header { + /* background-image: url('https://h5.yixiang.co/static/images/cut1.png'); */ + background-repeat: no-repeat; + background-size: 100% 100%; + width: 6.98*100rpx; + height: 372rpx; + margin: 0 auto; + padding-top: 0.001*100rpx; + margin-top: 0.4*100rpx +} + +.bargain .header.on { + background-image: url('https://h5.yixiang.co/static/images/cut2.png'); +} + +.bargain .header .pictxt { + margin: 2.6*100rpx auto 0 auto; + font-size: 0.26*100rpx; + color: #fff; +} + +.bargain .header .pictxt .pictrue { + width: 0.56*100rpx; + height: 0.56*100rpx; + margin-right: 0.3*100rpx; +} + +.bargain .header .pictxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; + border: 0.02*100rpx solid #fff; +} + +.bargain .header .pictxt .text text { + margin-left: 0.2*100rpx; +} + +.bargain .header .time { + background-image: url('https://h5.yixiang.co/static/images/time.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 4.4*100rpx; + height: 1.66*100rpx; + margin: .8*100rpx auto 0 auto; + font-size: 0.22*100rpx; + text-align: center; + padding-top: 0.09*100rpx; + color: #fc4141; +} + +.bargain .header .people { + text-align: center; + color: #fff; + font-size: 0.2*100rpx; + margin-top: 0.2*100rpx; +} + +.bargain .header .time .styleAll { + color: #333; +} + +.bargain .wrapper, +.bargain .bargainGang, +.bargain .goodsDetails { + width: 6.6*100rpx; + border: 0.06*100rpx solid #eb3729; + background-color: #fff; + border-radius: 0.2*100rpx; + margin: -1.62*100rpx auto 0 auto; + padding: 0 0.24*100rpx 0.47*100rpx 0.24*100rpx; + position: relative; +} + +.bargain .wrapper .pictxt { + margin: 0.26*100rpx 0 0.37*100rpx 0; +} + +.bargain .wrapper .pictxt .pictrue { + width: 1.8*100rpx; + height: 1.8*100rpx; + position: relative; + +} + +.bargain .wrapper .pictxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.bargain .wrapper .pictxt .text { + width: 3.95*100rpx; + font-size: 0.28*100rpx; + color: #282828; + height: 1.8*100rpx; +} + +.bargain .wrapper .pictxt .text .money { + font-weight: bold; + font-size: 0.24*100rpx; +} + +.bargain .wrapper .pictxt .text .money .num { + font-size: 0.36*100rpx; +} + +.bargain .wrapper .pictxt .text .successNum { + font-size: 0.22*100rpx; + color: #999; + margin-right: 0.15*100rpx; +} + +.bargain .wrapper .cu-progress { + overflow: hidden; + height: 0.12*100rpx; + background-color: #eee; + width: 100%; + border-radius: 0.2*100rpx; +} + +.bargain .wrapper .cu-progress .bg-red { + width: 0; + height: 100%; + transition: width 0.6s ease; + border-radius: 0.2*100rpx; + background-image: linear-gradient(to right, #ffa363 0%, #e93323 100%); + background-image: -moz-linear-gradient(to right, #ffa363 0%, #e93323 100%); +} + +.bargain .wrapper .balance { + font-size: 0.22*100rpx; + color: #999; + margin-top: 0.15*100rpx; +} + +.bargain .wrapper .bargainSuccess { + font-size: 0.26*100rpx; + color: #282828; + text-align: center; +} + +.bargain .wrapper .bargainSuccess .iconfont { + font-size: 0.45*100rpx; + color: #54c762; + padding-right: 0.18*100rpx; + vertical-align: -0.05*100rpx; +} + +.bargain .wrapper .bargainBnt { + font-size: 0.3*100rpx; + font-weight: bold; + color: #fff; + width: 100%; + height: 0.8*100rpx; + border-radius: 0.4*100rpx; + background-image: linear-gradient(to right, #f67a38 0%, #f11b09 100%); + text-align: center; + line-height: 0.8*100rpx; + margin-top: 0.32*100rpx; +} + +.bargain .wrapper .bargainBnt.on { + border: 0.02*100rpx solid #eb3729; + color: #eb3729; + background-image: linear-gradient(to right, #fff 0%, #fff 100%); + background-image: -moz-linear-gradient(to right, #fff 0%, #fff 100%); + width: 100%; + height: 0.76*100rpx; +} + +.bargain .wrapper .tip { + font-size: 0.22*100rpx; + color: #999; + text-align: center; + margin-top: 0.2*100rpx; +} + +.bargain .wrapper .lock, +.bargain .bargainGang .lock, +.bargain .goodsDetails .lock { + background-image: url('https://h5.yixiang.co/static/images/lock.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 5.48*100rpx; + height: 0.66*100rpx; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: -0.43*100rpx; + z-index: 5; +} + +.bargain .bargainGang { + margin: 0.13*100rpx auto 0 auto; +} + +.bargain .bargainGang .title, +.bargain .goodsDetails .title { + font-size: 0.32*100rpx; + font-weight: bold; + height: 0.8*100rpx; + margin-top: 0.3*100rpx; +} + +.bargain .bargainGang .title .pictrue, +.bargain .goodsDetails .title .pictrue { + width: 0.46*100rpx; + height: 0.24*100rpx; +} + +.bargain .bargainGang .title .pictrue.on, +.bargain .goodsDetails .title .pictrue.on { + transform: rotate(180deg); +} + +.bargain .bargainGang .title .pictrue image, +.bargain .goodsDetails .title .pictrue image { + width: 100%; + height: 100%; + display: block; +} + +.bargain .bargainGang .title .titleCon, +.bargain .goodsDetails .title .titleCon { + margin: 0 0.2*100rpx; +} + +.bargain .bargainGang .list .item { + border-bottom: 1px dashed #ddd; + height: 1.12*100rpx; +} + +.bargain .bargainGang .list .item .pictxt { + width: 3.1*100rpx; +} + +.bargain .bargainGang .list .item .pictxt .pictrue { + width: 0.7*100rpx; + height: 0.7*100rpx; +} + +.bargain .bargainGang .list .item .pictxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; + border: 0.02px solid #eb3729; +} + +.bargain .bargainGang .list .item .pictxt .text { + width: 2.25*100rpx; + font-size: 0.2*100rpx; + color: #999; +} + +.bargain .bargainGang .list .item .pictxt .text .name { + font-size: 0.25*100rpx; + color: #282828; + margin-bottom: 0.07*100rpx; +} + +.bargain .bargainGang .list .item .money { + font-size: 0.25*100rpx; +} + +.bargain .bargainGang .list .item .money .iconfont { + font-size: 0.35*100rpx; + vertical-align: middle; + margin-right: 0.1*100rpx; +} + +.bargain .bargainGang .load { + font-size: 0.24*100rpx; + text-align: center; + line-height: 0.8*100rpx; + height: 0.8*100rpx; +} + +.bargain .goodsDetails { + margin: 0.13*100rpx auto 0 auto; +} + +.bargain .goodsDetails~.goodsDetails { + margin-bottom: 0.5*100rpx; +} + +.bargain .goodsDetails .conter { + margin-top: 0.2*100rpx; +} + +.bargain .goodsDetails .conter image { + width: 100% !important; + display: block; +} + +.bargain .bargainTip { + position: fixed; + top: 50%; + left: 50%; + width: 5.6*100rpx; + margin-left: -2.8*100rpx; + z-index: 99; + border-radius: 0.2*100rpx; + background-color: #fff; + transition: all 0.3s ease-in-out 0s; + opacity: 0; + transform: scale(0); + padding-bottom: 0.6*100rpx; + margin-top: -3.3*100rpx; +} + +.bargain .bargainTip.on { + opacity: 1; + transform: scale(1); +} + +.bargain .bargainTip .pictrue { + width: 100%; + height: 3.21*100rpx; + position: relative; +} + +.bargain .bargainTip .pictrue .iconfont { + position: absolute; + right: 0.18*100rpx; + top: 0.18*100rpx; + color: #fff; + font-size: 0.36*100rpx; + width: 0.5*100rpx; + height: 0.5*100rpx; + text-align: center; + line-height: 0.5*100rpx; +} + +.bargain .bargainTip .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.2*100rpx 0.2*100rpx 0 0; +} + +.bargain .bargainTip .cutOff { + font-size: 0.3*100rpx; + color: #666; + padding: 0 0.29*100rpx; + text-align: center; + margin-top: 0.5*100rpx; +} + +.bargain .bargainTip .cutOff.on { + margin-top: 0.26*100rpx; +} + +.bargain .bargainTip .help { + font-size: 0.32*100rpx; + font-weight: bold; + text-align: center; + margin-top: 0.4*100rpx; +} + +.bargain .bargainTip .tipBnt { + font-size: 0.32*100rpx; + color: #fff; + width: 3.6*100rpx; + height: 0.82*100rpx; + border-radius: 0.41*100rpx; + background-image: linear-gradient(to right, #f67a38 0%, #f11b09 100%); + background-image: -moz-linear-gradient(to right, #f67a38 0%, #f11b09 100%); + text-align: center; + line-height: 0.82*100rpx; + margin: 0.5*100rpx auto 0 auto; +} + +/*砍价记录*/ +.bargain-record .item { + background-color: #fff; + margin-bottom: 0.12*100rpx; +} + +.bargain-record .item .picTxt { + height: 2.1*100rpx; + border-bottom: 1px solid #f0f0f0; + padding: 0 0.3*100rpx; +} + +.bargain-record .item .picTxt .pictrue { + width: 1.5*100rpx; + height: 1.5*100rpx; +} + +.bargain-record .item .picTxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.bargain-record .item .picTxt .text { + width: 5.15*100rpx; + font-size: 0.3*100rpx; + color: #282828; + height: 1.5*100rpx; +} + +.bargain-record .item .picTxt .text .time { + font-size: 0.24*100rpx; + color: #868686; +} + +.bargain-record .item .picTxt .text .time .styleAll { + color: #fc4141; +} + +.bargain-record .item .picTxt .text .money { + font-size: 0.24*100rpx; +} + +.bargain-record .item .picTxt .text .money .num { + font-size: 0.32*100rpx; + font-weight: bold; +} + +.bargain-record .item .picTxt .text .money .symbol { + font-weight: bold; +} + +.bargain-record .item .bottom { + height: 1*100rpx; + padding: 0 0.3*100rpx; + font-size: 0.27*100rpx; +} + +.bargain-record .item .bottom .purple { + color: #f78513; +} + +.bargain-record .item .bottom .end { + color: #999; +} + +.bargain-record .item .bottom .success { + color: #e93323; +} + +.bargain-record .item .bottom .bnt { + font-size: 0.27*100rpx; + color: #fff; + width: 1.76*100rpx; + height: 0.6*100rpx; + border-radius: 0.06*100rpx; + text-align: center; + line-height: 0.6*100rpx; +} + +.bargain-record .item .bottom .bnt.cancel { + color: #aaa; + border: 1px solid #ddd; +} + +.bargain-record .item .bottom .bnt~.bnt { + margin-left: 0.18*100rpx; +} + +/*拼团列表*/ +.group-list .header { + background-repeat: no-repeat; + background-size: 100% 100%; + width: 100%; + height: 4.5*100rpx; +} + +.group-list .header image { + width: 100%; + height: 4.5*100rpx; +} + +.group-list .list { + /* margin-top: -1.20*100rpx; */ +} + +.group-list .list .item { + width: 6.9*100rpx; + height: 2.08*100rpx; + background-color: #fff; + border-radius: 0.06*100rpx; + padding: 0 0.24*100rpx; + margin: 0 auto 0.2*100rpx auto; +} + +.group-list .list .item .pictrue { + width: 1.6*100rpx; + height: 1.6*100rpx; +} + +.group-list .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.group-list .list .item .text { + width: 4.58*100rpx; + font-size: 0.3*100rpx; + color: #282828; +} + +.group-list .list .item .text .team { + height: 0.4*100rpx; + border-radius: 0.04*100rpx; + font-size: 0.22*100rpx; + margin-top: 0.2*100rpx; +} + +.group-list .list .item .text .team .iconfont { + width: 0.54*100rpx; + background-color: #c6f3e8; + text-align: center; + color: #eb3729; + height: 100%; + line-height: 0.38*100rpx; +} + +.group-list .list .item .text .team .num { + text-align: center; + padding: 0 0.1*100rpx; +} + +.group-list .list .item .text .bottom { + margin-top: 0.07*100rpx; +} + +.group-list .list .item .text .bottom .money { + font-size: 0.24*100rpx; + font-weight: bold; + color: #282828; +} + +.group-list .list .item .text .bottom .money .num { + font-size: 0.32*100rpx; +} + +.group-list .list .item .text .bottom .money .y-money { + font-size: 0.24*100rpx; + color: #999; + font-weight: normal; + text-decoration: line-through; + margin-left: 0.1*100rpx; +} + +.group-list .list .item .text .bottom .groupBnt { + font-size: 0.26*100rpx; + color: #fff; + width: 1.46*100rpx; + height: 0.54*100rpx; + text-align: center; + line-height: 0.54*100rpx; + border-radius: 0.04*100rpx; +} + +.group-list .list .item .text .bottom .groupBnt .iconfont { + font-size: 0.25*100rpx; + margin-left: 0.1*100rpx; +} + +/*拼团商品详情*/ +.product-con .wrapper .share .money .y-money { + color: #82848f; + margin-left: 0.13*100rpx; + text-decoration: line-through; + font-weight: normal; +} + +.product-con .notice { + width: 100%; + height: 0.62*100rpx; + background-color: #ffedeb; + margin-top: 0.2*100rpx; + padding: 0 0.3*100rpx; + box-sizing: border-box; +} + +.product-con .notice .num { + font-size: 0.24*100rpx; +} + +.product-con .notice .num .iconfont { + font-size: 0.3*100rpx; + vertical-align: -0.03*100rpx; + margin-right: 0.2*100rpx; +} + +.product-con .notice .num .line { + color: #282828; + margin-left: 0.15*100rpx; +} + +.product-con .notice .swiper { + height: 100%; + width: 4.7*100rpx; + line-height: 0.62*100rpx; + overflow: hidden; + margin-left: 0.14*100rpx; +} + +.product-con .notice .swiper swiper { + height: 100%; +} + +.product-con .notice .swiper .swiper-slide { + height: 100%; +} + +.product-con .notice .swiper .line1 { + height: 100%; + overflow: hidden; + font-size: 0.2*100rpx; + color: #282828; +} + +.product-con .assemble { + background-color: #fff; +} + +.product-con .assemble .item { + padding-right: 0.3*100rpx; + margin-left: 0.3*100rpx; + border-bottom: 1px solid #f0f0f0; + height: 1.32*100rpx; +} + +.product-con .assemble .item .pictxt { + width: 2.95*100rpx; +} + +.product-con .assemble .item .pictxt .text { + width: 1.94*100rpx; +} + +.product-con .assemble .item .pictxt .pictrue { + width: 0.8*100rpx; + height: 0.8*100rpx; +} + +.product-con .assemble .item .pictxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; +} + +.product-con .assemble .item .right .lack { + font-size: 0.24*100rpx; + color: #333333; + text-align: right; +} + +.product-con .assemble .item .right .time { + font-size: 0.22*100rpx; + color: #82848f; + margin-top: 0.05*100rpx; +} + +.product-con .assemble .item .right .spellBnt { + font-size: 0.24*100rpx; + color: #fff; + width: 1.4*100rpx; + height: 0.5*100rpx; + border-radius: 0.5*100rpx; + background-image: linear-gradient(to right, #ff2358 0%, #ff0000 100%); + background-image: -moz-linear-gradient(to right, #ff2358 0%, #ff0000 100%); + text-align: center; + line-height: 0.5*100rpx; + margin-left: 0.3*100rpx; +} + +.product-con .assemble .item .right .spellBnt .iconfont { + font-size: 0.2*100rpx; + margin-left: 0.05*100rpx; +} + +.product-con .assemble .more { + font-size: 0.24*100rpx; + color: #282828; + text-align: center; + height: 0.9*100rpx; + line-height: 0.9*100rpx; +} + +.product-con .assemble .more .iconfont { + margin-left: 0.13*100rpx; + font-size: 0.25*100rpx; +} + +.product-con .playWay { + background-color: #fff; + padding: 0 0.3*100rpx; + margin-top: 0.2*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.product-con .playWay .title { + height: 0.86*100rpx; + border-bottom: 1px solid #eee; +} + +.product-con .playWay .title .iconfont { + margin-left: 0.13*100rpx; + font-size: 0.28*100rpx; + color: #717171; +} + +.product-con .playWay .way { + min-height: 1.1*100rpx; + font-size: 0.26*100rpx; + color: #282828; +} + +.product-con .playWay .way .iconfont { + color: #cdcdcd; + font-size: 0.4*100rpx; + margin: 0 0.35*100rpx; +} + +.product-con .playWay .way .item .num { + font-size: 0.3*100rpx; + margin-right: 0.06*100rpx; +} + +.product-con .playWay .way .item .tip { + font-size: 0.22*100rpx; + color: #a5a5a5; +} + +.product-con .footer-group { + position: fixed; + bottom: 0; + width: 100%; + height: 1*100rpx; + background-color: #fff; + font-size: 0.18*100rpx; + color: #666; + z-index: 99; +} + +.product-con .footer-group .customerSer { + width: 14%; + font-size: 0.2*100rpx; + color: #666; +} + +.product-con .footer-group .customerSer .iconfont { + font-size: 0.35*100rpx; +} + +.product-con .footer-group .bnt { + width: 86%; + text-align: center; + line-height: 1*100rpx; + height: 100%; + color: #fff; + font-size: 0.3*100rpx; +} + +.product-con .superior .slider-banner .swiper-pagination-bullet { + background-color: #999; +} + +.product-con .superior .slider-banner .swiper-pagination-bullet-active { + background-color: #e93323; +} + +.product-con .superior .slider-banner .swiper-container-horizontal>.swiper-pagination-bullets { + bottom: 0; +} + +/*开团*/ +.group-con .header { + width: 100%; + height: 1.86*100rpx; + background-color: #fff; + border-top: 1px solid #f5f5f5; + padding: 0 0.3*100rpx; + position: relative; +} + +.group-con .header .iconfont { + font-size: 1*100rpx; + position: absolute; + color: #ccc; + right: 0.33*100rpx; + bottom: 0.2*100rpx; +} + +.group-con .header .pictrue { + width: 1.4*100rpx; + height: 1.4*100rpx; +} + +.group-con .header .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.group-con .header .text { + width: 5.25*100rpx; + font-size: 0.3*100rpx; + color: #222; +} + +.group-con .header .text .money { + font-size: 0.24*100rpx; + font-weight: bold; + margin-top: 0.15*100rpx; +} + +.group-con .header .text .money .num { + font-size: 0.32*100rpx; +} + +.group-con .header .text .money .team { + padding: 0.01*100rpx 0.1*100rpx; + font-weight: normal; + border-radius: 0.5*100rpx; + font-size: 0.2*100rpx; + vertical-align: 0.04*100rpx; + margin-left: 0.15*100rpx; +} + +.group-con .wrapper { + background-color: #fff; + margin-top: 0.2*100rpx; + padding: 0.02*100rpx 0 0.35*100rpx 0; +} + +.group-con .wrapper .title { + margin-top: 0.3*100rpx; +} + +.group-con .wrapper .title .line { + width: 1.36*100rpx; + height: 1px; + background-color: #ddd; +} + +.group-con .wrapper .title .name { + margin: 0 0.45*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.group-con .wrapper .title .name .time { + margin: 0 0.14*100rpx; +} + +.group-con .wrapper .title .name .timeTxt { + color: #fc4141; +} + +.group-con .wrapper .title .name .time .styleAll { + background-color: #ffcfcb; + text-align: center; + border-radius: 0.03*100rpx; + font-size: 0.28*100rpx; + font-weight: bold; + display: inline-block; + vertical-align: middle; + color: #fc4141; + padding: 0.02*100rpx 0.05*100rpx; +} + +.group-con .wrapper .tips { + font-size: 0.3*100rpx; + font-weight: bold; + text-align: center; + margin-top: 0.3*100rpx; + color: #999; +} + +.group-con .wrapper .list { + padding: 0 0.3*100rpx; + margin-top: 0.45*100rpx; +} + +.group-con .wrapper .list.result { + max-height: 2.4*100rpx; + overflow: hidden; +} + +.group-con .wrapper .list.result.on { + max-height: 20*100rpx; +} + +.group-con .wrapper .list .pictrue { + width: 0.94*100rpx; + height: 0.94*100rpx; + margin: 0 0 0.29*100rpx 0.35*100rpx; +} + +.group-con .wrapper .list .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; + border: 0.02*100rpx solid #e93323; +} + +.group-con .wrapper .list .pictrue img.img-none { + border: none; +} + +.group-con .wrapper .lookAll { + font-size: 0.24*100rpx; + color: #282828; + padding-top: 0.1*100rpx; +} + +.group-con .wrapper .lookAll .iconfont { + font-size: 0.25*100rpx; + margin: 0.02*100rpx 0 0 0.1*100rpx; +} + +.group-con .wrapper .teamBnt { + font-size: 0.3*100rpx; + width: 6.2*100rpx; + height: 0.86*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.86*100rpx; + color: #fff; + margin: 0.21*100rpx auto 0 auto; +} + +.group-con .wrapper .cancel, +.group-con .wrapper .lookOrder { + text-align: center; + font-size: 0.24*100rpx; + color: #282828; + padding-top: 0.3*100rpx; +} + +.group-con .wrapper .cancel .iconfont { + font-size: 0.35*100rpx; + color: #2c2c2c; + vertical-align: -0.04*100rpx; + margin-right: 0.09*100rpx; +} + +.group-con .wrapper .lookOrder .iconfont { + font-size: 0.25*100rpx; + color: #2c2c2c; + margin-left: 0.1*100rpx; +} + +.group-con .group-recommend { + background-color: #fff; + margin-top: 0.25*100rpx; +} + +.group-con .group-recommend .title { + padding-right: 0.3*100rpx; + margin-left: 0.3*100rpx; + height: 0.85*100rpx; + border-bottom: 1px solid #eee; + font-size: 0.28*100rpx; + color: #282828; +} + +.group-con .group-recommend .title .more { + color: #808080; +} + +.group-con .group-recommend .title .more .iconfont { + margin-left: 0.13*100rpx; + font-size: 0.28*100rpx; +} + +.group-con .group-recommend .list { + margin-top: 0.3*100rpx; +} + +.group-con .group-recommend .list .item { + width: 2.1*100rpx; + margin: 0 0 0.25*100rpx 0.3*100rpx; +} + +.group-con .group-recommend .list .item .pictrue { + width: 100%; + height: 2.1*100rpx; + position: relative; +} + +.group-con .group-recommend .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.1*100rpx; +} + +.group-con .group-recommend .list .item .pictrue .team { + position: absolute; + top: 0.28*100rpx; + left: -0.05*100rpx; + min-width: 1*100rpx; + height: 0.36*100rpx; + line-height: 0.36*100rpx; + text-align: center; + border-radius: 0 0.18*100rpx 0.18*100rpx 0; + font-size: 0.2*100rpx; + color: #fff; + background-image: linear-gradient(to right, #fb5445 0%, #e93323 100%); + background-image: -moz-linear-gradient(to right, #fb5445 0%, #e93323 100%); +} + +.group-con .group-recommend .list .item .name { + font-size: 0.28*100rpx; + color: #333; + margin-top: 0.18*100rpx; +} + +.group-con .group-recommend .list .item .money { + font-weight: bold; + font-size: 0.26*100rpx; +} + +/*商品评分*/ +.evaluate-list .generalComment { + height: 0.94*100rpx; + padding: 0 0.3*100rpx; + background-color: #fff; + font-size: 0.28*100rpx; + color: #808080; +} + +.evaluate-list .generalComment .evaluate { + margin-right: 0.07*100rpx; +} + +.evaluate-list .nav { + font-size: 0.24*100rpx; + color: #282828; + padding: 0 0.3*100rpx 0.15*100rpx 0.3*100rpx; + background-color: #fff; + border-bottom: 1px solid #f5f5f5; +} + +.evaluate-list .nav .item { + font-size: 0.24*100rpx; + color: #282828; + border-radius: 0.06*100rpx; + height: 0.54*100rpx; + padding: 0 0.2*100rpx; + background-color: #f4f4f4; + line-height: 0.54*100rpx; + margin: 0 0.17*100rpx 0.17*100rpx 0; +} + +.evaluate-list .nav .item.bg-color-red { + color: #fff; +} + +/*商品评价*/ +.evaluate-con .score { + background-color: #fff; + border-top: 1px solid #f5f5f5; + font-size: 0.28*100rpx; + color: #282828; + padding: 0.48*100rpx 0.3*100rpx 0.65*100rpx 0.3*100rpx; +} + +.evaluate-con .score .item~.item { + margin-top: 0.25*100rpx; +} + +.evaluate-con .score .item .starsList { + padding: 0 0.35*100rpx 0 0.4*100rpx; +} + +.evaluate-con .score .item .starsList .iconfont { + font-size: 0.4*100rpx; + color: #aaa; +} + +.evaluate-con .score .item .starsList .iconfont~.iconfont { + margin-left: 0.2*100rpx; +} + +.evaluate-con .score .item .evaluate { + color: #aaa; + font-size: 0.24*100rpx; +} + +.evaluate-con .score .textarea { + width: 6.9*100rpx; + background-color: #fafafa; + border-radius: 0.1*100rpx; + margin-top: 0.48*100rpx; +} + +.evaluate-con .score .textarea textarea { + font-size: 0.28*100rpx; + padding: 0.38*100rpx 0.3*100rpx 0 0.3*100rpx; + width: 100%; + height: 1.6*100rpx; +} + +.evaluate-con .score .textarea textarea::placeholder { + color: #bbb; +} + +.evaluate-con .score .textarea .list { + margin-top: 0.25*100rpx; + padding-left: 0.05*100rpx; +} + +.evaluate-con .score .textarea .list .pictrue { + width: 1.4*100rpx; + height: 1.4*100rpx; + margin: 0 0 0.35*100rpx 0.25*100rpx; + position: relative; + font-size: 0.22*100rpx; + color: #bbb; +} + +.evaluate-con .score .textarea .list .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.03*100rpx; +} + +.evaluate-con .score .textarea .list .pictrue .icon-guanbi1 { + font-size: 0.45*100rpx; + position: absolute; + top: -0.2*100rpx; + right: -0.2*100rpx; +} + +.evaluate-con .score .textarea .list .pictrue .icon-icon25201 { + color: #bfbfbf; + font-size: 0.5*100rpx; +} + +.evaluate-con .score .evaluateBnt { + font-size: 0.3*100rpx; + color: #fff; + width: 6.9*100rpx; + height: 0.86*100rpx; + border-radius: 0.43*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin-top: 0.45*100rpx; +} + +/*签到*/ +.sign .header { + width: 100%; + height: 3.1*100rpx; +} + +.sign .header .headerCon { + padding: 0 0 0 0.3*100rpx; + height: 2.34*100rpx; +} + +.sign .header .headerCon .left { + width: 5.3*100rpx; + font-size: 0.32*100rpx; + color: #fff; + font-weight: bold; +} + +.sign .header .headerCon .left .integral text { + font-size: 0.24*100rpx; + margin-top: 0.19*100rpx; + background-color: #ff9000; + text-align: center; + border-radius: 0.06*100rpx; + font-weight: normal; + padding: 0.06*100rpx 0.15*100rpx; +} + +.sign .header .headerCon .text { + width: 4.1*100rpx; +} + +.sign .header .headerCon .left .pictrue { + width: 0.86*100rpx; + height: 0.86*100rpx; + border-radius: 50%; + border: 0.04*100rpx solid #ecddbc; +} + +.sign .header .headerCon .left .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; +} + +.sign .header .headerCon .right { + width: 1.42*100rpx; + height: 0.66*100rpx; + background-color: #fff; + border-radius: 0.5*100rpx 0 0 0.5*100rpx; + font-size: 0.24*100rpx; + color: #ff9000; +} + +.sign .header .headerCon .right .iconfont { + font-size: 0.33*100rpx; + padding: 0 0.1*100rpx 0 0.3*100rpx; + height: 0.35*100rpx; + line-height: 0.35*100rpx; +} + +.sign .wrapper { + background-color: #fff; + margin: -0.8*100rpx 0.2*100rpx 0 0.2*100rpx; + border-radius: 0.15*100rpx; + padding-bottom: 0.8*100rpx; + position: relative; +} + +.sign .wrapper .list { + padding: 0 0.3*100rpx; + height: 2.4*100rpx; +} + +.sign .wrapper .list .item { + font-size: 0.22*100rpx; + color: #8a8886; + text-align: center; +} + +.sign .wrapper .list .item .rewardTxt { + width: 0.74*100rpx; + height: 0.32*100rpx; + background-color: #f4b409; + border-radius: 0.16*100rpx; + font-size: 0.2*100rpx; + color: #a57d3f; + line-height: 0.32*100rpx; +} + +.sign .wrapper .list .item .num { + font-size: 0.3*100rpx; + color: #999; +} + +.sign .wrapper .list .item .num.on { + color: #ff9000; +} + +.sign .wrapper .list .item .venus { + background-image: url('https://h5.yixiang.co/static/images/stars2.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 0.56*100rpx; + height: 0.56*100rpx; + margin: 0.1*100rpx 0; +} + +.sign .wrapper .list .item .venus.venusSelect { + background-image: url('https://h5.yixiang.co/static/images/stars1.png'); +} + +.sign .wrapper .list .item .venus.reward { + background-image: url('https://h5.yixiang.co/static/images/stars3.png'); + width: 0.75*100rpx; + height: 0.56*100rpx; +} + +.sign .wrapper .but { + width: 4*100rpx; + height: 0.76*100rpx; + font-size: 0.3*100rpx; + line-height: 0.76*100rpx; + color: #fff; + border-radius: 0.5*100rpx; + text-align: center; + margin: 0 auto; +} + +.sign .wrapper .but.on { + background-color: #999 !important; +} + +.sign .wrapper .lock { + background-image: url('https://h5.yixiang.co/static/images/lock2.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 5.58*100rpx; + height: 0.68*100rpx; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: -0.41*100rpx; + z-index: 9; +} + +.sign .wrapper2 { + margin-top: 0.15*100rpx; + padding: 0.73*100rpx 0 0 0; +} + +.sign .wrapper2 .tip { + font-size: 0.3*100rpx; + color: #666; + text-align: center; +} + +.sign .wrapper2 .list2 { + margin: 0.45*100rpx 0 0.49*100rpx 0; +} + +.sign .wrapper2 .list2 .item { + width: 0.8*100rpx; + height: 1.16*100rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + color: #fff; + font-size: 0.72*100rpx; + text-align: center; + line-height: 1.16*100rpx; + margin-right: 0.19*100rpx; + background-image: url('https://h5.yixiang.co/static/images/redBg.png'); +} + +.sign .wrapper2 .list2 .data { + font-size: 0.30*100rpx; + color: #232323; +} + +.sign .wrapper2 .tip2 { + font-size: 0.3*100rpx; + color: #999999; + padding: 0 0.55*100rpx; + text-align: center; + line-height: 1.5; +} + +.sign .list3 { + margin: 0.45*100rpx 0.37*100rpx 0 0.37*100rpx; + border-top: 1px dashed #eee; +} + +.sign .list3 .item { + border-bottom: 1px solid #eee; + height: 1.3*100rpx; +} + +.sign .list3 .item .name { + color: #232323; + font-size: 0.3*100rpx; + width: 4*100rpx; +} + +.sign .list3 .item .data { + font-size: 0.24*100rpx; + color: #bbbbbb; + margin-top: 0.09*100rpx; +} + +.sign .list3 .item .num { + font-size: 0.36*100rpx; + font-family: 'GuildfordProBook 5'; +} + +.sign .signTip { + width: 6.44*100rpx; + height: 6.45*100rpx; + position: fixed; + top: 50%; + left: 50%; + margin-left: -3.22*100rpx; + margin-top: -3.225*100rpx; + z-index: 99; + text-align: center; + transition: all 0.3s ease-in-out 0s; + opacity: 0; + transform: scale(0); +} + +.sign .signTip .signTipLight { + background-repeat: no-repeat; + background-size: 100% 100%; + width: 100%; + height: 100%; +} + +.sign .signTip.on { + opacity: 1; + transform: scale(1); +} + +.sign .signTip .signTipCon { + background-image: url('https://h5.yixiang.co/static/images/register.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 4.2*100rpx; + height: 4.2*100rpx; + margin-top: -7*100rpx; + position: relative; +} + +.sign .signTip .signTipCon .state { + font-size: 0.34*100rpx; + color: #fff; + margin-top: 1.5*100rpx; +} + +.sign .signTip .signTipCon .integral { + font-size: 0.3*100rpx; + color: rgba(255, 255, 255, 0.6); + margin-top: 0.09*100rpx; +} + +.sign .signTip .signTipCon .signTipBnt { + font-size: 0.3*100rpx; + color: #eb4331; + width: 2.6*100rpx; + height: 0.76*100rpx; + background-color: #f8d168; + border-radius: 0.38*100rpx; + line-height: 0.76*100rpx; + margin: 0.48*100rpx auto 0 auto; +} + +/*签到记录、账单明细列表*/ +.sign-record .list .item .data { + height: 0.8*100rpx; + line-height: 0.8*100rpx; + padding: 0 0.3*100rpx; + font-size: 0.24*100rpx; + color: #666; +} + +.sign-record .list .item .listn { + background-color: #fff; + font-size: 0.24*100rpx; + color: #999; +} + +.sign-record .list .item .listn .itemn { + height: 1.2*100rpx; + border-bottom: 1px solid #eee; + padding-right: 0.3*100rpx; + margin-left: 0.3*100rpx; +} + +.sign-record .list .item .listn .itemn .name { + width: 3.9*100rpx; + font-size: 0.28*100rpx; + color: #282828; + margin-bottom: 0.06*100rpx; +} + +.sign-record .list .item .listn .itemn .num { + font-size: 0.36*100rpx; + font-family: 'GuildfordProBook 5'; + color: #16ac57; +} + +/*申请退货*/ +.apply-return .list { + background-color: #fff; + margin-top: 0.18*100rpx; +} + +.apply-return .list .item { + margin-left: 0.3*100rpx; + padding-right: 0.3*100rpx; + min-height: 0.9*100rpx; + border-bottom: 1px solid #eee; + font-size: 0.3*100rpx; + color: #333; +} + +.apply-return .list .item .num { + color: #282828; + flex: 1; + text-align: right; + position: relative; +} + +.apply-return .list .item .num .picker { + text-align: right; +} + +.apply-return .list .item .num .iconfont { + color: #666; + font-size: 0.3*100rpx; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.apply-return .list .item.textarea { + padding: 0.3*100rpx 0.3*100rpx 0.3*100rpx 0; +} + +.apply-return .list .item textarea { + height: 1*100rpx; + font-size: 0.3*100rpx; +} + +.apply-return .list .item textarea::placeholder { + color: #bbb; +} + +.apply-return .list .item .title { + height: 0.95*100rpx; + width: 100%; +} + +.apply-return .list .item .title .tip { + font-size: 0.3*100rpx; + color: #bbb; +} + +.apply-return .list .item .upload { + padding-bottom: 0.36*100rpx; +} + +.apply-return .list .item .upload .pictrue { + margin: 0.22*100rpx 0.23*100rpx 0 0; + width: 1.56*100rpx; + height: 1.56*100rpx; + position: relative; + font-size: 0.24*100rpx; + color: #bbb; + border: 1px solid #bbb; +} + +.apply-return .list .item .upload .pictrue:nth-of-type(4n) { + margin-right: 0; +} + +.apply-return .list .item .upload .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.03*100rpx; +} + +.apply-return .list .item .upload .pictrue .icon-guanbi1 { + position: absolute; + font-size: 0.45*100rpx; + top: -0.1*100rpx; + right: -0.1*100rpx; + width: 0.45*100rpx; + height: 0.45*100rpx; + line-height: 0.45*100rpx; +} + +.apply-return .list .item .upload .pictrue .icon-icon25201 { + color: #bfbfbf; + font-size: 0.5*100rpx; + width: 0.5*100rpx; + height: 0.6*100rpx; + line-height: 0.6*100rpx; +} + +.apply-return .list .item .upload .pictrue:nth-last-child(1) { + border: 1px solid #ddd; +} + +.apply-return .returnBnt { + font-size: 0.32*100rpx; + color: #fff; + width: 6.9*100rpx; + height: 0.86*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin: 0.43*100rpx auto; +} + +/*退货列表*/ +.return-list .goodWrapper { + background-color: #fff; + margin-bottom: 0.13*100rpx; + position: relative; +} + +.return-list .goodWrapper .orderNum { + padding: 0 0.3*100rpx; + border-bottom: 1px solid #eee; + height: 0.87*100rpx; + line-height: 0.87*100rpx; + font-size: 0.3*100rpx; + color: #282828; +} + +.return-list .goodWrapper .item { + border-bottom: 0; +} + +.return-list .goodWrapper .totalSum { + padding: 0 0.3*100rpx 0.32*100rpx 0.3*100rpx; + text-align: right; + font-size: 0.26*100rpx; + color: #282828; +} + +.return-list .goodWrapper .totalSum .price { + font-size: 0.28*100rpx; + font-weight: bold; +} + +.return-list .goodWrapper .iconfont { + position: absolute; + font-size: 1.09*100rpx; + top: 0.07*100rpx; + right: 0.3*100rpx; + color: #ccc; + width: 1.09*100rpx; + height: 1.09*100rpx; + line-height: 1.09*100rpx; +} + +.return-list .goodWrapper .iconfont.powder { + color: #f8c1bd; +} + +/*收藏商品*/ +.collectionGoods { + background-color: #fff; + border-top: 1px solid #eee; +} + +.collectionGoods .item { + margin-left: 0.3*100rpx; + padding-right: 0.3*100rpx; + border-bottom: 1px solid #eee; + height: 1.8*100rpx; +} + +.collectionGoods .item .pictrue { + width: 1.3*100rpx; + height: 1.3*100rpx; +} + +.collectionGoods .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.collectionGoods .item .text { + width: 5.35*100rpx; + height: 1.3*100rpx; + font-size: 0.28*100rpx; + color: #282828; +} + +.collectionGoods .item .text .infor { + width: 100%; +} + +.collectionGoods .item .text .money { + font-size: 0.26*100rpx; +} + +.collectionGoods .item .text .delete { + font-size: 0.26*100rpx; + color: #282828; + width: 1.14*100rpx; + height: 0.46*100rpx; + border: 1px solid #bbb; + border-radius: 0.04*100rpx; + text-align: center; + line-height: 0.46*100rpx; +} + +/*搜索商品*/ +.searchGood .search { + padding-left: 0.3*100rpx; +} + +.searchGood .search { + margin-top: 0.2*100rpx; +} + +.searchGood .search .input { + flex: 1; + box-sizing: border-box; + background-color: #f7f7f7; + border-radius: 0.33*100rpx; + padding: 0 0.35*100rpx; + height: 0.66*100rpx; +} + +.searchGood .search .input input { + flex: 1; + font-size: 0.28*100rpx; + margin-left: 15rpx; +} + +.searchGood .search .input input::placeholder { + color: #bbb; +} + +.searchGood .search .input .iconfont { + color: #000; + font-size: 0.35*100rpx; +} + +.searchGood .search .bnt { + width: 1.2*100rpx; + text-align: center; + height: 0.66*100rpx; + line-height: 0.66*100rpx; + font-size: 0.3*100rpx; + color: #282828; +} + +.searchGood .title { + font-size: 0.28*100rpx; + color: #999; + margin: 0.5*100rpx 0.3*100rpx 0.25*100rpx 0.3*100rpx; +} + +.searchGood .list { + padding-left: 0.1*100rpx; +} + +.searchGood .list .item { + font-size: 0.26*100rpx; + color: #454545; + padding: 0 0.21*100rpx; + height: 0.6*100rpx; + border-radius: 0.03*100rpx; + line-height: 0.6*100rpx; + border: 1px solid #aaa; + margin: 0 0 0.2*100rpx 0.2*100rpx; +} + +.searchGood .line { + border-bottom: 1px solid #eee; + margin: 0.2*100rpx 0.3*100rpx 0 0.3*100rpx; +} + +/*银行卡提现*/ +.cash-withdrawal .nav { + height: 1.3*100rpx; + box-shadow: 0 0.1*100rpx 0.1*100rpx #f8f8f8; + -moz-box-shadow: 0 0.1*100rpx 0.1*100rpx #f8f8f8; + -o-box-shadow: 0 0.1*100rpx 0.1*100rpx #f8f8f8; +} + +.cash-withdrawal .nav .item { + font-size: 0.26*100rpx; + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; +} + +.cash-withdrawal .nav .item~.item { + border-left: 1px solid #f0f0f0; +} + +.cash-withdrawal .nav .item .iconfont { + width: 0.4*100rpx; + height: 0.4*100rpx; + border-radius: 50%; + border: 0.02*100rpx solid #e93323; + text-align: center; + line-height: 0.37*100rpx; + margin: 0 auto 0.06*100rpx auto; + font-size: 0.22*100rpx; +} + +.cash-withdrawal .nav .item .iconfont.on { + background-color: #e93323; + color: #fff; + border-color: #e93323; +} + +.cash-withdrawal .nav .item .line { + width: 0.02*100rpx; + height: 0.2*100rpx; + margin: 0 auto; + transition: height 0.3s; +} + +.cash-withdrawal .nav .item .line.on { + height: 0.39*100rpx; +} + +.cash-withdrawal .wrapper .list { + padding: 0 0.3*100rpx; +} + +.cash-withdrawal .wrapper .list .item { + border-bottom: 1px solid #eee; + height: 1.07*100rpx; + font-size: 0.3*100rpx; + color: #333; +} + +.cash-withdrawal .wrapper .list .item .name { + width: 1.3*100rpx; +} + +.cash-withdrawal .wrapper .list .item .input { + width: 5.05*100rpx; +} + +.cash-withdrawal .wrapper .list .item .input input::placeholder { + color: #bbb; +} + +.cash-withdrawal .wrapper .list .tip { + font-size: 0.26*100rpx; + color: #999; + margin-top: 0.25*100rpx; +} + +.cash-withdrawal .wrapper .list .bnt { + font-size: 0.32*100rpx; + color: #fff; + width: 6.9*100rpx; + height: 0.9*100rpx; + text-align: center; + border-radius: 0.5*100rpx; + line-height: 0.9*100rpx; + margin: 0.64*100rpx auto; +} + +.cash-withdrawal .wrapper .list .tip2 { + font-size: 0.26*100rpx; + color: #999; + text-align: center; + margin: 0.44*100rpx 0 0.2*100rpx 0; +} + +.cash-withdrawal .wrapper .list .value { + height: 1.35*100rpx; + line-height: 1.35*100rpx; + border-bottom: 1px solid #eee; + width: 6.9*100rpx; + margin: 0 auto; +} + +.cash-withdrawal .wrapper .list .value input { + font-size: 0.8*100rpx; + color: #282828; + height: 1.35*100rpx; + text-align: center; + width: 100%; +} + +.cash-withdrawal .wrapper .list .value input::placeholder { + color: #bbb; +} + +/*提现审核*/ +.cash-audit { + // width: 7.1*100rpx; + background-color: #fff; + border-radius: 0.06*100rpx; + margin: 0.25*100rpx 10rpx 0 10rpx; + padding: 0.53*100rpx 0 0.58*100rpx 0; + // left: 50%; + // margin-left: -3.55*100rpx; +} + +.cash-audit .pictrue { + width: 2.14*100rpx; + height: 1.79*100rpx; + margin: 0 auto; +} + +.cash-audit .pictrue image { + width: 100%; + height: 100%; +} + +.cash-audit .tip { + font-size: 0.32*100rpx; + color: #282828; + margin-top: 0.4*100rpx; + text-align: center; + padding: 0 0.4*100rpx; +} + +.cash-audit .time { + font-size: 0.26*100rpx; + color: #999; + text-align: center; + margin-top: 0.15*100rpx; +} + +.cash-audit .bnt { + font-size: 0.32*100rpx; + color: #fff; + width: 5*100rpx; + height: 0.86*100rpx; + border-radius: 0.43*100rpx; + text-align: center; + line-height: 0.86*100rpx; + margin: 0.5*100rpx auto 0 auto; +} + +/*推广人订单*/ +.promoter-order .list .item .title { + height: 1.33*100rpx; + padding: 0 0.3*100rpx; + font-size: 0.26*100rpx; + color: #999; +} + +.promoter-order .list .item .title .data { + font-size: 0.28*100rpx; + color: #282828; + margin-bottom: 0.05*100rpx; +} + +.promoter-order .list .item .listn .itenm { + background-color: #fff; +} + +.promoter-order .list .item .listn .itenm~.itenm { + margin-top: 0.12*100rpx; +} + +.promoter-order .list .item .listn .itenm .top { + margin-left: 0.3*100rpx; + padding-right: 0.3*100rpx; + border-bottom: 1px solid #eee; + height: 1*100rpx; +} + +.promoter-order .list .item .listn .itenm .top .pictxt { + width: 3.2*100rpx; +} + +.promoter-order .list .item .listn .itenm .top .pictxt .text { + width: 2.3*100rpx; + font-size: 0.3*100rpx; + color: #282828; +} + +.promoter-order .list .item .listn .itenm .top .pictxt .pictrue { + width: 0.66*100rpx; + height: 0.66*100rpx; +} + +.promoter-order .list .item .listn .itenm .top .pictxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; + border: 0.03*100rpx solid #fff; + box-shadow: 0 0 0.1*100rpx #aaa; + -moz-box-shadow: 0 0 0.1*100rpx #aaa; + -o-box-shadow: 0 0 0.1*100rpx #aaa; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.promoter-order .list .item .listn .itenm .top .money { + font-size: 0.28*100rpx; +} + +.promoter-order .list .item .listn .itenm .bottom { + padding: 0.2*100rpx 0.3*100rpx; + font-size: 0.28*100rpx; + color: #666; + line-height: 1.6; +} + +.promoter-order .list .item .listn .itenm .bottom .name { + color: #999; +} + +/*推广人列表*/ +.promoter-list .header { + padding-bottom: 0.12*100rpx; +} + +.promoter-list .nav { + background-color: #fff; + height: 0.86*100rpx; + line-height: 0.86*100rpx; + font-size: 0.28*100rpx; + color: #282828; + border-bottom: 1px solid #eee; +} + +.promoter-list .nav .item { + height: 100%; +} + +.promoter-list .nav .item.on { + color: #eb3729; + border-bottom: 0.05*100rpx solid #eb3729; +} + +.promoter-list .search { + box-sizing: border-box; + + width: 100%; + background-color: #fff; + height: 0.86*100rpx; + padding: 0 0.3*100rpx; +} + +.promoter-list .search .input { + width: 6.3*100rpx; + height: 0.6*100rpx; + border-radius: 0.5*100rpx; + background-color: #f5f5f5; + text-align: center; + position: relative; +} + +.promoter-list .search .input input { + height: 100%; + font-size: 0.26*100rpx; + width: 6.2*100rpx; + text-align: center; +} + +.promoter-list .search .input input::placeholder { + color: #bbb; +} + +.promoter-list .search .input .iconfont { + position: absolute; + right: 0.28*100rpx; + color: #999; + font-size: 0.28*100rpx; + top: 50%; + transform: translateY(-50%); +} + +.promoter-list .search .iconfont { + font-size: 0.4*100rpx; + color: #515151; +} + +.promoter-list .list .sortNav { + background-color: #fff; + height: 0.76*100rpx; + border-bottom: 1px solid #eee; + color: #333; + font-size: 0.28*100rpx; +} + +.promoter-list .list .sortNav.on { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 5; +} + +.promoter-list .list .sortNav .sortItem { + text-align: center; + flex: 1; + -o-flex: 1; + -ms-flex: 1; +} + +.promoter-list .list .sortNav .sortItem image { + width: 0.24*100rpx; + height: 0.24*100rpx; + margin-left: 0.06*100rpx; + vertical-align: -0.03*100rpx; +} + +.promoter-list .list .sortList { + margin-top: 0.76*100rpx; +} + +.promoter-list .list .item { + background-color: #fff; + border-bottom: 1px solid #eee; + height: 1.52*100rpx; + padding: 0 0.3*100rpx 0 0.2*100rpx; + font-size: 0.24*100rpx; + color: #666; +} + +.promoter-list .list .item .picTxt { + width: 4.4*100rpx; +} + +.promoter-list .list .item .picTxt .pictrue { + width: 1.06*100rpx; + height: 1.06*100rpx; + border-radius: 50%; +} + +.promoter-list .list .item .picTxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 50%; + border: 0.03*100rpx solid #fff; + box-shadow: 0 0 0.07*100rpx #aaa; + -moz-box-shadow: 0 0 0.07*100rpx #aaa; + -o-box-shadow: 0 0 0.07*100rpx #aaa; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.promoter-list .list .item .picTxt .text { + width: 3.04*100rpx; + font-size: 0.24*100rpx; + color: #666; +} + +.promoter-list .list .item .picTxt .text .name { + font-size: 0.28*100rpx; + color: #333; + margin-bottom: 0.13*100rpx; +} + +.promoter-list .list .item .right { + width: 2.4*100rpx; + text-align: right; + font-size: 0.22*100rpx; + color: #333; +} + +/*我的推广*/ +.my-promotion .header { + background-image: url("http://admin-api.xdd618.com/file/pic/20210203152923682218.png"); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 100%; + height: 3.75*100rpx; +} + +.my-promotion .header .name { + font-size: 0.3*100rpx; + color: #fff; + padding-top: 0.57*100rpx; + position: relative; +} + +.my-promotion .header .name .record { + font-size: 0.26*100rpx; + color: rgba(255, 255, 255, 0.8); + position: absolute; + right: 0.2*100rpx; +} + +.my-promotion .header .name .record .iconfont { + font-size: 0.25*100rpx; + margin-left: 0.1*100rpx; +} + +.my-promotion .header .num { + text-align: center; + color: #fff; + // margin-top: 0.25*100rpx; + font-size: 0.9*100rpx; + font-family: 'GuildfordProBook 5'; +} + +.my-promotion .header .profit { + padding: 0 0.2*100rpx; + margin-top: 0.33*100rpx; + font-size: 0.24*100rpx; + color: rgba(255, 255, 255, 0.8); +} + +.my-promotion .header .profit .item { + min-width: 2*100rpx; + text-align: center; +} + +.my-promotion .header .profit .item .money { + font-size: 0.34*100rpx; + color: #fff; +} + +.my-promotion .bnt { + font-size: 0.28*100rpx; + color: #fff; + width: 2.58*100rpx; + height: 0.68*100rpx; + border-radius: 0.5*100rpx; + text-align: center; + line-height: 0.68*100rpx; + margin: -0.32*100rpx auto 0 auto; +} + +.my-promotion .list { + padding: 0 0.2*100rpx; + margin-top: 0.1*100rpx; +} + +.my-promotion .list .item { + width: 3.45*100rpx; + height: 2.4*100rpx; + border-radius: 0.2*100rpx; + background-color: #fff; + margin-top: 0.2*100rpx; + font-size: 0.3*100rpx; + color: #666; +} + +.my-promotion .list .item .iconfont { + font-size: 0.7*100rpx; + /* background-image: linear-gradient(to right, #eb3729 0%, #eb3729 100%); */ + /* background-image: -moz-linear-gradient(to right, #eb3729 0%, #eb3729 100%); */ + margin-bottom: 0.2*100rpx; + color: #eb3729 +} + +/*我的账户*/ +.my-account .wrapper { + background-color: #fff; + padding: 0.32*100rpx 0 0.34*100rpx 0; + margin-bottom: 0.14*100rpx; +} + +.my-account .wrapper .header { + width: 6.9*100rpx; + height: 3.3*100rpx; + background-image: linear-gradient(to right, #eb3729 0%, #eb3729 100%); + background-image: -moz-linear-gradient(to right, #eb3729 0%, #eb3729 100%); + border-radius: 0.16*100rpx; + margin: 0 auto; + color: rgba(255, 255, 255, 0.6); + font-size: 0.24*100rpx; +} + +.my-account .wrapper .header .headerCon { + height: 100%; + width: 100%; + padding: 0.36*100rpx 0 0.29*100rpx 0; +} + +.my-account .wrapper .header .headerCon .account { + padding: 0 0.35*100rpx; +} + +.my-account .wrapper .header .headerCon .account .assets .money { + font-size: 0.72*100rpx; + color: #fff; + font-family: 'GuildfordProBook 5'; + margin-top: 0.1*100rpx; + height: 0.75*100rpx; + line-height: 0.75*100rpx; +} + +.my-account .wrapper .header .headerCon .account .recharge { + font-size: 0.28*100rpx; + width: 1.5*100rpx; + height: 0.54*100rpx; + border-radius: 0.27*100rpx; + background-color: #fff9f8; + text-align: center; + line-height: 0.54*100rpx; +} + +.my-account .wrapper .header .headerCon .cumulative { + margin-top: 0.46*100rpx; +} + +.my-account .wrapper .header .headerCon .cumulative .item { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + padding-left: 0.35*100rpx; +} + +.my-account .wrapper .header .headerCon .cumulative .item .money { + font-size: 0.48*100rpx; + font-family: 'GuildfordProBook 5'; + color: #fff; + margin-top: 0.06*100rpx; +} + +.my-account .wrapper .nav { + height: 1.55*100rpx; + border-bottom: 1px solid #f5f5f5; +} + +.my-account .wrapper .nav .item { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; + font-size: 0.26*100rpx; + color: #999; +} + +.my-account .wrapper .nav .item .pictrue { + width: 0.44*100rpx; + height: 0.44*100rpx; + margin: 0 auto; + margin-bottom: 0.2*100rpx; +} + +.my-account .wrapper .nav .item .pictrue image { + width: 100%; + height: 100%; +} + +.my-account .wrapper .advert { + padding: 0 0.3*100rpx; + margin-top: 0.3*100rpx; +} + +.my-account .wrapper .advert .item { + background-color: #fff6d1; + width: 3.32*100rpx; + height: 1.18*100rpx; + border-radius: 0.1*100rpx; + padding: 0 0.27*100rpx 0 0.25*100rpx; + font-size: 0.24*100rpx; + color: #e44609; +} + +.my-account .wrapper .advert .item.on { + background-color: #fff3f3; + color: #e96868; +} + +.my-account .wrapper .advert .item .pictrue { + width: 0.78*100rpx; + height: 0.78*100rpx; +} + +.my-account .wrapper .advert .item .pictrue image { + width: 100%; + height: 100%; +} + +.my-account .wrapper .advert .item .text .name { + font-size: 0.3*100rpx; + font-weight: bold; + color: #f33c2b; + margin-bottom: 0.07*100rpx; +} + +.my-account .wrapper .advert .item.on .text .name { + color: #f64051; +} + +.my-account .wrapper .list { + padding: 0 0.3*100rpx; +} + +.my-account .wrapper .list .item { + margin-top: 0.44*100rpx; +} + +.my-account .wrapper .list .item .picTxt .iconfont { + width: 0.82*100rpx; + height: 0.82*100rpx; + border-radius: 50%; + background-image: linear-gradient(to right, #ff9389 0%, #f9776b 100%); + background-image: -moz-linear-gradient(to right, #ff9389 0%, #f9776b 100%); + text-align: center; + line-height: 0.82*100rpx; + color: #fff; + font-size: 0.4*100rpx; +} + +.my-account .wrapper .list .item .picTxt .iconfont.yellow { + background-image: linear-gradient(to right, #ffccaa 0%, #fea060 100%); + background-image: -moz-linear-gradient(to right, #ffccaa 0%, #fea060 100%); +} + +.my-account .wrapper .list .item .picTxt .iconfont.green { + background-image: linear-gradient(to right, #a1d67c 0%, #9dd074 100%); + background-image: -moz-linear-gradient(to right, #a1d67c 0%, #9dd074 100%); +} + +.my-account .wrapper .list .item .picTxt { + width: 4.28*100rpx; + font-size: 0.3*100rpx; + color: #282828; +} + +.my-account .wrapper .list .item .picTxt .text { + width: 3.17*100rpx; +} + +.my-account .wrapper .list .item .picTxt .text .infor { + font-size: 0.24*100rpx; + color: #999; + margin-top: 0.05*100rpx; +} + +.my-account .wrapper .list .item .bnt { + font-size: 0.26*100rpx; + color: #282828; + width: 1.56*100rpx; + height: 0.52*100rpx; + border: 1px solid #ddd; + border-radius: 0.26*100rpx; + text-align: center; + line-height: 0.5*100rpx; +} + +.my-account .wrapper .list .item .bnt.end { + font-size: 0.26*100rpx; + color: #aaa; + background-color: #f2f2f2; + border-color: #f2f2f2; +} + +/*账单明细*/ +.bill-details .nav { + background-color: #fff; + height: 0.9*100rpx; + width: 100%; + line-height: 0.9*100rpx; +} + +.bill-details .nav .item { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; + font-size: 0.3*100rpx; + color: #282828; + height: 100%; +} + +.bill-details .nav .item.on { + color: #e93323; + border-bottom: 0.03*100rpx solid #e93323; +} + +/*限时抢购*/ +.flash-sale .header { + width: 100%; + height: 2.4*100rpx; +} + +.flash-sale .header image { + width: 100%; + height: 100%; +} + +.flash-sale .whiteFixed { + position: fixed; + top: 0; + background-color: #fff; + left: 0; + width: 100%; + z-index: 5; +} + +.flash-sale .timeLsit { + width: 100%; + white-space: nowrap; + overflow: hidden; + height: 1.1*100rpx; +} + +.flash-sale .timeLsit .rush-time { + overflow-y: hidden; + overflow-x: auto; + width: 100%; + height: 1.5*100rpx; +} + +.flash-sale .timeLsit .item { + display: inline-block; + font-size: 0.22*100rpx; + color: #282828; + width: 2*100rpx; + text-align: center; + padding: 0.11*100rpx 0; + height: 0.96*100rpx; + background-color: #efc58f; +} + +.flash-sale .timeLsit .item~.item { + border-left: 1px solid #e3b06e; +} + +.flash-sale .timeLsit .item .time { + font-size: 0.32*100rpx; + font-weight: bold; + height: 0.37*100rpx; + line-height: 0.37*100rpx; +} + +.flash-sale .timeLsit .item.on { + background-color: #e93323; + color: #fff; + position: relative; +} + +.flash-sale .timeLsit .item.on::before { + content: ""; + width: 0; + height: 0; + border-left: 0.08*100rpx solid transparent; + border-right: 0.08*100rpx solid transparent; + border-top: 0.1*100rpx solid #e93323; + position: absolute; + bottom: -0.09*100rpx; + z-index: 99; + left: 50%; + transform: translateX(-50%); +} + +.flash-sale .countDown { + height: 0.92*100rpx; + border-bottom: 1px solid #f0f0f0; + font-size: 0.28*100rpx; + color: #282828; +} + +.flash-sale .countDown .timeTxt { + color: #fc4141; +} + +.flash-sale .countDown .time { + font-size: 0.28*100rpx; + color: #282828 +} + +.flash-sale .countDown .styleAll { + font-size: 0.28*100rpx; + font-weight: bold; + background-color: #ffcfcb; + padding: 0.04*100rpx 0.07*100rpx; + border-radius: 0.03*100rpx; + color: #fc4141; +} + +.flash-sale .countDown .text {} + +.flash-sale .list.on { + margin-top: 2.02*100rpx; +} + +.flash-sale .list .item { + padding: 0 0.3*100rpx; + border-bottom: 1px solid #f0f0f0; + height: 2.27*100rpx; + position: relative; +} + +.flash-sale .list .item .pictrue { + width: 1.66*100rpx; + height: 1.66*100rpx; +} + +.flash-sale .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.flash-sale .list .item .text { + width: 5*100rpx; + font-size: 0.3*100rpx; + color: #333; + height: 1.66*100rpx; +} + +.flash-sale .list .item .text .money { + font-size: 0.24*100rpx; + color: #282828; + margin-top: -0.13*100rpx; +} + +.flash-sale .list .item .text .money .num { + font-size: 0.34*100rpx; + font-weight: bold; +} + +.flash-sale .list .item .text .progress { + overflow: hidden; + background-color: #fff; + width: 2.6*100rpx; + border-radius: 0.2*100rpx; + height: 0.34*100rpx; + position: relative; +} + +.flash-sale .list .item .text .progress .bg-red { + width: 0; + height: 100%; + transition: width 0.6s ease; + background-color: #ffe3e1; +} + +.flash-sale .list .item .text .progress .piece { + position: absolute; + left: 0; + right: 0; + transform: translate(0, -50%); + top: 49%; + font-size: 0.22*100rpx; + word-wrap: normal; + text-align: center; +} + +.flash-sale .list .item .grab { + font-size: 0.28*100rpx; + color: #fff; + width: 1.4*100rpx; + height: 0.54*100rpx; + border-radius: 0.04*100rpx; + text-align: center; + line-height: 0.54*100rpx; + position: absolute; + right: 0.3*100rpx; + bottom: 0.3*100rpx; +} + +/*抢购详情页*/ +.product-con .nav { + box-sizing: border-box; + background-image: url('https://h5.yixiang.co/static/images/rushBuy.jpg'); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 100%; + height: 1*100rpx; + padding: 0 0.3*100rpx; +} + +.product-con .nav .money { + font-size: 0.28*100rpx; + color: #fff; +} + +.product-con .nav .money .num { + font-size: 0.48*100rpx; +} + +.product-con .nav .money .y-money { + font-size: 0.26*100rpx; + margin-left: 0.1*100rpx; + text-decoration: line-through; +} + +.product-con .nav .times { + font-size: 0.2*100rpx; + color: #fff; + text-align: center; + margin-bottom: 0.04*100rpx; +} + +.product-con .nav .times .time { + margin-top: 0.07*100rpx; +} + +.product-con .nav .times .time .styleAll { + padding: 0 0.07*100rpx; + font-size: 0.22*100rpx; + color: #ff3d3d; + background-color: #fff; + border-radius: 0.02*100rpx; +} + +.product-con .nav .iconfont { + color: #fff; + font-size: 0.3*100rpx; + margin-left: 0.2*100rpx; +} + +.product-con .wrapperRush { + padding: 0.32*100rpx 0.3*100rpx; + background-color: #fff; +} + +.product-con .wrapperRush .introduce .infor { + width: 5.7*100rpx; + font-size: 0.32*100rpx; + font-weight: bold; +} + +.product-con .wrapperRush .introduce .iconfont { + font-size: 0.37*100rpx; + color: #515151; +} + +.product-con .wrapperRush .label { + margin: 0.18*100rpx 0 0 0; + font-size: 0.24*100rpx; + color: #82848f; +} + +.product-con .wrapperRush .label .stock { + width: 2.55*100rpx; + margin-right: 0.28*100rpx; +} + +.product-con .footerRush { + position: fixed; + bottom: 0; + width: 100%; + height: 1*100rpx; + background-color: #fff; + font-size: 0.18*100rpx; + color: #666; + z-index: 99; +} + +.product-con .footerRush .customerSer { + width: 14%; + font-size: 0.2*100rpx; + color: #666; +} + +.product-con .footerRush .bnt { + width: 100%; + text-align: center; + line-height: 1*100rpx; + height: 100%; + color: #fff; + font-size: 0.3*100rpx; +} + +/*新闻*/ +.newsList .swiperNews { + width: 6.9*100rpx; + height: 3.67*100rpx; + margin: 0.3*100rpx auto 0 auto; +} + +.newsList .swiperNews .swiper-slide { + width: 100%; + height: 3.3*100rpx; +} + +.newsList .swiperNews .slide-image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.newsList .swiperNews .swiper-pagination-bullet { + width: 0.12*100rpx; + height: 0.12*100rpx; + border-radius: 0; + transform: rotate(-45deg); + transform-origin: 0 100%; + -ms-transform-origin: 0 100%; + -o-transform-origin: 0 100%; + background-color: #d1d1d1; + opacity: 1; + margin: 0 0.1*100rpx; +} + +.newsList .swiperNews .swiper-pagination-bullet-active { + background-color: #666666; + border: 0; +} + +.newsList .swiperNews .swiper-pagination { + bottom: -0.07*100rpx; + width: 100%; +} + +.newsList .nav { + padding: 0 0.3*100rpx; + width: 100%; + height: 1.05*100rpx; + overflow: hidden; + background-color: #fff; +} + +.newsList .nav.on { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 5; +} + +.newsList .nav .scrollNav { + white-space: nowrap; + overflow-y: hidden; + overflow-x: auto; + width: 100%; +} + +.newsList .nav .item { + display: inline-block; + font-size: 0.32*100rpx; + color: #999; + margin-top: 0.4*100rpx; +} + +.newsList .nav .item.on { + color: #282828; +} + +.newsList .nav .item~.item { + margin-left: 0.46*100rpx; +} + +.newsList .nav .item .line { + width: 0.24*100rpx; + height: 0.04*100rpx; + border-radius: 0.02*100rpx; + margin: 0.1*100rpx auto 0 auto; +} + +.newsList .list.on { + margin-top: 1.05*100rpx; +} + +.newsList .list .item { + margin: 0 0.3*100rpx; + border-bottom: 1px solid #f0f0f0; + padding: 0.35*100rpx 0; +} + +.newsList .list .item .pictrue { + width: 2.5*100rpx; + height: 1.56*100rpx; +} + +.newsList .list .item .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.newsList .list .item .text { + width: 4.2*100rpx; + height: 1.56*100rpx; + font-size: 0.24*100rpx; + color: #999; +} + +.newsList .list .item .text .name { + font-size: 0.3*100rpx; + color: #282828; +} + +.newsList .list .item .picList .pictrue { + width: 3.35*100rpx; + height: 2.1*100rpx; + margin-top: 0.3*100rpx; +} + +.newsList .list .item .picList.on .pictrue { + width: 2.17*100rpx; + height: 1.36*100rpx; +} + +.newsList .list .item .picList .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.newsList .list .item .time { + text-align: right; + font-size: 0.24*100rpx; + color: #999; + margin-top: 0.22*100rpx; +} + +.newsList .van-tabs__wrap { + top: 0 !important; +} + +/*新闻详情*/ +.newsDetail .title { + padding: 0 0.3*100rpx; + font-size: 0.34*100rpx; + color: #282828; + font-weight: bold; + margin: 0.45*100rpx 0 0.23*100rpx 0; + line-height: 1.5; +} + +.newsDetail .list { + margin: 0 0.3*100rpx; + border-bottom: 1px solid #eee; + padding-bottom: 0.25*100rpx; +} + +.newsDetail .list .label { + font-size: 0.24*100rpx; + height: 0.38*100rpx; + border-radius: 0.03*100rpx; + text-align: center; + line-height: 0.36*100rpx; + padding: 0 0.1*100rpx; + max-width: 1.9*100rpx; + width: unset; +} + +.newsDetail .list .item { + margin-left: 0.27*100rpx; + font-size: 0.24*100rpx; + color: #999; +} + +.newsDetail .list .item .iconfont { + font-size: 0.28*100rpx; + margin-right: 0.1*100rpx; +} + +.newsDetail .list .item .iconfont.icon-shenhezhong { + font-size: 0.26*100rpx; +} + +.newsDetail .conter { + padding: 0 0.3*100rpx; + font-size: 0.3*100rpx; + color: #333; + line-height: 1.8; + padding-top: 0.35*100rpx; +} + +.newsDetail .conter image { + width: 100%; + display: block; +} + +/*佣金明细*/ +.commission-details .promoterHeader .headerCon .money { + font-size: 0.36*100rpx; +} + +.commission-details .promoterHeader .headerCon .money .num { + font-family: 'GuildfordProBook 5'; +} + +/*立即注册*/ +.register { + background-image: linear-gradient(to bottom, #eb3729 0%, #eb3729 100%); + background-image: -moz-linear-gradient(to bottom, #eb3729 0%, #eb3729 100%); + width: 100%; + height: 100vh; +} + +.register .shading { + background-image: url("https://h5.yixiang.co/static/images/registerw.png"); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 100%; + height: 2.86*100rpx; + padding-top: 0.7*100rpx; +} + +.register .shading .pictrue { + width: 1.72*100rpx; + height: 1.72*100rpx; + border-radius: 50%; + background-color: rgba(255, 255, 255, 0.8); + margin: 0 auto; +} + +.register .shading .pictrue image { + width: 1.64*100rpx; + height: 1.64*100rpx; + border-radius: 50%; + display: block; +} + +.register .whiteBg { + width: 6.2*100rpx; + border-radius: 0.16*100rpx; + background-color: #fff; + margin: 0.3*100rpx auto 0 auto; + padding: 0.45*100rpx 0.3*100rpx 0 0.3*100rpx; +} + +.register .whiteBg .title { + font-size: 0.36*100rpx; + color: #282828; + text-align: center; + font-weight: bold; +} + +.register .whiteBg .title .item~.item { + margin-left: 0.85*100rpx; +} + +.register .whiteBg .title .item { + color: #999999; + border-bottom: 0.05*100rpx solid #fff; + padding-bottom: 0.1*100rpx; +} + +.register .whiteBg .title .item.on { + color: #282828; + border-bottom-color: #f35749; +} + +.register .whiteBg .list .item { + border-bottom: 1px solid #ededed; + padding: 0.47*100rpx 0 0.13*100rpx 0; + position: relative; +} + +.register .whiteBg .list .item .name { + font-size: 0.26*100rpx; + color: #2d3342; + margin-bottom: 0.27*100rpx; + text-align: left; +} + +.register .whiteBg .list .item .icon { + font-size: 0.35*100rpx; + margin-right: 0.32*100rpx; +} + +.register .whiteBg .list .item input { + font-size: 0.33*100rpx; + width: 4.9*100rpx; +} + +.register .whiteBg .list .item input::placeholder { + color: #cccccc; +} + +.register .whiteBg .list .item .codeIput { + width: 2.5*100rpx; +} + +.register .whiteBg .list .item .code { + position: absolute; + width: 1.5*100rpx; + height: 0.5*100rpx; + background-color: #f35446; + border-radius: 0.3*100rpx; + color: #fff; + line-height: 0.5*100rpx; + text-align: center; + bottom: 0.17*100rpx; + right: 0; + font-size: 0.25*100rpx; +} + +.register .whiteBg .list .item .code.on { + background-color: #bbbbbb; +} + +.register .whiteBg .list .forgetPwd { + text-align: right; + font-size: 0.28*100rpx; + color: #cccccc; + margin-top: 0.2*100rpx; +} + +.register .whiteBg .list .forgetPwd .iconfont { + font-size: 0.3*100rpx; + margin-right: 0.1*100rpx; + vertical-align: middle; +} + +.register .whiteBg .logon { + font-size: 0.34*100rpx; + color: #fff; + font-weight: bold; + height: 0.86*100rpx; + border-radius: 0.43*100rpx; + background: linear-gradient(to right, #f35447 0%, #ff8e3c 100%); + background: -moz-linear-gradient(to right, #f35447 0%, #ff8e3c 100%); + text-align: center; + line-height: 0.86*100rpx; + margin-top: 0.47*100rpx; +} + +.register .whiteBg .tip { + height: 1.1*100rpx; + text-align: center; + line-height: 1.05*100rpx; + font-size: 0.3*100rpx; + color: #cccccc; +} + +.register .bottom { + background-image: url("https://h5.yixiang.co/static/images/registerB.png"); + background-repeat: no-repeat; + background-size: 100% 100%; + width: 6.2*100rpx; + height: 0.36*100rpx; + margin: 0 auto; +} + +/*返回主页按钮*/ +.home { + position: fixed; + top: 7.8*100rpx; + color: white; + text-align: center; + z-index: 33; + right: 0.1*100rpx; +} + +.home .homeCon { + overflow: hidden; + width: 0.86*100rpx; + border-radius: 0.5*100rpx; + transition: all 0.3s ease-in-out 0s; + opacity: 0; + transform: scale(0); + height: 0; + color: #e93323; +} + +.home .homeCon.on { + opacity: 1; + transform: scale(1); + height: 3*100rpx; + padding: 0.34*100rpx 0; + margin-bottom: 0.2*100rpx; +} + +.home .homeCon .iconfont { + font-size: 0.48*100rpx; + color: #fff; + display: inline-block; + height: 0.9*100rpx; + margin: 0 auto; +} + +.home .pictrue { + width: 0.86*100rpx; + height: 0.86*100rpx; + border-radius: 50%; +} + +.home .pictrue .image { + width: 100%; + height: 100%; + border-radius: 50%; +} + +/*商户管理公共样式*/ +.pos-order-goods { + padding: 0 0.3*100rpx; + background-color: #fff; +} + +.pos-order-goods .goods { + height: 1.85*100rpx; +} + +.pos-order-goods .goods~.goods { + border-top: 1px dashed #e5e5e5; +} + +.pos-order-goods .goods .picTxt { + width: 5.15*100rpx; +} + +.pos-order-goods .goods .picTxt .pictrue { + width: 1.3*100rpx; + height: 1.3*100rpx; +} + +.pos-order-goods .goods .picTxt .pictrue image { + width: 100%; + height: 100%; + border-radius: 0.06*100rpx; +} + +.pos-order-goods .goods .picTxt .text { + width: 3.65*100rpx; + height: 1.3*100rpx; +} + +.pos-order-goods .goods .picTxt .text .info { + font-size: 0.28*100rpx; + color: #282828; +} + +.pos-order-goods .goods .picTxt .text .attr { + font-size: 0.2*100rpx; + color: #999; +} + +.pos-order-goods .goods .money { + width: 1.64*100rpx; + text-align: right; + font-size: 0.28*100rpx; +} + +.pos-order-goods .goods .money .x-money { + color: #282828; +} + +.pos-order-goods .goods .money .num { + color: #ff9600; + margin: 0.05*100rpx 0; +} + +.pos-order-goods .goods .money .y-money { + color: #999; + text-decoration: line-through; +} + +.public-total { + font-size: 0.28*100rpx; + color: #282828; + border-top: 1px solid #eee; + height: 0.92*100rpx; + line-height: 0.92*100rpx; + text-align: right; + padding: 0 0.3*100rpx; + background-color: #fff; +} + +.public-total .money { + color: #ff4c3c; +} + +.priceChange { + position: fixed; + width: 5.8*100rpx; + height: 6.7*100rpx; + background-color: #fff; + border-radius: 0.1*100rpx; + top: 50%; + left: 50%; + margin-left: -2.9*100rpx; + margin-top: -3.35*100rpx; + z-index: 99; + transition: all 0.3s ease-in-out 0s; + transform: scale(0); + opacity: 0; +} + +.priceChange.on { + opacity: 1; + transform: scale(1); +} + +.priceChange .priceTitle { + background: url("https://www.xdd618.com/api/file/pic/pricetitle.jpg") no-repeat; + background-size: 100% 100%; + width: 100%; + height: 1.6*100rpx; + border-radius: 0.1*100rpx 0.1*100rpx 0 0; + text-align: center; + font-size: 0.4*100rpx; + color: #fff; + line-height: 1.6*100rpx; + position: relative; +} + +.priceChange .priceTitle .iconfont { + position: absolute; + font-size: 0.4*100rpx; + right: 0.26*100rpx; + top: 0.23*100rpx; + width: 0.4*100rpx; + height: 0.4*100rpx; + line-height: 0.4*100rpx; +} + +.priceChange .listChange { + padding: 0 0.4*100rpx; +} + +.priceChange .listChange .item { + height: 1.03*100rpx; + border-bottom: 1px solid #e3e3e3; + font-size: 0.32*100rpx; + color: #333; +} + +.priceChange .listChange .item .money { + color: #666; + width: 3*100rpx; + text-align: right; +} + +.priceChange .listChange .item .money .iconfont { + font-size: 0.32*100rpx; + margin-left: 0.2*100rpx; +} + +.priceChange .listChange .item .money input { + width: 100%; + height: 100%; + text-align: right; + color: #ccc; +} + +.priceChange .listChange .item .money input.on { + color: #666; +} + +.priceChange .modify { + font-size: 0.32*100rpx; + color: #fff; + width: 4.9*100rpx; + height: 0.9*100rpx; + text-align: center; + line-height: 0.9*100rpx; + border-radius: 0.45*100rpx; + background-color: #2291f8; + margin: 0.53*100rpx auto 0 auto; +} + +.priceChange .modify1 { + font-size: 0.32*100rpx; + color: #312b2b; + width: 4.9*100rpx; + height: 0.9*100rpx; + text-align: center; + line-height: 0.9*100rpx; + border-radius: 0.45*100rpx; + background-color: #eee; + margin: 0.3*100rpx auto 0 auto; +} + +.public-wrapper .title { + font-size: 0.3*100rpx; + color: #282828; + padding: 0 0.3*100rpx; + margin-bottom: 0.2*100rpx; +} + +.public-wrapper .title .iconfont { + color: #2291f8; + font-size: 0.4*100rpx; + margin-right: 0.13*100rpx; + vertical-align: middle; +} + +.public-wrapper { + margin: 0.18*100rpx auto 0 auto; + width: 6.9*100rpx; + background-color: #fff; + border-radius: 0.1*100rpx; + padding-top: 0.25*100rpx; +} + +.public-wrapper .nav { + padding: 0 0.3*100rpx; + height: 0.7*100rpx; + line-height: 0.7*100rpx; + font-size: 0.24*100rpx; + color: #999; +} + +.public-wrapper .data { + width: 2.1*100rpx; + text-align: left; +} + +.public-wrapper .browse { + width: 1.92*100rpx; + text-align: right; +} + +.public-wrapper .turnover { + width: 2.27*100rpx; + text-align: right; +} + +.public-wrapper .conter { + padding: 0 0.3*100rpx; +} + +.public-wrapper .conter .item { + border-bottom: 1px solid #f7f7f7; + height: 0.7*100rpx; + font-size: 0.24*100rpx; +} + +.public-wrapper .conter .item .turnover { + color: #d84242; +} + +/*商户管理订单列表*/ +.pos-order-list .nav { + width: 100%; + height: 0.96*100rpx; + background-color: #fff; + font-size: 0.3*100rpx; + color: #282828; + position: fixed; + top: 0; + left: 0; +} + +.pos-order-list .nav .item.on { + color: #2291f8; +} + +.pos-order-list .list { + margin-top: 1.2*100rpx; +} + +.pos-order-list .list .item { + background-color: #fff; + width: 100%; +} + +.pos-order-list .list .item~.item { + margin-top: 0.24*100rpx; +} + +.pos-order-list .list .item .order-num { + border-bottom: 1px solid #eee; + font-size: 0.26*100rpx; + font-weight: bold; + color: #282828; + padding: .2*100rpx 0.3*100rpx; + display: flex; + align-items: center; + justify-content: space-between; +} + +.pos-order-list .list .item .order-num .time { + font-size: 0.26*100rpx; + font-weight: normal; + color: #999; + display: flex; + align-items: center; +} + +.pos-order-list .list .item .operation { + padding: 0.2*100rpx 0.3*100rpx; + margin-top: 0.03*100rpx; +} + +.pos-order-list .list .item .operation .more { + position: relative; +} + +.pos-order-list .list .item .operation .icon-gengduo { + font-size: 0.5*100rpx; + color: #aaa; +} + +.pos-order-list .list .item .operation .order .arrow { + width: 0; + height: 0; + border-left: 0.11*100rpx solid transparent; + border-right: 0.11*100rpx solid transparent; + border-top: 0.2*100rpx solid #e5e5e5; + position: absolute; + left: 0.15*100rpx; + bottom: -0.18*100rpx; +} + +.pos-order-list .list .item .operation .order .arrow:before { + content: ''; + width: 0; + height: 0; + border-left: 0.07*100rpx solid transparent; + border-right: 0.07*100rpx solid transparent; + border-top: 0.2*100rpx solid #fff; + position: absolute; + left: -0.07*100rpx; + bottom: 0; +} + +.pos-order-list .list .item .operation .order { + width: 2*100rpx; + background-color: #fff; + border: 1px solid #eee; + border-radius: 0.1*100rpx; + position: absolute; + top: -1*100rpx; + z-index: 9; +} + +.pos-order-list .list .item .operation .order .items { + height: 0.77*100rpx; + line-height: 0.77*100rpx; + text-align: center; +} + +.pos-order-list .list .item .operation .order .items~.items { + border-top: 1px solid #f5f5f5; +} + +.pos-order-list .list .item .operation .bnt { + font-size: 0.28*100rpx; + color: #5c5c5c; + width: 1.7*100rpx; + height: 0.6*100rpx; + border-radius: 0.3*100rpx; + border: 1px solid #bbb; + text-align: center; + line-height: 0.6*100rpx; +} + +.pos-order-list .list .item .operation .bnt~.bnt { + margin-left: 0.14*100rpx; +} + +/*商户管理订单详情*/ +.pos-order-details .header { + background: linear-gradient(to right, #2291f8 0%, #1cd1dc 100%); + background: -moz-linear-gradient(to right, #2291f8 0%, #1cd1dc 100%); +} + +.pos-order-details .header .state { + font-size: 0.36*100rpx; + color: #fff; +} + +.pos-order-details .header .data { + margin-left: 0.35*100rpx; + font-size: 0.28*100rpx; +} + +.pos-order-details .header .data .order-num { + font-size: 0.3*100rpx; + margin-bottom: 0.08*100rpx; +} + +.pos-order-details .remarks { + width: 100%; + height: 0.86*100rpx; + background-color: #fff; + padding: 0 0.3*100rpx; +} + +.pos-order-details .remarks .iconfont { + font-size: 0.4*100rpx; + color: #2a7efb; +} + +.pos-order-details .remarks input { + width: 6.3*100rpx; + height: 100%; + font-size: 0.3*100rpx; +} + +.pos-order-details .remarks input::placeholder { + color: #666; +} + +.pos-order-details .orderingUser { + font-size: 0.26*100rpx; + color: #282828; + padding: 0 0.3*100rpx; + height: 0*100rpx; + background-color: #fff; + margin-top: 0.16*100rpx; + border-bottom: 1px solid #f5f5f5; +} + +.pos-order-details .orderingUser .iconfont { + font-size: 0.4*100rpx; + color: #2a7efb; + margin-right: 0.15*100rpx; +} + +.pos-order-details .address { + margin-top: 0; +} + +.pos-order-details .pos-order-goods { + margin-top: 0.17*100rpx; +} + +.pos-order-details .footer .more { + font-size: 0.27*100rpx; + color: #aaa; + width: 1*100rpx; + height: 0.64*100rpx; + text-align: center; + line-height: 0.64*100rpx; + margin-right: 0.25*100rpx; + position: relative; +} + +.pos-order-details .footer .delivery { + background: linear-gradient(to right, #2291f8 0%, #1cd1dc 100%); + background: -moz-linear-gradient(to right, #2291f8 0%, #1cd1dc 100%); +} + +.pos-order-details .footer .more .order .arrow { + width: 0; + height: 0; + border-left: 0.11*100rpx solid transparent; + border-right: 0.11*100rpx solid transparent; + border-top: 0.2*100rpx solid #e5e5e5; + position: absolute; + left: 0.15*100rpx; + bottom: -0.18*100rpx; +} + +.pos-order-details .footer .more .order .arrow:before { + content: ''; + width: 0; + height: 0; + border-left: 0.09*100rpx solid transparent; + border-right: 0.09*100rpx solid transparent; + border-top: 0.19*100rpx solid #fff; + position: absolute; + left: -0.1*100rpx; + bottom: 0; +} + +.pos-order-details .footer .more .order { + width: 2*100rpx; + background-color: #fff; + border: 1px solid #eee; + border-radius: 0.1*100rpx; + position: absolute; + top: -2*100rpx; + z-index: 9; +} + +.pos-order-details .footer .more .order .item { + height: 0.77*100rpx; + line-height: 0.77*100rpx; +} + +.pos-order-details .footer .more .order .item~.item { + border-top: 1px solid #f5f5f5; +} + +.pos-order-details .footer .more .moreName { + width: 100%; + height: 100%; +} + +/*发货*/ +.deliver-goods header { + width: 100%; + background-color: #fff; + margin-top: 0.1*100rpx; +} + +.deliver-goods header .order-num { + padding: 0 0.3*100rpx; + border-bottom: 1px solid #f5f5f5; + height: 0.67*100rpx; +} + +.deliver-goods header .order-num .num { + width: 4.3*100rpx; + font-size: 0.26*100rpx; + color: #282828; + position: relative; +} + +.deliver-goods header .order-num .num:after { + position: absolute; + content: ''; + width: 1px; + height: 0.3*100rpx; + background-color: #ddd; + top: 50%; + margin-top: -0.15*100rpx; + right: 0; +} + +.deliver-goods header .order-num .name { + width: 2.6*100rpx; + font-size: 0.26*100rpx; + color: #282828; + text-align: center; +} + +.deliver-goods header .order-num .name .iconfont { + font-size: 0.35*100rpx; + color: #477ef3; + vertical-align: middle; + margin-right: 0.1*100rpx; +} + +.deliver-goods header .address { + font-size: 0.26*100rpx; + color: #868686; + background-color: #fff; + padding: 0.3*100rpx; +} + +.deliver-goods header .address .name { + font-size: 0.3*100rpx; + color: #282828; + margin-bottom: 0.1*100rpx; +} + +.deliver-goods header .address .name .phone { + margin-left: 0.4*100rpx; +} + +.deliver-goods header .line { + width: 100%; + height: 0.03*100rpx; +} + +.deliver-goods header .line image { + width: 100%; + height: 100%; + display: block; +} + +.deliver-goods .wrapper { + width: 100%; + background-color: #fff; +} + +.deliver-goods .wrapper .item { + border-bottom: 1px solid #f0f0f0; + padding: 0 0.3*100rpx; + height: 0.96*100rpx; + font-size: 0.32*100rpx; + color: #282828; + position: relative; +} + +.deliver-goods .wrapper .item .mode { + width: 4.6*100rpx; + height: 100%; + text-align: right; +} + +.deliver-goods .wrapper .item .mode .iconfont { + font-size: 0.3*100rpx; + margin-left: 0.13*100rpx; +} + +.deliver-goods .wrapper .item .mode .goods~.goods { + margin-left: 0.3*100rpx; +} + +.deliver-goods .wrapper .item .mode .goods { + color: #bbb; +} + +.deliver-goods .wrapper .item .mode .goods.on { + color: #477ef3; +} + +.deliver-goods .wrapper .item .icon-up { + position: absolute; + font-size: 0.35*100rpx; + color: #2c2c2c; + right: 0.3*100rpx; +} + +.deliver-goods .wrapper .item select { + direction: rtl; + padding-right: 0.6*100rpx; + position: relative; + z-index: 2; +} + +.deliver-goods .wrapper .item input::placeholder { + color: #bbb; +} + +.deliver-goods .confirm { + font-size: 0.32*100rpx; + color: #fff; + width: 100%; + height: 1*100rpx; + background-color: #477ef3; + text-align: center; + line-height: 1*100rpx; + position: fixed; + bottom: 0; +} + +/*订单首页*/ +.order-index .header { + box-sizing: border-box; + background-size: 100% 100%; + width: 100%; + height: 3.02*100rpx; + padding: 0.45*100rpx 0.3*100rpx 0 0.3*100rpx; + position: relative; + // background-color: #eb3729; + +} + +.order-index .image { + position: absolute; + width: 100%; + left: 0; + right: 0; + top: 0; + z-index: 0; +} + + +.order-index .header:after { + position: absolute; + left: 0; + right: 0; + bottom: -0.98*100rpx; + z-index: -1; + content: ''; + height: 1*100rpx; + width: 100%; + border-radius: 0 0 50% 50%; + // background-color: #eb3729; +} + +.order-index .header .item { + flex: 1; + -o-flex: 1; + -ms-flex: 1; + text-align: center; + font-size: 0.24*100rpx; + color: #fff; +} + +.order-index .header .item .num { + font-size: 0.4*100rpx; + margin-bottom: 0.07*100rpx; +} + +.order-index .wrapper { + position: relative; + width: 6.9*100rpx; + background-color: #fff; + border-radius: 0.1*100rpx; + margin: -1.15*100rpx auto 0 auto; + padding-top: 0.25*100rpx; + z-index: 99; +} + +.order-index .wrapper .title { + font-size: 0.3*100rpx; + color: #282828; + padding: 0 0.3*100rpx; + margin-bottom: 0.4*100rpx; +} + +.order-index .wrapper .title .iconfont { + color: #2291f8; + font-size: 0.4*100rpx; + margin-right: 0.13*100rpx; + vertical-align: middle; +} + +.order-index .wrapper .list .item { + width: 33.33%; + text-align: center; + font-size: 0.24*100rpx; + color: #999; + margin-bottom: 0.45*100rpx; +} + +.order-index .wrapper .list .item .num { + font-size: 0.4*100rpx; + color: #333; +} + +/*交易额统计*/ +.statistical-page .navs { + width: 100%; + height: 0.96*100rpx; + background-color: #fff; + overflow: hidden; + line-height: 0.96*100rpx; + position: fixed; + top: 0; + left: 0; + z-index: 9; +} + +.statistical-page .navs .list { + overflow-y: hidden; + overflow-x: auto; + white-space: nowrap; + width: 100%; +} + +.statistical-page .navs .item { + font-size: 0.32*100rpx; + color: #282828; + margin-left: 0.78*100rpx; + display: inline-block; +} + +.statistical-page .navs .item.on { + color: #2291f8; +} + +.statistical-page .navs .item .iconfont { + font-size: 0.25*100rpx; + margin-left: 0.13*100rpx; +} + +.statistical-page .wrapper { + box-sizing: border-box; + width: 100%; + background-color: #fff; + border-radius: 0.1*100rpx; + margin: 1.19*100rpx auto 0 auto; + padding: 0.3*100rpx 0.6*100rpx; +} + +.statistical-page .wrapper .title { + font-size: 0.3*100rpx; + color: #999; + text-align: center; +} + +.statistical-page .wrapper .money { + font-size: 0.72*100rpx; + color: #fba02a; + text-align: center; + margin-top: 0.1*100rpx; +} + +.statistical-page .wrapper .increase { + font-size: 0.28*100rpx; + color: #999; + margin-top: 0.2*100rpx; +} + +.statistical-page .wrapper .increase .red { + color: #ff6969; +} + +.statistical-page .wrapper .increase .green { + color: #1abb1d; +} + +.statistical-page .wrapper .increase .iconfont { + font-size: 0.23*100rpx; + margin-left: 0.15*100rpx; +} + +.statistical-page .chart { + width: 6.9*100rpx; + height: 4.8*100rpx; + background-color: #fff; + border-radius: 0.1*100rpx; + margin: 0.23*100rpx auto 0 auto; + padding: 0.25*100rpx 0.22*100rpx 0 0.22*100rpx; +} + +.statistical-page .chart .company { + font-size: 0.26*100rpx; + color: #999; +} + +.statistical-page .mc-body { + padding-bottom: 0; +} + +.statistical-page .mc-body tr { + background-color: #edf8fe; + border-top: 1px solid #fff; + width: 100%; +} + + +.statistical-page .mc-head-box view { + font-size: 14px; +} + + +.statistical-page .mc-range-mode .selected .mc-range-bg { + background-color: #a0dcf9; +} + + +.yd-confirm { + background-color: #fff; + font-size: unset; + width: 5.4*100rpx; + height: 2.5*100rpx; + border-radius: 0.4*100rpx; +} + +.yd-confirm-hd { + text-align: center; +} + +.yd-confirm-title { + color: #030303; + font-weight: bold; + font-size: 0.36*100rpx; +} + +.yd-confirm-bd { + text-align: center; + font-size: 0.28*100rpx; + color: #333333; +} + +.yd-confirm-ft { + line-height: 0.9*100rpx; + margin-top: 14px; + border-top: 0.01*100rpx solid #eee; +} + +.yd-confirm-ft>a { + color: #e93323; +} + +.yd-confirm-ft>a.primary { + border-left: 0.01*100rpx solid #eee; + color: #e93323; +} + +/*修改密码*/ +.ChangePassword .phone { + font-size: 0.32*100rpx; + font-weight: bold; + text-align: center; + margin-top: 0.55*100rpx; +} + +.ChangePassword .list { + width: 5.8*100rpx; + margin: 0.53*100rpx auto 0 auto; +} + +.ChangePassword .list .item { + width: 100%; + height: 1.1*100rpx; + border-bottom: 0.02*100rpx solid #f0f0f0; +} + +.ChangePassword .list .item input { + width: 100%; + height: 100%; + font-size: 0.32*100rpx; +} + +.ChangePassword .list .item input::placeholder { + color: #b9b9bc; +} + +.ChangePassword .list .item input.codeIput { + width: 3.4*100rpx; +} + +.ChangePassword .list .item .code { + font-size: 0.32*100rpx; +} + +.ChangePassword .list .item .code.on { + color: #b9b9bc !important; +} + +.ChangePassword .confirmBnt { + font-size: 0.32*100rpx; + width: 5.8*100rpx; + height: 0.9*100rpx; + border-radius: 0.45*100rpx; + color: #fff; + + margin: 0.92*100rpx auto 0 auto; + text-align: center; + line-height: 0.9*100rpx; +} + +.swiper-wrapper {} + +.posterCanvasWarp { + position: relative; + width: 0; + height: 0; + overflow: hidden; + + .posterCanvas { + position: absolute; + left: 0; + top: 0; + width: 747px !important; + height: 1326px !important; + } +} + +.text .name .icon-jingpintuijian, +.text .name .icon-xinpin { + color: #00f !important; +} + +.text .name .icon-shoucang { + color: #ea3526 !important; +} + +rich-text { + width: 100%; + display: block; + + img, + image { + display: block; + width: 100%; + } +} + +/*单行文本溢出省略号*/ +.one-t { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + transition: all linear 0.2s; +} + +/*多行文本溢出省略号*/ +.more-t { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + transition: all linear 0.2s; +} +/* ================== + flex布局(colorui里面也有相关基础样式) + ==================== */ +/* x水平排列*/ +.x-f { + display: flex; + align-items: center; +} + +/*x两端且水平居中*/ +.x-bc { + display: flex; + justify-content: space-between; + align-items: center; +} + +/*x平分且水平居中*/ +.x-ac { + display: flex; + justify-content: space-around; + align-items: center; +} + +/*x水平靠上对齐*/ +.x-start { + display: flex; + align-items: flex-start; +} + +/*x水平靠下对齐*/ +.x-end { + display: flex; + align-items: flex-end; +} + +/*上下左右居中*/ +.x-c { + display: flex; + justify-content: center; + align-items: center; +} + +/*y竖直靠左*/ +.y-start { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +/*y竖直靠右*/ +.y-end { + display: flex; + flex-direction: column; + align-items: flex-end; +} + +/*y竖直居中*/ +.y-f { + display: flex; + flex-direction: column; + align-items: center; +} + +// y竖直两端 +.y-b { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +/*y竖直两端居中*/ +.y-bc { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; +} + +// v4 custom +.v4-nodata{ + display: flex; + flex-direction: column; + align-items: center; + margin-top: 60rpx; + image{ + width: 200rpx; + height:188rpx; + margin-bottom: 20rpx; + } + .text{ + color:#999; + font-size: 28rpx; + } +} diff --git a/assets/iconfont/iconfont.css b/assets/iconfont/iconfont.css new file mode 100644 index 0000000..01e5991 --- /dev/null +++ b/assets/iconfont/iconfont.css @@ -0,0 +1,661 @@ +@font-face {font-family: "iconfont"; + src: /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') + } + + .iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + .icon-jingpintuijian:before { + content: "\e60d"; + } + + .icon-xiaolian:before { + content: "\e60f"; + } + + .icon-yuandianxiao:before { + content: "\e82f"; + } + + .icon-xiazai5:before { + content: "\e605"; + } + + .icon-icon34:before { + content: "\e62b"; + } + + .icon-dadianhua01:before { + content: "\e623"; + } + + .icon-webicon318:before { + content: "\e6c2"; + } + + .icon-iconfontguanbi:before { + content: "\e643"; + } + + .icon-icon25201:before { + content: "\e70d"; + } + + .icon-cuxiaoguanli:before { + content: "\e60e"; + } + + .icon-miaosha:before { + content: "\e6c3"; + } + + .icon-huiyuan:before { + content: "\e60b"; + } + + .icon-caigou-xianxing:before { + content: "\e887"; + } + + .icon-caigou:before { + content: "\e888"; + } + + .icon-yingyongchengxu-xianxing:before { + content: "\e8a1"; + } + + .icon-yingyongchengxu:before { + content: "\e8a2"; + } + + .icon-ziyuan-xianxing:before { + content: "\e8a4"; + } + + .icon-shouye-xianxing:before { + content: "\e8ba"; + } + + .icon-shouye:before { + content: "\e8b9"; + } + + .icon-yonghu-xianxing:before { + content: "\e8c8"; + } + + .icon-yonghu:before { + content: "\e8c9"; + } + + .icon-ditu:before { + content: "\e906"; + } + + .icon-sousuo2:before { + content: "\e757"; + } + + .icon-2:before { + content: "\e684"; + } + + .icon-dizhi:before { + content: "\e608"; + } + + .icon-huangguan:before { + content: "\e624"; + } + + .icon-huangguan1:before { + content: "\e625"; + } + + .icon-huangguan2:before { + content: "\e626"; + } + + .icon-wuliu:before { + content: "\e6f2"; + } + + .icon-xuanzhong:before { + content: "\e615"; + } + + .icon-xinpin:before { + content: "\e610"; + } + + .icon-arrow:before { + content: "\e627"; + } + + .icon-yuezhifu:before { + content: "\e65e"; + } + + .icon-bianji:before { + content: "\e6cc"; + } + + .icon-wenti:before { + content: "\e758"; + } + + .icon-qiandai:before { + content: "\e6b1"; + } + + .icon-xiangyou:before { + content: "\e679"; + } + + .icon-paihang:before { + content: "\e73e"; + } + + .icon-weizhi:before { + content: "\e62d"; + } + + .icon-remen:before { + content: "\e67c"; + } + + .icon-tuandui:before { + content: "\e685"; + } + + .icon-yuezhifu1:before { + content: "\e61a"; + } + + .icon-yonghu2:before { + content: "\e60a"; + } + + .icon-hebingxingzhuang:before { + content: "\e656"; + } + + .icon-gouwuche1:before { + content: "\e642"; + } + + .icon-liulan:before { + content: "\e629"; + } + + .icon-jinbi1:before { + content: "\e655"; + } + + .icon-guanbi2:before { + content: "\e61c"; + } + + .icon-sousuo:before { + content: "\e67d"; + } + + .icon-weixin:before { + content: "\e600"; + } + + .icon-weixin3:before { + content: "\e618"; + } + + .icon-paihang1:before { + content: "\e633"; + } + + .icon-tongji:before { + content: "\e687"; + } + + .icon-caidan:before { + content: "\e62a"; + } + + .icon-erweima:before { + content: "\e607"; + } + + .icon-shoucang:before { + content: "\e606"; + } + + .icon-jian:before { + content: "\e621"; + } + + .icon-jia:before { + content: "\e7e0"; + } + + .icon-guanbi:before { + content: "\e62f"; + } + + .icon-xiangshang1:before { + content: "\e622"; + } + + .icon-shuoming:before { + content: "\e630"; + } + + .icon-xiala:before { + content: "\e67f"; + } + + .icon-pailie:before { + content: "\e61b"; + } + + .icon-fenxiang:before { + content: "\e603"; + } + + .icon-yinhangqia:before { + content: "\e72c"; + } + + .icon-sousuo1:before { + content: "\e64c"; + } + + .icon-duihao:before { + content: "\e64e"; + } + + .icon-dingdan:before { + content: "\e61e"; + } + + .icon-tupianpailie:before { + content: "\e620"; + } + + .icon-chongzhi:before { + content: "\e602"; + } + + .icon-shezhi:before { + content: "\e619"; + } + + .icon-shuoming1:before { + content: "\e673"; + } + + .icon-duihao2:before { + content: "\e601"; + } + + .icon-complete:before { + content: "\e646"; + } + + .icon-weixin1:before { + content: "\e66e"; + } + + .icon-xianxiazhifu:before { + content: "\e6e1"; + } + + .icon-tianjiadizhi:before { + content: "\e640"; + } + + .icon-weixin2:before { + content: "\e604"; + } + + .icon-gouwuche:before { + content: "\e669"; + } + + .icon-jiazai:before { + content: "\e62c"; + } + + .icon-huabanfuben:before { + content: "\e654"; + } + + .icon-kefu_o:before { + content: "\eb63"; + } + + .icon-liwu_o:before { + content: "\eb65"; + } + + .icon-anniu_jiantouzhankai_o:before { + content: "\eb89"; + } + + .icon-jiantou_xiayiye_o:before { + content: "\eb8f"; + } + + .icon-jiantou_shangxiaqiehuan_o:before { + content: "\eb90"; + } + + .icon-shangxiazhankai_o:before { + content: "\eb9a"; + } + + .icon-huobiliu_o:before { + content: "\eb9f"; + } + + .icon-jinbi_o:before { + content: "\eba1"; + } + + .icon-gerentouxiang_o:before { + content: "\ebac"; + } + + .icon-qunzu_o:before { + content: "\ebad"; + } + + .icon-dianhua_o:before { + content: "\ebaf"; + } + + .icon-shoucang_o:before { + content: "\ebae"; + } + + .icon-yunshangchuan_o:before { + content: "\ebb3"; + } + + .icon-bingtu_o:before { + content: "\ebb4"; + } + + .icon-baoguo_huanbaohe_o:before { + content: "\ebb6"; + } + + .icon-baoguo_quxiaoshouhuo_o:before { + content: "\ebb7"; + } + + .icon-baoguo_shouhuo_o:before { + content: "\ebb8"; + } + + .icon-baoguo_lingjian_o:before { + content: "\ebb9"; + } + + .icon-baoguo_shouna_o:before { + content: "\ebbe"; + } + + .icon-didiandingwei_o:before { + content: "\ebba"; + } + + .icon-zhekou:before { + content: "\e790"; + } + + .icon-laba:before { + content: "\e612"; + } + + .icon-quanxianguanlisuozi:before { + content: "\e6d2"; + } + + .icon-youjian:before { + content: "\e677"; + } + + .icon-xiala1:before { + content: "\e609"; + } + + .icon-weixinzhifu:before { + content: "\e632"; + } + + .icon-jingyanzhi:before { + content: "\e62e"; + } + + .icon-up:before { + content: "\e617"; + } + + .icon-kefu:before { + content: "\e6b2"; + } + + .icon-shenhezhong:before { + content: "\e6ce"; + } + + .icon-kanjia1:before { + content: "\e613"; + } + + .icon-shanchu1:before { + content: "\e611"; + } + + .icon-zhifubao:before { + content: "\e61d"; + } + + .icon-yonghu1:before { + content: "\e644"; + } + + .icon-suozi:before { + content: "\e631"; + } + + .icon-jiantou:before { + content: "\e641"; + } + + .icon-kanjia:before { + content: "\e69b"; + } + + .icon-pintuan:before { + content: "\e60c"; + } + + .icon-bianji1:before { + content: "\e614"; + } + + .icon-youhuiquan:before { + content: "\e6e4"; + } + + .icon-xiangxia:before { + content: "\e8ca"; + } + + .icon-shanchu:before { + content: "\e628"; + } + + .icon-guanbi3:before { + content: "\e6c5"; + } + + + .icon-weixuanzhong:before { + content: "\e6f0"; + } + + .icon-xuanzhong1:before { + content: "\e6ef"; + } + + .icon-zhuangshixian:before { + content: "\e6f1"; + } + + .icon-jishuzhichi:before { + content: "\e6f3"; + } + + .icon-biankuang:before { + content: "\e6f4"; + } + + .icon-guanbi1:before { + content: "\e6f5"; + } + + .icon-xiangshang:before { + content: "\ebbb"; + } + + .icon-icon-test:before { + content: "\e6f6"; + } + + .icon-mingxi:before { + content: "\e6f7"; + } + + .icon-tishengfenzhi:before { + content: "\e6f8"; + } + + .icon-pintuanchenggong:before { + content: "\e6f9"; + } + + .icon-pintuanshibai:before { + content: "\e6fa"; + } + + .icon-kongxinxing:before { + content: "\e6fc"; + } + + .icon-shitixing:before { + content: "\e6fb"; + } + + .icon-yituikuan:before { + content: "\e6fd"; + } + + .icon-tuikuanzhong:before { + content: "\e6fe"; + } + + .icon-lingxing:before { + content: "\e6ff"; + } + + .icon-xiangzuo:before { + content: "\ebbc"; + } + + .icon-icon_im_face:before { + content: "\eb96"; + } + + .icon-icon_im_keyboard:before { + content: "\eb97"; + } + + .icon-shoucang1:before { + content: "\e714"; + } + + .icon-dianhau:before { + content: "\e634"; + } + + .icon-zhinengkefu-:before { + content: "\e616"; + } + + .icon-code_:before { + content: "\e723"; + } + + .icon-code_1:before { + content: "\e724"; + } + + .icon-phone_:before { + content: "\e725"; + } + + .icon-shijian:before { + content: "\e635"; + } + + .icon-xiangxia2:before { + content: "\ebbd"; + } + + .icon-xuanzhong2:before { + content: "\e731"; + } + + .icon-shujutongji:before { + content: "\e732"; + } + + .icon-xiangxishuju:before { + content: "\e733"; + } + + .icon-gengduo:before { + content: "\e734"; + } + + + + .icon-haibao:before { + content: "\e73b"; + } + + .icon-tupian-:before { + content: "\e73f"; + } + + .icon-xiugai:before { + content: "\e61f"; + } + + .icon-pintuan-copy:before { + content: "\ebbf"; + } + + .icon-tonghua:before { + content: "\e740"; + } + + \ No newline at end of file diff --git a/assets/script/global.js b/assets/script/global.js new file mode 100644 index 0000000..1d3cc3a --- /dev/null +++ b/assets/script/global.js @@ -0,0 +1,54 @@ +export default { + // 通用导航 + commonJump: (uniapp_url) => { + let query = uniapp_url.indexOf("?name="); + if (query > -1) { + let start = query + 6; + let name = uniapp_url.substring(start) + uni.setStorageSync("name", name) + uni.switchTab({ + url: uniapp_url + }) + } + + switch (uniapp_url) { + case "": + uni.showToast({ + title: "开发中,敬请期待", + icon: 'none' + }) + break; + case "/pages/shop/GoodsClass/index": + uni.switchTab({ + url: uniapp_url + }) + break; + case "/pages/cloud/haveFun": + uni.switchTab({ + url: uniapp_url + }) + break; + default: + uni.navigateTo({ + url: uniapp_url + }) + break; + } + }, + + navToGoods: (id) => { + uni.navigateTo({ + url: "/pages/shop/GoodsCon/index?id=" + id + }) + }, + + diffSSS: (date) => { + if (typeof date !== "string") return 0; + date = date.substring(0, 19); + date = date.replace(/-/g, '/'); + let timestamp = new Date(date).getTime(); + let now = new Date().getTime(); + return timestamp - now; + } + +} diff --git a/components/AddressWindow.vue b/components/AddressWindow.vue new file mode 100644 index 0000000..4b4b484 --- /dev/null +++ b/components/AddressWindow.vue @@ -0,0 +1,77 @@ + + diff --git a/components/CitySelect.vue b/components/CitySelect.vue new file mode 100644 index 0000000..f7e84eb --- /dev/null +++ b/components/CitySelect.vue @@ -0,0 +1,335 @@ + + + + + diff --git a/components/CountDown.vue b/components/CountDown.vue new file mode 100644 index 0000000..fd553fa --- /dev/null +++ b/components/CountDown.vue @@ -0,0 +1,98 @@ + + diff --git a/components/CouponListWindow.vue b/components/CouponListWindow.vue new file mode 100644 index 0000000..68854f0 --- /dev/null +++ b/components/CouponListWindow.vue @@ -0,0 +1,122 @@ + + + diff --git a/components/CouponPop.vue b/components/CouponPop.vue new file mode 100644 index 0000000..e975caf --- /dev/null +++ b/components/CouponPop.vue @@ -0,0 +1,75 @@ + + diff --git a/components/CouponWindow.vue b/components/CouponWindow.vue new file mode 100644 index 0000000..77096db --- /dev/null +++ b/components/CouponWindow.vue @@ -0,0 +1,88 @@ + + diff --git a/components/DataFormat.vue b/components/DataFormat.vue new file mode 100644 index 0000000..d4a3c92 --- /dev/null +++ b/components/DataFormat.vue @@ -0,0 +1,24 @@ + + diff --git a/components/DataFormatT.vue b/components/DataFormatT.vue new file mode 100644 index 0000000..f4379a0 --- /dev/null +++ b/components/DataFormatT.vue @@ -0,0 +1,24 @@ + + diff --git a/components/GoodList.vue b/components/GoodList.vue new file mode 100644 index 0000000..257b620 --- /dev/null +++ b/components/GoodList.vue @@ -0,0 +1,54 @@ + + diff --git a/components/Loading.vue b/components/Loading.vue new file mode 100644 index 0000000..1a643bc --- /dev/null +++ b/components/Loading.vue @@ -0,0 +1,27 @@ + + + diff --git a/components/OrderGoods.vue b/components/OrderGoods.vue new file mode 100644 index 0000000..aa7d37b --- /dev/null +++ b/components/OrderGoods.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/Payment.vue b/components/Payment.vue new file mode 100644 index 0000000..e75bf69 --- /dev/null +++ b/components/Payment.vue @@ -0,0 +1,174 @@ + + + diff --git a/components/PriceChange.vue b/components/PriceChange.vue new file mode 100644 index 0000000..7babb01 --- /dev/null +++ b/components/PriceChange.vue @@ -0,0 +1,133 @@ + + + diff --git a/components/ProductConSwiper.vue b/components/ProductConSwiper.vue new file mode 100644 index 0000000..bcb0fe9 --- /dev/null +++ b/components/ProductConSwiper.vue @@ -0,0 +1,87 @@ + + diff --git a/components/ProductWindow.vue b/components/ProductWindow.vue new file mode 100644 index 0000000..7dfadc2 --- /dev/null +++ b/components/ProductWindow.vue @@ -0,0 +1,122 @@ + + diff --git a/components/PromotionGood.vue b/components/PromotionGood.vue new file mode 100644 index 0000000..f8685bc --- /dev/null +++ b/components/PromotionGood.vue @@ -0,0 +1,36 @@ + + diff --git a/components/Recommend.vue b/components/Recommend.vue new file mode 100644 index 0000000..995d0c5 --- /dev/null +++ b/components/Recommend.vue @@ -0,0 +1,89 @@ + + diff --git a/components/ShareInfo.vue b/components/ShareInfo.vue new file mode 100644 index 0000000..b833eb8 --- /dev/null +++ b/components/ShareInfo.vue @@ -0,0 +1,45 @@ + + + diff --git a/components/StorePoster.vue b/components/StorePoster.vue new file mode 100644 index 0000000..4302dac --- /dev/null +++ b/components/StorePoster.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/components/UserEvaluation.vue b/components/UserEvaluation.vue new file mode 100644 index 0000000..7e6195b --- /dev/null +++ b/components/UserEvaluation.vue @@ -0,0 +1,56 @@ + + diff --git a/components/WriteOff.vue b/components/WriteOff.vue new file mode 100644 index 0000000..33b429e --- /dev/null +++ b/components/WriteOff.vue @@ -0,0 +1,128 @@ + + + diff --git a/components/blPaymentPasswordInput.vue b/components/blPaymentPasswordInput.vue new file mode 100644 index 0000000..032d3a1 --- /dev/null +++ b/components/blPaymentPasswordInput.vue @@ -0,0 +1,435 @@ + + + + + diff --git a/components/chose-city/chose-city.vue b/components/chose-city/chose-city.vue new file mode 100644 index 0000000..d58c20b --- /dev/null +++ b/components/chose-city/chose-city.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/components/drag-button/drag-button.vue b/components/drag-button/drag-button.vue new file mode 100644 index 0000000..eb5d78d --- /dev/null +++ b/components/drag-button/drag-button.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/components/drop-down/drop-down.vue b/components/drop-down/drop-down.vue new file mode 100644 index 0000000..092ff55 --- /dev/null +++ b/components/drop-down/drop-down.vue @@ -0,0 +1,116 @@ + + + + + \ No newline at end of file diff --git a/components/easy-upload/easy-upload.vue b/components/easy-upload/easy-upload.vue new file mode 100644 index 0000000..5ff8f44 --- /dev/null +++ b/components/easy-upload/easy-upload.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/components/easy-upload/readme.md b/components/easy-upload/readme.md new file mode 100644 index 0000000..cef5dde --- /dev/null +++ b/components/easy-upload/readme.md @@ -0,0 +1,51 @@ +### easy-upload 组件 + +使用方法 +```js + + + //使用 hbuilderX (easycom) 可以直接使用 或 + import easyUpload from '@/components/easy-upload/easy-upload.vue' + export default { + //用easycom 则省略注册组件 + components:{ + easyUpload + }, + data() { + return { + dataList: [], + types: 'image' + } + } + } +``` + +| 参数 | 类型 | 是否必填 | 参数描述 +| ---- | ---- | ---- | ---- +| types | String | 否 | 上传类型 image/video +| autoUpload | Boolean | 否 | 自动上传 默认false +| dataList | Array | 否 | 图片/视频数据展示 +| clearIcon | String | 否 | 删除图标(可以换成自己的图片) +| uploadIcon | String | 否 | 上传图标(可以换成自己的图片) +| uploadUrl | String | 否 | 上传的接口 +| deleteUrl | String | 否 | 删除的接口 +| uploadCount | Number | 否 | 上传图片最大个数(默认为一张) +| upload_max | Number | 否 | 上传大小(默认为3M) +| upload_max | Number | 否 | 上传大小(默认为3M) +| upload_max | Number | 否 | 上传大小(默认为3M) + +| 事件 | 是否必填 | 参数描述 +| ---- | ---- | ---- +| successImage | 否 | 上传图片成功事件 +| successVideo | 否 | 上传视频成功回调 + +示例项目中有简单的服务端代码 /server (node.js) +如果本地测试可以先运行一下服务端的代码 + diff --git a/components/hx-navbar/README.md b/components/hx-navbar/README.md new file mode 100644 index 0000000..214dba5 --- /dev/null +++ b/components/hx-navbar/README.md @@ -0,0 +1,240 @@ +# hx-navbar 适用于 uni-app 项目的头部导航组件 + +导航栏组件,主要用于头部导航,组件名:hx-navbar + +本组件目前兼容微信小程序、H5、5+APP。 + +### 本组件支持模式: +1. 普通固定顶部导航 +2. 透明导航 +3. 透明固定顶部导航 +4. 不固定普通导航 +5. 背景颜色线性渐变 +6. 滑动显示背景 +7. 左、中、右3个插槽;可关闭左右插槽使中间插槽铺满导航,实现高度自定义的导航需求 + +### 使用前提 + +需要先安装·uniapp·官方的```uni-icons``` 图标组件,```uni-icons```官方组件下载地址:[https://ext.dcloud.net.cn/plugin?id=28](https://ext.dcloud.net.cn/plugin?id=28) + +### 使用方式 +页面使用需在 ``` script ``` 中引用组件 +``` javascript +import hxNavbar from "@/components/hx-navbar/hx-navbar.vue" +export default { + components: {hxNavbar} +} +``` + +全局使用需在 ``` main.js ``` 中注册组件 +``` javascript +import hxNavbar from "./components/hx-navbar/hx-navbar.vue" +Vue.component('hx-navbar',hxNavbar) + +``` + + +### 属性 +#### 基本属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ---------------------- | ---------------------------------------------------| +| back | Boolean | true | 返回上一页,(设置后,```leftIcon```属性,和```click-left```事件将失效| +| height | String | 44px | 导航栏高度(不包含状态栏高度)| +| barPlaceholder | String | auto | 导航栏占位符 显示(show),隐藏(hidden),自动(auto:如果头部为固定fixed ,则显示占位符) | +| title | String | - | 导航标题(当设置了标题,中间插槽将失效) | +| fixed | Boolean | false | 固定头部 | +| color | String | #000000 | 导航文字颜色(如果需要屏幕滑动后变色,参数则为数组,例子:`['#000000','#ffffff']`) | +| backgroundColor | Array | [255, 255, 255] | 导航背景颜色为RGB 编号(单色背景数组为```[255,255,255]```,线性渐变背景```[[236, 0, 140],[103, 57, 182],...]```) | +| pageScroll | Object | {} | 屏幕滑动距离顶部的对象```滑动渐变必要参数``` | +| backgroundColorLinearDeg | String | 45 | 导航背景线性渐变角度 | +| backgroundImg | String | - | 导航背景图片(背景图片优先级高于背景颜色) | +| transparent | String | show | 背景透明(show 不透明,hidden 透明,auto 自动:滑动逐渐显示背景颜色,当头部固定时生效) 兼容性:头条小程序必须在页面上加 onPageScroll(e){} ,才能滑动显示背景,可参考dome7| +| shadow | Boolean | false | 导航栏阴影 | +| border | Boolean | false | 导航栏边框 | + +#### 关于状态栏的属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ---------------------- | ---------------------------------------------------| +| statusBar | Boolean | true | 包含状态栏 | +| statusBarFontColor | Array,String | #000000 | 状态栏字体颜色,只支持```#000000 ```和```#FFFFFF```(如果需要屏幕滑动变色,参数则为数组,例子:```['#000000','#ffffff']```)| +| statusBarBackground | String | - | 状态栏背景颜色,如果你想单独设置状态栏颜色,该属性是个不错的选择 + +#### 关于插槽的属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ---------------------- | ---------------------------------------------------| +| leftIcon | String | - | 左插槽图标,必须为 ```uni-icons``` 图标 | +| rightIcon | String | - | 右插槽图标,必须为 ```uni-icons``` 图标 | +| leftSlot | Boolean | true | 开启左插槽 | +| rightSlot | Boolean | true | 开启右插槽 | +| leftSlidiSwitch | Boolean | false | 屏幕滑动后 `left`插槽切换为`leftAfter`插槽 | +| centerSlidiSwitch | Boolean | false | 屏幕滑动后 `default`插槽切换为`centerAfter`插槽 | +| rightSlidiSwitch | Boolean | false | 屏幕滑动后 `right`插槽切换为`rightAfter`插槽 | + + +#### 返回上一页为空时的处理属性 +| 名称 | 类型 | 默认值 | 描述 | +| ----------------------------|--------------- | ---------------------- | ---------------------------------------------------| +| backTabbarUrl | String | /pages/index/index | 返回至指定的tabber页面(返回首页),当上一页为空时生效;全局使用推荐进组件修改`backTabbarUrl`的默认值| +| defaultBackUrl | String | - | 返回至指定的普通页面,当上一页为空时生效;`defaultBackUrl`优先级高于`backTabbarUrl`;主要应用在返回失效时| + +``` html + + +``` + + +### 插槽 +| 名称 | 描述 | +| ----------------------|-------------------------------------------------------------------| +| left | 左插槽 (可关闭该插槽 ```leftSlot``` 属性) | +| default | 中间插槽(当设置了标题,中间插槽将失效) | +| right | 右插槽 (可关闭该插槽 ```rightSlot``` 属性) | +| leftAfter | 屏幕滑动后的左插槽 (需要开启`leftSlidiSwitch`属性才生效) | +| centerAfter | 屏幕滑动后的中插槽 (需要开启`centerSlidiSwitch`属性才生效) | +| rightAfter | 屏幕滑动后的右插槽 (需要开启`rightSlidiSwitch`属性才生效) | + + +``` html + + 标题栏(中间插槽) + left(左插槽) + right(右插槽) + +``` + + +### 事件 +| 名称 | 参数 | 描述 | +| -----------------|------------------| --------------------------| +| click-left | - | 左侧按钮点击时触发,此事件将覆盖 `返回` | +| click-right | - | 右侧按钮点击时触发 | +| scroll | - | 监听滚动条,回调参数为滚动距离;固定头部时生效;应用场景:如滚动到多少时触发某些事件 | + +## 使用例子 + +### 简单使用 +``` html + +``` + +### 背景颜色线性渐变、头部固定 +``` html + + +``` + +### 滑动显示背景 +``` html + + + + +``` +``` javascript +data() { + return { + scrollData: {}, + } +}, +//必须在页面加 onPageScroll(e){} ,才能滑动显示背景 +onPageScroll(e){ + this.scrollData = e; +}, +``` + +### 左中插槽演示 +``` html + + + + 新疆 + + + + + + + + + + +/*css 用于演示插槽自定义样式*/ + +``` + +### 关闭左右插槽演示 +``` html + + + + 新疆 + + + + + + + + + +/*css 用于演示插槽自定义样式*/ + +``` + +### 屏幕滑动切换显示插槽 +``` html + + + + 帮助反馈 + + + 咨询 + + + + + + + + +``` \ No newline at end of file diff --git a/components/hx-navbar/hx-navbar.vue b/components/hx-navbar/hx-navbar.vue new file mode 100644 index 0000000..30619c1 --- /dev/null +++ b/components/hx-navbar/hx-navbar.vue @@ -0,0 +1,650 @@ + + + + + diff --git a/components/imageTypeSet/imagebox.vue b/components/imageTypeSet/imagebox.vue new file mode 100644 index 0000000..6cec1d2 --- /dev/null +++ b/components/imageTypeSet/imagebox.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/components/ls-swiper/index.md b/components/ls-swiper/index.md new file mode 100644 index 0000000..42bb102 --- /dev/null +++ b/components/ls-swiper/index.md @@ -0,0 +1,40 @@ +# 轮播组件 + +# 基础式 + + +# 链式 + + +# 卡片式 + + +# props +参数名 | 说明 | 类型 | 默认值 +-----------------|-------------------------------------------------- -|-------------|------------ +list | 轮播数据 | Array | 必输 +imgKey | 轮播数据key(图片url属性) | String | 必输 (自定义模式,非必输) +autoplay | 是否自动播放 | Boolean | false +loop | 是否循环 | Boolean | false +autoplay | 是否自动播放 | Boolean | false +dots | 是否显示轮播点 | Boolean | false +crown | 卡片特效 (中间突出,两边缩放特效) | Boolean | false +interval | 播放时间间隔 | Number | 2000 +duration | 滑动速度 | Number | 1500 +bottom | 轮播点下边距 | Number | 10 (单位:px,设计图建议以375px为准) +height | 高度 | Number | 200 (单位:px,设计图建议以375px为准) +previousMargin | 图片前边距 | Number | 0 (单位:px,设计图建议以375px为准) +nextMargin | 图片后间距 | Number | 0 (单位:px,设计图建议以375px为准) +imgRadius | 图片圆角 | Number | 0 (单位:px,设计图建议以375px为准) +imgWidth | 图片宽度 | String | 100% +@clickItem | 点击事件 | Function | +@change | 切换事件 | Function | + +# 自定义 + + + + +如有其他需求,可在插槽内编写自定义内容, 自动覆盖原图片样式。 \ No newline at end of file diff --git a/components/ls-swiper/index.vue b/components/ls-swiper/index.vue new file mode 100644 index 0000000..c4aebff --- /dev/null +++ b/components/ls-swiper/index.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/components/maramlee-waterfalls-flow/maramlee-waterfalls-flow.vue b/components/maramlee-waterfalls-flow/maramlee-waterfalls-flow.vue new file mode 100644 index 0000000..eb6d438 --- /dev/null +++ b/components/maramlee-waterfalls-flow/maramlee-waterfalls-flow.vue @@ -0,0 +1,173 @@ + + + diff --git a/components/mescroll-uni/components/mescroll-down.css b/components/mescroll-uni/components/mescroll-down.css new file mode 100644 index 0000000..72bf106 --- /dev/null +++ b/components/mescroll-uni/components/mescroll-down.css @@ -0,0 +1,55 @@ +/* 下拉刷新区域 */ +.mescroll-downwarp { + position: absolute; + top: -100%; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} + +/* 下拉刷新--内容区,定位于区域底部 */ +.mescroll-downwarp .downwarp-content { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + min-height: 60rpx; + padding: 20rpx 0; + text-align: center; +} + +/* 下拉刷新--提示文本 */ +.mescroll-downwarp .downwarp-tip { + display: inline-block; + font-size: 28rpx; + vertical-align: middle; + margin-left: 16rpx; + /* color: gray; 已在style设置color,此处删去*/ +} + +/* 下拉刷新--旋转进度条 */ +.mescroll-downwarp .downwarp-progress { + display: inline-block; + width: 32rpx; + height: 32rpx; + border-radius: 50%; + border: 2rpx solid gray; + border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/ + vertical-align: middle; +} + +/* 旋转动画 */ +.mescroll-downwarp .mescroll-rotate { + animation: mescrollDownRotate 0.6s linear infinite; +} + +@keyframes mescrollDownRotate { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/components/mescroll-uni/components/mescroll-down.vue b/components/mescroll-uni/components/mescroll-down.vue new file mode 100644 index 0000000..4b8d785 --- /dev/null +++ b/components/mescroll-uni/components/mescroll-down.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/components/mescroll-uni/components/mescroll-empty.vue b/components/mescroll-uni/components/mescroll-empty.vue new file mode 100644 index 0000000..1cb84c8 --- /dev/null +++ b/components/mescroll-uni/components/mescroll-empty.vue @@ -0,0 +1,91 @@ + + + + + + diff --git a/components/mescroll-uni/components/mescroll-top.vue b/components/mescroll-uni/components/mescroll-top.vue new file mode 100644 index 0000000..79e415b --- /dev/null +++ b/components/mescroll-uni/components/mescroll-top.vue @@ -0,0 +1,81 @@ + + + + + + diff --git a/components/mescroll-uni/components/mescroll-up.css b/components/mescroll-uni/components/mescroll-up.css new file mode 100644 index 0000000..dea37a6 --- /dev/null +++ b/components/mescroll-uni/components/mescroll-up.css @@ -0,0 +1,46 @@ +/* 上拉加载区域 */ +.mescroll-upwarp { + min-height: 60rpx; + padding: 30rpx 0; + text-align: center; + clear: both; +} + +/*提示文本 */ +.mescroll-upwarp .upwarp-tip, +.mescroll-upwarp .upwarp-nodata { + display: inline-block; + font-size: 28rpx; + vertical-align: middle; + /* color: gray; 已在style设置color,此处删去*/ +} + +.mescroll-upwarp .upwarp-tip { + margin-left: 16rpx; +} + +/*旋转进度条 */ +.mescroll-upwarp .upwarp-progress { + display: inline-block; + width: 32rpx; + height: 32rpx; + border-radius: 50%; + border: 2rpx solid gray; + border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/ + vertical-align: middle; +} + +/* 旋转动画 */ +.mescroll-upwarp .mescroll-rotate { + animation: mescrollUpRotate 0.6s linear infinite; +} + +@keyframes mescrollUpRotate { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/components/mescroll-uni/components/mescroll-up.vue b/components/mescroll-uni/components/mescroll-up.vue new file mode 100644 index 0000000..69dc558 --- /dev/null +++ b/components/mescroll-uni/components/mescroll-up.vue @@ -0,0 +1,39 @@ + + + + + + diff --git a/components/mescroll-uni/mescroll-body.css b/components/mescroll-uni/mescroll-body.css new file mode 100644 index 0000000..93102ed --- /dev/null +++ b/components/mescroll-uni/mescroll-body.css @@ -0,0 +1,10 @@ +page { + -webkit-overflow-scrolling: touch; /* 使iOS滚动流畅 */ +} + +.mescroll-body { + position: relative; /* 下拉刷新区域相对自身定位 */ + height: auto; /* 不可固定高度,否则overflow: hidden, 可通过设置最小高度使列表不满屏仍可下拉*/ + overflow: hidden; /* 遮住顶部下拉刷新区域 */ + box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ +} \ No newline at end of file diff --git a/components/mescroll-uni/mescroll-body.vue b/components/mescroll-uni/mescroll-body.vue new file mode 100644 index 0000000..684efa8 --- /dev/null +++ b/components/mescroll-uni/mescroll-body.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/components/mescroll-uni/mescroll-mixins.js b/components/mescroll-uni/mescroll-mixins.js new file mode 100644 index 0000000..fac53d8 --- /dev/null +++ b/components/mescroll-uni/mescroll-mixins.js @@ -0,0 +1,60 @@ +// mescroll-body 和 mescroll-uni 通用 + +// import MescrollUni from "./mescroll-uni.vue"; +// import MescrollBody from "./mescroll-body.vue"; + +const MescrollMixin = { + // components: { // 非H5端无法通过mixin注册组件, 只能在main.js中注册全局组件或具体界面中注册 + // MescrollUni, + // MescrollBody + // }, + data() { + return { + mescroll: null //mescroll实例对象 + } + }, + // 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + onPullDownRefresh(){ + this.mescroll && this.mescroll.onPullDownRefresh(); + }, + // 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) + onPageScroll(e) { + this.mescroll && this.mescroll.onPageScroll(e); + }, + // 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) + onReachBottom() { + this.mescroll && this.mescroll.onReachBottom(); + }, + methods: { + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef(); // 兼容字节跳动小程序 + }, + // 以ref的方式初始化mescroll对象 (兼容字节跳动小程序: http://www.mescroll.com/qa.html?v=20200107#q26) + mescrollInitByRef() { + if(!this.mescroll || !this.mescroll.resetUpScroll){ + let mescrollRef = this.$refs.mescrollRef; + if(mescrollRef) this.mescroll = mescrollRef.mescroll + } + }, + // 下拉刷新的回调 + downCallback() { + // mixin默认resetUpScroll + this.mescroll.resetUpScroll() + }, + // 上拉加载的回调 + upCallback() { + // mixin默认延时500自动结束加载 + setTimeout(()=>{ + this.mescroll.endErr(); + }, 500) + } + }, + mounted() { + this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况 + } + +} + +export default MescrollMixin; diff --git a/components/mescroll-uni/mescroll-uni-option.js b/components/mescroll-uni/mescroll-uni-option.js new file mode 100644 index 0000000..d4bd478 --- /dev/null +++ b/components/mescroll-uni/mescroll-uni-option.js @@ -0,0 +1,36 @@ +// 全局配置 +// mescroll-body 和 mescroll-uni 通用 +const GlobalOption = { + down: { + // 其他down的配置参数也可以写,这里只展示了常用的配置: + textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 + textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 + textLoading: '加载中 ...', // 加载中的提示文本 + offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 + native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + }, + up: { + // 其他up的配置参数也可以写,这里只展示了常用的配置: + textLoading: '加载中 ...', // 加载中的提示文本 + textNoMore: '-- 没有更多了 --', // 没有更多数据的提示文本 + offset: 80, // 距底部多远时,触发upCallback + isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 + toTop: { + // 回到顶部按钮,需配置src才显示 + // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png ) + src: "https://www.xdd618.com/api/file/pic/20230304101324538100.png", + offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px + right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + }, + empty: { + use: true, // 是否显示空布局 + // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png ) + icon: "/static/images/img_nodata.png", + tip: '~ 暂无相关数据 ~' // 提示 + } + } +} + +export default GlobalOption diff --git a/components/mescroll-uni/mescroll-uni.css b/components/mescroll-uni/mescroll-uni.css new file mode 100644 index 0000000..9b9a1e7 --- /dev/null +++ b/components/mescroll-uni/mescroll-uni.css @@ -0,0 +1,29 @@ +page { + height: 100%; + box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ +} + +.mescroll-uni-warp{ + height: 100%; +} + +.mescroll-uni { + position: relative; + width: 100%; + height: 100%; + min-height: 200rpx; + overflow-y: auto; + box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ +} + +/* 定位的方式固定高度 */ +.mescroll-uni-fixed{ + z-index: 1; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: auto; /* 使right生效 */ + height: auto; /* 使bottom生效 */ +} diff --git a/components/mescroll-uni/mescroll-uni.js b/components/mescroll-uni/mescroll-uni.js new file mode 100644 index 0000000..f0ef5d7 --- /dev/null +++ b/components/mescroll-uni/mescroll-uni.js @@ -0,0 +1,862 @@ +/* mescroll + * version 1.2.5 + * 2020-03-15 wenju + * http://www.mescroll.com + */ + +export default function MeScroll(options, isScrollBody) { + let me = this; + me.version = '1.2.5'; // mescroll版本号 + me.options = options || {}; // 配置 + me.isScrollBody = isScrollBody || false; // 滚动区域是否为原生页面滚动; 默认为scroll-view + + me.isDownScrolling = false; // 是否在执行下拉刷新的回调 + me.isUpScrolling = false; // 是否在执行上拉加载的回调 + let hasDownCallback = me.options.down && me.options.down.callback; // 是否配置了down的callback + + // 初始化下拉刷新 + me.initDownScroll(); + // 初始化上拉加载,则初始化 + me.initUpScroll(); + + // 自动加载 + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + // 自动触发下拉刷新 (只有配置了down的callback才自动触发下拉刷新) + if (me.optDown.use && me.optDown.auto && hasDownCallback) { + if (me.optDown.autoShowLoading) { + me.triggerDownScroll(); // 显示下拉进度,执行下拉回调 + } else { + me.optDown.callback && me.optDown.callback(me); // 不显示下拉进度,直接执行下拉回调 + } + } + // 自动触发上拉加载 + setTimeout(function(){ // 延时确保先执行down的callback,再执行up的callback,因为部分小程序emit是异步,会导致isUpAutoLoad判断有误 + me.optUp.use && me.optUp.auto && !me.isUpAutoLoad && me.triggerUpScroll(); + },100) + }, 30); // 需让me.optDown.inited和me.optUp.inited先执行 +} + +/* 配置参数:下拉刷新 */ +MeScroll.prototype.extendDownScroll = function(optDown) { + // 下拉刷新的配置 + MeScroll.extend(optDown, { + use: true, // 是否启用下拉刷新; 默认true + auto: true, // 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true + native: false, // 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + autoShowLoading: false, // 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false + isLock: false, // 是否锁定下拉刷新,默认false; + offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 + startTop: 100, // scroll-view滚动到顶部时,此时的scroll-top不一定为0, 此值用于控制最大的误差 + fps: 80, // 下拉节流 (值越大每秒刷新频率越高) + inOffsetRate: 1, // 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉 + outOffsetRate: 0.2, // 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉 + bottomOffset: 20, // 当手指touchmove位置在距离body底部20px范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行 + minAngle: 45, // 向下滑动最少偏移的角度,取值区间 [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突; + textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 + textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 + textLoading: '加载中 ...', // 加载中的提示文本 + bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorTop) + textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色) + inited: null, // 下拉刷新初始化完毕的回调 + inOffset: null, // 下拉的距离进入offset范围内那一刻的回调 + outOffset: null, // 下拉的距离大于offset那一刻的回调 + onMoving: null, // 下拉过程中的回调,滑动过程一直在执行; rate下拉区域当前高度与指定距离的比值(inOffset: rate<1; outOffset: rate>=1); downHight当前下拉区域的高度 + beforeLoading: null, // 准备触发下拉刷新的回调: 如果return true,将不触发showLoading和callback回调; 常用来完全自定义下拉刷新, 参考案例【淘宝 v6.8.0】 + showLoading: null, // 显示下拉刷新进度的回调 + afterLoading: null, // 准备结束下拉的回调. 返回结束下拉的延时执行时间,默认0ms; 常用于结束下拉之前再显示另外一小段动画,才去隐藏下拉刷新的场景, 参考案例【dotJump】 + endDownScroll: null, // 结束下拉刷新的回调 + callback: function(mescroll) { + // 下拉刷新的回调;默认重置上拉加载列表为第一页 + mescroll.resetUpScroll(); + } + }) +} + +/* 配置参数:上拉加载 */ +MeScroll.prototype.extendUpScroll = function(optUp) { + // 上拉加载的配置 + MeScroll.extend(optUp, { + use: true, // 是否启用上拉加载; 默认true + auto: true, // 是否在初始化完毕之后自动执行上拉加载的回调; 默认true + isLock: false, // 是否锁定上拉加载,默认false; + isBoth: true, // 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发; + isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 + callback: null, // 上拉加载的回调;function(page,mescroll){ } + page: { + num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始 + size: 10, // 每页数据的数量 + time: null // 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复; + }, + noMoreSize: 5, // 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看 + offset: 80, // 距底部多远时,触发upCallback + textLoading: '加载中 ...', // 加载中的提示文本 + textNoMore: '-- END --', // 没有更多数据的提示文本 + bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorBottom) + textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色) + inited: null, // 初始化完毕的回调 + showLoading: null, // 显示加载中的回调 + showNoMore: null, // 显示无更多数据的回调 + hideUpScroll: null, // 隐藏上拉加载的回调 + errDistance: 60, // endErr的时候需往上滑动一段距离,使其往下滑动时再次触发onReachBottom,仅mescroll-body生效 + toTop: { + // 回到顶部按钮,需配置src才显示 + src: null, // 图片路径,默认null (绝对路径或网络图) + offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000 + duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项) + btnClick: null, // 点击按钮的回调 + onShow: null, // 是否显示的回调 + zIndex: 9990, // fixed定位z-index值 + left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + right: 20, // 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + bottom: 120, // 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取本vue的safearea值) + width: 72, // 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + radius: "50%" // 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + }, + empty: { + use: true, // 是否显示空布局 + icon: null, // 图标路径 + tip: '~ 暂无相关数据 ~', // 提示 + btnText: '', // 按钮 + btnClick: null, // 点击按钮的回调 + onShow: null, // 是否显示的回调 + fixed: false, // 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute) + top: "100rpx", // fixed定位的top值 (完整的单位值,如 "10%"; "100rpx") + zIndex: 99 // fixed定位z-index值 + }, + onScroll: false // 是否监听滚动事件 + }) +} + +/* 配置参数 */ +MeScroll.extend = function(userOption, defaultOption) { + if (!userOption) return defaultOption; + for (let key in defaultOption) { + if (userOption[key] == null) { + let def = defaultOption[key]; + if (def != null && typeof def === 'object') { + userOption[key] = MeScroll.extend({}, def); // 深度匹配 + } else { + userOption[key] = def; + } + } else if (typeof userOption[key] === 'object') { + MeScroll.extend(userOption[key], defaultOption[key]); // 深度匹配 + } + } + return userOption; +} + +/* 简单判断是否配置了颜色 (非透明,非白色) */ +MeScroll.prototype.hasColor = function(color) { + if(!color) return false; + let c = color.toLowerCase(); + return c != "#fff" && c != "#ffffff" && c != "transparent" && c != "white" +} + +/* -------初始化下拉刷新------- */ +MeScroll.prototype.initDownScroll = function() { + let me = this; + // 配置参数 + me.optDown = me.options.down || {}; + if(!me.optDown.textColor && me.hasColor(me.optDown.bgColor)) me.optDown.textColor = "#fff"; // 当bgColor有值且textColor未设置,则textColor默认白色 + me.extendDownScroll(me.optDown); + + // 如果是mescroll-body且配置了native,则禁止自定义的下拉刷新 + if(me.isScrollBody && me.optDown.native){ + me.optDown.use = false + }else{ + me.optDown.native = false // 仅mescroll-body支持,mescroll-uni不支持 + } + + me.downHight = 0; // 下拉区域的高度 + + // 在页面中加入下拉布局 + if (me.optDown.use && me.optDown.inited) { + // 初始化完毕的回调 + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + me.optDown.inited(me); + }, 0) + } +} + +/* 列表touchstart事件 */ +MeScroll.prototype.touchstartEvent = function(e) { + if (!this.optDown.use) return; + + this.startPoint = this.getPoint(e); // 记录起点 + this.startTop = this.getScrollTop(); // 记录此时的滚动条位置 + this.lastPoint = this.startPoint; // 重置上次move的点 + this.maxTouchmoveY = this.getBodyHeight() - this.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况) + this.inTouchend = false; // 标记不是touchend +} + +/* 列表touchmove事件 */ +MeScroll.prototype.touchmoveEvent = function(e) { + // #ifdef H5 + window.isPreventDefault = false // 标记不需要阻止window事件 + // #endif + + if (!this.optDown.use) return; + if (!this.startPoint) return; + let me = this; + + // 节流 + let t = new Date().getTime(); + if (me.moveTime && t - me.moveTime < me.moveTimeDiff) { // 小于节流时间,则不处理 + return; + } else { + me.moveTime = t + if(!me.moveTimeDiff) me.moveTimeDiff = 1000 / me.optDown.fps + } + + let scrollTop = me.getScrollTop(); // 当前滚动条的距离 + let curPoint = me.getPoint(e); // 当前点 + + let moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + + // 向下拉 && 在顶部 + // mescroll-body,直接判定在顶部即可 + // scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove + // scroll-view滚动到顶部时,scrollTop不一定为0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等 + if (moveY > 0 && ( + (me.isScrollBody && scrollTop <= 0) + || + (!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop)) ) + )) { + // 可下拉的条件 + if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && + me.optUp.isBoth))) { + + // 下拉的角度是否在配置的范围内 + let angle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90] + if (angle < me.optDown.minAngle) return; // 如果小于配置的角度,则不往下执行下拉刷新 + + // 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发 + if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) { + me.inTouchend = true; // 标记执行touchend + me.touchendEvent(); // 提前触发touchend + return; + } + + // #ifdef H5 + window.isPreventDefault = true // 标记阻止window事件 + // #endif + me.preventDefault(e); // 阻止默认事件 + + let diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上) + + // 下拉距离 < 指定距离 + if (me.downHight < me.optDown.offset) { + if (me.movetype !== 1) { + me.movetype = 1; // 加入标记,保证只执行一次 + me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次 + me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来 + } + me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小 + + // 指定距离 <= 下拉距离 + } else { + if (me.movetype !== 2) { + me.movetype = 2; // 加入标记,保证只执行一次 + me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次 + me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来 + } + if (diff > 0) { // 向下拉 + me.downHight += Math.round(diff * me.optDown.outOffsetRate); // 越往下,高度变化越小 + } else { // 向上收 + me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度 + } + } + + let rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值 + me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行 + } + } + + me.lastPoint = curPoint; // 记录本次移动的点 +} + +/* 列表touchend事件 */ +MeScroll.prototype.touchendEvent = function(e) { + if (!this.optDown.use) return; + // 如果下拉区域高度已改变,则需重置回来 + if (this.isMoveDown) { + if (this.downHight >= this.optDown.offset) { + // 符合触发刷新的条件 + this.triggerDownScroll(); + } else { + // 不符合的话 则重置 + this.downHight = 0; + this.optDown.endDownScroll && this.optDown.endDownScroll(this); + } + this.movetype = 0; + this.isMoveDown = false; + } else if (!this.isScrollBody && this.getScrollTop() === this.startTop) { // scroll-view到顶/左/右/底的滑动事件 + let isScrollUp = this.getPoint(e).y - this.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + // 上滑 + if (isScrollUp) { + // 需检查滑动的角度 + let angle = this.getAngle(this.getPoint(e), this.startPoint); // 两点之间的角度,区间 [0,90] + if (angle > 80) { + // 检查并触发上拉 + this.triggerUpScroll(true); + } + } + } +} + +/* 根据点击滑动事件获取第一个手指的坐标 */ +MeScroll.prototype.getPoint = function(e) { + if (!e) { + return { + x: 0, + y: 0 + } + } + if (e.touches && e.touches[0]) { + return { + x: e.touches[0].pageX, + y: e.touches[0].pageY + } + } else if (e.changedTouches && e.changedTouches[0]) { + return { + x: e.changedTouches[0].pageX, + y: e.changedTouches[0].pageY + } + } else { + return { + x: e.clientX, + y: e.clientY + } + } +} + +/* 计算两点之间的角度: 区间 [0,90]*/ +MeScroll.prototype.getAngle = function(p1, p2) { + let x = Math.abs(p1.x - p2.x); + let y = Math.abs(p1.y - p2.y); + let z = Math.sqrt(x * x + y * y); + let angle = 0; + if (z !== 0) { + angle = Math.asin(y / z) / Math.PI * 180; + } + return angle +} + +/* 触发下拉刷新 */ +MeScroll.prototype.triggerDownScroll = function() { + if (this.optDown.beforeLoading && this.optDown.beforeLoading(this)) { + //return true则处于完全自定义状态 + } else { + this.showDownScroll(); // 下拉刷新中... + this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据 + } +} + +/* 显示下拉进度布局 */ +MeScroll.prototype.showDownScroll = function() { + this.isDownScrolling = true; // 标记下拉中 + if (this.optDown.native) { + uni.startPullDownRefresh(); // 系统自带的下拉刷新 + this.optDown.showLoading && this.optDown.showLoading(this, 0); // 仍触发showLoading,因为上拉加载用到 + } else{ + this.downHight = this.optDown.offset; // 更新下拉区域高度 + this.optDown.showLoading && this.optDown.showLoading(this, this.downHight); // 下拉刷新中... + } +} + +/* 显示系统自带的下拉刷新时需要处理的业务 */ +MeScroll.prototype.onPullDownRefresh = function() { + this.isDownScrolling = true; // 标记下拉中 + this.optDown.showLoading && this.optDown.showLoading(this, 0); // 仍触发showLoading,因为上拉加载用到 + this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据 +} + +/* 结束下拉刷新 */ +MeScroll.prototype.endDownScroll = function() { + if (this.optDown.native) { // 结束原生下拉刷新 + this.isDownScrolling = false; + this.optDown.endDownScroll && this.optDown.endDownScroll(this); + uni.stopPullDownRefresh(); + return + } + let me = this; + // 结束下拉刷新的方法 + let endScroll = function() { + me.downHight = 0; + me.isDownScrolling = false; + me.optDown.endDownScroll && me.optDown.endDownScroll(me); + !me.isScrollBody && me.setScrollHeight(0) // scroll-view重置滚动区域,使数据不满屏时仍可检查触发翻页 + } + // 结束下拉刷新时的回调 + let delay = 0; + if (me.optDown.afterLoading) delay = me.optDown.afterLoading(me); // 结束下拉刷新的延时,单位ms + if (typeof delay === 'number' && delay > 0) { + setTimeout(endScroll, delay); + } else { + endScroll(); + } +} + +/* 锁定下拉刷新:isLock=ture,null锁定;isLock=false解锁 */ +MeScroll.prototype.lockDownScroll = function(isLock) { + if (isLock == null) isLock = true; + this.optDown.isLock = isLock; +} + +/* 锁定上拉加载:isLock=ture,null锁定;isLock=false解锁 */ +MeScroll.prototype.lockUpScroll = function(isLock) { + if (isLock == null) isLock = true; + this.optUp.isLock = isLock; +} + +/* -------初始化上拉加载------- */ +MeScroll.prototype.initUpScroll = function() { + let me = this; + // 配置参数 + me.optUp = me.options.up || {use: false} + if(!me.optUp.textColor && me.hasColor(me.optUp.bgColor)) me.optUp.textColor = "#fff"; // 当bgColor有值且textColor未设置,则textColor默认白色 + me.extendUpScroll(me.optUp); + + if (!me.optUp.isBounce) me.setBounce(false); // 不允许bounce时,需禁止window的touchmove事件 + + if (me.optUp.use === false) return; // 配置不使用上拉加载时,则不初始化上拉布局 + me.optUp.hasNext = true; // 如果使用上拉,则默认有下一页 + me.startNum = me.optUp.page.num + 1; // 记录page开始的页码 + + // 初始化完毕的回调 + if (me.optUp.inited) { + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + me.optUp.inited(me); + }, 0) + } +} + +/*滚动到底部的事件 (仅mescroll-body生效)*/ +MeScroll.prototype.onReachBottom = function() { + if (this.isScrollBody && !this.isUpScrolling) { // 只能支持下拉刷新的时候同时可以触发上拉加载,否则滚动到底部就需要上滑一点才能触发onReachBottom + if (!this.optUp.isLock && this.optUp.hasNext) { + this.triggerUpScroll(); + } + } +} + +/*列表滚动事件 (仅mescroll-body生效)*/ +MeScroll.prototype.onPageScroll = function(e) { + if (!this.isScrollBody) return; + + // 更新滚动条的位置 (主要用于判断下拉刷新时,滚动条是否在顶部) + this.setScrollTop(e.scrollTop); + + // 顶部按钮的显示隐藏 + if (e.scrollTop >= this.optUp.toTop.offset) { + this.showTopBtn(); + } else { + this.hideTopBtn(); + } +} + +/*列表滚动事件*/ +MeScroll.prototype.scroll = function(e, onScroll) { + // 更新滚动条的位置 + this.setScrollTop(e.scrollTop); + // 更新滚动内容高度 + this.setScrollHeight(e.scrollHeight); + + // 向上滑还是向下滑动 + if (this.preScrollY == null) this.preScrollY = 0; + this.isScrollUp = e.scrollTop - this.preScrollY > 0; + this.preScrollY = e.scrollTop; + + // 上滑 && 检查并触发上拉 + this.isScrollUp && this.triggerUpScroll(true); + + // 顶部按钮的显示隐藏 + if (e.scrollTop >= this.optUp.toTop.offset) { + this.showTopBtn(); + } else { + this.hideTopBtn(); + } + + // 滑动监听 + this.optUp.onScroll && onScroll && onScroll() +} + +/* 触发上拉加载 */ +MeScroll.prototype.triggerUpScroll = function(isCheck) { + if (!this.isUpScrolling && this.optUp.use && this.optUp.callback) { + // 是否校验在底部; 默认不校验 + if (isCheck === true) { + let canUp = false; + // 还有下一页 && 没有锁定 && 不在下拉中 + if (this.optUp.hasNext && !this.optUp.isLock && !this.isDownScrolling) { + if (this.getScrollBottom() <= this.optUp.offset) { // 到底部 + canUp = true; // 标记可上拉 + } + } + if (canUp === false) return; + } + this.showUpScroll(); // 上拉加载中... + this.optUp.page.num++; // 预先加一页,如果失败则减回 + this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调 + this.num = this.optUp.page.num; // 把最新的页数赋值在mescroll上,避免对page的影响 + this.size = this.optUp.page.size; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.time = this.optUp.page.time; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.optUp.callback(this); // 执行回调,联网加载数据 + } +} + +/* 显示上拉加载中 */ +MeScroll.prototype.showUpScroll = function() { + this.isUpScrolling = true; // 标记上拉加载中 + this.optUp.showLoading && this.optUp.showLoading(this); // 回调 +} + +/* 显示上拉无更多数据 */ +MeScroll.prototype.showNoMore = function() { + this.optUp.hasNext = false; // 标记无更多数据 + this.optUp.showNoMore && this.optUp.showNoMore(this); // 回调 +} + +/* 隐藏上拉区域**/ +MeScroll.prototype.hideUpScroll = function() { + this.optUp.hideUpScroll && this.optUp.hideUpScroll(this); // 回调 +} + +/* 结束上拉加载 */ +MeScroll.prototype.endUpScroll = function(isShowNoMore) { + if (isShowNoMore != null) { // isShowNoMore=null,不处理下拉状态,下拉刷新的时候调用 + if (isShowNoMore) { + this.showNoMore(); // isShowNoMore=true,显示无更多数据 + } else { + this.hideUpScroll(); // isShowNoMore=false,隐藏上拉加载 + } + } + this.isUpScrolling = false; // 标记结束上拉加载 +} + +/* 重置上拉加载列表为第一页 + *isShowLoading 是否显示进度布局; + * 1.默认null,不传参,则显示上拉加载的进度布局 + * 2.传参true, 则显示下拉刷新的进度布局 + * 3.传参false,则不显示上拉和下拉的进度 (常用于静默更新列表数据) + */ +MeScroll.prototype.resetUpScroll = function(isShowLoading) { + if (this.optUp && this.optUp.use) { + let page = this.optUp.page; + this.prePageNum = page.num; // 缓存重置前的页码,加载失败可退回 + this.prePageTime = page.time; // 缓存重置前的时间,加载失败可退回 + page.num = this.startNum; // 重置为第一页 + page.time = null; // 重置时间为空 + if (!this.isDownScrolling && isShowLoading !== false) { // 如果不是下拉刷新触发的resetUpScroll并且不配置列表静默更新,则显示进度; + if (isShowLoading == null) { + this.removeEmpty(); // 移除空布局 + this.showUpScroll(); // 不传参,默认显示上拉加载的进度布局 + } else { + this.showDownScroll(); // 传true,显示下拉刷新的进度布局,不清空列表 + } + } + this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调 + this.num = page.num; // 把最新的页数赋值在mescroll上,避免对page的影响 + this.size = page.size; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.time = page.time; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.optUp.callback && this.optUp.callback(this); // 执行上拉回调 + } +} + +/* 设置page.num的值 */ +MeScroll.prototype.setPageNum = function(num) { + this.optUp.page.num = num - 1; +} + +/* 设置page.size的值 */ +MeScroll.prototype.setPageSize = function(size) { + this.optUp.page.size = size; +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据量(必传) + * totalPage: 总页数(必传) + * systime: 服务器时间 (可空) + */ +MeScroll.prototype.endByPage = function(dataSize, totalPage, systime) { + let hasNext; + if (this.optUp.use && totalPage != null) hasNext = this.optUp.page.num < totalPage; // 是否还有下一页 + this.endSuccess(dataSize, hasNext, systime); +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据量(必传) + * totalSize: 列表所有数据总数量(必传) + * systime: 服务器时间 (可空) + */ +MeScroll.prototype.endBySize = function(dataSize, totalSize, systime) { + let hasNext; + if (this.optUp.use && totalSize != null) { + let loadSize = (this.optUp.page.num - 1) * this.optUp.page.size + dataSize; // 已加载的数据总数 + hasNext = loadSize < totalSize; // 是否还有下一页 + } + this.endSuccess(dataSize, hasNext, systime); +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据个数(不是所有页的数据总和),用于上拉加载判断是否还有下一页.如果不传,则会判断还有下一页 + * hasNext: 是否还有下一页,布尔类型;用来解决这个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据dataSize判断,则需翻到第三页才会知道无更多数据,如果传了hasNext,则翻到第二页即可显示无更多数据. + * systime: 服务器时间(可空);用来解决这个小问题:当准备翻下一页时,数据库新增了几条记录,此时翻下一页,前面的几条数据会和上一页的重复;这里传入了systime,那么upCallback的page.time就会有值,把page.time传给服务器,让后台过滤新加入的那几条记录 + */ +MeScroll.prototype.endSuccess = function(dataSize, hasNext, systime) { + let me = this; + // 结束下拉刷新 + if (me.isDownScrolling) me.endDownScroll(); + + // 结束上拉加载 + if (me.optUp.use) { + let isShowNoMore; // 是否已无更多数据 + if (dataSize != null) { + let pageNum = me.optUp.page.num; // 当前页码 + let pageSize = me.optUp.page.size; // 每页长度 + // 如果是第一页 + if (pageNum === 1) { + if (systime) me.optUp.page.time = systime; // 设置加载列表数据第一页的时间 + } + if (dataSize < pageSize || hasNext === false) { + // 返回的数据不满一页时,则说明已无更多数据 + me.optUp.hasNext = false; + if (dataSize === 0 && pageNum === 1) { + // 如果第一页无任何数据且配置了空布局 + isShowNoMore = false; + me.showEmpty(); + } else { + // 总列表数少于配置的数量,则不显示无更多数据 + let allDataSize = (pageNum - 1) * pageSize + dataSize; + if (allDataSize < me.optUp.noMoreSize) { + isShowNoMore = false; + } else { + isShowNoMore = true; + } + me.removeEmpty(); // 移除空布局 + } + } else { + // 还有下一页 + isShowNoMore = false; + me.optUp.hasNext = true; + me.removeEmpty(); // 移除空布局 + } + } + + // 隐藏上拉 + me.endUpScroll(isShowNoMore); + } +} + +/* 回调失败,结束下拉刷新和上拉加载 */ +MeScroll.prototype.endErr = function(errDistance) { + // 结束下拉,回调失败重置回原来的页码和时间 + if (this.isDownScrolling) { + let page = this.optUp.page; + if (page && this.prePageNum) { + page.num = this.prePageNum; + page.time = this.prePageTime; + } + this.endDownScroll(); + } + // 结束上拉,回调失败重置回原来的页码 + if (this.isUpScrolling) { + this.optUp.page.num--; + this.endUpScroll(false); + // 如果是mescroll-body,则需往回滚一定距离 + if(this.isScrollBody && errDistance !== 0){ // 不处理0 + if(!errDistance) errDistance = this.optUp.errDistance; // 不传,则取默认 + this.scrollTo(this.getScrollTop() - errDistance, 0) // 往上回滚的距离 + } + } +} + +/* 显示空布局 */ +MeScroll.prototype.showEmpty = function() { + this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(true) +} + +/* 移除空布局 */ +MeScroll.prototype.removeEmpty = function() { + this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(false) +} + +/* 显示回到顶部的按钮 */ +MeScroll.prototype.showTopBtn = function() { + if (!this.topBtnShow) { + this.topBtnShow = true; + this.optUp.toTop.onShow && this.optUp.toTop.onShow(true); + } +} + +/* 隐藏回到顶部的按钮 */ +MeScroll.prototype.hideTopBtn = function() { + if (this.topBtnShow) { + this.topBtnShow = false; + this.optUp.toTop.onShow && this.optUp.toTop.onShow(false); + } +} + +/* 获取滚动条的位置 */ +MeScroll.prototype.getScrollTop = function() { + return this.scrollTop || 0 +} + +/* 记录滚动条的位置 */ +MeScroll.prototype.setScrollTop = function(y) { + this.scrollTop = y; +} + +/* 滚动到指定位置 */ +MeScroll.prototype.scrollTo = function(y, t) { + this.myScrollTo && this.myScrollTo(y, t) // scrollview需自定义回到顶部方法 +} + +/* 自定义scrollTo */ +MeScroll.prototype.resetScrollTo = function(myScrollTo) { + this.myScrollTo = myScrollTo +} + +/* 滚动条到底部的距离 */ +MeScroll.prototype.getScrollBottom = function() { + return this.getScrollHeight() - this.getClientHeight() - this.getScrollTop() +} + +/* 计步器 + star: 开始值 + end: 结束值 + callback(step,timer): 回调step值,计步器timer,可自行通过window.clearInterval(timer)结束计步器; + t: 计步时长,传0则直接回调end值;不传则默认300ms + rate: 周期;不传则默认30ms计步一次 + * */ +MeScroll.prototype.getStep = function(star, end, callback, t, rate) { + let diff = end - star; // 差值 + if (t === 0 || diff === 0) { + callback && callback(end); + return; + } + t = t || 300; // 时长 300ms + rate = rate || 30; // 周期 30ms + let count = t / rate; // 次数 + let step = diff / count; // 步长 + let i = 0; // 计数 + let timer = setInterval(function() { + if (i < count - 1) { + star += step; + callback && callback(star, timer); + i++; + } else { + callback && callback(end, timer); // 最后一次直接设置end,避免计算误差 + clearInterval(timer); + } + }, rate); +} + +/* 滚动容器的高度 */ +MeScroll.prototype.getClientHeight = function(isReal) { + let h = this.clientHeight || 0 + if (h === 0 && isReal !== true) { // 未获取到容器的高度,可临时取body的高度 (可能会有误差) + h = this.getBodyHeight() + } + return h +} +MeScroll.prototype.setClientHeight = function(h) { + this.clientHeight = h; +} + +/* 滚动内容的高度 */ +MeScroll.prototype.getScrollHeight = function() { + return this.scrollHeight || 0; +} +MeScroll.prototype.setScrollHeight = function(h) { + this.scrollHeight = h; +} + +/* body的高度 */ +MeScroll.prototype.getBodyHeight = function() { + return this.bodyHeight || 0; +} +MeScroll.prototype.setBodyHeight = function(h) { + this.bodyHeight = h; +} + +/* 阻止浏览器默认滚动事件 */ +MeScroll.prototype.preventDefault = function(e) { + // 小程序不支持e.preventDefault + // app的bounce只能通过配置pages.json的style.app-plus.bounce为"none"来禁止 + // cancelable:是否可以被禁用; defaultPrevented:是否已经被禁用 + if (e && e.cancelable && !e.defaultPrevented) e.preventDefault() +} + +/* 是否允许下拉回弹(橡皮筋效果); true或null为允许; false禁止bounce */ +MeScroll.prototype.setBounce = function(isBounce) { + // #ifdef H5 + if (isBounce === false) { + this.optUp.isBounce = false; // 禁止 + // 标记当前页使用了mescroll (需延时,确保page已切换) + setTimeout(function() { + let uniPageDom = document.getElementsByTagName('uni-page')[0]; + uniPageDom && uniPageDom.setAttribute('use_mescroll', true) + }, 30); + // 避免重复添加事件 + if (window.isSetBounce) return; + window.isSetBounce = true; + // 需禁止window的touchmove事件才能有效的阻止bounce + window.bounceTouchmove = function(e) { + if(!window.isPreventDefault) return; // 根据标记判断是否阻止 + + let el = e.target; + // 当前touch的元素及父元素是否要拦截touchmove事件 + let isPrevent = true; + while (el !== document.body && el !== document) { + if (el.tagName === 'UNI-PAGE') { // 只扫描当前页 + if (!el.getAttribute('use_mescroll')) { + isPrevent = false; // 如果当前页没有使用mescroll,则不阻止 + } + break; + } + let cls = el.classList; + if (cls) { + if (cls.contains('mescroll-touch')) { // 采用scroll-view 此处不能过滤mescroll-uni,否则下拉仍然有回弹 + isPrevent = false; // mescroll-touch无需拦截touchmove事件 + break; + } else if (cls.contains('mescroll-touch-x') || cls.contains('mescroll-touch-y')) { + // 如果配置了水平或者垂直滑动 + let curX = e.touches ? e.touches[0].pageX : e.clientX; // 当前第一个手指距离列表顶部的距离x + let curY = e.touches ? e.touches[0].pageY : e.clientY; // 当前第一个手指距离列表顶部的距离y + if (!this.preWinX) this.preWinX = curX; // 设置上次移动的距离x + if (!this.preWinY) this.preWinY = curY; // 设置上次移动的距离y + // 计算两点之间的角度 + let x = Math.abs(this.preWinX - curX); + let y = Math.abs(this.preWinY - curY); + let z = Math.sqrt(x * x + y * y); + this.preWinX = curX; // 记录本次curX的值 + this.preWinY = curY; // 记录本次curY的值 + if (z !== 0) { + let angle = Math.asin(y / z) / Math.PI * 180; // 角度区间 [0,90] + if ((angle <= 45 && cls.contains('mescroll-touch-x')) || (angle > 45 && cls.contains('mescroll-touch-y'))) { + isPrevent = false; // 水平滑动或者垂直滑动,不拦截touchmove事件 + break; + } + } + } + } + el = el.parentNode; // 继续检查其父元素 + } + // 拦截touchmove事件:是否可以被禁用&&是否已经被禁用 (这里不使用me.preventDefault(e)的方法,因为某些情况下会报找不到方法的异常) + if (isPrevent && e.cancelable && !e.defaultPrevented && typeof e.preventDefault === "function") e.preventDefault(); + } + window.addEventListener('touchmove', window.bounceTouchmove, { + passive: false + }); + } else { + this.optUp.isBounce = true; // 允许 + if (window.bounceTouchmove) { + window.removeEventListener('touchmove', window.bounceTouchmove); + window.bounceTouchmove = null; + window.isSetBounce = false; + } + } + // #endif +} diff --git a/components/mescroll-uni/mescroll-uni.vue b/components/mescroll-uni/mescroll-uni.vue new file mode 100644 index 0000000..02bda08 --- /dev/null +++ b/components/mescroll-uni/mescroll-uni.vue @@ -0,0 +1,364 @@ + + + + + diff --git a/components/mescroll-uni/mixins/mescroll-comp.js b/components/mescroll-uni/mixins/mescroll-comp.js new file mode 100644 index 0000000..f376379 --- /dev/null +++ b/components/mescroll-uni/mixins/mescroll-comp.js @@ -0,0 +1,23 @@ +/** + * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: + * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) + * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) + */ +const MescrollCompMixin = { + // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 + onPageScroll(e) { + let item = this.$refs["mescrollItem"]; + if(item && item.mescroll) item.mescroll.onPageScroll(e); + }, + onReachBottom() { + let item = this.$refs["mescrollItem"]; + if(item && item.mescroll) item.mescroll.onReachBottom(); + }, + // 当down的native: true时, 还需传递此方法进到子组件 + onPullDownRefresh(){ + let item = this.$refs["mescrollItem"]; + if(item && item.mescroll) item.mescroll.onPullDownRefresh(); + } +} + +export default MescrollCompMixin; diff --git a/components/mescroll-uni/mixins/mescroll-more-item.js b/components/mescroll-uni/mixins/mescroll-more-item.js new file mode 100644 index 0000000..81bc45c --- /dev/null +++ b/components/mescroll-uni/mixins/mescroll-more-item.js @@ -0,0 +1,48 @@ +/** + * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例) + */ +const MescrollMoreItemMixin = { + props:{ + i: Number, // 每个tab页的专属下标 + index: { // 当前tab的下标 + type: Number, + default(){ + return 0 + } + } + }, + data() { + return { + downOption:{ + auto:false // 不自动加载 + }, + upOption:{ + auto:false // 不自动加载 + }, + isInit: false // 当前tab是否已初始化 + } + }, + watch:{ + // 监听下标的变化 + index(val){ + if (this.i === val && !this.isInit) { + this.isInit = true; // 标记为true + this.mescroll && this.mescroll.triggerDownScroll(); + } + } + }, + methods: { + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序 (mescroll-mixins.js) + // 自动加载当前tab的数据 + if(this.i === this.index){ + this.isInit = true; // 标记为true + this.mescroll.triggerDownScroll(); + } + }, + } +} + +export default MescrollMoreItemMixin; diff --git a/components/mescroll-uni/mixins/mescroll-more.js b/components/mescroll-uni/mixins/mescroll-more.js new file mode 100644 index 0000000..142aa75 --- /dev/null +++ b/components/mescroll-uni/mixins/mescroll-more.js @@ -0,0 +1,56 @@ +/** + * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: + * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) + * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) + */ +const MescrollMoreMixin = { + data() { + return { + tabIndex: 0 // 当前tab下标 + } + }, + // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 + onPageScroll(e) { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onPageScroll(e); + }, + onReachBottom() { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onReachBottom(); + }, + // 当down的native: true时, 还需传递此方法进到子组件 + onPullDownRefresh(){ + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onPullDownRefresh(); + }, + methods:{ + // 根据下标获取对应子组件的mescroll + getMescroll(i){ + if(!this.mescrollItems) this.mescrollItems = []; + if(!this.mescrollItems[i]) { + // v-for中的refs + let vForItem = this.$refs["mescrollItem"]; + if(vForItem){ + this.mescrollItems[i] = vForItem[i] + }else{ + // 普通的refs,不可重复 + this.mescrollItems[i] = this.$refs["mescrollItem"+i]; + } + } + let item = this.mescrollItems[i] + return item ? item.mescroll : null + }, + // 切换tab,恢复滚动条位置 + tabChange(i){ + let mescroll = this.getMescroll(i); + if(mescroll){ + // 延时(比$nextTick靠谱一些),确保元素已渲染 + setTimeout(()=>{ + mescroll.scrollTo(mescroll.getScrollTop(),0) + },30) + } + } + } +} + +export default MescrollMoreMixin; diff --git a/components/simple-address/city-data/area.js b/components/simple-address/city-data/area.js new file mode 100644 index 0000000..73056a4 --- /dev/null +++ b/components/simple-address/city-data/area.js @@ -0,0 +1,12548 @@ +/* eslint-disable */ +var areaData = [ + [ + [{ + "label": "东城区", + "value": "110101" + }, + { + "label": "西城区", + "value": "110102" + }, + { + "label": "朝阳区", + "value": "110105" + }, + { + "label": "丰台区", + "value": "110106" + }, + { + "label": "石景山区", + "value": "110107" + }, + { + "label": "海淀区", + "value": "110108" + }, + { + "label": "门头沟区", + "value": "110109" + }, + { + "label": "房山区", + "value": "110111" + }, + { + "label": "通州区", + "value": "110112" + }, + { + "label": "顺义区", + "value": "110113" + }, + { + "label": "昌平区", + "value": "110114" + }, + { + "label": "大兴区", + "value": "110115" + }, + { + "label": "怀柔区", + "value": "110116" + }, + { + "label": "平谷区", + "value": "110117" + }, + { + "label": "密云区", + "value": "110118" + }, + { + "label": "延庆区", + "value": "110119" + } + ] + ], + [ + [{ + "label": "和平区", + "value": "120101" + }, + { + "label": "河东区", + "value": "120102" + }, + { + "label": "河西区", + "value": "120103" + }, + { + "label": "南开区", + "value": "120104" + }, + { + "label": "河北区", + "value": "120105" + }, + { + "label": "红桥区", + "value": "120106" + }, + { + "label": "东丽区", + "value": "120110" + }, + { + "label": "西青区", + "value": "120111" + }, + { + "label": "津南区", + "value": "120112" + }, + { + "label": "北辰区", + "value": "120113" + }, + { + "label": "武清区", + "value": "120114" + }, + { + "label": "宝坻区", + "value": "120115" + }, + { + "label": "滨海新区", + "value": "120116" + }, + { + "label": "宁河区", + "value": "120117" + }, + { + "label": "静海区", + "value": "120118" + }, + { + "label": "蓟州区", + "value": "120119" + } + ] + ], + [ + [{ + "label": "长安区", + "value": "130102" + }, + { + "label": "桥西区", + "value": "130104" + }, + { + "label": "新华区", + "value": "130105" + }, + { + "label": "井陉矿区", + "value": "130107" + }, + { + "label": "裕华区", + "value": "130108" + }, + { + "label": "藁城区", + "value": "130109" + }, + { + "label": "鹿泉区", + "value": "130110" + }, + { + "label": "栾城区", + "value": "130111" + }, + { + "label": "井陉县", + "value": "130121" + }, + { + "label": "正定县", + "value": "130123" + }, + { + "label": "行唐县", + "value": "130125" + }, + { + "label": "灵寿县", + "value": "130126" + }, + { + "label": "高邑县", + "value": "130127" + }, + { + "label": "深泽县", + "value": "130128" + }, + { + "label": "赞皇县", + "value": "130129" + }, + { + "label": "无极县", + "value": "130130" + }, + { + "label": "平山县", + "value": "130131" + }, + { + "label": "元氏县", + "value": "130132" + }, + { + "label": "赵县", + "value": "130133" + }, + { + "label": "石家庄高新技术产业开发区", + "value": "130171" + }, + { + "label": "石家庄循环化工园区", + "value": "130172" + }, + { + "label": "辛集市", + "value": "130181" + }, + { + "label": "晋州市", + "value": "130183" + }, + { + "label": "新乐市", + "value": "130184" + } + ], + [{ + "label": "路南区", + "value": "130202" + }, + { + "label": "路北区", + "value": "130203" + }, + { + "label": "古冶区", + "value": "130204" + }, + { + "label": "开平区", + "value": "130205" + }, + { + "label": "丰南区", + "value": "130207" + }, + { + "label": "丰润区", + "value": "130208" + }, + { + "label": "曹妃甸区", + "value": "130209" + }, + { + "label": "滦县", + "value": "130223" + }, + { + "label": "滦南县", + "value": "130224" + }, + { + "label": "乐亭县", + "value": "130225" + }, + { + "label": "迁西县", + "value": "130227" + }, + { + "label": "玉田县", + "value": "130229" + }, + { + "label": "唐山市芦台经济技术开发区", + "value": "130271" + }, + { + "label": "唐山市汉沽管理区", + "value": "130272" + }, + { + "label": "唐山高新技术产业开发区", + "value": "130273" + }, + { + "label": "河北唐山海港经济开发区", + "value": "130274" + }, + { + "label": "遵化市", + "value": "130281" + }, + { + "label": "迁安市", + "value": "130283" + } + ], + [{ + "label": "海港区", + "value": "130302" + }, + { + "label": "山海关区", + "value": "130303" + }, + { + "label": "北戴河区", + "value": "130304" + }, + { + "label": "抚宁区", + "value": "130306" + }, + { + "label": "青龙满族自治县", + "value": "130321" + }, + { + "label": "昌黎县", + "value": "130322" + }, + { + "label": "卢龙县", + "value": "130324" + }, + { + "label": "秦皇岛市经济技术开发区", + "value": "130371" + }, + { + "label": "北戴河新区", + "value": "130372" + } + ], + [{ + "label": "邯山区", + "value": "130402" + }, + { + "label": "丛台区", + "value": "130403" + }, + { + "label": "复兴区", + "value": "130404" + }, + { + "label": "峰峰矿区", + "value": "130406" + }, + { + "label": "肥乡区", + "value": "130407" + }, + { + "label": "永年区", + "value": "130408" + }, + { + "label": "临漳县", + "value": "130423" + }, + { + "label": "成安县", + "value": "130424" + }, + { + "label": "大名县", + "value": "130425" + }, + { + "label": "涉县", + "value": "130426" + }, + { + "label": "磁县", + "value": "130427" + }, + { + "label": "邱县", + "value": "130430" + }, + { + "label": "鸡泽县", + "value": "130431" + }, + { + "label": "广平县", + "value": "130432" + }, + { + "label": "馆陶县", + "value": "130433" + }, + { + "label": "魏县", + "value": "130434" + }, + { + "label": "曲周县", + "value": "130435" + }, + { + "label": "邯郸经济技术开发区", + "value": "130471" + }, + { + "label": "邯郸冀南新区", + "value": "130473" + }, + { + "label": "武安市", + "value": "130481" + } + ], + [{ + "label": "桥东区", + "value": "130502" + }, + { + "label": "桥西区", + "value": "130503" + }, + { + "label": "邢台县", + "value": "130521" + }, + { + "label": "临城县", + "value": "130522" + }, + { + "label": "内丘县", + "value": "130523" + }, + { + "label": "柏乡县", + "value": "130524" + }, + { + "label": "隆尧县", + "value": "130525" + }, + { + "label": "任县", + "value": "130526" + }, + { + "label": "南和县", + "value": "130527" + }, + { + "label": "宁晋县", + "value": "130528" + }, + { + "label": "巨鹿县", + "value": "130529" + }, + { + "label": "新河县", + "value": "130530" + }, + { + "label": "广宗县", + "value": "130531" + }, + { + "label": "平乡县", + "value": "130532" + }, + { + "label": "威县", + "value": "130533" + }, + { + "label": "清河县", + "value": "130534" + }, + { + "label": "临西县", + "value": "130535" + }, + { + "label": "河北邢台经济开发区", + "value": "130571" + }, + { + "label": "南宫市", + "value": "130581" + }, + { + "label": "沙河市", + "value": "130582" + } + ], + [{ + "label": "竞秀区", + "value": "130602" + }, + { + "label": "莲池区", + "value": "130606" + }, + { + "label": "满城区", + "value": "130607" + }, + { + "label": "清苑区", + "value": "130608" + }, + { + "label": "徐水区", + "value": "130609" + }, + { + "label": "涞水县", + "value": "130623" + }, + { + "label": "阜平县", + "value": "130624" + }, + { + "label": "定兴县", + "value": "130626" + }, + { + "label": "唐县", + "value": "130627" + }, + { + "label": "高阳县", + "value": "130628" + }, + { + "label": "容城县", + "value": "130629" + }, + { + "label": "涞源县", + "value": "130630" + }, + { + "label": "望都县", + "value": "130631" + }, + { + "label": "安新县", + "value": "130632" + }, + { + "label": "易县", + "value": "130633" + }, + { + "label": "曲阳县", + "value": "130634" + }, + { + "label": "蠡县", + "value": "130635" + }, + { + "label": "顺平县", + "value": "130636" + }, + { + "label": "博野县", + "value": "130637" + }, + { + "label": "雄县", + "value": "130638" + }, + { + "label": "保定高新技术产业开发区", + "value": "130671" + }, + { + "label": "保定白沟新城", + "value": "130672" + }, + { + "label": "涿州市", + "value": "130681" + }, + { + "label": "定州市", + "value": "130682" + }, + { + "label": "安国市", + "value": "130683" + }, + { + "label": "高碑店市", + "value": "130684" + } + ], + [{ + "label": "桥东区", + "value": "130702" + }, + { + "label": "桥西区", + "value": "130703" + }, + { + "label": "宣化区", + "value": "130705" + }, + { + "label": "下花园区", + "value": "130706" + }, + { + "label": "万全区", + "value": "130708" + }, + { + "label": "崇礼区", + "value": "130709" + }, + { + "label": "张北县", + "value": "130722" + }, + { + "label": "康保县", + "value": "130723" + }, + { + "label": "沽源县", + "value": "130724" + }, + { + "label": "尚义县", + "value": "130725" + }, + { + "label": "蔚县", + "value": "130726" + }, + { + "label": "阳原县", + "value": "130727" + }, + { + "label": "怀安县", + "value": "130728" + }, + { + "label": "怀来县", + "value": "130730" + }, + { + "label": "涿鹿县", + "value": "130731" + }, + { + "label": "赤城县", + "value": "130732" + }, + { + "label": "张家口市高新技术产业开发区", + "value": "130771" + }, + { + "label": "张家口市察北管理区", + "value": "130772" + }, + { + "label": "张家口市塞北管理区", + "value": "130773" + } + ], + [{ + "label": "双桥区", + "value": "130802" + }, + { + "label": "双滦区", + "value": "130803" + }, + { + "label": "鹰手营子矿区", + "value": "130804" + }, + { + "label": "承德县", + "value": "130821" + }, + { + "label": "兴隆县", + "value": "130822" + }, + { + "label": "滦平县", + "value": "130824" + }, + { + "label": "隆化县", + "value": "130825" + }, + { + "label": "丰宁满族自治县", + "value": "130826" + }, + { + "label": "宽城满族自治县", + "value": "130827" + }, + { + "label": "围场满族蒙古族自治县", + "value": "130828" + }, + { + "label": "承德高新技术产业开发区", + "value": "130871" + }, + { + "label": "平泉市", + "value": "130881" + } + ], + [{ + "label": "新华区", + "value": "130902" + }, + { + "label": "运河区", + "value": "130903" + }, + { + "label": "沧县", + "value": "130921" + }, + { + "label": "青县", + "value": "130922" + }, + { + "label": "东光县", + "value": "130923" + }, + { + "label": "海兴县", + "value": "130924" + }, + { + "label": "盐山县", + "value": "130925" + }, + { + "label": "肃宁县", + "value": "130926" + }, + { + "label": "南皮县", + "value": "130927" + }, + { + "label": "吴桥县", + "value": "130928" + }, + { + "label": "献县", + "value": "130929" + }, + { + "label": "孟村回族自治县", + "value": "130930" + }, + { + "label": "河北沧州经济开发区", + "value": "130971" + }, + { + "label": "沧州高新技术产业开发区", + "value": "130972" + }, + { + "label": "沧州渤海新区", + "value": "130973" + }, + { + "label": "泊头市", + "value": "130981" + }, + { + "label": "任丘市", + "value": "130982" + }, + { + "label": "黄骅市", + "value": "130983" + }, + { + "label": "河间市", + "value": "130984" + } + ], + [{ + "label": "安次区", + "value": "131002" + }, + { + "label": "广阳区", + "value": "131003" + }, + { + "label": "固安县", + "value": "131022" + }, + { + "label": "永清县", + "value": "131023" + }, + { + "label": "香河县", + "value": "131024" + }, + { + "label": "大城县", + "value": "131025" + }, + { + "label": "文安县", + "value": "131026" + }, + { + "label": "大厂回族自治县", + "value": "131028" + }, + { + "label": "廊坊经济技术开发区", + "value": "131071" + }, + { + "label": "霸州市", + "value": "131081" + }, + { + "label": "三河市", + "value": "131082" + } + ], + [{ + "label": "桃城区", + "value": "131102" + }, + { + "label": "冀州区", + "value": "131103" + }, + { + "label": "枣强县", + "value": "131121" + }, + { + "label": "武邑县", + "value": "131122" + }, + { + "label": "武强县", + "value": "131123" + }, + { + "label": "饶阳县", + "value": "131124" + }, + { + "label": "安平县", + "value": "131125" + }, + { + "label": "故城县", + "value": "131126" + }, + { + "label": "景县", + "value": "131127" + }, + { + "label": "阜城县", + "value": "131128" + }, + { + "label": "河北衡水经济开发区", + "value": "131171" + }, + { + "label": "衡水滨湖新区", + "value": "131172" + }, + { + "label": "深州市", + "value": "131182" + } + ] + ], + [ + [{ + "label": "小店区", + "value": "140105" + }, + { + "label": "迎泽区", + "value": "140106" + }, + { + "label": "杏花岭区", + "value": "140107" + }, + { + "label": "尖草坪区", + "value": "140108" + }, + { + "label": "万柏林区", + "value": "140109" + }, + { + "label": "晋源区", + "value": "140110" + }, + { + "label": "清徐县", + "value": "140121" + }, + { + "label": "阳曲县", + "value": "140122" + }, + { + "label": "娄烦县", + "value": "140123" + }, + { + "label": "山西转型综合改革示范区", + "value": "140171" + }, + { + "label": "古交市", + "value": "140181" + } + ], + [{ + "label": "城区", + "value": "140202" + }, + { + "label": "矿区", + "value": "140203" + }, + { + "label": "南郊区", + "value": "140211" + }, + { + "label": "新荣区", + "value": "140212" + }, + { + "label": "阳高县", + "value": "140221" + }, + { + "label": "天镇县", + "value": "140222" + }, + { + "label": "广灵县", + "value": "140223" + }, + { + "label": "灵丘县", + "value": "140224" + }, + { + "label": "浑源县", + "value": "140225" + }, + { + "label": "左云县", + "value": "140226" + }, + { + "label": "大同县", + "value": "140227" + }, + { + "label": "山西大同经济开发区", + "value": "140271" + } + ], + [{ + "label": "城区", + "value": "140302" + }, + { + "label": "矿区", + "value": "140303" + }, + { + "label": "郊区", + "value": "140311" + }, + { + "label": "平定县", + "value": "140321" + }, + { + "label": "盂县", + "value": "140322" + }, + { + "label": "山西阳泉经济开发区", + "value": "140371" + } + ], + [{ + "label": "城区", + "value": "140402" + }, + { + "label": "郊区", + "value": "140411" + }, + { + "label": "长治县", + "value": "140421" + }, + { + "label": "襄垣县", + "value": "140423" + }, + { + "label": "屯留县", + "value": "140424" + }, + { + "label": "平顺县", + "value": "140425" + }, + { + "label": "黎城县", + "value": "140426" + }, + { + "label": "壶关县", + "value": "140427" + }, + { + "label": "长子县", + "value": "140428" + }, + { + "label": "武乡县", + "value": "140429" + }, + { + "label": "沁县", + "value": "140430" + }, + { + "label": "沁源县", + "value": "140431" + }, + { + "label": "山西长治高新技术产业园区", + "value": "140471" + }, + { + "label": "潞城市", + "value": "140481" + } + ], + [{ + "label": "城区", + "value": "140502" + }, + { + "label": "沁水县", + "value": "140521" + }, + { + "label": "阳城县", + "value": "140522" + }, + { + "label": "陵川县", + "value": "140524" + }, + { + "label": "泽州县", + "value": "140525" + }, + { + "label": "高平市", + "value": "140581" + } + ], + [{ + "label": "朔城区", + "value": "140602" + }, + { + "label": "平鲁区", + "value": "140603" + }, + { + "label": "山阴县", + "value": "140621" + }, + { + "label": "应县", + "value": "140622" + }, + { + "label": "右玉县", + "value": "140623" + }, + { + "label": "怀仁县", + "value": "140624" + }, + { + "label": "山西朔州经济开发区", + "value": "140671" + } + ], + [{ + "label": "榆次区", + "value": "140702" + }, + { + "label": "榆社县", + "value": "140721" + }, + { + "label": "左权县", + "value": "140722" + }, + { + "label": "和顺县", + "value": "140723" + }, + { + "label": "昔阳县", + "value": "140724" + }, + { + "label": "寿阳县", + "value": "140725" + }, + { + "label": "太谷县", + "value": "140726" + }, + { + "label": "祁县", + "value": "140727" + }, + { + "label": "平遥县", + "value": "140728" + }, + { + "label": "灵石县", + "value": "140729" + }, + { + "label": "介休市", + "value": "140781" + } + ], + [{ + "label": "盐湖区", + "value": "140802" + }, + { + "label": "临猗县", + "value": "140821" + }, + { + "label": "万荣县", + "value": "140822" + }, + { + "label": "闻喜县", + "value": "140823" + }, + { + "label": "稷山县", + "value": "140824" + }, + { + "label": "新绛县", + "value": "140825" + }, + { + "label": "绛县", + "value": "140826" + }, + { + "label": "垣曲县", + "value": "140827" + }, + { + "label": "夏县", + "value": "140828" + }, + { + "label": "平陆县", + "value": "140829" + }, + { + "label": "芮城县", + "value": "140830" + }, + { + "label": "永济市", + "value": "140881" + }, + { + "label": "河津市", + "value": "140882" + } + ], + [{ + "label": "忻府区", + "value": "140902" + }, + { + "label": "定襄县", + "value": "140921" + }, + { + "label": "五台县", + "value": "140922" + }, + { + "label": "代县", + "value": "140923" + }, + { + "label": "繁峙县", + "value": "140924" + }, + { + "label": "宁武县", + "value": "140925" + }, + { + "label": "静乐县", + "value": "140926" + }, + { + "label": "神池县", + "value": "140927" + }, + { + "label": "五寨县", + "value": "140928" + }, + { + "label": "岢岚县", + "value": "140929" + }, + { + "label": "河曲县", + "value": "140930" + }, + { + "label": "保德县", + "value": "140931" + }, + { + "label": "偏关县", + "value": "140932" + }, + { + "label": "五台山风景名胜区", + "value": "140971" + }, + { + "label": "原平市", + "value": "140981" + } + ], + [{ + "label": "尧都区", + "value": "141002" + }, + { + "label": "曲沃县", + "value": "141021" + }, + { + "label": "翼城县", + "value": "141022" + }, + { + "label": "襄汾县", + "value": "141023" + }, + { + "label": "洪洞县", + "value": "141024" + }, + { + "label": "古县", + "value": "141025" + }, + { + "label": "安泽县", + "value": "141026" + }, + { + "label": "浮山县", + "value": "141027" + }, + { + "label": "吉县", + "value": "141028" + }, + { + "label": "乡宁县", + "value": "141029" + }, + { + "label": "大宁县", + "value": "141030" + }, + { + "label": "隰县", + "value": "141031" + }, + { + "label": "永和县", + "value": "141032" + }, + { + "label": "蒲县", + "value": "141033" + }, + { + "label": "汾西县", + "value": "141034" + }, + { + "label": "侯马市", + "value": "141081" + }, + { + "label": "霍州市", + "value": "141082" + } + ], + [{ + "label": "离石区", + "value": "141102" + }, + { + "label": "文水县", + "value": "141121" + }, + { + "label": "交城县", + "value": "141122" + }, + { + "label": "兴县", + "value": "141123" + }, + { + "label": "临县", + "value": "141124" + }, + { + "label": "柳林县", + "value": "141125" + }, + { + "label": "石楼县", + "value": "141126" + }, + { + "label": "岚县", + "value": "141127" + }, + { + "label": "方山县", + "value": "141128" + }, + { + "label": "中阳县", + "value": "141129" + }, + { + "label": "交口县", + "value": "141130" + }, + { + "label": "孝义市", + "value": "141181" + }, + { + "label": "汾阳市", + "value": "141182" + } + ] + ], + [ + [{ + "label": "新城区", + "value": "150102" + }, + { + "label": "回民区", + "value": "150103" + }, + { + "label": "玉泉区", + "value": "150104" + }, + { + "label": "赛罕区", + "value": "150105" + }, + { + "label": "土默特左旗", + "value": "150121" + }, + { + "label": "托克托县", + "value": "150122" + }, + { + "label": "和林格尔县", + "value": "150123" + }, + { + "label": "清水河县", + "value": "150124" + }, + { + "label": "武川县", + "value": "150125" + }, + { + "label": "呼和浩特金海工业园区", + "value": "150171" + }, + { + "label": "呼和浩特经济技术开发区", + "value": "150172" + } + ], + [{ + "label": "东河区", + "value": "150202" + }, + { + "label": "昆都仑区", + "value": "150203" + }, + { + "label": "青山区", + "value": "150204" + }, + { + "label": "石拐区", + "value": "150205" + }, + { + "label": "白云鄂博矿区", + "value": "150206" + }, + { + "label": "九原区", + "value": "150207" + }, + { + "label": "土默特右旗", + "value": "150221" + }, + { + "label": "固阳县", + "value": "150222" + }, + { + "label": "达尔罕茂明安联合旗", + "value": "150223" + }, + { + "label": "包头稀土高新技术产业开发区", + "value": "150271" + } + ], + [{ + "label": "海勃湾区", + "value": "150302" + }, + { + "label": "海南区", + "value": "150303" + }, + { + "label": "乌达区", + "value": "150304" + } + ], + [{ + "label": "红山区", + "value": "150402" + }, + { + "label": "元宝山区", + "value": "150403" + }, + { + "label": "松山区", + "value": "150404" + }, + { + "label": "阿鲁科尔沁旗", + "value": "150421" + }, + { + "label": "巴林左旗", + "value": "150422" + }, + { + "label": "巴林右旗", + "value": "150423" + }, + { + "label": "林西县", + "value": "150424" + }, + { + "label": "克什克腾旗", + "value": "150425" + }, + { + "label": "翁牛特旗", + "value": "150426" + }, + { + "label": "喀喇沁旗", + "value": "150428" + }, + { + "label": "宁城县", + "value": "150429" + }, + { + "label": "敖汉旗", + "value": "150430" + } + ], + [{ + "label": "科尔沁区", + "value": "150502" + }, + { + "label": "科尔沁左翼中旗", + "value": "150521" + }, + { + "label": "科尔沁左翼后旗", + "value": "150522" + }, + { + "label": "开鲁县", + "value": "150523" + }, + { + "label": "库伦旗", + "value": "150524" + }, + { + "label": "奈曼旗", + "value": "150525" + }, + { + "label": "扎鲁特旗", + "value": "150526" + }, + { + "label": "通辽经济技术开发区", + "value": "150571" + }, + { + "label": "霍林郭勒市", + "value": "150581" + } + ], + [{ + "label": "东胜区", + "value": "150602" + }, + { + "label": "康巴什区", + "value": "150603" + }, + { + "label": "达拉特旗", + "value": "150621" + }, + { + "label": "准格尔旗", + "value": "150622" + }, + { + "label": "鄂托克前旗", + "value": "150623" + }, + { + "label": "鄂托克旗", + "value": "150624" + }, + { + "label": "杭锦旗", + "value": "150625" + }, + { + "label": "乌审旗", + "value": "150626" + }, + { + "label": "伊金霍洛旗", + "value": "150627" + } + ], + [{ + "label": "海拉尔区", + "value": "150702" + }, + { + "label": "扎赉诺尔区", + "value": "150703" + }, + { + "label": "阿荣旗", + "value": "150721" + }, + { + "label": "莫力达瓦达斡尔族自治旗", + "value": "150722" + }, + { + "label": "鄂伦春自治旗", + "value": "150723" + }, + { + "label": "鄂温克族自治旗", + "value": "150724" + }, + { + "label": "陈巴尔虎旗", + "value": "150725" + }, + { + "label": "新巴尔虎左旗", + "value": "150726" + }, + { + "label": "新巴尔虎右旗", + "value": "150727" + }, + { + "label": "满洲里市", + "value": "150781" + }, + { + "label": "牙克石市", + "value": "150782" + }, + { + "label": "扎兰屯市", + "value": "150783" + }, + { + "label": "额尔古纳市", + "value": "150784" + }, + { + "label": "根河市", + "value": "150785" + } + ], + [{ + "label": "临河区", + "value": "150802" + }, + { + "label": "五原县", + "value": "150821" + }, + { + "label": "磴口县", + "value": "150822" + }, + { + "label": "乌拉特前旗", + "value": "150823" + }, + { + "label": "乌拉特中旗", + "value": "150824" + }, + { + "label": "乌拉特后旗", + "value": "150825" + }, + { + "label": "杭锦后旗", + "value": "150826" + } + ], + [{ + "label": "集宁区", + "value": "150902" + }, + { + "label": "卓资县", + "value": "150921" + }, + { + "label": "化德县", + "value": "150922" + }, + { + "label": "商都县", + "value": "150923" + }, + { + "label": "兴和县", + "value": "150924" + }, + { + "label": "凉城县", + "value": "150925" + }, + { + "label": "察哈尔右翼前旗", + "value": "150926" + }, + { + "label": "察哈尔右翼中旗", + "value": "150927" + }, + { + "label": "察哈尔右翼后旗", + "value": "150928" + }, + { + "label": "四子王旗", + "value": "150929" + }, + { + "label": "丰镇市", + "value": "150981" + } + ], + [{ + "label": "乌兰浩特市", + "value": "152201" + }, + { + "label": "阿尔山市", + "value": "152202" + }, + { + "label": "科尔沁右翼前旗", + "value": "152221" + }, + { + "label": "科尔沁右翼中旗", + "value": "152222" + }, + { + "label": "扎赉特旗", + "value": "152223" + }, + { + "label": "突泉县", + "value": "152224" + } + ], + [{ + "label": "二连浩特市", + "value": "152501" + }, + { + "label": "锡林浩特市", + "value": "152502" + }, + { + "label": "阿巴嘎旗", + "value": "152522" + }, + { + "label": "苏尼特左旗", + "value": "152523" + }, + { + "label": "苏尼特右旗", + "value": "152524" + }, + { + "label": "东乌珠穆沁旗", + "value": "152525" + }, + { + "label": "西乌珠穆沁旗", + "value": "152526" + }, + { + "label": "太仆寺旗", + "value": "152527" + }, + { + "label": "镶黄旗", + "value": "152528" + }, + { + "label": "正镶白旗", + "value": "152529" + }, + { + "label": "正蓝旗", + "value": "152530" + }, + { + "label": "多伦县", + "value": "152531" + }, + { + "label": "乌拉盖管委会", + "value": "152571" + } + ], + [{ + "label": "阿拉善左旗", + "value": "152921" + }, + { + "label": "阿拉善右旗", + "value": "152922" + }, + { + "label": "额济纳旗", + "value": "152923" + }, + { + "label": "内蒙古阿拉善经济开发区", + "value": "152971" + } + ] + ], + [ + [{ + "label": "和平区", + "value": "210102" + }, + { + "label": "沈河区", + "value": "210103" + }, + { + "label": "大东区", + "value": "210104" + }, + { + "label": "皇姑区", + "value": "210105" + }, + { + "label": "铁西区", + "value": "210106" + }, + { + "label": "苏家屯区", + "value": "210111" + }, + { + "label": "浑南区", + "value": "210112" + }, + { + "label": "沈北新区", + "value": "210113" + }, + { + "label": "于洪区", + "value": "210114" + }, + { + "label": "辽中区", + "value": "210115" + }, + { + "label": "康平县", + "value": "210123" + }, + { + "label": "法库县", + "value": "210124" + }, + { + "label": "新民市", + "value": "210181" + } + ], + [{ + "label": "中山区", + "value": "210202" + }, + { + "label": "西岗区", + "value": "210203" + }, + { + "label": "沙河口区", + "value": "210204" + }, + { + "label": "甘井子区", + "value": "210211" + }, + { + "label": "旅顺口区", + "value": "210212" + }, + { + "label": "金州区", + "value": "210213" + }, + { + "label": "普兰店区", + "value": "210214" + }, + { + "label": "长海县", + "value": "210224" + }, + { + "label": "瓦房店市", + "value": "210281" + }, + { + "label": "庄河市", + "value": "210283" + } + ], + [{ + "label": "铁东区", + "value": "210302" + }, + { + "label": "铁西区", + "value": "210303" + }, + { + "label": "立山区", + "value": "210304" + }, + { + "label": "千山区", + "value": "210311" + }, + { + "label": "台安县", + "value": "210321" + }, + { + "label": "岫岩满族自治县", + "value": "210323" + }, + { + "label": "海城市", + "value": "210381" + } + ], + [{ + "label": "新抚区", + "value": "210402" + }, + { + "label": "东洲区", + "value": "210403" + }, + { + "label": "望花区", + "value": "210404" + }, + { + "label": "顺城区", + "value": "210411" + }, + { + "label": "抚顺县", + "value": "210421" + }, + { + "label": "新宾满族自治县", + "value": "210422" + }, + { + "label": "清原满族自治县", + "value": "210423" + } + ], + [{ + "label": "平山区", + "value": "210502" + }, + { + "label": "溪湖区", + "value": "210503" + }, + { + "label": "明山区", + "value": "210504" + }, + { + "label": "南芬区", + "value": "210505" + }, + { + "label": "本溪满族自治县", + "value": "210521" + }, + { + "label": "桓仁满族自治县", + "value": "210522" + } + ], + [{ + "label": "元宝区", + "value": "210602" + }, + { + "label": "振兴区", + "value": "210603" + }, + { + "label": "振安区", + "value": "210604" + }, + { + "label": "宽甸满族自治县", + "value": "210624" + }, + { + "label": "东港市", + "value": "210681" + }, + { + "label": "凤城市", + "value": "210682" + } + ], + [{ + "label": "古塔区", + "value": "210702" + }, + { + "label": "凌河区", + "value": "210703" + }, + { + "label": "太和区", + "value": "210711" + }, + { + "label": "黑山县", + "value": "210726" + }, + { + "label": "义县", + "value": "210727" + }, + { + "label": "凌海市", + "value": "210781" + }, + { + "label": "北镇市", + "value": "210782" + } + ], + [{ + "label": "站前区", + "value": "210802" + }, + { + "label": "西市区", + "value": "210803" + }, + { + "label": "鲅鱼圈区", + "value": "210804" + }, + { + "label": "老边区", + "value": "210811" + }, + { + "label": "盖州市", + "value": "210881" + }, + { + "label": "大石桥市", + "value": "210882" + } + ], + [{ + "label": "海州区", + "value": "210902" + }, + { + "label": "新邱区", + "value": "210903" + }, + { + "label": "太平区", + "value": "210904" + }, + { + "label": "清河门区", + "value": "210905" + }, + { + "label": "细河区", + "value": "210911" + }, + { + "label": "阜新蒙古族自治县", + "value": "210921" + }, + { + "label": "彰武县", + "value": "210922" + } + ], + [{ + "label": "白塔区", + "value": "211002" + }, + { + "label": "文圣区", + "value": "211003" + }, + { + "label": "宏伟区", + "value": "211004" + }, + { + "label": "弓长岭区", + "value": "211005" + }, + { + "label": "太子河区", + "value": "211011" + }, + { + "label": "辽阳县", + "value": "211021" + }, + { + "label": "灯塔市", + "value": "211081" + } + ], + [{ + "label": "双台子区", + "value": "211102" + }, + { + "label": "兴隆台区", + "value": "211103" + }, + { + "label": "大洼区", + "value": "211104" + }, + { + "label": "盘山县", + "value": "211122" + } + ], + [{ + "label": "银州区", + "value": "211202" + }, + { + "label": "清河区", + "value": "211204" + }, + { + "label": "铁岭县", + "value": "211221" + }, + { + "label": "西丰县", + "value": "211223" + }, + { + "label": "昌图县", + "value": "211224" + }, + { + "label": "调兵山市", + "value": "211281" + }, + { + "label": "开原市", + "value": "211282" + } + ], + [{ + "label": "双塔区", + "value": "211302" + }, + { + "label": "龙城区", + "value": "211303" + }, + { + "label": "朝阳县", + "value": "211321" + }, + { + "label": "建平县", + "value": "211322" + }, + { + "label": "喀喇沁左翼蒙古族自治县", + "value": "211324" + }, + { + "label": "北票市", + "value": "211381" + }, + { + "label": "凌源市", + "value": "211382" + } + ], + [{ + "label": "连山区", + "value": "211402" + }, + { + "label": "龙港区", + "value": "211403" + }, + { + "label": "南票区", + "value": "211404" + }, + { + "label": "绥中县", + "value": "211421" + }, + { + "label": "建昌县", + "value": "211422" + }, + { + "label": "兴城市", + "value": "211481" + } + ] + ], + [ + [{ + "label": "南关区", + "value": "220102" + }, + { + "label": "宽城区", + "value": "220103" + }, + { + "label": "朝阳区", + "value": "220104" + }, + { + "label": "二道区", + "value": "220105" + }, + { + "label": "绿园区", + "value": "220106" + }, + { + "label": "双阳区", + "value": "220112" + }, + { + "label": "九台区", + "value": "220113" + }, + { + "label": "农安县", + "value": "220122" + }, + { + "label": "长春经济技术开发区", + "value": "220171" + }, + { + "label": "长春净月高新技术产业开发区", + "value": "220172" + }, + { + "label": "长春高新技术产业开发区", + "value": "220173" + }, + { + "label": "长春汽车经济技术开发区", + "value": "220174" + }, + { + "label": "榆树市", + "value": "220182" + }, + { + "label": "德惠市", + "value": "220183" + } + ], + [{ + "label": "昌邑区", + "value": "220202" + }, + { + "label": "龙潭区", + "value": "220203" + }, + { + "label": "船营区", + "value": "220204" + }, + { + "label": "丰满区", + "value": "220211" + }, + { + "label": "永吉县", + "value": "220221" + }, + { + "label": "吉林经济开发区", + "value": "220271" + }, + { + "label": "吉林高新技术产业开发区", + "value": "220272" + }, + { + "label": "吉林中国新加坡食品区", + "value": "220273" + }, + { + "label": "蛟河市", + "value": "220281" + }, + { + "label": "桦甸市", + "value": "220282" + }, + { + "label": "舒兰市", + "value": "220283" + }, + { + "label": "磐石市", + "value": "220284" + } + ], + [{ + "label": "铁西区", + "value": "220302" + }, + { + "label": "铁东区", + "value": "220303" + }, + { + "label": "梨树县", + "value": "220322" + }, + { + "label": "伊通满族自治县", + "value": "220323" + }, + { + "label": "公主岭市", + "value": "220381" + }, + { + "label": "双辽市", + "value": "220382" + } + ], + [{ + "label": "龙山区", + "value": "220402" + }, + { + "label": "西安区", + "value": "220403" + }, + { + "label": "东丰县", + "value": "220421" + }, + { + "label": "东辽县", + "value": "220422" + } + ], + [{ + "label": "东昌区", + "value": "220502" + }, + { + "label": "二道江区", + "value": "220503" + }, + { + "label": "通化县", + "value": "220521" + }, + { + "label": "辉南县", + "value": "220523" + }, + { + "label": "柳河县", + "value": "220524" + }, + { + "label": "梅河口市", + "value": "220581" + }, + { + "label": "集安市", + "value": "220582" + } + ], + [{ + "label": "浑江区", + "value": "220602" + }, + { + "label": "江源区", + "value": "220605" + }, + { + "label": "抚松县", + "value": "220621" + }, + { + "label": "靖宇县", + "value": "220622" + }, + { + "label": "长白朝鲜族自治县", + "value": "220623" + }, + { + "label": "临江市", + "value": "220681" + } + ], + [{ + "label": "宁江区", + "value": "220702" + }, + { + "label": "前郭尔罗斯蒙古族自治县", + "value": "220721" + }, + { + "label": "长岭县", + "value": "220722" + }, + { + "label": "乾安县", + "value": "220723" + }, + { + "label": "吉林松原经济开发区", + "value": "220771" + }, + { + "label": "扶余市", + "value": "220781" + } + ], + [{ + "label": "洮北区", + "value": "220802" + }, + { + "label": "镇赉县", + "value": "220821" + }, + { + "label": "通榆县", + "value": "220822" + }, + { + "label": "吉林白城经济开发区", + "value": "220871" + }, + { + "label": "洮南市", + "value": "220881" + }, + { + "label": "大安市", + "value": "220882" + } + ], + [{ + "label": "延吉市", + "value": "222401" + }, + { + "label": "图们市", + "value": "222402" + }, + { + "label": "敦化市", + "value": "222403" + }, + { + "label": "珲春市", + "value": "222404" + }, + { + "label": "龙井市", + "value": "222405" + }, + { + "label": "和龙市", + "value": "222406" + }, + { + "label": "汪清县", + "value": "222424" + }, + { + "label": "安图县", + "value": "222426" + } + ] + ], + [ + [{ + "label": "道里区", + "value": "230102" + }, + { + "label": "南岗区", + "value": "230103" + }, + { + "label": "道外区", + "value": "230104" + }, + { + "label": "平房区", + "value": "230108" + }, + { + "label": "松北区", + "value": "230109" + }, + { + "label": "香坊区", + "value": "230110" + }, + { + "label": "呼兰区", + "value": "230111" + }, + { + "label": "阿城区", + "value": "230112" + }, + { + "label": "双城区", + "value": "230113" + }, + { + "label": "依兰县", + "value": "230123" + }, + { + "label": "方正县", + "value": "230124" + }, + { + "label": "宾县", + "value": "230125" + }, + { + "label": "巴彦县", + "value": "230126" + }, + { + "label": "木兰县", + "value": "230127" + }, + { + "label": "通河县", + "value": "230128" + }, + { + "label": "延寿县", + "value": "230129" + }, + { + "label": "尚志市", + "value": "230183" + }, + { + "label": "五常市", + "value": "230184" + } + ], + [{ + "label": "龙沙区", + "value": "230202" + }, + { + "label": "建华区", + "value": "230203" + }, + { + "label": "铁锋区", + "value": "230204" + }, + { + "label": "昂昂溪区", + "value": "230205" + }, + { + "label": "富拉尔基区", + "value": "230206" + }, + { + "label": "碾子山区", + "value": "230207" + }, + { + "label": "梅里斯达斡尔族区", + "value": "230208" + }, + { + "label": "龙江县", + "value": "230221" + }, + { + "label": "依安县", + "value": "230223" + }, + { + "label": "泰来县", + "value": "230224" + }, + { + "label": "甘南县", + "value": "230225" + }, + { + "label": "富裕县", + "value": "230227" + }, + { + "label": "克山县", + "value": "230229" + }, + { + "label": "克东县", + "value": "230230" + }, + { + "label": "拜泉县", + "value": "230231" + }, + { + "label": "讷河市", + "value": "230281" + } + ], + [{ + "label": "鸡冠区", + "value": "230302" + }, + { + "label": "恒山区", + "value": "230303" + }, + { + "label": "滴道区", + "value": "230304" + }, + { + "label": "梨树区", + "value": "230305" + }, + { + "label": "城子河区", + "value": "230306" + }, + { + "label": "麻山区", + "value": "230307" + }, + { + "label": "鸡东县", + "value": "230321" + }, + { + "label": "虎林市", + "value": "230381" + }, + { + "label": "密山市", + "value": "230382" + } + ], + [{ + "label": "向阳区", + "value": "230402" + }, + { + "label": "工农区", + "value": "230403" + }, + { + "label": "南山区", + "value": "230404" + }, + { + "label": "兴安区", + "value": "230405" + }, + { + "label": "东山区", + "value": "230406" + }, + { + "label": "兴山区", + "value": "230407" + }, + { + "label": "萝北县", + "value": "230421" + }, + { + "label": "绥滨县", + "value": "230422" + } + ], + [{ + "label": "尖山区", + "value": "230502" + }, + { + "label": "岭东区", + "value": "230503" + }, + { + "label": "四方台区", + "value": "230505" + }, + { + "label": "宝山区", + "value": "230506" + }, + { + "label": "集贤县", + "value": "230521" + }, + { + "label": "友谊县", + "value": "230522" + }, + { + "label": "宝清县", + "value": "230523" + }, + { + "label": "饶河县", + "value": "230524" + } + ], + [{ + "label": "萨尔图区", + "value": "230602" + }, + { + "label": "龙凤区", + "value": "230603" + }, + { + "label": "让胡路区", + "value": "230604" + }, + { + "label": "红岗区", + "value": "230605" + }, + { + "label": "大同区", + "value": "230606" + }, + { + "label": "肇州县", + "value": "230621" + }, + { + "label": "肇源县", + "value": "230622" + }, + { + "label": "林甸县", + "value": "230623" + }, + { + "label": "杜尔伯特蒙古族自治县", + "value": "230624" + }, + { + "label": "大庆高新技术产业开发区", + "value": "230671" + } + ], + [{ + "label": "伊春区", + "value": "230702" + }, + { + "label": "南岔区", + "value": "230703" + }, + { + "label": "友好区", + "value": "230704" + }, + { + "label": "西林区", + "value": "230705" + }, + { + "label": "翠峦区", + "value": "230706" + }, + { + "label": "新青区", + "value": "230707" + }, + { + "label": "美溪区", + "value": "230708" + }, + { + "label": "金山屯区", + "value": "230709" + }, + { + "label": "五营区", + "value": "230710" + }, + { + "label": "乌马河区", + "value": "230711" + }, + { + "label": "汤旺河区", + "value": "230712" + }, + { + "label": "带岭区", + "value": "230713" + }, + { + "label": "乌伊岭区", + "value": "230714" + }, + { + "label": "红星区", + "value": "230715" + }, + { + "label": "上甘岭区", + "value": "230716" + }, + { + "label": "嘉荫县", + "value": "230722" + }, + { + "label": "铁力市", + "value": "230781" + } + ], + [{ + "label": "向阳区", + "value": "230803" + }, + { + "label": "前进区", + "value": "230804" + }, + { + "label": "东风区", + "value": "230805" + }, + { + "label": "郊区", + "value": "230811" + }, + { + "label": "桦南县", + "value": "230822" + }, + { + "label": "桦川县", + "value": "230826" + }, + { + "label": "汤原县", + "value": "230828" + }, + { + "label": "同江市", + "value": "230881" + }, + { + "label": "富锦市", + "value": "230882" + }, + { + "label": "抚远市", + "value": "230883" + } + ], + [{ + "label": "新兴区", + "value": "230902" + }, + { + "label": "桃山区", + "value": "230903" + }, + { + "label": "茄子河区", + "value": "230904" + }, + { + "label": "勃利县", + "value": "230921" + } + ], + [{ + "label": "东安区", + "value": "231002" + }, + { + "label": "阳明区", + "value": "231003" + }, + { + "label": "爱民区", + "value": "231004" + }, + { + "label": "西安区", + "value": "231005" + }, + { + "label": "林口县", + "value": "231025" + }, + { + "label": "牡丹江经济技术开发区", + "value": "231071" + }, + { + "label": "绥芬河市", + "value": "231081" + }, + { + "label": "海林市", + "value": "231083" + }, + { + "label": "宁安市", + "value": "231084" + }, + { + "label": "穆棱市", + "value": "231085" + }, + { + "label": "东宁市", + "value": "231086" + } + ], + [{ + "label": "爱辉区", + "value": "231102" + }, + { + "label": "嫩江县", + "value": "231121" + }, + { + "label": "逊克县", + "value": "231123" + }, + { + "label": "孙吴县", + "value": "231124" + }, + { + "label": "北安市", + "value": "231181" + }, + { + "label": "五大连池市", + "value": "231182" + } + ], + [{ + "label": "北林区", + "value": "231202" + }, + { + "label": "望奎县", + "value": "231221" + }, + { + "label": "兰西县", + "value": "231222" + }, + { + "label": "青冈县", + "value": "231223" + }, + { + "label": "庆安县", + "value": "231224" + }, + { + "label": "明水县", + "value": "231225" + }, + { + "label": "绥棱县", + "value": "231226" + }, + { + "label": "安达市", + "value": "231281" + }, + { + "label": "肇东市", + "value": "231282" + }, + { + "label": "海伦市", + "value": "231283" + } + ], + [{ + "label": "加格达奇区", + "value": "232701" + }, + { + "label": "松岭区", + "value": "232702" + }, + { + "label": "新林区", + "value": "232703" + }, + { + "label": "呼中区", + "value": "232704" + }, + { + "label": "呼玛县", + "value": "232721" + }, + { + "label": "塔河县", + "value": "232722" + }, + { + "label": "漠河县", + "value": "232723" + } + ] + ], + [ + [{ + "label": "黄浦区", + "value": "310101" + }, + { + "label": "徐汇区", + "value": "310104" + }, + { + "label": "长宁区", + "value": "310105" + }, + { + "label": "静安区", + "value": "310106" + }, + { + "label": "普陀区", + "value": "310107" + }, + { + "label": "虹口区", + "value": "310109" + }, + { + "label": "杨浦区", + "value": "310110" + }, + { + "label": "闵行区", + "value": "310112" + }, + { + "label": "宝山区", + "value": "310113" + }, + { + "label": "嘉定区", + "value": "310114" + }, + { + "label": "浦东新区", + "value": "310115" + }, + { + "label": "金山区", + "value": "310116" + }, + { + "label": "松江区", + "value": "310117" + }, + { + "label": "青浦区", + "value": "310118" + }, + { + "label": "奉贤区", + "value": "310120" + }, + { + "label": "崇明区", + "value": "310151" + } + ] + ], + [ + [{ + "label": "玄武区", + "value": "320102" + }, + { + "label": "秦淮区", + "value": "320104" + }, + { + "label": "建邺区", + "value": "320105" + }, + { + "label": "鼓楼区", + "value": "320106" + }, + { + "label": "浦口区", + "value": "320111" + }, + { + "label": "栖霞区", + "value": "320113" + }, + { + "label": "雨花台区", + "value": "320114" + }, + { + "label": "江宁区", + "value": "320115" + }, + { + "label": "六合区", + "value": "320116" + }, + { + "label": "溧水区", + "value": "320117" + }, + { + "label": "高淳区", + "value": "320118" + } + ], + [{ + "label": "锡山区", + "value": "320205" + }, + { + "label": "惠山区", + "value": "320206" + }, + { + "label": "滨湖区", + "value": "320211" + }, + { + "label": "梁溪区", + "value": "320213" + }, + { + "label": "新吴区", + "value": "320214" + }, + { + "label": "江阴市", + "value": "320281" + }, + { + "label": "宜兴市", + "value": "320282" + } + ], + [{ + "label": "鼓楼区", + "value": "320302" + }, + { + "label": "云龙区", + "value": "320303" + }, + { + "label": "贾汪区", + "value": "320305" + }, + { + "label": "泉山区", + "value": "320311" + }, + { + "label": "铜山区", + "value": "320312" + }, + { + "label": "丰县", + "value": "320321" + }, + { + "label": "沛县", + "value": "320322" + }, + { + "label": "睢宁县", + "value": "320324" + }, + { + "label": "徐州经济技术开发区", + "value": "320371" + }, + { + "label": "新沂市", + "value": "320381" + }, + { + "label": "邳州市", + "value": "320382" + } + ], + [{ + "label": "天宁区", + "value": "320402" + }, + { + "label": "钟楼区", + "value": "320404" + }, + { + "label": "新北区", + "value": "320411" + }, + { + "label": "武进区", + "value": "320412" + }, + { + "label": "金坛区", + "value": "320413" + }, + { + "label": "溧阳市", + "value": "320481" + } + ], + [{ + "label": "虎丘区", + "value": "320505" + }, + { + "label": "吴中区", + "value": "320506" + }, + { + "label": "相城区", + "value": "320507" + }, + { + "label": "姑苏区", + "value": "320508" + }, + { + "label": "吴江区", + "value": "320509" + }, + { + "label": "苏州工业园区", + "value": "320571" + }, + { + "label": "常熟市", + "value": "320581" + }, + { + "label": "张家港市", + "value": "320582" + }, + { + "label": "昆山市", + "value": "320583" + }, + { + "label": "太仓市", + "value": "320585" + } + ], + [{ + "label": "崇川区", + "value": "320602" + }, + { + "label": "港闸区", + "value": "320611" + }, + { + "label": "通州区", + "value": "320612" + }, + { + "label": "海安县", + "value": "320621" + }, + { + "label": "如东县", + "value": "320623" + }, + { + "label": "南通经济技术开发区", + "value": "320671" + }, + { + "label": "启东市", + "value": "320681" + }, + { + "label": "如皋市", + "value": "320682" + }, + { + "label": "海门市", + "value": "320684" + } + ], + [{ + "label": "连云区", + "value": "320703" + }, + { + "label": "海州区", + "value": "320706" + }, + { + "label": "赣榆区", + "value": "320707" + }, + { + "label": "东海县", + "value": "320722" + }, + { + "label": "灌云县", + "value": "320723" + }, + { + "label": "灌南县", + "value": "320724" + }, + { + "label": "连云港经济技术开发区", + "value": "320771" + }, + { + "label": "连云港高新技术产业开发区", + "value": "320772" + } + ], + [{ + "label": "淮安区", + "value": "320803" + }, + { + "label": "淮阴区", + "value": "320804" + }, + { + "label": "清江浦区", + "value": "320812" + }, + { + "label": "洪泽区", + "value": "320813" + }, + { + "label": "涟水县", + "value": "320826" + }, + { + "label": "盱眙县", + "value": "320830" + }, + { + "label": "金湖县", + "value": "320831" + }, + { + "label": "淮安经济技术开发区", + "value": "320871" + } + ], + [{ + "label": "亭湖区", + "value": "320902" + }, + { + "label": "盐都区", + "value": "320903" + }, + { + "label": "大丰区", + "value": "320904" + }, + { + "label": "响水县", + "value": "320921" + }, + { + "label": "滨海县", + "value": "320922" + }, + { + "label": "阜宁县", + "value": "320923" + }, + { + "label": "射阳县", + "value": "320924" + }, + { + "label": "建湖县", + "value": "320925" + }, + { + "label": "盐城经济技术开发区", + "value": "320971" + }, + { + "label": "东台市", + "value": "320981" + } + ], + [{ + "label": "广陵区", + "value": "321002" + }, + { + "label": "邗江区", + "value": "321003" + }, + { + "label": "江都区", + "value": "321012" + }, + { + "label": "宝应县", + "value": "321023" + }, + { + "label": "扬州经济技术开发区", + "value": "321071" + }, + { + "label": "仪征市", + "value": "321081" + }, + { + "label": "高邮市", + "value": "321084" + } + ], + [{ + "label": "京口区", + "value": "321102" + }, + { + "label": "润州区", + "value": "321111" + }, + { + "label": "丹徒区", + "value": "321112" + }, + { + "label": "镇江新区", + "value": "321171" + }, + { + "label": "丹阳市", + "value": "321181" + }, + { + "label": "扬中市", + "value": "321182" + }, + { + "label": "句容市", + "value": "321183" + } + ], + [{ + "label": "海陵区", + "value": "321202" + }, + { + "label": "高港区", + "value": "321203" + }, + { + "label": "姜堰区", + "value": "321204" + }, + { + "label": "泰州医药高新技术产业开发区", + "value": "321271" + }, + { + "label": "兴化市", + "value": "321281" + }, + { + "label": "靖江市", + "value": "321282" + }, + { + "label": "泰兴市", + "value": "321283" + } + ], + [{ + "label": "宿城区", + "value": "321302" + }, + { + "label": "宿豫区", + "value": "321311" + }, + { + "label": "沭阳县", + "value": "321322" + }, + { + "label": "泗阳县", + "value": "321323" + }, + { + "label": "泗洪县", + "value": "321324" + }, + { + "label": "宿迁经济技术开发区", + "value": "321371" + } + ] + ], + [ + [{ + "label": "上城区", + "value": "330102" + }, + { + "label": "下城区", + "value": "330103" + }, + { + "label": "江干区", + "value": "330104" + }, + { + "label": "拱墅区", + "value": "330105" + }, + { + "label": "西湖区", + "value": "330106" + }, + { + "label": "滨江区", + "value": "330108" + }, + { + "label": "萧山区", + "value": "330109" + }, + { + "label": "余杭区", + "value": "330110" + }, + { + "label": "富阳区", + "value": "330111" + }, + { + "label": "临安区", + "value": "330112" + }, + { + "label": "桐庐县", + "value": "330122" + }, + { + "label": "淳安县", + "value": "330127" + }, + { + "label": "建德市", + "value": "330182" + } + ], + [{ + "label": "海曙区", + "value": "330203" + }, + { + "label": "江北区", + "value": "330205" + }, + { + "label": "北仑区", + "value": "330206" + }, + { + "label": "镇海区", + "value": "330211" + }, + { + "label": "鄞州区", + "value": "330212" + }, + { + "label": "奉化区", + "value": "330213" + }, + { + "label": "象山县", + "value": "330225" + }, + { + "label": "宁海县", + "value": "330226" + }, + { + "label": "余姚市", + "value": "330281" + }, + { + "label": "慈溪市", + "value": "330282" + } + ], + [{ + "label": "鹿城区", + "value": "330302" + }, + { + "label": "龙湾区", + "value": "330303" + }, + { + "label": "瓯海区", + "value": "330304" + }, + { + "label": "洞头区", + "value": "330305" + }, + { + "label": "永嘉县", + "value": "330324" + }, + { + "label": "平阳县", + "value": "330326" + }, + { + "label": "苍南县", + "value": "330327" + }, + { + "label": "文成县", + "value": "330328" + }, + { + "label": "泰顺县", + "value": "330329" + }, + { + "label": "温州经济技术开发区", + "value": "330371" + }, + { + "label": "瑞安市", + "value": "330381" + }, + { + "label": "乐清市", + "value": "330382" + } + ], + [{ + "label": "南湖区", + "value": "330402" + }, + { + "label": "秀洲区", + "value": "330411" + }, + { + "label": "嘉善县", + "value": "330421" + }, + { + "label": "海盐县", + "value": "330424" + }, + { + "label": "海宁市", + "value": "330481" + }, + { + "label": "平湖市", + "value": "330482" + }, + { + "label": "桐乡市", + "value": "330483" + } + ], + [{ + "label": "吴兴区", + "value": "330502" + }, + { + "label": "南浔区", + "value": "330503" + }, + { + "label": "德清县", + "value": "330521" + }, + { + "label": "长兴县", + "value": "330522" + }, + { + "label": "安吉县", + "value": "330523" + } + ], + [{ + "label": "越城区", + "value": "330602" + }, + { + "label": "柯桥区", + "value": "330603" + }, + { + "label": "上虞区", + "value": "330604" + }, + { + "label": "新昌县", + "value": "330624" + }, + { + "label": "诸暨市", + "value": "330681" + }, + { + "label": "嵊州市", + "value": "330683" + } + ], + [{ + "label": "婺城区", + "value": "330702" + }, + { + "label": "金东区", + "value": "330703" + }, + { + "label": "武义县", + "value": "330723" + }, + { + "label": "浦江县", + "value": "330726" + }, + { + "label": "磐安县", + "value": "330727" + }, + { + "label": "兰溪市", + "value": "330781" + }, + { + "label": "义乌市", + "value": "330782" + }, + { + "label": "东阳市", + "value": "330783" + }, + { + "label": "永康市", + "value": "330784" + } + ], + [{ + "label": "柯城区", + "value": "330802" + }, + { + "label": "衢江区", + "value": "330803" + }, + { + "label": "常山县", + "value": "330822" + }, + { + "label": "开化县", + "value": "330824" + }, + { + "label": "龙游县", + "value": "330825" + }, + { + "label": "江山市", + "value": "330881" + } + ], + [{ + "label": "定海区", + "value": "330902" + }, + { + "label": "普陀区", + "value": "330903" + }, + { + "label": "岱山县", + "value": "330921" + }, + { + "label": "嵊泗县", + "value": "330922" + } + ], + [{ + "label": "椒江区", + "value": "331002" + }, + { + "label": "黄岩区", + "value": "331003" + }, + { + "label": "路桥区", + "value": "331004" + }, + { + "label": "三门县", + "value": "331022" + }, + { + "label": "天台县", + "value": "331023" + }, + { + "label": "仙居县", + "value": "331024" + }, + { + "label": "温岭市", + "value": "331081" + }, + { + "label": "临海市", + "value": "331082" + }, + { + "label": "玉环市", + "value": "331083" + } + ], + [{ + "label": "莲都区", + "value": "331102" + }, + { + "label": "青田县", + "value": "331121" + }, + { + "label": "缙云县", + "value": "331122" + }, + { + "label": "遂昌县", + "value": "331123" + }, + { + "label": "松阳县", + "value": "331124" + }, + { + "label": "云和县", + "value": "331125" + }, + { + "label": "庆元县", + "value": "331126" + }, + { + "label": "景宁畲族自治县", + "value": "331127" + }, + { + "label": "龙泉市", + "value": "331181" + } + ] + ], + [ + [{ + "label": "瑶海区", + "value": "340102" + }, + { + "label": "庐阳区", + "value": "340103" + }, + { + "label": "蜀山区", + "value": "340104" + }, + { + "label": "包河区", + "value": "340111" + }, + { + "label": "长丰县", + "value": "340121" + }, + { + "label": "肥东县", + "value": "340122" + }, + { + "label": "肥西县", + "value": "340123" + }, + { + "label": "庐江县", + "value": "340124" + }, + { + "label": "合肥高新技术产业开发区", + "value": "340171" + }, + { + "label": "合肥经济技术开发区", + "value": "340172" + }, + { + "label": "合肥新站高新技术产业开发区", + "value": "340173" + }, + { + "label": "巢湖市", + "value": "340181" + } + ], + [{ + "label": "镜湖区", + "value": "340202" + }, + { + "label": "弋江区", + "value": "340203" + }, + { + "label": "鸠江区", + "value": "340207" + }, + { + "label": "三山区", + "value": "340208" + }, + { + "label": "芜湖县", + "value": "340221" + }, + { + "label": "繁昌县", + "value": "340222" + }, + { + "label": "南陵县", + "value": "340223" + }, + { + "label": "无为县", + "value": "340225" + }, + { + "label": "芜湖经济技术开发区", + "value": "340271" + }, + { + "label": "安徽芜湖长江大桥经济开发区", + "value": "340272" + } + ], + [{ + "label": "龙子湖区", + "value": "340302" + }, + { + "label": "蚌山区", + "value": "340303" + }, + { + "label": "禹会区", + "value": "340304" + }, + { + "label": "淮上区", + "value": "340311" + }, + { + "label": "怀远县", + "value": "340321" + }, + { + "label": "五河县", + "value": "340322" + }, + { + "label": "固镇县", + "value": "340323" + }, + { + "label": "蚌埠市高新技术开发区", + "value": "340371" + }, + { + "label": "蚌埠市经济开发区", + "value": "340372" + } + ], + [{ + "label": "大通区", + "value": "340402" + }, + { + "label": "田家庵区", + "value": "340403" + }, + { + "label": "谢家集区", + "value": "340404" + }, + { + "label": "八公山区", + "value": "340405" + }, + { + "label": "潘集区", + "value": "340406" + }, + { + "label": "凤台县", + "value": "340421" + }, + { + "label": "寿县", + "value": "340422" + } + ], + [{ + "label": "花山区", + "value": "340503" + }, + { + "label": "雨山区", + "value": "340504" + }, + { + "label": "博望区", + "value": "340506" + }, + { + "label": "当涂县", + "value": "340521" + }, + { + "label": "含山县", + "value": "340522" + }, + { + "label": "和县", + "value": "340523" + } + ], + [{ + "label": "杜集区", + "value": "340602" + }, + { + "label": "相山区", + "value": "340603" + }, + { + "label": "烈山区", + "value": "340604" + }, + { + "label": "濉溪县", + "value": "340621" + } + ], + [{ + "label": "铜官区", + "value": "340705" + }, + { + "label": "义安区", + "value": "340706" + }, + { + "label": "郊区", + "value": "340711" + }, + { + "label": "枞阳县", + "value": "340722" + } + ], + [{ + "label": "迎江区", + "value": "340802" + }, + { + "label": "大观区", + "value": "340803" + }, + { + "label": "宜秀区", + "value": "340811" + }, + { + "label": "怀宁县", + "value": "340822" + }, + { + "label": "潜山县", + "value": "340824" + }, + { + "label": "太湖县", + "value": "340825" + }, + { + "label": "宿松县", + "value": "340826" + }, + { + "label": "望江县", + "value": "340827" + }, + { + "label": "岳西县", + "value": "340828" + }, + { + "label": "安徽安庆经济开发区", + "value": "340871" + }, + { + "label": "桐城市", + "value": "340881" + } + ], + [{ + "label": "屯溪区", + "value": "341002" + }, + { + "label": "黄山区", + "value": "341003" + }, + { + "label": "徽州区", + "value": "341004" + }, + { + "label": "歙县", + "value": "341021" + }, + { + "label": "休宁县", + "value": "341022" + }, + { + "label": "黟县", + "value": "341023" + }, + { + "label": "祁门县", + "value": "341024" + } + ], + [{ + "label": "琅琊区", + "value": "341102" + }, + { + "label": "南谯区", + "value": "341103" + }, + { + "label": "来安县", + "value": "341122" + }, + { + "label": "全椒县", + "value": "341124" + }, + { + "label": "定远县", + "value": "341125" + }, + { + "label": "凤阳县", + "value": "341126" + }, + { + "label": "苏滁现代产业园", + "value": "341171" + }, + { + "label": "滁州经济技术开发区", + "value": "341172" + }, + { + "label": "天长市", + "value": "341181" + }, + { + "label": "明光市", + "value": "341182" + } + ], + [{ + "label": "颍州区", + "value": "341202" + }, + { + "label": "颍东区", + "value": "341203" + }, + { + "label": "颍泉区", + "value": "341204" + }, + { + "label": "临泉县", + "value": "341221" + }, + { + "label": "太和县", + "value": "341222" + }, + { + "label": "阜南县", + "value": "341225" + }, + { + "label": "颍上县", + "value": "341226" + }, + { + "label": "阜阳合肥现代产业园区", + "value": "341271" + }, + { + "label": "阜阳经济技术开发区", + "value": "341272" + }, + { + "label": "界首市", + "value": "341282" + } + ], + [{ + "label": "埇桥区", + "value": "341302" + }, + { + "label": "砀山县", + "value": "341321" + }, + { + "label": "萧县", + "value": "341322" + }, + { + "label": "灵璧县", + "value": "341323" + }, + { + "label": "泗县", + "value": "341324" + }, + { + "label": "宿州马鞍山现代产业园区", + "value": "341371" + }, + { + "label": "宿州经济技术开发区", + "value": "341372" + } + ], + [{ + "label": "金安区", + "value": "341502" + }, + { + "label": "裕安区", + "value": "341503" + }, + { + "label": "叶集区", + "value": "341504" + }, + { + "label": "霍邱县", + "value": "341522" + }, + { + "label": "舒城县", + "value": "341523" + }, + { + "label": "金寨县", + "value": "341524" + }, + { + "label": "霍山县", + "value": "341525" + } + ], + [{ + "label": "谯城区", + "value": "341602" + }, + { + "label": "涡阳县", + "value": "341621" + }, + { + "label": "蒙城县", + "value": "341622" + }, + { + "label": "利辛县", + "value": "341623" + } + ], + [{ + "label": "贵池区", + "value": "341702" + }, + { + "label": "东至县", + "value": "341721" + }, + { + "label": "石台县", + "value": "341722" + }, + { + "label": "青阳县", + "value": "341723" + } + ], + [{ + "label": "宣州区", + "value": "341802" + }, + { + "label": "郎溪县", + "value": "341821" + }, + { + "label": "广德县", + "value": "341822" + }, + { + "label": "泾县", + "value": "341823" + }, + { + "label": "绩溪县", + "value": "341824" + }, + { + "label": "旌德县", + "value": "341825" + }, + { + "label": "宣城市经济开发区", + "value": "341871" + }, + { + "label": "宁国市", + "value": "341881" + } + ] + ], + [ + [{ + "label": "鼓楼区", + "value": "350102" + }, + { + "label": "台江区", + "value": "350103" + }, + { + "label": "仓山区", + "value": "350104" + }, + { + "label": "马尾区", + "value": "350105" + }, + { + "label": "晋安区", + "value": "350111" + }, + { + "label": "闽侯县", + "value": "350121" + }, + { + "label": "连江县", + "value": "350122" + }, + { + "label": "罗源县", + "value": "350123" + }, + { + "label": "闽清县", + "value": "350124" + }, + { + "label": "永泰县", + "value": "350125" + }, + { + "label": "平潭县", + "value": "350128" + }, + { + "label": "福清市", + "value": "350181" + }, + { + "label": "长乐市", + "value": "350182" + } + ], + [{ + "label": "思明区", + "value": "350203" + }, + { + "label": "海沧区", + "value": "350205" + }, + { + "label": "湖里区", + "value": "350206" + }, + { + "label": "集美区", + "value": "350211" + }, + { + "label": "同安区", + "value": "350212" + }, + { + "label": "翔安区", + "value": "350213" + } + ], + [{ + "label": "城厢区", + "value": "350302" + }, + { + "label": "涵江区", + "value": "350303" + }, + { + "label": "荔城区", + "value": "350304" + }, + { + "label": "秀屿区", + "value": "350305" + }, + { + "label": "仙游县", + "value": "350322" + } + ], + [{ + "label": "梅列区", + "value": "350402" + }, + { + "label": "三元区", + "value": "350403" + }, + { + "label": "明溪县", + "value": "350421" + }, + { + "label": "清流县", + "value": "350423" + }, + { + "label": "宁化县", + "value": "350424" + }, + { + "label": "大田县", + "value": "350425" + }, + { + "label": "尤溪县", + "value": "350426" + }, + { + "label": "沙县", + "value": "350427" + }, + { + "label": "将乐县", + "value": "350428" + }, + { + "label": "泰宁县", + "value": "350429" + }, + { + "label": "建宁县", + "value": "350430" + }, + { + "label": "永安市", + "value": "350481" + } + ], + [{ + "label": "鲤城区", + "value": "350502" + }, + { + "label": "丰泽区", + "value": "350503" + }, + { + "label": "洛江区", + "value": "350504" + }, + { + "label": "泉港区", + "value": "350505" + }, + { + "label": "惠安县", + "value": "350521" + }, + { + "label": "安溪县", + "value": "350524" + }, + { + "label": "永春县", + "value": "350525" + }, + { + "label": "德化县", + "value": "350526" + }, + { + "label": "金门县", + "value": "350527" + }, + { + "label": "石狮市", + "value": "350581" + }, + { + "label": "晋江市", + "value": "350582" + }, + { + "label": "南安市", + "value": "350583" + } + ], + [{ + "label": "芗城区", + "value": "350602" + }, + { + "label": "龙文区", + "value": "350603" + }, + { + "label": "云霄县", + "value": "350622" + }, + { + "label": "漳浦县", + "value": "350623" + }, + { + "label": "诏安县", + "value": "350624" + }, + { + "label": "长泰县", + "value": "350625" + }, + { + "label": "东山县", + "value": "350626" + }, + { + "label": "南靖县", + "value": "350627" + }, + { + "label": "平和县", + "value": "350628" + }, + { + "label": "华安县", + "value": "350629" + }, + { + "label": "龙海市", + "value": "350681" + } + ], + [{ + "label": "延平区", + "value": "350702" + }, + { + "label": "建阳区", + "value": "350703" + }, + { + "label": "顺昌县", + "value": "350721" + }, + { + "label": "浦城县", + "value": "350722" + }, + { + "label": "光泽县", + "value": "350723" + }, + { + "label": "松溪县", + "value": "350724" + }, + { + "label": "政和县", + "value": "350725" + }, + { + "label": "邵武市", + "value": "350781" + }, + { + "label": "武夷山市", + "value": "350782" + }, + { + "label": "建瓯市", + "value": "350783" + } + ], + [{ + "label": "新罗区", + "value": "350802" + }, + { + "label": "永定区", + "value": "350803" + }, + { + "label": "长汀县", + "value": "350821" + }, + { + "label": "上杭县", + "value": "350823" + }, + { + "label": "武平县", + "value": "350824" + }, + { + "label": "连城县", + "value": "350825" + }, + { + "label": "漳平市", + "value": "350881" + } + ], + [{ + "label": "蕉城区", + "value": "350902" + }, + { + "label": "霞浦县", + "value": "350921" + }, + { + "label": "古田县", + "value": "350922" + }, + { + "label": "屏南县", + "value": "350923" + }, + { + "label": "寿宁县", + "value": "350924" + }, + { + "label": "周宁县", + "value": "350925" + }, + { + "label": "柘荣县", + "value": "350926" + }, + { + "label": "福安市", + "value": "350981" + }, + { + "label": "福鼎市", + "value": "350982" + } + ] + ], + [ + [{ + "label": "东湖区", + "value": "360102" + }, + { + "label": "西湖区", + "value": "360103" + }, + { + "label": "青云谱区", + "value": "360104" + }, + { + "label": "湾里区", + "value": "360105" + }, + { + "label": "青山湖区", + "value": "360111" + }, + { + "label": "新建区", + "value": "360112" + }, + { + "label": "南昌县", + "value": "360121" + }, + { + "label": "安义县", + "value": "360123" + }, + { + "label": "进贤县", + "value": "360124" + } + ], + [{ + "label": "昌江区", + "value": "360202" + }, + { + "label": "珠山区", + "value": "360203" + }, + { + "label": "浮梁县", + "value": "360222" + }, + { + "label": "乐平市", + "value": "360281" + } + ], + [{ + "label": "安源区", + "value": "360302" + }, + { + "label": "湘东区", + "value": "360313" + }, + { + "label": "莲花县", + "value": "360321" + }, + { + "label": "上栗县", + "value": "360322" + }, + { + "label": "芦溪县", + "value": "360323" + } + ], + [{ + "label": "濂溪区", + "value": "360402" + }, + { + "label": "浔阳区", + "value": "360403" + }, + { + "label": "柴桑区", + "value": "360404" + }, + { + "label": "武宁县", + "value": "360423" + }, + { + "label": "修水县", + "value": "360424" + }, + { + "label": "永修县", + "value": "360425" + }, + { + "label": "德安县", + "value": "360426" + }, + { + "label": "都昌县", + "value": "360428" + }, + { + "label": "湖口县", + "value": "360429" + }, + { + "label": "彭泽县", + "value": "360430" + }, + { + "label": "瑞昌市", + "value": "360481" + }, + { + "label": "共青城市", + "value": "360482" + }, + { + "label": "庐山市", + "value": "360483" + } + ], + [{ + "label": "渝水区", + "value": "360502" + }, + { + "label": "分宜县", + "value": "360521" + } + ], + [{ + "label": "月湖区", + "value": "360602" + }, + { + "label": "余江县", + "value": "360622" + }, + { + "label": "贵溪市", + "value": "360681" + } + ], + [{ + "label": "章贡区", + "value": "360702" + }, + { + "label": "南康区", + "value": "360703" + }, + { + "label": "赣县区", + "value": "360704" + }, + { + "label": "信丰县", + "value": "360722" + }, + { + "label": "大余县", + "value": "360723" + }, + { + "label": "上犹县", + "value": "360724" + }, + { + "label": "崇义县", + "value": "360725" + }, + { + "label": "安远县", + "value": "360726" + }, + { + "label": "龙南县", + "value": "360727" + }, + { + "label": "定南县", + "value": "360728" + }, + { + "label": "全南县", + "value": "360729" + }, + { + "label": "宁都县", + "value": "360730" + }, + { + "label": "于都县", + "value": "360731" + }, + { + "label": "兴国县", + "value": "360732" + }, + { + "label": "会昌县", + "value": "360733" + }, + { + "label": "寻乌县", + "value": "360734" + }, + { + "label": "石城县", + "value": "360735" + }, + { + "label": "瑞金市", + "value": "360781" + } + ], + [{ + "label": "吉州区", + "value": "360802" + }, + { + "label": "青原区", + "value": "360803" + }, + { + "label": "吉安县", + "value": "360821" + }, + { + "label": "吉水县", + "value": "360822" + }, + { + "label": "峡江县", + "value": "360823" + }, + { + "label": "新干县", + "value": "360824" + }, + { + "label": "永丰县", + "value": "360825" + }, + { + "label": "泰和县", + "value": "360826" + }, + { + "label": "遂川县", + "value": "360827" + }, + { + "label": "万安县", + "value": "360828" + }, + { + "label": "安福县", + "value": "360829" + }, + { + "label": "永新县", + "value": "360830" + }, + { + "label": "井冈山市", + "value": "360881" + } + ], + [{ + "label": "袁州区", + "value": "360902" + }, + { + "label": "奉新县", + "value": "360921" + }, + { + "label": "万载县", + "value": "360922" + }, + { + "label": "上高县", + "value": "360923" + }, + { + "label": "宜丰县", + "value": "360924" + }, + { + "label": "靖安县", + "value": "360925" + }, + { + "label": "铜鼓县", + "value": "360926" + }, + { + "label": "丰城市", + "value": "360981" + }, + { + "label": "樟树市", + "value": "360982" + }, + { + "label": "高安市", + "value": "360983" + } + ], + [{ + "label": "临川区", + "value": "361002" + }, + { + "label": "东乡区", + "value": "361003" + }, + { + "label": "南城县", + "value": "361021" + }, + { + "label": "黎川县", + "value": "361022" + }, + { + "label": "南丰县", + "value": "361023" + }, + { + "label": "崇仁县", + "value": "361024" + }, + { + "label": "乐安县", + "value": "361025" + }, + { + "label": "宜黄县", + "value": "361026" + }, + { + "label": "金溪县", + "value": "361027" + }, + { + "label": "资溪县", + "value": "361028" + }, + { + "label": "广昌县", + "value": "361030" + } + ], + [{ + "label": "信州区", + "value": "361102" + }, + { + "label": "广丰区", + "value": "361103" + }, + { + "label": "上饶县", + "value": "361121" + }, + { + "label": "玉山县", + "value": "361123" + }, + { + "label": "铅山县", + "value": "361124" + }, + { + "label": "横峰县", + "value": "361125" + }, + { + "label": "弋阳县", + "value": "361126" + }, + { + "label": "余干县", + "value": "361127" + }, + { + "label": "鄱阳县", + "value": "361128" + }, + { + "label": "万年县", + "value": "361129" + }, + { + "label": "婺源县", + "value": "361130" + }, + { + "label": "德兴市", + "value": "361181" + } + ] + ], + [ + [{ + "label": "历下区", + "value": "370102" + }, + { + "label": "市中区", + "value": "370103" + }, + { + "label": "槐荫区", + "value": "370104" + }, + { + "label": "天桥区", + "value": "370105" + }, + { + "label": "历城区", + "value": "370112" + }, + { + "label": "长清区", + "value": "370113" + }, + { + "label": "章丘区", + "value": "370114" + }, + { + "label": "平阴县", + "value": "370124" + }, + { + "label": "济阳县", + "value": "370125" + }, + { + "label": "商河县", + "value": "370126" + }, + { + "label": "济南高新技术产业开发区", + "value": "370171" + } + ], + [{ + "label": "市南区", + "value": "370202" + }, + { + "label": "市北区", + "value": "370203" + }, + { + "label": "黄岛区", + "value": "370211" + }, + { + "label": "崂山区", + "value": "370212" + }, + { + "label": "李沧区", + "value": "370213" + }, + { + "label": "城阳区", + "value": "370214" + }, + { + "label": "即墨区", + "value": "370215" + }, + { + "label": "青岛高新技术产业开发区", + "value": "370271" + }, + { + "label": "胶州市", + "value": "370281" + }, + { + "label": "平度市", + "value": "370283" + }, + { + "label": "莱西市", + "value": "370285" + } + ], + [{ + "label": "淄川区", + "value": "370302" + }, + { + "label": "张店区", + "value": "370303" + }, + { + "label": "博山区", + "value": "370304" + }, + { + "label": "临淄区", + "value": "370305" + }, + { + "label": "周村区", + "value": "370306" + }, + { + "label": "桓台县", + "value": "370321" + }, + { + "label": "高青县", + "value": "370322" + }, + { + "label": "沂源县", + "value": "370323" + } + ], + [{ + "label": "市中区", + "value": "370402" + }, + { + "label": "薛城区", + "value": "370403" + }, + { + "label": "峄城区", + "value": "370404" + }, + { + "label": "台儿庄区", + "value": "370405" + }, + { + "label": "山亭区", + "value": "370406" + }, + { + "label": "滕州市", + "value": "370481" + } + ], + [{ + "label": "东营区", + "value": "370502" + }, + { + "label": "河口区", + "value": "370503" + }, + { + "label": "垦利区", + "value": "370505" + }, + { + "label": "利津县", + "value": "370522" + }, + { + "label": "广饶县", + "value": "370523" + }, + { + "label": "东营经济技术开发区", + "value": "370571" + }, + { + "label": "东营港经济开发区", + "value": "370572" + } + ], + [{ + "label": "芝罘区", + "value": "370602" + }, + { + "label": "福山区", + "value": "370611" + }, + { + "label": "牟平区", + "value": "370612" + }, + { + "label": "莱山区", + "value": "370613" + }, + { + "label": "长岛县", + "value": "370634" + }, + { + "label": "烟台高新技术产业开发区", + "value": "370671" + }, + { + "label": "烟台经济技术开发区", + "value": "370672" + }, + { + "label": "龙口市", + "value": "370681" + }, + { + "label": "莱阳市", + "value": "370682" + }, + { + "label": "莱州市", + "value": "370683" + }, + { + "label": "蓬莱市", + "value": "370684" + }, + { + "label": "招远市", + "value": "370685" + }, + { + "label": "栖霞市", + "value": "370686" + }, + { + "label": "海阳市", + "value": "370687" + } + ], + [{ + "label": "潍城区", + "value": "370702" + }, + { + "label": "寒亭区", + "value": "370703" + }, + { + "label": "坊子区", + "value": "370704" + }, + { + "label": "奎文区", + "value": "370705" + }, + { + "label": "临朐县", + "value": "370724" + }, + { + "label": "昌乐县", + "value": "370725" + }, + { + "label": "潍坊滨海经济技术开发区", + "value": "370772" + }, + { + "label": "青州市", + "value": "370781" + }, + { + "label": "诸城市", + "value": "370782" + }, + { + "label": "寿光市", + "value": "370783" + }, + { + "label": "安丘市", + "value": "370784" + }, + { + "label": "高密市", + "value": "370785" + }, + { + "label": "昌邑市", + "value": "370786" + } + ], + [{ + "label": "任城区", + "value": "370811" + }, + { + "label": "兖州区", + "value": "370812" + }, + { + "label": "微山县", + "value": "370826" + }, + { + "label": "鱼台县", + "value": "370827" + }, + { + "label": "金乡县", + "value": "370828" + }, + { + "label": "嘉祥县", + "value": "370829" + }, + { + "label": "汶上县", + "value": "370830" + }, + { + "label": "泗水县", + "value": "370831" + }, + { + "label": "梁山县", + "value": "370832" + }, + { + "label": "济宁高新技术产业开发区", + "value": "370871" + }, + { + "label": "曲阜市", + "value": "370881" + }, + { + "label": "邹城市", + "value": "370883" + } + ], + [{ + "label": "泰山区", + "value": "370902" + }, + { + "label": "岱岳区", + "value": "370911" + }, + { + "label": "宁阳县", + "value": "370921" + }, + { + "label": "东平县", + "value": "370923" + }, + { + "label": "新泰市", + "value": "370982" + }, + { + "label": "肥城市", + "value": "370983" + } + ], + [{ + "label": "环翠区", + "value": "371002" + }, + { + "label": "文登区", + "value": "371003" + }, + { + "label": "威海火炬高技术产业开发区", + "value": "371071" + }, + { + "label": "威海经济技术开发区", + "value": "371072" + }, + { + "label": "威海临港经济技术开发区", + "value": "371073" + }, + { + "label": "荣成市", + "value": "371082" + }, + { + "label": "乳山市", + "value": "371083" + } + ], + [{ + "label": "东港区", + "value": "371102" + }, + { + "label": "岚山区", + "value": "371103" + }, + { + "label": "五莲县", + "value": "371121" + }, + { + "label": "莒县", + "value": "371122" + }, + { + "label": "日照经济技术开发区", + "value": "371171" + }, + { + "label": "日照国际海洋城", + "value": "371172" + } + ], + [{ + "label": "莱城区", + "value": "371202" + }, + { + "label": "钢城区", + "value": "371203" + } + ], + [{ + "label": "兰山区", + "value": "371302" + }, + { + "label": "罗庄区", + "value": "371311" + }, + { + "label": "河东区", + "value": "371312" + }, + { + "label": "沂南县", + "value": "371321" + }, + { + "label": "郯城县", + "value": "371322" + }, + { + "label": "沂水县", + "value": "371323" + }, + { + "label": "兰陵县", + "value": "371324" + }, + { + "label": "费县", + "value": "371325" + }, + { + "label": "平邑县", + "value": "371326" + }, + { + "label": "莒南县", + "value": "371327" + }, + { + "label": "蒙阴县", + "value": "371328" + }, + { + "label": "临沭县", + "value": "371329" + }, + { + "label": "临沂高新技术产业开发区", + "value": "371371" + }, + { + "label": "临沂经济技术开发区", + "value": "371372" + }, + { + "label": "临沂临港经济开发区", + "value": "371373" + } + ], + [{ + "label": "德城区", + "value": "371402" + }, + { + "label": "陵城区", + "value": "371403" + }, + { + "label": "宁津县", + "value": "371422" + }, + { + "label": "庆云县", + "value": "371423" + }, + { + "label": "临邑县", + "value": "371424" + }, + { + "label": "齐河县", + "value": "371425" + }, + { + "label": "平原县", + "value": "371426" + }, + { + "label": "夏津县", + "value": "371427" + }, + { + "label": "武城县", + "value": "371428" + }, + { + "label": "德州经济技术开发区", + "value": "371471" + }, + { + "label": "德州运河经济开发区", + "value": "371472" + }, + { + "label": "乐陵市", + "value": "371481" + }, + { + "label": "禹城市", + "value": "371482" + } + ], + [{ + "label": "东昌府区", + "value": "371502" + }, + { + "label": "阳谷县", + "value": "371521" + }, + { + "label": "莘县", + "value": "371522" + }, + { + "label": "茌平县", + "value": "371523" + }, + { + "label": "东阿县", + "value": "371524" + }, + { + "label": "冠县", + "value": "371525" + }, + { + "label": "高唐县", + "value": "371526" + }, + { + "label": "临清市", + "value": "371581" + } + ], + [{ + "label": "滨城区", + "value": "371602" + }, + { + "label": "沾化区", + "value": "371603" + }, + { + "label": "惠民县", + "value": "371621" + }, + { + "label": "阳信县", + "value": "371622" + }, + { + "label": "无棣县", + "value": "371623" + }, + { + "label": "博兴县", + "value": "371625" + }, + { + "label": "邹平县", + "value": "371626" + } + ], + [{ + "label": "牡丹区", + "value": "371702" + }, + { + "label": "定陶区", + "value": "371703" + }, + { + "label": "曹县", + "value": "371721" + }, + { + "label": "单县", + "value": "371722" + }, + { + "label": "成武县", + "value": "371723" + }, + { + "label": "巨野县", + "value": "371724" + }, + { + "label": "郓城县", + "value": "371725" + }, + { + "label": "鄄城县", + "value": "371726" + }, + { + "label": "东明县", + "value": "371728" + }, + { + "label": "菏泽经济技术开发区", + "value": "371771" + }, + { + "label": "菏泽高新技术开发区", + "value": "371772" + } + ] + ], + [ + [{ + "label": "中原区", + "value": "410102" + }, + { + "label": "二七区", + "value": "410103" + }, + { + "label": "管城回族区", + "value": "410104" + }, + { + "label": "金水区", + "value": "410105" + }, + { + "label": "上街区", + "value": "410106" + }, + { + "label": "惠济区", + "value": "410108" + }, + { + "label": "中牟县", + "value": "410122" + }, + { + "label": "郑州经济技术开发区", + "value": "410171" + }, + { + "label": "郑州高新技术产业开发区", + "value": "410172" + }, + { + "label": "郑州航空港经济综合实验区", + "value": "410173" + }, + { + "label": "巩义市", + "value": "410181" + }, + { + "label": "荥阳市", + "value": "410182" + }, + { + "label": "新密市", + "value": "410183" + }, + { + "label": "新郑市", + "value": "410184" + }, + { + "label": "登封市", + "value": "410185" + } + ], + [{ + "label": "龙亭区", + "value": "410202" + }, + { + "label": "顺河回族区", + "value": "410203" + }, + { + "label": "鼓楼区", + "value": "410204" + }, + { + "label": "禹王台区", + "value": "410205" + }, + { + "label": "祥符区", + "value": "410212" + }, + { + "label": "杞县", + "value": "410221" + }, + { + "label": "通许县", + "value": "410222" + }, + { + "label": "尉氏县", + "value": "410223" + }, + { + "label": "兰考县", + "value": "410225" + } + ], + [{ + "label": "老城区", + "value": "410302" + }, + { + "label": "西工区", + "value": "410303" + }, + { + "label": "瀍河回族区", + "value": "410304" + }, + { + "label": "涧西区", + "value": "410305" + }, + { + "label": "吉利区", + "value": "410306" + }, + { + "label": "洛龙区", + "value": "410311" + }, + { + "label": "孟津县", + "value": "410322" + }, + { + "label": "新安县", + "value": "410323" + }, + { + "label": "栾川县", + "value": "410324" + }, + { + "label": "嵩县", + "value": "410325" + }, + { + "label": "汝阳县", + "value": "410326" + }, + { + "label": "宜阳县", + "value": "410327" + }, + { + "label": "洛宁县", + "value": "410328" + }, + { + "label": "伊川县", + "value": "410329" + }, + { + "label": "洛阳高新技术产业开发区", + "value": "410371" + }, + { + "label": "偃师市", + "value": "410381" + } + ], + [{ + "label": "新华区", + "value": "410402" + }, + { + "label": "卫东区", + "value": "410403" + }, + { + "label": "石龙区", + "value": "410404" + }, + { + "label": "湛河区", + "value": "410411" + }, + { + "label": "宝丰县", + "value": "410421" + }, + { + "label": "叶县", + "value": "410422" + }, + { + "label": "鲁山县", + "value": "410423" + }, + { + "label": "郏县", + "value": "410425" + }, + { + "label": "平顶山高新技术产业开发区", + "value": "410471" + }, + { + "label": "平顶山市新城区", + "value": "410472" + }, + { + "label": "舞钢市", + "value": "410481" + }, + { + "label": "汝州市", + "value": "410482" + } + ], + [{ + "label": "文峰区", + "value": "410502" + }, + { + "label": "北关区", + "value": "410503" + }, + { + "label": "殷都区", + "value": "410505" + }, + { + "label": "龙安区", + "value": "410506" + }, + { + "label": "安阳县", + "value": "410522" + }, + { + "label": "汤阴县", + "value": "410523" + }, + { + "label": "滑县", + "value": "410526" + }, + { + "label": "内黄县", + "value": "410527" + }, + { + "label": "安阳高新技术产业开发区", + "value": "410571" + }, + { + "label": "林州市", + "value": "410581" + } + ], + [{ + "label": "鹤山区", + "value": "410602" + }, + { + "label": "山城区", + "value": "410603" + }, + { + "label": "淇滨区", + "value": "410611" + }, + { + "label": "浚县", + "value": "410621" + }, + { + "label": "淇县", + "value": "410622" + }, + { + "label": "鹤壁经济技术开发区", + "value": "410671" + } + ], + [{ + "label": "红旗区", + "value": "410702" + }, + { + "label": "卫滨区", + "value": "410703" + }, + { + "label": "凤泉区", + "value": "410704" + }, + { + "label": "牧野区", + "value": "410711" + }, + { + "label": "新乡县", + "value": "410721" + }, + { + "label": "获嘉县", + "value": "410724" + }, + { + "label": "原阳县", + "value": "410725" + }, + { + "label": "延津县", + "value": "410726" + }, + { + "label": "封丘县", + "value": "410727" + }, + { + "label": "长垣县", + "value": "410728" + }, + { + "label": "新乡高新技术产业开发区", + "value": "410771" + }, + { + "label": "新乡经济技术开发区", + "value": "410772" + }, + { + "label": "新乡市平原城乡一体化示范区", + "value": "410773" + }, + { + "label": "卫辉市", + "value": "410781" + }, + { + "label": "辉县市", + "value": "410782" + } + ], + [{ + "label": "解放区", + "value": "410802" + }, + { + "label": "中站区", + "value": "410803" + }, + { + "label": "马村区", + "value": "410804" + }, + { + "label": "山阳区", + "value": "410811" + }, + { + "label": "修武县", + "value": "410821" + }, + { + "label": "博爱县", + "value": "410822" + }, + { + "label": "武陟县", + "value": "410823" + }, + { + "label": "温县", + "value": "410825" + }, + { + "label": "焦作城乡一体化示范区", + "value": "410871" + }, + { + "label": "沁阳市", + "value": "410882" + }, + { + "label": "孟州市", + "value": "410883" + } + ], + [{ + "label": "华龙区", + "value": "410902" + }, + { + "label": "清丰县", + "value": "410922" + }, + { + "label": "南乐县", + "value": "410923" + }, + { + "label": "范县", + "value": "410926" + }, + { + "label": "台前县", + "value": "410927" + }, + { + "label": "濮阳县", + "value": "410928" + }, + { + "label": "河南濮阳工业园区", + "value": "410971" + }, + { + "label": "濮阳经济技术开发区", + "value": "410972" + } + ], + [{ + "label": "魏都区", + "value": "411002" + }, + { + "label": "建安区", + "value": "411003" + }, + { + "label": "鄢陵县", + "value": "411024" + }, + { + "label": "襄城县", + "value": "411025" + }, + { + "label": "许昌经济技术开发区", + "value": "411071" + }, + { + "label": "禹州市", + "value": "411081" + }, + { + "label": "长葛市", + "value": "411082" + } + ], + [{ + "label": "源汇区", + "value": "411102" + }, + { + "label": "郾城区", + "value": "411103" + }, + { + "label": "召陵区", + "value": "411104" + }, + { + "label": "舞阳县", + "value": "411121" + }, + { + "label": "临颍县", + "value": "411122" + }, + { + "label": "漯河经济技术开发区", + "value": "411171" + } + ], + [{ + "label": "湖滨区", + "value": "411202" + }, + { + "label": "陕州区", + "value": "411203" + }, + { + "label": "渑池县", + "value": "411221" + }, + { + "label": "卢氏县", + "value": "411224" + }, + { + "label": "河南三门峡经济开发区", + "value": "411271" + }, + { + "label": "义马市", + "value": "411281" + }, + { + "label": "灵宝市", + "value": "411282" + } + ], + [{ + "label": "宛城区", + "value": "411302" + }, + { + "label": "卧龙区", + "value": "411303" + }, + { + "label": "南召县", + "value": "411321" + }, + { + "label": "方城县", + "value": "411322" + }, + { + "label": "西峡县", + "value": "411323" + }, + { + "label": "镇平县", + "value": "411324" + }, + { + "label": "内乡县", + "value": "411325" + }, + { + "label": "淅川县", + "value": "411326" + }, + { + "label": "社旗县", + "value": "411327" + }, + { + "label": "唐河县", + "value": "411328" + }, + { + "label": "新野县", + "value": "411329" + }, + { + "label": "桐柏县", + "value": "411330" + }, + { + "label": "南阳高新技术产业开发区", + "value": "411371" + }, + { + "label": "南阳市城乡一体化示范区", + "value": "411372" + }, + { + "label": "邓州市", + "value": "411381" + } + ], + [{ + "label": "梁园区", + "value": "411402" + }, + { + "label": "睢阳区", + "value": "411403" + }, + { + "label": "民权县", + "value": "411421" + }, + { + "label": "睢县", + "value": "411422" + }, + { + "label": "宁陵县", + "value": "411423" + }, + { + "label": "柘城县", + "value": "411424" + }, + { + "label": "虞城县", + "value": "411425" + }, + { + "label": "夏邑县", + "value": "411426" + }, + { + "label": "豫东综合物流产业聚集区", + "value": "411471" + }, + { + "label": "河南商丘经济开发区", + "value": "411472" + }, + { + "label": "永城市", + "value": "411481" + } + ], + [{ + "label": "浉河区", + "value": "411502" + }, + { + "label": "平桥区", + "value": "411503" + }, + { + "label": "罗山县", + "value": "411521" + }, + { + "label": "光山县", + "value": "411522" + }, + { + "label": "新县", + "value": "411523" + }, + { + "label": "商城县", + "value": "411524" + }, + { + "label": "固始县", + "value": "411525" + }, + { + "label": "潢川县", + "value": "411526" + }, + { + "label": "淮滨县", + "value": "411527" + }, + { + "label": "息县", + "value": "411528" + }, + { + "label": "信阳高新技术产业开发区", + "value": "411571" + } + ], + [{ + "label": "川汇区", + "value": "411602" + }, + { + "label": "扶沟县", + "value": "411621" + }, + { + "label": "西华县", + "value": "411622" + }, + { + "label": "商水县", + "value": "411623" + }, + { + "label": "沈丘县", + "value": "411624" + }, + { + "label": "郸城县", + "value": "411625" + }, + { + "label": "淮阳县", + "value": "411626" + }, + { + "label": "太康县", + "value": "411627" + }, + { + "label": "鹿邑县", + "value": "411628" + }, + { + "label": "河南周口经济开发区", + "value": "411671" + }, + { + "label": "项城市", + "value": "411681" + } + ], + [{ + "label": "驿城区", + "value": "411702" + }, + { + "label": "西平县", + "value": "411721" + }, + { + "label": "上蔡县", + "value": "411722" + }, + { + "label": "平舆县", + "value": "411723" + }, + { + "label": "正阳县", + "value": "411724" + }, + { + "label": "确山县", + "value": "411725" + }, + { + "label": "泌阳县", + "value": "411726" + }, + { + "label": "汝南县", + "value": "411727" + }, + { + "label": "遂平县", + "value": "411728" + }, + { + "label": "新蔡县", + "value": "411729" + }, + { + "label": "河南驻马店经济开发区", + "value": "411771" + } + ], + [{ + "label": "济源市", + "value": "419001" + }] + ], + [ + [{ + "label": "江岸区", + "value": "420102" + }, + { + "label": "江汉区", + "value": "420103" + }, + { + "label": "硚口区", + "value": "420104" + }, + { + "label": "汉阳区", + "value": "420105" + }, + { + "label": "武昌区", + "value": "420106" + }, + { + "label": "青山区", + "value": "420107" + }, + { + "label": "洪山区", + "value": "420111" + }, + { + "label": "东西湖区", + "value": "420112" + }, + { + "label": "汉南区", + "value": "420113" + }, + { + "label": "蔡甸区", + "value": "420114" + }, + { + "label": "江夏区", + "value": "420115" + }, + { + "label": "黄陂区", + "value": "420116" + }, + { + "label": "新洲区", + "value": "420117" + } + ], + [{ + "label": "黄石港区", + "value": "420202" + }, + { + "label": "西塞山区", + "value": "420203" + }, + { + "label": "下陆区", + "value": "420204" + }, + { + "label": "铁山区", + "value": "420205" + }, + { + "label": "阳新县", + "value": "420222" + }, + { + "label": "大冶市", + "value": "420281" + } + ], + [{ + "label": "茅箭区", + "value": "420302" + }, + { + "label": "张湾区", + "value": "420303" + }, + { + "label": "郧阳区", + "value": "420304" + }, + { + "label": "郧西县", + "value": "420322" + }, + { + "label": "竹山县", + "value": "420323" + }, + { + "label": "竹溪县", + "value": "420324" + }, + { + "label": "房县", + "value": "420325" + }, + { + "label": "丹江口市", + "value": "420381" + } + ], + [{ + "label": "西陵区", + "value": "420502" + }, + { + "label": "伍家岗区", + "value": "420503" + }, + { + "label": "点军区", + "value": "420504" + }, + { + "label": "猇亭区", + "value": "420505" + }, + { + "label": "夷陵区", + "value": "420506" + }, + { + "label": "远安县", + "value": "420525" + }, + { + "label": "兴山县", + "value": "420526" + }, + { + "label": "秭归县", + "value": "420527" + }, + { + "label": "长阳土家族自治县", + "value": "420528" + }, + { + "label": "五峰土家族自治县", + "value": "420529" + }, + { + "label": "宜都市", + "value": "420581" + }, + { + "label": "当阳市", + "value": "420582" + }, + { + "label": "枝江市", + "value": "420583" + } + ], + [{ + "label": "襄城区", + "value": "420602" + }, + { + "label": "樊城区", + "value": "420606" + }, + { + "label": "襄州区", + "value": "420607" + }, + { + "label": "南漳县", + "value": "420624" + }, + { + "label": "谷城县", + "value": "420625" + }, + { + "label": "保康县", + "value": "420626" + }, + { + "label": "老河口市", + "value": "420682" + }, + { + "label": "枣阳市", + "value": "420683" + }, + { + "label": "宜城市", + "value": "420684" + } + ], + [{ + "label": "梁子湖区", + "value": "420702" + }, + { + "label": "华容区", + "value": "420703" + }, + { + "label": "鄂城区", + "value": "420704" + } + ], + [{ + "label": "东宝区", + "value": "420802" + }, + { + "label": "掇刀区", + "value": "420804" + }, + { + "label": "京山县", + "value": "420821" + }, + { + "label": "沙洋县", + "value": "420822" + }, + { + "label": "钟祥市", + "value": "420881" + } + ], + [{ + "label": "孝南区", + "value": "420902" + }, + { + "label": "孝昌县", + "value": "420921" + }, + { + "label": "大悟县", + "value": "420922" + }, + { + "label": "云梦县", + "value": "420923" + }, + { + "label": "应城市", + "value": "420981" + }, + { + "label": "安陆市", + "value": "420982" + }, + { + "label": "汉川市", + "value": "420984" + } + ], + [{ + "label": "沙市区", + "value": "421002" + }, + { + "label": "荆州区", + "value": "421003" + }, + { + "label": "公安县", + "value": "421022" + }, + { + "label": "监利县", + "value": "421023" + }, + { + "label": "江陵县", + "value": "421024" + }, + { + "label": "荆州经济技术开发区", + "value": "421071" + }, + { + "label": "石首市", + "value": "421081" + }, + { + "label": "洪湖市", + "value": "421083" + }, + { + "label": "松滋市", + "value": "421087" + } + ], + [{ + "label": "黄州区", + "value": "421102" + }, + { + "label": "团风县", + "value": "421121" + }, + { + "label": "红安县", + "value": "421122" + }, + { + "label": "罗田县", + "value": "421123" + }, + { + "label": "英山县", + "value": "421124" + }, + { + "label": "浠水县", + "value": "421125" + }, + { + "label": "蕲春县", + "value": "421126" + }, + { + "label": "黄梅县", + "value": "421127" + }, + { + "label": "龙感湖管理区", + "value": "421171" + }, + { + "label": "麻城市", + "value": "421181" + }, + { + "label": "武穴市", + "value": "421182" + } + ], + [{ + "label": "咸安区", + "value": "421202" + }, + { + "label": "嘉鱼县", + "value": "421221" + }, + { + "label": "通城县", + "value": "421222" + }, + { + "label": "崇阳县", + "value": "421223" + }, + { + "label": "通山县", + "value": "421224" + }, + { + "label": "赤壁市", + "value": "421281" + } + ], + [{ + "label": "曾都区", + "value": "421303" + }, + { + "label": "随县", + "value": "421321" + }, + { + "label": "广水市", + "value": "421381" + } + ], + [{ + "label": "恩施市", + "value": "422801" + }, + { + "label": "利川市", + "value": "422802" + }, + { + "label": "建始县", + "value": "422822" + }, + { + "label": "巴东县", + "value": "422823" + }, + { + "label": "宣恩县", + "value": "422825" + }, + { + "label": "咸丰县", + "value": "422826" + }, + { + "label": "来凤县", + "value": "422827" + }, + { + "label": "鹤峰县", + "value": "422828" + } + ], + [{ + "label": "仙桃市", + "value": "429004" + }, + { + "label": "潜江市", + "value": "429005" + }, + { + "label": "天门市", + "value": "429006" + }, + { + "label": "神农架林区", + "value": "429021" + } + ] + ], + [ + [{ + "label": "芙蓉区", + "value": "430102" + }, + { + "label": "天心区", + "value": "430103" + }, + { + "label": "岳麓区", + "value": "430104" + }, + { + "label": "开福区", + "value": "430105" + }, + { + "label": "雨花区", + "value": "430111" + }, + { + "label": "望城区", + "value": "430112" + }, + { + "label": "长沙县", + "value": "430121" + }, + { + "label": "浏阳市", + "value": "430181" + }, + { + "label": "宁乡市", + "value": "430182" + } + ], + [{ + "label": "荷塘区", + "value": "430202" + }, + { + "label": "芦淞区", + "value": "430203" + }, + { + "label": "石峰区", + "value": "430204" + }, + { + "label": "天元区", + "value": "430211" + }, + { + "label": "株洲县", + "value": "430221" + }, + { + "label": "攸县", + "value": "430223" + }, + { + "label": "茶陵县", + "value": "430224" + }, + { + "label": "炎陵县", + "value": "430225" + }, + { + "label": "云龙示范区", + "value": "430271" + }, + { + "label": "醴陵市", + "value": "430281" + } + ], + [{ + "label": "雨湖区", + "value": "430302" + }, + { + "label": "岳塘区", + "value": "430304" + }, + { + "label": "湘潭县", + "value": "430321" + }, + { + "label": "湖南湘潭高新技术产业园区", + "value": "430371" + }, + { + "label": "湘潭昭山示范区", + "value": "430372" + }, + { + "label": "湘潭九华示范区", + "value": "430373" + }, + { + "label": "湘乡市", + "value": "430381" + }, + { + "label": "韶山市", + "value": "430382" + } + ], + [{ + "label": "珠晖区", + "value": "430405" + }, + { + "label": "雁峰区", + "value": "430406" + }, + { + "label": "石鼓区", + "value": "430407" + }, + { + "label": "蒸湘区", + "value": "430408" + }, + { + "label": "南岳区", + "value": "430412" + }, + { + "label": "衡阳县", + "value": "430421" + }, + { + "label": "衡南县", + "value": "430422" + }, + { + "label": "衡山县", + "value": "430423" + }, + { + "label": "衡东县", + "value": "430424" + }, + { + "label": "祁东县", + "value": "430426" + }, + { + "label": "衡阳综合保税区", + "value": "430471" + }, + { + "label": "湖南衡阳高新技术产业园区", + "value": "430472" + }, + { + "label": "湖南衡阳松木经济开发区", + "value": "430473" + }, + { + "label": "耒阳市", + "value": "430481" + }, + { + "label": "常宁市", + "value": "430482" + } + ], + [{ + "label": "双清区", + "value": "430502" + }, + { + "label": "大祥区", + "value": "430503" + }, + { + "label": "北塔区", + "value": "430511" + }, + { + "label": "邵东县", + "value": "430521" + }, + { + "label": "新邵县", + "value": "430522" + }, + { + "label": "邵阳县", + "value": "430523" + }, + { + "label": "隆回县", + "value": "430524" + }, + { + "label": "洞口县", + "value": "430525" + }, + { + "label": "绥宁县", + "value": "430527" + }, + { + "label": "新宁县", + "value": "430528" + }, + { + "label": "城步苗族自治县", + "value": "430529" + }, + { + "label": "武冈市", + "value": "430581" + } + ], + [{ + "label": "岳阳楼区", + "value": "430602" + }, + { + "label": "云溪区", + "value": "430603" + }, + { + "label": "君山区", + "value": "430611" + }, + { + "label": "岳阳县", + "value": "430621" + }, + { + "label": "华容县", + "value": "430623" + }, + { + "label": "湘阴县", + "value": "430624" + }, + { + "label": "平江县", + "value": "430626" + }, + { + "label": "岳阳市屈原管理区", + "value": "430671" + }, + { + "label": "汨罗市", + "value": "430681" + }, + { + "label": "临湘市", + "value": "430682" + } + ], + [{ + "label": "武陵区", + "value": "430702" + }, + { + "label": "鼎城区", + "value": "430703" + }, + { + "label": "安乡县", + "value": "430721" + }, + { + "label": "汉寿县", + "value": "430722" + }, + { + "label": "澧县", + "value": "430723" + }, + { + "label": "临澧县", + "value": "430724" + }, + { + "label": "桃源县", + "value": "430725" + }, + { + "label": "石门县", + "value": "430726" + }, + { + "label": "常德市西洞庭管理区", + "value": "430771" + }, + { + "label": "津市市", + "value": "430781" + } + ], + [{ + "label": "永定区", + "value": "430802" + }, + { + "label": "武陵源区", + "value": "430811" + }, + { + "label": "慈利县", + "value": "430821" + }, + { + "label": "桑植县", + "value": "430822" + } + ], + [{ + "label": "资阳区", + "value": "430902" + }, + { + "label": "赫山区", + "value": "430903" + }, + { + "label": "南县", + "value": "430921" + }, + { + "label": "桃江县", + "value": "430922" + }, + { + "label": "安化县", + "value": "430923" + }, + { + "label": "益阳市大通湖管理区", + "value": "430971" + }, + { + "label": "湖南益阳高新技术产业园区", + "value": "430972" + }, + { + "label": "沅江市", + "value": "430981" + } + ], + [{ + "label": "北湖区", + "value": "431002" + }, + { + "label": "苏仙区", + "value": "431003" + }, + { + "label": "桂阳县", + "value": "431021" + }, + { + "label": "宜章县", + "value": "431022" + }, + { + "label": "永兴县", + "value": "431023" + }, + { + "label": "嘉禾县", + "value": "431024" + }, + { + "label": "临武县", + "value": "431025" + }, + { + "label": "汝城县", + "value": "431026" + }, + { + "label": "桂东县", + "value": "431027" + }, + { + "label": "安仁县", + "value": "431028" + }, + { + "label": "资兴市", + "value": "431081" + } + ], + [{ + "label": "零陵区", + "value": "431102" + }, + { + "label": "冷水滩区", + "value": "431103" + }, + { + "label": "祁阳县", + "value": "431121" + }, + { + "label": "东安县", + "value": "431122" + }, + { + "label": "双牌县", + "value": "431123" + }, + { + "label": "道县", + "value": "431124" + }, + { + "label": "江永县", + "value": "431125" + }, + { + "label": "宁远县", + "value": "431126" + }, + { + "label": "蓝山县", + "value": "431127" + }, + { + "label": "新田县", + "value": "431128" + }, + { + "label": "江华瑶族自治县", + "value": "431129" + }, + { + "label": "永州经济技术开发区", + "value": "431171" + }, + { + "label": "永州市金洞管理区", + "value": "431172" + }, + { + "label": "永州市回龙圩管理区", + "value": "431173" + } + ], + [{ + "label": "鹤城区", + "value": "431202" + }, + { + "label": "中方县", + "value": "431221" + }, + { + "label": "沅陵县", + "value": "431222" + }, + { + "label": "辰溪县", + "value": "431223" + }, + { + "label": "溆浦县", + "value": "431224" + }, + { + "label": "会同县", + "value": "431225" + }, + { + "label": "麻阳苗族自治县", + "value": "431226" + }, + { + "label": "新晃侗族自治县", + "value": "431227" + }, + { + "label": "芷江侗族自治县", + "value": "431228" + }, + { + "label": "靖州苗族侗族自治县", + "value": "431229" + }, + { + "label": "通道侗族自治县", + "value": "431230" + }, + { + "label": "怀化市洪江管理区", + "value": "431271" + }, + { + "label": "洪江市", + "value": "431281" + } + ], + [{ + "label": "娄星区", + "value": "431302" + }, + { + "label": "双峰县", + "value": "431321" + }, + { + "label": "新化县", + "value": "431322" + }, + { + "label": "冷水江市", + "value": "431381" + }, + { + "label": "涟源市", + "value": "431382" + } + ], + [{ + "label": "吉首市", + "value": "433101" + }, + { + "label": "泸溪县", + "value": "433122" + }, + { + "label": "凤凰县", + "value": "433123" + }, + { + "label": "花垣县", + "value": "433124" + }, + { + "label": "保靖县", + "value": "433125" + }, + { + "label": "古丈县", + "value": "433126" + }, + { + "label": "永顺县", + "value": "433127" + }, + { + "label": "龙山县", + "value": "433130" + }, + { + "label": "湖南吉首经济开发区", + "value": "433172" + }, + { + "label": "湖南永顺经济开发区", + "value": "433173" + } + ] + ], + [ + [{ + "label": "荔湾区", + "value": "440103" + }, + { + "label": "越秀区", + "value": "440104" + }, + { + "label": "海珠区", + "value": "440105" + }, + { + "label": "天河区", + "value": "440106" + }, + { + "label": "白云区", + "value": "440111" + }, + { + "label": "黄埔区", + "value": "440112" + }, + { + "label": "番禺区", + "value": "440113" + }, + { + "label": "花都区", + "value": "440114" + }, + { + "label": "南沙区", + "value": "440115" + }, + { + "label": "从化区", + "value": "440117" + }, + { + "label": "增城区", + "value": "440118" + } + ], + [{ + "label": "武江区", + "value": "440203" + }, + { + "label": "浈江区", + "value": "440204" + }, + { + "label": "曲江区", + "value": "440205" + }, + { + "label": "始兴县", + "value": "440222" + }, + { + "label": "仁化县", + "value": "440224" + }, + { + "label": "翁源县", + "value": "440229" + }, + { + "label": "乳源瑶族自治县", + "value": "440232" + }, + { + "label": "新丰县", + "value": "440233" + }, + { + "label": "乐昌市", + "value": "440281" + }, + { + "label": "南雄市", + "value": "440282" + } + ], + [{ + "label": "罗湖区", + "value": "440303" + }, + { + "label": "福田区", + "value": "440304" + }, + { + "label": "南山区", + "value": "440305" + }, + { + "label": "宝安区", + "value": "440306" + }, + { + "label": "龙岗区", + "value": "440307" + }, + { + "label": "盐田区", + "value": "440308" + }, + { + "label": "龙华区", + "value": "440309" + }, + { + "label": "坪山区", + "value": "440310" + } + ], + [{ + "label": "香洲区", + "value": "440402" + }, + { + "label": "斗门区", + "value": "440403" + }, + { + "label": "金湾区", + "value": "440404" + } + ], + [{ + "label": "龙湖区", + "value": "440507" + }, + { + "label": "金平区", + "value": "440511" + }, + { + "label": "濠江区", + "value": "440512" + }, + { + "label": "潮阳区", + "value": "440513" + }, + { + "label": "潮南区", + "value": "440514" + }, + { + "label": "澄海区", + "value": "440515" + }, + { + "label": "南澳县", + "value": "440523" + } + ], + [{ + "label": "禅城区", + "value": "440604" + }, + { + "label": "南海区", + "value": "440605" + }, + { + "label": "顺德区", + "value": "440606" + }, + { + "label": "三水区", + "value": "440607" + }, + { + "label": "高明区", + "value": "440608" + } + ], + [{ + "label": "蓬江区", + "value": "440703" + }, + { + "label": "江海区", + "value": "440704" + }, + { + "label": "新会区", + "value": "440705" + }, + { + "label": "台山市", + "value": "440781" + }, + { + "label": "开平市", + "value": "440783" + }, + { + "label": "鹤山市", + "value": "440784" + }, + { + "label": "恩平市", + "value": "440785" + } + ], + [{ + "label": "赤坎区", + "value": "440802" + }, + { + "label": "霞山区", + "value": "440803" + }, + { + "label": "坡头区", + "value": "440804" + }, + { + "label": "麻章区", + "value": "440811" + }, + { + "label": "遂溪县", + "value": "440823" + }, + { + "label": "徐闻县", + "value": "440825" + }, + { + "label": "廉江市", + "value": "440881" + }, + { + "label": "雷州市", + "value": "440882" + }, + { + "label": "吴川市", + "value": "440883" + } + ], + [{ + "label": "茂南区", + "value": "440902" + }, + { + "label": "电白区", + "value": "440904" + }, + { + "label": "高州市", + "value": "440981" + }, + { + "label": "化州市", + "value": "440982" + }, + { + "label": "信宜市", + "value": "440983" + } + ], + [{ + "label": "端州区", + "value": "441202" + }, + { + "label": "鼎湖区", + "value": "441203" + }, + { + "label": "高要区", + "value": "441204" + }, + { + "label": "广宁县", + "value": "441223" + }, + { + "label": "怀集县", + "value": "441224" + }, + { + "label": "封开县", + "value": "441225" + }, + { + "label": "德庆县", + "value": "441226" + }, + { + "label": "四会市", + "value": "441284" + } + ], + [{ + "label": "惠城区", + "value": "441302" + }, + { + "label": "惠阳区", + "value": "441303" + }, + { + "label": "博罗县", + "value": "441322" + }, + { + "label": "惠东县", + "value": "441323" + }, + { + "label": "龙门县", + "value": "441324" + } + ], + [{ + "label": "梅江区", + "value": "441402" + }, + { + "label": "梅县区", + "value": "441403" + }, + { + "label": "大埔县", + "value": "441422" + }, + { + "label": "丰顺县", + "value": "441423" + }, + { + "label": "五华县", + "value": "441424" + }, + { + "label": "平远县", + "value": "441426" + }, + { + "label": "蕉岭县", + "value": "441427" + }, + { + "label": "兴宁市", + "value": "441481" + } + ], + [{ + "label": "城区", + "value": "441502" + }, + { + "label": "海丰县", + "value": "441521" + }, + { + "label": "陆河县", + "value": "441523" + }, + { + "label": "陆丰市", + "value": "441581" + } + ], + [{ + "label": "源城区", + "value": "441602" + }, + { + "label": "紫金县", + "value": "441621" + }, + { + "label": "龙川县", + "value": "441622" + }, + { + "label": "连平县", + "value": "441623" + }, + { + "label": "和平县", + "value": "441624" + }, + { + "label": "东源县", + "value": "441625" + } + ], + [{ + "label": "江城区", + "value": "441702" + }, + { + "label": "阳东区", + "value": "441704" + }, + { + "label": "阳西县", + "value": "441721" + }, + { + "label": "阳春市", + "value": "441781" + } + ], + [{ + "label": "清城区", + "value": "441802" + }, + { + "label": "清新区", + "value": "441803" + }, + { + "label": "佛冈县", + "value": "441821" + }, + { + "label": "阳山县", + "value": "441823" + }, + { + "label": "连山壮族瑶族自治县", + "value": "441825" + }, + { + "label": "连南瑶族自治县", + "value": "441826" + }, + { + "label": "英德市", + "value": "441881" + }, + { + "label": "连州市", + "value": "441882" + } + ], + [{ + "label": "东莞市", + "value": "441900" + }], + [{ + "label": "中山市", + "value": "442000" + }], + [{ + "label": "湘桥区", + "value": "445102" + }, + { + "label": "潮安区", + "value": "445103" + }, + { + "label": "饶平县", + "value": "445122" + } + ], + [{ + "label": "榕城区", + "value": "445202" + }, + { + "label": "揭东区", + "value": "445203" + }, + { + "label": "揭西县", + "value": "445222" + }, + { + "label": "惠来县", + "value": "445224" + }, + { + "label": "普宁市", + "value": "445281" + } + ], + [{ + "label": "云城区", + "value": "445302" + }, + { + "label": "云安区", + "value": "445303" + }, + { + "label": "新兴县", + "value": "445321" + }, + { + "label": "郁南县", + "value": "445322" + }, + { + "label": "罗定市", + "value": "445381" + } + ] + ], + [ + [{ + "label": "兴宁区", + "value": "450102" + }, + { + "label": "青秀区", + "value": "450103" + }, + { + "label": "江南区", + "value": "450105" + }, + { + "label": "西乡塘区", + "value": "450107" + }, + { + "label": "良庆区", + "value": "450108" + }, + { + "label": "邕宁区", + "value": "450109" + }, + { + "label": "武鸣区", + "value": "450110" + }, + { + "label": "隆安县", + "value": "450123" + }, + { + "label": "马山县", + "value": "450124" + }, + { + "label": "上林县", + "value": "450125" + }, + { + "label": "宾阳县", + "value": "450126" + }, + { + "label": "横县", + "value": "450127" + } + ], + [{ + "label": "城中区", + "value": "450202" + }, + { + "label": "鱼峰区", + "value": "450203" + }, + { + "label": "柳南区", + "value": "450204" + }, + { + "label": "柳北区", + "value": "450205" + }, + { + "label": "柳江区", + "value": "450206" + }, + { + "label": "柳城县", + "value": "450222" + }, + { + "label": "鹿寨县", + "value": "450223" + }, + { + "label": "融安县", + "value": "450224" + }, + { + "label": "融水苗族自治县", + "value": "450225" + }, + { + "label": "三江侗族自治县", + "value": "450226" + } + ], + [{ + "label": "秀峰区", + "value": "450302" + }, + { + "label": "叠彩区", + "value": "450303" + }, + { + "label": "象山区", + "value": "450304" + }, + { + "label": "七星区", + "value": "450305" + }, + { + "label": "雁山区", + "value": "450311" + }, + { + "label": "临桂区", + "value": "450312" + }, + { + "label": "阳朔县", + "value": "450321" + }, + { + "label": "灵川县", + "value": "450323" + }, + { + "label": "全州县", + "value": "450324" + }, + { + "label": "兴安县", + "value": "450325" + }, + { + "label": "永福县", + "value": "450326" + }, + { + "label": "灌阳县", + "value": "450327" + }, + { + "label": "龙胜各族自治县", + "value": "450328" + }, + { + "label": "资源县", + "value": "450329" + }, + { + "label": "平乐县", + "value": "450330" + }, + { + "label": "荔浦县", + "value": "450331" + }, + { + "label": "恭城瑶族自治县", + "value": "450332" + } + ], + [{ + "label": "万秀区", + "value": "450403" + }, + { + "label": "长洲区", + "value": "450405" + }, + { + "label": "龙圩区", + "value": "450406" + }, + { + "label": "苍梧县", + "value": "450421" + }, + { + "label": "藤县", + "value": "450422" + }, + { + "label": "蒙山县", + "value": "450423" + }, + { + "label": "岑溪市", + "value": "450481" + } + ], + [{ + "label": "海城区", + "value": "450502" + }, + { + "label": "银海区", + "value": "450503" + }, + { + "label": "铁山港区", + "value": "450512" + }, + { + "label": "合浦县", + "value": "450521" + } + ], + [{ + "label": "港口区", + "value": "450602" + }, + { + "label": "防城区", + "value": "450603" + }, + { + "label": "上思县", + "value": "450621" + }, + { + "label": "东兴市", + "value": "450681" + } + ], + [{ + "label": "钦南区", + "value": "450702" + }, + { + "label": "钦北区", + "value": "450703" + }, + { + "label": "灵山县", + "value": "450721" + }, + { + "label": "浦北县", + "value": "450722" + } + ], + [{ + "label": "港北区", + "value": "450802" + }, + { + "label": "港南区", + "value": "450803" + }, + { + "label": "覃塘区", + "value": "450804" + }, + { + "label": "平南县", + "value": "450821" + }, + { + "label": "桂平市", + "value": "450881" + } + ], + [{ + "label": "玉州区", + "value": "450902" + }, + { + "label": "福绵区", + "value": "450903" + }, + { + "label": "容县", + "value": "450921" + }, + { + "label": "陆川县", + "value": "450922" + }, + { + "label": "博白县", + "value": "450923" + }, + { + "label": "兴业县", + "value": "450924" + }, + { + "label": "北流市", + "value": "450981" + } + ], + [{ + "label": "右江区", + "value": "451002" + }, + { + "label": "田阳县", + "value": "451021" + }, + { + "label": "田东县", + "value": "451022" + }, + { + "label": "平果县", + "value": "451023" + }, + { + "label": "德保县", + "value": "451024" + }, + { + "label": "那坡县", + "value": "451026" + }, + { + "label": "凌云县", + "value": "451027" + }, + { + "label": "乐业县", + "value": "451028" + }, + { + "label": "田林县", + "value": "451029" + }, + { + "label": "西林县", + "value": "451030" + }, + { + "label": "隆林各族自治县", + "value": "451031" + }, + { + "label": "靖西市", + "value": "451081" + } + ], + [{ + "label": "八步区", + "value": "451102" + }, + { + "label": "平桂区", + "value": "451103" + }, + { + "label": "昭平县", + "value": "451121" + }, + { + "label": "钟山县", + "value": "451122" + }, + { + "label": "富川瑶族自治县", + "value": "451123" + } + ], + [{ + "label": "金城江区", + "value": "451202" + }, + { + "label": "宜州区", + "value": "451203" + }, + { + "label": "南丹县", + "value": "451221" + }, + { + "label": "天峨县", + "value": "451222" + }, + { + "label": "凤山县", + "value": "451223" + }, + { + "label": "东兰县", + "value": "451224" + }, + { + "label": "罗城仫佬族自治县", + "value": "451225" + }, + { + "label": "环江毛南族自治县", + "value": "451226" + }, + { + "label": "巴马瑶族自治县", + "value": "451227" + }, + { + "label": "都安瑶族自治县", + "value": "451228" + }, + { + "label": "大化瑶族自治县", + "value": "451229" + } + ], + [{ + "label": "兴宾区", + "value": "451302" + }, + { + "label": "忻城县", + "value": "451321" + }, + { + "label": "象州县", + "value": "451322" + }, + { + "label": "武宣县", + "value": "451323" + }, + { + "label": "金秀瑶族自治县", + "value": "451324" + }, + { + "label": "合山市", + "value": "451381" + } + ], + [{ + "label": "江州区", + "value": "451402" + }, + { + "label": "扶绥县", + "value": "451421" + }, + { + "label": "宁明县", + "value": "451422" + }, + { + "label": "龙州县", + "value": "451423" + }, + { + "label": "大新县", + "value": "451424" + }, + { + "label": "天等县", + "value": "451425" + }, + { + "label": "凭祥市", + "value": "451481" + } + ] + ], + [ + [{ + "label": "秀英区", + "value": "460105" + }, + { + "label": "龙华区", + "value": "460106" + }, + { + "label": "琼山区", + "value": "460107" + }, + { + "label": "美兰区", + "value": "460108" + } + ], + [{ + "label": "海棠区", + "value": "460202" + }, + { + "label": "吉阳区", + "value": "460203" + }, + { + "label": "天涯区", + "value": "460204" + }, + { + "label": "崖州区", + "value": "460205" + } + ], + [{ + "label": "西沙群岛", + "value": "460321" + }, + { + "label": "南沙群岛", + "value": "460322" + }, + { + "label": "中沙群岛的岛礁及其海域", + "value": "460323" + } + ], + [{ + "label": "儋州市", + "value": "460400" + }], + [{ + "label": "五指山市", + "value": "469001" + }, + { + "label": "琼海市", + "value": "469002" + }, + { + "label": "文昌市", + "value": "469005" + }, + { + "label": "万宁市", + "value": "469006" + }, + { + "label": "东方市", + "value": "469007" + }, + { + "label": "定安县", + "value": "469021" + }, + { + "label": "屯昌县", + "value": "469022" + }, + { + "label": "澄迈县", + "value": "469023" + }, + { + "label": "临高县", + "value": "469024" + }, + { + "label": "白沙黎族自治县", + "value": "469025" + }, + { + "label": "昌江黎族自治县", + "value": "469026" + }, + { + "label": "乐东黎族自治县", + "value": "469027" + }, + { + "label": "陵水黎族自治县", + "value": "469028" + }, + { + "label": "保亭黎族苗族自治县", + "value": "469029" + }, + { + "label": "琼中黎族苗族自治县", + "value": "469030" + } + ] + ], + [ + [{ + "label": "万州区", + "value": "500101" + }, + { + "label": "涪陵区", + "value": "500102" + }, + { + "label": "渝中区", + "value": "500103" + }, + { + "label": "大渡口区", + "value": "500104" + }, + { + "label": "江北区", + "value": "500105" + }, + { + "label": "沙坪坝区", + "value": "500106" + }, + { + "label": "九龙坡区", + "value": "500107" + }, + { + "label": "南岸区", + "value": "500108" + }, + { + "label": "北碚区", + "value": "500109" + }, + { + "label": "綦江区", + "value": "500110" + }, + { + "label": "大足区", + "value": "500111" + }, + { + "label": "渝北区", + "value": "500112" + }, + { + "label": "巴南区", + "value": "500113" + }, + { + "label": "黔江区", + "value": "500114" + }, + { + "label": "长寿区", + "value": "500115" + }, + { + "label": "江津区", + "value": "500116" + }, + { + "label": "合川区", + "value": "500117" + }, + { + "label": "永川区", + "value": "500118" + }, + { + "label": "南川区", + "value": "500119" + }, + { + "label": "璧山区", + "value": "500120" + }, + { + "label": "铜梁区", + "value": "500151" + }, + { + "label": "潼南区", + "value": "500152" + }, + { + "label": "荣昌区", + "value": "500153" + }, + { + "label": "开州区", + "value": "500154" + }, + { + "label": "梁平区", + "value": "500155" + }, + { + "label": "武隆区", + "value": "500156" + } + ], + [{ + "label": "城口县", + "value": "500229" + }, + { + "label": "丰都县", + "value": "500230" + }, + { + "label": "垫江县", + "value": "500231" + }, + { + "label": "忠县", + "value": "500233" + }, + { + "label": "云阳县", + "value": "500235" + }, + { + "label": "奉节县", + "value": "500236" + }, + { + "label": "巫山县", + "value": "500237" + }, + { + "label": "巫溪县", + "value": "500238" + }, + { + "label": "石柱土家族自治县", + "value": "500240" + }, + { + "label": "秀山土家族苗族自治县", + "value": "500241" + }, + { + "label": "酉阳土家族苗族自治县", + "value": "500242" + }, + { + "label": "彭水苗族土家族自治县", + "value": "500243" + } + ] + ], + [ + [{ + "label": "锦江区", + "value": "510104" + }, + { + "label": "青羊区", + "value": "510105" + }, + { + "label": "金牛区", + "value": "510106" + }, + { + "label": "武侯区", + "value": "510107" + }, + { + "label": "成华区", + "value": "510108" + }, + { + "label": "龙泉驿区", + "value": "510112" + }, + { + "label": "青白江区", + "value": "510113" + }, + { + "label": "新都区", + "value": "510114" + }, + { + "label": "温江区", + "value": "510115" + }, + { + "label": "双流区", + "value": "510116" + }, + { + "label": "郫都区", + "value": "510117" + }, + { + "label": "金堂县", + "value": "510121" + }, + { + "label": "大邑县", + "value": "510129" + }, + { + "label": "蒲江县", + "value": "510131" + }, + { + "label": "新津县", + "value": "510132" + }, + { + "label": "都江堰市", + "value": "510181" + }, + { + "label": "彭州市", + "value": "510182" + }, + { + "label": "邛崃市", + "value": "510183" + }, + { + "label": "崇州市", + "value": "510184" + }, + { + "label": "简阳市", + "value": "510185" + } + ], + [{ + "label": "自流井区", + "value": "510302" + }, + { + "label": "贡井区", + "value": "510303" + }, + { + "label": "大安区", + "value": "510304" + }, + { + "label": "沿滩区", + "value": "510311" + }, + { + "label": "荣县", + "value": "510321" + }, + { + "label": "富顺县", + "value": "510322" + } + ], + [{ + "label": "东区", + "value": "510402" + }, + { + "label": "西区", + "value": "510403" + }, + { + "label": "仁和区", + "value": "510411" + }, + { + "label": "米易县", + "value": "510421" + }, + { + "label": "盐边县", + "value": "510422" + } + ], + [{ + "label": "江阳区", + "value": "510502" + }, + { + "label": "纳溪区", + "value": "510503" + }, + { + "label": "龙马潭区", + "value": "510504" + }, + { + "label": "泸县", + "value": "510521" + }, + { + "label": "合江县", + "value": "510522" + }, + { + "label": "叙永县", + "value": "510524" + }, + { + "label": "古蔺县", + "value": "510525" + } + ], + [{ + "label": "旌阳区", + "value": "510603" + }, + { + "label": "罗江区", + "value": "510604" + }, + { + "label": "中江县", + "value": "510623" + }, + { + "label": "广汉市", + "value": "510681" + }, + { + "label": "什邡市", + "value": "510682" + }, + { + "label": "绵竹市", + "value": "510683" + } + ], + [{ + "label": "涪城区", + "value": "510703" + }, + { + "label": "游仙区", + "value": "510704" + }, + { + "label": "安州区", + "value": "510705" + }, + { + "label": "三台县", + "value": "510722" + }, + { + "label": "盐亭县", + "value": "510723" + }, + { + "label": "梓潼县", + "value": "510725" + }, + { + "label": "北川羌族自治县", + "value": "510726" + }, + { + "label": "平武县", + "value": "510727" + }, + { + "label": "江油市", + "value": "510781" + } + ], + [{ + "label": "利州区", + "value": "510802" + }, + { + "label": "昭化区", + "value": "510811" + }, + { + "label": "朝天区", + "value": "510812" + }, + { + "label": "旺苍县", + "value": "510821" + }, + { + "label": "青川县", + "value": "510822" + }, + { + "label": "剑阁县", + "value": "510823" + }, + { + "label": "苍溪县", + "value": "510824" + } + ], + [{ + "label": "船山区", + "value": "510903" + }, + { + "label": "安居区", + "value": "510904" + }, + { + "label": "蓬溪县", + "value": "510921" + }, + { + "label": "射洪县", + "value": "510922" + }, + { + "label": "大英县", + "value": "510923" + } + ], + [{ + "label": "市中区", + "value": "511002" + }, + { + "label": "东兴区", + "value": "511011" + }, + { + "label": "威远县", + "value": "511024" + }, + { + "label": "资中县", + "value": "511025" + }, + { + "label": "内江经济开发区", + "value": "511071" + }, + { + "label": "隆昌市", + "value": "511083" + } + ], + [{ + "label": "市中区", + "value": "511102" + }, + { + "label": "沙湾区", + "value": "511111" + }, + { + "label": "五通桥区", + "value": "511112" + }, + { + "label": "金口河区", + "value": "511113" + }, + { + "label": "犍为县", + "value": "511123" + }, + { + "label": "井研县", + "value": "511124" + }, + { + "label": "夹江县", + "value": "511126" + }, + { + "label": "沐川县", + "value": "511129" + }, + { + "label": "峨边彝族自治县", + "value": "511132" + }, + { + "label": "马边彝族自治县", + "value": "511133" + }, + { + "label": "峨眉山市", + "value": "511181" + } + ], + [{ + "label": "顺庆区", + "value": "511302" + }, + { + "label": "高坪区", + "value": "511303" + }, + { + "label": "嘉陵区", + "value": "511304" + }, + { + "label": "南部县", + "value": "511321" + }, + { + "label": "营山县", + "value": "511322" + }, + { + "label": "蓬安县", + "value": "511323" + }, + { + "label": "仪陇县", + "value": "511324" + }, + { + "label": "西充县", + "value": "511325" + }, + { + "label": "阆中市", + "value": "511381" + } + ], + [{ + "label": "东坡区", + "value": "511402" + }, + { + "label": "彭山区", + "value": "511403" + }, + { + "label": "仁寿县", + "value": "511421" + }, + { + "label": "洪雅县", + "value": "511423" + }, + { + "label": "丹棱县", + "value": "511424" + }, + { + "label": "青神县", + "value": "511425" + } + ], + [{ + "label": "翠屏区", + "value": "511502" + }, + { + "label": "南溪区", + "value": "511503" + }, + { + "label": "宜宾县", + "value": "511521" + }, + { + "label": "江安县", + "value": "511523" + }, + { + "label": "长宁县", + "value": "511524" + }, + { + "label": "高县", + "value": "511525" + }, + { + "label": "珙县", + "value": "511526" + }, + { + "label": "筠连县", + "value": "511527" + }, + { + "label": "兴文县", + "value": "511528" + }, + { + "label": "屏山县", + "value": "511529" + } + ], + [{ + "label": "广安区", + "value": "511602" + }, + { + "label": "前锋区", + "value": "511603" + }, + { + "label": "岳池县", + "value": "511621" + }, + { + "label": "武胜县", + "value": "511622" + }, + { + "label": "邻水县", + "value": "511623" + }, + { + "label": "华蓥市", + "value": "511681" + } + ], + [{ + "label": "通川区", + "value": "511702" + }, + { + "label": "达川区", + "value": "511703" + }, + { + "label": "宣汉县", + "value": "511722" + }, + { + "label": "开江县", + "value": "511723" + }, + { + "label": "大竹县", + "value": "511724" + }, + { + "label": "渠县", + "value": "511725" + }, + { + "label": "达州经济开发区", + "value": "511771" + }, + { + "label": "万源市", + "value": "511781" + } + ], + [{ + "label": "雨城区", + "value": "511802" + }, + { + "label": "名山区", + "value": "511803" + }, + { + "label": "荥经县", + "value": "511822" + }, + { + "label": "汉源县", + "value": "511823" + }, + { + "label": "石棉县", + "value": "511824" + }, + { + "label": "天全县", + "value": "511825" + }, + { + "label": "芦山县", + "value": "511826" + }, + { + "label": "宝兴县", + "value": "511827" + } + ], + [{ + "label": "巴州区", + "value": "511902" + }, + { + "label": "恩阳区", + "value": "511903" + }, + { + "label": "通江县", + "value": "511921" + }, + { + "label": "南江县", + "value": "511922" + }, + { + "label": "平昌县", + "value": "511923" + }, + { + "label": "巴中经济开发区", + "value": "511971" + } + ], + [{ + "label": "雁江区", + "value": "512002" + }, + { + "label": "安岳县", + "value": "512021" + }, + { + "label": "乐至县", + "value": "512022" + } + ], + [{ + "label": "马尔康市", + "value": "513201" + }, + { + "label": "汶川县", + "value": "513221" + }, + { + "label": "理县", + "value": "513222" + }, + { + "label": "茂县", + "value": "513223" + }, + { + "label": "松潘县", + "value": "513224" + }, + { + "label": "九寨沟县", + "value": "513225" + }, + { + "label": "金川县", + "value": "513226" + }, + { + "label": "小金县", + "value": "513227" + }, + { + "label": "黑水县", + "value": "513228" + }, + { + "label": "壤塘县", + "value": "513230" + }, + { + "label": "阿坝县", + "value": "513231" + }, + { + "label": "若尔盖县", + "value": "513232" + }, + { + "label": "红原县", + "value": "513233" + } + ], + [{ + "label": "康定市", + "value": "513301" + }, + { + "label": "泸定县", + "value": "513322" + }, + { + "label": "丹巴县", + "value": "513323" + }, + { + "label": "九龙县", + "value": "513324" + }, + { + "label": "雅江县", + "value": "513325" + }, + { + "label": "道孚县", + "value": "513326" + }, + { + "label": "炉霍县", + "value": "513327" + }, + { + "label": "甘孜县", + "value": "513328" + }, + { + "label": "新龙县", + "value": "513329" + }, + { + "label": "德格县", + "value": "513330" + }, + { + "label": "白玉县", + "value": "513331" + }, + { + "label": "石渠县", + "value": "513332" + }, + { + "label": "色达县", + "value": "513333" + }, + { + "label": "理塘县", + "value": "513334" + }, + { + "label": "巴塘县", + "value": "513335" + }, + { + "label": "乡城县", + "value": "513336" + }, + { + "label": "稻城县", + "value": "513337" + }, + { + "label": "得荣县", + "value": "513338" + } + ], + [{ + "label": "西昌市", + "value": "513401" + }, + { + "label": "木里藏族自治县", + "value": "513422" + }, + { + "label": "盐源县", + "value": "513423" + }, + { + "label": "德昌县", + "value": "513424" + }, + { + "label": "会理县", + "value": "513425" + }, + { + "label": "会东县", + "value": "513426" + }, + { + "label": "宁南县", + "value": "513427" + }, + { + "label": "普格县", + "value": "513428" + }, + { + "label": "布拖县", + "value": "513429" + }, + { + "label": "金阳县", + "value": "513430" + }, + { + "label": "昭觉县", + "value": "513431" + }, + { + "label": "喜德县", + "value": "513432" + }, + { + "label": "冕宁县", + "value": "513433" + }, + { + "label": "越西县", + "value": "513434" + }, + { + "label": "甘洛县", + "value": "513435" + }, + { + "label": "美姑县", + "value": "513436" + }, + { + "label": "雷波县", + "value": "513437" + } + ] + ], + [ + [{ + "label": "南明区", + "value": "520102" + }, + { + "label": "云岩区", + "value": "520103" + }, + { + "label": "花溪区", + "value": "520111" + }, + { + "label": "乌当区", + "value": "520112" + }, + { + "label": "白云区", + "value": "520113" + }, + { + "label": "观山湖区", + "value": "520115" + }, + { + "label": "开阳县", + "value": "520121" + }, + { + "label": "息烽县", + "value": "520122" + }, + { + "label": "修文县", + "value": "520123" + }, + { + "label": "清镇市", + "value": "520181" + } + ], + [{ + "label": "钟山区", + "value": "520201" + }, + { + "label": "六枝特区", + "value": "520203" + }, + { + "label": "水城县", + "value": "520221" + }, + { + "label": "盘州市", + "value": "520281" + } + ], + [{ + "label": "红花岗区", + "value": "520302" + }, + { + "label": "汇川区", + "value": "520303" + }, + { + "label": "播州区", + "value": "520304" + }, + { + "label": "桐梓县", + "value": "520322" + }, + { + "label": "绥阳县", + "value": "520323" + }, + { + "label": "正安县", + "value": "520324" + }, + { + "label": "道真仡佬族苗族自治县", + "value": "520325" + }, + { + "label": "务川仡佬族苗族自治县", + "value": "520326" + }, + { + "label": "凤冈县", + "value": "520327" + }, + { + "label": "湄潭县", + "value": "520328" + }, + { + "label": "余庆县", + "value": "520329" + }, + { + "label": "习水县", + "value": "520330" + }, + { + "label": "赤水市", + "value": "520381" + }, + { + "label": "仁怀市", + "value": "520382" + } + ], + [{ + "label": "西秀区", + "value": "520402" + }, + { + "label": "平坝区", + "value": "520403" + }, + { + "label": "普定县", + "value": "520422" + }, + { + "label": "镇宁布依族苗族自治县", + "value": "520423" + }, + { + "label": "关岭布依族苗族自治县", + "value": "520424" + }, + { + "label": "紫云苗族布依族自治县", + "value": "520425" + } + ], + [{ + "label": "七星关区", + "value": "520502" + }, + { + "label": "大方县", + "value": "520521" + }, + { + "label": "黔西县", + "value": "520522" + }, + { + "label": "金沙县", + "value": "520523" + }, + { + "label": "织金县", + "value": "520524" + }, + { + "label": "纳雍县", + "value": "520525" + }, + { + "label": "威宁彝族回族苗族自治县", + "value": "520526" + }, + { + "label": "赫章县", + "value": "520527" + } + ], + [{ + "label": "碧江区", + "value": "520602" + }, + { + "label": "万山区", + "value": "520603" + }, + { + "label": "江口县", + "value": "520621" + }, + { + "label": "玉屏侗族自治县", + "value": "520622" + }, + { + "label": "石阡县", + "value": "520623" + }, + { + "label": "思南县", + "value": "520624" + }, + { + "label": "印江土家族苗族自治县", + "value": "520625" + }, + { + "label": "德江县", + "value": "520626" + }, + { + "label": "沿河土家族自治县", + "value": "520627" + }, + { + "label": "松桃苗族自治县", + "value": "520628" + } + ], + [{ + "label": "兴义市", + "value": "522301" + }, + { + "label": "兴仁县", + "value": "522322" + }, + { + "label": "普安县", + "value": "522323" + }, + { + "label": "晴隆县", + "value": "522324" + }, + { + "label": "贞丰县", + "value": "522325" + }, + { + "label": "望谟县", + "value": "522326" + }, + { + "label": "册亨县", + "value": "522327" + }, + { + "label": "安龙县", + "value": "522328" + } + ], + [{ + "label": "凯里市", + "value": "522601" + }, + { + "label": "黄平县", + "value": "522622" + }, + { + "label": "施秉县", + "value": "522623" + }, + { + "label": "三穗县", + "value": "522624" + }, + { + "label": "镇远县", + "value": "522625" + }, + { + "label": "岑巩县", + "value": "522626" + }, + { + "label": "天柱县", + "value": "522627" + }, + { + "label": "锦屏县", + "value": "522628" + }, + { + "label": "剑河县", + "value": "522629" + }, + { + "label": "台江县", + "value": "522630" + }, + { + "label": "黎平县", + "value": "522631" + }, + { + "label": "榕江县", + "value": "522632" + }, + { + "label": "从江县", + "value": "522633" + }, + { + "label": "雷山县", + "value": "522634" + }, + { + "label": "麻江县", + "value": "522635" + }, + { + "label": "丹寨县", + "value": "522636" + } + ], + [{ + "label": "都匀市", + "value": "522701" + }, + { + "label": "福泉市", + "value": "522702" + }, + { + "label": "荔波县", + "value": "522722" + }, + { + "label": "贵定县", + "value": "522723" + }, + { + "label": "瓮安县", + "value": "522725" + }, + { + "label": "独山县", + "value": "522726" + }, + { + "label": "平塘县", + "value": "522727" + }, + { + "label": "罗甸县", + "value": "522728" + }, + { + "label": "长顺县", + "value": "522729" + }, + { + "label": "龙里县", + "value": "522730" + }, + { + "label": "惠水县", + "value": "522731" + }, + { + "label": "三都水族自治县", + "value": "522732" + } + ] + ], + [ + [{ + "label": "五华区", + "value": "530102" + }, + { + "label": "盘龙区", + "value": "530103" + }, + { + "label": "官渡区", + "value": "530111" + }, + { + "label": "西山区", + "value": "530112" + }, + { + "label": "东川区", + "value": "530113" + }, + { + "label": "呈贡区", + "value": "530114" + }, + { + "label": "晋宁区", + "value": "530115" + }, + { + "label": "富民县", + "value": "530124" + }, + { + "label": "宜良县", + "value": "530125" + }, + { + "label": "石林彝族自治县", + "value": "530126" + }, + { + "label": "嵩明县", + "value": "530127" + }, + { + "label": "禄劝彝族苗族自治县", + "value": "530128" + }, + { + "label": "寻甸回族彝族自治县", + "value": "530129" + }, + { + "label": "安宁市", + "value": "530181" + } + ], + [{ + "label": "麒麟区", + "value": "530302" + }, + { + "label": "沾益区", + "value": "530303" + }, + { + "label": "马龙县", + "value": "530321" + }, + { + "label": "陆良县", + "value": "530322" + }, + { + "label": "师宗县", + "value": "530323" + }, + { + "label": "罗平县", + "value": "530324" + }, + { + "label": "富源县", + "value": "530325" + }, + { + "label": "会泽县", + "value": "530326" + }, + { + "label": "宣威市", + "value": "530381" + } + ], + [{ + "label": "红塔区", + "value": "530402" + }, + { + "label": "江川区", + "value": "530403" + }, + { + "label": "澄江县", + "value": "530422" + }, + { + "label": "通海县", + "value": "530423" + }, + { + "label": "华宁县", + "value": "530424" + }, + { + "label": "易门县", + "value": "530425" + }, + { + "label": "峨山彝族自治县", + "value": "530426" + }, + { + "label": "新平彝族傣族自治县", + "value": "530427" + }, + { + "label": "元江哈尼族彝族傣族自治县", + "value": "530428" + } + ], + [{ + "label": "隆阳区", + "value": "530502" + }, + { + "label": "施甸县", + "value": "530521" + }, + { + "label": "龙陵县", + "value": "530523" + }, + { + "label": "昌宁县", + "value": "530524" + }, + { + "label": "腾冲市", + "value": "530581" + } + ], + [{ + "label": "昭阳区", + "value": "530602" + }, + { + "label": "鲁甸县", + "value": "530621" + }, + { + "label": "巧家县", + "value": "530622" + }, + { + "label": "盐津县", + "value": "530623" + }, + { + "label": "大关县", + "value": "530624" + }, + { + "label": "永善县", + "value": "530625" + }, + { + "label": "绥江县", + "value": "530626" + }, + { + "label": "镇雄县", + "value": "530627" + }, + { + "label": "彝良县", + "value": "530628" + }, + { + "label": "威信县", + "value": "530629" + }, + { + "label": "水富县", + "value": "530630" + } + ], + [{ + "label": "古城区", + "value": "530702" + }, + { + "label": "玉龙纳西族自治县", + "value": "530721" + }, + { + "label": "永胜县", + "value": "530722" + }, + { + "label": "华坪县", + "value": "530723" + }, + { + "label": "宁蒗彝族自治县", + "value": "530724" + } + ], + [{ + "label": "思茅区", + "value": "530802" + }, + { + "label": "宁洱哈尼族彝族自治县", + "value": "530821" + }, + { + "label": "墨江哈尼族自治县", + "value": "530822" + }, + { + "label": "景东彝族自治县", + "value": "530823" + }, + { + "label": "景谷傣族彝族自治县", + "value": "530824" + }, + { + "label": "镇沅彝族哈尼族拉祜族自治县", + "value": "530825" + }, + { + "label": "江城哈尼族彝族自治县", + "value": "530826" + }, + { + "label": "孟连傣族拉祜族佤族自治县", + "value": "530827" + }, + { + "label": "澜沧拉祜族自治县", + "value": "530828" + }, + { + "label": "西盟佤族自治县", + "value": "530829" + } + ], + [{ + "label": "临翔区", + "value": "530902" + }, + { + "label": "凤庆县", + "value": "530921" + }, + { + "label": "云县", + "value": "530922" + }, + { + "label": "永德县", + "value": "530923" + }, + { + "label": "镇康县", + "value": "530924" + }, + { + "label": "双江拉祜族佤族布朗族傣族自治县", + "value": "530925" + }, + { + "label": "耿马傣族佤族自治县", + "value": "530926" + }, + { + "label": "沧源佤族自治县", + "value": "530927" + } + ], + [{ + "label": "楚雄市", + "value": "532301" + }, + { + "label": "双柏县", + "value": "532322" + }, + { + "label": "牟定县", + "value": "532323" + }, + { + "label": "南华县", + "value": "532324" + }, + { + "label": "姚安县", + "value": "532325" + }, + { + "label": "大姚县", + "value": "532326" + }, + { + "label": "永仁县", + "value": "532327" + }, + { + "label": "元谋县", + "value": "532328" + }, + { + "label": "武定县", + "value": "532329" + }, + { + "label": "禄丰县", + "value": "532331" + } + ], + [{ + "label": "个旧市", + "value": "532501" + }, + { + "label": "开远市", + "value": "532502" + }, + { + "label": "蒙自市", + "value": "532503" + }, + { + "label": "弥勒市", + "value": "532504" + }, + { + "label": "屏边苗族自治县", + "value": "532523" + }, + { + "label": "建水县", + "value": "532524" + }, + { + "label": "石屏县", + "value": "532525" + }, + { + "label": "泸西县", + "value": "532527" + }, + { + "label": "元阳县", + "value": "532528" + }, + { + "label": "红河县", + "value": "532529" + }, + { + "label": "金平苗族瑶族傣族自治县", + "value": "532530" + }, + { + "label": "绿春县", + "value": "532531" + }, + { + "label": "河口瑶族自治县", + "value": "532532" + } + ], + [{ + "label": "文山市", + "value": "532601" + }, + { + "label": "砚山县", + "value": "532622" + }, + { + "label": "西畴县", + "value": "532623" + }, + { + "label": "麻栗坡县", + "value": "532624" + }, + { + "label": "马关县", + "value": "532625" + }, + { + "label": "丘北县", + "value": "532626" + }, + { + "label": "广南县", + "value": "532627" + }, + { + "label": "富宁县", + "value": "532628" + } + ], + [{ + "label": "景洪市", + "value": "532801" + }, + { + "label": "勐海县", + "value": "532822" + }, + { + "label": "勐腊县", + "value": "532823" + } + ], + [{ + "label": "大理市", + "value": "532901" + }, + { + "label": "漾濞彝族自治县", + "value": "532922" + }, + { + "label": "祥云县", + "value": "532923" + }, + { + "label": "宾川县", + "value": "532924" + }, + { + "label": "弥渡县", + "value": "532925" + }, + { + "label": "南涧彝族自治县", + "value": "532926" + }, + { + "label": "巍山彝族回族自治县", + "value": "532927" + }, + { + "label": "永平县", + "value": "532928" + }, + { + "label": "云龙县", + "value": "532929" + }, + { + "label": "洱源县", + "value": "532930" + }, + { + "label": "剑川县", + "value": "532931" + }, + { + "label": "鹤庆县", + "value": "532932" + } + ], + [{ + "label": "瑞丽市", + "value": "533102" + }, + { + "label": "芒市", + "value": "533103" + }, + { + "label": "梁河县", + "value": "533122" + }, + { + "label": "盈江县", + "value": "533123" + }, + { + "label": "陇川县", + "value": "533124" + } + ], + [{ + "label": "泸水市", + "value": "533301" + }, + { + "label": "福贡县", + "value": "533323" + }, + { + "label": "贡山独龙族怒族自治县", + "value": "533324" + }, + { + "label": "兰坪白族普米族自治县", + "value": "533325" + } + ], + [{ + "label": "香格里拉市", + "value": "533401" + }, + { + "label": "德钦县", + "value": "533422" + }, + { + "label": "维西傈僳族自治县", + "value": "533423" + } + ] + ], + [ + [{ + "label": "城关区", + "value": "540102" + }, + { + "label": "堆龙德庆区", + "value": "540103" + }, + { + "label": "林周县", + "value": "540121" + }, + { + "label": "当雄县", + "value": "540122" + }, + { + "label": "尼木县", + "value": "540123" + }, + { + "label": "曲水县", + "value": "540124" + }, + { + "label": "达孜县", + "value": "540126" + }, + { + "label": "墨竹工卡县", + "value": "540127" + }, + { + "label": "格尔木藏青工业园区", + "value": "540171" + }, + { + "label": "拉萨经济技术开发区", + "value": "540172" + }, + { + "label": "西藏文化旅游创意园区", + "value": "540173" + }, + { + "label": "达孜工业园区", + "value": "540174" + } + ], + [{ + "label": "桑珠孜区", + "value": "540202" + }, + { + "label": "南木林县", + "value": "540221" + }, + { + "label": "江孜县", + "value": "540222" + }, + { + "label": "定日县", + "value": "540223" + }, + { + "label": "萨迦县", + "value": "540224" + }, + { + "label": "拉孜县", + "value": "540225" + }, + { + "label": "昂仁县", + "value": "540226" + }, + { + "label": "谢通门县", + "value": "540227" + }, + { + "label": "白朗县", + "value": "540228" + }, + { + "label": "仁布县", + "value": "540229" + }, + { + "label": "康马县", + "value": "540230" + }, + { + "label": "定结县", + "value": "540231" + }, + { + "label": "仲巴县", + "value": "540232" + }, + { + "label": "亚东县", + "value": "540233" + }, + { + "label": "吉隆县", + "value": "540234" + }, + { + "label": "聂拉木县", + "value": "540235" + }, + { + "label": "萨嘎县", + "value": "540236" + }, + { + "label": "岗巴县", + "value": "540237" + } + ], + [{ + "label": "卡若区", + "value": "540302" + }, + { + "label": "江达县", + "value": "540321" + }, + { + "label": "贡觉县", + "value": "540322" + }, + { + "label": "类乌齐县", + "value": "540323" + }, + { + "label": "丁青县", + "value": "540324" + }, + { + "label": "察雅县", + "value": "540325" + }, + { + "label": "八宿县", + "value": "540326" + }, + { + "label": "左贡县", + "value": "540327" + }, + { + "label": "芒康县", + "value": "540328" + }, + { + "label": "洛隆县", + "value": "540329" + }, + { + "label": "边坝县", + "value": "540330" + } + ], + [{ + "label": "巴宜区", + "value": "540402" + }, + { + "label": "工布江达县", + "value": "540421" + }, + { + "label": "米林县", + "value": "540422" + }, + { + "label": "墨脱县", + "value": "540423" + }, + { + "label": "波密县", + "value": "540424" + }, + { + "label": "察隅县", + "value": "540425" + }, + { + "label": "朗县", + "value": "540426" + } + ], + [{ + "label": "乃东区", + "value": "540502" + }, + { + "label": "扎囊县", + "value": "540521" + }, + { + "label": "贡嘎县", + "value": "540522" + }, + { + "label": "桑日县", + "value": "540523" + }, + { + "label": "琼结县", + "value": "540524" + }, + { + "label": "曲松县", + "value": "540525" + }, + { + "label": "措美县", + "value": "540526" + }, + { + "label": "洛扎县", + "value": "540527" + }, + { + "label": "加查县", + "value": "540528" + }, + { + "label": "隆子县", + "value": "540529" + }, + { + "label": "错那县", + "value": "540530" + }, + { + "label": "浪卡子县", + "value": "540531" + } + ], + [{ + "label": "那曲县", + "value": "542421" + }, + { + "label": "嘉黎县", + "value": "542422" + }, + { + "label": "比如县", + "value": "542423" + }, + { + "label": "聂荣县", + "value": "542424" + }, + { + "label": "安多县", + "value": "542425" + }, + { + "label": "申扎县", + "value": "542426" + }, + { + "label": "索县", + "value": "542427" + }, + { + "label": "班戈县", + "value": "542428" + }, + { + "label": "巴青县", + "value": "542429" + }, + { + "label": "尼玛县", + "value": "542430" + }, + { + "label": "双湖县", + "value": "542431" + } + ], + [{ + "label": "普兰县", + "value": "542521" + }, + { + "label": "札达县", + "value": "542522" + }, + { + "label": "噶尔县", + "value": "542523" + }, + { + "label": "日土县", + "value": "542524" + }, + { + "label": "革吉县", + "value": "542525" + }, + { + "label": "改则县", + "value": "542526" + }, + { + "label": "措勤县", + "value": "542527" + } + ] + ], + [ + [{ + "label": "新城区", + "value": "610102" + }, + { + "label": "碑林区", + "value": "610103" + }, + { + "label": "莲湖区", + "value": "610104" + }, + { + "label": "灞桥区", + "value": "610111" + }, + { + "label": "未央区", + "value": "610112" + }, + { + "label": "雁塔区", + "value": "610113" + }, + { + "label": "阎良区", + "value": "610114" + }, + { + "label": "临潼区", + "value": "610115" + }, + { + "label": "长安区", + "value": "610116" + }, + { + "label": "高陵区", + "value": "610117" + }, + { + "label": "鄠邑区", + "value": "610118" + }, + { + "label": "蓝田县", + "value": "610122" + }, + { + "label": "周至县", + "value": "610124" + } + ], + [{ + "label": "王益区", + "value": "610202" + }, + { + "label": "印台区", + "value": "610203" + }, + { + "label": "耀州区", + "value": "610204" + }, + { + "label": "宜君县", + "value": "610222" + } + ], + [{ + "label": "渭滨区", + "value": "610302" + }, + { + "label": "金台区", + "value": "610303" + }, + { + "label": "陈仓区", + "value": "610304" + }, + { + "label": "凤翔县", + "value": "610322" + }, + { + "label": "岐山县", + "value": "610323" + }, + { + "label": "扶风县", + "value": "610324" + }, + { + "label": "眉县", + "value": "610326" + }, + { + "label": "陇县", + "value": "610327" + }, + { + "label": "千阳县", + "value": "610328" + }, + { + "label": "麟游县", + "value": "610329" + }, + { + "label": "凤县", + "value": "610330" + }, + { + "label": "太白县", + "value": "610331" + } + ], + [{ + "label": "秦都区", + "value": "610402" + }, + { + "label": "杨陵区", + "value": "610403" + }, + { + "label": "渭城区", + "value": "610404" + }, + { + "label": "三原县", + "value": "610422" + }, + { + "label": "泾阳县", + "value": "610423" + }, + { + "label": "乾县", + "value": "610424" + }, + { + "label": "礼泉县", + "value": "610425" + }, + { + "label": "永寿县", + "value": "610426" + }, + { + "label": "彬县", + "value": "610427" + }, + { + "label": "长武县", + "value": "610428" + }, + { + "label": "旬邑县", + "value": "610429" + }, + { + "label": "淳化县", + "value": "610430" + }, + { + "label": "武功县", + "value": "610431" + }, + { + "label": "兴平市", + "value": "610481" + } + ], + [{ + "label": "临渭区", + "value": "610502" + }, + { + "label": "华州区", + "value": "610503" + }, + { + "label": "潼关县", + "value": "610522" + }, + { + "label": "大荔县", + "value": "610523" + }, + { + "label": "合阳县", + "value": "610524" + }, + { + "label": "澄城县", + "value": "610525" + }, + { + "label": "蒲城县", + "value": "610526" + }, + { + "label": "白水县", + "value": "610527" + }, + { + "label": "富平县", + "value": "610528" + }, + { + "label": "韩城市", + "value": "610581" + }, + { + "label": "华阴市", + "value": "610582" + } + ], + [{ + "label": "宝塔区", + "value": "610602" + }, + { + "label": "安塞区", + "value": "610603" + }, + { + "label": "延长县", + "value": "610621" + }, + { + "label": "延川县", + "value": "610622" + }, + { + "label": "子长县", + "value": "610623" + }, + { + "label": "志丹县", + "value": "610625" + }, + { + "label": "吴起县", + "value": "610626" + }, + { + "label": "甘泉县", + "value": "610627" + }, + { + "label": "富县", + "value": "610628" + }, + { + "label": "洛川县", + "value": "610629" + }, + { + "label": "宜川县", + "value": "610630" + }, + { + "label": "黄龙县", + "value": "610631" + }, + { + "label": "黄陵县", + "value": "610632" + } + ], + [{ + "label": "汉台区", + "value": "610702" + }, + { + "label": "南郑区", + "value": "610703" + }, + { + "label": "城固县", + "value": "610722" + }, + { + "label": "洋县", + "value": "610723" + }, + { + "label": "西乡县", + "value": "610724" + }, + { + "label": "勉县", + "value": "610725" + }, + { + "label": "宁强县", + "value": "610726" + }, + { + "label": "略阳县", + "value": "610727" + }, + { + "label": "镇巴县", + "value": "610728" + }, + { + "label": "留坝县", + "value": "610729" + }, + { + "label": "佛坪县", + "value": "610730" + } + ], + [{ + "label": "榆阳区", + "value": "610802" + }, + { + "label": "横山区", + "value": "610803" + }, + { + "label": "府谷县", + "value": "610822" + }, + { + "label": "靖边县", + "value": "610824" + }, + { + "label": "定边县", + "value": "610825" + }, + { + "label": "绥德县", + "value": "610826" + }, + { + "label": "米脂县", + "value": "610827" + }, + { + "label": "佳县", + "value": "610828" + }, + { + "label": "吴堡县", + "value": "610829" + }, + { + "label": "清涧县", + "value": "610830" + }, + { + "label": "子洲县", + "value": "610831" + }, + { + "label": "神木市", + "value": "610881" + } + ], + [{ + "label": "汉滨区", + "value": "610902" + }, + { + "label": "汉阴县", + "value": "610921" + }, + { + "label": "石泉县", + "value": "610922" + }, + { + "label": "宁陕县", + "value": "610923" + }, + { + "label": "紫阳县", + "value": "610924" + }, + { + "label": "岚皋县", + "value": "610925" + }, + { + "label": "平利县", + "value": "610926" + }, + { + "label": "镇坪县", + "value": "610927" + }, + { + "label": "旬阳县", + "value": "610928" + }, + { + "label": "白河县", + "value": "610929" + } + ], + [{ + "label": "商州区", + "value": "611002" + }, + { + "label": "洛南县", + "value": "611021" + }, + { + "label": "丹凤县", + "value": "611022" + }, + { + "label": "商南县", + "value": "611023" + }, + { + "label": "山阳县", + "value": "611024" + }, + { + "label": "镇安县", + "value": "611025" + }, + { + "label": "柞水县", + "value": "611026" + } + ] + ], + [ + [{ + "label": "城关区", + "value": "620102" + }, + { + "label": "七里河区", + "value": "620103" + }, + { + "label": "西固区", + "value": "620104" + }, + { + "label": "安宁区", + "value": "620105" + }, + { + "label": "红古区", + "value": "620111" + }, + { + "label": "永登县", + "value": "620121" + }, + { + "label": "皋兰县", + "value": "620122" + }, + { + "label": "榆中县", + "value": "620123" + }, + { + "label": "兰州新区", + "value": "620171" + } + ], + [{ + "label": "嘉峪关市", + "value": "620201" + }], + [{ + "label": "金川区", + "value": "620302" + }, + { + "label": "永昌县", + "value": "620321" + } + ], + [{ + "label": "白银区", + "value": "620402" + }, + { + "label": "平川区", + "value": "620403" + }, + { + "label": "靖远县", + "value": "620421" + }, + { + "label": "会宁县", + "value": "620422" + }, + { + "label": "景泰县", + "value": "620423" + } + ], + [{ + "label": "秦州区", + "value": "620502" + }, + { + "label": "麦积区", + "value": "620503" + }, + { + "label": "清水县", + "value": "620521" + }, + { + "label": "秦安县", + "value": "620522" + }, + { + "label": "甘谷县", + "value": "620523" + }, + { + "label": "武山县", + "value": "620524" + }, + { + "label": "张家川回族自治县", + "value": "620525" + } + ], + [{ + "label": "凉州区", + "value": "620602" + }, + { + "label": "民勤县", + "value": "620621" + }, + { + "label": "古浪县", + "value": "620622" + }, + { + "label": "天祝藏族自治县", + "value": "620623" + } + ], + [{ + "label": "甘州区", + "value": "620702" + }, + { + "label": "肃南裕固族自治县", + "value": "620721" + }, + { + "label": "民乐县", + "value": "620722" + }, + { + "label": "临泽县", + "value": "620723" + }, + { + "label": "高台县", + "value": "620724" + }, + { + "label": "山丹县", + "value": "620725" + } + ], + [{ + "label": "崆峒区", + "value": "620802" + }, + { + "label": "泾川县", + "value": "620821" + }, + { + "label": "灵台县", + "value": "620822" + }, + { + "label": "崇信县", + "value": "620823" + }, + { + "label": "华亭县", + "value": "620824" + }, + { + "label": "庄浪县", + "value": "620825" + }, + { + "label": "静宁县", + "value": "620826" + }, + { + "label": "平凉工业园区", + "value": "620871" + } + ], + [{ + "label": "肃州区", + "value": "620902" + }, + { + "label": "金塔县", + "value": "620921" + }, + { + "label": "瓜州县", + "value": "620922" + }, + { + "label": "肃北蒙古族自治县", + "value": "620923" + }, + { + "label": "阿克塞哈萨克族自治县", + "value": "620924" + }, + { + "label": "玉门市", + "value": "620981" + }, + { + "label": "敦煌市", + "value": "620982" + } + ], + [{ + "label": "西峰区", + "value": "621002" + }, + { + "label": "庆城县", + "value": "621021" + }, + { + "label": "环县", + "value": "621022" + }, + { + "label": "华池县", + "value": "621023" + }, + { + "label": "合水县", + "value": "621024" + }, + { + "label": "正宁县", + "value": "621025" + }, + { + "label": "宁县", + "value": "621026" + }, + { + "label": "镇原县", + "value": "621027" + } + ], + [{ + "label": "安定区", + "value": "621102" + }, + { + "label": "通渭县", + "value": "621121" + }, + { + "label": "陇西县", + "value": "621122" + }, + { + "label": "渭源县", + "value": "621123" + }, + { + "label": "临洮县", + "value": "621124" + }, + { + "label": "漳县", + "value": "621125" + }, + { + "label": "岷县", + "value": "621126" + } + ], + [{ + "label": "武都区", + "value": "621202" + }, + { + "label": "成县", + "value": "621221" + }, + { + "label": "文县", + "value": "621222" + }, + { + "label": "宕昌县", + "value": "621223" + }, + { + "label": "康县", + "value": "621224" + }, + { + "label": "西和县", + "value": "621225" + }, + { + "label": "礼县", + "value": "621226" + }, + { + "label": "徽县", + "value": "621227" + }, + { + "label": "两当县", + "value": "621228" + } + ], + [{ + "label": "临夏市", + "value": "622901" + }, + { + "label": "临夏县", + "value": "622921" + }, + { + "label": "康乐县", + "value": "622922" + }, + { + "label": "永靖县", + "value": "622923" + }, + { + "label": "广河县", + "value": "622924" + }, + { + "label": "和政县", + "value": "622925" + }, + { + "label": "东乡族自治县", + "value": "622926" + }, + { + "label": "积石山保安族东乡族撒拉族自治县", + "value": "622927" + } + ], + [{ + "label": "合作市", + "value": "623001" + }, + { + "label": "临潭县", + "value": "623021" + }, + { + "label": "卓尼县", + "value": "623022" + }, + { + "label": "舟曲县", + "value": "623023" + }, + { + "label": "迭部县", + "value": "623024" + }, + { + "label": "玛曲县", + "value": "623025" + }, + { + "label": "碌曲县", + "value": "623026" + }, + { + "label": "夏河县", + "value": "623027" + } + ] + ], + [ + [{ + "label": "城东区", + "value": "630102" + }, + { + "label": "城中区", + "value": "630103" + }, + { + "label": "城西区", + "value": "630104" + }, + { + "label": "城北区", + "value": "630105" + }, + { + "label": "大通回族土族自治县", + "value": "630121" + }, + { + "label": "湟中县", + "value": "630122" + }, + { + "label": "湟源县", + "value": "630123" + } + ], + [{ + "label": "乐都区", + "value": "630202" + }, + { + "label": "平安区", + "value": "630203" + }, + { + "label": "民和回族土族自治县", + "value": "630222" + }, + { + "label": "互助土族自治县", + "value": "630223" + }, + { + "label": "化隆回族自治县", + "value": "630224" + }, + { + "label": "循化撒拉族自治县", + "value": "630225" + } + ], + [{ + "label": "门源回族自治县", + "value": "632221" + }, + { + "label": "祁连县", + "value": "632222" + }, + { + "label": "海晏县", + "value": "632223" + }, + { + "label": "刚察县", + "value": "632224" + } + ], + [{ + "label": "同仁县", + "value": "632321" + }, + { + "label": "尖扎县", + "value": "632322" + }, + { + "label": "泽库县", + "value": "632323" + }, + { + "label": "河南蒙古族自治县", + "value": "632324" + } + ], + [{ + "label": "共和县", + "value": "632521" + }, + { + "label": "同德县", + "value": "632522" + }, + { + "label": "贵德县", + "value": "632523" + }, + { + "label": "兴海县", + "value": "632524" + }, + { + "label": "贵南县", + "value": "632525" + } + ], + [{ + "label": "玛沁县", + "value": "632621" + }, + { + "label": "班玛县", + "value": "632622" + }, + { + "label": "甘德县", + "value": "632623" + }, + { + "label": "达日县", + "value": "632624" + }, + { + "label": "久治县", + "value": "632625" + }, + { + "label": "玛多县", + "value": "632626" + } + ], + [{ + "label": "玉树市", + "value": "632701" + }, + { + "label": "杂多县", + "value": "632722" + }, + { + "label": "称多县", + "value": "632723" + }, + { + "label": "治多县", + "value": "632724" + }, + { + "label": "囊谦县", + "value": "632725" + }, + { + "label": "曲麻莱县", + "value": "632726" + } + ], + [{ + "label": "格尔木市", + "value": "632801" + }, + { + "label": "德令哈市", + "value": "632802" + }, + { + "label": "乌兰县", + "value": "632821" + }, + { + "label": "都兰县", + "value": "632822" + }, + { + "label": "天峻县", + "value": "632823" + }, + { + "label": "大柴旦行政委员会", + "value": "632857" + }, + { + "label": "冷湖行政委员会", + "value": "632858" + }, + { + "label": "茫崖行政委员会", + "value": "632859" + } + ] + ], + [ + [{ + "label": "兴庆区", + "value": "640104" + }, + { + "label": "西夏区", + "value": "640105" + }, + { + "label": "金凤区", + "value": "640106" + }, + { + "label": "永宁县", + "value": "640121" + }, + { + "label": "贺兰县", + "value": "640122" + }, + { + "label": "灵武市", + "value": "640181" + } + ], + [{ + "label": "大武口区", + "value": "640202" + }, + { + "label": "惠农区", + "value": "640205" + }, + { + "label": "平罗县", + "value": "640221" + } + ], + [{ + "label": "利通区", + "value": "640302" + }, + { + "label": "红寺堡区", + "value": "640303" + }, + { + "label": "盐池县", + "value": "640323" + }, + { + "label": "同心县", + "value": "640324" + }, + { + "label": "青铜峡市", + "value": "640381" + } + ], + [{ + "label": "原州区", + "value": "640402" + }, + { + "label": "西吉县", + "value": "640422" + }, + { + "label": "隆德县", + "value": "640423" + }, + { + "label": "泾源县", + "value": "640424" + }, + { + "label": "彭阳县", + "value": "640425" + } + ], + [{ + "label": "沙坡头区", + "value": "640502" + }, + { + "label": "中宁县", + "value": "640521" + }, + { + "label": "海原县", + "value": "640522" + } + ] + ], + [ + [{ + "label": "天山区", + "value": "650102" + }, + { + "label": "沙依巴克区", + "value": "650103" + }, + { + "label": "新市区", + "value": "650104" + }, + { + "label": "水磨沟区", + "value": "650105" + }, + { + "label": "头屯河区", + "value": "650106" + }, + { + "label": "达坂城区", + "value": "650107" + }, + { + "label": "米东区", + "value": "650109" + }, + { + "label": "乌鲁木齐县", + "value": "650121" + }, + { + "label": "乌鲁木齐经济技术开发区", + "value": "650171" + }, + { + "label": "乌鲁木齐高新技术产业开发区", + "value": "650172" + } + ], + [{ + "label": "独山子区", + "value": "650202" + }, + { + "label": "克拉玛依区", + "value": "650203" + }, + { + "label": "白碱滩区", + "value": "650204" + }, + { + "label": "乌尔禾区", + "value": "650205" + } + ], + [{ + "label": "高昌区", + "value": "650402" + }, + { + "label": "鄯善县", + "value": "650421" + }, + { + "label": "托克逊县", + "value": "650422" + } + ], + [{ + "label": "伊州区", + "value": "650502" + }, + { + "label": "巴里坤哈萨克自治县", + "value": "650521" + }, + { + "label": "伊吾县", + "value": "650522" + } + ], + [{ + "label": "昌吉市", + "value": "652301" + }, + { + "label": "阜康市", + "value": "652302" + }, + { + "label": "呼图壁县", + "value": "652323" + }, + { + "label": "玛纳斯县", + "value": "652324" + }, + { + "label": "奇台县", + "value": "652325" + }, + { + "label": "吉木萨尔县", + "value": "652327" + }, + { + "label": "木垒哈萨克自治县", + "value": "652328" + } + ], + [{ + "label": "博乐市", + "value": "652701" + }, + { + "label": "阿拉山口市", + "value": "652702" + }, + { + "label": "精河县", + "value": "652722" + }, + { + "label": "温泉县", + "value": "652723" + } + ], + [{ + "label": "库尔勒市", + "value": "652801" + }, + { + "label": "轮台县", + "value": "652822" + }, + { + "label": "尉犁县", + "value": "652823" + }, + { + "label": "若羌县", + "value": "652824" + }, + { + "label": "且末县", + "value": "652825" + }, + { + "label": "焉耆回族自治县", + "value": "652826" + }, + { + "label": "和静县", + "value": "652827" + }, + { + "label": "和硕县", + "value": "652828" + }, + { + "label": "博湖县", + "value": "652829" + }, + { + "label": "库尔勒经济技术开发区", + "value": "652871" + } + ], + [{ + "label": "阿克苏市", + "value": "652901" + }, + { + "label": "温宿县", + "value": "652922" + }, + { + "label": "库车县", + "value": "652923" + }, + { + "label": "沙雅县", + "value": "652924" + }, + { + "label": "新和县", + "value": "652925" + }, + { + "label": "拜城县", + "value": "652926" + }, + { + "label": "乌什县", + "value": "652927" + }, + { + "label": "阿瓦提县", + "value": "652928" + }, + { + "label": "柯坪县", + "value": "652929" + } + ], + [{ + "label": "阿图什市", + "value": "653001" + }, + { + "label": "阿克陶县", + "value": "653022" + }, + { + "label": "阿合奇县", + "value": "653023" + }, + { + "label": "乌恰县", + "value": "653024" + } + ], + [{ + "label": "喀什市", + "value": "653101" + }, + { + "label": "疏附县", + "value": "653121" + }, + { + "label": "疏勒县", + "value": "653122" + }, + { + "label": "英吉沙县", + "value": "653123" + }, + { + "label": "泽普县", + "value": "653124" + }, + { + "label": "莎车县", + "value": "653125" + }, + { + "label": "叶城县", + "value": "653126" + }, + { + "label": "麦盖提县", + "value": "653127" + }, + { + "label": "岳普湖县", + "value": "653128" + }, + { + "label": "伽师县", + "value": "653129" + }, + { + "label": "巴楚县", + "value": "653130" + }, + { + "label": "塔什库尔干塔吉克自治县", + "value": "653131" + } + ], + [{ + "label": "和田市", + "value": "653201" + }, + { + "label": "和田县", + "value": "653221" + }, + { + "label": "墨玉县", + "value": "653222" + }, + { + "label": "皮山县", + "value": "653223" + }, + { + "label": "洛浦县", + "value": "653224" + }, + { + "label": "策勒县", + "value": "653225" + }, + { + "label": "于田县", + "value": "653226" + }, + { + "label": "民丰县", + "value": "653227" + } + ], + [{ + "label": "伊宁市", + "value": "654002" + }, + { + "label": "奎屯市", + "value": "654003" + }, + { + "label": "霍尔果斯市", + "value": "654004" + }, + { + "label": "伊宁县", + "value": "654021" + }, + { + "label": "察布查尔锡伯自治县", + "value": "654022" + }, + { + "label": "霍城县", + "value": "654023" + }, + { + "label": "巩留县", + "value": "654024" + }, + { + "label": "新源县", + "value": "654025" + }, + { + "label": "昭苏县", + "value": "654026" + }, + { + "label": "特克斯县", + "value": "654027" + }, + { + "label": "尼勒克县", + "value": "654028" + } + ], + [{ + "label": "塔城市", + "value": "654201" + }, + { + "label": "乌苏市", + "value": "654202" + }, + { + "label": "额敏县", + "value": "654221" + }, + { + "label": "沙湾县", + "value": "654223" + }, + { + "label": "托里县", + "value": "654224" + }, + { + "label": "裕民县", + "value": "654225" + }, + { + "label": "和布克赛尔蒙古自治县", + "value": "654226" + } + ], + [{ + "label": "阿勒泰市", + "value": "654301" + }, + { + "label": "布尔津县", + "value": "654321" + }, + { + "label": "富蕴县", + "value": "654322" + }, + { + "label": "福海县", + "value": "654323" + }, + { + "label": "哈巴河县", + "value": "654324" + }, + { + "label": "青河县", + "value": "654325" + }, + { + "label": "吉木乃县", + "value": "654326" + } + ], + [{ + "label": "石河子市", + "value": "659001" + }, + { + "label": "阿拉尔市", + "value": "659002" + }, + { + "label": "图木舒克市", + "value": "659003" + }, + { + "label": "五家渠市", + "value": "659004" + }, + { + "label": "铁门关市", + "value": "659006" + } + ] + ], + [ + [{ + "label": "台北", + "value": "660101" + }], + [{ + "label": "高雄", + "value": "660201" + }], + [{ + "label": "基隆", + "value": "660301" + }], + [{ + "label": "台中", + "value": "660401" + }], + [{ + "label": "台南", + "value": "660501" + }], + [{ + "label": "新竹", + "value": "660601" + }], + [{ + "label": "嘉义", + "value": "660701" + }], + [{ + "label": "宜兰", + "value": "660801" + }], + [{ + "label": "桃园", + "value": "660901" + }], + [{ + "label": "苗栗", + "value": "661001" + }], + [{ + "label": "彰化", + "value": "661101" + }], + [{ + "label": "南投", + "value": "661201" + }], + [{ + "label": "云林", + "value": "661301" + }], + [{ + "label": "屏东", + "value": "661401" + }], + [{ + "label": "台东", + "value": "661501" + }], + [{ + "label": "花莲", + "value": "661601" + }], + [{ + "label": "澎湖", + "value": "661701" + }] + ], + [ + [{ + "label": "香港岛", + "value": "670101" + }], + [{ + "label": "九龙", + "value": "670201" + }], + [{ + "label": "新界", + "value": "670301" + }] + ], + [ + [{ + "label": "澳门半岛", + "value": "680101" + }], + [{ + "label": "氹仔岛", + "value": "680201" + }], + [{ + "label": "路环岛", + "value": "680301" + }], + [{ + "label": "路氹城", + "value": "680401" + }] + ], + [ + [{ + "label": "钓鱼岛全岛", + "value": "690101" + }] + ] +] +export default areaData; diff --git a/components/simple-address/city-data/city.js b/components/simple-address/city-data/city.js new file mode 100644 index 0000000..703f432 --- /dev/null +++ b/components/simple-address/city-data/city.js @@ -0,0 +1,1507 @@ +/* eslint-disable */ +var cityData = [ + [{ + "label": "市辖区", + "value": "1101" + }], + [{ + "label": "市辖区", + "value": "1201" + }], + [{ + "label": "石家庄市", + "value": "1301" + }, + { + "label": "唐山市", + "value": "1302" + }, + { + "label": "秦皇岛市", + "value": "1303" + }, + { + "label": "邯郸市", + "value": "1304" + }, + { + "label": "邢台市", + "value": "1305" + }, + { + "label": "保定市", + "value": "1306" + }, + { + "label": "张家口市", + "value": "1307" + }, + { + "label": "承德市", + "value": "1308" + }, + { + "label": "沧州市", + "value": "1309" + }, + { + "label": "廊坊市", + "value": "1310" + }, + { + "label": "衡水市", + "value": "1311" + } + ], + [{ + "label": "太原市", + "value": "1401" + }, + { + "label": "大同市", + "value": "1402" + }, + { + "label": "阳泉市", + "value": "1403" + }, + { + "label": "长治市", + "value": "1404" + }, + { + "label": "晋城市", + "value": "1405" + }, + { + "label": "朔州市", + "value": "1406" + }, + { + "label": "晋中市", + "value": "1407" + }, + { + "label": "运城市", + "value": "1408" + }, + { + "label": "忻州市", + "value": "1409" + }, + { + "label": "临汾市", + "value": "1410" + }, + { + "label": "吕梁市", + "value": "1411" + } + ], + [{ + "label": "呼和浩特市", + "value": "1501" + }, + { + "label": "包头市", + "value": "1502" + }, + { + "label": "乌海市", + "value": "1503" + }, + { + "label": "赤峰市", + "value": "1504" + }, + { + "label": "通辽市", + "value": "1505" + }, + { + "label": "鄂尔多斯市", + "value": "1506" + }, + { + "label": "呼伦贝尔市", + "value": "1507" + }, + { + "label": "巴彦淖尔市", + "value": "1508" + }, + { + "label": "乌兰察布市", + "value": "1509" + }, + { + "label": "兴安盟", + "value": "1522" + }, + { + "label": "锡林郭勒盟", + "value": "1525" + }, + { + "label": "阿拉善盟", + "value": "1529" + } + ], + [{ + "label": "沈阳市", + "value": "2101" + }, + { + "label": "大连市", + "value": "2102" + }, + { + "label": "鞍山市", + "value": "2103" + }, + { + "label": "抚顺市", + "value": "2104" + }, + { + "label": "本溪市", + "value": "2105" + }, + { + "label": "丹东市", + "value": "2106" + }, + { + "label": "锦州市", + "value": "2107" + }, + { + "label": "营口市", + "value": "2108" + }, + { + "label": "阜新市", + "value": "2109" + }, + { + "label": "辽阳市", + "value": "2110" + }, + { + "label": "盘锦市", + "value": "2111" + }, + { + "label": "铁岭市", + "value": "2112" + }, + { + "label": "朝阳市", + "value": "2113" + }, + { + "label": "葫芦岛市", + "value": "2114" + } + ], + [{ + "label": "长春市", + "value": "2201" + }, + { + "label": "吉林市", + "value": "2202" + }, + { + "label": "四平市", + "value": "2203" + }, + { + "label": "辽源市", + "value": "2204" + }, + { + "label": "通化市", + "value": "2205" + }, + { + "label": "白山市", + "value": "2206" + }, + { + "label": "松原市", + "value": "2207" + }, + { + "label": "白城市", + "value": "2208" + }, + { + "label": "延边朝鲜族自治州", + "value": "2224" + } + ], + [{ + "label": "哈尔滨市", + "value": "2301" + }, + { + "label": "齐齐哈尔市", + "value": "2302" + }, + { + "label": "鸡西市", + "value": "2303" + }, + { + "label": "鹤岗市", + "value": "2304" + }, + { + "label": "双鸭山市", + "value": "2305" + }, + { + "label": "大庆市", + "value": "2306" + }, + { + "label": "伊春市", + "value": "2307" + }, + { + "label": "佳木斯市", + "value": "2308" + }, + { + "label": "七台河市", + "value": "2309" + }, + { + "label": "牡丹江市", + "value": "2310" + }, + { + "label": "黑河市", + "value": "2311" + }, + { + "label": "绥化市", + "value": "2312" + }, + { + "label": "大兴安岭地区", + "value": "2327" + } + ], + [{ + "label": "市辖区", + "value": "3101" + }], + [{ + "label": "南京市", + "value": "3201" + }, + { + "label": "无锡市", + "value": "3202" + }, + { + "label": "徐州市", + "value": "3203" + }, + { + "label": "常州市", + "value": "3204" + }, + { + "label": "苏州市", + "value": "3205" + }, + { + "label": "南通市", + "value": "3206" + }, + { + "label": "连云港市", + "value": "3207" + }, + { + "label": "淮安市", + "value": "3208" + }, + { + "label": "盐城市", + "value": "3209" + }, + { + "label": "扬州市", + "value": "3210" + }, + { + "label": "镇江市", + "value": "3211" + }, + { + "label": "泰州市", + "value": "3212" + }, + { + "label": "宿迁市", + "value": "3213" + } + ], + [{ + "label": "杭州市", + "value": "3301" + }, + { + "label": "宁波市", + "value": "3302" + }, + { + "label": "温州市", + "value": "3303" + }, + { + "label": "嘉兴市", + "value": "3304" + }, + { + "label": "湖州市", + "value": "3305" + }, + { + "label": "绍兴市", + "value": "3306" + }, + { + "label": "金华市", + "value": "3307" + }, + { + "label": "衢州市", + "value": "3308" + }, + { + "label": "舟山市", + "value": "3309" + }, + { + "label": "台州市", + "value": "3310" + }, + { + "label": "丽水市", + "value": "3311" + } + ], + [{ + "label": "合肥市", + "value": "3401" + }, + { + "label": "芜湖市", + "value": "3402" + }, + { + "label": "蚌埠市", + "value": "3403" + }, + { + "label": "淮南市", + "value": "3404" + }, + { + "label": "马鞍山市", + "value": "3405" + }, + { + "label": "淮北市", + "value": "3406" + }, + { + "label": "铜陵市", + "value": "3407" + }, + { + "label": "安庆市", + "value": "3408" + }, + { + "label": "黄山市", + "value": "3410" + }, + { + "label": "滁州市", + "value": "3411" + }, + { + "label": "阜阳市", + "value": "3412" + }, + { + "label": "宿州市", + "value": "3413" + }, + { + "label": "六安市", + "value": "3415" + }, + { + "label": "亳州市", + "value": "3416" + }, + { + "label": "池州市", + "value": "3417" + }, + { + "label": "宣城市", + "value": "3418" + } + ], + [{ + "label": "福州市", + "value": "3501" + }, + { + "label": "厦门市", + "value": "3502" + }, + { + "label": "莆田市", + "value": "3503" + }, + { + "label": "三明市", + "value": "3504" + }, + { + "label": "泉州市", + "value": "3505" + }, + { + "label": "漳州市", + "value": "3506" + }, + { + "label": "南平市", + "value": "3507" + }, + { + "label": "龙岩市", + "value": "3508" + }, + { + "label": "宁德市", + "value": "3509" + } + ], + [{ + "label": "南昌市", + "value": "3601" + }, + { + "label": "景德镇市", + "value": "3602" + }, + { + "label": "萍乡市", + "value": "3603" + }, + { + "label": "九江市", + "value": "3604" + }, + { + "label": "新余市", + "value": "3605" + }, + { + "label": "鹰潭市", + "value": "3606" + }, + { + "label": "赣州市", + "value": "3607" + }, + { + "label": "吉安市", + "value": "3608" + }, + { + "label": "宜春市", + "value": "3609" + }, + { + "label": "抚州市", + "value": "3610" + }, + { + "label": "上饶市", + "value": "3611" + } + ], + [{ + "label": "济南市", + "value": "3701" + }, + { + "label": "青岛市", + "value": "3702" + }, + { + "label": "淄博市", + "value": "3703" + }, + { + "label": "枣庄市", + "value": "3704" + }, + { + "label": "东营市", + "value": "3705" + }, + { + "label": "烟台市", + "value": "3706" + }, + { + "label": "潍坊市", + "value": "3707" + }, + { + "label": "济宁市", + "value": "3708" + }, + { + "label": "泰安市", + "value": "3709" + }, + { + "label": "威海市", + "value": "3710" + }, + { + "label": "日照市", + "value": "3711" + }, + { + "label": "莱芜市", + "value": "3712" + }, + { + "label": "临沂市", + "value": "3713" + }, + { + "label": "德州市", + "value": "3714" + }, + { + "label": "聊城市", + "value": "3715" + }, + { + "label": "滨州市", + "value": "3716" + }, + { + "label": "菏泽市", + "value": "3717" + } + ], + [{ + "label": "郑州市", + "value": "4101" + }, + { + "label": "开封市", + "value": "4102" + }, + { + "label": "洛阳市", + "value": "4103" + }, + { + "label": "平顶山市", + "value": "4104" + }, + { + "label": "安阳市", + "value": "4105" + }, + { + "label": "鹤壁市", + "value": "4106" + }, + { + "label": "新乡市", + "value": "4107" + }, + { + "label": "焦作市", + "value": "4108" + }, + { + "label": "濮阳市", + "value": "4109" + }, + { + "label": "许昌市", + "value": "4110" + }, + { + "label": "漯河市", + "value": "4111" + }, + { + "label": "三门峡市", + "value": "4112" + }, + { + "label": "南阳市", + "value": "4113" + }, + { + "label": "商丘市", + "value": "4114" + }, + { + "label": "信阳市", + "value": "4115" + }, + { + "label": "周口市", + "value": "4116" + }, + { + "label": "驻马店市", + "value": "4117" + }, + { + "label": "省直辖县级行政区划", + "value": "4190" + } + ], + [{ + "label": "武汉市", + "value": "4201" + }, + { + "label": "黄石市", + "value": "4202" + }, + { + "label": "十堰市", + "value": "4203" + }, + { + "label": "宜昌市", + "value": "4205" + }, + { + "label": "襄阳市", + "value": "4206" + }, + { + "label": "鄂州市", + "value": "4207" + }, + { + "label": "荆门市", + "value": "4208" + }, + { + "label": "孝感市", + "value": "4209" + }, + { + "label": "荆州市", + "value": "4210" + }, + { + "label": "黄冈市", + "value": "4211" + }, + { + "label": "咸宁市", + "value": "4212" + }, + { + "label": "随州市", + "value": "4213" + }, + { + "label": "恩施土家族苗族自治州", + "value": "4228" + }, + { + "label": "省直辖县级行政区划", + "value": "4290" + } + ], + [{ + "label": "长沙市", + "value": "4301" + }, + { + "label": "株洲市", + "value": "4302" + }, + { + "label": "湘潭市", + "value": "4303" + }, + { + "label": "衡阳市", + "value": "4304" + }, + { + "label": "邵阳市", + "value": "4305" + }, + { + "label": "岳阳市", + "value": "4306" + }, + { + "label": "常德市", + "value": "4307" + }, + { + "label": "张家界市", + "value": "4308" + }, + { + "label": "益阳市", + "value": "4309" + }, + { + "label": "郴州市", + "value": "4310" + }, + { + "label": "永州市", + "value": "4311" + }, + { + "label": "怀化市", + "value": "4312" + }, + { + "label": "娄底市", + "value": "4313" + }, + { + "label": "湘西土家族苗族自治州", + "value": "4331" + } + ], + [{ + "label": "广州市", + "value": "4401" + }, + { + "label": "韶关市", + "value": "4402" + }, + { + "label": "深圳市", + "value": "4403" + }, + { + "label": "珠海市", + "value": "4404" + }, + { + "label": "汕头市", + "value": "4405" + }, + { + "label": "佛山市", + "value": "4406" + }, + { + "label": "江门市", + "value": "4407" + }, + { + "label": "湛江市", + "value": "4408" + }, + { + "label": "茂名市", + "value": "4409" + }, + { + "label": "肇庆市", + "value": "4412" + }, + { + "label": "惠州市", + "value": "4413" + }, + { + "label": "梅州市", + "value": "4414" + }, + { + "label": "汕尾市", + "value": "4415" + }, + { + "label": "河源市", + "value": "4416" + }, + { + "label": "阳江市", + "value": "4417" + }, + { + "label": "清远市", + "value": "4418" + }, + { + "label": "东莞市", + "value": "4419" + }, + { + "label": "中山市", + "value": "4420" + }, + { + "label": "潮州市", + "value": "4451" + }, + { + "label": "揭阳市", + "value": "4452" + }, + { + "label": "云浮市", + "value": "4453" + } + ], + [{ + "label": "南宁市", + "value": "4501" + }, + { + "label": "柳州市", + "value": "4502" + }, + { + "label": "桂林市", + "value": "4503" + }, + { + "label": "梧州市", + "value": "4504" + }, + { + "label": "北海市", + "value": "4505" + }, + { + "label": "防城港市", + "value": "4506" + }, + { + "label": "钦州市", + "value": "4507" + }, + { + "label": "贵港市", + "value": "4508" + }, + { + "label": "玉林市", + "value": "4509" + }, + { + "label": "百色市", + "value": "4510" + }, + { + "label": "贺州市", + "value": "4511" + }, + { + "label": "河池市", + "value": "4512" + }, + { + "label": "来宾市", + "value": "4513" + }, + { + "label": "崇左市", + "value": "4514" + } + ], + [{ + "label": "海口市", + "value": "4601" + }, + { + "label": "三亚市", + "value": "4602" + }, + { + "label": "三沙市", + "value": "4603" + }, + { + "label": "儋州市", + "value": "4604" + }, + { + "label": "省直辖县级行政区划", + "value": "4690" + } + ], + [{ + "label": "市辖区", + "value": "5001" + }, + { + "label": "县", + "value": "5002" + } + ], + [{ + "label": "成都市", + "value": "5101" + }, + { + "label": "自贡市", + "value": "5103" + }, + { + "label": "攀枝花市", + "value": "5104" + }, + { + "label": "泸州市", + "value": "5105" + }, + { + "label": "德阳市", + "value": "5106" + }, + { + "label": "绵阳市", + "value": "5107" + }, + { + "label": "广元市", + "value": "5108" + }, + { + "label": "遂宁市", + "value": "5109" + }, + { + "label": "内江市", + "value": "5110" + }, + { + "label": "乐山市", + "value": "5111" + }, + { + "label": "南充市", + "value": "5113" + }, + { + "label": "眉山市", + "value": "5114" + }, + { + "label": "宜宾市", + "value": "5115" + }, + { + "label": "广安市", + "value": "5116" + }, + { + "label": "达州市", + "value": "5117" + }, + { + "label": "雅安市", + "value": "5118" + }, + { + "label": "巴中市", + "value": "5119" + }, + { + "label": "资阳市", + "value": "5120" + }, + { + "label": "阿坝藏族羌族自治州", + "value": "5132" + }, + { + "label": "甘孜藏族自治州", + "value": "5133" + }, + { + "label": "凉山彝族自治州", + "value": "5134" + } + ], + [{ + "label": "贵阳市", + "value": "5201" + }, + { + "label": "六盘水市", + "value": "5202" + }, + { + "label": "遵义市", + "value": "5203" + }, + { + "label": "安顺市", + "value": "5204" + }, + { + "label": "毕节市", + "value": "5205" + }, + { + "label": "铜仁市", + "value": "5206" + }, + { + "label": "黔西南布依族苗族自治州", + "value": "5223" + }, + { + "label": "黔东南苗族侗族自治州", + "value": "5226" + }, + { + "label": "黔南布依族苗族自治州", + "value": "5227" + } + ], + [{ + "label": "昆明市", + "value": "5301" + }, + { + "label": "曲靖市", + "value": "5303" + }, + { + "label": "玉溪市", + "value": "5304" + }, + { + "label": "保山市", + "value": "5305" + }, + { + "label": "昭通市", + "value": "5306" + }, + { + "label": "丽江市", + "value": "5307" + }, + { + "label": "普洱市", + "value": "5308" + }, + { + "label": "临沧市", + "value": "5309" + }, + { + "label": "楚雄彝族自治州", + "value": "5323" + }, + { + "label": "红河哈尼族彝族自治州", + "value": "5325" + }, + { + "label": "文山壮族苗族自治州", + "value": "5326" + }, + { + "label": "西双版纳傣族自治州", + "value": "5328" + }, + { + "label": "大理白族自治州", + "value": "5329" + }, + { + "label": "德宏傣族景颇族自治州", + "value": "5331" + }, + { + "label": "怒江傈僳族自治州", + "value": "5333" + }, + { + "label": "迪庆藏族自治州", + "value": "5334" + } + ], + [{ + "label": "拉萨市", + "value": "5401" + }, + { + "label": "日喀则市", + "value": "5402" + }, + { + "label": "昌都市", + "value": "5403" + }, + { + "label": "林芝市", + "value": "5404" + }, + { + "label": "山南市", + "value": "5405" + }, + { + "label": "那曲地区", + "value": "5424" + }, + { + "label": "阿里地区", + "value": "5425" + } + ], + [{ + "label": "西安市", + "value": "6101" + }, + { + "label": "铜川市", + "value": "6102" + }, + { + "label": "宝鸡市", + "value": "6103" + }, + { + "label": "咸阳市", + "value": "6104" + }, + { + "label": "渭南市", + "value": "6105" + }, + { + "label": "延安市", + "value": "6106" + }, + { + "label": "汉中市", + "value": "6107" + }, + { + "label": "榆林市", + "value": "6108" + }, + { + "label": "安康市", + "value": "6109" + }, + { + "label": "商洛市", + "value": "6110" + } + ], + [{ + "label": "兰州市", + "value": "6201" + }, + { + "label": "嘉峪关市", + "value": "6202" + }, + { + "label": "金昌市", + "value": "6203" + }, + { + "label": "白银市", + "value": "6204" + }, + { + "label": "天水市", + "value": "6205" + }, + { + "label": "武威市", + "value": "6206" + }, + { + "label": "张掖市", + "value": "6207" + }, + { + "label": "平凉市", + "value": "6208" + }, + { + "label": "酒泉市", + "value": "6209" + }, + { + "label": "庆阳市", + "value": "6210" + }, + { + "label": "定西市", + "value": "6211" + }, + { + "label": "陇南市", + "value": "6212" + }, + { + "label": "临夏回族自治州", + "value": "6229" + }, + { + "label": "甘南藏族自治州", + "value": "6230" + } + ], + [{ + "label": "西宁市", + "value": "6301" + }, + { + "label": "海东市", + "value": "6302" + }, + { + "label": "海北藏族自治州", + "value": "6322" + }, + { + "label": "黄南藏族自治州", + "value": "6323" + }, + { + "label": "海南藏族自治州", + "value": "6325" + }, + { + "label": "果洛藏族自治州", + "value": "6326" + }, + { + "label": "玉树藏族自治州", + "value": "6327" + }, + { + "label": "海西蒙古族藏族自治州", + "value": "6328" + } + ], + [{ + "label": "银川市", + "value": "6401" + }, + { + "label": "石嘴山市", + "value": "6402" + }, + { + "label": "吴忠市", + "value": "6403" + }, + { + "label": "固原市", + "value": "6404" + }, + { + "label": "中卫市", + "value": "6405" + } + ], + [{ + "label": "乌鲁木齐市", + "value": "6501" + }, + { + "label": "克拉玛依市", + "value": "6502" + }, + { + "label": "吐鲁番市", + "value": "6504" + }, + { + "label": "哈密市", + "value": "6505" + }, + { + "label": "昌吉回族自治州", + "value": "6523" + }, + { + "label": "博尔塔拉蒙古自治州", + "value": "6527" + }, + { + "label": "巴音郭楞蒙古自治州", + "value": "6528" + }, + { + "label": "阿克苏地区", + "value": "6529" + }, + { + "label": "克孜勒苏柯尔克孜自治州", + "value": "6530" + }, + { + "label": "喀什地区", + "value": "6531" + }, + { + "label": "和田地区", + "value": "6532" + }, + { + "label": "伊犁哈萨克自治州", + "value": "6540" + }, + { + "label": "塔城地区", + "value": "6542" + }, + { + "label": "阿勒泰地区", + "value": "6543" + }, + { + "label": "自治区直辖县级行政区划", + "value": "6590" + } + ], + [{ + "label": "台北", + "value": "6601" + }, + { + "label": "高雄", + "value": "6602" + }, + { + "label": "基隆", + "value": "6603" + }, + { + "label": "台中", + "value": "6604" + }, + { + "label": "台南", + "value": "6605" + }, + { + "label": "新竹", + "value": "6606" + }, + { + "label": "嘉义", + "value": "6607" + }, + { + "label": "宜兰", + "value": "6608" + }, + { + "label": "桃园", + "value": "6609" + }, + { + "label": "苗栗", + "value": "6610" + }, + { + "label": "彰化", + "value": "6611" + }, + { + "label": "南投", + "value": "6612" + }, + { + "label": "云林", + "value": "6613" + }, + { + "label": "屏东", + "value": "6614" + }, + { + "label": "台东", + "value": "6615" + }, + { + "label": "花莲", + "value": "6616" + }, + { + "label": "澎湖", + "value": "6617" + } + ], + [{ + "label": "香港岛", + "value": "6701" + }, + { + "label": "九龙", + "value": "6702" + }, + { + "label": "新界", + "value": "6703" + } + ], + [{ + "label": "澳门半岛", + "value": "6801" + }, + { + "label": "氹仔岛", + "value": "6802" + }, + { + "label": "路环岛", + "value": "6803" + }, + { + "label": "路氹城", + "value": "6804" + } + ], + [{ + "label": "钓鱼岛", + "value": "6901" + }, ] +] +export default cityData; diff --git a/components/simple-address/city-data/province.js b/components/simple-address/city-data/province.js new file mode 100644 index 0000000..c3ad911 --- /dev/null +++ b/components/simple-address/city-data/province.js @@ -0,0 +1,143 @@ +/* eslint-disable */ +var provinceData = [{ + "label": "北京市", + "value": "11" + }, + { + "label": "天津市", + "value": "12" + }, + { + "label": "河北省", + "value": "13" + }, + { + "label": "山西省", + "value": "14" + }, + { + "label": "内蒙古自治区", + "value": "15" + }, + { + "label": "辽宁省", + "value": "21" + }, + { + "label": "吉林省", + "value": "22" + }, + { + "label": "黑龙江省", + "value": "23" + }, + { + "label": "上海市", + "value": "31" + }, + { + "label": "江苏省", + "value": "32" + }, + { + "label": "浙江省", + "value": "33" + }, + { + "label": "安徽省", + "value": "34" + }, + { + "label": "福建省", + "value": "35" + }, + { + "label": "江西省", + "value": "36" + }, + { + "label": "山东省", + "value": "37" + }, + { + "label": "河南省", + "value": "41" + }, + { + "label": "湖北省", + "value": "42" + }, + { + "label": "湖南省", + "value": "43" + }, + { + "label": "广东省", + "value": "44" + }, + { + "label": "广西壮族自治区", + "value": "45" + }, + { + "label": "海南省", + "value": "46" + }, + { + "label": "重庆市", + "value": "50" + }, + { + "label": "四川省", + "value": "51" + }, + { + "label": "贵州省", + "value": "52" + }, + { + "label": "云南省", + "value": "53" + }, + { + "label": "西藏自治区", + "value": "54" + }, + { + "label": "陕西省", + "value": "61" + }, + { + "label": "甘肃省", + "value": "62" + }, + { + "label": "青海省", + "value": "63" + }, + { + "label": "宁夏回族自治区", + "value": "64" + }, + { + "label": "新疆维吾尔自治区", + "value": "65" + }, + { + "label": "台湾", + "value": "66" + }, + { + "label": "香港", + "value": "67" + }, + { + "label": "澳门", + "value": "68" + }, + { + "label": "钓鱼岛", + "value": "69" + } +] +export default provinceData; diff --git a/components/simple-address/simple-address.nvue b/components/simple-address/simple-address.nvue new file mode 100644 index 0000000..feb78de --- /dev/null +++ b/components/simple-address/simple-address.nvue @@ -0,0 +1,381 @@ + + + + + diff --git a/components/uni-popup/message.js b/components/uni-popup/message.js new file mode 100644 index 0000000..0ff9a02 --- /dev/null +++ b/components/uni-popup/message.js @@ -0,0 +1,22 @@ +export default { + created() { + if (this.type === 'message') { + // 不显示遮罩 + this.maskShow = false + // 获取子组件对象 + this.childrenMsg = null + } + }, + methods: { + customOpen() { + if (this.childrenMsg) { + this.childrenMsg.open() + } + }, + customClose() { + if (this.childrenMsg) { + this.childrenMsg.close() + } + } + } +} diff --git a/components/uni-popup/popup.js b/components/uni-popup/popup.js new file mode 100644 index 0000000..2a7f22f --- /dev/null +++ b/components/uni-popup/popup.js @@ -0,0 +1,25 @@ +import message from './message.js'; +// 定义 type 类型:弹出类型:top/bottom/center +const config = { + // 顶部弹出 + top:'top', + // 底部弹出 + bottom:'bottom', + // 居中弹出 + center:'center', + // 消息提示 + message:'top', + // 对话框 + dialog:'center', + // 分享 + share:'bottom', +} + +export default { + data(){ + return { + config:config + } + }, + mixins: [message], +} diff --git a/components/uni-popup/uni-popup-dialog.vue b/components/uni-popup/uni-popup-dialog.vue new file mode 100644 index 0000000..c91123c --- /dev/null +++ b/components/uni-popup/uni-popup-dialog.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/components/uni-popup/uni-popup-message.vue b/components/uni-popup/uni-popup-message.vue new file mode 100644 index 0000000..a32bd00 --- /dev/null +++ b/components/uni-popup/uni-popup-message.vue @@ -0,0 +1,116 @@ + + + + diff --git a/components/uni-popup/uni-popup-share.vue b/components/uni-popup/uni-popup-share.vue new file mode 100644 index 0000000..4c11a13 --- /dev/null +++ b/components/uni-popup/uni-popup-share.vue @@ -0,0 +1,165 @@ + + + + diff --git a/components/uni-popup/uni-popup.vue b/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..2d15d5f --- /dev/null +++ b/components/uni-popup/uni-popup.vue @@ -0,0 +1,294 @@ + + + + diff --git a/components/uni-segmented-control/uni-segmented-control.vue b/components/uni-segmented-control/uni-segmented-control.vue new file mode 100644 index 0000000..c3f7764 --- /dev/null +++ b/components/uni-segmented-control/uni-segmented-control.vue @@ -0,0 +1,134 @@ + + + + + \ No newline at end of file diff --git a/components/uni-transition/uni-transition.vue b/components/uni-transition/uni-transition.vue new file mode 100644 index 0000000..908a939 --- /dev/null +++ b/components/uni-transition/uni-transition.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/components/v-tabs/readme.md b/components/v-tabs/readme.md new file mode 100644 index 0000000..0f6f9af --- /dev/null +++ b/components/v-tabs/readme.md @@ -0,0 +1,182 @@ +## 插件说明 + +> 这是 `v-tabs` 插件的升级版本,参数上有很大变动,支持 `H5` `小程序` `手机端`,如果是在之前的插件上升级的话,请注意参数的变更,触发的事件没有变更。 + +## 使用说明 + +### 1、最基本用法 + +- 视图文件 + +```html + +``` + +- 脚本文件 + +```js +export default { + data() { + return { + current: 0, + tabs: ['军事', '国内', '新闻新闻', '军事', '国内', '新闻', '军事', '国内', '新闻'] + } + }, + methods: { + changeTab(index) { + console.log('当前选中的项:' + index) + } + } +} +``` + +### 2、平铺整个屏幕 + +- 视图文件 + +```html + +``` + +- 脚本文件 + +```js +export default { + data() { + return { + activeTab: 0 + } + } +} +``` + +### 3、胶囊用法 + +- 视图文件 + +```html + +``` + +- 脚本文件 + +```js +data() { + return { + current: 2, + tabs: [ + '军事', + '国内', + '新闻新闻', + '军事', + '国内', + '新闻', + '军事', + '国内', + '新闻', + ], + }, + methods: { + changeTab(index) { + console.log('当前选中索引:' + index) + } + } +} +``` + +## 文档说明 + +### 1、属性说明 + +| 参数 | 类型 | 默认值 | 说明 | +| :---------------: | :-----: | :-------: | :----------------------------------------: | +| value | Number | 0 | 必传(双向绑定的值) | +| color | String | '#333' | 默认文字颜色 | +| activeColor | String | '#2979ff' | 选中文字的颜色 | +| fontSize | String | '28rpx' | 默认文字大小(rpx 或 px) | +| bold | Boolean | true | 是否加粗选中项 | +| scroll | Boolean | true | 是否显示滚动条,平铺设置 false | +| height | String | '70rpx' | tab 高度(rpx 或 px) | +| lineHeight | String | '10rpx' | 滑块高度(rpx 或 px) | +| lineColor | String | '#2979ff' | 滑块的颜色 | +| lineScale | Number | 0.5 | 滑块宽度缩放值 | +| lineRadius | String | '10rpx' | 滑块圆角宽度(rpx 或 px) | +| pills | Boolean | false | 是否开启胶囊 | +| pillsColor | String | '#2979ff' | 胶囊背景颜色(rpx 或 px) | +| pillsBorderRadius | String | '10rpx' | 胶囊圆角宽度(rpx 或 px) | +| field | String | '' | 如果 tabs 子项是对象,输入需要展示的键名 | +| bgColor | String | '#fff' | 背景色,支持 linear-gradient 渐变 | +| padding | String | '0' | 整个 tab padding 属性 | +| fixed | Boolean | false | 是否固定在顶部 | +| paddingItem | String | '0 22rpx' | 选项的边距(设置上下不生效,需要设置高度) | + +### 2、事件说明 + +| 名称 | 参数 | 说明 | +| :----: | :---: | :--------------------------------: | +| change | index | 改变选中项触发, index 选中项的下标 | + +## 更新日志 + +### 2020-09-24 + +1. 修复 `v-tabs` 第一次可能出现第一个标签显示不完整的情况 +2. 修改了 `pages/tabs/order` 示例文件 + +### 2020-09-21 + +1. 修复添加 `fixed` 属性后,滚动条无效 +2. 修复选项很少的情况下,下划线计算计算错误 +3. 新增 `paddingItem` 属性,设置选项左右边距(上下边距需要设置 `height` 属性,或者设置 `padding` 属性) + +**写在最后:** +欢迎各位老铁反馈 bug ,本人后端 PHP 一枚,只是应为感兴趣前端,自己琢磨,自己搞。如果你在使用的过程中有什么不合理,需要优化的,都可以在下面评论(或加我 QQ: 1207791534),本人看见后回复、修正,感谢。 + +### 2020-09-17 + +1. 紧急修复 bug,横向滑动不了的情况 + +### 2020-09-16 + +1. 新增 `fixed` 属性,是否固定在顶部,示例地址:`pages/tabs/tabs-static` +2. 优化之前的页面结构 + +**注意:** + +1. 使用 `padding` 属性的时候,尽量不要左右边距,会导致下划线位置不对 +2. 如果不绑定 `v-model` 会导致 `change` 事件改变的时候,下划线不跟随问题 + +### 2020-09-09 + +1. 修复 `width` 错误,dom 加载的时候没有及时获取到 `data` 属性导致的。 + +### 2020-08-29 + +1. 优化异步改变 `tabs` 后,下划线不初始化问题 +2. `github` 地址上有图 2 的源码,需要的自行下载,页面路径:`pages/tabs/order` + +### 2020-08-20 + +1. 优化 `节点查询` 和 `选中渲染` +2. 优化支付宝中 `createSelectorQuery()` 的影响 + +### 2020-08-19 + +1. 优化 `change` 事件触发机制 + +### 2020-08-16 + +1. 修改默认高度为 `70rpx` +2. 新增属性 `bgColor`,可设置背景颜色,默认 `#fff` +3. 新增整个 `tab` 的 `padding` 属性,默认 `0` + +### 2020-08-13 + +1. 全新的 `v-tabs 2.0` +2. 支持 `H5` `小程序` `APP` +3. 属性高度可配置 + +## 预览 + +![v-tabs 2.0.1.gif](https://tva1.sinaimg.cn/large/007S8ZIlgy1ghsv40mj76g30ai0i2tsd.gif) +![v-tabs 2.0.2.gif](https://img-cdn-aliyun.dcloud.net.cn/stream/plugin_screens/42f3a920-a674-11ea-8a24-ffee00625e2e_1.png?v=1597912963) diff --git a/components/v-tabs/v-tabs.vue b/components/v-tabs/v-tabs.vue new file mode 100644 index 0000000..a4de780 --- /dev/null +++ b/components/v-tabs/v-tabs.vue @@ -0,0 +1,358 @@ + + + + + diff --git a/components/yzc-paykeyboard/yzc-paykeyboard.vue b/components/yzc-paykeyboard/yzc-paykeyboard.vue new file mode 100644 index 0000000..0995954 --- /dev/null +++ b/components/yzc-paykeyboard/yzc-paykeyboard.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..42c9cfd --- /dev/null +++ b/config/index.js @@ -0,0 +1,13 @@ +export const VUE_APP_API_URL = "https://shop.xdd618.com/api"; +// export const VUE_APP_API_URL = "https://www.xdd618.com/api"; + +export const SERVICE_API_URL = "https://service-test.xdd618.com/api"; +// export const SERVICE_API_URL = "https://service.xdd618.com/api"; + +export const SOCKET_URL = "wss://service-test.xdd618.com/ws"; +// export const SOCKET_URL = "wss://service.xdd618.com/ws"; + +export const VUE_APP_RESOURCES_URL = "https://www.xdd618.com/api/file/pic"; +export const STATIC_RESOURCE_URL = "https://resource.xdd618.com/image" + +export const WX_LIVE_APPID = "wx2b03c6e691cd7370"; diff --git a/libs/chat.js b/libs/chat.js new file mode 100644 index 0000000..b48e5d1 --- /dev/null +++ b/libs/chat.js @@ -0,0 +1,51 @@ +import $store from "@//store"; +import { VUE_APP_WS_URL } from "@/utils"; + +const Socket = function() { + this.ws = new WebSocket(VUE_APP_WS_URL); + this.ws.onopen = this.onOpen.bind(this); + this.ws.onerror = this.onError.bind(this); + this.ws.onmessage = this.onMessage.bind(this); + this.ws.onclose = this.onClose.bind(this); +}; + +Socket.prototype = { + vm(vm) { + this.vm = vm; + }, + close() { + clearInterval(this.timer); + this.ws.close(); + }, + onOpen: function() { + this.init(); + this.send({ + type: "login", + data: $store.state.token + }); + this.vm.$emit("socket_open"); + }, + init: function() { + var that = this; + this.timer = setInterval(function() { + that.send({ type: "ping" }); + }, 10000); + }, + send: function(data) { + return this.ws.send(JSON.stringify(data)); + }, + onMessage: function(res) { + const { type, data = {} } = JSON.parse(res.data); + this.vm.$emit(type, data); + }, + onClose: function() { + clearInterval(this.timer); + }, + onError: function(e) { + this.vm.$emit("socket_error", e); + } +}; + +Socket.prototype.constructor = Socket; + +export default Socket; diff --git a/libs/order.js b/libs/order.js new file mode 100644 index 0000000..0091705 --- /dev/null +++ b/libs/order.js @@ -0,0 +1,161 @@ +import { cancelOrder, takeOrder, delOrder, payOrder, yuePayOrder } from "@/api/order"; +import dialog from "@/utils/dialog"; +import { weappPay } from "@/libs/wechat"; + +export function cancelOrderHandle(orderId) { + return new Promise((resolve, reject) => { + uni.showModal({ + title: '提示', + content: '确认取消该订单?', + success(res) { + if (res.confirm) { + cancelOrder(orderId) + .then(res => { + uni.showToast({ + title: '取消成功', icon: 'success', duration: 2000 + }); + resolve(res); + }) + .catch(err => { + uni.showToast({ + title: '取消失败', icon: 'none', duration: 2000 + }); + reject(err); + }); + } else if (res.cancel) { + } + } + }) + }); +} + +export function takeOrderHandle(orderId) { + return new Promise((resolve, reject) => { + takeOrder(orderId) + .then(res => { + uni.showToast({ + title: '收货成功', icon: 'success', duration: 2000 + }); + resolve(res); + }) + .catch(err => { + uni.showToast({ + title: '收货失败', icon: 'none', duration: 2000 + }); + reject(err); + }); + }); +} + +export function delOrderHandle(orderId) { + return new Promise((resolve, reject) => { + dialog.confirm({ + mes: "确认删除该订单?", + opts() { + delOrder(orderId) + .then(res => { + uni.showToast({ + title: '删除成功', icon: 'success', duration: 2000 + }); + resolve(res); + }) + .catch(err => { + uni.showToast({ + title: '删除失败', icon: 'none', duration: 2000 + }); + reject(err); + }); + } + }); + }); +} + +export function payOrderHandle(orderId, type, from) { + console.log(orderId, type, from, '支付') + return new Promise((resolve, reject) => { + uni.showLoading({ title: '加载中' }) + payOrder(orderId, type, from) + .then(res => { + const data = res.data; + uni.hideLoading() + switch (data.status) { + case "WECHAT_H5_PAY": + location.replace(data.result.jsConfig.mweb_url); + reject(data); + break; + case "ORDER_EXIST": + case "EXTEND_ORDER": + case "PAY_ERROR": + case "PAY_DEFICIENCY": + uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); + reject(data); + break; + case "SUCCESS": + uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); + resolve(data); + break; + case "WECHAT_PAY": + weappPay(data.result.jsConfig).then(res => { + resolve(data); + }); + break; + case "WECHAT_APP_PAY": + weappPay(data.result.jsConfig).then(res => { + resolve(data); + }); + break; + } + }) + .catch(err => { + uni.hideLoading() + uni.showToast({ + title: '订单支付失败', icon: 'none', duration: 2000 + }); + }); + }); +} + +export function yuePayOrderHandle(orderId, type, from, passwordPay) { + console.log(orderId, type, from, '支付') + return new Promise((resolve, reject) => { + uni.showLoading({ title: '加载中' }) + yuePayOrder(orderId, type, from, passwordPay) + .then(res => { + const data = res.data; + uni.hideLoading() + switch (data.status) { + case "WECHAT_H5_PAY": + location.replace(data.result.jsConfig.mweb_url); + reject(data); + break; + case "ORDER_EXIST": + case "EXTEND_ORDER": + case "PAY_ERROR": + case "PAY_DEFICIENCY": + uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); + reject(data); + break; + case "SUCCESS": + uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); + resolve(data); + break; + case "WECHAT_PAY": + weappPay(data.result.jsConfig).then(res => { + resolve(data); + }); + break; + case "WECHAT_APP_PAY": + weappPay(data.result.jsConfig).then(res => { + resolve(data); + }); + break; + } + }) + .catch(err => { + uni.hideLoading() + uni.showToast({ + title: err.msg||'订单支付失败', icon: 'none', duration: 2000 + }); + }); + }); +} diff --git a/libs/wechat.js b/libs/wechat.js new file mode 100644 index 0000000..b95b507 --- /dev/null +++ b/libs/wechat.js @@ -0,0 +1,397 @@ +import { subscribeMessage } from '@/libs/order' +import { getProvider } from '@/utils' +import WechatJSSDK from 'wechat-jssdk/dist/client.umd' +import { getWechatConfig, wechatAuth } from '@/api/public' +import { parseQuery } from '@/utils' +import cookie from '@/utils/store/cookie' +import store from '@/store' +import dayjs from 'dayjs' + +// 支付模块 +export const weappPay = option => { + return new Promise((resolve, reject) => { + if (store.state.$deviceType == 'weixinh5') { + setTimeout(() => { + location.href = option.mweb_url + }, 100) + resolve() + return + } + if (store.state.$deviceType == 'weixin') { + pay(option) + .then(() => { + uni.showToast({ + title: '支付成功', + icon: 'success', + duration: 5000, + }) + resolve() + }) + .finally(res => { + //if(typeof(res) == "undefined") return + }) + .catch(function() { + uni.showToast({ title: '支付失败', icon: 'none', duration: 5000 }) + reject() + }) + return + } + // 吊起微信支付 + // getProvider('payment').then(provider => { + let orderInfo = { + appid: option.appid, + noncestr: option.noncestr, + package: option.package, + partnerid: option.partnerid, + prepayid: option.prepayid, + sign: option.sign, + timestamp: option.timestamp + '', + } + // 调用只接口 + uni.requestPayment({ + provider: 'wxpay', + ...option, + timestamp: orderInfo.timestamp, + orderInfo, + success: success => { + console.log(success) + uni.showToast({ + title: '支付成功', + icon: 'success', + duration: 5000, + }) + let time = setTimeout(() => { + clearTimeout(time) + resolve(success) + }, 3000) + // #ifdef MP-WEIXIN + subscribeMessage() + // #endif + }, + fail: error => { + console.log(error) + if (error.errMsg == 'requestPayment:fail cancel') { + uni.showToast({ title: '已取消支付', icon: 'none', duration: 5000 }) + } else { + uni.showToast({ title: error || error.msg, icon: 'none', duration: 5000 }) + } + reject(error) + }, + }) + // }) + }) +} + +const STATE_KEY = 'wx_authorize_state' +const WX_AUTH = 'wx_auth' +const BACK_URL = 'login_back_url' +const LOGINTYPE = 'loginType' +let instance +let wechatObj +let appId +let wechatLoading = false + +export function wechat() { + console.log('初始化微信配置') + wechatLoading = false + return new Promise((resolve, reject) => { + if (instance) return resolve(instance) + getWechatConfig() + .then(res => { + console.log(res.data) + const _wx = WechatJSSDK(res.data) + console.log(_wx) + appId = res.data.appId + wechatObj = _wx + _wx + .initialize() + .then(() => { + instance = _wx.wx + instance.initConfig = res.data + resolve(instance) + }) + .catch(error => { + console.log(error) + uni.showToast({ + title: error, + icon: 'none', + duration: 2000, + }) + reject() + }) + }) + .catch(err => { + console.log(err) + reject() + }) + }) +} + +export function clearAuthStatus() { + cookie.remove(WX_AUTH) + cookie.remove(STATE_KEY) +} + +export async function oAuth() { + console.log('处理微信授权') + console.log(store) + console.log(store.state) + return new Promise((resolve, reject) => { + // if (cookie.has(WX_AUTH)) { + if (cookie.has(WX_AUTH) && store.state.token) { + reject() + return + } + const { code } = parseQuery() + if (!code) { + toAuth() + return + } else { + auth(code) + } + resolve() + }).catch(error => { + console.log(error) + }) +} + +export async function auth(code) { + console.log('获取微信授权') + return new Promise((resolve, reject) => { + let loginType = cookie.get(LOGINTYPE) + let spread = cookie.get('spread') + console.log('微信授权登录前获取spread', spread) + wechatAuth(code, spread, loginType) + .then(({ data }) => { + console.log(data) + const expires_time = dayjs(data.expires_time) + const newTime = Math.round(new Date() / 1000) + store.commit('login', data.token, expires_time - newTime) + cookie.set(WX_AUTH, code, expires_time) + cookie.remove(STATE_KEY) + loginType && cookie.remove(LOGINTYPE) + console.log('微信公众号授权登录,获取用户信息') + store.dispatch('getUser').finally(() => { + resolve() + }) + }) + .catch(reject) + }).catch(error => { + console.log(error) + }) +} + +export async function toAuth() { + if (wechatLoading) { + return + } + wechatLoading = true + wechat().then(wx => { + location.href = getAuthUrl(appId) + }) +} + +function getAuthUrl(appId) { + // const redirect_uri = encodeURIComponent(window.location.href); + // const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index`); + + // #ifdef H5 + // #endif + cookie.set('redirect', window.location.href) + const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index`) + // const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index?path=${encodeURIComponent(window.location.href)}`); + // const redirect_uri = encodeURIComponent(`${window.location.origin}${window.location.pathname}`) + // const redirect_uri = encodeURIComponent(`${location.origin}`) + cookie.remove(BACK_URL) + const state = 'STATE' + // const state = encodeURIComponent(("" + Math.random()).split(".")[1] + "authorizestate"); + cookie.set(STATE_KEY, state) + return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect` +} + +function toPromise(fn, config = {}) { + return new Promise((resolve, reject) => { + fn({ + ...config, + success(res) { + resolve(res) + }, + fail(err) { + reject(err) + }, + complete(err) { + reject(err) + }, + cancel(err) { + reject(err) + }, + }) + }) +} + +export function pay(config) { + console.log(instance) + return toPromise(instance.chooseWXPay, config) +} + +export function openAddress() { + return new Promise((resolve, reject) => { + wechatEvevt('openAddress', {}) + .then(res => { + resolve(res) + }) + .catch(res => { + if (res.is_ready) { + res.wx.openAddress({ + fail(res) { + reject(res) + }, + success(res) { + resolve(res) + }, + }) + } else { + reject(res) + } + }) + }) +} + +export function openShareAll(config) { + config || {} + config.type = config.type == undefined ? 'link' : config.type + return new Promise(resolve => { + getWechatConfig().then(res => { + wechatObj.signSignature({ + nonceStr: res.data.nonceStr, + signature: res.data.signature, + timestamp: res.data.timestamp, + }) + instance = wechatObj.getOriginalWx() + instance.ready(() => { + instance.updateAppMessageShareData(config) + instance.updateTimelineShareData(config) + resolve() + }) + }) + }) +} + +export function openShareAppMessage(config) { + instance.updateAppMessageShareData(config) + instance.onMenuShareAppMessage && instance.onMenuShareAppMessage(config) +} + +export function openShareTimeline(config) { + instance.updateTimelineShareData(config) + instance.onMenuShareTimeline && instance.onMenuShareTimeline(config) +} + +export function wechatEvevt(name, config) { + return new Promise((resolve, reject) => { + let wx + let configDefault = { + fail(res) { + if (wx) return reject({ is_ready: true, wx: wx }) + getWechatConfig().then(res => { + wechatObj.signSignature({ + nonceStr: res.data.nonceStr, + signature: res.data.signature, + timestamp: res.data.timestamp, + }) + wx = wechatObj.getOriginalWx() + reject({ is_ready: true, wx: wx }) + }) + }, + success(res) { + resolve(res) + }, + } + Object.assign(configDefault, config) + if (typeof instance !== 'undefined') { + instance.ready(() => { + if (typeof name === 'object') { + name.forEach(item => { + instance[item] && instance[item](configDefault) + }) + } else instance[name] && instance[name](configDefault) + }) + } else { + getWechatConfig().then(res => { + const _wx = WechatJSSDK(res.data) + _wx.initialize().then(() => { + instance = _wx.getOriginalWx() + instance.ready(() => { + if (typeof name === 'object') { + name.forEach(item => { + instance[item] && instance[item](configDefault) + }) + } else instance[name] && instance[name](configDefault) + }) + }) + }) + } + }) +} + +export function ready() { + return new Promise(resolve => { + if (typeof instance !== 'undefined') { + instance.ready(() => { + resolve(instance) + }) + } else { + getWechatConfig().then(res => { + const _wx = WechatJSSDK(res.data) + _wx.initialize().then(() => { + instance = _wx.wx + instance.ready(() => { + resolve(instance) + }) + }) + }) + } + }) +} + +export function wxShowLocation() { + return new Promise(() => { + wechatEvevt('getLocation', { type: 'wgs84' }) + .then(res => { + let latitude = res.latitude // 纬度 + let longitude = res.longitude // 经度 + cookie.set(LATITUDE, latitude) + cookie.set(LONGITUDE, longitude) + }) + .catch(res => { + if (res.is_ready) { + res.wx.getLocation({ + success(res) { + let latitude = res.latitude // 纬度 + let longitude = res.longitude // 经度 + cookie.set(LATITUDE, latitude) + cookie.set(LONGITUDE, longitude) + }, + cancel() { + cookie.remove(LATITUDE) + cookie.remove(LONGITUDE) + uni.showToast({ + title: '取消获取位置', + icon: 'none', + duration: 2000, + }) + }, + fail() { + cookie.remove(LATITUDE) + cookie.remove(LONGITUDE) + uni.showToast({ + title: '授权失败', + icon: 'none', + duration: 2000, + }) + }, + }) + } + }) + }) +} diff --git a/main.js b/main.js new file mode 100644 index 0000000..491f3c2 --- /dev/null +++ b/main.js @@ -0,0 +1,187 @@ +import Vue from 'vue' +import App from './App' +import global from "./assets/script/global"; +import store from "./store"; +import schema from "async-validator"; +import dialog from "./utils/dialog"; +import mixin from '@/mixins/share-mixins.js' +import {_router, parseRoute} from "@/utils"; +import { + SERVICE_API_URL, + SOCKET_URL, + STATIC_RESOURCE_URL, + VUE_APP_API_URL, + VUE_APP_RESOURCES_URL, + WX_LIVE_APPID +} from "@/config"; +import uView from '@/uni_modules/uview-ui' + +Vue.use(uView); +Vue.mixin(mixin) +uni.$u.setConfig({ + // 修改$u.config对象的属性 + config: { + // 修改默认单位为rpx,相当于执行 uni.$u.config.unit = 'rpx' + unit: 'rpx' + }, + // 修改$u.props对象的属性 + props: { + // 修改radio组件的size参数的默认值,相当于执行 uni.$u.props.radio.size = 30 + radio: { + size: 30, + labelSize: 30, + iconSize: 25 + }, + icon: { + size: 40, + fontSize: 30 + }, + picker: { + fontSize: 30 + }, + button: { + fontSize: 30, + iconSize: 30 + }, + navbar: { + leftIconSize: 40, + titleStyle: { + fontSize: '30rpx' + } + }, + tabbar: { + size: 30 + }, + tabs: { + lineWidth: 40 + }, + search: { + searchIconSize: 40 + }, + codeInput: { + size: 60 + }, + calendar: { + rowHeight: 112 + }, + empty: { + textSize: 28 + }, + checkbox: { + fontSize: 30, + size: 30, + labelSize: 24, + iconSize: 30 + } + // 其他组件属性配置 + // ...... + } +}) + +// 注册全局组件 + +Vue.config.productionTip = false; +Vue.config.devtools = process.env.NODE_ENV !== "production"; + +Vue.prototype.$SERVICE_API_URL = SERVICE_API_URL +Vue.prototype.$SOCKET_URL = SOCKET_URL +Vue.prototype.$VUE_APP_RESOURCES_URL = VUE_APP_RESOURCES_URL +Vue.prototype.$STATIC_RESOURCE_URL = STATIC_RESOURCE_URL +Vue.prototype.$VUE_APP_API_URL = VUE_APP_API_URL +Vue.prototype.$WX_LIVE_APPID = WX_LIVE_APPID +Vue.prototype.$global = global; + +Vue.prototype.$validator = function (rule) { + return new schema(rule); +}; + +// const CACHE_KEY = "clear_0.0.1"; + +// if (!cookie.has(CACHE_KEY)) { +// cookie.clearAll(); +// cookie.set(CACHE_KEY, 1); +// } +//强制转为几位小数,不足的补0 +var forceToDecimal = function changeToDecimal(x, len, ignore = false) { + var f_x = parseFloat(x); + if (isNaN(f_x)) { + return 0; + } + var f = Math.round(f_x * 100) / 100; + if (ignore) { + f = Math.floor(f_x * 100) / 100; + } + var s = f.toString(); + var rs = s.indexOf('.'); + if (rs < 0) { + rs = s.length; + s += '.'; + } + while (s.length <= rs + len) { + s += '0'; + } + return s; +} + +//强制转为2位小数,不足的补0 +var force2Decimal = function change2Decimal(x, ignore = false) { + return forceToDecimal(x, 2, false); +} + +Vue.prototype.$force2Decimal = force2Decimal +Vue.prototype.$forceToDecimal = forceToDecimal + +Vue.config.productionTip = false +App.mpType = 'app' +Vue.prototype.$store = store +Vue.prototype.$dialog = dialog; + + +const app = new Vue(App) + +Vue.mixin({ + onLoad() { + const { + $mp + } = this.$root + this._route = parseRoute($mp) + this._data.$VUE_APP_RESOURCES_URL = VUE_APP_RESOURCES_URL; + }, + onShow() { + _router.app = this + _router.currentRoute = this._route + } +}) + +Object.defineProperty(Vue.prototype, '$yrouter', { + get() { + return _router + } +}) + +Object.defineProperty(Vue.prototype, '$yroute', { + get() { + return this._route + } +}) + +// #ifdef H5 +// H5编译的代码 +Vue.prototype.$deviceType = 'h5' +store.commit('updateDevicetype', 'h5') +// #endif + +// #ifdef APP-PLUS +// App平台编译的代码 +Vue.prototype.$deviceType = 'app' +store.commit('updateDevicetype', 'app') +Vue.prototype.$platform = uni.getSystemInfoSync().platform +// #endif + +// #ifdef MP-WEIXIN +// 微信小程序编译的代码 +Vue.prototype.$deviceType = 'routine' +store.commit('updateDevicetype', 'routine') +// #endif + +app.$mount() diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..b8bb4fc --- /dev/null +++ b/manifest.json @@ -0,0 +1,172 @@ +{ + "name": "云南香道滇官方商城", + "appid": "__UNI__C7A519E", + "description": "", + "versionName": "4.0.0", + "versionCode": 4, + "transformPx": false, + /* 5+App特有相关 */ + "app-plus": { + "usingComponents": true, + "nvueCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": false, + "waiting": false, + "autoclose": true, + "delay": 0 + }, + /* 模块配置 */ + "modules": { + "OAuth": {}, + "Payment": {}, + "Share": {} + }, + /* 应用发布信息 */ + "distribute": { + /* android打包配置 */ + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios": {}, + /* SDK配置 */ + "sdkConfigs": { + "oauth": { + "weixin": { + "appid": "wx7c84ede33062d1e4", + "appsecret": "c47ef66d3311194da44e60387d5c1abd", + "UniversalLinks": "" + } + }, + "payment": { + "weixin": { + "appid": "wx7c84ede33062d1e4", + "UniversalLinks": "" + } + }, + "share": { + "weixin": { + "appid": "wx7c84ede33062d1e4", + "UniversalLinks": "" + } + }, + "ad": {} + }, + "splashscreen": { + "ios": { + "iphone": { + "portrait-896h@3x": "unpackage/res/splash/1242+2688.png", + "portrait-896h@2x": "unpackage/res/splash/828+1792.png", + "iphonex": "unpackage/res/splash/1125+2436.png", + "retina55": "unpackage/res/splash/1142+2208.png", + "retina47": "unpackage/res/splash/750+1334.png", + "retina40": "unpackage/res/splash/640+1136.png", + "retina35": "unpackage/res/splash/640+960.png" + } + }, + "android": { + "hdpi": "unpackage/res/splash/480+762.png", + "xhdpi": "unpackage/res/splash/720+1242.png", + "xxhdpi": "unpackage/res/splash/1080+1882.png" + } + }, + "icons": { + "android": { + "hdpi": "unpackage/res/icons/72x72.png", + "xhdpi": "unpackage/res/icons/96x96.png", + "xxhdpi": "unpackage/res/icons/144x144.png", + "xxxhdpi": "unpackage/res/icons/192x192.png" + }, + "ios": { + "appstore": "unpackage/res/icons/1024x1024.png", + "ipad": { + "app": "unpackage/res/icons/76x76.png", + "app@2x": "unpackage/res/icons/152x152.png", + "notification": "unpackage/res/icons/20x20.png", + "notification@2x": "unpackage/res/icons/40x40.png", + "proapp@2x": "unpackage/res/icons/167x167.png", + "settings": "unpackage/res/icons/29x29.png", + "settings@2x": "unpackage/res/icons/58x58.png", + "spotlight": "unpackage/res/icons/40x40.png", + "spotlight@2x": "unpackage/res/icons/80x80.png" + }, + "iphone": { + "app@2x": "unpackage/res/icons/120x120.png", + "app@3x": "unpackage/res/icons/180x180.png", + "notification@2x": "unpackage/res/icons/40x40.png", + "notification@3x": "unpackage/res/icons/60x60.png", + "settings@2x": "unpackage/res/icons/58x58.png", + "settings@3x": "unpackage/res/icons/87x87.png", + "spotlight@2x": "unpackage/res/icons/80x80.png", + "spotlight@3x": "unpackage/res/icons/120x120.png" + } + } + } + } + }, + /* 快应用特有相关 */ + "quickapp": {}, + /* 小程序特有相关 */ + "mp-weixin": { + "appid": "wx9417047e1a0c340b", + "setting": { + "urlCheck": false + }, + "usingComponents": true, + "permission": { + "scope.userLocation": { + "desc": "你的位置信息将用于小程序位置接口的效果展示" + } + }, + "requiredPrivateInfos": [ + "getLocation", + "chooseLocation" + ], + "plugins": { + "live-player-plugin": { + "version": "1.3.5", + //最新直播组件版本号 + "provider": "wx2b03c6e691cd7370" + //直播appid + } + }, + "optimization": { + "subPackages": true + } + }, + "mp-alipay": { + "usingComponents": true, + "appid": "" + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "vueVersion": "2" +} diff --git a/mixins/SendVerifyCode.js b/mixins/SendVerifyCode.js new file mode 100644 index 0000000..d2133b0 --- /dev/null +++ b/mixins/SendVerifyCode.js @@ -0,0 +1,27 @@ +export default { + data() { + return { + disabled: false, + text: "获取验证码" + }; + }, + methods: { + sendCode() { + if (this.disabled) return; + this.disabled = true; + let n = 60; + this.text = "剩余 " + n + "s"; + const run = setInterval(() => { + n = n - 1; + if (n < 0) { + clearInterval(run); + } + this.text = "剩余 " + n + "s"; + if (this.text < "剩余 " + 0 + "s") { + this.disabled = false; + this.text = "重新获取"; + } + }, 1000); + } + } +}; diff --git a/mixins/mescroll-mixins.js b/mixins/mescroll-mixins.js new file mode 100644 index 0000000..2f6835d --- /dev/null +++ b/mixins/mescroll-mixins.js @@ -0,0 +1,46 @@ +//封装下拉刷新混入对象 +export default ({ getPageData}) => { + return { + data() { + return { + mescroll: null, //mescroll实例对象 + }; + }, + //注册滚动到底部的事件,用于上拉加载 + onReachBottom() { + this.mescroll && this.mescroll.onReachBottom(); + }, + //注册列表滚动事件,用于下拉刷新 + onPageScroll(e) { + this.mescroll && this.mescroll.onPageScroll(e); + }, + methods: { + + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef(); // 兼容字节跳动小程序 + }, + // 以ref的方式初始化mescroll对象 (兼容字节跳动小程序: http://www.mescroll.com/qa.html?v=20200107#q26) + mescrollInitByRef() { + if(!this.mescroll || !this.mescroll.resetUpScroll){ + let mescrollRef = this.$refs.mescrollRef; + if(mescrollRef) this.mescroll = mescrollRef.mescroll + } + }, + + /*下拉刷新的回调, 有三种处理方式: */ + downCallback(mescroll){ + // 第2种: 下拉刷新和上拉加载调同样的接口, 那以上请求可删, 直接用mescroll.resetUpScroll()代替 + mescroll.resetUpScroll(); // 重置列表为第一页 (自动执行 page.num=1, 再触发upCallback方法 ) + }, + /*上拉加载的回调*/ + upCallback(mescroll) { + getPageData.call(this,mescroll) + } + }, + mounted() { + this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况 + } + }; +}; diff --git a/mixins/share-mixins.js b/mixins/share-mixins.js new file mode 100644 index 0000000..769f6b1 --- /dev/null +++ b/mixins/share-mixins.js @@ -0,0 +1,34 @@ +export default{ + data(){ + return { + //设置默认的分享参数 + share:{ + title:'云南香道滇官方商城', + path:'/pages/Loading/index', + imageUrl:'http://admin-api.xdd618.com/file/pic/20210617211221217375.jpg', + desc:'', + content:'' + } + } + }, + onShareAppMessage(res) { + return { + title:this.share.title, + path:this.share.path, + imageUrl:this.share.imageUrl, + desc:this.share.desc, + content:this.share.content, + success(res){ + uni.showToast({ + title:'分享成功' + }) + }, + fail(res){ + uni.showToast({ + title:'分享失败', + icon:'none' + }) + } + } + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..34e955a --- /dev/null +++ b/package.json @@ -0,0 +1,123 @@ +{ + "name": "xdd_mp", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "npm run dev:h5", + "build": "npm run build:h5", + "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build", + "build:custom": "cross-env NODE_ENV=production uniapp-cli custom", + "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build", + "build:mp-360": "cross-env NODE_ENV=production UNI_PLATFORM=mp-360 vue-cli-service uni-build", + "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build", + "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build", + "build:mp-jd": "cross-env NODE_ENV=production UNI_PLATFORM=mp-jd vue-cli-service uni-build", + "build:mp-kuaishou": "cross-env NODE_ENV=production UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build", + "build:mp-lark": "cross-env NODE_ENV=production UNI_PLATFORM=mp-lark vue-cli-service uni-build", + "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build", + "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build", + "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build", + "build:mp-xhs": "cross-env NODE_ENV=production UNI_PLATFORM=mp-xhs vue-cli-service uni-build", + "build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build", + "build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build", + "build:quickapp-webview-huawei": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build", + "build:quickapp-webview-union": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build", + "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch", + "dev:custom": "cross-env NODE_ENV=development uniapp-cli custom", + "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve", + "dev:mp-360": "cross-env NODE_ENV=development UNI_PLATFORM=mp-360 vue-cli-service uni-build --watch", + "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch", + "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch", + "dev:mp-jd": "cross-env NODE_ENV=development UNI_PLATFORM=mp-jd vue-cli-service uni-build --watch", + "dev:mp-kuaishou": "cross-env NODE_ENV=development UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build --watch", + "dev:mp-lark": "cross-env NODE_ENV=development UNI_PLATFORM=mp-lark vue-cli-service uni-build --watch", + "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch", + "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch", + "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch --minimize", + "dev:mp-xhs": "cross-env NODE_ENV=development UNI_PLATFORM=mp-xhs vue-cli-service uni-build --watch", + "dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch", + "dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch", + "dev:quickapp-webview-huawei": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build --watch", + "dev:quickapp-webview-union": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build --watch", + "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js", + "serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js", + "test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i", + "test:h5": "cross-env UNI_PLATFORM=h5 jest -i", + "test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i", + "test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i", + "test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i" + }, + "dependencies": { + "@dcloudio/uni-app-plus": "^2.0.1-35320220729002", + "@dcloudio/uni-h5": "^2.0.1-35320220729002", + "@dcloudio/uni-helper-json": "*", + "@dcloudio/uni-i18n": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-360": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-alipay": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-baidu": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-jd": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-kuaishou": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-lark": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-qq": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-toutiao": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-vue": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-weixin": "^2.0.1-35320220729002", + "@dcloudio/uni-mp-xhs": "^2.0.1-35320220729002", + "@dcloudio/uni-quickapp-native": "^2.0.1-35320220729002", + "@dcloudio/uni-quickapp-webview": "^2.0.1-35320220729002", + "@dcloudio/uni-stacktracey": "^2.0.1-35320220729002", + "@dcloudio/uni-stat": "^2.0.1-35320220729002", + "@vue/shared": "^3.0.0", + "animate.css": "^3.7.2", + "async-validator": "^3.2.4", + "core-js": "^3.6.5", + "dayjs": "^1.11.2", + "flyio": "^0.6.2", + "jweixin-module": "^1.6.0", + "miniapp-color-thief": "^1.0.5", + "number-precision": "^1.5.2", + "regenerator-runtime": "^0.12.1", + "uview-ui": "2.0.31", + "vconsole": "^3.14.6", + "vue": "^2.6.11", + "vue-ydui": "^1.2.6", + "vuex": "^3.2.0", + "wechat-jssdk": "^5.0.4" + }, + "devDependencies": { + "@babel/runtime": "~7.17.9", + "@dcloudio/types": "^3.0.4", + "@dcloudio/uni-automator": "^2.0.1-35320220729002", + "@dcloudio/uni-cli-i18n": "^2.0.1-35320220729002", + "@dcloudio/uni-cli-shared": "^2.0.1-35320220729002", + "@dcloudio/uni-migration": "^2.0.1-35320220729002", + "@dcloudio/uni-template-compiler": "^2.0.1-35320220729002", + "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.1-35320220729002", + "@dcloudio/vue-cli-plugin-uni": "^2.0.1-35320220729002", + "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.1-35320220729002", + "@dcloudio/webpack-uni-mp-loader": "^2.0.1-35320220729002", + "@dcloudio/webpack-uni-pages-loader": "^2.0.1-35320220729002", + "@vue/cli-plugin-babel": "~4.5.19", + "@vue/cli-service": "~4.5.19", + "babel-plugin-import": "^1.11.0", + "cross-env": "^7.0.2", + "jest": "^25.4.0", + "less": "^4.1.0", + "less-loader": "^4.1.0", + "mini-types": "*", + "miniprogram-api-typings": "*", + "postcss-comment": "^2.0.0", + "sass": "^1.5.0", + "vue-template-compiler": "^2.6.11" + }, + "browserslist": [ + "Android >= 4.4", + "ios >= 9" + ], + "resolutions": { + "@babel/runtime": "~7.17.9" + }, + "uni-app": { + "scripts": {} + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..edb8feb --- /dev/null +++ b/pages.json @@ -0,0 +1,894 @@ +{ + "easycom": { + "^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue" + }, + "pages": [ + { + "path": "pages/Loading/index", + "style": { + "navigationBarTitleText": "香道滇", + "navigationStyle": "custom" + } + }, + { + "path": "pages/authorization/index", + "style": { + "navigationBarTitleText": "微信授权" + } + }, + { + "path": "pages/user/Login/index", + "style": { + "navigationBarTitleText": "登录" + } + }, + { + "path": "pages/user/RetrievePassword/index", + "style": { + "navigationBarTitleText": "重置密码" + } + }, + { + "path": "pages/home/index", + "style": { + "navigationBarTitleText": "香道滇", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + } + }, + { + "path": "components/chose-city/chose-city", + "style": { + "navigationBarTitleText": "选择城市" + } + }, + { + "path": "pages/foodInfomation/information", + "style": { + "navigationBarTitleText": "彩云资讯" + } + }, + { + "path": "pages/foodInfomation/foodInfomation", + "style": { + "navigationBarTitleText": "美食攻略", + "navigationStyle": "custom", + "navigationBarTextStyle": "white", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/foodInfomation/foodInfomationDetail", + "style": { + "navigationBarTitleText": "资讯详情", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/shop/GoodSearch/index", + "style": { + "navigationBarTitleText": "搜索商品" + } + }, + { + "path": "pages/shop/GoodsClass/index", + "style": { + "navigationBarTitleText": "分类", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + } + }, + { + "path": "pages/shop/ShoppingCart/index", + "style": { + "navigationBarTitleText": "购物车", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + } + }, + { + "path": "pages/shop/StoreList/index", + "style": { + "navigationBarTitleText": "商家列表" + } + }, + { + "path": "pages/shop/GoodsList/index", + "style": { + "navigationBarTitleText": "商品列表" + } + }, + { + "path": "pages/NotDefined/index", + "style": { + "navigationBarTitleText": "404" + } + }, +// { +// "path": "pages/cloud/cloud", +// "style": { +// "navigationBarTitleText": "七彩云上" +// } +// }, + { + "path": "pages/cloud/haveFun", + "style": { + "navigationBarTitleText": "寻趣味", + "navigationStyle": "custom" + } + }, + { + "path": "pages/user/User/index", + "style": { + "navigationBarTitleText": "我的", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + } + }, + { + "path": "pages/shop/GoodsCollection/index", + "style": { + "navigationBarTitleText": "商品收藏" + } + }, + { + "path": "pages/shop/EvaluateList/index", + "style": { + "navigationBarTitleText": "评价列表" + } + }, + { + "path": "pages/shop/GoodsEvaluate/index", + "style": { + "navigationBarTitleText": "商品评价" + } + }, + { + "path": "pages/shop/GoodsPromotion/index", + "style": { + "navigationBarTitleText": "促销商品" + } + }, + { + "path": "pages/shop/HotNewGoods/index", + "style": { + "navigationBarTitleText": "热门商品" + } + }, + { + "path": "pages/shop/GoodsCon/index", + "style": { + "navigationBarTitleText": "商品详情", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + } + }, + { + "path": "pages/user/address/AddAddress/index", + "style": { + "navigationBarTitleText": "新增收货地址" + } + }, + { + "path": "pages/user/UserAccount/index", + "style": { + "navigationBarTitleText": "账户余额" + } + }, + { + "path": "pages/user/address/AddressManagement/index", + "style": { + "navigationBarTitleText": "收货地址" + } + }, + { + "path": "pages/user/promotion/Poster/index", + "style": { + "navigationBarTitleText": "推广名片" + } + }, + { + "path": "pages/user/signIn/Sign/index", + "style": { + "navigationBarTitleText": "签到" + } + }, + { + "path": "pages/user/signIn/SignRecord/index", + "style": { + "navigationBarTitleText": "签到记录" + } + }, + { + "path": "pages/user/promotion/CashAudit/index", + "style": { + "navigationBarTitleText": "提现结果" + } + }, + { + "path": "pages/user/promotion/PromoterOrder/index", + "style": { + "navigationBarTitleText": "分销详情" + } + }, + { + "path": "pages/user/promotion/PromoterList/index", + "style": { + "navigationBarTitleText": "分销列表", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/user/promotion/UserPromotion/index", + "style": { + "navigationBarTitleText": "团队管理", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/user/UserBill/index", + "style": { + "navigationBarTitleText": "账单记录" + } + }, + { + "path": "pages/user/promotion/CashRecord/index", + "style": { + "navigationBarTitleText": "提现记录" + } + }, + { + "path": "pages/user/promotion/CommissionDetails/index", + "style": { + "navigationBarTitleText": "佣金明细" + } + }, + { + "path": "pages/user/signIn/Integral/index", + "style": { + "navigationBarTitleText": "我的积分" + } + }, + { + "path": "pages/user/UserVip/index", + "style": { + "navigationBarTitleText": "用户vip" + } + }, + { + "path": "pages/user/coupon/UserCoupon/index", + "style": { + "navigationBarTitleText": "优惠券" + } + }, + { + "path": "pages/user/coupon/GetCoupon/index", + "style": { + "navigationBarTitleText": "领取优惠券" + } + }, + { + "path": "pages/user/promotion/UserCash/index", + "style": { + "navigationBarTitleText": "提现" + } + }, + { + "path": "pages/user/CustomerList/index", + "style": { + "navigationBarTitleText": "客服列表" + } + }, + { + "path": "pages/user/Recharge/index", + "style": { + "navigationBarTitleText": "充值" + } + }, + { + "path": "pages/order/MyOrder/index", + "style": { + "navigationBarTitleText": "我的订单", + "navigationBarBackgroundColor": "#fff" + } + }, + { + "path": "pages/order/Logistics/index", + "style": { + "navigationBarTitleText": "查看物流" + } + }, + { + "path": "pages/order/OrderDetails/index", + "style": { + "navigationBarTitleText": "订单详情" + } + }, + { + "path": "pages/order/OrderSubmission/index", + "style": { + "navigationBarTitleText": "提交订单", + "navigationBarBackgroundColor": "#fff" + } + }, + { + "path": "pages/order/PaymentStatus/index", + "style": { + "navigationBarTitleText": "支付状态" + } + }, + { + "path": "pages/order/GoodsReturn/index", + "style": { + "navigationBarTitleText": "商品退货" + } + }, + { + "path": "pages/order/ReturnList/index", + "style": { + "navigationBarTitleText": "退货列表" + } + }, + { + "path": "pages/orderAdmin/OrderIndex/index", + "style": { + "navigationBarTitleText": "商家订单统计" + } + }, + { + "path": "pages/orderAdmin/AdminOrderList/index", + "style": { + "navigationBarTitleText": "订单" + } + }, + { + "path": "pages/orderAdmin/GoodsDeliver/index", + "style": { + "navigationBarTitleText": "发货" + } + }, + { + "path": "pages/orderAdmin/AdminOrder/index", + "style": { + "navigationBarTitleText": "商家订单列表" + } + }, + { + "path": "pages/orderAdmin/Statistics/index", + "style": { + "navigationBarTitleText": "商家统计数据" + } + }, + { + "path": "pages/orderAdmin/OrderCancellation/index", + "style": { + "navigationBarTitleText": "商家取消订单" + } + }, + { + "path": "pages/activity/Poster/index", + "style": { + "navigationBarTitleText": "推广海报" + } + }, + { + "path": "pages/activity/DargainDetails/index", + "style": { + "navigationBarTitleText": "帮砍价" + } + }, + { + "path": "pages/activity/GoodsBargain/index", + "style": { + "navigationBarTitleText": "砍价列表" + } + }, + { + "path": "pages/activity/BargainRecord/index", + "style": { + "navigationBarTitleText": "砍价记录" + } + }, + { + "path": "pages/activity/GoodsGroup/index", + "style": { + "navigationBarTitleText": "团购商品列表" + } + }, + { + "path": "pages/activity/GroupDetails/index", + "style": { + "navigationBarTitleText": "团购商品详情" + } + }, + { + "path": "pages/activity/GroupRule/index", + "style": { + "navigationBarTitleText": "团购规则" + } + }, + { + "path": "pages/activity/GoodsSeckill/index", + "style": { + "navigationBarTitleText": "秒杀" + } + }, + { + "path": "pages/activity/SeckillDetails/index", + "style": { + "navigationBarTitleText": "秒杀详情" + } + }, + { + "path": "pages/map/index", + "style": { + "navigationBarTitleText": "地图" + } + }, + { + "path": "pages/user/Message/Message", + "style": { + "navigationBarTitleText": "消息", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/user/MessageDetail/MessageDetail", + "style": { + "navigationBarTitleText": "消息详情", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/user/MemberUpgradeIntro/MemberUpgradeIntro", + "style": { + "navigationBarTitleText": "升级说明", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/VideoPlayBackList/VideoPlayBackList", + "style": { + "navigationBarTitleText": "寻看点", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/VideoPlayBackList/VideoPlayBackDetail", + "style": { + "navigationBarTitleText": "视频详情", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/user/UpgradeElectronicProtocol/UpgradeElectronicProtocol", + "style": { + "navigationBarTitleText": "升级", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "pages/user/UpgradeProtocolDetail/UpgradeProtocolDetail", + "style": { + "navigationBarTitleText": "共享股东协议" + } + }, + { + "path": "pages/LiveAndShortVideo/LiveAndShortVideo", + "style": { + "navigationBarTitleText": "直播/视频" + } + }, + { + "path": "pages/LiveBroadcastList/LiveBroadcastList", + "style": { + "navigationBarTitleText": "直播列表" + } + }, + { + "path": "pages/user/UserFavorite/UserFavorite", + "style": { + "navigationBarTitleText": "我的喜欢" + } + } + ], + "subPackages": [ + { + "root": "pagesInn", + "pages": [ + { + "path": "inn/innHome", + "style": { + "navigationBarTitleText": "", + "navigationStyle": "custom" + } + }, + { + "path": "inn/innApply", + "style": { + "navigationBarTitleText": "店铺申请" + } + }, + { + "path": "inn/innInfoPublish", + "style": { + "navigationBarTitleText": "发布店铺动态" + } + }, + { + "path": "inn/innProfileEdit", + "style": { + "navigationBarTitleText": "修改店铺资料" + } + }, + { + "path": "inn/innInfoDetail", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "inn/innPartnerAgreement", + "style": { + "navigationBarTitleText": "店主合伙人条款协议" + } + } + ] + }, + { + "root": "pkg_common", + "pages": [ + { + "path": "views/pdf", + "style": { + "navigationBarTitleText": "详情" + } + }, + { + "path": "views/room", + "style": { + "navigationBarTitleText": "客服" + } + }, + { + "path": "views/roomLogs", + "style": { + "navigationBarTitleText": "历史会话" + } + } + ] + }, + { + "root": "pkg_join", + "pages": [ + { + "path": "views/index", + "style": { + "navigationBarTitleText": "商户入驻" + } + }, + { + "path": "views/shop", + "style": { + "navigationBarTitleText": "店铺入驻" + } + }, + { + "path": "views/supplier", + "style": { + "navigationBarTitleText": "供应商入驻" + } + } + ] + }, + { + "root": "pkg_orders", + "pages": [ + { + "path": "views/refund", + "style": { + "navigationBarTitleText": "申请退款" + } + } + ] + }, + { + "root": "pkg_product", + "pages": [ + { + "path": "views/healthList", + "style": { + "navigationBarTitleText": "康养 · 食材" + } + }, + { + "path": "views/giftList", + "style": { + "navigationBarTitleText": "定制礼品", + "onReachBottomDistance": 100 + } + }, + { + "path": "views/famousList", + "style": { + "navigationBarTitleText": "千县名品" + } + }, + { + "path": "views/famousStory", + "style": { + "navigationBarTitleText": "名品故事" + } + }, + { + "path": "views/famousHot", + "style": { + "navigationBarTitleText": "爆款主推" + } + }, + { + "path": "views/scenicSpot", + "style": { + "navigationBarTitleText": "景点门票" + } + }, + { + "path": "views/seckill", + "style": { + "navigationBarTitleText": "天天秒杀" + } + }, + { + "path": "views/sharpList", + "style": { + "navigationBarTitleText": "尖货推荐" + } + }, + { + "path": "views/nativeList", + "style": { + "navigationBarTitleText": "特产", + "navigationBarTextStyle": "white", + "navigationBarBackgroundColor": "#FF564A" + } + } + ] + }, + { + "root": "pkg_user", + "pages": [ + { + "path": "views/bankCardList", + "style": { + "navigationBarTitleText": "银行卡列表", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "views/addBankCard", + "style": { + "navigationBarTitleText": "添加银行卡", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "views/withdrawal", + "style": { + "navigationBarTitleText": "提现", + "navigationBarBackgroundColor": "#FFFFFF" + } + }, + { + "path": "views/personalData", + "style": { + "navigationBarTitleText": "个人资料" + } + }, + { + "path": "views/bindPhone", + "style": { + "navigationBarTitleText": "绑定手机号" + } + }, + { + "path": "views/payPassword", + "style": { + "navigationBarTitleText": "修改支付密码" + } + } + ] + }, + { + "root": "v4", + "pages": [ + { + "path": "views/preSale/preSale", + "style": { + "navigationBarTitleText": "预售" + } + }, + { + "path": "views/seckill/seckill", + "style": { + "navigationBarTitleText": "限时秒杀" + } + }, + { + "path": "views/offer/offer", + "style": { + "navigationBarTitleText": "每天特价" + } + }, + { + "path": "components/select-city", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "views/specialty/specialty", + "style": { + "navigationBarTitleText": "特产", + "enablePullDownRefresh": true + } + }, + { + "path": "views/shop/shop", + "style": { + "navigationBarTitleText": "店铺" + } + }, + { + "path": "views/shop/detail", + "style": { + "navigationBarTitleText": "店铺详情" + } + }, + { + "path": "views/trial/trial", + "style": { + "navigationBarTitleText": "体验店" + } + }, + { + "path": "views/live/live", + "style": { + "navigationBarTitleText": "直播" + } + }, + { + "path": "views/attract/attract", + "style": { + "navigationBarTitleText": "招商" + } + }, + { + "path": "views/attract/project", + "style": { + "navigationBarTitleText": "招商项目" + } + }, + { + "path": "views/attract/projectList", + "style": { + "navigationBarTitleText": "招商项目" + } + }, + { + "path": "views/luck/luck", + "style": { + "navigationBarTitleText": "幸运抽奖" + } + }, + { + "path": "views/luck/logs", + "style": { + "navigationBarTitleText": "抽奖记录" + } + }, + { + "path": "views/luck/receive", + "style": { + "navigationBarTitleText": "选择收货地址" + } + } + ] + }, + { + "root": "wenwan", + "pages": [ + { + "path": "views/goodsClass", + "style": { + "navigationBarTitleText": "文玩" + } + }, + { + "path": "views/store", + "style": { + "navigationBarTitleText": "文玩店铺详情", + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + } + }, + { + "path": "views/storeList", + "style": { + "navigationBarTitleText": "文玩" + } + } + ] + } + ], + "preloadRule": { + "pages/user/User/index": { + "network": "all", + "packages": [ + "pagesInn" + ] + } + }, + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "color": "#8B8F99", + "selectedColor": "#FF564A", + "borderStyle": "black", + "backgroundColor": "#ffffff", + "list": [ + { + "pagePath": "pages/home/index", + "iconPath": "static/tabbar/icon-home.png", + "selectedIconPath": "static/tabbar/icon-home-hot.png", + "text": "首页" + }, + { + "pagePath": "pages/shop/ShoppingCart/index", + "iconPath": "static/tabbar/icon-cart.png", + "selectedIconPath": "static/tabbar/icon-cart-hot.png", + "text": "购物车" + }, + { + "pagePath": "pages/cloud/haveFun", + "iconPath": "static/tabbar/icon-cloud.png", + "selectedIconPath": "static/tabbar/icon-cloud-hot.png", + "text": "寻趣味" + }, + { + "pagePath": "pages/user/User/index", + "iconPath": "static/tabbar/icon-user.png", + "selectedIconPath": "static/tabbar/icon-user-hot.png", + "text": "我的" + } + ] + }, + "condition": { + "current": 0, + "list": [ + { + "name": "文玩店铺", + "path": "wenwan/views/store", + "query": "scene=id%3D74%26partnerId%3D5659" + }, + { + "name": "普通店铺", + "path": "pagesInn/inn/innHome", + "query": "scene=id%3D74%26partnerId%3D5659" + }, + { + "name": "商品详情", + "path": "pages/shop/GoodsCon/index", + "query": "scene=id%3D289%26partnerId%3D5675" + }, + { + "name": "DEBUG", + "path": "pkg_product/views/giftList", + "query": "" + } + ] + } +} diff --git a/pages/LiveAndShortVideo/LiveAndShortVideo.vue b/pages/LiveAndShortVideo/LiveAndShortVideo.vue new file mode 100644 index 0000000..85aae75 --- /dev/null +++ b/pages/LiveAndShortVideo/LiveAndShortVideo.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/pages/LiveBroadcastList/LiveBroadcastList.vue b/pages/LiveBroadcastList/LiveBroadcastList.vue new file mode 100644 index 0000000..60b28ec --- /dev/null +++ b/pages/LiveBroadcastList/LiveBroadcastList.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/pages/Loading/index.vue b/pages/Loading/index.vue new file mode 100644 index 0000000..65d2b1d --- /dev/null +++ b/pages/Loading/index.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/pages/NotDefined/index.vue b/pages/NotDefined/index.vue new file mode 100644 index 0000000..25e65c6 --- /dev/null +++ b/pages/NotDefined/index.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/pages/VideoPlayBackList/VideoPlayBackDetail.vue b/pages/VideoPlayBackList/VideoPlayBackDetail.vue new file mode 100644 index 0000000..4b8549c --- /dev/null +++ b/pages/VideoPlayBackList/VideoPlayBackDetail.vue @@ -0,0 +1,47 @@ + + + + diff --git a/pages/VideoPlayBackList/VideoPlayBackList.vue b/pages/VideoPlayBackList/VideoPlayBackList.vue new file mode 100644 index 0000000..d7339f0 --- /dev/null +++ b/pages/VideoPlayBackList/VideoPlayBackList.vue @@ -0,0 +1,175 @@ + + + + + \ No newline at end of file diff --git a/pages/activity/BargainRecord/index.vue b/pages/activity/BargainRecord/index.vue new file mode 100644 index 0000000..d90ece3 --- /dev/null +++ b/pages/activity/BargainRecord/index.vue @@ -0,0 +1,131 @@ + + diff --git a/pages/activity/DargainDetails/index.vue b/pages/activity/DargainDetails/index.vue new file mode 100644 index 0000000..65f6343 --- /dev/null +++ b/pages/activity/DargainDetails/index.vue @@ -0,0 +1,617 @@ + + + + diff --git a/pages/activity/GoodsBargain/index.vue b/pages/activity/GoodsBargain/index.vue new file mode 100644 index 0000000..8a7bf1c --- /dev/null +++ b/pages/activity/GoodsBargain/index.vue @@ -0,0 +1,84 @@ + + + + diff --git a/pages/activity/GoodsGroup/index.vue b/pages/activity/GoodsGroup/index.vue new file mode 100644 index 0000000..191b4ea --- /dev/null +++ b/pages/activity/GoodsGroup/index.vue @@ -0,0 +1,91 @@ + + diff --git a/pages/activity/GoodsSeckill/index.vue b/pages/activity/GoodsSeckill/index.vue new file mode 100644 index 0000000..beb0950 --- /dev/null +++ b/pages/activity/GoodsSeckill/index.vue @@ -0,0 +1,261 @@ + + + diff --git a/pages/activity/GroupDetails/index.vue b/pages/activity/GroupDetails/index.vue new file mode 100644 index 0000000..03e9788 --- /dev/null +++ b/pages/activity/GroupDetails/index.vue @@ -0,0 +1,375 @@ + + + + diff --git a/pages/activity/GroupRule/index.vue b/pages/activity/GroupRule/index.vue new file mode 100644 index 0000000..58ddb8f --- /dev/null +++ b/pages/activity/GroupRule/index.vue @@ -0,0 +1,248 @@ + + + + diff --git a/pages/activity/Poster/index.vue b/pages/activity/Poster/index.vue new file mode 100644 index 0000000..d1e01cb --- /dev/null +++ b/pages/activity/Poster/index.vue @@ -0,0 +1,79 @@ + + + + diff --git a/pages/activity/SeckillDetails/index.vue b/pages/activity/SeckillDetails/index.vue new file mode 100644 index 0000000..10e84f4 --- /dev/null +++ b/pages/activity/SeckillDetails/index.vue @@ -0,0 +1,235 @@ + + + + diff --git a/pages/authorization/index.vue b/pages/authorization/index.vue new file mode 100644 index 0000000..bea1e33 --- /dev/null +++ b/pages/authorization/index.vue @@ -0,0 +1,408 @@ + + + + + diff --git a/pages/authorization/index_bak.vue b/pages/authorization/index_bak.vue new file mode 100644 index 0000000..2467899 --- /dev/null +++ b/pages/authorization/index_bak.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/pages/authorization/pass.vue b/pages/authorization/pass.vue new file mode 100644 index 0000000..41a085a --- /dev/null +++ b/pages/authorization/pass.vue @@ -0,0 +1,346 @@ + + + + + diff --git a/pages/cloud/cloud.vue b/pages/cloud/cloud.vue new file mode 100644 index 0000000..a483cb1 --- /dev/null +++ b/pages/cloud/cloud.vue @@ -0,0 +1,376 @@ + + + + + diff --git a/pages/cloud/haveFun.vue b/pages/cloud/haveFun.vue new file mode 100644 index 0000000..794fd43 --- /dev/null +++ b/pages/cloud/haveFun.vue @@ -0,0 +1,341 @@ + + + + + \ No newline at end of file diff --git a/pages/foodInfomation/foodInfomation.vue b/pages/foodInfomation/foodInfomation.vue new file mode 100644 index 0000000..e0a31f4 --- /dev/null +++ b/pages/foodInfomation/foodInfomation.vue @@ -0,0 +1,973 @@ + + + + diff --git a/pages/foodInfomation/foodInfomationDetail.vue b/pages/foodInfomation/foodInfomationDetail.vue new file mode 100644 index 0000000..0cf806f --- /dev/null +++ b/pages/foodInfomation/foodInfomationDetail.vue @@ -0,0 +1,210 @@ + + + + diff --git a/pages/foodInfomation/information.vue b/pages/foodInfomation/information.vue new file mode 100644 index 0000000..fb553a5 --- /dev/null +++ b/pages/foodInfomation/information.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/pages/home/index.vue b/pages/home/index.vue new file mode 100644 index 0000000..284a3a0 --- /dev/null +++ b/pages/home/index.vue @@ -0,0 +1,2046 @@ + + + + + + + + + diff --git a/pages/map/index.vue b/pages/map/index.vue new file mode 100644 index 0000000..d0a1a4b --- /dev/null +++ b/pages/map/index.vue @@ -0,0 +1,57 @@ + + + diff --git a/pages/order/GoodsReturn/index.vue b/pages/order/GoodsReturn/index.vue new file mode 100644 index 0000000..5735fea --- /dev/null +++ b/pages/order/GoodsReturn/index.vue @@ -0,0 +1,140 @@ + + + diff --git a/pages/order/Logistics/index.vue b/pages/order/Logistics/index.vue new file mode 100644 index 0000000..2be23ea --- /dev/null +++ b/pages/order/Logistics/index.vue @@ -0,0 +1,398 @@ + + + + diff --git a/pages/order/MyOrder/index.vue b/pages/order/MyOrder/index.vue new file mode 100644 index 0000000..a5576ce --- /dev/null +++ b/pages/order/MyOrder/index.vue @@ -0,0 +1,506 @@ + + + + diff --git a/pages/order/OrderDetails/index.vue b/pages/order/OrderDetails/index.vue new file mode 100644 index 0000000..92a1101 --- /dev/null +++ b/pages/order/OrderDetails/index.vue @@ -0,0 +1,771 @@ + + + + diff --git a/pages/order/OrderSubmission/index.vue b/pages/order/OrderSubmission/index.vue new file mode 100644 index 0000000..606777d --- /dev/null +++ b/pages/order/OrderSubmission/index.vue @@ -0,0 +1,925 @@ + + + + diff --git a/pages/order/PaymentStatus/index.vue b/pages/order/PaymentStatus/index.vue new file mode 100644 index 0000000..bb9e43b --- /dev/null +++ b/pages/order/PaymentStatus/index.vue @@ -0,0 +1,34 @@ + diff --git a/pages/order/ReturnList/index.vue b/pages/order/ReturnList/index.vue new file mode 100644 index 0000000..99ab0fa --- /dev/null +++ b/pages/order/ReturnList/index.vue @@ -0,0 +1,104 @@ + + + diff --git a/pages/orderAdmin/AdminOrder/index.vue b/pages/orderAdmin/AdminOrder/index.vue new file mode 100644 index 0000000..f0f2c0d --- /dev/null +++ b/pages/orderAdmin/AdminOrder/index.vue @@ -0,0 +1,354 @@ + + diff --git a/pages/orderAdmin/AdminOrderList/index.vue b/pages/orderAdmin/AdminOrderList/index.vue new file mode 100644 index 0000000..f069b1a --- /dev/null +++ b/pages/orderAdmin/AdminOrderList/index.vue @@ -0,0 +1,330 @@ + + + + diff --git a/pages/orderAdmin/GoodsDeliver/index.vue b/pages/orderAdmin/GoodsDeliver/index.vue new file mode 100644 index 0000000..8b65932 --- /dev/null +++ b/pages/orderAdmin/GoodsDeliver/index.vue @@ -0,0 +1,231 @@ + + diff --git a/pages/orderAdmin/OrderCancellation/index.vue b/pages/orderAdmin/OrderCancellation/index.vue new file mode 100644 index 0000000..5cd553e --- /dev/null +++ b/pages/orderAdmin/OrderCancellation/index.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/pages/orderAdmin/OrderIndex/index.vue b/pages/orderAdmin/OrderIndex/index.vue new file mode 100644 index 0000000..be5faaa --- /dev/null +++ b/pages/orderAdmin/OrderIndex/index.vue @@ -0,0 +1,167 @@ + + diff --git a/pages/orderAdmin/Statistics/index.vue b/pages/orderAdmin/Statistics/index.vue new file mode 100644 index 0000000..c51f9fe --- /dev/null +++ b/pages/orderAdmin/Statistics/index.vue @@ -0,0 +1,446 @@ + + + diff --git a/pages/shop/EvaluateList/index.vue b/pages/shop/EvaluateList/index.vue new file mode 100644 index 0000000..4f36d8a --- /dev/null +++ b/pages/shop/EvaluateList/index.vue @@ -0,0 +1,115 @@ + + + diff --git a/pages/shop/GoodSearch/index.vue b/pages/shop/GoodSearch/index.vue new file mode 100644 index 0000000..a2d8f34 --- /dev/null +++ b/pages/shop/GoodSearch/index.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/pages/shop/GoodsClass/index.vue b/pages/shop/GoodsClass/index.vue new file mode 100644 index 0000000..854dddc --- /dev/null +++ b/pages/shop/GoodsClass/index.vue @@ -0,0 +1,578 @@ + + + + diff --git a/pages/shop/GoodsCollection/index.vue b/pages/shop/GoodsCollection/index.vue new file mode 100644 index 0000000..485c6fb --- /dev/null +++ b/pages/shop/GoodsCollection/index.vue @@ -0,0 +1,102 @@ + + diff --git a/pages/shop/GoodsCon/index.vue b/pages/shop/GoodsCon/index.vue new file mode 100644 index 0000000..b0d1bf5 --- /dev/null +++ b/pages/shop/GoodsCon/index.vue @@ -0,0 +1,1892 @@ + + + + + diff --git a/pages/shop/GoodsEvaluate/index.vue b/pages/shop/GoodsEvaluate/index.vue new file mode 100644 index 0000000..99c7fef --- /dev/null +++ b/pages/shop/GoodsEvaluate/index.vue @@ -0,0 +1,198 @@ + + + diff --git a/pages/shop/GoodsList/index.vue b/pages/shop/GoodsList/index.vue new file mode 100644 index 0000000..ce6af5a --- /dev/null +++ b/pages/shop/GoodsList/index.vue @@ -0,0 +1,384 @@ + + + + + diff --git a/pages/shop/GoodsPromotion/index.vue b/pages/shop/GoodsPromotion/index.vue new file mode 100644 index 0000000..8cc7da9 --- /dev/null +++ b/pages/shop/GoodsPromotion/index.vue @@ -0,0 +1,78 @@ + + diff --git a/pages/shop/HotNewGoods/index.vue b/pages/shop/HotNewGoods/index.vue new file mode 100644 index 0000000..67e0467 --- /dev/null +++ b/pages/shop/HotNewGoods/index.vue @@ -0,0 +1,99 @@ + + diff --git a/pages/shop/ShoppingCart/index.vue b/pages/shop/ShoppingCart/index.vue new file mode 100644 index 0000000..b22817e --- /dev/null +++ b/pages/shop/ShoppingCart/index.vue @@ -0,0 +1,721 @@ + + + + diff --git a/pages/shop/StoreList/index.vue b/pages/shop/StoreList/index.vue new file mode 100644 index 0000000..658c172 --- /dev/null +++ b/pages/shop/StoreList/index.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/pages/user/CustomerList/index.vue b/pages/user/CustomerList/index.vue new file mode 100644 index 0000000..d838a58 --- /dev/null +++ b/pages/user/CustomerList/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/pages/user/Login/index.vue b/pages/user/Login/index.vue new file mode 100644 index 0000000..71b18d4 --- /dev/null +++ b/pages/user/Login/index.vue @@ -0,0 +1,332 @@ + + diff --git a/pages/user/MemberUpgradeIntro/MemberUpgradeIntro.vue b/pages/user/MemberUpgradeIntro/MemberUpgradeIntro.vue new file mode 100644 index 0000000..6656c6f --- /dev/null +++ b/pages/user/MemberUpgradeIntro/MemberUpgradeIntro.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/pages/user/Message/Message.vue b/pages/user/Message/Message.vue new file mode 100644 index 0000000..e8acf9c --- /dev/null +++ b/pages/user/Message/Message.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/pages/user/MessageDetail/MessageDetail.vue b/pages/user/MessageDetail/MessageDetail.vue new file mode 100644 index 0000000..3a73650 --- /dev/null +++ b/pages/user/MessageDetail/MessageDetail.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/pages/user/ModifyPayPassword/ModifyPayPassword.vue b/pages/user/ModifyPayPassword/ModifyPayPassword.vue new file mode 100644 index 0000000..2a7a887 --- /dev/null +++ b/pages/user/ModifyPayPassword/ModifyPayPassword.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/pages/user/Recharge/index.vue b/pages/user/Recharge/index.vue new file mode 100644 index 0000000..32384e9 --- /dev/null +++ b/pages/user/Recharge/index.vue @@ -0,0 +1,335 @@ + + + + diff --git a/pages/user/RetrievePassword/index.vue b/pages/user/RetrievePassword/index.vue new file mode 100644 index 0000000..86780ce --- /dev/null +++ b/pages/user/RetrievePassword/index.vue @@ -0,0 +1,153 @@ + + + diff --git a/pages/user/UpgradeElectronicProtocol/UpgradeElectronicProtocol.vue b/pages/user/UpgradeElectronicProtocol/UpgradeElectronicProtocol.vue new file mode 100644 index 0000000..c5072c8 --- /dev/null +++ b/pages/user/UpgradeElectronicProtocol/UpgradeElectronicProtocol.vue @@ -0,0 +1,368 @@ + + + + diff --git a/pages/user/UpgradeProtocolDetail/UpgradeProtocolDetail.vue b/pages/user/UpgradeProtocolDetail/UpgradeProtocolDetail.vue new file mode 100644 index 0000000..924aba6 --- /dev/null +++ b/pages/user/UpgradeProtocolDetail/UpgradeProtocolDetail.vue @@ -0,0 +1,211 @@ + + + + export default { + data() { + return { + + } + }, + methods: { + + } + } + + + diff --git a/pages/user/User/index.vue b/pages/user/User/index.vue new file mode 100644 index 0000000..ae95520 --- /dev/null +++ b/pages/user/User/index.vue @@ -0,0 +1,1115 @@ + + + + diff --git a/pages/user/UserAccount/index.vue b/pages/user/UserAccount/index.vue new file mode 100644 index 0000000..6d93303 --- /dev/null +++ b/pages/user/UserAccount/index.vue @@ -0,0 +1,111 @@ + + diff --git a/pages/user/UserBill/index.vue b/pages/user/UserBill/index.vue new file mode 100644 index 0000000..99dfdcb --- /dev/null +++ b/pages/user/UserBill/index.vue @@ -0,0 +1,114 @@ + + diff --git a/pages/user/UserFavorite/UserFavorite.vue b/pages/user/UserFavorite/UserFavorite.vue new file mode 100644 index 0000000..d92e7c5 --- /dev/null +++ b/pages/user/UserFavorite/UserFavorite.vue @@ -0,0 +1,316 @@ + + + + + + diff --git a/pages/user/UserVip/index.vue b/pages/user/UserVip/index.vue new file mode 100644 index 0000000..b42e453 --- /dev/null +++ b/pages/user/UserVip/index.vue @@ -0,0 +1,209 @@ + + + + diff --git a/pages/user/address/AddAddress/index.vue b/pages/user/address/AddAddress/index.vue new file mode 100644 index 0000000..0d9c7bf --- /dev/null +++ b/pages/user/address/AddAddress/index.vue @@ -0,0 +1,375 @@ + + + + + diff --git a/pages/user/address/AddressManagement/index.vue b/pages/user/address/AddressManagement/index.vue new file mode 100644 index 0000000..99261d2 --- /dev/null +++ b/pages/user/address/AddressManagement/index.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/pages/user/coupon/GetCoupon/index.vue b/pages/user/coupon/GetCoupon/index.vue new file mode 100644 index 0000000..2432c18 --- /dev/null +++ b/pages/user/coupon/GetCoupon/index.vue @@ -0,0 +1,107 @@ + + diff --git a/pages/user/coupon/UserCoupon/index.vue b/pages/user/coupon/UserCoupon/index.vue new file mode 100644 index 0000000..95254b4 --- /dev/null +++ b/pages/user/coupon/UserCoupon/index.vue @@ -0,0 +1,79 @@ + + diff --git a/pages/user/promotion/CashAudit/index.vue b/pages/user/promotion/CashAudit/index.vue new file mode 100644 index 0000000..671445f --- /dev/null +++ b/pages/user/promotion/CashAudit/index.vue @@ -0,0 +1,33 @@ + + diff --git a/pages/user/promotion/CashRecord/index.vue b/pages/user/promotion/CashRecord/index.vue new file mode 100644 index 0000000..11d9ea3 --- /dev/null +++ b/pages/user/promotion/CashRecord/index.vue @@ -0,0 +1,162 @@ + + + + diff --git a/pages/user/promotion/CommissionDetails/index.vue b/pages/user/promotion/CommissionDetails/index.vue new file mode 100644 index 0000000..f7539c2 --- /dev/null +++ b/pages/user/promotion/CommissionDetails/index.vue @@ -0,0 +1,113 @@ + + diff --git a/pages/user/promotion/Poster/index.vue b/pages/user/promotion/Poster/index.vue new file mode 100644 index 0000000..533d6ad --- /dev/null +++ b/pages/user/promotion/Poster/index.vue @@ -0,0 +1,160 @@ + + + + diff --git a/pages/user/promotion/PromoterList/index.vue b/pages/user/promotion/PromoterList/index.vue new file mode 100644 index 0000000..4ac4868 --- /dev/null +++ b/pages/user/promotion/PromoterList/index.vue @@ -0,0 +1,356 @@ + + + + + diff --git a/pages/user/promotion/PromoterOrder/index.vue b/pages/user/promotion/PromoterOrder/index.vue new file mode 100644 index 0000000..17cbf40 --- /dev/null +++ b/pages/user/promotion/PromoterOrder/index.vue @@ -0,0 +1,123 @@ + + + \ No newline at end of file diff --git a/pages/user/promotion/UserCash/index.vue b/pages/user/promotion/UserCash/index.vue new file mode 100644 index 0000000..870d4a4 --- /dev/null +++ b/pages/user/promotion/UserCash/index.vue @@ -0,0 +1,212 @@ + + diff --git a/pages/user/promotion/UserPromotion/index.vue b/pages/user/promotion/UserPromotion/index.vue new file mode 100644 index 0000000..fe5116f --- /dev/null +++ b/pages/user/promotion/UserPromotion/index.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/pages/user/signIn/Integral/index.vue b/pages/user/signIn/Integral/index.vue new file mode 100644 index 0000000..1aafad2 --- /dev/null +++ b/pages/user/signIn/Integral/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/pages/user/signIn/Sign/index.vue b/pages/user/signIn/Sign/index.vue new file mode 100644 index 0000000..6989fb1 --- /dev/null +++ b/pages/user/signIn/Sign/index.vue @@ -0,0 +1,186 @@ + + + diff --git a/pages/user/signIn/SignRecord/index.vue b/pages/user/signIn/SignRecord/index.vue new file mode 100644 index 0000000..a153642 --- /dev/null +++ b/pages/user/signIn/SignRecord/index.vue @@ -0,0 +1,65 @@ + + diff --git a/pagesInn/components/tm-upload/tm-upload.vue b/pagesInn/components/tm-upload/tm-upload.vue new file mode 100644 index 0000000..22b1c05 --- /dev/null +++ b/pagesInn/components/tm-upload/tm-upload.vue @@ -0,0 +1,484 @@ + + + + + diff --git a/pagesInn/inn/innApply.vue b/pagesInn/inn/innApply.vue new file mode 100644 index 0000000..af35022 --- /dev/null +++ b/pagesInn/inn/innApply.vue @@ -0,0 +1,782 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-toast/u-toast.vue b/uni_modules/uview-ui/components/u-toast/u-toast.vue new file mode 100644 index 0000000..f194830 --- /dev/null +++ b/uni_modules/uview-ui/components/u-toast/u-toast.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-toolbar/props.js b/uni_modules/uview-ui/components/u-toolbar/props.js new file mode 100644 index 0000000..1b72966 --- /dev/null +++ b/uni_modules/uview-ui/components/u-toolbar/props.js @@ -0,0 +1,34 @@ +export default { + props: { + // 是否展示工具条 + show: { + type: Boolean, + default: uni.$u.props.toolbar.show + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: uni.$u.props.toolbar.cancelText + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: uni.$u.props.toolbar.confirmText + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: uni.$u.props.toolbar.cancelColor + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: uni.$u.props.toolbar.confirmColor + }, + // 标题文字 + title: { + type: String, + default: uni.$u.props.toolbar.title + } + } +} diff --git a/uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue b/uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue new file mode 100644 index 0000000..290b771 --- /dev/null +++ b/uni_modules/uview-ui/components/u-toolbar/u-toolbar.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-tooltip/clipboard.min.js b/uni_modules/uview-ui/components/u-tooltip/clipboard.min.js new file mode 100644 index 0000000..b7bff12 --- /dev/null +++ b/uni_modules/uview-ui/components/u-tooltip/clipboard.min.js @@ -0,0 +1,58 @@ +/*! + * clipboard.js v1.6.1 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!(function (e) { if (typeof exports === 'object' && typeof module !== 'undefined')module.exports = e(); else if (typeof define === 'function' && define.amd)define([], e); else { let t; t = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this, t.Clipboard = e() } }(() => { + let e; let t; let n; return (function e(t, n, o) { function i(a, c) { if (!n[a]) { if (!t[a]) { const l = typeof require === 'function' && require; if (!c && l) return l(a, !0); if (r) return r(a, !0); const u = new Error(`Cannot find module '${a}'`); throw u.code = 'MODULE_NOT_FOUND', u } const s = n[a] = { exports: {} }; t[a][0].call(s.exports, (e) => { const n = t[a][1][e]; return i(n || e) }, s, s.exports, e, t, n, o) } return n[a].exports } for (var r = typeof require === 'function' && require, a = 0; a < o.length; a++)i(o[a]); return i }({ + 1: [function (e, t, n) { function o(e, t) { for (;e && e.nodeType !== i;) { if (e.matches(t)) return e; e = e.parentNode } } var i = 9; if (typeof Element !== 'undefined' && !Element.prototype.matches) { const r = Element.prototype; r.matches = r.matchesSelector || r.mozMatchesSelector || r.msMatchesSelector || r.oMatchesSelector || r.webkitMatchesSelector }t.exports = o }, {}], + 2: [function (e, t, n) { function o(e, t, n, o, r) { const a = i.apply(this, arguments); return e.addEventListener(n, a, r), { destroy() { e.removeEventListener(n, a, r) } } } function i(e, t, n, o) { return function (n) { n.delegateTarget = r(n.target, t), n.delegateTarget && o.call(e, n) } } var r = e('./closest'); t.exports = o }, { './closest': 1 }], + 3: [function (e, t, n) { n.node = function (e) { return void 0 !== e && e instanceof HTMLElement && e.nodeType === 1 }, n.nodeList = function (e) { const t = Object.prototype.toString.call(e); return void 0 !== e && (t === '[object NodeList]' || t === '[object HTMLCollection]') && 'length' in e && (e.length === 0 || n.node(e[0])) }, n.string = function (e) { return typeof e === 'string' || e instanceof String }, n.fn = function (e) { const t = Object.prototype.toString.call(e); return t === '[object Function]' } }, {}], + 4: [function (e, t, n) { function o(e, t, n) { if (!e && !t && !n) throw new Error('Missing required arguments'); if (!c.string(t)) throw new TypeError('Second argument must be a String'); if (!c.fn(n)) throw new TypeError('Third argument must be a Function'); if (c.node(e)) return i(e, t, n); if (c.nodeList(e)) return r(e, t, n); if (c.string(e)) return a(e, t, n); throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList') } function i(e, t, n) { return e.addEventListener(t, n), { destroy() { e.removeEventListener(t, n) } } } function r(e, t, n) { return Array.prototype.forEach.call(e, (e) => { e.addEventListener(t, n) }), { destroy() { Array.prototype.forEach.call(e, (e) => { e.removeEventListener(t, n) }) } } } function a(e, t, n) { return l(document.body, e, t, n) } var c = e('./is'); var l = e('delegate'); t.exports = o }, { './is': 3, delegate: 2 }], + 5: [function (e, t, n) { function o(e) { let t; if (e.nodeName === 'SELECT')e.focus(), t = e.value; else if (e.nodeName === 'INPUT' || e.nodeName === 'TEXTAREA') { const n = e.hasAttribute('readonly'); n || e.setAttribute('readonly', ''), e.select(), e.setSelectionRange(0, e.value.length), n || e.removeAttribute('readonly'), t = e.value } else { e.hasAttribute('contenteditable') && e.focus(); const o = window.getSelection(); const i = document.createRange(); i.selectNodeContents(e), o.removeAllRanges(), o.addRange(i), t = o.toString() } return t }t.exports = o }, {}], + 6: [function (e, t, n) { + function o() {}o.prototype = { + on(e, t, n) { const o = this.e || (this.e = {}); return (o[e] || (o[e] = [])).push({ fn: t, ctx: n }), this }, once(e, t, n) { function o() { i.off(e, o), t.apply(n, arguments) } var i = this; return o._ = t, this.on(e, o, n) }, emit(e) { const t = [].slice.call(arguments, 1); const n = ((this.e || (this.e = {}))[e] || []).slice(); let o = 0; const i = n.length; for (o; o < i; o++)n[o].fn.apply(n[o].ctx, t); return this }, off(e, t) { const n = this.e || (this.e = {}); const o = n[e]; const i = []; if (o && t) for (let r = 0, a = o.length; r < a; r++)o[r].fn !== t && o[r].fn._ !== t && i.push(o[r]); return i.length ? n[e] = i : delete n[e], this } + }, t.exports = o + }, {}], + 7: [function (t, n, o) { + !(function (i, r) { if (typeof e === 'function' && e.amd)e(['module', 'select'], r); else if (typeof o !== 'undefined')r(n, t('select')); else { const a = { exports: {} }; r(a, i.select), i.clipboardAction = a.exports } }(this, (e, t) => { + 'use strict' + + function n(e) { return e && e.__esModule ? e : { default: e } } function o(e, t) { if (!(e instanceof t)) throw new TypeError('Cannot call a class as a function') } const i = n(t); const r = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? function (e) { return typeof e } : function (e) { return e && typeof Symbol === 'function' && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e }; const a = (function () { function e(e, t) { for (let n = 0; n < t.length; n++) { const o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, 'value' in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } return function (t, n, o) { return n && e(t.prototype, n), o && e(t, o), t } }()); const c = (function () { + function e(t) { o(this, e), this.resolveOptions(t), this.initSelection() } return a(e, [{ key: 'resolveOptions', value: function e() { const t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; this.action = t.action, this.emitter = t.emitter, this.target = t.target, this.text = t.text, this.trigger = t.trigger, this.selectedText = '' } }, { key: 'initSelection', value: function e() { this.text ? this.selectFake() : this.target && this.selectTarget() } }, { key: 'selectFake', value: function e() { const t = this; const n = document.documentElement.getAttribute('dir') == 'rtl'; this.removeFake(), this.fakeHandlerCallback = function () { return t.removeFake() }, this.fakeHandler = document.body.addEventListener('click', this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement('textarea'), this.fakeElem.style.fontSize = '12pt', this.fakeElem.style.border = '0', this.fakeElem.style.padding = '0', this.fakeElem.style.margin = '0', this.fakeElem.style.position = 'absolute', this.fakeElem.style[n ? 'right' : 'left'] = '-9999px'; const o = window.pageYOffset || document.documentElement.scrollTop; this.fakeElem.style.top = `${o}px`, this.fakeElem.setAttribute('readonly', ''), this.fakeElem.value = this.text, document.body.appendChild(this.fakeElem), this.selectedText = (0, i.default)(this.fakeElem), this.copyText() } }, { key: 'removeFake', value: function e() { this.fakeHandler && (document.body.removeEventListener('click', this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (document.body.removeChild(this.fakeElem), this.fakeElem = null) } }, { key: 'selectTarget', value: function e() { this.selectedText = (0, i.default)(this.target), this.copyText() } }, { key: 'copyText', value: function e() { let t = void 0; try { t = document.execCommand(this.action) } catch (e) { t = !1 } this.handleResult(t) } }, { + key: 'handleResult', + value: function e(t) { + this.emitter.emit(t ? 'success' : 'error', { + action: this.action, text: this.selectedText, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) + }) + } + }, { key: 'clearSelection', value: function e() { this.target && this.target.blur(), window.getSelection().removeAllRanges() } }, { key: 'destroy', value: function e() { this.removeFake() } }, { key: 'action', set: function e() { const t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 'copy'; if (this._action = t, this._action !== 'copy' && this._action !== 'cut') throw new Error('Invalid "action" value, use either "copy" or "cut"') }, get: function e() { return this._action } }, { key: 'target', set: function e(t) { if (void 0 !== t) { if (!t || (typeof t === 'undefined' ? 'undefined' : r(t)) !== 'object' || t.nodeType !== 1) throw new Error('Invalid "target" value, use a valid Element'); if (this.action === 'copy' && t.hasAttribute('disabled')) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); if (this.action === 'cut' && (t.hasAttribute('readonly') || t.hasAttribute('disabled'))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); this._target = t } }, get: function e() { return this._target } }]), e + }()); e.exports = c + })) + }, { select: 5 }], + 8: [function (t, n, o) { + !(function (i, r) { if (typeof e === 'function' && e.amd)e(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], r); else if (typeof o !== 'undefined')r(n, t('./clipboard-action'), t('tiny-emitter'), t('good-listener')); else { const a = { exports: {} }; r(a, i.clipboardAction, i.tinyEmitter, i.goodListener), i.clipboard = a.exports } }(this, (e, t, n, o) => { + 'use strict' + + function i(e) { return e && e.__esModule ? e : { default: e } } function r(e, t) { if (!(e instanceof t)) throw new TypeError('Cannot call a class as a function') } function a(e, t) { if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !t || typeof t !== 'object' && typeof t !== 'function' ? e : t } function c(e, t) { + if (typeof t !== 'function' && t !== null) throw new TypeError(`Super expression must either be null or a function, not ${typeof t}`); e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, enumerable: !1, writable: !0, configurable: !0 + } + }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) + } function l(e, t) { const n = `data-clipboard-${e}`; if (t.hasAttribute(n)) return t.getAttribute(n) } const u = i(t); const s = i(n); const f = i(o); const d = (function () { function e(e, t) { for (let n = 0; n < t.length; n++) { const o = t[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, 'value' in o && (o.writable = !0), Object.defineProperty(e, o.key, o) } } return function (t, n, o) { return n && e(t.prototype, n), o && e(t, o), t } }()); const h = (function (e) { + function t(e, n) { r(this, t); const o = a(this, (t.__proto__ || Object.getPrototypeOf(t)).call(this)); return o.resolveOptions(n), o.listenClick(e), o } return c(t, e), d(t, [{ key: 'resolveOptions', value: function e() { const t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; this.action = typeof t.action === 'function' ? t.action : this.defaultAction, this.target = typeof t.target === 'function' ? t.target : this.defaultTarget, this.text = typeof t.text === 'function' ? t.text : this.defaultText } }, { key: 'listenClick', value: function e(t) { const n = this; this.listener = (0, f.default)(t, 'click', (e) => n.onClick(e)) } }, { + key: 'onClick', + value: function e(t) { + const n = t.delegateTarget || t.currentTarget; this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new u.default({ + action: this.action(n), target: this.target(n), text: this.text(n), trigger: n, emitter: this + }) + } + }, { key: 'defaultAction', value: function e(t) { return l('action', t) } }, { key: 'defaultTarget', value: function e(t) { const n = l('target', t); if (n) return document.querySelector(n) } }, { key: 'defaultText', value: function e(t) { return l('text', t) } }, { key: 'destroy', value: function e() { this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) } }], [{ key: 'isSupported', value: function e() { const t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ['copy', 'cut']; const n = typeof t === 'string' ? [t] : t; let o = !!document.queryCommandSupported; return n.forEach((e) => { o = o && !!document.queryCommandSupported(e) }), o } }]), t + }(s.default)); e.exports = h + })) + }, { './clipboard-action': 7, 'good-listener': 4, 'tiny-emitter': 6 }] + }, {}, [8]))(8) +})) diff --git a/uni_modules/uview-ui/components/u-tooltip/props.js b/uni_modules/uview-ui/components/u-tooltip/props.js new file mode 100644 index 0000000..16aecbc --- /dev/null +++ b/uni_modules/uview-ui/components/u-tooltip/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 需要显示的提示文字 + text: { + type: [String, Number], + default: uni.$u.props.tooltip.text + }, + // 点击复制按钮时,复制的文本,为空则使用text值 + copyText: { + type: [String, Number], + default: uni.$u.props.tooltip.copyText + }, + // 文本大小 + size: { + type: [String, Number], + default: uni.$u.props.tooltip.size + }, + // 字体颜色 + color: { + type: String, + default: uni.$u.props.tooltip.color + }, + // 弹出提示框时,文本的背景色 + bgColor: { + type: String, + default: uni.$u.props.tooltip.bgColor + }, + // 弹出提示的方向,top-上方,bottom-下方 + direction: { + type: String, + default: uni.$u.props.tooltip.direction + }, + // 弹出提示的z-index,nvue无效 + zIndex: { + type: [String, Number], + default: uni.$u.props.tooltip.zIndex + }, + // 是否显示复制按钮 + showCopy: { + type: Boolean, + default: uni.$u.props.tooltip.showCopy + }, + // 扩展的按钮组 + buttons: { + type: Array, + default: uni.$u.props.tooltip.buttons + }, + // 是否显示透明遮罩以防止触摸穿透 + overlay: { + type: Boolean, + default: uni.$u.props.tooltip.overlay + }, + // 是否显示复制成功或者失败的toast + showToast: { + type: Boolean, + default: uni.$u.props.tooltip.showToast + } + } +} diff --git a/uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue b/uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue new file mode 100644 index 0000000..4bd8fc9 --- /dev/null +++ b/uni_modules/uview-ui/components/u-tooltip/u-tooltip.vue @@ -0,0 +1,365 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-tr/props.js b/uni_modules/uview-ui/components/u-tr/props.js new file mode 100644 index 0000000..7c11331 --- /dev/null +++ b/uni_modules/uview-ui/components/u-tr/props.js @@ -0,0 +1,5 @@ +export default { + props: { + + } +} diff --git a/uni_modules/uview-ui/components/u-tr/u-tr.vue b/uni_modules/uview-ui/components/u-tr/u-tr.vue new file mode 100644 index 0000000..dbbca08 --- /dev/null +++ b/uni_modules/uview-ui/components/u-tr/u-tr.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-transition/nvue.ani-map.js b/uni_modules/uview-ui/components/u-transition/nvue.ani-map.js new file mode 100644 index 0000000..b86b962 --- /dev/null +++ b/uni_modules/uview-ui/components/u-transition/nvue.ani-map.js @@ -0,0 +1,68 @@ +export default { + fade: { + enter: { opacity: 0 }, + 'enter-to': { opacity: 1 }, + leave: { opacity: 1 }, + 'leave-to': { opacity: 0 } + }, + 'fade-up': { + enter: { opacity: 0, transform: 'translateY(100%)' }, + 'enter-to': { opacity: 1, transform: 'translateY(0)' }, + leave: { opacity: 1, transform: 'translateY(0)' }, + 'leave-to': { opacity: 0, transform: 'translateY(100%)' } + }, + 'fade-down': { + enter: { opacity: 0, transform: 'translateY(-100%)' }, + 'enter-to': { opacity: 1, transform: 'translateY(0)' }, + leave: { opacity: 1, transform: 'translateY(0)' }, + 'leave-to': { opacity: 0, transform: 'translateY(-100%)' } + }, + 'fade-left': { + enter: { opacity: 0, transform: 'translateX(-100%)' }, + 'enter-to': { opacity: 1, transform: 'translateY(0)' }, + leave: { opacity: 1, transform: 'translateY(0)' }, + 'leave-to': { opacity: 0, transform: 'translateX(-100%)' } + }, + 'fade-right': { + enter: { opacity: 0, transform: 'translateX(100%)' }, + 'enter-to': { opacity: 1, transform: 'translateY(0)' }, + leave: { opacity: 1, transform: 'translateY(0)' }, + 'leave-to': { opacity: 0, transform: 'translateX(100%)' } + }, + 'slide-up': { + enter: { transform: 'translateY(100%)' }, + 'enter-to': { transform: 'translateY(0)' }, + leave: { transform: 'translateY(0)' }, + 'leave-to': { transform: 'translateY(100%)' } + }, + 'slide-down': { + enter: { transform: 'translateY(-100%)' }, + 'enter-to': { transform: 'translateY(0)' }, + leave: { transform: 'translateY(0)' }, + 'leave-to': { transform: 'translateY(-100%)' } + }, + 'slide-left': { + enter: { transform: 'translateX(-100%)' }, + 'enter-to': { transform: 'translateY(0)' }, + leave: { transform: 'translateY(0)' }, + 'leave-to': { transform: 'translateX(-100%)' } + }, + 'slide-right': { + enter: { transform: 'translateX(100%)' }, + 'enter-to': { transform: 'translateY(0)' }, + leave: { transform: 'translateY(0)' }, + 'leave-to': { transform: 'translateX(100%)' } + }, + zoom: { + enter: { transform: 'scale(0.95)' }, + 'enter-to': { transform: 'scale(1)' }, + leave: { transform: 'scale(1)' }, + 'leave-to': { transform: 'scale(0.95)' } + }, + 'fade-zoom': { + enter: { opacity: 0, transform: 'scale(0.95)' }, + 'enter-to': { opacity: 1, transform: 'scale(1)' }, + leave: { opacity: 1, transform: 'scale(1)' }, + 'leave-to': { opacity: 0, transform: 'scale(0.95)' } + } +} diff --git a/uni_modules/uview-ui/components/u-transition/props.js b/uni_modules/uview-ui/components/u-transition/props.js new file mode 100644 index 0000000..f7b1c22 --- /dev/null +++ b/uni_modules/uview-ui/components/u-transition/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 是否展示组件 + show: { + type: Boolean, + default: uni.$u.props.transition.show + }, + // 使用的动画模式 + mode: { + type: String, + default: uni.$u.props.transition.mode + }, + // 动画的执行时间,单位ms + duration: { + type: [String, Number], + default: uni.$u.props.transition.duration + }, + // 使用的动画过渡函数 + timingFunction: { + type: String, + default: uni.$u.props.transition.timingFunction + } + } +} diff --git a/uni_modules/uview-ui/components/u-transition/transition.js b/uni_modules/uview-ui/components/u-transition/transition.js new file mode 100644 index 0000000..92e5681 --- /dev/null +++ b/uni_modules/uview-ui/components/u-transition/transition.js @@ -0,0 +1,157 @@ +// 定义一个一定时间后自动成功的promise,让调用nextTick方法处,进入下一个then方法 +const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 50)) +// nvue动画模块实现细节抽离在外部文件 +import animationMap from './nvue.ani-map.js' + +// #ifndef APP-NVUE +// 定义类名,通过给元素动态切换类名,赋予元素一定的css动画样式 +const getClassNames = (name) => ({ + enter: `u-${name}-enter u-${name}-enter-active`, + 'enter-to': `u-${name}-enter-to u-${name}-enter-active`, + leave: `u-${name}-leave u-${name}-leave-active`, + 'leave-to': `u-${name}-leave-to u-${name}-leave-active` +}) +// #endif + +// #ifdef APP-NVUE +// 引入nvue(weex)的animation动画模块,文档见: +// https://weex.apache.org/zh/docs/modules/animation.html#transition +const animation = uni.requireNativePlugin('animation') +const getStyle = (name) => animationMap[name] +// #endif + +export default { + methods: { + // 组件被点击发出事件 + clickHandler() { + this.$emit('click') + }, + // #ifndef APP-NVUE + // vue版本的组件进场处理 + vueEnter() { + // 动画进入时的类名 + const classNames = getClassNames(this.mode) + // 定义状态和发出动画进入前事件 + this.status = 'enter' + this.$emit('beforeEnter') + this.inited = true + this.display = true + this.classes = classNames.enter + this.$nextTick(async () => { + // #ifdef H5 + await uni.$u.sleep(20) + // #endif + // 标识动画尚未结束 + this.$emit('enter') + this.transitionEnded = false + // 组件动画进入后触发的事件 + this.$emit('afterEnter') + // 赋予组件enter-to类名 + this.classes = classNames['enter-to'] + }) + }, + // 动画离场处理 + vueLeave() { + // 如果不是展示状态,无需执行逻辑 + if (!this.display) return + const classNames = getClassNames(this.mode) + // 标记离开状态和发出事件 + this.status = 'leave' + this.$emit('beforeLeave') + // 获得类名 + this.classes = classNames.leave + + this.$nextTick(() => { + // 动画正在离场的状态 + this.transitionEnded = false + this.$emit('leave') + // 组件执行动画,到了执行的执行时间后,执行一些额外处理 + setTimeout(this.onTransitionEnd, this.duration) + this.classes = classNames['leave-to'] + }) + }, + // #endif + // #ifdef APP-NVUE + // nvue版本动画进场 + nvueEnter() { + // 获得样式的名称 + const currentStyle = getStyle(this.mode) + // 组件动画状态和发出事件 + this.status = 'enter' + this.$emit('beforeEnter') + // 展示生成组件元素 + this.inited = true + this.display = true + // 在nvue安卓上,由于渲染速度慢,在弹窗,键盘,日历等组件中,渲染其中的内容需要时间 + // 导致出现弹窗卡顿,这里让其一开始为透明状态,等一定时间渲染完成后,再让其隐藏起来,再让其按正常逻辑出现 + this.viewStyle = { + opacity: 0 + } + // 等待弹窗内容渲染完成 + this.$nextTick(() => { + // 合并样式 + this.viewStyle = currentStyle.enter + Promise.resolve() + .then(nextTick) + .then(() => { + // 组件开始进入前的事件 + this.$emit('enter') + // nvue的transition动画模块需要通过ref调用组件,注意此处的ref不同于vue的this.$refs['u-transition']用法 + animation.transition(this.$refs['u-transition'].ref, { + styles: currentStyle['enter-to'], + duration: this.duration, + timingFunction: this.timingFunction, + needLayout: false, + delay: 0 + }, () => { + // 动画执行完毕,发出事件 + this.$emit('afterEnter') + }) + }) + .catch(() => {}) + }) + }, + nvueLeave() { + if (!this.display) { + return + } + const currentStyle = getStyle(this.mode) + // 定义状态和事件 + this.status = 'leave' + this.$emit('beforeLeave') + // 合并样式 + this.viewStyle = currentStyle.leave + // 放到promise中处理执行过程 + Promise.resolve() + .then(nextTick) // 等待几十ms + .then(() => { + this.transitionEnded = false + // 动画正在离场的状态 + this.$emit('leave') + animation.transition(this.$refs['u-transition'].ref, { + styles: currentStyle['leave-to'], + duration: this.duration, + timingFunction: this.timingFunction, + needLayout: false, + delay: 0 + }, () => { + this.onTransitionEnd() + }) + }) + .catch(() => {}) + }, + // #endif + // 完成过渡后触发 + onTransitionEnd() { + // 如果已经是结束的状态,无需再处理 + if (this.transitionEnded) return + this.transitionEnded = true + // 发出组件动画执行后的事件 + this.$emit(this.status === 'leave' ? 'afterLeave' : 'afterEnter') + if (!this.show && this.display) { + this.display = false + this.inited = false + } + } + } +} diff --git a/uni_modules/uview-ui/components/u-transition/u-transition.vue b/uni_modules/uview-ui/components/u-transition/u-transition.vue new file mode 100644 index 0000000..22831dc --- /dev/null +++ b/uni_modules/uview-ui/components/u-transition/u-transition.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-transition/vue.ani-style.scss b/uni_modules/uview-ui/components/u-transition/vue.ani-style.scss new file mode 100644 index 0000000..a31d88b --- /dev/null +++ b/uni_modules/uview-ui/components/u-transition/vue.ani-style.scss @@ -0,0 +1,113 @@ +/** + * vue版本动画内置的动画模式有如下: + * fade:淡入 + * zoom:缩放 + * fade-zoom:缩放淡入 + * fade-up:上滑淡入 + * fade-down:下滑淡入 + * fade-left:左滑淡入 + * fade-right:右滑淡入 + * slide-up:上滑进入 + * slide-down:下滑进入 + * slide-left:左滑进入 + * slide-right:右滑进入 + */ + +$u-zoom-scale: scale(0.95); + +.u-fade-enter-active, +.u-fade-leave-active { + transition-property: opacity; +} + +.u-fade-enter, +.u-fade-leave-to { + opacity: 0 +} + +.u-fade-zoom-enter, +.u-fade-zoom-leave-to { + transform: $u-zoom-scale; + opacity: 0; +} + +.u-fade-zoom-enter-active, +.u-fade-zoom-leave-active { + transition-property: transform, opacity; +} + +.u-fade-down-enter-active, +.u-fade-down-leave-active, +.u-fade-left-enter-active, +.u-fade-left-leave-active, +.u-fade-right-enter-active, +.u-fade-right-leave-active, +.u-fade-up-enter-active, +.u-fade-up-leave-active { + transition-property: opacity, transform; +} + +.u-fade-up-enter, +.u-fade-up-leave-to { + transform: translate3d(0, 100%, 0); + opacity: 0 +} + +.u-fade-down-enter, +.u-fade-down-leave-to { + transform: translate3d(0, -100%, 0); + opacity: 0 +} + +.u-fade-left-enter, +.u-fade-left-leave-to { + transform: translate3d(-100%, 0, 0); + opacity: 0 +} + +.u-fade-right-enter, +.u-fade-right-leave-to { + transform: translate3d(100%, 0, 0); + opacity: 0 +} + +.u-slide-down-enter-active, +.u-slide-down-leave-active, +.u-slide-left-enter-active, +.u-slide-left-leave-active, +.u-slide-right-enter-active, +.u-slide-right-leave-active, +.u-slide-up-enter-active, +.u-slide-up-leave-active { + transition-property: transform; +} + +.u-slide-up-enter, +.u-slide-up-leave-to { + transform: translate3d(0, 100%, 0) +} + +.u-slide-down-enter, +.u-slide-down-leave-to { + transform: translate3d(0, -100%, 0) +} + +.u-slide-left-enter, +.u-slide-left-leave-to { + transform: translate3d(-100%, 0, 0) +} + +.u-slide-right-enter, +.u-slide-right-leave-to { + transform: translate3d(100%, 0, 0) +} + +.u-zoom-enter-active, +.u-zoom-leave-active { + transition-property: transform +} + +.u-zoom-enter, +.u-zoom-leave-to { + transform: $u-zoom-scale +} diff --git a/uni_modules/uview-ui/components/u-upload/mixin.js b/uni_modules/uview-ui/components/u-upload/mixin.js new file mode 100644 index 0000000..410c775 --- /dev/null +++ b/uni_modules/uview-ui/components/u-upload/mixin.js @@ -0,0 +1,21 @@ +export default { + watch: { + // 监听accept的变化,判断是否符合个平台要求 + // 只有微信小程序才支持选择媒体,文件类型,所以这里做一个判断提示 + accept: { + immediate: true, + handler(val) { + // #ifndef MP-WEIXIN + if (val === 'all' || val === 'media') { + uni.$u.error('只有微信小程序才支持把accept配置为all、media之一') + } + // #endif + // #ifndef H5 || MP-WEIXIN + if (val === 'file') { + uni.$u.error('只有微信小程序和H5(HX2.9.9)才支持把accept配置为file') + } + // #endif + } + } + } +} diff --git a/uni_modules/uview-ui/components/u-upload/props.js b/uni_modules/uview-ui/components/u-upload/props.js new file mode 100644 index 0000000..b106ae7 --- /dev/null +++ b/uni_modules/uview-ui/components/u-upload/props.js @@ -0,0 +1,124 @@ +export default { + props: { + // 接受的文件类型, 可选值为all media image file video + accept: { + type: String, + default: uni.$u.props.upload.accept + }, + // 图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头 + capture: { + type: [String, Array], + default: uni.$u.props.upload.capture + }, + // 当accept为video时生效,是否压缩视频,默认为true + compressed: { + type: Boolean, + default: uni.$u.props.upload.compressed + }, + // 当accept为video时生效,可选值为back或front + camera: { + type: String, + default: uni.$u.props.upload.camera + }, + // 当accept为video时生效,拍摄视频最长拍摄时间,单位秒 + maxDuration: { + type: Number, + default: uni.$u.props.upload.maxDuration + }, + // 上传区域的图标,只能内置图标 + uploadIcon: { + type: String, + default: uni.$u.props.upload.uploadIcon + }, + // 上传区域的图标的颜色,默认 + uploadIconColor: { + type: String, + default: uni.$u.props.upload.uploadIconColor + }, + // 是否开启文件读取前事件 + useBeforeRead: { + type: Boolean, + default: uni.$u.props.upload.useBeforeRead + }, + // 读取后的处理函数 + afterRead: { + type: Function, + default: null + }, + // 读取前的处理函数 + beforeRead: { + type: Function, + default: null + }, + // 是否显示组件自带的图片预览功能 + previewFullImage: { + type: Boolean, + default: uni.$u.props.upload.previewFullImage + }, + // 最大上传数量 + maxCount: { + type: [String, Number], + default: uni.$u.props.upload.maxCount + }, + // 是否启用 + disabled: { + type: Boolean, + default: uni.$u.props.upload.disabled + }, + // 预览上传的图片时的裁剪模式,和image组件mode属性一致 + imageMode: { + type: String, + default: uni.$u.props.upload.imageMode + }, + // 标识符,可以在回调函数的第二项参数中获取 + name: { + type: String, + default: uni.$u.props.upload.name + }, + // 所选的图片的尺寸, 可选值为original compressed + sizeType: { + type: Array, + default: uni.$u.props.upload.sizeType + }, + // 是否开启图片多选,部分安卓机型不支持 + multiple: { + type: Boolean, + default: uni.$u.props.upload.multiple + }, + // 是否展示删除按钮 + deletable: { + type: Boolean, + default: uni.$u.props.upload.deletable + }, + // 文件大小限制,单位为byte + maxSize: { + type: [String, Number], + default: uni.$u.props.upload.maxSize + }, + // 显示已上传的文件列表 + fileList: { + type: Array, + default: uni.$u.props.upload.fileList + }, + // 上传区域的提示文字 + uploadText: { + type: String, + default: uni.$u.props.upload.uploadText + }, + // 内部预览图片区域和选择图片按钮的区域宽度 + width: { + type: [String, Number], + default: uni.$u.props.upload.width + }, + // 内部预览图片区域和选择图片按钮的区域高度 + height: { + type: [String, Number], + default: uni.$u.props.upload.height + }, + // 是否在上传完成后展示预览图 + previewImage: { + type: Boolean, + default: uni.$u.props.upload.previewImage + } + } +} diff --git a/uni_modules/uview-ui/components/u-upload/u-upload.vue b/uni_modules/uview-ui/components/u-upload/u-upload.vue new file mode 100644 index 0000000..1dac8a7 --- /dev/null +++ b/uni_modules/uview-ui/components/u-upload/u-upload.vue @@ -0,0 +1,558 @@ + + + + + diff --git a/uni_modules/uview-ui/components/u-upload/utils.js b/uni_modules/uview-ui/components/u-upload/utils.js new file mode 100644 index 0000000..88cb602 --- /dev/null +++ b/uni_modules/uview-ui/components/u-upload/utils.js @@ -0,0 +1,151 @@ +function pickExclude(obj, keys) { + // 某些情况下,type可能会为 + if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) { + return {} + } + return Object.keys(obj).reduce((prev, key) => { + if (!keys.includes(key)) { + prev[key] = obj[key] + } + return prev + }, {}) +} + +function formatImage(res) { + return res.tempFiles.map((item) => ({ + ...pickExclude(item, ['path']), + type: 'image', + url: item.path, + thumb: item.path, + size: item.size, + // #ifdef H5 + name: item.name + // #endif + })) +} + +function formatVideo(res) { + return [ + { + ...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']), + type: 'video', + url: res.tempFilePath, + thumb: res.thumbTempFilePath, + size: res.size, + // #ifdef H5 + name: res.name + // #endif + } + ] +} + +function formatMedia(res) { + return res.tempFiles.map((item) => ({ + ...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']), + type: res.type, + url: item.tempFilePath, + thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath, + size: item.size + })) +} + +function formatFile(res) { + return res.tempFiles.map((item) => ({ + ...pickExclude(item, ['path']), + url: item.path, + size:item.size, + // #ifdef H5 + name: item.name, + type: item.type + // #endif + })) +} +export function chooseFile({ + accept, + multiple, + capture, + compressed, + maxDuration, + sizeType, + camera, + maxCount +}) { + return new Promise((resolve, reject) => { + switch (accept) { + case 'image': + uni.chooseImage({ + count: multiple ? Math.min(maxCount, 9) : 1, + sourceType: capture, + sizeType, + success: (res) => resolve(formatImage(res)), + fail: reject + }) + break + // #ifdef MP-WEIXIN + // 只有微信小程序才支持chooseMedia接口 + case 'media': + wx.chooseMedia({ + count: multiple ? Math.min(maxCount, 9) : 1, + sourceType: capture, + maxDuration, + sizeType, + camera, + success: (res) => resolve(formatMedia(res)), + fail: reject + }) + break + // #endif + case 'video': + uni.chooseVideo({ + sourceType: capture, + compressed, + maxDuration, + camera, + success: (res) => resolve(formatVideo(res)), + fail: reject + }) + break + // #ifdef MP-WEIXIN || H5 + // 只有微信小程序才支持chooseMessageFile接口 + case 'file': + // #ifdef MP-WEIXIN + wx.chooseMessageFile({ + count: multiple ? maxCount : 1, + type: accept, + success: (res) => resolve(formatFile(res)), + fail: reject + }) + // #endif + // #ifdef H5 + // 需要hx2.9.9以上才支持uni.chooseFile + uni.chooseFile({ + count: multiple ? maxCount : 1, + type: accept, + success: (res) => resolve(formatFile(res)), + fail: reject + }) + // #endif + break + // #endif + default: + // 此为保底选项,在accept不为上面任意一项的时候选取全部文件 + // #ifdef MP-WEIXIN + wx.chooseMessageFile({ + count: multiple ? maxCount : 1, + type: 'all', + success: (res) => resolve(formatFile(res)), + fail: reject + }) + // #endif + // #ifdef H5 + // 需要hx2.9.9以上才支持uni.chooseFile + uni.chooseFile({ + count: multiple ? maxCount : 1, + type: 'all', + success: (res) => resolve(formatFile(res)), + fail: reject + }) + // #endif + } + }) +} diff --git a/uni_modules/uview-ui/components/uview-ui/uview-ui.vue b/uni_modules/uview-ui/components/uview-ui/uview-ui.vue new file mode 100644 index 0000000..bcd3662 --- /dev/null +++ b/uni_modules/uview-ui/components/uview-ui/uview-ui.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/uni_modules/uview-ui/index.js b/uni_modules/uview-ui/index.js new file mode 100644 index 0000000..651c090 --- /dev/null +++ b/uni_modules/uview-ui/index.js @@ -0,0 +1,79 @@ +// 看到此报错,是因为没有配置vue.config.js的【transpileDependencies】,详见:https://www.uviewui.com/components/npmSetting.html#_5-cli模式额外配置 +const pleaseSetTranspileDependencies = {}, babelTest = pleaseSetTranspileDependencies?.test + + + +// 引入全局mixin +import mixin from './libs/mixin/mixin.js' +// 小程序特有的mixin +import mpMixin from './libs/mixin/mpMixin.js' +// 全局挂载引入http相关请求拦截插件 +import Request from './libs/luch-request' + +// 路由封装 +import route from './libs/util/route.js' +// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制 +import colorGradient from './libs/function/colorGradient.js' + +// 规则检验 +import test from './libs/function/test.js' +// 防抖方法 +import debounce from './libs/function/debounce.js' +// 节流方法 +import throttle from './libs/function/throttle.js' +// 公共文件写入的方法 +import index from './libs/function/index.js' + +// 配置信息 +import config from './libs/config/config.js' +// props配置信息 +import props from './libs/config/props.js' +// 各个需要fixed的地方的z-index配置文件 +import zIndex from './libs/config/zIndex.js' +// 关于颜色的配置,特殊场景使用 +import color from './libs/config/color.js' +// 平台 +import platform from './libs/function/platform' + +const $u = { + route, + date: index.timeFormat, // 另名date + colorGradient: colorGradient.colorGradient, + hexToRgb: colorGradient.hexToRgb, + rgbToHex: colorGradient.rgbToHex, + colorToRgba: colorGradient.colorToRgba, + test, + type: ['primary', 'success', 'error', 'warning', 'info'], + http: new Request(), + config, // uView配置信息相关,比如版本号 + zIndex, + debounce, + throttle, + mixin, + mpMixin, + props, + ...index, + color, + platform +} + +// $u挂载到uni对象上 +uni.$u = $u + +const install = (Vue) => { + // 时间格式化,同时两个名称,date和timeFormat + Vue.filter('timeFormat', (timestamp, format) => uni.$u.timeFormat(timestamp, format)) + Vue.filter('date', (timestamp, format) => uni.$u.timeFormat(timestamp, format)) + // 将多久以前的方法,注入到全局过滤器 + Vue.filter('timeFrom', (timestamp, format) => uni.$u.timeFrom(timestamp, format)) + // 同时挂载到uni和Vue.prototype中 + // #ifndef APP-NVUE + // 只有vue,挂载到Vue.prototype才有意义,因为nvue中全局Vue.prototype和Vue.mixin是无效的 + Vue.prototype.$u = $u + Vue.mixin(mixin) + // #endif +} + +export default { + install +} diff --git a/uni_modules/uview-ui/index.scss b/uni_modules/uview-ui/index.scss new file mode 100644 index 0000000..8fcfa83 --- /dev/null +++ b/uni_modules/uview-ui/index.scss @@ -0,0 +1,23 @@ +// 引入公共基础类 +@import "./libs/css/common.scss"; +@import "./libs/css/color.scss"; + +// 非nvue的样式 +/* #ifndef APP-NVUE */ +@import "./libs/css/vue.scss"; +/* #endif */ + +// nvue的特有样式 +/* #ifdef APP-NVUE */ +@import "./libs/css/nvue.scss"; +/* #endif */ + +// 小程序特有的样式 +/* #ifdef MP */ +@import "./libs/css/mp.scss"; +/* #endif */ + +// H5特有的样式 +/* #ifdef H5 */ +@import "./libs/css/h5.scss"; +/* #endif */ \ No newline at end of file diff --git a/uni_modules/uview-ui/libs/config/color.js b/uni_modules/uview-ui/libs/config/color.js new file mode 100644 index 0000000..56b4187 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/color.js @@ -0,0 +1,17 @@ +// 为了让用户能够自定义主题,会逐步弃用此文件,各颜色通过css提供 +// 为了给某些特殊场景使用和向后兼容,无需删除此文件(2020-06-20) +const color = { + primary: '#3c9cff', + info: '#909399', + default: '#909399', + warning: '#f9ae3d', + error: '#f56c6c', + success: '#5ac725', + mainColor: '#303133', + contentColor: '#606266', + tipsColor: '#909399', + lightColor: '#c0c4cc', + borderColor: '#e4e7ed' +} + +export default color diff --git a/uni_modules/uview-ui/libs/config/config.js b/uni_modules/uview-ui/libs/config/config.js new file mode 100644 index 0000000..8389666 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/config.js @@ -0,0 +1,34 @@ +// 此版本发布于2022-00-24 +const version = '2.0.34' + +// 开发环境才提示,生产环境不会提示 +if (process.env.NODE_ENV === 'development') { + console.log(`\n %c uView V${version} %c https://uviewui.com/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;'); +} + +export default { + v: version, + version, + // 主题名称 + type: [ + 'primary', + 'success', + 'info', + 'error', + 'warning' + ], + // 颜色部分,本来可以通过scss的:export导出供js使用,但是奈何nvue不支持 + color: { + 'u-primary': '#2979ff', + 'u-warning': '#ff9900', + 'u-success': '#19be6b', + 'u-error': '#fa3534', + 'u-info': '#909399', + 'u-main-color': '#303133', + 'u-content-color': '#606266', + 'u-tips-color': '#909399', + 'u-light-color': '#c0c4cc' + }, + // 默认单位,可以通过配置为rpx,那么在用于传入组件大小参数为数值时,就默认为rpx + unit: 'px' +} diff --git a/uni_modules/uview-ui/libs/config/props.js b/uni_modules/uview-ui/libs/config/props.js new file mode 100644 index 0000000..6930d48 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props.js @@ -0,0 +1,190 @@ +/** + * 此文件的作用为统一配置所有组件的props参数 + * 借此用户可以全局覆盖组件的props默认值 + * 无需在每个引入组件的页面中都配置一次 + */ +import config from './config' + +import actionSheet from './props/actionSheet.js' +import album from './props/album.js' +import alert from './props/alert.js' +import avatar from './props/avatar' +import avatarGroup from './props/avatarGroup' +import backtop from './props/backtop' +import badge from './props/badge' +import button from './props/button' +import calendar from './props/calendar' +import carKeyboard from './props/carKeyboard' +import cell from './props/cell' +import cellGroup from './props/cellGroup' +import checkbox from './props/checkbox' +import checkboxGroup from './props/checkboxGroup' +import circleProgress from './props/circleProgress' +import code from './props/code' +import codeInput from './props/codeInput' +import col from './props/col' +import collapse from './props/collapse' +import collapseItem from './props/collapseItem' +import columnNotice from './props/columnNotice' +import countDown from './props/countDown' +import countTo from './props/countTo' +import datetimePicker from './props/datetimePicker' +import divider from './props/divider' +import empty from './props/empty' +import form from './props/form' +import formItem from './props/formItem' +import gap from './props/gap' +import grid from './props/grid' +import gridItem from './props/gridItem' +import icon from './props/icon' +import image from './props/image' +import indexAnchor from './props/indexAnchor' +import indexList from './props/indexList' +import input from './props/input' +import keyboard from './props/keyboard' +import line from './props/line' +import lineProgress from './props/lineProgress' +import link from './props/link' +import list from './props/list' +import listItem from './props/listItem' +import loadingIcon from './props/loadingIcon' +import loadingPage from './props/loadingPage' +import loadmore from './props/loadmore' +import modal from './props/modal' +import navbar from './props/navbar' +import noNetwork from './props/noNetwork' +import noticeBar from './props/noticeBar' +import notify from './props/notify' +import numberBox from './props/numberBox' +import numberKeyboard from './props/numberKeyboard' +import overlay from './props/overlay' +import parse from './props/parse' +import picker from './props/picker' +import popup from './props/popup' +import radio from './props/radio' +import radioGroup from './props/radioGroup' +import rate from './props/rate' +import readMore from './props/readMore' +import row from './props/row' +import rowNotice from './props/rowNotice' +import scrollList from './props/scrollList' +import search from './props/search' +import section from './props/section' +import skeleton from './props/skeleton' +import slider from './props/slider' +import statusBar from './props/statusBar' +import steps from './props/steps' +import stepsItem from './props/stepsItem' +import sticky from './props/sticky' +import subsection from './props/subsection' +import swipeAction from './props/swipeAction' +import swipeActionItem from './props/swipeActionItem' +import swiper from './props/swiper' +import swipterIndicator from './props/swipterIndicator' +import _switch from './props/switch' +import tabbar from './props/tabbar' +import tabbarItem from './props/tabbarItem' +import tabs from './props/tabs' +import tag from './props/tag' +import text from './props/text' +import textarea from './props/textarea' +import toast from './props/toast' +import toolbar from './props/toolbar' +import tooltip from './props/tooltip' +import transition from './props/transition' +import upload from './props/upload' + +const { + color +} = config + +export default { + ...actionSheet, + ...album, + ...alert, + ...avatar, + ...avatarGroup, + ...backtop, + ...badge, + ...button, + ...calendar, + ...carKeyboard, + ...cell, + ...cellGroup, + ...checkbox, + ...checkboxGroup, + ...circleProgress, + ...code, + ...codeInput, + ...col, + ...collapse, + ...collapseItem, + ...columnNotice, + ...countDown, + ...countTo, + ...datetimePicker, + ...divider, + ...empty, + ...form, + ...formItem, + ...gap, + ...grid, + ...gridItem, + ...icon, + ...image, + ...indexAnchor, + ...indexList, + ...input, + ...keyboard, + ...line, + ...lineProgress, + ...link, + ...list, + ...listItem, + ...loadingIcon, + ...loadingPage, + ...loadmore, + ...modal, + ...navbar, + ...noNetwork, + ...noticeBar, + ...notify, + ...numberBox, + ...numberKeyboard, + ...overlay, + ...parse, + ...picker, + ...popup, + ...radio, + ...radioGroup, + ...rate, + ...readMore, + ...row, + ...rowNotice, + ...scrollList, + ...search, + ...section, + ...skeleton, + ...slider, + ...statusBar, + ...steps, + ...stepsItem, + ...sticky, + ...subsection, + ...swipeAction, + ...swipeActionItem, + ...swiper, + ...swipterIndicator, + ..._switch, + ...tabbar, + ...tabbarItem, + ...tabs, + ...tag, + ...text, + ...textarea, + ...toast, + ...toolbar, + ...tooltip, + ...transition, + ...upload +} diff --git a/uni_modules/uview-ui/libs/config/props/actionSheet.js b/uni_modules/uview-ui/libs/config/props/actionSheet.js new file mode 100644 index 0000000..d8061a7 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/actionSheet.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:44:35 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/actionSheet.js + */ +export default { + // action-sheet组件 + actionSheet: { + show: false, + title: '', + description: '', + actions: () => [], + index: '', + cancelText: '', + closeOnClickAction: true, + safeAreaInsetBottom: true, + openType: '', + closeOnClickOverlay: true, + round: 0 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/album.js b/uni_modules/uview-ui/libs/config/props/album.js new file mode 100644 index 0000000..8877326 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/album.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:47:24 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/album.js + */ +export default { + // album 组件 + album: { + urls: () => [], + keyName: '', + singleSize: 180, + multipleSize: 70, + space: 6, + singleMode: 'scaleToFill', + multipleMode: 'aspectFill', + maxCount: 9, + previewFullImage: true, + rowCount: 3, + showMore: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/alert.js b/uni_modules/uview-ui/libs/config/props/alert.js new file mode 100644 index 0000000..8f8182c --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/alert.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:48:53 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/alert.js + */ +export default { + // alert警告组件 + alert: { + title: '', + type: 'warning', + description: '', + closable: false, + showIcon: false, + effect: 'light', + center: false, + fontSize: 14 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/avatar.js b/uni_modules/uview-ui/libs/config/props/avatar.js new file mode 100644 index 0000000..c097d4e --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/avatar.js @@ -0,0 +1,28 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:49:22 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/avatar.js + */ +export default { + // avatar 组件 + avatar: { + src: '', + shape: 'circle', + size: 40, + mode: 'scaleToFill', + text: '', + bgColor: '#c0c4cc', + color: '#ffffff', + fontSize: 18, + icon: '', + mpAvatar: false, + randomBgColor: false, + defaultUrl: '', + colorIndex: '', + name: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/avatarGroup.js b/uni_modules/uview-ui/libs/config/props/avatarGroup.js new file mode 100644 index 0000000..f4a66c3 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/avatarGroup.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:49:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/avatarGroup.js + */ +export default { + // avatarGroup 组件 + avatarGroup: { + urls: () => [], + maxCount: 5, + shape: 'circle', + mode: 'scaleToFill', + showMore: true, + size: 40, + keyName: '', + gap: 0.5, + extraValue: 0 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/backtop.js b/uni_modules/uview-ui/libs/config/props/backtop.js new file mode 100644 index 0000000..80f17d0 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/backtop.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:50:18 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/backtop.js + */ +export default { + // backtop组件 + backtop: { + mode: 'circle', + icon: 'arrow-upward', + text: '', + duration: 100, + scrollTop: 0, + top: 400, + bottom: 100, + right: 20, + zIndex: 9, + iconStyle: () => ({ + color: '#909399', + fontSize: '19px' + }) + } +} diff --git a/uni_modules/uview-ui/libs/config/props/badge.js b/uni_modules/uview-ui/libs/config/props/badge.js new file mode 100644 index 0000000..44ee7cc --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/badge.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-23 19:51:50 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/badge.js + */ +export default { + // 徽标数组件 + badge: { + isDot: false, + value: '', + show: true, + max: 999, + type: 'error', + showZero: false, + bgColor: null, + color: null, + shape: 'circle', + numberType: 'overflow', + offset: () => [], + inverted: false, + absolute: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/button.js b/uni_modules/uview-ui/libs/config/props/button.js new file mode 100644 index 0000000..acd65fc --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/button.js @@ -0,0 +1,42 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:51:27 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/button.js + */ +export default { + // button组件 + button: { + hairline: false, + type: 'info', + size: 'normal', + shape: 'square', + plain: false, + disabled: false, + loading: false, + loadingText: '', + loadingMode: 'spinner', + loadingSize: 15, + openType: '', + formType: '', + appParameter: '', + hoverStopPropagation: true, + lang: 'en', + sessionFrom: '', + sendMessageTitle: '', + sendMessagePath: '', + sendMessageImg: '', + showMessageCard: false, + dataName: '', + throttleTime: 0, + hoverStartTime: 0, + hoverStayTime: 200, + text: '', + icon: '', + iconColor: '', + color: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/calendar.js b/uni_modules/uview-ui/libs/config/props/calendar.js new file mode 100644 index 0000000..bfd2bd6 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/calendar.js @@ -0,0 +1,42 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:52:43 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/calendar.js + */ +export default { + // calendar 组件 + calendar: { + title: '日期选择', + showTitle: true, + showSubtitle: true, + mode: 'single', + startText: '开始', + endText: '结束', + customList: () => [], + color: '#3c9cff', + minDate: 0, + maxDate: 0, + defaultDate: null, + maxCount: Number.MAX_SAFE_INTEGER, // Infinity + rowHeight: 56, + formatter: null, + showLunar: false, + showMark: true, + confirmText: '确定', + confirmDisabledText: '确定', + show: false, + closeOnClickOverlay: false, + readonly: false, + showConfirm: true, + maxRange: Number.MAX_SAFE_INTEGER, // Infinity + rangePrompt: '', + showRangePrompt: true, + allowSameDay: false, + round: 0, + monthNum: 3 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/carKeyboard.js b/uni_modules/uview-ui/libs/config/props/carKeyboard.js new file mode 100644 index 0000000..af1baa0 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/carKeyboard.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:53:20 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/carKeyboard.js + */ +export default { + // 车牌号键盘 + carKeyboard: { + random: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/cell.js b/uni_modules/uview-ui/libs/config/props/cell.js new file mode 100644 index 0000000..425ea3f --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/cell.js @@ -0,0 +1,35 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-23 20:53:09 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/cell.js + */ +export default { + // cell组件的props + cell: { + customClass: '', + title: '', + label: '', + value: '', + icon: '', + disabled: false, + border: true, + center: false, + url: '', + linkType: 'navigateTo', + clickable: false, + isLink: false, + required: false, + arrowDirection: '', + iconStyle: {}, + rightIconStyle: {}, + rightIcon: 'arrow-right', + titleStyle: {}, + size: '', + stop: true, + name: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/cellGroup.js b/uni_modules/uview-ui/libs/config/props/cellGroup.js new file mode 100644 index 0000000..d48a9cd --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/cellGroup.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:54:16 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/cellGroup.js + */ +export default { + // cell-group组件的props + cellGroup: { + title: '', + border: true, + customStyle: {} + } +} diff --git a/uni_modules/uview-ui/libs/config/props/checkbox.js b/uni_modules/uview-ui/libs/config/props/checkbox.js new file mode 100644 index 0000000..2310901 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/checkbox.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-23 21:06:59 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/checkbox.js + */ +export default { + // checkbox组件 + checkbox: { + name: '', + shape: '', + size: '', + checkbox: false, + disabled: '', + activeColor: '', + inactiveColor: '', + iconSize: '', + iconColor: '', + label: '', + labelSize: '', + labelColor: '', + labelDisabled: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/checkboxGroup.js b/uni_modules/uview-ui/libs/config/props/checkboxGroup.js new file mode 100644 index 0000000..8798fa4 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/checkboxGroup.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:54:47 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/checkboxGroup.js + */ +export default { + // checkbox-group组件 + checkboxGroup: { + name: '', + value: () => [], + shape: 'square', + disabled: false, + activeColor: '#2979ff', + inactiveColor: '#c8c9cc', + size: 18, + placement: 'row', + labelSize: 14, + labelColor: '#303133', + labelDisabled: false, + iconColor: '#ffffff', + iconSize: 12, + iconPlacement: 'left', + borderBottom: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/circleProgress.js b/uni_modules/uview-ui/libs/config/props/circleProgress.js new file mode 100644 index 0000000..b3a9b43 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/circleProgress.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:55:02 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/circleProgress.js + */ +export default { + // circleProgress 组件 + circleProgress: { + percentage: 30 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/code.js b/uni_modules/uview-ui/libs/config/props/code.js new file mode 100644 index 0000000..693417a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/code.js @@ -0,0 +1,21 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:55:27 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/code.js + */ + +export default { + // code 组件 + code: { + seconds: 60, + startText: '获取验证码', + changeText: 'X秒重新获取', + endText: '重新获取', + keepRunning: false, + uniqueKey: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/codeInput.js b/uni_modules/uview-ui/libs/config/props/codeInput.js new file mode 100644 index 0000000..cac9265 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/codeInput.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:55:58 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/codeInput.js + */ +export default { + // codeInput 组件 + codeInput: { + adjustPosition: true, + maxlength: 6, + dot: false, + mode: 'box', + hairline: false, + space: 10, + value: '', + focus: false, + bold: false, + color: '#606266', + fontSize: 18, + size: 35, + disabledKeyboard: false, + borderColor: '#c9cacc', + disabledDot: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/col.js b/uni_modules/uview-ui/libs/config/props/col.js new file mode 100644 index 0000000..7621653 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/col.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:56:12 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/col.js + */ +export default { + // col 组件 + col: { + span: 12, + offset: 0, + justify: 'start', + align: 'stretch', + textAlign: 'left' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/collapse.js b/uni_modules/uview-ui/libs/config/props/collapse.js new file mode 100644 index 0000000..c2b9fdd --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/collapse.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:56:30 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/collapse.js + */ +export default { + // collapse 组件 + collapse: { + value: null, + accordion: false, + border: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/collapseItem.js b/uni_modules/uview-ui/libs/config/props/collapseItem.js new file mode 100644 index 0000000..74ce682 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/collapseItem.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:56:42 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/collapseItem.js + */ +export default { + // collapseItem 组件 + collapseItem: { + title: '', + value: '', + label: '', + disabled: false, + isLink: true, + clickable: true, + border: true, + align: 'left', + name: '', + icon: '', + duration: 300 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/columnNotice.js b/uni_modules/uview-ui/libs/config/props/columnNotice.js new file mode 100644 index 0000000..147c0aa --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/columnNotice.js @@ -0,0 +1,24 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:57:16 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/columnNotice.js + */ +export default { + // columnNotice 组件 + columnNotice: { + text: '', + icon: 'volume', + mode: '', + color: '#f9ae3d', + bgColor: '#fdf6ec', + fontSize: 14, + speed: 80, + step: false, + duration: 1500, + disableTouch: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/countDown.js b/uni_modules/uview-ui/libs/config/props/countDown.js new file mode 100644 index 0000000..81e33b1 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/countDown.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:11:29 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/countDown.js + */ +export default { + // u-count-down 计时器组件 + countDown: { + time: 0, + format: 'HH:mm:ss', + autoStart: true, + millisecond: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/countTo.js b/uni_modules/uview-ui/libs/config/props/countTo.js new file mode 100644 index 0000000..a536cde --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/countTo.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:57:32 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/countTo.js + */ +export default { + // countTo 组件 + countTo: { + startVal: 0, + endVal: 0, + duration: 2000, + autoplay: true, + decimals: 0, + useEasing: true, + decimal: '.', + color: '#606266', + fontSize: 22, + bold: false, + separator: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/datetimePicker.js b/uni_modules/uview-ui/libs/config/props/datetimePicker.js new file mode 100644 index 0000000..4f90966 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/datetimePicker.js @@ -0,0 +1,36 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:57:48 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/datetimePicker.js + */ +export default { + // datetimePicker 组件 + datetimePicker: { + show: false, + showToolbar: true, + value: '', + title: '', + mode: 'datetime', + maxDate: new Date(new Date().getFullYear() + 10, 0, 1).getTime(), + minDate: new Date(new Date().getFullYear() - 10, 0, 1).getTime(), + minHour: 0, + maxHour: 23, + minMinute: 0, + maxMinute: 59, + filter: null, + formatter: null, + loading: false, + itemHeight: 44, + cancelText: '取消', + confirmText: '确认', + cancelColor: '#909193', + confirmColor: '#3c9cff', + visibleItemCount: 5, + closeOnClickOverlay: false, + defaultIndex: () => [] + } +} diff --git a/uni_modules/uview-ui/libs/config/props/divider.js b/uni_modules/uview-ui/libs/config/props/divider.js new file mode 100644 index 0000000..55a8ce4 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/divider.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:58:03 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/divider.js + */ +export default { + // divider组件 + divider: { + dashed: false, + hairline: true, + dot: false, + textPosition: 'center', + text: '', + textSize: 14, + textColor: '#909399', + lineColor: '#dcdfe6' + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/empty.js b/uni_modules/uview-ui/libs/config/props/empty.js new file mode 100644 index 0000000..fe20445 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/empty.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:03:27 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/empty.js + */ +export default { + // empty组件 + empty: { + icon: '', + text: '', + textColor: '#c0c4cc', + textSize: 14, + iconColor: '#c0c4cc', + iconSize: 90, + mode: 'data', + width: 160, + height: 160, + show: true, + marginTop: 0 + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/form.js b/uni_modules/uview-ui/libs/config/props/form.js new file mode 100644 index 0000000..41b122e --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/form.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:03:49 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/form.js + */ +export default { + // form 组件 + form: { + model: () => ({}), + rules: () => ({}), + errorType: 'message', + borderBottom: true, + labelPosition: 'left', + labelWidth: 45, + labelAlign: 'left', + labelStyle: () => ({}) + } +} diff --git a/uni_modules/uview-ui/libs/config/props/formItem.js b/uni_modules/uview-ui/libs/config/props/formItem.js new file mode 100644 index 0000000..4b7c90a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/formItem.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:04:32 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/formItem.js + */ +export default { + // formItem 组件 + formItem: { + label: '', + prop: '', + borderBottom: '', + labelPosition: '', + labelWidth: '', + rightIcon: '', + leftIcon: '', + required: false, + leftIconStyle: '', + } +} diff --git a/uni_modules/uview-ui/libs/config/props/gap.js b/uni_modules/uview-ui/libs/config/props/gap.js new file mode 100644 index 0000000..60a21af --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/gap.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:05:25 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/gap.js + */ +export default { + // gap组件 + gap: { + bgColor: 'transparent', + height: 20, + marginTop: 0, + marginBottom: 0, + customStyle: {} + } +} diff --git a/uni_modules/uview-ui/libs/config/props/grid.js b/uni_modules/uview-ui/libs/config/props/grid.js new file mode 100644 index 0000000..60abeb7 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/grid.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:05:57 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/grid.js + */ +export default { + // grid组件 + grid: { + col: 3, + border: false, + align: 'left' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/gridItem.js b/uni_modules/uview-ui/libs/config/props/gridItem.js new file mode 100644 index 0000000..1b747f4 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/gridItem.js @@ -0,0 +1,16 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:06:13 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/gridItem.js + */ +export default { + // grid-item组件 + gridItem: { + name: null, + bgColor: 'transparent' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/icon.js b/uni_modules/uview-ui/libs/config/props/icon.js new file mode 100644 index 0000000..1d81d2d --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/icon.js @@ -0,0 +1,36 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 18:00:14 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/icon.js + */ +import config from '../config' + +const { + color +} = config +export default { + // icon组件 + icon: { + name: '', + color: color['u-content-color'], + size: '16px', + bold: false, + index: '', + hoverClass: '', + customPrefix: 'uicon', + label: '', + labelPos: 'right', + labelSize: '15px', + labelColor: color['u-content-color'], + space: '3px', + imgMode: '', + width: '', + height: '', + top: 0, + stop: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/image.js b/uni_modules/uview-ui/libs/config/props/image.js new file mode 100644 index 0000000..2552db6 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/image.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:01:51 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/image.js + */ +export default { + // image组件 + image: { + src: '', + mode: 'aspectFill', + width: '300', + height: '225', + shape: 'square', + radius: 0, + lazyLoad: true, + showMenuByLongpress: true, + loadingIcon: 'photo', + errorIcon: 'error-circle', + showLoading: true, + showError: true, + fade: true, + webp: false, + duration: 500, + bgColor: '#f3f4f6' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/indexAnchor.js b/uni_modules/uview-ui/libs/config/props/indexAnchor.js new file mode 100644 index 0000000..bb20d46 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/indexAnchor.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:13:15 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/indexAnchor.js + */ +export default { + // indexAnchor 组件 + indexAnchor: { + text: '', + color: '#606266', + size: 14, + bgColor: '#dedede', + height: 32 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/indexList.js b/uni_modules/uview-ui/libs/config/props/indexList.js new file mode 100644 index 0000000..dc6ce94 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/indexList.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:13:35 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/indexList.js + */ +export default { + // indexList 组件 + indexList: { + inactiveColor: '#606266', + activeColor: '#5677fc', + indexList: () => [], + sticky: true, + customNavHeight: 0 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/input.js b/uni_modules/uview-ui/libs/config/props/input.js new file mode 100644 index 0000000..4f0edc6 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/input.js @@ -0,0 +1,48 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:13:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/input.js + */ +export default { + // index 组件 + input: { + value: '', + type: 'text', + fixed: false, + disabled: false, + disabledColor: '#f5f7fa', + clearable: false, + password: false, + maxlength: -1, + placeholder: null, + placeholderClass: 'input-placeholder', + placeholderStyle: 'color: #c0c4cc', + showWordLimit: false, + confirmType: 'done', + confirmHold: false, + holdKeyboard: false, + focus: false, + autoBlur: false, + disableDefaultPadding: false, + cursor: -1, + cursorSpacing: 30, + selectionStart: -1, + selectionEnd: -1, + adjustPosition: true, + inputAlign: 'left', + fontSize: '15px', + color: '#303133', + prefixIcon: '', + prefixIconStyle: '', + suffixIcon: '', + suffixIconStyle: '', + border: 'surround', + readonly: false, + shape: 'square', + formatter: null + } +} diff --git a/uni_modules/uview-ui/libs/config/props/keyboard.js b/uni_modules/uview-ui/libs/config/props/keyboard.js new file mode 100644 index 0000000..57182bd --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/keyboard.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:07:49 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/keyboard.js + */ +export default { + // 键盘组件 + keyboard: { + mode: 'number', + dotDisabled: false, + tooltip: true, + showTips: true, + tips: '', + showCancel: true, + showConfirm: true, + random: false, + safeAreaInsetBottom: true, + closeOnClickOverlay: true, + show: false, + overlay: true, + zIndex: 10075, + cancelText: '取消', + confirmText: '确定', + autoChange: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/line.js b/uni_modules/uview-ui/libs/config/props/line.js new file mode 100644 index 0000000..2c87af2 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/line.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:04:49 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/line.js + */ +export default { + // line组件 + line: { + color: '#d6d7d9', + length: '100%', + direction: 'row', + hairline: true, + margin: 0, + dashed: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/lineProgress.js b/uni_modules/uview-ui/libs/config/props/lineProgress.js new file mode 100644 index 0000000..cdfcb0e --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/lineProgress.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:14:11 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/lineProgress.js + */ +export default { + // lineProgress 组件 + lineProgress: { + activeColor: '#19be6b', + inactiveColor: '#ececec', + percentage: 0, + showText: true, + height: 12 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/link.js b/uni_modules/uview-ui/libs/config/props/link.js new file mode 100644 index 0000000..6c4c883 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/link.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:45:36 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/link.js + */ +import config from '../config' + +const { + color +} = config +export default { + // link超链接组件props参数 + link: { + color: color['u-primary'], + fontSize: 15, + underLine: false, + href: '', + mpTips: '链接已复制,请在浏览器打开', + lineColor: '', + text: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/list.js b/uni_modules/uview-ui/libs/config/props/list.js new file mode 100644 index 0000000..a830c32 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/list.js @@ -0,0 +1,28 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:14:53 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/list.js + */ +export default { + // list 组件 + list: { + showScrollbar: false, + lowerThreshold: 50, + upperThreshold: 0, + scrollTop: 0, + offsetAccuracy: 10, + enableFlex: false, + pagingEnabled: false, + scrollable: true, + scrollIntoView: '', + scrollWithAnimation: false, + enableBackToTop: false, + height: 0, + width: 0, + preLoadScreen: 1 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/listItem.js b/uni_modules/uview-ui/libs/config/props/listItem.js new file mode 100644 index 0000000..7fe2166 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/listItem.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:15:40 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/listItem.js + */ +export default { + // listItem 组件 + listItem: { + anchor: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/loadingIcon.js b/uni_modules/uview-ui/libs/config/props/loadingIcon.js new file mode 100644 index 0000000..f4739c4 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/loadingIcon.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:45:47 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadingIcon.js + */ +import config from '../config' + +const { + color +} = config +export default { + // loading-icon加载中图标组件 + loadingIcon: { + show: true, + color: color['u-tips-color'], + textColor: color['u-tips-color'], + vertical: false, + mode: 'spinner', + size: 24, + textSize: 15, + text: '', + timingFunction: 'ease-in-out', + duration: 1200, + inactiveColor: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/loadingPage.js b/uni_modules/uview-ui/libs/config/props/loadingPage.js new file mode 100644 index 0000000..dc53109 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/loadingPage.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:00:23 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadingPage.js + */ +export default { + // loading-page组件 + loadingPage: { + loadingText: '正在加载', + image: '', + loadingMode: 'circle', + loading: false, + bgColor: '#ffffff', + color: '#C8C8C8', + fontSize: 19, + iconSize: 28, + loadingColor: '#C8C8C8' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/loadmore.js b/uni_modules/uview-ui/libs/config/props/loadmore.js new file mode 100644 index 0000000..67c1160 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/loadmore.js @@ -0,0 +1,32 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:15:26 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadmore.js + */ +export default { + // loadmore 组件 + loadmore: { + status: 'loadmore', + bgColor: 'transparent', + icon: true, + fontSize: 14, + iconSize: 17, + color: '#606266', + loadingIcon: 'spinner', + loadmoreText: '加载更多', + loadingText: '正在加载...', + nomoreText: '没有更多了', + isDot: false, + iconColor: '#b7b7b7', + marginTop: 10, + marginBottom: 10, + height: 'auto', + line: false, + lineColor: '#E6E8EB', + dashed: false, + } +} diff --git a/uni_modules/uview-ui/libs/config/props/modal.js b/uni_modules/uview-ui/libs/config/props/modal.js new file mode 100644 index 0000000..2ae3fff --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/modal.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:15:59 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/modal.js + */ +export default { + // modal 组件 + modal: { + show: false, + title: '', + content: '', + confirmText: '确认', + cancelText: '取消', + showConfirmButton: true, + showCancelButton: false, + confirmColor: '#2979ff', + cancelColor: '#606266', + buttonReverse: false, + zoom: true, + asyncClose: false, + closeOnClickOverlay: false, + negativeTop: 0, + width: '650rpx', + confirmButtonShape: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/navbar.js b/uni_modules/uview-ui/libs/config/props/navbar.js new file mode 100644 index 0000000..614a99d --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/navbar.js @@ -0,0 +1,32 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:16:18 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/navbar.js + */ +import color from '../color' +export default { + // navbar 组件 + navbar: { + safeAreaInsetTop: true, + placeholder: false, + fixed: true, + border: false, + leftIcon: 'arrow-left', + leftText: '', + rightText: '', + rightIcon: '', + title: '', + bgColor: '#ffffff', + titleWidth: '400rpx', + height: '44px', + leftIconSize: 20, + leftIconColor: color.mainColor, + autoBack: false, + titleStyle: '' + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/noNetwork.js b/uni_modules/uview-ui/libs/config/props/noNetwork.js new file mode 100644 index 0000000..74dba1b --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/noNetwork.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:16:39 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/noNetwork.js + */ +export default { + // noNetwork + noNetwork: { + tips: '哎呀,网络信号丢失', + zIndex: '', + image: 'data:image/png;base64,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' + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/noticeBar.js b/uni_modules/uview-ui/libs/config/props/noticeBar.js new file mode 100644 index 0000000..02c660a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/noticeBar.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:17:13 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/noticeBar.js + */ +export default { + // noticeBar + noticeBar: { + text: () => [], + direction: 'row', + step: false, + icon: 'volume', + mode: '', + color: '#f9ae3d', + bgColor: '#fdf6ec', + speed: 80, + fontSize: 14, + duration: 2000, + disableTouch: true, + url: '', + linkType: 'navigateTo' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/notify.js b/uni_modules/uview-ui/libs/config/props/notify.js new file mode 100644 index 0000000..1042d2a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/notify.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:10:21 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/notify.js + */ +export default { + // notify组件 + notify: { + top: 0, + type: 'primary', + color: '#ffffff', + bgColor: '', + message: '', + duration: 3000, + fontSize: 15, + safeAreaInsetTop: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/numberBox.js b/uni_modules/uview-ui/libs/config/props/numberBox.js new file mode 100644 index 0000000..424f0ca --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/numberBox.js @@ -0,0 +1,35 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:11:46 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/numberBox.js + */ +export default { + // 步进器组件 + numberBox: { + name: '', + value: 0, + min: 1, + max: Number.MAX_SAFE_INTEGER, + step: 1, + integer: false, + disabled: false, + disabledInput: false, + asyncChange: false, + inputWidth: 35, + showMinus: true, + showPlus: true, + decimalLength: null, + longPress: true, + color: '#323233', + buttonSize: 30, + bgColor: '#EBECEE', + cursorSpacing: 100, + disableMinus: false, + disablePlus: false, + iconStyle: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/numberKeyboard.js b/uni_modules/uview-ui/libs/config/props/numberKeyboard.js new file mode 100644 index 0000000..7b45065 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/numberKeyboard.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:08:05 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/numberKeyboard.js + */ +export default { + // 数字键盘 + numberKeyboard: { + mode: 'number', + dotDisabled: false, + random: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/overlay.js b/uni_modules/uview-ui/libs/config/props/overlay.js new file mode 100644 index 0000000..c26d068 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/overlay.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:06:50 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/overlay.js + */ +export default { + // overlay组件 + overlay: { + show: false, + zIndex: 10070, + duration: 300, + opacity: 0.5 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/parse.js b/uni_modules/uview-ui/libs/config/props/parse.js new file mode 100644 index 0000000..feb22b9 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/parse.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:17:33 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/parse.js + */ +export default { + // parse + parse: { + copyLink: true, + errorImg: '', + lazyLoad: false, + loadingImg: '', + pauseVideo: true, + previewImg: true, + setTitle: true, + showImgMenu: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/picker.js b/uni_modules/uview-ui/libs/config/props/picker.js new file mode 100644 index 0000000..f06b321 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/picker.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:18:20 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/picker.js + */ +export default { + // picker + picker: { + show: false, + showToolbar: true, + title: '', + columns: () => [], + loading: false, + itemHeight: 44, + cancelText: '取消', + confirmText: '确定', + cancelColor: '#909193', + confirmColor: '#3c9cff', + visibleItemCount: 5, + keyName: 'text', + closeOnClickOverlay: false, + defaultIndex: () => [], + immediateChange: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/popup.js b/uni_modules/uview-ui/libs/config/props/popup.js new file mode 100644 index 0000000..0cc1bc0 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/popup.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:06:33 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/popup.js + */ +export default { + // popup组件 + popup: { + show: false, + overlay: true, + mode: 'bottom', + duration: 300, + closeable: false, + overlayStyle: () => {}, + closeOnClickOverlay: true, + zIndex: 10075, + safeAreaInsetBottom: true, + safeAreaInsetTop: false, + closeIconPos: 'top-right', + round: 0, + zoom: true, + bgColor: '', + overlayOpacity: 0.5 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/radio.js b/uni_modules/uview-ui/libs/config/props/radio.js new file mode 100644 index 0000000..4df200f --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/radio.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:02:34 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/radio.js + */ +export default { + // radio组件 + radio: { + name: '', + shape: '', + disabled: '', + labelDisabled: '', + activeColor: '', + inactiveColor: '', + iconSize: '', + labelSize: '', + label: '', + labelColor: '', + size: '', + iconColor: '', + placement: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/radioGroup.js b/uni_modules/uview-ui/libs/config/props/radioGroup.js new file mode 100644 index 0000000..728e9db --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/radioGroup.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:03:12 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/radioGroup.js + */ +export default { + // radio-group组件 + radioGroup: { + value: '', + disabled: false, + shape: 'circle', + activeColor: '#2979ff', + inactiveColor: '#c8c9cc', + name: '', + size: 18, + placement: 'row', + label: '', + labelColor: '#303133', + labelSize: 14, + labelDisabled: false, + iconColor: '#ffffff', + iconSize: 12, + borderBottom: false, + iconPlacement: 'left' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/rate.js b/uni_modules/uview-ui/libs/config/props/rate.js new file mode 100644 index 0000000..d31c61a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/rate.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:05:09 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/rate.js + */ +export default { + // rate组件 + rate: { + value: 1, + count: 5, + disabled: false, + size: 18, + inactiveColor: '#b2b2b2', + activeColor: '#FA3534', + gutter: 4, + minCount: 1, + allowHalf: false, + activeIcon: 'star-fill', + inactiveIcon: 'star', + touchable: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/readMore.js b/uni_modules/uview-ui/libs/config/props/readMore.js new file mode 100644 index 0000000..09b11cc --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/readMore.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:18:41 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/readMore.js + */ +export default { + // readMore + readMore: { + showHeight: 400, + toggle: false, + closeText: '展开阅读全文', + openText: '收起', + color: '#2979ff', + fontSize: 14, + textIndent: '2em', + name: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/row.js b/uni_modules/uview-ui/libs/config/props/row.js new file mode 100644 index 0000000..573a431 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/row.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:18:58 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/row.js + */ +export default { + // row + row: { + gutter: 0, + justify: 'start', + align: 'center' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/rowNotice.js b/uni_modules/uview-ui/libs/config/props/rowNotice.js new file mode 100644 index 0000000..cd9d0a0 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/rowNotice.js @@ -0,0 +1,21 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:19:13 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/rowNotice.js + */ +export default { + // rowNotice + rowNotice: { + text: '', + icon: 'volume', + mode: '', + color: '#f9ae3d', + bgColor: '#fdf6ec', + fontSize: 14, + speed: 80 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/scrollList.js b/uni_modules/uview-ui/libs/config/props/scrollList.js new file mode 100644 index 0000000..441e63a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/scrollList.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:19:28 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/scrollList.js + */ +export default { + // scrollList + scrollList: { + indicatorWidth: 50, + indicatorBarWidth: 20, + indicator: true, + indicatorColor: '#f2f2f2', + indicatorActiveColor: '#3c9cff', + indicatorStyle: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/search.js b/uni_modules/uview-ui/libs/config/props/search.js new file mode 100644 index 0000000..2699954 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/search.js @@ -0,0 +1,37 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:19:45 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/search.js + */ +export default { + // search + search: { + shape: 'round', + bgColor: '#f2f2f2', + placeholder: '请输入关键字', + clearabled: true, + focus: false, + showAction: true, + actionStyle: () => ({}), + actionText: '搜索', + inputAlign: 'left', + inputStyle: () => ({}), + disabled: false, + borderColor: 'transparent', + searchIconColor: '#909399', + searchIconSize: 22, + color: '#606266', + placeholderColor: '#909399', + searchIcon: 'search', + margin: '0', + animation: false, + value: '', + maxlength: '-1', + height: 32, + label: null + } +} diff --git a/uni_modules/uview-ui/libs/config/props/section.js b/uni_modules/uview-ui/libs/config/props/section.js new file mode 100644 index 0000000..f432648 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/section.js @@ -0,0 +1,24 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:07:33 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/section.js + */ +export default { + // u-section组件 + section: { + title: '', + subTitle: '更多', + right: true, + fontSize: 15, + bold: true, + color: '#303133', + subColor: '#909399', + showLine: true, + lineColor: '', + arrow: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/skeleton.js b/uni_modules/uview-ui/libs/config/props/skeleton.js new file mode 100644 index 0000000..83b777d --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/skeleton.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:20:14 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/skeleton.js + */ +export default { + // skeleton + skeleton: { + loading: true, + animate: true, + rows: 0, + rowsWidth: '100%', + rowsHeight: 18, + title: true, + titleWidth: '50%', + titleHeight: 18, + avatar: false, + avatarSize: 32, + avatarShape: 'circle' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/slider.js b/uni_modules/uview-ui/libs/config/props/slider.js new file mode 100644 index 0000000..50cc37f --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/slider.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:08:25 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/slider.js + */ +export default { + // slider组件 + slider: { + value: 0, + blockSize: 18, + min: 0, + max: 100, + step: 1, + activeColor: '#2979ff', + inactiveColor: '#c0c4cc', + blockColor: '#ffffff', + showValue: false, + disabled:false, + blockStyle: () => {} + } +} diff --git a/uni_modules/uview-ui/libs/config/props/statusBar.js b/uni_modules/uview-ui/libs/config/props/statusBar.js new file mode 100644 index 0000000..d237a83 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/statusBar.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:20:39 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/statusBar.js + */ +export default { + // statusBar + statusBar: { + bgColor: 'transparent' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/steps.js b/uni_modules/uview-ui/libs/config/props/steps.js new file mode 100644 index 0000000..881c39e --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/steps.js @@ -0,0 +1,21 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:12:37 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/steps.js + */ +export default { + // steps组件 + steps: { + direction: 'row', + current: 0, + activeColor: '#3c9cff', + inactiveColor: '#969799', + activeIcon: '', + inactiveIcon: '', + dot: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/stepsItem.js b/uni_modules/uview-ui/libs/config/props/stepsItem.js new file mode 100644 index 0000000..5dba8f4 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/stepsItem.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:12:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/stepsItem.js + */ +export default { + // steps-item组件 + stepsItem: { + title: '', + desc: '', + iconSize: 17, + error: false + } +} diff --git a/uni_modules/uview-ui/libs/config/props/sticky.js b/uni_modules/uview-ui/libs/config/props/sticky.js new file mode 100644 index 0000000..b034604 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/sticky.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:01:30 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/sticky.js + */ +export default { + // sticky组件 + sticky: { + offsetTop: 0, + customNavHeight: 0, + disabled: false, + bgColor: 'transparent', + zIndex: '', + index: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/subsection.js b/uni_modules/uview-ui/libs/config/props/subsection.js new file mode 100644 index 0000000..9a165ff --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/subsection.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:12:20 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/subsection.js + */ +export default { + // subsection组件 + subsection: { + list: [], + current: 0, + activeColor: '#3c9cff', + inactiveColor: '#303133', + mode: 'button', + fontSize: 12, + bold: true, + bgColor: '#eeeeef', + keyName: 'name' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/swipeAction.js b/uni_modules/uview-ui/libs/config/props/swipeAction.js new file mode 100644 index 0000000..25051b8 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/swipeAction.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:00:42 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/swipeAction.js + */ +export default { + // swipe-action组件 + swipeAction: { + autoClose: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/swipeActionItem.js b/uni_modules/uview-ui/libs/config/props/swipeActionItem.js new file mode 100644 index 0000000..40ef27c --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/swipeActionItem.js @@ -0,0 +1,21 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:01:13 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/swipeActionItem.js + */ +export default { + // swipeActionItem 组件 + swipeActionItem: { + show: false, + name: '', + disabled: false, + threshold: 20, + autoClose: true, + options: [], + duration: 300 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/swiper.js b/uni_modules/uview-ui/libs/config/props/swiper.js new file mode 100644 index 0000000..0e6a3b7 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/swiper.js @@ -0,0 +1,39 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:21:38 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/swiper.js + */ +export default { + // swiper 组件 + swiper: { + list: () => [], + indicator: false, + indicatorActiveColor: '#FFFFFF', + indicatorInactiveColor: 'rgba(255, 255, 255, 0.35)', + indicatorStyle: '', + indicatorMode: 'line', + autoplay: true, + current: 0, + currentItemId: '', + interval: 3000, + duration: 300, + circular: false, + previousMargin: 0, + nextMargin: 0, + acceleration: false, + displayMultipleItems: 1, + easingFunction: 'default', + keyName: 'url', + imgMode: 'aspectFill', + height: 130, + bgColor: '#f3f4f6', + radius: 4, + loading: false, + showTitle: false + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/swipterIndicator.js b/uni_modules/uview-ui/libs/config/props/swipterIndicator.js new file mode 100644 index 0000000..4b59e6e --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/swipterIndicator.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:22:07 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/swiperIndicator.js + */ +export default { + // swiperIndicator 组件 + swiperIndicator: { + length: 0, + current: 0, + indicatorActiveColor: '', + indicatorInactiveColor: '', + indicatorMode: 'line' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/switch.js b/uni_modules/uview-ui/libs/config/props/switch.js new file mode 100644 index 0000000..e6400b4 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/switch.js @@ -0,0 +1,24 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:22:24 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/switch.js + */ +export default { + // switch + switch: { + loading: false, + disabled: false, + size: 25, + activeColor: '#2979ff', + inactiveColor: '#ffffff', + value: false, + activeValue: true, + inactiveValue: false, + asyncChange: false, + space: 0 + } +} diff --git a/uni_modules/uview-ui/libs/config/props/tabbar.js b/uni_modules/uview-ui/libs/config/props/tabbar.js new file mode 100644 index 0000000..187112d --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/tabbar.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:22:40 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/tabbar.js + */ +export default { + // tabbar + tabbar: { + value: null, + safeAreaInsetBottom: true, + border: true, + zIndex: 1, + activeColor: '#1989fa', + inactiveColor: '#7d7e80', + fixed: true, + placeholder: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/tabbarItem.js b/uni_modules/uview-ui/libs/config/props/tabbarItem.js new file mode 100644 index 0000000..d036ce5 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/tabbarItem.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:22:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/tabbarItem.js + */ +export default { + // + tabbarItem: { + name: null, + icon: '', + badge: null, + dot: false, + text: '', + badgeStyle: 'top: 6px;right:2px;' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/tabs.js b/uni_modules/uview-ui/libs/config/props/tabs.js new file mode 100644 index 0000000..81c794a --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/tabs.js @@ -0,0 +1,32 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:23:14 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/tabs.js + */ +export default { + // + tabs: { + duration: 300, + list: () => [], + lineColor: '#3c9cff', + activeStyle: () => ({ + color: '#303133' + }), + inactiveStyle: () => ({ + color: '#606266' + }), + lineWidth: 20, + lineHeight: 3, + lineBgSize: 'cover', + itemStyle: () => ({ + height: '44px' + }), + scrollable: true, + current: 0, + keyName: 'name' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/tag.js b/uni_modules/uview-ui/libs/config/props/tag.js new file mode 100644 index 0000000..125ce94 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/tag.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:23:37 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/tag.js + */ +export default { + // tag 组件 + tag: { + type: 'primary', + disabled: false, + size: 'medium', + shape: 'square', + text: '', + bgColor: '', + color: '', + borderColor: '', + closeColor: '#C6C7CB', + name: '', + plainFill: false, + plain: false, + closable: false, + show: true, + icon: '' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/text.js b/uni_modules/uview-ui/libs/config/props/text.js new file mode 100644 index 0000000..7e73606 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/text.js @@ -0,0 +1,38 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:23:58 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/text.js + */ +export default { + // text 组件 + text: { + type: '', + show: true, + text: '', + prefixIcon: '', + suffixIcon: '', + mode: '', + href: '', + format: '', + call: false, + openType: '', + bold: false, + block: false, + lines: '', + color: '#303133', + size: 15, + iconStyle: () => ({ + fontSize: '15px' + }), + decoration: 'none', + margin: 0, + lineHeight: '', + align: 'left', + wordWrap: 'normal' + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/textarea.js b/uni_modules/uview-ui/libs/config/props/textarea.js new file mode 100644 index 0000000..44519f9 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/textarea.js @@ -0,0 +1,36 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:24:32 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/textarea.js + */ +export default { + // textarea 组件 + textarea: { + value: '', + placeholder: '', + placeholderClass: 'textarea-placeholder', + placeholderStyle: 'color: #c0c4cc', + height: 70, + confirmType: 'done', + disabled: false, + count: false, + focus: false, + autoHeight: false, + fixed: false, + cursorSpacing: 0, + cursor: '', + showConfirmBar: true, + selectionStart: -1, + selectionEnd: -1, + adjustPosition: true, + disableDefaultPadding: false, + holdKeyboard: false, + maxlength: 140, + border: 'surround', + formatter: null + } +} diff --git a/uni_modules/uview-ui/libs/config/props/toast.js b/uni_modules/uview-ui/libs/config/props/toast.js new file mode 100644 index 0000000..a50134b --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/toast.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:07:07 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/toast.js + */ +export default { + // toast组件 + toast: { + zIndex: 10090, + loading: false, + text: '', + icon: '', + type: '', + loadingMode: '', + show: '', + overlay: false, + position: 'center', + params: () => {}, + duration: 2000, + isTab: false, + url: '', + callback: null, + back: false + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/toolbar.js b/uni_modules/uview-ui/libs/config/props/toolbar.js new file mode 100644 index 0000000..3289967 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/toolbar.js @@ -0,0 +1,21 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:24:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/toolbar.js + */ +export default { + // toolbar 组件 + toolbar: { + show: true, + cancelText: '取消', + confirmText: '确认', + cancelColor: '#909193', + confirmColor: '#3c9cff', + title: '' + } + +} diff --git a/uni_modules/uview-ui/libs/config/props/tooltip.js b/uni_modules/uview-ui/libs/config/props/tooltip.js new file mode 100644 index 0000000..115e030 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/tooltip.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:25:14 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/tooltip.js + */ +export default { + // tooltip 组件 + tooltip: { + text: '', + copyText: '', + size: 14, + color: '#606266', + bgColor: 'transparent', + direction: 'top', + zIndex: 10071, + showCopy: true, + buttons: () => [], + overlay: true, + showToast: true + } +} diff --git a/uni_modules/uview-ui/libs/config/props/transition.js b/uni_modules/uview-ui/libs/config/props/transition.js new file mode 100644 index 0000000..0fad118 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/transition.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:59:00 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/transition.js + */ +export default { + // transition动画组件的props + transition: { + show: false, + mode: 'fade', + duration: '300', + timingFunction: 'ease-out' + } +} diff --git a/uni_modules/uview-ui/libs/config/props/upload.js b/uni_modules/uview-ui/libs/config/props/upload.js new file mode 100644 index 0000000..fc7ca92 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/props/upload.js @@ -0,0 +1,36 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:09:50 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/upload.js + */ +export default { + // upload组件 + upload: { + accept: 'image', + capture: () => ['album', 'camera'], + compressed: true, + camera: 'back', + maxDuration: 60, + uploadIcon: 'camera-fill', + uploadIconColor: '#D3D4D6', + useBeforeRead: false, + previewFullImage: true, + maxCount: 52, + disabled: false, + imageMode: 'aspectFill', + name: '', + sizeType: () => ['original', 'compressed'], + multiple: false, + deletable: true, + maxSize: Number.MAX_VALUE, + fileList: () => [], + uploadText: '', + width: 80, + height: 80, + previewImage: true + } +} diff --git a/uni_modules/uview-ui/libs/config/zIndex.js b/uni_modules/uview-ui/libs/config/zIndex.js new file mode 100644 index 0000000..5fc3682 --- /dev/null +++ b/uni_modules/uview-ui/libs/config/zIndex.js @@ -0,0 +1,20 @@ +// uniapp在H5中各API的z-index值如下: +/** + * actionsheet: 999 + * modal: 999 + * navigate: 998 + * tabbar: 998 + * toast: 999 + */ + +export default { + toast: 10090, + noNetwork: 10080, + // popup包含popup,actionsheet,keyboard,picker的值 + popup: 10075, + mask: 10070, + navbar: 980, + topTips: 975, + sticky: 970, + indexListSticky: 965 +} diff --git a/uni_modules/uview-ui/libs/css/color.scss b/uni_modules/uview-ui/libs/css/color.scss new file mode 100644 index 0000000..3237ba4 --- /dev/null +++ b/uni_modules/uview-ui/libs/css/color.scss @@ -0,0 +1,155 @@ +.u-primary-light { + color: $u-primary-light; +} + +.u-warning-light { + color: $u-warning-light; +} + +.u-success-light { + color: $u-success-light; +} + +.u-error-light { + color: $u-error-light; +} + +.u-info-light { + color: $u-info-light; +} + +.u-primary-light-bg { + background-color: $u-primary-light; +} + +.u-warning-light-bg { + background-color: $u-warning-light; +} + +.u-success-light-bg { + background-color: $u-success-light; +} + +.u-error-light-bg { + background-color: $u-error-light; +} + +.u-info-light-bg { + background-color: $u-info-light; +} + +.u-primary-dark { + color: $u-primary-dark; +} + +.u-warning-dark { + color: $u-warning-dark; +} + +.u-success-dark { + color: $u-success-dark; +} + +.u-error-dark { + color: $u-error-dark; +} + +.u-info-dark { + color: $u-info-dark; +} + +.u-primary-dark-bg { + background-color: $u-primary-dark; +} + +.u-warning-dark-bg { + background-color: $u-warning-dark; +} + +.u-success-dark-bg { + background-color: $u-success-dark; +} + +.u-error-dark-bg { + background-color: $u-error-dark; +} + +.u-info-dark-bg { + background-color: $u-info-dark; +} + +.u-primary-disabled { + color: $u-primary-disabled; +} + +.u-warning-disabled { + color: $u-warning-disabled; +} + +.u-success-disabled { + color: $u-success-disabled; +} + +.u-error-disabled { + color: $u-error-disabled; +} + +.u-info-disabled { + color: $u-info-disabled; +} + +.u-primary { + color: $u-primary; +} + +.u-warning { + color: $u-warning; +} + +.u-success { + color: $u-success; +} + +.u-error { + color: $u-error; +} + +.u-info { + color: $u-info; +} + +.u-primary-bg { + background-color: $u-primary; +} + +.u-warning-bg { + background-color: $u-warning; +} + +.u-success-bg { + background-color: $u-success; +} + +.u-error-bg { + background-color: $u-error; +} + +.u-info-bg { + background-color: $u-info; +} + +.u-main-color { + color: $u-main-color; +} + +.u-content-color { + color: $u-content-color; +} + +.u-tips-color { + color: $u-tips-color; +} + +.u-light-color { + color: $u-light-color; +} diff --git a/uni_modules/uview-ui/libs/css/common.scss b/uni_modules/uview-ui/libs/css/common.scss new file mode 100644 index 0000000..11f1e53 --- /dev/null +++ b/uni_modules/uview-ui/libs/css/common.scss @@ -0,0 +1,97 @@ +// 超出行数,自动显示行尾省略号,最多5行 +// 来自uView的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】 +@for $i from 1 through 5 { + .u-line-#{$i} { + /* #ifdef APP-NVUE */ + // nvue下,可以直接使用lines属性,这是weex特有样式 + lines: $i; + text-overflow: ellipsis; + overflow: hidden; + flex: 1; + /* #endif */ + + /* #ifndef APP-NVUE */ + // vue下,单行和多行显示省略号需要单独处理 + @if $i == '1' { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } @else { + display: -webkit-box!important; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + -webkit-line-clamp: $i; + -webkit-box-orient: vertical!important; + } + /* #endif */ + } +} + + +// 此处加上!important并非随意乱用,而是因为目前*.nvue页面编译到H5时, +// App.vue的样式会被uni-app的view元素的自带border属性覆盖,导致无效 +// 综上,这是uni-app的缺陷导致我们为了多端兼容,而必须要加上!important +// 移动端兼容性较好,直接使用0.5px去实现细边框,不使用伪元素形式实现 +.u-border { + border-width: 0.5px!important; + border-color: $u-border-color!important; + border-style: solid; +} + +.u-border-top { + border-top-width: 0.5px!important; + border-color: $u-border-color!important; + border-top-style: solid; +} + +.u-border-left { + border-left-width: 0.5px!important; + border-color: $u-border-color!important; + border-left-style: solid; +} + +.u-border-right { + border-right-width: 0.5px!important; + border-color: $u-border-color!important; + border-right-style: solid; +} + +.u-border-bottom { + border-bottom-width: 0.5px!important; + border-color: $u-border-color!important; + border-bottom-style: solid; +} + +.u-border-top-bottom { + border-top-width: 0.5px!important; + border-bottom-width: 0.5px!important; + border-color: $u-border-color!important; + border-top-style: solid; + border-bottom-style: solid; +} + +// 去除button的所有默认样式,让其表现跟普通的view、text元素一样 +.u-reset-button { + padding: 0; + background-color: transparent; + /* #ifndef APP-PLUS */ + font-size: inherit; + line-height: inherit; + color: inherit; + /* #endif */ + /* #ifdef APP-NVUE */ + border-width: 0; + /* #endif */ +} + +/* #ifndef APP-NVUE */ +.u-reset-button::after { + border: none; +} +/* #endif */ + +.u-hover-class { + opacity: 0.7; +} + diff --git a/uni_modules/uview-ui/libs/css/components.scss b/uni_modules/uview-ui/libs/css/components.scss new file mode 100644 index 0000000..766679e --- /dev/null +++ b/uni_modules/uview-ui/libs/css/components.scss @@ -0,0 +1,15 @@ +@import "./mixin.scss"; + +/* #ifndef APP-NVUE */ +// 由于uView是基于nvue环境进行开发的,此环境中普通元素默认为flex-direction: column; +// 所以在非nvue中,需要对元素进行重置为flex-direction: column; 否则可能会表现异常 +view, scroll-view, swiper-item { + display: flex; + flex-direction: column; + flex-shrink: 0; + flex-grow: 0; + flex-basis: auto; + align-items: stretch; + align-content: flex-start; +} +/* #endif */ diff --git a/uni_modules/uview-ui/libs/css/flex.scss b/uni_modules/uview-ui/libs/css/flex.scss new file mode 100644 index 0000000..6d61be9 --- /dev/null +++ b/uni_modules/uview-ui/libs/css/flex.scss @@ -0,0 +1,257 @@ +// .u-flex { +// @include vue-flex(row); +// } + +// .u-flex-x { +// @include vue-flex(row); +// } + +// .u-flex-y { +// @include vue-flex(column); +// } + +// .u-flex-xy-center { +// @include vue-flex(row); +// justify-content: center; +// align-items: center; +// } + +// .u-flex-x-center { +// @include vue-flex(row); +// justify-content: center; +// } + +// .u-flex-y-center { +// @include vue-flex(column); +// justify-content: center; +// } + + +// flex布局 +.u-flex, +.u-flex-row, +.u-flex-x { + @include flex; +} + +.u-flex-y, +.u-flex-column { + @include flex(column); +} + +.u-flex-x-center { + @include flex; + justify-content: center; +} + +.u-flex-xy-center { + @include flex; + justify-content: center; + align-items: center; +} + +.u-flex-y-center { + @include flex; + align-items: center; +} + +.u-flex-x-left { + @include flex; +} + +.u-flex-x-reverse, +.u-flex-row-reverse { + flex-direction: row-reverse; +} + +.u-flex-y-reverse, +.u-flex-column-reverse { + flex-direction: column-reverse; +} + +/* #ifndef APP-NVUE */ +// 此处为vue版本的简写,因为nvue不支持同时作用于两个类名的样式写法 +// nvue下只能写成class="u-flex-x u-flex-x-reverse的形式" +.u-flex.u-flex-reverse, +.u-flex-row.u-flex-reverse, +.u-flex-x.u-flex-reverse { + flex-direction: row-reverse; +} + +.u-flex-column.u-flex-reverse, +.u-flex-y.u-flex-reverse { + flex-direction: column-reverse; +} + +// 自动伸缩 +.u-flex-fill { + flex: 1 1 auto +} + +// 边界自动伸缩 +.u-margin-top-auto, +.u-m-t-auto { + margin-top: auto !important +} + +.u-margin-right-auto, +.u-m-r-auto { + margin-right: auto !important +} + +.u-margin-bottom-auto, +.u-m-b-auto { + margin-bottom: auto !important +} + +.u-margin-left-auto, +.u-m-l-auto { + margin-left: auto !important +} + +.u-margin-center-auto, +.u-m-c-auto { + margin-left: auto !important; + margin-right: auto !important +} + +.u-margin-middle-auto, +.u-m-m-auto { + margin-top: auto !important; + margin-bottom: auto !important +} +/* #endif */ + +// 换行 +.u-flex-wrap { + flex-wrap: wrap; +} + +// 反向换行 +.u-flex-wrap-reverse { + flex-wrap: wrap-reverse; +} + +// 主轴起点对齐 +.u-flex-start { + justify-content: flex-start +} + +// 主轴中间对齐 +.u-flex-center { + justify-content: center +} + +// 主轴终点对齐 +.u-flex-end { + justify-content: flex-end +} + +// 主轴等比间距 +.u-flex-between { + justify-content: space-between +} + +// 主轴均分间距 +.u-flex-around { + justify-content: space-around +} + +// 交叉轴起点对齐 +.u-flex-items-start { + align-items: flex-start +} + +// 交叉轴中间对齐 +.u-flex-items-center { + align-items: center +} + +// 交叉轴终点对齐 +.u-flex-items-end { + align-items: flex-end +} + +// 交叉轴第一行文字基线对齐 +.u-flex-items-baseline { + align-items: baseline +} + +// 交叉轴方向拉伸对齐 +.u-flex-items-stretch { + align-items: stretch +} + + +// 以下属于项目(子元素)的类 + +// 子元素交叉轴起点对齐 +.u-flex-self-start { + align-self: flex-start +} + +// 子元素交叉轴居中对齐 +.u-flex-self-center { + align-self: center +} + +// 子元素交叉轴终点对齐 +.u-flex-self-end { + align-self: flex-end +} + +// 子元素交叉轴第一行文字基线对齐 +.u-flex-self-baseline { + align-self: baseline +} + +// 子元素交叉轴方向拉伸对齐 +.u-flex-self-stretch { + align-self: stretch +} + +// 多轴交叉时的对齐方式 + +// 起点对齐 +.u-flex-content-start { + align-content: flex-start +} + +// 居中对齐 +.u-flex-content-center { + align-content: center +} + +// 终点对齐 +.u-flex-content-end { + align-content: flex-end +} + +// 两端对齐 +.u-flex-content-between { + align-content: space-between +} + +// 均分间距 +.u-flex-content-around { + align-content: space-around +} + +// 全部居中对齐 +.u-flex-middle { + justify-content: center; + align-items: center; + align-self: center; + align-content: center +} + +// 是否可以放大 +.u-flex-grow { + flex-grow: 1 +} + +// 是否可以缩小 +.u-flex-shrink { + flex-shrink: 1 +} + diff --git a/uni_modules/uview-ui/libs/css/h5.scss b/uni_modules/uview-ui/libs/css/h5.scss new file mode 100644 index 0000000..e69de29 diff --git a/uni_modules/uview-ui/libs/css/mixin.scss b/uni_modules/uview-ui/libs/css/mixin.scss new file mode 100644 index 0000000..7e35b3b --- /dev/null +++ b/uni_modules/uview-ui/libs/css/mixin.scss @@ -0,0 +1,8 @@ +// 通过scss的mixin功能,把原来需要写4行的css,变成一行 +// 目的是保持代码干净整洁,不至于在nvue下,到处都要写display:flex的条件编译 +@mixin flex($direction: row) { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: $direction; +} diff --git a/uni_modules/uview-ui/libs/css/mp.scss b/uni_modules/uview-ui/libs/css/mp.scss new file mode 100644 index 0000000..e69de29 diff --git a/uni_modules/uview-ui/libs/css/nvue.scss b/uni_modules/uview-ui/libs/css/nvue.scss new file mode 100644 index 0000000..e69de29 diff --git a/uni_modules/uview-ui/libs/css/vue.scss b/uni_modules/uview-ui/libs/css/vue.scss new file mode 100644 index 0000000..3ae4d29 --- /dev/null +++ b/uni_modules/uview-ui/libs/css/vue.scss @@ -0,0 +1,27 @@ +// 历遍生成4个方向的底部安全区 +@each $d in top, right, bottom, left { + .u-safe-area-inset-#{$d} { + padding-#{$d}: 0; + padding-#{$d}: constant(safe-area-inset-#{$d}); + padding-#{$d}: env(safe-area-inset-#{$d}); + } +} + +//提升H5端uni.toast()的层级,避免被uView的modal等遮盖 +/* #ifdef H5 */ +uni-toast { + z-index: 10090; +} +uni-toast .uni-toast { + z-index: 10090; +} +/* #endif */ + +// 隐藏scroll-view的滚动条 +::-webkit-scrollbar { + display: none; + width: 0 !important; + height: 0 !important; + -webkit-appearance: none; + background: transparent; +} \ No newline at end of file diff --git a/uni_modules/uview-ui/libs/function/colorGradient.js b/uni_modules/uview-ui/libs/function/colorGradient.js new file mode 100644 index 0000000..9727732 --- /dev/null +++ b/uni_modules/uview-ui/libs/function/colorGradient.js @@ -0,0 +1,134 @@ +/** + * 求两个颜色之间的渐变值 + * @param {string} startColor 开始的颜色 + * @param {string} endColor 结束的颜色 + * @param {number} step 颜色等分的份额 + * */ +function colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) { + const startRGB = hexToRgb(startColor, false) // 转换为rgb数组模式 + const startR = startRGB[0] + const startG = startRGB[1] + const startB = startRGB[2] + + const endRGB = hexToRgb(endColor, false) + const endR = endRGB[0] + const endG = endRGB[1] + const endB = endRGB[2] + + const sR = (endR - startR) / step // 总差值 + const sG = (endG - startG) / step + const sB = (endB - startB) / step + const colorArr = [] + for (let i = 0; i < step; i++) { + // 计算每一步的hex值 + let hex = rgbToHex(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB + * i + startB))})`) + // 确保第一个颜色值为startColor的值 + if (i === 0) hex = rgbToHex(startColor) + // 确保最后一个颜色值为endColor的值 + if (i === step - 1) hex = rgbToHex(endColor) + colorArr.push(hex) + } + return colorArr +} + +// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式) +function hexToRgb(sColor, str = true) { + const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/ + sColor = String(sColor).toLowerCase() + if (sColor && reg.test(sColor)) { + if (sColor.length === 4) { + let sColorNew = '#' + for (let i = 1; i < 4; i += 1) { + sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1)) + } + sColor = sColorNew + } + // 处理六位的颜色值 + const sColorChange = [] + for (let i = 1; i < 7; i += 2) { + sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`)) + } + if (!str) { + return sColorChange + } + return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})` + } if (/^(rgb|RGB)/.test(sColor)) { + const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',') + return arr.map((val) => Number(val)) + } + return sColor +} + +// 将rgb表示方式转换为hex表示方式 +function rgbToHex(rgb) { + const _this = rgb + const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/ + if (/^(rgb|RGB)/.test(_this)) { + const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, '').split(',') + let strHex = '#' + for (let i = 0; i < aColor.length; i++) { + let hex = Number(aColor[i]).toString(16) + hex = String(hex).length == 1 ? `${0}${hex}` : hex // 保证每个rgb的值为2位 + if (hex === '0') { + hex += hex + } + strHex += hex + } + if (strHex.length !== 7) { + strHex = _this + } + return strHex + } if (reg.test(_this)) { + const aNum = _this.replace(/#/, '').split('') + if (aNum.length === 6) { + return _this + } if (aNum.length === 3) { + let numHex = '#' + for (let i = 0; i < aNum.length; i += 1) { + numHex += (aNum[i] + aNum[i]) + } + return numHex + } + } else { + return _this + } +} + +/** +* JS颜色十六进制转换为rgb或rgba,返回的格式为 rgba(255,255,255,0.5)字符串 +* sHex为传入的十六进制的色值 +* alpha为rgba的透明度 +*/ +function colorToRgba(color, alpha) { + color = rgbToHex(color) + // 十六进制颜色值的正则表达式 + const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/ + /* 16进制颜色转为RGB格式 */ + let sColor = String(color).toLowerCase() + if (sColor && reg.test(sColor)) { + if (sColor.length === 4) { + let sColorNew = '#' + for (let i = 1; i < 4; i += 1) { + sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1)) + } + sColor = sColorNew + } + // 处理六位的颜色值 + const sColorChange = [] + for (let i = 1; i < 7; i += 2) { + sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`)) + } + // return sColorChange.join(',') + return `rgba(${sColorChange.join(',')},${alpha})` + } + + return sColor +} + +export default { + colorGradient, + hexToRgb, + rgbToHex, + colorToRgba +} diff --git a/uni_modules/uview-ui/libs/function/debounce.js b/uni_modules/uview-ui/libs/function/debounce.js new file mode 100644 index 0000000..ad3996b --- /dev/null +++ b/uni_modules/uview-ui/libs/function/debounce.js @@ -0,0 +1,29 @@ +let timeout = null + +/** + * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数 + * + * @param {Function} func 要执行的回调函数 + * @param {Number} wait 延时的时间 + * @param {Boolean} immediate 是否立即执行 + * @return null + */ +function debounce(func, wait = 500, immediate = false) { + // 清除定时器 + if (timeout !== null) clearTimeout(timeout) + // 立即执行,此类情况一般用不到 + if (immediate) { + const callNow = !timeout + timeout = setTimeout(() => { + timeout = null + }, wait) + if (callNow) typeof func === 'function' && func() + } else { + // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法 + timeout = setTimeout(() => { + typeof func === 'function' && func() + }, wait) + } +} + +export default debounce diff --git a/uni_modules/uview-ui/libs/function/digit.js b/uni_modules/uview-ui/libs/function/digit.js new file mode 100644 index 0000000..c8260a0 --- /dev/null +++ b/uni_modules/uview-ui/libs/function/digit.js @@ -0,0 +1,167 @@ +let _boundaryCheckingState = true; // 是否进行越界检查的全局开关 + +/** + * 把错误的数据转正 + * @private + * @example strip(0.09999999999999998)=0.1 + */ +function strip(num, precision = 15) { + return +parseFloat(Number(num).toPrecision(precision)); +} + +/** + * Return digits length of a number + * @private + * @param {*number} num Input number + */ +function digitLength(num) { + // Get digit length of e + const eSplit = num.toString().split(/[eE]/); + const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0); + return len > 0 ? len : 0; +} + +/** + * 把小数转成整数,如果是小数则放大成整数 + * @private + * @param {*number} num 输入数 + */ +function float2Fixed(num) { + if (num.toString().indexOf('e') === -1) { + return Number(num.toString().replace('.', '')); + } + const dLen = digitLength(num); + return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num); +} + +/** + * 检测数字是否越界,如果越界给出提示 + * @private + * @param {*number} num 输入数 + */ +function checkBoundary(num) { + if (_boundaryCheckingState) { + if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) { + console.warn(`${num} 超出了精度限制,结果可能不正确`); + } + } +} + +/** + * 把递归操作扁平迭代化 + * @param {number[]} arr 要操作的数字数组 + * @param {function} operation 迭代操作 + * @private + */ +function iteratorOperation(arr, operation) { + const [num1, num2, ...others] = arr; + let res = operation(num1, num2); + + others.forEach((num) => { + res = operation(res, num); + }); + + return res; +} + +/** + * 高精度乘法 + * @export + */ +export function times(...nums) { + if (nums.length > 2) { + return iteratorOperation(nums, times); + } + + const [num1, num2] = nums; + const num1Changed = float2Fixed(num1); + const num2Changed = float2Fixed(num2); + const baseNum = digitLength(num1) + digitLength(num2); + const leftValue = num1Changed * num2Changed; + + checkBoundary(leftValue); + + return leftValue / Math.pow(10, baseNum); +} + +/** + * 高精度加法 + * @export + */ +export function plus(...nums) { + if (nums.length > 2) { + return iteratorOperation(nums, plus); + } + + const [num1, num2] = nums; + // 取最大的小数位 + const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); + // 把小数都转为整数然后再计算 + return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; +} + +/** + * 高精度减法 + * @export + */ +export function minus(...nums) { + if (nums.length > 2) { + return iteratorOperation(nums, minus); + } + + const [num1, num2] = nums; + const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2))); + return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; +} + +/** + * 高精度除法 + * @export + */ +export function divide(...nums) { + if (nums.length > 2) { + return iteratorOperation(nums, divide); + } + + const [num1, num2] = nums; + const num1Changed = float2Fixed(num1); + const num2Changed = float2Fixed(num2); + checkBoundary(num1Changed); + checkBoundary(num2Changed); + // 重要,这里必须用strip进行修正 + return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1)))); +} + +/** + * 四舍五入 + * @export + */ +export function round(num, ratio) { + const base = Math.pow(10, ratio); + let result = divide(Math.round(Math.abs(times(num, base))), base); + if (num < 0 && result !== 0) { + result = times(result, -1); + } + // 位数不足则补0 + return result; +} + +/** + * 是否进行边界检查,默认开启 + * @param flag 标记开关,true 为开启,false 为关闭,默认为 true + * @export + */ +export function enableBoundaryChecking(flag = true) { + _boundaryCheckingState = flag; +} + + +export default { + times, + plus, + minus, + divide, + round, + enableBoundaryChecking, +}; + diff --git a/uni_modules/uview-ui/libs/function/index.js b/uni_modules/uview-ui/libs/function/index.js new file mode 100644 index 0000000..7235129 --- /dev/null +++ b/uni_modules/uview-ui/libs/function/index.js @@ -0,0 +1,705 @@ +import test from './test.js' +import { round } from './digit.js' +/** + * @description 如果value小于min,取min;如果value大于max,取max + * @param {number} min + * @param {number} max + * @param {number} value + */ +function range(min = 0, max = 0, value = 0) { + return Math.max(min, Math.min(max, Number(value))) +} + +/** + * @description 用于获取用户传递值的px值 如果用户传递了"xxpx"或者"xxrpx",取出其数值部分,如果是"xxxrpx"还需要用过uni.upx2px进行转换 + * @param {number|string} value 用户传递值的px值 + * @param {boolean} unit + * @returns {number|string} + */ +function getPx(value, unit = false) { + if (test.number(value)) { + return unit ? `${value}px` : Number(value) + } + // 如果带有rpx,先取出其数值部分,再转为px值 + if (/(rpx|upx)$/.test(value)) { + return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value))) + } + return unit ? `${parseInt(value)}px` : parseInt(value) +} + +/** + * @description 进行延时,以达到可以简写代码的目的 比如: await uni.$u.sleep(20)将会阻塞20ms + * @param {number} value 堵塞时间 单位ms 毫秒 + * @returns {Promise} 返回promise + */ +function sleep(value = 30) { + return new Promise((resolve) => { + setTimeout(() => { + resolve() + }, value) + }) +} +/** + * @description 运行期判断平台 + * @returns {string} 返回所在平台(小写) + * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台 + */ +function os() { + return uni.getSystemInfoSync().platform.toLowerCase() +} +/** + * @description 获取系统信息同步接口 + * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync + */ +function sys() { + return uni.getSystemInfoSync() +} + +/** + * @description 取一个区间数 + * @param {Number} min 最小值 + * @param {Number} max 最大值 + */ +function random(min, max) { + if (min >= 0 && max > 0 && max >= min) { + const gab = max - min + 1 + return Math.floor(Math.random() * gab + min) + } + return 0 +} + +/** + * @param {Number} len uuid的长度 + * @param {Boolean} firstU 将返回的首字母置为"u" + * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制 + */ +function guid(len = 32, firstU = true, radix = null) { + const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') + const uuid = [] + radix = radix || chars.length + + if (len) { + // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位 + for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix] + } else { + let r + // rfc4122标准要求返回的uuid中,某些位为固定的字符 + uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-' + uuid[14] = '4' + + for (let i = 0; i < 36; i++) { + if (!uuid[i]) { + r = 0 | Math.random() * 16 + uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r] + } + } + } + // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class + if (firstU) { + uuid.shift() + return `u${uuid.join('')}` + } + return uuid.join('') +} + +/** +* @description 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法 + this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx + 这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name + 值(默认为undefined),就是查找最顶层的$parent +* @param {string|undefined} name 父组件的参数名 +*/ +function $parent(name = undefined) { + let parent = this.$parent + // 通过while历遍,这里主要是为了H5需要多层解析的问题 + while (parent) { + // 父组件 + if (parent.$options && parent.$options.name !== name) { + // 如果组件的name不相等,继续上一级寻找 + parent = parent.$parent + } else { + return parent + } + } + return false +} + +/** + * @description 样式转换 + * 对象转字符串,或者字符串转对象 + * @param {object | string} customStyle 需要转换的目标 + * @param {String} target 转换的目的,object-转为对象,string-转为字符串 + * @returns {object|string} + */ +function addStyle(customStyle, target = 'object') { + // 字符串转字符串,对象转对象情形,直接返回 + if (test.empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' && + typeof(customStyle) === 'string') { + return customStyle + } + // 字符串转对象 + if (target === 'object') { + // 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的 + customStyle = trim(customStyle) + // 根据";"将字符串转为数组形式 + const styleArray = customStyle.split(';') + const style = {} + // 历遍数组,拼接成对象 + for (let i = 0; i < styleArray.length; i++) { + // 'font-size:20px;color:red;',如此最后字符串有";"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤 + if (styleArray[i]) { + const item = styleArray[i].split(':') + style[trim(item[0])] = trim(item[1]) + } + } + return style + } + // 这里为对象转字符串形式 + let string = '' + for (const i in customStyle) { + // 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名 + const key = i.replace(/([A-Z])/g, '-$1').toLowerCase() + string += `${key}:${customStyle[i]};` + } + // 去除两端空格 + return trim(string) +} + +/** + * @description 添加单位,如果有rpx,upx,%,px等单位结尾或者值为auto,直接返回,否则加上px单位结尾 + * @param {string|number} value 需要添加单位的值 + * @param {string} unit 添加的单位名 比如px + */ +function addUnit(value = 'auto', unit = uni?.$u?.config?.unit ?? 'px') { + value = String(value) + // 用uView内置验证规则中的number判断是否为数值 + return test.number(value) ? `${value}${unit}` : value +} + +/** + * @description 深度克隆 + * @param {object} obj 需要深度克隆的对象 + * @returns {*} 克隆后的对象或者原值(不是对象) + */ +function deepClone(obj) { + // 对常见的“非”值,直接返回原来值 + if ([null, undefined, NaN, false].includes(obj)) return obj + if (typeof obj !== 'object' && typeof obj !== 'function') { + // 原始类型直接返回 + return obj + } + const o = test.array(obj) ? [] : {} + for (const i in obj) { + if (obj.hasOwnProperty(i)) { + o[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i] + } + } + return o +} + +/** + * @description JS对象深度合并 + * @param {object} target 需要拷贝的对象 + * @param {object} source 拷贝的来源对象 + * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象) + */ +function deepMerge(target = {}, source = {}) { + target = deepClone(target) + if (typeof target !== 'object' || typeof source !== 'object') return false + for (const prop in source) { + if (!source.hasOwnProperty(prop)) continue + if (prop in target) { + if (typeof target[prop] !== 'object') { + target[prop] = source[prop] + } else if (typeof source[prop] !== 'object') { + target[prop] = source[prop] + } else if (target[prop].concat && source[prop].concat) { + target[prop] = target[prop].concat(source[prop]) + } else { + target[prop] = deepMerge(target[prop], source[prop]) + } + } else { + target[prop] = source[prop] + } + } + return target +} + +/** + * @description error提示 + * @param {*} err 错误内容 + */ +function error(err) { + // 开发环境才提示,生产环境不会提示 + if (process.env.NODE_ENV === 'development') { + console.error(`uView提示:${err}`) + } +} + +/** + * @description 打乱数组 + * @param {array} array 需要打乱的数组 + * @returns {array} 打乱后的数组 + */ +function randomArray(array = []) { + // 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0 + return array.sort(() => Math.random() - 0.5) +} + +// padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序 +// 所以这里做一个兼容polyfill的兼容处理 +if (!String.prototype.padStart) { + // 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解 + String.prototype.padStart = function(maxLength, fillString = ' ') { + if (Object.prototype.toString.call(fillString) !== '[object String]') { + throw new TypeError( + 'fillString must be String' + ) + } + const str = this + // 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉 + if (str.length >= maxLength) return String(str) + + const fillLength = maxLength - str.length + let times = Math.ceil(fillLength / fillString.length) + while (times >>= 1) { + fillString += fillString + if (times === 1) { + fillString += fillString + } + } + return fillString.slice(0, fillLength) + str + } +} + +/** + * @description 格式化时间 + * @param {String|Number} dateTime 需要格式化的时间戳 + * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd + * @returns {string} 返回格式化后的字符串 + */ + function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') { + let date + // 若传入时间为假值,则取当前时间 + if (!dateTime) { + date = new Date() + } + // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容) + else if (/^\d{10}$/.test(dateTime?.toString().trim())) { + date = new Date(dateTime * 1000) + } + // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容 + else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) { + date = new Date(Number(dateTime)) + } + // 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间 + // 处理 '2022-07-10 01:02:03',跳过 '2022-07-10T01:02:03' + else if (typeof dateTime === 'string' && dateTime.includes('-') && !dateTime.includes('T')) { + date = new Date(dateTime.replace(/-/g, '/')) + } + // 其他都认为符合 RFC 2822 规范 + else { + date = new Date(dateTime) + } + + const timeSource = { + 'y': date.getFullYear().toString(), // 年 + 'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 月 + 'd': date.getDate().toString().padStart(2, '0'), // 日 + 'h': date.getHours().toString().padStart(2, '0'), // 时 + 'M': date.getMinutes().toString().padStart(2, '0'), // 分 + 's': date.getSeconds().toString().padStart(2, '0') // 秒 + // 有其他格式化字符需求可以继续添加,必须转化成字符串 + } + + for (const key in timeSource) { + const [ret] = new RegExp(`${key}+`).exec(formatStr) || [] + if (ret) { + // 年可能只需展示两位 + const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0 + formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex)) + } + } + + return formatStr +} + +/** + * @description 时间戳转为多久之前 + * @param {String|Number} timestamp 时间戳 + * @param {String|Boolean} format + * 格式化规则如果为时间格式字符串,超出一定时间范围,返回固定的时间格式; + * 如果为布尔值false,无论什么时间,都返回多久以前的格式 + * @returns {string} 转化后的内容 + */ +function timeFrom(timestamp = null, format = 'yyyy-mm-dd') { + if (timestamp == null) timestamp = Number(new Date()) + timestamp = parseInt(timestamp) + // 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位) + if (timestamp.toString().length == 10) timestamp *= 1000 + let timer = (new Date()).getTime() - timestamp + timer = parseInt(timer / 1000) + // 如果小于5分钟,则返回"刚刚",其他以此类推 + let tips = '' + switch (true) { + case timer < 300: + tips = '刚刚' + break + case timer >= 300 && timer < 3600: + tips = `${parseInt(timer / 60)}分钟前` + break + case timer >= 3600 && timer < 86400: + tips = `${parseInt(timer / 3600)}小时前` + break + case timer >= 86400 && timer < 2592000: + tips = `${parseInt(timer / 86400)}天前` + break + default: + // 如果format为false,则无论什么时间戳,都显示xx之前 + if (format === false) { + if (timer >= 2592000 && timer < 365 * 86400) { + tips = `${parseInt(timer / (86400 * 30))}个月前` + } else { + tips = `${parseInt(timer / (86400 * 365))}年前` + } + } else { + tips = timeFormat(timestamp, format) + } + } + return tips +} + +/** + * @description 去除空格 + * @param String str 需要去除空格的字符串 + * @param String pos both(左右)|left|right|all 默认both + */ +function trim(str, pos = 'both') { + str = String(str) + if (pos == 'both') { + return str.replace(/^\s+|\s+$/g, '') + } + if (pos == 'left') { + return str.replace(/^\s*/, '') + } + if (pos == 'right') { + return str.replace(/(\s*$)/g, '') + } + if (pos == 'all') { + return str.replace(/\s+/g, '') + } + return str +} + +/** + * @description 对象转url参数 + * @param {object} data,对象 + * @param {Boolean} isPrefix,是否自动加上"?" + * @param {string} arrayFormat 规则 indices|brackets|repeat|comma + */ +function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') { + const prefix = isPrefix ? '?' : '' + const _result = [] + if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets' + for (const key in data) { + const value = data[key] + // 去掉为空的参数 + if (['', undefined, null].indexOf(value) >= 0) { + continue + } + // 如果值为数组,另行处理 + if (value.constructor === Array) { + // e.g. {ids: [1, 2, 3]} + switch (arrayFormat) { + case 'indices': + // 结果: ids[0]=1&ids[1]=2&ids[2]=3 + for (let i = 0; i < value.length; i++) { + _result.push(`${key}[${i}]=${value[i]}`) + } + break + case 'brackets': + // 结果: ids[]=1&ids[]=2&ids[]=3 + value.forEach((_value) => { + _result.push(`${key}[]=${_value}`) + }) + break + case 'repeat': + // 结果: ids=1&ids=2&ids=3 + value.forEach((_value) => { + _result.push(`${key}=${_value}`) + }) + break + case 'comma': + // 结果: ids=1,2,3 + let commaStr = '' + value.forEach((_value) => { + commaStr += (commaStr ? ',' : '') + _value + }) + _result.push(`${key}=${commaStr}`) + break + default: + value.forEach((_value) => { + _result.push(`${key}[]=${_value}`) + }) + } + } else { + _result.push(`${key}=${value}`) + } + } + return _result.length ? prefix + _result.join('&') : '' +} + +/** + * 显示消息提示框 + * @param {String} title 提示的内容,长度与 icon 取值有关。 + * @param {Number} duration 提示的延迟时间,单位毫秒,默认:2000 + */ +function toast(title, duration = 2000) { + uni.showToast({ + title: String(title), + icon: 'none', + duration + }) +} + +/** + * @description 根据主题type值,获取对应的图标 + * @param {String} type 主题名称,primary|info|error|warning|success + * @param {boolean} fill 是否使用fill填充实体的图标 + */ +function type2icon(type = 'success', fill = false) { + // 如果非预置值,默认为success + if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success' + let iconName = '' + // 目前(2019-12-12),info和primary使用同一个图标 + switch (type) { + case 'primary': + iconName = 'info-circle' + break + case 'info': + iconName = 'info-circle' + break + case 'error': + iconName = 'close-circle' + break + case 'warning': + iconName = 'error-circle' + break + case 'success': + iconName = 'checkmark-circle' + break + default: + iconName = 'checkmark-circle' + } + // 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的 + if (fill) iconName += '-fill' + return iconName +} + +/** + * @description 数字格式化 + * @param {number|string} number 要格式化的数字 + * @param {number} decimals 保留几位小数 + * @param {string} decimalPoint 小数点符号 + * @param {string} thousandsSeparator 千分位符号 + * @returns {string} 格式化后的数字 + */ +function priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') { + number = (`${number}`).replace(/[^0-9+-Ee.]/g, '') + const n = !isFinite(+number) ? 0 : +number + const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) + const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator + const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint + let s = '' + + s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.') + const re = /(-?\d+)(\d{3})/ + while (re.test(s[0])) { + s[0] = s[0].replace(re, `$1${sep}$2`) + } + + if ((s[1] || '').length < prec) { + s[1] = s[1] || '' + s[1] += new Array(prec - s[1].length + 1).join('0') + } + return s.join(dec) +} + +/** + * @description 获取duration值 + * 如果带有ms或者s直接返回,如果大于一定值,认为是ms单位,小于一定值,认为是s单位 + * 比如以30位阈值,那么300大于30,可以理解为用户想要的是300ms,而不是想花300s去执行一个动画 + * @param {String|number} value 比如: "1s"|"100ms"|1|100 + * @param {boolean} unit 提示: 如果是false 默认返回number + * @return {string|number} + */ +function getDuration(value, unit = true) { + const valueNum = parseInt(value) + if (unit) { + if (/s$/.test(value)) return value + return value > 30 ? `${value}ms` : `${value}s` + } + if (/ms$/.test(value)) return valueNum + if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000 + return valueNum +} + +/** + * @description 日期的月或日补零操作 + * @param {String} value 需要补零的值 + */ +function padZero(value) { + return `00${value}`.slice(-2) +} + +/** + * @description 在u-form的子组件内容发生变化,或者失去焦点时,尝试通知u-form执行校验方法 + * @param {*} instance + * @param {*} event + */ +function formValidate(instance, event) { + const formItem = uni.$u.$parent.call(instance, 'u-form-item') + const form = uni.$u.$parent.call(instance, 'u-form') + // 如果发生变化的input或者textarea等,其父组件中有u-form-item或者u-form等,就执行form的validate方法 + // 同时将form-item的pros传递给form,让其进行精确对象验证 + if (formItem && form) { + form.validateField(formItem.prop, () => {}, event) + } +} + +/** + * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式 + * @param {object} obj 对象 + * @param {string} key 需要获取的属性字段 + * @returns {*} + */ +function getProperty(obj, key) { + if (!obj) { + return + } + if (typeof key !== 'string' || key === '') { + return '' + } + if (key.indexOf('.') !== -1) { + const keys = key.split('.') + let firstObj = obj[keys[0]] || {} + + for (let i = 1; i < keys.length; i++) { + if (firstObj) { + firstObj = firstObj[keys[i]] + } + } + return firstObj + } + return obj[key] +} + +/** + * @description 设置对象的属性值,如果'a.b.c'的形式进行设置 + * @param {object} obj 对象 + * @param {string} key 需要设置的属性 + * @param {string} value 设置的值 + */ +function setProperty(obj, key, value) { + if (!obj) { + return + } + // 递归赋值 + const inFn = function(_obj, keys, v) { + // 最后一个属性key + if (keys.length === 1) { + _obj[keys[0]] = v + return + } + // 0~length-1个key + while (keys.length > 1) { + const k = keys[0] + if (!_obj[k] || (typeof _obj[k] !== 'object')) { + _obj[k] = {} + } + const key = keys.shift() + // 自调用判断是否存在属性,不存在则自动创建对象 + inFn(_obj[k], keys, v) + } + } + + if (typeof key !== 'string' || key === '') { + + } else if (key.indexOf('.') !== -1) { // 支持多层级赋值操作 + const keys = key.split('.') + inFn(obj, keys, value) + } else { + obj[key] = value + } +} + +/** + * @description 获取当前页面路径 + */ +function page() { + const pages = getCurrentPages() + // 某些特殊情况下(比如页面进行redirectTo时的一些时机),pages可能为空数组 + return `/${pages[pages.length - 1]?.route ?? ''}` +} + +/** + * @description 获取当前路由栈实例数组 + */ +function pages() { + const pages = getCurrentPages() + return pages +} + +/** + * @description 修改uView内置属性值 + * @param {object} props 修改内置props属性 + * @param {object} config 修改内置config属性 + * @param {object} color 修改内置color属性 + * @param {object} zIndex 修改内置zIndex属性 + */ +function setConfig({ + props = {}, + config = {}, + color = {}, + zIndex = {} +}) { + const { + deepMerge, + } = uni.$u + uni.$u.config = deepMerge(uni.$u.config, config) + uni.$u.props = deepMerge(uni.$u.props, props) + uni.$u.color = deepMerge(uni.$u.color, color) + uni.$u.zIndex = deepMerge(uni.$u.zIndex, zIndex) +} + +export default { + range, + getPx, + sleep, + os, + sys, + random, + guid, + $parent, + addStyle, + addUnit, + deepClone, + deepMerge, + error, + randomArray, + timeFormat, + timeFrom, + trim, + queryParams, + toast, + type2icon, + priceFormat, + getDuration, + padZero, + formValidate, + getProperty, + setProperty, + page, + pages, + setConfig +} diff --git a/uni_modules/uview-ui/libs/function/platform.js b/uni_modules/uview-ui/libs/function/platform.js new file mode 100644 index 0000000..d6b926e --- /dev/null +++ b/uni_modules/uview-ui/libs/function/platform.js @@ -0,0 +1,75 @@ +/** + * 注意: + * 此部分内容,在vue-cli模式下,需要在vue.config.js加入如下内容才有效: + * module.exports = { + * transpileDependencies: ['uview-v2'] + * } + */ + +let platform = 'none' + +// #ifdef VUE3 +platform = 'vue3' +// #endif + +// #ifdef VUE2 +platform = 'vue2' +// #endif + +// #ifdef APP-PLUS +platform = 'plus' +// #endif + +// #ifdef APP-NVUE +platform = 'nvue' +// #endif + +// #ifdef H5 +platform = 'h5' +// #endif + +// #ifdef MP-WEIXIN +platform = 'weixin' +// #endif + +// #ifdef MP-ALIPAY +platform = 'alipay' +// #endif + +// #ifdef MP-BAIDU +platform = 'baidu' +// #endif + +// #ifdef MP-TOUTIAO +platform = 'toutiao' +// #endif + +// #ifdef MP-QQ +platform = 'qq' +// #endif + +// #ifdef MP-KUAISHOU +platform = 'kuaishou' +// #endif + +// #ifdef MP-360 +platform = '360' +// #endif + +// #ifdef MP +platform = 'mp' +// #endif + +// #ifdef QUICKAPP-WEBVIEW +platform = 'quickapp-webview' +// #endif + +// #ifdef QUICKAPP-WEBVIEW-HUAWEI +platform = 'quickapp-webview-huawei' +// #endif + +// #ifdef QUICKAPP-WEBVIEW-UNION +platform = 'quckapp-webview-union' +// #endif + +export default platform diff --git a/uni_modules/uview-ui/libs/function/test.js b/uni_modules/uview-ui/libs/function/test.js new file mode 100644 index 0000000..c776437 --- /dev/null +++ b/uni_modules/uview-ui/libs/function/test.js @@ -0,0 +1,288 @@ +/** + * 验证电子邮箱格式 + */ +function email(value) { + return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value) +} + +/** + * 验证手机格式 + */ +function mobile(value) { + return /^1([3589]\d|4[5-9]|6[1-2,4-7]|7[0-8])\d{8}$/.test(value) +} + +/** + * 验证URL格式 + */ +function url(value) { + return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/ + .test(value) +} + +/** + * 验证日期格式 + */ +function date(value) { + if (!value) return false + // 判断是否数值或者字符串数值(意味着为时间戳),转为数值,否则new Date无法识别字符串时间戳 + if (number(value)) value = +value + return !/Invalid|NaN/.test(new Date(value).toString()) +} + +/** + * 验证ISO类型的日期格式 + */ +function dateISO(value) { + return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value) +} + +/** + * 验证十进制数字 + */ +function number(value) { + return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value) +} + +/** + * 验证字符串 + */ +function string(value) { + return typeof value === 'string' +} + +/** + * 验证整数 + */ +function digits(value) { + return /^\d+$/.test(value) +} + +/** + * 验证身份证号码 + */ +function idCard(value) { + return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test( + value + ) +} + +/** + * 是否车牌号 + */ +function carNo(value) { + // 新能源车牌 + const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/ + // 旧车牌 + const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/ + if (value.length === 7) { + return creg.test(value) + } if (value.length === 8) { + return xreg.test(value) + } + return false +} + +/** + * 金额,只允许2位小数 + */ +function amount(value) { + // 金额,只允许保留两位小数 + return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value) +} + +/** + * 中文 + */ +function chinese(value) { + const reg = /^[\u4e00-\u9fa5]+$/gi + return reg.test(value) +} + +/** + * 只能输入字母 + */ +function letter(value) { + return /^[a-zA-Z]*$/.test(value) +} + +/** + * 只能是字母或者数字 + */ +function enOrNum(value) { + // 英文或者数字 + const reg = /^[0-9a-zA-Z]*$/g + return reg.test(value) +} + +/** + * 验证是否包含某个值 + */ +function contains(value, param) { + return value.indexOf(param) >= 0 +} + +/** + * 验证一个值范围[min, max] + */ +function range(value, param) { + return value >= param[0] && value <= param[1] +} + +/** + * 验证一个长度范围[min, max] + */ +function rangeLength(value, param) { + return value.length >= param[0] && value.length <= param[1] +} + +/** + * 是否固定电话 + */ +function landline(value) { + const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/ + return reg.test(value) +} + +/** + * 判断是否为空 + */ +function empty(value) { + switch (typeof value) { + case 'undefined': + return true + case 'string': + if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true + break + case 'boolean': + if (!value) return true + break + case 'number': + if (value === 0 || isNaN(value)) return true + break + case 'object': + if (value === null || value.length === 0) return true + for (const i in value) { + return false + } + return true + } + return false +} + +/** + * 是否json字符串 + */ +function jsonString(value) { + if (typeof value === 'string') { + try { + const obj = JSON.parse(value) + if (typeof obj === 'object' && obj) { + return true + } + return false + } catch (e) { + return false + } + } + return false +} + +/** + * 是否数组 + */ +function array(value) { + if (typeof Array.isArray === 'function') { + return Array.isArray(value) + } + return Object.prototype.toString.call(value) === '[object Array]' +} + +/** + * 是否对象 + */ +function object(value) { + return Object.prototype.toString.call(value) === '[object Object]' +} + +/** + * 是否短信验证码 + */ +function code(value, len = 6) { + return new RegExp(`^\\d{${len}}$`).test(value) +} + +/** + * 是否函数方法 + * @param {Object} value + */ +function func(value) { + return typeof value === 'function' +} + +/** + * 是否promise对象 + * @param {Object} value + */ +function promise(value) { + return object(value) && func(value.then) && func(value.catch) +} + +/** 是否图片格式 + * @param {Object} value + */ +function image(value) { + const newValue = value.split('?')[0] + const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i + return IMAGE_REGEXP.test(newValue) +} + +/** + * 是否视频格式 + * @param {Object} value + */ +function video(value) { + const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i + return VIDEO_REGEXP.test(value) +} + +/** + * 是否为正则对象 + * @param {Object} + * @return {Boolean} + */ +function regExp(o) { + return o && Object.prototype.toString.call(o) === '[object RegExp]' +} + +export default { + email, + mobile, + url, + date, + dateISO, + number, + digits, + idCard, + carNo, + amount, + chinese, + letter, + enOrNum, + contains, + range, + rangeLength, + empty, + isEmpty: empty, + jsonString, + landline, + object, + array, + code, + func, + promise, + video, + image, + regExp, + string +} diff --git a/uni_modules/uview-ui/libs/function/throttle.js b/uni_modules/uview-ui/libs/function/throttle.js new file mode 100644 index 0000000..2f33611 --- /dev/null +++ b/uni_modules/uview-ui/libs/function/throttle.js @@ -0,0 +1,30 @@ +let timer; let + flag +/** + * 节流原理:在一定时间内,只能触发一次 + * + * @param {Function} func 要执行的回调函数 + * @param {Number} wait 延时的时间 + * @param {Boolean} immediate 是否立即执行 + * @return null + */ +function throttle(func, wait = 500, immediate = true) { + if (immediate) { + if (!flag) { + flag = true + // 如果是立即执行,则在wait毫秒内开始时执行 + typeof func === 'function' && func() + timer = setTimeout(() => { + flag = false + }, wait) + } + } else if (!flag) { + flag = true + // 如果是非立即执行,则在wait毫秒内的结束处执行 + timer = setTimeout(() => { + flag = false + typeof func === 'function' && func() + }, wait) + } +} +export default throttle diff --git a/uni_modules/uview-ui/libs/luch-request/adapters/index.js b/uni_modules/uview-ui/libs/luch-request/adapters/index.js new file mode 100644 index 0000000..e03cf5f --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/adapters/index.js @@ -0,0 +1,97 @@ +import buildURL from '../helpers/buildURL' +import buildFullPath from '../core/buildFullPath' +import settle from '../core/settle' +import { isUndefined } from '../utils' + +/** + * 返回可选值存在的配置 + * @param {Array} keys - 可选值数组 + * @param {Object} config2 - 配置 + * @return {{}} - 存在的配置项 + */ +const mergeKeys = (keys, config2) => { + const config = {} + keys.forEach((prop) => { + if (!isUndefined(config2[prop])) { + config[prop] = config2[prop] + } + }) + return config +} +export default (config) => new Promise((resolve, reject) => { + const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params) + const _config = { + url: fullPath, + header: config.header, + complete: (response) => { + config.fullPath = fullPath + response.config = config + try { + // 对可能字符串不是json 的情况容错 + if (typeof response.data === 'string') { + response.data = JSON.parse(response.data) + } + // eslint-disable-next-line no-empty + } catch (e) { + } + settle(resolve, reject, response) + } + } + let requestTask + if (config.method === 'UPLOAD') { + delete _config.header['content-type'] + delete _config.header['Content-Type'] + const otherConfig = { + // #ifdef MP-ALIPAY + fileType: config.fileType, + // #endif + filePath: config.filePath, + name: config.name + } + const optionalKeys = [ + // #ifdef APP-PLUS || H5 + 'files', + // #endif + // #ifdef H5 + 'file', + // #endif + // #ifdef H5 || APP-PLUS + 'timeout', + // #endif + 'formData' + ] + requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) }) + } else if (config.method === 'DOWNLOAD') { + // #ifdef H5 || APP-PLUS + if (!isUndefined(config.timeout)) { + _config.timeout = config.timeout + } + // #endif + requestTask = uni.downloadFile(_config) + } else { + const optionalKeys = [ + 'data', + 'method', + // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN + 'timeout', + // #endif + 'dataType', + // #ifndef MP-ALIPAY + 'responseType', + // #endif + // #ifdef APP-PLUS + 'sslVerify', + // #endif + // #ifdef H5 + 'withCredentials', + // #endif + // #ifdef APP-PLUS + 'firstIpv4' + // #endif + ] + requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) }) + } + if (config.getTask) { + config.getTask(requestTask, config) + } +}) diff --git a/uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js b/uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js new file mode 100644 index 0000000..3e8728d --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/InterceptorManager.js @@ -0,0 +1,50 @@ +'use strict' + +function InterceptorManager() { + this.handlers = [] +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled, + rejected + }) + return this.handlers.length - 1 +} + +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null + } +} + +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + this.handlers.forEach((h) => { + if (h !== null) { + fn(h) + } + }) +} + +export default InterceptorManager diff --git a/uni_modules/uview-ui/libs/luch-request/core/Request.js b/uni_modules/uview-ui/libs/luch-request/core/Request.js new file mode 100644 index 0000000..cc48566 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/Request.js @@ -0,0 +1,198 @@ +/** + * @Class Request + * @description luch-request http请求插件 + * @version 3.0.7 + * @Author lu-ch + * @Date 2021-09-04 + * @Email webwork.s@qq.com + * 文档: https://www.quanzhan.co/luch-request/ + * github: https://github.com/lei-mu/luch-request + * DCloud: http://ext.dcloud.net.cn/plugin?id=392 + * HBuilderX: beat-3.0.4 alpha-3.0.4 + */ + +import dispatchRequest from './dispatchRequest' +import InterceptorManager from './InterceptorManager' +import mergeConfig from './mergeConfig' +import defaults from './defaults' +import { isPlainObject } from '../utils' +import clone from '../utils/clone' + +export default class Request { + /** + * @param {Object} arg - 全局配置 + * @param {String} arg.baseURL - 全局根路径 + * @param {Object} arg.header - 全局header + * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式 + * @param {String} arg.dataType = [json] - 全局默认的dataType + * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持 + * @param {Object} arg.custom - 全局默认的自定义参数 + * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序 + * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+) + * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+) + * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+) + * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300 + */ + constructor(arg = {}) { + if (!isPlainObject(arg)) { + arg = {} + console.warn('设置全局参数必须接收一个Object') + } + this.config = clone({ ...defaults, ...arg }) + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + } + } + + /** + * @Function + * @param {Request~setConfigCallback} f - 设置全局默认配置 + */ + setConfig(f) { + this.config = f(this.config) + } + + middleware(config) { + config = mergeConfig(this.config, config) + const chain = [dispatchRequest, undefined] + let promise = Promise.resolve(config) + + this.interceptors.request.forEach((interceptor) => { + chain.unshift(interceptor.fulfilled, interceptor.rejected) + }) + + this.interceptors.response.forEach((interceptor) => { + chain.push(interceptor.fulfilled, interceptor.rejected) + }) + + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()) + } + + return promise + } + + /** + * @Function + * @param {Object} config - 请求配置项 + * @prop {String} options.url - 请求路径 + * @prop {Object} options.data - 请求参数 + * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型 + * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse + * @prop {Object} [options.header = config.header] - 请求header + * @prop {Object} [options.method = config.method] - 请求方法 + * @returns {Promise} + */ + request(config = {}) { + return this.middleware(config) + } + + get(url, options = {}) { + return this.middleware({ + url, + method: 'GET', + ...options + }) + } + + post(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'POST', + ...options + }) + } + + // #ifndef MP-ALIPAY + put(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'PUT', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU + delete(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'DELETE', + ...options + }) + } + + // #endif + + // #ifdef H5 || MP-WEIXIN + connect(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'CONNECT', + ...options + }) + } + + // #endif + + // #ifdef H5 || MP-WEIXIN || MP-BAIDU + head(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'HEAD', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU + options(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'OPTIONS', + ...options + }) + } + + // #endif + + // #ifdef H5 || MP-WEIXIN + trace(url, data, options = {}) { + return this.middleware({ + url, + data, + method: 'TRACE', + ...options + }) + } + + // #endif + + upload(url, config = {}) { + config.url = url + config.method = 'UPLOAD' + return this.middleware(config) + } + + download(url, config = {}) { + config.url = url + config.method = 'DOWNLOAD' + return this.middleware(config) + } +} + +/** + * setConfig回调 + * @return {Object} - 返回操作后的config + * @callback Request~setConfigCallback + * @param {Object} config - 全局默认config + */ diff --git a/uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js b/uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js new file mode 100644 index 0000000..5eb8a17 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/buildFullPath.js @@ -0,0 +1,20 @@ +'use strict' + +import isAbsoluteURL from '../helpers/isAbsoluteURL' +import combineURLs from '../helpers/combineURLs' + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ +export default function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL) + } + return requestedURL +} diff --git a/uni_modules/uview-ui/libs/luch-request/core/defaults.js b/uni_modules/uview-ui/libs/luch-request/core/defaults.js new file mode 100644 index 0000000..be375a9 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/defaults.js @@ -0,0 +1,29 @@ +/** + * 默认的全局配置 + */ + +export default { + baseURL: '', + header: {}, + method: 'GET', + dataType: 'json', + // #ifndef MP-ALIPAY + responseType: 'text', + // #endif + custom: {}, + // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN + timeout: 60000, + // #endif + // #ifdef APP-PLUS + sslVerify: true, + // #endif + // #ifdef H5 + withCredentials: false, + // #endif + // #ifdef APP-PLUS + firstIpv4: false, + // #endif + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300 + } +} diff --git a/uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js b/uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js new file mode 100644 index 0000000..724545c --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/dispatchRequest.js @@ -0,0 +1,3 @@ +import adapter from '../adapters/index' + +export default (config) => adapter(config) diff --git a/uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js b/uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js new file mode 100644 index 0000000..08f8b9b --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/mergeConfig.js @@ -0,0 +1,103 @@ +import { deepMerge, isUndefined } from '../utils' + +/** + * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局 + * @param {Array} keys - 配置项 + * @param {Object} globalsConfig - 当前的全局配置 + * @param {Object} config2 - 局部配置 + * @return {{}} + */ +const mergeKeys = (keys, globalsConfig, config2) => { + const config = {} + keys.forEach((prop) => { + if (!isUndefined(config2[prop])) { + config[prop] = config2[prop] + } else if (!isUndefined(globalsConfig[prop])) { + config[prop] = globalsConfig[prop] + } + }) + return config +} +/** + * + * @param globalsConfig - 当前实例的全局配置 + * @param config2 - 当前的局部配置 + * @return - 合并后的配置 + */ +export default (globalsConfig, config2 = {}) => { + const method = config2.method || globalsConfig.method || 'GET' + let config = { + baseURL: globalsConfig.baseURL || '', + method, + url: config2.url || '', + params: config2.params || {}, + custom: { ...(globalsConfig.custom || {}), ...(config2.custom || {}) }, + header: deepMerge(globalsConfig.header || {}, config2.header || {}) + } + const defaultToConfig2Keys = ['getTask', 'validateStatus'] + config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) } + + // eslint-disable-next-line no-empty + if (method === 'DOWNLOAD') { + // #ifdef H5 || APP-PLUS + if (!isUndefined(config2.timeout)) { + config.timeout = config2.timeout + } else if (!isUndefined(globalsConfig.timeout)) { + config.timeout = globalsConfig.timeout + } + // #endif + } else if (method === 'UPLOAD') { + delete config.header['content-type'] + delete config.header['Content-Type'] + const uploadKeys = [ + // #ifdef APP-PLUS || H5 + 'files', + // #endif + // #ifdef MP-ALIPAY + 'fileType', + // #endif + // #ifdef H5 + 'file', + // #endif + 'filePath', + 'name', + // #ifdef H5 || APP-PLUS + 'timeout', + // #endif + 'formData' + ] + uploadKeys.forEach((prop) => { + if (!isUndefined(config2[prop])) { + config[prop] = config2[prop] + } + }) + // #ifdef H5 || APP-PLUS + if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) { + config.timeout = globalsConfig.timeout + } + // #endif + } else { + const defaultsKeys = [ + 'data', + // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN + 'timeout', + // #endif + 'dataType', + // #ifndef MP-ALIPAY + 'responseType', + // #endif + // #ifdef APP-PLUS + 'sslVerify', + // #endif + // #ifdef H5 + 'withCredentials', + // #endif + // #ifdef APP-PLUS + 'firstIpv4' + // #endif + ] + config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) } + } + + return config +} diff --git a/uni_modules/uview-ui/libs/luch-request/core/settle.js b/uni_modules/uview-ui/libs/luch-request/core/settle.js new file mode 100644 index 0000000..8d3638f --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/core/settle.js @@ -0,0 +1,16 @@ +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ +export default function settle(resolve, reject, response) { + const { validateStatus } = response.config + const status = response.statusCode + if (status && (!validateStatus || validateStatus(status))) { + resolve(response) + } else { + reject(response) + } +} diff --git a/uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js b/uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js new file mode 100644 index 0000000..472ad6a --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/helpers/buildURL.js @@ -0,0 +1,69 @@ +'use strict' + +import * as utils from '../utils' + +function encode(val) { + return encodeURIComponent(val) + .replace(/%40/gi, '@') + .replace(/%3A/gi, ':') + .replace(/%24/g, '$') + .replace(/%2C/gi, ',') + .replace(/%20/g, '+') + .replace(/%5B/gi, '[') + .replace(/%5D/gi, ']') +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +export default function buildURL(url, params) { + /* eslint no-param-reassign:0 */ + if (!params) { + return url + } + + let serializedParams + if (utils.isURLSearchParams(params)) { + serializedParams = params.toString() + } else { + const parts = [] + + utils.forEach(params, (val, key) => { + if (val === null || typeof val === 'undefined') { + return + } + + if (utils.isArray(val)) { + key = `${key}[]` + } else { + val = [val] + } + + utils.forEach(val, (v) => { + if (utils.isDate(v)) { + v = v.toISOString() + } else if (utils.isObject(v)) { + v = JSON.stringify(v) + } + parts.push(`${encode(key)}=${encode(v)}`) + }) + }) + + serializedParams = parts.join('&') + } + + if (serializedParams) { + const hashmarkIndex = url.indexOf('#') + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex) + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams + } + + return url +} diff --git a/uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js b/uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js new file mode 100644 index 0000000..ac7c124 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/helpers/combineURLs.js @@ -0,0 +1,14 @@ +'use strict' + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ +export default function combineURLs(baseURL, relativeURL) { + return relativeURL + ? `${baseURL.replace(/\/+$/, '')}/${relativeURL.replace(/^\/+/, '')}` + : baseURL +} diff --git a/uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js b/uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js new file mode 100644 index 0000000..63c6647 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/helpers/isAbsoluteURL.js @@ -0,0 +1,14 @@ +'use strict' + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +export default function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url) +} diff --git a/uni_modules/uview-ui/libs/luch-request/index.d.ts b/uni_modules/uview-ui/libs/luch-request/index.d.ts new file mode 100644 index 0000000..e939ce1 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/index.d.ts @@ -0,0 +1,116 @@ +type AnyObject = Record +type HttpPromise = Promise>; +type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask +export interface RequestTask { + abort: () => void; + offHeadersReceived: () => void; + onHeadersReceived: () => void; +} +export interface HttpRequestConfig { + /** 请求基地址 */ + baseURL?: string; + /** 请求服务器接口地址 */ + url?: string; + + /** 请求查询参数,自动拼接为查询字符串 */ + params?: AnyObject; + /** 请求体参数 */ + data?: AnyObject; + + /** 文件对应的 key */ + name?: string; + /** HTTP 请求中其他额外的 form data */ + formData?: AnyObject; + /** 要上传文件资源的路径。 */ + filePath?: string; + /** 需要上传的文件列表。使用 files 时,filePath 和 name 不生效,App、H5( 2.6.15+) */ + files?: Array<{ + name?: string; + file?: File; + uri: string; + }>; + /** 要上传的文件对象,仅H5(2.6.15+)支持 */ + file?: File; + + /** 请求头信息 */ + header?: AnyObject; + /** 请求方式 */ + method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD"; + /** 如果设为 json,会尝试对返回的数据做一次 JSON.parse */ + dataType?: string; + /** 设置响应的数据类型,支付宝小程序不支持 */ + responseType?: "text" | "arraybuffer"; + /** 自定义参数 */ + custom?: AnyObject; + /** 超时时间,仅微信小程序(2.10.0)、支付宝小程序支持 */ + timeout?: number; + /** DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+) */ + firstIpv4?: boolean; + /** 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+) */ + sslVerify?: boolean; + /** 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) */ + withCredentials?: boolean; + + /** 返回当前请求的task, options。请勿在此处修改options。 */ + getTask?: (task: T, options: HttpRequestConfig) => void; + /** 全局自定义验证器 */ + validateStatus?: (statusCode: number) => boolean | void; +} +export interface HttpResponse { + config: HttpRequestConfig; + statusCode: number; + cookies: Array; + data: T; + errMsg: string; + header: AnyObject; +} +export interface HttpUploadResponse { + config: HttpRequestConfig; + statusCode: number; + data: T; + errMsg: string; +} +export interface HttpDownloadResponse extends HttpResponse { + tempFilePath: string; +} +export interface HttpError { + config: HttpRequestConfig; + statusCode?: number; + cookies?: Array; + data?: any; + errMsg: string; + header?: AnyObject; +} +export interface HttpInterceptorManager { + use( + onFulfilled?: (config: V) => Promise | V, + onRejected?: (config: E) => Promise | E + ): void; + eject(id: number): void; +} +export abstract class HttpRequestAbstract { + constructor(config?: HttpRequestConfig); + config: HttpRequestConfig; + interceptors: { + request: HttpInterceptorManager; + response: HttpInterceptorManager; + } + middleware(config: HttpRequestConfig): HttpPromise; + request(config: HttpRequestConfig): HttpPromise; + get(url: string, config?: HttpRequestConfig): HttpPromise; + upload(url: string, config?: HttpRequestConfig): HttpPromise; + delete(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + head(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + post(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + put(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + connect(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + options(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + trace(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise; + + download(url: string, config?: HttpRequestConfig): Promise; + + setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void; +} + +declare class HttpRequest extends HttpRequestAbstract { } +export default HttpRequest; diff --git a/uni_modules/uview-ui/libs/luch-request/index.js b/uni_modules/uview-ui/libs/luch-request/index.js new file mode 100644 index 0000000..8fb2b44 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/index.js @@ -0,0 +1,3 @@ +import Request from './core/Request' + +export default Request diff --git a/uni_modules/uview-ui/libs/luch-request/utils.js b/uni_modules/uview-ui/libs/luch-request/utils.js new file mode 100644 index 0000000..847283d --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/utils.js @@ -0,0 +1,131 @@ +'use strict' + +// utils is a library of generic helper functions non-specific to axios + +const { toString } = Object.prototype + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +export function isArray(val) { + return toString.call(val) === '[object Array]' +} + +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +export function isObject(val) { + return val !== null && typeof val === 'object' +} + +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +export function isDate(val) { + return toString.call(val) === '[object Date]' +} + +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +export function isURLSearchParams(val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams +} + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +export function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /* eslint no-param-reassign:0 */ + obj = [obj] + } + + if (isArray(obj)) { + // Iterate over array values + for (let i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj) + } + } else { + // Iterate over object keys + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj) + } + } + } +} + +/** + * 是否为boolean 值 + * @param val + * @returns {boolean} + */ +export function isBoolean(val) { + return typeof val === 'boolean' +} + +/** + * 是否为真正的对象{} new Object + * @param {any} obj - 检测的对象 + * @returns {boolean} + */ +export function isPlainObject(obj) { + return Object.prototype.toString.call(obj) === '[object Object]' +} + +/** + * Function equal to merge with the difference being that no reference + * to original objects is kept. + * + * @see merge + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +export function deepMerge(/* obj1, obj2, obj3, ... */) { + const result = {} + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = deepMerge(result[key], val) + } else if (typeof val === 'object') { + result[key] = deepMerge({}, val) + } else { + result[key] = val + } + } + for (let i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue) + } + return result +} + +export function isUndefined(val) { + return typeof val === 'undefined' +} diff --git a/uni_modules/uview-ui/libs/luch-request/utils/clone.js b/uni_modules/uview-ui/libs/luch-request/utils/clone.js new file mode 100644 index 0000000..2fee704 --- /dev/null +++ b/uni_modules/uview-ui/libs/luch-request/utils/clone.js @@ -0,0 +1,264 @@ +/* eslint-disable */ +var clone = (function() { + 'use strict'; + + function _instanceof(obj, type) { + return type != null && obj instanceof type; + } + + var nativeMap; + try { + nativeMap = Map; + } catch(_) { + // maybe a reference error because no `Map`. Give it a dummy value that no + // value will ever be an instanceof. + nativeMap = function() {}; + } + + var nativeSet; + try { + nativeSet = Set; + } catch(_) { + nativeSet = function() {}; + } + + var nativePromise; + try { + nativePromise = Promise; + } catch(_) { + nativePromise = function() {}; + } + + /** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + * @param `includeNonEnumerable` - set to true if the non-enumerable properties + * should be cloned as well. Non-enumerable properties on the prototype + * chain will be ignored. (optional - false by default) + */ + function clone(parent, circular, depth, prototype, includeNonEnumerable) { + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + includeNonEnumerable = circular.includeNonEnumerable; + circular = circular.circular; + } + // maintain two arrays for circular references, where corresponding parents + // and children have the same index + var allParents = []; + var allChildren = []; + + var useBuffer = typeof Buffer != 'undefined'; + + if (typeof circular == 'undefined') + circular = true; + + if (typeof depth == 'undefined') + depth = Infinity; + + // recurse this function so we don't reset allParents and allChildren + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) + return null; + + if (depth === 0) + return parent; + + var child; + var proto; + if (typeof parent != 'object') { + return parent; + } + + if (_instanceof(parent, nativeMap)) { + child = new nativeMap(); + } else if (_instanceof(parent, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent, nativePromise)) { + child = new nativePromise(function (resolve, reject) { + parent.then(function(value) { + resolve(_clone(value, depth - 1)); + }, function(err) { + reject(_clone(err, depth - 1)); + }); + }); + } else if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && Buffer.isBuffer(parent)) { + if (Buffer.from) { + // Node.js >= 5.10.0 + child = Buffer.from(parent); + } else { + // Older Node.js versions + child = new Buffer(parent.length); + parent.copy(child); + } + return child; + } else if (_instanceof(parent, Error)) { + child = Object.create(parent); + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } + else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + allParents.push(parent); + allChildren.push(child); + } + + if (_instanceof(parent, nativeMap)) { + parent.forEach(function(value, key) { + var keyChild = _clone(key, depth - 1); + var valueChild = _clone(value, depth - 1); + child.set(keyChild, valueChild); + }); + } + if (_instanceof(parent, nativeSet)) { + parent.forEach(function(value) { + var entryChild = _clone(value, depth - 1); + child.add(entryChild); + }); + } + + for (var i in parent) { + var attrs = Object.getOwnPropertyDescriptor(parent, i); + if (attrs) { + child[i] = _clone(parent[i], depth - 1); + } + + try { + var objProperty = Object.getOwnPropertyDescriptor(parent, i); + if (objProperty.set === 'undefined') { + // no setter defined. Skip cloning this property + continue; + } + child[i] = _clone(parent[i], depth - 1); + } catch(e){ + if (e instanceof TypeError) { + // when in strict mode, TypeError will be thrown if child[i] property only has a getter + // we can't do anything about this, other than inform the user that this property cannot be set. + continue + } else if (e instanceof ReferenceError) { + //this may happen in non strict mode + continue + } + } + + } + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(parent); + for (var i = 0; i < symbols.length; i++) { + // Don't need to worry about cloning a symbol because it is a primitive, + // like a number or string. + var symbol = symbols[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); + if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { + continue; + } + child[symbol] = _clone(parent[symbol], depth - 1); + Object.defineProperty(child, symbol, descriptor); + } + } + + if (includeNonEnumerable) { + var allPropertyNames = Object.getOwnPropertyNames(parent); + for (var i = 0; i < allPropertyNames.length; i++) { + var propertyName = allPropertyNames[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); + if (descriptor && descriptor.enumerable) { + continue; + } + child[propertyName] = _clone(parent[propertyName], depth - 1); + Object.defineProperty(child, propertyName, descriptor); + } + } + + return child; + } + + return _clone(parent, depth); + } + + /** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ + clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); + }; + +// private utility functions + + function __objToStr(o) { + return Object.prototype.toString.call(o); + } + clone.__objToStr = __objToStr; + + function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; + } + clone.__isDate = __isDate; + + function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; + } + clone.__isArray = __isArray; + + function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; + } + clone.__isRegExp = __isRegExp; + + function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; + } + clone.__getRegExpFlags = __getRegExpFlags; + + return clone; +})(); + +export default clone diff --git a/uni_modules/uview-ui/libs/mixin/button.js b/uni_modules/uview-ui/libs/mixin/button.js new file mode 100644 index 0000000..0c019c2 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/button.js @@ -0,0 +1,13 @@ +export default { + props: { + lang: String, + sessionFrom: String, + sendMessageTitle: String, + sendMessagePath: String, + sendMessageImg: String, + showMessageCard: Boolean, + appParameter: String, + formType: String, + openType: String + } +} diff --git a/uni_modules/uview-ui/libs/mixin/mixin.js b/uni_modules/uview-ui/libs/mixin/mixin.js new file mode 100644 index 0000000..f41a178 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/mixin.js @@ -0,0 +1,160 @@ +module.exports = { + // 定义每个组件都可能需要用到的外部样式以及类名 + props: { + // 每个组件都有的父组件传递的样式,可以为字符串或者对象形式 + customStyle: { + type: [Object, String], + default: () => ({}) + }, + customClass: { + type: String, + default: '' + }, + // 跳转的页面路径 + url: { + type: String, + default: '' + }, + // 页面跳转的类型 + linkType: { + type: String, + default: 'navigateTo' + } + }, + data() { + return {} + }, + onLoad() { + // getRect挂载到$u上,因为这方法需要使用in(this),所以无法把它独立成一个单独的文件导出 + this.$u.getRect = this.$uGetRect + }, + created() { + // 组件当中,只有created声明周期,为了能在组件使用,故也在created中将方法挂载到$u + this.$u.getRect = this.$uGetRect + }, + computed: { + // 在2.x版本中,将会把$u挂载到uni对象下,导致在模板中无法使用uni.$u.xxx形式 + // 所以这里通过computed计算属性将其附加到this.$u上,就可以在模板或者js中使用uni.$u.xxx + // 只在nvue环境通过此方式引入完整的$u,其他平台会出现性能问题,非nvue则按需引入(主要原因是props过大) + $u() { + // #ifndef APP-NVUE + // 在非nvue端,移除props,http,mixin等对象,避免在小程序setData时数据过大影响性能 + return uni.$u.deepMerge(uni.$u, { + props: undefined, + http: undefined, + mixin: undefined + }) + // #endif + // #ifdef APP-NVUE + return uni.$u + // #endif + }, + /** + * 生成bem规则类名 + * 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class="[bem()]"的形式进行同用 + * 故采用如下折中做法,最后返回的是数组(一般平台)或字符串(支付宝和字节跳动平台),类似['a', 'b', 'c']或'a b c'的形式 + * @param {String} name 组件名称 + * @param {Array} fixed 一直会存在的类名 + * @param {Array} change 会根据变量值为true或者false而出现或者隐藏的类名 + * @returns {Array|string} + */ + bem() { + return function (name, fixed, change) { + // 类名前缀 + const prefix = `u-${name}--` + const classes = {} + if (fixed) { + fixed.map((item) => { + // 这里的类名,会一直存在 + classes[prefix + this[item]] = true + }) + } + if (change) { + change.map((item) => { + // 这里的类名,会根据this[item]的值为true或者false,而进行添加或者移除某一个类 + this[item] ? (classes[prefix + item] = this[item]) : (delete classes[prefix + item]) + }) + } + return Object.keys(classes) + // 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效 + // #ifdef MP-ALIPAY || MP-TOUTIAO || MP-LARK + .join(' ') + // #endif + } + } + }, + methods: { + // 跳转某一个页面 + openPage(urlKey = 'url') { + const url = this[urlKey] + if (url) { + // 执行类似uni.navigateTo的方法 + uni[this.linkType]({ + url + }) + } + }, + // 查询节点信息 + // 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸,为支付宝的bug(2020-07-21) + // 解决办法为在组件根部再套一个没有任何作用的view元素 + $uGetRect(selector, all) { + return new Promise((resolve) => { + uni.createSelectorQuery() + .in(this)[all ? 'selectAll' : 'select'](selector) + .boundingClientRect((rect) => { + if (all && Array.isArray(rect) && rect.length) { + resolve(rect) + } + if (!all && rect) { + resolve(rect) + } + }) + .exec() + }) + }, + getParentData(parentName = '') { + // 避免在created中去定义parent变量 + if (!this.parent) this.parent = {} + // 这里的本质原理是,通过获取父组件实例(也即类似u-radio的父组件u-radio-group的this) + // 将父组件this中对应的参数,赋值给本组件(u-radio的this)的parentData对象中对应的属性 + // 之所以需要这么做,是因为所有端中,头条小程序不支持通过this.parent.xxx去监听父组件参数的变化 + // 此处并不会自动更新子组件的数据,而是依赖父组件u-radio-group去监听data的变化,手动调用更新子组件的方法去重新获取 + this.parent = uni.$u.$parent.call(this, parentName) + if (this.parent.children) { + // 如果父组件的children不存在本组件的实例,才将本实例添加到父组件的children中 + this.parent.children.indexOf(this) === -1 && this.parent.children.push(this) + } + if (this.parent && this.parentData) { + // 历遍parentData中的属性,将parent中的同名属性赋值给parentData + Object.keys(this.parentData).map((key) => { + this.parentData[key] = this.parent[key] + }) + } + }, + // 阻止事件冒泡 + preventEvent(e) { + e && typeof (e.stopPropagation) === 'function' && e.stopPropagation() + }, + // 空操作 + noop(e) { + this.preventEvent(e) + } + }, + onReachBottom() { + uni.$emit('uOnReachBottom') + }, + beforeDestroy() { + // 判断当前页面是否存在parent和chldren,一般在checkbox和checkbox-group父子联动的场景会有此情况 + // 组件销毁时,移除子组件在父组件children数组中的实例,释放资源,避免数据混乱 + if (this.parent && uni.$u.test.array(this.parent.children)) { + // 组件销毁时,移除父组件中的children数组中对应的实例 + const childrenList = this.parent.children + childrenList.map((child, index) => { + // 如果相等,则移除 + if (child === this) { + childrenList.splice(index, 1) + } + }) + } + } +} diff --git a/uni_modules/uview-ui/libs/mixin/mpMixin.js b/uni_modules/uview-ui/libs/mixin/mpMixin.js new file mode 100644 index 0000000..29e7e65 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/mpMixin.js @@ -0,0 +1,8 @@ +export default { + // #ifdef MP-WEIXIN + // 将自定义节点设置成虚拟的,更加接近Vue组件的表现,能更好的使用flex属性 + options: { + virtualHost: true + } + // #endif +} diff --git a/uni_modules/uview-ui/libs/mixin/mpShare.js b/uni_modules/uview-ui/libs/mixin/mpShare.js new file mode 100644 index 0000000..b07bbd3 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/mpShare.js @@ -0,0 +1,13 @@ +module.exports = { + onLoad() { + // 设置默认的转发参数 + uni.$u.mpShare = { + title: '', // 默认为小程序名称 + path: '', // 默认为当前页面路径 + imageUrl: '' // 默认为当前页面的截图 + } + }, + onShareAppMessage() { + return uni.$u.mpShare + } +} diff --git a/uni_modules/uview-ui/libs/mixin/openType.js b/uni_modules/uview-ui/libs/mixin/openType.js new file mode 100644 index 0000000..1216181 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/openType.js @@ -0,0 +1,25 @@ +export default { + props: { + openType: String + }, + methods: { + onGetUserInfo(event) { + this.$emit('getuserinfo', event.detail) + }, + onContact(event) { + this.$emit('contact', event.detail) + }, + onGetPhoneNumber(event) { + this.$emit('getphonenumber', event.detail) + }, + onError(event) { + this.$emit('error', event.detail) + }, + onLaunchApp(event) { + this.$emit('launchapp', event.detail) + }, + onOpenSetting(event) { + this.$emit('opensetting', event.detail) + } + } +} diff --git a/uni_modules/uview-ui/libs/mixin/style.js b/uni_modules/uview-ui/libs/mixin/style.js new file mode 100644 index 0000000..2660180 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/style.js @@ -0,0 +1,228 @@ +export default { + props: { + // flex排列方式 + flexDirection: { + type: String, + default: '' + }, + // flex-direction的简写 + fd: { + type: String, + default: '' + }, + // 展示类型 + display: { + type: String, + default: '' + }, + // display简写 + d: { + type: String, + default: '' + }, + // 主轴排列方式 + justifyContent: { + type: String, + default: '' + }, + // justifyContent的简写 + jc: { + type: String, + default: '' + }, + // 纵轴排列方式 + alignItems: { + type: String, + default: '' + }, + // align-items的简写 + ai: { + type: String, + default: '' + }, + color: { + type: String, + default: '' + }, + // color简写 + c: { + type: String, + default: '' + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: 0 + }, + // font-size简写 + fs: { + type: [String, Number], + default: '' + }, + margin: { + type: [String, Number], + default: 0 + }, + // margin简写 + m: { + type: [String, Number], + default: 0 + }, + // margin-top + marginTop: { + type: [String, Number], + default: 0 + }, + // margin-top简写 + mt: { + type: [String, Number], + default: 0 + }, + // margin-right + marginRight: { + type: [String, Number], + default: 0 + }, + // margin-right简写 + mr: { + type: [String, Number], + default: 0 + }, + // margin-bottom + marginBottom: { + type: [String, Number], + default: 0 + }, + // margin-bottom简写 + mb: { + type: [String, Number], + default: 0 + }, + // margin-left + marginLeft: { + type: [String, Number], + default: 0 + }, + // margin-left简写 + ml: { + type: [String, Number], + default: 0 + }, + // padding-left + paddingLeft: { + type: [String, Number], + default: 0 + }, + // padding-left简写 + pl: { + type: [String, Number], + default: 0 + }, + // padding-top + paddingTop: { + type: [String, Number], + default: 0 + }, + // padding-top简写 + pt: { + type: [String, Number], + default: 0 + }, + // padding-right + paddingRight: { + type: [String, Number], + default: 0 + }, + // padding-right简写 + pr: { + type: [String, Number], + default: 0 + }, + // padding-bottom + paddingBottom: { + type: [String, Number], + default: 0 + }, + // padding-bottom简写 + pb: { + type: [String, Number], + default: 0 + }, + // border-radius + borderRadius: { + type: [String, Number], + default: 0 + }, + // border-radius简写 + radius: { + type: [String, Number], + default: 0 + }, + // transform + transform: { + type: String, + default: '' + }, + // 定位 + position: { + type: String, + default: '' + }, + // position简写 + pos: { + type: String, + default: '' + }, + // 宽度 + width: { + type: [String, Number], + default: null + }, + // width简写 + w: { + type: [String, Number], + default: null + }, + // 高度 + height: { + type: [String, Number], + default: null + }, + // height简写 + h: { + type: [String, Number], + default: null + }, + top: { + type: [String, Number], + default: 0 + }, + right: { + type: [String, Number], + default: 0 + }, + bottom: { + type: [String, Number], + default: 0 + }, + left: { + type: [String, Number], + default: 0 + } + }, + computed: { + viewStyle() { + const style = {} + 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) + + return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle)) + } + }, + methods: { + // 获取margin或者padding的单位,比如padding: 0 20转为padding: 0 20px + getUnit(unit = '') { + // 取出两端空格,分隔成数组,再对数组的每个元素添加单位,最后再合并成字符串 + return uni.$u.trim(unit).split(' ').map((item) => uni.$u.addUnit(item)).join(' ') + } + } +} diff --git a/uni_modules/uview-ui/libs/mixin/touch.js b/uni_modules/uview-ui/libs/mixin/touch.js new file mode 100644 index 0000000..0ecbd88 --- /dev/null +++ b/uni_modules/uview-ui/libs/mixin/touch.js @@ -0,0 +1,59 @@ +const MIN_DISTANCE = 10 + +function getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal' + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical' + } + return '' +} + +export default { + methods: { + getTouchPoint(e) { + if (!e) { + return { + x: 0, + y: 0 + } + } if (e.touches && e.touches[0]) { + return { + x: e.touches[0].pageX, + y: e.touches[0].pageY + } + } if (e.changedTouches && e.changedTouches[0]) { + return { + x: e.changedTouches[0].pageX, + y: e.changedTouches[0].pageY + } + } + return { + x: e.clientX || 0, + y: e.clientY || 0 + } + }, + resetTouchStatus() { + this.direction = '' + this.deltaX = 0 + this.deltaY = 0 + this.offsetX = 0 + this.offsetY = 0 + }, + touchStart(event) { + this.resetTouchStatus() + const touch = this.getTouchPoint(event) + this.startX = touch.x + this.startY = touch.y + }, + touchMove(event) { + const touch = this.getTouchPoint(event) + this.deltaX = touch.x - this.startX + this.deltaY = touch.y - this.startY + this.offsetX = Math.abs(this.deltaX) + this.offsetY = Math.abs(this.deltaY) + this.direction = this.direction || getDirection(this.offsetX, this.offsetY) + } + } +} diff --git a/uni_modules/uview-ui/libs/util/async-validator.js b/uni_modules/uview-ui/libs/util/async-validator.js new file mode 100644 index 0000000..9e114df --- /dev/null +++ b/uni_modules/uview-ui/libs/util/async-validator.js @@ -0,0 +1,1343 @@ +function _extends() { + _extends = Object.assign || function (target) { + for (let i = 1; i < arguments.length; i++) { + const source = arguments[i] + + for (const key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target + } + + return _extends.apply(this, arguments) +} + +/* eslint no-console:0 */ +const formatRegExp = /%[sdj%]/g +let warning = function warning() {} // don't print warning message when in production env or node runtime + +if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window + !== 'undefined' && typeof document !== 'undefined') { + warning = function warning(type, errors) { + if (typeof console !== 'undefined' && console.warn) { + if (errors.every((e) => typeof e === 'string')) { + console.warn(type, errors) + } + } + } +} + +function convertFieldsError(errors) { + if (!errors || !errors.length) return null + const fields = {} + errors.forEach((error) => { + const { field } = error + fields[field] = fields[field] || [] + fields[field].push(error) + }) + return fields +} + +function format() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key] + } + + let i = 1 + const f = args[0] + const len = args.length + + if (typeof f === 'function') { + return f.apply(null, args.slice(1)) + } + + if (typeof f === 'string') { + let str = String(f).replace(formatRegExp, (x) => { + if (x === '%%') { + return '%' + } + + if (i >= len) { + return x + } + + switch (x) { + case '%s': + return String(args[i++]) + + case '%d': + return Number(args[i++]) + + case '%j': + try { + return JSON.stringify(args[i++]) + } catch (_) { + return '[Circular]' + } + + break + + default: + return x + } + }) + + for (let arg = args[i]; i < len; arg = args[++i]) { + str += ` ${arg}` + } + + return str + } + + return f +} + +function isNativeStringType(type) { + return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern' +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true + } + + if (type === 'array' && Array.isArray(value) && !value.length) { + return true + } + + if (isNativeStringType(type) && typeof value === 'string' && !value) { + return true + } + + return false +} + +function asyncParallelArray(arr, func, callback) { + const results = [] + let total = 0 + const arrLength = arr.length + + function count(errors) { + results.push.apply(results, errors) + total++ + + if (total === arrLength) { + callback(results) + } + } + + arr.forEach((a) => { + func(a, count) + }) +} + +function asyncSerialArray(arr, func, callback) { + let index = 0 + const arrLength = arr.length + + function next(errors) { + if (errors && errors.length) { + callback(errors) + return + } + + const original = index + index += 1 + + if (original < arrLength) { + func(arr[original], next) + } else { + callback([]) + } + } + + next([]) +} + +function flattenObjArr(objArr) { + const ret = [] + Object.keys(objArr).forEach((k) => { + ret.push.apply(ret, objArr[k]) + }) + return ret +} + +function asyncMap(objArr, option, func, callback) { + if (option.first) { + const _pending = new Promise((resolve, reject) => { + const next = function next(errors) { + callback(errors) + return errors.length ? reject({ + errors, + fields: convertFieldsError(errors) + }) : resolve() + } + + const flattenArr = flattenObjArr(objArr) + asyncSerialArray(flattenArr, func, next) + }) + + _pending.catch((e) => e) + + return _pending + } + + let firstFields = option.firstFields || [] + + if (firstFields === true) { + firstFields = Object.keys(objArr) + } + + const objArrKeys = Object.keys(objArr) + const objArrLength = objArrKeys.length + let total = 0 + const results = [] + const pending = new Promise((resolve, reject) => { + const next = function next(errors) { + results.push.apply(results, errors) + total++ + + if (total === objArrLength) { + callback(results) + return results.length ? reject({ + errors: results, + fields: convertFieldsError(results) + }) : resolve() + } + } + + if (!objArrKeys.length) { + callback(results) + resolve() + } + + objArrKeys.forEach((key) => { + const arr = objArr[key] + + if (firstFields.indexOf(key) !== -1) { + asyncSerialArray(arr, func, next) + } else { + asyncParallelArray(arr, func, next) + } + }) + }) + pending.catch((e) => e) + return pending +} + +function complementError(rule) { + return function (oe) { + if (oe && oe.message) { + oe.field = oe.field || rule.fullField + return oe + } + + return { + message: typeof oe === 'function' ? oe() : oe, + field: oe.field || rule.fullField + } + } +} + +function deepMerge(target, source) { + if (source) { + for (const s in source) { + if (source.hasOwnProperty(s)) { + const value = source[s] + + if (typeof value === 'object' && typeof target[s] === 'object') { + target[s] = { ...target[s], ...value } + } else { + target[s] = value + } + } + } + } + + return target +} + +/** + * Rule for validating required fields. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function required(rule, value, source, errors, options, type) { + if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) { + errors.push(format(options.messages.required, rule.fullField)) + } +} + +/** + * Rule for validating whitespace. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function whitespace(rule, value, source, errors, options) { + if (/^\s+$/.test(value) || value === '') { + errors.push(format(options.messages.whitespace, rule.fullField)) + } +} + +/* eslint max-len:0 */ + +const pattern = { + // http://emailregex.com/ + 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,}))$/, + url: new RegExp( + '^(?!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]*)?$', + 'i' + ), + hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i +} +var types = { + integer: function integer(value) { + return /^(-)?\d+$/.test(value); + }, + float: function float(value) { + return /^(-)?\d+(\.\d+)?$/.test(value); + }, + array: function array(value) { + return Array.isArray(value) + }, + regexp: function regexp(value) { + if (value instanceof RegExp) { + return true + } + + try { + return !!new RegExp(value) + } catch (e) { + return false + } + }, + date: function date(value) { + return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear + === 'function' + }, + number: function number(value) { + if (isNaN(value)) { + return false + } + + // 修改源码,将字符串数值先转为数值 + return typeof +value === 'number' + }, + object: function object(value) { + return typeof value === 'object' && !types.array(value) + }, + method: function method(value) { + return typeof value === 'function' + }, + email: function email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255 + }, + url: function url(value) { + return typeof value === 'string' && !!value.match(pattern.url) + }, + hex: function hex(value) { + return typeof value === 'string' && !!value.match(pattern.hex) + } +} +/** + * Rule for validating the type of a value. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function type(rule, value, source, errors, options) { + if (rule.required && value === undefined) { + required(rule, value, source, errors, options) + return + } + + const custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'] + const ruleType = rule.type + + if (custom.indexOf(ruleType) > -1) { + if (!types[ruleType](value)) { + errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) + } // straight typeof check + } else if (ruleType && typeof value !== rule.type) { + errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type)) + } +} + +/** + * Rule for validating minimum and maximum allowed values. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function range(rule, value, source, errors, options) { + const len = typeof rule.len === 'number' + const min = typeof rule.min === 'number' + const max = typeof rule.max === 'number' // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane) + + const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g + let val = value + let key = null + const num = typeof value === 'number' + const str = typeof value === 'string' + const arr = Array.isArray(value) + + if (num) { + key = 'number' + } else if (str) { + key = 'string' + } else if (arr) { + key = 'array' + } // if the value is not of a supported type for range validation + // the validation rule rule should use the + // type property to also test for a particular type + + if (!key) { + return false + } + + if (arr) { + val = value.length + } + + if (str) { + // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3 + val = value.replace(spRegexp, '_').length + } + + if (len) { + if (val !== rule.len) { + errors.push(format(options.messages[key].len, rule.fullField, rule.len)) + } + } else if (min && !max && val < rule.min) { + errors.push(format(options.messages[key].min, rule.fullField, rule.min)) + } else if (max && !min && val > rule.max) { + errors.push(format(options.messages[key].max, rule.fullField, rule.max)) + } else if (min && max && (val < rule.min || val > rule.max)) { + errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max)) + } +} + +const ENUM = 'enum' +/** + * Rule for validating a value exists in an enumerable list. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function enumerable(rule, value, source, errors, options) { + rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [] + + if (rule[ENUM].indexOf(value) === -1) { + errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', '))) + } +} + +/** + * Rule for validating a regular expression pattern. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param source The source object being validated. + * @param errors An array of errors that this rule may add + * validation errors to. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function pattern$1(rule, value, source, errors, options) { + if (rule.pattern) { + if (rule.pattern instanceof RegExp) { + // if a RegExp instance is passed, reset `lastIndex` in case its `global` + // flag is accidentally set to `true`, which in a validation scenario + // is not necessary and the result might be misleading + rule.pattern.lastIndex = 0 + + if (!rule.pattern.test(value)) { + errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)) + } + } else if (typeof rule.pattern === 'string') { + const _pattern = new RegExp(rule.pattern) + + if (!_pattern.test(value)) { + errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern)) + } + } + } +} + +const rules = { + required, + whitespace, + type, + range, + enum: enumerable, + pattern: pattern$1 +} + +/** + * Performs validation for string types. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function string(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'string') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, 'string') + + if (!isEmptyValue(value, 'string')) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + rules.pattern(rule, value, source, errors, options) + + if (rule.whitespace === true) { + rules.whitespace(rule, value, source, errors, options) + } + } + } + + callback(errors) +} + +/** + * Validates a function. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function method(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function number(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (value === '') { + value = undefined + } + + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a boolean. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function _boolean(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates the regular expression type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function regexp(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value)) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number is an integer. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function integer(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a number is a floating point number. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function floatFn(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates an array. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function array(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'array') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, 'array') + + if (!isEmptyValue(value, 'array')) { + rules.type(rule, value, source, errors, options) + rules.range(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates an object. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function object(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +const ENUM$1 = 'enum' +/** + * Validates an enumerable list. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function enumerable$1(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (value !== undefined) { + rules[ENUM$1](rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Validates a regular expression pattern. + * + * Performs validation when a rule only contains + * a pattern property but is not declared as a string type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function pattern$2(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, 'string') && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value, 'string')) { + rules.pattern(rule, value, source, errors, options) + } + } + + callback(errors) +} + +function date(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + + if (!isEmptyValue(value)) { + let dateObject + + if (typeof value === 'number') { + dateObject = new Date(value) + } else { + dateObject = value + } + + rules.type(rule, dateObject, source, errors, options) + + if (dateObject) { + rules.range(rule, dateObject.getTime(), source, errors, options) + } + } + } + + callback(errors) +} + +function required$1(rule, value, callback, source, options) { + const errors = [] + const type = Array.isArray(value) ? 'array' : typeof value + rules.required(rule, value, source, errors, options, type) + callback(errors) +} + +function type$1(rule, value, callback, source, options) { + const ruleType = rule.type + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value, ruleType) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options, ruleType) + + if (!isEmptyValue(value, ruleType)) { + rules.type(rule, value, source, errors, options) + } + } + + callback(errors) +} + +/** + * Performs validation for any type. + * + * @param rule The validation rule. + * @param value The value of the field on the source object. + * @param callback The callback function. + * @param source The source object being validated. + * @param options The validation options. + * @param options.messages The validation messages. + */ + +function any(rule, value, callback, source, options) { + const errors = [] + const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field) + + if (validate) { + if (isEmptyValue(value) && !rule.required) { + return callback() + } + + rules.required(rule, value, source, errors, options) + } + + callback(errors) +} + +const validators = { + string, + method, + number, + boolean: _boolean, + regexp, + integer, + float: floatFn, + array, + object, + enum: enumerable$1, + pattern: pattern$2, + date, + url: type$1, + hex: type$1, + email: type$1, + required: required$1, + any +} + +function newMessages() { + return { + default: 'Validation error on field %s', + required: '%s is required', + enum: '%s must be one of %s', + whitespace: '%s cannot be empty', + date: { + format: '%s date %s is invalid for format %s', + parse: '%s date could not be parsed, %s is invalid ', + invalid: '%s date %s is invalid' + }, + types: { + string: '%s is not a %s', + method: '%s is not a %s (function)', + array: '%s is not an %s', + object: '%s is not an %s', + number: '%s is not a %s', + date: '%s is not a %s', + boolean: '%s is not a %s', + integer: '%s is not an %s', + float: '%s is not a %s', + regexp: '%s is not a valid %s', + email: '%s is not a valid %s', + url: '%s is not a valid %s', + hex: '%s is not a valid %s' + }, + string: { + len: '%s must be exactly %s characters', + min: '%s must be at least %s characters', + max: '%s cannot be longer than %s characters', + range: '%s must be between %s and %s characters' + }, + number: { + len: '%s must equal %s', + min: '%s cannot be less than %s', + max: '%s cannot be greater than %s', + range: '%s must be between %s and %s' + }, + array: { + len: '%s must be exactly %s in length', + min: '%s cannot be less than %s in length', + max: '%s cannot be greater than %s in length', + range: '%s must be between %s and %s in length' + }, + pattern: { + mismatch: '%s value %s does not match pattern %s' + }, + clone: function clone() { + const cloned = JSON.parse(JSON.stringify(this)) + cloned.clone = this.clone + return cloned + } + } +} +const messages = newMessages() + +/** + * Encapsulates a validation schema. + * + * @param descriptor An object declaring validation rules + * for this schema. + */ + +function Schema(descriptor) { + this.rules = null + this._messages = messages + this.define(descriptor) +} + +Schema.prototype = { + messages: function messages(_messages) { + if (_messages) { + this._messages = deepMerge(newMessages(), _messages) + } + + return this._messages + }, + define: function define(rules) { + if (!rules) { + throw new Error('Cannot configure a schema with no rules') + } + + if (typeof rules !== 'object' || Array.isArray(rules)) { + throw new Error('Rules must be an object') + } + + this.rules = {} + let z + let item + + for (z in rules) { + if (rules.hasOwnProperty(z)) { + item = rules[z] + this.rules[z] = Array.isArray(item) ? item : [item] + } + } + }, + validate: function validate(source_, o, oc) { + const _this = this + + if (o === void 0) { + o = {} + } + + if (oc === void 0) { + oc = function oc() {} + } + + let source = source_ + let options = o + let callback = oc + + if (typeof options === 'function') { + callback = options + options = {} + } + + if (!this.rules || Object.keys(this.rules).length === 0) { + if (callback) { + callback() + } + + return Promise.resolve() + } + + function complete(results) { + let i + let errors = [] + let fields = {} + + function add(e) { + if (Array.isArray(e)) { + let _errors + + errors = (_errors = errors).concat.apply(_errors, e) + } else { + errors.push(e) + } + } + + for (i = 0; i < results.length; i++) { + add(results[i]) + } + + if (!errors.length) { + errors = null + fields = null + } else { + fields = convertFieldsError(errors) + } + + callback(errors, fields) + } + + if (options.messages) { + let messages$1 = this.messages() + + if (messages$1 === messages) { + messages$1 = newMessages() + } + + deepMerge(messages$1, options.messages) + options.messages = messages$1 + } else { + options.messages = this.messages() + } + + let arr + let value + const series = {} + const keys = options.keys || Object.keys(this.rules) + keys.forEach((z) => { + arr = _this.rules[z] + value = source[z] + arr.forEach((r) => { + let rule = r + + if (typeof rule.transform === 'function') { + if (source === source_) { + source = { ...source } + } + + value = source[z] = rule.transform(value) + } + + if (typeof rule === 'function') { + rule = { + validator: rule + } + } else { + rule = { ...rule } + } + + rule.validator = _this.getValidationMethod(rule) + rule.field = z + rule.fullField = rule.fullField || z + rule.type = _this.getType(rule) + + if (!rule.validator) { + return + } + + series[z] = series[z] || [] + series[z].push({ + rule, + value, + source, + field: z + }) + }) + }) + const errorFields = {} + return asyncMap(series, options, (data, doIt) => { + const { rule } = data + let deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField + === 'object') + deep = deep && (rule.required || !rule.required && data.value) + rule.field = data.field + + function addFullfield(key, schema) { + return { ...schema, fullField: `${rule.fullField}.${key}` } + } + + function cb(e) { + if (e === void 0) { + e = [] + } + + let errors = e + + if (!Array.isArray(errors)) { + errors = [errors] + } + + if (!options.suppressWarning && errors.length) { + Schema.warning('async-validator:', errors) + } + + if (errors.length && rule.message) { + errors = [].concat(rule.message) + } + + errors = errors.map(complementError(rule)) + + if (options.first && errors.length) { + errorFields[rule.field] = 1 + return doIt(errors) + } + + if (!deep) { + doIt(errors) + } else { + // if rule is required but the target object + // does not exist fail at the rule level and don't + // go deeper + if (rule.required && !data.value) { + if (rule.message) { + errors = [].concat(rule.message).map(complementError(rule)) + } else if (options.error) { + errors = [options.error(rule, format(options.messages.required, rule.field))] + } else { + errors = [] + } + + return doIt(errors) + } + + let fieldsSchema = {} + + if (rule.defaultField) { + for (const k in data.value) { + if (data.value.hasOwnProperty(k)) { + fieldsSchema[k] = rule.defaultField + } + } + } + + fieldsSchema = { ...fieldsSchema, ...data.rule.fields } + + for (const f in fieldsSchema) { + if (fieldsSchema.hasOwnProperty(f)) { + const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]] + fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f)) + } + } + + const schema = new Schema(fieldsSchema) + schema.messages(options.messages) + + if (data.rule.options) { + data.rule.options.messages = options.messages + data.rule.options.error = options.error + } + + schema.validate(data.value, data.rule.options || options, (errs) => { + const finalErrors = [] + + if (errors && errors.length) { + finalErrors.push.apply(finalErrors, errors) + } + + if (errs && errs.length) { + finalErrors.push.apply(finalErrors, errs) + } + + doIt(finalErrors.length ? finalErrors : null) + }) + } + } + + let res + + if (rule.asyncValidator) { + res = rule.asyncValidator(rule, data.value, cb, data.source, options) + } else if (rule.validator) { + res = rule.validator(rule, data.value, cb, data.source, options) + + if (res === true) { + cb() + } else if (res === false) { + cb(rule.message || `${rule.field} fails`) + } else if (res instanceof Array) { + cb(res) + } else if (res instanceof Error) { + cb(res.message) + } + } + + if (res && res.then) { + res.then(() => cb(), (e) => cb(e)) + } + }, (results) => { + complete(results) + }) + }, + getType: function getType(rule) { + if (rule.type === undefined && rule.pattern instanceof RegExp) { + rule.type = 'pattern' + } + + if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) { + throw new Error(format('Unknown rule type %s', rule.type)) + } + + return rule.type || 'string' + }, + getValidationMethod: function getValidationMethod(rule) { + if (typeof rule.validator === 'function') { + return rule.validator + } + + const keys = Object.keys(rule) + const messageIndex = keys.indexOf('message') + + if (messageIndex !== -1) { + keys.splice(messageIndex, 1) + } + + if (keys.length === 1 && keys[0] === 'required') { + return validators.required + } + + return validators[this.getType(rule)] || false + } +} + +Schema.register = function register(type, validator) { + if (typeof validator !== 'function') { + throw new Error('Cannot register a validator by type, validator is not a function') + } + + validators[type] = validator +} + +Schema.warning = warning +Schema.messages = messages + +export default Schema +// # sourceMappingURL=index.js.map diff --git a/uni_modules/uview-ui/libs/util/calendar.js b/uni_modules/uview-ui/libs/util/calendar.js new file mode 100644 index 0000000..e006dea --- /dev/null +++ b/uni_modules/uview-ui/libs/util/calendar.js @@ -0,0 +1,546 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @github https://github.com/jjonline/calendar.js +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year +* @Version 1.0.3 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + 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'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + 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' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default: + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + 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 } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/uni_modules/uview-ui/libs/util/dayjs.js b/uni_modules/uview-ui/libs/util/dayjs.js new file mode 100644 index 0000000..c4efea0 --- /dev/null +++ b/uni_modules/uview-ui/libs/util/dayjs.js @@ -0,0 +1,308 @@ +!(function (t, e) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = e() : typeof define === 'function' + && define.amd ? define(e) : t.dayjs = e() +}(this, () => { + 'use strict' + + const t = 'millisecond' + const e = 'second' + const n = 'minute' + const r = 'hour' + const i = 'day' + const s = 'week' + const u = 'month' + const a = 'quarter' + const o = 'year' + const f = 'date' + const h = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d+)?$/ + 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 + const d = { + name: 'en', + weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_') + } + const $ = function (t, e, n) { + const r = String(t) + return !r || r.length >= e ? t : `${Array(e + 1 - r.length).join(n)}${t}` + } + const l = { + s: $, + z(t) { + const e = -t.utcOffset() + const n = Math.abs(e) + const r = Math.floor(n / 60) + const i = n % 60 + return `${(e <= 0 ? '+' : '-') + $(r, 2, '0')}:${$(i, 2, '0')}` + }, + m: function t(e, n) { + if (e.date() < n.date()) return -t(n, e) + const r = 12 * (n.year() - e.year()) + (n.month() - e.month()) + const i = e.clone().add(r, u) + const s = n - i < 0 + const a = e.clone().add(r + (s ? -1 : 1), u) + return +(-(r + (n - i) / (s ? i - a : a - i)) || 0) + }, + a(t) { + return t < 0 ? Math.ceil(t) || 0 : Math.floor(t) + }, + p(h) { + return { + M: u, + y: o, + w: s, + d: i, + D: f, + h: r, + m: n, + s: e, + ms: t, + Q: a + }[h] || String(h || '').toLowerCase().replace(/s$/, '') + }, + u(t) { + return void 0 === t + } + } + let y = 'en' + const M = {} + M[y] = d + const m = function (t) { + return t instanceof S + } + const D = function (t, e, n) { + let r + if (!t) return y + if (typeof t === 'string') M[t] && (r = t), e && (M[t] = e, r = t) + else { + const i = t.name + M[i] = t, r = i + } + return !n && r && (y = r), r || !n && y + } + const v = function (t, e) { + if (m(t)) return t.clone() + const n = typeof e === 'object' ? e : {} + return n.date = t, n.args = arguments, new S(n) + } + const g = l + g.l = D, g.i = m, g.w = function (t, e) { + return v(t, { + locale: e.$L, + utc: e.$u, + x: e.$x, + $offset: e.$offset + }) + } + var S = (function () { + function d(t) { + this.$L = D(t.locale, null, !0), this.parse(t) + } + const $ = d.prototype + return $.parse = function (t) { + this.$d = (function (t) { + const e = t.date + const n = t.utc + if (e === null) return new Date(NaN) + if (g.u(e)) return new Date() + if (e instanceof Date) return new Date(e) + if (typeof e === 'string' && !/Z$/i.test(e)) { + const r = e.match(h) + if (r) { + const i = r[2] - 1 || 0 + const s = (r[7] || '0').substring(0, 3) + 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] + || 1, r[4] || 0, r[5] || 0, r[6] || 0, s) + } + } + return new Date(e) + }(t)), this.$x = t.x || {}, this.init() + }, $.init = function () { + const t = this.$d + this.$y = t.getFullYear(), this.$M = t.getMonth(), this.$D = t.getDate(), this.$W = t.getDay(), this.$H = t.getHours(), + this.$m = t.getMinutes(), this.$s = t.getSeconds(), this.$ms = t.getMilliseconds() + }, $.$utils = function () { + return g + }, $.isValid = function () { + return !(this.$d.toString() === 'Invalid Date') + }, $.isSame = function (t, e) { + const n = v(t) + return this.startOf(e) <= n && n <= this.endOf(e) + }, $.isAfter = function (t, e) { + return v(t) < this.startOf(e) + }, $.isBefore = function (t, e) { + return this.endOf(e) < v(t) + }, $.$g = function (t, e, n) { + return g.u(t) ? this[e] : this.set(n, t) + }, $.unix = function () { + return Math.floor(this.valueOf() / 1e3) + }, $.valueOf = function () { + return this.$d.getTime() + }, $.startOf = function (t, a) { + const h = this + const c = !!g.u(a) || a + const d = g.p(t) + const $ = function (t, e) { + const n = g.w(h.$u ? Date.UTC(h.$y, e, t) : new Date(h.$y, e, t), h) + return c ? n : n.endOf(i) + } + const l = function (t, e) { + return g.w(h.toDate()[t].apply(h.toDate('s'), (c ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e)), h) + } + const y = this.$W + const M = this.$M + const m = this.$D + const D = `set${this.$u ? 'UTC' : ''}` + switch (d) { + case o: + return c ? $(1, 0) : $(31, 11) + case u: + return c ? $(1, M) : $(0, M + 1) + case s: + var v = this.$locale().weekStart || 0 + var S = (y < v ? y + 7 : y) - v + return $(c ? m - S : m + (6 - S), M) + case i: + case f: + return l(`${D}Hours`, 0) + case r: + return l(`${D}Minutes`, 1) + case n: + return l(`${D}Seconds`, 2) + case e: + return l(`${D}Milliseconds`, 3) + default: + return this.clone() + } + }, $.endOf = function (t) { + return this.startOf(t, !1) + }, $.$set = function (s, a) { + let h; const c = g.p(s) + const d = `set${this.$u ? 'UTC' : ''}` + const $ = (h = {}, h[i] = `${d}Date`, h[f] = `${d}Date`, h[u] = `${d}Month`, h[o] = `${d}FullYear`, h[r] = `${d}Hours`, + h[n] = `${d}Minutes`, h[e] = `${d}Seconds`, h[t] = `${d}Milliseconds`, h)[c] + const l = c === i ? this.$D + (a - this.$W) : a + if (c === u || c === o) { + const y = this.clone().set(f, 1) + y.$d[$](l), y.init(), this.$d = y.set(f, Math.min(this.$D, y.daysInMonth())).$d + } else $ && this.$d[$](l) + return this.init(), this + }, $.set = function (t, e) { + return this.clone().$set(t, e) + }, $.get = function (t) { + return this[g.p(t)]() + }, $.add = function (t, a) { + let f; const + h = this + t = Number(t) + const c = g.p(a) + const d = function (e) { + const n = v(h) + return g.w(n.date(n.date() + Math.round(e * t)), h) + } + if (c === u) return this.set(u, this.$M + t) + if (c === o) return this.set(o, this.$y + t) + if (c === i) return d(1) + if (c === s) return d(7) + const $ = (f = {}, f[n] = 6e4, f[r] = 36e5, f[e] = 1e3, f)[c] || 1 + const l = this.$d.getTime() + t * $ + return g.w(l, this) + }, $.subtract = function (t, e) { + return this.add(-1 * t, e) + }, $.format = function (t) { + const e = this + if (!this.isValid()) return 'Invalid Date' + const n = t || 'YYYY-MM-DDTHH:mm:ssZ' + const r = g.z(this) + const i = this.$locale() + const s = this.$H + const u = this.$m + const a = this.$M + const o = i.weekdays + const f = i.months + const h = function (t, r, i, s) { + return t && (t[r] || t(e, n)) || i[r].substr(0, s) + } + const d = function (t) { + return g.s(s % 12 || 12, t, '0') + } + const $ = i.meridiem || function (t, e, n) { + const r = t < 12 ? 'AM' : 'PM' + return n ? r.toLowerCase() : r + } + const l = { + YY: String(this.$y).slice(-2), + YYYY: this.$y, + M: a + 1, + MM: g.s(a + 1, 2, '0'), + MMM: h(i.monthsShort, a, f, 3), + MMMM: h(f, a), + D: this.$D, + DD: g.s(this.$D, 2, '0'), + d: String(this.$W), + dd: h(i.weekdaysMin, this.$W, o, 2), + ddd: h(i.weekdaysShort, this.$W, o, 3), + dddd: o[this.$W], + H: String(s), + HH: g.s(s, 2, '0'), + h: d(1), + hh: d(2), + a: $(s, u, !0), + A: $(s, u, !1), + m: String(u), + mm: g.s(u, 2, '0'), + s: String(this.$s), + ss: g.s(this.$s, 2, '0'), + SSS: g.s(this.$ms, 3, '0'), + Z: r + } + return n.replace(c, (t, e) => e || l[t] || r.replace(':', '')) + }, $.utcOffset = function () { + return 15 * -Math.round(this.$d.getTimezoneOffset() / 15) + }, $.diff = function (t, f, h) { + let c; const d = g.p(f) + const $ = v(t) + const l = 6e4 * ($.utcOffset() - this.utcOffset()) + const y = this - $ + let M = g.m(this, $) + 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] = y / 36e5, c[n] = y / 6e4, c[e] = y / 1e3, c)[d] || y, h ? M : g.a(M) + }, $.daysInMonth = function () { + return this.endOf(u).$D + }, $.$locale = function () { + return M[this.$L] + }, $.locale = function (t, e) { + if (!t) return this.$L + const n = this.clone() + const r = D(t, e, !0) + return r && (n.$L = r), n + }, $.clone = function () { + return g.w(this.$d, this) + }, $.toDate = function () { + return new Date(this.valueOf()) + }, $.toJSON = function () { + return this.isValid() ? this.toISOString() : null + }, $.toISOString = function () { + return this.$d.toISOString() + }, $.toString = function () { + return this.$d.toUTCString() + }, d + }()) + const p = S.prototype + return v.prototype = p, [ + ['$ms', t], + ['$s', e], + ['$m', n], + ['$H', r], + ['$W', i], + ['$M', u], + ['$y', o], + ['$D', f] + ].forEach((t) => { + p[t[1]] = function (e) { + return this.$g(e, t[0], t[1]) + } + }), v.extend = function (t, e) { + return t.$i || (t(e, S, v), t.$i = !0), v + }, v.locale = D, v.isDayjs = m, v.unix = function (t) { + return v(1e3 * t) + }, v.en = M[y], v.Ls = M, v.p = {}, v +})) diff --git a/uni_modules/uview-ui/libs/util/emitter.js b/uni_modules/uview-ui/libs/util/emitter.js new file mode 100644 index 0000000..1e64044 --- /dev/null +++ b/uni_modules/uview-ui/libs/util/emitter.js @@ -0,0 +1,51 @@ +/** + * 递归使用 call 方式this指向 + * @param componentName // 需要找的组件的名称 + * @param eventName // 事件名称 + * @param params // 需要传递的参数 + */ +function broadcast(componentName, eventName, params) { + // 循环子节点找到名称一样的子节点 否则 递归 当前子节点 + this.$children.map((child) => { + if (componentName === child.$options.name) { + child.$emit.apply(child, [eventName].concat(params)) + } else { + broadcast.apply(child, [componentName, eventName].concat(params)) + } + }) +} +export default { + methods: { + /** + * 派发 (向上查找) (一个) + * @param componentName // 需要找的组件的名称 + * @param eventName // 事件名称 + * @param params // 需要传递的参数 + */ + dispatch(componentName, eventName, params) { + let parent = this.$parent || this.$root// $parent 找到最近的父节点 $root 根节点 + let { name } = parent.$options // 获取当前组件实例的name + // 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点 + // 循环出当前名称的一样的组件实例 + while (parent && (!name || name !== componentName)) { + parent = parent.$parent + if (parent) { + name = parent.$options.name + } + } + // 有节点表示当前找到了name一样的实例 + if (parent) { + parent.$emit.apply(parent, [eventName].concat(params)) + } + }, + /** + * 广播 (向下查找) (广播多个) + * @param componentName // 需要找的组件的名称 + * @param eventName // 事件名称 + * @param params // 需要传递的参数 + */ + broadcast(componentName, eventName, params) { + broadcast.call(this, componentName, eventName, params) + } + } +} diff --git a/uni_modules/uview-ui/libs/util/route.js b/uni_modules/uview-ui/libs/util/route.js new file mode 100644 index 0000000..70b8ca4 --- /dev/null +++ b/uni_modules/uview-ui/libs/util/route.js @@ -0,0 +1,124 @@ +/** + * 路由跳转方法,该方法相对于直接使用uni.xxx的好处是使用更加简单快捷 + * 并且带有路由拦截功能 + */ + +class Router { + constructor() { + // 原始属性定义 + this.config = { + type: 'navigateTo', + url: '', + delta: 1, // navigateBack页面后退时,回退的层数 + params: {}, // 传递的参数 + animationType: 'pop-in', // 窗口动画,只在APP有效 + animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效 + intercept: false // 是否需要拦截 + } + // 因为route方法是需要对外赋值给另外的对象使用,同时route内部有使用this,会导致route失去上下文 + // 这里在构造函数中进行this绑定 + this.route = this.route.bind(this) + } + + // 判断url前面是否有"/",如果没有则加上,否则无法跳转 + addRootPath(url) { + return url[0] === '/' ? url : `/${url}` + } + + // 整合路由参数 + mixinParam(url, params) { + url = url && this.addRootPath(url) + + // 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary" + // 如果有url中有get参数,转换后无需带上"?" + let query = '' + if (/.*\/.*\?.*=.*/.test(url)) { + // object对象转为get类型的参数 + query = uni.$u.queryParams(params, false) + // 因为已有get参数,所以后面拼接的参数需要带上"&"隔开 + return url += `&${query}` + } + // 直接拼接参数,因为此处url中没有后面的query参数,也就没有"?/&"之类的符号 + query = uni.$u.queryParams(params) + return url += query + } + + // 对外的方法名称 + async route(options = {}, params = {}) { + // 合并用户的配置和内部的默认配置 + let mergeConfig = {} + + if (typeof options === 'string') { + // 如果options为字符串,则为route(url, params)的形式 + mergeConfig.url = this.mixinParam(options, params) + mergeConfig.type = 'navigateTo' + } else { + mergeConfig = uni.$u.deepMerge(options, this.config) + // 否则正常使用mergeConfig中的url和params进行拼接 + mergeConfig.url = this.mixinParam(options.url, options.params) + } + + // 如果本次跳转的路径和本页面路径一致,不执行跳转,防止用户快速点击跳转按钮,造成多次跳转同一个页面的问题 + if (mergeConfig.url === uni.$u.page()) return + + if (params.intercept) { + this.config.intercept = params.intercept + } + // params参数也带给拦截器 + mergeConfig.params = params + // 合并内外部参数 + mergeConfig = uni.$u.deepMerge(this.config, mergeConfig) + // 判断用户是否定义了拦截器 + if (typeof uni.$u.routeIntercept === 'function') { + // 定一个promise,根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转 + const isNext = await new Promise((resolve, reject) => { + uni.$u.routeIntercept(mergeConfig, resolve) + }) + // 如果isNext为true,则执行路由跳转 + isNext && this.openPage(mergeConfig) + } else { + this.openPage(mergeConfig) + } + } + + // 执行路由跳转 + openPage(config) { + // 解构参数 + const { + url, + type, + delta, + animationType, + animationDuration + } = config + if (config.type == 'navigateTo' || config.type == 'to') { + uni.navigateTo({ + url, + animationType, + animationDuration + }) + } + if (config.type == 'redirectTo' || config.type == 'redirect') { + uni.redirectTo({ + url + }) + } + if (config.type == 'switchTab' || config.type == 'tab') { + uni.switchTab({ + url + }) + } + if (config.type == 'reLaunch' || config.type == 'launch') { + uni.reLaunch({ + url + }) + } + if (config.type == 'navigateBack' || config.type == 'back') { + uni.navigateBack({ + delta + }) + } + } +} + +export default (new Router()).route diff --git a/uni_modules/uview-ui/package.json b/uni_modules/uview-ui/package.json new file mode 100644 index 0000000..0472b31 --- /dev/null +++ b/uni_modules/uview-ui/package.json @@ -0,0 +1,84 @@ +{ + "id": "uview-ui", + "name": "uview-ui", + "displayName": "uView2.0重磅发布,利剑出鞘,一统江湖", + "version": "2.0.34", + "description": "uView UI已完美兼容nvue,全面的组件和便捷的工具会让您信手拈来,如鱼得水", + "keywords": [ + "uview", + "uview", + "ui", + "ui", + "uni-app", + "uni-app", + "ui" + ], + "repository": "https://github.com/umicro/uView2.0", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "1416956117" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/uview-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "n" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} diff --git a/uni_modules/uview-ui/theme.scss b/uni_modules/uview-ui/theme.scss new file mode 100644 index 0000000..39b311b --- /dev/null +++ b/uni_modules/uview-ui/theme.scss @@ -0,0 +1,44 @@ +// 此文件为uView的主题变量,这些变量目前只能通过uni.scss引入才有效,另外由于 +// uni.scss中引入的样式会同时混入到全局样式文件和单独每一个页面的样式中,造成微信程序包太大, +// 故uni.scss只建议放scss变量名相关样式,其他的样式可以通过main.js或者App.vue引入 + +$u-main-color: #303133; +$u-content-color: #606266; +$u-tips-color: #909193; +$u-light-color: #c0c4cc; +$u-border-color: #dadbde; +$u-bg-color: #f3f4f6; +$u-disabled-color: #c8c9cc; + +$u-primary: #2196F3; +$u-primary-dark: #398ade; +$u-primary-disabled: #9acafc; +$u-primary-light: #ecf5ff; + +$u-warning: #f9ae3d; +$u-warning-dark: #f1a532; +$u-warning-disabled: #f9d39b; +$u-warning-light: #fdf6ec; + +$u-success: #1FCC27; +$u-success-dark: #53c21d; +$u-success-disabled: #a9e08f; +$u-success-light: #f5fff0; + +$u-error: #f56c6c; +$u-error-dark: #e45656; +$u-error-disabled: #f7b2b2; +$u-error-light: #fef0f0; + +$u-info: #909399; +$u-info-dark: #767a82; +$u-info-disabled: #c4c6c9; +$u-info-light: #f4f4f5; + +// scss混入,为了少写几行#ifndef +@mixin flex($direction: row) { + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: $direction; +} diff --git a/utils/bc.js b/utils/bc.js new file mode 100644 index 0000000..da7e13d --- /dev/null +++ b/utils/bc.js @@ -0,0 +1,115 @@ +//除法函数,用来得到精确的除法结果 +//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 +//调用:div(arg1,arg2) +//返回值:arg1除以arg2的精确结果 +export function div(arg1, arg2) { + var t1 = 0, + t2 = 0, + r1, + r2; + try { + t1 = arg1.toString().split(".")[1].length; + } catch (e) { + t1 = 0; + } + try { + t2 = arg2.toString().split(".")[1].length; + } catch (e) { + t2 = 0; + } + r1 = Number(arg1.toString().replace(".", "")); + r2 = Number(arg2.toString().replace(".", "")); + return mul(r1 / r2, Math.pow(10, t2 - t1)); +} +//乘法函数,用来得到精确的乘法结果 +//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 +//调用:mul(arg1,arg2) +//返回值:arg1乘以arg2的精确结果 +export function mul(arg1, arg2) { + var m = 0, + s1 = arg1.toString(), + s2 = arg2.toString(); + try { + m += s1.split(".")[1].length; + } catch (e) { + m = 0; + } + try { + m += s2.split(".")[1].length; + } catch (e) { + m = m || 0; + } + return ( + (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) / + Math.pow(10, m) + ); +} + +//加法函数,用来得到精确的加法结果 +//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 +//调用:add(arg1,arg2) +//返回值:arg1加上arg2的精确结果 +export function add(arg1, arg2) { + var r1, r2, m, n; + try { + r1 = arg1.toString().split(".")[1].length; + } catch (e) { + r1 = 0; + } + try { + r2 = arg2.toString().split(".")[1].length; + } catch (e) { + r2 = 0; + } + m = Math.pow(10, Math.max(r1, r2)); + n = r1 >= r2 ? r1 : r2; + return ((arg1 * m + arg2 * m) / m).toFixed(n); +} + +//减法函数,用来得到精确的减法结果 +//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。 +//调用:sub(arg1,arg2) +//返回值:arg1减去arg2的精确结果 +export function sub(arg1, arg2) { + var r1, r2, m, n; + try { + r1 = arg1.toString().split(".")[1].length; + } catch (e) { + r1 = 0; + } + try { + r2 = arg2.toString().split(".")[1].length; + } catch (e) { + r2 = 0; + } + m = Math.pow(10, Math.max(r1, r2)); + //动态控制精度长度 + n = r1 >= r2 ? r1 : r2; + return ((arg1 * m - arg2 * m) / m).toFixed(n); +} + +function Compute(value) { + this.value = value; +} +Object.assign(Compute.prototype, { + add(v) { + this.value = add(this.value, v); + return this; + }, + sub(v) { + this.value = sub(this.value, v); + return this; + }, + div(v) { + this.value = div(this.value, v); + return this; + }, + mul(v) { + this.value = mul(this.value, v); + return this; + } +}); + +export default function(value) { + return new Compute(value); +} diff --git a/utils/common.js b/utils/common.js new file mode 100644 index 0000000..081b0e3 --- /dev/null +++ b/utils/common.js @@ -0,0 +1,23 @@ +import config from '@/utils/mapConfig'; + +module.exports = { + getLocation() { + return uni.getLocation({ + type: 'wgs84' + }) + }, + + getCurAddress(latitude, longitude) { + return uni.request({ + url: 'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude + + '&key=' + config.key + }); + }, + + getUrlParam(url, name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = url.match(reg); + if (r != null) return (r[2]); + return null; + } +} diff --git a/utils/dialog.js b/utils/dialog.js new file mode 100644 index 0000000..732c0bc --- /dev/null +++ b/utils/dialog.js @@ -0,0 +1,92 @@ +const dialog = { + confirm: (options) => { + uni.showModal({ + title: '提示', + content: options.mes, + success(res) { + if (res.confirm) { + opts() + } else if (res.cancel) {} + } + }) + }, + alert: null, + // alert: Dialog.alert, + notify: null, + // notify, + loading: { + open: () => { + uni.showLoading({ + title: '加载中' + }) + }, + close: () => { + uni.hideLoading() + } + } +}; + +// const icons = { error: "操作失败", success: "操作成功" }; +// Object.keys(icons).reduce((dialog, key) => { +// dialog[key] = (mes, obj = {}) => { +// return new Promise(function (resolve) { +// toast({ +// mes: mes || icons[key], +// timeout: 1000, +// icon: key, +// callback: () => { +// resolve(); +// }, +// ...obj +// }); +// }); +// }; +// return dialog; +// }, dialog); + +dialog.message = (mes = "操作失败", obj = {}) => { + return new Promise(function(resolve) { + uni.showToast({ + title: mes, + icon: "none", + duration: 2000, + complete: () => { + resolve(); + } + }); + }); +}; + +dialog.toast = (options) => { + uni.showToast({ + title: options.mes, + icon: "none", + duration: 2000, + complete: () => { + options.callback ? options.callback() : null + } + }); +}; + +dialog.error = (mes) => { + uni.showToast({ + title: mes, + icon: "none", + duration: 2000 + }); +}; + +dialog.validateError = (...args) => { + validatorDefaultCatch(...args); +}; + +export function validatorDefaultCatch(err, type = "message") { + uni.showToast({ + title: err.errors[0].message, + icon: 'none', + duration: 2000 + }) + return false +} + +export default dialog; diff --git a/utils/index.js b/utils/index.js new file mode 100644 index 0000000..6938a38 --- /dev/null +++ b/utils/index.js @@ -0,0 +1,1115 @@ +import Vue from 'vue' +// import MpvueRouterPatch from 'mpvue-router-patch' +// Vue.use(MpvueRouterPatch) +import {getUserInfo, wxappAuth, wxappCheckAuth} from "@/api/user"; +import store from "../store"; +import dayjs from "dayjs"; +import cookie from "@/utils/store/cookie"; +import stringify from "@/utils/querystring"; +import {VUE_APP_API_URL} from "@/config"; +import {auth} from '@/libs/wechat' + +export function dataFormat(time, option) { + time = +time * 1000; + const d = new Date(time); + const now = new Date().getTime(); + + const diff = (now - d) / 1000; + if (diff < 30) { + return "刚刚"; + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + "分钟前"; + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + "小时前"; + } else if (diff < 3600 * 24 * 2) { + return "1天前"; + } + if (option) { + // return parseTime(time, option); + } else { + let timeStr = d.getFullYear() + "年" + (d.getMonth() + 1) + "月" + d.getDate() + "日" + d.getHours() + "时" + d + .getMinutes() + + "分" + return timeStr + } +} + +export function dateFormatT(time) { + time = +time * 1000; + const d = new Date(time); + + return ( + d.getFullYear() + + "/" + + (d.getMonth() + parseInt(1)) + + "/" + + d.getDate() + ); + +} + + +/* + *格式化时间 + * @param time {Number} 时间戳(毫秒) + * @param format {String} 格式(例:yyyy-MM-dd) + */ + +export function formatDateTime(time, format) { + var t = new Date(time); + var tf = function (i) { + return (i < 10 ? "0" : "") + i; + }; + return format.replace(/yyyy|MM|dd|HH|mm|ss/g, function (a) { + switch (a) { + case "yyyy": + return tf(t.getFullYear()); + break; + case "MM": + return tf(t.getMonth() + 1); + break; + case "mm": + return tf(t.getMinutes()); + break; + case "dd": + return tf(t.getDate()); + break; + case "HH": + return tf(t.getHours()); + break; + case "ss": + return tf(t.getSeconds()); + break; + } + }); +} + +export function diffDay(start, end) { + var dateBegin = new Date(start.replace(/-/g, "/")); + var dateEnd = new Date(end.replace(/-/g, "/")); + var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数 + return Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数 +} + +export function trim(str) { + return String.prototype.trim.call(str); +} + +export function isType(arg, type) { + return Object.prototype.toString.call(arg) === "[object " + type + "]"; +} + +export function isWeixin() { + return false +} + +export function isNullOrEmpty(value) { + //是否为空 + return value === null || value === "" || value === undefined ? true : false; +} + +export function parseQuery() { + var pages = getCurrentPages() //获取加载的页面 + var currentPage = pages[pages.length - 1] //获取当前页面的对象 + var url = currentPage.route //当前页面url + var options = currentPage.options //如果要获取url中所带的参数可以查看options + return options +} + +/*获取当前页url*/ +export function getCurrentPageUrl() { + var pages = getCurrentPages() //获取加载的页面 + var currentPage = pages[pages.length - 1] //获取当前页面的对象 + var url = currentPage.route //当前页面url + return url +} + +/*获取当前页带参数的url*/ +export function getCurrentPageUrlWithArgs() { + var pages = getCurrentPages() //获取加载的页面 + var currentPage = pages[pages.length - 1] //获取当前页面的对象 + var url = currentPage.route //当前页面url + var options = currentPage.options //如果要获取url中所带的参数可以查看options + + //拼接url的参数 + var urlWithArgs = url + '?' + for (var key in options) { + var value = options[key] + urlWithArgs += key + '=' + value + '&' + } + urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1) + + return urlWithArgs +} + +// 复制到剪切板 +export const copyClipboard = (data) => { + uni.setClipboardData({ + data: data, + success: (res) => { + uni.showToast({ + title: '复制成功', + icon: 'success', + duration: 2000 + }) + } + }) +} + +export const getProvider = (service) => { + return new Promise((resolve, reject) => { + // 获取当前环境的服务商 + uni.getProvider({ + service: service || 'oauth', + success: function (res) { + // 此处可以排除h5 + if (res.provider) { + resolve(res.provider[0]) + } + }, + fail() { + reject('获取环境服务商失败') + } + }) + }).catch(error => { + + }) + +} + +export const authorize = (authorizeStr) => { + return new Promise((resolve, reject) => { + uni.getSetting({ + success(res) { + if (res.authSetting[`scope.${authorizeStr}`]) { + resolve(true) + } else { + reject(false) + } + }, + fail() { + reject(false) + } + }) + + }) +} + +export const checkAuth = () => { + return new Promise((resolve, reject) => { + getProvider() + .then(provider => { + if (!provider) { + reject(false) + } + // 调用登录接口 + uni.login({ + provider: provider, + success: function (loginRes) { + // 微信登录 + let code = loginRes.code + wxappCheckAuth({ + code: code, + }) + .then(authRes => { + var data = authRes.data; + if (data != null) { + var userInfo = { + "nickName": data.wxProfile.nickname, + "gender": data.wxProfile.sex, + "language": data.wxProfile.language, + "city": data.wxProfile.city, + "province": data.wxProfile.province, + "country": data.wxProfile.country, + "avatarUrl": data.wxProfile.headimgurl + }; + + resolve(userInfo); + //reject(false); + } else { + reject(false); + } + }) + .catch(error => { + reject(false); + }); + + }, + fail() { + reject(false) + }, + }) + }) + .catch(error => { + reject(false) + }) + + }) +} + +export const login = loginInfo => { + return new Promise((resolve, reject) => { + if (Vue.prototype.$deviceType == 'weixin') { + // 微信授权登录 + const { + code + } = parseQuery() + if (code) { + auth(code) + .then(() => { + let redirect = cookie.get('redirect').replace(/\ /g, '') + if (redirect) { + redirect = redirect.split('/pages')[1] + if (!redirect) { + redirect = '/Loading/index' + } + reLaunch({ + path: '/pages' + redirect, + }) + cookie.remove('redirect') + } else { + reLaunch({ + path: '/pages/home/index', + }) + } + }) + .catch(() => { + reject('当前运行环境为微信浏览器') + reLaunch({ + path: '/pages/home/index', + }) + }) + } else { + } + return + } + if (Vue.prototype.$deviceType == 'weixinh5') { + reject('当前运行环境为H5') + return + } + if (Vue.prototype.$deviceType == 'app') { + reject('当前运行环境为app') + return + } + getProvider() + .then(provider => { + if (!provider) { + reject() + } + // 调用登录接口 + uni.login({ + provider: provider, + success: async function (loginRes) { + // 微信登录 + let code = loginRes.code + cookie.set('wxLoginCode', loginRes.code) + + if (!uni.getUserProfile) { + reject('用户未授权') + return + } + + + if (uni.getUserProfile) { + if (loginInfo) { + wxappAuth({ + encryptedData: loginInfo.encryptedData, + iv: loginInfo.iv, + userInfo: loginInfo.userInfo, + code: code, + spread: cookie.get('spread'), + }) + .then(({ + data + }) => { + console.log("wxappAuth 326") + uni.hideLoading() + store.commit('login', data.token, dayjs(data.expires_time)) + store.dispatch('userInfo', true) + getUserInfo() + .then(user => { + uni.setStorageSync('uid', user.data.uid) + store.dispatch('setUserInfo', user.data) + resolve(user) + }) + .catch(error => { + reject('获取用户信息失败') + }) + }) + .catch(error => { + reject('登录接口调用失败') + }) + } else { + reject('用户未授权') + return + } + } else { + uni.getUserInfo({ + provider: provider, + success: function (user) { + wxappAuth({ + encryptedData: user.encryptedData, + iv: user.iv, + code: code, + spread: cookie.get('spread'), + }) + .then(({ + data + }) => { + console.log("wxappAuth 360") + uni.hideLoading() + store.commit('login', data.token, dayjs(data.expires_time)) + store.dispatch('userInfo', true) + getUserInfo() + .then(user => { + uni.setStorageSync('uid', user.data.uid) + store.dispatch('setUserInfo', user.data) + resolve(user) + }) + .catch(error => { + reject('获取用户信息失败') + }) + }) + .catch(error => { + reject('登录接口调用失败') + }) + }, + fail() { + reject('获取用户信息失败') + }, + }) + } + }, + fail() { + reject('调用登录接口失败') + }, + }) + }) + .catch(error => { + reject('获取环境服务商失败') + }) + }) +} + +export const handleGetUserInfo = () => { + getUserInfo().then(res => { + store.dispatch('setUserInfo', res.data) + var pages = getCurrentPages() //获取加载的页面 + + var currentPage = pages[pages.length - 1] //获取当前页面的对象 + let url = "/pages/home/index" + let query = {} + if (currentPage) { + const { + redirect, + ...querys + } = currentPage.options + // 获取到最后一个页面 + if ( + currentPage.route != 'pages/Loading/index' && + currentPage.route != 'pages/user/Login/index' + ) { + url = currentPage.route + query = { + ...querys + } + } + if (currentPage.route == 'pages/authorization/index') { + + url = redirect + query = { + ...querys + } + } + + } + + if (url == '/pages/home/index' || url == '/pages/shop/GoodsClass/index' || url == + '/pages/shop/ShoppingCart/index' || url == '/pages/user/User/index') { + switchTab({ + path: `${url}`, + query + }); + } else { + // 为了防止返回上一页是授权页面,先重定向到首页,再跳转 + reLaunch({ + path: '/pages/home/index', + // query + }); + + setTimeout(() => { + if (url.indexOf('/') == 0) { + url = url.slice(1) + } + push({ + path: `/${url}`, + query + }) + }) + + // push({ + // path: `${url}`, + // query + // }) + } + }) +} + +export function parseUrl(location) { + if (typeof location === 'string') return location + const { + path, + query + } = location + + const queryStr = stringify(query) + + if (!queryStr) { + return path + } + + return `${path}?${queryStr}` +} + +export function parseRoute($mp) { + const _$mp = $mp || {} + const path = _$mp.page && _$mp.page.route + return { + path: `/${path}`, + params: {}, + query: _$mp.query || _$mp.page.options, + hash: '', + fullPath: parseUrl({ + path: `/${path}`, + query: _$mp.query || _$mp.page.options + }), + name: path && path.replace(/\/(\w)/g, ($0, $1) => $1.toUpperCase()) + } +} + +export function handleAuth() { + /** + * 如何判断权限? + * 用户如果登录了系统,会留下两个东西,一个是token,一个是userInfo + * token存在会过期的问题,如果长时间没有打开小程序,会导致登录失效,出现打开一个页面瞬间跳转到授权页面的问题 + * 解决办法,保存token的时候加上过期时间,每次请求都取一下缓存里的token + * userInfo只是用来限时用户信息,作用并不是很大 + * ps:只需要判断 token 是否存在即可 + */ + if (cookie.get('login_status')) { + return true + } + return false +} + + +export const handleLoginStatus = (location, complete, fail, success) => { + // 不登录可访问的页面 + let page = [{ + path: '/pages/Loading/index', + name: 'loading页面' + }, + { + path: '/pages/home/index', + name: '首页' + }, + { + path: '/pages/user/Login/index', + name: '登录页面' + }, + { + path: '/pages/authorization/index', + name: '授权页面' + }, + { + path: '/pagesInn/inn/innHome', + name: '店铺首页' + } + ] + + // 是否可以访问 + let isAuth = false + + // 从 location 中获取当前url,location typeof string || object + let path = '' + if (typeof location === 'string') { + path = location + } else { + path = location.path + } + + // 判断用户是否有token + if (!handleAuth()) { + page.map((item) => { + if (item.path == path) { + isAuth = true + } + }) + } else { + isAuth = true + } + + return new Promise((resolve, reject) => { + resolve({ + url: parseUrl(location), + complete, + fail, + success, + }) + // if (isAuth) { + // // 有token + // if (path == '/pages/home/index' || path == '/pages/shop/GoodsClass/index' || path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') { + // // switchTab({ + // // path: parseUrl(location), + // // }) + // // return + // } + + // resolve({ + // url: parseUrl(location), + // complete, + // fail, + // success + // }) + // } else { + // // 没有token,先校验用户是否授权,如果授权了,进行自动登录 + // routerPermissions(parseUrl(location)) + // reject() + // } + }).catch(error => { + }) +} + +// export function checkPermissions(){ + +// } + +export async function routerPermissions(url, type) { + let path = url + if (!path) { + path = '/' + getCurrentPageUrlWithArgs() + } + if (Vue.prototype.$deviceType == 'routine') { + // 如果是微信小程序,跳转到授权页 + // 先校验用户是否授权,如果授权了,进行自动登录 + //authorize('userInfo')因为小程序登录和授权接口的修改基本废了 + //所以这里不能再用它来判断用户是否同意过授权,要么就是用uni.login获取到code去调用服务器 + //接口,看用户是否授权过用户信息,如果有直接返回;如果没有,才跳转到授权页进行授权弹窗获取 + //这里的逻辑要改一下 + + //检查授权信息 + let authUserInfo = await checkAuth().catch(err => { + }); + + if (authUserInfo) { + var loginInfo = { + userInfo: authUserInfo, + iv: '', + encryptedData: '' + } + // 自动登录 + login(loginInfo).then(res => { + // 登录成功,跳转到需要跳转的页面 + store.commit("updateAuthorizationPage", false); + if (path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') { + return + } + if (type == 'reLaunch') { + reLaunch({ + path, + + }) + return + } + if (type == 'replace') { + replace({ + path, + }) + return + } + { + push({ + path, + }) + } + }).catch(error => { + uni.showToast({ + title: error, + icon: "none", + duration: 2000 + }); + reLaunch({ + path: '/pages/authorization/index', + }) + cookie.set('redirect', path) + }) + } else { + // 跳转到登录页面或者授权页面 + if (path == '/pages/shop/ShoppingCart/index' || path == '/pages/user/User/index') { + switchTab({ + path, + }) + store.commit("updateAuthorizationPage", false); + return + } + reLaunch({ + path: '/pages/authorization/index', + }) + cookie.set('redirect', path) + } + + } else { + // 如果不是小程序跳转到登录页 + push({ + path: '/pages/user/Login/index', + }) + cookie.set('redirect', path) + } + +} + +export function push(location, complete, fail, success) { + handleLoginStatus(location, complete, fail, success).then(params => { + uni.navigateTo(params) + }).catch(error => { + // 没有权限 + + }) +} + +export function replace(location, complete, fail, success) { + handleLoginStatus(location, complete, fail, success).then(params => { + uni.redirectTo(params) + }).catch(error => { + // 没有权限 + + }) +} + +export function reLaunch(location, complete, fail, success) { + handleLoginStatus(location, complete, fail, success).then(params => { + uni.reLaunch(params) + }).catch(error => { + // 没有权限 + + }) +} + +export function go(delta) { + uni.navigateBack({ + delta + }) +} + +export function back() { + uni.navigateBack({ + delta: 1, + success: function (e) { + }, + fail: function (e) { + } + }) +} + +export function switchTab(location, complete, fail, success) { + handleLoginStatus(location, complete, fail, success).then(params => { + uni.switchTab(params) + }).catch(error => { + // 没有权限 + }) +} + + +export const _router = { + mode: 'history', + switchTab, + push, + replace, + go, + back, + reLaunch +} + + +export function handleQrCode() { + try { + var urlSpread = parseQuery()["q"]; + if (urlSpread) { + if (urlSpread.indexOf('%3F') != -1) { + // 通过海报二维码进来 + urlSpread = urlSpread + .split("%3F")[1] + .replace(/%3D/g, ":") + .replace(/%26/g, ",") + .split(",") + .map((item, index) => { + item = item.split(":"); + return `"${item[0]}":"${item[1]}"`; + }) + .join(","); + urlSpread = JSON.parse("{" + urlSpread + "}"); + return urlSpread + } else { + return handleUrlParam(urlSpread) + } + } + return null + } catch { + return null + } + +} + +export function handleUrlParam(path) { + var url = path.split('?')[1] //获取url中"?"符后的字串 + var theRequest = new Object() + if (path.includes('?')) { + var url = path.split('?')[1] //获取url中"?"符后的字串 + let strs = url.split('&') + for (var i = 0; i < strs.length; i++) { + theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1]) + } + } + return theRequest +} + +const getImageInfo = (images) => { + return new Promise((resolve, reject) => { + let imageAry = {} + images.map((item, index) => { + uni.getImageInfo({ + src: item, + fail: function (res) { + imageAry[index] = null + if (imageAry.length == images.length) { + resolve(imageAry) + } + }, + success: function (res) { + imageAry[index] = res + if (Object.keys(imageAry).length == images.length) { + resolve(imageAry) + } + } + }) + }) + }) +} + + +/** + * 获取分享海报 + * @param array store 海报素材 + * @param string store_name 素材文字 + * @param string price 价格 + * @param function successFn 回调函数 + * + * + */ +export const PosterCanvas = (store, successCallBack) => { + uni.showLoading({ + title: '海报生成中', + mask: true + }); + getImageInfo([store.image, store.code]).then(res => { + let contentHh = 48 * 1.3 + const ctx = uni.createCanvasContext('myCanvas') + ctx.clearRect(0, 0, 0, 0); + const WIDTH = 747 + const HEIGHT = 1326; + ctx.fillStyle = "#FFFFFF"; + ctx.fillRect(0, 0, WIDTH, HEIGHT); + ctx.drawImage(res[0].path, 0, 0, WIDTH, WIDTH); + ctx.drawImage(res[1].path, 40, 1064, 200, 200); + ctx.save(); + let r = 90; + let d = r * 2; + let cx = 40; + let cy = 990; + ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI); + ctx.clip(); + ctx.restore(); + ctx.setTextAlign('center'); + ctx.setFontSize(48); + ctx.setFillStyle('#000'); + ctx.fillText(store.title, WIDTH / 2, 810 + contentHh); + ctx.setTextAlign('center') + ctx.setFontSize(32); + ctx.setFillStyle('red'); + ctx.fillText('¥' + store.price, WIDTH / 2, 985); + ctx.setTextAlign('center') + ctx.setFontSize(22); + ctx.setFillStyle('#333333'); + ctx.fillText('长按识别二维码立即购买', WIDTH / 2, 1167); + ctx.save(); + ctx.draw(true, () => { + uni.canvasToTempFilePath({ + canvasId: 'myCanvas', + fileType: 'png', + destWidth: WIDTH, + destHeight: HEIGHT, + success: function (res) { + uni.hideLoading(); + successCallBack && successCallBack(res.tempFilePath); + }, + fail: function (error) { + + }, + + }) + }); + + }) + + // uni.getImageInfo({ + // src: store.image, + // fail: function (res) { + // uni.showToast({ + // title: '海报生成失败', + // icon: "none", + // duration: 2000 + // }); + // }, + // success: function (res) { + + // } + // }) +} + + +export const handleLoginFailure = () => { + + store.commit("logout"); + store.commit("updateAuthorization", false); + let currentPageUrl = getCurrentPageUrl() + // token 失效 + // 判断当前是不是已经在登录页面或者授权页,防止二次跳转 + if (store.getters.isAuthorizationPage || getCurrentPageUrl() == '/pages/user/Login/index') { + return + } + store.commit("updateAuthorizationPage", true); + + let path = '/' + getCurrentPageUrlWithArgs() + + let qrCode = handleQrCode() + + if (qrCode) { + // 当前是通过海报扫描进入的 + + // 判断是不是拼团进来的 + if (currentPageUrl == 'pages/activity/GroupRule/index') { + if (qrCode.pinkId) { + path = parseUrl({ + path: `/${currentPageUrl}`, + query: { + id: qrCode.pinkId, + }, + }) + if (qrCode.spread) { + cookie.set('spread', qrCode.spread || 0) + } + } else { + handleNoParameters() + } + } + + // 判断是不是扫描的砍价海报进来的 + if (currentPageUrl == 'pages/activity/DargainDetails/index') { + + if (qrCode.bargainId) { + path = parseUrl({ + path: `/${currentPageUrl}`, + query: { + id: qrCode.bargainId, + partake: qrCode.uid, + }, + }) + if (qrCode.spread) { + cookie.set('spread', qrCode.spread || 0) + } + } else { + handleNoParameters() + } + } + + if (currentPageUrl == 'pages/shop/GoodsCon/index') { + + if (qrCode.productId) { + path = parseUrl({ + path: `/${currentPageUrl}`, + query: { + id: qrCode.productId, + }, + }) + if (qrCode.spread) { + cookie.set('spread', qrCode.spread || 0) + } + } else { + handleNoParameters() + } + } + } + + routerPermissions(path, 'reLaunch') +} + +const handleNoParameters = () => { + uni.showToast({ + title: '未获取到必要参数,即将跳转首页', + icon: 'success', + duration: 2000 + }) + setTimeout(() => { + clearTimeout() + switchTab({ + path: '/pages/home/index', + }); + }, 1500) +} + + +export function chooseImage(callback) { + uni.chooseImage({ + count: 1, + //sourceType: ["album"], + success: res => { + uni.getImageInfo({ + src: res.tempFilePaths[0], + success: image => { + uni.showLoading({ + title: "图片上传中", + mask: true + }); + uni.uploadFile({ + url: `${VUE_APP_API_URL}/api/upload`, + file: image, + filePath: image.path, + header: { + Authorization: "Bearer " + store.getters.token + }, + name: "file", + success: res => { + if (callback) { + callback(JSON.parse(res.data).link) + } + }, + fail: err => { + uni.showToast({ + title: "上传图片失败" + err, + icon: "none", + duration: 2000 + }); + }, + complete: res => { + uni.hideLoading() + } + }); + }, + fail: err => { + uni.showToast({ + title: "获取图片信息失败", + icon: "none", + duration: 2000 + }); + } + }); + } + }); +} + +export function moreImage(count, callback) { + uni.chooseImage({ + count, + success: res => { + let total = res.tempFilePaths.length; + for (let i = 0; i < res.tempFilePaths.length; i++) { + uni.getImageInfo({ + src: res.tempFilePaths[i], + success: image => { + uni.showLoading({ + title: "图片上传中", + mask: true + }); + uni.uploadFile({ + url: `${VUE_APP_API_URL}/api/upload`, + file: image, + filePath: image.path, + header: { + Authorization: "Bearer " + store.getters.token + }, + name: "file", + success: res => { + if (callback) { + callback(JSON.parse(res.data).link, total) + } + }, + fail: err => { + uni.showToast({ + title: "上传图片失败" + err, + icon: "none", + duration: 2000 + }); + }, + complete: () => { + if (i + 1 === total) { + uni.hideLoading(); + } + } + }); + }, + fail: () => { + uni.showToast({ + title: "获取图片信息失败", + icon: "none", + duration: 2000 + }); + } + }) + } + } + }); +} + +export function uploadImage(imgPath, callback) { + uni.getImageInfo({ + src: imgPath, + success: image => { + uni.showLoading({ + title: "图片上传中", + mask: true + }); + uni.uploadFile({ + url: `${VUE_APP_API_URL}/api/upload`, + file: image, + filePath: image.path, + header: { + Authorization: "Bearer " + store.getters.token + }, + name: "file", + success: res => { + if (callback) { + callback(JSON.parse(res.data).link) + } + }, + fail: err => { + uni.showToast({ + title: "上传图片失败" + err, + icon: "none", + duration: 2000 + }); + }, + complete: res => { + uni.hideLoading() + } + }); + }, + fail: err => { + uni.showToast({ + title: "获取图片信息失败", + icon: "none", + duration: 2000 + }); + } + }); +} diff --git a/utils/mapConfig.js b/utils/mapConfig.js new file mode 100644 index 0000000..5a5be44 --- /dev/null +++ b/utils/mapConfig.js @@ -0,0 +1,7 @@ +// 应写入腾讯地图的key +module.exports = { + + //key: 'LBZBZ-XAJRO-HKYWF-SOACS-HSTYQ-ZUF44' + key: 'J2WBZ-WS366-SL2SI-M35IG-IU7OH-4YFKF' + +}; diff --git a/utils/querystring.js b/utils/querystring.js new file mode 100644 index 0000000..bbc4bc8 --- /dev/null +++ b/utils/querystring.js @@ -0,0 +1,63 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var stringifyPrimitive = function (v) { + switch (typeof v) { + case 'string': + return v + + case 'boolean': + return v ? 'true' : 'false' + + case 'number': + return isFinite(v) ? v : '' + + default: + return '' + } +} + +function stringify(obj, sep, eq, name) { + sep = sep || '&' + eq = eq || '=' + if (obj === null) { + obj = undefined + } + + if (typeof obj === 'object') { + return Object.keys(obj).map(function (k) { + var ks = stringifyPrimitive(k) + eq + if (Array.isArray(obj[k])) { + return obj[k].map(function (v) { + return ks + stringifyPrimitive(v) + }).join(sep) + } else { + return ks + stringifyPrimitive(obj[k]) + } + }).filter(Boolean).join(sep) + + } + + if (!name) return '' + return stringifyPrimitive(name) + eq + stringifyPrimitive(obj) +} + +export default stringify diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 0000000..5dd88d3 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,112 @@ +import Fly from "flyio/dist/npm/wx"; +import { handleLoginFailure } from "@/utils"; +import { VUE_APP_API_URL } from "@/config"; +import cookie from "@/utils/store/cookie"; + +const fly = new Fly() +fly.config.baseURL = VUE_APP_API_URL + +fly.interceptors.response.use( + response => { + // 定时刷新access-token + return response; + }, + error => { + if (error.toString() == 'Error: Network Error') { + console.log('————————') + console.log('发送请求失败', error) + console.log('————————') + handleLoginFailure(); + return Promise.reject({ msg: "未登录", toLogin: true }); + } + if (error.status == 401) { + console.log('————————') + console.log('登录失效 401', error) + console.log('————————') + handleLoginFailure(); + return Promise.reject({ msg: "未登录", toLogin: true }); + } + return Promise.reject(error); + } +); + +const defaultOpt = { login: true }; + +function baseRequest(options) { + + // 从缓存中获取 token 防止 token 失效后还会继续请求的情况 + const token = cookie.get('login_status'); + + // 合并传参过来的 headers + // 如果接口需要登录,携带 token 去请求 + options.headers = { + ...options.headers, + Authorization: "Bearer " + token + } + + // 如果需要登录才可访问的接口没有拿到 token 视为登录失效 + if (options.login === true && !token) { + // 跳转到登录或授权页面 + handleLoginFailure(); + // 提示错误信息 + return Promise.reject({ msg: "未登录", toLogin: true }); + } + // 结构请求需要的参数 + const { url, params, data, login, ...option } = options + + // 发起请求 + return fly.request(url, params || data, { + ...option + }).then(res => { + const data = res.data || {}; + if (res.status !== 200) { + return Promise.reject({ msg: "请求失败", res, data }); + } + if ([401, 403].indexOf(data.status) !== -1) { + handleLoginFailure(); + return Promise.reject({ msg: res.data.msg, res, data, toLogin: true }); + } else if (data.status === 200) { + return Promise.resolve(data, res); + } else { + return Promise.reject({ msg: res.data.msg, res, data }); + } + }); +} + +/** + * http 请求基础类 + * 参考文档 https://www.kancloud.cn/yunye/axios/234845 + * + */ +const request = ["post", "put", "patch"].reduce((request, method) => { + /** + * + * @param url string 接口地址 + * @param data object get参数 + * @param options object axios 配置项 + * @returns {AxiosPromise} + */ + request[method] = (url, data = {}, options = {}) => { + return baseRequest( + Object.assign({ url, data, method }, defaultOpt, options) + ); + }; + return request; +}, {}); + +["get", "delete", "head"].forEach(method => { + /** + * + * @param url string 接口地址 + * @param params object get参数 + * @param options object axios 配置项 + * @returns {AxiosPromise} + */ + request[method] = (url, params = {}, options = {}) => { + return baseRequest( + Object.assign({ url, params, method }, defaultOpt, options) + ); + }; +}); + +export default request; diff --git a/utils/store/cookie.js b/utils/store/cookie.js new file mode 100644 index 0000000..4eeb230 --- /dev/null +++ b/utils/store/cookie.js @@ -0,0 +1,62 @@ +import { trim, isType } from "@/utils"; + +const doc = null; +// const doc = window.document; + +function get(key) { + if (!key || !_has(key)) { + return null; + } + return uni.getStorageSync(key) +} + +function all() { + return uni.getStorageInfoSync() +} + +function set(key, data, time) { + if (!key) { + return; + } + uni.setStorageSync(key, data) +} + +function remove(key) { + if (!key || !_has(key)) { + return; + } + uni.removeStorageSync(key) +} + +function clearAll() { + // uni.clearStorage() + const res = uni.getStorageInfoSync(); + res.keys.map((item) => { + //不要清除spread和redirect + if (item == 'redirect' || item == 'spread') { + return + } + remove(item) + }) + console.log(res) +} + +function _has(key) { + if (!key) { + return + } + let value = uni.getStorageSync(key) + if (value) { + return true + } + return false +} + +export default { + get, + all, + set, + remove, + clearAll, + has: _has +}; diff --git a/utils/store/index.js b/utils/store/index.js new file mode 100644 index 0000000..4f7c7a7 --- /dev/null +++ b/utils/store/index.js @@ -0,0 +1,7 @@ +import cookie from "./cookie"; +import localStorage from "./localStorage"; + +export default { + cookie, + localStorage +}; diff --git a/utils/store/localStorage.js b/utils/store/localStorage.js new file mode 100644 index 0000000..4076cee --- /dev/null +++ b/utils/store/localStorage.js @@ -0,0 +1,42 @@ +function localStorage() { + return window.localStorage; +} + +function get(key) { + return JSON.parse(localStorage().getItem(key)); +} + +function set(key, data) { + return localStorage().setItem(key, JSON.stringify(data)); +} + +function all() { + const data = {}; + for (var i = localStorage().length - 1; i >= 0; i--) { + var key = localStorage().key(i); + data[key] = get(key); + } + + return data; +} + +function remove(key) { + return localStorage().removeItem(key); +} + +function clearAll() { + return localStorage().clear(); +} + +function has(key) { + return localStorage().getItem(key) !== null; +} + +export default { + get, + set, + all, + remove, + clearAll, + has +}; diff --git a/utils/validate.js b/utils/validate.js new file mode 100644 index 0000000..37fbed0 --- /dev/null +++ b/utils/validate.js @@ -0,0 +1,177 @@ +const bindMessage = (fn, message) => { + fn.message = field => message.replace("%s", field || ""); +}; + +export function required(message, opt = {}) { + return { + required: true, + message, + type: "string", + ...opt + }; +} + +bindMessage(required, "请输入%s"); + +export function url(message, opt = {}) { + return { + type: "url", + message, + ...opt + }; +} + +bindMessage(url, "请输入正确的链接"); + +export function email(message, opt = {}) { + return { + type: "email", + message, + ...opt + }; +} + +bindMessage(email, "请输入正确的邮箱地址"); + +/** + * 验证字段必须完全由字母构成。 + * + * @param message + * @returns {*} + */ +export function alpha(message) { + return attrs.pattern(/^[\w]+$/, message); +} + +bindMessage(alpha, "%s必须是字母"); + +/** + * 只能包含由字母、数字,以及 - 和 _ + * + * @param message + * @returns {*} + */ +export function alpha_dash(message) { + return attrs.pattern(/^[\w\d_-]+$/, message); +} + +bindMessage(alpha_dash, "%s只能包含由字母、数字,以及 - 和 _"); + +/** + * 必须是完全是字母、数字 + * + * @param message + * @returns {*} + */ +export function alpha_num(message) { + return attrs.pattern(/^[\w\d]+$/, message); +} + +bindMessage(alpha_num, "%s只能包含字母、数字"); +/** + * 正确的金额 + * + * @param message + * @returns {*} + */ +export function num(message) { + return attrs.pattern( + /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/, + message + ); +} + +bindMessage(num, "%s格式不正确"); + +/** + * 只能是汉字 + * @param message + * @returns {*} + */ +export function chs(message) { + return attrs.pattern(/^[\u4e00-\u9fa5]+$/, message); +} + +bindMessage(chs, "%s只能是汉字"); + +/** + * 只能包含汉字、字母 + * @param message + * @returns {*} + */ +export function chs_alpha(message) { + return attrs.pattern(/^[\u4e00-\u9fa5\w]+$/, message); +} + +bindMessage(chs_alpha, "%s只能包含汉字、字母"); + +/** + * 只能包含汉字、字母和数字 + * @param message + * @returns {*} + */ +export function chs_alpha_num(message) { + return attrs.pattern(/^[\u4e00-\u9fa5\w\d]+$/, message); +} + +bindMessage(chs_alpha_num, "%s只能包含汉字、字母和数字"); + +/** + * 只能包含由汉字、字母、数字,以及 - 和 _ + * @param message + * @returns {*} + */ +export function chs_dash(message) { + return attrs.pattern(/^[\u4e00-\u9fa5\w\d-_]+$/, message); +} + +bindMessage(chs_dash, "%s只能包含由汉字、字母、数字,以及 - 和 _"); + +/** + * 手机号验证 + * @param message + * @returns {*} + */ +export function chs_phone(message) { + return attrs.pattern(/^1(3|4|5|7|8|9|6)\d{9}$/i, message); +} +bindMessage(chs_phone, "请输入正确的手机号码"); + +/** + * 手机号与座机号验证 + * @param message + * @returns {*} + */ +export function chs_extphone(message) { + return attrs.pattern(/^[\d_-]+$/i, message); +} +bindMessage(chs_extphone, "请输入正确的联系电话"); + +const baseAttr = { + min: "%s最小长度为:min", + max: "%s最大长度为:max", + length: "%s长度必须为:length", + range: "%s长度为:range", + pattern: "$s格式错误" +}; + +const attrs = Object.keys(baseAttr).reduce((attrs, key) => { + attrs[key] = (attr, message = "", opt = {}) => { + const _attr = + key === "range" ? { min: attr[0], max: attr[1] } : { [key]: attr }; + + return { + message: message.replace( + `:${key}`, + key === "range" ? `${attr[0]}-${attr[1]}` : attr + ), + type: "string", + ..._attr, + ...opt + }; + }; + bindMessage(attrs[key], baseAttr[key]); + return attrs; +}, {}); + +export default attrs; diff --git a/utils/vue-jsonp.umd.js b/utils/vue-jsonp.umd.js new file mode 100644 index 0000000..8bec04d --- /dev/null +++ b/utils/vue-jsonp.umd.js @@ -0,0 +1,187 @@ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define([], factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.vueJsonp = factory(); + } +}(this, function() { +/** + * Vue Jsonp By LancerComet at 16:35, 2016.10.17. + * # Carry Your World # + * + * @author: LancerComet + * @license: MIT + */ + +var _timeout = null + +var vueJsonp = { + install: function (Vue, options) { + Vue.jsonp = jsonp + Vue.prototype.$jsonp = jsonp + + if (typeof options === 'number') { + _timeout = options + } + } +} + +/** + * JSONP function. + * @param { String } url Target URL address. + * @param { Object } params Querying params object. + * @param { Number } timeout Timeout setting (ms). + * + * @example + * Vue.jsonp('/url', { + * callbackQuery: '' + * callbackName: '', + * name: 'LancerComet', + * age: 26 + * }, 1000) + */ +function jsonp (url, params, timeout) { + params = params || {} + timeout = timeout || _timeout + + return new Promise(function (resolve, reject) { + if (typeof url !== 'string') { + throw new Error('[Vue.jsonp] Type of param "url" is not string.') + } + + var callbackQuery = params.callbackQuery || 'callback' + var callbackName = params.callbackName || 'jsonp_' + randomStr() + + params[callbackQuery] = callbackName + + // Remove callbackQuery and callbackName. + delete params.callbackQuery + delete params.callbackName + + // Convert params to querying str. + var queryStrs = [] + Object.keys(params).forEach(function (queryName) { + queryStrs = queryStrs.concat(formatParams(queryName, params[queryName])) + }) + + var queryStr = flatten(queryStrs).join('&') + + // Timeout timer. + var timeoutTimer = null + + // Setup timeout. + if (typeof timeout === 'number') { + timeoutTimer = setTimeout(function () { + removeErrorListener() + headNode.removeChild(paddingScript) + delete window[callbackName] + reject({ statusText: 'Request Timeout', status: 408 }) + }, timeout) + } + + // Create global function. + window[callbackName] = function (json) { + clearTimeout(timeoutTimer) + removeErrorListener() + headNode.removeChild(paddingScript) + resolve(json) + delete window[callbackName] + } + + // Create script element. + var headNode = document.querySelector('head') + var paddingScript = document.createElement('script') + + // Add error listener. + paddingScript.addEventListener('error', onError) + + // Append to head element. + paddingScript.src = url + (/\?/.test(url) ? '&' : '?') + queryStr + headNode.appendChild(paddingScript) + + /** + * Padding script on-error event. + * @param {Event} event + */ + function onError (event) { + removeErrorListener() + clearTimeout(timeoutTimer) + reject({ + status: 400, + statusText: 'Bad Request' + }) + } + + /** + * Remove on-error event listener. + */ + function removeErrorListener () { + paddingScript.removeEventListener('error', onError) + } + }) + +} + +/** + * Generate random string. + * @return { String } + */ +function randomStr () { + return (Math.floor(Math.random() * 100000) * Date.now()).toString(16) +} + +/** + * Format params into querying string. + * @param {{}} + * @return {string[]} + */ +function formatParams (queryName, value) { + queryName = queryName.replace(/=/g, '') + var result = [] + + switch (value.constructor) { + case String: + case Number: + case Boolean: + result.push(encodeURIComponent(queryName) + '=' + encodeURIComponent(value)) + break + + case Array: + value.forEach(function (item) { + result = result.concat(formatParams(queryName + '[]=', item)) + }) + break + + case Object: + Object.keys(value).forEach(function (key) { + var item = value[key] + result = result.concat(formatParams(queryName + '[' + key + ']', item)) + }) + break + } + + return result +} + +/** + * Flat querys. + * + * @param {any} array + * @returns + */ +function flatten (array) { + var querys = [] + array.forEach(function (item) { + if (typeof item === 'string') { + querys.push(item) + } else { + querys = querys.concat(flatten(item)) + } + }) + return querys +} + +return vueJsonp; +})); diff --git a/v4/components/@lucky-canvas/uni/LICENSE b/v4/components/@lucky-canvas/uni/LICENSE new file mode 100644 index 0000000..254bc4b --- /dev/null +++ b/v4/components/@lucky-canvas/uni/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2021] [Li Dong Qi] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/v4/components/@lucky-canvas/uni/README.md b/v4/components/@lucky-canvas/uni/README.md new file mode 100644 index 0000000..643a751 --- /dev/null +++ b/v4/components/@lucky-canvas/uni/README.md @@ -0,0 +1,138 @@ +
+ +
+ logo +

lucky-canvas 抽奖插件

+

一个基于 JavaScript 的跨平台 ( 大转盘 / 九宫格 / 老虎机 ) 抽奖插件

+

+ + stars + + + forks + + + author + + + license + +

+
+ + +|适配框架|npm下载量|CDN使用量| +| :-: | :-: | :-: | +|[`JS` / `JQ` 中使用](https://100px.net/usage/js.html)|downloads|downloads| +|[`Vue` 中使用](https://100px.net/usage/vue.html)|downloads|downloads| +|[`React` 中使用](https://100px.net/usage/react.html)|downloads|-| +|[`UniApp` 中使用](https://100px.net/usage/uni.html)|downloads|-| +|[`Taro3.x` 中使用](https://100px.net/usage/taro.html)|downloads|-| +|[`微信小程序` 中使用](https://100px.net/usage/wx.html)|downloads|-| + +
+ +## 官方文档 & Demo演示 + +> **中文**:[https://100px.net](https://100px.net) + +> **English**:**If anyone can help translate the document, please contact me** `ldq404@qq.com` + +
+ +## 在 uni-app 中使用 + +### 1. 安装插件 + +- 你可以选择通过 `HBuilderX` 导入插件: [https://ext.dcloud.net.cn/plugin?id=3499](https://ext.dcloud.net.cn/plugin?id=3499) + +- 也可以选择通过 `npm` / `yarn` 安装 + +```shell +# npm 安装: +npm install @lucky-canvas/uni + +# yarn 安装: +yarn add @lucky-canvas/uni +``` + +
+ +### 2. 引入并使用 + +```html + + + + + + +``` + +```js +// npm 下载会默认到 node_modules 里面,直接引入包名即可 +import LuckyWheel from '@lucky-canvas/uni/lucky-wheel' // 大转盘 +import LuckyGrid from '@lucky-canvas/uni/lucky-grid' // 九宫格 + +// 如果你是通过 HBuilderX 导入插件,那你需要指定一下路径 +// import LuckyWheel from '@/components/@lucky-canvas/uni/lucky-wheel' // 大转盘 +// import LuckyGrid from '@/components/@lucky-canvas/uni/lucky-grid' // 九宫格 + +export default { + // 注册组件 + components: { LuckyWheel, LuckyGrid }, +} +``` + +
+ +### 3. 我提供了一个最基本的 demo 供你用于尝试 + +由于 uni-app 渲染 md 的时候会出问题,所以我把 demo 代码放到了文档里 + +- [https://100px.net/document/uni-app.html](https://100px.net/document/uni-app.html) + +
+ +### **4. 补充说明** + +- [**如果用着顺手, 可以在 Github 上面点个 支持一下(●'◡'●)**](https://github.com/buuing/lucky-canvas) + +- 另外: 如果你修复了某些bug或兼容, 欢迎提给我, 我会把你展示到官网的贡献者列表当中 + + +
+ +### 5. 常见问题 + +1. 转盘层级太高了, 我的弹窗盖不住怎么办? + +> 答: 因为小程序里canvas是原生组件顶层渲染, 我无法控制canvas的层级, 如果你想盖住它也肯简单, 你可以百度搜索``组件 + +2. 你这些素材, 图片组件从哪下载? + +> 答: 官网里的任何图片素材, 所使用到的图片资源均为学习交流使用, 请勿将其用于商业用途, 由此产生的任何商业纠纷我这边概不负责 + +3. xxx属性怎么使用? xxx方法怎么调用? + +> 答: 自己去看文档, 不然难道要我把代码给你写好吗? + +4. 这个属性的效果与官网的描述不一致? + +> 答: 可能有bug, 你可以去github上的issues去提问 (请认真填写模板) + +5. 为什么这个插件不支持app和其他小程序 + +> 答: 没时间, 但是希望志同道合的同学来一起参与uniapp的兼容开发 + +--- + +作者留言: 为了使我自己保持心情愉悦, 低于5星的提问我用浏览器插件都屏蔽了 diff --git a/v4/components/@lucky-canvas/uni/lucky-grid.vue b/v4/components/@lucky-canvas/uni/lucky-grid.vue new file mode 100644 index 0000000..0c5444f --- /dev/null +++ b/v4/components/@lucky-canvas/uni/lucky-grid.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/v4/components/@lucky-canvas/uni/lucky-wheel.vue b/v4/components/@lucky-canvas/uni/lucky-wheel.vue new file mode 100644 index 0000000..50bdb4d --- /dev/null +++ b/v4/components/@lucky-canvas/uni/lucky-wheel.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/v4/components/@lucky-canvas/uni/package.json b/v4/components/@lucky-canvas/uni/package.json new file mode 100644 index 0000000..e8895cf --- /dev/null +++ b/v4/components/@lucky-canvas/uni/package.json @@ -0,0 +1,53 @@ +{ + "_from": "@lucky-canvas/uni", + "_id": "@lucky-canvas/uni@0.0.10", + "_inBundle": false, + "_integrity": "sha512-1K7SPr0FT1PfHRYXEh9CwOA/UqayxQosOA8wkZ3w3dfpoB8dij8Y6QGPKjHOMvHRRD1qFU3AEY7XVytjuktVaw==", + "_location": "/@lucky-canvas/uni", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "@lucky-canvas/uni", + "name": "@lucky-canvas/uni", + "escapedName": "@lucky-canvas%2funi", + "scope": "@lucky-canvas", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/@lucky-canvas/uni/-/uni-0.0.10.tgz", + "_shasum": "c1b98bb1875049b11840b7f4aa6bfa1f0230fab2", + "_spec": "@lucky-canvas/uni", + "_where": "/Users/ldq/Desktop/temp/test", + "author": { + "name": "ldq", + "email": "ldq404@qq.com" + }, + "bundleDependencies": false, + "dependencies": { + "lucky-canvas": "~1.7.19" + }, + "deprecated": false, + "description": "uni-app【大转盘 / 九宫格 / 老虎机】抽奖插件", + "files": [ + "lucky-wheel.vue", + "lucky-grid.vue", + "slot-machine.vue", + "utils.js", + "demo.vue" + ], + "keywords": [ + "uni-app抽奖" + ], + "license": "Apache-2.0", + "name": "@lucky-canvas/uni", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "0.0.10" +} diff --git a/v4/components/@lucky-canvas/uni/slot-machine.vue b/v4/components/@lucky-canvas/uni/slot-machine.vue new file mode 100644 index 0000000..e40279b --- /dev/null +++ b/v4/components/@lucky-canvas/uni/slot-machine.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/v4/components/@lucky-canvas/uni/utils.js b/v4/components/@lucky-canvas/uni/utils.js new file mode 100644 index 0000000..3b11952 --- /dev/null +++ b/v4/components/@lucky-canvas/uni/utils.js @@ -0,0 +1,82 @@ +let windowWidth = uni.getSystemInfoSync().windowWidth +// uni-app@2.9起, 屏幕最多适配到960, 超出则按375计算 +if (windowWidth > 960) windowWidth = 375 + +export const rpx2px = (value) => { + if (typeof value === 'string') value = Number(value.replace(/[a-z]*/g, '')) + return windowWidth / 750 * value +} + +export const changeUnits = (value) => { + return Number(value.replace(/^(\-*[0-9.]*)([a-z%]*)$/, (value, num, unit) => { + switch (unit) { + case 'px': + num *= 1 + break + case 'rpx': + num = rpx2px(num) + break + default: + num *= 1 + break + } + return num + })) +} + +export const resolveImage = async (img, canvas, srcName = 'src', resolveName = '$resolve') => { + let imgObj + // 区分 H5 和小程序 + if (window) { + imgObj = new Image() + } else { + imgObj = canvas.createImage() + } + // 成功回调 + imgObj.onload = () => { + img[resolveName](imgObj) + } + // 失败回调 + imgObj.onerror = (err) => { + console.error(err) + // img['$reject']() + } + // 设置src + imgObj.src = img[srcName] +} + +// 旧版canvas引入图片的方法 +// export const resolveImage = async (res, img, imgName = 'src', resolveName = '$resolve') => { +// const src = img[imgName] +// const $resolve = img[resolveName] +// // #ifdef MP +// // 如果是base64就调用base64src()方法把图片写入本地, 然后渲染临时路径 +// if (/^data:image\/([a-z]+);base64,/.test(src)) { +// const path = await base64src(src) +// $resolve({ ...res.detail, path }) +// return +// } +// // #endif +// // 如果是本地图片, 直接返回 +// if (src.indexOf('http') !== 0) { +// $resolve({ ...res.detail, path:src }) +// return +// } +// // 如果是网络图片, 则通过getImageInfo()方法获取图片宽高 +// uni.getImageInfo({ +// src: src, +// success: (imgObj) => $resolve(imgObj), +// fail: () => console.error('API `uni.getImageInfo` 加载图片失败', src) +// }) +// } + +export function getImage(canvasId, canvas) { + return new Promise((resolve, reject) => { + uni.canvasToTempFilePath({ + canvas, + canvasId, + success: res => resolve(res), + fail: err => reject(err) + }, this) + }) +} diff --git a/v4/components/lucky-canvas/LICENSE b/v4/components/lucky-canvas/LICENSE new file mode 100644 index 0000000..254bc4b --- /dev/null +++ b/v4/components/lucky-canvas/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2021] [Li Dong Qi] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/v4/components/lucky-canvas/README.md b/v4/components/lucky-canvas/README.md new file mode 100644 index 0000000..368a43d --- /dev/null +++ b/v4/components/lucky-canvas/README.md @@ -0,0 +1,42 @@ + + +
+ logo +

lucky-canvas 抽奖插件

+

一个基于 JavaScript 的跨平台 ( 大转盘 / 九宫格 / 老虎机 ) 抽奖插件

+

+ + stars + + + forks + + + author + + + license + +

+
+ +
+ +## 官方文档 & Demo演示 + +> **中文**:[https://100px.net/usage/js.html](https://100px.net/usage/js.html) + +> **English**:**If anyone can help translate the document, please contact me** `ldq404@qq.com` + + +
+ +## 在 JS / TS 中使用 + +- [跳转官网 查看详情](https://100px.net/usage/js.html) + +
+ +## 🙏🙏🙏 点个Star + +**如果您觉得这个项目还不错, 可以在 [Github](https://github.com/buuing/lucky-canvas) 上面帮我点个`star`, 支持一下作者 ☜(゚ヮ゚☜)** diff --git a/v4/components/lucky-canvas/index.js b/v4/components/lucky-canvas/index.js new file mode 100644 index 0000000..458f0dc --- /dev/null +++ b/v4/components/lucky-canvas/index.js @@ -0,0 +1 @@ +module.exports = require('./dist/index.umd.js') diff --git a/v4/components/lucky-canvas/package.json b/v4/components/lucky-canvas/package.json new file mode 100644 index 0000000..27f87a8 --- /dev/null +++ b/v4/components/lucky-canvas/package.json @@ -0,0 +1,96 @@ +{ + "_from": "lucky-canvas@~1.7.19", + "_id": "lucky-canvas@1.7.19", + "_inBundle": false, + "_integrity": "sha512-Gh6JZg0mc0ej9eG/UdTxwAY/OV2LsOXOF0XOK1lgCfdhMZM3TSphFi65zGL5lTVbFn9mNhieT6X3f3NNL3ihKg==", + "_location": "/lucky-canvas", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "lucky-canvas@~1.7.19", + "name": "lucky-canvas", + "escapedName": "lucky-canvas", + "rawSpec": "~1.7.19", + "saveSpec": null, + "fetchSpec": "~1.7.19" + }, + "_requiredBy": [ + "/@lucky-canvas/uni" + ], + "_resolved": "https://registry.npmjs.org/lucky-canvas/-/lucky-canvas-1.7.19.tgz", + "_shasum": "8983bd1739bb9b228768470508ab4e5c84b8df33", + "_spec": "lucky-canvas@~1.7.19", + "_where": "/Users/ldq/Desktop/temp/test/node_modules/@lucky-canvas/uni", + "author": { + "name": "ldq", + "email": "ldq404@qq.com" + }, + "bugs": { + "url": "https://github.com/LuckDraw/lucky-canvas/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "一个基于原生 js 的(大转盘 / 九宫格 / 老虎机)抽奖插件", + "devDependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.12.1", + "@babel/runtime": "^7.16.3", + "@rollup/plugin-commonjs": "^16.0.0", + "@rollup/plugin-eslint": "^8.0.1", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^10.0.0", + "@rollup/plugin-typescript": "^6.1.0", + "@typescript-eslint/parser": "^4.14.0", + "babel-plugin-external-helpers": "^6.22.0", + "babel-preset-latest": "^6.24.1", + "core-js": "^3.19.2", + "eslint": "^7.18.0", + "eslint-plugin-prettier": "^3.3.1", + "prettier": "^2.2.1", + "rollup": "^2.33.1", + "rollup-plugin-babel": "^4.4.0", + "rollup-plugin-delete": "^2.0.0", + "rollup-plugin-dts": "^3.0.2", + "rollup-plugin-livereload": "^2.0.0", + "rollup-plugin-serve": "^1.1.0", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-typescript2": "^0.30.0", + "tslib": "^2.3.1", + "typescript": "^4.0.5" + }, + "files": [ + "dist", + "types", + "index.js" + ], + "homepage": "https://100px.net", + "jsdelivr": "dist/index.umd.js", + "keywords": [ + "大转盘抽奖", + "九宫格抽奖", + "老虎机抽奖", + "抽奖插件", + "js抽奖", + "移动端抽奖", + "canvas抽奖" + ], + "license": "Apache-2.0", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "name": "lucky-canvas", + "repository": { + "type": "git", + "url": "git+https://github.com/LuckDraw/lucky-canvas.git", + "directory": "packages/lucky-canvas" + }, + "scripts": { + "build": "rollup --config rollup.config.build.js", + "dev": "rollup --config rollup.config.dev.js -w" + }, + "types": "types/index.d.ts", + "unpkg": "dist/index.umd.js", + "version": "1.7.19" +} diff --git a/v4/components/lucky-canvas/types/index.d.ts b/v4/components/lucky-canvas/types/index.d.ts new file mode 100644 index 0000000..81cb994 --- /dev/null +++ b/v4/components/lucky-canvas/types/index.d.ts @@ -0,0 +1,761 @@ +declare type FontItemType = { + text: string; + top?: string | number; + fontColor?: string; + fontSize?: string; + fontStyle?: string; + fontWeight?: string; + lineHeight?: string; +}; +declare type FontExtendType = { + wordWrap?: boolean; + lengthLimit?: string | number; + lineClamp?: number; +}; +declare type ImgType = HTMLImageElement | HTMLCanvasElement; +declare type ImgItemType = { + src: string; + top?: string | number; + width?: string; + height?: string; + formatter?: (img: ImgType) => ImgType; + $resolve?: Function; + $reject?: Function; +}; +declare type BorderRadiusType = string | number; +declare type BackgroundType = string; +declare type ShadowType = string; +declare type ConfigType = { + nodeType?: number; + flag: 'WEB' | 'MP-WX' | 'UNI-H5' | 'UNI-MP' | 'TARO-H5' | 'TARO-MP'; + el?: string; + divElement?: HTMLDivElement; + canvasElement?: HTMLCanvasElement; + ctx: CanvasRenderingContext2D; + dpr: number; + handleCssUnit?: (num: number, unit: string) => number; + rAF?: Function; + setTimeout: Function; + setInterval: Function; + clearTimeout: Function; + clearInterval: Function; + beforeCreate?: Function; + beforeResize?: Function; + afterResize?: Function; + beforeInit?: Function; + afterInit?: Function; + beforeDraw?: Function; + afterDraw?: Function; + afterStart?: Function; +}; +declare type RequireKey = 'width' | 'height'; +declare type UserConfigType = Partial> & Required>; +declare type Tuple = Res['length'] extends Len ? Res : Tuple; + +interface WatchOptType { + handler?: () => Function; + immediate?: boolean; + deep?: boolean; +} + +declare class Lucky { + protected readonly version: string; + protected readonly config: ConfigType; + protected readonly ctx: CanvasRenderingContext2D; + protected htmlFontSize: number; + protected rAF: Function; + protected boxWidth: number; + protected boxHeight: number; + protected data: { + width: string | number; + height: string | number; + }; + /** + * 公共构造器 + * @param config + */ + constructor(config: string | HTMLDivElement | UserConfigType, data: { + width: string | number; + height: string | number; + }); + /** + * 初始化组件大小/单位 + */ + protected resize(): void; + /** + * 初始化方法 + */ + protected initLucky(): void; + /** + * 鼠标点击事件 + * @param e 事件参数 + */ + protected handleClick(e: MouseEvent): void; + /** + * 根标签的字体大小 + */ + protected setHTMLFontSize(): void; + clearCanvas(): void; + /** + * 设备像素比 + * window 环境下自动获取, 其余环境手动传入 + */ + protected setDpr(): void; + /** + * 重置盒子和canvas的宽高 + */ + private resetWidthAndHeight; + /** + * 根据 dpr 缩放 canvas 并处理位移 + */ + protected zoomCanvas(): void; + /** + * 从 window 对象上获取一些方法 + */ + private initWindowFunction; + /** + * 异步加载图片并返回图片的几何信息 + * @param src 图片路径 + * @param info 图片信息 + */ + protected loadImg(src: string, info: ImgItemType, resolveName?: string): Promise; + /** + * 公共绘制图片的方法 + * @param imgObj 图片对象 + * @param rectInfo: [x轴位置, y轴位置, 渲染宽度, 渲染高度] + */ + protected drawImage(ctx: CanvasRenderingContext2D, imgObj: ImgType, ...rectInfo: [...Tuple, ...Partial>]): void; + /** + * 获取长度 + * @param length 将要转换的长度 + * @return 返回长度 + */ + protected getLength(length: string | number | undefined): number; + /** + * 转换单位 + * @param { string } value 将要转换的值 + * @param { number } denominator 分子 + * @return { number } 返回新的字符串 + */ + protected changeUnits(value: string, denominator?: number): number; + /** + * 计算图片的渲染宽高 + * @param imgObj 图片标签元素 + * @param imgInfo 图片信息 + * @param maxWidth 最大宽度 + * @param maxHeight 最大高度 + * @return [渲染宽度, 渲染高度] + */ + protected computedWidthAndHeight(imgObj: ImgType, imgInfo: ImgItemType, maxWidth: number, maxHeight: number): [number, number]; + /** + * 转换并获取宽度 + * @param width 将要转换的宽度 + * @param maxWidth 最大宽度 + * @return 返回相对宽度 + */ + protected getWidth(width: string | number | undefined, maxWidth: number): number; + /** + * 转换并获取高度 + * @param height 将要转换的高度 + * @param maxHeight 最大高度 + * @return 返回相对高度 + */ + protected getHeight(height: string | number | undefined, maxHeight: number): number; + /** + * 获取相对(居中)X坐标 + * @param width + * @param col + */ + protected getOffsetX(width: number, maxWidth?: number): number; + protected getOffscreenCanvas(width: number, height: number): { + _offscreenCanvas: HTMLCanvasElement; + _ctx: CanvasRenderingContext2D; + } | void; + /** + * 添加一个新的响应式数据 (临时) + * @param data 数据 + * @param key 属性 + * @param value 新值 + */ + $set(data: object, key: string | number, value: any): void; + /** + * 添加一个属性计算 (临时) + * @param data 源数据 + * @param key 属性名 + * @param callback 回调函数 + */ + protected $computed(data: object, key: string, callback: Function): void; + /** + * 添加一个观察者 create user watcher + * @param expr 表达式 + * @param handler 回调函数 + * @param watchOpt 配置参数 + * @return 卸载当前观察者的函数 (暂未返回) + */ + protected $watch(expr: string | Function, handler: Function | WatchOptType, watchOpt?: WatchOptType): Function; +} + +declare type PrizeFontType$2 = FontItemType & FontExtendType; +declare type ButtonFontType$1 = FontItemType & {}; +declare type BlockImgType$2 = ImgItemType & { + rotate?: boolean; +}; +declare type PrizeImgType$2 = ImgItemType & {}; +declare type ButtonImgType$1 = ImgItemType & {}; +declare type BlockType$2 = { + padding?: string; + background?: BackgroundType; + imgs?: Array; +}; +declare type PrizeType$2 = { + range?: number; + background?: BackgroundType; + fonts?: Array; + imgs?: Array; +}; +declare type ButtonType$1 = { + radius?: string; + pointer?: boolean; + background?: BackgroundType; + fonts?: Array; + imgs?: Array; +}; +declare type DefaultConfigType$2 = { + gutter?: string | number; + offsetDegree?: number; + speed?: number; + speedFunction?: string; + accelerationTime?: number; + decelerationTime?: number; + stopRange?: number; +}; +declare type DefaultStyleType$2 = { + background?: BackgroundType; + fontColor?: PrizeFontType$2['fontColor']; + fontSize?: PrizeFontType$2['fontSize']; + fontStyle?: PrizeFontType$2['fontStyle']; + fontWeight?: PrizeFontType$2['fontWeight']; + lineHeight?: PrizeFontType$2['lineHeight']; + wordWrap?: PrizeFontType$2['wordWrap']; + lengthLimit?: PrizeFontType$2['lengthLimit']; + lineClamp?: PrizeFontType$2['lineClamp']; +}; +declare type StartCallbackType$1 = (e: MouseEvent) => void; +declare type EndCallbackType$2 = (prize: object) => void; +interface LuckyWheelConfig { + width: string | number; + height: string | number; + blocks?: Array; + prizes?: Array; + buttons?: Array; + defaultConfig?: DefaultConfigType$2; + defaultStyle?: DefaultStyleType$2; + start?: StartCallbackType$1; + end?: EndCallbackType$2; +} + +declare class LuckyWheel extends Lucky { + private blocks; + private prizes; + private buttons; + private defaultConfig; + private defaultStyle; + private _defaultConfig; + private _defaultStyle; + private startCallback?; + private endCallback?; + private Radius; + private prizeRadius; + private prizeDeg; + private prizeRadian; + private rotateDeg; + private maxBtnRadius; + private startTime; + private endTime; + private stopDeg; + private endDeg; + private FPS; + /** + * 游戏当前的阶段 + * step = 0 时, 游戏尚未开始 + * step = 1 时, 此时处于加速阶段 + * step = 2 时, 此时处于匀速阶段 + * step = 3 时, 此时处于减速阶段 + */ + private step; + /** + * 中奖索引 + * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转 + * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引 + * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效 + */ + private prizeFlag; + private ImageCache; + /** + * 大转盘构造器 + * @param config 配置项 + * @param data 抽奖数据 + */ + constructor(config: UserConfigType, data: LuckyWheelConfig); + protected resize(): void; + protected initLucky(): void; + /** + * 初始化数据 + * @param data + */ + private initData; + /** + * 初始化属性计算 + */ + private initComputed; + /** + * 初始化观察者 + */ + private initWatch; + /** + * 初始化 canvas 抽奖 + */ + init(): Promise; + private initImageCache; + /** + * canvas点击事件 + * @param e 事件参数 + */ + protected handleClick(e: MouseEvent): void; + /** + * 根据索引单独加载指定图片并缓存 + * @param cellName 模块名称 + * @param cellIndex 模块索引 + * @param imgName 模块对应的图片缓存 + * @param imgIndex 图片索引 + */ + private loadAndCacheImg; + private drawBlock; + /** + * 开始绘制 + */ + protected draw(): void; + /** + * 刻舟求剑 + */ + private carveOnGunwaleOfAMovingBoat; + /** + * 对外暴露: 开始抽奖方法 + */ + play(): void; + /** + * 对外暴露: 缓慢停止方法 + * @param index 中奖索引 + */ + stop(index?: number): void; + /** + * 实际开始执行方法 + * @param num 记录帧动画执行多少次 + */ + private run; + /** + * 换算渲染坐标 + * @param x + * @param y + */ + protected conversionAxis(x: number, y: number): [number, number]; +} + +declare type PrizeFontType$1 = FontItemType & FontExtendType; +declare type ButtonFontType = FontItemType & FontExtendType; +declare type BlockImgType$1 = ImgItemType & {}; +declare type PrizeImgType$1 = ImgItemType & { + activeSrc?: string; +}; +declare type ButtonImgType = ImgItemType & {}; +declare type BlockType$1 = { + borderRadius?: BorderRadiusType; + background?: BackgroundType; + padding?: string; + paddingTop?: string | number; + paddingRight?: string | number; + paddingBottom?: string | number; + paddingLeft?: string | number; + imgs?: Array; +}; +declare type CellType = { + x: number; + y: number; + col?: number; + row?: number; + borderRadius?: BorderRadiusType; + background?: BackgroundType; + shadow?: ShadowType; + fonts?: Array; + imgs?: Array; +}; +declare type PrizeType$1 = CellType & { + range?: number; + disabled?: boolean; +}; +declare type ButtonType = CellType & { + callback?: Function; +}; +declare type DefaultConfigType$1 = { + gutter?: number; + speed?: number; + accelerationTime?: number; + decelerationTime?: number; +}; +declare type DefaultStyleType$1 = { + borderRadius?: BorderRadiusType; + background?: BackgroundType; + shadow?: ShadowType; + fontColor?: PrizeFontType$1['fontColor']; + fontSize?: PrizeFontType$1['fontSize']; + fontStyle?: PrizeFontType$1['fontStyle']; + fontWeight?: PrizeFontType$1['fontWeight']; + lineHeight?: PrizeFontType$1['lineHeight']; + wordWrap?: PrizeFontType$1['wordWrap']; + lengthLimit?: PrizeFontType$1['lengthLimit']; + lineClamp?: PrizeFontType$1['lineClamp']; +}; +declare type ActiveStyleType = { + background?: BackgroundType; + shadow?: ShadowType; + fontColor?: PrizeFontType$1['fontColor']; + fontSize?: PrizeFontType$1['fontSize']; + fontStyle?: PrizeFontType$1['fontStyle']; + fontWeight?: PrizeFontType$1['fontWeight']; + lineHeight?: PrizeFontType$1['lineHeight']; +}; +declare type RowsType = number; +declare type ColsType = number; +declare type StartCallbackType = (e: MouseEvent, button?: ButtonType) => void; +declare type EndCallbackType$1 = (prize: object) => void; +interface LuckyGridConfig { + width: string | number; + height: string | number; + rows?: RowsType; + cols?: ColsType; + blocks?: Array; + prizes?: Array; + buttons?: Array; + button?: ButtonType; + defaultConfig?: DefaultConfigType$1; + defaultStyle?: DefaultStyleType$1; + activeStyle?: ActiveStyleType; + start?: StartCallbackType; + end?: EndCallbackType$1; +} + +declare class LuckyGrid extends Lucky { + private rows; + private cols; + private blocks; + private prizes; + private buttons; + private button?; + private defaultConfig; + private defaultStyle; + private activeStyle; + private _defaultConfig; + private _defaultStyle; + private _activeStyle; + private startCallback?; + private endCallback?; + private cellWidth; + private cellHeight; + private startTime; + private endTime; + private currIndex; + private stopIndex; + private endIndex; + private demo; + private timer; + private FPS; + /** + * 游戏当前的阶段 + * step = 0 时, 游戏尚未开始 + * step = 1 时, 此时处于加速阶段 + * step = 2 时, 此时处于匀速阶段 + * step = 3 时, 此时处于减速阶段 + */ + private step; + /** + * 中奖索引 + * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转 + * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引 + * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效 + */ + private prizeFlag; + private cells; + private prizeArea; + private ImageCache; + /** + * 九宫格构造器 + * @param config 配置项 + * @param data 抽奖数据 + */ + constructor(config: UserConfigType, data: LuckyGridConfig); + protected resize(): void; + protected initLucky(): void; + /** + * 初始化数据 + * @param data + */ + private initData; + /** + * 初始化属性计算 + */ + private initComputed; + /** + * 初始化观察者 + */ + private initWatch; + /** + * 初始化 canvas 抽奖 + */ + init(): Promise; + private initImageCache; + /** + * canvas点击事件 + * @param e 事件参数 + */ + protected handleClick(e: MouseEvent): void; + /** + * 根据索引单独加载指定图片并缓存 + * @param cellName 模块名称 + * @param cellIndex 模块索引 + * @param imgName 模块对应的图片缓存 + * @param imgIndex 图片索引 + */ + private loadAndCacheImg; + /** + * 绘制九宫格抽奖 + */ + protected draw(): void; + /** + * 处理背景色 + * @param x + * @param y + * @param width + * @param height + * @param background + * @param isActive + */ + private handleBackground; + /** + * 刻舟求剑 + */ + private carveOnGunwaleOfAMovingBoat; + /** + * 对外暴露: 开始抽奖方法 + */ + play(): void; + /** + * 对外暴露: 缓慢停止方法 + * @param index 中奖索引 + */ + stop(index?: number): void; + /** + * 实际开始执行方法 + * @param num 记录帧动画执行多少次 + */ + private run; + /** + * 计算奖品格子的几何属性 + * @param { array } [...矩阵坐标, col, row] + * @return { array } [...真实坐标, width, height] + */ + private getGeometricProperty; + /** + * 换算渲染坐标 + * @param x + * @param y + */ + protected conversionAxis(x: number, y: number): [number, number]; +} + +declare type PrizeFontType = FontItemType & FontExtendType; +declare type BlockImgType = ImgItemType & {}; +declare type PrizeImgType = ImgItemType; +declare type BlockType = { + borderRadius?: BorderRadiusType; + background?: BackgroundType; + padding?: string; + paddingTop?: string | number; + paddingRight?: string | number; + paddingBottom?: string | number; + paddingLeft?: string | number; + imgs?: Array; +}; +declare type PrizeType = { + borderRadius?: BorderRadiusType; + background?: BackgroundType; + fonts?: Array; + imgs?: Array; +}; +declare type SlotType = { + order?: number[]; + speed?: number; + direction?: 1 | -1; +}; +declare type DefaultConfigType = { + /** + * vertical 为纵向旋转 + * horizontal 为横向旋转 + */ + mode?: 'vertical' | 'horizontal'; + /** + * 当排列方向 = `vertical`时 + * 1 bottom to top + * -1 top to bottom + * 当排列方向 = `horizontal`时 + * 1 right to left + * -1 left to right + */ + direction?: 1 | -1; + rowSpacing?: number; + colSpacing?: number; + speed?: number; + accelerationTime?: number; + decelerationTime?: number; +}; +declare type DefaultStyleType = { + borderRadius?: BorderRadiusType; + background?: BackgroundType; + fontColor?: PrizeFontType['fontColor']; + fontSize?: PrizeFontType['fontSize']; + fontStyle?: PrizeFontType['fontStyle']; + fontWeight?: PrizeFontType['fontWeight']; + lineHeight?: PrizeFontType['lineHeight']; + wordWrap?: PrizeFontType['wordWrap']; + lengthLimit?: PrizeFontType['lengthLimit']; + lineClamp?: PrizeFontType['lineClamp']; +}; +declare type EndCallbackType = (prize: PrizeType | undefined) => void; +interface SlotMachineConfig { + width: string | number; + height: string | number; + blocks?: Array; + prizes?: Array; + slots?: Array; + defaultConfig?: DefaultConfigType; + defaultStyle?: DefaultStyleType; + end?: EndCallbackType; +} + +declare class SlotMachine extends Lucky { + private blocks; + private prizes; + private slots; + private defaultConfig; + private _defaultConfig; + private defaultStyle; + private _defaultStyle; + private endCallback; + private _offscreenCanvas?; + private cellWidth; + private cellHeight; + private cellAndSpacing; + private widthAndSpacing; + private heightAndSpacing; + private FPS; + private scroll; + private stopScroll; + private endScroll; + private startTime; + private endTime; + /** + * 游戏当前的阶段 + * step = 0 时, 游戏尚未开始 + * step = 1 时, 此时处于加速阶段 + * step = 2 时, 此时处于匀速阶段 + * step = 3 时, 此时处于减速阶段 + */ + private step; + /** + * 中奖索引 + * prizeFlag = undefined 时, 处于开始抽奖阶段, 正常旋转 + * prizeFlag >= 0 时, 说明stop方法被调用, 并且传入了中奖索引 + * prizeFlag === -1 时, 说明stop方法被调用, 并且传入了负值, 本次抽奖无效 + */ + private prizeFlag; + private prizeArea?; + private ImageCache; + /** + * 老虎机构造器 + * @param config 配置项 + * @param data 抽奖数据 + */ + constructor(config: UserConfigType, data: SlotMachineConfig); + protected resize(): void; + protected initLucky(): void; + /** + * 初始化数据 + * @param data + */ + private initData; + /** + * 初始化属性计算 + */ + private initComputed; + /** + * 初始化观察者 + */ + private initWatch; + /** + * 初始化 canvas 抽奖 + */ + init(): Promise; + private initImageCache; + /** + * 根据索引单独加载指定图片并缓存 + * @param cellName 模块名称 + * @param cellIndex 模块索引 + * @param imgName 模块对应的图片缓存 + * @param imgIndex 图片索引 + */ + private loadAndCacheImg; + /** + * 绘制离屏canvas + */ + protected drawOffscreenCanvas(): void; + /** + * 绘制背景区域 + */ + protected drawBlocks(): SlotMachine['prizeArea']; + /** + * 绘制老虎机抽奖 + */ + protected draw(): void; + /** + * 刻舟求剑 + */ + private carveOnGunwaleOfAMovingBoat; + /** + * 对外暴露: 开始抽奖方法 + */ + play(): void; + stop(index: number | number[]): void; + /** + * 让游戏动起来 + * @param num 记录帧动画执行多少次 + */ + private run; + private displacement; + private displacementWidthOrHeight; +} + +/** + * 切割圆角 + * @param img 将要裁剪的图片对象 + * @param radius 裁剪的圆角半径 + * @returns 返回一个离屏 canvas 用于渲染 + */ +declare const cutRound: (img: ImgType, radius: number) => ImgType; +/** + * 透明度 + * @param img 将要处理的图片对象 + * @param opacity 透明度 + * @returns 返回一个离屏 canvas 用于渲染 + */ +declare const opacity: (img: ImgType, opacity: number) => ImgType; + +export { LuckyGrid, LuckyWheel, SlotMachine, cutRound, opacity }; diff --git a/v4/components/select-city.vue b/v4/components/select-city.vue new file mode 100644 index 0000000..2615a20 --- /dev/null +++ b/v4/components/select-city.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/v4/views/attract/attract.vue b/v4/views/attract/attract.vue new file mode 100644 index 0000000..e46ee3e --- /dev/null +++ b/v4/views/attract/attract.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/v4/views/attract/project.vue b/v4/views/attract/project.vue new file mode 100644 index 0000000..de78493 --- /dev/null +++ b/v4/views/attract/project.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/v4/views/attract/projectList.vue b/v4/views/attract/projectList.vue new file mode 100644 index 0000000..e4c926b --- /dev/null +++ b/v4/views/attract/projectList.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/v4/views/live/live.vue b/v4/views/live/live.vue new file mode 100644 index 0000000..89498dd --- /dev/null +++ b/v4/views/live/live.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/v4/views/luck/logs.vue b/v4/views/luck/logs.vue new file mode 100644 index 0000000..320a9aa --- /dev/null +++ b/v4/views/luck/logs.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/v4/views/luck/luck.vue b/v4/views/luck/luck.vue new file mode 100644 index 0000000..b4ce20a --- /dev/null +++ b/v4/views/luck/luck.vue @@ -0,0 +1,379 @@ + + + + + diff --git a/v4/views/luck/receive.vue b/v4/views/luck/receive.vue new file mode 100644 index 0000000..ae32b3f --- /dev/null +++ b/v4/views/luck/receive.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/v4/views/offer/offer.vue b/v4/views/offer/offer.vue new file mode 100644 index 0000000..371fe76 --- /dev/null +++ b/v4/views/offer/offer.vue @@ -0,0 +1,249 @@ + + + + + diff --git a/v4/views/preSale/preSale.vue b/v4/views/preSale/preSale.vue new file mode 100644 index 0000000..c0c55c5 --- /dev/null +++ b/v4/views/preSale/preSale.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/v4/views/seckill/seckill.vue b/v4/views/seckill/seckill.vue new file mode 100644 index 0000000..b9f4862 --- /dev/null +++ b/v4/views/seckill/seckill.vue @@ -0,0 +1,349 @@ + + + + + diff --git a/v4/views/shop/detail.vue b/v4/views/shop/detail.vue new file mode 100644 index 0000000..8afe44a --- /dev/null +++ b/v4/views/shop/detail.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/v4/views/shop/shop.vue b/v4/views/shop/shop.vue new file mode 100644 index 0000000..64d68f1 --- /dev/null +++ b/v4/views/shop/shop.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/v4/views/specialty/specialty.vue b/v4/views/specialty/specialty.vue new file mode 100644 index 0000000..de0bd4b --- /dev/null +++ b/v4/views/specialty/specialty.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/v4/views/trial/trial.vue b/v4/views/trial/trial.vue new file mode 100644 index 0000000..e930aed --- /dev/null +++ b/v4/views/trial/trial.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/wenwan/views/goodsClass.vue b/wenwan/views/goodsClass.vue new file mode 100644 index 0000000..304a5d6 --- /dev/null +++ b/wenwan/views/goodsClass.vue @@ -0,0 +1,476 @@ + + + + + diff --git a/wenwan/views/store.vue b/wenwan/views/store.vue new file mode 100644 index 0000000..47c0c4e --- /dev/null +++ b/wenwan/views/store.vue @@ -0,0 +1,1075 @@ + + + + + + + diff --git a/wenwan/views/storeList.vue b/wenwan/views/storeList.vue new file mode 100644 index 0000000..bbd8ca2 --- /dev/null +++ b/wenwan/views/storeList.vue @@ -0,0 +1,216 @@ + + + + +