From d55c79c426d36abd03be6ecd8c877fc208bcd17b Mon Sep 17 00:00:00 2001 From: ivo Date: Sun, 22 Jan 2023 22:31:33 +0800 Subject: [PATCH] init --- .eslintrc.js | 160 + .gitignore | 15 + .npmrc | 9 + .prettierignore | 3 + .prettierrc | 11 + .vscode/settings.json | 40 + LICENSE | 9 + README.md | 138 + __MACOSX/components/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/model/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/pages/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/pages/coupon/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/pages/goods/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/pages/order/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/pages/usercenter/._.DS_Store | Bin 0 -> 120 bytes __MACOSX/services/._.DS_Store | Bin 0 -> 120 bytes app.js | 8 + app.json | 73 + app.wxss | 3 + common/updateManager.js | 29 + components/filter-popup/index.js | 36 + components/filter-popup/index.json | 6 + components/filter-popup/index.wxml | 18 + components/filter-popup/index.wxss | 39 + components/filter/index.js | 84 + components/filter/index.json | 6 + components/filter/index.wxml | 37 + components/filter/index.wxss | 50 + components/goods-card/index.js | 141 + components/goods-card/index.json | 8 + components/goods-card/index.wxml | 63 + components/goods-card/index.wxss | 133 + components/goods-list/index.js | 62 + components/goods-list/index.json | 6 + components/goods-list/index.wxml | 16 + components/goods-list/index.wxss | 7 + components/load-more/index.js | 54 + components/load-more/index.json | 7 + components/load-more/index.wxml | 30 + components/load-more/index.wxss | 24 + components/loading-content/index.js | 23 + components/loading-content/index.json | 6 + components/loading-content/index.wxml | 11 + components/loading-content/index.wxss | 23 + components/price/index.js | 71 + components/price/index.json | 4 + components/price/index.wxml | 21 + components/price/index.wxss | 66 + components/swipeout/index.js | 79 + components/swipeout/index.json | 4 + components/swipeout/index.wxml | 174 + components/swipeout/index.wxss | 18 + components/webp-image/index.js | 86 + components/webp-image/index.json | 6 + components/webp-image/index.wxml | 14 + components/webp-image/index.wxss | 0 components/webp-image/utils.wxs | 140 + config/api.js | 1 + config/eslintCheck.js | 91 + config/index.js | 20437 ++++++++++++++++ custom-tab-bar/data.js | 21 + custom-tab-bar/index.js | 29 + custom-tab-bar/index.json | 8 + custom-tab-bar/index.wxml | 18 + custom-tab-bar/index.wxss | 9 + images/search.jpg | Bin 0 -> 44130 bytes images/use_bi.png | Bin 0 -> 721484 bytes jsconfig.json | 5 + mock.md | 34 + model/activities.js | 7 + model/activity.js | 18 + model/address.js | 31 + model/cart.js | 324 + model/category.js | 206 + model/comments.js | 338 + model/comments/queryDetail.js | 50 + model/coupon.js | 39 + model/detailsComments.js | 30 + model/good.js | 1916 ++ model/goods.js | 7 + model/order/applyService.js | 295 + model/order/orderConfirm.js | 147 + model/order/orderDetail.js | 1212 + model/order/orderList.js | 1054 + model/promotion.js | 21 + model/search.js | 60 + model/submitComment.js | 58 + model/swiper.js | 13 + model/usercenter.js | 52 + package.json | 36 + pages/cart/components/cart-bar/index.js | 59 + pages/cart/components/cart-bar/index.json | 7 + pages/cart/components/cart-bar/index.wxml | 31 + pages/cart/components/cart-bar/index.wxss | 80 + pages/cart/components/cart-empty/index.js | 23 + pages/cart/components/cart-empty/index.json | 6 + pages/cart/components/cart-empty/index.wxml | 6 + pages/cart/components/cart-empty/index.wxss | 33 + pages/cart/components/cart-group/index.js | 166 + pages/cart/components/cart-group/index.json | 11 + pages/cart/components/cart-group/index.wxml | 185 + pages/cart/components/cart-group/index.wxss | 335 + pages/cart/components/cart-group/utils.wxs | 20 + pages/cart/components/goods-card/index.js | 243 + pages/cart/components/goods-card/index.json | 9 + pages/cart/components/goods-card/index.wxml | 75 + pages/cart/components/goods-card/index.wxss | 260 + pages/cart/components/specs-popup/index.js | 72 + pages/cart/components/specs-popup/index.json | 7 + pages/cart/components/specs-popup/index.wxml | 26 + pages/cart/components/specs-popup/index.wxss | 68 + pages/cart/index.js | 315 + pages/cart/index.json | 10 + pages/cart/index.wxml | 31 + pages/cart/index.wxss | 12 + pages/coupon/components/coupon-card/index.js | 57 + .../coupon/components/coupon-card/index.json | 7 + .../coupon/components/coupon-card/index.wxml | 17 + .../coupon/components/coupon-card/index.wxss | 12 + .../components/floating-button/index.js | 17 + .../components/floating-button/index.json | 6 + .../components/floating-button/index.wxml | 14 + .../components/floating-button/index.wxss | 30 + .../coupon/components/ui-coupon-card/index.js | 87 + .../components/ui-coupon-card/index.json | 7 + .../components/ui-coupon-card/index.wxml | 54 + .../components/ui-coupon-card/index.wxss | 147 + pages/coupon/coupon-activity-goods/index.js | 78 + pages/coupon/coupon-activity-goods/index.json | 10 + pages/coupon/coupon-activity-goods/index.wxml | 54 + pages/coupon/coupon-activity-goods/index.wxss | 74 + pages/coupon/coupon-detail/index.js | 32 + pages/coupon/coupon-detail/index.json | 10 + pages/coupon/coupon-detail/index.wxml | 48 + pages/coupon/coupon-detail/index.wxss | 100 + pages/coupon/coupon-list/index.js | 77 + pages/coupon/coupon-list/index.json | 10 + pages/coupon/coupon-list/index.wxml | 42 + pages/coupon/coupon-list/index.wxss | 78 + .../components/c-sidebar/README.md | 95 + .../c-sidebar/c-sidebar-item/index.js | 51 + .../c-sidebar/c-sidebar-item/index.json | 4 + .../c-sidebar/c-sidebar-item/index.wxml | 10 + .../c-sidebar/c-sidebar-item/index.wxss | 60 + .../components/c-sidebar/index.js | 106 + .../components/c-sidebar/index.json | 4 + .../components/c-sidebar/index.wxml | 3 + .../components/c-sidebar/index.wxss | 9 + .../c-tabbar/c-tabbar-more/index.js | 37 + .../c-tabbar/c-tabbar-more/index.json | 4 + .../c-tabbar/c-tabbar-more/index.wxml | 25 + .../c-tabbar/c-tabbar-more/index.wxss | 63 + .../components/c-tabbar/index.js | 68 + .../components/c-tabbar/index.json | 6 + .../components/c-tabbar/index.wxml | 29 + .../components/c-tabbar/index.wxss | 53 + .../components/goods-category/index.js | 75 + .../components/goods-category/index.json | 9 + .../components/goods-category/index.wxml | 61 + .../components/goods-category/index.wxss | 102 + pages/goods/category/data.js | 135 + pages/goods/category/index.js | 28 + pages/goods/category/index.json | 6 + pages/goods/category/index.wxml | 8 + pages/goods/category/index.wxss | 23 + .../components/images-videos/assets/play.png | Bin 0 -> 1326 bytes .../components/images-videos/index.js | 36 + .../components/images-videos/index.json | 7 + .../components/images-videos/index.wxml | 15 + .../components/images-videos/index.wxss | 68 + .../components/my-video/index.js | 55 + .../components/my-video/index.json | 4 + .../components/my-video/index.wxml | 26 + .../components/my-video/index.wxss | 21 + .../components/comments-card/index.js | 51 + .../components/comments-card/index.json | 8 + .../components/comments-card/index.wxml | 34 + .../components/comments-card/index.wxss | 170 + pages/goods/comments/create/index.js | 92 + pages/goods/comments/create/index.json | 13 + pages/goods/comments/create/index.wxml | 85 + pages/goods/comments/create/index.wxss | 171 + pages/goods/comments/index.js | 227 + pages/goods/comments/index.json | 8 + pages/goods/comments/index.wxml | 50 + pages/goods/comments/index.wxss | 49 + .../goods/details/components/buy-bar/index.js | 66 + .../details/components/buy-bar/index.json | 6 + .../details/components/buy-bar/index.wxml | 38 + .../details/components/buy-bar/index.wxss | 107 + .../components/goods-specs-popup/index.js | 389 + .../components/goods-specs-popup/index.json | 9 + .../components/goods-specs-popup/index.wxml | 100 + .../components/goods-specs-popup/index.wxss | 300 + .../components/promotion-popup/index.js | 35 + .../components/promotion-popup/index.json | 7 + .../components/promotion-popup/index.wxml | 34 + .../components/promotion-popup/index.wxss | 131 + pages/goods/details/index.js | 443 + pages/goods/details/index.json | 18 + pages/goods/details/index.wxml | 176 + pages/goods/details/index.wxss | 356 + pages/goods/list/index.js | 226 + pages/goods/list/index.json | 12 + pages/goods/list/index.wxml | 55 + pages/goods/list/index.wxss | 108 + pages/goods/result/index.js | 262 + pages/goods/result/index.json | 15 + pages/goods/result/index.wxml | 81 + pages/goods/result/index.wxss | 110 + pages/goods/search/index.js | 119 + pages/goods/search/index.json | 8 + pages/goods/search/index.wxml | 75 + pages/goods/search/index.wxss | 79 + pages/home/home.js | 183 + pages/home/home.json | 19 + pages/home/home.wxml | 13 + pages/home/home.wxss | 129 + pages/home/readme | 8 + pages/index/index.js | 66 + pages/index/index.wxml | 2 + pages/order/after-service-detail/api.js | 34 + pages/order/after-service-detail/index.js | 209 + pages/order/after-service-detail/index.json | 20 + pages/order/after-service-detail/index.wxml | 223 + pages/order/after-service-detail/index.wxss | 443 + pages/order/after-service-list/api.js | 1278 + pages/order/after-service-list/index.js | 220 + pages/order/after-service-list/index.json | 15 + pages/order/after-service-list/index.wxml | 73 + pages/order/after-service-list/index.wxss | 103 + pages/order/apply-service/index.js | 454 + pages/order/apply-service/index.json | 19 + pages/order/apply-service/index.wxml | 220 + pages/order/apply-service/index.wxss | 290 + .../after-service-button-bar/index.js | 95 + .../after-service-button-bar/index.json | 6 + .../after-service-button-bar/index.wxml | 31 + .../after-service-button-bar/index.wxss | 46 + .../components/customer-service/index.js | 38 + .../components/customer-service/index.json | 6 + .../components/customer-service/index.wxml | 23 + .../components/customer-service/index.wxss | 48 + pages/order/components/goods-card/index.js | 264 + pages/order/components/goods-card/index.json | 8 + pages/order/components/goods-card/index.wxml | 77 + pages/order/components/goods-card/index.wxss | 254 + pages/order/components/noGoods/noGoods.js | 57 + pages/order/components/noGoods/noGoods.json | 8 + pages/order/components/noGoods/noGoods.wxml | 55 + pages/order/components/noGoods/noGoods.wxss | 68 + .../components/order-button-bar/index.js | 217 + .../components/order-button-bar/index.json | 8 + .../components/order-button-bar/index.wxml | 35 + .../components/order-button-bar/index.wxss | 57 + pages/order/components/order-card/index.js | 90 + pages/order/components/order-card/index.json | 7 + pages/order/components/order-card/index.wxml | 30 + pages/order/components/order-card/index.wxss | 45 + .../components/order-goods-card/index.js | 43 + .../components/order-goods-card/index.json | 7 + .../components/order-goods-card/index.wxml | 31 + pages/order/components/reason-sheet/index.js | 114 + .../order/components/reason-sheet/index.json | 10 + .../order/components/reason-sheet/index.wxml | 50 + .../order/components/reason-sheet/index.wxss | 47 + .../components/reason-sheet/reasonSheet.js | 25 + pages/order/components/selectCoupons/mock.js | 22 + .../components/selectCoupons/selectCoupon.wxs | 16 + .../components/selectCoupons/selectCoupons.js | 160 + .../selectCoupons/selectCoupons.json | 10 + .../selectCoupons/selectCoupons.wxml | 43 + .../selectCoupons/selectCoupons.wxss | 104 + .../components/specs-goods-card/index.js | 132 + .../components/specs-goods-card/index.json | 6 + .../components/specs-goods-card/index.wxml | 40 + .../components/specs-goods-card/index.wxss | 0 pages/order/config.js | 94 + pages/order/delivery-detail/index.js | 43 + pages/order/delivery-detail/index.json | 11 + pages/order/delivery-detail/index.wxml | 91 + pages/order/delivery-detail/index.wxss | 99 + pages/order/fill-tracking-no/api.js | 71 + pages/order/fill-tracking-no/index.js | 190 + pages/order/fill-tracking-no/index.json | 14 + pages/order/fill-tracking-no/index.wxml | 54 + pages/order/fill-tracking-no/index.wxss | 95 + pages/order/invoice/index.js | 38 + pages/order/invoice/index.json | 8 + pages/order/invoice/index.wxml | 40 + pages/order/invoice/index.wxss | 31 + .../components/address-card/index.js | 25 + .../components/address-card/index.json | 7 + .../components/address-card/index.wxml | 46 + .../components/address-card/index.wxss | 66 + pages/order/order-confirm/getNotes.wxs | 11 + pages/order/order-confirm/handleInvoice.wxs | 11 + pages/order/order-confirm/index.js | 571 + pages/order/order-confirm/index.json | 16 + pages/order/order-confirm/index.wxml | 167 + pages/order/order-confirm/index.wxss | 229 + pages/order/order-confirm/order.wxs | 8 + pages/order/order-confirm/pay.js | 115 + pages/order/order-detail/index.js | 288 + pages/order/order-detail/index.json | 17 + pages/order/order-detail/index.wxml | 182 + pages/order/order-detail/index.wxss | 240 + pages/order/order-list/index.js | 189 + pages/order/order-list/index.json | 16 + pages/order/order-list/index.wxml | 91 + pages/order/order-list/index.wxss | 107 + pages/order/pay-result/index.js | 47 + pages/order/pay-result/index.json | 9 + pages/order/pay-result/index.wxml | 22 + pages/order/pay-result/index.wxss | 54 + pages/order/receipt/index.js | 190 + pages/order/receipt/index.json | 11 + pages/order/receipt/index.wxml | 137 + pages/order/receipt/index.wxss | 209 + pages/promotion-detail/index.js | 57 + pages/promotion-detail/index.json | 10 + pages/promotion-detail/index.wxml | 76 + pages/promotion-detail/index.wxss | 111 + pages/usercenter/address/edit/index.js | 359 + pages/usercenter/address/edit/index.json | 16 + pages/usercenter/address/edit/index.wxml | 146 + pages/usercenter/address/edit/index.wxss | 113 + pages/usercenter/address/edit/util.js | 33 + pages/usercenter/address/list/index.js | 202 + pages/usercenter/address/list/index.json | 11 + pages/usercenter/address/list/index.wxml | 48 + pages/usercenter/address/list/index.wxss | 109 + pages/usercenter/address/list/util.js | 31 + .../components/area-picker-new/index.js | 192 + .../components/area-picker-new/index.json | 8 + .../components/area-picker-new/index.wxml | 78 + .../components/area-picker-new/index.wxss | 153 + .../components/order-group/index.js | 37 + .../components/order-group/index.json | 9 + .../components/order-group/index.wxml | 38 + .../components/order-group/index.wxss | 56 + .../usercenter/components/t-location/index.js | 126 + .../components/t-location/index.json | 8 + .../components/t-location/index.wxml | 39 + .../components/t-location/index.wxss | 19 + .../components/ui-address-item/index.js | 46 + .../components/ui-address-item/index.json | 8 + .../components/ui-address-item/index.wxml | 52 + .../components/ui-address-item/index.wxss | 103 + .../components/ui-select-picker/index.js | 73 + .../components/ui-select-picker/index.json | 6 + .../components/ui-select-picker/index.wxml | 27 + .../components/ui-select-picker/index.wxss | 102 + .../components/user-center-card/index.js | 35 + .../components/user-center-card/index.json | 7 + .../components/user-center-card/index.wxml | 35 + .../components/user-center-card/index.wxss | 48 + pages/usercenter/index.js | 240 + pages/usercenter/index.json | 14 + pages/usercenter/index.wxml | 53 + pages/usercenter/index.wxss | 146 + pages/usercenter/name-edit/index.js | 19 + pages/usercenter/name-edit/index.json | 8 + pages/usercenter/name-edit/index.wxml | 16 + pages/usercenter/name-edit/index.wxss | 26 + pages/usercenter/person-info/index.js | 122 + pages/usercenter/person-info/index.json | 12 + pages/usercenter/person-info/index.wxml | 59 + pages/usercenter/person-info/index.wxss | 41 + project.config.json | 142 + services/_utils/delay.js | 3 + services/_utils/timeout.js | 3 + services/activity/fetchActivity.js | 20 + services/activity/fetchActivityList.js | 20 + services/address/fetchAddress.js | 48 + services/api/permission.js | 11 + services/api/request.js | 55 + services/api/session.js | 31 + services/cart/cart.js | 20 + services/comments/fetchComments.js | 18 + services/comments/fetchCommentsCount.js | 18 + services/coupon/index.js | 65 + services/good/comments/fetchCommentDetail.js | 20 + services/good/featchSearchResult.js | 38 + services/good/fetchCategoryList.js | 18 + services/good/fetchGood.js | 18 + services/good/fetchGoods.js | 29 + services/good/fetchGoodsDetailsComments.js | 37 + services/good/fetchGoodsList.js | 39 + services/good/fetchSearchHistory.js | 35 + services/home/home.js | 53 + services/order/applyService.js | 70 + services/order/orderConfirm.js | 69 + services/order/orderDetail.js | 39 + services/order/orderList.js | 39 + services/order/orderSubmitComment.js | 22 + services/permission/login.js | 38 + services/promotion/detail.js | 18 + services/usercenter/fetchPerson.js | 28 + services/usercenter/fetchUsercenter.js | 18 + sitemap.json | 7 + style/cart-group.wxss | 83 + style/global.wxss | 965 + style/goodsList.wxss | 169 + style/iconfont.wxss | 306 + style/theme.wxss | 15 + utils/addressParse.js | 25 + utils/getPermission.js | 45 + utils/mock.js | 51 + utils/util.js | 133 + 410 files changed, 54103 insertions(+) create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 __MACOSX/components/._.DS_Store create mode 100644 __MACOSX/model/._.DS_Store create mode 100644 __MACOSX/pages/._.DS_Store create mode 100644 __MACOSX/pages/coupon/._.DS_Store create mode 100644 __MACOSX/pages/goods/._.DS_Store create mode 100644 __MACOSX/pages/order/._.DS_Store create mode 100644 __MACOSX/pages/usercenter/._.DS_Store create mode 100644 __MACOSX/services/._.DS_Store create mode 100644 app.js create mode 100644 app.json create mode 100644 app.wxss create mode 100644 common/updateManager.js create mode 100644 components/filter-popup/index.js create mode 100644 components/filter-popup/index.json create mode 100644 components/filter-popup/index.wxml create mode 100644 components/filter-popup/index.wxss create mode 100644 components/filter/index.js create mode 100644 components/filter/index.json create mode 100644 components/filter/index.wxml create mode 100644 components/filter/index.wxss create mode 100644 components/goods-card/index.js create mode 100644 components/goods-card/index.json create mode 100644 components/goods-card/index.wxml create mode 100644 components/goods-card/index.wxss create mode 100644 components/goods-list/index.js create mode 100644 components/goods-list/index.json create mode 100644 components/goods-list/index.wxml create mode 100644 components/goods-list/index.wxss create mode 100644 components/load-more/index.js create mode 100644 components/load-more/index.json create mode 100644 components/load-more/index.wxml create mode 100644 components/load-more/index.wxss create mode 100644 components/loading-content/index.js create mode 100644 components/loading-content/index.json create mode 100644 components/loading-content/index.wxml create mode 100644 components/loading-content/index.wxss create mode 100644 components/price/index.js create mode 100644 components/price/index.json create mode 100644 components/price/index.wxml create mode 100644 components/price/index.wxss create mode 100644 components/swipeout/index.js create mode 100644 components/swipeout/index.json create mode 100644 components/swipeout/index.wxml create mode 100644 components/swipeout/index.wxss create mode 100644 components/webp-image/index.js create mode 100644 components/webp-image/index.json create mode 100644 components/webp-image/index.wxml create mode 100644 components/webp-image/index.wxss create mode 100644 components/webp-image/utils.wxs create mode 100644 config/api.js create mode 100644 config/eslintCheck.js create mode 100644 config/index.js create mode 100644 custom-tab-bar/data.js create mode 100644 custom-tab-bar/index.js create mode 100644 custom-tab-bar/index.json create mode 100644 custom-tab-bar/index.wxml create mode 100644 custom-tab-bar/index.wxss create mode 100644 images/search.jpg create mode 100644 images/use_bi.png create mode 100644 jsconfig.json create mode 100644 mock.md create mode 100644 model/activities.js create mode 100644 model/activity.js create mode 100644 model/address.js create mode 100644 model/cart.js create mode 100644 model/category.js create mode 100644 model/comments.js create mode 100644 model/comments/queryDetail.js create mode 100644 model/coupon.js create mode 100644 model/detailsComments.js create mode 100644 model/good.js create mode 100644 model/goods.js create mode 100644 model/order/applyService.js create mode 100644 model/order/orderConfirm.js create mode 100644 model/order/orderDetail.js create mode 100644 model/order/orderList.js create mode 100644 model/promotion.js create mode 100644 model/search.js create mode 100644 model/submitComment.js create mode 100644 model/swiper.js create mode 100644 model/usercenter.js create mode 100644 package.json create mode 100644 pages/cart/components/cart-bar/index.js create mode 100644 pages/cart/components/cart-bar/index.json create mode 100644 pages/cart/components/cart-bar/index.wxml create mode 100644 pages/cart/components/cart-bar/index.wxss create mode 100644 pages/cart/components/cart-empty/index.js create mode 100644 pages/cart/components/cart-empty/index.json create mode 100644 pages/cart/components/cart-empty/index.wxml create mode 100644 pages/cart/components/cart-empty/index.wxss create mode 100644 pages/cart/components/cart-group/index.js create mode 100644 pages/cart/components/cart-group/index.json create mode 100644 pages/cart/components/cart-group/index.wxml create mode 100644 pages/cart/components/cart-group/index.wxss create mode 100644 pages/cart/components/cart-group/utils.wxs create mode 100644 pages/cart/components/goods-card/index.js create mode 100644 pages/cart/components/goods-card/index.json create mode 100644 pages/cart/components/goods-card/index.wxml create mode 100644 pages/cart/components/goods-card/index.wxss create mode 100644 pages/cart/components/specs-popup/index.js create mode 100644 pages/cart/components/specs-popup/index.json create mode 100644 pages/cart/components/specs-popup/index.wxml create mode 100644 pages/cart/components/specs-popup/index.wxss create mode 100644 pages/cart/index.js create mode 100644 pages/cart/index.json create mode 100644 pages/cart/index.wxml create mode 100644 pages/cart/index.wxss create mode 100644 pages/coupon/components/coupon-card/index.js create mode 100644 pages/coupon/components/coupon-card/index.json create mode 100644 pages/coupon/components/coupon-card/index.wxml create mode 100644 pages/coupon/components/coupon-card/index.wxss create mode 100644 pages/coupon/components/floating-button/index.js create mode 100644 pages/coupon/components/floating-button/index.json create mode 100644 pages/coupon/components/floating-button/index.wxml create mode 100644 pages/coupon/components/floating-button/index.wxss create mode 100644 pages/coupon/components/ui-coupon-card/index.js create mode 100644 pages/coupon/components/ui-coupon-card/index.json create mode 100644 pages/coupon/components/ui-coupon-card/index.wxml create mode 100644 pages/coupon/components/ui-coupon-card/index.wxss create mode 100644 pages/coupon/coupon-activity-goods/index.js create mode 100644 pages/coupon/coupon-activity-goods/index.json create mode 100644 pages/coupon/coupon-activity-goods/index.wxml create mode 100644 pages/coupon/coupon-activity-goods/index.wxss create mode 100644 pages/coupon/coupon-detail/index.js create mode 100644 pages/coupon/coupon-detail/index.json create mode 100644 pages/coupon/coupon-detail/index.wxml create mode 100644 pages/coupon/coupon-detail/index.wxss create mode 100644 pages/coupon/coupon-list/index.js create mode 100644 pages/coupon/coupon-list/index.json create mode 100644 pages/coupon/coupon-list/index.wxml create mode 100644 pages/coupon/coupon-list/index.wxss create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/README.md create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.js create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.json create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxml create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxss create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/index.js create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/index.json create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/index.wxml create mode 100644 pages/goods/category/components/goods-category/components/c-sidebar/index.wxss create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.js create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.json create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxml create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxss create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/index.js create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/index.json create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/index.wxml create mode 100644 pages/goods/category/components/goods-category/components/c-tabbar/index.wxss create mode 100644 pages/goods/category/components/goods-category/index.js create mode 100644 pages/goods/category/components/goods-category/index.json create mode 100644 pages/goods/category/components/goods-category/index.wxml create mode 100644 pages/goods/category/components/goods-category/index.wxss create mode 100644 pages/goods/category/data.js create mode 100644 pages/goods/category/index.js create mode 100644 pages/goods/category/index.json create mode 100644 pages/goods/category/index.wxml create mode 100644 pages/goods/category/index.wxss create mode 100644 pages/goods/comments/components/comments-card/components/images-videos/assets/play.png create mode 100644 pages/goods/comments/components/comments-card/components/images-videos/index.js create mode 100644 pages/goods/comments/components/comments-card/components/images-videos/index.json create mode 100644 pages/goods/comments/components/comments-card/components/images-videos/index.wxml create mode 100644 pages/goods/comments/components/comments-card/components/images-videos/index.wxss create mode 100644 pages/goods/comments/components/comments-card/components/my-video/index.js create mode 100644 pages/goods/comments/components/comments-card/components/my-video/index.json create mode 100644 pages/goods/comments/components/comments-card/components/my-video/index.wxml create mode 100644 pages/goods/comments/components/comments-card/components/my-video/index.wxss create mode 100644 pages/goods/comments/components/comments-card/index.js create mode 100644 pages/goods/comments/components/comments-card/index.json create mode 100644 pages/goods/comments/components/comments-card/index.wxml create mode 100644 pages/goods/comments/components/comments-card/index.wxss create mode 100644 pages/goods/comments/create/index.js create mode 100644 pages/goods/comments/create/index.json create mode 100644 pages/goods/comments/create/index.wxml create mode 100644 pages/goods/comments/create/index.wxss create mode 100644 pages/goods/comments/index.js create mode 100644 pages/goods/comments/index.json create mode 100644 pages/goods/comments/index.wxml create mode 100644 pages/goods/comments/index.wxss create mode 100644 pages/goods/details/components/buy-bar/index.js create mode 100644 pages/goods/details/components/buy-bar/index.json create mode 100644 pages/goods/details/components/buy-bar/index.wxml create mode 100644 pages/goods/details/components/buy-bar/index.wxss create mode 100644 pages/goods/details/components/goods-specs-popup/index.js create mode 100644 pages/goods/details/components/goods-specs-popup/index.json create mode 100644 pages/goods/details/components/goods-specs-popup/index.wxml create mode 100644 pages/goods/details/components/goods-specs-popup/index.wxss create mode 100644 pages/goods/details/components/promotion-popup/index.js create mode 100644 pages/goods/details/components/promotion-popup/index.json create mode 100644 pages/goods/details/components/promotion-popup/index.wxml create mode 100644 pages/goods/details/components/promotion-popup/index.wxss create mode 100644 pages/goods/details/index.js create mode 100644 pages/goods/details/index.json create mode 100644 pages/goods/details/index.wxml create mode 100644 pages/goods/details/index.wxss create mode 100644 pages/goods/list/index.js create mode 100644 pages/goods/list/index.json create mode 100644 pages/goods/list/index.wxml create mode 100644 pages/goods/list/index.wxss create mode 100644 pages/goods/result/index.js create mode 100644 pages/goods/result/index.json create mode 100644 pages/goods/result/index.wxml create mode 100644 pages/goods/result/index.wxss create mode 100644 pages/goods/search/index.js create mode 100644 pages/goods/search/index.json create mode 100644 pages/goods/search/index.wxml create mode 100644 pages/goods/search/index.wxss create mode 100644 pages/home/home.js create mode 100644 pages/home/home.json create mode 100644 pages/home/home.wxml create mode 100644 pages/home/home.wxss create mode 100644 pages/home/readme create mode 100644 pages/index/index.js create mode 100644 pages/index/index.wxml create mode 100644 pages/order/after-service-detail/api.js create mode 100644 pages/order/after-service-detail/index.js create mode 100644 pages/order/after-service-detail/index.json create mode 100644 pages/order/after-service-detail/index.wxml create mode 100644 pages/order/after-service-detail/index.wxss create mode 100644 pages/order/after-service-list/api.js create mode 100644 pages/order/after-service-list/index.js create mode 100644 pages/order/after-service-list/index.json create mode 100644 pages/order/after-service-list/index.wxml create mode 100644 pages/order/after-service-list/index.wxss create mode 100644 pages/order/apply-service/index.js create mode 100644 pages/order/apply-service/index.json create mode 100644 pages/order/apply-service/index.wxml create mode 100644 pages/order/apply-service/index.wxss create mode 100644 pages/order/components/after-service-button-bar/index.js create mode 100644 pages/order/components/after-service-button-bar/index.json create mode 100644 pages/order/components/after-service-button-bar/index.wxml create mode 100644 pages/order/components/after-service-button-bar/index.wxss create mode 100644 pages/order/components/customer-service/index.js create mode 100644 pages/order/components/customer-service/index.json create mode 100644 pages/order/components/customer-service/index.wxml create mode 100644 pages/order/components/customer-service/index.wxss create mode 100644 pages/order/components/goods-card/index.js create mode 100644 pages/order/components/goods-card/index.json create mode 100644 pages/order/components/goods-card/index.wxml create mode 100644 pages/order/components/goods-card/index.wxss create mode 100644 pages/order/components/noGoods/noGoods.js create mode 100644 pages/order/components/noGoods/noGoods.json create mode 100644 pages/order/components/noGoods/noGoods.wxml create mode 100644 pages/order/components/noGoods/noGoods.wxss create mode 100644 pages/order/components/order-button-bar/index.js create mode 100644 pages/order/components/order-button-bar/index.json create mode 100644 pages/order/components/order-button-bar/index.wxml create mode 100644 pages/order/components/order-button-bar/index.wxss create mode 100644 pages/order/components/order-card/index.js create mode 100644 pages/order/components/order-card/index.json create mode 100644 pages/order/components/order-card/index.wxml create mode 100644 pages/order/components/order-card/index.wxss create mode 100644 pages/order/components/order-goods-card/index.js create mode 100644 pages/order/components/order-goods-card/index.json create mode 100644 pages/order/components/order-goods-card/index.wxml create mode 100644 pages/order/components/reason-sheet/index.js create mode 100644 pages/order/components/reason-sheet/index.json create mode 100644 pages/order/components/reason-sheet/index.wxml create mode 100644 pages/order/components/reason-sheet/index.wxss create mode 100644 pages/order/components/reason-sheet/reasonSheet.js create mode 100644 pages/order/components/selectCoupons/mock.js create mode 100644 pages/order/components/selectCoupons/selectCoupon.wxs create mode 100644 pages/order/components/selectCoupons/selectCoupons.js create mode 100644 pages/order/components/selectCoupons/selectCoupons.json create mode 100644 pages/order/components/selectCoupons/selectCoupons.wxml create mode 100644 pages/order/components/selectCoupons/selectCoupons.wxss create mode 100644 pages/order/components/specs-goods-card/index.js create mode 100644 pages/order/components/specs-goods-card/index.json create mode 100644 pages/order/components/specs-goods-card/index.wxml create mode 100644 pages/order/components/specs-goods-card/index.wxss create mode 100644 pages/order/config.js create mode 100644 pages/order/delivery-detail/index.js create mode 100644 pages/order/delivery-detail/index.json create mode 100644 pages/order/delivery-detail/index.wxml create mode 100644 pages/order/delivery-detail/index.wxss create mode 100644 pages/order/fill-tracking-no/api.js create mode 100644 pages/order/fill-tracking-no/index.js create mode 100644 pages/order/fill-tracking-no/index.json create mode 100644 pages/order/fill-tracking-no/index.wxml create mode 100644 pages/order/fill-tracking-no/index.wxss create mode 100644 pages/order/invoice/index.js create mode 100644 pages/order/invoice/index.json create mode 100644 pages/order/invoice/index.wxml create mode 100644 pages/order/invoice/index.wxss create mode 100644 pages/order/order-confirm/components/address-card/index.js create mode 100644 pages/order/order-confirm/components/address-card/index.json create mode 100644 pages/order/order-confirm/components/address-card/index.wxml create mode 100644 pages/order/order-confirm/components/address-card/index.wxss create mode 100644 pages/order/order-confirm/getNotes.wxs create mode 100644 pages/order/order-confirm/handleInvoice.wxs create mode 100644 pages/order/order-confirm/index.js create mode 100644 pages/order/order-confirm/index.json create mode 100644 pages/order/order-confirm/index.wxml create mode 100644 pages/order/order-confirm/index.wxss create mode 100644 pages/order/order-confirm/order.wxs create mode 100644 pages/order/order-confirm/pay.js create mode 100644 pages/order/order-detail/index.js create mode 100644 pages/order/order-detail/index.json create mode 100644 pages/order/order-detail/index.wxml create mode 100644 pages/order/order-detail/index.wxss create mode 100644 pages/order/order-list/index.js create mode 100644 pages/order/order-list/index.json create mode 100644 pages/order/order-list/index.wxml create mode 100644 pages/order/order-list/index.wxss create mode 100644 pages/order/pay-result/index.js create mode 100644 pages/order/pay-result/index.json create mode 100644 pages/order/pay-result/index.wxml create mode 100644 pages/order/pay-result/index.wxss create mode 100644 pages/order/receipt/index.js create mode 100644 pages/order/receipt/index.json create mode 100644 pages/order/receipt/index.wxml create mode 100644 pages/order/receipt/index.wxss create mode 100644 pages/promotion-detail/index.js create mode 100644 pages/promotion-detail/index.json create mode 100644 pages/promotion-detail/index.wxml create mode 100644 pages/promotion-detail/index.wxss create mode 100644 pages/usercenter/address/edit/index.js create mode 100644 pages/usercenter/address/edit/index.json create mode 100644 pages/usercenter/address/edit/index.wxml create mode 100644 pages/usercenter/address/edit/index.wxss create mode 100644 pages/usercenter/address/edit/util.js create mode 100644 pages/usercenter/address/list/index.js create mode 100644 pages/usercenter/address/list/index.json create mode 100644 pages/usercenter/address/list/index.wxml create mode 100644 pages/usercenter/address/list/index.wxss create mode 100644 pages/usercenter/address/list/util.js create mode 100644 pages/usercenter/components/area-picker-new/index.js create mode 100644 pages/usercenter/components/area-picker-new/index.json create mode 100644 pages/usercenter/components/area-picker-new/index.wxml create mode 100644 pages/usercenter/components/area-picker-new/index.wxss create mode 100644 pages/usercenter/components/order-group/index.js create mode 100644 pages/usercenter/components/order-group/index.json create mode 100644 pages/usercenter/components/order-group/index.wxml create mode 100644 pages/usercenter/components/order-group/index.wxss create mode 100644 pages/usercenter/components/t-location/index.js create mode 100644 pages/usercenter/components/t-location/index.json create mode 100644 pages/usercenter/components/t-location/index.wxml create mode 100644 pages/usercenter/components/t-location/index.wxss create mode 100644 pages/usercenter/components/ui-address-item/index.js create mode 100644 pages/usercenter/components/ui-address-item/index.json create mode 100644 pages/usercenter/components/ui-address-item/index.wxml create mode 100644 pages/usercenter/components/ui-address-item/index.wxss create mode 100644 pages/usercenter/components/ui-select-picker/index.js create mode 100644 pages/usercenter/components/ui-select-picker/index.json create mode 100644 pages/usercenter/components/ui-select-picker/index.wxml create mode 100644 pages/usercenter/components/ui-select-picker/index.wxss create mode 100644 pages/usercenter/components/user-center-card/index.js create mode 100644 pages/usercenter/components/user-center-card/index.json create mode 100644 pages/usercenter/components/user-center-card/index.wxml create mode 100644 pages/usercenter/components/user-center-card/index.wxss create mode 100644 pages/usercenter/index.js create mode 100644 pages/usercenter/index.json create mode 100644 pages/usercenter/index.wxml create mode 100644 pages/usercenter/index.wxss create mode 100644 pages/usercenter/name-edit/index.js create mode 100644 pages/usercenter/name-edit/index.json create mode 100644 pages/usercenter/name-edit/index.wxml create mode 100644 pages/usercenter/name-edit/index.wxss create mode 100644 pages/usercenter/person-info/index.js create mode 100644 pages/usercenter/person-info/index.json create mode 100644 pages/usercenter/person-info/index.wxml create mode 100644 pages/usercenter/person-info/index.wxss create mode 100644 project.config.json create mode 100644 services/_utils/delay.js create mode 100644 services/_utils/timeout.js create mode 100644 services/activity/fetchActivity.js create mode 100644 services/activity/fetchActivityList.js create mode 100644 services/address/fetchAddress.js create mode 100644 services/api/permission.js create mode 100644 services/api/request.js create mode 100644 services/api/session.js create mode 100644 services/cart/cart.js create mode 100644 services/comments/fetchComments.js create mode 100644 services/comments/fetchCommentsCount.js create mode 100644 services/coupon/index.js create mode 100644 services/good/comments/fetchCommentDetail.js create mode 100644 services/good/featchSearchResult.js create mode 100644 services/good/fetchCategoryList.js create mode 100644 services/good/fetchGood.js create mode 100644 services/good/fetchGoods.js create mode 100644 services/good/fetchGoodsDetailsComments.js create mode 100644 services/good/fetchGoodsList.js create mode 100644 services/good/fetchSearchHistory.js create mode 100644 services/home/home.js create mode 100644 services/order/applyService.js create mode 100644 services/order/orderConfirm.js create mode 100644 services/order/orderDetail.js create mode 100644 services/order/orderList.js create mode 100644 services/order/orderSubmitComment.js create mode 100644 services/permission/login.js create mode 100644 services/promotion/detail.js create mode 100644 services/usercenter/fetchPerson.js create mode 100644 services/usercenter/fetchUsercenter.js create mode 100644 sitemap.json create mode 100644 style/cart-group.wxss create mode 100644 style/global.wxss create mode 100644 style/goodsList.wxss create mode 100644 style/iconfont.wxss create mode 100644 style/theme.wxss create mode 100644 utils/addressParse.js create mode 100644 utils/getPermission.js create mode 100644 utils/mock.js create mode 100644 utils/util.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..a5a5f75 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,160 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es6: true, + }, + parserOptions: { + ecmaVersion: 2020, + // ECMAScript modules 模式 + sourceType: 'module', + }, + extends: ['plugin:prettier/recommended', 'prettier'], + globals: { + wx: true, + App: true, + Page: true, + Component: true, + getApp: true, + getCurrentPages: true, + Behavior: true, + global: true, + __wxConfig: true, + }, + ignorePatterns: ['*.wxs'], + rules: { + 'prettier/prettier': 'warn', + 'no-undef': 'off', + camelcase: ['error', { ignoreDestructuring: true }], + 'class-name-casing': 'off', + 'no-console': ['warn', { allow: ['warn', 'error'] }], + 'no-debugger': 'error', + 'no-unused-expressions': [ + 'error', + { allowShortCircuit: true, allowTernary: true }, + ], + 'no-empty-interface': 'off', + 'no-use-before-define': ['error', { functions: false }], + 'no-useless-constructor': 'error', + 'prefer-const': 'error', + 'prefer-destructuring': [ + 'error', + { + AssignmentExpression: { + array: false, + object: false, + }, + VariableDeclarator: { + array: false, + object: true, + }, + }, + { + enforceForRenamedProperties: false, + }, + ], + 'no-const-assign': 'error', + 'no-new-object': 'error', + 'no-prototype-builtins': 'error', + 'no-array-constructor': 'error', + 'array-callback-return': 'warn', + 'prefer-template': 'error', + 'no-useless-escape': 'error', + 'wrap-iife': ['error', 'outside'], + 'space-before-function-paren': [ + 'warn', + { + anonymous: 'always', + named: 'never', + asyncArrow: 'always', + }, + ], + 'no-param-reassign': [ + 'warn', + { + props: true, + ignorePropertyModificationsFor: [ + 'acc', // for reduce accumulators + 'accumulator', // for reduce accumulators + 'e', // for e.returnvalue + 'ctx', // for Koa routing + 'req', // for Express requests + 'request', // for Express requests + 'res', // for Express responses + 'response', // for Express responses + '$scope', // for Angular 1 scopes + 'staticContext', // for ReactRouter context + 'state', // for Vuex + ], + }, + ], + 'no-confusing-arrow': 'warn', + 'no-dupe-class-members': 'error', + 'no-iterator': 'warn', + 'dot-notation': 'warn', + 'one-var': ['warn', 'never'], + 'no-multi-assign': 'error', + 'no-unused-vars': [ + 'error', + { + args: 'after-used', + ignoreRestSiblings: true, + argsIgnorePattern: '^_.+', + varsIgnorePattern: '^_.+', + }, + ], + eqeqeq: ['warn', 'always'], + 'no-case-declarations': 'error', + 'no-nested-ternary': 'warn', + 'no-unneeded-ternary': 'warn', + 'no-mixed-operators': [ + 'error', + { + groups: [ + ['%', '**'], + ['%', '+'], + ['%', '-'], + ['%', '*'], + ['%', '/'], + ['&', '|', '<<', '>>', '>>>'], + ['==', '!=', '===', '!=='], + ['&&', '||'], + ], + allowSamePrecedence: false, + }, + ], + 'no-else-return': [ + 'warn', + { + allowElseIf: false, + }, + ], + 'no-new-wrappers': 'warn', + indent: [ + 'warn', + 2, + { + SwitchCase: 1, + VariableDeclarator: 1, + outerIIFEBody: 1, + FunctionDeclaration: { + parameters: 1, + body: 1, + }, + FunctionExpression: { + parameters: 1, + body: 1, + }, + CallExpression: { + arguments: 1, + }, + ArrayExpression: 1, + ObjectExpression: 1, + ImportDeclaration: 1, + flatTernaryExpressions: false, + ignoreComments: false, + }, + ], + 'linebreak-style': ['warn', 'unix'], + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..69148d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +node_modules/ +yarn-error.log +miniprogram/ +miniprogram_npm/ +miniprogram_dist/ +.DS_Store +$node_modules/ +.history/ +**/dist +components/**/*.lock +components/**/package-lock.json +package-lock.json +yarn.lock +project.private.config.json +.eslintcache \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..21b91a6 --- /dev/null +++ b/.npmrc @@ -0,0 +1,9 @@ +# 去除注释可以使用代理进行安装 +# proxy=http://127.0.0.1:1080 +# https_proxy=http://127.0.0.1:1080 + +# 去除注释可以使用淘宝源 +# registry=https://registry.npm.taobao.org + +# 去除注释可以使用腾讯源 +#registry=http://mirrors.tencent.com/npm/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9ff2448 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +miniprogram_npm +package.json +project.config.json \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e9a6a97 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "useTabs": false, + "printWidth": 80, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "all", + "jsxBracketSameLine": false, + "noSemi": true, + "rcVerbose": true, + "endOfLine": "auto" +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..87287f6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,40 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "eslint.enable": true, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.tslint": true, + "source.fixAll.eslint": true + }, + "[javascript]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "HookyQR.beautify" + }, + "[json]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[wxss]": { + "editor.defaultFormatter": "HookyQR.beautify" + }, + "wxmlConfig.onSaveFormat": true, + "wxmlConfig.format": { + "brace_style": "collapse", + "indent_inner_html": true, + "indent_scripts": "keep", + "indent_size": 2, + "indent_char": " ", + "unformatted": "['wxs']", + "disable_automatic_closing_labels": false, + "preserve_newlines": true, + "wrap_attributes": "force-expand-multiline", + "wrap_attributes_count": 4, + "wrap_attributes_indent_size": 2 + }, + "editor.tabSize": 2, + "[wxml]": { + "editor.defaultFormatter": "wechat.miniprogram.wxml-language-features" + }, + "[css]": { + "editor.defaultFormatter": "HookyQR.beautify" + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..789cbde --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2021-present TDesign + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..88836f5 --- /dev/null +++ b/README.md @@ -0,0 +1,138 @@ +

+ + TDesign Logo + +

+ +

+ + License + + + License + + + License + + + Version + + + Downloads + +

+ +# TDesign 零售行业模版示例小程序 + +TDesign 零售模版示例小程序采用 [TDesign 企业级设计体系小程序解决方案](https://tdesign.tencent.com/miniprogram/overview) 进行搭建,依赖 [TDesign 微信小程序组件库](https://github.com/Tencent/tdesign-miniprogram),涵盖完整的基本零售场景需求。 + +## :high_brightness: 预览 + +

请使用微信扫描以下二维码:

+ + 模版小程序二维码 + +## :pushpin: 项目介绍 + +### 1. 业务介绍 + +零售行业模版小程序是个经典的单店版电商小程序,涵盖了电商的黄金链路流程,从商品->购物车->结算->订单等。小程序总共包含 28 个完整的页面,涵盖首页,商品详情页,个人中心,售后流程等基础页面。采用 mock 数据进行展示,提供了完整的零售商品展示、交易与售后流程。页面详情: + +模版小程序页面详情 + + + +主要页面截图如下: + +

+ example-home + example-sort + example-cart + example-user-center + example-goods-detail + example-pay + example-order + example-order-detail +

+ + + +### 2. 项目构成 + +零售行业模版小程序采用基础的 JavaScript + WXSS + ESLint 进行构建,降低了使用门槛。 + +项目目录结构如下: + +``` +|-- tdesign-miniprogram-starter + |-- README.md + |-- app.js + |-- app.json + |-- app.wxss + |-- components // 公共组件库 + |-- config // 基础配置 + |-- custom-tab-bar // 自定义 tabbar + |-- model // mock 数据 + |-- pages + | |-- cart // 购物车相关页面 + | |-- coupon // 优惠券相关页面 + | |-- goods // 商品相关页面 + | |-- home // 首页 + | |-- order // 订单售后相关页面 + | |-- promotion-detail // 营销活动页面 + | |-- usercenter // 个人中心及收货地址相关页面 + |-- services // 请求接口 + |-- style // 公共样式与iconfont + |-- utils // 工具库 +``` + +### 3. 数据模拟 + +零售小程序采用真实的接口数据,模拟后端返回逻辑,在小程序展示完整的购物场景与购物体验逻辑。 + +### 4. 添加新页面 + +1. 在 `pages `目录下创建对应的页面文件夹 +2. 在 `app.json` 文件中的 ` "pages"` 数组中加上页面路径 +3. [可选] 在 `project.config.json` 文件的 `"miniprogram-list"` 下添加页面配置 + +## :hammer: 构建运行 + +1. `npm install` +2. 小程序开发工具中引入工程 +3. 构建 npm + +## :art: 代码风格控制 + +`eslint` `prettier` + +## :iphone: 基础库版本 + +最低基础库版本`^2.6.5` + +## :dart: 反馈&合作 + +本开源项目是由[腾讯云Mall团队](https://ym.qq.com/)核心贡献。项目也在[github](https://github.com/Tencent/tdesign-miniprogram-starter-retail)上做了开源,有任何问题或者建议都欢迎在issue上留言反馈, 或者加入TD小程序开发者群进行反馈:star2::star2::star2: + +模版小程序页面详情 + +[云Mall](https://ym.qq.com/)是基于微信小程序的电商SaaS产品,致力于提供全面、可靠的小程序商城经营服务,助力商家成功。支持标准化和定开类型商家入驻。 + +企业微信群 +TDesign 团队会及时在企业微信大群中同步发布版本、问题修复信息,也会有一些关于组件库建设的讨论,欢迎微信或企业微信扫码入群交流: + +模版小程序页面详情 + + +邮件联系:tdesign@tencent.com + +## :link: TDesign 其他技术栈实现 + +- 移动端 小程序 实现:[mobile-miniprogram](https://github.com/Tencent/tdesign-miniprogram) +- 桌面端 Vue 2 实现:[web-vue](https://github.com/Tencent/tdesign-vue) +- 桌面端 Vue 3 实现:[web-vue-next](https://github.com/Tencent/tdesign-vue-next) +- 桌面端 React 实现:[web-react](https://github.com/Tencent/tdesign-react) + +## :page_with_curl: 开源协议 + +TDesign 遵循 [MIT 协议](https://github.com/Tencent/tdesign-miniprogram-starter-retail/LICENSE)。 diff --git a/__MACOSX/components/._.DS_Store b/__MACOSX/components/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/model/._.DS_Store b/__MACOSX/model/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/pages/._.DS_Store b/__MACOSX/pages/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/pages/coupon/._.DS_Store b/__MACOSX/pages/coupon/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/pages/goods/._.DS_Store b/__MACOSX/pages/goods/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/pages/order/._.DS_Store b/__MACOSX/pages/order/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/pages/usercenter/._.DS_Store b/__MACOSX/pages/usercenter/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/__MACOSX/services/._.DS_Store b/__MACOSX/services/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a5b28df1cbc6e15bd0d35cdadd0c2e65d5131c7d GIT binary patch literal 120 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}u^SMB_!U6R08`;00ODZ-jv*mIP;rnB Iur73U08|YJ=l}o! literal 0 HcmV?d00001 diff --git a/app.js b/app.js new file mode 100644 index 0000000..e4bc139 --- /dev/null +++ b/app.js @@ -0,0 +1,8 @@ +import updateManager from './common/updateManager'; + +App({ + onLaunch: function () {}, + onShow: function () { + updateManager(); + }, +}); diff --git a/app.json b/app.json new file mode 100644 index 0000000..e3401b8 --- /dev/null +++ b/app.json @@ -0,0 +1,73 @@ +{ + "pages": [ + "pages/home/home", + "pages/usercenter/index", + "pages/usercenter/person-info/index", + "pages/usercenter/address/list/index", + "pages/usercenter/address/edit/index", + "pages/goods/list/index", + "pages/goods/details/index", + "pages/goods/category/index", + "pages/goods/search/index", + "pages/goods/result/index", + "pages/cart/index", + "pages/order/order-confirm/index", + "pages/order/receipt/index", + "pages/order/pay-result/index", + "pages/order/order-list/index", + "pages/order/order-detail/index", + "pages/goods/comments/index", + "pages/order/apply-service/index", + "pages/order/after-service-list/index", + "pages/order/after-service-detail/index", + "pages/goods/comments/create/index", + "pages/coupon/coupon-list/index", + "pages/coupon/coupon-detail/index", + "pages/coupon/coupon-activity-goods/index", + "pages/promotion-detail/index", + "pages/order/fill-tracking-no/index", + "pages/order/delivery-detail/index", + "pages/order/invoice/index", + "pages/usercenter/name-edit/index", + "pages/index/index" + ], + "tabBar": { + "custom": true, + "color": "#666666", + "selectedColor": "#FF5F15", + "backgroundColor": "#ffffff", + "borderStyle": "black", + "list": [ + { + "pagePath": "pages/home/home", + "text": "首页" + }, + { + "pagePath": "pages/goods/category/index", + "text": "分类" + }, + { + "pagePath": "pages/cart/index", + "text": "购物车" + }, + { + "pagePath": "pages/usercenter/index", + "text": "我的" + } + ] + }, + "lazyCodeLoading": "requiredComponents", + "usingComponents": {}, + "window": { + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#fff", + "navigationBarTitleText": "Weixin", + "navigationBarTextStyle": "black" + }, + "sitemapLocation": "sitemap.json", + "permission": { + "scope.userLocation": { + "desc": "你的位置信息将用于小程序位置接口的效果展示" + } + } +} \ No newline at end of file diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..9ff2554 --- /dev/null +++ b/app.wxss @@ -0,0 +1,3 @@ +@import 'style/iconfont.wxss'; + +@import 'style/theme.wxss'; \ No newline at end of file diff --git a/common/updateManager.js b/common/updateManager.js new file mode 100644 index 0000000..c45de6d --- /dev/null +++ b/common/updateManager.js @@ -0,0 +1,29 @@ +export default () => { + if (!wx.canIUse('getUpdateManager')) { + return; + } + + const updateManager = wx.getUpdateManager(); + + updateManager.onCheckForUpdate(function (res) { + // 请求完新版本信息的回调 + console.log('版本信息', res); + }); + + updateManager.onUpdateReady(function () { + wx.showModal({ + title: '更新提示', + content: '新版本已经准备好,是否重启应用?', + success(res) { + if (res.confirm) { + // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 + updateManager.applyUpdate(); + } + }, + }); + }); + + updateManager.onUpdateFailed(function () { + // 新版本下载失败 + }); +}; diff --git a/components/filter-popup/index.js b/components/filter-popup/index.js new file mode 100644 index 0000000..14c69fd --- /dev/null +++ b/components/filter-popup/index.js @@ -0,0 +1,36 @@ +Component({ + externalClasses: ['wr-class'], + + options: { + multipleSlots: true, + }, + + properties: { + show: { + type: Boolean, + observer(show) { + this.setData({ visible: show }); + }, + }, + closeBtn: { + type: Boolean, + value: false, + }, + }, + + data: { visible: false }, + + methods: { + reset() { + this.triggerEvent('reset'); + }, + confirm() { + this.triggerEvent('confirm'); + }, + close() { + this.triggerEvent('showFilterPopupClose'); + + this.setData({ visible: false }); + }, + }, +}); diff --git a/components/filter-popup/index.json b/components/filter-popup/index.json new file mode 100644 index 0000000..f5d3702 --- /dev/null +++ b/components/filter-popup/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup" + } +} \ No newline at end of file diff --git a/components/filter-popup/index.wxml b/components/filter-popup/index.wxml new file mode 100644 index 0000000..2932624 --- /dev/null +++ b/components/filter-popup/index.wxml @@ -0,0 +1,18 @@ + + + + + 重置 + + 确定 + + + + + diff --git a/components/filter-popup/index.wxss b/components/filter-popup/index.wxss new file mode 100644 index 0000000..a206a82 --- /dev/null +++ b/components/filter-popup/index.wxss @@ -0,0 +1,39 @@ +.content .filter-btns-wrap { + width: 100%; + position: absolute; + bottom: calc(20rpx + env(safe-area-inset-bottom)); + display: flex; + flex-direction: row; + border-radius: 10rpx 0 0 10rpx; + padding: 16rpx 32rpx; + border-top: 1rpx solid #e5e5e5; + box-sizing: border-box; +} + +.filter-btn { + flex: 1; + display: flex; + justify-content: center; + align-items: center; + font-size: 28rpx; + font-weight: 500; + height: 80rpx; +} + +.btn-reset { + color: #fa4126; + background: rgba(255, 255, 255, 1); + position: relative; + border: 1rpx solid #fa4126; + border-radius: 84rpx 0 0 84rpx; +} + +.btn-confirm { + border-radius: 0 84rpx 84rpx 0; + border: 1rpx solid #fa4126; +} + +.btn-confirm { + color: #fff; + background: #fa4126; +} diff --git a/components/filter/index.js b/components/filter/index.js new file mode 100644 index 0000000..dc99b95 --- /dev/null +++ b/components/filter/index.js @@ -0,0 +1,84 @@ +Component({ + externalClasses: ['wr-class'], + + options: { + multipleSlots: true, + }, + + properties: { + overall: { + type: Number, + value: 1, + observer(overall) { + this.setData({ + overall, + }); + }, + }, + layout: { + type: Number, + value: 1, + observer(layout) { + this.setData({ + layout, + }); + }, + }, + sorts: { + type: String, + value: '', + observer(sorts) { + this.setData({ + sorts, + }); + }, + }, + color: { + type: String, + value: '#FA550F', + }, + }, + + data: { + layout: 1, + overall: 1, + sorts: '', + }, + + methods: { + onChangeShowAction() { + const { layout } = this.data; + const nextLayout = layout === 1 ? 0 : 1; + this.triggerEvent('change', { ...this.properties, layout: nextLayout }); + }, + + handlePriseSort() { + const { sorts } = this.data; + this.triggerEvent('change', { + ...this.properties, + overall: 0, + sorts: sorts === 'desc' ? 'asc' : 'desc', + }); + }, + + open() { + this.triggerEvent('showFilterPopup', { + show: true, + }); + }, + + onOverallAction() { + const { overall } = this.data; + const nextOverall = overall === 1 ? 0 : 1; + const nextData = { + sorts: '', + prices: [], + }; + this.triggerEvent('change', { + ...this.properties, + ...nextData, + overall: nextOverall, + }); + }, + }, +}); diff --git a/components/filter/index.json b/components/filter/index.json new file mode 100644 index 0000000..7464ae6 --- /dev/null +++ b/components/filter/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/components/filter/index.wxml b/components/filter/index.wxml new file mode 100644 index 0000000..9048bfd --- /dev/null +++ b/components/filter/index.wxml @@ -0,0 +1,37 @@ + + + + + 综合 + + + 价格 + + + + + + + 筛选 + + + + + + + diff --git a/components/filter/index.wxss b/components/filter/index.wxss new file mode 100644 index 0000000..97728f9 --- /dev/null +++ b/components/filter/index.wxss @@ -0,0 +1,50 @@ +.filter-wrap { + width: 100%; + height: 88rpx; + display: flex; + justify-content: space-between; + position: relative; + background: #fff; +} + +.filter-right-content { + height: 100%; + flex-basis: 100rpx; + text-align: center; + line-height: 88rpx; +} + +.filter-left-content { + height: 100%; + display: flex; + flex-grow: 2; + flex-flow: row nowrap; + justify-content: space-between; +} + +.filter-left-content .filter-item { + flex: 1; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 26rpx; + line-height: 36rpx; + font-weight: 400; + color: rgba(51, 51, 51, 1); +} + +.filter-left-content .filter-item .filter-price { + display: flex; + flex-direction: column; + margin-left: 6rpx; + justify-content: space-between; +} + +.filter-left-content .filter-item .wr-filter { + margin-left: 8rpx; +} + +.filter-left-content .filter-active-item { + color: #fa550f; +} diff --git a/components/goods-card/index.js b/components/goods-card/index.js new file mode 100644 index 0000000..eb75361 --- /dev/null +++ b/components/goods-card/index.js @@ -0,0 +1,141 @@ +Component({ + options: { + addGlobalClass: true, + }, + + properties: { + id: { + type: String, + value: '', + observer(id) { + this.genIndependentID(id); + if (this.properties.thresholds?.length) { + this.createIntersectionObserverHandle(); + } + }, + }, + data: { + type: Object, + observer(data) { + if (!data) { + return; + } + let isValidityLinePrice = true; + if (data.originPrice && data.price && data.originPrice < data.price) { + isValidityLinePrice = false; + } + this.setData({ goods: data, isValidityLinePrice }); + }, + }, + currency: { + type: String, + value: '¥', + }, + + thresholds: { + type: Array, + value: [], + observer(thresholds) { + if (thresholds && thresholds.length) { + this.createIntersectionObserverHandle(); + } else { + this.clearIntersectionObserverHandle(); + } + }, + }, + }, + + data: { + independentID: '', + goods: { id: '' }, + isValidityLinePrice: false, + }, + + lifetimes: { + ready() { + this.init(); + }, + detached() { + this.clear(); + }, + }, + + pageLifeTimes: {}, + + methods: { + clickHandle() { + this.triggerEvent('click', { goods: this.data.goods }); + }, + + clickThumbHandle() { + this.triggerEvent('thumb', { goods: this.data.goods }); + }, + + addCartHandle(e) { + const { id } = e.currentTarget; + const { id: cardID } = e.currentTarget.dataset; + this.triggerEvent('add-cart', { + ...e.detail, + id, + cardID, + goods: this.data.goods, + }); + }, + + genIndependentID(id) { + let independentID; + if (id) { + independentID = id; + } else { + independentID = `goods-card-${~~(Math.random() * 10 ** 8)}`; + } + this.setData({ independentID }); + }, + + init() { + const { thresholds, id } = this.properties; + this.genIndependentID(id); + if (thresholds && thresholds.length) { + this.createIntersectionObserverHandle(); + } + }, + + clear() { + this.clearIntersectionObserverHandle(); + }, + + intersectionObserverContext: null, + + createIntersectionObserverHandle() { + if (this.intersectionObserverContext || !this.data.independentID) { + return; + } + this.intersectionObserverContext = this.createIntersectionObserver({ + thresholds: this.properties.thresholds, + }).relativeToViewport(); + + this.intersectionObserverContext.observe( + `#${this.data.independentID}`, + (res) => { + this.intersectionObserverCB(res); + }, + ); + }, + + intersectionObserverCB() { + this.triggerEvent('ob', { + goods: this.data.goods, + context: this.intersectionObserverContext, + }); + }, + + clearIntersectionObserverHandle() { + if (this.intersectionObserverContext) { + try { + this.intersectionObserverContext.disconnect(); + } catch (e) {} + this.intersectionObserverContext = null; + } + }, + }, +}); diff --git a/components/goods-card/index.json b/components/goods-card/index.json new file mode 100644 index 0000000..f199647 --- /dev/null +++ b/components/goods-card/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "price": "/components/price/index", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/components/goods-card/index.wxml b/components/goods-card/index.wxml new file mode 100644 index 0000000..1292f65 --- /dev/null +++ b/components/goods-card/index.wxml @@ -0,0 +1,63 @@ + + + + + + + + + {{ goods.title }} + + + + {{tag}} + + + + + + + + + + + + diff --git a/components/goods-card/index.wxss b/components/goods-card/index.wxss new file mode 100644 index 0000000..1326d59 --- /dev/null +++ b/components/goods-card/index.wxss @@ -0,0 +1,133 @@ +.goods-card { + box-sizing: border-box; + font-size: 24rpx; + border-radius: 0 0 16rpx 16rpx; + border-bottom: none; +} + +.goods-card__main { + position: relative; + display: flex; + line-height: 1; + padding: 0; + background: transparent; + width: 342rpx; + border-radius: 0 0 16rpx 16rpx; + align-items: center; + justify-content: center; + margin-bottom: 16rpx; + flex-direction: column; +} + +.goods-card__thumb { + flex-shrink: 0; + position: relative; + width: 340rpx; + height: 340rpx; +} + +.goods-card__thumb:empty { + display: none; + margin: 0; +} + +.goods-card__img { + display: block; + width: 100%; + height: 100%; + border-radius: 16rpx 16rpx 0 0; + overflow: hidden; +} + +.goods-card__body { + display: flex; + flex: 1 1 auto; + background: #fff; + border-radius: 0 0 16rpx 16rpx; + padding: 16rpx 24rpx 18rpx; + flex-direction: column; +} + +.goods-card__upper { + display: flex; + flex-direction: column; + overflow: hidden; + flex: 1 1 auto; +} + +.goods-card__title { + flex-shrink: 0; + font-size: 28rpx; + color: #333; + font-weight: 400; + display: -webkit-box; + height: 72rpx; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + word-break: break-word; + line-height: 36rpx; +} + +.goods-card__tags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 8rpx 0 0 0; +} + +.goods-card__tag { + color: #fa4126; + background: transparent; + font-size: 20rpx; + border: 1rpx solid #fa4126; + padding: 0 8rpx; + border-radius: 16rpx; + line-height: 30rpx; + margin: 0 8rpx 8rpx 0; + display: block; + overflow: hidden; + white-space: nowrap; + word-break: keep-all; + text-overflow: ellipsis; +} + +.goods-card__down { + display: flex; + position: relative; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + line-height: 32rpx; + margin: 8rpx 0 0 0; +} + +.goods-card__origin-price { + white-space: nowrap; + font-weight: 700; + order: 2; + color: #bbbbbb; + font-size: 24rpx; + margin: 0 0 0 8rpx; +} + +.goods-card__add-cart { + order: 3; + margin: auto 0 0 auto; + position: absolute; + bottom: 0; + right: 0; +} + +.spec-for-price { + font-size: 36rpx; + white-space: nowrap; + font-weight: 700; + order: 1; + color: #fa4126; + margin: 0; +} + +.spec-for-symbol { + font-size: 24rpx; +} diff --git a/components/goods-list/index.js b/components/goods-list/index.js new file mode 100644 index 0000000..5184903 --- /dev/null +++ b/components/goods-list/index.js @@ -0,0 +1,62 @@ +Component({ + externalClasses: ['wr-class'], + + properties: { + goodsList: { + type: Array, + value: [], + }, + id: { + type: String, + value: '', + observer: (id) => { + this.genIndependentID(id); + }, + }, + thresholds: { + type: Array, + value: [], + }, + }, + + data: { + independentID: '', + }, + + lifetimes: { + ready() { + this.init(); + }, + }, + + methods: { + onClickGoods(e) { + const { index } = e.currentTarget.dataset; + this.triggerEvent('click', { ...e.detail, index }); + }, + + onAddCart(e) { + const { index } = e.currentTarget.dataset; + this.triggerEvent('addcart', { ...e.detail, index }); + }, + + onClickGoodsThumb(e) { + const { index } = e.currentTarget.dataset; + this.triggerEvent('thumb', { ...e.detail, index }); + }, + + init() { + this.genIndependentID(this.id || ''); + }, + + genIndependentID(id) { + if (id) { + this.setData({ independentID: id }); + } else { + this.setData({ + independentID: `goods-list-${~~(Math.random() * 10 ** 8)}`, + }); + } + }, + }, +}); diff --git a/components/goods-list/index.json b/components/goods-list/index.json new file mode 100644 index 0000000..bdaa23d --- /dev/null +++ b/components/goods-list/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "goods-card": "/components/goods-card/index" + } +} \ No newline at end of file diff --git a/components/goods-list/index.wxml b/components/goods-list/index.wxml new file mode 100644 index 0000000..5a9a804 --- /dev/null +++ b/components/goods-list/index.wxml @@ -0,0 +1,16 @@ + + + + + + diff --git a/components/goods-list/index.wxss b/components/goods-list/index.wxss new file mode 100644 index 0000000..7262a4d --- /dev/null +++ b/components/goods-list/index.wxss @@ -0,0 +1,7 @@ +.goods-list-wrap { + display: flex; + flex-flow: row wrap; + justify-content: space-between; + padding: 0; + background: #fff; +} diff --git a/components/load-more/index.js b/components/load-more/index.js new file mode 100644 index 0000000..b71a839 --- /dev/null +++ b/components/load-more/index.js @@ -0,0 +1,54 @@ +Component({ + externalClasses: ['wr-class', 'wr-class--no-more'], + + options: { multipleSlots: true }, + + properties: { + status: { + type: Number, + value: 0, + }, + loadingText: { + type: String, + value: '加载中...', + }, + noMoreText: { + type: String, + value: '没有更多了', + }, + failedText: { + type: String, + value: '加载失败,点击重试', + }, + color: { + type: String, + value: '#BBBBBB', + }, + failedColor: { + type: String, + value: '#FA550F', + }, + size: { + type: null, + value: '40rpx', + }, + loadingBackgroundColor: { + type: String, + value: '#F5F5F5', + }, + listIsEmpty: { + type: Boolean, + value: false, + }, + }, + + methods: { + /** 点击处理 */ + tapHandle() { + // 失败重试 + if (this.data.status === 3) { + this.triggerEvent('retry'); + } + }, + }, +}); diff --git a/components/load-more/index.json b/components/load-more/index.json new file mode 100644 index 0000000..94e107c --- /dev/null +++ b/components/load-more/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-loading": "tdesign-miniprogram/loading/loading", + "t-divider": "tdesign-miniprogram/divider/divider" + } +} \ No newline at end of file diff --git a/components/load-more/index.wxml b/components/load-more/index.wxml new file mode 100644 index 0000000..f698771 --- /dev/null +++ b/components/load-more/index.wxml @@ -0,0 +1,30 @@ + + + + + + + + {{noMoreText}} + + + + + + + + + diff --git a/components/load-more/index.wxss b/components/load-more/index.wxss new file mode 100644 index 0000000..8cbce4e --- /dev/null +++ b/components/load-more/index.wxss @@ -0,0 +1,24 @@ +.load-more { + font-size: 24rpx; + height: 100rpx; + display: flex; + flex-direction: column; + justify-content: center; +} + +.load-more .t-class-loading { + display: flex; + justify-content: center; +} + +.load-more .t-class-loading-text { + color: #bbbbbb; +} + +.t-class-divider-content { + margin: 0 10rpx; + color: #bbbbbb; +} +.load-more .t-class-indicator { + color: #b9b9b9 !important; +} diff --git a/components/loading-content/index.js b/components/loading-content/index.js new file mode 100644 index 0000000..4c6b925 --- /dev/null +++ b/components/loading-content/index.js @@ -0,0 +1,23 @@ +Component({ + externalClasses: ['wr-class'], + properties: { + position: { + type: String, + value: 'static', + }, + noMask: Boolean, + type: { + type: String, + value: 'circular', + }, + vertical: Boolean, + size: { + type: String, + value: '50rpx', + }, + backgroundColor: { + type: String, + value: 'rgba(0, 0, 0, .6)', + }, + }, +}); diff --git a/components/loading-content/index.json b/components/loading-content/index.json new file mode 100644 index 0000000..c08b2ef --- /dev/null +++ b/components/loading-content/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-loading": "tdesign-miniprogram/loading/loading" + } +} diff --git a/components/loading-content/index.wxml b/components/loading-content/index.wxml new file mode 100644 index 0000000..add589c --- /dev/null +++ b/components/loading-content/index.wxml @@ -0,0 +1,11 @@ + + + + + + diff --git a/components/loading-content/index.wxss b/components/loading-content/index.wxss new file mode 100644 index 0000000..d3c112b --- /dev/null +++ b/components/loading-content/index.wxss @@ -0,0 +1,23 @@ +.loading-content { + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + position: relative; +} +.loading-content.absolute { + position: absolute; + z-index: 1; + left: 0; + top: 0; +} +.loading-content.fixed { + position: fixed; + z-index: 1; + left: 0; + top: 0; +} +.loading-content .loading { + width: 100%; + height: 100%; + visibility: visible; +} diff --git a/components/price/index.js b/components/price/index.js new file mode 100644 index 0000000..c0218f7 --- /dev/null +++ b/components/price/index.js @@ -0,0 +1,71 @@ +Component({ + externalClasses: ['wr-class', 'symbol-class', 'decimal-class'], + useStore: [], + properties: { + priceUnit: { + type: String, + value: 'fen', + }, // 价格单位,分 | 元, fen,yuan + price: { + type: null, + value: '', + observer(price) { + this.format(price); + }, + }, // 价格, 以分为单位 + type: { + type: String, + value: '', // + }, // main 粗体, lighter 细体, mini 黑色, del 中划线, delthrough 中划线,包括货币符号 + symbol: { + type: String, + value: '¥', // '¥', + }, // 货币符号,默认是人民币符号¥ + fill: Boolean, // 是否自动补齐两位小数 + decimalSmaller: Boolean, // 小数字号小一点 + lineThroughWidth: { + type: null, + value: '0.12em', + }, // 划线价线条高度 + }, + + data: { + pArr: [], + }, + + methods: { + format(price) { + price = parseFloat(`${price}`); + const pArr = []; + if (!isNaN(price)) { + const isMinus = price < 0; + if (isMinus) { + price = -price; + } + if (this.properties.priceUnit === 'yuan') { + const priceSplit = price.toString().split('.'); + pArr[0] = priceSplit[0]; + pArr[1] = !priceSplit[1] + ? '00' + : priceSplit[1].length === 1 + ? `${priceSplit[1]}0` + : priceSplit[1]; + } else { + price = Math.round(price * 10 ** 8) / 10 ** 8; // 恢复精度丢失 + price = Math.ceil(price); // 向上取整 + pArr[0] = price >= 100 ? `${price}`.slice(0, -2) : '0'; + pArr[1] = `${price + 100}`.slice(-2); + } + if (!this.properties.fill) { + // 如果 fill 为 false, 不显示小数末尾的0 + if (pArr[1] === '00') pArr[1] = ''; + else if (pArr[1][1] === '0') pArr[1] = pArr[1][0]; + } + if (isMinus) { + pArr[0] = `-${pArr[0]}`; + } + } + this.setData({ pArr }); + }, + }, +}); diff --git a/components/price/index.json b/components/price/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/components/price/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/components/price/index.wxml b/components/price/index.wxml new file mode 100644 index 0000000..7f4f9d9 --- /dev/null +++ b/components/price/index.wxml @@ -0,0 +1,21 @@ + + var REGEXP = getRegExp('^\d+(\.\d+)?$'); + function addUnit(value) { + if (value == null) { + return ''; + } + return REGEXP.test('' + value) ? value + 'rpx' : value; + } + module.exports = { + addUnit: addUnit + }; + + + + {{symbol}} + + {{pArr[0]}} + .{{pArr[1]}} + + + diff --git a/components/price/index.wxss b/components/price/index.wxss new file mode 100644 index 0000000..45da266 --- /dev/null +++ b/components/price/index.wxss @@ -0,0 +1,66 @@ +:host { + display: inline-block; + display: inline-block; + font-weight: inherit; +} +.inline { + display: inline; + white-space: nowrap; +} +.price { + display: inline; + color: inherit; + font-size: inherit; + text-decoration: inherit; +} + +.lighter { + font-weight: 400; + font-size: 32rpx; +} +.mini { + font-size: 24rpx; + color: #5d5d5d; + font-weight: 400; +} +.del .pprice { + font-size: 32rpx; + color: #9b9b9b; + text-decoration: line-through; + font-weight: 400; +} +.delthrough { + position: relative; +} +.delthrough .line { + position: absolute; + top: 50%; + left: 0; + right: 0; + transform: translateY(-50%); + margin: 0; + background-color: currentColor; +} + +.symbol { + display: inline; + color: inherit; + font-size: inherit; + font-size: 0.8em; +} +.pprice { + display: inline; + margin: 0 0 0 4rpx; +} +.integer { + color: inherit; + font-size: inherit; +} +.decimal { + color: inherit; + font-size: inherit; +} +.decimal.smaller { + font-size: 0.8em; + vertical-align: baseline; +} diff --git a/components/swipeout/index.js b/components/swipeout/index.js new file mode 100644 index 0000000..3db6b79 --- /dev/null +++ b/components/swipeout/index.js @@ -0,0 +1,79 @@ +let ARRAY = []; +Component({ + externalClasses: ['wr-class'], + + options: { + multipleSlots: true, + }, + properties: { + disabled: Boolean, + leftWidth: { + type: Number, + value: 0, + }, + rightWidth: { + type: Number, + value: 0, + }, + asyncClose: Boolean, + }, + attached() { + ARRAY.push(this); + }, + + detached() { + ARRAY = ARRAY.filter((item) => item !== this); + }, + + /** + * Component initial data + */ + data: { + wrapperStyle: '', + asyncClose: false, + closed: true, + }, + + /** + * Component methods + */ + methods: { + open(position) { + this.setData({ closed: false }); + this.triggerEvent('close', { + position, + instance: this, + }); + }, + + close() { + this.setData({ closed: true }); + }, + + closeOther() { + ARRAY.filter((item) => item !== this).forEach((item) => item.close()); + }, + + noop() { + return; + }, + + onClick(event) { + const { key: position = 'outside' } = event.currentTarget.dataset; + this.triggerEvent('click', position); + + if (this.data.closed) { + return; + } + + if (this.data.asyncClose) { + this.triggerEvent('close', { + position, + instance: this, + }); + } else { + this.close(); + } + }, + }, +}); diff --git a/components/swipeout/index.json b/components/swipeout/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/components/swipeout/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/components/swipeout/index.wxml b/components/swipeout/index.wxml new file mode 100644 index 0000000..353bf72 --- /dev/null +++ b/components/swipeout/index.wxml @@ -0,0 +1,174 @@ + + var THRESHOLD = 0.3; + var MIN_DISTANCE = 10; + var owner; + var state; + + var getState = function(ownerInstance) { + owner = ownerInstance; + state = owner.getState(); + state.leftWidth = state.leftWidth || 0; + state.rightWidth = state.rightWidth || 0; + state.offset = state.offset || 0; + state.startOffset = state.startOffset || 0; + }; + + var initRightWidth = function(newVal, oldVal, ownerInstance) { + getState(ownerInstance); + state.rightWidth = newVal; + if (state.offset < 0) { + swipeMove(-state.rightWidth); + } + }; + + var initLeftWidth = function(newVal, oldVal, ownerInstance) { + getState(ownerInstance); + state.leftWidth = newVal; + if (state.offset > 0) { + swipeMove(state.leftWidth); + } + } + + var resetTouchStatus = function() { + state.direction = ''; + state.deltaX = 0; + state.deltaY = 0; + state.offsetX = 0; + state.offsetY = 0; + }; + + var touchMove = function(event) { + var touchPoint = event.touches[0]; + state.deltaX = touchPoint.clientX - state.startX; + state.deltaY = touchPoint.clientY - state.startY; + state.offsetX = Math.abs(state.deltaX); + state.offsetY = Math.abs(state.deltaY); + state.direction = state.direction || getDirection(state.offsetX, state.offsetY); + }; + + var getDirection = function(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; + }; + + var range = function(num, min, max) { + return Math.min(Math.max(num, min), max); + }; + + var swipeMove = function(_offset = 0) { + state.offset = range( + _offset, + -state.rightWidth, + +state.leftWidth, + ); + + var transform = 'translate3d(' + state.offset + 'px, 0, 0)'; + var transition = state.dragging + ? 'none' + : 'transform .6s cubic-bezier(0.18, 0.89, 0.32, 1)'; + owner.selectComponent('#wrapper').setStyle({ + '-webkit-transform': transform, + '-webkit-transition': transition, + 'transform': transform, + 'transition': transition + }); + }; + + var close = function() { + swipeMove(0); + }; + + var onCloseChange = function(newVal, oldVal, ownerInstance) { + getState(ownerInstance); + if (newVal === oldVal) return; + if (newVal) { + close(); + } + }; + + var touchStart = function(event) { + resetTouchStatus(); + state.startOffset = state.offset; + var touchPoint = event.touches[0]; + state.startX = touchPoint.clientX; + state.startY = touchPoint.clientY; + owner.callMethod('closeOther'); + }; + + var startDrag = function(event, ownerInstance) { + getState(ownerInstance); + touchStart(event); + }; + + var onDrag = function(event, ownerInstance) { + getState(ownerInstance); + touchMove(event); + if (state.direction !== 'horizontal') { + return; + } + state.dragging = true; + swipeMove(state.startOffset + state.deltaX); + }; + + var open = function(position) { + var _offset = position === 'left' ? +state.leftWidth : -state.rightWidth; + owner.callMethod('open', { position: position }); + swipeMove(_offset); + }; + + var endDrag = function(event, ownerInstance) { + getState(ownerInstance); + state.dragging = false; + // 左/右侧有可滑动区域,且当前不是已open状态,且滑动幅度超过阈值时open左/右侧(滚动到该侧的最边上) + if (+state.rightWidth > 0 && -state.startOffset < +state.rightWidth && -state.offset > +state.rightWidth * THRESHOLD) { + open('right'); + } else if (+state.leftWidth > 0 && state.startOffset < +state.leftWidth && state.offset > +state.leftWidth * THRESHOLD) { + open('left'); + } else { + // 仅在有发生侧滑的情况下自动关闭(由js控制是否异步关闭) + if (state.startOffset !== state.offset) { + close(); + } + } + }; + + module.exports = { + initLeftWidth: initLeftWidth, + initRightWidth: initRightWidth, + startDrag: startDrag, + onDrag: onDrag, + endDrag: endDrag, + onCloseChange: onCloseChange + }; + + + + + + + + + + + + + diff --git a/components/swipeout/index.wxss b/components/swipeout/index.wxss new file mode 100644 index 0000000..1aa2943 --- /dev/null +++ b/components/swipeout/index.wxss @@ -0,0 +1,18 @@ +.wr-swipeout { + position: relative; + overflow: hidden; +} +.wr-swipeout__left, +.wr-swipeout__right { + position: absolute; + top: 0; + height: 100%; +} +.wr-swipeout__left { + left: 0; + transform: translate3d(-100%, 0, 0); +} +.wr-swipeout__right { + right: 0; + transform: translate3d(100%, 0, 0); +} diff --git a/components/webp-image/index.js b/components/webp-image/index.js new file mode 100644 index 0000000..1706049 --- /dev/null +++ b/components/webp-image/index.js @@ -0,0 +1,86 @@ +/* + * @Author: rileycai + * @Date: 2022-03-14 14:21:26 + * @LastEditTime: 2022-03-14 15:23:04 + * @LastEditors: rileycai + * @Description: webp-image组件对t-image包裹了一层,主要实现图片裁剪、webp压缩功能 + * @FilePath: /tdesign-miniprogram-starter/components/webp-image/index.js + */ +const systemInfo = wx.getSystemInfoSync(); +Component({ + externalClasses: ['t-class', 't-class-load'], + properties: { + loadFailed: { + type: String, + value: 'default', + }, + loading: { + type: String, + value: 'default', + }, + src: { + type: String, + value: '', + }, + mode: { + type: String, + value: 'aspectFill', + }, + webp: { + type: Boolean, + value: true, + }, + lazyLoad: { + type: Boolean, + value: false, + }, + showMenuByLongpress: { + type: Boolean, + value: false, + }, + }, + data: { + thumbHeight: 375, + thumbWidth: 375, + systemInfo, + }, + lifetimes: { + ready() { + const { mode } = this.properties; + // 获取容器的真实宽高,设置图片的裁剪宽度 + this.getRect('.J-image').then((res) => { + if (res) { + const { width, height } = res; + this.setData( + mode === 'heightFix' + ? { + thumbHeight: this.px2rpx(height) || 375, + } + : { + thumbWidth: this.px2rpx(width) || 375, + }, + ); + } + }); + }, + }, + methods: { + px2rpx(px) { + return (750 / (systemInfo.screenWidth || 375)) * px; + }, + getRect(selector) { + return new Promise((resolve) => { + if (!this.selectorQuery) { + this.selectorQuery = this.createSelectorQuery(); + } + this.selectorQuery.select(selector).boundingClientRect(resolve).exec(); + }); + }, + onLoad(e) { + this.triggerEvent('load', e.detail); + }, + onError(e) { + this.triggerEvent('error', e.detail); + }, + }, +}); diff --git a/components/webp-image/index.json b/components/webp-image/index.json new file mode 100644 index 0000000..6ffda42 --- /dev/null +++ b/components/webp-image/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-image": "tdesign-miniprogram/image/image" + } +} \ No newline at end of file diff --git a/components/webp-image/index.wxml b/components/webp-image/index.wxml new file mode 100644 index 0000000..b32c199 --- /dev/null +++ b/components/webp-image/index.wxml @@ -0,0 +1,14 @@ + + diff --git a/components/webp-image/index.wxss b/components/webp-image/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/components/webp-image/utils.wxs b/components/webp-image/utils.wxs new file mode 100644 index 0000000..4f6e5d1 --- /dev/null +++ b/components/webp-image/utils.wxs @@ -0,0 +1,140 @@ +var isString = function (value) { + return typeof value === 'string'; +}; + +var isNumber = function (value) { + return typeof value === 'number'; +}; + +var getFileExt = function (src) { + var fileUrl = src.split('?')[0]; + var splitUlr = fileUrl.split('/'); + var filepath = splitUlr[splitUlr.length - 1]; + return filepath.split('.')[1] || 'jpg'; +}; + +function isUrl(url) { + // NOCC:ToolNameCheck(非敏感词) + var urlReg = getRegExp( + '/[(http(s)?)://(www.)?a-zA-Z0-9@:%._+~#=]{2,256}.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/', + 'ig', + ); + + return urlReg.test(url); +} + +function rpx2px(rpx, screenWidth) { + // px / systemWidth = rpx / 750 + var result = (rpx * (screenWidth || 375)) / 750; + + return Math.round(result); +} + +function imageMogr(url, options) { + if (!isString(url) || !url) return ''; + + if ( + url.indexOf('qlogo.cn') !== -1 || + url.indexOf('wxfile://') === 0 || + url.indexOf('http://tmp/wx') === 0 || + url.indexOf('imageMogr2') !== -1 + ) { + //qlogo.cn域名或者本地图片不做转换 + return url; + } //强制转https + + if (url.indexOf('http://') === 0) { + url = url.replace('http://', 'https://'); + } else if (url.indexOf('//') === 0) { + url = 'https:' + url; + } + + if (!options) return url; + + var width = Math.ceil(options.width), + height = Math.ceil(options.height), + format = options.format, + _optionsQuality = options.quality, + quality = _optionsQuality === undefined ? 70 : _optionsQuality, + _optionsStrip = options.strip, + strip = _optionsStrip === undefined ? true : _optionsStrip, + crop = options.crop; + var isValidWidth = isNumber(width) && width > 0; + var isValidHeight = isNumber(height) && height > 0; + var imageMogrStr = ''; + var size = ''; + + if (isValidWidth && isValidHeight) { + size = ''.concat(width, 'x').concat(height); + } else if (isValidWidth) { + size = ''.concat(width, 'x'); + } else if (isValidHeight) { + size = 'x'.concat(height); + } + + if (size) { + //缩放或者裁剪 + imageMogrStr += '/'.concat(crop ? 'crop' : 'thumbnail', '/').concat(size); + + if (crop) { + //裁剪目前需求只有以图片中心为基准 + imageMogrStr += '/gravity/center'; + } + } + + if (isNumber(quality)) { + //质量变换 + imageMogrStr += '/quality/'.concat(quality); + } + + if (strip) { + //去除元信息 + imageMogrStr += '/strip'; + } + + var ext = getFileExt(url); + + // gif 图片不做格式转换,否则会损坏动图 + if (ext === 'gif') { + imageMogrStr += '/cgif/1'; + } else if (format) { + //格式转换 + imageMogrStr += '/format/'.concat(format); + } + + if (format === 'jpg' || (!format && (ext === 'jpg' || ext === 'jpeg'))) { + //渐进式 jpg 加载 + imageMogrStr += '/interlace/1'; + } + if (!imageMogrStr) return url; + return '' + .concat(url) + .concat(url.indexOf('?') !== -1 ? '&' : '?', 'imageMogr2') + .concat(imageMogrStr); +} +function getSrc(options) { + if (!options.src) return ''; + + if (options.thumbWidth || options.thumbHeight) { + return imageMogr(options.src, { + width: + options.mode !== 'heightFix' + ? rpx2px(options.thumbWidth, options.systemInfo.screenWidth) * + options.systemInfo.pixelRatio + : null, + height: + options.mode !== 'widthFix' + ? rpx2px(options.thumbHeight, options.systemInfo.screenWidth) * + options.systemInfo.pixelRatio + : null, + format: options.webp ? 'webp' : null, + }); + } + + return ''; +} + +module.exports = { + imageMogr: imageMogr, + getSrc: getSrc, +}; diff --git a/config/api.js b/config/api.js new file mode 100644 index 0000000..a138e2f --- /dev/null +++ b/config/api.js @@ -0,0 +1 @@ +export const baseURL = 'https://shao5.net/hextech/v1' \ No newline at end of file diff --git a/config/eslintCheck.js b/config/eslintCheck.js new file mode 100644 index 0000000..9294baf --- /dev/null +++ b/config/eslintCheck.js @@ -0,0 +1,91 @@ +/* eslint-disable prefer-template */ +/** + * 工程代码pre-commit 检查工具 + * @date 2019.9.4 + * @author 310227663@qq.com + */ +const { exec } = require('child_process'); +const chalk = require('chalk'); +const { CLIEngine } = require('eslint'); +const cli = new CLIEngine({}); +const { log } = console; + +function getErrorLevel(number) { + switch (number) { + case 2: + return 'error'; + case 1: + return 'warn'; + default: + } + return 'undefined'; +} +let pass = 0; +exec( + 'git diff --cached --name-only --diff-filter=ACM | grep -Ei "\\.ts$|\\.js$"', + (error, stdout) => { + if (stdout.length) { + const array = stdout.split('\n'); + array.pop(); + const { results } = cli.executeOnFiles(array); + let errorCount = 0; + let warningCount = 0; + results.forEach((result) => { + errorCount += result.errorCount; + warningCount += result.warningCount; + if (result.messages.length > 0) { + log('\n'); + log(result.filePath); + result.messages.forEach((obj) => { + const level = getErrorLevel(obj.severity); + if (level === 'warn') + log( + ' ' + + obj.line + + ':' + + obj.column + + '\t ' + + chalk.yellow(level) + + ' \0 ' + + obj.message + + '\t\t' + + chalk.grey(obj.ruleId) + + '', + ); + if (level === 'error') + log( + ' ' + + obj.line + + ':' + + obj.column + + '\t ' + + chalk.red.bold(level) + + ' \0 ' + + obj.message + + '\t\t ' + + chalk.grey(obj.ruleId) + + '', + ); + if (level === 'error') pass = 1; + }); + } + }); + if (warningCount > 0 || errorCount > 0) { + log( + '\n' + + chalk.bgRed.bold(errorCount + warningCount + ' problems') + + ' (' + + chalk.red.bold(errorCount) + + ' errors, ' + + chalk.yellow(warningCount) + + ' warnings) \0', + ); + } + !pass && log(chalk.green.bold('~~ Done: 代码检验通过,提交成功 ~~')); + process.exit(pass); + } + if (error !== null) { + log(`exec error: ${error}`); + } + }, +); diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..59c6692 --- /dev/null +++ b/config/index.js @@ -0,0 +1,20437 @@ +export const config = { + /** 是否使用mock代替api返回 */ + useMock: true, +}; + +export const cdnBase = + 'https://we-retail-static-1300977798.cos.ap-guangzhou.myqcloud.com/retail-mp'; + +export const areaData = [ + { + name: '北京市', + code: '110000', + children: [ + { + name: '北京市', + code: '110100', + children: [ + { + name: '东城区', + code: '110101', + children: null, + }, + { + name: '西城区', + code: '110102', + children: null, + }, + { + name: '朝阳区', + code: '110105', + children: null, + }, + { + name: '丰台区', + code: '110106', + children: null, + }, + { + name: '石景山区', + code: '110107', + children: null, + }, + { + name: '海淀区', + code: '110108', + children: null, + }, + { + name: '门头沟区', + code: '110109', + children: null, + }, + { + name: '房山区', + code: '110111', + children: null, + }, + { + name: '通州区', + code: '110112', + children: null, + }, + { + name: '顺义区', + code: '110113', + children: null, + }, + { + name: '昌平区', + code: '110114', + children: null, + }, + { + name: '大兴区', + code: '110115', + children: null, + }, + { + name: '怀柔区', + code: '110116', + children: null, + }, + { + name: '平谷区', + code: '110117', + children: null, + }, + { + name: '密云区', + code: '110118', + children: null, + }, + { + name: '延庆区', + code: '110119', + children: null, + }, + ], + }, + ], + }, + { + name: '天津市', + code: '120000', + children: [ + { + name: '天津市', + code: '120100', + children: [ + { + name: '和平区', + code: '120101', + children: null, + }, + { + name: '河东区', + code: '120102', + children: null, + }, + { + name: '河西区', + code: '120103', + children: null, + }, + { + name: '南开区', + code: '120104', + children: null, + }, + { + name: '河北区', + code: '120105', + children: null, + }, + { + name: '红桥区', + code: '120106', + children: null, + }, + { + name: '东丽区', + code: '120110', + children: null, + }, + { + name: '西青区', + code: '120111', + children: null, + }, + { + name: '津南区', + code: '120112', + children: null, + }, + { + name: '北辰区', + code: '120113', + children: null, + }, + { + name: '武清区', + code: '120114', + children: null, + }, + { + name: '宝坻区', + code: '120115', + children: null, + }, + { + name: '滨海新区', + code: '120116', + children: null, + }, + { + name: '宁河区', + code: '120117', + children: null, + }, + { + name: '静海区', + code: '120118', + children: null, + }, + { + name: '蓟州区', + code: '120119', + children: null, + }, + ], + }, + ], + }, + { + name: '河北省', + code: '130000', + children: [ + { + name: '石家庄市', + code: '130100', + children: [ + { + name: '长安区', + code: '130102', + children: null, + }, + { + name: '桥西区', + code: '130104', + children: null, + }, + { + name: '新华区', + code: '130105', + children: null, + }, + { + name: '井陉矿区', + code: '130107', + children: null, + }, + { + name: '裕华区', + code: '130108', + children: null, + }, + { + name: '藁城区', + code: '130109', + children: null, + }, + { + name: '鹿泉区', + code: '130110', + children: null, + }, + { + name: '栾城区', + code: '130111', + children: null, + }, + { + name: '井陉县', + code: '130121', + children: null, + }, + { + name: '正定县', + code: '130123', + children: null, + }, + { + name: '行唐县', + code: '130125', + children: null, + }, + { + name: '灵寿县', + code: '130126', + children: null, + }, + { + name: '高邑县', + code: '130127', + children: null, + }, + { + name: '深泽县', + code: '130128', + children: null, + }, + { + name: '赞皇县', + code: '130129', + children: null, + }, + { + name: '无极县', + code: '130130', + children: null, + }, + { + name: '平山县', + code: '130131', + children: null, + }, + { + name: '元氏县', + code: '130132', + children: null, + }, + { + name: '赵县', + code: '130133', + children: null, + }, + { + name: '辛集市', + code: '130181', + children: null, + }, + { + name: '晋州市', + code: '130183', + children: null, + }, + { + name: '新乐市', + code: '130184', + children: null, + }, + ], + }, + { + name: '唐山市', + code: '130200', + children: [ + { + name: '路南区', + code: '130202', + children: null, + }, + { + name: '路北区', + code: '130203', + children: null, + }, + { + name: '古冶区', + code: '130204', + children: null, + }, + { + name: '开平区', + code: '130205', + children: null, + }, + { + name: '丰南区', + code: '130207', + children: null, + }, + { + name: '丰润区', + code: '130208', + children: null, + }, + { + name: '曹妃甸区', + code: '130209', + children: null, + }, + { + name: '滦南县', + code: '130224', + children: null, + }, + { + name: '乐亭县', + code: '130225', + children: null, + }, + { + name: '迁西县', + code: '130227', + children: null, + }, + { + name: '玉田县', + code: '130229', + children: null, + }, + { + name: '芦台区', + code: '130230', + children: null, + }, + { + name: '遵化市', + code: '130281', + children: null, + }, + { + name: '迁安市', + code: '130283', + children: null, + }, + { + name: '滦州市', + code: '130284', + children: null, + }, + ], + }, + { + name: '秦皇岛市', + code: '130300', + children: [ + { + name: '海港区', + code: '130302', + children: null, + }, + { + name: '山海关区', + code: '130303', + children: null, + }, + { + name: '北戴河区', + code: '130304', + children: null, + }, + { + name: '抚宁区', + code: '130306', + children: null, + }, + { + name: '青龙满族自治县', + code: '130321', + children: null, + }, + { + name: '昌黎县', + code: '130322', + children: null, + }, + { + name: '卢龙县', + code: '130324', + children: null, + }, + ], + }, + { + name: '邯郸市', + code: '130400', + children: [ + { + name: '邯山区', + code: '130402', + children: null, + }, + { + name: '丛台区', + code: '130403', + children: null, + }, + { + name: '复兴区', + code: '130404', + children: null, + }, + { + name: '峰峰矿区', + code: '130406', + children: null, + }, + { + name: '肥乡区', + code: '130407', + children: null, + }, + { + name: '永年区', + code: '130408', + children: null, + }, + { + name: '临漳县', + code: '130423', + children: null, + }, + { + name: '成安县', + code: '130424', + children: null, + }, + { + name: '大名县', + code: '130425', + children: null, + }, + { + name: '涉县', + code: '130426', + children: null, + }, + { + name: '磁县', + code: '130427', + children: null, + }, + { + name: '邱县', + code: '130430', + children: null, + }, + { + name: '鸡泽县', + code: '130431', + children: null, + }, + { + name: '广平县', + code: '130432', + children: null, + }, + { + name: '馆陶县', + code: '130433', + children: null, + }, + { + name: '魏县', + code: '130434', + children: null, + }, + { + name: '曲周县', + code: '130435', + children: null, + }, + { + name: '武安市', + code: '130481', + children: null, + }, + ], + }, + { + name: '邢台市', + code: '130500', + children: [ + { + name: '桥东区', + code: '130502', + children: null, + }, + { + name: '桥西区', + code: '130503', + children: null, + }, + { + name: '邢台县', + code: '130521', + children: null, + }, + { + name: '临城县', + code: '130522', + children: null, + }, + { + name: '内丘县', + code: '130523', + children: null, + }, + { + name: '柏乡县', + code: '130524', + children: null, + }, + { + name: '隆尧县', + code: '130525', + children: null, + }, + { + name: '任县', + code: '130526', + children: null, + }, + { + name: '南和县', + code: '130527', + children: null, + }, + { + name: '宁晋县', + code: '130528', + children: null, + }, + { + name: '巨鹿县', + code: '130529', + children: null, + }, + { + name: '新河县', + code: '130530', + children: null, + }, + { + name: '广宗县', + code: '130531', + children: null, + }, + { + name: '平乡县', + code: '130532', + children: null, + }, + { + name: '威县', + code: '130533', + children: null, + }, + { + name: '清河县', + code: '130534', + children: null, + }, + { + name: '临西县', + code: '130535', + children: null, + }, + { + name: '南宫市', + code: '130581', + children: null, + }, + { + name: '沙河市', + code: '130582', + children: null, + }, + ], + }, + { + name: '保定市', + code: '130600', + children: [ + { + name: '竞秀区', + code: '130602', + children: null, + }, + { + name: '莲池区', + code: '130606', + children: null, + }, + { + name: '满城区', + code: '130607', + children: null, + }, + { + name: '清苑区', + code: '130608', + children: null, + }, + { + name: '徐水区', + code: '130609', + children: null, + }, + { + name: '涞水县', + code: '130623', + children: null, + }, + { + name: '阜平县', + code: '130624', + children: null, + }, + { + name: '定兴县', + code: '130626', + children: null, + }, + { + name: '唐县', + code: '130627', + children: null, + }, + { + name: '高阳县', + code: '130628', + children: null, + }, + { + name: '容城县', + code: '130629', + children: null, + }, + { + name: '涞源县', + code: '130630', + children: null, + }, + { + name: '望都县', + code: '130631', + children: null, + }, + { + name: '安新县', + code: '130632', + children: null, + }, + { + name: '易县', + code: '130633', + children: null, + }, + { + name: '曲阳县', + code: '130634', + children: null, + }, + { + name: '蠡县', + code: '130635', + children: null, + }, + { + name: '顺平县', + code: '130636', + children: null, + }, + { + name: '博野县', + code: '130637', + children: null, + }, + { + name: '雄县', + code: '130638', + children: null, + }, + { + name: '涿州市', + code: '130681', + children: null, + }, + { + name: '定州市', + code: '130682', + children: null, + }, + { + name: '安国市', + code: '130683', + children: null, + }, + { + name: '高碑店市', + code: '130684', + children: null, + }, + ], + }, + { + name: '张家口市', + code: '130700', + children: [ + { + name: '桥东区', + code: '130702', + children: null, + }, + { + name: '桥西区', + code: '130703', + children: null, + }, + { + name: '宣化区', + code: '130705', + children: null, + }, + { + name: '下花园区', + code: '130706', + children: null, + }, + { + name: '万全区', + code: '130708', + children: null, + }, + { + name: '崇礼区', + code: '130709', + children: null, + }, + { + name: '张北县', + code: '130722', + children: null, + }, + { + name: '康保县', + code: '130723', + children: null, + }, + { + name: '沽源县', + code: '130724', + children: null, + }, + { + name: '尚义县', + code: '130725', + children: null, + }, + { + name: '蔚县', + code: '130726', + children: null, + }, + { + name: '阳原县', + code: '130727', + children: null, + }, + { + name: '怀安县', + code: '130728', + children: null, + }, + { + name: '怀来县', + code: '130730', + children: null, + }, + { + name: '涿鹿县', + code: '130731', + children: null, + }, + { + name: '赤城县', + code: '130732', + children: null, + }, + ], + }, + { + name: '承德市', + code: '130800', + children: [ + { + name: '双桥区', + code: '130802', + children: null, + }, + { + name: '双滦区', + code: '130803', + children: null, + }, + { + name: '鹰手营子矿区', + code: '130804', + children: null, + }, + { + name: '承德县', + code: '130821', + children: null, + }, + { + name: '兴隆县', + code: '130822', + children: null, + }, + { + name: '滦平县', + code: '130824', + children: null, + }, + { + name: '隆化县', + code: '130825', + children: null, + }, + { + name: '丰宁满族自治县', + code: '130826', + children: null, + }, + { + name: '宽城满族自治县', + code: '130827', + children: null, + }, + { + name: '围场满族蒙古族自治县', + code: '130828', + children: null, + }, + { + name: '平泉市', + code: '130881', + children: null, + }, + ], + }, + { + name: '沧州市', + code: '130900', + children: [ + { + name: '新华区', + code: '130902', + children: null, + }, + { + name: '运河区', + code: '130903', + children: null, + }, + { + name: '沧县', + code: '130921', + children: null, + }, + { + name: '青县', + code: '130922', + children: null, + }, + { + name: '东光县', + code: '130923', + children: null, + }, + { + name: '海兴县', + code: '130924', + children: null, + }, + { + name: '盐山县', + code: '130925', + children: null, + }, + { + name: '肃宁县', + code: '130926', + children: null, + }, + { + name: '南皮县', + code: '130927', + children: null, + }, + { + name: '吴桥县', + code: '130928', + children: null, + }, + { + name: '献县', + code: '130929', + children: null, + }, + { + name: '孟村回族自治县', + code: '130930', + children: null, + }, + { + name: '泊头市', + code: '130981', + children: null, + }, + { + name: '任丘市', + code: '130982', + children: null, + }, + { + name: '黄骅市', + code: '130983', + children: null, + }, + { + name: '河间市', + code: '130984', + children: null, + }, + ], + }, + { + name: '廊坊市', + code: '131000', + children: [ + { + name: '安次区', + code: '131002', + children: null, + }, + { + name: '广阳区', + code: '131003', + children: null, + }, + { + name: '固安县', + code: '131022', + children: null, + }, + { + name: '永清县', + code: '131023', + children: null, + }, + { + name: '香河县', + code: '131024', + children: null, + }, + { + name: '大城县', + code: '131025', + children: null, + }, + { + name: '文安县', + code: '131026', + children: null, + }, + { + name: '大厂回族自治县', + code: '131028', + children: null, + }, + { + name: '霸州市', + code: '131081', + children: null, + }, + { + name: '三河市', + code: '131082', + children: null, + }, + ], + }, + { + name: '衡水市', + code: '131100', + children: [ + { + name: '桃城区', + code: '131102', + children: null, + }, + { + name: '冀州区', + code: '131103', + children: null, + }, + { + name: '枣强县', + code: '131121', + children: null, + }, + { + name: '武邑县', + code: '131122', + children: null, + }, + { + name: '武强县', + code: '131123', + children: null, + }, + { + name: '饶阳县', + code: '131124', + children: null, + }, + { + name: '安平县', + code: '131125', + children: null, + }, + { + name: '故城县', + code: '131126', + children: null, + }, + { + name: '景县', + code: '131127', + children: null, + }, + { + name: '阜城县', + code: '131128', + children: null, + }, + { + name: '深州市', + code: '131182', + children: null, + }, + ], + }, + ], + }, + { + name: '山西省', + code: '140000', + children: [ + { + name: '太原市', + code: '140100', + children: [ + { + name: '小店区', + code: '140105', + children: null, + }, + { + name: '迎泽区', + code: '140106', + children: null, + }, + { + name: '杏花岭区', + code: '140107', + children: null, + }, + { + name: '尖草坪区', + code: '140108', + children: null, + }, + { + name: '万柏林区', + code: '140109', + children: null, + }, + { + name: '晋源区', + code: '140110', + children: null, + }, + { + name: '清徐县', + code: '140121', + children: null, + }, + { + name: '阳曲县', + code: '140122', + children: null, + }, + { + name: '娄烦县', + code: '140123', + children: null, + }, + { + name: '古交市', + code: '140181', + children: null, + }, + ], + }, + { + name: '大同市', + code: '140200', + children: [ + { + name: '新荣区', + code: '140212', + children: null, + }, + { + name: '平城区', + code: '140213', + children: null, + }, + { + name: '云冈区', + code: '140214', + children: null, + }, + { + name: '云州区', + code: '140215', + children: null, + }, + { + name: '阳高县', + code: '140221', + children: null, + }, + { + name: '天镇县', + code: '140222', + children: null, + }, + { + name: '广灵县', + code: '140223', + children: null, + }, + { + name: '灵丘县', + code: '140224', + children: null, + }, + { + name: '浑源县', + code: '140225', + children: null, + }, + { + name: '左云县', + code: '140226', + children: null, + }, + ], + }, + { + name: '阳泉市', + code: '140300', + children: [ + { + name: '城区', + code: '140302', + children: null, + }, + { + name: '矿区', + code: '140303', + children: null, + }, + { + name: '郊区', + code: '140311', + children: null, + }, + { + name: '平定县', + code: '140321', + children: null, + }, + { + name: '盂县', + code: '140322', + children: null, + }, + ], + }, + { + name: '长治市', + code: '140400', + children: [ + { + name: '潞州区', + code: '140403', + children: null, + }, + { + name: '上党区', + code: '140404', + children: null, + }, + { + name: '屯留区', + code: '140405', + children: null, + }, + { + name: '潞城区', + code: '140406', + children: null, + }, + { + name: '襄垣县', + code: '140423', + children: null, + }, + { + name: '平顺县', + code: '140425', + children: null, + }, + { + name: '黎城县', + code: '140426', + children: null, + }, + { + name: '壶关县', + code: '140427', + children: null, + }, + { + name: '长子县', + code: '140428', + children: null, + }, + { + name: '武乡县', + code: '140429', + children: null, + }, + { + name: '沁县', + code: '140430', + children: null, + }, + { + name: '沁源县', + code: '140431', + children: null, + }, + ], + }, + { + name: '晋城市', + code: '140500', + children: [ + { + name: '城区', + code: '140502', + children: null, + }, + { + name: '沁水县', + code: '140521', + children: null, + }, + { + name: '阳城县', + code: '140522', + children: null, + }, + { + name: '陵川县', + code: '140524', + children: null, + }, + { + name: '泽州县', + code: '140525', + children: null, + }, + { + name: '高平市', + code: '140581', + children: null, + }, + ], + }, + { + name: '朔州市', + code: '140600', + children: [ + { + name: '朔城区', + code: '140602', + children: null, + }, + { + name: '平鲁区', + code: '140603', + children: null, + }, + { + name: '山阴县', + code: '140621', + children: null, + }, + { + name: '应县', + code: '140622', + children: null, + }, + { + name: '右玉县', + code: '140623', + children: null, + }, + { + name: '怀仁市', + code: '140681', + children: null, + }, + ], + }, + { + name: '晋中市', + code: '140700', + children: [ + { + name: '榆次区', + code: '140702', + children: null, + }, + { + name: '榆社县', + code: '140721', + children: null, + }, + { + name: '左权县', + code: '140722', + children: null, + }, + { + name: '和顺县', + code: '140723', + children: null, + }, + { + name: '昔阳县', + code: '140724', + children: null, + }, + { + name: '寿阳县', + code: '140725', + children: null, + }, + { + name: '太谷县', + code: '140726', + children: null, + }, + { + name: '祁县', + code: '140727', + children: null, + }, + { + name: '平遥县', + code: '140728', + children: null, + }, + { + name: '灵石县', + code: '140729', + children: null, + }, + { + name: '介休市', + code: '140781', + children: null, + }, + ], + }, + { + name: '运城市', + code: '140800', + children: [ + { + name: '盐湖区', + code: '140802', + children: null, + }, + { + name: '临猗县', + code: '140821', + children: null, + }, + { + name: '万荣县', + code: '140822', + children: null, + }, + { + name: '闻喜县', + code: '140823', + children: null, + }, + { + name: '稷山县', + code: '140824', + children: null, + }, + { + name: '新绛县', + code: '140825', + children: null, + }, + { + name: '绛县', + code: '140826', + children: null, + }, + { + name: '垣曲县', + code: '140827', + children: null, + }, + { + name: '夏县', + code: '140828', + children: null, + }, + { + name: '平陆县', + code: '140829', + children: null, + }, + { + name: '芮城县', + code: '140830', + children: null, + }, + { + name: '永济市', + code: '140881', + children: null, + }, + { + name: '河津市', + code: '140882', + children: null, + }, + ], + }, + { + name: '忻州市', + code: '140900', + children: [ + { + name: '忻府区', + code: '140902', + children: null, + }, + { + name: '定襄县', + code: '140921', + children: null, + }, + { + name: '五台县', + code: '140922', + children: null, + }, + { + name: '代县', + code: '140923', + children: null, + }, + { + name: '繁峙县', + code: '140924', + children: null, + }, + { + name: '宁武县', + code: '140925', + children: null, + }, + { + name: '静乐县', + code: '140926', + children: null, + }, + { + name: '神池县', + code: '140927', + children: null, + }, + { + name: '五寨县', + code: '140928', + children: null, + }, + { + name: '岢岚县', + code: '140929', + children: null, + }, + { + name: '河曲县', + code: '140930', + children: null, + }, + { + name: '保德县', + code: '140931', + children: null, + }, + { + name: '偏关县', + code: '140932', + children: null, + }, + { + name: '原平市', + code: '140981', + children: null, + }, + ], + }, + { + name: '临汾市', + code: '141000', + children: [ + { + name: '尧都区', + code: '141002', + children: null, + }, + { + name: '曲沃县', + code: '141021', + children: null, + }, + { + name: '翼城县', + code: '141022', + children: null, + }, + { + name: '襄汾县', + code: '141023', + children: null, + }, + { + name: '洪洞县', + code: '141024', + children: null, + }, + { + name: '古县', + code: '141025', + children: null, + }, + { + name: '安泽县', + code: '141026', + children: null, + }, + { + name: '浮山县', + code: '141027', + children: null, + }, + { + name: '吉县', + code: '141028', + children: null, + }, + { + name: '乡宁县', + code: '141029', + children: null, + }, + { + name: '大宁县', + code: '141030', + children: null, + }, + { + name: '隰县', + code: '141031', + children: null, + }, + { + name: '永和县', + code: '141032', + children: null, + }, + { + name: '蒲县', + code: '141033', + children: null, + }, + { + name: '汾西县', + code: '141034', + children: null, + }, + { + name: '侯马市', + code: '141081', + children: null, + }, + { + name: '霍州市', + code: '141082', + children: null, + }, + ], + }, + { + name: '吕梁市', + code: '141100', + children: [ + { + name: '离石区', + code: '141102', + children: null, + }, + { + name: '文水县', + code: '141121', + children: null, + }, + { + name: '交城县', + code: '141122', + children: null, + }, + { + name: '兴县', + code: '141123', + children: null, + }, + { + name: '临县', + code: '141124', + children: null, + }, + { + name: '柳林县', + code: '141125', + children: null, + }, + { + name: '石楼县', + code: '141126', + children: null, + }, + { + name: '岚县', + code: '141127', + children: null, + }, + { + name: '方山县', + code: '141128', + children: null, + }, + { + name: '中阳县', + code: '141129', + children: null, + }, + { + name: '交口县', + code: '141130', + children: null, + }, + { + name: '孝义市', + code: '141181', + children: null, + }, + { + name: '汾阳市', + code: '141182', + children: null, + }, + ], + }, + ], + }, + { + name: '内蒙古自治区', + code: '150000', + children: [ + { + name: '呼和浩特市', + code: '150100', + children: [ + { + name: '新城区', + code: '150102', + children: null, + }, + { + name: '回民区', + code: '150103', + children: null, + }, + { + name: '玉泉区', + code: '150104', + children: null, + }, + { + name: '赛罕区', + code: '150105', + children: null, + }, + { + name: '土默特左旗', + code: '150121', + children: null, + }, + { + name: '托克托县', + code: '150122', + children: null, + }, + { + name: '和林格尔县', + code: '150123', + children: null, + }, + { + name: '清水河县', + code: '150124', + children: null, + }, + { + name: '武川县', + code: '150125', + children: null, + }, + ], + }, + { + name: '包头市', + code: '150200', + children: [ + { + name: '东河区', + code: '150202', + children: null, + }, + { + name: '昆都仑区', + code: '150203', + children: null, + }, + { + name: '青山区', + code: '150204', + children: null, + }, + { + name: '石拐区', + code: '150205', + children: null, + }, + { + name: '白云鄂博矿区', + code: '150206', + children: null, + }, + { + name: '九原区', + code: '150207', + children: null, + }, + { + name: '土默特右旗', + code: '150221', + children: null, + }, + { + name: '固阳县', + code: '150222', + children: null, + }, + { + name: '达尔罕茂明安联合旗', + code: '150223', + children: null, + }, + ], + }, + { + name: '乌海市', + code: '150300', + children: [ + { + name: '海勃湾区', + code: '150302', + children: null, + }, + { + name: '海南区', + code: '150303', + children: null, + }, + { + name: '乌达区', + code: '150304', + children: null, + }, + ], + }, + { + name: '赤峰市', + code: '150400', + children: [ + { + name: '红山区', + code: '150402', + children: null, + }, + { + name: '元宝山区', + code: '150403', + children: null, + }, + { + name: '松山区', + code: '150404', + children: null, + }, + { + name: '阿鲁科尔沁旗', + code: '150421', + children: null, + }, + { + name: '巴林左旗', + code: '150422', + children: null, + }, + { + name: '巴林右旗', + code: '150423', + children: null, + }, + { + name: '林西县', + code: '150424', + children: null, + }, + { + name: '克什克腾旗', + code: '150425', + children: null, + }, + { + name: '翁牛特旗', + code: '150426', + children: null, + }, + { + name: '喀喇沁旗', + code: '150428', + children: null, + }, + { + name: '宁城县', + code: '150429', + children: null, + }, + { + name: '敖汉旗', + code: '150430', + children: null, + }, + ], + }, + { + name: '通辽市', + code: '150500', + children: [ + { + name: '科尔沁区', + code: '150502', + children: null, + }, + { + name: '科尔沁左翼中旗', + code: '150521', + children: null, + }, + { + name: '科尔沁左翼后旗', + code: '150522', + children: null, + }, + { + name: '开鲁县', + code: '150523', + children: null, + }, + { + name: '库伦旗', + code: '150524', + children: null, + }, + { + name: '奈曼旗', + code: '150525', + children: null, + }, + { + name: '扎鲁特旗', + code: '150526', + children: null, + }, + { + name: '霍林郭勒市', + code: '150581', + children: null, + }, + ], + }, + { + name: '鄂尔多斯市', + code: '150600', + children: [ + { + name: '东胜区', + code: '150602', + children: null, + }, + { + name: '康巴什区', + code: '150603', + children: null, + }, + { + name: '达拉特旗', + code: '150621', + children: null, + }, + { + name: '准格尔旗', + code: '150622', + children: null, + }, + { + name: '鄂托克前旗', + code: '150623', + children: null, + }, + { + name: '鄂托克旗', + code: '150624', + children: null, + }, + { + name: '杭锦旗', + code: '150625', + children: null, + }, + { + name: '乌审旗', + code: '150626', + children: null, + }, + { + name: '伊金霍洛旗', + code: '150627', + children: null, + }, + ], + }, + { + name: '呼伦贝尔市', + code: '150700', + children: [ + { + name: '海拉尔区', + code: '150702', + children: null, + }, + { + name: '扎赉诺尔区', + code: '150703', + children: null, + }, + { + name: '阿荣旗', + code: '150721', + children: null, + }, + { + name: '莫力达瓦达斡尔族自治旗', + code: '150722', + children: null, + }, + { + name: '鄂伦春自治旗', + code: '150723', + children: null, + }, + { + name: '鄂温克族自治旗', + code: '150724', + children: null, + }, + { + name: '陈巴尔虎旗', + code: '150725', + children: null, + }, + { + name: '新巴尔虎左旗', + code: '150726', + children: null, + }, + { + name: '新巴尔虎右旗', + code: '150727', + children: null, + }, + { + name: '满洲里市', + code: '150781', + children: null, + }, + { + name: '牙克石市', + code: '150782', + children: null, + }, + { + name: '扎兰屯市', + code: '150783', + children: null, + }, + { + name: '额尔古纳市', + code: '150784', + children: null, + }, + { + name: '根河市', + code: '150785', + children: null, + }, + ], + }, + { + name: '巴彦淖尔市', + code: '150800', + children: [ + { + name: '临河区', + code: '150802', + children: null, + }, + { + name: '五原县', + code: '150821', + children: null, + }, + { + name: '磴口县', + code: '150822', + children: null, + }, + { + name: '乌拉特前旗', + code: '150823', + children: null, + }, + { + name: '乌拉特中旗', + code: '150824', + children: null, + }, + { + name: '乌拉特后旗', + code: '150825', + children: null, + }, + { + name: '杭锦后旗', + code: '150826', + children: null, + }, + ], + }, + { + name: '乌兰察布市', + code: '150900', + children: [ + { + name: '集宁区', + code: '150902', + children: null, + }, + { + name: '卓资县', + code: '150921', + children: null, + }, + { + name: '化德县', + code: '150922', + children: null, + }, + { + name: '商都县', + code: '150923', + children: null, + }, + { + name: '兴和县', + code: '150924', + children: null, + }, + { + name: '凉城县', + code: '150925', + children: null, + }, + { + name: '察哈尔右翼前旗', + code: '150926', + children: null, + }, + { + name: '察哈尔右翼中旗', + code: '150927', + children: null, + }, + { + name: '察哈尔右翼后旗', + code: '150928', + children: null, + }, + { + name: '四子王旗', + code: '150929', + children: null, + }, + { + name: '丰镇市', + code: '150981', + children: null, + }, + ], + }, + { + name: '兴安盟', + code: '152200', + children: [ + { + name: '乌兰浩特市', + code: '152201', + children: null, + }, + { + name: '阿尔山市', + code: '152202', + children: null, + }, + { + name: '科尔沁右翼前旗', + code: '152221', + children: null, + }, + { + name: '科尔沁右翼中旗', + code: '152222', + children: null, + }, + { + name: '扎赉特旗', + code: '152223', + children: null, + }, + { + name: '突泉县', + code: '152224', + children: null, + }, + ], + }, + { + name: '锡林郭勒盟', + code: '152500', + children: [ + { + name: '二连浩特市', + code: '152501', + children: null, + }, + { + name: '锡林浩特市', + code: '152502', + children: null, + }, + { + name: '阿巴嘎旗', + code: '152522', + children: null, + }, + { + name: '苏尼特左旗', + code: '152523', + children: null, + }, + { + name: '苏尼特右旗', + code: '152524', + children: null, + }, + { + name: '东乌珠穆沁旗', + code: '152525', + children: null, + }, + { + name: '西乌珠穆沁旗', + code: '152526', + children: null, + }, + { + name: '太仆寺旗', + code: '152527', + children: null, + }, + { + name: '镶黄旗', + code: '152528', + children: null, + }, + { + name: '正镶白旗', + code: '152529', + children: null, + }, + { + name: '正蓝旗', + code: '152530', + children: null, + }, + { + name: '多伦县', + code: '152531', + children: null, + }, + ], + }, + { + name: '阿拉善盟', + code: '152900', + children: [ + { + name: '阿拉善左旗', + code: '152921', + children: null, + }, + { + name: '阿拉善右旗', + code: '152922', + children: null, + }, + { + name: '额济纳旗', + code: '152923', + children: null, + }, + ], + }, + ], + }, + { + name: '辽宁省', + code: '210000', + children: [ + { + name: '沈阳市', + code: '210100', + children: [ + { + name: '和平区', + code: '210102', + children: null, + }, + { + name: '沈河区', + code: '210103', + children: null, + }, + { + name: '大东区', + code: '210104', + children: null, + }, + { + name: '皇姑区', + code: '210105', + children: null, + }, + { + name: '铁西区', + code: '210106', + children: null, + }, + { + name: '苏家屯区', + code: '210111', + children: null, + }, + { + name: '浑南区', + code: '210112', + children: null, + }, + { + name: '沈北新区', + code: '210113', + children: null, + }, + { + name: '于洪区', + code: '210114', + children: null, + }, + { + name: '辽中区', + code: '210115', + children: null, + }, + { + name: '康平县', + code: '210123', + children: null, + }, + { + name: '法库县', + code: '210124', + children: null, + }, + { + name: '新民市', + code: '210181', + children: null, + }, + ], + }, + { + name: '大连市', + code: '210200', + children: [ + { + name: '中山区', + code: '210202', + children: null, + }, + { + name: '西岗区', + code: '210203', + children: null, + }, + { + name: '沙河口区', + code: '210204', + children: null, + }, + { + name: '甘井子区', + code: '210211', + children: null, + }, + { + name: '旅顺口区', + code: '210212', + children: null, + }, + { + name: '金州区', + code: '210213', + children: null, + }, + { + name: '普兰店区', + code: '210214', + children: null, + }, + { + name: '长海县', + code: '210224', + children: null, + }, + { + name: '瓦房店市', + code: '210281', + children: null, + }, + { + name: '庄河市', + code: '210283', + children: null, + }, + ], + }, + { + name: '鞍山市', + code: '210300', + children: [ + { + name: '铁东区', + code: '210302', + children: null, + }, + { + name: '铁西区', + code: '210303', + children: null, + }, + { + name: '立山区', + code: '210304', + children: null, + }, + { + name: '千山区', + code: '210311', + children: null, + }, + { + name: '台安县', + code: '210321', + children: null, + }, + { + name: '岫岩满族自治县', + code: '210323', + children: null, + }, + { + name: '海城市', + code: '210381', + children: null, + }, + ], + }, + { + name: '抚顺市', + code: '210400', + children: [ + { + name: '新抚区', + code: '210402', + children: null, + }, + { + name: '东洲区', + code: '210403', + children: null, + }, + { + name: '望花区', + code: '210404', + children: null, + }, + { + name: '顺城区', + code: '210411', + children: null, + }, + { + name: '抚顺县', + code: '210421', + children: null, + }, + { + name: '新宾满族自治县', + code: '210422', + children: null, + }, + { + name: '清原满族自治县', + code: '210423', + children: null, + }, + ], + }, + { + name: '本溪市', + code: '210500', + children: [ + { + name: '平山区', + code: '210502', + children: null, + }, + { + name: '溪湖区', + code: '210503', + children: null, + }, + { + name: '明山区', + code: '210504', + children: null, + }, + { + name: '南芬区', + code: '210505', + children: null, + }, + { + name: '本溪满族自治县', + code: '210521', + children: null, + }, + { + name: '桓仁满族自治县', + code: '210522', + children: null, + }, + ], + }, + { + name: '丹东市', + code: '210600', + children: [ + { + name: '元宝区', + code: '210602', + children: null, + }, + { + name: '振兴区', + code: '210603', + children: null, + }, + { + name: '振安区', + code: '210604', + children: null, + }, + { + name: '宽甸满族自治县', + code: '210624', + children: null, + }, + { + name: '东港市', + code: '210681', + children: null, + }, + { + name: '凤城市', + code: '210682', + children: null, + }, + ], + }, + { + name: '锦州市', + code: '210700', + children: [ + { + name: '古塔区', + code: '210702', + children: null, + }, + { + name: '凌河区', + code: '210703', + children: null, + }, + { + name: '太和区', + code: '210711', + children: null, + }, + { + name: '黑山县', + code: '210726', + children: null, + }, + { + name: '义县', + code: '210727', + children: null, + }, + { + name: '凌海市', + code: '210781', + children: null, + }, + { + name: '北镇市', + code: '210782', + children: null, + }, + ], + }, + { + name: '营口市', + code: '210800', + children: [ + { + name: '站前区', + code: '210802', + children: null, + }, + { + name: '西市区', + code: '210803', + children: null, + }, + { + name: '鲅鱼圈区', + code: '210804', + children: null, + }, + { + name: '老边区', + code: '210811', + children: null, + }, + { + name: '盖州市', + code: '210881', + children: null, + }, + { + name: '大石桥市', + code: '210882', + children: null, + }, + ], + }, + { + name: '阜新市', + code: '210900', + children: [ + { + name: '海州区', + code: '210902', + children: null, + }, + { + name: '新邱区', + code: '210903', + children: null, + }, + { + name: '太平区', + code: '210904', + children: null, + }, + { + name: '清河门区', + code: '210905', + children: null, + }, + { + name: '细河区', + code: '210911', + children: null, + }, + { + name: '阜新蒙古族自治县', + code: '210921', + children: null, + }, + { + name: '彰武县', + code: '210922', + children: null, + }, + ], + }, + { + name: '辽阳市', + code: '211000', + children: [ + { + name: '白塔区', + code: '211002', + children: null, + }, + { + name: '文圣区', + code: '211003', + children: null, + }, + { + name: '宏伟区', + code: '211004', + children: null, + }, + { + name: '弓长岭区', + code: '211005', + children: null, + }, + { + name: '太子河区', + code: '211011', + children: null, + }, + { + name: '辽阳县', + code: '211021', + children: null, + }, + { + name: '灯塔市', + code: '211081', + children: null, + }, + ], + }, + { + name: '盘锦市', + code: '211100', + children: [ + { + name: '双台子区', + code: '211102', + children: null, + }, + { + name: '兴隆台区', + code: '211103', + children: null, + }, + { + name: '大洼区', + code: '211104', + children: null, + }, + { + name: '盘山县', + code: '211122', + children: null, + }, + ], + }, + { + name: '铁岭市', + code: '211200', + children: [ + { + name: '银州区', + code: '211202', + children: null, + }, + { + name: '清河区', + code: '211204', + children: null, + }, + { + name: '铁岭县', + code: '211221', + children: null, + }, + { + name: '西丰县', + code: '211223', + children: null, + }, + { + name: '昌图县', + code: '211224', + children: null, + }, + { + name: '调兵山市', + code: '211281', + children: null, + }, + { + name: '开原市', + code: '211282', + children: null, + }, + ], + }, + { + name: '朝阳市', + code: '211300', + children: [ + { + name: '双塔区', + code: '211302', + children: null, + }, + { + name: '龙城区', + code: '211303', + children: null, + }, + { + name: '朝阳县', + code: '211321', + children: null, + }, + { + name: '建平县', + code: '211322', + children: null, + }, + { + name: '喀喇沁左翼蒙古族自治县', + code: '211324', + children: null, + }, + { + name: '北票市', + code: '211381', + children: null, + }, + { + name: '凌源市', + code: '211382', + children: null, + }, + ], + }, + { + name: '葫芦岛市', + code: '211400', + children: [ + { + name: '连山区', + code: '211402', + children: null, + }, + { + name: '龙港区', + code: '211403', + children: null, + }, + { + name: '南票区', + code: '211404', + children: null, + }, + { + name: '绥中县', + code: '211421', + children: null, + }, + { + name: '建昌县', + code: '211422', + children: null, + }, + { + name: '兴城市', + code: '211481', + children: null, + }, + ], + }, + ], + }, + { + name: '吉林省', + code: '220000', + children: [ + { + name: '长春市', + code: '220100', + children: [ + { + name: '南关区', + code: '220102', + children: null, + }, + { + name: '宽城区', + code: '220103', + children: null, + }, + { + name: '朝阳区', + code: '220104', + children: null, + }, + { + name: '二道区', + code: '220105', + children: null, + }, + { + name: '绿园区', + code: '220106', + children: null, + }, + { + name: '双阳区', + code: '220112', + children: null, + }, + { + name: '九台区', + code: '220113', + children: null, + }, + { + name: '农安县', + code: '220122', + children: null, + }, + { + name: '榆树市', + code: '220182', + children: null, + }, + { + name: '德惠市', + code: '220183', + children: null, + }, + ], + }, + { + name: '吉林市', + code: '220200', + children: [ + { + name: '昌邑区', + code: '220202', + children: null, + }, + { + name: '龙潭区', + code: '220203', + children: null, + }, + { + name: '船营区', + code: '220204', + children: null, + }, + { + name: '丰满区', + code: '220211', + children: null, + }, + { + name: '永吉县', + code: '220221', + children: null, + }, + { + name: '蛟河市', + code: '220281', + children: null, + }, + { + name: '桦甸市', + code: '220282', + children: null, + }, + { + name: '舒兰市', + code: '220283', + children: null, + }, + { + name: '磐石市', + code: '220284', + children: null, + }, + ], + }, + { + name: '四平市', + code: '220300', + children: [ + { + name: '铁西区', + code: '220302', + children: null, + }, + { + name: '铁东区', + code: '220303', + children: null, + }, + { + name: '梨树县', + code: '220322', + children: null, + }, + { + name: '伊通满族自治县', + code: '220323', + children: null, + }, + { + name: '公主岭市', + code: '220381', + children: null, + }, + { + name: '双辽市', + code: '220382', + children: null, + }, + ], + }, + { + name: '辽源市', + code: '220400', + children: [ + { + name: '龙山区', + code: '220402', + children: null, + }, + { + name: '西安区', + code: '220403', + children: null, + }, + { + name: '东丰县', + code: '220421', + children: null, + }, + { + name: '东辽县', + code: '220422', + children: null, + }, + ], + }, + { + name: '通化市', + code: '220500', + children: [ + { + name: '东昌区', + code: '220502', + children: null, + }, + { + name: '二道江区', + code: '220503', + children: null, + }, + { + name: '通化县', + code: '220521', + children: null, + }, + { + name: '辉南县', + code: '220523', + children: null, + }, + { + name: '柳河县', + code: '220524', + children: null, + }, + { + name: '梅河口市', + code: '220581', + children: null, + }, + { + name: '集安市', + code: '220582', + children: null, + }, + ], + }, + { + name: '白山市', + code: '220600', + children: [ + { + name: '浑江区', + code: '220602', + children: null, + }, + { + name: '江源区', + code: '220605', + children: null, + }, + { + name: '抚松县', + code: '220621', + children: null, + }, + { + name: '靖宇县', + code: '220622', + children: null, + }, + { + name: '长白朝鲜族自治县', + code: '220623', + children: null, + }, + { + name: '临江市', + code: '220681', + children: null, + }, + ], + }, + { + name: '松原市', + code: '220700', + children: [ + { + name: '宁江区', + code: '220702', + children: null, + }, + { + name: '前郭尔罗斯蒙古族自治县', + code: '220721', + children: null, + }, + { + name: '长岭县', + code: '220722', + children: null, + }, + { + name: '乾安县', + code: '220723', + children: null, + }, + { + name: '扶余市', + code: '220781', + children: null, + }, + ], + }, + { + name: '白城市', + code: '220800', + children: [ + { + name: '洮北区', + code: '220802', + children: null, + }, + { + name: '镇赉县', + code: '220821', + children: null, + }, + { + name: '通榆县', + code: '220822', + children: null, + }, + { + name: '洮南市', + code: '220881', + children: null, + }, + { + name: '大安市', + code: '220882', + children: null, + }, + ], + }, + { + name: '延边朝鲜族自治州', + code: '222400', + children: [ + { + name: '延吉市', + code: '222401', + children: null, + }, + { + name: '图们市', + code: '222402', + children: null, + }, + { + name: '敦化市', + code: '222403', + children: null, + }, + { + name: '珲春市', + code: '222404', + children: null, + }, + { + name: '龙井市', + code: '222405', + children: null, + }, + { + name: '和龙市', + code: '222406', + children: null, + }, + { + name: '汪清县', + code: '222424', + children: null, + }, + { + name: '安图县', + code: '222426', + children: null, + }, + ], + }, + ], + }, + { + name: '黑龙江省', + code: '230000', + children: [ + { + name: '哈尔滨市', + code: '230100', + children: [ + { + name: '道里区', + code: '230102', + children: null, + }, + { + name: '南岗区', + code: '230103', + children: null, + }, + { + name: '道外区', + code: '230104', + children: null, + }, + { + name: '平房区', + code: '230108', + children: null, + }, + { + name: '松北区', + code: '230109', + children: null, + }, + { + name: '香坊区', + code: '230110', + children: null, + }, + { + name: '呼兰区', + code: '230111', + children: null, + }, + { + name: '阿城区', + code: '230112', + children: null, + }, + { + name: '双城区', + code: '230113', + children: null, + }, + { + name: '依兰县', + code: '230123', + children: null, + }, + { + name: '方正县', + code: '230124', + children: null, + }, + { + name: '宾县', + code: '230125', + children: null, + }, + { + name: '巴彦县', + code: '230126', + children: null, + }, + { + name: '木兰县', + code: '230127', + children: null, + }, + { + name: '通河县', + code: '230128', + children: null, + }, + { + name: '延寿县', + code: '230129', + children: null, + }, + { + name: '尚志市', + code: '230183', + children: null, + }, + { + name: '五常市', + code: '230184', + children: null, + }, + ], + }, + { + name: '齐齐哈尔市', + code: '230200', + children: [ + { + name: '龙沙区', + code: '230202', + children: null, + }, + { + name: '建华区', + code: '230203', + children: null, + }, + { + name: '铁锋区', + code: '230204', + children: null, + }, + { + name: '昂昂溪区', + code: '230205', + children: null, + }, + { + name: '富拉尔基区', + code: '230206', + children: null, + }, + { + name: '碾子山区', + code: '230207', + children: null, + }, + { + name: '梅里斯达斡尔族区', + code: '230208', + children: null, + }, + { + name: '龙江县', + code: '230221', + children: null, + }, + { + name: '依安县', + code: '230223', + children: null, + }, + { + name: '泰来县', + code: '230224', + children: null, + }, + { + name: '甘南县', + code: '230225', + children: null, + }, + { + name: '富裕县', + code: '230227', + children: null, + }, + { + name: '克山县', + code: '230229', + children: null, + }, + { + name: '克东县', + code: '230230', + children: null, + }, + { + name: '拜泉县', + code: '230231', + children: null, + }, + { + name: '讷河市', + code: '230281', + children: null, + }, + ], + }, + { + name: '鸡西市', + code: '230300', + children: [ + { + name: '鸡冠区', + code: '230302', + children: null, + }, + { + name: '恒山区', + code: '230303', + children: null, + }, + { + name: '滴道区', + code: '230304', + children: null, + }, + { + name: '梨树区', + code: '230305', + children: null, + }, + { + name: '城子河区', + code: '230306', + children: null, + }, + { + name: '麻山区', + code: '230307', + children: null, + }, + { + name: '鸡东县', + code: '230321', + children: null, + }, + { + name: '虎林市', + code: '230381', + children: null, + }, + { + name: '密山市', + code: '230382', + children: null, + }, + ], + }, + { + name: '鹤岗市', + code: '230400', + children: [ + { + name: '向阳区', + code: '230402', + children: null, + }, + { + name: '工农区', + code: '230403', + children: null, + }, + { + name: '南山区', + code: '230404', + children: null, + }, + { + name: '兴安区', + code: '230405', + children: null, + }, + { + name: '东山区', + code: '230406', + children: null, + }, + { + name: '兴山区', + code: '230407', + children: null, + }, + { + name: '萝北县', + code: '230421', + children: null, + }, + { + name: '绥滨县', + code: '230422', + children: null, + }, + ], + }, + { + name: '双鸭山市', + code: '230500', + children: [ + { + name: '尖山区', + code: '230502', + children: null, + }, + { + name: '岭东区', + code: '230503', + children: null, + }, + { + name: '四方台区', + code: '230505', + children: null, + }, + { + name: '宝山区', + code: '230506', + children: null, + }, + { + name: '集贤县', + code: '230521', + children: null, + }, + { + name: '友谊县', + code: '230522', + children: null, + }, + { + name: '宝清县', + code: '230523', + children: null, + }, + { + name: '饶河县', + code: '230524', + children: null, + }, + ], + }, + { + name: '大庆市', + code: '230600', + children: [ + { + name: '萨尔图区', + code: '230602', + children: null, + }, + { + name: '龙凤区', + code: '230603', + children: null, + }, + { + name: '让胡路区', + code: '230604', + children: null, + }, + { + name: '红岗区', + code: '230605', + children: null, + }, + { + name: '大同区', + code: '230606', + children: null, + }, + { + name: '肇州县', + code: '230621', + children: null, + }, + { + name: '肇源县', + code: '230622', + children: null, + }, + { + name: '林甸县', + code: '230623', + children: null, + }, + { + name: '杜尔伯特蒙古族自治县', + code: '230624', + children: null, + }, + ], + }, + { + name: '伊春市', + code: '230700', + children: [ + { + name: '伊春区', + code: '230702', + children: null, + }, + { + name: '南岔区', + code: '230703', + children: null, + }, + { + name: '友好区', + code: '230704', + children: null, + }, + { + name: '西林区', + code: '230705', + children: null, + }, + { + name: '翠峦区', + code: '230706', + children: null, + }, + { + name: '新青区', + code: '230707', + children: null, + }, + { + name: '美溪区', + code: '230708', + children: null, + }, + { + name: '金山屯区', + code: '230709', + children: null, + }, + { + name: '五营区', + code: '230710', + children: null, + }, + { + name: '乌马河区', + code: '230711', + children: null, + }, + { + name: '汤旺河区', + code: '230712', + children: null, + }, + { + name: '带岭区', + code: '230713', + children: null, + }, + { + name: '乌伊岭区', + code: '230714', + children: null, + }, + { + name: '红星区', + code: '230715', + children: null, + }, + { + name: '上甘岭区', + code: '230716', + children: null, + }, + { + name: '嘉荫县', + code: '230722', + children: null, + }, + { + name: '铁力市', + code: '230781', + children: null, + }, + ], + }, + { + name: '佳木斯市', + code: '230800', + children: [ + { + name: '向阳区', + code: '230803', + children: null, + }, + { + name: '前进区', + code: '230804', + children: null, + }, + { + name: '东风区', + code: '230805', + children: null, + }, + { + name: '郊区', + code: '230811', + children: null, + }, + { + name: '桦南县', + code: '230822', + children: null, + }, + { + name: '桦川县', + code: '230826', + children: null, + }, + { + name: '汤原县', + code: '230828', + children: null, + }, + { + name: '同江市', + code: '230881', + children: null, + }, + { + name: '富锦市', + code: '230882', + children: null, + }, + { + name: '抚远市', + code: '230883', + children: null, + }, + ], + }, + { + name: '七台河市', + code: '230900', + children: [ + { + name: '新兴区', + code: '230902', + children: null, + }, + { + name: '桃山区', + code: '230903', + children: null, + }, + { + name: '茄子河区', + code: '230904', + children: null, + }, + { + name: '勃利县', + code: '230921', + children: null, + }, + ], + }, + { + name: '牡丹江市', + code: '231000', + children: [ + { + name: '东安区', + code: '231002', + children: null, + }, + { + name: '阳明区', + code: '231003', + children: null, + }, + { + name: '爱民区', + code: '231004', + children: null, + }, + { + name: '西安区', + code: '231005', + children: null, + }, + { + name: '林口县', + code: '231025', + children: null, + }, + { + name: '绥芬河市', + code: '231081', + children: null, + }, + { + name: '海林市', + code: '231083', + children: null, + }, + { + name: '宁安市', + code: '231084', + children: null, + }, + { + name: '穆棱市', + code: '231085', + children: null, + }, + { + name: '东宁市', + code: '231086', + children: null, + }, + ], + }, + { + name: '黑河市', + code: '231100', + children: [ + { + name: '爱辉区', + code: '231102', + children: null, + }, + { + name: '嫩江县', + code: '231121', + children: null, + }, + { + name: '逊克县', + code: '231123', + children: null, + }, + { + name: '孙吴县', + code: '231124', + children: null, + }, + { + name: '北安市', + code: '231181', + children: null, + }, + { + name: '五大连池市', + code: '231182', + children: null, + }, + ], + }, + { + name: '绥化市', + code: '231200', + children: [ + { + name: '北林区', + code: '231202', + children: null, + }, + { + name: '望奎县', + code: '231221', + children: null, + }, + { + name: '兰西县', + code: '231222', + children: null, + }, + { + name: '青冈县', + code: '231223', + children: null, + }, + { + name: '庆安县', + code: '231224', + children: null, + }, + { + name: '明水县', + code: '231225', + children: null, + }, + { + name: '绥棱县', + code: '231226', + children: null, + }, + { + name: '安达市', + code: '231281', + children: null, + }, + { + name: '肇东市', + code: '231282', + children: null, + }, + { + name: '海伦市', + code: '231283', + children: null, + }, + ], + }, + { + name: '大兴安岭地区', + code: '232700', + children: [ + { + name: '漠河市', + code: '232701', + children: null, + }, + { + name: '呼玛县', + code: '232721', + children: null, + }, + { + name: '塔河县', + code: '232722', + children: null, + }, + ], + }, + ], + }, + { + name: '上海市', + code: '310000', + children: [ + { + name: '上海市', + code: '310100', + children: [ + { + name: '黄浦区', + code: '310101', + children: null, + }, + { + name: '徐汇区', + code: '310104', + children: null, + }, + { + name: '长宁区', + code: '310105', + children: null, + }, + { + name: '静安区', + code: '310106', + children: null, + }, + { + name: '普陀区', + code: '310107', + children: null, + }, + { + name: '虹口区', + code: '310109', + children: null, + }, + { + name: '杨浦区', + code: '310110', + children: null, + }, + { + name: '闵行区', + code: '310112', + children: null, + }, + { + name: '宝山区', + code: '310113', + children: null, + }, + { + name: '嘉定区', + code: '310114', + children: null, + }, + { + name: '浦东新区', + code: '310115', + children: null, + }, + { + name: '金山区', + code: '310116', + children: null, + }, + { + name: '松江区', + code: '310117', + children: null, + }, + { + name: '青浦区', + code: '310118', + children: null, + }, + { + name: '奉贤区', + code: '310120', + children: null, + }, + { + name: '崇明区', + code: '310151', + children: null, + }, + ], + }, + ], + }, + { + name: '江苏省', + code: '320000', + children: [ + { + name: '南京市', + code: '320100', + children: [ + { + name: '玄武区', + code: '320102', + children: null, + }, + { + name: '秦淮区', + code: '320104', + children: null, + }, + { + name: '建邺区', + code: '320105', + children: null, + }, + { + name: '鼓楼区', + code: '320106', + children: null, + }, + { + name: '浦口区', + code: '320111', + children: null, + }, + { + name: '栖霞区', + code: '320113', + children: null, + }, + { + name: '雨花台区', + code: '320114', + children: null, + }, + { + name: '江宁区', + code: '320115', + children: null, + }, + { + name: '六合区', + code: '320116', + children: null, + }, + { + name: '溧水区', + code: '320117', + children: null, + }, + { + name: '高淳区', + code: '320118', + children: null, + }, + ], + }, + { + name: '无锡市', + code: '320200', + children: [ + { + name: '锡山区', + code: '320205', + children: null, + }, + { + name: '惠山区', + code: '320206', + children: null, + }, + { + name: '滨湖区', + code: '320211', + children: null, + }, + { + name: '梁溪区', + code: '320213', + children: null, + }, + { + name: '新吴区', + code: '320214', + children: null, + }, + { + name: '江阴市', + code: '320281', + children: null, + }, + { + name: '宜兴市', + code: '320282', + children: null, + }, + ], + }, + { + name: '徐州市', + code: '320300', + children: [ + { + name: '鼓楼区', + code: '320302', + children: null, + }, + { + name: '云龙区', + code: '320303', + children: null, + }, + { + name: '贾汪区', + code: '320305', + children: null, + }, + { + name: '泉山区', + code: '320311', + children: null, + }, + { + name: '铜山区', + code: '320312', + children: null, + }, + { + name: '丰县', + code: '320321', + children: null, + }, + { + name: '沛县', + code: '320322', + children: null, + }, + { + name: '睢宁县', + code: '320324', + children: null, + }, + { + name: '新沂市', + code: '320381', + children: null, + }, + { + name: '邳州市', + code: '320382', + children: null, + }, + ], + }, + { + name: '常州市', + code: '320400', + children: [ + { + name: '天宁区', + code: '320402', + children: null, + }, + { + name: '钟楼区', + code: '320404', + children: null, + }, + { + name: '新北区', + code: '320411', + children: null, + }, + { + name: '武进区', + code: '320412', + children: null, + }, + { + name: '金坛区', + code: '320413', + children: null, + }, + { + name: '溧阳市', + code: '320481', + children: null, + }, + ], + }, + { + name: '苏州市', + code: '320500', + children: [ + { + name: '虎丘区', + code: '320505', + children: null, + }, + { + name: '吴中区', + code: '320506', + children: null, + }, + { + name: '相城区', + code: '320507', + children: null, + }, + { + name: '姑苏区', + code: '320508', + children: null, + }, + { + name: '吴江区', + code: '320509', + children: null, + }, + { + name: '常熟市', + code: '320581', + children: null, + }, + { + name: '张家港市', + code: '320582', + children: null, + }, + { + name: '昆山市', + code: '320583', + children: null, + }, + { + name: '太仓市', + code: '320585', + children: null, + }, + ], + }, + { + name: '南通市', + code: '320600', + children: [ + { + name: '崇川区', + code: '320602', + children: null, + }, + { + name: '港闸区', + code: '320611', + children: null, + }, + { + name: '通州区', + code: '320612', + children: null, + }, + { + name: '如东县', + code: '320623', + children: null, + }, + { + name: '启东市', + code: '320681', + children: null, + }, + { + name: '如皋市', + code: '320682', + children: null, + }, + { + name: '海门市', + code: '320684', + children: null, + }, + { + name: '海安市', + code: '320685', + children: null, + }, + ], + }, + { + name: '连云港市', + code: '320700', + children: [ + { + name: '连云区', + code: '320703', + children: null, + }, + { + name: '海州区', + code: '320706', + children: null, + }, + { + name: '赣榆区', + code: '320707', + children: null, + }, + { + name: '东海县', + code: '320722', + children: null, + }, + { + name: '灌云县', + code: '320723', + children: null, + }, + { + name: '灌南县', + code: '320724', + children: null, + }, + ], + }, + { + name: '淮安市', + code: '320800', + children: [ + { + name: '淮安区', + code: '320803', + children: null, + }, + { + name: '淮阴区', + code: '320804', + children: null, + }, + { + name: '清江浦区', + code: '320812', + children: null, + }, + { + name: '洪泽区', + code: '320813', + children: null, + }, + { + name: '涟水县', + code: '320826', + children: null, + }, + { + name: '盱眙县', + code: '320830', + children: null, + }, + { + name: '金湖县', + code: '320831', + children: null, + }, + ], + }, + { + name: '盐城市', + code: '320900', + children: [ + { + name: '亭湖区', + code: '320902', + children: null, + }, + { + name: '盐都区', + code: '320903', + children: null, + }, + { + name: '大丰区', + code: '320904', + children: null, + }, + { + name: '响水县', + code: '320921', + children: null, + }, + { + name: '滨海县', + code: '320922', + children: null, + }, + { + name: '阜宁县', + code: '320923', + children: null, + }, + { + name: '射阳县', + code: '320924', + children: null, + }, + { + name: '建湖县', + code: '320925', + children: null, + }, + { + name: '东台市', + code: '320981', + children: null, + }, + ], + }, + { + name: '扬州市', + code: '321000', + children: [ + { + name: '广陵区', + code: '321002', + children: null, + }, + { + name: '邗江区', + code: '321003', + children: null, + }, + { + name: '江都区', + code: '321012', + children: null, + }, + { + name: '宝应县', + code: '321023', + children: null, + }, + { + name: '仪征市', + code: '321081', + children: null, + }, + { + name: '高邮市', + code: '321084', + children: null, + }, + ], + }, + { + name: '镇江市', + code: '321100', + children: [ + { + name: '京口区', + code: '321102', + children: null, + }, + { + name: '润州区', + code: '321111', + children: null, + }, + { + name: '丹徒区', + code: '321112', + children: null, + }, + { + name: '丹阳市', + code: '321181', + children: null, + }, + { + name: '扬中市', + code: '321182', + children: null, + }, + { + name: '句容市', + code: '321183', + children: null, + }, + ], + }, + { + name: '泰州市', + code: '321200', + children: [ + { + name: '海陵区', + code: '321202', + children: null, + }, + { + name: '高港区', + code: '321203', + children: null, + }, + { + name: '姜堰区', + code: '321204', + children: null, + }, + { + name: '兴化市', + code: '321281', + children: null, + }, + { + name: '靖江市', + code: '321282', + children: null, + }, + { + name: '泰兴市', + code: '321283', + children: null, + }, + ], + }, + { + name: '宿迁市', + code: '321300', + children: [ + { + name: '宿城区', + code: '321302', + children: null, + }, + { + name: '宿豫区', + code: '321311', + children: null, + }, + { + name: '沭阳县', + code: '321322', + children: null, + }, + { + name: '泗阳县', + code: '321323', + children: null, + }, + { + name: '泗洪县', + code: '321324', + children: null, + }, + ], + }, + ], + }, + { + name: '浙江省', + code: '330000', + children: [ + { + name: '杭州市', + code: '330100', + children: [ + { + name: '上城区', + code: '330102', + children: null, + }, + { + name: '下城区', + code: '330103', + children: null, + }, + { + name: '江干区', + code: '330104', + children: null, + }, + { + name: '拱墅区', + code: '330105', + children: null, + }, + { + name: '西湖区', + code: '330106', + children: null, + }, + { + name: '滨江区', + code: '330108', + children: null, + }, + { + name: '萧山区', + code: '330109', + children: null, + }, + { + name: '余杭区', + code: '330110', + children: null, + }, + { + name: '富阳区', + code: '330111', + children: null, + }, + { + name: '临安区', + code: '330112', + children: null, + }, + { + name: '桐庐县', + code: '330122', + children: null, + }, + { + name: '淳安县', + code: '330127', + children: null, + }, + { + name: '建德市', + code: '330182', + children: null, + }, + ], + }, + { + name: '宁波市', + code: '330200', + children: [ + { + name: '海曙区', + code: '330203', + children: null, + }, + { + name: '江北区', + code: '330205', + children: null, + }, + { + name: '北仑区', + code: '330206', + children: null, + }, + { + name: '镇海区', + code: '330211', + children: null, + }, + { + name: '鄞州区', + code: '330212', + children: null, + }, + { + name: '奉化区', + code: '330213', + children: null, + }, + { + name: '象山县', + code: '330225', + children: null, + }, + { + name: '宁海县', + code: '330226', + children: null, + }, + { + name: '余姚市', + code: '330281', + children: null, + }, + { + name: '慈溪市', + code: '330282', + children: null, + }, + ], + }, + { + name: '温州市', + code: '330300', + children: [ + { + name: '鹿城区', + code: '330302', + children: null, + }, + { + name: '龙湾区', + code: '330303', + children: null, + }, + { + name: '瓯海区', + code: '330304', + children: null, + }, + { + name: '洞头区', + code: '330305', + children: null, + }, + { + name: '永嘉县', + code: '330324', + children: null, + }, + { + name: '平阳县', + code: '330326', + children: null, + }, + { + name: '苍南县', + code: '330327', + children: null, + }, + { + name: '文成县', + code: '330328', + children: null, + }, + { + name: '泰顺县', + code: '330329', + children: null, + }, + { + name: '瑞安市', + code: '330381', + children: null, + }, + { + name: '乐清市', + code: '330382', + children: null, + }, + ], + }, + { + name: '嘉兴市', + code: '330400', + children: [ + { + name: '南湖区', + code: '330402', + children: null, + }, + { + name: '秀洲区', + code: '330411', + children: null, + }, + { + name: '嘉善县', + code: '330421', + children: null, + }, + { + name: '海盐县', + code: '330424', + children: null, + }, + { + name: '海宁市', + code: '330481', + children: null, + }, + { + name: '平湖市', + code: '330482', + children: null, + }, + { + name: '桐乡市', + code: '330483', + children: null, + }, + ], + }, + { + name: '湖州市', + code: '330500', + children: [ + { + name: '吴兴区', + code: '330502', + children: null, + }, + { + name: '南浔区', + code: '330503', + children: null, + }, + { + name: '德清县', + code: '330521', + children: null, + }, + { + name: '长兴县', + code: '330522', + children: null, + }, + { + name: '安吉县', + code: '330523', + children: null, + }, + ], + }, + { + name: '绍兴市', + code: '330600', + children: [ + { + name: '越城区', + code: '330602', + children: null, + }, + { + name: '柯桥区', + code: '330603', + children: null, + }, + { + name: '上虞区', + code: '330604', + children: null, + }, + { + name: '新昌县', + code: '330624', + children: null, + }, + { + name: '诸暨市', + code: '330681', + children: null, + }, + { + name: '嵊州市', + code: '330683', + children: null, + }, + ], + }, + { + name: '金华市', + code: '330700', + children: [ + { + name: '婺城区', + code: '330702', + children: null, + }, + { + name: '金东区', + code: '330703', + children: null, + }, + { + name: '武义县', + code: '330723', + children: null, + }, + { + name: '浦江县', + code: '330726', + children: null, + }, + { + name: '磐安县', + code: '330727', + children: null, + }, + { + name: '兰溪市', + code: '330781', + children: null, + }, + { + name: '义乌市', + code: '330782', + children: null, + }, + { + name: '东阳市', + code: '330783', + children: null, + }, + { + name: '永康市', + code: '330784', + children: null, + }, + ], + }, + { + name: '衢州市', + code: '330800', + children: [ + { + name: '柯城区', + code: '330802', + children: null, + }, + { + name: '衢江区', + code: '330803', + children: null, + }, + { + name: '常山县', + code: '330822', + children: null, + }, + { + name: '开化县', + code: '330824', + children: null, + }, + { + name: '龙游县', + code: '330825', + children: null, + }, + { + name: '江山市', + code: '330881', + children: null, + }, + ], + }, + { + name: '舟山市', + code: '330900', + children: [ + { + name: '定海区', + code: '330902', + children: null, + }, + { + name: '普陀区', + code: '330903', + children: null, + }, + { + name: '岱山县', + code: '330921', + children: null, + }, + { + name: '嵊泗县', + code: '330922', + children: null, + }, + ], + }, + { + name: '台州市', + code: '331000', + children: [ + { + name: '椒江区', + code: '331002', + children: null, + }, + { + name: '黄岩区', + code: '331003', + children: null, + }, + { + name: '路桥区', + code: '331004', + children: null, + }, + { + name: '三门县', + code: '331022', + children: null, + }, + { + name: '天台县', + code: '331023', + children: null, + }, + { + name: '仙居县', + code: '331024', + children: null, + }, + { + name: '温岭市', + code: '331081', + children: null, + }, + { + name: '临海市', + code: '331082', + children: null, + }, + { + name: '玉环市', + code: '331083', + children: null, + }, + ], + }, + { + name: '丽水市', + code: '331100', + children: [ + { + name: '莲都区', + code: '331102', + children: null, + }, + { + name: '青田县', + code: '331121', + children: null, + }, + { + name: '缙云县', + code: '331122', + children: null, + }, + { + name: '遂昌县', + code: '331123', + children: null, + }, + { + name: '松阳县', + code: '331124', + children: null, + }, + { + name: '云和县', + code: '331125', + children: null, + }, + { + name: '庆元县', + code: '331126', + children: null, + }, + { + name: '景宁畲族自治县', + code: '331127', + children: null, + }, + { + name: '龙泉市', + code: '331181', + children: null, + }, + ], + }, + ], + }, + { + name: '安徽省', + code: '340000', + children: [ + { + name: '合肥市', + code: '340100', + children: [ + { + name: '瑶海区', + code: '340102', + children: null, + }, + { + name: '庐阳区', + code: '340103', + children: null, + }, + { + name: '蜀山区', + code: '340104', + children: null, + }, + { + name: '包河区', + code: '340111', + children: null, + }, + { + name: '长丰县', + code: '340121', + children: null, + }, + { + name: '肥东县', + code: '340122', + children: null, + }, + { + name: '肥西县', + code: '340123', + children: null, + }, + { + name: '庐江县', + code: '340124', + children: null, + }, + { + name: '巢湖市', + code: '340181', + children: null, + }, + ], + }, + { + name: '芜湖市', + code: '340200', + children: [ + { + name: '镜湖区', + code: '340202', + children: null, + }, + { + name: '弋江区', + code: '340203', + children: null, + }, + { + name: '鸠江区', + code: '340207', + children: null, + }, + { + name: '三山区', + code: '340208', + children: null, + }, + { + name: '芜湖县', + code: '340221', + children: null, + }, + { + name: '繁昌县', + code: '340222', + children: null, + }, + { + name: '南陵县', + code: '340223', + children: null, + }, + { + name: '无为县', + code: '340225', + children: null, + }, + ], + }, + { + name: '蚌埠市', + code: '340300', + children: [ + { + name: '龙子湖区', + code: '340302', + children: null, + }, + { + name: '蚌山区', + code: '340303', + children: null, + }, + { + name: '禹会区', + code: '340304', + children: null, + }, + { + name: '淮上区', + code: '340311', + children: null, + }, + { + name: '怀远县', + code: '340321', + children: null, + }, + { + name: '五河县', + code: '340322', + children: null, + }, + { + name: '固镇县', + code: '340323', + children: null, + }, + ], + }, + { + name: '淮南市', + code: '340400', + children: [ + { + name: '大通区', + code: '340402', + children: null, + }, + { + name: '田家庵区', + code: '340403', + children: null, + }, + { + name: '谢家集区', + code: '340404', + children: null, + }, + { + name: '八公山区', + code: '340405', + children: null, + }, + { + name: '潘集区', + code: '340406', + children: null, + }, + { + name: '凤台县', + code: '340421', + children: null, + }, + { + name: '寿县', + code: '340422', + children: null, + }, + ], + }, + { + name: '马鞍山市', + code: '340500', + children: [ + { + name: '花山区', + code: '340503', + children: null, + }, + { + name: '雨山区', + code: '340504', + children: null, + }, + { + name: '博望区', + code: '340506', + children: null, + }, + { + name: '当涂县', + code: '340521', + children: null, + }, + { + name: '含山县', + code: '340522', + children: null, + }, + { + name: '和县', + code: '340523', + children: null, + }, + ], + }, + { + name: '淮北市', + code: '340600', + children: [ + { + name: '杜集区', + code: '340602', + children: null, + }, + { + name: '相山区', + code: '340603', + children: null, + }, + { + name: '烈山区', + code: '340604', + children: null, + }, + { + name: '濉溪县', + code: '340621', + children: null, + }, + ], + }, + { + name: '铜陵市', + code: '340700', + children: [ + { + name: '铜官区', + code: '340705', + children: null, + }, + { + name: '义安区', + code: '340706', + children: null, + }, + { + name: '郊区', + code: '340711', + children: null, + }, + { + name: '枞阳县', + code: '340722', + children: null, + }, + ], + }, + { + name: '安庆市', + code: '340800', + children: [ + { + name: '迎江区', + code: '340802', + children: null, + }, + { + name: '大观区', + code: '340803', + children: null, + }, + { + name: '宜秀区', + code: '340811', + children: null, + }, + { + name: '怀宁县', + code: '340822', + children: null, + }, + { + name: '太湖县', + code: '340825', + children: null, + }, + { + name: '宿松县', + code: '340826', + children: null, + }, + { + name: '望江县', + code: '340827', + children: null, + }, + { + name: '岳西县', + code: '340828', + children: null, + }, + { + name: '桐城市', + code: '340881', + children: null, + }, + { + name: '潜山市', + code: '340882', + children: null, + }, + ], + }, + { + name: '黄山市', + code: '341000', + children: [ + { + name: '屯溪区', + code: '341002', + children: null, + }, + { + name: '黄山区', + code: '341003', + children: null, + }, + { + name: '徽州区', + code: '341004', + children: null, + }, + { + name: '歙县', + code: '341021', + children: null, + }, + { + name: '休宁县', + code: '341022', + children: null, + }, + { + name: '黟县', + code: '341023', + children: null, + }, + { + name: '祁门县', + code: '341024', + children: null, + }, + ], + }, + { + name: '滁州市', + code: '341100', + children: [ + { + name: '琅琊区', + code: '341102', + children: null, + }, + { + name: '南谯区', + code: '341103', + children: null, + }, + { + name: '来安县', + code: '341122', + children: null, + }, + { + name: '全椒县', + code: '341124', + children: null, + }, + { + name: '定远县', + code: '341125', + children: null, + }, + { + name: '凤阳县', + code: '341126', + children: null, + }, + { + name: '天长市', + code: '341181', + children: null, + }, + { + name: '明光市', + code: '341182', + children: null, + }, + ], + }, + { + name: '阜阳市', + code: '341200', + children: [ + { + name: '颍州区', + code: '341202', + children: null, + }, + { + name: '颍东区', + code: '341203', + children: null, + }, + { + name: '颍泉区', + code: '341204', + children: null, + }, + { + name: '临泉县', + code: '341221', + children: null, + }, + { + name: '太和县', + code: '341222', + children: null, + }, + { + name: '阜南县', + code: '341225', + children: null, + }, + { + name: '颍上县', + code: '341226', + children: null, + }, + { + name: '界首市', + code: '341282', + children: null, + }, + ], + }, + { + name: '宿州市', + code: '341300', + children: [ + { + name: '埇桥区', + code: '341302', + children: null, + }, + { + name: '砀山县', + code: '341321', + children: null, + }, + { + name: '萧县', + code: '341322', + children: null, + }, + { + name: '灵璧县', + code: '341323', + children: null, + }, + { + name: '泗县', + code: '341324', + children: null, + }, + ], + }, + { + name: '六安市', + code: '341500', + children: [ + { + name: '金安区', + code: '341502', + children: null, + }, + { + name: '裕安区', + code: '341503', + children: null, + }, + { + name: '叶集区', + code: '341504', + children: null, + }, + { + name: '霍邱县', + code: '341522', + children: null, + }, + { + name: '舒城县', + code: '341523', + children: null, + }, + { + name: '金寨县', + code: '341524', + children: null, + }, + { + name: '霍山县', + code: '341525', + children: null, + }, + ], + }, + { + name: '亳州市', + code: '341600', + children: [ + { + name: '谯城区', + code: '341602', + children: null, + }, + { + name: '涡阳县', + code: '341621', + children: null, + }, + { + name: '蒙城县', + code: '341622', + children: null, + }, + { + name: '利辛县', + code: '341623', + children: null, + }, + ], + }, + { + name: '池州市', + code: '341700', + children: [ + { + name: '贵池区', + code: '341702', + children: null, + }, + { + name: '东至县', + code: '341721', + children: null, + }, + { + name: '石台县', + code: '341722', + children: null, + }, + { + name: '青阳县', + code: '341723', + children: null, + }, + ], + }, + { + name: '宣城市', + code: '341800', + children: [ + { + name: '宣州区', + code: '341802', + children: null, + }, + { + name: '郎溪县', + code: '341821', + children: null, + }, + { + name: '广德县', + code: '341822', + children: null, + }, + { + name: '泾县', + code: '341823', + children: null, + }, + { + name: '绩溪县', + code: '341824', + children: null, + }, + { + name: '旌德县', + code: '341825', + children: null, + }, + { + name: '宁国市', + code: '341881', + children: null, + }, + ], + }, + ], + }, + { + name: '福建省', + code: '350000', + children: [ + { + name: '福州市', + code: '350100', + children: [ + { + name: '鼓楼区', + code: '350102', + children: null, + }, + { + name: '台江区', + code: '350103', + children: null, + }, + { + name: '仓山区', + code: '350104', + children: null, + }, + { + name: '马尾区', + code: '350105', + children: null, + }, + { + name: '晋安区', + code: '350111', + children: null, + }, + { + name: '长乐区', + code: '350112', + children: null, + }, + { + name: '闽侯县', + code: '350121', + children: null, + }, + { + name: '连江县', + code: '350122', + children: null, + }, + { + name: '罗源县', + code: '350123', + children: null, + }, + { + name: '闽清县', + code: '350124', + children: null, + }, + { + name: '永泰县', + code: '350125', + children: null, + }, + { + name: '平潭县', + code: '350128', + children: null, + }, + { + name: '福清市', + code: '350181', + children: null, + }, + ], + }, + { + name: '厦门市', + code: '350200', + children: [ + { + name: '思明区', + code: '350203', + children: null, + }, + { + name: '海沧区', + code: '350205', + children: null, + }, + { + name: '湖里区', + code: '350206', + children: null, + }, + { + name: '集美区', + code: '350211', + children: null, + }, + { + name: '同安区', + code: '350212', + children: null, + }, + { + name: '翔安区', + code: '350213', + children: null, + }, + ], + }, + { + name: '莆田市', + code: '350300', + children: [ + { + name: '城厢区', + code: '350302', + children: null, + }, + { + name: '涵江区', + code: '350303', + children: null, + }, + { + name: '荔城区', + code: '350304', + children: null, + }, + { + name: '秀屿区', + code: '350305', + children: null, + }, + { + name: '仙游县', + code: '350322', + children: null, + }, + ], + }, + { + name: '三明市', + code: '350400', + children: [ + { + name: '梅列区', + code: '350402', + children: null, + }, + { + name: '三元区', + code: '350403', + children: null, + }, + { + name: '明溪县', + code: '350421', + children: null, + }, + { + name: '清流县', + code: '350423', + children: null, + }, + { + name: '宁化县', + code: '350424', + children: null, + }, + { + name: '大田县', + code: '350425', + children: null, + }, + { + name: '尤溪县', + code: '350426', + children: null, + }, + { + name: '沙县', + code: '350427', + children: null, + }, + { + name: '将乐县', + code: '350428', + children: null, + }, + { + name: '泰宁县', + code: '350429', + children: null, + }, + { + name: '建宁县', + code: '350430', + children: null, + }, + { + name: '永安市', + code: '350481', + children: null, + }, + ], + }, + { + name: '泉州市', + code: '350500', + children: [ + { + name: '鲤城区', + code: '350502', + children: null, + }, + { + name: '丰泽区', + code: '350503', + children: null, + }, + { + name: '洛江区', + code: '350504', + children: null, + }, + { + name: '泉港区', + code: '350505', + children: null, + }, + { + name: '惠安县', + code: '350521', + children: null, + }, + { + name: '安溪县', + code: '350524', + children: null, + }, + { + name: '永春县', + code: '350525', + children: null, + }, + { + name: '德化县', + code: '350526', + children: null, + }, + { + name: '金门县', + code: '350527', + children: null, + }, + { + name: '石狮市', + code: '350581', + children: null, + }, + { + name: '晋江市', + code: '350582', + children: null, + }, + { + name: '南安市', + code: '350583', + children: null, + }, + ], + }, + { + name: '漳州市', + code: '350600', + children: [ + { + name: '芗城区', + code: '350602', + children: null, + }, + { + name: '龙文区', + code: '350603', + children: null, + }, + { + name: '云霄县', + code: '350622', + children: null, + }, + { + name: '漳浦县', + code: '350623', + children: null, + }, + { + name: '诏安县', + code: '350624', + children: null, + }, + { + name: '长泰县', + code: '350625', + children: null, + }, + { + name: '东山县', + code: '350626', + children: null, + }, + { + name: '南靖县', + code: '350627', + children: null, + }, + { + name: '平和县', + code: '350628', + children: null, + }, + { + name: '华安县', + code: '350629', + children: null, + }, + { + name: '龙海市', + code: '350681', + children: null, + }, + ], + }, + { + name: '南平市', + code: '350700', + children: [ + { + name: '延平区', + code: '350702', + children: null, + }, + { + name: '建阳区', + code: '350703', + children: null, + }, + { + name: '顺昌县', + code: '350721', + children: null, + }, + { + name: '浦城县', + code: '350722', + children: null, + }, + { + name: '光泽县', + code: '350723', + children: null, + }, + { + name: '松溪县', + code: '350724', + children: null, + }, + { + name: '政和县', + code: '350725', + children: null, + }, + { + name: '邵武市', + code: '350781', + children: null, + }, + { + name: '武夷山市', + code: '350782', + children: null, + }, + { + name: '建瓯市', + code: '350783', + children: null, + }, + ], + }, + { + name: '龙岩市', + code: '350800', + children: [ + { + name: '新罗区', + code: '350802', + children: null, + }, + { + name: '永定区', + code: '350803', + children: null, + }, + { + name: '长汀县', + code: '350821', + children: null, + }, + { + name: '上杭县', + code: '350823', + children: null, + }, + { + name: '武平县', + code: '350824', + children: null, + }, + { + name: '连城县', + code: '350825', + children: null, + }, + { + name: '漳平市', + code: '350881', + children: null, + }, + ], + }, + { + name: '宁德市', + code: '350900', + children: [ + { + name: '蕉城区', + code: '350902', + children: null, + }, + { + name: '霞浦县', + code: '350921', + children: null, + }, + { + name: '古田县', + code: '350922', + children: null, + }, + { + name: '屏南县', + code: '350923', + children: null, + }, + { + name: '寿宁县', + code: '350924', + children: null, + }, + { + name: '周宁县', + code: '350925', + children: null, + }, + { + name: '柘荣县', + code: '350926', + children: null, + }, + { + name: '福安市', + code: '350981', + children: null, + }, + { + name: '福鼎市', + code: '350982', + children: null, + }, + ], + }, + ], + }, + { + name: '江西省', + code: '360000', + children: [ + { + name: '南昌市', + code: '360100', + children: [ + { + name: '东湖区', + code: '360102', + children: null, + }, + { + name: '西湖区', + code: '360103', + children: null, + }, + { + name: '青云谱区', + code: '360104', + children: null, + }, + { + name: '湾里区', + code: '360105', + children: null, + }, + { + name: '青山湖区', + code: '360111', + children: null, + }, + { + name: '新建区', + code: '360112', + children: null, + }, + { + name: '南昌县', + code: '360121', + children: null, + }, + { + name: '安义县', + code: '360123', + children: null, + }, + { + name: '进贤县', + code: '360124', + children: null, + }, + ], + }, + { + name: '景德镇市', + code: '360200', + children: [ + { + name: '昌江区', + code: '360202', + children: null, + }, + { + name: '珠山区', + code: '360203', + children: null, + }, + { + name: '浮梁县', + code: '360222', + children: null, + }, + { + name: '乐平市', + code: '360281', + children: null, + }, + ], + }, + { + name: '萍乡市', + code: '360300', + children: [ + { + name: '安源区', + code: '360302', + children: null, + }, + { + name: '湘东区', + code: '360313', + children: null, + }, + { + name: '莲花县', + code: '360321', + children: null, + }, + { + name: '上栗县', + code: '360322', + children: null, + }, + { + name: '芦溪县', + code: '360323', + children: null, + }, + ], + }, + { + name: '九江市', + code: '360400', + children: [ + { + name: '濂溪区', + code: '360402', + children: null, + }, + { + name: '浔阳区', + code: '360403', + children: null, + }, + { + name: '柴桑区', + code: '360404', + children: null, + }, + { + name: '武宁县', + code: '360423', + children: null, + }, + { + name: '修水县', + code: '360424', + children: null, + }, + { + name: '永修县', + code: '360425', + children: null, + }, + { + name: '德安县', + code: '360426', + children: null, + }, + { + name: '都昌县', + code: '360428', + children: null, + }, + { + name: '湖口县', + code: '360429', + children: null, + }, + { + name: '彭泽县', + code: '360430', + children: null, + }, + { + name: '瑞昌市', + code: '360481', + children: null, + }, + { + name: '共青城市', + code: '360482', + children: null, + }, + { + name: '庐山市', + code: '360483', + children: null, + }, + ], + }, + { + name: '新余市', + code: '360500', + children: [ + { + name: '渝水区', + code: '360502', + children: null, + }, + { + name: '分宜县', + code: '360521', + children: null, + }, + ], + }, + { + name: '鹰潭市', + code: '360600', + children: [ + { + name: '月湖区', + code: '360602', + children: null, + }, + { + name: '余江区', + code: '360603', + children: null, + }, + { + name: '贵溪市', + code: '360681', + children: null, + }, + ], + }, + { + name: '赣州市', + code: '360700', + children: [ + { + name: '章贡区', + code: '360702', + children: null, + }, + { + name: '南康区', + code: '360703', + children: null, + }, + { + name: '赣县区', + code: '360704', + children: null, + }, + { + name: '信丰县', + code: '360722', + children: null, + }, + { + name: '大余县', + code: '360723', + children: null, + }, + { + name: '上犹县', + code: '360724', + children: null, + }, + { + name: '崇义县', + code: '360725', + children: null, + }, + { + name: '安远县', + code: '360726', + children: null, + }, + { + name: '龙南县', + code: '360727', + children: null, + }, + { + name: '定南县', + code: '360728', + children: null, + }, + { + name: '全南县', + code: '360729', + children: null, + }, + { + name: '宁都县', + code: '360730', + children: null, + }, + { + name: '于都县', + code: '360731', + children: null, + }, + { + name: '兴国县', + code: '360732', + children: null, + }, + { + name: '会昌县', + code: '360733', + children: null, + }, + { + name: '寻乌县', + code: '360734', + children: null, + }, + { + name: '石城县', + code: '360735', + children: null, + }, + { + name: '瑞金市', + code: '360781', + children: null, + }, + ], + }, + { + name: '吉安市', + code: '360800', + children: [ + { + name: '吉州区', + code: '360802', + children: null, + }, + { + name: '青原区', + code: '360803', + children: null, + }, + { + name: '吉安县', + code: '360821', + children: null, + }, + { + name: '吉水县', + code: '360822', + children: null, + }, + { + name: '峡江县', + code: '360823', + children: null, + }, + { + name: '新干县', + code: '360824', + children: null, + }, + { + name: '永丰县', + code: '360825', + children: null, + }, + { + name: '泰和县', + code: '360826', + children: null, + }, + { + name: '遂川县', + code: '360827', + children: null, + }, + { + name: '万安县', + code: '360828', + children: null, + }, + { + name: '安福县', + code: '360829', + children: null, + }, + { + name: '永新县', + code: '360830', + children: null, + }, + { + name: '井冈山市', + code: '360881', + children: null, + }, + ], + }, + { + name: '宜春市', + code: '360900', + children: [ + { + name: '袁州区', + code: '360902', + children: null, + }, + { + name: '奉新县', + code: '360921', + children: null, + }, + { + name: '万载县', + code: '360922', + children: null, + }, + { + name: '上高县', + code: '360923', + children: null, + }, + { + name: '宜丰县', + code: '360924', + children: null, + }, + { + name: '靖安县', + code: '360925', + children: null, + }, + { + name: '铜鼓县', + code: '360926', + children: null, + }, + { + name: '丰城市', + code: '360981', + children: null, + }, + { + name: '樟树市', + code: '360982', + children: null, + }, + { + name: '高安市', + code: '360983', + children: null, + }, + ], + }, + { + name: '抚州市', + code: '361000', + children: [ + { + name: '临川区', + code: '361002', + children: null, + }, + { + name: '东乡区', + code: '361003', + children: null, + }, + { + name: '南城县', + code: '361021', + children: null, + }, + { + name: '黎川县', + code: '361022', + children: null, + }, + { + name: '南丰县', + code: '361023', + children: null, + }, + { + name: '崇仁县', + code: '361024', + children: null, + }, + { + name: '乐安县', + code: '361025', + children: null, + }, + { + name: '宜黄县', + code: '361026', + children: null, + }, + { + name: '金溪县', + code: '361027', + children: null, + }, + { + name: '资溪县', + code: '361028', + children: null, + }, + { + name: '广昌县', + code: '361030', + children: null, + }, + ], + }, + { + name: '上饶市', + code: '361100', + children: [ + { + name: '信州区', + code: '361102', + children: null, + }, + { + name: '广丰区', + code: '361103', + children: null, + }, + { + name: '上饶县', + code: '361121', + children: null, + }, + { + name: '玉山县', + code: '361123', + children: null, + }, + { + name: '铅山县', + code: '361124', + children: null, + }, + { + name: '横峰县', + code: '361125', + children: null, + }, + { + name: '弋阳县', + code: '361126', + children: null, + }, + { + name: '余干县', + code: '361127', + children: null, + }, + { + name: '鄱阳县', + code: '361128', + children: null, + }, + { + name: '万年县', + code: '361129', + children: null, + }, + { + name: '婺源县', + code: '361130', + children: null, + }, + { + name: '德兴市', + code: '361181', + children: null, + }, + ], + }, + ], + }, + { + name: '山东省', + code: '370000', + children: [ + { + name: '济南市', + code: '370100', + children: [ + { + name: '历下区', + code: '370102', + children: null, + }, + { + name: '市中区', + code: '370103', + children: null, + }, + { + name: '槐荫区', + code: '370104', + children: null, + }, + { + name: '天桥区', + code: '370105', + children: null, + }, + { + name: '历城区', + code: '370112', + children: null, + }, + { + name: '长清区', + code: '370113', + children: null, + }, + { + name: '章丘区', + code: '370114', + children: null, + }, + { + name: '济阳区', + code: '370115', + children: null, + }, + { + name: '莱芜区', + code: '370116', + children: null, + }, + { + name: '钢城区', + code: '370117', + children: null, + }, + { + name: '平阴县', + code: '370124', + children: null, + }, + { + name: '商河县', + code: '370126', + children: null, + }, + ], + }, + { + name: '青岛市', + code: '370200', + children: [ + { + name: '市南区', + code: '370202', + children: null, + }, + { + name: '市北区', + code: '370203', + children: null, + }, + { + name: '黄岛区', + code: '370211', + children: null, + }, + { + name: '崂山区', + code: '370212', + children: null, + }, + { + name: '李沧区', + code: '370213', + children: null, + }, + { + name: '城阳区', + code: '370214', + children: null, + }, + { + name: '即墨区', + code: '370215', + children: null, + }, + { + name: '胶州市', + code: '370281', + children: null, + }, + { + name: '平度市', + code: '370283', + children: null, + }, + { + name: '莱西市', + code: '370285', + children: null, + }, + ], + }, + { + name: '淄博市', + code: '370300', + children: [ + { + name: '淄川区', + code: '370302', + children: null, + }, + { + name: '张店区', + code: '370303', + children: null, + }, + { + name: '博山区', + code: '370304', + children: null, + }, + { + name: '临淄区', + code: '370305', + children: null, + }, + { + name: '周村区', + code: '370306', + children: null, + }, + { + name: '桓台县', + code: '370321', + children: null, + }, + { + name: '高青县', + code: '370322', + children: null, + }, + { + name: '沂源县', + code: '370323', + children: null, + }, + ], + }, + { + name: '枣庄市', + code: '370400', + children: [ + { + name: '市中区', + code: '370402', + children: null, + }, + { + name: '薛城区', + code: '370403', + children: null, + }, + { + name: '峄城区', + code: '370404', + children: null, + }, + { + name: '台儿庄区', + code: '370405', + children: null, + }, + { + name: '山亭区', + code: '370406', + children: null, + }, + { + name: '滕州市', + code: '370481', + children: null, + }, + ], + }, + { + name: '东营市', + code: '370500', + children: [ + { + name: '东营区', + code: '370502', + children: null, + }, + { + name: '河口区', + code: '370503', + children: null, + }, + { + name: '垦利区', + code: '370505', + children: null, + }, + { + name: '利津县', + code: '370522', + children: null, + }, + { + name: '广饶县', + code: '370523', + children: null, + }, + ], + }, + { + name: '烟台市', + code: '370600', + children: [ + { + name: '芝罘区', + code: '370602', + children: null, + }, + { + name: '福山区', + code: '370611', + children: null, + }, + { + name: '牟平区', + code: '370612', + children: null, + }, + { + name: '莱山区', + code: '370613', + children: null, + }, + { + name: '长岛县', + code: '370634', + children: null, + }, + { + name: '龙口市', + code: '370681', + children: null, + }, + { + name: '莱阳市', + code: '370682', + children: null, + }, + { + name: '莱州市', + code: '370683', + children: null, + }, + { + name: '蓬莱市', + code: '370684', + children: null, + }, + { + name: '招远市', + code: '370685', + children: null, + }, + { + name: '栖霞市', + code: '370686', + children: null, + }, + { + name: '海阳市', + code: '370687', + children: null, + }, + ], + }, + { + name: '潍坊市', + code: '370700', + children: [ + { + name: '潍城区', + code: '370702', + children: null, + }, + { + name: '寒亭区', + code: '370703', + children: null, + }, + { + name: '坊子区', + code: '370704', + children: null, + }, + { + name: '奎文区', + code: '370705', + children: null, + }, + { + name: '临朐县', + code: '370724', + children: null, + }, + { + name: '昌乐县', + code: '370725', + children: null, + }, + { + name: '青州市', + code: '370781', + children: null, + }, + { + name: '诸城市', + code: '370782', + children: null, + }, + { + name: '寿光市', + code: '370783', + children: null, + }, + { + name: '安丘市', + code: '370784', + children: null, + }, + { + name: '高密市', + code: '370785', + children: null, + }, + { + name: '昌邑市', + code: '370786', + children: null, + }, + ], + }, + { + name: '济宁市', + code: '370800', + children: [ + { + name: '任城区', + code: '370811', + children: null, + }, + { + name: '兖州区', + code: '370812', + children: null, + }, + { + name: '微山县', + code: '370826', + children: null, + }, + { + name: '鱼台县', + code: '370827', + children: null, + }, + { + name: '金乡县', + code: '370828', + children: null, + }, + { + name: '嘉祥县', + code: '370829', + children: null, + }, + { + name: '汶上县', + code: '370830', + children: null, + }, + { + name: '泗水县', + code: '370831', + children: null, + }, + { + name: '梁山县', + code: '370832', + children: null, + }, + { + name: '曲阜市', + code: '370881', + children: null, + }, + { + name: '邹城市', + code: '370883', + children: null, + }, + ], + }, + { + name: '泰安市', + code: '370900', + children: [ + { + name: '泰山区', + code: '370902', + children: null, + }, + { + name: '岱岳区', + code: '370911', + children: null, + }, + { + name: '宁阳县', + code: '370921', + children: null, + }, + { + name: '东平县', + code: '370923', + children: null, + }, + { + name: '新泰市', + code: '370982', + children: null, + }, + { + name: '肥城市', + code: '370983', + children: null, + }, + ], + }, + { + name: '威海市', + code: '371000', + children: [ + { + name: '环翠区', + code: '371002', + children: null, + }, + { + name: '文登区', + code: '371003', + children: null, + }, + { + name: '荣成市', + code: '371082', + children: null, + }, + { + name: '乳山市', + code: '371083', + children: null, + }, + ], + }, + { + name: '日照市', + code: '371100', + children: [ + { + name: '东港区', + code: '371102', + children: null, + }, + { + name: '岚山区', + code: '371103', + children: null, + }, + { + name: '五莲县', + code: '371121', + children: null, + }, + { + name: '莒县', + code: '371122', + children: null, + }, + ], + }, + { + name: '临沂市', + code: '371300', + children: [ + { + name: '兰山区', + code: '371302', + children: null, + }, + { + name: '罗庄区', + code: '371311', + children: null, + }, + { + name: '河东区', + code: '371312', + children: null, + }, + { + name: '沂南县', + code: '371321', + children: null, + }, + { + name: '郯城县', + code: '371322', + children: null, + }, + { + name: '沂水县', + code: '371323', + children: null, + }, + { + name: '兰陵县', + code: '371324', + children: null, + }, + { + name: '费县', + code: '371325', + children: null, + }, + { + name: '平邑县', + code: '371326', + children: null, + }, + { + name: '莒南县', + code: '371327', + children: null, + }, + { + name: '蒙阴县', + code: '371328', + children: null, + }, + { + name: '临沭县', + code: '371329', + children: null, + }, + ], + }, + { + name: '德州市', + code: '371400', + children: [ + { + name: '德城区', + code: '371402', + children: null, + }, + { + name: '陵城区', + code: '371403', + children: null, + }, + { + name: '宁津县', + code: '371422', + children: null, + }, + { + name: '庆云县', + code: '371423', + children: null, + }, + { + name: '临邑县', + code: '371424', + children: null, + }, + { + name: '齐河县', + code: '371425', + children: null, + }, + { + name: '平原县', + code: '371426', + children: null, + }, + { + name: '夏津县', + code: '371427', + children: null, + }, + { + name: '武城县', + code: '371428', + children: null, + }, + { + name: '乐陵市', + code: '371481', + children: null, + }, + { + name: '禹城市', + code: '371482', + children: null, + }, + ], + }, + { + name: '聊城市', + code: '371500', + children: [ + { + name: '东昌府区', + code: '371502', + children: null, + }, + { + name: '阳谷县', + code: '371521', + children: null, + }, + { + name: '莘县', + code: '371522', + children: null, + }, + { + name: '茌平县', + code: '371523', + children: null, + }, + { + name: '东阿县', + code: '371524', + children: null, + }, + { + name: '冠县', + code: '371525', + children: null, + }, + { + name: '高唐县', + code: '371526', + children: null, + }, + { + name: '临清市', + code: '371581', + children: null, + }, + ], + }, + { + name: '滨州市', + code: '371600', + children: [ + { + name: '滨城区', + code: '371602', + children: null, + }, + { + name: '沾化区', + code: '371603', + children: null, + }, + { + name: '惠民县', + code: '371621', + children: null, + }, + { + name: '阳信县', + code: '371622', + children: null, + }, + { + name: '无棣县', + code: '371623', + children: null, + }, + { + name: '博兴县', + code: '371625', + children: null, + }, + { + name: '邹平市', + code: '371681', + children: null, + }, + ], + }, + { + name: '菏泽市', + code: '371700', + children: [ + { + name: '牡丹区', + code: '371702', + children: null, + }, + { + name: '定陶区', + code: '371703', + children: null, + }, + { + name: '曹县', + code: '371721', + children: null, + }, + { + name: '单县', + code: '371722', + children: null, + }, + { + name: '成武县', + code: '371723', + children: null, + }, + { + name: '巨野县', + code: '371724', + children: null, + }, + { + name: '郓城县', + code: '371725', + children: null, + }, + { + name: '鄄城县', + code: '371726', + children: null, + }, + { + name: '东明县', + code: '371728', + children: null, + }, + ], + }, + ], + }, + { + name: '河南省', + code: '410000', + children: [ + { + name: '郑州市', + code: '410100', + children: [ + { + name: '中原区', + code: '410102', + children: null, + }, + { + name: '二七区', + code: '410103', + children: null, + }, + { + name: '管城回族区', + code: '410104', + children: null, + }, + { + name: '金水区', + code: '410105', + children: null, + }, + { + name: '上街区', + code: '410106', + children: null, + }, + { + name: '惠济区', + code: '410108', + children: null, + }, + { + name: '中牟县', + code: '410122', + children: null, + }, + { + name: '巩义市', + code: '410181', + children: null, + }, + { + name: '荥阳市', + code: '410182', + children: null, + }, + { + name: '新密市', + code: '410183', + children: null, + }, + { + name: '新郑市', + code: '410184', + children: null, + }, + { + name: '登封市', + code: '410185', + children: null, + }, + ], + }, + { + name: '开封市', + code: '410200', + children: [ + { + name: '龙亭区', + code: '410202', + children: null, + }, + { + name: '顺河回族区', + code: '410203', + children: null, + }, + { + name: '鼓楼区', + code: '410204', + children: null, + }, + { + name: '禹王台区', + code: '410205', + children: null, + }, + { + name: '祥符区', + code: '410212', + children: null, + }, + { + name: '杞县', + code: '410221', + children: null, + }, + { + name: '通许县', + code: '410222', + children: null, + }, + { + name: '尉氏县', + code: '410223', + children: null, + }, + { + name: '兰考县', + code: '410225', + children: null, + }, + ], + }, + { + name: '洛阳市', + code: '410300', + children: [ + { + name: '老城区', + code: '410302', + children: null, + }, + { + name: '西工区', + code: '410303', + children: null, + }, + { + name: '瀍河回族区', + code: '410304', + children: null, + }, + { + name: '涧西区', + code: '410305', + children: null, + }, + { + name: '吉利区', + code: '410306', + children: null, + }, + { + name: '洛龙区', + code: '410311', + children: null, + }, + { + name: '孟津县', + code: '410322', + children: null, + }, + { + name: '新安县', + code: '410323', + children: null, + }, + { + name: '栾川县', + code: '410324', + children: null, + }, + { + name: '嵩县', + code: '410325', + children: null, + }, + { + name: '汝阳县', + code: '410326', + children: null, + }, + { + name: '宜阳县', + code: '410327', + children: null, + }, + { + name: '洛宁县', + code: '410328', + children: null, + }, + { + name: '伊川县', + code: '410329', + children: null, + }, + { + name: '偃师市', + code: '410381', + children: null, + }, + ], + }, + { + name: '平顶山市', + code: '410400', + children: [ + { + name: '新华区', + code: '410402', + children: null, + }, + { + name: '卫东区', + code: '410403', + children: null, + }, + { + name: '石龙区', + code: '410404', + children: null, + }, + { + name: '湛河区', + code: '410411', + children: null, + }, + { + name: '宝丰县', + code: '410421', + children: null, + }, + { + name: '叶县', + code: '410422', + children: null, + }, + { + name: '鲁山县', + code: '410423', + children: null, + }, + { + name: '郏县', + code: '410425', + children: null, + }, + { + name: '舞钢市', + code: '410481', + children: null, + }, + { + name: '汝州市', + code: '410482', + children: null, + }, + ], + }, + { + name: '安阳市', + code: '410500', + children: [ + { + name: '文峰区', + code: '410502', + children: null, + }, + { + name: '北关区', + code: '410503', + children: null, + }, + { + name: '殷都区', + code: '410505', + children: null, + }, + { + name: '龙安区', + code: '410506', + children: null, + }, + { + name: '安阳县', + code: '410522', + children: null, + }, + { + name: '汤阴县', + code: '410523', + children: null, + }, + { + name: '滑县', + code: '410526', + children: null, + }, + { + name: '内黄县', + code: '410527', + children: null, + }, + { + name: '林州市', + code: '410581', + children: null, + }, + ], + }, + { + name: '鹤壁市', + code: '410600', + children: [ + { + name: '鹤山区', + code: '410602', + children: null, + }, + { + name: '山城区', + code: '410603', + children: null, + }, + { + name: '淇滨区', + code: '410611', + children: null, + }, + { + name: '浚县', + code: '410621', + children: null, + }, + { + name: '淇县', + code: '410622', + children: null, + }, + ], + }, + { + name: '新乡市', + code: '410700', + children: [ + { + name: '红旗区', + code: '410702', + children: null, + }, + { + name: '卫滨区', + code: '410703', + children: null, + }, + { + name: '凤泉区', + code: '410704', + children: null, + }, + { + name: '牧野区', + code: '410711', + children: null, + }, + { + name: '新乡县', + code: '410721', + children: null, + }, + { + name: '获嘉县', + code: '410724', + children: null, + }, + { + name: '原阳县', + code: '410725', + children: null, + }, + { + name: '延津县', + code: '410726', + children: null, + }, + { + name: '封丘县', + code: '410727', + children: null, + }, + { + name: '长垣县', + code: '410728', + children: null, + }, + { + name: '卫辉市', + code: '410781', + children: null, + }, + { + name: '辉县市', + code: '410782', + children: null, + }, + ], + }, + { + name: '焦作市', + code: '410800', + children: [ + { + name: '解放区', + code: '410802', + children: null, + }, + { + name: '中站区', + code: '410803', + children: null, + }, + { + name: '马村区', + code: '410804', + children: null, + }, + { + name: '山阳区', + code: '410811', + children: null, + }, + { + name: '修武县', + code: '410821', + children: null, + }, + { + name: '博爱县', + code: '410822', + children: null, + }, + { + name: '武陟县', + code: '410823', + children: null, + }, + { + name: '温县', + code: '410825', + children: null, + }, + { + name: '沁阳市', + code: '410882', + children: null, + }, + { + name: '孟州市', + code: '410883', + children: null, + }, + ], + }, + { + name: '濮阳市', + code: '410900', + children: [ + { + name: '华龙区', + code: '410902', + children: null, + }, + { + name: '清丰县', + code: '410922', + children: null, + }, + { + name: '南乐县', + code: '410923', + children: null, + }, + { + name: '范县', + code: '410926', + children: null, + }, + { + name: '台前县', + code: '410927', + children: null, + }, + { + name: '濮阳县', + code: '410928', + children: null, + }, + ], + }, + { + name: '许昌市', + code: '411000', + children: [ + { + name: '魏都区', + code: '411002', + children: null, + }, + { + name: '建安区', + code: '411003', + children: null, + }, + { + name: '鄢陵县', + code: '411024', + children: null, + }, + { + name: '襄城县', + code: '411025', + children: null, + }, + { + name: '禹州市', + code: '411081', + children: null, + }, + { + name: '长葛市', + code: '411082', + children: null, + }, + ], + }, + { + name: '漯河市', + code: '411100', + children: [ + { + name: '源汇区', + code: '411102', + children: null, + }, + { + name: '郾城区', + code: '411103', + children: null, + }, + { + name: '召陵区', + code: '411104', + children: null, + }, + { + name: '舞阳县', + code: '411121', + children: null, + }, + { + name: '临颍县', + code: '411122', + children: null, + }, + ], + }, + { + name: '三门峡市', + code: '411200', + children: [ + { + name: '湖滨区', + code: '411202', + children: null, + }, + { + name: '陕州区', + code: '411203', + children: null, + }, + { + name: '渑池县', + code: '411221', + children: null, + }, + { + name: '卢氏县', + code: '411224', + children: null, + }, + { + name: '义马市', + code: '411281', + children: null, + }, + { + name: '灵宝市', + code: '411282', + children: null, + }, + ], + }, + { + name: '南阳市', + code: '411300', + children: [ + { + name: '宛城区', + code: '411302', + children: null, + }, + { + name: '卧龙区', + code: '411303', + children: null, + }, + { + name: '南召县', + code: '411321', + children: null, + }, + { + name: '方城县', + code: '411322', + children: null, + }, + { + name: '西峡县', + code: '411323', + children: null, + }, + { + name: '镇平县', + code: '411324', + children: null, + }, + { + name: '内乡县', + code: '411325', + children: null, + }, + { + name: '淅川县', + code: '411326', + children: null, + }, + { + name: '社旗县', + code: '411327', + children: null, + }, + { + name: '唐河县', + code: '411328', + children: null, + }, + { + name: '新野县', + code: '411329', + children: null, + }, + { + name: '桐柏县', + code: '411330', + children: null, + }, + { + name: '邓州市', + code: '411381', + children: null, + }, + ], + }, + { + name: '商丘市', + code: '411400', + children: [ + { + name: '梁园区', + code: '411402', + children: null, + }, + { + name: '睢阳区', + code: '411403', + children: null, + }, + { + name: '民权县', + code: '411421', + children: null, + }, + { + name: '睢县', + code: '411422', + children: null, + }, + { + name: '宁陵县', + code: '411423', + children: null, + }, + { + name: '柘城县', + code: '411424', + children: null, + }, + { + name: '虞城县', + code: '411425', + children: null, + }, + { + name: '夏邑县', + code: '411426', + children: null, + }, + { + name: '永城市', + code: '411481', + children: null, + }, + ], + }, + { + name: '信阳市', + code: '411500', + children: [ + { + name: '浉河区', + code: '411502', + children: null, + }, + { + name: '平桥区', + code: '411503', + children: null, + }, + { + name: '罗山县', + code: '411521', + children: null, + }, + { + name: '光山县', + code: '411522', + children: null, + }, + { + name: '新县', + code: '411523', + children: null, + }, + { + name: '商城县', + code: '411524', + children: null, + }, + { + name: '固始县', + code: '411525', + children: null, + }, + { + name: '潢川县', + code: '411526', + children: null, + }, + { + name: '淮滨县', + code: '411527', + children: null, + }, + { + name: '息县', + code: '411528', + children: null, + }, + ], + }, + { + name: '周口市', + code: '411600', + children: [ + { + name: '川汇区', + code: '411602', + children: null, + }, + { + name: '扶沟县', + code: '411621', + children: null, + }, + { + name: '西华县', + code: '411622', + children: null, + }, + { + name: '商水县', + code: '411623', + children: null, + }, + { + name: '沈丘县', + code: '411624', + children: null, + }, + { + name: '郸城县', + code: '411625', + children: null, + }, + { + name: '淮阳县', + code: '411626', + children: null, + }, + { + name: '太康县', + code: '411627', + children: null, + }, + { + name: '鹿邑县', + code: '411628', + children: null, + }, + { + name: '项城市', + code: '411681', + children: null, + }, + ], + }, + { + name: '驻马店市', + code: '411700', + children: [ + { + name: '驿城区', + code: '411702', + children: null, + }, + { + name: '西平县', + code: '411721', + children: null, + }, + { + name: '上蔡县', + code: '411722', + children: null, + }, + { + name: '平舆县', + code: '411723', + children: null, + }, + { + name: '正阳县', + code: '411724', + children: null, + }, + { + name: '确山县', + code: '411725', + children: null, + }, + { + name: '泌阳县', + code: '411726', + children: null, + }, + { + name: '汝南县', + code: '411727', + children: null, + }, + { + name: '遂平县', + code: '411728', + children: null, + }, + { + name: '新蔡县', + code: '411729', + children: null, + }, + ], + }, + { + name: '济源市', + code: '419001', + children: [ + { + name: '沁园街道', + code: '419001001', + children: null, + }, + { + name: '济水街道', + code: '419001002', + children: null, + }, + { + name: '北海街道', + code: '419001003', + children: null, + }, + { + name: '天坛街道', + code: '419001004', + children: null, + }, + { + name: '玉泉街道', + code: '419001005', + children: null, + }, + { + name: '克井镇', + code: '419001100', + children: null, + }, + { + name: '五龙口镇', + code: '419001101', + children: null, + }, + { + name: '轵城镇', + code: '419001102', + children: null, + }, + { + name: '承留镇', + code: '419001103', + children: null, + }, + { + name: '邵原镇', + code: '419001104', + children: null, + }, + { + name: '坡头镇', + code: '419001105', + children: null, + }, + { + name: '梨林镇', + code: '419001106', + children: null, + }, + { + name: '大峪镇', + code: '419001107', + children: null, + }, + { + name: '思礼镇', + code: '419001108', + children: null, + }, + { + name: '王屋镇', + code: '419001109', + children: null, + }, + { + name: '下冶镇', + code: '419001110', + children: null, + }, + ], + }, + ], + }, + { + name: '湖北省', + code: '420000', + children: [ + { + name: '武汉市', + code: '420100', + children: [ + { + name: '江岸区', + code: '420102', + children: null, + }, + { + name: '江汉区', + code: '420103', + children: null, + }, + { + name: '硚口区', + code: '420104', + children: null, + }, + { + name: '汉阳区', + code: '420105', + children: null, + }, + { + name: '武昌区', + code: '420106', + children: null, + }, + { + name: '青山区', + code: '420107', + children: null, + }, + { + name: '洪山区', + code: '420111', + children: null, + }, + { + name: '东西湖区', + code: '420112', + children: null, + }, + { + name: '汉南区', + code: '420113', + children: null, + }, + { + name: '蔡甸区', + code: '420114', + children: null, + }, + { + name: '江夏区', + code: '420115', + children: null, + }, + { + name: '黄陂区', + code: '420116', + children: null, + }, + { + name: '新洲区', + code: '420117', + children: null, + }, + ], + }, + { + name: '黄石市', + code: '420200', + children: [ + { + name: '黄石港区', + code: '420202', + children: null, + }, + { + name: '西塞山区', + code: '420203', + children: null, + }, + { + name: '下陆区', + code: '420204', + children: null, + }, + { + name: '铁山区', + code: '420205', + children: null, + }, + { + name: '阳新县', + code: '420222', + children: null, + }, + { + name: '大冶市', + code: '420281', + children: null, + }, + ], + }, + { + name: '十堰市', + code: '420300', + children: [ + { + name: '茅箭区', + code: '420302', + children: null, + }, + { + name: '张湾区', + code: '420303', + children: null, + }, + { + name: '郧阳区', + code: '420304', + children: null, + }, + { + name: '郧西县', + code: '420322', + children: null, + }, + { + name: '竹山县', + code: '420323', + children: null, + }, + { + name: '竹溪县', + code: '420324', + children: null, + }, + { + name: '房县', + code: '420325', + children: null, + }, + { + name: '丹江口市', + code: '420381', + children: null, + }, + ], + }, + { + name: '宜昌市', + code: '420500', + children: [ + { + name: '西陵区', + code: '420502', + children: null, + }, + { + name: '伍家岗区', + code: '420503', + children: null, + }, + { + name: '点军区', + code: '420504', + children: null, + }, + { + name: '猇亭区', + code: '420505', + children: null, + }, + { + name: '夷陵区', + code: '420506', + children: null, + }, + { + name: '远安县', + code: '420525', + children: null, + }, + { + name: '兴山县', + code: '420526', + children: null, + }, + { + name: '秭归县', + code: '420527', + children: null, + }, + { + name: '长阳土家族自治县', + code: '420528', + children: null, + }, + { + name: '五峰土家族自治县', + code: '420529', + children: null, + }, + { + name: '宜都市', + code: '420581', + children: null, + }, + { + name: '当阳市', + code: '420582', + children: null, + }, + { + name: '枝江市', + code: '420583', + children: null, + }, + ], + }, + { + name: '襄阳市', + code: '420600', + children: [ + { + name: '襄城区', + code: '420602', + children: null, + }, + { + name: '樊城区', + code: '420606', + children: null, + }, + { + name: '襄州区', + code: '420607', + children: null, + }, + { + name: '南漳县', + code: '420624', + children: null, + }, + { + name: '谷城县', + code: '420625', + children: null, + }, + { + name: '保康县', + code: '420626', + children: null, + }, + { + name: '老河口市', + code: '420682', + children: null, + }, + { + name: '枣阳市', + code: '420683', + children: null, + }, + { + name: '宜城市', + code: '420684', + children: null, + }, + ], + }, + { + name: '鄂州市', + code: '420700', + children: [ + { + name: '梁子湖区', + code: '420702', + children: null, + }, + { + name: '华容区', + code: '420703', + children: null, + }, + { + name: '鄂城区', + code: '420704', + children: null, + }, + ], + }, + { + name: '荆门市', + code: '420800', + children: [ + { + name: '东宝区', + code: '420802', + children: null, + }, + { + name: '掇刀区', + code: '420804', + children: null, + }, + { + name: '沙洋县', + code: '420822', + children: null, + }, + { + name: '钟祥市', + code: '420881', + children: null, + }, + { + name: '京山市', + code: '420882', + children: null, + }, + ], + }, + { + name: '孝感市', + code: '420900', + children: [ + { + name: '孝南区', + code: '420902', + children: null, + }, + { + name: '孝昌县', + code: '420921', + children: null, + }, + { + name: '大悟县', + code: '420922', + children: null, + }, + { + name: '云梦县', + code: '420923', + children: null, + }, + { + name: '应城市', + code: '420981', + children: null, + }, + { + name: '安陆市', + code: '420982', + children: null, + }, + { + name: '汉川市', + code: '420984', + children: null, + }, + ], + }, + { + name: '荆州市', + code: '421000', + children: [ + { + name: '沙市区', + code: '421002', + children: null, + }, + { + name: '荆州区', + code: '421003', + children: null, + }, + { + name: '公安县', + code: '421022', + children: null, + }, + { + name: '监利县', + code: '421023', + children: null, + }, + { + name: '江陵县', + code: '421024', + children: null, + }, + { + name: '石首市', + code: '421081', + children: null, + }, + { + name: '洪湖市', + code: '421083', + children: null, + }, + { + name: '松滋市', + code: '421087', + children: null, + }, + ], + }, + { + name: '黄冈市', + code: '421100', + children: [ + { + name: '黄州区', + code: '421102', + children: null, + }, + { + name: '团风县', + code: '421121', + children: null, + }, + { + name: '红安县', + code: '421122', + children: null, + }, + { + name: '罗田县', + code: '421123', + children: null, + }, + { + name: '英山县', + code: '421124', + children: null, + }, + { + name: '浠水县', + code: '421125', + children: null, + }, + { + name: '蕲春县', + code: '421126', + children: null, + }, + { + name: '黄梅县', + code: '421127', + children: null, + }, + { + name: '麻城市', + code: '421181', + children: null, + }, + { + name: '武穴市', + code: '421182', + children: null, + }, + ], + }, + { + name: '咸宁市', + code: '421200', + children: [ + { + name: '咸安区', + code: '421202', + children: null, + }, + { + name: '嘉鱼县', + code: '421221', + children: null, + }, + { + name: '通城县', + code: '421222', + children: null, + }, + { + name: '崇阳县', + code: '421223', + children: null, + }, + { + name: '通山县', + code: '421224', + children: null, + }, + { + name: '赤壁市', + code: '421281', + children: null, + }, + ], + }, + { + name: '随州市', + code: '421300', + children: [ + { + name: '曾都区', + code: '421303', + children: null, + }, + { + name: '随县', + code: '421321', + children: null, + }, + { + name: '广水市', + code: '421381', + children: null, + }, + ], + }, + { + name: '恩施土家族苗族自治州', + code: '422800', + children: [ + { + name: '恩施市', + code: '422801', + children: null, + }, + { + name: '利川市', + code: '422802', + children: null, + }, + { + name: '建始县', + code: '422822', + children: null, + }, + { + name: '巴东县', + code: '422823', + children: null, + }, + { + name: '宣恩县', + code: '422825', + children: null, + }, + { + name: '咸丰县', + code: '422826', + children: null, + }, + { + name: '来凤县', + code: '422827', + children: null, + }, + { + name: '鹤峰县', + code: '422828', + children: null, + }, + ], + }, + { + name: '仙桃市', + code: '429004', + children: [ + { + name: '沙嘴街道', + code: '429004001', + children: null, + }, + { + name: '干河街道', + code: '429004002', + children: null, + }, + { + name: '龙华山街道', + code: '429004003', + children: null, + }, + { + name: '郑场镇', + code: '429004100', + children: null, + }, + { + name: '毛嘴镇', + code: '429004101', + children: null, + }, + { + name: '豆河镇', + code: '429004102', + children: null, + }, + { + name: '三伏潭镇', + code: '429004103', + children: null, + }, + { + name: '胡场镇', + code: '429004104', + children: null, + }, + { + name: '长倘口镇', + code: '429004105', + children: null, + }, + { + name: '西流河镇', + code: '429004106', + children: null, + }, + { + name: '沙湖镇', + code: '429004107', + children: null, + }, + { + name: '杨林尾镇', + code: '429004108', + children: null, + }, + { + name: '彭场镇', + code: '429004109', + children: null, + }, + { + name: '张沟镇', + code: '429004110', + children: null, + }, + { + name: '郭河镇', + code: '429004111', + children: null, + }, + { + name: '沔城回族镇', + code: '429004112', + children: null, + }, + { + name: '通海口镇', + code: '429004113', + children: null, + }, + { + name: '陈场镇', + code: '429004114', + children: null, + }, + { + name: '工业园区', + code: '429004400', + children: null, + }, + { + name: '九合垸原种场', + code: '429004401', + children: null, + }, + { + name: '五湖渔场', + code: '429004404', + children: null, + }, + { + name: '赵西垸林场', + code: '429004405', + children: null, + }, + { + name: '畜禽良种场', + code: '429004407', + children: null, + }, + ], + }, + { + name: '潜江市', + code: '429005', + children: [ + { + name: '园林街道', + code: '429005001', + children: null, + }, + { + name: '周矶街道', + code: '429005003', + children: null, + }, + { + name: '广华街道', + code: '429005004', + children: null, + }, + { + name: '泰丰街道', + code: '429005005', + children: null, + }, + { + name: '高场街道', + code: '429005006', + children: null, + }, + { + name: '竹根滩镇', + code: '429005100', + children: null, + }, + { + name: '渔洋镇', + code: '429005101', + children: null, + }, + { + name: '王场镇', + code: '429005102', + children: null, + }, + { + name: '高石碑镇', + code: '429005103', + children: null, + }, + { + name: '熊口镇', + code: '429005104', + children: null, + }, + { + name: '老新镇', + code: '429005105', + children: null, + }, + { + name: '浩口镇', + code: '429005106', + children: null, + }, + { + name: '积玉口镇', + code: '429005107', + children: null, + }, + { + name: '张金镇', + code: '429005108', + children: null, + }, + { + name: '龙湾镇', + code: '429005109', + children: null, + }, + { + name: '后湖管理区', + code: '429005451', + children: null, + }, + { + name: '熊口管理区', + code: '429005452', + children: null, + }, + { + name: '总口管理区', + code: '429005453', + children: null, + }, + { + name: '白鹭湖管理区', + code: '429005454', + children: null, + }, + { + name: '运粮湖管理区', + code: '429005455', + children: null, + }, + { + name: '杨市街道', + code: '429005900', + children: null, + }, + { + name: '广华寺农场', + code: '429005950', + children: null, + }, + ], + }, + { + name: '天门市', + code: '429006', + children: [ + { + name: '竟陵街道', + code: '429006001', + children: null, + }, + { + name: '侨乡街道开发区', + code: '429006002', + children: null, + }, + { + name: '杨林街道', + code: '429006003', + children: null, + }, + { + name: '多宝镇', + code: '429006100', + children: null, + }, + { + name: '拖市镇', + code: '429006101', + children: null, + }, + { + name: '张港镇', + code: '429006102', + children: null, + }, + { + name: '蒋场镇', + code: '429006103', + children: null, + }, + { + name: '汪场镇', + code: '429006104', + children: null, + }, + { + name: '渔薪镇', + code: '429006105', + children: null, + }, + { + name: '黄潭镇', + code: '429006106', + children: null, + }, + { + name: '岳口镇', + code: '429006107', + children: null, + }, + { + name: '横林镇', + code: '429006108', + children: null, + }, + { + name: '彭市镇', + code: '429006109', + children: null, + }, + { + name: '麻洋镇', + code: '429006110', + children: null, + }, + { + name: '多祥镇', + code: '429006111', + children: null, + }, + { + name: '干驿镇', + code: '429006112', + children: null, + }, + { + name: '马湾镇', + code: '429006113', + children: null, + }, + { + name: '卢市镇', + code: '429006114', + children: null, + }, + { + name: '小板镇', + code: '429006115', + children: null, + }, + { + name: '九真镇', + code: '429006116', + children: null, + }, + { + name: '皂市镇', + code: '429006118', + children: null, + }, + { + name: '胡市镇', + code: '429006119', + children: null, + }, + { + name: '石河镇', + code: '429006120', + children: null, + }, + { + name: '佛子山镇', + code: '429006121', + children: null, + }, + { + name: '净潭乡', + code: '429006201', + children: null, + }, + { + name: '蒋湖农场', + code: '429006450', + children: null, + }, + { + name: '白茅湖农场', + code: '429006451', + children: null, + }, + { + name: '沉湖管委会', + code: '429006452', + children: null, + }, + ], + }, + { + name: '神农架林区', + code: '429021', + children: [ + { + name: '松柏镇', + code: '429021100', + children: null, + }, + { + name: '阳日镇', + code: '429021101', + children: null, + }, + { + name: '木鱼镇', + code: '429021102', + children: null, + }, + { + name: '红坪镇', + code: '429021103', + children: null, + }, + { + name: '新华镇', + code: '429021104', + children: null, + }, + { + name: '九湖镇', + code: '429021105', + children: null, + }, + { + name: '宋洛乡', + code: '429021200', + children: null, + }, + { + name: '下谷坪土家族乡', + code: '429021202', + children: null, + }, + ], + }, + ], + }, + { + name: '湖南省', + code: '430000', + children: [ + { + name: '长沙市', + code: '430100', + children: [ + { + name: '芙蓉区', + code: '430102', + children: null, + }, + { + name: '天心区', + code: '430103', + children: null, + }, + { + name: '岳麓区', + code: '430104', + children: null, + }, + { + name: '开福区', + code: '430105', + children: null, + }, + { + name: '雨花区', + code: '430111', + children: null, + }, + { + name: '望城区', + code: '430112', + children: null, + }, + { + name: '长沙县', + code: '430121', + children: null, + }, + { + name: '浏阳市', + code: '430181', + children: null, + }, + { + name: '宁乡市', + code: '430182', + children: null, + }, + ], + }, + { + name: '株洲市', + code: '430200', + children: [ + { + name: '荷塘区', + code: '430202', + children: null, + }, + { + name: '芦淞区', + code: '430203', + children: null, + }, + { + name: '石峰区', + code: '430204', + children: null, + }, + { + name: '天元区', + code: '430211', + children: null, + }, + { + name: '渌口区', + code: '430212', + children: null, + }, + { + name: '攸县', + code: '430223', + children: null, + }, + { + name: '茶陵县', + code: '430224', + children: null, + }, + { + name: '炎陵县', + code: '430225', + children: null, + }, + { + name: '醴陵市', + code: '430281', + children: null, + }, + ], + }, + { + name: '湘潭市', + code: '430300', + children: [ + { + name: '雨湖区', + code: '430302', + children: null, + }, + { + name: '岳塘区', + code: '430304', + children: null, + }, + { + name: '湘潭县', + code: '430321', + children: null, + }, + { + name: '湘乡市', + code: '430381', + children: null, + }, + { + name: '韶山市', + code: '430382', + children: null, + }, + ], + }, + { + name: '衡阳市', + code: '430400', + children: [ + { + name: '珠晖区', + code: '430405', + children: null, + }, + { + name: '雁峰区', + code: '430406', + children: null, + }, + { + name: '石鼓区', + code: '430407', + children: null, + }, + { + name: '蒸湘区', + code: '430408', + children: null, + }, + { + name: '南岳区', + code: '430412', + children: null, + }, + { + name: '衡阳县', + code: '430421', + children: null, + }, + { + name: '衡南县', + code: '430422', + children: null, + }, + { + name: '衡山县', + code: '430423', + children: null, + }, + { + name: '衡东县', + code: '430424', + children: null, + }, + { + name: '祁东县', + code: '430426', + children: null, + }, + { + name: '耒阳市', + code: '430481', + children: null, + }, + { + name: '常宁市', + code: '430482', + children: null, + }, + ], + }, + { + name: '邵阳市', + code: '430500', + children: [ + { + name: '双清区', + code: '430502', + children: null, + }, + { + name: '大祥区', + code: '430503', + children: null, + }, + { + name: '北塔区', + code: '430511', + children: null, + }, + { + name: '邵东县', + code: '430521', + children: null, + }, + { + name: '新邵县', + code: '430522', + children: null, + }, + { + name: '邵阳县', + code: '430523', + children: null, + }, + { + name: '隆回县', + code: '430524', + children: null, + }, + { + name: '洞口县', + code: '430525', + children: null, + }, + { + name: '绥宁县', + code: '430527', + children: null, + }, + { + name: '新宁县', + code: '430528', + children: null, + }, + { + name: '城步苗族自治县', + code: '430529', + children: null, + }, + { + name: '武冈市', + code: '430581', + children: null, + }, + ], + }, + { + name: '岳阳市', + code: '430600', + children: [ + { + name: '岳阳楼区', + code: '430602', + children: null, + }, + { + name: '云溪区', + code: '430603', + children: null, + }, + { + name: '君山区', + code: '430611', + children: null, + }, + { + name: '岳阳县', + code: '430621', + children: null, + }, + { + name: '华容县', + code: '430623', + children: null, + }, + { + name: '湘阴县', + code: '430624', + children: null, + }, + { + name: '平江县', + code: '430626', + children: null, + }, + { + name: '汨罗市', + code: '430681', + children: null, + }, + { + name: '临湘市', + code: '430682', + children: null, + }, + ], + }, + { + name: '常德市', + code: '430700', + children: [ + { + name: '武陵区', + code: '430702', + children: null, + }, + { + name: '鼎城区', + code: '430703', + children: null, + }, + { + name: '安乡县', + code: '430721', + children: null, + }, + { + name: '汉寿县', + code: '430722', + children: null, + }, + { + name: '澧县', + code: '430723', + children: null, + }, + { + name: '临澧县', + code: '430724', + children: null, + }, + { + name: '桃源县', + code: '430725', + children: null, + }, + { + name: '石门县', + code: '430726', + children: null, + }, + { + name: '津市市', + code: '430781', + children: null, + }, + ], + }, + { + name: '张家界市', + code: '430800', + children: [ + { + name: '永定区', + code: '430802', + children: null, + }, + { + name: '武陵源区', + code: '430811', + children: null, + }, + { + name: '慈利县', + code: '430821', + children: null, + }, + { + name: '桑植县', + code: '430822', + children: null, + }, + ], + }, + { + name: '益阳市', + code: '430900', + children: [ + { + name: '资阳区', + code: '430902', + children: null, + }, + { + name: '赫山区', + code: '430903', + children: null, + }, + { + name: '南县', + code: '430921', + children: null, + }, + { + name: '桃江县', + code: '430922', + children: null, + }, + { + name: '安化县', + code: '430923', + children: null, + }, + { + name: '沅江市', + code: '430981', + children: null, + }, + ], + }, + { + name: '郴州市', + code: '431000', + children: [ + { + name: '北湖区', + code: '431002', + children: null, + }, + { + name: '苏仙区', + code: '431003', + children: null, + }, + { + name: '桂阳县', + code: '431021', + children: null, + }, + { + name: '宜章县', + code: '431022', + children: null, + }, + { + name: '永兴县', + code: '431023', + children: null, + }, + { + name: '嘉禾县', + code: '431024', + children: null, + }, + { + name: '临武县', + code: '431025', + children: null, + }, + { + name: '汝城县', + code: '431026', + children: null, + }, + { + name: '桂东县', + code: '431027', + children: null, + }, + { + name: '安仁县', + code: '431028', + children: null, + }, + { + name: '资兴市', + code: '431081', + children: null, + }, + ], + }, + { + name: '永州市', + code: '431100', + children: [ + { + name: '零陵区', + code: '431102', + children: null, + }, + { + name: '冷水滩区', + code: '431103', + children: null, + }, + { + name: '祁阳县', + code: '431121', + children: null, + }, + { + name: '东安县', + code: '431122', + children: null, + }, + { + name: '双牌县', + code: '431123', + children: null, + }, + { + name: '道县', + code: '431124', + children: null, + }, + { + name: '江永县', + code: '431125', + children: null, + }, + { + name: '宁远县', + code: '431126', + children: null, + }, + { + name: '蓝山县', + code: '431127', + children: null, + }, + { + name: '新田县', + code: '431128', + children: null, + }, + { + name: '江华瑶族自治县', + code: '431129', + children: null, + }, + ], + }, + { + name: '怀化市', + code: '431200', + children: [ + { + name: '鹤城区', + code: '431202', + children: null, + }, + { + name: '中方县', + code: '431221', + children: null, + }, + { + name: '沅陵县', + code: '431222', + children: null, + }, + { + name: '辰溪县', + code: '431223', + children: null, + }, + { + name: '溆浦县', + code: '431224', + children: null, + }, + { + name: '会同县', + code: '431225', + children: null, + }, + { + name: '麻阳苗族自治县', + code: '431226', + children: null, + }, + { + name: '新晃侗族自治县', + code: '431227', + children: null, + }, + { + name: '芷江侗族自治县', + code: '431228', + children: null, + }, + { + name: '靖州苗族侗族自治县', + code: '431229', + children: null, + }, + { + name: '通道侗族自治县', + code: '431230', + children: null, + }, + { + name: '洪江市', + code: '431281', + children: null, + }, + ], + }, + { + name: '娄底市', + code: '431300', + children: [ + { + name: '娄星区', + code: '431302', + children: null, + }, + { + name: '双峰县', + code: '431321', + children: null, + }, + { + name: '新化县', + code: '431322', + children: null, + }, + { + name: '冷水江市', + code: '431381', + children: null, + }, + { + name: '涟源市', + code: '431382', + children: null, + }, + ], + }, + { + name: '湘西土家族苗族自治州', + code: '433100', + children: [ + { + name: '吉首市', + code: '433101', + children: null, + }, + { + name: '泸溪县', + code: '433122', + children: null, + }, + { + name: '凤凰县', + code: '433123', + children: null, + }, + { + name: '花垣县', + code: '433124', + children: null, + }, + { + name: '保靖县', + code: '433125', + children: null, + }, + { + name: '古丈县', + code: '433126', + children: null, + }, + { + name: '永顺县', + code: '433127', + children: null, + }, + { + name: '龙山县', + code: '433130', + children: null, + }, + ], + }, + ], + }, + { + name: '广东省', + code: '440000', + children: [ + { + name: '广州市', + code: '440100', + children: [ + { + name: '荔湾区', + code: '440103', + children: null, + }, + { + name: '越秀区', + code: '440104', + children: null, + }, + { + name: '海珠区', + code: '440105', + children: null, + }, + { + name: '天河区', + code: '440106', + children: null, + }, + { + name: '白云区', + code: '440111', + children: null, + }, + { + name: '黄埔区', + code: '440112', + children: null, + }, + { + name: '番禺区', + code: '440113', + children: null, + }, + { + name: '花都区', + code: '440114', + children: null, + }, + { + name: '南沙区', + code: '440115', + children: null, + }, + { + name: '从化区', + code: '440117', + children: null, + }, + { + name: '增城区', + code: '440118', + children: null, + }, + ], + }, + { + name: '韶关市', + code: '440200', + children: [ + { + name: '武江区', + code: '440203', + children: null, + }, + { + name: '浈江区', + code: '440204', + children: null, + }, + { + name: '曲江区', + code: '440205', + children: null, + }, + { + name: '始兴县', + code: '440222', + children: null, + }, + { + name: '仁化县', + code: '440224', + children: null, + }, + { + name: '翁源县', + code: '440229', + children: null, + }, + { + name: '乳源瑶族自治县', + code: '440232', + children: null, + }, + { + name: '新丰县', + code: '440233', + children: null, + }, + { + name: '乐昌市', + code: '440281', + children: null, + }, + { + name: '南雄市', + code: '440282', + children: null, + }, + ], + }, + { + name: '深圳市', + code: '440300', + children: [ + { + name: '罗湖区', + code: '440303', + children: null, + }, + { + name: '福田区', + code: '440304', + children: null, + }, + { + name: '南山区', + code: '440305', + children: null, + }, + { + name: '宝安区', + code: '440306', + children: null, + }, + { + name: '龙岗区', + code: '440307', + children: null, + }, + { + name: '盐田区', + code: '440308', + children: null, + }, + { + name: '龙华区', + code: '440309', + children: null, + }, + { + name: '坪山区', + code: '440310', + children: null, + }, + { + name: '光明区', + code: '440311', + children: null, + }, + ], + }, + { + name: '珠海市', + code: '440400', + children: [ + { + name: '香洲区', + code: '440402', + children: null, + }, + { + name: '斗门区', + code: '440403', + children: null, + }, + { + name: '金湾区', + code: '440404', + children: null, + }, + { + name: '香洲区横琴校区(由澳门特别行政区实施管辖)', + code: '440499', + children: null, + }, + ], + }, + { + name: '汕头市', + code: '440500', + children: [ + { + name: '龙湖区', + code: '440507', + children: null, + }, + { + name: '金平区', + code: '440511', + children: null, + }, + { + name: '濠江区', + code: '440512', + children: null, + }, + { + name: '潮阳区', + code: '440513', + children: null, + }, + { + name: '潮南区', + code: '440514', + children: null, + }, + { + name: '澄海区', + code: '440515', + children: null, + }, + { + name: '南澳县', + code: '440523', + children: null, + }, + ], + }, + { + name: '佛山市', + code: '440600', + children: [ + { + name: '禅城区', + code: '440604', + children: null, + }, + { + name: '南海区', + code: '440605', + children: null, + }, + { + name: '顺德区', + code: '440606', + children: null, + }, + { + name: '三水区', + code: '440607', + children: null, + }, + { + name: '高明区', + code: '440608', + children: null, + }, + ], + }, + { + name: '江门市', + code: '440700', + children: [ + { + name: '蓬江区', + code: '440703', + children: null, + }, + { + name: '江海区', + code: '440704', + children: null, + }, + { + name: '新会区', + code: '440705', + children: null, + }, + { + name: '台山市', + code: '440781', + children: null, + }, + { + name: '开平市', + code: '440783', + children: null, + }, + { + name: '鹤山市', + code: '440784', + children: null, + }, + { + name: '恩平市', + code: '440785', + children: null, + }, + ], + }, + { + name: '湛江市', + code: '440800', + children: [ + { + name: '赤坎区', + code: '440802', + children: null, + }, + { + name: '霞山区', + code: '440803', + children: null, + }, + { + name: '坡头区', + code: '440804', + children: null, + }, + { + name: '麻章区', + code: '440811', + children: null, + }, + { + name: '遂溪县', + code: '440823', + children: null, + }, + { + name: '徐闻县', + code: '440825', + children: null, + }, + { + name: '廉江市', + code: '440881', + children: null, + }, + { + name: '雷州市', + code: '440882', + children: null, + }, + { + name: '吴川市', + code: '440883', + children: null, + }, + ], + }, + { + name: '茂名市', + code: '440900', + children: [ + { + name: '茂南区', + code: '440902', + children: null, + }, + { + name: '电白区', + code: '440904', + children: null, + }, + { + name: '高州市', + code: '440981', + children: null, + }, + { + name: '化州市', + code: '440982', + children: null, + }, + { + name: '信宜市', + code: '440983', + children: null, + }, + ], + }, + { + name: '肇庆市', + code: '441200', + children: [ + { + name: '端州区', + code: '441202', + children: null, + }, + { + name: '鼎湖区', + code: '441203', + children: null, + }, + { + name: '高要区', + code: '441204', + children: null, + }, + { + name: '广宁县', + code: '441223', + children: null, + }, + { + name: '怀集县', + code: '441224', + children: null, + }, + { + name: '封开县', + code: '441225', + children: null, + }, + { + name: '德庆县', + code: '441226', + children: null, + }, + { + name: '四会市', + code: '441284', + children: null, + }, + ], + }, + { + name: '惠州市', + code: '441300', + children: [ + { + name: '惠城区', + code: '441302', + children: null, + }, + { + name: '惠阳区', + code: '441303', + children: null, + }, + { + name: '博罗县', + code: '441322', + children: null, + }, + { + name: '惠东县', + code: '441323', + children: null, + }, + { + name: '龙门县', + code: '441324', + children: null, + }, + ], + }, + { + name: '梅州市', + code: '441400', + children: [ + { + name: '梅江区', + code: '441402', + children: null, + }, + { + name: '梅县区', + code: '441403', + children: null, + }, + { + name: '大埔县', + code: '441422', + children: null, + }, + { + name: '丰顺县', + code: '441423', + children: null, + }, + { + name: '五华县', + code: '441424', + children: null, + }, + { + name: '平远县', + code: '441426', + children: null, + }, + { + name: '蕉岭县', + code: '441427', + children: null, + }, + { + name: '兴宁市', + code: '441481', + children: null, + }, + ], + }, + { + name: '汕尾市', + code: '441500', + children: [ + { + name: '城区', + code: '441502', + children: null, + }, + { + name: '海丰县', + code: '441521', + children: null, + }, + { + name: '陆河县', + code: '441523', + children: null, + }, + { + name: '陆丰市', + code: '441581', + children: null, + }, + ], + }, + { + name: '河源市', + code: '441600', + children: [ + { + name: '源城区', + code: '441602', + children: null, + }, + { + name: '紫金县', + code: '441621', + children: null, + }, + { + name: '龙川县', + code: '441622', + children: null, + }, + { + name: '连平县', + code: '441623', + children: null, + }, + { + name: '和平县', + code: '441624', + children: null, + }, + { + name: '东源县', + code: '441625', + children: null, + }, + ], + }, + { + name: '阳江市', + code: '441700', + children: [ + { + name: '江城区', + code: '441702', + children: null, + }, + { + name: '阳东区', + code: '441704', + children: null, + }, + { + name: '阳西县', + code: '441721', + children: null, + }, + { + name: '阳春市', + code: '441781', + children: null, + }, + ], + }, + { + name: '清远市', + code: '441800', + children: [ + { + name: '清城区', + code: '441802', + children: null, + }, + { + name: '清新区', + code: '441803', + children: null, + }, + { + name: '佛冈县', + code: '441821', + children: null, + }, + { + name: '阳山县', + code: '441823', + children: null, + }, + { + name: '连山壮族瑶族自治县', + code: '441825', + children: null, + }, + { + name: '连南瑶族自治县', + code: '441826', + children: null, + }, + { + name: '英德市', + code: '441881', + children: null, + }, + { + name: '连州市', + code: '441882', + children: null, + }, + ], + }, + { + name: '东莞市', + code: '441900', + children: [ + { + name: '东莞市', + code: '441999', + children: null, + }, + ], + }, + { + name: '中山市', + code: '442000', + children: [ + { + name: '中山市', + code: '442099', + children: null, + }, + ], + }, + { + name: '潮州市', + code: '445100', + children: [ + { + name: '湘桥区', + code: '445102', + children: null, + }, + { + name: '潮安区', + code: '445103', + children: null, + }, + { + name: '饶平县', + code: '445122', + children: null, + }, + ], + }, + { + name: '揭阳市', + code: '445200', + children: [ + { + name: '榕城区', + code: '445202', + children: null, + }, + { + name: '揭东区', + code: '445203', + children: null, + }, + { + name: '揭西县', + code: '445222', + children: null, + }, + { + name: '惠来县', + code: '445224', + children: null, + }, + { + name: '普宁市', + code: '445281', + children: null, + }, + ], + }, + { + name: '云浮市', + code: '445300', + children: [ + { + name: '云城区', + code: '445302', + children: null, + }, + { + name: '云安区', + code: '445303', + children: null, + }, + { + name: '新兴县', + code: '445321', + children: null, + }, + { + name: '郁南县', + code: '445322', + children: null, + }, + { + name: '罗定市', + code: '445381', + children: null, + }, + ], + }, + ], + }, + { + name: '广西壮族自治区', + code: '450000', + children: [ + { + name: '南宁市', + code: '450100', + children: [ + { + name: '兴宁区', + code: '450102', + children: null, + }, + { + name: '青秀区', + code: '450103', + children: null, + }, + { + name: '江南区', + code: '450105', + children: null, + }, + { + name: '西乡塘区', + code: '450107', + children: null, + }, + { + name: '良庆区', + code: '450108', + children: null, + }, + { + name: '邕宁区', + code: '450109', + children: null, + }, + { + name: '武鸣区', + code: '450110', + children: null, + }, + { + name: '隆安县', + code: '450123', + children: null, + }, + { + name: '马山县', + code: '450124', + children: null, + }, + { + name: '上林县', + code: '450125', + children: null, + }, + { + name: '宾阳县', + code: '450126', + children: null, + }, + { + name: '横县', + code: '450127', + children: null, + }, + ], + }, + { + name: '柳州市', + code: '450200', + children: [ + { + name: '城中区', + code: '450202', + children: null, + }, + { + name: '鱼峰区', + code: '450203', + children: null, + }, + { + name: '柳南区', + code: '450204', + children: null, + }, + { + name: '柳北区', + code: '450205', + children: null, + }, + { + name: '柳江区', + code: '450206', + children: null, + }, + { + name: '柳城县', + code: '450222', + children: null, + }, + { + name: '鹿寨县', + code: '450223', + children: null, + }, + { + name: '融安县', + code: '450224', + children: null, + }, + { + name: '融水苗族自治县', + code: '450225', + children: null, + }, + { + name: '三江侗族自治县', + code: '450226', + children: null, + }, + ], + }, + { + name: '桂林市', + code: '450300', + children: [ + { + name: '秀峰区', + code: '450302', + children: null, + }, + { + name: '叠彩区', + code: '450303', + children: null, + }, + { + name: '象山区', + code: '450304', + children: null, + }, + { + name: '七星区', + code: '450305', + children: null, + }, + { + name: '雁山区', + code: '450311', + children: null, + }, + { + name: '临桂区', + code: '450312', + children: null, + }, + { + name: '阳朔县', + code: '450321', + children: null, + }, + { + name: '灵川县', + code: '450323', + children: null, + }, + { + name: '全州县', + code: '450324', + children: null, + }, + { + name: '兴安县', + code: '450325', + children: null, + }, + { + name: '永福县', + code: '450326', + children: null, + }, + { + name: '灌阳县', + code: '450327', + children: null, + }, + { + name: '龙胜各族自治县', + code: '450328', + children: null, + }, + { + name: '资源县', + code: '450329', + children: null, + }, + { + name: '平乐县', + code: '450330', + children: null, + }, + { + name: '恭城瑶族自治县', + code: '450332', + children: null, + }, + { + name: '荔浦市', + code: '450381', + children: null, + }, + ], + }, + { + name: '梧州市', + code: '450400', + children: [ + { + name: '万秀区', + code: '450403', + children: null, + }, + { + name: '长洲区', + code: '450405', + children: null, + }, + { + name: '龙圩区', + code: '450406', + children: null, + }, + { + name: '苍梧县', + code: '450421', + children: null, + }, + { + name: '藤县', + code: '450422', + children: null, + }, + { + name: '蒙山县', + code: '450423', + children: null, + }, + { + name: '岑溪市', + code: '450481', + children: null, + }, + ], + }, + { + name: '北海市', + code: '450500', + children: [ + { + name: '海城区', + code: '450502', + children: null, + }, + { + name: '银海区', + code: '450503', + children: null, + }, + { + name: '铁山港区', + code: '450512', + children: null, + }, + { + name: '合浦县', + code: '450521', + children: null, + }, + ], + }, + { + name: '防城港市', + code: '450600', + children: [ + { + name: '港口区', + code: '450602', + children: null, + }, + { + name: '防城区', + code: '450603', + children: null, + }, + { + name: '上思县', + code: '450621', + children: null, + }, + { + name: '东兴市', + code: '450681', + children: null, + }, + ], + }, + { + name: '钦州市', + code: '450700', + children: [ + { + name: '钦南区', + code: '450702', + children: null, + }, + { + name: '钦北区', + code: '450703', + children: null, + }, + { + name: '灵山县', + code: '450721', + children: null, + }, + { + name: '浦北县', + code: '450722', + children: null, + }, + ], + }, + { + name: '贵港市', + code: '450800', + children: [ + { + name: '港北区', + code: '450802', + children: null, + }, + { + name: '港南区', + code: '450803', + children: null, + }, + { + name: '覃塘区', + code: '450804', + children: null, + }, + { + name: '平南县', + code: '450821', + children: null, + }, + { + name: '桂平市', + code: '450881', + children: null, + }, + ], + }, + { + name: '玉林市', + code: '450900', + children: [ + { + name: '玉州区', + code: '450902', + children: null, + }, + { + name: '福绵区', + code: '450903', + children: null, + }, + { + name: '容县', + code: '450921', + children: null, + }, + { + name: '陆川县', + code: '450922', + children: null, + }, + { + name: '博白县', + code: '450923', + children: null, + }, + { + name: '兴业县', + code: '450924', + children: null, + }, + { + name: '北流市', + code: '450981', + children: null, + }, + ], + }, + { + name: '百色市', + code: '451000', + children: [ + { + name: '右江区', + code: '451002', + children: null, + }, + { + name: '田阳县', + code: '451021', + children: null, + }, + { + name: '田东县', + code: '451022', + children: null, + }, + { + name: '平果县', + code: '451023', + children: null, + }, + { + name: '德保县', + code: '451024', + children: null, + }, + { + name: '那坡县', + code: '451026', + children: null, + }, + { + name: '凌云县', + code: '451027', + children: null, + }, + { + name: '乐业县', + code: '451028', + children: null, + }, + { + name: '田林县', + code: '451029', + children: null, + }, + { + name: '西林县', + code: '451030', + children: null, + }, + { + name: '隆林各族自治县', + code: '451031', + children: null, + }, + { + name: '靖西市', + code: '451081', + children: null, + }, + ], + }, + { + name: '贺州市', + code: '451100', + children: [ + { + name: '八步区', + code: '451102', + children: null, + }, + { + name: '平桂区', + code: '451103', + children: null, + }, + { + name: '昭平县', + code: '451121', + children: null, + }, + { + name: '钟山县', + code: '451122', + children: null, + }, + { + name: '富川瑶族自治县', + code: '451123', + children: null, + }, + ], + }, + { + name: '河池市', + code: '451200', + children: [ + { + name: '金城江区', + code: '451202', + children: null, + }, + { + name: '宜州区', + code: '451203', + children: null, + }, + { + name: '南丹县', + code: '451221', + children: null, + }, + { + name: '天峨县', + code: '451222', + children: null, + }, + { + name: '凤山县', + code: '451223', + children: null, + }, + { + name: '东兰县', + code: '451224', + children: null, + }, + { + name: '罗城仫佬族自治县', + code: '451225', + children: null, + }, + { + name: '环江毛南族自治县', + code: '451226', + children: null, + }, + { + name: '巴马瑶族自治县', + code: '451227', + children: null, + }, + { + name: '都安瑶族自治县', + code: '451228', + children: null, + }, + { + name: '大化瑶族自治县', + code: '451229', + children: null, + }, + ], + }, + { + name: '来宾市', + code: '451300', + children: [ + { + name: '兴宾区', + code: '451302', + children: null, + }, + { + name: '忻城县', + code: '451321', + children: null, + }, + { + name: '象州县', + code: '451322', + children: null, + }, + { + name: '武宣县', + code: '451323', + children: null, + }, + { + name: '金秀瑶族自治县', + code: '451324', + children: null, + }, + { + name: '合山市', + code: '451381', + children: null, + }, + ], + }, + { + name: '崇左市', + code: '451400', + children: [ + { + name: '江州区', + code: '451402', + children: null, + }, + { + name: '扶绥县', + code: '451421', + children: null, + }, + { + name: '宁明县', + code: '451422', + children: null, + }, + { + name: '龙州县', + code: '451423', + children: null, + }, + { + name: '大新县', + code: '451424', + children: null, + }, + { + name: '天等县', + code: '451425', + children: null, + }, + { + name: '凭祥市', + code: '451481', + children: null, + }, + ], + }, + ], + }, + { + name: '海南省', + code: '460000', + children: [ + { + name: '海口市', + code: '460100', + children: [ + { + name: '秀英区', + code: '460105', + children: null, + }, + { + name: '龙华区', + code: '460106', + children: null, + }, + { + name: '琼山区', + code: '460107', + children: null, + }, + { + name: '美兰区', + code: '460108', + children: null, + }, + ], + }, + { + name: '三亚市', + code: '460200', + children: [ + { + name: '海棠区', + code: '460202', + children: null, + }, + { + name: '吉阳区', + code: '460203', + children: null, + }, + { + name: '天涯区', + code: '460204', + children: null, + }, + { + name: '崖州区', + code: '460205', + children: null, + }, + ], + }, + { + name: '三沙市', + code: '460300', + children: [ + { + name: '西沙群岛', + code: '460321', + children: null, + }, + { + name: '南沙群岛', + code: '460322', + children: null, + }, + { + name: '中沙群岛的岛礁及其海域', + code: '460323', + children: null, + }, + ], + }, + { + name: '儋州市', + code: '460400', + children: [ + { + name: '儋州市', + code: '460499', + children: null, + }, + ], + }, + { + name: '五指山市', + code: '469001', + children: [ + { + name: '通什镇', + code: '469001100', + children: null, + }, + { + name: '南圣镇', + code: '469001101', + children: null, + }, + { + name: '毛阳镇', + code: '469001102', + children: null, + }, + { + name: '番阳镇', + code: '469001103', + children: null, + }, + { + name: '畅好乡', + code: '469001200', + children: null, + }, + { + name: '毛道乡', + code: '469001201', + children: null, + }, + { + name: '水满乡', + code: '469001202', + children: null, + }, + { + name: '国营畅好农场', + code: '469001400', + children: null, + }, + ], + }, + { + name: '琼海市', + code: '469002', + children: [ + { + name: '嘉积镇', + code: '469002100', + children: null, + }, + { + name: '万泉镇', + code: '469002101', + children: null, + }, + { + name: '石壁镇', + code: '469002102', + children: null, + }, + { + name: '中原镇', + code: '469002103', + children: null, + }, + { + name: '博鳌镇', + code: '469002104', + children: null, + }, + { + name: '阳江镇', + code: '469002105', + children: null, + }, + { + name: '龙江镇', + code: '469002106', + children: null, + }, + { + name: '潭门镇', + code: '469002107', + children: null, + }, + { + name: '塔洋镇', + code: '469002108', + children: null, + }, + { + name: '长坡镇', + code: '469002109', + children: null, + }, + { + name: '大路镇', + code: '469002110', + children: null, + }, + { + name: '会山镇', + code: '469002111', + children: null, + }, + { + name: '东太农场', + code: '469002400', + children: null, + }, + { + name: '南俸农场', + code: '469002401', + children: null, + }, + { + name: '东红农场', + code: '469002402', + children: null, + }, + { + name: '彬村山华侨农场', + code: '469002500', + children: null, + }, + { + name: '东平农场', + code: '469002953', + children: null, + }, + ], + }, + { + name: '文昌市', + code: '469005', + children: [ + { + name: '文城镇', + code: '469005100', + children: null, + }, + { + name: '重兴镇', + code: '469005101', + children: null, + }, + { + name: '蓬莱镇', + code: '469005102', + children: null, + }, + { + name: '会文镇', + code: '469005103', + children: null, + }, + { + name: '东路镇', + code: '469005104', + children: null, + }, + { + name: '潭牛镇', + code: '469005105', + children: null, + }, + { + name: '东阁镇', + code: '469005106', + children: null, + }, + { + name: '文教镇', + code: '469005107', + children: null, + }, + { + name: '东郊镇', + code: '469005108', + children: null, + }, + { + name: '龙楼镇', + code: '469005109', + children: null, + }, + { + name: '昌洒镇', + code: '469005110', + children: null, + }, + { + name: '翁田镇', + code: '469005111', + children: null, + }, + { + name: '抱罗镇', + code: '469005112', + children: null, + }, + { + name: '冯坡镇', + code: '469005113', + children: null, + }, + { + name: '锦山镇', + code: '469005114', + children: null, + }, + { + name: '铺前镇', + code: '469005115', + children: null, + }, + { + name: '公坡镇', + code: '469005116', + children: null, + }, + { + name: '国营南阳农场', + code: '469005401', + children: null, + }, + { + name: '国营罗豆农场', + code: '469005402', + children: null, + }, + ], + }, + { + name: '万宁市', + code: '469006', + children: [ + { + name: '万城镇', + code: '469006100', + children: null, + }, + { + name: '龙滚镇', + code: '469006101', + children: null, + }, + { + name: '和乐镇', + code: '469006102', + children: null, + }, + { + name: '后安镇', + code: '469006103', + children: null, + }, + { + name: '大茂镇', + code: '469006104', + children: null, + }, + { + name: '东澳镇', + code: '469006105', + children: null, + }, + { + name: '礼纪镇', + code: '469006106', + children: null, + }, + { + name: '长丰镇', + code: '469006107', + children: null, + }, + { + name: '山根镇', + code: '469006108', + children: null, + }, + { + name: '北大镇', + code: '469006109', + children: null, + }, + { + name: '南桥镇', + code: '469006110', + children: null, + }, + { + name: '三更罗镇', + code: '469006111', + children: null, + }, + { + name: '国营东兴农场', + code: '469006400', + children: null, + }, + { + name: '兴隆华侨农场', + code: '469006500', + children: null, + }, + { + name: '地方国营六连林场', + code: '469006501', + children: null, + }, + { + name: '东岭农场', + code: '469006951', + children: null, + }, + ], + }, + { + name: '东方市', + code: '469007', + children: [ + { + name: '八所镇', + code: '469007100', + children: null, + }, + { + name: '东河镇', + code: '469007101', + children: null, + }, + { + name: '大田镇', + code: '469007102', + children: null, + }, + { + name: '感城镇', + code: '469007103', + children: null, + }, + { + name: '板桥镇', + code: '469007104', + children: null, + }, + { + name: '三家镇', + code: '469007105', + children: null, + }, + { + name: '四更镇', + code: '469007106', + children: null, + }, + { + name: '新龙镇', + code: '469007107', + children: null, + }, + { + name: '天安乡', + code: '469007200', + children: null, + }, + { + name: '江边乡', + code: '469007201', + children: null, + }, + { + name: '国营广坝农场', + code: '469007400', + children: null, + }, + { + name: '东方华侨农场', + code: '469007500', + children: null, + }, + { + name: '东方农场', + code: '469007950', + children: null, + }, + ], + }, + { + name: '定安县', + code: '469021', + children: [ + { + name: '定城镇', + code: '469021100', + children: null, + }, + { + name: '新竹镇', + code: '469021101', + children: null, + }, + { + name: '龙湖镇', + code: '469021102', + children: null, + }, + { + name: '黄竹镇', + code: '469021103', + children: null, + }, + { + name: '雷鸣镇', + code: '469021104', + children: null, + }, + { + name: '龙门镇', + code: '469021105', + children: null, + }, + { + name: '龙河镇', + code: '469021106', + children: null, + }, + { + name: '岭口镇', + code: '469021107', + children: null, + }, + { + name: '翰林镇', + code: '469021108', + children: null, + }, + { + name: '富文镇', + code: '469021109', + children: null, + }, + { + name: '国营中瑞农场', + code: '469021400', + children: null, + }, + { + name: '国营南海农场', + code: '469021401', + children: null, + }, + { + name: '国营金鸡岭农场', + code: '469021402', + children: null, + }, + { + name: '国营东升农场', + code: '469021403', + children: null, + }, + ], + }, + { + name: '屯昌县', + code: '469022', + children: [ + { + name: '屯城镇', + code: '469022100', + children: null, + }, + { + name: '新兴镇', + code: '469022101', + children: null, + }, + { + name: '枫木镇', + code: '469022102', + children: null, + }, + { + name: '乌坡镇', + code: '469022103', + children: null, + }, + { + name: '南吕镇', + code: '469022104', + children: null, + }, + { + name: '南坤镇', + code: '469022105', + children: null, + }, + { + name: '坡心镇', + code: '469022106', + children: null, + }, + { + name: '西昌镇', + code: '469022107', + children: null, + }, + { + name: '国营中瑞农场', + code: '469022400', + children: null, + }, + { + name: '国营中坤农场', + code: '469022401', + children: null, + }, + { + name: '国营中建农场', + code: '469022950', + children: null, + }, + { + name: '晨星农场', + code: '469022951', + children: null, + }, + { + name: '黄岭农场', + code: '469022952', + children: null, + }, + { + name: '广青农场', + code: '469022954', + children: null, + }, + ], + }, + { + name: '澄迈县', + code: '469023', + children: [ + { + name: '金江镇', + code: '469023100', + children: null, + }, + { + name: '老城镇', + code: '469023101', + children: null, + }, + { + name: '瑞溪镇', + code: '469023102', + children: null, + }, + { + name: '永发镇', + code: '469023103', + children: null, + }, + { + name: '加乐镇', + code: '469023104', + children: null, + }, + { + name: '文儒镇', + code: '469023105', + children: null, + }, + { + name: '中兴镇', + code: '469023106', + children: null, + }, + { + name: '仁兴镇', + code: '469023107', + children: null, + }, + { + name: '福山镇', + code: '469023108', + children: null, + }, + { + name: '桥头镇', + code: '469023109', + children: null, + }, + { + name: '大丰镇', + code: '469023110', + children: null, + }, + { + name: '国营红光农场', + code: '469023400', + children: null, + }, + { + name: '红岗农场', + code: '469023401', + children: null, + }, + { + name: '国营西达农场', + code: '469023402', + children: null, + }, + { + name: '国营金安农场', + code: '469023405', + children: null, + }, + ], + }, + { + name: '临高县', + code: '469024', + children: [ + { + name: '临城镇', + code: '469024100', + children: null, + }, + { + name: '波莲镇', + code: '469024101', + children: null, + }, + { + name: '东英镇', + code: '469024102', + children: null, + }, + { + name: '博厚镇', + code: '469024103', + children: null, + }, + { + name: '皇桐镇', + code: '469024104', + children: null, + }, + { + name: '多文镇', + code: '469024105', + children: null, + }, + { + name: '和舍镇', + code: '469024106', + children: null, + }, + { + name: '南宝镇', + code: '469024107', + children: null, + }, + { + name: '新盈镇', + code: '469024108', + children: null, + }, + { + name: '调楼镇', + code: '469024109', + children: null, + }, + { + name: '国营红华农场', + code: '469024400', + children: null, + }, + { + name: '国营加来农场', + code: '469024401', + children: null, + }, + ], + }, + { + name: '白沙黎族自治县', + code: '469025', + children: [ + { + name: '牙叉镇', + code: '469025100', + children: null, + }, + { + name: '七坊镇', + code: '469025101', + children: null, + }, + { + name: '邦溪镇', + code: '469025102', + children: null, + }, + { + name: '打安镇', + code: '469025103', + children: null, + }, + { + name: '细水乡', + code: '469025200', + children: null, + }, + { + name: '元门乡', + code: '469025201', + children: null, + }, + { + name: '南开乡', + code: '469025202', + children: null, + }, + { + name: '阜龙乡', + code: '469025203', + children: null, + }, + { + name: '青松乡', + code: '469025204', + children: null, + }, + { + name: '金波乡', + code: '469025205', + children: null, + }, + { + name: '荣邦乡', + code: '469025206', + children: null, + }, + { + name: '国营白沙农场', + code: '469025401', + children: null, + }, + { + name: '国营龙江农场', + code: '469025404', + children: null, + }, + { + name: '卫星农场', + code: '469025950', + children: null, + }, + ], + }, + { + name: '昌江黎族自治县', + code: '469026', + children: [ + { + name: '石碌镇', + code: '469026100', + children: null, + }, + { + name: '叉河镇', + code: '469026101', + children: null, + }, + { + name: '十月田镇', + code: '469026102', + children: null, + }, + { + name: '乌烈镇', + code: '469026103', + children: null, + }, + { + name: '昌化镇', + code: '469026104', + children: null, + }, + { + name: '海尾镇', + code: '469026105', + children: null, + }, + { + name: '七叉镇', + code: '469026106', + children: null, + }, + { + name: '王下乡', + code: '469026200', + children: null, + }, + { + name: '国营红林农场', + code: '469026401', + children: null, + }, + { + name: '国营霸王岭林场', + code: '469026500', + children: null, + }, + ], + }, + { + name: '乐东黎族自治县', + code: '469027', + children: [ + { + name: '抱由镇', + code: '469027100', + children: null, + }, + { + name: '万冲镇', + code: '469027101', + children: null, + }, + { + name: '大安镇', + code: '469027102', + children: null, + }, + { + name: '志仲镇', + code: '469027103', + children: null, + }, + { + name: '千家镇', + code: '469027104', + children: null, + }, + { + name: '九所镇', + code: '469027105', + children: null, + }, + { + name: '利国镇', + code: '469027106', + children: null, + }, + { + name: '黄流镇', + code: '469027107', + children: null, + }, + { + name: '佛罗镇', + code: '469027108', + children: null, + }, + { + name: '尖峰镇', + code: '469027109', + children: null, + }, + { + name: '莺歌海镇', + code: '469027110', + children: null, + }, + { + name: '国营山荣农场', + code: '469027401', + children: null, + }, + { + name: '国营乐光农场', + code: '469027402', + children: null, + }, + { + name: '国营保国农场', + code: '469027405', + children: null, + }, + { + name: '福报农场', + code: '469027951', + children: null, + }, + ], + }, + { + name: '陵水黎族自治县', + code: '469028', + children: [ + { + name: '椰林镇', + code: '469028100', + children: null, + }, + { + name: '光坡镇', + code: '469028101', + children: null, + }, + { + name: '三才镇', + code: '469028102', + children: null, + }, + { + name: '英州镇', + code: '469028103', + children: null, + }, + { + name: '隆广镇', + code: '469028104', + children: null, + }, + { + name: '文罗镇', + code: '469028105', + children: null, + }, + { + name: '本号镇', + code: '469028106', + children: null, + }, + { + name: '新村镇', + code: '469028107', + children: null, + }, + { + name: '黎安镇', + code: '469028108', + children: null, + }, + { + name: '提蒙乡', + code: '469028200', + children: null, + }, + { + name: '群英乡', + code: '469028201', + children: null, + }, + { + name: '岭门农场', + code: '469028400', + children: null, + }, + { + name: '国营南平农场', + code: '469028401', + children: null, + }, + ], + }, + { + name: '保亭黎族苗族自治县', + code: '469029', + children: [ + { + name: '保城镇', + code: '469029100', + children: null, + }, + { + name: '什玲镇', + code: '469029101', + children: null, + }, + { + name: '加茂镇', + code: '469029102', + children: null, + }, + { + name: '响水镇', + code: '469029103', + children: null, + }, + { + name: '新政镇', + code: '469029104', + children: null, + }, + { + name: '三道镇', + code: '469029105', + children: null, + }, + { + name: '六弓乡', + code: '469029200', + children: null, + }, + { + name: '南林乡', + code: '469029201', + children: null, + }, + { + name: '毛感乡', + code: '469029202', + children: null, + }, + { + name: '新星农场', + code: '469029401', + children: null, + }, + { + name: '海南保亭热带作物研究所', + code: '469029402', + children: null, + }, + { + name: '国营金江农场', + code: '469029403', + children: null, + }, + { + name: '南茂农场', + code: '469029950', + children: null, + }, + { + name: '通什茶场', + code: '469029952', + children: null, + }, + ], + }, + { + name: '琼中黎族苗族自治县', + code: '469030', + children: [ + { + name: '营根镇', + code: '469030100', + children: null, + }, + { + name: '湾岭镇', + code: '469030101', + children: null, + }, + { + name: '黎母山镇', + code: '469030102', + children: null, + }, + { + name: '和平镇', + code: '469030103', + children: null, + }, + { + name: '长征镇', + code: '469030104', + children: null, + }, + { + name: '红毛镇', + code: '469030105', + children: null, + }, + { + name: '中平镇', + code: '469030106', + children: null, + }, + { + name: '吊罗山乡', + code: '469030200', + children: null, + }, + { + name: '上安乡', + code: '469030201', + children: null, + }, + { + name: '什运乡', + code: '469030202', + children: null, + }, + { + name: '阳江农场', + code: '469030402', + children: null, + }, + { + name: '乌石农场', + code: '469030403', + children: null, + }, + { + name: '岭头茶场', + code: '469030950', + children: null, + }, + { + name: '南方农场', + code: '469030951', + children: null, + }, + ], + }, + ], + }, + { + name: '重庆市', + code: '500000', + children: [ + { + name: '重庆市', + code: '500100', + children: [ + { + name: '万州区', + code: '500101', + children: null, + }, + { + name: '涪陵区', + code: '500102', + children: null, + }, + { + name: '渝中区', + code: '500103', + children: null, + }, + { + name: '大渡口区', + code: '500104', + children: null, + }, + { + name: '江北区', + code: '500105', + children: null, + }, + { + name: '沙坪坝区', + code: '500106', + children: null, + }, + { + name: '九龙坡区', + code: '500107', + children: null, + }, + { + name: '南岸区', + code: '500108', + children: null, + }, + { + name: '北碚区', + code: '500109', + children: null, + }, + { + name: '綦江区', + code: '500110', + children: null, + }, + { + name: '大足区', + code: '500111', + children: null, + }, + { + name: '渝北区', + code: '500112', + children: null, + }, + { + name: '巴南区', + code: '500113', + children: null, + }, + { + name: '黔江区', + code: '500114', + children: null, + }, + { + name: '长寿区', + code: '500115', + children: null, + }, + { + name: '江津区', + code: '500116', + children: null, + }, + { + name: '合川区', + code: '500117', + children: null, + }, + { + name: '永川区', + code: '500118', + children: null, + }, + { + name: '南川区', + code: '500119', + children: null, + }, + { + name: '璧山区', + code: '500120', + children: null, + }, + { + name: '铜梁区', + code: '500151', + children: null, + }, + { + name: '潼南区', + code: '500152', + children: null, + }, + { + name: '荣昌区', + code: '500153', + children: null, + }, + { + name: '开州区', + code: '500154', + children: null, + }, + { + name: '梁平区', + code: '500155', + children: null, + }, + { + name: '武隆区', + code: '500156', + children: null, + }, + { + name: '城口县', + code: '500229', + children: null, + }, + { + name: '丰都县', + code: '500230', + children: null, + }, + { + name: '垫江县', + code: '500231', + children: null, + }, + { + name: '忠县', + code: '500233', + children: null, + }, + { + name: '云阳县', + code: '500235', + children: null, + }, + { + name: '奉节县', + code: '500236', + children: null, + }, + { + name: '巫山县', + code: '500237', + children: null, + }, + { + name: '巫溪县', + code: '500238', + children: null, + }, + { + name: '石柱土家族自治县', + code: '500240', + children: null, + }, + { + name: '秀山土家族苗族自治县', + code: '500241', + children: null, + }, + { + name: '酉阳土家族苗族自治县', + code: '500242', + children: null, + }, + { + name: '彭水苗族土家族自治县', + code: '500243', + children: null, + }, + ], + }, + ], + }, + { + name: '四川省', + code: '510000', + children: [ + { + name: '成都市', + code: '510100', + children: [ + { + name: '锦江区', + code: '510104', + children: null, + }, + { + name: '青羊区', + code: '510105', + children: null, + }, + { + name: '金牛区', + code: '510106', + children: null, + }, + { + name: '武侯区', + code: '510107', + children: null, + }, + { + name: '成华区', + code: '510108', + children: null, + }, + { + name: '龙泉驿区', + code: '510112', + children: null, + }, + { + name: '青白江区', + code: '510113', + children: null, + }, + { + name: '新都区', + code: '510114', + children: null, + }, + { + name: '温江区', + code: '510115', + children: null, + }, + { + name: '双流区', + code: '510116', + children: null, + }, + { + name: '郫都区', + code: '510117', + children: null, + }, + { + name: '金堂县', + code: '510121', + children: null, + }, + { + name: '大邑县', + code: '510129', + children: null, + }, + { + name: '蒲江县', + code: '510131', + children: null, + }, + { + name: '新津县', + code: '510132', + children: null, + }, + { + name: '都江堰市', + code: '510181', + children: null, + }, + { + name: '彭州市', + code: '510182', + children: null, + }, + { + name: '邛崃市', + code: '510183', + children: null, + }, + { + name: '崇州市', + code: '510184', + children: null, + }, + { + name: '简阳市', + code: '510185', + children: null, + }, + ], + }, + { + name: '自贡市', + code: '510300', + children: [ + { + name: '自流井区', + code: '510302', + children: null, + }, + { + name: '贡井区', + code: '510303', + children: null, + }, + { + name: '大安区', + code: '510304', + children: null, + }, + { + name: '沿滩区', + code: '510311', + children: null, + }, + { + name: '荣县', + code: '510321', + children: null, + }, + { + name: '富顺县', + code: '510322', + children: null, + }, + ], + }, + { + name: '攀枝花市', + code: '510400', + children: [ + { + name: '东区', + code: '510402', + children: null, + }, + { + name: '西区', + code: '510403', + children: null, + }, + { + name: '仁和区', + code: '510411', + children: null, + }, + { + name: '米易县', + code: '510421', + children: null, + }, + { + name: '盐边县', + code: '510422', + children: null, + }, + ], + }, + { + name: '泸州市', + code: '510500', + children: [ + { + name: '江阳区', + code: '510502', + children: null, + }, + { + name: '纳溪区', + code: '510503', + children: null, + }, + { + name: '龙马潭区', + code: '510504', + children: null, + }, + { + name: '泸县', + code: '510521', + children: null, + }, + { + name: '合江县', + code: '510522', + children: null, + }, + { + name: '叙永县', + code: '510524', + children: null, + }, + { + name: '古蔺县', + code: '510525', + children: null, + }, + ], + }, + { + name: '德阳市', + code: '510600', + children: [ + { + name: '旌阳区', + code: '510603', + children: null, + }, + { + name: '罗江区', + code: '510604', + children: null, + }, + { + name: '中江县', + code: '510623', + children: null, + }, + { + name: '广汉市', + code: '510681', + children: null, + }, + { + name: '什邡市', + code: '510682', + children: null, + }, + { + name: '绵竹市', + code: '510683', + children: null, + }, + ], + }, + { + name: '绵阳市', + code: '510700', + children: [ + { + name: '涪城区', + code: '510703', + children: null, + }, + { + name: '游仙区', + code: '510704', + children: null, + }, + { + name: '安州区', + code: '510705', + children: null, + }, + { + name: '三台县', + code: '510722', + children: null, + }, + { + name: '盐亭县', + code: '510723', + children: null, + }, + { + name: '梓潼县', + code: '510725', + children: null, + }, + { + name: '北川羌族自治县', + code: '510726', + children: null, + }, + { + name: '平武县', + code: '510727', + children: null, + }, + { + name: '江油市', + code: '510781', + children: null, + }, + ], + }, + { + name: '广元市', + code: '510800', + children: [ + { + name: '利州区', + code: '510802', + children: null, + }, + { + name: '昭化区', + code: '510811', + children: null, + }, + { + name: '朝天区', + code: '510812', + children: null, + }, + { + name: '旺苍县', + code: '510821', + children: null, + }, + { + name: '青川县', + code: '510822', + children: null, + }, + { + name: '剑阁县', + code: '510823', + children: null, + }, + { + name: '苍溪县', + code: '510824', + children: null, + }, + ], + }, + { + name: '遂宁市', + code: '510900', + children: [ + { + name: '船山区', + code: '510903', + children: null, + }, + { + name: '安居区', + code: '510904', + children: null, + }, + { + name: '蓬溪县', + code: '510921', + children: null, + }, + { + name: '射洪县', + code: '510922', + children: null, + }, + { + name: '大英县', + code: '510923', + children: null, + }, + ], + }, + { + name: '内江市', + code: '511000', + children: [ + { + name: '市中区', + code: '511002', + children: null, + }, + { + name: '东兴区', + code: '511011', + children: null, + }, + { + name: '威远县', + code: '511024', + children: null, + }, + { + name: '资中县', + code: '511025', + children: null, + }, + { + name: '隆昌市', + code: '511083', + children: null, + }, + ], + }, + { + name: '乐山市', + code: '511100', + children: [ + { + name: '市中区', + code: '511102', + children: null, + }, + { + name: '沙湾区', + code: '511111', + children: null, + }, + { + name: '五通桥区', + code: '511112', + children: null, + }, + { + name: '金口河区', + code: '511113', + children: null, + }, + { + name: '犍为县', + code: '511123', + children: null, + }, + { + name: '井研县', + code: '511124', + children: null, + }, + { + name: '夹江县', + code: '511126', + children: null, + }, + { + name: '沐川县', + code: '511129', + children: null, + }, + { + name: '峨边彝族自治县', + code: '511132', + children: null, + }, + { + name: '马边彝族自治县', + code: '511133', + children: null, + }, + { + name: '峨眉山市', + code: '511181', + children: null, + }, + ], + }, + { + name: '南充市', + code: '511300', + children: [ + { + name: '顺庆区', + code: '511302', + children: null, + }, + { + name: '高坪区', + code: '511303', + children: null, + }, + { + name: '嘉陵区', + code: '511304', + children: null, + }, + { + name: '南部县', + code: '511321', + children: null, + }, + { + name: '营山县', + code: '511322', + children: null, + }, + { + name: '蓬安县', + code: '511323', + children: null, + }, + { + name: '仪陇县', + code: '511324', + children: null, + }, + { + name: '西充县', + code: '511325', + children: null, + }, + { + name: '阆中市', + code: '511381', + children: null, + }, + ], + }, + { + name: '眉山市', + code: '511400', + children: [ + { + name: '东坡区', + code: '511402', + children: null, + }, + { + name: '彭山区', + code: '511403', + children: null, + }, + { + name: '仁寿县', + code: '511421', + children: null, + }, + { + name: '洪雅县', + code: '511423', + children: null, + }, + { + name: '丹棱县', + code: '511424', + children: null, + }, + { + name: '青神县', + code: '511425', + children: null, + }, + ], + }, + { + name: '宜宾市', + code: '511500', + children: [ + { + name: '翠屏区', + code: '511502', + children: null, + }, + { + name: '南溪区', + code: '511503', + children: null, + }, + { + name: '叙州区', + code: '511504', + children: null, + }, + { + name: '江安县', + code: '511523', + children: null, + }, + { + name: '长宁县', + code: '511524', + children: null, + }, + { + name: '高县', + code: '511525', + children: null, + }, + { + name: '珙县', + code: '511526', + children: null, + }, + { + name: '筠连县', + code: '511527', + children: null, + }, + { + name: '兴文县', + code: '511528', + children: null, + }, + { + name: '屏山县', + code: '511529', + children: null, + }, + ], + }, + { + name: '广安市', + code: '511600', + children: [ + { + name: '广安区', + code: '511602', + children: null, + }, + { + name: '前锋区', + code: '511603', + children: null, + }, + { + name: '岳池县', + code: '511621', + children: null, + }, + { + name: '武胜县', + code: '511622', + children: null, + }, + { + name: '邻水县', + code: '511623', + children: null, + }, + { + name: '华蓥市', + code: '511681', + children: null, + }, + ], + }, + { + name: '达州市', + code: '511700', + children: [ + { + name: '通川区', + code: '511702', + children: null, + }, + { + name: '达川区', + code: '511703', + children: null, + }, + { + name: '宣汉县', + code: '511722', + children: null, + }, + { + name: '开江县', + code: '511723', + children: null, + }, + { + name: '大竹县', + code: '511724', + children: null, + }, + { + name: '渠县', + code: '511725', + children: null, + }, + { + name: '万源市', + code: '511781', + children: null, + }, + ], + }, + { + name: '雅安市', + code: '511800', + children: [ + { + name: '雨城区', + code: '511802', + children: null, + }, + { + name: '名山区', + code: '511803', + children: null, + }, + { + name: '荥经县', + code: '511822', + children: null, + }, + { + name: '汉源县', + code: '511823', + children: null, + }, + { + name: '石棉县', + code: '511824', + children: null, + }, + { + name: '天全县', + code: '511825', + children: null, + }, + { + name: '芦山县', + code: '511826', + children: null, + }, + { + name: '宝兴县', + code: '511827', + children: null, + }, + ], + }, + { + name: '巴中市', + code: '511900', + children: [ + { + name: '巴州区', + code: '511902', + children: null, + }, + { + name: '恩阳区', + code: '511903', + children: null, + }, + { + name: '通江县', + code: '511921', + children: null, + }, + { + name: '南江县', + code: '511922', + children: null, + }, + { + name: '平昌县', + code: '511923', + children: null, + }, + ], + }, + { + name: '资阳市', + code: '512000', + children: [ + { + name: '雁江区', + code: '512002', + children: null, + }, + { + name: '安岳县', + code: '512021', + children: null, + }, + { + name: '乐至县', + code: '512022', + children: null, + }, + ], + }, + { + name: '阿坝藏族羌族自治州', + code: '513200', + children: [ + { + name: '马尔康市', + code: '513201', + children: null, + }, + { + name: '汶川县', + code: '513221', + children: null, + }, + { + name: '理县', + code: '513222', + children: null, + }, + { + name: '茂县', + code: '513223', + children: null, + }, + { + name: '松潘县', + code: '513224', + children: null, + }, + { + name: '九寨沟县', + code: '513225', + children: null, + }, + { + name: '金川县', + code: '513226', + children: null, + }, + { + name: '小金县', + code: '513227', + children: null, + }, + { + name: '黑水县', + code: '513228', + children: null, + }, + { + name: '壤塘县', + code: '513230', + children: null, + }, + { + name: '阿坝县', + code: '513231', + children: null, + }, + { + name: '若尔盖县', + code: '513232', + children: null, + }, + { + name: '红原县', + code: '513233', + children: null, + }, + ], + }, + { + name: '甘孜藏族自治州', + code: '513300', + children: [ + { + name: '康定市', + code: '513301', + children: null, + }, + { + name: '泸定县', + code: '513322', + children: null, + }, + { + name: '丹巴县', + code: '513323', + children: null, + }, + { + name: '九龙县', + code: '513324', + children: null, + }, + { + name: '雅江县', + code: '513325', + children: null, + }, + { + name: '道孚县', + code: '513326', + children: null, + }, + { + name: '炉霍县', + code: '513327', + children: null, + }, + { + name: '甘孜县', + code: '513328', + children: null, + }, + { + name: '新龙县', + code: '513329', + children: null, + }, + { + name: '德格县', + code: '513330', + children: null, + }, + { + name: '白玉县', + code: '513331', + children: null, + }, + { + name: '石渠县', + code: '513332', + children: null, + }, + { + name: '色达县', + code: '513333', + children: null, + }, + { + name: '理塘县', + code: '513334', + children: null, + }, + { + name: '巴塘县', + code: '513335', + children: null, + }, + { + name: '乡城县', + code: '513336', + children: null, + }, + { + name: '稻城县', + code: '513337', + children: null, + }, + { + name: '得荣县', + code: '513338', + children: null, + }, + ], + }, + { + name: '凉山彝族自治州', + code: '513400', + children: [ + { + name: '西昌市', + code: '513401', + children: null, + }, + { + name: '木里藏族自治县', + code: '513422', + children: null, + }, + { + name: '盐源县', + code: '513423', + children: null, + }, + { + name: '德昌县', + code: '513424', + children: null, + }, + { + name: '会理县', + code: '513425', + children: null, + }, + { + name: '会东县', + code: '513426', + children: null, + }, + { + name: '宁南县', + code: '513427', + children: null, + }, + { + name: '普格县', + code: '513428', + children: null, + }, + { + name: '布拖县', + code: '513429', + children: null, + }, + { + name: '金阳县', + code: '513430', + children: null, + }, + { + name: '昭觉县', + code: '513431', + children: null, + }, + { + name: '喜德县', + code: '513432', + children: null, + }, + { + name: '冕宁县', + code: '513433', + children: null, + }, + { + name: '越西县', + code: '513434', + children: null, + }, + { + name: '甘洛县', + code: '513435', + children: null, + }, + { + name: '美姑县', + code: '513436', + children: null, + }, + { + name: '雷波县', + code: '513437', + children: null, + }, + ], + }, + ], + }, + { + name: '贵州省', + code: '520000', + children: [ + { + name: '贵阳市', + code: '520100', + children: [ + { + name: '南明区', + code: '520102', + children: null, + }, + { + name: '云岩区', + code: '520103', + children: null, + }, + { + name: '花溪区', + code: '520111', + children: null, + }, + { + name: '乌当区', + code: '520112', + children: null, + }, + { + name: '白云区', + code: '520113', + children: null, + }, + { + name: '观山湖区', + code: '520115', + children: null, + }, + { + name: '开阳县', + code: '520121', + children: null, + }, + { + name: '息烽县', + code: '520122', + children: null, + }, + { + name: '修文县', + code: '520123', + children: null, + }, + { + name: '清镇市', + code: '520181', + children: null, + }, + ], + }, + { + name: '六盘水市', + code: '520200', + children: [ + { + name: '钟山区', + code: '520201', + children: null, + }, + { + name: '六枝特区', + code: '520203', + children: null, + }, + { + name: '水城县', + code: '520221', + children: null, + }, + { + name: '盘州市', + code: '520281', + children: null, + }, + ], + }, + { + name: '遵义市', + code: '520300', + children: [ + { + name: '红花岗区', + code: '520302', + children: null, + }, + { + name: '汇川区', + code: '520303', + children: null, + }, + { + name: '播州区', + code: '520304', + children: null, + }, + { + name: '桐梓县', + code: '520322', + children: null, + }, + { + name: '绥阳县', + code: '520323', + children: null, + }, + { + name: '正安县', + code: '520324', + children: null, + }, + { + name: '道真仡佬族苗族自治县', + code: '520325', + children: null, + }, + { + name: '务川仡佬族苗族自治县', + code: '520326', + children: null, + }, + { + name: '凤冈县', + code: '520327', + children: null, + }, + { + name: '湄潭县', + code: '520328', + children: null, + }, + { + name: '余庆县', + code: '520329', + children: null, + }, + { + name: '习水县', + code: '520330', + children: null, + }, + { + name: '赤水市', + code: '520381', + children: null, + }, + { + name: '仁怀市', + code: '520382', + children: null, + }, + ], + }, + { + name: '安顺市', + code: '520400', + children: [ + { + name: '西秀区', + code: '520402', + children: null, + }, + { + name: '平坝区', + code: '520403', + children: null, + }, + { + name: '普定县', + code: '520422', + children: null, + }, + { + name: '镇宁布依族苗族自治县', + code: '520423', + children: null, + }, + { + name: '关岭布依族苗族自治县', + code: '520424', + children: null, + }, + { + name: '紫云苗族布依族自治县', + code: '520425', + children: null, + }, + ], + }, + { + name: '毕节市', + code: '520500', + children: [ + { + name: '七星关区', + code: '520502', + children: null, + }, + { + name: '大方县', + code: '520521', + children: null, + }, + { + name: '黔西县', + code: '520522', + children: null, + }, + { + name: '金沙县', + code: '520523', + children: null, + }, + { + name: '织金县', + code: '520524', + children: null, + }, + { + name: '纳雍县', + code: '520525', + children: null, + }, + { + name: '威宁彝族回族苗族自治县', + code: '520526', + children: null, + }, + { + name: '赫章县', + code: '520527', + children: null, + }, + ], + }, + { + name: '铜仁市', + code: '520600', + children: [ + { + name: '碧江区', + code: '520602', + children: null, + }, + { + name: '万山区', + code: '520603', + children: null, + }, + { + name: '江口县', + code: '520621', + children: null, + }, + { + name: '玉屏侗族自治县', + code: '520622', + children: null, + }, + { + name: '石阡县', + code: '520623', + children: null, + }, + { + name: '思南县', + code: '520624', + children: null, + }, + { + name: '印江土家族苗族自治县', + code: '520625', + children: null, + }, + { + name: '德江县', + code: '520626', + children: null, + }, + { + name: '沿河土家族自治县', + code: '520627', + children: null, + }, + { + name: '松桃苗族自治县', + code: '520628', + children: null, + }, + ], + }, + { + name: '黔西南布依族苗族自治州', + code: '522300', + children: [ + { + name: '兴义市', + code: '522301', + children: null, + }, + { + name: '兴仁市', + code: '522302', + children: null, + }, + { + name: '普安县', + code: '522323', + children: null, + }, + { + name: '晴隆县', + code: '522324', + children: null, + }, + { + name: '贞丰县', + code: '522325', + children: null, + }, + { + name: '望谟县', + code: '522326', + children: null, + }, + { + name: '册亨县', + code: '522327', + children: null, + }, + { + name: '安龙县', + code: '522328', + children: null, + }, + ], + }, + { + name: '黔东南苗族侗族自治州', + code: '522600', + children: [ + { + name: '凯里市', + code: '522601', + children: null, + }, + { + name: '黄平县', + code: '522622', + children: null, + }, + { + name: '施秉县', + code: '522623', + children: null, + }, + { + name: '三穗县', + code: '522624', + children: null, + }, + { + name: '镇远县', + code: '522625', + children: null, + }, + { + name: '岑巩县', + code: '522626', + children: null, + }, + { + name: '天柱县', + code: '522627', + children: null, + }, + { + name: '锦屏县', + code: '522628', + children: null, + }, + { + name: '剑河县', + code: '522629', + children: null, + }, + { + name: '台江县', + code: '522630', + children: null, + }, + { + name: '黎平县', + code: '522631', + children: null, + }, + { + name: '榕江县', + code: '522632', + children: null, + }, + { + name: '从江县', + code: '522633', + children: null, + }, + { + name: '雷山县', + code: '522634', + children: null, + }, + { + name: '麻江县', + code: '522635', + children: null, + }, + { + name: '丹寨县', + code: '522636', + children: null, + }, + ], + }, + { + name: '黔南布依族苗族自治州', + code: '522700', + children: [ + { + name: '都匀市', + code: '522701', + children: null, + }, + { + name: '福泉市', + code: '522702', + children: null, + }, + { + name: '荔波县', + code: '522722', + children: null, + }, + { + name: '贵定县', + code: '522723', + children: null, + }, + { + name: '瓮安县', + code: '522725', + children: null, + }, + { + name: '独山县', + code: '522726', + children: null, + }, + { + name: '平塘县', + code: '522727', + children: null, + }, + { + name: '罗甸县', + code: '522728', + children: null, + }, + { + name: '长顺县', + code: '522729', + children: null, + }, + { + name: '龙里县', + code: '522730', + children: null, + }, + { + name: '惠水县', + code: '522731', + children: null, + }, + { + name: '三都水族自治县', + code: '522732', + children: null, + }, + ], + }, + ], + }, + { + name: '云南省', + code: '530000', + children: [ + { + name: '昆明市', + code: '530100', + children: [ + { + name: '五华区', + code: '530102', + children: null, + }, + { + name: '盘龙区', + code: '530103', + children: null, + }, + { + name: '官渡区', + code: '530111', + children: null, + }, + { + name: '西山区', + code: '530112', + children: null, + }, + { + name: '东川区', + code: '530113', + children: null, + }, + { + name: '呈贡区', + code: '530114', + children: null, + }, + { + name: '晋宁区', + code: '530115', + children: null, + }, + { + name: '富民县', + code: '530124', + children: null, + }, + { + name: '宜良县', + code: '530125', + children: null, + }, + { + name: '石林彝族自治县', + code: '530126', + children: null, + }, + { + name: '嵩明县', + code: '530127', + children: null, + }, + { + name: '禄劝彝族苗族自治县', + code: '530128', + children: null, + }, + { + name: '寻甸回族彝族自治县', + code: '530129', + children: null, + }, + { + name: '安宁市', + code: '530181', + children: null, + }, + ], + }, + { + name: '曲靖市', + code: '530300', + children: [ + { + name: '麒麟区', + code: '530302', + children: null, + }, + { + name: '沾益区', + code: '530303', + children: null, + }, + { + name: '马龙区', + code: '530304', + children: null, + }, + { + name: '陆良县', + code: '530322', + children: null, + }, + { + name: '师宗县', + code: '530323', + children: null, + }, + { + name: '罗平县', + code: '530324', + children: null, + }, + { + name: '富源县', + code: '530325', + children: null, + }, + { + name: '会泽县', + code: '530326', + children: null, + }, + { + name: '宣威市', + code: '530381', + children: null, + }, + ], + }, + { + name: '玉溪市', + code: '530400', + children: [ + { + name: '红塔区', + code: '530402', + children: null, + }, + { + name: '江川区', + code: '530403', + children: null, + }, + { + name: '澄江县', + code: '530422', + children: null, + }, + { + name: '通海县', + code: '530423', + children: null, + }, + { + name: '华宁县', + code: '530424', + children: null, + }, + { + name: '易门县', + code: '530425', + children: null, + }, + { + name: '峨山彝族自治县', + code: '530426', + children: null, + }, + { + name: '新平彝族傣族自治县', + code: '530427', + children: null, + }, + { + name: '元江县', + code: '530428', + children: null, + }, + ], + }, + { + name: '保山市', + code: '530500', + children: [ + { + name: '隆阳区', + code: '530502', + children: null, + }, + { + name: '施甸县', + code: '530521', + children: null, + }, + { + name: '龙陵县', + code: '530523', + children: null, + }, + { + name: '昌宁县', + code: '530524', + children: null, + }, + { + name: '腾冲市', + code: '530581', + children: null, + }, + ], + }, + { + name: '昭通市', + code: '530600', + children: [ + { + name: '昭阳区', + code: '530602', + children: null, + }, + { + name: '鲁甸县', + code: '530621', + children: null, + }, + { + name: '巧家县', + code: '530622', + children: null, + }, + { + name: '盐津县', + code: '530623', + children: null, + }, + { + name: '大关县', + code: '530624', + children: null, + }, + { + name: '永善县', + code: '530625', + children: null, + }, + { + name: '绥江县', + code: '530626', + children: null, + }, + { + name: '镇雄县', + code: '530627', + children: null, + }, + { + name: '彝良县', + code: '530628', + children: null, + }, + { + name: '威信县', + code: '530629', + children: null, + }, + { + name: '水富市', + code: '530681', + children: null, + }, + ], + }, + { + name: '丽江市', + code: '530700', + children: [ + { + name: '古城区', + code: '530702', + children: null, + }, + { + name: '玉龙纳西族自治县', + code: '530721', + children: null, + }, + { + name: '永胜县', + code: '530722', + children: null, + }, + { + name: '华坪县', + code: '530723', + children: null, + }, + { + name: '宁蒗彝族自治县', + code: '530724', + children: null, + }, + ], + }, + { + name: '普洱市', + code: '530800', + children: [ + { + name: '思茅区', + code: '530802', + children: null, + }, + { + name: '宁洱哈尼族彝族自治县', + code: '530821', + children: null, + }, + { + name: '墨江哈尼族自治县', + code: '530822', + children: null, + }, + { + name: '景东彝族自治县', + code: '530823', + children: null, + }, + { + name: '景谷傣族彝族自治县', + code: '530824', + children: null, + }, + { + name: '镇沅县', + code: '530825', + children: null, + }, + { + name: '江城哈尼族彝族自治县', + code: '530826', + children: null, + }, + { + name: '孟连县', + code: '530827', + children: null, + }, + { + name: '澜沧拉祜族自治县', + code: '530828', + children: null, + }, + { + name: '西盟佤族自治县', + code: '530829', + children: null, + }, + ], + }, + { + name: '临沧市', + code: '530900', + children: [ + { + name: '临翔区', + code: '530902', + children: null, + }, + { + name: '凤庆县', + code: '530921', + children: null, + }, + { + name: '云县', + code: '530922', + children: null, + }, + { + name: '永德县', + code: '530923', + children: null, + }, + { + name: '镇康县', + code: '530924', + children: null, + }, + { + name: '双江县', + code: '530925', + children: null, + }, + { + name: '耿马傣族佤族自治县', + code: '530926', + children: null, + }, + { + name: '沧源佤族自治县', + code: '530927', + children: null, + }, + ], + }, + { + name: '楚雄彝族自治州', + code: '532300', + children: [ + { + name: '楚雄市', + code: '532301', + children: null, + }, + { + name: '双柏县', + code: '532322', + children: null, + }, + { + name: '牟定县', + code: '532323', + children: null, + }, + { + name: '南华县', + code: '532324', + children: null, + }, + { + name: '姚安县', + code: '532325', + children: null, + }, + { + name: '大姚县', + code: '532326', + children: null, + }, + { + name: '永仁县', + code: '532327', + children: null, + }, + { + name: '元谋县', + code: '532328', + children: null, + }, + { + name: '武定县', + code: '532329', + children: null, + }, + { + name: '禄丰县', + code: '532331', + children: null, + }, + ], + }, + { + name: '红河哈尼族彝族自治州', + code: '532500', + children: [ + { + name: '个旧市', + code: '532501', + children: null, + }, + { + name: '开远市', + code: '532502', + children: null, + }, + { + name: '蒙自市', + code: '532503', + children: null, + }, + { + name: '弥勒市', + code: '532504', + children: null, + }, + { + name: '屏边苗族自治县', + code: '532523', + children: null, + }, + { + name: '建水县', + code: '532524', + children: null, + }, + { + name: '石屏县', + code: '532525', + children: null, + }, + { + name: '泸西县', + code: '532527', + children: null, + }, + { + name: '元阳县', + code: '532528', + children: null, + }, + { + name: '红河县', + code: '532529', + children: null, + }, + { + name: '金平苗族瑶族傣族自治县', + code: '532530', + children: null, + }, + { + name: '绿春县', + code: '532531', + children: null, + }, + { + name: '河口瑶族自治县', + code: '532532', + children: null, + }, + ], + }, + { + name: '文山壮族苗族自治州', + code: '532600', + children: [ + { + name: '文山市', + code: '532601', + children: null, + }, + { + name: '砚山县', + code: '532622', + children: null, + }, + { + name: '西畴县', + code: '532623', + children: null, + }, + { + name: '麻栗坡县', + code: '532624', + children: null, + }, + { + name: '马关县', + code: '532625', + children: null, + }, + { + name: '丘北县', + code: '532626', + children: null, + }, + { + name: '广南县', + code: '532627', + children: null, + }, + { + name: '富宁县', + code: '532628', + children: null, + }, + ], + }, + { + name: '西双版纳傣族自治州', + code: '532800', + children: [ + { + name: '景洪市', + code: '532801', + children: null, + }, + { + name: '勐海县', + code: '532822', + children: null, + }, + { + name: '勐腊县', + code: '532823', + children: null, + }, + ], + }, + { + name: '大理白族自治州', + code: '532900', + children: [ + { + name: '大理市', + code: '532901', + children: null, + }, + { + name: '漾濞彝族自治县', + code: '532922', + children: null, + }, + { + name: '祥云县', + code: '532923', + children: null, + }, + { + name: '宾川县', + code: '532924', + children: null, + }, + { + name: '弥渡县', + code: '532925', + children: null, + }, + { + name: '南涧彝族自治县', + code: '532926', + children: null, + }, + { + name: '巍山彝族回族自治县', + code: '532927', + children: null, + }, + { + name: '永平县', + code: '532928', + children: null, + }, + { + name: '云龙县', + code: '532929', + children: null, + }, + { + name: '洱源县', + code: '532930', + children: null, + }, + { + name: '剑川县', + code: '532931', + children: null, + }, + { + name: '鹤庆县', + code: '532932', + children: null, + }, + ], + }, + { + name: '德宏傣族景颇族自治州', + code: '533100', + children: [ + { + name: '瑞丽市', + code: '533102', + children: null, + }, + { + name: '芒市', + code: '533103', + children: null, + }, + { + name: '梁河县', + code: '533122', + children: null, + }, + { + name: '盈江县', + code: '533123', + children: null, + }, + { + name: '陇川县', + code: '533124', + children: null, + }, + ], + }, + { + name: '怒江傈僳族自治州', + code: '533300', + children: [ + { + name: '泸水市', + code: '533301', + children: null, + }, + { + name: '福贡县', + code: '533323', + children: null, + }, + { + name: '贡山独龙族怒族自治县', + code: '533324', + children: null, + }, + { + name: '兰坪白族普米族自治县', + code: '533325', + children: null, + }, + ], + }, + { + name: '迪庆藏族自治州', + code: '533400', + children: [ + { + name: '香格里拉市', + code: '533401', + children: null, + }, + { + name: '德钦县', + code: '533422', + children: null, + }, + { + name: '维西傈僳族自治县', + code: '533423', + children: null, + }, + ], + }, + ], + }, + { + name: '西藏自治区', + code: '540000', + children: [ + { + name: '拉萨市', + code: '540100', + children: [ + { + name: '城关区', + code: '540102', + children: null, + }, + { + name: '堆龙德庆区', + code: '540103', + children: null, + }, + { + name: '达孜区', + code: '540104', + children: null, + }, + { + name: '林周县', + code: '540121', + children: null, + }, + { + name: '当雄县', + code: '540122', + children: null, + }, + { + name: '尼木县', + code: '540123', + children: null, + }, + { + name: '曲水县', + code: '540124', + children: null, + }, + { + name: '墨竹工卡县', + code: '540127', + children: null, + }, + ], + }, + { + name: '日喀则市', + code: '540200', + children: [ + { + name: '桑珠孜区', + code: '540202', + children: null, + }, + { + name: '南木林县', + code: '540221', + children: null, + }, + { + name: '江孜县', + code: '540222', + children: null, + }, + { + name: '定日县', + code: '540223', + children: null, + }, + { + name: '萨迦县', + code: '540224', + children: null, + }, + { + name: '拉孜县', + code: '540225', + children: null, + }, + { + name: '昂仁县', + code: '540226', + children: null, + }, + { + name: '谢通门县', + code: '540227', + children: null, + }, + { + name: '白朗县', + code: '540228', + children: null, + }, + { + name: '仁布县', + code: '540229', + children: null, + }, + { + name: '康马县', + code: '540230', + children: null, + }, + { + name: '定结县', + code: '540231', + children: null, + }, + { + name: '仲巴县', + code: '540232', + children: null, + }, + { + name: '亚东县', + code: '540233', + children: null, + }, + { + name: '吉隆县', + code: '540234', + children: null, + }, + { + name: '聂拉木县', + code: '540235', + children: null, + }, + { + name: '萨嘎县', + code: '540236', + children: null, + }, + { + name: '岗巴县', + code: '540237', + children: null, + }, + ], + }, + { + name: '昌都市', + code: '540300', + children: [ + { + name: '卡若区', + code: '540302', + children: null, + }, + { + name: '江达县', + code: '540321', + children: null, + }, + { + name: '贡觉县', + code: '540322', + children: null, + }, + { + name: '类乌齐县', + code: '540323', + children: null, + }, + { + name: '丁青县', + code: '540324', + children: null, + }, + { + name: '察雅县', + code: '540325', + children: null, + }, + { + name: '八宿县', + code: '540326', + children: null, + }, + { + name: '左贡县', + code: '540327', + children: null, + }, + { + name: '芒康县', + code: '540328', + children: null, + }, + { + name: '洛隆县', + code: '540329', + children: null, + }, + { + name: '边坝县', + code: '540330', + children: null, + }, + ], + }, + { + name: '林芝市', + code: '540400', + children: [ + { + name: '巴宜区', + code: '540402', + children: null, + }, + { + name: '工布江达县', + code: '540421', + children: null, + }, + { + name: '米林县', + code: '540422', + children: null, + }, + { + name: '墨脱县', + code: '540423', + children: null, + }, + { + name: '波密县', + code: '540424', + children: null, + }, + { + name: '察隅县', + code: '540425', + children: null, + }, + { + name: '朗县', + code: '540426', + children: null, + }, + ], + }, + { + name: '山南市', + code: '540500', + children: [ + { + name: '乃东区', + code: '540502', + children: null, + }, + { + name: '扎囊县', + code: '540521', + children: null, + }, + { + name: '贡嘎县', + code: '540522', + children: null, + }, + { + name: '桑日县', + code: '540523', + children: null, + }, + { + name: '琼结县', + code: '540524', + children: null, + }, + { + name: '曲松县', + code: '540525', + children: null, + }, + { + name: '措美县', + code: '540526', + children: null, + }, + { + name: '洛扎县', + code: '540527', + children: null, + }, + { + name: '加查县', + code: '540528', + children: null, + }, + { + name: '隆子县', + code: '540529', + children: null, + }, + { + name: '错那县', + code: '540530', + children: null, + }, + { + name: '浪卡子县', + code: '540531', + children: null, + }, + ], + }, + { + name: '那曲市', + code: '540600', + children: [ + { + name: '色尼区', + code: '540602', + children: null, + }, + { + name: '嘉黎县', + code: '540621', + children: null, + }, + { + name: '比如县', + code: '540622', + children: null, + }, + { + name: '聂荣县', + code: '540623', + children: null, + }, + { + name: '安多县', + code: '540624', + children: null, + }, + { + name: '申扎县', + code: '540625', + children: null, + }, + { + name: '索县', + code: '540626', + children: null, + }, + { + name: '班戈县', + code: '540627', + children: null, + }, + { + name: '巴青县', + code: '540628', + children: null, + }, + { + name: '尼玛县', + code: '540629', + children: null, + }, + { + name: '双湖县', + code: '540630', + children: null, + }, + ], + }, + { + name: '阿里地区', + code: '542500', + children: [ + { + name: '普兰县', + code: '542521', + children: null, + }, + { + name: '札达县', + code: '542522', + children: null, + }, + { + name: '噶尔县', + code: '542523', + children: null, + }, + { + name: '日土县', + code: '542524', + children: null, + }, + { + name: '革吉县', + code: '542525', + children: null, + }, + { + name: '改则县', + code: '542526', + children: null, + }, + { + name: '措勤县', + code: '542527', + children: null, + }, + ], + }, + ], + }, + { + name: '陕西省', + code: '610000', + children: [ + { + name: '西安市', + code: '610100', + children: [ + { + name: '新城区', + code: '610102', + children: null, + }, + { + name: '碑林区', + code: '610103', + children: null, + }, + { + name: '莲湖区', + code: '610104', + children: null, + }, + { + name: '灞桥区', + code: '610111', + children: null, + }, + { + name: '未央区', + code: '610112', + children: null, + }, + { + name: '雁塔区', + code: '610113', + children: null, + }, + { + name: '阎良区', + code: '610114', + children: null, + }, + { + name: '临潼区', + code: '610115', + children: null, + }, + { + name: '长安区', + code: '610116', + children: null, + }, + { + name: '高陵区', + code: '610117', + children: null, + }, + { + name: '鄠邑区', + code: '610118', + children: null, + }, + { + name: '蓝田县', + code: '610122', + children: null, + }, + { + name: '周至县', + code: '610124', + children: null, + }, + ], + }, + { + name: '铜川市', + code: '610200', + children: [ + { + name: '王益区', + code: '610202', + children: null, + }, + { + name: '印台区', + code: '610203', + children: null, + }, + { + name: '耀州区', + code: '610204', + children: null, + }, + { + name: '宜君县', + code: '610222', + children: null, + }, + ], + }, + { + name: '宝鸡市', + code: '610300', + children: [ + { + name: '渭滨区', + code: '610302', + children: null, + }, + { + name: '金台区', + code: '610303', + children: null, + }, + { + name: '陈仓区', + code: '610304', + children: null, + }, + { + name: '凤翔县', + code: '610322', + children: null, + }, + { + name: '岐山县', + code: '610323', + children: null, + }, + { + name: '扶风县', + code: '610324', + children: null, + }, + { + name: '眉县', + code: '610326', + children: null, + }, + { + name: '陇县', + code: '610327', + children: null, + }, + { + name: '千阳县', + code: '610328', + children: null, + }, + { + name: '麟游县', + code: '610329', + children: null, + }, + { + name: '凤县', + code: '610330', + children: null, + }, + { + name: '太白县', + code: '610331', + children: null, + }, + ], + }, + { + name: '咸阳市', + code: '610400', + children: [ + { + name: '秦都区', + code: '610402', + children: null, + }, + { + name: '杨陵区', + code: '610403', + children: null, + }, + { + name: '渭城区', + code: '610404', + children: null, + }, + { + name: '三原县', + code: '610422', + children: null, + }, + { + name: '泾阳县', + code: '610423', + children: null, + }, + { + name: '乾县', + code: '610424', + children: null, + }, + { + name: '礼泉县', + code: '610425', + children: null, + }, + { + name: '永寿县', + code: '610426', + children: null, + }, + { + name: '长武县', + code: '610428', + children: null, + }, + { + name: '旬邑县', + code: '610429', + children: null, + }, + { + name: '淳化县', + code: '610430', + children: null, + }, + { + name: '武功县', + code: '610431', + children: null, + }, + { + name: '兴平市', + code: '610481', + children: null, + }, + { + name: '彬州市', + code: '610482', + children: null, + }, + ], + }, + { + name: '渭南市', + code: '610500', + children: [ + { + name: '临渭区', + code: '610502', + children: null, + }, + { + name: '华州区', + code: '610503', + children: null, + }, + { + name: '潼关县', + code: '610522', + children: null, + }, + { + name: '大荔县', + code: '610523', + children: null, + }, + { + name: '合阳县', + code: '610524', + children: null, + }, + { + name: '澄城县', + code: '610525', + children: null, + }, + { + name: '蒲城县', + code: '610526', + children: null, + }, + { + name: '白水县', + code: '610527', + children: null, + }, + { + name: '富平县', + code: '610528', + children: null, + }, + { + name: '韩城市', + code: '610581', + children: null, + }, + { + name: '华阴市', + code: '610582', + children: null, + }, + ], + }, + { + name: '延安市', + code: '610600', + children: [ + { + name: '宝塔区', + code: '610602', + children: null, + }, + { + name: '安塞区', + code: '610603', + children: null, + }, + { + name: '延长县', + code: '610621', + children: null, + }, + { + name: '延川县', + code: '610622', + children: null, + }, + { + name: '子长县', + code: '610623', + children: null, + }, + { + name: '志丹县', + code: '610625', + children: null, + }, + { + name: '吴起县', + code: '610626', + children: null, + }, + { + name: '甘泉县', + code: '610627', + children: null, + }, + { + name: '富县', + code: '610628', + children: null, + }, + { + name: '洛川县', + code: '610629', + children: null, + }, + { + name: '宜川县', + code: '610630', + children: null, + }, + { + name: '黄龙县', + code: '610631', + children: null, + }, + { + name: '黄陵县', + code: '610632', + children: null, + }, + ], + }, + { + name: '汉中市', + code: '610700', + children: [ + { + name: '汉台区', + code: '610702', + children: null, + }, + { + name: '南郑区', + code: '610703', + children: null, + }, + { + name: '城固县', + code: '610722', + children: null, + }, + { + name: '洋县', + code: '610723', + children: null, + }, + { + name: '西乡县', + code: '610724', + children: null, + }, + { + name: '勉县', + code: '610725', + children: null, + }, + { + name: '宁强县', + code: '610726', + children: null, + }, + { + name: '略阳县', + code: '610727', + children: null, + }, + { + name: '镇巴县', + code: '610728', + children: null, + }, + { + name: '留坝县', + code: '610729', + children: null, + }, + { + name: '佛坪县', + code: '610730', + children: null, + }, + ], + }, + { + name: '榆林市', + code: '610800', + children: [ + { + name: '榆阳区', + code: '610802', + children: null, + }, + { + name: '横山区', + code: '610803', + children: null, + }, + { + name: '府谷县', + code: '610822', + children: null, + }, + { + name: '靖边县', + code: '610824', + children: null, + }, + { + name: '定边县', + code: '610825', + children: null, + }, + { + name: '绥德县', + code: '610826', + children: null, + }, + { + name: '米脂县', + code: '610827', + children: null, + }, + { + name: '佳县', + code: '610828', + children: null, + }, + { + name: '吴堡县', + code: '610829', + children: null, + }, + { + name: '清涧县', + code: '610830', + children: null, + }, + { + name: '子洲县', + code: '610831', + children: null, + }, + { + name: '神木市', + code: '610881', + children: null, + }, + ], + }, + { + name: '安康市', + code: '610900', + children: [ + { + name: '汉滨区', + code: '610902', + children: null, + }, + { + name: '汉阴县', + code: '610921', + children: null, + }, + { + name: '石泉县', + code: '610922', + children: null, + }, + { + name: '宁陕县', + code: '610923', + children: null, + }, + { + name: '紫阳县', + code: '610924', + children: null, + }, + { + name: '岚皋县', + code: '610925', + children: null, + }, + { + name: '平利县', + code: '610926', + children: null, + }, + { + name: '镇坪县', + code: '610927', + children: null, + }, + { + name: '旬阳县', + code: '610928', + children: null, + }, + { + name: '白河县', + code: '610929', + children: null, + }, + ], + }, + { + name: '商洛市', + code: '611000', + children: [ + { + name: '商州区', + code: '611002', + children: null, + }, + { + name: '洛南县', + code: '611021', + children: null, + }, + { + name: '丹凤县', + code: '611022', + children: null, + }, + { + name: '商南县', + code: '611023', + children: null, + }, + { + name: '山阳县', + code: '611024', + children: null, + }, + { + name: '镇安县', + code: '611025', + children: null, + }, + { + name: '柞水县', + code: '611026', + children: null, + }, + ], + }, + ], + }, + { + name: '甘肃省', + code: '620000', + children: [ + { + name: '兰州市', + code: '620100', + children: [ + { + name: '城关区', + code: '620102', + children: null, + }, + { + name: '七里河区', + code: '620103', + children: null, + }, + { + name: '西固区', + code: '620104', + children: null, + }, + { + name: '安宁区', + code: '620105', + children: null, + }, + { + name: '红古区', + code: '620111', + children: null, + }, + { + name: '永登县', + code: '620121', + children: null, + }, + { + name: '皋兰县', + code: '620122', + children: null, + }, + { + name: '榆中县', + code: '620123', + children: null, + }, + ], + }, + { + name: '嘉峪关市', + code: '620200', + children: [ + { + name: '嘉峪关市', + code: '620299', + children: null, + }, + ], + }, + { + name: '金昌市', + code: '620300', + children: [ + { + name: '金川区', + code: '620302', + children: null, + }, + { + name: '永昌县', + code: '620321', + children: null, + }, + ], + }, + { + name: '白银市', + code: '620400', + children: [ + { + name: '白银区', + code: '620402', + children: null, + }, + { + name: '平川区', + code: '620403', + children: null, + }, + { + name: '靖远县', + code: '620421', + children: null, + }, + { + name: '会宁县', + code: '620422', + children: null, + }, + { + name: '景泰县', + code: '620423', + children: null, + }, + ], + }, + { + name: '天水市', + code: '620500', + children: [ + { + name: '秦州区', + code: '620502', + children: null, + }, + { + name: '麦积区', + code: '620503', + children: null, + }, + { + name: '清水县', + code: '620521', + children: null, + }, + { + name: '秦安县', + code: '620522', + children: null, + }, + { + name: '甘谷县', + code: '620523', + children: null, + }, + { + name: '武山县', + code: '620524', + children: null, + }, + { + name: '张家川回族自治县', + code: '620525', + children: null, + }, + ], + }, + { + name: '武威市', + code: '620600', + children: [ + { + name: '凉州区', + code: '620602', + children: null, + }, + { + name: '民勤县', + code: '620621', + children: null, + }, + { + name: '古浪县', + code: '620622', + children: null, + }, + { + name: '天祝藏族自治县', + code: '620623', + children: null, + }, + ], + }, + { + name: '张掖市', + code: '620700', + children: [ + { + name: '甘州区', + code: '620702', + children: null, + }, + { + name: '肃南裕固族自治县', + code: '620721', + children: null, + }, + { + name: '民乐县', + code: '620722', + children: null, + }, + { + name: '临泽县', + code: '620723', + children: null, + }, + { + name: '高台县', + code: '620724', + children: null, + }, + { + name: '山丹县', + code: '620725', + children: null, + }, + ], + }, + { + name: '平凉市', + code: '620800', + children: [ + { + name: '崆峒区', + code: '620802', + children: null, + }, + { + name: '泾川县', + code: '620821', + children: null, + }, + { + name: '灵台县', + code: '620822', + children: null, + }, + { + name: '崇信县', + code: '620823', + children: null, + }, + { + name: '庄浪县', + code: '620825', + children: null, + }, + { + name: '静宁县', + code: '620826', + children: null, + }, + { + name: '华亭市', + code: '620881', + children: null, + }, + ], + }, + { + name: '酒泉市', + code: '620900', + children: [ + { + name: '肃州区', + code: '620902', + children: null, + }, + { + name: '金塔县', + code: '620921', + children: null, + }, + { + name: '瓜州县', + code: '620922', + children: null, + }, + { + name: '肃北蒙古族自治县', + code: '620923', + children: null, + }, + { + name: '阿克塞哈萨克族自治县', + code: '620924', + children: null, + }, + { + name: '玉门市', + code: '620981', + children: null, + }, + { + name: '敦煌市', + code: '620982', + children: null, + }, + ], + }, + { + name: '庆阳市', + code: '621000', + children: [ + { + name: '西峰区', + code: '621002', + children: null, + }, + { + name: '庆城县', + code: '621021', + children: null, + }, + { + name: '环县', + code: '621022', + children: null, + }, + { + name: '华池县', + code: '621023', + children: null, + }, + { + name: '合水县', + code: '621024', + children: null, + }, + { + name: '正宁县', + code: '621025', + children: null, + }, + { + name: '宁县', + code: '621026', + children: null, + }, + { + name: '镇原县', + code: '621027', + children: null, + }, + ], + }, + { + name: '定西市', + code: '621100', + children: [ + { + name: '安定区', + code: '621102', + children: null, + }, + { + name: '通渭县', + code: '621121', + children: null, + }, + { + name: '陇西县', + code: '621122', + children: null, + }, + { + name: '渭源县', + code: '621123', + children: null, + }, + { + name: '临洮县', + code: '621124', + children: null, + }, + { + name: '漳县', + code: '621125', + children: null, + }, + { + name: '岷县', + code: '621126', + children: null, + }, + ], + }, + { + name: '陇南市', + code: '621200', + children: [ + { + name: '武都区', + code: '621202', + children: null, + }, + { + name: '成县', + code: '621221', + children: null, + }, + { + name: '文县', + code: '621222', + children: null, + }, + { + name: '宕昌县', + code: '621223', + children: null, + }, + { + name: '康县', + code: '621224', + children: null, + }, + { + name: '西和县', + code: '621225', + children: null, + }, + { + name: '礼县', + code: '621226', + children: null, + }, + { + name: '徽县', + code: '621227', + children: null, + }, + { + name: '两当县', + code: '621228', + children: null, + }, + ], + }, + { + name: '临夏回族自治州', + code: '622900', + children: [ + { + name: '临夏市', + code: '622901', + children: null, + }, + { + name: '临夏县', + code: '622921', + children: null, + }, + { + name: '康乐县', + code: '622922', + children: null, + }, + { + name: '永靖县', + code: '622923', + children: null, + }, + { + name: '广河县', + code: '622924', + children: null, + }, + { + name: '和政县', + code: '622925', + children: null, + }, + { + name: '东乡族自治县', + code: '622926', + children: null, + }, + { + name: '积石山县', + code: '622927', + children: null, + }, + ], + }, + { + name: '甘南藏族自治州', + code: '623000', + children: [ + { + name: '合作市', + code: '623001', + children: null, + }, + { + name: '临潭县', + code: '623021', + children: null, + }, + { + name: '卓尼县', + code: '623022', + children: null, + }, + { + name: '舟曲县', + code: '623023', + children: null, + }, + { + name: '迭部县', + code: '623024', + children: null, + }, + { + name: '玛曲县', + code: '623025', + children: null, + }, + { + name: '碌曲县', + code: '623026', + children: null, + }, + { + name: '夏河县', + code: '623027', + children: null, + }, + ], + }, + ], + }, + { + name: '青海省', + code: '630000', + children: [ + { + name: '西宁市', + code: '630100', + children: [ + { + name: '城东区', + code: '630102', + children: null, + }, + { + name: '城中区', + code: '630103', + children: null, + }, + { + name: '城西区', + code: '630104', + children: null, + }, + { + name: '城北区', + code: '630105', + children: null, + }, + { + name: '大通回族土族自治县', + code: '630121', + children: null, + }, + { + name: '湟中县', + code: '630122', + children: null, + }, + { + name: '湟源县', + code: '630123', + children: null, + }, + ], + }, + { + name: '海东市', + code: '630200', + children: [ + { + name: '乐都区', + code: '630202', + children: null, + }, + { + name: '平安区', + code: '630203', + children: null, + }, + { + name: '民和回族土族自治县', + code: '630222', + children: null, + }, + { + name: '互助土族自治县', + code: '630223', + children: null, + }, + { + name: '化隆回族自治县', + code: '630224', + children: null, + }, + { + name: '循化撒拉族自治县', + code: '630225', + children: null, + }, + ], + }, + { + name: '海北藏族自治州', + code: '632200', + children: [ + { + name: '门源回族自治县', + code: '632221', + children: null, + }, + { + name: '祁连县', + code: '632222', + children: null, + }, + { + name: '海晏县', + code: '632223', + children: null, + }, + { + name: '刚察县', + code: '632224', + children: null, + }, + ], + }, + { + name: '黄南藏族自治州', + code: '632300', + children: [ + { + name: '同仁县', + code: '632321', + children: null, + }, + { + name: '尖扎县', + code: '632322', + children: null, + }, + { + name: '泽库县', + code: '632323', + children: null, + }, + { + name: '河南蒙古族自治县', + code: '632324', + children: null, + }, + ], + }, + { + name: '海南藏族自治州', + code: '632500', + children: [ + { + name: '共和县', + code: '632521', + children: null, + }, + { + name: '同德县', + code: '632522', + children: null, + }, + { + name: '贵德县', + code: '632523', + children: null, + }, + { + name: '兴海县', + code: '632524', + children: null, + }, + { + name: '贵南县', + code: '632525', + children: null, + }, + ], + }, + { + name: '果洛藏族自治州', + code: '632600', + children: [ + { + name: '玛沁县', + code: '632621', + children: null, + }, + { + name: '班玛县', + code: '632622', + children: null, + }, + { + name: '甘德县', + code: '632623', + children: null, + }, + { + name: '达日县', + code: '632624', + children: null, + }, + { + name: '久治县', + code: '632625', + children: null, + }, + { + name: '玛多县', + code: '632626', + children: null, + }, + ], + }, + { + name: '玉树藏族自治州', + code: '632700', + children: [ + { + name: '玉树市', + code: '632701', + children: null, + }, + { + name: '杂多县', + code: '632722', + children: null, + }, + { + name: '称多县', + code: '632723', + children: null, + }, + { + name: '治多县', + code: '632724', + children: null, + }, + { + name: '囊谦县', + code: '632725', + children: null, + }, + { + name: '曲麻莱县', + code: '632726', + children: null, + }, + ], + }, + { + name: '海西蒙古族藏族自治州', + code: '632800', + children: [ + { + name: '格尔木市', + code: '632801', + children: null, + }, + { + name: '德令哈市', + code: '632802', + children: null, + }, + { + name: '茫崖市', + code: '632803', + children: null, + }, + { + name: '乌兰县', + code: '632821', + children: null, + }, + { + name: '都兰县', + code: '632822', + children: null, + }, + { + name: '天峻县', + code: '632823', + children: null, + }, + { + name: '大柴旦行政委员会', + code: '632825', + children: null, + }, + ], + }, + ], + }, + { + name: '宁夏回族自治区', + code: '640000', + children: [ + { + name: '银川市', + code: '640100', + children: [ + { + name: '兴庆区', + code: '640104', + children: null, + }, + { + name: '西夏区', + code: '640105', + children: null, + }, + { + name: '金凤区', + code: '640106', + children: null, + }, + { + name: '永宁县', + code: '640121', + children: null, + }, + { + name: '贺兰县', + code: '640122', + children: null, + }, + { + name: '灵武市', + code: '640181', + children: null, + }, + ], + }, + { + name: '石嘴山市', + code: '640200', + children: [ + { + name: '大武口区', + code: '640202', + children: null, + }, + { + name: '惠农区', + code: '640205', + children: null, + }, + { + name: '平罗县', + code: '640221', + children: null, + }, + ], + }, + { + name: '吴忠市', + code: '640300', + children: [ + { + name: '利通区', + code: '640302', + children: null, + }, + { + name: '红寺堡区', + code: '640303', + children: null, + }, + { + name: '盐池县', + code: '640323', + children: null, + }, + { + name: '同心县', + code: '640324', + children: null, + }, + { + name: '青铜峡市', + code: '640381', + children: null, + }, + ], + }, + { + name: '固原市', + code: '640400', + children: [ + { + name: '原州区', + code: '640402', + children: null, + }, + { + name: '西吉县', + code: '640422', + children: null, + }, + { + name: '隆德县', + code: '640423', + children: null, + }, + { + name: '泾源县', + code: '640424', + children: null, + }, + { + name: '彭阳县', + code: '640425', + children: null, + }, + ], + }, + { + name: '中卫市', + code: '640500', + children: [ + { + name: '沙坡头区', + code: '640502', + children: null, + }, + { + name: '中宁县', + code: '640521', + children: null, + }, + { + name: '海原县', + code: '640522', + children: null, + }, + ], + }, + ], + }, + { + name: '新疆维吾尔自治区', + code: '650000', + children: [ + { + name: '乌鲁木齐市', + code: '650100', + children: [ + { + name: '天山区', + code: '650102', + children: null, + }, + { + name: '沙依巴克区', + code: '650103', + children: null, + }, + { + name: '新市区', + code: '650104', + children: null, + }, + { + name: '水磨沟区', + code: '650105', + children: null, + }, + { + name: '头屯河区', + code: '650106', + children: null, + }, + { + name: '达坂城区', + code: '650107', + children: null, + }, + { + name: '米东区', + code: '650109', + children: null, + }, + { + name: '乌鲁木齐县', + code: '650121', + children: null, + }, + ], + }, + { + name: '克拉玛依市', + code: '650200', + children: [ + { + name: '独山子区', + code: '650202', + children: null, + }, + { + name: '克拉玛依区', + code: '650203', + children: null, + }, + { + name: '白碱滩区', + code: '650204', + children: null, + }, + { + name: '乌尔禾区', + code: '650205', + children: null, + }, + ], + }, + { + name: '吐鲁番市', + code: '650400', + children: [ + { + name: '高昌区', + code: '650402', + children: null, + }, + { + name: '鄯善县', + code: '650421', + children: null, + }, + { + name: '托克逊县', + code: '650422', + children: null, + }, + ], + }, + { + name: '哈密市', + code: '650500', + children: [ + { + name: '伊州区', + code: '650502', + children: null, + }, + { + name: '巴里坤哈萨克自治县', + code: '650521', + children: null, + }, + { + name: '伊吾县', + code: '650522', + children: null, + }, + ], + }, + { + name: '昌吉回族自治州', + code: '652300', + children: [ + { + name: '昌吉市', + code: '652301', + children: null, + }, + { + name: '阜康市', + code: '652302', + children: null, + }, + { + name: '呼图壁县', + code: '652323', + children: null, + }, + { + name: '玛纳斯县', + code: '652324', + children: null, + }, + { + name: '奇台县', + code: '652325', + children: null, + }, + { + name: '吉木萨尔县', + code: '652327', + children: null, + }, + { + name: '木垒哈萨克自治县', + code: '652328', + children: null, + }, + ], + }, + { + name: '博尔塔拉蒙古自治州', + code: '652700', + children: [ + { + name: '博乐市', + code: '652701', + children: null, + }, + { + name: '阿拉山口市', + code: '652702', + children: null, + }, + { + name: '精河县', + code: '652722', + children: null, + }, + { + name: '温泉县', + code: '652723', + children: null, + }, + ], + }, + { + name: '巴音郭楞蒙古自治州', + code: '652800', + children: [ + { + name: '库尔勒市', + code: '652801', + children: null, + }, + { + name: '轮台县', + code: '652822', + children: null, + }, + { + name: '尉犁县', + code: '652823', + children: null, + }, + { + name: '若羌县', + code: '652824', + children: null, + }, + { + name: '且末县', + code: '652825', + children: null, + }, + { + name: '焉耆回族自治县', + code: '652826', + children: null, + }, + { + name: '和静县', + code: '652827', + children: null, + }, + { + name: '和硕县', + code: '652828', + children: null, + }, + { + name: '博湖县', + code: '652829', + children: null, + }, + ], + }, + { + name: '阿克苏地区', + code: '652900', + children: [ + { + name: '阿克苏市', + code: '652901', + children: null, + }, + { + name: '温宿县', + code: '652922', + children: null, + }, + { + name: '库车县', + code: '652923', + children: null, + }, + { + name: '沙雅县', + code: '652924', + children: null, + }, + { + name: '新和县', + code: '652925', + children: null, + }, + { + name: '拜城县', + code: '652926', + children: null, + }, + { + name: '乌什县', + code: '652927', + children: null, + }, + { + name: '阿瓦提县', + code: '652928', + children: null, + }, + { + name: '柯坪县', + code: '652929', + children: null, + }, + ], + }, + { + name: '克孜勒苏柯尔克孜自治州', + code: '653000', + children: [ + { + name: '阿图什市', + code: '653001', + children: null, + }, + { + name: '阿克陶县', + code: '653022', + children: null, + }, + { + name: '阿合奇县', + code: '653023', + children: null, + }, + { + name: '乌恰县', + code: '653024', + children: null, + }, + ], + }, + { + name: '喀什地区', + code: '653100', + children: [ + { + name: '喀什市', + code: '653101', + children: null, + }, + { + name: '疏附县', + code: '653121', + children: null, + }, + { + name: '疏勒县', + code: '653122', + children: null, + }, + { + name: '英吉沙县', + code: '653123', + children: null, + }, + { + name: '泽普县', + code: '653124', + children: null, + }, + { + name: '莎车县', + code: '653125', + children: null, + }, + { + name: '叶城县', + code: '653126', + children: null, + }, + { + name: '麦盖提县', + code: '653127', + children: null, + }, + { + name: '岳普湖县', + code: '653128', + children: null, + }, + { + name: '伽师县', + code: '653129', + children: null, + }, + { + name: '巴楚县', + code: '653130', + children: null, + }, + { + name: '塔什库尔干塔吉克自治县', + code: '653131', + children: null, + }, + ], + }, + { + name: '和田地区', + code: '653200', + children: [ + { + name: '和田市', + code: '653201', + children: null, + }, + { + name: '和田县', + code: '653221', + children: null, + }, + { + name: '墨玉县', + code: '653222', + children: null, + }, + { + name: '皮山县', + code: '653223', + children: null, + }, + { + name: '洛浦县', + code: '653224', + children: null, + }, + { + name: '策勒县', + code: '653225', + children: null, + }, + { + name: '于田县', + code: '653226', + children: null, + }, + { + name: '民丰县', + code: '653227', + children: null, + }, + ], + }, + { + name: '伊犁哈萨克自治州', + code: '654000', + children: [ + { + name: '伊宁市', + code: '654002', + children: null, + }, + { + name: '奎屯市', + code: '654003', + children: null, + }, + { + name: '霍尔果斯市', + code: '654004', + children: null, + }, + { + name: '伊宁县', + code: '654021', + children: null, + }, + { + name: '察布查尔锡伯自治县', + code: '654022', + children: null, + }, + { + name: '霍城县', + code: '654023', + children: null, + }, + { + name: '巩留县', + code: '654024', + children: null, + }, + { + name: '新源县', + code: '654025', + children: null, + }, + { + name: '昭苏县', + code: '654026', + children: null, + }, + { + name: '特克斯县', + code: '654027', + children: null, + }, + { + name: '尼勒克县', + code: '654028', + children: null, + }, + ], + }, + { + name: '塔城地区', + code: '654200', + children: [ + { + name: '塔城市', + code: '654201', + children: null, + }, + { + name: '乌苏市', + code: '654202', + children: null, + }, + { + name: '额敏县', + code: '654221', + children: null, + }, + { + name: '沙湾县', + code: '654223', + children: null, + }, + { + name: '托里县', + code: '654224', + children: null, + }, + { + name: '裕民县', + code: '654225', + children: null, + }, + { + name: '和布克赛尔蒙古自治县', + code: '654226', + children: null, + }, + ], + }, + { + name: '阿勒泰地区', + code: '654300', + children: [ + { + name: '阿勒泰市', + code: '654301', + children: null, + }, + { + name: '布尔津县', + code: '654321', + children: null, + }, + { + name: '富蕴县', + code: '654322', + children: null, + }, + { + name: '福海县', + code: '654323', + children: null, + }, + { + name: '哈巴河县', + code: '654324', + children: null, + }, + { + name: '青河县', + code: '654325', + children: null, + }, + { + name: '吉木乃县', + code: '654326', + children: null, + }, + ], + }, + { + name: '石河子市', + code: '659001', + children: [ + { + name: '新城街道', + code: '659001001', + children: null, + }, + { + name: '向阳街道', + code: '659001002', + children: null, + }, + { + name: '红山街道', + code: '659001003', + children: null, + }, + { + name: '老街街道', + code: '659001004', + children: null, + }, + { + name: '东城街道', + code: '659001005', + children: null, + }, + { + name: '北泉镇', + code: '659001100', + children: null, + }, + { + name: '石河子镇', + code: '659001200', + children: null, + }, + { + name: '兵团一五二团', + code: '659001500', + children: null, + }, + ], + }, + { + name: '阿拉尔市', + code: '659002', + children: [ + { + name: '金银川路街道', + code: '659002001', + children: null, + }, + { + name: '幸福路街道', + code: '659002002', + children: null, + }, + { + name: '青松路街道', + code: '659002003', + children: null, + }, + { + name: '南口街道', + code: '659002004', + children: null, + }, + { + name: '托喀依乡', + code: '659002200', + children: null, + }, + { + name: '兵团七团', + code: '659002500', + children: null, + }, + { + name: '兵团八团', + code: '659002501', + children: null, + }, + { + name: '兵团十团', + code: '659002503', + children: null, + }, + { + name: '兵团十二团', + code: '659002505', + children: null, + }, + { + name: '兵团十四团', + code: '659002507', + children: null, + }, + { + name: '兵团五团', + code: '659002508', + children: null, + }, + { + name: '兵团十六团', + code: '659002509', + children: null, + }, + { + name: '兵团第一师水利水电工程处', + code: '659002511', + children: null, + }, + { + name: '阿拉尔农场', + code: '659002513', + children: null, + }, + { + name: '兵团第一师幸福农场', + code: '659002514', + children: null, + }, + { + name: '兵团二团', + code: '659002901', + children: null, + }, + { + name: '兵团农一师沙井子水利管理处', + code: '659002902', + children: null, + }, + { + name: '兵团九团', + code: '659002964', + children: null, + }, + { + name: '兵团十一团', + code: '659002966', + children: null, + }, + { + name: '兵团十三团', + code: '659002967', + children: null, + }, + { + name: '兵团十五团', + code: '659002968', + children: null, + }, + ], + }, + { + name: '图木舒克市', + code: '659003', + children: [ + { + name: '齐干却勒街道', + code: '659003001', + children: null, + }, + { + name: '前海街道', + code: '659003002', + children: null, + }, + { + name: '永安坝街道', + code: '659003003', + children: null, + }, + { + name: '兵团四十四团', + code: '659003504', + children: null, + }, + { + name: '兵团四十九团', + code: '659003509', + children: null, + }, + { + name: '兵团五十三团', + code: '659003513', + children: null, + }, + { + name: '喀拉拜勒镇', + code: '659003960', + children: null, + }, + { + name: '兵团五十一团', + code: '659003964', + children: null, + }, + { + name: '兵团五十二团', + code: '659003965', + children: null, + }, + { + name: '兵团五十团', + code: '659003966', + children: null, + }, + ], + }, + { + name: '五家渠市', + code: '659004', + children: [ + { + name: '军垦路街道', + code: '659004001', + children: null, + }, + { + name: '青湖路街道', + code: '659004002', + children: null, + }, + { + name: '人民路街道', + code: '659004003', + children: null, + }, + { + name: '兵团一零一团', + code: '659004500', + children: null, + }, + { + name: '蔡家湖镇', + code: '659004960', + children: null, + }, + { + name: '梧桐镇', + code: '659004961', + children: null, + }, + ], + }, + { + name: '北屯市', + code: '659005', + children: [ + { + name: '兵团一八七团', + code: '659005502', + children: null, + }, + { + name: '兵团一八八团', + code: '659005503', + children: null, + }, + ], + }, + { + name: '铁门关市', + code: '659006', + children: [ + { + name: '兵团二十九团', + code: '659006501', + children: null, + }, + { + name: '农二师三十团', + code: '659006502', + children: null, + }, + ], + }, + { + name: '双河市', + code: '659007', + children: [ + { + name: '兵团八十一团', + code: '659007501', + children: null, + }, + { + name: '兵团八十四团', + code: '659007502', + children: null, + }, + { + name: '兵团八十六团', + code: '659007504', + children: null, + }, + { + name: '兵团八十九团', + code: '659007505', + children: null, + }, + { + name: '兵团九十团', + code: '659007506', + children: null, + }, + ], + }, + { + name: '可克达拉市', + code: '659008', + children: [ + { + name: '兵团六十七团', + code: '659008502', + children: null, + }, + { + name: '兵团六十八团', + code: '659008503', + children: null, + }, + { + name: '兵团六十三团', + code: '659008507', + children: null, + }, + { + name: '兵团六十四团', + code: '659008508', + children: null, + }, + { + name: '兵团六十六团', + code: '659008509', + children: null, + }, + ], + }, + { + name: '昆玉市', + code: '659009', + children: [ + { + name: '兵团一牧场', + code: '659009400', + children: null, + }, + { + name: '兵团皮山农场', + code: '659009401', + children: null, + }, + { + name: '兵团二二四团', + code: '659009501', + children: null, + }, + ], + }, + ], + }, + { + name: '台湾省', + code: '710000', + children: [ + { + name: '台北市', + code: '710100', + children: [ + { + name: '中正区', + code: '710101', + children: null, + }, + { + name: '大同区', + code: '710102', + children: null, + }, + { + name: '中山区', + code: '710103', + children: null, + }, + { + name: '松山区', + code: '710104', + children: null, + }, + { + name: '大安区', + code: '710105', + children: null, + }, + { + name: '万华区', + code: '710106', + children: null, + }, + { + name: '信义区', + code: '710107', + children: null, + }, + { + name: '士林区', + code: '710108', + children: null, + }, + { + name: '北投区', + code: '710109', + children: null, + }, + { + name: '内湖区', + code: '710110', + children: null, + }, + { + name: '南港区', + code: '710111', + children: null, + }, + { + name: '文山区', + code: '710112', + children: null, + }, + ], + }, + { + name: '高雄市', + code: '710200', + children: [ + { + name: '新兴区', + code: '710201', + children: null, + }, + { + name: '前金区', + code: '710202', + children: null, + }, + { + name: '苓雅区', + code: '710203', + children: null, + }, + { + name: '盐埕区', + code: '710204', + children: null, + }, + { + name: '鼓山区', + code: '710205', + children: null, + }, + { + name: '旗津区', + code: '710206', + children: null, + }, + { + name: '前镇区', + code: '710207', + children: null, + }, + { + name: '三民区', + code: '710208', + children: null, + }, + { + name: '左营区', + code: '710209', + children: null, + }, + { + name: '楠梓区', + code: '710210', + children: null, + }, + { + name: '小港区', + code: '710211', + children: null, + }, + { + name: '仁武区', + code: '710242', + children: null, + }, + { + name: '大社区', + code: '710243', + children: null, + }, + { + name: '冈山区', + code: '710244', + children: null, + }, + { + name: '路竹区', + code: '710245', + children: null, + }, + { + name: '阿莲区', + code: '710246', + children: null, + }, + { + name: '田寮区', + code: '710247', + children: null, + }, + { + name: '燕巢区', + code: '710248', + children: null, + }, + { + name: '桥头区', + code: '710249', + children: null, + }, + { + name: '梓官区', + code: '710250', + children: null, + }, + { + name: '弥陀区', + code: '710251', + children: null, + }, + { + name: '永安区', + code: '710252', + children: null, + }, + { + name: '湖内区', + code: '710253', + children: null, + }, + { + name: '凤山区', + code: '710254', + children: null, + }, + { + name: '大寮区', + code: '710255', + children: null, + }, + { + name: '林园区', + code: '710256', + children: null, + }, + { + name: '鸟松区', + code: '710257', + children: null, + }, + { + name: '大树区', + code: '710258', + children: null, + }, + { + name: '旗山区', + code: '710259', + children: null, + }, + { + name: '美浓区', + code: '710260', + children: null, + }, + { + name: '六龟区', + code: '710261', + children: null, + }, + { + name: '内门区', + code: '710262', + children: null, + }, + { + name: '杉林区', + code: '710263', + children: null, + }, + { + name: '甲仙区', + code: '710264', + children: null, + }, + { + name: '桃源区', + code: '710265', + children: null, + }, + { + name: '那玛夏区', + code: '710266', + children: null, + }, + { + name: '茂林区', + code: '710267', + children: null, + }, + { + name: '茄萣区', + code: '710268', + children: null, + }, + ], + }, + { + name: '台南市', + code: '710300', + children: [ + { + name: '中西区', + code: '710301', + children: null, + }, + { + name: '东区', + code: '710302', + children: null, + }, + { + name: '南区', + code: '710303', + children: null, + }, + { + name: '北区', + code: '710304', + children: null, + }, + { + name: '安平区', + code: '710305', + children: null, + }, + { + name: '安南区', + code: '710306', + children: null, + }, + { + name: '永康区', + code: '710339', + children: null, + }, + { + name: '归仁区', + code: '710340', + children: null, + }, + { + name: '新化区', + code: '710341', + children: null, + }, + { + name: '左镇区', + code: '710342', + children: null, + }, + { + name: '玉井区', + code: '710343', + children: null, + }, + { + name: '楠西区', + code: '710344', + children: null, + }, + { + name: '南化区', + code: '710345', + children: null, + }, + { + name: '仁德区', + code: '710346', + children: null, + }, + { + name: '关庙区', + code: '710347', + children: null, + }, + { + name: '龙崎区', + code: '710348', + children: null, + }, + { + name: '官田区', + code: '710349', + children: null, + }, + { + name: '麻豆区', + code: '710350', + children: null, + }, + { + name: '佳里区', + code: '710351', + children: null, + }, + { + name: '西港区', + code: '710352', + children: null, + }, + { + name: '七股区', + code: '710353', + children: null, + }, + { + name: '将军区', + code: '710354', + children: null, + }, + { + name: '学甲区', + code: '710355', + children: null, + }, + { + name: '北门区', + code: '710356', + children: null, + }, + { + name: '新营区', + code: '710357', + children: null, + }, + { + name: '后壁区', + code: '710358', + children: null, + }, + { + name: '白河区', + code: '710359', + children: null, + }, + { + name: '东山区', + code: '710360', + children: null, + }, + { + name: '六甲区', + code: '710361', + children: null, + }, + { + name: '下营区', + code: '710362', + children: null, + }, + { + name: '柳营区', + code: '710363', + children: null, + }, + { + name: '盐水区', + code: '710364', + children: null, + }, + { + name: '善化区', + code: '710365', + children: null, + }, + { + name: '大内区', + code: '710366', + children: null, + }, + { + name: '山上区', + code: '710367', + children: null, + }, + { + name: '新市区', + code: '710368', + children: null, + }, + { + name: '安定区', + code: '710369', + children: null, + }, + ], + }, + { + name: '台中市', + code: '710400', + children: [ + { + name: '中区', + code: '710401', + children: null, + }, + { + name: '东区', + code: '710402', + children: null, + }, + { + name: '南区', + code: '710403', + children: null, + }, + { + name: '西区', + code: '710404', + children: null, + }, + { + name: '北区', + code: '710405', + children: null, + }, + { + name: '北屯区', + code: '710406', + children: null, + }, + { + name: '西屯区', + code: '710407', + children: null, + }, + { + name: '南屯区', + code: '710408', + children: null, + }, + { + name: '太平区', + code: '710431', + children: null, + }, + { + name: '大里区', + code: '710432', + children: null, + }, + { + name: '雾峰区', + code: '710433', + children: null, + }, + { + name: '乌日区', + code: '710434', + children: null, + }, + { + name: '丰原区', + code: '710435', + children: null, + }, + { + name: '后里区', + code: '710436', + children: null, + }, + { + name: '石冈区', + code: '710437', + children: null, + }, + { + name: '东势区', + code: '710438', + children: null, + }, + { + name: '和平区', + code: '710439', + children: null, + }, + { + name: '新社区', + code: '710440', + children: null, + }, + { + name: '潭子区', + code: '710441', + children: null, + }, + { + name: '大雅区', + code: '710442', + children: null, + }, + { + name: '神冈区', + code: '710443', + children: null, + }, + { + name: '大肚区', + code: '710444', + children: null, + }, + { + name: '沙鹿区', + code: '710445', + children: null, + }, + { + name: '龙井区', + code: '710446', + children: null, + }, + { + name: '梧栖区', + code: '710447', + children: null, + }, + { + name: '清水区', + code: '710448', + children: null, + }, + { + name: '大甲区', + code: '710449', + children: null, + }, + { + name: '外埔区', + code: '710450', + children: null, + }, + { + name: '大安区', + code: '710451', + children: null, + }, + ], + }, + { + name: '南投县', + code: '710600', + children: [ + { + name: '南投市', + code: '710614', + children: null, + }, + { + name: '中寮乡', + code: '710615', + children: null, + }, + { + name: '草屯镇', + code: '710616', + children: null, + }, + { + name: '国姓乡', + code: '710617', + children: null, + }, + { + name: '埔里镇', + code: '710618', + children: null, + }, + { + name: '仁爱乡', + code: '710619', + children: null, + }, + { + name: '名间乡', + code: '710620', + children: null, + }, + { + name: '集集镇', + code: '710621', + children: null, + }, + { + name: '水里乡', + code: '710622', + children: null, + }, + { + name: '鱼池乡', + code: '710623', + children: null, + }, + { + name: '信义乡', + code: '710624', + children: null, + }, + { + name: '竹山镇', + code: '710625', + children: null, + }, + { + name: '鹿谷乡', + code: '710626', + children: null, + }, + ], + }, + { + name: '基隆市', + code: '710700', + children: [ + { + name: '仁爱区', + code: '710701', + children: null, + }, + { + name: '信义区', + code: '710702', + children: null, + }, + { + name: '中正区', + code: '710703', + children: null, + }, + { + name: '中山区', + code: '710704', + children: null, + }, + { + name: '安乐区', + code: '710705', + children: null, + }, + { + name: '暖暖区', + code: '710706', + children: null, + }, + { + name: '七堵区', + code: '710707', + children: null, + }, + ], + }, + { + name: '新竹市', + code: '710800', + children: [ + { + name: '东区', + code: '710801', + children: null, + }, + { + name: '北区', + code: '710802', + children: null, + }, + { + name: '香山区', + code: '710803', + children: null, + }, + ], + }, + { + name: '嘉义市', + code: '710900', + children: [ + { + name: '东区', + code: '710901', + children: null, + }, + { + name: '西区', + code: '710902', + children: null, + }, + ], + }, + { + name: '新北市', + code: '711100', + children: [ + { + name: '万里区', + code: '711130', + children: null, + }, + { + name: '金山区', + code: '711131', + children: null, + }, + { + name: '板桥区', + code: '711132', + children: null, + }, + { + name: '汐止区', + code: '711133', + children: null, + }, + { + name: '深坑区', + code: '711134', + children: null, + }, + { + name: '石碇区', + code: '711135', + children: null, + }, + { + name: '瑞芳区', + code: '711136', + children: null, + }, + { + name: '平溪区', + code: '711137', + children: null, + }, + { + name: '双溪区', + code: '711138', + children: null, + }, + { + name: '贡寮区', + code: '711139', + children: null, + }, + { + name: '新店区', + code: '711140', + children: null, + }, + { + name: '坪林区', + code: '711141', + children: null, + }, + { + name: '乌来区', + code: '711142', + children: null, + }, + { + name: '永和区', + code: '711143', + children: null, + }, + { + name: '中和区', + code: '711144', + children: null, + }, + { + name: '土城区', + code: '711145', + children: null, + }, + { + name: '三峡区', + code: '711146', + children: null, + }, + { + name: '树林区', + code: '711147', + children: null, + }, + { + name: '莺歌区', + code: '711148', + children: null, + }, + { + name: '三重区', + code: '711149', + children: null, + }, + { + name: '新庄区', + code: '711150', + children: null, + }, + { + name: '泰山区', + code: '711151', + children: null, + }, + { + name: '林口区', + code: '711152', + children: null, + }, + { + name: '芦洲区', + code: '711153', + children: null, + }, + { + name: '五股区', + code: '711154', + children: null, + }, + { + name: '八里区', + code: '711155', + children: null, + }, + { + name: '淡水区', + code: '711156', + children: null, + }, + { + name: '三芝区', + code: '711157', + children: null, + }, + { + name: '石门区', + code: '711158', + children: null, + }, + ], + }, + { + name: '宜兰县', + code: '711200', + children: [ + { + name: '宜兰市', + code: '711214', + children: null, + }, + { + name: '头城镇', + code: '711215', + children: null, + }, + { + name: '礁溪乡', + code: '711216', + children: null, + }, + { + name: '壮围乡', + code: '711217', + children: null, + }, + { + name: '员山乡', + code: '711218', + children: null, + }, + { + name: '罗东镇', + code: '711219', + children: null, + }, + { + name: '三星乡', + code: '711220', + children: null, + }, + { + name: '大同乡', + code: '711221', + children: null, + }, + { + name: '五结乡', + code: '711222', + children: null, + }, + { + name: '冬山乡', + code: '711223', + children: null, + }, + { + name: '苏澳镇', + code: '711224', + children: null, + }, + { + name: '南澳乡', + code: '711225', + children: null, + }, + ], + }, + { + name: '新竹县', + code: '711300', + children: [ + { + name: '竹北市', + code: '711314', + children: null, + }, + { + name: '湖口乡', + code: '711315', + children: null, + }, + { + name: '新丰乡', + code: '711316', + children: null, + }, + { + name: '新埔镇', + code: '711317', + children: null, + }, + { + name: '关西镇', + code: '711318', + children: null, + }, + { + name: '芎林乡', + code: '711319', + children: null, + }, + { + name: '宝山乡', + code: '711320', + children: null, + }, + { + name: '竹东镇', + code: '711321', + children: null, + }, + { + name: '五峰乡', + code: '711322', + children: null, + }, + { + name: '横山乡', + code: '711323', + children: null, + }, + { + name: '尖石乡', + code: '711324', + children: null, + }, + { + name: '北埔乡', + code: '711325', + children: null, + }, + { + name: '峨眉乡', + code: '711326', + children: null, + }, + ], + }, + { + name: '桃园市', + code: '711400', + children: [ + { + name: '中坜区', + code: '711414', + children: null, + }, + { + name: '平镇区', + code: '711415', + children: null, + }, + { + name: '龙潭区', + code: '711416', + children: null, + }, + { + name: '杨梅区', + code: '711417', + children: null, + }, + { + name: '新屋区', + code: '711418', + children: null, + }, + { + name: '观音区', + code: '711419', + children: null, + }, + { + name: '桃园区', + code: '711420', + children: null, + }, + { + name: '龟山区', + code: '711421', + children: null, + }, + { + name: '八德区', + code: '711422', + children: null, + }, + { + name: '大溪区', + code: '711423', + children: null, + }, + { + name: '复兴区', + code: '711424', + children: null, + }, + { + name: '大园区', + code: '711425', + children: null, + }, + { + name: '芦竹区', + code: '711426', + children: null, + }, + ], + }, + { + name: '苗栗县', + code: '711500', + children: [ + { + name: '竹南镇', + code: '711519', + children: null, + }, + { + name: '头份市', + code: '711520', + children: null, + }, + { + name: '三湾乡', + code: '711521', + children: null, + }, + { + name: '南庄乡', + code: '711522', + children: null, + }, + { + name: '狮潭乡', + code: '711523', + children: null, + }, + { + name: '后龙镇', + code: '711524', + children: null, + }, + { + name: '通霄镇', + code: '711525', + children: null, + }, + { + name: '苑里镇', + code: '711526', + children: null, + }, + { + name: '苗栗市', + code: '711527', + children: null, + }, + { + name: '造桥乡', + code: '711528', + children: null, + }, + { + name: '头屋乡', + code: '711529', + children: null, + }, + { + name: '公馆乡', + code: '711530', + children: null, + }, + { + name: '大湖乡', + code: '711531', + children: null, + }, + { + name: '泰安乡', + code: '711532', + children: null, + }, + { + name: '铜锣乡', + code: '711533', + children: null, + }, + { + name: '三义乡', + code: '711534', + children: null, + }, + { + name: '西湖乡', + code: '711535', + children: null, + }, + { + name: '卓兰镇', + code: '711536', + children: null, + }, + ], + }, + { + name: '彰化县', + code: '711700', + children: [ + { + name: '彰化市', + code: '711727', + children: null, + }, + { + name: '芬园乡', + code: '711728', + children: null, + }, + { + name: '花坛乡', + code: '711729', + children: null, + }, + { + name: '秀水乡', + code: '711730', + children: null, + }, + { + name: '鹿港镇', + code: '711731', + children: null, + }, + { + name: '福兴乡', + code: '711732', + children: null, + }, + { + name: '线西乡', + code: '711733', + children: null, + }, + { + name: '和美镇', + code: '711734', + children: null, + }, + { + name: '伸港乡', + code: '711735', + children: null, + }, + { + name: '员林市', + code: '711736', + children: null, + }, + { + name: '社头乡', + code: '711737', + children: null, + }, + { + name: '永靖乡', + code: '711738', + children: null, + }, + { + name: '埔心乡', + code: '711739', + children: null, + }, + { + name: '溪湖镇', + code: '711740', + children: null, + }, + { + name: '大村乡', + code: '711741', + children: null, + }, + { + name: '埔盐乡', + code: '711742', + children: null, + }, + { + name: '田中镇', + code: '711743', + children: null, + }, + { + name: '北斗镇', + code: '711744', + children: null, + }, + { + name: '田尾乡', + code: '711745', + children: null, + }, + { + name: '埤头乡', + code: '711746', + children: null, + }, + { + name: '溪州乡', + code: '711747', + children: null, + }, + { + name: '竹塘乡', + code: '711748', + children: null, + }, + { + name: '二林镇', + code: '711749', + children: null, + }, + { + name: '大城乡', + code: '711750', + children: null, + }, + { + name: '芳苑乡', + code: '711751', + children: null, + }, + { + name: '二水乡', + code: '711752', + children: null, + }, + ], + }, + { + name: '嘉义县', + code: '711900', + children: [ + { + name: '番路乡', + code: '711919', + children: null, + }, + { + name: '梅山乡', + code: '711920', + children: null, + }, + { + name: '竹崎乡', + code: '711921', + children: null, + }, + { + name: '阿里山乡', + code: '711922', + children: null, + }, + { + name: '中埔乡', + code: '711923', + children: null, + }, + { + name: '大埔乡', + code: '711924', + children: null, + }, + { + name: '水上乡', + code: '711925', + children: null, + }, + { + name: '鹿草乡', + code: '711926', + children: null, + }, + { + name: '太保市', + code: '711927', + children: null, + }, + { + name: '朴子市', + code: '711928', + children: null, + }, + { + name: '东石乡', + code: '711929', + children: null, + }, + { + name: '六脚乡', + code: '711930', + children: null, + }, + { + name: '新港乡', + code: '711931', + children: null, + }, + { + name: '民雄乡', + code: '711932', + children: null, + }, + { + name: '大林镇', + code: '711933', + children: null, + }, + { + name: '溪口乡', + code: '711934', + children: null, + }, + { + name: '义竹乡', + code: '711935', + children: null, + }, + { + name: '布袋镇', + code: '711936', + children: null, + }, + ], + }, + { + name: '云林县', + code: '712100', + children: [ + { + name: '斗南镇', + code: '712121', + children: null, + }, + { + name: '大埤乡', + code: '712122', + children: null, + }, + { + name: '虎尾镇', + code: '712123', + children: null, + }, + { + name: '土库镇', + code: '712124', + children: null, + }, + { + name: '褒忠乡', + code: '712125', + children: null, + }, + { + name: '东势乡', + code: '712126', + children: null, + }, + { + name: '台西乡', + code: '712127', + children: null, + }, + { + name: '仑背乡', + code: '712128', + children: null, + }, + { + name: '麦寮乡', + code: '712129', + children: null, + }, + { + name: '斗六市', + code: '712130', + children: null, + }, + { + name: '林内乡', + code: '712131', + children: null, + }, + { + name: '古坑乡', + code: '712132', + children: null, + }, + { + name: '莿桐乡', + code: '712133', + children: null, + }, + { + name: '西螺镇', + code: '712134', + children: null, + }, + { + name: '二仑乡', + code: '712135', + children: null, + }, + { + name: '北港镇', + code: '712136', + children: null, + }, + { + name: '水林乡', + code: '712137', + children: null, + }, + { + name: '口湖乡', + code: '712138', + children: null, + }, + { + name: '四湖乡', + code: '712139', + children: null, + }, + { + name: '元长乡', + code: '712140', + children: null, + }, + ], + }, + { + name: '屏东县', + code: '712400', + children: [ + { + name: '屏东市', + code: '712434', + children: null, + }, + { + name: '三地门乡', + code: '712435', + children: null, + }, + { + name: '雾台乡', + code: '712436', + children: null, + }, + { + name: '玛家乡', + code: '712437', + children: null, + }, + { + name: '九如乡', + code: '712438', + children: null, + }, + { + name: '里港乡', + code: '712439', + children: null, + }, + { + name: '高树乡', + code: '712440', + children: null, + }, + { + name: '盐埔乡', + code: '712441', + children: null, + }, + { + name: '长治乡', + code: '712442', + children: null, + }, + { + name: '麟洛乡', + code: '712443', + children: null, + }, + { + name: '竹田乡', + code: '712444', + children: null, + }, + { + name: '内埔乡', + code: '712445', + children: null, + }, + { + name: '万丹乡', + code: '712446', + children: null, + }, + { + name: '潮州镇', + code: '712447', + children: null, + }, + { + name: '泰武乡', + code: '712448', + children: null, + }, + { + name: '来义乡', + code: '712449', + children: null, + }, + { + name: '万峦乡', + code: '712450', + children: null, + }, + { + name: '崁顶乡', + code: '712451', + children: null, + }, + { + name: '新埤乡', + code: '712452', + children: null, + }, + { + name: '南州乡', + code: '712453', + children: null, + }, + { + name: '林边乡', + code: '712454', + children: null, + }, + { + name: '东港镇', + code: '712455', + children: null, + }, + { + name: '琉球乡', + code: '712456', + children: null, + }, + { + name: '佳冬乡', + code: '712457', + children: null, + }, + { + name: '新园乡', + code: '712458', + children: null, + }, + { + name: '枋寮乡', + code: '712459', + children: null, + }, + { + name: '枋山乡', + code: '712460', + children: null, + }, + { + name: '春日乡', + code: '712461', + children: null, + }, + { + name: '狮子乡', + code: '712462', + children: null, + }, + { + name: '车城乡', + code: '712463', + children: null, + }, + { + name: '牡丹乡', + code: '712464', + children: null, + }, + { + name: '恒春镇', + code: '712465', + children: null, + }, + { + name: '满州乡', + code: '712466', + children: null, + }, + ], + }, + { + name: '台东县', + code: '712500', + children: [ + { + name: '台东市', + code: '712517', + children: null, + }, + { + name: '绿岛乡', + code: '712518', + children: null, + }, + { + name: '兰屿乡', + code: '712519', + children: null, + }, + { + name: '延平乡', + code: '712520', + children: null, + }, + { + name: '卑南乡', + code: '712521', + children: null, + }, + { + name: '鹿野乡', + code: '712522', + children: null, + }, + { + name: '关山镇', + code: '712523', + children: null, + }, + { + name: '海端乡', + code: '712524', + children: null, + }, + { + name: '池上乡', + code: '712525', + children: null, + }, + { + name: '东河乡', + code: '712526', + children: null, + }, + { + name: '成功镇', + code: '712527', + children: null, + }, + { + name: '长滨乡', + code: '712528', + children: null, + }, + { + name: '金峰乡', + code: '712529', + children: null, + }, + { + name: '大武乡', + code: '712530', + children: null, + }, + { + name: '达仁乡', + code: '712531', + children: null, + }, + { + name: '太麻里乡', + code: '712532', + children: null, + }, + ], + }, + { + name: '花莲县', + code: '712600', + children: [ + { + name: '花莲市', + code: '712615', + children: null, + }, + { + name: '新城乡', + code: '712616', + children: null, + }, + { + name: '秀林乡', + code: '712618', + children: null, + }, + { + name: '吉安乡', + code: '712619', + children: null, + }, + { + name: '寿丰乡', + code: '712620', + children: null, + }, + { + name: '凤林镇', + code: '712621', + children: null, + }, + { + name: '光复乡', + code: '712622', + children: null, + }, + { + name: '丰滨乡', + code: '712623', + children: null, + }, + { + name: '瑞穗乡', + code: '712624', + children: null, + }, + { + name: '万荣乡', + code: '712625', + children: null, + }, + { + name: '玉里镇', + code: '712626', + children: null, + }, + { + name: '卓溪乡', + code: '712627', + children: null, + }, + { + name: '富里乡', + code: '712628', + children: null, + }, + ], + }, + { + name: '澎湖县', + code: '712700', + children: [ + { + name: '马公市', + code: '712707', + children: null, + }, + { + name: '西屿乡', + code: '712708', + children: null, + }, + { + name: '望安乡', + code: '712709', + children: null, + }, + { + name: '七美乡', + code: '712710', + children: null, + }, + { + name: '白沙乡', + code: '712711', + children: null, + }, + { + name: '湖西乡', + code: '712712', + children: null, + }, + ], + }, + ], + }, + { + name: '香港特别行政区', + code: '810000', + children: [ + { + name: '香港特别行政区', + code: '810100', + children: [ + { + name: '中西区', + code: '810101', + children: null, + }, + { + name: '东区', + code: '810102', + children: null, + }, + { + name: '九龙城区', + code: '810103', + children: null, + }, + { + name: '观塘区', + code: '810104', + children: null, + }, + { + name: '南区', + code: '810105', + children: null, + }, + { + name: '深水埗区', + code: '810106', + children: null, + }, + { + name: '湾仔区', + code: '810107', + children: null, + }, + { + name: '黄大仙区', + code: '810108', + children: null, + }, + { + name: '油尖旺区', + code: '810109', + children: null, + }, + { + name: '离岛区', + code: '810110', + children: null, + }, + { + name: '葵青区', + code: '810111', + children: null, + }, + { + name: '北区', + code: '810112', + children: null, + }, + { + name: '西贡区', + code: '810113', + children: null, + }, + { + name: '沙田区', + code: '810114', + children: null, + }, + { + name: '屯门区', + code: '810115', + children: null, + }, + { + name: '大埔区', + code: '810116', + children: null, + }, + { + name: '荃湾区', + code: '810117', + children: null, + }, + { + name: '元朗区', + code: '810118', + children: null, + }, + ], + }, + ], + }, + { + name: '澳门特别行政区', + code: '820000', + children: [ + { + name: '澳门特别行政区', + code: '820100', + children: [ + { + name: '澳门半岛', + code: '820101', + children: null, + }, + { + name: '凼仔', + code: '820102', + children: null, + }, + { + name: '路凼城', + code: '820103', + children: null, + }, + { + name: '路环', + code: '820104', + children: null, + }, + ], + }, + ], + }, +]; diff --git a/custom-tab-bar/data.js b/custom-tab-bar/data.js new file mode 100644 index 0000000..ba35a99 --- /dev/null +++ b/custom-tab-bar/data.js @@ -0,0 +1,21 @@ +export default [{ + icon: 'home', + text: '首页', + url: 'pages/home/home', + }, + { + icon: 'sort', + text: '分类', + url: 'pages/goods/category/index', + }, + { + icon: 'cart', + text: '购物车', + url: 'pages/cart/index', + }, + { + icon: 'person', + text: '个人中心', + url: 'pages/usercenter/index', + }, +]; \ No newline at end of file diff --git a/custom-tab-bar/index.js b/custom-tab-bar/index.js new file mode 100644 index 0000000..90c58df --- /dev/null +++ b/custom-tab-bar/index.js @@ -0,0 +1,29 @@ +import TabMenu from './data'; +Component({ + data: { + active: 0, + list: TabMenu, + }, + + methods: { + onChange(event) { + this.setData({ active: event.detail.value }); + wx.switchTab({ + url: this.data.list[event.detail.value].url.startsWith('/') + ? this.data.list[event.detail.value].url + : `/${this.data.list[event.detail.value].url}`, + }); + }, + + init() { + const page = getCurrentPages().pop(); + const route = page ? page.route.split('?')[0] : ''; + const active = this.data.list.findIndex( + (item) => + (item.url.startsWith('/') ? item.url.substr(1) : item.url) === + `${route}`, + ); + this.setData({ active }); + }, + }, +}); diff --git a/custom-tab-bar/index.json b/custom-tab-bar/index.json new file mode 100644 index 0000000..917a4e1 --- /dev/null +++ b/custom-tab-bar/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "t-tab-bar": "tdesign-miniprogram/tab-bar/tab-bar", + "t-tab-bar-item": "tdesign-miniprogram/tab-bar/tab-bar-item", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/custom-tab-bar/index.wxml b/custom-tab-bar/index.wxml new file mode 100644 index 0000000..384fd2f --- /dev/null +++ b/custom-tab-bar/index.wxml @@ -0,0 +1,18 @@ + + + + + {{ item.text }} + + + + diff --git a/custom-tab-bar/index.wxss b/custom-tab-bar/index.wxss new file mode 100644 index 0000000..3b855f5 --- /dev/null +++ b/custom-tab-bar/index.wxss @@ -0,0 +1,9 @@ +.custom-tab-bar-wrapper { + display: flex; + flex-direction: column; + align-items: center; +} + +.custom-tab-bar-wrapper .text { + font-size: 20rpx; +} diff --git a/images/search.jpg b/images/search.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b495ecf874810725f6a8d3d517283666a961d77 GIT binary patch literal 44130 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 V{~7v^1pXs||486p68L-O{{g&9Bu)ST literal 0 HcmV?d00001 diff --git a/images/use_bi.png b/images/use_bi.png new file mode 100644 index 0000000000000000000000000000000000000000..c593ed4898d2aa38b61812d97eeada82dd6bada3 GIT binary patch literal 721484 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

{#=WA2xJetHuRIm2Es+Fp+$E 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 z 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

?_V^p_I9JU2@j45X9~P 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

&(vIy%YPQ-SB*;@b$yY7oU$!{JlPL%}aK%c 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

    ?7SM%;BJfq0BZCLw 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

    EW^7aUsOUY~xBSmeMJ&r|R_iy||P5Xqmf3kk- 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 Bg|`3z literal 0 HcmV?d00001 diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..36aa1a4 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/mock.md b/mock.md new file mode 100644 index 0000000..94e13e0 --- /dev/null +++ b/mock.md @@ -0,0 +1,34 @@ +## 模拟与数据 + +model 用于放置模拟后端数据返回的逻辑;假若接入真实后端接口,则本文件夹可改造为数据层适配。 +services 用于请求逻辑,根据 config.useMock 配置可控制返回 mock 数据或是真实接口数据 + +### 1 模拟策略 + +1)只依靠 ID 规律进行关联 +大部分情况下推荐使用本方案,ID 为`1`的商品固定会关联 ID 为`1`的优惠券或者[ID 对 10 的模运算结果为 1](https://www.runoob.com/try/try.php?filename=tryjs_oper_mod)的优惠券(看需要 1 个还是多个了)。 + +> 为保持关系稳定,模运算统一使用`10`为除数,`ID`为被除数;即`1%10`、`2%10`。 + +2)建立额外关联关系查询 +在无法使用简单数学关系维持关系的情况下,可以采用单独提供关系数据的方式进行关联(目前也没想到什么场景是数学关系稳定不了的了,先假定有,定下规范做法)。如数据 A 与数据 B 之间需要一个关联 AB,则需要提供`A数据mock`、`B数据mock`、以及`A查B与B反查A`共 4 个 mock 源。 + +### 2 使用数据 + +使用数据源时应该在 services 文件夹中按照业务新建自己 fetch 函数导出,fetch 函数以 Promise 形式返回组合调用 model 逻辑得到的数据。 + +> 不允许直接在业务中调用、使用 model 数据。 + +## 接入真实 API 后 + +接入真实 API 后 model 文件夹逻辑可以反转层级,作为数据适配层继续为项目服务。举例说明: + +1. 在没有接入 API 时(useMock 为 true) + 1.1 业务调用 services 进行 fetch + 1.2 fetch 逻辑调用 model 文件夹中对应的数据源,构造、返回业务需要的结构 + +2. 在接入 API 后(useMock 为 false) + 2.1 业务调用 services 进行 fetch + 2.2 fetch 逻辑调用接口得到真实后端数据 + 2.3 比对 model 文件夹中数据 mock 数据结构 export 一个数据结构转换函数,输入真实后端数据,输出与 mock 数据结构一致的新数据,返回给 fetch + 2.4 fetch 函数 返回 转换后的 数据结构,业务层无需进行更改 diff --git a/model/activities.js b/model/activities.js new file mode 100644 index 0000000..31bc3b8 --- /dev/null +++ b/model/activities.js @@ -0,0 +1,7 @@ +import { getActivity } from './activity'; + +export function getActivityList(baseID = 0, length = 10) { + return new Array(length).fill(0).map((_, idx) => getActivity(idx + baseID)); +} + +export const activityList = getActivityList(); diff --git a/model/activity.js b/model/activity.js new file mode 100644 index 0000000..34abb07 --- /dev/null +++ b/model/activity.js @@ -0,0 +1,18 @@ +/** + * @param {string|number} key 唯一值 + */ +export function getActivity(key) { + return { + promotionId: `${key}`, + title: `满减满折回归${key}`, + description: null, + promotionCode: 'MERCHANT', + promotionSubCode: key % 2 === 0 ? 'MYJ' : 'MYG', + tag: '满减', + timeType: 1, + startTime: '1588737710000', + endTime: '1601467070000', + teasingStartTime: null, + activityLadder: [{ label: '满100元减99.9元' }], + }; +} diff --git a/model/address.js b/model/address.js new file mode 100644 index 0000000..c7ae8dc --- /dev/null +++ b/model/address.js @@ -0,0 +1,31 @@ +/** 地址 */ +export function genAddress(id) { + return { + saasId: '88888888', + uid: `8888888820550${id}`, + authToken: null, + id: `${id}`, + addressId: `${id}`, + phone: '17612345678', + name: `测试用户${id}`, + countryName: '中国', + countryCode: 'chn', + provinceName: '甘肃省', + provinceCode: '620000', + cityName: '甘南藏族自治州', + cityCode: '623000', + districtName: '碌曲县', + districtCode: '623026', + detailAddress: `松日鼎盛大厦${id}层${id}号`, + isDefault: `${id}` === '0' ? 1 : 0, + addressTag: id === 0 ? '' : '公司', + latitude: '34.59103', + longitude: '102.48699', + storeId: null, + }; +} + +/** 地址列表 */ +export function genAddressList(len = 10) { + return new Array(len).fill(0).map((_, idx) => genAddress(idx)); +} diff --git a/model/cart.js b/model/cart.js new file mode 100644 index 0000000..d0ad6c5 --- /dev/null +++ b/model/cart.js @@ -0,0 +1,324 @@ +import { mockIp, mockReqId } from '../utils/mock'; + +export function genCartGroupData() { + const resp = { + data: { + isNotEmpty: true, + storeGoods: [ + { + storeId: '1000', + storeName: '云Mall深圳旗舰店', + storeStatus: 1, + totalDiscountSalePrice: '9990', + promotionGoodsList: [ + { + title: '满减满折回归', + promotionCode: 'MERCHANT', + promotionSubCode: 'MYJ', + promotionId: '159174555838121985', + tagText: ['满100元减99.9元'], + promotionStatus: 3, + tag: '满减', + description: '满100元减99.9元,已减99.9元', + doorSillRemain: null, + isNeedAddOnShop: 0, + goodsPromotionList: [ + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '12', + skuId: '135691622', + isSelected: 1, + thumb: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + title: + '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + quantity: 1, + stockStatus: true, + stockQuantity: 3, + price: '9900', + originPrice: '16900', + tagPrice: null, + titlePrefixTags: [{ text: '新品' }, { text: '火爆' }], + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '经典白', + }, + { + specTitle: '类型', + specValue: '经典套装', + }, + ], + joinCartTime: '2020-06-29T07:55:40.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '18', + skuId: '135681631', + isSelected: 1, + thumb: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + title: + '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + quantity: 1, + stockStatus: true, + stockQuantity: 177, + price: '29800', + originPrice: '40000', + tagPrice: null, + titlePrefixTags: null, + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '米色荷叶边', + }, + { + specTitle: '尺码', + specValue: 'M', + }, + ], + joinCartTime: '2020-06-29T07:55:27.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '13', + skuId: '135698362', + isSelected: 1, + thumb: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + title: + '带帽午休毯虎年款多功能加厚加大加绒简约多功能午休毯连帽披肩', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + quantity: 13, + stockStatus: true, + stockQuantity: 9, + price: '29900', + originPrice: '0', + tagPrice: null, + titlePrefixTags: [{ text: '火爆' }], + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '浅灰色', + }, + { + specTitle: '尺码', + specValue: 'M', + }, + ], + joinCartTime: '2020-06-29T07:54:43.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '7', + skuId: '135681625', + isSelected: 1, + thumb: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + title: + '不锈钢刀叉勺套装家用西餐餐具ins简约耐用不锈钢金色银色可选', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + quantity: 1, + stockStatus: true, + stockQuantity: 0, + price: '29900', + originPrice: '29900', + tagPrice: null, + titlePrefixTags: null, + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '奶黄色', + }, + { + specTitle: '数量', + specValue: '六件套', + }, + ], + joinCartTime: '2020-06-29T07:55:00.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + ], + lastJoinTime: '2020-06-29T07:55:40.000+0000', + }, + { + title: null, + promotionCode: 'EMPTY_PROMOTION', + promotionSubCode: null, + promotionId: null, + tagText: null, + promotionStatus: null, + tag: null, + description: null, + doorSillRemain: null, + isNeedAddOnShop: 0, + goodsPromotionList: [ + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '11', + skuId: '135691629', + isSelected: 0, + thumb: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + title: '运动连帽拉链卫衣休闲开衫长袖多色运动细绒面料运动上衣', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + quantity: 1, + stockStatus: false, + stockQuantity: 0, + price: '25900', + originPrice: '39900', + tagPrice: null, + tagText: null, + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '军绿色', + }, + { + specTitle: '尺码', + specValue: 'S', + }, + ], + joinCartTime: '2020-04-24T06:26:48.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '5', + skuId: '135691635', + isSelected: 0, + thumb: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + title: + '迷你便携高颜值蓝牙无线耳机立体声只能触控式操作简约立体声耳机', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + quantity: 1, + stockStatus: true, + stockQuantity: 96, + price: '29000', + originPrice: '29900', + tagPrice: null, + tagText: null, + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '黑色', + }, + { + specTitle: '类型', + specValue: '简约款', + }, + ], + joinCartTime: '2020-06-29T07:55:17.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + ], + lastJoinTime: null, + }, + ], + lastJoinTime: '2020-06-29T07:55:40.000+0000', + postageFreePromotionVo: { + title: null, + promotionCode: null, + promotionSubCode: null, + promotionId: null, + tagText: null, + promotionStatus: null, + tag: null, + description: null, + doorSillRemain: null, + isNeedAddOnShop: 0, + }, + }, + ], + invalidGoodItems: [ + { + uid: '88888888205468', + saasId: '88888888', + storeId: '1000', + spuId: '1', + skuId: '135691631', + isSelected: 1, + thumb: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + title: '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + primaryImage: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + quantity: 8, + stockStatus: true, + stockQuantity: 177, + price: '26900', + originPrice: '31900', + tagPrice: null, + tagText: null, + roomId: null, + specInfo: [ + { + specTitle: '颜色', + specValue: '白色', + }, + { + specTitle: '尺码', + specValue: 'S', + }, + ], + joinCartTime: '2020-04-28T04:03:59.000+0000', + available: 1, + putOnSale: 1, + etitle: null, + }, + ], + isAllSelected: false, + selectedGoodsCount: 16, + totalAmount: '179997', + totalDiscountAmount: '110000', + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 269, + success: true, + }; + return resp; +} diff --git a/model/category.js b/model/category.js new file mode 100644 index 0000000..81b7502 --- /dev/null +++ b/model/category.js @@ -0,0 +1,206 @@ +export function getCategoryList() { + return [ + { + groupId: '24948', + name: '女装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249481', + name: '女装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '卫衣', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-1.png', + }, + { + groupId: '249480', + name: '毛呢外套', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-2.png', + }, + { + groupId: '249480', + name: '雪纺衫', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-3.png', + }, + { + groupId: '249480', + name: '羽绒服', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-4.png', + }, + { + groupId: '249480', + name: '毛衣', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-5.png', + }, + { + groupId: '249480', + name: '棉衣', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-6.png', + }, + { + groupId: '249480', + name: '西装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-7.png', + }, + { + groupId: '249480', + name: '马甲', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-8.png', + }, + { + groupId: '249480', + name: '连衣裙', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-9.png', + }, + { + groupId: '249480', + name: '半身裙', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-10.png', + }, + { + groupId: '249480', + name: '裤子', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-11.png', + }, + ], + }, + ], + }, + { + groupId: '24948', + name: '男装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249481', + name: '男装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '卫衣', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-1.png', + }, + { + groupId: '249480', + name: '裤子', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-11.png', + }, + { + groupId: '249480', + name: '西装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-7.png', + }, + { + groupId: '249480', + name: '羽绒服', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-4.png', + }, + { + groupId: '249480', + name: '马甲', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-8.png', + }, + ], + }, + ], + }, + { + groupId: '24948', + name: '儿童装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249481', + name: '儿童装', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '马甲', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-8.png', + }, + { + groupId: '249480', + name: '裤子', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-11.png', + }, + { + groupId: '249480', + name: '连衣裙', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/classify/img-9.png', + }, + { + groupId: '249480', + name: '其他', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3b.png', + }, + ], + }, + ], + }, + { + groupId: '24948', + name: '美妆', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249481', + name: '美妆', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '唇釉', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/mz-20a1.png', + }, + { + groupId: '249480', + name: '美妆蛋', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/mz-11a1.png', + }, + { + groupId: '249480', + name: '眼影', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/mz-12b.png', + }, + ], + }, + ], + }, + ]; +} diff --git a/model/comments.js b/model/comments.js new file mode 100644 index 0000000..78dd61d --- /dev/null +++ b/model/comments.js @@ -0,0 +1,338 @@ +/** + * * @param {number} spuId + * @param {number} pageNum + * @param {number} pageSize + * @param {number} commentsLevel + * @param {boolean} hasImage + */ +export function getGoodsAllComments(params) { + const { hasImage } = params.queryParameter; + if (hasImage) { + return { + pageNum: 1, + pageSize: 10, + totalCount: '1', + pageList: [ + { + spuId: '1722045', + skuId: '0', + specInfo: '', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentResources: [ + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + type: 'image', + }, + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/comment-video.mp4', + type: 'video', + coverSrc: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + }, + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/comment-video.mp4', + type: 'video', + coverSrc: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + }, + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/comment-video.mp4', + type: 'video', + coverSrc: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + }, + ], + commentScore: 4, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1591953561000', + isAutoComment: false, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + { + spuId: '1722045', + skuId: '0', + specInfo: '', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentResources: [ + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + type: 'image', + }, + ], + commentScore: 4, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1591953561000', + isAutoComment: false, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + { + spuId: '1722045', + skuId: '0', + specInfo: '', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentResources: [ + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + type: 'image', + }, + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/comment-video.mp4', + type: 'video', + coverSrc: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + }, + ], + commentScore: 4, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1591953561000', + isAutoComment: false, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + { + spuId: '1722045', + skuId: '0', + specInfo: '', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentResources: [ + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + type: 'image', + }, + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/comment-video.mp4', + type: 'video', + coverSrc: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + }, + { + src: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/comment-video.mp4', + type: 'video', + coverSrc: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + }, + ], + commentScore: 4, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1591953561000', + isAutoComment: false, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + ], + }; + } + return { + pageNum: 1, + pageSize: 10, + totalCount: '47', + pageList: [ + { + spuId: '1722045', + skuId: '1697694', + specInfo: '很不错', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 1, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592224320000', + isAutoComment: false, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + { + spuId: '1722045', + skuId: '1697693', + specInfo: '很适合', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 1, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592224320000', + isAutoComment: false, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + { + spuId: '1722045', + skuId: '1697694', + specInfo: 'NICE', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 5, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592218074000', + isAutoComment: true, + sellerReply: + '亲,你好,我们会联系商家和厂商给您一个满意的答复请一定妥善保管好发票', + }, + { + spuId: '1722045', + skuId: '0', + specInfo: '', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 5, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592218074000', + isAutoComment: false, + goodsDetailInfo: '颜色:纯净白 尺码:S码', + }, + { + spuId: '1722045', + skuId: '1697694', + specInfo: '测试dr超长:dr专用超长;bwtgg01:fff', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 5, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592217607000', + isAutoComment: false, + }, + { + spuId: '1722045', + skuId: '1697693', + specInfo: '测试dr超长:超长测试超长测试1;bwtgg01:bbb', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 4, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592217607000', + isAutoComment: false, + }, + { + spuId: '1722045', + skuId: '1697694', + specInfo: '测试dr超长:dr专用超长;bwtgg01:fff', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 5, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592205599000', + isAutoComment: false, + }, + { + spuId: '1722045', + skuId: '1697694', + specInfo: '测试dr超长:dr专用超长;bwtgg01:fff', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 5, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1592188822000', + isAutoComment: false, + }, + { + spuId: '1722045', + skuId: '1697694', + specInfo: '测试dr超长:dr专用超长;bwtgg01:fff', + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentImageUrls: null, + commentScore: 5, + uid: '88881055835', + userName: 'Max', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1593792002000', + isAutoComment: true, + }, + { + spuId: '1722045', + skuId: '1697694', + specInfo: '测试dr超长:dr专用超长;bwtgg01:fff', + commentContent: '', + commentImageUrls: null, + commentScore: 5, + uid: '88881055835', + userName: 'Max', + userHeadUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/avatar/avatar1.png', + isAnonymity: false, + commentTime: '1593792001000', + isAutoComment: true, + }, + ], + }; +} + +export function getGoodsCommentsCount() { + return { + commentCount: '47', + badCount: '0', + middleCount: '2', + goodCount: '45', + hasImageCount: '1', + goodRate: 95.7, + uidCount: '0', + }; +} diff --git a/model/comments/queryDetail.js b/model/comments/queryDetail.js new file mode 100644 index 0000000..9ce2eb8 --- /dev/null +++ b/model/comments/queryDetail.js @@ -0,0 +1,50 @@ +const queryDetail = { + commentInfos: [ + { + id: '647984992708380600', + uid: '', + userName: 'Dean Cheng', + userHeadUrl: + 'https://bizmid-material-qa-1302115263.cos.ap-guangzhou.myqcloud.com/comment/default_head.png', + commentId: '1937712', + commentIdName: '小鹿商品', + commentIdImageUrl: + 'https://bizmid-material-qa-1302115263.file.myqcloud.com/persist/4bf2ded7-1759-4821-919c-cc4960e14120/1078823925183295617/100000114727/material/1/cdbeb389be64427b8c165627895ff0bc-1610425563793-%E5%A4%B4%E5%83%8F.png', + commentStage: 1, + commentCheckStatus: 2, + commentIdType: 1, + content: '', + commentInfo: { + score: null, + content: '', + medias: [], + commentTime: '1617872404000', + }, + isAgainComment: 0, + commentHasAgainComment: 0, + isAnonymous: 0, + replyList: [], + specification: '颜色:白色 ', + specificationJson: '{"颜色":"白色"}', + commentExtendId: '1937713', + commentTime: '1617872404000', + score: 0, + goodsScore: null, + freightScore: null, + serviceScore: null, + medias: [], + againCommentList: null, + }, + ], + logisticsScore: null, + serviceScore: null, +}; + +/** + * @param {string} skuId + * @param {string} spuId + * @param {string} orderNo + */ +export function queryCommentDetail() { + return queryDetail; +} diff --git a/model/coupon.js b/model/coupon.js new file mode 100644 index 0000000..a41ff8b --- /dev/null +++ b/model/coupon.js @@ -0,0 +1,39 @@ +/** + * 优惠券 + * + * @typedef {'default'|'useless'|'disabled'} CouponCardStatus + * @typedef {'discount'|'price'} CouponCardType + * + * @param {number} [id] + * @param {CouponCardStatus} [status] + * @param {CouponCardType} [type] + */ +export function getCoupon(id = 0, status = 'default', type = (id % 2) + 1) { + return { + /** key */ + key: `${id}`, + /** 优惠券状态 */ + status, + /** 优惠券类型 */ + type, + /** 折扣或者满减值 */ + value: type === 2 ? 5.5 : 1800, + /** 标签 */ + tag: '', + /** 描述 */ + desc: parseInt(id) > 0 ? `满${parseInt(id) * 100}元可用` : '无门槛使用', + /** 订单底价,满n元 */ + base: 10000 * (parseInt(id) || 0), + /** 标题 */ + title: type === 2 ? `生鲜折扣券 - ${id}` : `生鲜满减券 - ${id}`, + /** 有效时间限制 */ + timeLimit: '2019.11.18-2023.12.18', + /** 货币符号 */ + currency: '¥', + }; +} + +/** 优惠券列表 */ +export function getCouponList(status = 'default', length = 10) { + return new Array(length).fill(0).map((_, idx) => getCoupon(idx, status)); +} diff --git a/model/detailsComments.js b/model/detailsComments.js new file mode 100644 index 0000000..82fc887 --- /dev/null +++ b/model/detailsComments.js @@ -0,0 +1,30 @@ +export function getGoodsDetailsComments() { + return { + homePageComments: [ + { + spuId: '1722045', + skuId: null, + specInfo: null, + commentContent: + '收到货了,第一时间试了一下,很漂亮特别喜欢,大爱大爱,颜色也很好看。棒棒!', + commentScore: 4, + uid: '88881048075', + userName: 'Dean', + userHeadUrl: + 'https://wx.qlogo.cn/mmopen/vi_32/5mKrvn3ibyDNaDZSZics3aoKlz1cv0icqn4EruVm6gKjsK0xvZZhC2hkUkRWGxlIzOEc4600JkzKn9icOLE6zjgsxw/132', + }, + ], + }; +} + +export function getGoodsDetailsCommentsCount() { + return { + commentCount: '47', + badCount: '0', + middleCount: '2', + goodCount: '45', + hasImageCount: '1', + goodRate: 95.7, + uidCount: '0', + }; +} diff --git a/model/good.js b/model/good.js new file mode 100644 index 0000000..9410d37 --- /dev/null +++ b/model/good.js @@ -0,0 +1,1916 @@ +import { cdnBase } from '../config/index'; +const imgPrefix = cdnBase; + +const defaultDesc = [`${imgPrefix}/goods/details-1.png`]; + +const allGoods = [ + { + saasId: '88888888', + storeId: '1000', + spuId: '0', + title: '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09b.png', + ], + video: null, + available: 1, + minSalePrice: 29800, + minLinePrice: 29800, + maxSalePrice: 29800, + maxLinePrice: 40000, + spuStockQuantity: 510, + soldNum: 1020, + isPutOnSale: 1, + categoryIds: [ + '127880527393854975', + '127880527393854976', + '127880537778953984', + ], + specList: [ + { + specId: '10011', + title: '颜色', + specValueList: [ + { + specValueId: '10012', + specId: null, + saasId: null, + specValue: '米色荷叶边', + image: null, + }, + ], + }, + { + specId: '10013', + title: '尺码', + specValueList: [ + { + specValueId: '11014', + specId: null, + saasId: null, + specValue: 'S', + image: null, + }, + { + specValueId: '10014', + specId: null, + saasId: null, + specValue: 'M', + image: null, + }, + { + specValueId: '11013', + specId: null, + saasId: null, + specValue: 'L', + image: null, + }, + ], + }, + ], + skuList: [ + { + skuId: '135676631', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + specInfo: [ + { + specId: '10011', + specTitle: null, + specValueId: '10012', + specValue: null, + }, + { + specId: '10013', + specTitle: null, + specValueId: '11014', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '29800', priceTypeName: null }, + { priceType: 2, price: '40000', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 175, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + { + skuId: '135676632', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + specInfo: [ + { + specId: '10011', + specTitle: null, + specValueId: '10012', + specValue: null, + }, + { + specId: '10013', + specTitle: null, + specValueId: '11013', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '29800', priceTypeName: null }, + { priceType: 2, price: '40000', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 158, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + { + skuId: '135681631', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + specInfo: [ + { + specId: '10011', + specTitle: null, + specValueId: '10012', + specValue: null, + }, + { + specId: '10013', + specTitle: null, + specValueId: '10014', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '29800', priceTypeName: null }, + { priceType: 2, price: '40000', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 177, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + ], + spuTagList: [{ id: '13001', title: '限时抢购', image: null }], + limitInfo: [ + { + text: '限购5件', + }, + ], + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09d.png', + ], + etitle: '', + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135686633', + title: '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + minSalePrice: '25900', + minLinePrice: '31900', + maxSalePrice: '26900', + maxLinePrice: '31900', + isSoldOut: false, + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08a1.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + ], + groupIdList: ['15029', '14023'], + spuTagList: [ + { + id: null, + title: '2020夏季新款', + image: null, + }, + ], + skuList: [ + { + skuId: '135686634', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '10001', + specValue: '白色', + }, + { + specId: '10002', + specTitle: null, + specValueId: '10003', + specValue: 'M', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '25900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '31900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: -9, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691631', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '10001', + specValue: '白色', + }, + { + specId: '10002', + specTitle: null, + specValueId: '11003', + specValue: 'S', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '26900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '31900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 177, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691632', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '10001', + specValue: '白色', + }, + { + specId: '10002', + specTitle: null, + specValueId: '11002', + specValue: 'L', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '26900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '31900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 194, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + ], + isAvailable: 1, + spuStockQuantity: 371, + soldNum: 1032, + isPutOnSale: 1, + specList: [ + { + specId: '10000', + title: '颜色', + specValueList: [ + { + specValueId: '10001', + specId: '10000', + saasId: '88888888', + specValue: '白色', + image: '', + }, + ], + }, + { + specId: '10002', + title: '尺码', + specValueList: [ + { + specValueId: '11003', + specId: '10002', + saasId: '88888888', + specValue: 'S', + image: '', + }, + { + specValueId: '10003', + specId: '10002', + saasId: '88888888', + specValue: 'M', + image: '', + }, + { + specValueId: '11002', + specId: '10002', + saasId: '88888888', + specValue: 'L', + image: '', + }, + ], + }, + ], + promotionList: null, + minProfitPrice: null, + etitle: '', + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08d.png', + ], + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135691628', + title: '运动连帽拉链卫衣休闲开衫长袖多色运动细绒面料运动上衣', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a1.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17b.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17b1.png', + ], + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + minSalePrice: '25900', + minLinePrice: '39900', + maxSalePrice: '25900', + maxLinePrice: '39900', + isSoldOut: true, + groupIdList: ['15029', '14023'], + spuTagList: [ + { + id: null, + title: '2020夏季新款', + image: null, + }, + ], + skuList: [ + { + skuId: '135686631', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: '军绿色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862494014208', + specValue: 'XS', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '25900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135686632', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: '军绿色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862007474176', + specValue: 'M', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '25900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691629', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: '军绿色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862175246592', + specValue: 'S', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '25900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691630', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: '军绿色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904861755815680', + specValue: 'L', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '25900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + ], + isAvailable: 1, + spuStockQuantity: 0, + soldNum: 1022, + isPutOnSale: 1, + specList: [ + { + specId: '127904180600844800', + title: '颜色', + specValueList: [ + { + specValueId: '127904180768617216', + specId: '127904180600844800', + saasId: '88888888', + specValue: '军绿色', + image: '', + }, + ], + }, + { + specId: '127904861604820480', + title: '尺码', + specValueList: [ + { + specValueId: '127904862494014208', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'XS', + image: '', + }, + { + specValueId: '127904862175246592', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'S', + image: '', + }, + { + specValueId: '127904862007474176', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'M', + image: '', + }, + { + specValueId: '127904861755815680', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'L', + image: '', + }, + ], + }, + ], + promotionList: null, + minProfitPrice: null, + etitle: '', + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17d.png', + ], + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135686623', + title: '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3b.png', + ], + minSalePrice: '9900', + minLinePrice: '16900', + maxSalePrice: '10900', + maxLinePrice: '16900', + isSoldOut: false, + groupIdList: [ + '15029', + '15030', + '14023', + '127886731843219200', + '127886732665303040', + '127886733101511680', + '127886733923595520', + '14025', + '127886726071855616', + '14026', + '127886727481142784', + '127886731440566784', + ], + spuTagList: [ + { + id: null, + title: '联名系列', + image: null, + }, + ], + skuList: [ + { + skuId: '135686624', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '10001', + specValue: '经典白', + }, + { + specId: '10002', + specTitle: null, + specValueId: '10003', + specValue: '节能套装', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '9900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '16900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 98, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135686625', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '11000', + specValue: '贵族青', + }, + { + specId: '10002', + specTitle: null, + specValueId: '11003', + specValue: '经典套装', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '9900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '16900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 100, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135686626', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '11000', + specValue: '经典白', + }, + { + specId: '10002', + specTitle: null, + specValueId: '11002', + specValue: '尊享礼盒装', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '9900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '16900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 100, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691622', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '10001', + specValue: '经典白', + }, + { + specId: '10002', + specTitle: null, + specValueId: '11003', + specValue: 'S', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '9900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '16900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 100, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691623', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '10001', + specValue: '经典白', + }, + { + specId: '10002', + specTitle: null, + specValueId: '11002', + specValue: '尊享礼盒装', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '10900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '16900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 100, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135691624', + skuImage: null, + specInfo: [ + { + specId: '10000', + specTitle: null, + specValueId: '11000', + specValue: '贵族青', + }, + { + specId: '10002', + specTitle: null, + specValueId: '10003', + specValue: '节能套装', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '9900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '16900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 100, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + ], + isAvailable: 1, + spuStockQuantity: 598, + soldNum: 102, + isPutOnSale: 1, + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3d.png', + ], + specList: [ + { + specId: '10000', + title: '颜色', + specValueList: [ + { + specValueId: '10001', + specId: '10000', + saasId: '88888888', + specValue: '经典白', + image: '', + }, + { + specValueId: '11000', + specId: '10000', + saasId: '88888888', + specValue: '贵族青', + image: '', + }, + ], + }, + { + specId: '10002', + title: '尺码', + specValueList: [ + { + specValueId: '11003', + specId: '10002', + saasId: '88888888', + specValue: '经典套装', + image: '', + }, + { + specValueId: '10003', + specId: '10002', + saasId: '88888888', + specValue: '节能套装', + image: '', + }, + { + specValueId: '11002', + specId: '10002', + saasId: '88888888', + specValue: '尊享礼盒装', + image: '', + }, + ], + }, + ], + promotionList: null, + minProfitPrice: null, + etitle: '', + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135681628', + title: '带帽午休毯虎年款多功能加厚加大加绒简约多功能午休毯连帽披肩', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a1.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3b.png', + ], + minSalePrice: '29900', + minLinePrice: '39900', + maxSalePrice: '39900', + maxLinePrice: '39900', + isSoldOut: false, + groupIdList: [ + '14023', + '127886732245873408', + '127886733487386880', + '14025', + '127886726071855616', + '14026', + '127886728420666112', + '127886728957538048', + '127886729779621888', + '127886730165497088', + '127886730652037376', + '127886731037912576', + '127886731440566784', + '127886729360190464', + '15029', + '15030', + ], + spuTagList: [ + { + id: null, + title: '限时抢购', + image: null, + }, + ], + skuList: [ + { + skuId: '135676629', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181322265856', + specValue: '浅灰色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862175246592', + specValue: 'S', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '29900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 80, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135676630', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181322265856', + specValue: '浅灰色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904861755815680', + specValue: 'L', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '39900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 122, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135681629', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181322265856', + specValue: '浅灰色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862007474176', + specValue: 'M', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '39900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '39900', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 119, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + ], + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3d.png', + ], + isAvailable: 1, + spuStockQuantity: 321, + soldNum: 102, + isPutOnSale: 1, + specList: [ + { + specId: '127904180600844800', + title: '颜色', + specValueList: [ + { + specValueId: '127904181322265856', + specId: '127904180600844800', + saasId: '88888888', + specValue: '浅灰色', + image: '', + }, + ], + }, + { + specId: '127904861604820480', + title: '尺码', + specValueList: [ + { + specValueId: '127904862175246592', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'S', + image: '', + }, + { + specValueId: '127904862007474176', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'M', + image: '', + }, + { + specValueId: '127904861755815680', + specId: '127904861604820480', + saasId: '88888888', + specValue: 'L', + image: '', + }, + ], + }, + ], + promotionList: null, + minProfitPrice: null, + etitle: '', + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135681626', + title: '迷你便携高颜值蓝牙无线耳机立体声只能触控式操作简约立体声耳机', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a1.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2b.png', + ], + minSalePrice: '29000', + minLinePrice: '40000', + maxSalePrice: '39000', + maxLinePrice: '40000', + isSoldOut: false, + groupIdList: [ + '15029', + '15030', + '14023', + '127886732245873408', + '127886733487386880', + '14025', + '127886726071855616', + '14026', + '127886728420666112', + '127886728957538048', + '127886730652037376', + '127886731037912576', + ], + spuTagList: [ + { + id: null, + title: '限时抢购', + image: null, + }, + ], + skuList: [ + { + skuId: '135676627', + skuImage: null, + specInfo: [ + { + specId: '10006', + specTitle: null, + specValueId: '10007', + specValue: '黑色', + }, + { + specId: '11007', + specTitle: null, + specValueId: '10009', + specValue: '简约款', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '29000', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '40000', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 123, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135676628', + skuImage: null, + specInfo: [ + { + specId: '10006', + specTitle: null, + specValueId: '10007', + specValue: '黑色', + }, + { + specId: '11007', + specTitle: null, + specValueId: '10008', + specValue: '礼盒装', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '39000', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '40000', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 123, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135681627', + skuImage: null, + specInfo: [ + { + specId: '10006', + specTitle: null, + specValueId: '10007', + specValue: '黑色', + }, + { + specId: '11007', + specTitle: null, + specValueId: '11008', + specValue: '带充电线简约款', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '39000', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '40000', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 120, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + ], + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2d.png', + ], + isAvailable: 1, + spuStockQuantity: 366, + soldNum: 102, + isPutOnSale: 1, + specList: [ + { + specId: '10006', + title: '颜色', + specValueList: [ + { + specValueId: '10007', + specId: '10006', + saasId: '88888888', + specValue: '黑色', + image: '', + }, + ], + }, + { + specId: '11007', + title: '类型', + specValueList: [ + { + specValueId: '10009', + specId: '11007', + saasId: '88888888', + specValue: '简约款', + image: '', + }, + { + specValueId: '11008', + specId: '11007', + saasId: '88888888', + specValue: '带充电线简约款', + image: '', + }, + { + specValueId: '10008', + specId: '11007', + saasId: '88888888', + specValue: '礼盒款', + image: '', + }, + ], + }, + ], + promotionList: null, + minProfitPrice: null, + etitle: '', + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135681622', + title: '简约餐盘耐热家用盘子菜盘套装多颜色简约餐盘耐热家用盘子', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-1a.png', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-1a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-1a2.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-1b.png', + ], + minSalePrice: '129900', + minLinePrice: '218000', + maxSalePrice: '139900', + maxLinePrice: '218000', + isSoldOut: false, + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-1c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-1d.png', + ], + groupIdList: [ + '14023', + '127886732665303040', + '127886733101511680', + '127886733923595520', + '14025', + '127886726071855616', + '14026', + '127886728957538048', + '127886727481142784', + '127886729779621888', + '127886730165497088', + '127886730652037376', + '127886731440566784', + '127886729360190464', + '15029', + '15030', + ], + spuTagList: [ + { + id: null, + title: '掌柜热卖', + image: null, + }, + ], + skuList: [ + { + skuId: '135676623', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181506815488', + specValue: '奶黄色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862175246592', + specValue: '单盘', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '129900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '218000', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 119, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135676624', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181506815488', + specValue: '奶黄色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904861755815680', + specValue: '盘+碗', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '139900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '218000', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 116, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + { + skuId: '135681623', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181506815488', + specValue: '奶黄色', + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862007474176', + specValue: '单盘', + }, + ], + priceInfo: [ + { + priceType: 1, + price: '139900', + priceTypeName: '销售价格', + }, + { + priceType: 2, + price: '218000', + priceTypeName: '划线价格', + }, + ], + stockInfo: { + stockQuantity: 122, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: null, + volume: null, + profitPrice: null, + }, + ], + isAvailable: 1, + spuStockQuantity: 357, + soldNum: 23102, + isPutOnSale: 1, + specList: [ + { + specId: '127904180600844800', + title: '颜色', + specValueList: [ + { + specValueId: '127904181506815488', + specId: '127904180600844800', + saasId: '88888888', + specValue: '奶黄色', + image: '', + }, + ], + }, + { + specId: '127904861604820480', + title: '类型', + specValueList: [ + { + specValueId: '127904862175246592', + specId: '127904861604820480', + saasId: '88888888', + specValue: '单盘', + image: '', + }, + { + specValueId: '127904862007474176', + specId: '127904861604820480', + saasId: '88888888', + specValue: '单碗', + image: '', + }, + { + specValueId: '127904861755815680', + specId: '127904861604820480', + saasId: '88888888', + specValue: '盘+碗', + image: '', + }, + ], + }, + ], + promotionList: null, + minProfitPrice: null, + etitle: '', + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135681624', + title: '不锈钢刀叉勺套装家用西餐餐具ins简约耐用不锈钢金色银色可选', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + images: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2a1.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + ], + video: null, + available: 1, + minSalePrice: '19900', + minLinePrice: '19900', + maxSalePrice: '29900', + maxLinePrice: '29900', + spuStockQuantity: 0, + soldNum: 102, + isPutOnSale: 1, + categoryIds: [ + '127880527393854975', + '127880527393854977', + '127880526789875961', + ], + specList: [ + { + specId: '127904180600844800', + title: '颜色', + specValueList: [ + { + specValueId: '127904180768617216', + specId: null, + saasId: null, + specValue: '奶黄色', + image: null, + }, + ], + }, + { + specId: '127904861604820480', + title: '数量', + specValueList: [ + { + specValueId: '127904862175246592', + specId: null, + saasId: null, + specValue: '三件套', + image: null, + }, + { + specValueId: '127904862007474176', + specId: null, + saasId: null, + specValue: '六件套', + image: null, + }, + { + specValueId: '127904861755815680', + specId: null, + saasId: null, + specValue: '八件套', + image: null, + }, + ], + }, + ], + skuList: [ + { + skuId: '135676625', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: null, + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862175246592', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '19900', priceTypeName: null }, + { priceType: 2, price: '29900', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + { + skuId: '135676626', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: null, + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904861755815680', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '29900', priceTypeName: null }, + { priceType: 2, price: '29900', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + { + skuId: '135681625', + skuImage: null, + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904180768617216', + specValue: null, + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862007474176', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '29900', priceTypeName: null }, + { priceType: 2, price: '29900', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 0, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + ], + spuTagList: [{ id: '19011', title: '2020秋季新款', image: null }], + spuLimitList: null, + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2d.png', + ], + etitle: '', + }, + { + saasId: '88888888', + storeId: '1000', + spuId: '135681628', + title: '带帽午休毯虎年款多功能加厚加大加绒简约多功能午休毯连帽披肩', + primaryImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + images: ['https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png'], + video: null, + available: 1, + minSalePrice: '29900', + minLinePrice: '29900', + maxSalePrice: '39900', + maxLinePrice: '39900', + spuStockQuantity: 321, + soldNum: 103, + isPutOnSale: 1, + categoryIds: [ + '127880527393854975', + '127880527393854977', + '127880526789875961', + ], + specList: [ + { + specId: '127904180600844800', + title: '颜色', + specValueList: [ + { + specValueId: '127904181322265856', + specId: null, + saasId: null, + specValue: '浅灰色', + image: null, + }, + ], + }, + { + specId: '127904861604820480', + title: '尺码', + specValueList: [ + { + specValueId: '127904862175246592', + specId: null, + saasId: null, + specValue: 'S', + image: null, + }, + { + specValueId: '127904862007474176', + specId: null, + saasId: null, + specValue: 'M', + image: null, + }, + { + specValueId: '127904861755815680', + specId: null, + saasId: null, + specValue: 'L', + image: null, + }, + ], + }, + ], + skuList: [ + { + skuId: '135676629', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181322265856', + specValue: null, + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862175246592', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '29900', priceTypeName: null }, + { priceType: 2, price: '39900', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 80, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + { + skuId: '135676630', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181322265856', + specValue: null, + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904861755815680', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '39900', priceTypeName: null }, + { priceType: 2, price: '39900', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 122, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + { + skuId: '135681629', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + specInfo: [ + { + specId: '127904180600844800', + specTitle: null, + specValueId: '127904181322265856', + specValue: null, + }, + { + specId: '127904861604820480', + specTitle: null, + specValueId: '127904862007474176', + specValue: null, + }, + ], + priceInfo: [ + { priceType: 1, price: '39900', priceTypeName: null }, + { priceType: 2, price: '39900', priceTypeName: null }, + ], + stockInfo: { + stockQuantity: 119, + safeStockQuantity: 0, + soldQuantity: 0, + }, + weight: { value: null, unit: 'KG' }, + volume: null, + profitPrice: null, + }, + ], + spuTagList: [{ id: '13001', title: '限时抢购', image: null }], + spuLimitList: null, + desc: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3c.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3d.png', + ], + etitle: '', + }, +]; + +/** + * @param {string} id + * @param {number} [available] 库存, 默认1 + */ +export function genGood(id, available = 1) { + const specID = ['135681624', '135681628']; + if (specID.indexOf(id) > -1) { + return allGoods.filter((good) => good.spuId === id)[0]; + } + const item = allGoods[id % allGoods.length]; + return { + ...item, + spuId: `${id}`, + available: available, + desc: item?.desc || defaultDesc, + images: item?.images || [item?.primaryImage], + }; +} diff --git a/model/goods.js b/model/goods.js new file mode 100644 index 0000000..850e0ba --- /dev/null +++ b/model/goods.js @@ -0,0 +1,7 @@ +import { genGood } from './good'; + +export function getGoodsList(baseID = 0, length = 10) { + return new Array(length).fill(0).map((_, idx) => genGood(idx + baseID)); +} + +export const goodsList = getGoodsList(); diff --git a/model/order/applyService.js b/model/order/applyService.js new file mode 100644 index 0000000..e3a2fdf --- /dev/null +++ b/model/order/applyService.js @@ -0,0 +1,295 @@ +import { mockIp, mockReqId } from '../../utils/mock'; + +const orderResps = [ + { + data: { + saasId: '88888888', + uid: '88888888205468', + storeId: '1000', + skuId: '135691625', + numOfSku: 1, + numOfSkuAvailable: 1, + refundableAmount: '26900', + refundableDiscountAmount: '0', + shippingFeeIncluded: '0', + paidAmountEach: '26900', + boughtQuantity: 1, + orderNo: '132222623132329291', + goodsInfo: { + goodsName: + '迷你便携高颜值蓝牙无线耳机立体声只能触控式操作简约立体声耳机', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + specInfo: [ + { + specId: '50456', + specTitle: '颜色', + specValue: '黑色', + }, + { + specId: '50459', + specTitle: '尺码', + specValue: '简约款', + }, + ], + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 36, + success: true, + }, + { + data: { + saasId: '88888888', + uid: '88888888205468', + storeId: '1000', + skuId: '135676631', + numOfSku: 1, + numOfSkuAvailable: 1, + refundableAmount: '26900', + refundableDiscountAmount: '0', + shippingFeeIncluded: '0', + paidAmountEach: '26900', + boughtQuantity: 1, + orderNo: '132222623132329291', + goodsInfo: { + goodsName: '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + specInfo: [ + { + specId: '50456', + specTitle: '颜色', + specValue: '米色荷叶边', + }, + { + specId: '50459', + specTitle: '尺码', + specValue: 'S', + }, + ], + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 36, + success: true, + }, + { + data: { + saasId: '88888888', + uid: '88888888205468', + storeId: '1000', + skuId: '135691622', + numOfSku: 1, + numOfSkuAvailable: 1, + refundableAmount: '26900', + refundableDiscountAmount: '0', + shippingFeeIncluded: '0', + paidAmountEach: '26900', + boughtQuantity: 1, + orderNo: '132222623132329291', + goodsInfo: { + goodsName: '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + specInfo: [ + { + specId: '50456', + specTitle: '颜色', + specValue: '经典白', + }, + { + specId: '50459', + specTitle: '类型', + specValue: '经典套装', + }, + ], + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 36, + success: true, + }, + { + data: { + saasId: '88888888', + uid: '88888888205468', + storeId: '1000', + skuId: '135676629', + numOfSku: 1, + numOfSkuAvailable: 1, + refundableAmount: '26900', + refundableDiscountAmount: '0', + shippingFeeIncluded: '0', + paidAmountEach: '26900', + boughtQuantity: 1, + orderNo: '132222623132329291', + goodsInfo: { + goodsName: '带帽午休毯虎年款多功能加厚加大加绒简约多功能午休毯连帽披肩', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + specInfo: [ + { + specId: '50456', + specTitle: '颜色', + specValue: '浅灰色', + }, + { + specId: '50459', + specTitle: '尺码', + specValue: 'S', + }, + ], + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 36, + success: true, + }, + { + data: { + saasId: '88888888', + uid: '88888888205468', + storeId: '1000', + skuId: '135686631', + numOfSku: 1, + numOfSkuAvailable: 1, + refundableAmount: '26900', + refundableDiscountAmount: '0', + shippingFeeIncluded: '0', + paidAmountEach: '26900', + boughtQuantity: 1, + orderNo: '132222623132329291', + goodsInfo: { + goodsName: '运动连帽拉链卫衣休闲开衫长袖多色运动细绒面料运动上衣', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + specInfo: [ + { + specId: '50456', + specTitle: '颜色', + specValue: '军绿色', + }, + { + specId: '50459', + specTitle: '尺码', + specValue: 'XS', + }, + ], + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 36, + success: true, + }, + { + data: { + saasId: '88888888', + uid: '88888888205468', + storeId: '1000', + skuId: '19384938948343', + numOfSku: 1, + numOfSkuAvailable: 1, + refundableAmount: '26900', + refundableDiscountAmount: '0', + shippingFeeIncluded: '0', + paidAmountEach: '26900', + boughtQuantity: 1, + orderNo: '130169571554503755', + goodsInfo: { + goodsName: + '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + skuImage: 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + specInfo: [ + { + specId: '50456', + specTitle: '颜色', + specValue: '军绿色', + }, + { + specId: '50459', + specTitle: '尺码', + specValue: 'XS', + }, + ], + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 36, + success: true, + }, +]; + +export function genRightsPreview(params) { + const { orderNo, skuId } = params; + const resp = orderResps.find( + (r) => r.data.orderNo === orderNo && r.data.skuId === skuId, + ); + return resp; +} + +export function genApplyReasonList(params) { + const resp = { + data: { + saasId: '70000001', + rightsReasonList: [ + { id: '1', desc: '实际商品与描述不符' }, + { id: '2', desc: '质量问题' }, + { id: '3', desc: '少件/漏发' }, + { id: '4', desc: '包装/商品/污迹/裂痕/变形' }, + { id: '5', desc: '发货太慢' }, + { id: '6', desc: '物流配送太慢' }, + { id: '7', desc: '商家发错货' }, + { id: '8', desc: '不喜欢' }, + ], + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 6, + success: true, + }; + // 未收货对应的原因列表 + if (params.rightsReasonType === 'REFUND_MONEY') { + resp.data.rightsReasonList = [ + { id: '9', desc: '空包裹' }, + { id: '10', desc: '快递/物流一直未送到' }, + { id: '11', desc: '货物破损已拒签' }, + { id: '12', desc: '不喜欢' }, + ]; + } + return resp; +} + +export function applyService() { + const resp = { + data: { + rightsNo: '123123423', + saasId: '70000001', + uid: '700000011070005', + storeId: '542', + result: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 269, + success: true, + }; + return resp; +} diff --git a/model/order/orderConfirm.js b/model/order/orderConfirm.js new file mode 100644 index 0000000..7170492 --- /dev/null +++ b/model/order/orderConfirm.js @@ -0,0 +1,147 @@ +import { mockIp, mockReqId } from '../../utils/mock'; + +export const transformGoodsDataToConfirmData = (goodsDataList) => { + const list = []; + + goodsDataList.forEach((goodsData) => { + list.push({ + storeId: goodsData.storeId, + spuId: goodsData.spuId, + skuId: goodsData.skuId, + goodsName: goodsData.title, + image: goodsData.primaryImage, + reminderStock: 119, + quantity: goodsData.quantity, + payPrice: goodsData.price, + totalSkuPrice: goodsData.price, + discountSettlePrice: goodsData.price, + realSettlePrice: goodsData.price, + settlePrice: goodsData.price, + oriPrice: goodsData.originPrice, + tagPrice: null, + tagText: null, + skuSpecLst: goodsData.specInfo, + promotionIds: null, + weight: 0.0, + unit: 'KG', + volume: null, + masterGoodsType: 0, + viceGoodsType: 0, + roomId: goodsData.roomId, + egoodsName: null, + }); + }); + + return list; +}; + +/** 生成结算数据 */ +export function genSettleDetail(params) { + const { userAddressReq, couponList, goodsRequestList } = params; + + const resp = { + data: { + settleType: 0, + userAddress: null, + totalGoodsCount: 3, + packageCount: 1, + totalAmount: '289997', + totalPayAmount: '', + totalDiscountAmount: '110000', + totalPromotionAmount: '1100', + totalCouponAmount: '0', + totalSalePrice: '289997', + totalGoodsAmount: '289997', + totalDeliveryFee: '0', + invoiceRequest: null, + skuImages: null, + deliveryFeeList: null, + storeGoodsList: [ + { + storeId: '1000', + storeName: '云Mall深圳旗舰店', + remark: null, + goodsCount: 1, + deliveryFee: '0', + deliveryWords: null, + storeTotalAmount: '0', + storeTotalPayAmount: '179997', + storeTotalDiscountAmount: '110000', + storeTotalCouponAmount: '0', + skuDetailVos: [], + couponList: [ + { + couponId: 11, + storeId: '1000', + }, + ], + }, + ], + inValidGoodsList: null, + outOfStockGoodsList: null, + limitGoodsList: null, + abnormalDeliveryGoodsList: null, + invoiceSupport: 1, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 244, + success: true, + }; + + const list = transformGoodsDataToConfirmData(goodsRequestList); + + // 获取购物车传递的商品数据 + resp.data.storeGoodsList[0].skuDetailVos = list; + + // 判断是否携带优惠券数据 + const discountPrice = []; + + if (couponList && couponList.length > 0) { + couponList.forEach((coupon) => { + if (coupon.status === 'default') { + discountPrice.push({ + type: coupon.type, + value: coupon.value, + }); + } + }); + } + + // 模拟计算场景 + + // 计算总价 + const totalPrice = list.reduce((pre, cur) => { + return pre + cur.quantity * Number(cur.settlePrice); + }, 0); + + // 计算折扣 + const totalDiscountPrice = + discountPrice.length > 0 + ? discountPrice.reduce((pre, cur) => { + if (cur.type === 1) { + return pre + cur.value; + } + if (cur.type === 2) { + return pre + (Number(totalPrice) * cur.value) / 10; + } + + return pre + cur; + }, 0) + : 0; + + resp.data.totalSalePrice = totalPrice; + + resp.data.totalCouponAmount = totalDiscountPrice; + + resp.data.totalPayAmount = + totalPrice - totalDiscountPrice - Number(resp.data.totalPromotionAmount); + + if (userAddressReq) { + resp.data.settleType = 1; + resp.data.userAddress = userAddressReq; + } + return resp; +} diff --git a/model/order/orderDetail.js b/model/order/orderDetail.js new file mode 100644 index 0000000..032a08b --- /dev/null +++ b/model/order/orderDetail.js @@ -0,0 +1,1212 @@ +import { mockIp, mockReqId } from '../../utils/mock'; + +const orderResps = [ + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '354021731671873099', + orderId: '354021735982432279', + orderNo: '354021731671873099', + orderType: 0, + orderSubType: 0, + orderStatus: 5, + orderSubStatus: null, + totalAmount: '10010', + goodsAmount: '10000', + goodsAmountApp: '10000', + paymentAmount: '20', + freightFee: '10', + packageFee: '0', + discountAmount: '9990', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '买电风扇送电池吗', + cancelType: 0, + cancelReasonType: 0, + cancelReason: '', + rightsType: 0, + createTime: '1600350829288', + orderItemVOs: [ + { + id: '354021736133427225', + orderNo: null, + spuId: '3', + skuId: '135696670', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + specifications: [ + { specTitle: '颜色', specValue: '贵族青' }, + { specTitle: '类型', specValue: '尊享礼盒装' }, + ], + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3b.png', + originPrice: '0', + actualPrice: '9999', + buyQuantity: 1, + itemTotalAmount: '9999', + itemDiscountAmount: '9990', + itemPaymentAmount: '10', + goodsPaymentPrice: '10', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [{ primary: false }], + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '14', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '宝安区', + receiverArea: '', + receiverAddress: '沙井中心路28号丽沙花都xx栋xx号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '测试用户', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '20', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: [{ primary: true, type: 1, name: '付款' }], + labelVOs: null, + invoiceVO: null, + couponAmount: '0', + autoCancelTime: '1823652629288', + orderStatusName: '待付款', + orderSatusRemark: '需支付¥0.20', + logisticsLogVO: null, + invoiceStatus: 3, + invoiceDesc: '暂不开发票', + invoiceUrl: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 89, + success: true, + }, + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + + parentOrderNo: '132381532610540875', + orderId: '132381537256650240', + orderNo: '132381532610540875', + orderType: 0, + orderSubType: 0, + orderStatus: 10, + orderSubStatus: null, + totalAmount: '76600', + goodsAmount: '76600', + goodsAmountApp: '76600', + paymentAmount: '36800', + freightFee: '0', + packageFee: '0', + discountAmount: '34800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '麻烦给个配饰', + cancelType: 0, + cancelReasonType: 0, + cancelReason: '', + rightsType: 0, + + createTime: '1587140043976', + + orderItemVOs: [ + { + id: '132381537407645696', + orderNo: null, + spuId: '0', + skuId: '135676631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { + specTitle: '颜色', + specValue: '米色荷叶边', + }, + { + specTitle: '尺码', + specValue: 'S', + }, + ], + buyQuantity: 1, + itemTotalAmount: '29800', + itemDiscountAmount: '19813', + itemPaymentAmount: '9987', + goodsPaymentPrice: '9987', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132381537407645952', + orderNo: null, + spuId: '7', + skuId: '135691633', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '不锈钢刀叉勺套装家用西餐餐具ins简约耐用不锈钢金色银色可选', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + originPrice: '29900', + actualPrice: '19900', + specifications: [ + { specTitle: '颜色', specValue: '奶黄色' }, + { specTitle: '类型', specValue: '三件套' }, + ], + buyQuantity: 1, + itemTotalAmount: '19900', + itemDiscountAmount: '13230', + itemPaymentAmount: '6670', + goodsPaymentPrice: '6670', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132381537407646208', + orderNo: null, + spuId: '1', + skuId: '135691631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08a.png', + originPrice: '31900', + actualPrice: '26900', + specifications: [ + { + specTitle: '颜色', + specValue: '白色', + }, + { + specTitle: '尺码', + specValue: 'S', + }, + ], + buyQuantity: 1, + itemTotalAmount: '26900', + itemDiscountAmount: '6757', + itemPaymentAmount: '20143', + goodsPaymentPrice: '20143', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '广州市', + receiverCountry: '海珠区', + receiverArea: '', + receiverAddress: '新港中路397号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '张三', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '36800', + currency: 'CNY', + payType: 0, + payWay: null, + payWayName: null, + interactId: '4923587', + traceNo: null, + channelTrxNo: null, + period: null, + payTime: '1600162877000', + paySuccessTime: '1600162877538', + }, + buttonVOs: [ + { + primary: false, + type: 2, + name: '取消订单', + }, + { + primary: true, + type: 9, + name: '再次购买', + }, + ], + labelVOs: null, + invoiceVO: { + buyerName: '腾讯计算机有限公司', //个人或公司名称 + buyerTaxNo: '9144 9808 0909 0293 XG', //税号 + buyerPhone: '18600008888', //手机 + email: '73900484@qq.com', //邮箱 + titleType: 2, //发票抬头 1-个人 2-公司 + ontentType: 1, //发票内容 1-明细 2类别 + invoiceType: 5, //是否开票 0-不开 5-电子发票 + money: '1.54', + }, + trajectoryVos: [ + { + title: '已下单', + icon: 'https://cdn-we-retail.ym.tencent.com/web/trajectoryIcons/ordered.svg', + code: '200002', + nodes: [ + { + status: '订单已经支付成功,支付方式为:微信支付', + timestamp: '1600162877506', + remark: null, + }, + ], + isShow: true, + }, + { + title: '', + icon: null, + code: '200001', + nodes: [ + { + status: '订单已提交', + timestamp: '1600162856204', + remark: null, + }, + ], + isShow: true, + }, + ], + + couponAmount: '5000', + autoCancelTime: null, + orderStatusName: '待发货', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: 3, + invoiceDesc: '暂不开发票', + invoiceUrl: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 79, + success: true, + }, + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '132222623132329291', + orderId: '132222629674264064', + orderNo: '132222623132329291', + orderType: 0, + orderSubType: 0, + orderStatus: 40, + orderSubStatus: null, + totalAmount: '500400', + goodsAmount: '500400', + goodsAmountApp: '500400', + paymentAmount: '458600', + freightFee: '0', + packageFee: '0', + discountAmount: '36800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '我是买一送一的,记得送', + cancelType: 3, + cancelReasonType: 0, + cancelReason: '', + rightsType: 0, + createTime: '1587130572345', + orderItemVOs: [ + { + id: '132222629825259776', + orderNo: null, + spuId: '5', + skuId: '135691625', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '迷你便携高颜值蓝牙无线耳机立体声只能触控式操作简约立体声耳机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + originPrice: '15900', + actualPrice: '8900', + specifications: [ + { + specTitle: '颜色', + specValue: '黑色', + }, + { + specTitle: '尺码', + specValue: '简约款', + }, + ], + buyQuantity: 1, + itemTotalAmount: '8900', + itemDiscountAmount: '2134', + itemPaymentAmount: '6766', + goodsPaymentPrice: '6766', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [{ primary: false, type: 4, name: '申请售后' }], + }, + { + id: '132222629825260032', + orderNo: null, + spuId: '0', + skuId: '135676631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { + specTitle: '颜色', + specValue: '米色荷叶边', + }, + { + specTitle: '尺码', + specValue: 'S', + }, + ], + buyQuantity: 1, + itemTotalAmount: '29800', + itemDiscountAmount: '4026', + itemPaymentAmount: '25774', + goodsPaymentPrice: '25774', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [{ primary: false, type: 4, name: '申请售后' }], + }, + { + id: '132222629825260288', + orderNo: null, + spuId: '3', + skuId: '135691622', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + originPrice: '16900', + actualPrice: '9900', + specifications: [ + { + specTitle: '颜色', + specValue: '经典白', + }, + { + specTitle: '类型', + specValue: '经典套装', + }, + ], + buyQuantity: 1, + itemTotalAmount: '9900', + itemDiscountAmount: '1337', + itemPaymentAmount: '8563', + goodsPaymentPrice: '8563', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [{ primary: false, type: 4, name: '申请售后' }], + }, + { + id: '132222629825260544', + orderNo: null, + spuId: '135681628', + skuId: '135676629', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '带帽午休毯虎年款多功能加厚加大加绒简约多功能午休毯连帽披肩', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + originPrice: '39900', + actualPrice: '29900', + specifications: [ + { + specTitle: '颜色', + specValue: '浅灰色', + }, + { + specTitle: '尺码', + specValue: 'S', + }, + ], + buyQuantity: 4, + itemTotalAmount: '119600', + itemDiscountAmount: '4040', + itemPaymentAmount: '115560', + goodsPaymentPrice: '28890', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [{ primary: false, type: 4, name: '申请售后' }], + }, + { + id: '132222629825260800', + orderNo: null, + spuId: '2', + skuId: '135686631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: '运动连帽拉链卫衣休闲开衫长袖多色运动细绒面料运动上衣', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + originPrice: '39900', + actualPrice: '25900', + specifications: [ + { + specTitle: '颜色', + specValue: '军绿色', + }, + { + specTitle: '尺码', + specValue: 'XS', + }, + ], + buyQuantity: 1, + itemTotalAmount: '25900', + itemDiscountAmount: '392', + itemPaymentAmount: '25508', + goodsPaymentPrice: '25508', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [{ primary: false, type: 4, name: '申请售后' }], + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '111112', + logisticsStatus: null, + logisticsCompanyCode: 'yunda', + logisticsCompanyName: '韵达快递', + + receiverAddressId: '8', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '700000011070005', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: '1599795293089', + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '458600', + currency: 'CNY', + payType: 0, + payWay: null, + payWayName: null, + interactId: '66869', + traceNo: null, + channelTrxNo: null, + period: null, + payTime: '1594869391000', + paySuccessTime: '1594869391287', + }, + buttonVOs: [ + { + primary: true, + type: 3, + name: '确认收货', + }, + ], + labelVOs: null, + trajectoryVos: [ + { + title: '已发货', + icon: 'deliver', + code: '200003', + nodes: [ + { + status: '商家已发货,物流承运商:韵达快递', + timestamp: '1599795293089', + remark: null, + }, + ], + isShow: true, + }, + { + title: '已下单', + icon: 'https://cdn-we-retail.ym.tencent.com/web/trajectoryIcons/ordered.svg', + code: '200002', + nodes: [ + { + status: '订单已经支付成功,支付方式为:微信支付', + timestamp: '1594869391220', + remark: null, + }, + ], + isShow: true, + }, + { + title: '', + icon: null, + code: '200001', + nodes: [ + { + status: '订单已提交', + timestamp: '1594869381185', + remark: null, + }, + ], + isShow: true, + }, + ], + + couponAmount: '5000', + autoCancelTime: null, + orderStatusName: '待收货', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: 1, + invoiceDesc: '已开发票', + invoiceUrl: null, + invoiceVO: { + buyerName: '公司名称XXXX', //个人或公司名称 + buyerTaxNo: 'R5647U7', //税号 + buyerPhone: '13534343434', //手机 + email: '123@qq.com', //邮箱 + titleType: 2, //发票抬头 1-个人 2-公司 + ontentType: 2, //发票内容 1-明细 2类别 + invoiceType: 5, //是否开票 0-不开 5-电子发票 + isInvoice: '已开票', + money: 10000, + }, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 74, + success: true, + }, + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130862219672031307', + orderId: '130862224737571072', + orderNo: '130862219672031307', + orderType: 0, + orderSubType: 0, + orderStatus: 80, + orderSubStatus: null, + totalAmount: '298000', + goodsAmount: '298000', + goodsAmountApp: '298000', + paymentAmount: '263200', + freightFee: '0', + packageFee: '0', + discountAmount: '29800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: 3, + cancelReasonType: 0, + cancelReason: '超时未支付', + rightsType: 0, + createTime: '1587049485895', + orderItemVOs: [ + { + id: '130862224922120960', + orderNo: null, + spuId: '0', + skuId: '135676631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { specTitle: '颜色', specValue: '米色荷叶边' }, + { specTitle: '尺码', specValue: 'S' }, + ], + buyQuantity: 10, + itemTotalAmount: '298000', + itemDiscountAmount: '29800', + itemPaymentAmount: '268200', + goodsPaymentPrice: '26820', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '宝安区', + receiverArea: '', + receiverAddress: '沙井中心路28号丽沙花都xx栋xx号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '测试用户', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '263200', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: null, + labelVOs: null, + invoiceVO: null, + couponAmount: '5000', + autoCancelTime: null, + orderStatusName: '已取消(未支付)', + orderSatusRemark: '超时未支付', + logisticsLogVO: null, + invoiceStatus: 2, + invoiceDesc: '暂不开发票', + invoiceUrl: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 70, + success: true, + }, + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130494472895208267', + orderId: '130494482155052032', + orderNo: '130494472895208267', + orderType: 0, + orderSubType: 0, + orderStatus: 80, + orderSubStatus: null, + totalAmount: '59700', + goodsAmount: '59700', + goodsAmountApp: '59700', + paymentAmount: '24900', + freightFee: '0', + packageFee: '0', + discountAmount: '29800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: 3, + cancelReasonType: 0, + cancelReason: '超时未支付', + rightsType: 0, + createTime: '1587027566726', + orderItemVOs: [ + { + id: '130494482322824704', + orderNo: null, + spuId: '7', + skuId: '135691633', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '不锈钢刀叉勺套装家用西餐餐具ins简约耐用不锈钢金色银色可选', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + originPrice: '29900', + actualPrice: '19900', + specifications: [ + { specTitle: '颜色', specValue: '奶黄色' }, + { specTitle: '类型', specValue: '三件套' }, + ], + buyQuantity: 3, + itemTotalAmount: '59700', + itemDiscountAmount: '29800', + itemPaymentAmount: '29900', + goodsPaymentPrice: '9966', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '宝安区', + receiverArea: '', + receiverAddress: '沙井中心路28号丽沙花都xx栋xx号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '测试用户', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '24900', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: null, + labelVOs: null, + invoiceVO: null, + couponAmount: '5000', + autoCancelTime: null, + orderStatusName: '已取消(未支付)', + orderSatusRemark: '超时未支付', + logisticsLogVO: null, + invoiceStatus: 3, + invoiceDesc: '暂不开发票', + invoiceUrl: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 81, + success: true, + }, + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130169571554503755', + orderId: '130169572291521792', + orderNo: '130169571554503755', + orderType: 0, + orderSubType: 0, + orderStatus: 50, + orderSubStatus: null, + totalAmount: '538000', + goodsAmount: '538000', + goodsAmountApp: '538000', + paymentAmount: '508200', + freightFee: '0', + packageFee: '0', + discountAmount: '29800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: 0, + cancelReasonType: 0, + cancelReason: '', + rightsType: 10, + createTime: '1587008200587', + orderItemVOs: [ + { + id: '130169572425740032', + orderNo: null, + spuId: '1', + skuId: '135691631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + originPrice: '31900', + actualPrice: '26900', + specifications: [ + { specTitle: '颜色', specValue: '橙色' }, + { specTitle: '尺码', specValue: 'M' }, + ], + buyQuantity: 20, + itemTotalAmount: '538000', + itemDiscountAmount: '29800', + itemPaymentAmount: '508200', + goodsPaymentPrice: '25410', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '123', + logisticsStatus: null, + logisticsCompanyCode: 'zhongtong', + logisticsCompanyName: '中通速递', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '宝安区', + receiverArea: '', + receiverAddress: '沙井中心路28号丽沙花都xx栋xx号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '测试用户', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: '1587008529453', + arrivalTime: '1587008623995', + }, + paymentVO: { + payStatus: 2, + amount: '508200', + currency: 'CNY', + payType: 0, + payWay: 0, + payWayName: '微信支付', + interactId: '121212', + traceNo: '121212', + channelTrxNo: '121212', + period: null, + payTime: '2020-03-23 00:00:00', + paySuccessTime: '2020-04-16 11:36:41', + }, + buttonVOs: [ + { primary: false, type: 4, name: '申请售后' }, + { primary: true, type: 6, name: '评价' }, + ], + labelVOs: null, + invoiceVO: { + buyerName: '腾讯计算机有限公司', //个人或公司名称 + buyerTaxNo: '9144 9808 0909 0293 XG', //税号 + buyerPhone: '18600008888', //手机 + email: '73900484@qq.com', //邮箱 + titleType: 2, //发票抬头 1-个人 2-公司 + ontentType: 1, //发票内容 1-明细 2类别 + invoiceType: 5, //是否开票 0-不开 5-电子发票 + money: '1.54', + }, + couponAmount: '0', + autoCancelTime: null, + orderStatusName: '交易完成', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: 2, + invoiceDesc: '暂不开发票', + invoiceUrl: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 91, + success: true, + }, + { + data: { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130150835531421259', + orderId: '130150836385879808', + orderNo: '130150835531421259', + orderType: 0, + orderSubType: 0, + orderStatus: 50, + orderSubStatus: null, + totalAmount: '29800', + goodsAmount: '29800', + goodsAmountApp: '29800', + paymentAmount: '4000', + freightFee: '0', + packageFee: '0', + discountAmount: '25800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: 0, + cancelReasonType: 0, + cancelReason: '', + rightsType: 0, + createTime: '1587007083839', + orderItemVOs: [ + { + id: '130150836520098048', + orderNo: null, + spuId: '0', + skuId: '135681631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { specTitle: '颜色', specValue: '米色荷叶边' }, + { specTitle: '尺码', specValue: 'M' }, + ], + buyQuantity: 1, + itemTotalAmount: '29800', + itemDiscountAmount: '25800', + itemPaymentAmount: '4000', + goodsPaymentPrice: '4000', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '123', + logisticsStatus: null, + logisticsCompanyCode: 'yuantong', + logisticsCompanyName: '圆通速递', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '宝安区', + receiverArea: '', + receiverAddress: '沙井中心路28号丽沙花都xx栋xx号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '测试用户', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: '1587008539953', + arrivalTime: '1588291200508', + }, + paymentVO: { + payStatus: 2, + amount: '4000', + currency: 'RNB', + payType: 0, + payWay: 0, + payWayName: '微信支付', + interactId: '121212', + traceNo: '121212', + channelTrxNo: '121212', + period: null, + payTime: '2020-03-23 00:00:00', + paySuccessTime: '2020-04-16 11:18:09', + }, + buttonVOs: [ + { primary: false, type: 4, name: '申请售后' }, + { primary: true, type: 6, name: '评价' }, + ], + labelVOs: null, + invoiceVO: null, + couponAmount: '0', + autoCancelTime: null, + orderStatusName: '交易完成', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: 2, + invoiceDesc: '暂不开发票', + invoiceUrl: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 95, + success: true, + }, +]; + +export function genOrderDetail(params) { + const { parameter } = params; + const resp = orderResps.find((r) => r.data.orderNo === parameter); + return resp; +} + +export function genBusinessTime() { + const resp = { + data: { + businessTime: ['周一,周二,周三,周四,周五:00:20:00-08:00:00'], + telphone: '18565372257', + saasId: '88888888', + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 3, + success: true, + }; + return resp; +} diff --git a/model/order/orderList.js b/model/order/orderList.js new file mode 100644 index 0000000..a581fbb --- /dev/null +++ b/model/order/orderList.js @@ -0,0 +1,1054 @@ +import { mockIp, mockReqId } from '../../utils/mock'; + +export function genOrders(params) { + const resp = { + data: { + pageNum: 1, + pageSize: 10, + totalCount: 7, + orders: [ + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '354021731671873099', + orderId: '354021735982432279', + orderNo: '354021731671873099', + orderType: 0, + orderSubType: 0, + orderStatus: 5, + orderSubStatus: null, + totalAmount: '10010', + goodsAmount: '10000', + goodsAmountApp: '10000', + paymentAmount: '20', + freightFee: '10', + packageFee: '0', + discountAmount: '9990', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1600350829291', + orderItemVOs: [ + { + id: '354021736133427225', + orderNo: null, + spuId: '3', + skuId: '135696670', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + specifications: [ + { specTitle: '颜色', specValue: '贵族青' }, + { specTitle: '类型', specValue: '尊享礼盒装' }, + ], + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3b.png', + originPrice: '0', + actualPrice: '9999', + buyQuantity: 1, + itemTotalAmount: '9999', + itemDiscountAmount: '9990', + itemPaymentAmount: '10', + goodsPaymentPrice: '10', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '14', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '宝安区', + receiverArea: '', + receiverAddress: '沙井中心路28号丽沙花都xx栋xx号', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '测试用户', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '20', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: [ + { primary: false, type: 2, name: '取消订单' }, + { primary: true, type: 1, name: '付款' }, + ], + labelVOs: null, + invoiceVO: null, + couponAmount: null, + autoCancelTime: '1600352629291', + orderStatusName: '待付款', + orderSatusRemark: '需支付¥0.20', + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '132381532610540875', + orderId: '132381537256650240', + orderNo: '132381532610540875', + orderType: 0, + orderSubType: 0, + orderStatus: 10, + orderSubStatus: null, + totalAmount: '76600', + goodsAmount: '76600', + goodsAmountApp: '76600', + paymentAmount: '36800', + freightFee: '0', + packageFee: '0', + discountAmount: '39800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1587140043980', + orderItemVOs: [ + { + id: '132381537407645696', + orderNo: null, + spuId: '0', + skuId: '135676631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { specTitle: '颜色', specValue: '米色荷叶边' }, + { specTitle: '尺码', specValue: 'S' }, + ], + buyQuantity: 1, + itemTotalAmount: '29800', + itemDiscountAmount: '19813', + itemPaymentAmount: '9987', + goodsPaymentPrice: '9987', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132381537407645952', + orderNo: null, + spuId: '7', + skuId: '135691633', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '不锈钢刀叉勺套装家用西餐餐具ins简约耐用不锈钢金色银色可选', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + originPrice: '29900', + actualPrice: '19900', + specifications: [ + { specTitle: '颜色', specValue: '奶黄色' }, + { specTitle: '类型', specValue: '三件套' }, + ], + buyQuantity: 1, + itemTotalAmount: '19900', + itemDiscountAmount: '13230', + itemPaymentAmount: '6670', + goodsPaymentPrice: '6670', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132381537407646208', + orderNo: null, + spuId: '1', + skuId: '135691631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08a.png', + originPrice: '31900', + actualPrice: '26900', + specifications: [ + { specTitle: '颜色', specValue: '白色' }, + { specTitle: '尺码', specValue: 'S' }, + ], + buyQuantity: 1, + itemTotalAmount: '26900', + itemDiscountAmount: '6757', + itemPaymentAmount: '20143', + goodsPaymentPrice: '20143', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '36800', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: [ + { + primary: false, + type: 2, + name: '取消订单', + }, + { + primary: true, + type: 9, + name: '再次购买', + }, + ], + labelVOs: null, + invoiceVO: null, + couponAmount: null, + autoCancelTime: null, + orderStatusName: '待发货', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '132222623132329291', + orderId: '132222629674264064', + orderNo: '132222623132329291', + orderType: 0, + orderSubType: 0, + orderStatus: 40, + orderSubStatus: null, + totalAmount: '500400', + goodsAmount: '500400', + goodsAmountApp: '500400', + paymentAmount: '458600', + freightFee: '0', + packageFee: '0', + discountAmount: '41800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1587130572349', + orderItemVOs: [ + { + id: '132222629825259776', + orderNo: null, + spuId: '5', + skuId: '135691625', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '迷你便携高颜值蓝牙无线耳机立体声只能触控式操作简约立体声耳机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-2a.png', + originPrice: '15900', + actualPrice: '8900', + specifications: [ + { specTitle: '颜色', specValue: '黑色' }, + { specTitle: '尺码', specValue: '简约' }, + ], + buyQuantity: 1, + itemTotalAmount: '8900', + itemDiscountAmount: '2134', + itemPaymentAmount: '6766', + goodsPaymentPrice: '6766', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132222629825260032', + orderNo: null, + spuId: '0', + skuId: '135676631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { specTitle: '颜色', specValue: '米色荷叶边' }, + { specTitle: '尺码', specValue: 'S' }, + ], + buyQuantity: 1, + itemTotalAmount: '29800', + itemDiscountAmount: '4026', + itemPaymentAmount: '25774', + goodsPaymentPrice: '25774', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132222629825260288', + orderNo: null, + spuId: '3', + skuId: '135691622', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '腾讯极光盒子4智能网络电视机顶盒6K千兆网络机顶盒4K高分辨率', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/dz-3a.png', + originPrice: '16900', + actualPrice: '9900', + specifications: [ + { specTitle: '颜色', specValue: '经典白' }, + { specTitle: '类型', specValue: '经典套装' }, + ], + buyQuantity: 1, + itemTotalAmount: '9900', + itemDiscountAmount: '1337', + itemPaymentAmount: '8563', + goodsPaymentPrice: '8563', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132222629825260544', + orderNo: null, + spuId: '135681628', + skuId: '135676629', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '带帽午休毯虎年款多功能加厚加大加绒简约多功能午休毯连帽披肩', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png', + originPrice: '39900', + actualPrice: '29900', + specifications: [ + { specTitle: '颜色', specValue: '浅灰色' }, + { specTitle: '尺码', specValue: 'S' }, + ], + buyQuantity: 4, + itemTotalAmount: '119600', + itemDiscountAmount: '4040', + itemPaymentAmount: '115560', + goodsPaymentPrice: '28890', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + { + id: '132222629825260800', + orderNo: null, + spuId: '2', + skuId: '135686631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: '运动连帽拉链卫衣休闲开衫长袖多色运动细绒面料运动上衣', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-17a.png', + originPrice: '39900', + actualPrice: '25900', + specifications: [ + { specTitle: '颜色', specValue: '军绿色' }, + { specTitle: '尺码', specValue: 'XS' }, + ], + buyQuantity: 1, + itemTotalAmount: '25900', + itemDiscountAmount: '392', + itemPaymentAmount: '25508', + goodsPaymentPrice: '25508', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '458600', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: [ + { + primary: true, + type: 3, + name: '确认收货', + }, + ], + labelVOs: null, + invoiceVO: null, + couponAmount: null, + autoCancelTime: null, + orderStatusName: '待收货', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130862219672031307', + orderId: '130862224737571072', + orderNo: '130862219672031307', + orderType: 0, + orderSubType: 0, + orderStatus: 80, + orderSubStatus: null, + totalAmount: '298000', + goodsAmount: '298000', + goodsAmountApp: '298000', + paymentAmount: '263200', + freightFee: '0', + packageFee: '0', + discountAmount: '34800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1587049485899', + orderItemVOs: [ + { + id: '130862224922120960', + orderNo: null, + spuId: '0', + skuId: '135676631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { specTitle: '颜色', specValue: '米色荷叶边' }, + { specTitle: '尺码', specValue: 'S' }, + ], + buyQuantity: 10, + itemTotalAmount: '298000', + itemDiscountAmount: '29800', + itemPaymentAmount: '268200', + goodsPaymentPrice: '26820', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '263200', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: null, + labelVOs: null, + invoiceVO: null, + couponAmount: null, + autoCancelTime: null, + orderStatusName: '已取消', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130494472895208267', + orderId: '130494482155052032', + orderNo: '130494472895208267', + orderType: 0, + orderSubType: 0, + orderStatus: 80, + orderSubStatus: null, + totalAmount: '59700', + goodsAmount: '59700', + goodsAmountApp: '59700', + paymentAmount: '24900', + freightFee: '0', + packageFee: '0', + discountAmount: '34800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1587027566730', + orderItemVOs: [ + { + id: '130494482322824704', + orderNo: null, + spuId: '7', + skuId: '135691633', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '不锈钢刀叉勺套装家用西餐餐具ins简约耐用不锈钢金色银色可选', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/gh-2b.png', + originPrice: '29900', + actualPrice: '19900', + specifications: [ + { specTitle: '颜色', specValue: '奶黄色' }, + { specTitle: '类型', specValue: '三件套' }, + ], + buyQuantity: 3, + itemTotalAmount: '59700', + itemDiscountAmount: '29800', + itemPaymentAmount: '29900', + goodsPaymentPrice: '9966', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: null, + arrivalTime: null, + }, + paymentVO: { + payStatus: 1, + amount: '24900', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: null, + labelVOs: null, + invoiceVO: null, + couponAmount: null, + autoCancelTime: null, + orderStatusName: '已取消', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130169571554503755', + orderId: '130169572291521792', + orderNo: '130169571554503755', + orderType: 0, + orderSubType: 0, + orderStatus: 50, + orderSubStatus: null, + totalAmount: '538000', + goodsAmount: '538000', + goodsAmountApp: '538000', + paymentAmount: '508200', + freightFee: '0', + packageFee: '0', + discountAmount: '29800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1587008200590', + orderItemVOs: [ + { + id: '130169572425740032', + orderNo: null, + spuId: '1', + skuId: '135691631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '纯色纯棉休闲圆领短袖T恤纯白亲肤厚柔软细腻面料纯白短袖套头T恤', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-08b.png', + originPrice: '31900', + actualPrice: '26900', + specifications: [ + { specTitle: '颜色', specValue: '橙色' }, + { specTitle: '尺码', specValue: 'M' }, + ], + buyQuantity: 20, + itemTotalAmount: '538000', + itemDiscountAmount: '29800', + itemPaymentAmount: '508200', + goodsPaymentPrice: '25410', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: [ + { + primary: true, + type: 4, + name: '', + }, + ], + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '123', + logisticsStatus: null, + logisticsCompanyCode: 'zhongtong', + logisticsCompanyName: '中通速递', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: '1587008529453', + arrivalTime: '1587008623995', + }, + paymentVO: { + payStatus: 1, + amount: '508200', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: [ + { primary: false, type: 4, name: '申请售后' }, + { primary: true, type: 6, name: '评价' }, + ], + labelVOs: null, + invoiceVO: { + buyerName: '腾讯计算机有限公司', //个人或公司名称 + buyerTaxNo: '9144 9808 0909 0293 XG', //税号 + buyerPhone: '18600008888', //手机 + email: '73900484@qq.com', //邮箱 + titleType: 2, //发票抬头 1-个人 2-公司 + ontentType: 1, //发票内容 1-明细 2类别 + invoiceType: 5, //是否开票 0-不开 5-电子发票 + money: '1.54', + }, + couponAmount: null, + autoCancelTime: null, + orderStatusName: '交易完成', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + { + saasId: '88888888', + storeId: '1000', + storeName: '云Mall深圳旗舰店', + uid: '88888888205468', + parentOrderNo: '130150835531421259', + orderId: '130150836385879808', + orderNo: '130150835531421259', + orderType: 0, + orderSubType: 0, + orderStatus: 50, + orderSubStatus: null, + totalAmount: '29800', + goodsAmount: '29800', + goodsAmountApp: '29800', + paymentAmount: '4000', + freightFee: '0', + packageFee: '0', + discountAmount: '25800', + channelType: 0, + channelSource: '', + channelIdentity: '', + remark: '', + cancelType: null, + cancelReasonType: null, + cancelReason: null, + rightsType: null, + createTime: '1587007083842', + orderItemVOs: [ + { + id: '130150836520098048', + orderNo: null, + spuId: '0', + skuId: '135681631', + roomId: null, + goodsMainType: 0, + goodsViceType: 0, + goodsName: + '白色短袖连衣裙荷叶边裙摆宽松韩版休闲纯白清爽优雅连衣裙', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + originPrice: '40000', + actualPrice: '29800', + specifications: [ + { specTitle: '颜色', specValue: '米色荷叶边' }, + { specTitle: '尺码', specValue: 'M' }, + ], + buyQuantity: 1, + itemTotalAmount: '29800', + itemDiscountAmount: '25800', + itemPaymentAmount: '4000', + goodsPaymentPrice: '4000', + tagPrice: null, + tagText: null, + outCode: null, + labelVOs: null, + buttonVOs: null, + }, + ], + logisticsVO: { + logisticsType: 1, + logisticsNo: '123', + logisticsStatus: null, + logisticsCompanyCode: 'yuantong', + logisticsCompanyName: '圆通速递', + receiverAddressId: '2', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '前海路333号阳光玫瑰园', + receiverPostCode: '', + receiverLongitude: '113.829127', + receiverLatitude: '22.713649', + receiverIdentity: '88888888205468', + receiverPhone: '17612345678', + receiverName: '平均线', + expectArrivalTime: null, + senderName: '', + senderPhone: '', + senderAddress: '', + sendTime: '1587008539953', + arrivalTime: '1588291200508', + }, + paymentVO: { + payStatus: 1, + amount: '4000', + currency: null, + payType: null, + payWay: null, + payWayName: null, + interactId: null, + traceNo: null, + channelTrxNo: null, + period: null, + payTime: null, + paySuccessTime: null, + }, + buttonVOs: [{ primary: true, type: 6, name: '评价' }], + labelVOs: null, + invoiceVO: null, + couponAmount: null, + autoCancelTime: null, + orderStatusName: '交易完成', + orderSatusRemark: null, + logisticsLogVO: null, + invoiceStatus: null, + invoiceDesc: null, + invoiceUrl: null, + }, + ], + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 113, + success: true, + }; + const { pageNum, pageSize, orderStatus } = params.parameter; + // 实现筛选 + if (orderStatus > -1) { + resp.data.orders = resp.data.orders.filter( + (order) => order.orderStatus === orderStatus, + ); + } + // 实现分页 + resp.data.pageNum = pageNum; + resp.data.pageSize = pageSize; + resp.data.orders = resp.data.orders.slice( + (pageNum - 1) * pageSize, + pageNum * pageSize, + ); + return resp; +} + +export function genOrdersCount() { + const resp = { + data: [ + { tabType: 5, orderNum: 1 }, + { tabType: 10, orderNum: 1 }, + { tabType: 40, orderNum: 1 }, + { tabType: 50, orderNum: 2 }, + ], + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 41, + success: true, + }; + return resp; +} diff --git a/model/promotion.js b/model/promotion.js new file mode 100644 index 0000000..0aaee61 --- /dev/null +++ b/model/promotion.js @@ -0,0 +1,21 @@ +import { getGoodsList } from './goods'; + +export function getPromotion(baseID = 0, length = 10) { + return { + list: getGoodsList(baseID, length).map((item) => { + return { + spuId: item.spuId, + thumb: item.primaryImage, + title: item.title, + price: item.minSalePrice, + originPrice: item.maxLinePrice, + tags: item.spuTagList.map((tag) => ({ title: tag.title })), + }; + }), + banner: + 'https://cdn-we-retail.ym.tencent.com/tsr/promotion/banner-promotion.png', + time: 1000 * 60 * 60 * 20, + showBannerDesc: true, + statusTag: 'running', + }; +} diff --git a/model/search.js b/model/search.js new file mode 100644 index 0000000..2d2e68d --- /dev/null +++ b/model/search.js @@ -0,0 +1,60 @@ +import { getGoodsList } from './goods'; + +/** + * @param {number} sort + * @param {number} pageNum + * @param {number} pageSize + * @param {number} minPrice + * @param {number} maxPrice + * @param {string} keyword + */ + +export function getSearchHistory() { + return { + historyWords: [ + '鸡', + '电脑', + 'iPhone12', + '车载手机支架', + '自然堂', + '小米10', + '原浆古井贡酒', + '欧米伽', + '华为', + '针织半身裙', + '氢跑鞋', + '三盒处理器', + ], + }; +} + +export function getSearchPopular() { + return { + popularWords: [ + '鸡', + '电脑', + 'iPhone12', + '车载手机支架', + '自然堂', + '小米10', + '原浆古井贡酒', + '欧米伽', + '华为', + '针织半身裙', + '氢跑鞋', + '三盒处理器', + ], + }; +} + +export function getSearchResult() { + return { + saasId: null, + storeId: null, + pageNum: 1, + pageSize: 30, + totalCount: 1, + spuList: getGoodsList(7), + algId: 0, + }; +} diff --git a/model/submitComment.js b/model/submitComment.js new file mode 100644 index 0000000..e620b4f --- /dev/null +++ b/model/submitComment.js @@ -0,0 +1,58 @@ +export function getGoods() { + return { + goods: [ + { + squid: '1', + checkItems: [ + { + name: '匿名评价', + value: 'anonymous', + checked: false, + }, + ], + detail: { + image: + 'https://wx.qlogo.cn/mmopen/vi_32/51VSMNuy1CyHiaAhAjLJ00kMZVqqnCqXeZduCLXHUBr52zFHRGxwL7kGia3fHj8GSNzFcqFDInQmRGM1eWjtQgqA/132', + title: '', + }, + goodComment: { + /** 商品评价 */ + rate: 0, + /** 评价内容 */ + label: '123', + /** 上传图片 */ + images: [], + }, + }, + { + squid: '2', + checkItems: [ + { + name: '匿名评价', + value: 'anonymous', + checked: false, + }, + ], + detail: { + image: + 'https://wx.qlogo.cn/mmopen/vi_32/51VSMNuy1CyHiaAhAjLJ00kMZVqqnCqXeZduCLXHUBr52zFHRGxwL7kGia3fHj8GSNzFcqFDInQmRGM1eWjtQgqA/132', + title: '评价内容 山姆智利进口', + }, + goodComment: { + /** 商品评价 */ + rate: 0, + /** 评价内容 */ + label: '山姆智利进口', + /** 上传图片 */ + images: [], + }, + }, + ], + storeComment: { + /** 物流评价 */ + logisticsRate: 0, + /** 服务评价 */ + servicesRate: 0, + }, + }; +} diff --git a/model/swiper.js b/model/swiper.js new file mode 100644 index 0000000..ee114a8 --- /dev/null +++ b/model/swiper.js @@ -0,0 +1,13 @@ +const images = [{ + img: '/images/use_bi.png', + text: '1', + }, + { + img: 'https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png', + text: '2', + }, +]; + +export function genSwiperImageList() { + return images; +} \ No newline at end of file diff --git a/model/usercenter.js b/model/usercenter.js new file mode 100644 index 0000000..8822f4f --- /dev/null +++ b/model/usercenter.js @@ -0,0 +1,52 @@ +const userInfo = { + avatarUrl: + 'https://we-retail-static-1300977798.cos.ap-guangzhou.myqcloud.com/retail-ui/components-exp/avatar/avatar-1.jpg', + nickName: 'TDesign 🌟', + phoneNumber: '13438358888', + gender: 2, +}; +const countsData = [ + { + num: 2, + name: '积分', + type: 'point', + }, + { + num: 10, + name: '优惠券', + type: 'coupon', + }, +]; + +const orderTagInfos = [ + { + orderNum: 1, + tabType: 5, + }, + { + orderNum: 1, + tabType: 10, + }, + { + orderNum: 1, + tabType: 40, + }, + { + orderNum: 0, + tabType: 0, + }, +]; + +const customerServiceInfo = { + servicePhone: '4006336868', + serviceTimeDuration: '每周三至周五 9:00-12:00 13:00-15:00', +}; + +export const genSimpleUserInfo = () => ({ ...userInfo }); + +export const genUsercenter = () => ({ + userInfo, + countsData, + orderTagInfos, + customerServiceInfo, +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..2b8eaf1 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "supermarket-pages", + "version": "1.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "eslint --cache --fix --ext .js", + "check": "node config/eslintCheck.js" + }, + "author": "", + "license": "ISC", + "husky": { + "hooks": { + "pre-commit": "lint-staged && npm run check" + } + }, + "lint-staged": { + "*.{js, ts}": "eslint --cache --fix", + "*.{js,ts,css,less}": "prettier --write" + }, + "dependencies": { + "dayjs": "^1.9.3", + "tdesign-miniprogram": "^0.24.0", + "tslib": "^1.11.1" + }, + "devDependencies": { + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.10.0", + "eslint-plugin-import": "^2.20.1", + "eslint-plugin-prettier": "^3.1.2", + "husky": "^4.3.0", + "lint-staged": "^10.0.8", + "prettier": "^2.1.2" + } +} diff --git a/pages/cart/components/cart-bar/index.js b/pages/cart/components/cart-bar/index.js new file mode 100644 index 0000000..db7736c --- /dev/null +++ b/pages/cart/components/cart-bar/index.js @@ -0,0 +1,59 @@ +Component({ + options: { + addGlobalClass: true, + }, + /** + * 组件的属性列表 + */ + properties: { + isAllSelected: { + type: Boolean, + value: false, + }, + totalAmount: { + type: Number, + value: 1, + }, + totalGoodsNum: { + type: Number, + value: 0, + observer(num) { + const isDisabled = num == 0; + setTimeout(() => { + this.setData({ + isDisabled, + }); + }); + }, + }, + totalDiscountAmount: { + type: Number, + value: 0, + }, + bottomHeight: { + type: Number, + value: 100, + }, + fixed: Boolean, + }, + data: { + isDisabled: false, + }, + + methods: { + handleSelectAll() { + const { isAllSelected } = this.data; + this.setData({ + isAllSelected: !isAllSelected, + }); + this.triggerEvent('handleSelectAll', { + isAllSelected: isAllSelected, + }); + }, + + handleToSettle() { + if (this.data.isDisabled) return; + this.triggerEvent('handleToSettle'); + }, + }, +}); diff --git a/pages/cart/components/cart-bar/index.json b/pages/cart/components/cart-bar/index.json new file mode 100644 index 0000000..c6c4351 --- /dev/null +++ b/pages/cart/components/cart-bar/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "price": "/components/price/index", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/cart/components/cart-bar/index.wxml b/pages/cart/components/cart-bar/index.wxml new file mode 100644 index 0000000..486a0d5 --- /dev/null +++ b/pages/cart/components/cart-bar/index.wxml @@ -0,0 +1,31 @@ + + + + 全选 + + + 总计 + + (不含运费) + + + 已优惠 + + + + + + diff --git a/pages/cart/components/cart-bar/index.wxss b/pages/cart/components/cart-bar/index.wxss new file mode 100644 index 0000000..0e63f60 --- /dev/null +++ b/pages/cart/components/cart-bar/index.wxss @@ -0,0 +1,80 @@ +.cart-bar__placeholder { + height: 100rpx; +} +.flex { + display: flex; +} +.flex-v-center { + align-items: center; +} +.flex1 { + flex: 1; +} +.algin-bottom { + text-align: end; +} +.cart-bar--fixed { + position: fixed; + left: 0; + right: 0; + z-index: 99; + bottom: calc(100rpx + env(safe-area-inset-bottom)); +} + +.cart-bar { + height: 112rpx; + background-color: #fff; + border-top: 1rpx solid #e5e5e5; + padding: 16rpx 32rpx; + box-sizing: border-box; + font-size: 24rpx; + line-height: 36rpx; + color: #333; +} + +.cart-bar .cart-bar__check { + margin-right: 12rpx; +} + +.cart-bar .cart-bar__total { + margin-left: 24rpx; +} + +.cart-bar .account-btn { + width: 192rpx; + height: 80rpx; + border-radius: 40rpx; + background-color: #fa4126; + font-size: 28rpx; + font-weight: bold; + line-height: 80rpx; + color: #ffffff; + text-align: center; +} +.cart-bar .disabled-btn { + background-color: #cccccc !important; +} +.cart-bar .hover-btn { + opacity: 0.5; +} + +.cart-bar__total .cart-bar__total--bold { + font-size: 28rpx; + line-height: 40rpx; + color: #333; + font-weight: bold; +} +.cart-bar__total .cart-bar__total--normal { + font-size: 24rpx; + line-height: 32rpx; + color: #999; +} + +.cart-bar__total .cart-bar__total--price { + color: #fa4126; + font-weight: bold; +} + +.text-padding-right { + padding-right: 4rpx; +} diff --git a/pages/cart/components/cart-empty/index.js b/pages/cart/components/cart-empty/index.js new file mode 100644 index 0000000..01cf9c3 --- /dev/null +++ b/pages/cart/components/cart-empty/index.js @@ -0,0 +1,23 @@ +Component({ + properties: { + imgUrl: { + type: String, + value: + 'https://cdn-we-retail.ym.tencent.com/miniapp/template/empty-cart.png', + }, + tip: { + type: String, + value: '购物车是空的', + }, + btnText: { + type: String, + value: '去首页', + }, + }, + data: {}, + methods: { + handleClick() { + this.triggerEvent('handleClick'); + }, + }, +}); diff --git a/pages/cart/components/cart-empty/index.json b/pages/cart/components/cart-empty/index.json new file mode 100644 index 0000000..b659310 --- /dev/null +++ b/pages/cart/components/cart-empty/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/pages/cart/components/cart-empty/index.wxml b/pages/cart/components/cart-empty/index.wxml new file mode 100644 index 0000000..d0cdd43 --- /dev/null +++ b/pages/cart/components/cart-empty/index.wxml @@ -0,0 +1,6 @@ + + + {{tip}} + {{btnText}} + + diff --git a/pages/cart/components/cart-empty/index.wxss b/pages/cart/components/cart-empty/index.wxss new file mode 100644 index 0000000..d074bc3 --- /dev/null +++ b/pages/cart/components/cart-empty/index.wxss @@ -0,0 +1,33 @@ +.cart-empty { + padding: 64rpx 0rpx; + display: flex; + flex-direction: column; + align-items: center; + box-sizing: border-box; + height: calc(100vh - 100rpx); + background-color: #f5f5f5; +} +.cart-empty .cart-img { + width: 160rpx; + height: 160rpx; + margin-bottom: 24rpx; +} + +.cart-empty .tip { + font-size: 28rpx; + line-height: 40rpx; + color: #999; + margin-bottom: 24rpx; +} +.cart-empty .btn { + width: 240rpx; + height: 72rpx; + border-radius: 36rpx; + text-align: center; + line-height: 72rpx; + border: 2rpx solid #fa4126; + color: #fa4126; + background-color: transparent; + font-size: 28rpx; + font-weight: bold; +} diff --git a/pages/cart/components/cart-group/index.js b/pages/cart/components/cart-group/index.js new file mode 100644 index 0000000..99a908d --- /dev/null +++ b/pages/cart/components/cart-group/index.js @@ -0,0 +1,166 @@ +import Toast from 'tdesign-miniprogram/toast/index'; + +const shortageImg = + 'https://cdn-we-retail.ym.tencent.com/miniapp/cart/shortage.png'; + +Component({ + isSpecsTap: false, // 标记本次点击事件是否因为点击specs触发(由于底层goods-card组件没有catch specs点击事件,只能在此处加状态来避免点击specs时触发跳转商品详情) + externalClasses: ['wr-class'], + properties: { + storeGoods: { + type: Array, + observer(storeGoods) { + for (const store of storeGoods) { + for (const activity of store.promotionGoodsList) { + for (const goods of activity.goodsPromotionList) { + goods.specs = goods.specInfo.map((item) => item.specValue); // 目前仅展示商品已选规格的值 + } + } + for (const goods of store.shortageGoodsList) { + goods.specs = goods.specInfo.map((item) => item.specValue); // 目前仅展示商品已选规格的值 + } + } + + this.setData({ _storeGoods: storeGoods }); + }, + }, + invalidGoodItems: { + type: Array, + observer(invalidGoodItems) { + invalidGoodItems.forEach((goods) => { + goods.specs = goods.specInfo.map((item) => item.specValue); // 目前仅展示商品已选规格的值 + }); + this.setData({ _invalidGoodItems: invalidGoodItems }); + }, + }, + thumbWidth: { type: null }, + thumbHeight: { type: null }, + }, + + data: { + shortageImg, + isShowSpecs: false, + currentGoods: {}, + isShowToggle: false, + _storeGoods: [], + _invalidGoodItems: [], + }, + + methods: { + // 删除商品 + deleteGoods(e) { + const { goods } = e.currentTarget.dataset; + this.triggerEvent('delete', { goods }); + }, + + // 清空失效商品 + clearInvalidGoods() { + this.triggerEvent('clearinvalidgoods'); + }, + + // 选中商品 + selectGoods(e) { + const { goods } = e.currentTarget.dataset; + this.triggerEvent('selectgoods', { + goods, + isSelected: !goods.isSelected, + }); + }, + + changeQuantity(num, goods) { + this.triggerEvent('changequantity', { + goods, + quantity: num, + }); + }, + changeStepper(e) { + const { value } = e.detail; + const { goods } = e.currentTarget.dataset; + let num = value; + if (value > goods.stack) { + num = goods.stack; + } + this.changeQuantity(num, goods); + }, + + input(e) { + const { value } = e.detail; + const { goods } = e.currentTarget.dataset; + const num = value; + this.changeQuantity(num, goods); + }, + + overlimit(e) { + const text = + e.detail.type === 'minus' + ? '该商品数量不能减少了哦' + : '同一商品最多购买999件'; + Toast({ + context: this, + selector: '#t-toast', + message: text, + }); + }, + + // 去凑单/再逛逛 + gotoBuyMore(e) { + const { promotion, storeId = '' } = e.currentTarget.dataset; + this.triggerEvent('gocollect', { promotion, storeId }); + }, + + // 选中门店 + selectStore(e) { + const { storeIndex } = e.currentTarget.dataset; + const store = this.data.storeGoods[storeIndex]; + const isSelected = !store.isSelected; + if (store.storeStockShortage && isSelected) { + Toast({ + context: this, + selector: '#t-toast', + message: '部分商品库存不足', + }); + return; + } + this.triggerEvent('selectstore', { + store, + isSelected, + }); + }, + + // 展开/收起切换 + showToggle() { + this.setData({ + isShowToggle: !this.data.isShowToggle, + }); + }, + + // 展示规格popup + specsTap(e) { + this.isSpecsTap = true; + const { goods } = e.currentTarget.dataset; + this.setData({ + isShowSpecs: true, + currentGoods: goods, + }); + }, + + hideSpecsPopup() { + this.setData({ + isShowSpecs: false, + }); + }, + + goGoodsDetail(e) { + if (this.isSpecsTap) { + this.isSpecsTap = false; + return; + } + const { goods } = e.currentTarget.dataset; + this.triggerEvent('goodsclick', { goods }); + }, + + gotoCoupons() { + wx.navigateTo({ url: '/pages/coupon/coupon-list/index' }); + }, + }, +}); diff --git a/pages/cart/components/cart-group/index.json b/pages/cart/components/cart-group/index.json new file mode 100644 index 0000000..9b8003d --- /dev/null +++ b/pages/cart/components/cart-group/index.json @@ -0,0 +1,11 @@ +{ + "component": true, + "usingComponents": { + "t-toast": "tdesign-miniprogram/toast/toast", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-stepper": "tdesign-miniprogram/stepper/stepper", + "swipeout": "/components/swipeout/index", + "goods-card": "../../components/goods-card/index", + "specs-popup": "../../components/specs-popup/index" + } +} \ No newline at end of file diff --git a/pages/cart/components/cart-group/index.wxml b/pages/cart/components/cart-group/index.wxml new file mode 100644 index 0000000..63fe3dd --- /dev/null +++ b/pages/cart/components/cart-group/index.wxml @@ -0,0 +1,185 @@ + + var hasPromotion = function (code) { + return code && code !== 'EMPTY_PROMOTION'; + } + module.exports.hasPromotion = hasPromotion; + + + + + + + + + + + + {{store.storeName}} + + 优惠券 + + + + + + {{promotion.tag}} + {{promotion.description}} + + + + {{promotion.isNeedAddOnShop == 1 ? '去凑单' : '再逛逛'}} + + + + + + + + + + + + + + 仅剩{{goods.stockQuantity}}件 + + + 库存不足 + + + + + + + 删除 + + + + + + + + + + + + + + + + + + 无货 + + + + + + 删除 + + + + + + + + + + + + + diff --git a/pages/cart/components/cart-group/index.wxss b/pages/cart/components/cart-group/index.wxss new file mode 100644 index 0000000..641101f --- /dev/null +++ b/pages/cart/components/cart-group/index.wxss @@ -0,0 +1,335 @@ +.cart-group { + border-radius: 8rpx; +} +.cart-group .goods-wrap { + margin-top: 40rpx; + background-color: #fff; + border-radius: 8rpx; + overflow: hidden; +} +.cart-group .goods-wrap:first-of-type { + margin-top: 0; +} +.cart-group .cart-store { + height: 96rpx; + background-color: #fff; + box-sizing: border-box; + display: flex; + align-items: center; + padding: 0rpx 24rpx 0rpx 36rpx; +} +.cart-group .cart-store .cart-store__check { + padding: 28rpx 32rpx 28rpx 0rpx; +} +.cart-group .cart-store__content { + box-sizing: border-box; + flex: auto; + display: flex; + align-items: center; + justify-content: space-between; +} +.cart-group .cart-store__content .store-title { + flex: auto; + font-size: 28rpx; + line-height: 40rpx; + color: #333333; + display: flex; + align-items: center; + font-weight: bold; + overflow: hidden; +} + +.cart-group .cart-store__content .store-title .wr-store { + font-size: 32rpx; +} +.cart-group .cart-store__content .store-title .store-name { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-left: 12rpx; +} +.cart-group .cart-store__content .get-coupon { + width: 112rpx; + height: 40rpx; + border-radius: 20rpx; + background-color: #ffecf9; + line-height: 40rpx; + text-align: center; + font-size: 26rpx; + color: #fa4126; +} + +.cart-group .promotion-wrap { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0rpx 24rpx 32rpx 36rpx; + background-color: #ffffff; + font-size: 24rpx; + line-height: 36rpx; + color: #222427; +} +.cart-group .promotion-wrap .promotion-title { + font-weight: bold; + flex: auto; + overflow: hidden; + margin-right: 20rpx; + display: flex; + align-items: center; +} +.cart-group .promotion-wrap .promotion-title .promotion-icon { + flex: none; + font-weight: normal; + display: inline-block; + padding: 0 8rpx; + color: #ffffff; + background: #fa4126; + font-size: 20rpx; + height: 32rpx; + line-height: 32rpx; + margin-right: 16rpx; + border-radius: 16rpx; +} +.cart-group .promotion-wrap .promotion-title .promotion-text { + flex: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.cart-group .promotion-wrap .promotion-action { + flex: none; + color: #333333; +} +.cart-group .promotion-line-wrap { + background-color: #fff; + height: 2rpx; + display: flex; + justify-content: flex-end; +} +.cart-group .promotion-line-wrap .promotion-line { + width: 684rpx; + height: 2rpx; + background-color: #e6e6e6; +} +.cart-group .goods-item-info { + display: flex; + background-color: #fff; + align-items: flex-start; +} +.cart-group .goods-item-info .check-wrap { + margin-top: 56rpx; + padding: 20rpx 28rpx 20rpx 36rpx; +} + +.cart-group .goods-item-info .check-wrap .unCheck-icon { + box-sizing: border-box; + width: 36rpx; + height: 36rpx; + border-radius: 20rpx; + background: #f5f5f5; + border: 2rpx solid #bbbbbb; +} + +.cart-group .goods-item-info .goods-sku-info { + padding: 0rpx 32rpx 40rpx 0; + flex-grow: 1; +} +.cart-group .goods-item-info .goods-sku-info .stock-mask { + position: absolute; + color: #fff; + font-size: 24rpx; + bottom: 0rpx; + background-color: rgba(0, 0, 0, 0.5); + width: 100%; + height: 40rpx; + line-height: 40rpx; + text-align: center; +} +.cart-group .goods-item-info .goods-sku-info .goods-stepper { + position: absolute; + right: 0; + bottom: 8rpx; +} +.cart-group .goods-item-info .goods-sku-info .goods-stepper .stepper-tip { + position: absolute; + top: -36rpx; + right: 0; + height: 28rpx; + color: #ff2525; + font-size: 20rpx; + line-height: 28rpx; +} + +.cart-group .shortage-line { + width: 662rpx; + height: 2rpx; + background-color: #e6e6e6; + margin: 0 auto; +} +.cart-group .shortage-goods-wrap { + background-color: #fff; +} +.cart-group .shortage-goods-wrap .shortage-tip-title { + height: 72rpx; + line-height: 72rpx; + padding-left: 28rpx; + font-size: 24rpx; + color: #999; +} +.stepper-info { + margin-left: auto; +} +.invalid-goods-wrap { + background-color: #fff; + border-radius: 8rpx; + margin-top: 40rpx; +} +.invalid-goods-wrap .invalid-head { + display: flex; + justify-content: space-between; + padding: 30rpx 20rpx; + font-size: 24rpx; + border-bottom: 2rpx solid #f6f6f6; +} +.invalid-goods-wrap .invalid-head .invalid-title { + color: #333; + font-size: 28rpx; + font-weight: 600; +} +.invalid-goods-wrap .invalid-head .invalid-clear { + color: #fa4126; +} +.invalid-goods-wrap .toggle { + display: flex; + height: 80rpx; + justify-content: center; + align-items: center; + font-size: 24rpx; + color: #fa4126; +} +.invalid-goods-wrap .toggle .m-r-6 { + margin-right: 6rpx; +} +.invalid-goods-wrap .toggle .top-icon { + display: inline-block; + width: 0; + height: 0; + border-left: 10rpx solid transparent; + border-right: 10rpx solid transparent; + border-bottom: 10rpx solid #fa4126; +} +.invalid-goods-wrap .toggle .down-icon { + display: inline-block; + width: 0; + height: 0; + border-left: 10rpx solid transparent; + border-right: 10rpx solid transparent; + border-top: 10rpx solid #fa4126; +} +.action-btn { + display: flex; + align-items: center; +} +.action-btn .action-btn-arrow { + font-size: 20rpx; + margin-left: 8rpx; +} +.action-btn--active { + opacity: 0.5; +} + +.swiper-right-del { + height: calc(100% - 40rpx); + width: 144rpx; + background-color: #fa4126; + font-size: 28rpx; + color: white; + display: flex; + justify-content: center; + align-items: center; +} +.goods-stepper .stepper { + border: none; + border-radius: 0; + height: auto; + width: 168rpx; + overflow: visible; +} +.goods-stepper .stepper .stepper__minus, +.goods-stepper .stepper .stepper__plus { + width: 44rpx; + height: 44rpx; + background-color: #f5f5f5; +} +.goods-stepper .stepper .stepper__minus--hover, +.goods-stepper .stepper .stepper__plus--hover { + background-color: #f5f5f5; +} +.goods-stepper .stepper .stepper__minus .wr-icon, +.goods-stepper .stepper .stepper__plus .wr-icon { + font-size: 24rpx; +} +.goods-stepper .stepper .stepper__minus { + position: relative; +} +.goods-stepper .stepper .stepper__minus::after { + position: absolute; + display: block; + content: ' '; + left: -20rpx; + right: -5rpx; + top: -20rpx; + bottom: -20rpx; + background-color: transparent; +} +.goods-stepper .stepper .stepper__plus { + position: relative; +} +.goods-stepper .stepper .stepper__plus::after { + position: absolute; + display: block; + content: ' '; + left: -5rpx; + right: -20rpx; + top: -20rpx; + bottom: -20rpx; + background-color: transparent; +} +.goods-stepper .stepper .stepper__input { + width: 72rpx; + height: 44rpx; + background-color: #f5f5f5; + font-size: 24rpx; + color: #222427; + font-weight: 600; + border-left: none; + border-right: none; + min-height: 40rpx; + margin: 0 4rpx; + display: flex; + align-items: center; +} + +.goods-sku-info .no-storage-mask { + position: absolute; + color: #fff; + bottom: 0rpx; + left: 0rpx; + background-color: rgba(0, 0, 0, 0.1); + height: 192rpx; + width: 192rpx; + border-radius: 8rpx; + display: flex; + justify-content: center; + align-items: center; +} + +.no-storage-mask .no-storage-content { + width: 128rpx; + height: 128rpx; + border-radius: 64rpx; + background-color: rgba(0, 0, 0, 0.4); + text-align: center; + line-height: 128rpx; + font-size: 28rpx; +} diff --git a/pages/cart/components/cart-group/utils.wxs b/pages/cart/components/cart-group/utils.wxs new file mode 100644 index 0000000..f887eba --- /dev/null +++ b/pages/cart/components/cart-group/utils.wxs @@ -0,0 +1,20 @@ +module.exports.slice = function(arr) { + return arr.slice(0, 2); +}; +module.exports.imgCut = function(url, width, height) { + if (url && (url.slice(0, 5) === 'http:' || url.slice(0, 6) === 'https:' || url.slice(0, 2) === '//')) { + var argsStr = 'imageMogr2/thumbnail/!' + width + 'x' + height + 'r'; + if (url.indexOf('?') > -1) { + url = url + '&' + argsStr; + } else { + url = url + '?' + argsStr; + } + if (url.slice(0, 5) === 'http:') { + url = 'https://' + url.slice(5) + } + if (url.slice(0, 2) === '//') { + url = 'https:' + url + } + } + return url; +}; diff --git a/pages/cart/components/goods-card/index.js b/pages/cart/components/goods-card/index.js new file mode 100644 index 0000000..c59658c --- /dev/null +++ b/pages/cart/components/goods-card/index.js @@ -0,0 +1,243 @@ +Component({ + options: { + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + addGlobalClass: true, + }, + intersectionObserverContext: null, + + externalClasses: [ + 'card-class', + 'title-class', + 'desc-class', + 'num-class', + 'thumb-class', + 'specs-class', + 'price-class', + 'origin-price-class', + 'price-prefix-class', + ], + + properties: { + hidden: { + // 设置为null代表不做类型转换 + type: null, + value: false, + observer(hidden) { + // null就是代表没有设置,没有设置的话不setData,防止祖先组件触发的setHidden操作被覆盖 + if (hidden !== null) { + this.setHidden(!!hidden); + } + }, + }, + id: { + type: String, + // `goods-card-88888888` + // 不能在这里写生成逻辑,如果在这里写,那么假设有多个goods-list时,他们将共享这个值 + value: '', + observer: (id) => { + this.genIndependentID(id); + if (this.properties.thresholds?.length) { + this.createIntersectionObserverHandle(); + } + }, + }, + data: { + type: Object, + observer(goods) { + // 有ID的商品才渲染 + if (!goods) { + return; + } + + /** 划线价是否有效 */ + let isValidityLinePrice = true; + // 判断一次划线价格是否合理 + if ( + goods.originPrice && + goods.price && + goods.originPrice < goods.price + ) { + isValidityLinePrice = false; + } + + // 敲定换行数量默认值 + if (goods.lineClamp === undefined || goods.lineClamp <= 0) { + // tag数组长度 大于0 且 可见 + // 指定换行为1行 + if ((goods.tags?.length || 0) > 0 && !goods.hideKey?.tags) { + goods.lineClamp = 1; + } else { + goods.lineClamp = 2; + } + } + + this.setData({ goods, isValidityLinePrice }); + }, + }, + layout: { + type: String, + value: 'horizontal', + }, + thumbMode: { + type: String, + value: 'aspectFill', + }, + priceFill: { + type: Boolean, + value: true, + }, + currency: { + type: String, + value: '¥', + }, + lazyLoad: { + type: Boolean, + value: false, + }, + centered: { + type: Boolean, + value: false, + }, + pricePrefix: { + type: String, + value: '', + }, + /** 元素可见监控阈值, 数组长度大于0就创建 */ + thresholds: { + type: Array, + value: [], + observer(current) { + if (current && current.length) { + this.createIntersectionObserverHandle(); + } else { + this.clearIntersectionObserverHandle(); + } + }, + }, + specsIconClassPrefix: { + type: String, + value: 'wr', + }, + specsIcon: { + type: String, + value: 'expand_more', + }, + addCartIconClassPrefix: { + type: String, + value: 'wr', + }, + addCartIcon: { + type: String, + value: 'cart', + }, + }, + + data: { + hiddenInData: false, + independentID: '', + goods: { id: '' }, + /** 保证划线价格不小于原价,否则不渲染划线价 */ + isValidityLinePrice: false, + }, + + lifetimes: { + ready() { + this.init(); + }, + detached() { + this.clear(); + }, + }, + + methods: { + clickHandle() { + this.triggerEvent('click', { goods: this.data.goods }); + }, + clickThumbHandle() { + this.triggerEvent('thumb', { goods: this.data.goods }); + }, + clickSpecsHandle() { + this.triggerEvent('specs', { goods: this.data.goods }); + }, + clickTagHandle(evt) { + const { index } = evt.currentTarget.dataset; + this.triggerEvent('tag', { goods: this.data.goods, index }); + }, + // 加入购物车 + addCartHandle(e) { + const { id } = e.currentTarget; + const { id: cardID } = e.currentTarget.dataset; + this.triggerEvent('add-cart', { + ...e.detail, + id, + cardID, + goods: this.data.goods, + }); + }, + genIndependentID(id, cb) { + let independentID; + if (id) { + independentID = id; + } else { + independentID = `goods-card-${~~(Math.random() * 10 ** 8)}`; + } + this.setData({ independentID }, cb); + }, + + init() { + const { thresholds, id, hidden } = this.properties; + if (hidden !== null) { + this.setHidden(!!hidden); + } + + this.genIndependentID(id || '', () => { + if (thresholds && thresholds.length) { + this.createIntersectionObserverHandle(); + } + }); + }, + + clear() { + this.clearIntersectionObserverHandle(); + }, + + setHidden(hidden) { + this.setData({ hiddenInData: !!hidden }); + }, + + createIntersectionObserverHandle() { + if (this.intersectionObserverContext || !this.data.independentID) { + return; + } + + this.intersectionObserverContext = wx + .createIntersectionObserver(this, { + thresholds: this.properties.thresholds, + }) + .relativeToViewport(); + + this.intersectionObserverContext.observe( + `#${this.data.independentID}`, + (res) => { + this.intersectionObserverCB(res); + }, + ); + }, + intersectionObserverCB(ob) { + this.triggerEvent('ob', { + goods: this.data.goods, + context: this.intersectionObserverContext, + ob, + }); + }, + clearIntersectionObserverHandle() { + if (this.intersectionObserverContext) { + try { + this.intersectionObserverContext.disconnect(); + } catch (e) {} + + this.intersectionObserverContext = null; + } + }, + }, +}); diff --git a/pages/cart/components/goods-card/index.json b/pages/cart/components/goods-card/index.json new file mode 100644 index 0000000..d76303b --- /dev/null +++ b/pages/cart/components/goods-card/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "price": "/components/price/index", + "t-tag": "tdesign-miniprogram/tag/tag", + "t-image": "/components/webp-image/index", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/cart/components/goods-card/index.wxml b/pages/cart/components/goods-card/index.wxml new file mode 100644 index 0000000..df4111f --- /dev/null +++ b/pages/cart/components/goods-card/index.wxml @@ -0,0 +1,75 @@ + + diff --git a/pages/cart/components/goods-card/index.wxss b/pages/cart/components/goods-card/index.wxss new file mode 100644 index 0000000..6a7a4da --- /dev/null +++ b/pages/cart/components/goods-card/index.wxss @@ -0,0 +1,260 @@ +.wr-goods-card { + box-sizing: border-box; + font-size: 24rpx; +} +/* */ +.wr-goods-card__main { + position: relative; + display: flex; + padding: 0; + background: transparent; +} + +.wr-goods-card.center .wr-goods-card__main { + align-items: flex-start; + justify-content: center; +} + +.wr-goods-card__thumb { + flex-shrink: 0; + position: relative; + width: 140rpx; + height: 140rpx; +} + +.wr-goods-card__thumb-com { + width: 192rpx; + height: 192rpx; + border-radius: 8rpx; + overflow: hidden; +} +.wr-goods-card__thumb:empty { + display: none; + margin: 0; +} + +.wr-goods-card__body { + display: flex; + margin: 0 0 0 20rpx; + flex-direction: row; + flex: 1 1 auto; + min-height: 192rpx; +} + +.wr-goods-card__long_content { + display: flex; + flex-direction: column; + overflow: hidden; + flex: 1 1 auto; +} +.wr-goods-card__long_content .goods_tips { + width: 100%; + margin-top: 16rpx; + text-align: right; + color: #fa4126; + font-size: 24rpx; + line-height: 32rpx; + font-weight: bold; +} +.wr-goods-card__title { + flex-shrink: 0; + font-size: 28rpx; + color: #333; + line-height: 40rpx; + font-weight: 400; + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + word-break: break-word; +} +.wr-goods-card__title__prefix-tags { + display: inline-flex; +} +.wr-goods-card__title__prefix-tags .prefix-tag { + margin: 0 8rpx 0 0; +} +.wr-goods-card__desc { + font-size: 24rpx; + color: #f5f5f5; + line-height: 40rpx; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; +} +.wr-goods-card__specs__desc, +.wr-goods-card__specs__text { + font-size: 24rpx; + height: 32rpx; + line-height: 32rpx; + color: #999999; + margin: 8rpx 0; +} +.wr-goods-card__specs__desc { + display: flex; + align-self: flex-start; + flex-direction: row; + background: #f5f5f5; + border-radius: 8rpx; + padding: 4rpx 8rpx; +} +.wr-goods-card__specs__desc-text { + height: 100%; + max-width: 380rpx; + word-break: break-all; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.wr-goods-card__specs__desc-icon { + line-height: inherit; + margin-left: 8rpx; + font-size: 24rpx; + color: #bbb; +} +.wr-goods-card__specs__text { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; +} +.wr-goods-card__tags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 16rpx 0 0 0; +} +.wr-goods-card__tag { + color: #fa550f; + background: transparent; + font-size: 20rpx; + border: 1rpx solid #fa550f; + padding: 0 8rpx; + height: 30rpx; + line-height: 30rpx; + margin: 0 8rpx 8rpx 0; + display: block; + overflow: hidden; + white-space: nowrap; + word-break: keep-all; + text-overflow: ellipsis; +} +.wr-goods-card__short_content { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-end; + margin: 0 0 0 46rpx; +} +.wr-goods-card__price__prefix { + order: 0; + color: #666; + margin: 0; +} +.wr-goods-card__price { + white-space: nowrap; + font-weight: bold; + order: 1; + color: #fa4126; + font-size: 36rpx; + margin: 0; + line-height: 48rpx; +} +.wr-goods-card__origin-price { + white-space: nowrap; + font-weight: normal; + order: 2; + color: #aaaaaa; + font-size: 24rpx; + margin: 0; +} +.wr-goods-card__num { + white-space: nowrap; + order: 4; + font-size: 24rpx; + color: #999; + margin: 20rpx 0 0 auto; +} +.wr-goods-card__num__prefix { + color: inherit; +} +.wr-goods-card__add-cart { + order: 3; + margin: auto 0 0 auto; +} +.wr-goods-card.horizontal-wrap .wr-goods-card__thumb { + width: 192rpx; + height: 192rpx; + border-radius: 8rpx; + overflow: hidden; +} +.wr-goods-card.horizontal-wrap .wr-goods-card__body { + flex-direction: column; +} +.wr-goods-card.horizontal-wrap .wr-goods-card__short_content { + flex-direction: row; + align-items: center; + margin: 16rpx 0 0 0; +} + +.wr-goods-card.horizontal-wrap .wr-goods-card__num { + margin: 0 0 0 auto; +} +.wr-goods-card.vertical .wr-goods-card__main { + padding: 0 0 22rpx 0; + flex-direction: column; +} +.wr-goods-card.vertical .wr-goods-card__thumb { + width: 340rpx; + height: 340rpx; +} +.wr-goods-card.vertical .wr-goods-card__body { + margin: 20rpx 20rpx 0 20rpx; + flex-direction: column; +} +.wr-goods-card.vertical .wr-goods-card__long_content { + overflow: hidden; +} +.wr-goods-card.vertical .wr-goods-card__title { + line-height: 36rpx; +} +.wr-goods-card.vertical .wr-goods-card__short_content { + margin: 20rpx 0 0 0; +} +.wr-goods-card.vertical .wr-goods-card__price { + order: 2; + color: #fa4126; + margin: 20rpx 0 0 0; +} +.wr-goods-card.vertical .wr-goods-card__origin-price { + order: 1; +} +.wr-goods-card.vertical .wr-goods-card__add-cart { + position: absolute; + bottom: 20rpx; + right: 20rpx; +} + +.wr-goods-card__short_content .no_storage { + display: flex; + align-items: center; + justify-content: space-between; + height: 40rpx; + color: #333; + font-size: 24rpx; + line-height: 32rpx; + width: 100%; +} + +.no_storage .no_storage__right { + width: 80rpx; + height: 40rpx; + border-radius: 20rpx; + border: 2rpx solid #fa4126; + line-height: 40rpx; + text-align: center; + color: #fa4126; +} diff --git a/pages/cart/components/specs-popup/index.js b/pages/cart/components/specs-popup/index.js new file mode 100644 index 0000000..650d2aa --- /dev/null +++ b/pages/cart/components/specs-popup/index.js @@ -0,0 +1,72 @@ +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + }, + + properties: { + show: { + type: Boolean, + value: false, + }, + value: { + type: String, + value: '', + }, + title: { + type: String, + observer(newVal) { + this.setData({ 'goods.title': newVal }); + }, + }, + price: { + type: String, + value: '', + observer(newVal) { + this.setData({ 'goods.price': newVal }); + }, + }, + thumb: { + type: String, + value: '', + observer(newVal) { + this.setData({ 'goods.thumb': newVal }); + }, + }, + thumbMode: { + type: String, + value: 'aspectFit', + }, + zIndex: { + type: Number, + value: 99, + }, + specs: { + type: Array, + value: [], + }, + }, + + data: { + goods: { + title: '', + thumb: '', + price: '', + hideKey: { + originPrice: true, + tags: true, + specs: true, + num: true, + }, + }, + }, + methods: { + onClose() { + this.triggerEvent('close'); + }, + + onCloseOver() { + this.triggerEvent('closeover'); + }, + }, +}); diff --git a/pages/cart/components/specs-popup/index.json b/pages/cart/components/specs-popup/index.json new file mode 100644 index 0000000..d59fc6d --- /dev/null +++ b/pages/cart/components/specs-popup/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "goods-card": "../../components/goods-card/index" + } +} \ No newline at end of file diff --git a/pages/cart/components/specs-popup/index.wxml b/pages/cart/components/specs-popup/index.wxml new file mode 100644 index 0000000..4ddcb43 --- /dev/null +++ b/pages/cart/components/specs-popup/index.wxml @@ -0,0 +1,26 @@ + + + + + + 已选规格 + + {{spec}} + + + + + 我知道了 + + + diff --git a/pages/cart/components/specs-popup/index.wxss b/pages/cart/components/specs-popup/index.wxss new file mode 100644 index 0000000..359c185 --- /dev/null +++ b/pages/cart/components/specs-popup/index.wxss @@ -0,0 +1,68 @@ +.specs-popup { + width: 100vw; + box-sizing: border-box; + padding: 32rpx 32rpx calc(20rpx + env(safe-area-inset-bottom)) 32rpx; + max-height: 80vh; + display: flex; + flex-direction: column; + background-color: white; + border-radius: 20rpx 20rpx 0 0; +} +.specs-popup .section { + margin-top: 44rpx; + flex: auto; + overflow-y: scroll; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; +} +.specs-popup .section .title { + font-size: 26rpx; + color: #4f5356; +} +.specs-popup .section .options { + color: #333333; + font-size: 24rpx; + margin-right: -26rpx; +} +.specs-popup .section .options .option { + display: inline-block; + margin-top: 24rpx; + height: 56rpx; + line-height: 56rpx; + padding: 0 16rpx; + border-radius: 8rpx; + background-color: #f5f5f5; + max-width: 100%; + box-sizing: border-box; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.specs-popup .section .options .option:not(:last-child) { + margin-right: 26rpx; +} +.specs-popup .bottom-btn { + margin-top: 42rpx; + position: relative; + height: 80rpx; + line-height: 80rpx; + text-align: center; + background-color: white; + color: #fa4126; +} +.specs-popup .bottom-btn--active { + opacity: 0.5; +} +.specs-popup .bottom-btn::after { + display: block; + content: ' '; + position: absolute; + left: 0; + top: 0; + width: 200%; + height: 200%; + border: 1px solid #fa4126; + border-radius: 80rpx; + transform: scale(0.5); + transform-origin: left top; +} diff --git a/pages/cart/index.js b/pages/cart/index.js new file mode 100644 index 0000000..3fd6d61 --- /dev/null +++ b/pages/cart/index.js @@ -0,0 +1,315 @@ +import Dialog from 'tdesign-miniprogram/dialog/index'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { fetchCartGroupData } from '../../services/cart/cart'; + +Page({ + data: { + cartGroupData: null, + }, + + // 调用自定义tabbar的init函数,使页面与tabbar激活状态保持一致 + onShow() { + this.getTabBar().init(); + }, + + onLoad() { + this.refreshData(); + }, + + refreshData() { + this.getCartGroupData().then((res) => { + let isEmpty = true; + const cartGroupData = res.data; + // 一些组件中需要的字段可能接口并没有返回,或者返回的数据结构与预期不一致,需要在此先对数据做一些处理 + // 统计门店下加购的商品是否全选、是否存在缺货/无货 + for (const store of cartGroupData.storeGoods) { + store.isSelected = true; // 该门店已加购商品是否全选 + store.storeStockShortage = false; // 该门店已加购商品是否存在库存不足 + if (!store.shortageGoodsList) { + store.shortageGoodsList = []; // 该门店已加购商品如果库存为0需单独分组 + } + for (const activity of store.promotionGoodsList) { + activity.goodsPromotionList = activity.goodsPromotionList.filter( + (goods) => { + goods.originPrice = undefined; + + // 统计是否有加购数大于库存数的商品 + if (goods.quantity > goods.stockQuantity) { + store.storeStockShortage = true; + } + // 统计是否全选 + if (!goods.isSelected) { + store.isSelected = false; + } + // 库存为0(无货)的商品单独分组 + if (goods.stockQuantity > 0) { + return true; + } + store.shortageGoodsList.push(goods); + return false; + }, + ); + + if (activity.goodsPromotionList.length > 0) { + isEmpty = false; + } + } + if (store.shortageGoodsList.length > 0) { + isEmpty = false; + } + } + cartGroupData.invalidGoodItems = cartGroupData.invalidGoodItems.map( + (goods) => { + goods.originPrice = undefined; + return goods; + }, + ); + cartGroupData.isNotEmpty = !isEmpty; + this.setData({ cartGroupData }); + }); + }, + + findGoods(spuId, skuId) { + let currentStore; + let currentActivity; + let currentGoods; + const { storeGoods } = this.data.cartGroupData; + for (const store of storeGoods) { + for (const activity of store.promotionGoodsList) { + for (const goods of activity.goodsPromotionList) { + if (goods.spuId === spuId && goods.skuId === skuId) { + currentStore = store; + currentActivity = currentActivity; + currentGoods = goods; + return { + currentStore, + currentActivity, + currentGoods, + }; + } + } + } + } + return { + currentStore, + currentActivity, + currentGoods, + }; + }, + + // 注:实际场景时应该调用接口获取购物车数据 + getCartGroupData() { + const { cartGroupData } = this.data; + if (!cartGroupData) { + return fetchCartGroupData(); + } + return Promise.resolve({ data: cartGroupData }); + }, + + // 选择单个商品 + // 注:实际场景时应该调用接口更改选中状态 + selectGoodsService({ spuId, skuId, isSelected }) { + this.findGoods(spuId, skuId).currentGoods.isSelected = isSelected; + return Promise.resolve(); + }, + + // 全选门店 + // 注:实际场景时应该调用接口更改选中状态 + selectStoreService({ storeId, isSelected }) { + const currentStore = this.data.cartGroupData.storeGoods.find( + (s) => s.storeId === storeId, + ); + currentStore.isSelected = isSelected; + currentStore.promotionGoodsList.forEach((activity) => { + activity.goodsPromotionList.forEach((goods) => { + goods.isSelected = isSelected; + }); + }); + return Promise.resolve(); + }, + + // 加购数量变更 + // 注:实际场景时应该调用接口 + changeQuantityService({ spuId, skuId, quantity }) { + this.findGoods(spuId, skuId).currentGoods.quantity = quantity; + return Promise.resolve(); + }, + + // 删除加购商品 + // 注:实际场景时应该调用接口 + deleteGoodsService({ spuId, skuId }) { + function deleteGoods(group) { + for (const gindex in group) { + const goods = group[gindex]; + if (goods.spuId === spuId && goods.skuId === skuId) { + group.splice(gindex, 1); + return gindex; + } + } + return -1; + } + const { storeGoods, invalidGoodItems } = this.data.cartGroupData; + for (const store of storeGoods) { + for (const activity of store.promotionGoodsList) { + if (deleteGoods(activity.goodsPromotionList) > -1) { + return Promise.resolve(); + } + } + if (deleteGoods(store.shortageGoodsList) > -1) { + return Promise.resolve(); + } + } + if (deleteGoods(invalidGoodItems) > -1) { + return Promise.resolve(); + } + return Promise.reject(); + }, + + // 清空失效商品 + // 注:实际场景时应该调用接口 + clearInvalidGoodsService() { + this.data.cartGroupData.invalidGoodItems = []; + return Promise.resolve(); + }, + + onGoodsSelect(e) { + const { + goods: { spuId, skuId }, + isSelected, + } = e.detail; + const { currentGoods } = this.findGoods(spuId, skuId); + Toast({ + context: this, + selector: '#t-toast', + message: `${isSelected ? '选择' : '取消'}"${ + currentGoods.title.length > 5 + ? `${currentGoods.title.slice(0, 5)}...` + : currentGoods.title + }"`, + icon: '', + }); + this.selectGoodsService({ spuId, skuId, isSelected }).then(() => + this.refreshData(), + ); + }, + + onStoreSelect(e) { + const { + store: { storeId }, + isSelected, + } = e.detail; + this.selectStoreService({ storeId, isSelected }).then(() => + this.refreshData(), + ); + }, + + onQuantityChange(e) { + const { + goods: { spuId, skuId }, + quantity, + } = e.detail; + const { currentGoods } = this.findGoods(spuId, skuId); + const stockQuantity = + currentGoods.stockQuantity > 0 ? currentGoods.stockQuantity : 0; // 避免后端返回的是-1 + // 加购数量超过库存数量 + if (quantity > stockQuantity) { + // 加购数量等于库存数量的情况下继续加购 + if ( + currentGoods.quantity === stockQuantity && + quantity - stockQuantity === 1 + ) { + Toast({ + context: this, + selector: '#t-toast', + message: '当前商品库存不足', + }); + return; + } + Dialog.confirm({ + title: '商品库存不足', + content: `当前商品库存不足,最大可购买数量为${stockQuantity}件`, + confirmBtn: '修改为最大可购买数量', + cancelBtn: '取消', + }) + .then(() => { + this.changeQuantityService({ + spuId, + skuId, + quantity: stockQuantity, + }).then(() => this.refreshData()); + }) + .catch(() => {}); + return; + } + this.changeQuantityService({ spuId, skuId, quantity }).then(() => + this.refreshData(), + ); + }, + + goCollect() { + /** 活动肯定有一个活动ID,用来获取活动banner,活动商品列表等 */ + const promotionID = '123'; + wx.navigateTo({ + url: `/pages/promotion-detail/index?promotion_id=${promotionID}`, + }); + }, + + goGoodsDetail(e) { + const { spuId, storeId } = e.detail.goods; + wx.navigateTo({ + url: `/pages/goods/details/index?spuId=${spuId}&storeId=${storeId}`, + }); + }, + + clearInvalidGoods() { + // 实际场景时应该调用接口清空失效商品 + this.clearInvalidGoodsService().then(() => this.refreshData()); + }, + + onGoodsDelete(e) { + const { + goods: { spuId, skuId }, + } = e.detail; + Dialog.confirm({ + content: '确认删除该商品吗?', + confirmBtn: '确定', + cancelBtn: '取消', + }).then(() => { + this.deleteGoodsService({ spuId, skuId }).then(() => { + Toast({ context: this, selector: '#t-toast', message: '商品删除成功' }); + this.refreshData(); + }); + }); + }, + + onSelectAll(event) { + const { isAllSelected } = event?.detail ?? {}; + Toast({ + context: this, + selector: '#t-toast', + message: `${isAllSelected ? '取消' : '点击'}了全选按钮`, + }); + // 调用接口改变全选 + }, + + onToSettle() { + const goodsRequestList = []; + this.data.cartGroupData.storeGoods.forEach((store) => { + store.promotionGoodsList.forEach((promotion) => { + promotion.goodsPromotionList.forEach((m) => { + if (m.isSelected == 1) { + goodsRequestList.push(m); + } + }); + }); + }); + wx.setStorageSync( + 'order.goodsRequestList', + JSON.stringify(goodsRequestList), + ); + wx.navigateTo({ url: '/pages/order/order-confirm/index?type=cart' }); + }, + onGotoHome() { + wx.switchTab({ url: '/pages/home/home' }); + }, +}); diff --git a/pages/cart/index.json b/pages/cart/index.json new file mode 100644 index 0000000..1d2e717 --- /dev/null +++ b/pages/cart/index.json @@ -0,0 +1,10 @@ +{ + "navigationBarTitleText": "购物车", + "usingComponents": { + "cart-group": "./components/cart-group/index", + "cart-empty": "./components/cart-empty/index", + "cart-bar": "./components/cart-bar/index", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog" + } +} \ No newline at end of file diff --git a/pages/cart/index.wxml b/pages/cart/index.wxml new file mode 100644 index 0000000..aa1acec --- /dev/null +++ b/pages/cart/index.wxml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/pages/cart/index.wxss b/pages/cart/index.wxss new file mode 100644 index 0000000..4eec899 --- /dev/null +++ b/pages/cart/index.wxss @@ -0,0 +1,12 @@ +:host { + padding-bottom: 100rpx; +} + +.gap { + height: 100rpx; + width: 100%; +} + +.add-notes__confirm { + color: #fa4126 !important; +} diff --git a/pages/coupon/components/coupon-card/index.js b/pages/coupon/components/coupon-card/index.js new file mode 100644 index 0000000..07785fe --- /dev/null +++ b/pages/coupon/components/coupon-card/index.js @@ -0,0 +1,57 @@ +const statusMap = { + default: { text: '去使用', theme: 'primary' }, + useless: { text: '已使用', theme: 'default' }, + disabled: { text: '已过期', theme: 'default' }, +}; +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + }, + + externalClasses: ['coupon-class'], + + properties: { + couponDTO: { + type: Object, + value: {}, // 优惠券数据 + }, + }, + + data: { + btnText: '', + btnTheme: '', + }, + + observers: { + couponDTO: function (couponDTO) { + if (!couponDTO) { + return; + } + const statusInfo = statusMap[couponDTO.status]; + + this.setData({ + btnText: statusInfo.text, + btnTheme: statusInfo.theme, + }); + }, + }, + + attached() {}, + + methods: { + // 跳转到详情页 + gotoDetail() { + wx.navigateTo({ + url: `/pages/coupon/coupon-detail/index?id=${this.data.couponDTO.key}`, + }); + }, + + // 跳转到商品列表 + gotoGoodsList() { + wx.navigateTo({ + url: `/pages/coupon/coupon-activity-goods/index?id=${this.data.couponDTO.key}`, + }); + }, + }, +}); diff --git a/pages/coupon/components/coupon-card/index.json b/pages/coupon/components/coupon-card/index.json new file mode 100644 index 0000000..2d851d1 --- /dev/null +++ b/pages/coupon/components/coupon-card/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "ui-coupon-card": "../ui-coupon-card/index", + "t-button": "tdesign-miniprogram/button/button" + } +} diff --git a/pages/coupon/components/coupon-card/index.wxml b/pages/coupon/components/coupon-card/index.wxml new file mode 100644 index 0000000..3c8315e --- /dev/null +++ b/pages/coupon/components/coupon-card/index.wxml @@ -0,0 +1,17 @@ + + + {{btnText}} + + + + diff --git a/pages/coupon/components/coupon-card/index.wxss b/pages/coupon/components/coupon-card/index.wxss new file mode 100644 index 0000000..666e4b4 --- /dev/null +++ b/pages/coupon/components/coupon-card/index.wxss @@ -0,0 +1,12 @@ +.coupon-btn-slot .coupon-btn-primary { + width: 136rpx; + height: 56rpx; + border-radius: 28rpx; + background-color: transparent; + border-color: #fa4126; + color: #fa4126; +} + +.coupon-btn-default { + display: none; +} diff --git a/pages/coupon/components/floating-button/index.js b/pages/coupon/components/floating-button/index.js new file mode 100644 index 0000000..f29bcad --- /dev/null +++ b/pages/coupon/components/floating-button/index.js @@ -0,0 +1,17 @@ +Component({ + data: { icon: 'cart' }, + + properties: { + count: { + type: Number, + }, + }, + + methods: { + goToCart() { + wx.switchTab({ + url: '/pages/cart/index', + }); + }, + }, +}); diff --git a/pages/coupon/components/floating-button/index.json b/pages/coupon/components/floating-button/index.json new file mode 100644 index 0000000..fa2d209 --- /dev/null +++ b/pages/coupon/components/floating-button/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/coupon/components/floating-button/index.wxml b/pages/coupon/components/floating-button/index.wxml new file mode 100644 index 0000000..7f1a9e7 --- /dev/null +++ b/pages/coupon/components/floating-button/index.wxml @@ -0,0 +1,14 @@ + + + + + + {{count}} + + + diff --git a/pages/coupon/components/floating-button/index.wxss b/pages/coupon/components/floating-button/index.wxss new file mode 100644 index 0000000..faad943 --- /dev/null +++ b/pages/coupon/components/floating-button/index.wxss @@ -0,0 +1,30 @@ +.floating-button { + position: fixed; + right: 20rpx; + bottom: 108rpx; +} + +.floating-button .floating-inner-container { + display: flex; + align-items: center; + justify-content: center; + height: 96rpx; + width: 96rpx; + background-color: rgba(0, 0, 0, 0.8); + opacity: 0.7; + border-radius: 48rpx; +} + +.floating-button .floating-right-top { + position: absolute; + right: 0rpx; + top: 0rpx; + height: 28rpx; + background: #fa4126; + border-radius: 64rpx; + font-weight: bold; + font-size: 22rpx; + line-height: 28rpx; + color: #fff; + padding: 0 8rpx; +} diff --git a/pages/coupon/components/ui-coupon-card/index.js b/pages/coupon/components/ui-coupon-card/index.js new file mode 100644 index 0000000..9101be8 --- /dev/null +++ b/pages/coupon/components/ui-coupon-card/index.js @@ -0,0 +1,87 @@ +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, + }, + + externalClasses: ['coupon-class'], + + properties: { + mask: { + type: Boolean, + value: false, // 是否添加遮罩 + }, + superposable: { + type: Boolean, + value: false, // 是否可叠加 + }, + type: { + type: String, + value: '', // 优惠券类型:CouponType + }, + value: { + type: String, + value: '', // 优惠金额 + }, + tag: { + type: String, + value: '', // 优惠标签,优惠券名字标签,img + }, + desc: { + type: String, + value: '', // 优惠金额描述,金额下方 + }, + title: { + type: String, // 优惠券名称 + value: '', + }, + timeLimit: { + type: String, // 优惠券时限 + value: '', + }, + ruleDesc: { + type: String, // 优惠券适用规则描述 + value: '', + }, + currency: { + type: String, + value: '¥', // 优惠货币 + }, + status: { + type: String, + value: 'default', + }, + image: { + type: String, + value: '', + }, + }, + + data: { + CouponType: { + MJ_COUPON: 1, + ZK_COUPON: 2, + MJF_COUPON: 3, + GIFT_COUPON: 4, + }, + theme: 'primary', + }, + + observers: { + status: function (value) { + let theme = 'primary'; + // 已过期或已使用的券 颜色置灰 + if (value === 'useless' || value === 'disabled') { + theme = 'weak'; + } + + this.setData({ theme }); + }, + }, + + attached() { + this.setData({ + color: `color${this.properties.colorStyle}`, + }); + }, +}); diff --git a/pages/coupon/components/ui-coupon-card/index.json b/pages/coupon/components/ui-coupon-card/index.json new file mode 100644 index 0000000..dd874c8 --- /dev/null +++ b/pages/coupon/components/ui-coupon-card/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/pages/coupon/components/ui-coupon-card/index.wxml b/pages/coupon/components/ui-coupon-card/index.wxml new file mode 100644 index 0000000..baf53d9 --- /dev/null +++ b/pages/coupon/components/ui-coupon-card/index.wxml @@ -0,0 +1,54 @@ + + function isBigValue(value) { + var values = (value + '').split('.'); + if (values[1] && values[0].length >= 3) return true; + else return false + } + + function getBigValues(value) { + return value.split('.'); + } + + module.exports = { isBigValue: isBigValue, getBigValues: getBigValues }; + + + + + {{value}} + + {{desc}} + + + + {{tools.getBigValues(value)[0]}} + .{{tools.getBigValues(value)[1]}} + + {{value / 100}} + + {{desc}} + + + 免邮 + {{desc}} + + + + + + + + {{title}} + {{timeLimit}} + + {{ruleDesc}} + + + + + + + + + 可叠加 + + diff --git a/pages/coupon/components/ui-coupon-card/index.wxss b/pages/coupon/components/ui-coupon-card/index.wxss new file mode 100644 index 0000000..0ef9648 --- /dev/null +++ b/pages/coupon/components/ui-coupon-card/index.wxss @@ -0,0 +1,147 @@ +.wr-coupon { + display: flex; + background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/coupon/coupon-bg-nocorners.png'); + background-size: 100% 100%; + background-repeat: no-repeat; + position: relative; + margin-bottom: 24rpx; + overflow: hidden; +} +.theme-weak.wr-coupon { + background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/coupon/coupon-bg-grey2.png'); +} + +.wr-coupon__left { + width: 200rpx; + height: 180rpx; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + color: #fa4126; + overflow: hidden; + position: relative; +} +.theme-weak .wr-coupon__left { + color: #333; +} + +.wr-coupon__left--value { + font-size: 64rpx; + line-height: 88rpx; + font-weight: bold; + font-family: 'DIN Alternate', cursive; +} +.wr-coupon__left--value-int { + font-size: 48rpx; + line-height: 88rpx; +} +.wr-coupon__left--value-decimal { + font-size: 36rpx; + line-height: 48rpx; +} +.wr-coupon__left--image { + width: 128rpx; + height: 128rpx; + border-radius: 8px; + margin-top: 30rpx; +} +.wr-coupon__left--unit { + font-size: 24rpx; + line-height: 32rpx; +} +.wr-coupon__left--desc { + font-size: 24rpx; + line-height: 32rpx; + color: #fa4126; +} + +.theme-weak .wr-coupon__left--desc { + color: #333; +} + +.wr-coupon__right { + flex-grow: 1; + padding: 0 20rpx; + height: 180rpx; + box-sizing: border-box; + overflow: hidden; + display: flex; + align-items: center; +} +.wr-coupon__right--title { + display: flex; + -webkit-display: flex; + flex-direction: column; + align-items: flex-start; + color: #999999; + font-size: 24rpx; + flex: 1; +} +.wr-coupon__right--title .coupon-title { + max-width: 320rpx; + color: #333333; + font-size: 28rpx; + line-height: 40rpx; + font-weight: bold; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + white-space: normal; +} +.wr-coupon__right--title .coupon-time { + margin-top: 16rpx; + /* // letter-spacing: -0.05em; */ +} +.wr-coupon__right--title .coupon-desc { + margin-top: 8rpx; +} +.wr-coupon__right--title .coupon-arrow { + font-size: 22rpx; +} +.wr-coupon__right--oper { + display: flex; + justify-content: center; + align-items: center; +} +.wr-coupon__mask { + width: 702rpx; + height: 182rpx; + position: absolute; + top: 0; + left: 0; + background-color: #ffffff; + opacity: 0.5; +} +.wr-coupon__tag { + position: absolute; + top: 8px; + right: -24rpx; + text-align: center; + width: 106rpx; + height: 28rpx; + opacity: 0.9; + font-size: 20rpx; + line-height: 28rpx; + color: #fa4126; + border: 0.5px solid #fa4126; + box-sizing: border-box; + transform: rotate(45deg); +} +.wr-coupon__seal { + width: 128rpx; + height: 128rpx; + position: absolute; + top: 0; + right: 0; + background-size: 100% 100%; +} + +.wr-coupon__seal.seal-useless { + background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/coupon/seal-used.png'); +} + +.wr-coupon__seal.seal-disabled { + background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/coupon/coupon-expired.png'); +} diff --git a/pages/coupon/coupon-activity-goods/index.js b/pages/coupon/coupon-activity-goods/index.js new file mode 100644 index 0000000..bf08d36 --- /dev/null +++ b/pages/coupon/coupon-activity-goods/index.js @@ -0,0 +1,78 @@ +import { fetchCouponDetail } from '../../../services/coupon/index'; +import { fetchGoodsList } from '../../../services/good/fetchGoods'; +import Toast from 'tdesign-miniprogram/toast/index'; + +Page({ + data: { + goods: [], + detail: {}, + couponTypeDesc: '', + showStoreInfoList: false, + cartNum: 2, + }, + + id: '', + + onLoad(query) { + const id = parseInt(query.id); + this.id = id; + + this.getCouponDetail(id); + this.getGoodsList(id); + }, + + getCouponDetail(id) { + fetchCouponDetail(id).then(({ detail }) => { + this.setData({ detail }); + if (detail.type === 2) { + if (detail.base > 0) { + this.setData({ + couponTypeDesc: `满${detail.base / 100}元${detail.value}折`, + }); + } else { + this.setData({ couponTypeDesc: `${detail.value}折` }); + } + } else if (detail.type === 1) { + if (detail.base > 0) { + this.setData({ + couponTypeDesc: `满${detail.base / 100}元减${detail.value / 100}元`, + }); + } else { + this.setData({ couponTypeDesc: `减${detail.value / 100}元` }); + } + } + }); + }, + + getGoodsList(id) { + fetchGoodsList(id).then((goods) => { + this.setData({ goods }); + }); + }, + + openStoreList() { + this.setData({ + showStoreInfoList: true, + }); + }, + + closeStoreList() { + this.setData({ + showStoreInfoList: false, + }); + }, + + goodClickHandle(e) { + const { index } = e.detail; + const { spuId } = this.data.goods[index]; + wx.navigateTo({ url: `/pages/goods/details/index?spuId=${spuId}` }); + }, + + cartClickHandle() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击加入购物车', + }); + }, +}); diff --git a/pages/coupon/coupon-activity-goods/index.json b/pages/coupon/coupon-activity-goods/index.json new file mode 100644 index 0000000..31cf9c3 --- /dev/null +++ b/pages/coupon/coupon-activity-goods/index.json @@ -0,0 +1,10 @@ +{ + "navigationBarTitleText": "活动商品", + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-popup": "tdesign-miniprogram/popup/popup", + "t-toast": "tdesign-miniprogram/toast/toast", + "goods-list": "/components/goods-list/index", + "floating-button": "../components/floating-button/index" + } +} \ No newline at end of file diff --git a/pages/coupon/coupon-activity-goods/index.wxml b/pages/coupon/coupon-activity-goods/index.wxml new file mode 100644 index 0000000..a10ddd0 --- /dev/null +++ b/pages/coupon/coupon-activity-goods/index.wxml @@ -0,0 +1,54 @@ + + + + 以下商品可使用 + {{couponTypeDesc}} + 优惠券 + + + + + + + + + + + + 规则详情 + + + + 优惠券有效时间 + {{detail.timeLimit}} + + + 优惠券说明 + {{detail.desc}} + + + 使用须知 + {{detail.useNotes}} + + + + + + + diff --git a/pages/coupon/coupon-activity-goods/index.wxss b/pages/coupon/coupon-activity-goods/index.wxss new file mode 100644 index 0000000..be5fdaf --- /dev/null +++ b/pages/coupon/coupon-activity-goods/index.wxss @@ -0,0 +1,74 @@ +page { + background-color: #f5f5f5; +} + +.coupon-page-container .notice-bar-content { + display: flex; + flex-direction: row; + align-items: center; + padding: 8rpx 0; +} + +.coupon-page-container .notice-bar-text { + font-size: 26rpx; + line-height: 36rpx; + font-weight: 400; + color: #666666; + margin-left: 24rpx; +} + +.coupon-page-container .notice-bar-text .height-light { + color: #fa550f; +} + +.coupon-page-container .notice-bar-icon { + margin-left: 12rpx; + height: 68rpx; + line-height: 68rpx !important; +} + +.coupon-page-container .popup-content-wrap { + background-color: #fff; + border-top-left-radius: 20rpx; + border-top-right-radius: 20rpx; +} + +.coupon-page-container .popup-content-title { + font-size: 32rpx; + color: #333; + text-align: center; + height: 104rpx; + line-height: 104rpx; + position: relative; +} + +.coupon-page-container .desc-group-wrap { + padding-bottom: env(safe-area-inset-bottom); +} + +.coupon-page-container .desc-group-wrap .item-wrap { + margin: 0 30rpx 30rpx; +} + +.coupon-page-container .desc-group-wrap .item-title { + font-size: 26rpx; + color: #333; + font-weight: 500; +} + +.coupon-page-container .desc-group-wrap .item-label { + font-size: 24rpx; + color: #666; + margin-top: 12rpx; + white-space: pre-line; + word-break: break-all; + line-height: 34rpx; +} + +.coupon-page-container .goods-list-container { + margin: 0 24rpx 24rpx; +} + +.coupon-page-container .goods-list-wrap { + background: #f5f5f5 !important; +} diff --git a/pages/coupon/coupon-detail/index.js b/pages/coupon/coupon-detail/index.js new file mode 100644 index 0000000..71ff5d6 --- /dev/null +++ b/pages/coupon/coupon-detail/index.js @@ -0,0 +1,32 @@ +import { fetchCouponDetail } from '../../../services/coupon/index'; + +Page({ + data: { + detail: null, + storeInfoList: [], + storeInfoStr: '', + showStoreInfoList: false, + }, + + id: '', + + onLoad(query) { + const id = parseInt(query.id); + this.id = id; + this.getGoodsList(id); + }, + + getGoodsList(id) { + fetchCouponDetail(id).then(({ detail }) => { + this.setData({ + detail, + }); + }); + }, + + navGoodListHandle() { + wx.navigateTo({ + url: `/pages/coupon/coupon-activity-goods/index?id=${this.id}`, + }); + }, +}); diff --git a/pages/coupon/coupon-detail/index.json b/pages/coupon/coupon-detail/index.json new file mode 100644 index 0000000..d419a0b --- /dev/null +++ b/pages/coupon/coupon-detail/index.json @@ -0,0 +1,10 @@ +{ + "navigationBarTitleText": "优惠券详情", + "usingComponents": { + "coupon-card": "../components/coupon-card/index", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-button": "tdesign-miniprogram/button/button", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/coupon/coupon-detail/index.wxml b/pages/coupon/coupon-detail/index.wxml new file mode 100644 index 0000000..5d1b906 --- /dev/null +++ b/pages/coupon/coupon-detail/index.wxml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + 查看可用商品 + + + + diff --git a/pages/coupon/coupon-detail/index.wxss b/pages/coupon/coupon-detail/index.wxss new file mode 100644 index 0000000..eddcf25 --- /dev/null +++ b/pages/coupon/coupon-detail/index.wxss @@ -0,0 +1,100 @@ +page { + background-color: #f5f5f5; +} + +.coupon-card-wrap { + background-color: #fff; + padding: 32rpx 32rpx 1rpx; +} +.desc-wrap { + margin-top: 24rpx; +} +.desc-wrap .button-wrap .view-good-list-btn { + width: 686rpx; + height: 88rpx; + margin-top: 50rpx; + background: #fa4126; + border-radius: 44rpx; + color: #fff; + font-size: 32rpx; + display: flex; + align-items: center; + justify-content: center; +} + +.desc-group-wrap .t-class-cell { + align-items: flex-start; +} + +.desc-group-wrap .t-class-title { + font-size: 26rpx; + width: 140rpx; + flex: none; + color: #888; +} + +.desc-group-wrap .t-class-note { + font-size: 26rpx; + word-break: break-all; + white-space: pre-line; + justify-content: flex-start; + color: #333; +} + +.desc-group-wrap { + border-radius: 8rpx; + overflow: hidden; + + --cell-label-font-size: 26rpx; + --cell-label-line-height: 36rpx; + --cell-label-color: #999; +} + +.desc-group-wrap.in-popup { + border-radius: 0; + overflow: auto; + max-height: 828rpx; +} + +.desc-group-wrap .wr-cell__title { + color: #333; + font-size: 28rpx; +} + +/* .desc-group-wrap .max-width-cell { + overflow: hidden; +} */ + +/* .desc-group-wrap .signal-line-label { + word-break: keep-all; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.desc-group-wrap .multi-line-label { + word-break: break-all; + white-space: pre-line; +} */ + +.popup-content-wrap { + background-color: #fff; + border-top-left-radius: 20rpx; + border-top-right-radius: 20rpx; +} + +.popup-content-title { + font-size: 32rpx; + color: #333; + + text-align: center; + height: 104rpx; + line-height: 104rpx; + + position: relative; +} + +.popup-content-title .close-icon { + position: absolute; + top: 24rpx; + right: 24rpx; +} diff --git a/pages/coupon/coupon-list/index.js b/pages/coupon/coupon-list/index.js new file mode 100644 index 0000000..f3b8675 --- /dev/null +++ b/pages/coupon/coupon-list/index.js @@ -0,0 +1,77 @@ +import { fetchCouponList } from '../../../services/coupon/index'; + +Page({ + data: { + status: 0, + list: [ + { + text: '可使用', + key: 0, + }, + { + text: '已使用', + key: 1, + }, + { + text: '已失效', + key: 2, + }, + ], + + couponList: [], + }, + + onLoad() { + this.init(); + }, + + init() { + this.fetchList(); + }, + + fetchList(status = this.data.status) { + let statusInFetch = ''; + switch (Number(status)) { + case 0: { + statusInFetch = 'default'; + break; + } + case 1: { + statusInFetch = 'useless'; + break; + } + case 2: { + statusInFetch = 'disabled'; + break; + } + default: { + throw new Error(`unknown fetchStatus: ${statusInFetch}`); + } + } + fetchCouponList(statusInFetch).then((couponList) => { + this.setData({ couponList }); + }); + }, + + tabChange(e) { + const { value } = e.detail; + + this.setData({ status: value }); + this.fetchList(value); + }, + + goCouponCenterHandle() { + wx.showToast({ title: '去领券中心', icon: 'none' }); + }, + + onPullDownRefresh_() { + this.setData( + { + couponList: [], + }, + () => { + this.fetchList(); + }, + ); + }, +}); diff --git a/pages/coupon/coupon-list/index.json b/pages/coupon/coupon-list/index.json new file mode 100644 index 0000000..c09d584 --- /dev/null +++ b/pages/coupon/coupon-list/index.json @@ -0,0 +1,10 @@ +{ + "navigationBarTitleText": "优惠券", + "usingComponents": { + "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh", + "t-tabs": "tdesign-miniprogram/tabs/tabs", + "t-tab-panel": "tdesign-miniprogram/tabs/tab-panel", + "t-icon": "tdesign-miniprogram/icon/icon", + "coupon-card": "../components/coupon-card/index" + } +} \ No newline at end of file diff --git a/pages/coupon/coupon-list/index.wxml b/pages/coupon/coupon-list/index.wxml new file mode 100644 index 0000000..391fe7b --- /dev/null +++ b/pages/coupon/coupon-list/index.wxml @@ -0,0 +1,42 @@ + + + + + + + + + + + + 领券中心 + + + + + diff --git a/pages/coupon/coupon-list/index.wxss b/pages/coupon/coupon-list/index.wxss new file mode 100644 index 0000000..9ee2b9d --- /dev/null +++ b/pages/coupon/coupon-list/index.wxss @@ -0,0 +1,78 @@ +page { + height: 100%; +} + +.tabs-external__inner { + height: 88rpx; + width: 100%; + line-height: 88rpx; + z-index: 100; +} +.tabs-external__inner { + font-size: 26rpx; + color: #333333; + position: fixed; + width: 100vw; + top: 0; + left: 0; +} + +.tabs-external__inner .tabs-external__track { + background: #fa4126 !important; +} + +.tabs-external__inner .tabs-external__item { + color: #666; +} + +.tabs-external__inner .tabs-external__active { + font-size: 28rpx; + color: #fa4126 !important; +} + +.tabs-external__inner.order-nav .order-nav-item .bottom-line { + bottom: 12rpx; +} + +.coupon-list-wrap { + margin-top: 108rpx; + margin-left: 24rpx; + margin-right: 24rpx; + overflow-y: auto; + padding-bottom: 100rpx; + padding-bottom: calc(constant(safe-area-inset-top) + 100rpx); + padding-bottom: calc(env(safe-area-inset-bottom) + 100rpx); + -webkit-overflow-scrolling: touch; +} + +.center-entry { + box-sizing: content-box; + border-top: 1rpx solid #dce0e4; + background-color: #fff; + position: fixed; + bottom: 0; + left: 0; + right: 0; + height: 100rpx; + padding-bottom: 0; + padding-bottom: constant(safe-area-inset-top); + padding-bottom: env(safe-area-inset-bottom); +} + +.center-entry-btn { + color: #fa4126; + font-size: 32rpx; + text-align: center; + line-height: 100rpx; + display: flex; + align-items: center; + justify-content: center; + height: 100rpx; +} + +.coupon-list-wrap .t-pull-down-refresh__bar { + background: #fff !important; +} +.t-class-indicator { + color: #b9b9b9 !important; +} diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/README.md b/pages/goods/category/components/goods-category/components/c-sidebar/README.md new file mode 100644 index 0000000..88d7b0b --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/README.md @@ -0,0 +1,95 @@ +# Sidebar 侧边导航 + +### 引入 + +全局引入,在miniprogram根目录下的`app.json`中配置,局部引入,在需要引入的页面或组件的`index.json`中配置。 + +```json +// app.json 或 index.json +"usingComponents": { + "wr-sidebar": "path/to/components/goods-category/wr-sidebar/index", + "wr-sidebar-item": "path/to/component/goods-category/wr-sidebar/wr-sidebar-item/index" +} +``` + +## 代码演示 + +### 基础用法 + +通过在`wr-sidebar`上设置`activeKey`属性来控制选中项 + +```html + + + + + +``` + +``` javascript +Page({ + data: { + activeKey: 0 + }, + + onChange(event) { + wx.showToast({ + icon: 'none', + title: `切换至第${event.detail}项` + }); + } +}); +``` + +### 提示气泡(暂未实现) + +设置`dot`属性后,会在右上角展示一个小红点。设置`info`属性后,会在右上角展示相应的徽标 + +```html + + + + + +``` + +## API + +### Sidebar Props + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +|-----------|-----------|-----------|-------------|-------------| +| activeKey | 选中项的索引 | *string \| number* | `0` | - | + +### Sidebar Event + +| 事件名 | 说明 | 参数 | +|------|------|------| +| change | 切换选项时触发 | 当前选中选项的索引 | + +### Sidebar 外部样式类 + +| 类名 | 说明 | +|-----------|-----------| +| custom-class | 根节点样式类 | + +### SidebarItem Props + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +|-----------|-----------|-----------|-------------|-------------| +| title | 内容 | *string* | `''` | - | +| disabled | 是否禁用 | | *boolean* | `false` | - | +| dot | 是否显示右上角小红点 | *boolean* | `false` | - | +| info | 提示消息 | *string \| number* | `''` | - | + +### SidebarItem Event + +| 事件名 | 说明 | 参数 | +|------|------|------| +| click | 点击徽章时触发 | 当前徽章的索引 | + +### SidebarItem 外部样式类 + +| 类名 | 说明 | +|-----------|-----------| +| custom-class | 根节点样式类 | diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.js b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.js new file mode 100644 index 0000000..810d5e5 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.js @@ -0,0 +1,51 @@ +Component({ + relations: { + '../../c-sidebar/index': { + type: 'ancestor', + linked(target) { + this.parent = target; + }, + }, + }, + + externalClasses: ['custom-class'], + properties: { + title: String, + disabled: Boolean, + }, + + data: { + topRightRadius: false, + bottomRightRadius: false, + }, + + methods: { + setActive(selected) { + return this.setData({ selected }); + }, + onClick() { + const { parent } = this; + + if (!parent || this.properties.disabled) { + return; + } + + const index = parent.children.indexOf(this); + + parent.setActive(index).then(() => { + this.triggerEvent('click', index); + parent.triggerEvent('change', { index }); + }); + }, + setTopRightRadius(val) { + return this.setData({ + topRightRadius: val, + }); + }, + setBottomRightRadius(val) { + return this.setData({ + bottomRightRadius: val, + }); + }, + }, +}); diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.json b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxml b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxml new file mode 100644 index 0000000..435f1e9 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxml @@ -0,0 +1,10 @@ + + + {{ title }} + + diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxss b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxss new file mode 100644 index 0000000..28d50dc --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/c-sidebar-item/index.wxss @@ -0,0 +1,60 @@ +.c-sidebar-item { + display: flex; + justify-content: center; + text-align: center; + background-color: #f5f5f5; + color: #222427; + padding: 20rpx 0; + font-size: 26rpx; +} + +.c-sidebar-item.active { + position: relative; + background: white; +} + +.c-sidebar-item.active::before { + content: ''; + position: absolute; + width: 6rpx; + height: 48rpx; + background-color: #fa4126; + left: 0; + top: 50%; + transform: translate(0, -50%); + border-radius: 64rpx; +} + +.c-sidebar-item__text { + width: 136rpx; + height: 36rpx; + padding: 8rpx 0; + line-height: 36rpx; + text-align: center; + font-size: 28rpx; + color: #666666; +} + +.c-sidebar-item.active .c-sidebar-item__text { + background-color: white; + border-radius: 36rpx; + color: #fa4126; +} + +.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.top-right-radius { + border-top-right-radius: 16rpx; +} + +.bottom-right-radius { + border-bottom-right-radius: 16rpx; +} + +.c-sidebar-item-container { + background-color: white; +} diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/index.js b/pages/goods/category/components/goods-category/components/c-sidebar/index.js new file mode 100644 index 0000000..b057ad1 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/index.js @@ -0,0 +1,106 @@ +Component({ + relations: { + './c-sidebar-item/index': { + type: 'descendant', + linked(target) { + this.children.push(target); + this.setActive(this.properties.activeKey, true); + }, + unlinked(target) { + this.children = this.children.filter((item) => item !== target); + this.setActive(this.properties.activeKey, true); + }, + }, + }, + + externalClasses: ['custom-class'], + + properties: { + activeKey: { + type: Number, + value: 0, + }, + }, + observers: { + activeKey(newVal) { + this.setActive(newVal); + }, + }, + + created() { + this.children = []; + this.currentActive = -1; + this.topRightRadiusItemIndexs = []; + this.bottomRightRadiusItemIndexs = []; + }, + + methods: { + setActive(activeKey, isChildrenChange) { + const { + children, + currentActive, + topRightRadiusItemIndexs: preTopRightRadiusItemIndexs, + bottomRightRadiusItemIndexs: preBottomRightRadiusItemIndexs, + } = this; + + if (!children.length) { + return Promise.resolve(); + } + + if (activeKey === currentActive && !isChildrenChange) { + return Promise.resolve(); + } + + this.currentActive = activeKey; + this.topRightRadiusItemIndexs = this.getTopRightRadiusItemIndexs( + activeKey, + children, + ); + this.bottomRightRadiusItemIndexs = this.getBottomRightRadiusItemIndexs( + activeKey, + children, + ); + + const stack = []; // 任务列表,存放调用子组件的setActive后返回的一堆promise + + // 将旧的选中项改为false + if (currentActive !== activeKey && children[currentActive]) { + stack.push(children[currentActive].setActive(false)); + } + + // 将新的选中项改为true + if (children[activeKey]) { + stack.push(children[activeKey].setActive(true)); + } + + preTopRightRadiusItemIndexs.forEach((item) => { + stack.push(children[item].setTopRightRadius(false)); + }); + + preBottomRightRadiusItemIndexs.forEach((item) => { + stack.push(children[item].setBottomRightRadius(false)); + }); + + this.topRightRadiusItemIndexs.forEach((item) => { + stack.push(children[item].setTopRightRadius(true)); + }); + + this.bottomRightRadiusItemIndexs.forEach((item) => { + stack.push(children[item].setBottomRightRadius(true)); + }); + + return Promise.all(stack); + }, + getTopRightRadiusItemIndexs(activeKey, children) { + const { length } = children; + if (activeKey !== 0 && activeKey < length - 1) return [0, activeKey + 1]; + if (activeKey !== 0) return [0]; + if (activeKey < length - 1) return [activeKey + 1]; + return []; + }, + getBottomRightRadiusItemIndexs(activeKey) { + if (activeKey !== 0) return [activeKey - 1]; + return []; + }, + }, +}); diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/index.json b/pages/goods/category/components/goods-category/components/c-sidebar/index.json new file mode 100644 index 0000000..84ff738 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/index.json @@ -0,0 +1,4 @@ +{ + "component": true +} + \ No newline at end of file diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/index.wxml b/pages/goods/category/components/goods-category/components/c-sidebar/index.wxml new file mode 100644 index 0000000..a1fe026 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/index.wxml @@ -0,0 +1,3 @@ + + + diff --git a/pages/goods/category/components/goods-category/components/c-sidebar/index.wxss b/pages/goods/category/components/goods-category/components/c-sidebar/index.wxss new file mode 100644 index 0000000..95e59ff --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-sidebar/index.wxss @@ -0,0 +1,9 @@ +.c-sidebar { + width: 176rpx; + height: 100vh; +} +.c-sidebar::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; +} diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.js b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.js new file mode 100644 index 0000000..2b6f95d --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.js @@ -0,0 +1,37 @@ +Component({ + externalClasses: ['custom-class'], + + properties: { + tabList: Array, + }, + + data: { + unfolded: false, + boardMaxHeight: null, + }, + attached() { + wx.createSelectorQuery() + .in(this) + .select('.c-tabbar-more') + .boundingClientRect((rect) => { + this.setData({ boardMaxHeight: rect.height }); + }) + .exec(); + }, + + methods: { + changeFold() { + this.setData({ + unfolded: !this.data.unfolded, + }); + const { unfolded } = this.data; + this.triggerEvent('change', { unfolded }); + }, + + onSelect(event) { + const activeKey = event.currentTarget.dataset.index; + this.triggerEvent('select', activeKey); + this.changeFold(); + }, + }, +}); diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.json b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.json new file mode 100644 index 0000000..a89ef4d --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxml b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxml new file mode 100644 index 0000000..0ea9ad4 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxml @@ -0,0 +1,25 @@ + + + + + + + + + + {{ item.name }} + + + + + diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxss b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxss new file mode 100644 index 0000000..d0d08b3 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/c-tabbar-more/index.wxss @@ -0,0 +1,63 @@ +.c-tabbar-more { + width: 100%; + height: calc(100% - var(--tabbar-height, 100rpx)); + position: absolute; + top: var(--tabbar-height, 100rpx); +} +.c-tabbar-more__btn { + position: absolute; + top: calc(0rpx - var(--tabbar-height, 100rpx)); + right: 0; + width: 80rpx; + height: var(--tabbar-height, 100rpx); + line-height: var(--tabbar-height, 100rpx); + background-color: var(--tabbar-background-color, white); + box-shadow: -20rpx 0 20rpx -10rpx var(--tabbar-background-color, white); + text-align: center; +} +.c-tabbar-more__btn .market { + font-size: 20rpx; +} +.t-tabbar-more__boardwrapper { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.t-tabbar-more__mask { + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); +} +.c-tabbar-more__board { + position: absolute; + top: 0; + left: 0; + width: 100%; + max-height: 100%; +} +.c-tabbar-more__boardinner { + padding: 20rpx 0 20rpx 20rpx; + background-color: var(--tabbar-background-color, white); + display: flex; + flex-flow: row wrap; +} +.c-tabbar-more__item { + margin: 0 20rpx 20rpx 0; + flex: 0 0 calc((100% - 60rpx) / 3); + box-sizing: border-box; + padding: 0 10rpx; + border-radius: 30rpx; + height: 60rpx; + line-height: 60rpx; + text-align: center; + font-size: 22rpx; + color: #5d5d5d; + background-color: #eee; +} +.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/index.js b/pages/goods/category/components/goods-category/components/c-tabbar/index.js new file mode 100644 index 0000000..ddf6367 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/index.js @@ -0,0 +1,68 @@ +Component({ + externalClasses: ['custom-class'], + + properties: { + activeKey: { + type: Number, + value: 0, + }, + tabList: { + type: Array, + value: [], + }, + showMore: Boolean, // 是否需要下拉功能 + }, + observers: { + activeKey(newVal) { + if (this.properties.tabList && newVal) { + this.setActive(newVal).catch((e) => { + console.error(e); + }); + } + }, + }, + + data: { + currentActive: -1, + }, + attached() { + this.setActive(this.properties.activeKey).catch((e) => { + console.error(e); + }); + }, + + methods: { + setActive(activeKey) { + if ( + !this.properties.tabList[activeKey] || + this.properties.tabList[activeKey].disabled + ) { + return Promise.reject('数据异常或不可操作'); + } + return new Promise((resolve) => { + this.setData( + { + currentActive: activeKey, + }, + () => resolve(), + ); + }); + }, + onClick(event) { + let activeKey; + if (event.type === 'select') { + activeKey = event.detail; + } else { + activeKey = event.currentTarget.dataset.index; + } + this.setActive(activeKey) + .then(() => { + const { currentActive } = this.data; + this.triggerEvent('change', { index: currentActive }); + }) + .catch((e) => { + console.error(e); + }); + }, + }, +}); diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/index.json b/pages/goods/category/components/goods-category/components/c-tabbar/index.json new file mode 100644 index 0000000..644e632 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "c-tabbar-more": "./c-tabbar-more/index" + } +} \ No newline at end of file diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/index.wxml b/pages/goods/category/components/goods-category/components/c-tabbar/index.wxml new file mode 100644 index 0000000..1227f88 --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/index.wxml @@ -0,0 +1,29 @@ + + + + + {{ item.name }} + + + + + + diff --git a/pages/goods/category/components/goods-category/components/c-tabbar/index.wxss b/pages/goods/category/components/goods-category/components/c-tabbar/index.wxss new file mode 100644 index 0000000..d89475f --- /dev/null +++ b/pages/goods/category/components/goods-category/components/c-tabbar/index.wxss @@ -0,0 +1,53 @@ +.c-tabbar { + width: 100%; + height: 100%; + position: relative; + --tabbar-height: 100rpx; + --tabbar-fontsize: 28rpx; + --tabbar-background-color: white; +} +.c-tabbar__inner { + display: flex; + flex-flow: row nowrap; +} +.c-tabbar__scroll { + position: relative; +} +.c-tabbar__scroll::after { + content: ''; + display: block; + position: absolute; + width: 100%; + left: 0; + bottom: -1px; + height: 1px; + background-color: #eee; + z-index: 1; +} +.c-tabbar__inner.c-tabbar__inner_more::after { + content: ''; + display: block; + width: 100rpx; + height: 100rpx; + flex: none; +} +.c-tabbar-item { + flex: none; + height: 100rpx; + color: #282828; + font-size: 28rpx; + padding: 0 20rpx; +} +.c-tabbar-item.active:not(.disabled) { + color: #0071ce; + position: relative; +} +.c-tabbar-item.disabled { + color: #ccc; +} +.c-tabbar-item__text { + width: 100%; + text-align: center; + height: 100rpx; + line-height: 100rpx; +} diff --git a/pages/goods/category/components/goods-category/index.js b/pages/goods/category/components/goods-category/index.js new file mode 100644 index 0000000..f622901 --- /dev/null +++ b/pages/goods/category/components/goods-category/index.js @@ -0,0 +1,75 @@ +Component({ + externalClasses: ['custom-class'], + + properties: { + category: { + type: Array, + }, + initActive: { + type: Array, + value: [], + observer(newVal, oldVal) { + if (newVal[0] !== oldVal[0]) { + this.setActiveKey(newVal[0], 0); + } + }, + }, + isSlotRight: { + type: Boolean, + value: false, + }, + level: { + type: Number, + value: 3, + }, + }, + data: { + activeKey: 0, + subActiveKey: 0, + }, + attached() { + if (this.properties.initActive && this.properties.initActive.length > 0) { + this.setData({ + activeKey: this.properties.initActive[0], + subActiveKey: this.properties.initActive[1] || 0, + }); + } + }, + methods: { + onParentChange(event) { + this.setActiveKey(event.detail.index, 0).then(() => { + this.triggerEvent('change', [ + this.data.activeKey, + this.data.subActiveKey, + ]); + }); + }, + onChildChange(event) { + this.setActiveKey(this.data.activeKey, event.detail.index).then(() => { + this.triggerEvent('change', [ + this.data.activeKey, + this.data.subActiveKey, + ]); + }); + }, + changCategory(event) { + const { item } = event.currentTarget.dataset; + this.triggerEvent('changeCategory', { + item, + }); + }, + setActiveKey(key, subKey) { + return new Promise((resolve) => { + this.setData( + { + activeKey: key, + subActiveKey: subKey, + }, + () => { + resolve(); + }, + ); + }); + }, + }, +}); diff --git a/pages/goods/category/components/goods-category/index.json b/pages/goods/category/components/goods-category/index.json new file mode 100644 index 0000000..8ca3d3c --- /dev/null +++ b/pages/goods/category/components/goods-category/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "c-tabbar": "./components/c-tabbar/index", + "c-sidebar": "./components/c-sidebar/index", + "c-sidebar-item": "./components/c-sidebar/c-sidebar-item/index", + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/pages/goods/category/components/goods-category/index.wxml b/pages/goods/category/components/goods-category/index.wxml new file mode 100644 index 0000000..1b0b83f --- /dev/null +++ b/pages/goods/category/components/goods-category/index.wxml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + {{item.name}} + + + + + + {{subItem.name}} + + + + + + + + + + {{item.name}} + + + + + + + + + diff --git a/pages/goods/category/components/goods-category/index.wxss b/pages/goods/category/components/goods-category/index.wxss new file mode 100644 index 0000000..fbf4569 --- /dev/null +++ b/pages/goods/category/components/goods-category/index.wxss @@ -0,0 +1,102 @@ +.goods-category { + display: flex; +} + +.custom-sidebar { + height: 100%; +} + +.goods-category__right { + height: 100%; + flex: auto; + width: 0; + position: relative; + overflow: scroll; + -webkit-overflow-scrolling: touch; + background-color: white; +} + +.flex { + display: flex; +} + +.goods-category-normal { + margin: 28rpx 34rpx 0rpx 32rpx; +} + +.goods-category-normal-item-title { + font-size: 28rpx; + font-weight: 500; +} + +.goods-category-normal-item-container { + background-color: #fff; + border-radius: 8rpx; + padding-top: 28rpx; + margin-top: -24rpx; + margin-bottom: 30rpx; + display: flex; + flex-wrap: wrap; +} + +.goods-category-normal-item-container-item { + height: 196rpx; + display: flex; + flex-direction: column; + align-items: center; + margin-top: 24rpx; + width: 33.3%; +} + +.goods-category-normal-item-container-item .image { + width: 144rpx; + height: 144rpx; +} + +.goods-category-normal-item-container-item-title { + justify-content: center; + font-size: 24rpx; + color: #666666; + margin-top: 20rpx; +} + +.goods-category .custom-sidebar { + background-color: #f5f5f5; +} + +.custom-sidebar { + width: 180rpx; + height: 100vh; +} + +.custom-sidebar::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; +} + +.goods-category-normal-item-second-container { + background-color: #fff; + border-radius: 8rpx; + margin-top: 8rpx; + margin-bottom: 30rpx; + display: grid; + grid-template-columns: 33.33% 33.33% 33.33%; +} + +.goods-category-normal-item-second-container-item { + height: 200rpx; + text-align: center; + margin-top: 20rpx; +} + +.goods-category-normal-item-second-container-item .image { + width: 144rpx; + height: 144rpx; +} + +.goods-category-normal-item-second-container-item-title { + justify-content: center; + font-size: 24rpx; + color: #222427; +} diff --git a/pages/goods/category/data.js b/pages/goods/category/data.js new file mode 100644 index 0000000..e625226 --- /dev/null +++ b/pages/goods/category/data.js @@ -0,0 +1,135 @@ +export const fullList = [ + { + groupId: '24948', + name: '数码', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249481', + name: '手机', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '华为', + thumbnail: + 'https://bl-material-qa-1300977798.cos.ap-guangzhou.myqcloud.com/persist/10001/8888/88881027711/material/1/5e40f0e5e450477781b0e3f8bd5b2fd8-1586832328290-手机1.jpg', + }, + { + groupId: '249480', + name: '华为', + thumbnail: + 'https://bl-material-qa-1300977798.cos.ap-guangzhou.myqcloud.com/persist/10001/8888/88881027711/material/1/5e40f0e5e450477781b0e3f8bd5b2fd8-1586832328290-手机1.jpg', + }, + { + groupId: '249480', + name: '华为', + thumbnail: + 'https://bl-material-qa-1300977798.cos.ap-guangzhou.myqcloud.com/persist/10001/8888/88881027711/material/1/5e40f0e5e450477781b0e3f8bd5b2fd8-1586832328290-手机1.jpg', + }, + { + groupId: '249480', + name: '华为', + thumbnail: + 'https://bl-material-qa-1300977798.cos.ap-guangzhou.myqcloud.com/persist/10001/8888/88881027711/material/1/5e40f0e5e450477781b0e3f8bd5b2fd8-1586832328290-手机1.jpg', + }, + { + groupId: '249480', + name: '华为', + thumbnail: + 'https://bl-material-qa-1300977798.cos.ap-guangzhou.myqcloud.com/persist/10001/8888/88881027711/material/1/5e40f0e5e450477781b0e3f8bd5b2fd8-1586832328290-手机1.jpg', + }, + ], + }, + { + groupId: '249481', + name: '电视', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '华为', + thumbnail: + 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1135099865,3046620350&fm=26&gp=0.jpg', + }, + ], + }, + ], + }, + { + groupId: '24948', + name: '水果', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249481', + name: '热带水果', + thumbnail: + 'https://cdn-we-retail.ym.tencent.com/miniapp/category/category-default.png', + children: [ + { + groupId: '249480', + name: '菠萝', + thumbnail: + 'https://dss3.baidu.com/-rVXeDTa2gU2pMbgoY3K/it/u=322209122,2354607046&fm=202&mola=new&crop=v1', + }, + ], + }, + ], + }, +]; + +export const goodsList = [ + { + thumb: '/static/images/apple.jpg', + title: + '智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦,智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦', + price: '99.99', + originPrice: '9.99', + tags: [{ title: '热卖' }], + }, + { + thumb: '/static/images/apple.jpg', + title: + '智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦,智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦', + price: '99.99', + originPrice: '9.99', + tags: [{ title: '热卖' }], + }, + { + thumb: '/static/images/apple.jpg', + title: + '智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦,智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦', + price: '99.99', + originPrice: '9.99', + tags: [{ title: '热卖' }], + }, + { + thumb: '/static/images/apple.jpg', + title: + '智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦,智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦', + price: '99.99', + originPrice: '9.99', + tags: [{ title: '热卖' }], + }, + { + thumb: '/static/images/apple.jpg', + title: + '智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦,智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦', + price: '99.99', + originPrice: '9.99', + tags: [{ title: '热卖' }], + }, + { + thumb: '/static/images/apple.jpg', + title: + '智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦,智利 火龙果超级好吃,又大又甜 欢迎购买,限价五折优惠哦', + price: '99.99', + originPrice: '9.99', + tags: [{ title: '热卖' }], + }, +]; diff --git a/pages/goods/category/index.js b/pages/goods/category/index.js new file mode 100644 index 0000000..e8c56ac --- /dev/null +++ b/pages/goods/category/index.js @@ -0,0 +1,28 @@ +import { getCategoryList } from '../../../services/good/fetchCategoryList'; +Page({ + data: { + list: [], + }, + async init() { + try { + const result = await getCategoryList(); + this.setData({ + list: result, + }); + } catch (error) { + console.error('err:', error); + } + }, + + onShow() { + this.getTabBar().init(); + }, + onChange() { + wx.navigateTo({ + url: '/pages/goods/list/index', + }); + }, + onLoad() { + this.init(true); + }, +}); diff --git a/pages/goods/category/index.json b/pages/goods/category/index.json new file mode 100644 index 0000000..f989443 --- /dev/null +++ b/pages/goods/category/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "分类", + "usingComponents": { + "goods-category": "./components/goods-category/index" + } +} diff --git a/pages/goods/category/index.wxml b/pages/goods/category/index.wxml new file mode 100644 index 0000000..2d8cab1 --- /dev/null +++ b/pages/goods/category/index.wxml @@ -0,0 +1,8 @@ + + + diff --git a/pages/goods/category/index.wxss b/pages/goods/category/index.wxss new file mode 100644 index 0000000..ac2e0a7 --- /dev/null +++ b/pages/goods/category/index.wxss @@ -0,0 +1,23 @@ +.tabbar-position { + position: fixed !important; + bottom: 0; + left: 0; + width: 100%; +} + +.wrap { + height: 100vh; + overflow: hidden; +} +.goods-category-class { + background-color: #f6f6f6 !important; + height: 100%; +} +.goods-category-class .goods-category-normal-item-container-item { + margin-top: 20rpx; +} + +page { + min-height: none; + padding-bottom: 0; +} diff --git a/pages/goods/comments/components/comments-card/components/images-videos/assets/play.png b/pages/goods/comments/components/comments-card/components/images-videos/assets/play.png new file mode 100644 index 0000000000000000000000000000000000000000..d816ef7fd2ae06456b02f08708b3c9db94fbe48d GIT binary patch literal 1326 zcmV+}1=0G6P)&KvET1}FFj+7Uhd^`KX}~ba?$U1-|xNm{W%XQz{A6X#s@zSFArTD zH8CVoVkE^#cs!mI*@TA*gfKe5!-sKrct~ewXB3ae>E`B!uCK2%_f}L?P-SH$)z;Qh zb#*n>)zwi`Qxm=dkr>$^W0`=-@BkaFMWa#L+1a7n+gnS22Sh-kqoYHTIpz_yO2iTY zHaCct8J-OgSzKJi5nlN5 z7H_;tfQ@h9!{_z&bq&Tlf#Km{8X6i(^XV@p5zlvTUILH|YdbhIGecWjTjV5KT3Tpg zVgi#tucTfiAdSbI79r(lct$`>*wEzUWJ!&e zfDMo^W77;!TXMgu(4nX(3g9bZ0JIRgM*x10lcrqU{ z9uV#^bnjM(Wjr9F0Rv_U1>q`l4C6Ln14R@-kD-hKgMfJY4G0h14q;=)3(^BdG->zg z_w@9<9~c<;Kt)8h7v72M0YsE`FfuaovA@4RgmXToB9TaRc6RoJiU35w9Krfaetu3)LC%lO z&CRcNWQDw&ga>qJ%4yWp)c7zz=I7@>Q2`LDF($F)gj^+>o0|jO-Q7Ma3|bkv0J^Sg zR3JbgO(n#^!9k3r6u0_2)R_S6#A&VqXif)lmzS3b-l_lau9~C*fMOXV1p>*csw(BX zhu-PCGM{N?5LiKVAov*I0{#EhB&5(6fMxu=KOFWeXimZ09zrTMf z&!O|RwY5kn6k1hnJkZ$Kh(i*kMB=i>B}C1yp|y# zy)ZU5Ms5YPPgz}@C&3&lUcA00M@L7=ZNLJ9#z%IQI#)FMv#+l&EnMXapjRLo9zU|b zdqzOG=QpI}M2PVku;Zf9L66;_IRdDs{nDIYAPnHt)mYU`FMA}!uxz+(0%n-Vcu00yH+vj1Bcpa1{>07*qoM6N<$f+S8^r~m)} literal 0 HcmV?d00001 diff --git a/pages/goods/comments/components/comments-card/components/images-videos/index.js b/pages/goods/comments/components/comments-card/components/images-videos/index.js new file mode 100644 index 0000000..a0a3c48 --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/images-videos/index.js @@ -0,0 +1,36 @@ +// pages/goods/comments/components/comments-card/images-videos/index.js +Component({ + /** + * 组件的属性列表 + */ + properties: { + resources: { + type: Array, + value: [], + }, + }, + + /** + * 组件的初始数据 + */ + data: { + classType: 'single', + }, + + observers: { + resources: function (newVal) { + if (newVal.length <= 1) { + this.setData({ classType: 'single' }); + } else if (newVal.length === 2) { + this.setData({ classType: 'double' }); + } else { + this.setData({ classType: 'multiple' }); + } + }, + }, + + /** + * 组件的方法列表 + */ + methods: {}, +}); diff --git a/pages/goods/comments/components/comments-card/components/images-videos/index.json b/pages/goods/comments/components/comments-card/components/images-videos/index.json new file mode 100644 index 0000000..83597fd --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/images-videos/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "my-video": "../my-video/index", + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/pages/goods/comments/components/comments-card/components/images-videos/index.wxml b/pages/goods/comments/components/comments-card/components/images-videos/index.wxml new file mode 100644 index 0000000..2515909 --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/images-videos/index.wxml @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/pages/goods/comments/components/comments-card/components/images-videos/index.wxss b/pages/goods/comments/components/comments-card/components/images-videos/index.wxss new file mode 100644 index 0000000..e7944be --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/images-videos/index.wxss @@ -0,0 +1,68 @@ +.resource-item-single { + width: 360rpx; + height: 360rpx; + border-radius: 8rpx; +} + +.resource-item-double { + width: 334rpx; + height: 334rpx; + border-radius: 8rpx; +} + +.resource-item-multiple { + width: 218rpx; + height: 218rpx; + border-radius: 8rpx; +} + +.resource-container-single { + padding-left: 0; + padding-top: 0; +} + +.resource-container-double { + padding-left: 18rpx; + padding-top: 18rpx; +} + +.resource-container-multiple { + padding-left: 16rpx; + padding-top: 16rpx; +} + +.container-single { + margin-left: 0; +} + +.container-double { + margin-left: -18rpx; + margin-top: -18rpx; +} + +.container-multiple { + margin-left: -16rpx; + margin-top: -16rpx; +} + +.resource-container { + display: flex; +} + +.play-icon { + width: 96rpx; + height: 96rpx; +} + +.images-videos-container { + display: flex; + flex-wrap: wrap; +} + +.image { + border-radius: 8rpx; +} + +.cover-img-container { + background-color: white; +} diff --git a/pages/goods/comments/components/comments-card/components/my-video/index.js b/pages/goods/comments/components/comments-card/components/my-video/index.js new file mode 100644 index 0000000..987cf18 --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/my-video/index.js @@ -0,0 +1,55 @@ +Component({ + externalClasses: ['my-video', 'my-cover-img', 'my-play-icon'], + properties: { + videoSrc: { type: String }, + }, + data: { + isShow: true, + }, + + options: { + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + }, + + attached() { + this.videoContext = wx.createVideoContext('myVideo', this); + }, + + fullScreen: false, + + methods: { + // 点击封面自定义播放按钮时触发 + bindplay(e) { + this.setData({ + isShow: false, + }); + this.videoContext.play(); + this.triggerEvent('play', e); + }, + + bindplayByVideo(e) { + this.setData({ + isShow: false, + }); + this.triggerEvent('play', e); + }, + + // 监听播放到末尾时触发 + bindended(e) { + if (!this.fullScreen) { + this.setData({ + isShow: true, + }); + } + this.triggerEvent('ended', e); + }, + // 监听暂停播放时触发 + bindpause(e) { + this.triggerEvent('pause', e); + }, + bindfullscreenchange(e) { + const fullScreen = e?.detail?.fullScreen; + this.fullScreen = fullScreen; + }, + }, +}); diff --git a/pages/goods/comments/components/comments-card/components/my-video/index.json b/pages/goods/comments/components/comments-card/components/my-video/index.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/my-video/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/goods/comments/components/comments-card/components/my-video/index.wxml b/pages/goods/comments/components/comments-card/components/my-video/index.wxml new file mode 100644 index 0000000..af38919 --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/my-video/index.wxml @@ -0,0 +1,26 @@ + diff --git a/pages/goods/comments/components/comments-card/components/my-video/index.wxss b/pages/goods/comments/components/comments-card/components/my-video/index.wxss new file mode 100644 index 0000000..63b962b --- /dev/null +++ b/pages/goods/comments/components/comments-card/components/my-video/index.wxss @@ -0,0 +1,21 @@ +.video .video_cover { + width: 100%; + height: 100%; + position: relative; +} + +.video .video_play_icon { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + z-index: 5; +} + +.video .video_txt { + margin: 10rpx auto; +} + +.video { + display: flex; +} diff --git a/pages/goods/comments/components/comments-card/index.js b/pages/goods/comments/components/comments-card/index.js new file mode 100644 index 0000000..53f6103 --- /dev/null +++ b/pages/goods/comments/components/comments-card/index.js @@ -0,0 +1,51 @@ +Component({ + externalClasses: ['wr-class'], + options: { + multipleSlots: true, + }, + properties: { + goodsDetailInfo: { + type: String, + value: '', + }, + sellerReply: { + type: String, + value: '', + }, + userHeadUrl: { + type: String, + value: '', + }, + userName: { + type: String, + default: '', + }, + commentContent: { + type: String, + value: '', + }, + commentScore: { + type: Number, + value: 0, + }, + commentTime: { + type: String, + value: '', + }, + commentResources: { + type: Array, + value: [], + }, + }, + + data: { + showMoreStatus: false, + showContent: false, + hideText: false, + eleHeight: null, + overText: false, + isDisabled: true, + startColors: ['#FFC51C', '#DDDDDD'], + }, + methods: {}, +}); diff --git a/pages/goods/comments/components/comments-card/index.json b/pages/goods/comments/components/comments-card/index.json new file mode 100644 index 0000000..1130655 --- /dev/null +++ b/pages/goods/comments/components/comments-card/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "t-rate": "tdesign-miniprogram/rate/rate", + "images-videos": "./components/images-videos", + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/pages/goods/comments/components/comments-card/index.wxml b/pages/goods/comments/components/comments-card/index.wxml new file mode 100644 index 0000000..a376cb2 --- /dev/null +++ b/pages/goods/comments/components/comments-card/index.wxml @@ -0,0 +1,34 @@ + + + + + + + {{userName}} + {{commentTime}} + + + + {{goodsDetailInfo}} + + + + + + + + + 店家回复: + {{sellerReply}} + + + + diff --git a/pages/goods/comments/components/comments-card/index.wxss b/pages/goods/comments/components/comments-card/index.wxss new file mode 100644 index 0000000..30b4186 --- /dev/null +++ b/pages/goods/comments/components/comments-card/index.wxss @@ -0,0 +1,170 @@ +@import '../../../../../style/theme.wxss'; + +.comments-card-item { + padding: 32rpx; + display: flex; + background-color: #fff; + position: relative; +} + +.comments-card-item::after { + content: ''; + position: absolute; + bottom: 0rpx; + width: 686rpx; + height: 2rpx; + background-color: #f5f5f5; +} + +.comments-card-item-userImg { + display: flex; +} + +.comments-card-item-userImg .userImg { + width: 64rpx; + height: 64rpx; + border-radius: 50%; +} + +.comments-card-item-container { + width: 100%; +} + +.comments-card-item-container-name { + display: flex; + font-size: 28rpx; + color: #333; + font-weight: 600; + align-items: center; +} + +.comments-card-item-container-name .userName { + margin-right: 12rpx; +} + +.comments-card-item-container-date { + font-size: 22rpx; + color: #999; + margin-top: 4rpx; + display: flex; +} + +.comments-card-item-container-content { + margin-top: 16rpx; + position: relative; +} + +.comments-card-item-container-content .content-text { + font-size: 28rpx; + white-space: normal; + word-break: break-all; + font-weight: normal; +} + +.comments-card-item-container-content .hide-text { + overflow: hidden; + text-overflow: ellipsis; + -webkit-line-clamp: 5; + text-align: justify; + display: -webkit-box; + -webkit-box-orient: vertical; +} + +.comments-card-item-container-content .showMore { + position: absolute; + width: 112rpx; + height: 36rpx; + bottom: 0; + right: 0; + background: linear-gradient( + to right, + rgba(255, 255, 255, 0.2) 0, + rgba(255, 255, 255, 0.45) 20%, + rgba(255, 255, 255, 0.7) 25%, + rgba(255, 255, 255, 0.9) 30%, + rgba(255, 255, 255, 0.95) 35%, + #ffffff 50%, + #fff 100% + ); + font-size: 26rpx; + color: #fa550f; + line-height: 36rpx; + text-align: right; +} + +.comments-card-item-container-image { + margin-top: 24rpx; + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.comments-card-item-container-image .commentImg { + border-radius: 8rpx; + margin-top: 12rpx; +} + +.comments-card-item-container-image .commentImg3 { + width: 196rpx; + height: 196rpx; +} + +.comments-card-item-container-image .commentImg2 { + width: 300rpx; + height: 300rpx; +} + +.comments-card-item-container-image .commentImg1 { + width: 404rpx; + height: 404rpx; +} + +.comments-card-item-container .comments-title { + display: flex; + align-items: center; + position: relative; +} + +.comments-title .userName { + font-size: 26rpx; + color: #333333; + margin-left: 24rpx; +} + +.comments-title .commentTime { + font-size: 24rpx; + color: #999999; + position: absolute; + right: 0; +} + +.comments-info { + display: flex; + margin-top: 18rpx; +} + +.comments-info .rate { + margin-right: 24rpx; +} + +.comments-info .goods-info-text { + font-size: 24rpx; + color: #999999; +} + +.comments-card-item-container .comments-card-reply { + background-color: #f5f5f5; + padding: 24rpx 16rpx; + margin-top: 24rpx; +} + +.comments-card-item-container .comments-card-reply .prefix { + font-size: 26rpx; + font-weight: bold; + color: #666666; +} + +.comments-card-item-container .comments-card-reply .content { + font-size: 26rpx; + color: #666666; +} diff --git a/pages/goods/comments/create/index.js b/pages/goods/comments/create/index.js new file mode 100644 index 0000000..be6d788 --- /dev/null +++ b/pages/goods/comments/create/index.js @@ -0,0 +1,92 @@ +// import { getCommentDetail } from '../../../../services/good/comments/fetchCommentDetail'; +import Toast from 'tdesign-miniprogram/toast/index'; +Page({ + data: { + serviceRateValue: 1, + goodRateValue: 1, + conveyRateValue: 1, + isAnonymous: false, + uploadFiles: [], + gridConfig: { + width: 218, + height: 218, + column: 3, + }, + isAllowedSubmit: false, + imgUrl: '', + title: '', + goodsDetail: '', + imageProps: { + mode: 'aspectFit', + }, + }, + + onLoad(options) { + this.setData({ + imgUrl: options.imgUrl, + title: options.title, + goodsDetail: options.specs, + }); + }, + + onRateChange(e) { + const { value } = e?.detail; + const item = e?.currentTarget?.dataset?.item; + this.setData({ [item]: value }, () => { + this.updateButtonStatus(); + }); + }, + + onAnonymousChange(e) { + const status = !!e?.detail?.checked; + this.setData({ isAnonymous: status }); + }, + + handleSuccess(e) { + const { files } = e.detail; + + this.setData({ + uploadFiles: files, + }); + }, + + handleRemove(e) { + const { index } = e.detail; + const { uploadFiles } = this.data; + uploadFiles.splice(index, 1); + this.setData({ + uploadFiles, + }); + }, + + onTextAreaChange(e) { + const value = e?.detail?.value; + this.textAreaValue = value; + this.updateButtonStatus(); + }, + + updateButtonStatus() { + const { + serviceRateValue, + goodRateValue, + conveyRateValue, + isAllowedSubmit, + } = this.data; + const { textAreaValue } = this; + const temp = + serviceRateValue && goodRateValue && conveyRateValue && textAreaValue; + if (temp !== isAllowedSubmit) this.setData({ isAllowedSubmit: temp }); + }, + + onSubmitBtnClick() { + const { isAllowedSubmit } = this.data; + if (!isAllowedSubmit) return; + Toast({ + context: this, + selector: '#t-toast', + message: '评价提交成功', + icon: 'check-circle', + }); + wx.navigateBack(); + }, +}); diff --git a/pages/goods/comments/create/index.json b/pages/goods/comments/create/index.json new file mode 100644 index 0000000..7c6d3eb --- /dev/null +++ b/pages/goods/comments/create/index.json @@ -0,0 +1,13 @@ +{ + "navigationBarTitleText": "评价商品", + "usingComponents": { + "t-image": "/components/webp-image/index", + "t-rate": "tdesign-miniprogram/rate/rate", + "t-textarea": "tdesign-miniprogram/textarea/textarea", + "t-checkbox": "tdesign-miniprogram/checkbox/checkbox", + "t-button": "tdesign-miniprogram/button/button", + "t-upload": "tdesign-miniprogram/upload/upload", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-toast": "tdesign-miniprogram/toast/toast" + } +} \ No newline at end of file diff --git a/pages/goods/comments/create/index.wxml b/pages/goods/comments/create/index.wxml new file mode 100644 index 0000000..254812d --- /dev/null +++ b/pages/goods/comments/create/index.wxml @@ -0,0 +1,85 @@ + + + + + + + + {{title}} + {{goodsDetail}} + + + + 商品评价 + + + + + + + + + + 添加图片/视频 + + + + + + + 匿名评价 + + + + + 物流服务评价 + + 物流评价 + + + + 服务评价 + + + + + + + + diff --git a/pages/goods/comments/create/index.wxss b/pages/goods/comments/create/index.wxss new file mode 100644 index 0000000..a63ef2e --- /dev/null +++ b/pages/goods/comments/create/index.wxss @@ -0,0 +1,171 @@ +page { + background-color: #f5f5f5; +} + +.page-container .comment-card { + padding: 24rpx 32rpx 28rpx; + background-color: #ffffff; +} + +.comment-card .goods-info-container .goods-image { + width: 112rpx; + height: 112rpx; + border-radius: 8rpx; +} + +.comment-card .goods-info-container { + display: flex; +} + +.comment-card .goods-info-container .goods-title-container { + padding-left: 24rpx; +} + +.comment-card .goods-info-container .goods-title { + font-size: 28rpx; + font-weight: normal; + margin-top: 12rpx; +} + +.comment-card .goods-info-container .goods-detail { + font-size: 24rpx; + font-weight: normal; + color: #999999; + margin-top: 16rpx; +} + +.comment-card .rate-container { + display: flex; + align-items: center; + margin-top: 22rpx; +} + +.comment-card .rate-container .rate-title { + font-size: 28rpx; + font-weight: bold; +} + +.comment-card .rate-container .rate { + margin-left: 22rpx; +} + +.comment-card .textarea-container { + margin-top: 22rpx; +} + +.comment-card .textarea-container .textarea { + background-color: #f5f5f5; + border-radius: 16rpx; + font-size: 28rpx; + font-weight: normal; +} + +.page-container .t-checkbox__bordered { + display: none; +} + +.page-container .anonymous-box { + display: flex; + align-items: center; + padding-top: 52rpx; +} + +.page-container .anonymous-box .name { + font-size: 28rpx; + font-weight: normal; + color: #999999; + padding-left: 28rpx; +} + +.page-container .t-checkbox { + padding: 0rpx !important; +} + +.page-container .t-checkbox__content { + display: none; +} + +.comment-card .convey-comment-title { + font-size: 28rpx; + font-weight: bold; +} + +.convey-card { + background-color: #ffffff; + margin-top: 24rpx; + padding: 32rpx; + padding-bottom: calc(env(safe-area-inset-bottom) + 140rpx); +} + +.convey-card .rate-container .rate-title { + font-weight: normal; +} + +.page-container .t-checkbox__icon-left { + margin-right: 0rpx !important; +} + +.submit-button-container { + padding: 12rpx 0rpx; + display: flex; + width: 100vw; + justify-content: center; + position: fixed; + bottom: 0; + padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); + background-color: #ffffff; + z-index: 99; +} + +.submit-button-container .submit-button { + background-color: #fa4126; + border: 0; + border-radius: 48rpx; + width: 686rpx; + height: 88rpx; +} + +.submit-button-container .submit-button-disabled { + background-color: rgba(0, 0, 0, 0.4); + border: 0; + border-radius: 48rpx; + width: 686rpx; + height: 88rpx; +} + +.page-container .upload-container { + margin-top: 24rpx; +} + +.page-container .t-upload__wrapper { + border-radius: 8rpx; + overflow: hidden; +} + +.page-container .submmit-bar { + position: fixed; + left: 0; + right: 0; + bottom: 0; + z-index: 12; + padding: 12rpx 32rpx; + padding-bottom: env(safe-area-inset-bottom); + background-color: #fff; + height: 112rpx; +} + +.page-container .submmit-bar-button { + border-radius: 48rpx !important; + padding: 0 !important; +} + +.page-container .t-upload__close-btn { + background-color: rgba(0, 0, 0, 0.4); + border-bottom-left-radius: 8rpx; + width: 36rpx; + height: 36rpx; +} + +.upload-container .upload-addcontent-slot { + font-size: 26rpx; +} diff --git a/pages/goods/comments/index.js b/pages/goods/comments/index.js new file mode 100644 index 0000000..ef3b361 --- /dev/null +++ b/pages/goods/comments/index.js @@ -0,0 +1,227 @@ +import { fetchComments } from '../../../services/comments/fetchComments'; +import { fetchCommentsCount } from '../../../services/comments/fetchCommentsCount'; +import dayjs from 'dayjs'; +const layoutMap = { + 0: 'vertical', +}; +Page({ + data: { + pageLoading: false, + commentList: [], + pageNum: 1, + myPageNum: 1, + pageSize: 10, + total: 0, + myTotal: 0, + hasLoaded: false, + layoutText: layoutMap[0], + loadMoreStatus: 0, + myLoadStatus: 0, + spuId: '1060004', + commentLevel: '', + hasImage: '', + commentType: '', + totalCount: 0, + countObj: { + badCount: '0', + commentCount: '0', + goodCount: '0', + middleCount: '0', + hasImageCount: '0', + uidCount: '0', + }, + }, + onLoad(options) { + this.getCount(options); + this.getComments(options); + }, + async getCount(options) { + try { + const result = await fetchCommentsCount( + { + spuId: options.spuId, + }, + { + method: 'POST', + }, + ); + this.setData({ + countObj: result, + }); + // const { data, code = '' } = result; + // if (code.toUpperCase() === 'SUCCESS') { + // wx.setNavigationBarTitle({ + // title: `全部评价(${data.commentCount})`, + // }); + // this.setData({ + // countObj: data, + // }); + // } else { + // wx.showToast({ + // title: '查询失败,请稍候重试', + // }); + // } + } catch (error) {} + }, + generalQueryData(reset) { + const { hasImage, pageNum, pageSize, spuId, commentLevel } = this.data; + const params = { + pageNum: 1, + pageSize: 30, + queryParameter: { + spuId, + }, + }; + if ( + Number(commentLevel) === 3 || + Number(commentLevel) === 2 || + Number(commentLevel) === 1 + ) { + params.queryParameter.commentLevel = Number(commentLevel); + } + if (hasImage && hasImage === '1') { + params.queryParameter.hasImage = true; + } else { + delete params.queryParameter.hasImage; + } + // 重置请求 + if (reset) return params; + + return { + ...params, + pageNum: pageNum + 1, + pageSize, + }; + }, + async init(reset = true) { + const { loadMoreStatus, commentList = [] } = this.data; + const params = this.generalQueryData(reset); + + // 在加载中或者无更多数据,直接返回 + if (loadMoreStatus !== 0) return; + + this.setData({ + loadMoreStatus: 1, + }); + + try { + const data = await fetchComments(params, { + method: 'POST', + }); + const code = 'SUCCESS'; + if (code.toUpperCase() === 'SUCCESS') { + const { pageList, totalCount = 0 } = data; + pageList.forEach((item) => { + // eslint-disable-next-line no-param-reassign + item.commentTime = dayjs(Number(item.commentTime)).format( + 'YYYY/MM/DD HH:mm', + ); + }); + + if (Number(totalCount) === 0 && reset) { + this.setData({ + commentList: [], + hasLoaded: true, + total: totalCount, + loadMoreStatus: 2, + }); + return; + } + const _commentList = reset ? pageList : commentList.concat(pageList); + const _loadMoreStatus = + _commentList.length === Number(totalCount) ? 2 : 0; + this.setData({ + commentList: _commentList, + pageNum: params.pageNum || 1, + totalCount: Number(totalCount), + loadMoreStatus: _loadMoreStatus, + }); + } else { + wx.showToast({ + title: '查询失败,请稍候重试', + }); + } + } catch (error) {} + this.setData({ + hasLoaded: true, + }); + }, + getScoreArray(score) { + var array = []; + for (let i = 0; i < 5; i++) { + if (i < score) { + array.push(2); + } else { + array.push(0); + } + } + return array; + }, + getComments(options) { + const { commentLevel = -1, spuId, hasImage = '' } = options; + if (commentLevel !== -1) { + this.setData({ + commentLevel: commentLevel, + }); + } + this.setData({ + hasImage: hasImage, + commentType: hasImage ? '4' : '', + spuId: spuId, + }); + this.init(true); + }, + changeTag(e) { + var { commenttype } = e.currentTarget.dataset; + var { commentType } = this.data; + if (commentType === commenttype) return; + this.setData({ + loadMoreStatus: 0, + commentList: [], + total: 0, + myTotal: 0, + myPageNum: 1, + pageNum: 1, + }); + if (commenttype === '' || commenttype === '5') { + this.setData({ + hasImage: '', + commentLevel: '', + }); + } else if (commenttype === '4') { + this.setData({ + hasImage: '1', + commentLevel: '', + }); + } else { + this.setData({ + hasImage: '', + commentLevel: commenttype, + }); + } + if (commenttype === '5') { + this.setData({ + myLoadStatus: 1, + commentType: commenttype, + }); + this.getMyCommentsList(); + } else { + this.setData({ + myLoadStatus: 0, + commentType: commenttype, + }); + this.init(true); + } + }, + onReachBottom() { + const { total = 0, commentList } = this.data; + if (commentList.length === total) { + this.setData({ + loadMoreStatus: 2, + }); + return; + } + + this.init(false); + }, +}); diff --git a/pages/goods/comments/index.json b/pages/goods/comments/index.json new file mode 100644 index 0000000..a6418c9 --- /dev/null +++ b/pages/goods/comments/index.json @@ -0,0 +1,8 @@ +{ + "navigationBarTitleText": "全部评价", + "usingComponents": { + "t-tag": "tdesign-miniprogram/tag/tag", + "comments-card": "./components/comments-card/index", + "t-load-more": "/components/load-more/index" + } +} diff --git a/pages/goods/comments/index.wxml b/pages/goods/comments/index.wxml new file mode 100644 index 0000000..89d2b0f --- /dev/null +++ b/pages/goods/comments/index.wxml @@ -0,0 +1,50 @@ + + + 全部({{countObj.commentCount}}) + + + 自己({{countObj.uidCount}}) + + + 带图({{countObj.hasImageCount}}) + + + 好评({{countObj.goodCount}}) + + + 中评({{countObj.middleCount}}) + + + 差评({{countObj.badCount}}) + + + + + + + + + diff --git a/pages/goods/comments/index.wxss b/pages/goods/comments/index.wxss new file mode 100644 index 0000000..b98f36b --- /dev/null +++ b/pages/goods/comments/index.wxss @@ -0,0 +1,49 @@ +/* 层级定义 +@z-index-0: 1; +@z-index-1: 100; +@z-index-2: 200; +@z-index-5: 500; +@z-index-component: 1000; // 通用组件级别 +@z-index-dropdown: @z-index-component; +@z-index-sticky: @z-index-component + 20; +@z-index-fixed: @z-index-component + 30; +@z-index-modal-backdrop:@z-index-component + 40; +@z-index-modal:@z-index-component + 50; +@z-index-popover:@z-index-component + 60; +@z-index-tooltip:@z-index-component + 70; +*/ +/* var() css变量适配*/ +page { + background-color: #FFFFFF; +} + +.comments-header { + display: flex; + flex-wrap: wrap; + padding: 32rpx 32rpx 0rpx; + background-color: #fff; + margin-top: -24rpx; + margin-left: -24rpx; +} + +.comments-header-tag { + margin-top: 24rpx; + margin-left: 24rpx; + height: 56rpx !important; + font-size: 24rpx !important; + justify-content: center; + background-color: #F5F5F5 !important; + border-radius: 8rpx !important; + border: 1px solid #F5F5F5 !important; +} + +.comments-header-active { + background-color: #FFECE9 !important; + color: #FA4126 !important; + border: 1px solid #FA4126 !important; +} + +.no-more { + padding-left: 20rpx; + padding-right: 20rpx; +} \ No newline at end of file diff --git a/pages/goods/details/components/buy-bar/index.js b/pages/goods/details/components/buy-bar/index.js new file mode 100644 index 0000000..ae274e2 --- /dev/null +++ b/pages/goods/details/components/buy-bar/index.js @@ -0,0 +1,66 @@ +Component({ + externalClasses: ['wr-sold-out', 'wr-class'], + + options: { multipleSlots: true }, + + properties: { + soldout: { + // 商品是否下架 + type: Boolean, + value: false, + }, + jumpArray: { + type: Array, + value: [], + }, + isStock: { + type: Boolean, + value: true, + }, // 是否有库存 + isSlotButton: { + type: Boolean, + value: false, + }, // 是否开启按钮插槽 + shopCartNum: { + type: Number, // 购物车气泡数量 + }, + buttonType: { + type: Number, + value: 0, + }, + minDiscountPrice: { + type: String, + value: '', + }, + minSalePrice: { + type: String, + value: '', + }, + }, + + data: { + fillPrice: false, + }, + + methods: { + toAddCart() { + const { isStock } = this.properties; + if (!isStock) return; + this.triggerEvent('toAddCart'); + }, + + toBuyNow(e) { + const { isStock } = this.properties; + if (!isStock) return; + this.triggerEvent('toBuyNow', e); + }, + + toNav(e) { + const { url } = e.currentTarget.dataset; + return this.triggerEvent('toNav', { + e, + url, + }); + }, + }, +}); diff --git a/pages/goods/details/components/buy-bar/index.json b/pages/goods/details/components/buy-bar/index.json new file mode 100644 index 0000000..7464ae6 --- /dev/null +++ b/pages/goods/details/components/buy-bar/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/goods/details/components/buy-bar/index.wxml b/pages/goods/details/components/buy-bar/index.wxml new file mode 100644 index 0000000..604afb4 --- /dev/null +++ b/pages/goods/details/components/buy-bar/index.wxml @@ -0,0 +1,38 @@ + + {{soldout ? '商品已下架' : '商品已售馨'}} + + + + + + + {{shopCartNum > 99 ? '99+' : shopCartNum}} + + + {{item.title}} + + + + + + + 加入购物车 + + + 立即购买 + + + + + + + + diff --git a/pages/goods/details/components/buy-bar/index.wxss b/pages/goods/details/components/buy-bar/index.wxss new file mode 100644 index 0000000..44e8ad0 --- /dev/null +++ b/pages/goods/details/components/buy-bar/index.wxss @@ -0,0 +1,107 @@ +.footer-cont { + background-color: #fff; + padding: 16rpx; +} + +.icon-warp { + width: 110rpx; + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} + +.operate-wrap { + position: relative; +} + +.bottom-operate-left { + width: 100%; +} + +.bottom-operate-left .icon-warp { + width: 50%; +} + +.tag-cart-num { + display: inline-block; + position: absolute; + left: 50rpx; + right: auto; + top: 6rpx; + color: #fff; + line-height: 24rpx; + text-align: center; + z-index: 99; + white-space: nowrap; + min-width: 28rpx; + border-radius: 14rpx; + background-color: #fa550f !important; + font-size: 20rpx; + font-weight: 400; + padding: 2rpx 6rpx; +} + +.operate-text { + color: #666; + font-size: 20rpx; +} + +.soldout { + height: 80rpx; + background: rgba(170, 170, 170, 1); + width: 100%; + color: #fff; +} + +.addCart-disabled, +.bar-addCart-disabled { + background: rgba(221, 221, 221, 1) !important; + color: #fff !important; + font-size: 28rpx; +} + +.buyNow-disabled, +.bar-buyNow-disabled { + background: rgba(198, 198, 198, 1) !important; + color: #fff !important; + font-size: 28rpx; +} + +.bar-separately, +.bar-buy { + width: 254rpx; + height: 80rpx; + color: #fff; + display: flex; + align-items: center; + justify-content: center; +} + +.bar-separately { + background: #ffece9; + color: #fa4126; + border-radius: 40rpx 0 0 40rpx; +} + +.bar-buy { + background-color: #fa4126; + border-radius: 0rpx 40rpx 40rpx 0rpx; +} + +.flex { + display: flex; + display: -webkit-flex; +} + +.flex-center { + justify-content: center; + -webkit-justify-content: center; + align-items: center; + -webkit-align-items: center; +} + +.flex-between { + justify-content: space-between; + -webkit-justify-content: space-between; +} diff --git a/pages/goods/details/components/goods-specs-popup/index.js b/pages/goods/details/components/goods-specs-popup/index.js new file mode 100644 index 0000000..d6a4f74 --- /dev/null +++ b/pages/goods/details/components/goods-specs-popup/index.js @@ -0,0 +1,389 @@ +/* eslint-disable no-param-reassign */ +/* eslint-disable no-nested-ternary */ +import Toast from 'tdesign-miniprogram/toast/index'; + +Component({ + options: { + multipleSlots: true, + addGlobalClass: true, + }, + + properties: { + src: { + type: String, + }, + title: String, + show: { + type: Boolean, + value: false, + }, + limitBuyInfo: { + type: String, + value: '', + }, + isStock: { + type: Boolean, + value: true, + }, + limitMaxCount: { + type: Number, + value: 999, + }, + limitMinCount: { + type: Number, + value: 1, + }, + skuList: { + type: Array, + value: [], + observer(skuList) { + if (skuList && skuList.length > 0) { + if (this.initStatus) { + this.initData(); + } + } + }, + }, + specList: { + type: Array, + value: [], + observer(specList) { + if (specList && specList.length > 0) { + this.initData(); + } + }, + }, + outOperateStatus: { + type: Boolean, + value: false, + }, + hasAuth: { + type: Boolean, + value: false, + }, + count: { + type: Number, + value: 1, + observer(count) { + this.setData({ + buyNum: count, + }); + }, + }, + }, + + initStatus: false, + selectedSku: {}, + selectSpecObj: {}, + + data: { + buyNum: 1, + isAllSelectedSku: false, + }, + + methods: { + initData() { + const { skuList } = this.properties; + const { specList } = this.properties; + specList.forEach((item) => { + if (item.specValueList.length > 0) { + item.specValueList.forEach((subItem) => { + const obj = this.checkSkuStockQuantity( + subItem.specValueId, + skuList, + ); + subItem.hasStockObj = obj; + }); + } + }); + const selectedSku = {}; + specList.forEach((item) => { + selectedSku[item.specId] = ''; + }); + this.setData({ + specList, + }); + this.selectSpecObj = {}; + this.selectedSku = {}; + this.initStatus = true; + }, + + checkSkuStockQuantity(specValueId, skuList) { + let hasStock = false; + const array = []; + skuList.forEach((item) => { + (item.specInfo || []).forEach((subItem) => { + if (subItem.specValueId === specValueId && item.quantity > 0) { + const subArray = []; + (item.specInfo || []).forEach((specItem) => { + subArray.push(specItem.specValueId); + }); + array.push(subArray); + hasStock = true; + } + }); + }); + return { + hasStock, + specsArray: array, + }; + }, + + chooseSpecValueId(specValueId, specId) { + const { selectSpecObj } = this; + const { skuList, specList } = this.properties; + if (selectSpecObj[specId]) { + selectSpecObj[specId] = []; + this.selectSpecObj = selectSpecObj; + } else { + selectSpecObj[specId] = []; + } + + const itemAllSpecArray = []; + const itemUnSelectArray = []; + const itemSelectArray = []; + specList.forEach((item) => { + if (item.specId === specId) { + const subSpecValueItem = item.specValueList.find( + (subItem) => subItem.specValueId === specValueId, + ); + let specSelectStatus = false; + item.specValueList.forEach((n) => { + itemAllSpecArray.push(n.hasStockObj.specsArray); + if (n.isChoosed) { + specSelectStatus = true; + } + if (n.hasStockObj.hasStock) { + itemSelectArray.push(n.specValueId); + } else { + itemUnSelectArray.push(n.specValueId); + } + }); + if (specSelectStatus) { + selectSpecObj[specId] = this.flatten( + subSpecValueItem?.hasStockObj.specsArray.concat(itemSelectArray), + ); + } else { + const subSet = function (arr1, arr2) { + const set2 = new Set(arr2); + const subset = []; + arr1.forEach((val) => { + if (!set2.has(val)) { + subset.push(val); + } + }); + return subset; + }; + selectSpecObj[specId] = subSet( + this.flatten(itemAllSpecArray), + this.flatten(itemUnSelectArray), + ); + } + } else { + // 未点击规格的逻辑 + const itemSelectArray = []; + let specSelectStatus = false; + item.specValueList.map( + // 找到有库存的规格数组 + (n) => { + itemSelectArray.push(n.hasStockObj.specsArray); + if (n.isChoosed) { + specSelectStatus = true; + } + n.hasStockObj.hasStock = true; + return n; + }, + ); + if (specSelectStatus) { + selectSpecObj[item.specId] = this.flatten(itemSelectArray); + } else { + delete selectSpecObj[item.specId]; + } + } + this.selectSpecObj = selectSpecObj; + }); + const combatArray = Object.values(selectSpecObj); + if (combatArray.length > 0) { + const showArray = combatArray.reduce((x, y) => + this.getIntersection(x, y), + ); + const lastResult = Array.from(new Set(showArray)); + specList.forEach((item) => { + item.specValueList.forEach((subItem) => { + if (lastResult.includes(subItem.specValueId)) { + subItem.hasStockObj.hasStock = true; + } else { + subItem.hasStockObj.hasStock = false; + } + }); + }); + } else { + specList.forEach((item) => { + if (item.specValueList.length > 0) { + item.specValueList.forEach((subItem) => { + const obj = this.checkSkuStockQuantity( + subItem.specValueId, + skuList, + ); + subItem.hasStockObj = obj; + }); + } + }); + } + this.setData({ + specList, + }); + }, + + flatten(input) { + const stack = [...input]; + const res = []; + while (stack.length) { + const next = stack.pop(); + if (Array.isArray(next)) { + stack.push(...next); + } else { + res.push(next); + } + } + return res.reverse(); + }, + + getIntersection(array, nextArray) { + return array.filter((item) => nextArray.includes(item)); + }, + + toChooseItem(e) { + const { isStock } = this.properties; + if (!isStock) return; + const { id } = e.currentTarget.dataset; + const specId = e.currentTarget.dataset.specid; + const hasStock = e.currentTarget.dataset.hasstock; + if (!hasStock) { + Toast({ + context: this, + selector: '#t-toast', + message: '该规格已售罄', + icon: '', + duration: 1000, + }); + return; + } + + let { selectedSku } = this; + const { specList } = this.properties; + selectedSku = + selectedSku[specId] === id + ? { ...this.selectedSku, [specId]: '' } + : { ...this.selectedSku, [specId]: id }; + specList.forEach((item) => { + item.specValueList.forEach((valuesItem) => { + if (item.specId === specId) { + valuesItem.isChoosed = + valuesItem.specValueId === selectedSku[specId]; + } + }); + }); + this.chooseSpecValueId(id, specId); + const isAllSelectedSku = this.isAllSelected(specList, selectedSku); + if (!isAllSelectedSku) { + this.setData({ + selectSkuSellsPrice: 0, + selectSkuImg: '', + }); + } + this.setData({ + specList, + isAllSelectedSku, + }); + this.selectedSku = selectedSku; + this.triggerEvent('change', { + specList, + selectedSku, + isAllSelectedSku, + }); + }, + + // 判断是否所有的sku都已经选中 + isAllSelected(skuTree, selectedSku) { + const selected = Object.keys(selectedSku).filter( + (skuKeyStr) => selectedSku[skuKeyStr] !== '', + ); + return skuTree.length === selected.length; + }, + + handlePopupHide() { + this.triggerEvent('closeSpecsPopup', { + show: false, + }); + }, + + specsConfirm() { + const { isStock } = this.properties; + if (!isStock) return; + this.triggerEvent('specsConfirm'); + }, + + addCart() { + const { isStock } = this.properties; + if (!isStock) return; + this.triggerEvent('addCart'); + }, + + buyNow() { + const { isAllSelectedSku } = this.data; + const { isStock } = this.properties; + if (!isStock) return; + this.triggerEvent('buyNow', { + isAllSelectedSku, + }); + }, + + // 加 + handleBuyNumPlus() { + const { buyNum } = this.data; + const { isStock } = this.properties; + if (!isStock) return; + const nextBuyNum = Number(buyNum) + 1; + this.setBuyNum(nextBuyNum > 999 ? buyNum : nextBuyNum); + }, + + // 减 + handleBuyNumMinus() { + const { buyNum } = this.data; + const { limitMinCount } = this.properties; + const { isStock } = this.properties; + if (!isStock || buyNum < limitMinCount + 1) return; + const nextBuyNum = Number(buyNum) - 1; + this.setBuyNum(nextBuyNum < 1 ? buyNum : nextBuyNum); + }, + + // 总处理 + setBuyNum(buyNum) { + this.setData({ + buyNum, + }); + this.triggerEvent('changeNum', { + buyNum, + }); + }, + + // 输入框 + handleBuyNumChange(e) { + const { + detail: { value }, + } = e; + const valInNum = Number(value); + const { limitMaxCount, limitMinCount } = this.properties; + const nextData = { + buyNum: + valInNum < limitMinCount + ? limitMinCount + : valInNum > limitMaxCount + ? limitMaxCount + : valInNum, + }; + this.setData(nextData); + }, + }, +}); diff --git a/pages/goods/details/components/goods-specs-popup/index.json b/pages/goods/details/components/goods-specs-popup/index.json new file mode 100644 index 0000000..e699a1c --- /dev/null +++ b/pages/goods/details/components/goods-specs-popup/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-image": "/components/webp-image/index", + "t-toast": "tdesign-miniprogram/toast/toast" + } +} \ No newline at end of file diff --git a/pages/goods/details/components/goods-specs-popup/index.wxml b/pages/goods/details/components/goods-specs-popup/index.wxml new file mode 100644 index 0000000..bb5fd25 --- /dev/null +++ b/pages/goods/details/components/goods-specs-popup/index.wxml @@ -0,0 +1,100 @@ + + + + + + + + + {{title}} + + + + + + 选择: + + + {{selectedItem.specValue}} + + + + + + + + + {{item.title}} + + + {{valuesItem.specValue}} + + + + + + + + 购买数量 + + ({{limitBuyInfo}}) + + + + + + + + + + + + + + + + + + 确定 + + + + + 加入购物车 + + + + + 立即购买 + + + + + + + + diff --git a/pages/goods/details/components/goods-specs-popup/index.wxss b/pages/goods/details/components/goods-specs-popup/index.wxss new file mode 100644 index 0000000..de0c749 --- /dev/null +++ b/pages/goods/details/components/goods-specs-popup/index.wxss @@ -0,0 +1,300 @@ +.popup-container { + background-color: #ffffff; + position: relative; + z-index: 100; + border-radius: 16rpx 16rpx 0 0; + padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); +} + +.popup-container .popup-close { + position: absolute; + right: 30rpx; + top: 30rpx; + z-index: 9; + color: #999999; +} + +.popup-sku-header { + display: flex; + padding: 30rpx 28rpx 0 30rpx; +} + +.popup-sku-header .popup-sku-header__img { + width: 176rpx; + height: 176rpx; + border-radius: 8rpx; + background: #d8d8d8; + margin-right: 24rpx; +} + +.popup-sku-header .popup-sku-header__goods-info { + position: relative; + width: 500rpx; +} + +.popup-sku-header .popup-sku-header__goods-info .popup-sku__goods-name { + font-size: 28rpx; + line-height: 40rpx; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + white-space: normal; + overflow: hidden; + width: 430rpx; + text-overflow: ellipsis; +} + +.popup-sku-header .popup-sku-header__goods-info .popup-sku__selected-spec { + display: flex; + color: #333333; + font-size: 26rpx; + line-height: 36rpx; +} + +.popup-sku-header + .popup-sku-header__goods-info + .popup-sku__selected-spec + .popup-sku__selected-item { + margin-right: 10rpx; +} + +.popup-sku-body { + margin: 0 30rpx 40rpx; + max-height: 600rpx; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; +} + +.popup-sku-body .popup-sku-group-container .popup-sku-row { + padding: 32rpx 0; + border-bottom: 1rpx solid #f5f5f5; +} + +.popup-sku-body + .popup-sku-group-container + .popup-sku-row + .popup-sku-row__title { + font-size: 26rpx; + color: #333; +} + +.popup-sku-body .popup-sku-group-container .popup-sku-row .popup-sku-row__item { + font-size: 24rpx; + color: #333; + min-width: 128rpx; + height: 56rpx; + background-color: #f5f5f5; + border-radius: 8rpx; + border: 2rpx solid #f5f5f5; + margin: 19rpx 26rpx 0 0; + padding: 0 16rpx; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.popup-sku-body + .popup-sku-group-container + .popup-sku-row + .popup-sku-row__item.popup-sku-row__item--active { + border: 2rpx solid #fa4126; + color: #fa4126; + background: rgba(255, 95, 21, 0.04); +} + +.popup-sku-body + .popup-sku-group-container + .popup-sku-row + .disabled-sku-selected { + background: #f5f5f5 !important; + color: #cccccc; +} + +.popup-sku-body .popup-sku-stepper-stock .popup-sku-stepper-container { + display: flex; + align-items: center; + justify-content: space-between; + margin: 40rpx 0; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-sku__stepper-title { + display: flex; + font-size: 26rpx; + color: #333; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-sku__stepper-title + .limit-text { + margin-left: 10rpx; + color: #999999; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper { + display: flex; + flex-flow: row nowrap; + align-items: center; + font-size: 28px; + height: 48rpx; + line-height: 62rpx; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .input-btn, +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .input-num-wrap { + position: relative; + height: 100%; + text-align: center; + background-color: #f5f5f5; + border-radius: 4rpx; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .input-num-wrap { + color: #282828; + display: flex; + max-width: 76rpx; + align-items: center; + justify-content: space-between; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .input-num-wrap + .input-num { + height: 100%; + width: auto; + font-weight: 600; + font-size: 30rpx; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .input-btn { + width: 48rpx; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .popup-stepper__minus { + margin-right: 4rpx; + border-radius: 4rpx; + color: #9a979b; + display: flex; + align-items: center; + justify-content: center; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .popup-stepper__plus { + margin-left: 4rpx; + border-radius: 4rpx; + color: #9a979b; + display: flex; + align-items: center; + justify-content: center; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .popup-stepper__plus::after { + width: 24rpx; + height: 3rpx; + background-color: #999999; +} + +.popup-sku-body + .popup-sku-stepper-stock + .popup-sku-stepper-container + .popup-stepper + .popup-stepper__plus::before { + width: 3rpx; + height: 24rpx; + background-color: #999999; +} + +.popup-sku-actions { + font-size: 32rpx; + height: 80rpx; + text-align: center; + line-height: 80rpx; + padding: 0 20rpx; +} + +.popup-sku-actions .sku-operate { + height: 80rpx; + width: 50%; + color: #fff; + border-radius: 48rpx; +} + +.popup-sku-actions .sku-operate .sku-operate-addCart { + background-color: #ffece9; + color: #fa4126; + border-radius: 48rpx 0 0 48rpx; +} + +.popup-sku-actions .sku-operate .sku-operate-addCart.disabled { + background: rgb(221, 221, 221); + color: #fff; +} + +.popup-sku-actions .sku-operate .sku-operate-buyNow { + background-color: #fa4126; + border-radius: 0 48rpx 48rpx 0; +} + +.popup-sku-actions .sku-operate .sku-operate-buyNow.disabled { + color: #fff; + background: rgb(198, 198, 198); +} + +.popup-sku-actions .sku-operate .selected-sku-btn { + width: 100%; +} + +.popup-container .single-confirm-btn { + border-radius: 48rpx; + color: #ffffff; + margin: 0 32rpx; + font-size: 32rpx; + height: 80rpx; + text-align: center; + line-height: 88rpx; + background-color: #fa4126; +} + +.popup-container .single-confirm-btn.disabled { + font-size: 32rpx; + color: #fff; + background-color: #dddddd; +} diff --git a/pages/goods/details/components/promotion-popup/index.js b/pages/goods/details/components/promotion-popup/index.js new file mode 100644 index 0000000..9743cc1 --- /dev/null +++ b/pages/goods/details/components/promotion-popup/index.js @@ -0,0 +1,35 @@ +Component({ + options: { + multipleSlots: true, + }, + + properties: { + list: Array, + title: { + type: String, + value: '促销说明', + }, + show: { + type: Boolean, + }, + }, + + // data: { + // list: [], + // }, + + methods: { + change(e) { + const { index } = e.currentTarget.dataset; + this.triggerEvent('promotionChange', { + index, + }); + }, + + closePromotionPopup() { + this.triggerEvent('closePromotionPopup', { + show: false, + }); + }, + }, +}); diff --git a/pages/goods/details/components/promotion-popup/index.json b/pages/goods/details/components/promotion-popup/index.json new file mode 100644 index 0000000..a9de77d --- /dev/null +++ b/pages/goods/details/components/promotion-popup/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/goods/details/components/promotion-popup/index.wxml b/pages/goods/details/components/promotion-popup/index.wxml new file mode 100644 index 0000000..c1cea9d --- /dev/null +++ b/pages/goods/details/components/promotion-popup/index.wxml @@ -0,0 +1,34 @@ + + + + + + + {{title}} + + + + + {{item.tag}} + + {{item.label ? item.label : ''}} + + + + + + + + + diff --git a/pages/goods/details/components/promotion-popup/index.wxss b/pages/goods/details/components/promotion-popup/index.wxss new file mode 100644 index 0000000..6e0e167 --- /dev/null +++ b/pages/goods/details/components/promotion-popup/index.wxss @@ -0,0 +1,131 @@ +.promotion-popup-container { + background-color: #ffffff; + position: relative; + z-index: 100; + border-radius: 16rpx 16rpx 0 0; +} + +.promotion-popup-container .promotion-popup-close { + position: absolute; + right: 30rpx; + top: 30rpx; + z-index: 9; + color: rgba(153, 153, 153, 1); +} + +.promotion-popup-container .promotion-popup-close .market { + font-size: 25rpx; + color: #999; +} + +.promotion-popup-container .promotion-popup-title { + height: 100rpx; + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.promotion-popup-container .promotion-popup-title { + font-size: 32rpx; + color: #222427; + font-weight: 600; +} + +.promotion-popup-container .promotion-popup-content { + min-height: 400rpx; + max-height: 600rpx; + padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); + overflow-y: scroll; + -webkit-overflow-scrolling: touch; +} + +.promotion-popup-container .promotion-popup-content .promotion-detail-list { + margin: 0 30rpx; +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item:last-child { + margin-bottom: env(safe-area-inset-bottom); + border-bottom: 0; + padding-bottom: calc(28rpx + env(safe-area-inset-bottom)); +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item { + display: flex; + justify-content: space-between; + padding: 10rpx 0 28rpx; + position: relative; + font-size: 24rpx; + color: #222427; +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item + .tag { + box-sizing: border-box; + font-size: 20rpx; + line-height: 32rpx; + padding: 2rpx 12rpx; + background-color: #ffece9; + margin-right: 16rpx; + display: inline-flex; + color: #fa4126; + border-radius: 54rpx; + flex-shrink: 0; + position: relative; + top: 2rpx; +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item + .content { + font-size: 28rpx; + color: #222427; + flex: 1; + line-height: 40rpx; + display: flex; +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item + .content + .list-content { + width: 440rpx; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + display: inline-block; +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item + .collect-btn { + font-size: 24rpx; + flex-shrink: 0; + margin-left: 20rpx; + display: flex; + align-items: center; +} + +.promotion-popup-container + .promotion-popup-content + .promotion-detail-list + .list-item + .collect-btn + .linkText { + margin-right: 8rpx; +} diff --git a/pages/goods/details/index.js b/pages/goods/details/index.js new file mode 100644 index 0000000..b41f007 --- /dev/null +++ b/pages/goods/details/index.js @@ -0,0 +1,443 @@ +import Toast from 'tdesign-miniprogram/toast/index'; +import { fetchGood } from '../../../services/good/fetchGood'; +import { fetchActivityList } from '../../../services/activity/fetchActivityList'; +import { + getGoodsDetailsCommentList, + getGoodsDetailsCommentsCount, +} from '../../../services/good/fetchGoodsDetailsComments'; + +import { cdnBase } from '../../../config/index'; + +const imgPrefix = `${cdnBase}/`; + +const recLeftImg = `${imgPrefix}common/rec-left.png`; +const recRightImg = `${imgPrefix}common/rec-right.png`; +const obj2Params = (obj = {}, encode = false) => { + const result = []; + Object.keys(obj).forEach((key) => + result.push(`${key}=${encode ? encodeURIComponent(obj[key]) : obj[key]}`), + ); + + return result.join('&'); +}; + +Page({ + data: { + commentsList: [], + commentsStatistics: { + badCount: 0, + commentCount: 0, + goodCount: 0, + goodRate: 0, + hasImageCount: 0, + middleCount: 0, + }, + isShowPromotionPop: false, + activityList: [], + recLeftImg, + recRightImg, + details: {}, + goodsTabArray: [ + { + name: '商品', + value: '', // 空字符串代表置顶 + }, + { + name: '详情', + value: 'goods-page', + }, + ], + storeLogo: `${imgPrefix}common/store-logo.png`, + storeName: '云mall标准版旗舰店', + jumpArray: [ + { + title: '首页', + url: '/pages/home/home', + iconName: 'home', + }, + { + title: '购物车', + url: '/pages/cart/index', + iconName: 'cart', + showCartNum: true, + }, + ], + isStock: true, + cartNum: 0, + soldout: false, + buttonType: 1, + buyNum: 1, + selectedAttrStr: '', + skuArray: [], + primaryImage: '', + specImg: '', + isSpuSelectPopupShow: false, + isAllSelectedSku: false, + buyType: 0, + outOperateStatus: false, // 是否外层加入购物车 + operateType: 0, + selectSkuSellsPrice: 0, + maxLinePrice: 0, + minSalePrice: 0, + maxSalePrice: 0, + list: [], + spuId: '', + navigation: { type: 'fraction' }, + current: 0, + autoplay: true, + duration: 500, + interval: 5000, + soldNum: 0, // 已售数量 + }, + + handlePopupHide() { + this.setData({ + isSpuSelectPopupShow: false, + }); + }, + + showSkuSelectPopup(type) { + this.setData({ + buyType: type || 0, + outOperateStatus: type >= 1, + isSpuSelectPopupShow: true, + }); + }, + + buyItNow() { + this.showSkuSelectPopup(1); + }, + + toAddCart() { + this.showSkuSelectPopup(2); + }, + + toNav(e) { + const { url } = e.detail; + wx.switchTab({ + url: url, + }); + }, + + showCurImg(e) { + const { index } = e.detail; + const { images } = this.data.details; + wx.previewImage({ + current: images[index], + urls: images, // 需要预览的图片http链接列表 + }); + }, + + onPageScroll({ scrollTop }) { + const goodsTab = this.selectComponent('#goodsTab'); + goodsTab && goodsTab.onScroll(scrollTop); + }, + + chooseSpecItem(e) { + const { specList } = this.data.details; + const { selectedSku, isAllSelectedSku } = e.detail; + if (!isAllSelectedSku) { + this.setData({ + selectSkuSellsPrice: 0, + }); + } + this.setData({ + isAllSelectedSku, + }); + this.getSkuItem(specList, selectedSku); + }, + + getSkuItem(specList, selectedSku) { + const { skuArray, primaryImage } = this.data; + const selectedSkuValues = this.getSelectedSkuValues(specList, selectedSku); + let selectedAttrStr = ` 件 `; + selectedSkuValues.forEach((item) => { + selectedAttrStr += `,${item.specValue} `; + }); + // eslint-disable-next-line array-callback-return + const skuItem = skuArray.filter((item) => { + let status = true; + (item.specInfo || []).forEach((subItem) => { + if ( + !selectedSku[subItem.specId] || + selectedSku[subItem.specId] !== subItem.specValueId + ) { + status = false; + } + }); + if (status) return item; + }); + this.selectSpecsName(selectedSkuValues.length > 0 ? selectedAttrStr : ''); + if (skuItem) { + this.setData({ + selectItem: skuItem, + selectSkuSellsPrice: skuItem.price || 0, + }); + } else { + this.setData({ + selectItem: null, + selectSkuSellsPrice: 0, + }); + } + this.setData({ + specImg: skuItem && skuItem.skuImage ? skuItem.skuImage : primaryImage, + }); + }, + + // 获取已选择的sku名称 + getSelectedSkuValues(skuTree, selectedSku) { + const normalizedTree = this.normalizeSkuTree(skuTree); + return Object.keys(selectedSku).reduce((selectedValues, skuKeyStr) => { + const skuValues = normalizedTree[skuKeyStr]; + const skuValueId = selectedSku[skuKeyStr]; + if (skuValueId !== '') { + const skuValue = skuValues.filter((value) => { + return value.specValueId === skuValueId; + })[0]; + skuValue && selectedValues.push(skuValue); + } + return selectedValues; + }, []); + }, + + normalizeSkuTree(skuTree) { + const normalizedTree = {}; + skuTree.forEach((treeItem) => { + normalizedTree[treeItem.specId] = treeItem.specValueList; + }); + return normalizedTree; + }, + + selectSpecsName(selectSpecsName) { + if (selectSpecsName) { + this.setData({ + selectedAttrStr: selectSpecsName, + }); + } else { + this.setData({ + selectedAttrStr: '', + }); + } + }, + + addCart() { + const { isAllSelectedSku } = this.data; + Toast({ + context: this, + selector: '#t-toast', + message: isAllSelectedSku ? '点击加入购物车' : '请选择规格', + icon: '', + duration: 1000, + }); + }, + + gotoBuy(type) { + const { isAllSelectedSku, buyNum } = this.data; + if (!isAllSelectedSku) { + Toast({ + context: this, + selector: '#t-toast', + message: '请选择规格', + icon: '', + duration: 1000, + }); + return; + } + this.handlePopupHide(); + const query = { + quantity: buyNum, + storeId: '1', + spuId: this.data.spuId, + goodsName: this.data.details.title, + skuId: + type === 1 ? this.data.skuList[0].skuId : this.data.selectItem.skuId, + available: this.data.details.available, + price: this.data.details.minSalePrice, + specInfo: this.data.details.specList?.map((item) => ({ + specTitle: item.title, + specValue: item.specValueList[0].specValue, + })), + primaryImage: this.data.details.primaryImage, + spuId: this.data.details.spuId, + thumb: this.data.details.primaryImage, + title: this.data.details.title, + }; + let urlQueryStr = obj2Params({ + goodsRequestList: JSON.stringify([query]), + }); + urlQueryStr = urlQueryStr ? `?${urlQueryStr}` : ''; + const path = `/pages/order/order-confirm/index${urlQueryStr}`; + wx.navigateTo({ + url: path, + }); + }, + + specsConfirm() { + const { buyType } = this.data; + if (buyType === 1) { + this.gotoBuy(); + } else { + this.addCart(); + } + // this.handlePopupHide(); + }, + + changeNum(e) { + this.setData({ + buyNum: e.detail.buyNum, + }); + }, + + closePromotionPopup() { + this.setData({ + isShowPromotionPop: false, + }); + }, + + promotionChange(e) { + const { index } = e.detail; + wx.navigateTo({ + url: `/pages/promotion-detail/index?promotion_id=${index}`, + }); + }, + + showPromotionPopup() { + this.setData({ + isShowPromotionPop: true, + }); + }, + + getDetail(spuId) { + Promise.all([fetchGood(spuId), fetchActivityList()]).then((res) => { + const [details, activityList] = res; + const skuArray = []; + const { + skuList, + primaryImage, + isPutOnSale, + minSalePrice, + maxSalePrice, + maxLinePrice, + soldNum, + } = details; + skuList.forEach((item) => { + skuArray.push({ + skuId: item.skuId, + quantity: item.stockInfo ? item.stockInfo.stockQuantity : 0, + specInfo: item.specInfo, + }); + }); + const promotionArray = []; + activityList.forEach((item) => { + promotionArray.push({ + tag: item.promotionSubCode === 'MYJ' ? '满减' : '满折', + label: '满100元减99.9元', + }); + }); + this.setData({ + details, + activityList, + isStock: details.spuStockQuantity > 0, + maxSalePrice: maxSalePrice ? parseInt(maxSalePrice) : 0, + maxLinePrice: maxLinePrice ? parseInt(maxLinePrice) : 0, + minSalePrice: minSalePrice ? parseInt(minSalePrice) : 0, + list: promotionArray, + skuArray: skuArray, + primaryImage, + soldout: isPutOnSale === 0, + soldNum, + }); + }); + }, + + async getCommentsList() { + try { + const code = 'Success'; + const data = await getGoodsDetailsCommentList(); + const { homePageComments } = data; + if (code.toUpperCase() === 'SUCCESS') { + const nextState = { + commentsList: homePageComments.map((item) => { + return { + goodsSpu: item.spuId, + userName: item.userName || '', + commentScore: item.commentScore, + commentContent: item.commentContent || '用户未填写评价', + userHeadUrl: item.isAnonymity + ? this.anonymityAvatar + : item.userHeadUrl || this.anonymityAvatar, + }; + }), + }; + this.setData(nextState); + } + } catch (error) { + console.error('comments error:', error); + } + }, + + onShareAppMessage() { + // 自定义的返回信息 + const { selectedAttrStr } = this.data; + let shareSubTitle = ''; + if (selectedAttrStr.indexOf('件') > -1) { + const count = selectedAttrStr.indexOf('件'); + shareSubTitle = selectedAttrStr.slice(count + 1, selectedAttrStr.length); + } + const customInfo = { + imageUrl: this.data.details.primaryImage, + title: this.data.details.title + shareSubTitle, + path: `/pages/goods/details/index?spuId=${this.data.spuId}`, + }; + return customInfo; + }, + + /** 获取评价统计 */ + async getCommentsStatistics() { + try { + const code = 'Success'; + const data = await getGoodsDetailsCommentsCount(); + if (code.toUpperCase() === 'SUCCESS') { + const { + badCount, + commentCount, + goodCount, + goodRate, + hasImageCount, + middleCount, + } = data; + const nextState = { + commentsStatistics: { + badCount: parseInt(`${badCount}`), + commentCount: parseInt(`${commentCount}`), + goodCount: parseInt(`${goodCount}`), + /** 后端返回百分比后数据但没有限制位数 */ + goodRate: Math.floor(goodRate * 10) / 10, + hasImageCount: parseInt(`${hasImageCount}`), + middleCount: parseInt(`${middleCount}`), + }, + }; + this.setData(nextState); + } + } catch (error) { + console.error('comments statiistics error:', error); + } + }, + + /** 跳转到评价列表 */ + navToCommentsListPage() { + wx.navigateTo({ + url: `/pages/goods/comments/index?spuId=${this.data.spuId}`, + }); + }, + + onLoad(query) { + const { spuId } = query; + this.setData({ + spuId: spuId, + }); + this.getDetail(spuId); + this.getCommentsList(spuId); + this.getCommentsStatistics(spuId); + }, +}); diff --git a/pages/goods/details/index.json b/pages/goods/details/index.json new file mode 100644 index 0000000..a5d8558 --- /dev/null +++ b/pages/goods/details/index.json @@ -0,0 +1,18 @@ +{ + "navigationBarTitleText": "商品详情", + "usingComponents": { + "t-image": "/components/webp-image/index", + "t-tag": "tdesign-miniprogram/tag/tag", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-rate": "tdesign-miniprogram/rate/rate", + "t-swiper": "tdesign-miniprogram/swiper/swiper", + "t-swiper-item": "tdesign-miniprogram/swiper/swiper-item", + "t-button": "tdesign-miniprogram/button/button", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-popup": "tdesign-miniprogram/popup/popup", + "price": "/components/price/index", + "buy-bar": "./components/buy-bar/index", + "promotion-popup": "./components/promotion-popup/index", + "goods-specs-popup": "./components/goods-specs-popup/index" + } +} \ No newline at end of file diff --git a/pages/goods/details/index.wxml b/pages/goods/details/index.wxml new file mode 100644 index 0000000..1a616f4 --- /dev/null +++ b/pages/goods/details/index.wxml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + 已售{{soldNum}} + + + + + {{item.tag}} + + + + 领劵 + + + + + {{details.title}} + + + + + + + + + + {{intro}} + + + 已选 + + + {{selectedAttrStr ? buyNum : ''}}{{selectedAttrStr || '请选择'}} + + + + + + + + 商品评价 + + ({{ commentsStatistics.commentCount }}) + + + + {{commentsStatistics.goodRate}}% 好评 + + + + + + + + {{commentItem.userName}} + + + + + {{commentItem.commentContent}} + + + + + + + + 详情介绍 + + + + + + + + + + + + + + + + + + + + + diff --git a/pages/goods/details/index.wxss b/pages/goods/details/index.wxss new file mode 100644 index 0000000..eb74549 --- /dev/null +++ b/pages/goods/details/index.wxss @@ -0,0 +1,356 @@ +@import '../../../style/global.wxss'; +page { + width: 100vw; +} + +.goods-detail-page .goods-info { + margin: 0 auto; + padding: 26rpx 0 28rpx 30rpx; + background-color: #fff; +} + +.goods-detail-page .swipe-img { + width: 100%; + height: 750rpx; +} + +.goods-detail-page .goods-info .goods-price { + display: flex; + align-items: baseline; +} + +.goods-detail-page .goods-info .goods-price-up { + color: #fa4126; + font-size: 28rpx; + position: relative; + bottom: 4rpx; + left: 8rpx; +} + +.goods-detail-page .goods-info .goods-price .class-goods-price { + font-size: 64rpx; + color: #fa4126; + font-weight: bold; + font-family: DIN Alternate; +} + +.goods-detail-page .goods-info .goods-price .class-goods-symbol { + font-size: 36rpx; + color: #fa4126; +} + +.goods-detail-page .goods-info .goods-price .class-goods-del { + position: relative; + font-weight: normal; + left: 16rpx; + bottom: 2rpx; + color: #999999; + font-size: 32rpx; +} + +.goods-detail-page .goods-info .goods-number { + display: flex; + align-items: center; + justify-content: space-between; +} + +.goods-detail-page .goods-info .goods-number .sold-num { + font-size: 24rpx; + color: #999999; + display: flex; + align-items: flex-end; + margin-right: 32rpx; +} + +.goods-detail-page .goods-info .goods-activity { + display: flex; + margin-top: 16rpx; + justify-content: space-between; +} + +.goods-detail-page .goods-info .goods-activity .tags-container { + display: flex; +} + +.goods-detail-page + .goods-info + .goods-activity + .tags-container + .goods-activity-tag { + background: #ffece9; + color: #fa4126; + font-size: 24rpx; + margin-right: 16rpx; + padding: 4rpx 8rpx; + border-radius: 4rpx; +} + +.goods-detail-page .goods-info .goods-activity .activity-show { + display: flex; + justify-content: center; + align-items: center; + color: #fa4126; + font-size: 24rpx; + padding-right: 32rpx; +} + +.goods-detail-page .goods-info .goods-activity .activity-show-text { + line-height: 42rpx; +} + +.goods-detail-page .goods-info .goods-title { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 20rpx; +} + +.goods-detail-page .goods-info .goods-title .goods-name { + width: 600rpx; + font-weight: 500; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + font-size: 32rpx; + word-break: break-all; + color: #333333; +} + +.goods-detail-page .goods-info .goods-title .goods-tag { + width: 104rpx; + margin-left: 26rpx; +} + +.goods-detail-page .goods-info .goods-title .goods-tag .shareBtn { + border-radius: 200rpx 0px 0px 200rpx; + width: 100rpx; + height: 96rpx; + border: none; + padding-right: 36rpx !important; +} + +.goods-detail-page .goods-info .goods-title .goods-tag .shareBtn::after { + border: none; +} + +.goods-detail-page .goods-info .goods-title .goods-tag .btn-icon { + font-size: 20rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 96rpx; + color: #999; +} + +.goods-detail-page .goods-info .goods-title .goods-tag .btn-icon .share-text { + line-height: 32rpx; +} + +.goods-detail-page .goods-info .goods-intro { + font-size: 26rpx; + color: #888; + line-height: 36rpx; + word-break: break-all; + padding-right: 30rpx; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + white-space: normal; + overflow: hidden; +} + +.spu-select { + height: 80rpx; + background-color: #fff; + margin-top: 20rpx; + display: flex; + align-items: center; + padding: 30rpx; + font-size: 28rpx; +} + +.spu-select .label { + margin-right: 30rpx; + text-align: center; + flex-shrink: 0; + color: #999999; + font-weight: normal; +} + +.spu-select .content { + display: flex; + flex: 1; + justify-content: space-between; + align-items: center; +} + +.spu-select .content .tintColor { + color: #aaa; +} + +.goods-detail-page .desc-content { + margin-top: 20rpx; + background-color: #fff; + padding-bottom: 120rpx; +} + +.goods-detail-page .desc-content__title { + font-size: 28rpx; + line-height: 36rpx; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + padding: 30rpx 20rpx; +} + +.goods-detail-page .desc-content__title .img { + width: 206rpx; + height: 10rpx; +} + +.goods-detail-page .desc-content__title--text { + font-size: 26rpx; + margin: 0 32rpx; + font-weight: 600; +} + +.goods-detail-page .desc-content__img { + width: 100%; + height: auto; +} + +.goods-bottom-operation { + position: fixed; + left: 0; + bottom: 0; + width: 100%; + background-color: #fff; + padding-bottom: env(safe-area-inset-bottom); +} + +.popup-sku-header .popup-sku-header__goods-info .popup-sku__price { + display: flex; + align-items: baseline; + color: #fa4126; + margin-top: 48rpx; +} + +.popup-sku-header + .popup-sku-header__goods-info + .popup-sku__price + .popup-sku__price-num { + font-size: 64rpx; + color: #fa4126; + font-weight: bold; + font-family: DIN Alternate; +} + +.popup-sku-header + .popup-sku-header__goods-info + .popup-sku__price + .popup-sku__price-del { + position: relative; + font-weight: normal; + left: 12rpx; + bottom: 2rpx; + color: #999999; + font-size: 32rpx; +} + +.popup-sku-header + .popup-sku-header__goods-info + .popup-sku__price + .popup-sku__price-symbol { + font-size: 36rpx; + color: #fa4126; +} + +.popup-sku-header + .popup-sku-header__goods-info + .popup-sku__price + .popup-sku__price-max-num { + font-size: 48rpx; +} + +.goods-detail-page .goods-head .t-swiper { + height: 750rpx !important; +} + +.t-toast__content { + z-index: 12000 !important; +} + +.comments-wrap { + margin-top: 20rpx; + padding: 32rpx; + background-color: #fff; +} + +.comments-wrap .comments-head { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.comments-wrap .comments-head .comments-title-wrap { + display: flex; +} + +.comments-title-label, +.comments-title-count { + color: #333333; + font-size: 32rpx; + font-weight: 500; + line-height: 48rpx; +} + +.comments-rate-wrap { + display: flex; + justify-content: center; + align-items: center; + font-size: 24rpx; +} + +.comments-rate-wrap .comments-good-rate { + color: #999999; + font-size: 26rpx; + font-weight: 400; + font-style: normal; + line-height: 36rpx; +} + +.comment-item-wrap .comment-item-head { + display: flex; + flex-direction: row; + align-items: center; + margin-top: 32rpx; +} + +.comment-item-wrap .comment-item-head .comment-item-avatar { + width: 64rpx; + height: 64rpx; + border-radius: 64rpx; +} + +.comment-item-wrap .comment-item-head .comment-head-right { + margin-left: 24rpx; +} + +.comment-head-right .comment-username { + font-size: 26rpx; + color: #333333; + line-height: 36rpx; + font-weight: 400; +} + +.comment-item-wrap .comment-item-content { + margin-top: 20rpx; + color: #333333; + line-height: 40rpx; + font-size: 28rpx; + font-weight: 400; +} diff --git a/pages/goods/list/index.js b/pages/goods/list/index.js new file mode 100644 index 0000000..c16cd66 --- /dev/null +++ b/pages/goods/list/index.js @@ -0,0 +1,226 @@ +import { fetchGoodsList } from '../../../services/good/fetchGoodsList'; +import Toast from 'tdesign-miniprogram/toast/index'; + +const initFilters = { + overall: 1, + sorts: '', + layout: 0, +}; + +Page({ + data: { + goodsList: [], + layout: 0, + sorts: '', + overall: 1, + show: false, + minVal: '', + maxVal: '', + filter: initFilters, + hasLoaded: false, + loadMoreStatus: 0, + loading: true, + }, + + pageNum: 1, + pageSize: 30, + total: 0, + + handleFilterChange(e) { + const { layout, overall, sorts } = e.detail; + this.pageNum = 1; + this.setData({ + layout, + sorts, + overall, + loadMoreStatus: 0, + }); + this.init(true); + }, + + generalQueryData(reset = false) { + const { filter, keywords, minVal, maxVal } = this.data; + const { pageNum, pageSize } = this; + const { sorts, overall } = filter; + const params = { + sort: 0, // 0 综合,1 价格 + pageNum: 1, + pageSize: 30, + keyword: keywords, + }; + + if (sorts) { + params.sort = 1; + params.sortType = sorts === 'desc' ? 1 : 0; + } + + if (overall) { + params.sort = 0; + } else { + params.sort = 1; + } + params.minPrice = minVal ? minVal * 100 : 0; + params.maxPrice = maxVal ? maxVal * 100 : undefined; + if (reset) return params; + return { + ...params, + pageNum: pageNum + 1, + pageSize, + }; + }, + + async init(reset = true) { + const { loadMoreStatus, goodsList = [] } = this.data; + const params = this.generalQueryData(reset); + if (loadMoreStatus !== 0) return; + this.setData({ + loadMoreStatus: 1, + loading: true, + }); + try { + const result = await fetchGoodsList(params); + const code = 'Success'; + const data = result; + if (code.toUpperCase() === 'SUCCESS') { + const { spuList, totalCount = 0 } = data; + if (totalCount === 0 && reset) { + this.total = totalCount; + this.setData({ + emptyInfo: { + tip: '抱歉,未找到相关商品', + }, + hasLoaded: true, + loadMoreStatus: 0, + loading: false, + goodsList: [], + }); + return; + } + + const _goodsList = reset ? spuList : goodsList.concat(spuList); + const _loadMoreStatus = _goodsList.length === totalCount ? 2 : 0; + this.pageNum = params.pageNum || 1; + this.total = totalCount; + this.setData({ + goodsList: _goodsList, + loadMoreStatus: _loadMoreStatus, + }); + } else { + this.setData({ + loading: false, + }); + wx.showToast({ + title: '查询失败,请稍候重试', + }); + } + } catch (error) { + this.setData({ + loading: false, + }); + } + this.setData({ + hasLoaded: true, + loading: false, + }); + }, + + onLoad() { + this.init(true); + }, + + onReachBottom() { + const { goodsList } = this.data; + const { total = 0 } = this; + if (goodsList.length === total) { + this.setData({ + loadMoreStatus: 2, + }); + return; + } + this.init(false); + }, + + handleAddCart() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击加购', + }); + }, + + tagClickHandle() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击标签', + }); + }, + + gotoGoodsDetail(e) { + const { index } = e.detail; + const { spuId } = this.data.goodsList[index]; + wx.navigateTo({ + url: `/pages/goods/details/index?spuId=${spuId}`, + }); + }, + + showFilterPopup() { + this.setData({ + show: true, + }); + }, + + showFilterPopupClose() { + this.setData({ + show: false, + }); + }, + + onMinValAction(e) { + const { value } = e.detail; + this.setData({ minVal: value }); + }, + + onMaxValAction(e) { + const { value } = e.detail; + this.setData({ maxVal: value }); + }, + + reset() { + this.setData({ minVal: '', maxVal: '' }); + }, + + confirm() { + const { minVal, maxVal } = this.data; + let message = ''; + if (minVal && !maxVal) { + message = `价格最小是${minVal}`; + } else if (!minVal && maxVal) { + message = `价格范围是0-${minVal}`; + } else if (minVal && maxVal && minVal <= maxVal) { + message = `价格范围${minVal}-${this.data.maxVal}`; + } else { + message = '请输入正确范围'; + } + if (message) { + Toast({ + context: this, + selector: '#t-toast', + message, + }); + } + this.pageNum = 1; + this.setData( + { + show: false, + minVal: '', + goodsList: [], + loadMoreStatus: 0, + maxVal: '', + }, + () => { + this.init(); + }, + ); + }, +}); diff --git a/pages/goods/list/index.json b/pages/goods/list/index.json new file mode 100644 index 0000000..0811511 --- /dev/null +++ b/pages/goods/list/index.json @@ -0,0 +1,12 @@ +{ + "navigationBarTitleText": "商品列表", + "usingComponents": { + "t-input": "tdesign-miniprogram/input/input", + "t-empty": "tdesign-miniprogram/empty/empty", + "t-toast": "tdesign-miniprogram/toast/toast", + "goods-list": "/components/goods-list/index", + "filter": "/components/filter/index", + "filter-popup": "/components/filter-popup/index", + "load-more": "/components/load-more/index" + } +} \ No newline at end of file diff --git a/pages/goods/list/index.wxml b/pages/goods/list/index.wxml new file mode 100644 index 0000000..82d7bee --- /dev/null +++ b/pages/goods/list/index.wxml @@ -0,0 +1,55 @@ + + + + + 价格区间 + + + - + + + + + + + + + + + + + + + diff --git a/pages/goods/list/index.wxss b/pages/goods/list/index.wxss new file mode 100644 index 0000000..4895167 --- /dev/null +++ b/pages/goods/list/index.wxss @@ -0,0 +1,108 @@ +page { + background-color: #fff; +} + +.goods-list-container { + display: block; +} + +.goods-list-container .t-search { + padding: 0 30rpx; + background-color: #fff; +} + +.goods-list-container .t-class__input-container { + height: 64rpx !important; + border-radius: 32rpx !important; +} + +.goods-list-container .t-search__left-icon { + display: flex; + align-items: center; +} + +.goods-list-container .t-search__input { + font-size: 28rpx !important; + color: rgb(116, 116, 116) !important; +} + +.goods-list-container .category-goods-list { + background-color: #f2f2f2; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + padding: 20rpx 24rpx; + -webkit-overflow-scrolling: touch; +} + +.goods-list-container .wr-goods-list { + background: #f2f2f2 !important; +} + +.goods-list-container .t-image__mask { + display: flex !important; +} + +.goods-list-container .empty-wrap { + margin-top: 184rpx; + margin-bottom: 120rpx; + height: 300rpx; +} + +.goods-list-container .empty-wrap .empty-tips .empty-content .content-text { + margin-top: 40rpx; +} + +.goods-list-container .price-container { + padding: 32rpx; + height: 100vh; + max-width: 632rpx; + background-color: #fff; + border-radius: 30rpx 0 0 30rpx; + box-sizing: border-box; +} + +.goods-list-container .price-between { + font-size: 26rpx; + font-weight: 500; + color: rgba(51, 51, 51, 1); +} + +.goods-list-container .price-ipts-wrap { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-around; + margin-top: 24rpx; +} + +.goods-list-container .price-ipts-wrap .price-divided { + position: relative; + width: 22rpx; + margin: 0 20rpx; + color: #222427; +} + +.goods-list-container .price-ipts-wrap .price-ipt { + box-sizing: border-box; + width: 246rpx; + font-size: 24rpx; + height: 56rpx; + padding: 0 24rpx; + text-align: center; + border-radius: 8rpx; + color: #333; + background: rgba(245, 245, 245, 1); +} + +.t-class-input { + font-size: 24rpx !important; +} + +.goods-list-container .price-ipts-wrap .price-ipt::after { + border: none !important; +} + +.goods-list-container .t-input__control { + font-size: 24rpx !important; + text-align: center; +} diff --git a/pages/goods/result/index.js b/pages/goods/result/index.js new file mode 100644 index 0000000..47ce19d --- /dev/null +++ b/pages/goods/result/index.js @@ -0,0 +1,262 @@ +/* eslint-disable no-param-reassign */ +import { getSearchResult } from '../../../services/good/featchSearchResult'; +import Toast from 'tdesign-miniprogram/toast/index'; + +const initFilters = { + overall: 1, + sorts: '', +}; + +Page({ + data: { + goodsList: [], + sorts: '', + overall: 1, + show: false, + minVal: '', + maxVal: '', + minSalePriceFocus: false, + maxSalePriceFocus: false, + filter: initFilters, + hasLoaded: false, + keywords: '', + loadMoreStatus: 0, + loading: true, + }, + + total: 0, + pageNum: 1, + pageSize: 30, + + onLoad(options) { + const { searchValue = '' } = options || {}; + this.setData( + { + keywords: searchValue, + }, + () => { + this.init(true); + }, + ); + }, + + generalQueryData(reset = false) { + const { filter, keywords, minVal, maxVal } = this.data; + const { pageNum, pageSize } = this; + const { sorts, overall } = filter; + const params = { + sort: 0, // 0 综合,1 价格 + pageNum: 1, + pageSize: 30, + keyword: keywords, + }; + + if (sorts) { + params.sort = 1; + params.sortType = sorts === 'desc' ? 1 : 0; + } + if (overall) { + params.sort = 0; + } else { + params.sort = 1; + } + params.minPrice = minVal ? minVal * 100 : 0; + params.maxPrice = maxVal ? maxVal * 100 : undefined; + if (reset) return params; + return { + ...params, + pageNum: pageNum + 1, + pageSize, + }; + }, + + async init(reset = true) { + const { loadMoreStatus, goodsList = [] } = this.data; + const params = this.generalQueryData(reset); + if (loadMoreStatus !== 0) return; + this.setData({ + loadMoreStatus: 1, + loading: true, + }); + try { + const result = await getSearchResult(params); + const code = 'Success'; + const data = result; + if (code.toUpperCase() === 'SUCCESS') { + const { spuList, totalCount = 0 } = data; + if (totalCount === 0 && reset) { + this.total = totalCount; + this.setData({ + emptyInfo: { + tip: '抱歉,未找到相关商品', + }, + hasLoaded: true, + loadMoreStatus: 0, + loading: false, + goodsList: [], + }); + return; + } + + const _goodsList = reset ? spuList : goodsList.concat(spuList); + _goodsList.forEach((v) => { + v.tags = v.spuTagList.map((u) => u.title); + v.hideKey = { desc: true }; + }); + const _loadMoreStatus = _goodsList.length === totalCount ? 2 : 0; + this.pageNum = params.pageNum || 1; + this.total = totalCount; + this.setData({ + goodsList: _goodsList, + loadMoreStatus: _loadMoreStatus, + }); + } else { + this.setData({ + loading: false, + }); + wx.showToast({ + title: '查询失败,请稍候重试', + }); + } + } catch (error) { + this.setData({ + loading: false, + }); + } + this.setData({ + hasLoaded: true, + loading: false, + }); + }, + + handleCartTap() { + wx.switchTab({ + url: '/pages/cart/index', + }); + }, + + handleSubmit() { + this.setData( + { + goodsList: [], + loadMoreStatus: 0, + }, + () => { + this.init(true); + }, + ); + }, + + onReachBottom() { + const { goodsList } = this.data; + const { total = 0 } = this; + if (goodsList.length === total) { + this.setData({ + loadMoreStatus: 2, + }); + return; + } + this.init(false); + }, + + handleAddCart() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击加购', + }); + }, + + gotoGoodsDetail(e) { + const { index } = e.detail; + const { spuId } = this.data.goodsList[index]; + wx.navigateTo({ + url: `/pages/goods/details/index?spuId=${spuId}`, + }); + }, + + handleFilterChange(e) { + const { overall, sorts } = e.detail; + const { total } = this; + const _filter = { + sorts, + overall, + }; + this.setData({ + filter: _filter, + sorts, + overall, + }); + + this.pageNum = 1; + this.setData( + { + goodsList: [], + loadMoreStatus: 0, + }, + () => { + total && this.init(true); + }, + ); + }, + + showFilterPopup() { + this.setData({ + show: true, + }); + }, + + showFilterPopupClose() { + this.setData({ + show: false, + }); + }, + + onMinValAction(e) { + const { value } = e.detail; + this.setData({ minVal: value }); + }, + + onMaxValAction(e) { + const { value } = e.detail; + this.setData({ maxVal: value }); + }, + + reset() { + this.setData({ minVal: '', maxVal: '' }); + }, + + confirm() { + const { minVal, maxVal } = this.data; + let message = ''; + if (minVal && !maxVal) { + message = `价格最小是${minVal}`; + } else if (!minVal && maxVal) { + message = `价格范围是0-${minVal}`; + } else if (minVal && maxVal && minVal <= maxVal) { + message = `价格范围${minVal}-${this.data.maxVal}`; + } else { + message = '请输入正确范围'; + } + if (message) { + Toast({ + context: this, + selector: '#t-toast', + message, + }); + } + this.pageNum = 1; + this.setData( + { + show: false, + minVal: '', + goodsList: [], + loadMoreStatus: 0, + maxVal: '', + }, + () => { + this.init(); + }, + ); + }, +}); diff --git a/pages/goods/result/index.json b/pages/goods/result/index.json new file mode 100644 index 0000000..130b48d --- /dev/null +++ b/pages/goods/result/index.json @@ -0,0 +1,15 @@ +{ + "navigationBarTitleText": "搜索", + "usingComponents": { + "t-search": "tdesign-miniprogram/search/search", + "t-input": "tdesign-miniprogram/input/input", + "t-empty": "tdesign-miniprogram/empty/empty", + "t-toast": "tdesign-miniprogram/toast/toast", + "goods-list": "/components/goods-list/index", + "filter": "/components/filter/index", + "filter-popup": "/components/filter-popup/index", + "load-more": "/components/load-more/index", + "t-icon": "tdesign-miniprogram/icon/icon" + }, + "onReachBottomDistance": 50 +} \ No newline at end of file diff --git a/pages/goods/result/index.wxml b/pages/goods/result/index.wxml new file mode 100644 index 0000000..30591d7 --- /dev/null +++ b/pages/goods/result/index.wxml @@ -0,0 +1,81 @@ + + + + + + + + + 价格区间 + + + - + + + + + + + + + + + + + + + diff --git a/pages/goods/result/index.wxss b/pages/goods/result/index.wxss new file mode 100644 index 0000000..804ec53 --- /dev/null +++ b/pages/goods/result/index.wxss @@ -0,0 +1,110 @@ +page { + background-color: #fff; +} + +page view { + box-sizing: border-box; +} + +.result-container { + display: block; +} + +.result-container .t-search { + padding: 0 30rpx; + background-color: #fff; +} + +.result-container .t-class__input-container { + height: 64rpx !important; + border-radius: 32rpx !important; +} + +.result-container .t-search__left-icon { + display: flex; + align-items: center; +} + +.result-container .t-search__input { + font-size: 28rpx !important; + color: #333 !important; +} + +.result-container .category-goods-list { + background-color: #f2f2f2; + overflow-y: scroll; + padding: 20rpx 24rpx; + -webkit-overflow-scrolling: touch; +} + +.result-container .wr-goods-list { + background: #f2f2f2 !important; +} + +.result-container .t-image__mask { + display: flex !important; +} + +.result-container .empty-wrap { + margin-top: 184rpx; + margin-bottom: 120rpx; + height: 300rpx; +} + +.result-container .empty-wrap .empty-tips .empty-content .content-text { + margin-top: 40rpx; +} + +.result-container .price-container { + padding: 32rpx; + height: 100vh; + max-width: 632rpx; + background-color: #fff; + border-radius: 30rpx 0 0 30rpx; +} + +.result-container .price-between { + font-size: 26rpx; + font-weight: 500; + color: rgba(51, 51, 51, 1); +} + +.result-container .price-ipts-wrap { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-around; + margin-top: 24rpx; +} + +.result-container .price-ipts-wrap .price-divided { + position: relative; + width: 22rpx; + margin: 0 20rpx; + color: #222427; +} + +.result-container .price-ipts-wrap .price-ipt { + box-sizing: border-box; + width: 246rpx; + font-size: 24rpx; + height: 56rpx; + padding: 0 24rpx; + text-align: center; + border-radius: 8rpx; + color: #333; + background: rgba(245, 245, 245, 1); +} + +.t-class-input { + font-size: 24rpx !important; +} + +.result-container .price-ipts-wrap .price-ipt::after { + border: none !important; +} + +.result-container .t-input__control { + font-size: 24rpx !important; + text-align: center; +} diff --git a/pages/goods/search/index.js b/pages/goods/search/index.js new file mode 100644 index 0000000..c726041 --- /dev/null +++ b/pages/goods/search/index.js @@ -0,0 +1,119 @@ +import { + getSearchHistory, + getSearchPopular, +} from '../../../services/good/fetchSearchHistory'; + +Page({ + data: { + historyWords: [], + popularWords: [], + searchValue: '', + dialog: { + title: '确认删除当前历史记录', + showCancelButton: true, + message: '', + }, + dialogShow: false, + }, + + deleteType: 0, + deleteIndex: '', + + onShow() { + this.queryHistory(); + this.queryPopular(); + }, + + async queryHistory() { + try { + const data = await getSearchHistory(); + const code = 'Success'; + if (String(code).toUpperCase() === 'SUCCESS') { + const { historyWords = [] } = data; + this.setData({ + historyWords, + }); + } + } catch (error) { + console.error(error); + } + }, + + async queryPopular() { + try { + const data = await getSearchPopular(); + const code = 'Success'; + if (String(code).toUpperCase() === 'SUCCESS') { + const { popularWords = [] } = data; + this.setData({ + popularWords, + }); + } + } catch (error) { + console.error(error); + } + }, + + confirm() { + const { historyWords } = this.data; + const { deleteType, deleteIndex } = this; + historyWords.splice(deleteIndex, 1); + if (deleteType === 0) { + this.setData({ + historyWords, + dialogShow: false, + }); + } else { + this.setData({ historyWords: [], dialogShow: false }); + } + }, + + close() { + this.setData({ dialogShow: false }); + }, + + handleClearHistory() { + const { dialog } = this.data; + this.deleteType = 1; + this.setData({ + dialog: { + ...dialog, + message: '确认删除所有历史记录', + }, + dialogShow: true, + }); + }, + + deleteCurr(e) { + const { index } = e.currentTarget.dataset; + const { dialog } = this.data; + this.deleteIndex = index; + this.setData({ + dialog: { + ...dialog, + message: '确认删除当前历史记录', + deleteType: 0, + }, + dialogShow: true, + }); + }, + + handleHistoryTap(e) { + const { historyWords } = this.data; + const { dataset } = e.currentTarget; + const _searchValue = historyWords[dataset.index || 0] || ''; + if (_searchValue) { + wx.navigateTo({ + url: `/pages/goods/result/index?searchValue=${_searchValue}`, + }); + } + }, + + handleSubmit(e) { + const { value } = e.detail.value; + if (value.length === 0) return; + wx.navigateTo({ + url: `/pages/goods/result/index?searchValue=${value}`, + }); + }, +}); diff --git a/pages/goods/search/index.json b/pages/goods/search/index.json new file mode 100644 index 0000000..74abdf7 --- /dev/null +++ b/pages/goods/search/index.json @@ -0,0 +1,8 @@ +{ + "navigationBarTitleText": "搜索", + "usingComponents": { + "t-search": "tdesign-miniprogram/search/search", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-dialog": "tdesign-miniprogram/dialog/dialog" + } +} diff --git a/pages/goods/search/index.wxml b/pages/goods/search/index.wxml new file mode 100644 index 0000000..743f83c --- /dev/null +++ b/pages/goods/search/index.wxml @@ -0,0 +1,75 @@ + + + + + + + + + 历史搜索 + 清除 + + + + {{item}} + + + + + + 热门搜索 + + + + {{item}} + + + + + + + diff --git a/pages/goods/search/index.wxss b/pages/goods/search/index.wxss new file mode 100644 index 0000000..676603e --- /dev/null +++ b/pages/goods/search/index.wxss @@ -0,0 +1,79 @@ +.search-page { + box-sizing: border-box; + width: 100vw; + height: 100vh; + padding: 0 30rpx; +} + +.search-page .t-class__input-container { + height: 64rpx !important; + border-radius: 32rpx !important; +} + +.search-page .t-search__input { + font-size: 28rpx !important; + color: #333 !important; +} + +.search-page .search-wrap { + margin-top: 44rpx; +} + +.search-page .history-wrap { + margin-bottom: 20px; +} + +.search-page .search-header { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + align-items: center; +} + +.search-page .search-title { + font-size: 30rpx; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: rgba(51, 51, 51, 1); + line-height: 42rpx; +} + +.search-page .search-clear { + font-size: 24rpx; + font-family: PingFang SC; + line-height: 32rpx; + color: #999999; + font-weight: normal; +} + +.search-page .search-content { + overflow: hidden; + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: flex-start; + margin-top: 24rpx; +} + +.search-page .search-item { + color: #333333; + font-size: 24rpx; + line-height: 32rpx; + font-weight: normal; + margin-right: 24rpx; + margin-bottom: 24rpx; + background: #f5f5f5; + border-radius: 38rpx; + padding: 12rpx 24rpx; +} + +.search-page .hover-history-item { + position: relative; + top: 3rpx; + left: 3rpx; + box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.1) inset; +} + +.add-notes__confirm { + color: #fa4126 !important; +} diff --git a/pages/home/home.js b/pages/home/home.js new file mode 100644 index 0000000..43a74d7 --- /dev/null +++ b/pages/home/home.js @@ -0,0 +1,183 @@ +import { + fetchHome +} from '../../services/home/home'; +import { + fetchGoodsList +} from '../../services/good/fetchGoods'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { + isLogin +} from '../../services/permission/login' +import { + sessionUpload +} from '../../services/api/session' + +Page({ + data: { + imgSrcs: [], + tabList: [], + goodsList: [], + goodsListLoadStatus: 0, + pageLoading: false, + current: 1, + autoplay: true, + duration: 500, + interval: 5000, + navigation: { + type: 'dots' + }, + }, + + goodListPagination: { + index: 0, + num: 20, + }, + + privateData: { + tabIndex: 0, + }, + + onShow() { + this.getTabBar().init(); + }, + + onLoad() { + this.init(); + }, + + onReachBottom() { + if (this.data.goodsListLoadStatus === 0) { + this.loadGoodsList(); + } + }, + + onPullDownRefresh() { + this.init(); + }, + + init() { + this.loadHomePage(); + }, + + loadHomePage() { + wx.stopPullDownRefresh(); + + this.setData({ + pageLoading: true, + }); + fetchHome().then(({ + swiper, + tabList + }) => { + this.setData({ + tabList, + imgSrcs: swiper, + pageLoading: false, + }); + this.loadGoodsList(true); + }); + }, + + tabChangeHandle(e) { + this.privateData.tabIndex = e.detail; + this.loadGoodsList(true); + }, + + onReTry() { + this.loadGoodsList(); + }, + + async loadGoodsList(fresh = false) { + if (fresh) { + wx.pageScrollTo({ + scrollTop: 0, + }); + } + + this.setData({ + goodsListLoadStatus: 1 + }); + + const pageSize = this.goodListPagination.num; + let pageIndex = + this.privateData.tabIndex * pageSize + this.goodListPagination.index + 1; + if (fresh) { + pageIndex = 0; + } + + try { + const nextList = await fetchGoodsList(pageIndex, pageSize); + this.setData({ + goodsList: fresh ? nextList : this.data.goodsList.concat(nextList), + goodsListLoadStatus: 0, + }); + + this.goodListPagination.index = pageIndex; + this.goodListPagination.num = pageSize; + } catch (err) { + this.setData({ + goodsListLoadStatus: 3 + }); + } + }, + + goodListClickHandle(e) { + const { + index + } = e.detail; + const { + spuId + } = this.data.goodsList[index]; + wx.navigateTo({ + url: `/pages/goods/details/index?spuId=${spuId}`, + }); + }, + + goodListAddCartHandle() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击加入购物车', + }); + }, + + navToSearchPage() { + wx.navigateTo({ + url: '/pages/goods/search/index' + }); + }, + + navToActivityDetail(detail) { + console.log(detail); + const { + index: promotionID = 0 + } = detail || {}; + console.log(promotionID); + wx.navigateTo({ + url: `/pages/promotion-detail/index?promotion_id=${promotionID}`, + }); + }, + + // 上传图片 + uploadPicture() { + if (!isLogin()) { + return + } + let that = this; + wx.chooseMedia({ + count: 1, + mediaType: ['image'], + sourceType: ['album', 'camera'], + maxDuration: 30, + camera: 'back', + success(res) { + console.log(res.tempFiles); + if (res.tempFiles.length >= 1) { + sessionUpload({ + urls: res.tempFiles + }) + } + } + }) + }, +}); \ No newline at end of file diff --git a/pages/home/home.json b/pages/home/home.json new file mode 100644 index 0000000..25ef1e6 --- /dev/null +++ b/pages/home/home.json @@ -0,0 +1,19 @@ +{ + "navigationBarTitleText": "首页", + "onReachBottomDistance": 10, + "backgroundTextStyle": "light", + "usingComponents": { + "t-search": "tdesign-miniprogram/search/search", + "t-loading": "tdesign-miniprogram/loading/loading", + "t-swiper": "tdesign-miniprogram/swiper/swiper", + "t-swiper-item": "tdesign-miniprogram/swiper/swiper-item", + "t-swiper-nav": "tdesign-miniprogram/swiper/swiper-nav", + "t-image": "/components/webp-image/index", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-tabs": "tdesign-miniprogram/tabs/tabs", + "t-tab-panel": "tdesign-miniprogram/tabs/tab-panel", + "goods-list": "/components/goods-list/index", + "load-more": "/components/load-more/index" + } +} \ No newline at end of file diff --git a/pages/home/home.wxml b/pages/home/home.wxml new file mode 100644 index 0000000..153d692 --- /dev/null +++ b/pages/home/home.wxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/home/home.wxss b/pages/home/home.wxss new file mode 100644 index 0000000..340f26d --- /dev/null +++ b/pages/home/home.wxss @@ -0,0 +1,129 @@ +page { + box-sizing: border-box; + padding-bottom: calc(env(safe-area-inset-bottom) + 96rpx); +} + +.t-tabs.t-tabs--top .t-tabs__scroll { + border-bottom: none !important; +} + +.home-page-header { + background: linear-gradient(#fff, #f5f5f5); +} + +.home-page-container { + /* background: #ad4242; */ + margin-top: 10px; + height: 400px; + position: relative; +} + +.home-page-ad { + background: rgb(231, 255, 226); + width: 100%; + height: 80px; + position: fixed; + left: 0; + bottom: 82px; +} + +.home-page-container .searich_btn { + position: absolute; + left: 0; + right: 0; + bottom: 0; + top: 0; + margin: auto; + border-radius: 20px; + box-shadow: 4px 4px 4px 4px rgb(187, 187, 187); +} + +.home-page-container, +.home-page-header { + display: block; + padding: 0 24rpx; +} + +.home-page-header .t-search__input-container { + border-radius: 32rpx !important; + height: 64rpx !important; +} + +.home-page-header .t-search__input { + font-size: 28rpx !important; + color: rgb(116, 116, 116) !important; +} + +.home-page-header .swiper-wrap { + margin-top: 20rpx; +} + +.home-page-header .t-image__swiper { + width: 100%; + height: 300rpx; + border-radius: 10rpx; +} + +.home-page-container .t-tabs { + background: #f5f5f5; +} + +.home-page-container .t-tabs .t-tabs-nav { + background-color: transparent; + line-height: 80rpx; + font-size: 28rpx; + color: #333; +} + +.home-page-container .t-tabs .t-tabs-scroll { + border: none !important; +} + +/* 半个字 */ +.home-page-container .tab.order-nav .order-nav-item.scroll-width { + min-width: 165rpx; +} + +.home-page-container .tab .order-nav-item.active { + color: #fa550f !important; +} + +.home-page-container .tab .bottom-line { + border-radius: 4rpx; +} + +.home-page-container .tab .order-nav-item.active .bottom-line { + background-color: #fa550f !important; +} + +.home-page-container .tabs-external__item { + color: #666 !important; + font-size: 28rpx; +} + +.home-page-container .tabs-external__active { + color: #333333 !important; + font-size: 32rpx; +} + +.home-page-container .tabs-external__track { + background-color: #fa4126 !important; + height: 6rpx !important; + border-radius: 4rpx !important; + width: 48rpx !important; +} + +.t-tabs.t-tabs--top .t-tabs__item, +.t-tabs.t-tabs--bottom .t-tabs__item { + height: 86rpx !important; +} + +.home-page-container .goods-list-container { + background: #f5f5f5 !important; + margin-top: 24rpx; +} + +.t-class-indicator, +.loading-text { + color: #b9b9b9 !important; +} \ No newline at end of file diff --git a/pages/home/readme b/pages/home/readme new file mode 100644 index 0000000..fcf75d5 --- /dev/null +++ b/pages/home/readme @@ -0,0 +1,8 @@ +首页功能设定 +1. loading入场 +2. 下拉刷新 +3. 搜索栏 +4. 分类切换 +5. 商品列表 +6. 规格弹层 +7. 加载更多 \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js new file mode 100644 index 0000000..aadb4bd --- /dev/null +++ b/pages/index/index.js @@ -0,0 +1,66 @@ +// pages/index/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml new file mode 100644 index 0000000..a7772aa --- /dev/null +++ b/pages/index/index.wxml @@ -0,0 +1,2 @@ + +pages/index/index.wxml diff --git a/pages/order/after-service-detail/api.js b/pages/order/after-service-detail/api.js new file mode 100644 index 0000000..22d62fe --- /dev/null +++ b/pages/order/after-service-detail/api.js @@ -0,0 +1,34 @@ +import { resp } from '../after-service-list/api'; +import dayjs from 'dayjs'; +import { mockIp, mockReqId } from '../../../utils/mock'; + +export const formatTime = (date, template) => dayjs(date).format(template); + +export function getRightsDetail({ rightsNo }) { + const _resq = { + data: {}, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 79, + success: true, + }; + _resq.data = + resp.data.dataList.filter((item) => item.rights.rightsNo === rightsNo) || + {}; + return Promise.resolve(_resq); +} + +export function cancelRights() { + const _resq = { + data: {}, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 79, + success: true, + }; + return Promise.resolve(_resq); +} diff --git a/pages/order/after-service-detail/index.js b/pages/order/after-service-detail/index.js new file mode 100644 index 0000000..0093961 --- /dev/null +++ b/pages/order/after-service-detail/index.js @@ -0,0 +1,209 @@ +import Toast from 'tdesign-miniprogram/toast/index'; +import { ServiceType, ServiceTypeDesc, ServiceStatus } from '../config'; +import { formatTime, getRightsDetail } from './api'; + +const TitleConfig = { + [ServiceType.ORDER_CANCEL]: '退款详情', + [ServiceType.ONLY_REFUND]: '退款详情', + [ServiceType.RETURN_GOODS]: '退货退款详情', +}; + +Page({ + data: { + pageLoading: true, + serviceRaw: {}, + service: {}, + deliveryButton: {}, + gallery: { + current: 0, + show: false, + proofs: [], + }, + showProofs: false, + backRefresh: false, + }, + + onLoad(query) { + this.rightsNo = query.rightsNo; + this.inputDialog = this.selectComponent('#input-dialog'); + this.init(); + }, + + onShow() { + // 当从其他页面返回,并且 backRefresh 被置为 true 时,刷新数据 + if (!this.data.backRefresh) return; + this.init(); + this.setData({ backRefresh: false }); + }, + + // 页面刷新,展示下拉刷新 + onPullDownRefresh_(e) { + const { callback } = e.detail; + return this.getService().then(() => callback && callback()); + }, + + init() { + this.setData({ pageLoading: true }); + this.getService().then(() => { + this.setData({ pageLoading: false }); + }); + }, + + getService() { + const params = { rightsNo: this.rightsNo }; + return getRightsDetail(params).then((res) => { + const serviceRaw = res.data[0]; + // 滤掉填写运单号、修改运单号按钮,这两个按钮特殊处理,不在底部按钮栏展示 + if (!serviceRaw.buttonVOs) serviceRaw.buttonVOs = []; + const deliveryButton = {}; + const service = { + id: serviceRaw.rights.rightsNo, + serviceNo: serviceRaw.rights.rightsNo, + storeName: serviceRaw.rights.storeName, + type: serviceRaw.rights.rightsType, + typeDesc: ServiceTypeDesc[serviceRaw.rights.rightsType], + status: serviceRaw.rights.rightsStatus, + statusIcon: this.genStatusIcon(serviceRaw.rights), + statusName: serviceRaw.rights.userRightsStatusName, + statusDesc: serviceRaw.rights.userRightsStatusDesc, + amount: serviceRaw.rights.refundRequestAmount, + goodsList: (serviceRaw.rightsItem || []).map((item, i) => ({ + id: i, + thumb: item.goodsPictureUrl, + title: item.goodsName, + specs: (item.specInfo || []).map((s) => s.specValues || ''), + itemRefundAmount: item.itemRefundAmount, + rightsQuantity: item.rightsQuantity, + })), + orderNo: serviceRaw.rights.orderNo, // 订单编号 + rightsNo: serviceRaw.rights.rightsNo, // 售后服务单号 + rightsReasonDesc: serviceRaw.rights.rightsReasonDesc, // 申请售后原因 + isRefunded: + serviceRaw.rights.userRightsStatus === ServiceStatus.REFUNDED, // 是否已退款 + refundMethodList: (serviceRaw.refundMethodList || []).map((m) => ({ + name: m.refundMethodName, + amount: m.refundMethodAmount, + })), // 退款明细 + refundRequestAmount: serviceRaw.rights.refundRequestAmount, // 申请退款金额 + payTraceNo: serviceRaw.rightsRefund.traceNo, // 交易流水号 + createTime: formatTime( + parseFloat(`${serviceRaw.rights.createTime}`), + 'YYYY-MM-DD HH:mm', + ), // 申请时间 + logisticsNo: serviceRaw.logisticsVO.logisticsNo, // 退货物流单号 + logisticsCompanyName: serviceRaw.logisticsVO.logisticsCompanyName, // 退货物流公司 + logisticsCompanyCode: serviceRaw.logisticsVO.logisticsCompanyCode, // 退货物流公司 + remark: serviceRaw.logisticsVO.remark, // 退货备注 + receiverName: serviceRaw.logisticsVO.receiverName, // 收货人 + receiverPhone: serviceRaw.logisticsVO.receiverPhone, // 收货人电话 + receiverAddress: this.composeAddress(serviceRaw), // 收货人地址 + applyRemark: serviceRaw.rightsRefund.refundDesc, // 申请退款时的填写的说明 + buttons: serviceRaw.buttonVOs || [], + logistics: serviceRaw.logisticsVO, + }; + const proofs = serviceRaw.rights.rightsImageUrls || []; + this.setData({ + serviceRaw, + service, + deliveryButton, + 'gallery.proofs': proofs, + showProofs: + serviceRaw.rights.userRightsStatus === ServiceStatus.PENDING_VERIFY && + (service.applyRemark || proofs.length > 0), + }); + wx.setNavigationBarTitle({ + title: TitleConfig[service.type], + }); + }); + }, + + composeAddress(service) { + return [ + service.logisticsVO.receiverProvince, + service.logisticsVO.receiverCity, + service.logisticsVO.receiverCountry, + service.logisticsVO.receiverArea, + service.logisticsVO.receiverAddress, + ] + .filter((item) => !!item) + .join(' '); + }, + + onRefresh() { + this.init(); + }, + + editLogistices() { + this.setData({ + inputDialogVisible: true, + }); + this.inputDialog.setData({ + cancelBtn: '取消', + confirmBtn: '确定', + }); + this.inputDialog._onComfirm = () => { + Toast({ + message: '确定填写物流单号', + }); + }; + }, + + onProofTap(e) { + if (this.data.gallery.show) { + this.setData({ + 'gallery.show': false, + }); + return; + } + const { index } = e.currentTarget.dataset; + this.setData({ + 'gallery.show': true, + 'gallery.current': index, + }); + }, + + onGoodsCardTap(e) { + const { index } = e.currentTarget.dataset; + const goods = this.data.serviceRaw.rightsItem[index]; + wx.navigateTo({ url: `/pages/goods/details/index?skuId=${goods.skuId}` }); + }, + + onServiceNoCopy() { + wx.setClipboardData({ + data: this.data.service.serviceNo, + }); + }, + + onAddressCopy() { + wx.setClipboardData({ + data: `${this.data.service.receiverName} ${this.data.service.receiverPhone}\n${this.data.service.receiverAddress}`, + }); + }, + + /** 获取状态ICON */ + genStatusIcon(item) { + const { userRightsStatus, afterSaleRequireType } = item; + switch (userRightsStatus) { + // 退款成功 + case ServiceStatus.REFUNDED: { + return 'succeed'; + } + // 已取消、已关闭 + case ServiceStatus.CLOSED: { + return 'indent_close'; + } + default: { + switch (afterSaleRequireType) { + case 'REFUND_MONEY': { + return 'goods_refund'; + } + case 'REFUND_GOODS_MONEY': + return 'goods_return'; + default: { + return 'goods_return'; + } + } + } + } + }, +}); diff --git a/pages/order/after-service-detail/index.json b/pages/order/after-service-detail/index.json new file mode 100644 index 0000000..dc4df43 --- /dev/null +++ b/pages/order/after-service-detail/index.json @@ -0,0 +1,20 @@ +{ + "navigationBarTitleText": "", + "usingComponents": { + "wr-loading-content": "/components/loading-content/index", + "wr-price": "/components/price/index", + "wr-service-goods-card": "../components/order-goods-card/index", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh", + "t-grid": "tdesign-miniprogram/grid/grid", + "t-grid-item": "tdesign-miniprogram/grid/grid-item", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-input": "tdesign-miniprogram/input/input", + "t-swiper": "tdesign-miniprogram/swiper/swiper", + "wr-after-service-button-bar": "../components/after-service-button-bar/index", + "t-image": "/components/webp-image/index" + } +} \ No newline at end of file diff --git a/pages/order/after-service-detail/index.wxml b/pages/order/after-service-detail/index.wxml new file mode 100644 index 0000000..dff24db --- /dev/null +++ b/pages/order/after-service-detail/index.wxml @@ -0,0 +1,223 @@ + + + + + + + + + + {{service.statusName}} + + + {{service.statusDesc}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 复制 + + + + {{service.receiverAddress}} + + 收货人:{{service.receiverName}} + 收货人手机:{{service.receiverName}} + + + + + + + + + + + x {{goods.rightsQuantity}} + + + + + + + + + 复制 + + + + + + + + + + + + + + + + + + + + + + + + 物流单号 + + {{amountTip}} + + + + diff --git a/pages/order/after-service-detail/index.wxss b/pages/order/after-service-detail/index.wxss new file mode 100644 index 0000000..e604dd6 --- /dev/null +++ b/pages/order/after-service-detail/index.wxss @@ -0,0 +1,443 @@ +:host { + background-color: #f5f5f5; +} + +.service-detail { + position: relative; +} + +.service-detail wr-service-goods-card .wr-goods-card__body { + margin-left: 50rpx; +} + +.order-goods-card-footer { + display: flex; + width: calc(100% - 190rpx); + justify-content: space-between; + position: absolute; + bottom: 20rpx; + left: 190rpx; +} + +.order-goods-card-footer-num { + color: #999; + line-height: 40rpx; +} + +.service-detail .order-goods-card-footer .order-goods-card-footer-price-class { + font-size: 36rpx; + color: #333; + font-family: DIN Alternate; +} + +.service-detail + .order-goods-card-footer + .order-goods-card-footer-price-decimal { + font-size: 28rpx; + color: #333; + font-family: DIN Alternate; +} + +.service-detail .order-goods-card-footer .order-goods-card-footer-price-symbol { + color: #333; + font-size: 24rpx; + font-family: DIN Alternate; +} + +.service-detail .service-detail__header { + padding: 60rpx 0 48rpx 40rpx; + box-sizing: border-box; + height: 220rpx; + background-color: #fff; +} +.service-detail .service-detail__header .title, +.service-detail .service-detail__header .desc { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; +} + +.service-detail .service-detail__header .title { + -webkit-line-clamp: 1; + font-size: 48rpx; + font-weight: bold; + color: #333; + display: flex; +} + +.service-detail .service-detail__header .desc { + -webkit-line-clamp: 2; + margin-top: 10rpx; + font-size: 28rpx; + color: #999; +} + +.service-detail .service-detail__header .desc .count-down { + color: #fff185; + display: inline; +} + +.service-detail .service-section { + margin: 20rpx 0 20rpx 0; + padding: 30rpx 32rpx; + width: auto; + border-radius: 8rpx; + background-color: white; + overflow: hidden; +} +.service-section__pay { + margin: 0 0 20rpx 0; + width: auto; + border-radius: 8rpx; + background-color: white; + overflow: hidden; +} +.service-detail .service-section__title { + color: #333333; + margin-bottom: 10rpx; + height: 200rpx; + position: relative; +} +.service-detail .service-section__title .icon { + margin-right: 16rpx; + font-size: 40rpx !important; +} +.service-detail .service-section__title .right { + flex: none; + font-weight: normal; + font-size: 26rpx; +} +.service-detail .section-content { + margin: 16rpx 0 0 52rpx; +} + +.service-detail .main { + font-size: 28rpx; + color: #222427; + font-weight: bold; +} + +.service-detail .main .phone-num { + margin-left: 16rpx; + display: inline; +} +.service-detail .label { + color: #999999; + font-size: 26rpx; +} + +.service-detail .custom-remark { + font-size: 26rpx; + line-height: 36rpx; + color: #333333; + word-wrap: break-word; +} +.service-detail .proofs { + margin-top: 20rpx; +} + +.service-detail .proofs .proof { + width: 100%; + height: 100%; + background-color: #f9f9f9; +} + +.service-detail .pay-result .t-cell-title, +.service-detail .pay-result .t-cell-value { + color: #666666; + font-size: 28rpx; +} + +.t-class-wrapper { + padding: 10rpx 24rpx !important; +} + +.t-class-wrapper-first-child { + padding: 24rpx !important; +} + +.service-detail .pay-result .wr-cell__value { + font-weight: bold; +} +.service-detail .right { + font-size: 36rpx; + color: #fa550f; + font-weight: bold; +} + +.service-detail .title { + font-weight: bold; +} + +.service-detail .pay-result .service-section__title .right.integer { + font-size: 48rpx; +} +.service-detail .pay-result .split-line { + position: relative; +} + +.service-detail .pay-result .split-line::after { + position: absolute; + display: block; + content: ' '; + height: 1px; + left: -50%; + right: -50%; + transform: scale(0.5); + background-color: #e6e6e6; +} + +.service-detail .pay-result .section-content { + margin-left: 0; +} + +.service-detail .pay-result .section-content .label { + color: #999999; + font-size: 24rpx; +} + +.service-detail .pay-result .wr-cell::after { + left: 0; +} + +.service-detail .footer-bar-wrapper { + height: 100rpx; +} + +.service-detail .footer-bar-wrapper .footer-bar { + position: fixed; + left: 0; + bottom: 0; + height: 100rpx; + width: 100vw; + box-sizing: border-box; + padding: 0 20rpx; + background-color: white; + display: flex; + justify-content: space-between; + align-items: center; +} + +.service-detail .text-btn { + display: inline; + color: #333; + border: 2rpx solid #efefef; + border-radius: 25rpx; + margin-left: 10rpx; + padding: 0 30rpx; + font-weight: normal; + font-size: 24rpx; +} +.service-detail .text-btn--active { + opacity: 0.5; +} + +.service-detail .specs-popup .bottom-btn { + color: #fa550f; +} +.service-detail .specs-popup .bottom-btn::after { + color: #fa550f; +} + +.dialog .dialog__button-confirm { + color: #fa550f; +} + +.page-container + .order-goods-card + > wr-goods-card + .wr-goods-card__bottom + .price { + top: 100rpx; + left: 10rpx; + position: absolute; + color: #333; +} + +.page-container .order-goods-card > wr-goods-card .wr-goods-card__num { + top: 100rpx; + right: 0; + position: absolute; +} + +.page-container + .order-goods-card + > wr-goods-card + .wr-goods-card__bottom + .price::before { + display: inline; + content: '退款金额:'; + margin-right: 1em; + font-size: 24rpx; + color: #333333; + font-weight: normal; +} + +.page-container .wr-goods-card__specs { + margin: 14rpx 20rpx 0 0; +} + +.page-container .order-goods-card > wr-goods-card .wr-goods-card__title { + margin-right: 0; + -webkit-line-clamp: 1; + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + width: 80%; +} + +.page-container .order-card .header .store-name { + -webkit-line-clamp: 1; + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + width: 80%; +} + +.page-container .status-desc { + box-sizing: border-box; + padding: 22rpx 20rpx; + font-size: 26rpx; + line-height: 1.3; + text-align: left; + color: #333333; + background-color: #f5f5f5; + border-radius: 8rpx; + word-wrap: break-word; + margin-top: 40rpx; + margin-bottom: 20rpx; +} + +.page-container .header__right { + font-size: 24rpx; + color: #333333; + display: flex; + align-items: center; +} + +.page-container .header__right__icon { + color: #d05b27; + font-size: 16px !important; + margin-right: 10rpx; +} + +.page-container .wr-goods-card__thumb { + width: 140rpx; +} +.page-container .page-background { + position: absolute; + z-index: -1; + top: 0; + left: 0; + width: 100vw; + color: #fff; + overflow: hidden; +} +.page-container .page-background-img { + width: 100%; + height: 320rpx !important; +} +.page-container .navbar-bg .nav-back, +.page-container .navbar-bg .page-background { + background: linear-gradient( + to right, + rgba(250, 85, 15, 1) 0%, + rgba(250, 85, 15, 0.6) 100% + ) !important; +} + +.page-container .navigation-bar__btn { + font-size: 40rpx !important; + font-weight: bold !important; + color: #333; +} + +.t-class-title { + color: #000; +} + +.refresh-bar { + background: linear-gradient(90deg, #ff6b44 0%, #ed3427 100%) !important; +} + +.page-container .navigation-bar__inner .navigation-bar__left { + padding-left: 16rpx; +} + +.t-refund-info { + font-size: 26rpx; + color: #666; +} + +.t-refund-grid-image { + width: 212rpx !important; + height: 212rpx !important; +} + +.t-refund-info-img { + width: 100%; + height: 100%; +} + +.t-refund-wrapper { + padding: 10rpx 24rpx 10rpx 20rpx !important; +} + +.t-refund-title { + font-size: 28rpx; + color: #333; + font-weight: bold; +} + +.t-refund-note { + font-size: 26rpx; + color: #333 !important; +} + +.service-detail .logistics { + padding-top: 0; + padding-bottom: 0; + padding-right: 0; +} + +.service-section__title__header { + display: flex; + align-items: center; + color: #333; + font-weight: normal; + font-size: 32rpx; +} + +.safe-bottom { + padding-bottom: env(safe-area-inset-bottom); +} + +.service-section-logistics { + display: flex; + justify-content: center; + color: #fa4126; + align-items: center; + margin-top: 24rpx; +} +.add-notes__confirm { + color: #fa4126 !important; +} +.t-class-indicator { + color: #b9b9b9 !important; +} + +.service-detail .goods-refund-address { + padding-top: 0; + padding-bottom: 0; +} + +.service-detail .goods-refund-address .goods-refund-address-copy-btn { + position: absolute; + top: 22rpx; + right: 0; +} + +.service-detail .service-goods-card-wrap { + padding-top: 0; + padding-bottom: 0; +} diff --git a/pages/order/after-service-list/api.js b/pages/order/after-service-list/api.js new file mode 100644 index 0000000..68bbf56 --- /dev/null +++ b/pages/order/after-service-list/api.js @@ -0,0 +1,1278 @@ +/* eslint-disable */ +import { mockIp, mockReqId } from '../../../utils/mock'; + +export const resp = { + data: { + pageNum: 1, + pageSize: 10, + totalCount: 51, + states: { + audit: 1, + approved: 6, + complete: 2, + closed: 1, + }, + dataList: [ + { + buttonVOs: [ + { + name: '修改运单号', + primary: false, + type: 4, + }, + { + name: '查看物流', + primary: false, + type: 5, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + refundMethodList: [ + { + refundMethodAmount: 99999, + refundMethodName: '微信支付', + }, + { + refundMethodAmount: 100000, + refundMethodName: '银行卡支付', + }, + ], + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '123123423', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 50, + rightsStatusName: '已完成', + rightsType: 20, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 120, + userRightsStatusDesc: + '商家已退款,退回资金将原路三个工作日返回您的账户', + userRightsStatusName: '已退款', + afterSaleRequireType: 'REFUND_MONEY', + rightsImageUrls: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + ], + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + { + actualPrice: 9999, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '华为手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 9999, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 8123129, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + refundDesc: '由于您信誉良好,商家同意退款', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: 'SF2380380982034', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '顺丰', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + nodes: [ + { + title: '已签收', + icon: 'https://cdn-we-retail.ym.tencent.com/tsr/icon/order.png', + code: '200003', + desc: '商家已签收,感谢使用顺丰,期待再次为您服务', + date: '2020-09-11 11:34:53', + }, + { + title: '运输中', + icon: 'https://cdn-we-retail.ym.tencent.com/tsr/icon/deliver.png', + desc: '快件已到达成都中转站', + code: '200002', + date: '2020-07-16 11:16:31', + }, + { + title: '已寄出', + icon: 'https://cdn-we-retail.ym.tencent.com/tsr/icon/deliver.png', + desc: '买家已寄出,物流承运商:顺丰速运', + date: '2020-07-16 11:16:21', + }, + ], + }, + }, + { + buttonVOs: [ + { + name: '填写运单号', + primary: false, + type: 3, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + rightsImageUrls: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + ], + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234231', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 20, + rightsStatusName: '已审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 100, + userRightsStatusDesc: '商家已审核确认,预计1小时内发起退款', + userRightsStatusName: '商家已审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + refundDesc: '由于您信誉良好,商家同意退款', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: 'SA9208097023203', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '申通快递', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '撤销申请', + primary: false, + type: 2, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + rightsImageUrls: [ + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + ], + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234232', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 60, + rightsStatusName: '已关闭', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 100, + userRightsStatusDesc: '商家将尽快确认您的退款申请', + userRightsStatusName: '等待商家审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + refundDesc: '实际商品与描述不符', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: 'SF9343043084', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '顺丰', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + refundMethodList: [ + { + refundMethodAmount: 99999, + refundMethodName: '微信支付', + }, + { + refundMethodAmount: 100000, + refundMethodName: '银行卡支付', + }, + ], + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234233', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 50, + rightsStatusName: '已完成', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: + '大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 160, + userRightsStatusDesc: '退款/售后已完成', + userRightsStatusName: '已完成', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '修改运单号', + primary: false, + type: 4, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234234', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 20, + rightsStatusName: '已审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 1, + userRightsStatusDesc: '商家已审核确认,预计1小时内发起退款', + userRightsStatusName: '商家已审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '80900909', + logisticsStatus: null, + logisticsCompanyCode: '0004', + logisticsCompanyName: '顺丰快递', + remark: '质量问题,申请退货退款', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '撤销申请', + primary: false, + type: 2, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234235', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 10, + rightsStatusName: '待审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: + '大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店-大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 1, + userRightsStatusDesc: + '商家将在24小时内审核,如24小时后商家仍未审核,系统将自动审核通过', + userRightsStatusName: '待商家审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: + '小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '修改运单号', + primary: false, + type: 4, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234236', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 20, + rightsStatusName: '已审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 1, + userRightsStatusDesc: '商家已审核确认,预计1小时内发起退款', + userRightsStatusName: '商家已审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '90900808', + logisticsStatus: null, + logisticsCompanyCode: '0002', + logisticsCompanyName: '申通快递', + remark: '质量问题,申请退货退款', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '填写运单号', + primary: false, + type: 3, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234237', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 20, + rightsStatusName: '已审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 1, + userRightsStatusDesc: '商家已审核确认,预计1小时内发起退款', + userRightsStatusName: '商家已审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '撤销申请', + primary: false, + type: 2, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '123131231238', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234238', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 20, + rightsStatusName: '已审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 1, + userRightsStatusDesc: '商家已审核确认,预计1小时内发起退款', + userRightsStatusName: '商家已审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: '小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + { + buttonVOs: [ + { + name: '填写运单号', + primary: false, + type: 3, + }, + ], + saasId: '8888', + storeId: '2591', + uid: '88881046205', + createTime: '1596524705613', + rights: { + bizRightsStatus: 1, + bizRightsStatusName: '退款退货', + createTime: '1596524705613', + orderNo: '12313123123', + refundAmount: 99999, + refundRequestAmount: 999999, + rightsMethod: 1, + rightsNo: '1231234239', + rightsParentNo: '78970', + rightsReasonDesc: '太贵了,不想要了', + rightsReasonType: 10, + rightsStatus: 20, + rightsStatusName: '已审核', + rightsType: 10, + saasId: 123, + shippingFee: 99, + shippingFeeBear: 1, + storeId: 123, + storeName: '大猫集团旗舰店', + uid: '123', + updateTime: '1596524705613', + userRightsStatus: 1, + userRightsStatusDesc: '商家已审核确认,预计1小时内发起退款', + userRightsStatusName: '商家已审核', + }, + rightsItem: [ + { + actualPrice: 888, + createTime: '1596524705613', + disconutInfo: '现在下单,立刻优惠100元', + goodsName: + '小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机-小米手机', + goodsPictureUrl: + 'https://cdn-we-retail.ym.tencent.com/tsr/goods/nz-09a.png', + goodsViceType: 1, + itemDiscountAmount: 123123, + itemRefundAmount: 888, + itemStatus: 2, + itemTotalAmount: 9913, + orderNo: '12312333', + parentOrderNo: '1231234', + rightsId: 423423, + rightsNo: '112333', + rightsParentNo: '345345', + rightsQuantity: 12, + saasId: 123, + skuId: 812312, + specInfo: [ + { + specTitle: '测试dr超长', + specValues: '超长测试超长测试1', + }, + { + specTitle: 'bwtgg01', + specValues: 'eee', + }, + ], + updateTime: '1596524705613', + }, + ], + rightsRefund: { + callbackTime: '1596524705613', + channel: '微信支付', + channelTrxNo: '123123', + createTime: '1596524705613', + memo: '无摘要', + refundAmount: 9999, + refundStatus: 1, + requestTime: '1596524705613', + successTime: '1596524705613', + traceNo: '123123', + updateTime: '1596524705613', + }, + logisticsVO: { + logisticsType: 1, + logisticsNo: '', + logisticsStatus: null, + logisticsCompanyCode: '', + logisticsCompanyName: '', + receiverAddressId: '20', + provinceCode: '440000', + cityCode: '440300', + countryCode: '440306', + receiverProvince: '广东省', + receiverCity: '深圳市', + receiverCountry: '南山区', + receiverArea: '', + receiverAddress: '清风路御龙湾', + receiverPostCode: '', + receiverLongitude: '113.880562', + receiverLatitude: '22.56271', + receiverIdentity: '88881046205', + receiverPhone: '18371736717', + receiverName: '周杰伦', + expectArrivalTime: null, + senderName: '刘德华', + senderPhone: '1273109238123', + senderAddress: '北京市昌平区大丰家园三号楼四单元108号', + sendTime: null, + arrivalTime: null, + }, + }, + ], + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 79, + success: true, +}; + +export function getRightsList({ parameter: { afterServiceStatus, pageNum } }) { + const _resq = JSON.parse(JSON.stringify(resp)); + if (pageNum > 3) _resq.data.dataList = []; + if (afterServiceStatus > -1) { + _resq.data.dataList = _resq.data.dataList.filter( + (item) => item.rights.rightsStatus === afterServiceStatus, + ); + } + return Promise.resolve(_resq); +} diff --git a/pages/order/after-service-list/index.js b/pages/order/after-service-list/index.js new file mode 100644 index 0000000..7cd0cd5 --- /dev/null +++ b/pages/order/after-service-list/index.js @@ -0,0 +1,220 @@ +import { getRightsList } from './api'; +import { AfterServiceStatus, ServiceType, ServiceTypeDesc } from '../config'; + +Page({ + page: { + size: 10, + num: 1, + }, + + data: { + tabs: [ + { + key: -1, + text: '全部', + }, + { + key: AfterServiceStatus.TO_AUDIT, + text: '待审核', + }, + { + key: AfterServiceStatus.THE_APPROVED, + text: '已审核', + }, + { + key: AfterServiceStatus.COMPLETE, + text: '已完成', + }, + { + key: AfterServiceStatus.CLOSED, + text: '已关闭', + }, + ], + curTab: -1, + dataList: [], + listLoading: 0, // 0-未加载,1-加载中,2-已全部加载 + pullDownRefreshing: false, // 下拉刷新时不显示load-more + emptyImg: + 'https://cdn-we-retail.ym.tencent.com/miniapp/order/empty-order-list.png', + backRefresh: false, + }, + + onLoad(query) { + let status = parseInt(query.status); + status = this.data.tabs.map((t) => t.key).includes(status) ? status : -1; + this.init(status); + this.pullDownRefresh = this.selectComponent('#wr-pull-down-refresh'); + }, + + onShow() { + // 当从其他页面返回,并且 backRefresh 被置为 true 时,刷新数据 + if (!this.data.backRefresh) return; + this.onRefresh(); + this.setData({ + backRefresh: false, + }); + }, + + onReachBottom() { + if (this.data.listLoading === 0) { + this.getAfterServiceList(this.data.curTab); + } + }, + + onPageScroll(e) { + this.pullDownRefresh && this.pullDownRefresh.onPageScroll(e); + }, + + onPullDownRefresh_(e) { + const { callback } = e.detail; + this.setData({ + pullDownRefreshing: true, + }); // 下拉刷新时不显示load-more + this.refreshList(this.data.curTab) + .then(() => { + this.setData({ + pullDownRefreshing: false, + }); + callback && callback(); + }) + .catch((err) => { + this.setData({ + pullDownRefreshing: false, + }); + Promise.reject(err); + }); + }, + + init(status) { + status = status !== undefined ? status : this.data.curTab; + this.refreshList(status); + }, + + getAfterServiceList(statusCode = -1, reset = false) { + const params = { + parameter: { + pageSize: this.page.size, + pageNum: this.page.num, + }, + }; + if (statusCode !== -1) params.parameter.afterServiceStatus = statusCode; + this.setData({ + listLoading: 1, + }); + return getRightsList(params) + .then((res) => { + this.page.num++; + let dataList = []; + let { tabs } = this.data; + if (res && res.data && res.data.states) { + tabs = this.data.tabs.map((item) => { + switch (item.key) { + case AfterServiceStatus.TO_AUDIT: + item.info = res.data.states.audit; + break; + case AfterServiceStatus.THE_APPROVED: + item.info = res.data.states.approved; + break; + case AfterServiceStatus.COMPLETE: + item.info = res.data.states.complete; + break; + case AfterServiceStatus.CLOSED: + item.info = res.data.states.closed; + break; + } + return item; + }); + } + if (res && res.data && res.data.dataList) { + dataList = (res.data.dataList || []).map((_data) => { + return { + id: _data.rights.rightsNo, + serviceNo: _data.rights.rightsNo, + storeName: _data.rights.storeName, + type: _data.rights.rightsType, + typeDesc: ServiceTypeDesc[_data.rights.rightsType], + typeDescIcon: + _data.rightsType === ServiceType.ONLY_REFUND + ? 'money-circle' + : 'return-goods-1', + status: _data.rights.rightsStatus, + statusName: _data.rights.userRightsStatusName, + statusDesc: _data.rights.userRightsStatusDesc, + amount: _data.rights.refundAmount, + goodsList: _data.rightsItem.map((item, i) => ({ + id: i, + thumb: item.goodsPictureUrl, + title: item.goodsName, + specs: (item.specInfo || []).map((s) => s.specValues || ''), + itemRefundAmount: item.itemRefundAmount, + rightsQuantity: item.itemRefundAmount, + })), + storeId: _data.storeId, + buttons: _data.buttonVOs || [], + logisticsNo: _data.logisticsVO.logisticsNo, // 退货物流单号 + logisticsCompanyName: _data.logisticsVO.logisticsCompanyName, // 退货物流公司 + logisticsCompanyCode: _data.logisticsVO.logisticsCompanyCode, // 退货物流公司 + remark: _data.logisticsVO.remark, // 退货备注 + logisticsVO: _data.logisticsVO, + }; + }); + } + return new Promise((resolve) => { + if (reset) { + this.setData( + { + dataList: [], + }, + () => resolve(), + ); + } else resolve(); + }).then(() => { + this.setData({ + tabs, + dataList: this.data.dataList.concat(dataList), + listLoading: dataList.length > 0 ? 0 : 2, + }); + }); + }) + .catch((err) => { + this.setData({ + listLoading: 3, + }); + return Promise.reject(err); + }); + }, + + onReTryLoad() { + this.getAfterServiceList(this.data.curTab); + }, + + onTabChange(e) { + const { value } = e.detail; + const tab = this.data.tabs.find((v) => v.key === value); + if (!tab) return; + this.refreshList(value); + }, + + refreshList(status = -1) { + this.page = { + size: 10, + num: 1, + }; + this.setData({ + curTab: status, + dataList: [], + }); + return this.getAfterServiceList(status, true); + }, + + onRefresh() { + this.refreshList(this.data.curTab); + }, + + // 点击订单卡片 + onAfterServiceCardTap(e) { + wx.navigateTo({ + url: `/pages/order/after-service-detail/index?rightsNo=${e.currentTarget.dataset.order.id}`, + }); + }, +}); diff --git a/pages/order/after-service-list/index.json b/pages/order/after-service-list/index.json new file mode 100644 index 0000000..46b5d09 --- /dev/null +++ b/pages/order/after-service-list/index.json @@ -0,0 +1,15 @@ +{ + "navigationBarTitleText": "退款/售后", + "usingComponents": { + "wr-load-more": "/components/load-more/index", + "wr-after-service-button-bar": "../components/after-service-button-bar/index", + "wr-price": "/components/price/index", + "wr-order-card": "../components/order-card/index", + "wr-goods-card": "../components/goods-card/index", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-empty": "tdesign-miniprogram/empty/empty", + "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh" + } +} \ No newline at end of file diff --git a/pages/order/after-service-list/index.wxml b/pages/order/after-service-list/index.wxml new file mode 100644 index 0000000..41ddd74 --- /dev/null +++ b/pages/order/after-service-list/index.wxml @@ -0,0 +1,73 @@ + + + + + + + {{order.typeDesc}} + + + + + + x {{goods.rightsQuantity}} + + + + {{order.statusDesc}} + + + + + + + + + 暂无退款或售后申请记录 + + + + + + + + diff --git a/pages/order/after-service-list/index.wxss b/pages/order/after-service-list/index.wxss new file mode 100644 index 0000000..d518cbc --- /dev/null +++ b/pages/order/after-service-list/index.wxss @@ -0,0 +1,103 @@ +:host { + background-color: #f5f5f5; +} + +.list-loading { + height: 100rpx; +} + +.empty-wrapper { + height: calc(100vh - 88rpx); +} + +.page-container .order-goods-card-footer { + display: flex; + width: calc(100% - 190rpx); + justify-content: space-between; + position: absolute; + bottom: 20rpx; + left: 190rpx; +} + +.page-container .order-goods-card-footer .order-goods-card-footer-num { + color: #999; + line-height: 40rpx; +} + +.page-container .order-goods-card-footer .order-goods-card-footer-price-class { + font-size: 36rpx; + color: #333; + font-family: DIN Alternate; +} + +.page-container .order-goods-card-footer .order-goods-card-footer-price-decimal { + font-size: 28rpx; + color: #333; + font-family: DIN Alternate; +} + +.page-container .order-goods-card-footer .order-goods-card-footer-price-symbol { + color: #333; + font-size: 24rpx; + font-family: DIN Alternate; +} + +.page-container .wr-goods-card__specs { + margin: 14rpx 20rpx 0 0; +} + +.page-container .order-goods-card > wr-goods-card .wr-goods-card__title { + margin-right: 0; + -webkit-line-clamp: 1; +} + +.page-container .order-card .header .store-name { + width: 80%; + -webkit-line-clamp: 1; +} + +.page-container .order-card .header .store-name > view { + overflow: hidden; + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; +} + +.page-container .status-desc { + box-sizing: border-box; + padding: 22rpx 20rpx; + font-size: 26rpx; + line-height: 1.3; + text-align: left; + color: #333333; + background-color: #f5f5f5; + border-radius: 8rpx; + word-wrap: break-word; + margin-top: 24rpx; + margin-bottom: 20rpx; +} + +.page-container .header__right { + font-size: 24rpx; + color: #fa4126; + display: flex; + align-items: center; +} + +.page-container .header__right__icon { + color: #d05b27; + font-size: 16px !important; + margin-right: 10rpx; +} + +.t-class-indicator { + color: #b9b9b9 !important; +} + +.add-notes__confirm { + color: #fa4126 !important; +} + +.page-container .header-class { + margin-bottom: 5rpx!important; +} \ No newline at end of file diff --git a/pages/order/apply-service/index.js b/pages/order/apply-service/index.js new file mode 100644 index 0000000..6b6dc2d --- /dev/null +++ b/pages/order/apply-service/index.js @@ -0,0 +1,454 @@ +import Dialog from 'tdesign-miniprogram/dialog/index'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { priceFormat } from '../../../utils/util'; +import { OrderStatus, ServiceType, ServiceReceiptStatus } from '../config'; +import reasonSheet from '../components/reason-sheet/reasonSheet'; +import { + fetchRightsPreview, + dispatchConfirmReceived, + fetchApplyReasonList, + dispatchApplyService, +} from '../../../services/order/applyService'; + +Page({ + query: {}, + data: { + uploading: false, // 凭证上传状态 + canApplyReturn: true, // 是否可退货 + goodsInfo: {}, + receiptStatusList: [ + { desc: '未收到货', status: ServiceReceiptStatus.NOT_RECEIPTED }, + { desc: '已收到货', status: ServiceReceiptStatus.RECEIPTED }, + ], + applyReasons: [], + serviceType: null, // 20-仅退款,10-退货退款 + serviceFrom: { + returnNum: 1, + receiptStatus: { desc: '请选择', status: null }, + applyReason: { desc: '请选择', type: null }, + // max-填写上限(单位分),current-当前值(单位分),temp输入框中的值(单位元) + amount: { max: 0, current: 0, temp: 0, focus: false }, + remark: '', + rightsImageUrls: [], + }, + maxApplyNum: 2, // 最大可申请售后的商品数 + amountTip: '', + showReceiptStatusDialog: false, + validateRes: { + valid: false, + msg: '', + }, + submitting: false, + inputDialogVisible: false, + uploadGridConfig: { + column: 3, + width: 212, + height: 212, + }, + serviceRequireType: '', + }, + + setWatcher(key, callback) { + let lastData = this.data; + const keys = key.split('.'); + keys.slice(0, -1).forEach((k) => { + lastData = lastData[k]; + }); + const lastKey = keys[keys.length - 1]; + this.observe(lastData, lastKey, callback); + }, + + observe(data, k, callback) { + let val = data[k]; + Object.defineProperty(data, k, { + configurable: true, + enumerable: true, + set: (value) => { + val = value; + callback(); + }, + get: () => { + return val; + }, + }); + }, + + validate() { + let valid = true; + let msg = ''; + // 检查必填项 + if (!this.data.serviceFrom.applyReason.type) { + valid = false; + msg = '请填写退款原因'; + } else if (!this.data.serviceFrom.amount.current) { + valid = false; + msg = '请填写退款金额'; + } + if (this.data.serviceFrom.amount.current <= 0) { + valid = false; + msg = '退款金额必须大于0'; + } + this.setData({ validateRes: { valid, msg } }); + }, + + onLoad(query) { + this.query = query; + if (!this.checkQuery()) return; + this.setData({ + canApplyReturn: query.canApplyReturn === 'true', + }); + this.init(); + this.inputDialog = this.selectComponent('#input-dialog'); + this.setWatcher('serviceFrom.returnNum', this.validate.bind(this)); + this.setWatcher('serviceFrom.applyReason', this.validate.bind(this)); + this.setWatcher('serviceFrom.amount', this.validate.bind(this)); + this.setWatcher('serviceFrom.rightsImageUrls', this.validate.bind(this)); + }, + + async init() { + try { + await this.refresh(); + } catch (e) {} + }, + + checkQuery() { + const { orderNo, skuId } = this.query; + if (!orderNo) { + Dialog.alert({ + content: '请先选择订单', + }).then(() => { + wx.redirectTo({ url: 'pages/order/order-list/index' }); + }); + return false; + } + if (!skuId) { + Dialog.alert({ + content: '请先选择商品', + }).then(() => { + wx.redirectTo(`pages/order/order-detail/index?orderNo=${orderNo}`); + }); + return false; + } + return true; + }, + + async refresh() { + wx.showLoading({ title: 'loading' }); + try { + const res = await this.getRightsPreview(); + wx.hideLoading(); + const goodsInfo = { + id: res.data.skuId, + thumb: res.data.goodsInfo && res.data.goodsInfo.skuImage, + title: res.data.goodsInfo && res.data.goodsInfo.goodsName, + spuId: res.data.spuId, + skuId: res.data.skuId, + specs: ((res.data.goodsInfo && res.data.goodsInfo.specInfo) || []).map( + (s) => s.specValue, + ), + paidAmountEach: res.data.paidAmountEach, + boughtQuantity: res.data.boughtQuantity, + }; + this.setData({ + goodsInfo, + 'serviceFrom.amount': { + max: res.data.refundableAmount, + current: res.data.refundableAmount, + }, + 'serviceFrom.returnNum': res.data.numOfSku, + amountTip: `最多可申请退款¥ ${priceFormat( + res.data.refundableAmount, + 2, + )},含发货运费¥ ${priceFormat(res.data.shippingFeeIncluded, 2)}`, + maxApplyNum: res.data.numOfSkuAvailable, + }); + } catch (err) { + wx.hideLoading(); + throw err; + } + }, + + async getRightsPreview() { + const { orderNo, skuId, spuId } = this.query; + const params = { + orderNo, + skuId, + spuId, + numOfSku: this.data.serviceFrom.returnNum, + }; + const res = await fetchRightsPreview(params); + return res; + }, + + onApplyOnlyRefund() { + wx.setNavigationBarTitle({ title: '申请退款' }); + this.setData({ serviceRequireType: 'REFUND_MONEY' }); + this.switchReceiptStatus(0); + }, + + onApplyReturnGoods() { + wx.setNavigationBarTitle({ title: '申请退货退款' }); + this.setData({ serviceRequireType: 'REFUND_GOODS' }); + const orderStatus = parseInt(this.query.orderStatus); + Promise.resolve() + .then(() => { + if (orderStatus === OrderStatus.PENDING_RECEIPT) { + return Dialog.confirm({ + title: '订单商品是否已经收到货', + content: '', + confirmBtn: '确认收货,并申请退货', + cancelBtn: '未收到货', + }).then(() => { + return dispatchConfirmReceived({ + parameter: { + logisticsNo: this.query.logisticsNo, + orderNo: this.query.orderNo, + }, + }); + }); + } + return; + }) + .then(() => { + this.setData({ serviceType: ServiceType.RETURN_GOODS }); + this.switchReceiptStatus(1); + }); + }, + + onApplyReturnGoodsStatus() { + reasonSheet({ + show: true, + title: '选择退款原因', + options: this.data.applyReasons.map((r) => ({ + title: r.desc, + })), + showConfirmButton: true, + showCancelButton: true, + emptyTip: '请选择退款原因', + }).then((indexes) => { + this.setData({ + 'serviceFrom.applyReason': this.data.applyReasons[indexes[0]], + }); + }); + }, + + onChangeReturnNum(e) { + const { value } = e.detail; + this.setData( + { + 'serviceFrom.returnNum': value, + }, + () => { + this.refresh(); + }, + ); + }, + + onApplyGoodsStatus() { + reasonSheet({ + show: true, + title: '请选择收货状态', + options: this.data.receiptStatusList.map((r) => ({ + title: r.desc, + })), + showConfirmButton: true, + emptyTip: '请选择收货状态', + }).then((indexes) => { + this.setData({ + 'serviceFrom.receiptStatus': this.data.receiptStatusList[indexes[0]], + }); + }); + }, + + switchReceiptStatus(index) { + const statusItem = this.data.receiptStatusList[index]; + // 没有找到对应的状态,则清空/初始化 + if (!statusItem) { + this.setData({ + showReceiptStatusDialog: false, + 'serviceFrom.receiptStatus': { desc: '请选择', status: null }, + 'serviceFrom.applyReason': { desc: '请选择', type: null }, // 收货状态改变时,初始化申请原因 + applyReasons: [], + }); + return; + } + // 仅选中项与当前项不一致时,才切换申请原因列表applyReasons + if ( + !statusItem || + statusItem.status === this.data.serviceFrom.receiptStatus.status + ) { + this.setData({ showReceiptStatusDialog: false }); + return; + } + this.getApplyReasons(statusItem.status).then((reasons) => { + this.setData({ + showReceiptStatusDialog: false, + 'serviceFrom.receiptStatus': statusItem, + 'serviceFrom.applyReason': { desc: '请选择', type: null }, // 收货状态改变时,重置申请原因 + applyReasons: reasons, + }); + }); + }, + + getApplyReasons(receiptStatus) { + const params = { rightsReasonType: receiptStatus }; + return fetchApplyReasonList(params) + .then((res) => { + return res.data.rightsReasonList.map((reason) => ({ + type: reason.id, + desc: reason.desc, + })); + }) + .catch(() => { + return []; + }); + }, + + onReceiptStatusDialogConfirm(e) { + const { index } = e.currentTarget.dataset; + this.switchReceiptStatus(index); + }, + + onAmountTap() { + this.setData({ + 'serviceFrom.amount.temp': priceFormat( + this.data.serviceFrom.amount.current, + ), + 'serviceFrom.amount.focus': true, + inputDialogVisible: true, + }); + this.inputDialog.setData({ + cancelBtn: '取消', + confirmBtn: '确定', + }); + this.inputDialog._onComfirm = () => { + this.setData({ + 'serviceFrom.amount.current': this.data.serviceFrom.amount.temp * 100, + }); + }; + this.inputDialog._onCancel = () => {}; + }, + + // 对输入的值进行过滤 + onAmountInput(e) { + let { value } = e.detail; + const regRes = value.match(/\d+(\.?\d*)?/); // 输入中,允许末尾为小数点 + value = regRes ? regRes[0] : ''; + this.setData({ 'serviceFrom.amount.temp': value }); + }, + + // 失去焦点时,更严格的过滤并转化为float + onAmountBlur(e) { + let { value } = e.detail; + const regRes = value.match(/\d+(\.?\d+)?/); // 失去焦点时,不允许末尾为小数点 + value = regRes ? regRes[0] : '0'; + value = parseFloat(value) * 100; + if (value > this.data.serviceFrom.amount.max) { + value = this.data.serviceFrom.amount.max; + } + this.setData({ + 'serviceFrom.amount.temp': priceFormat(value), + 'serviceFrom.amount.focus': false, + }); + }, + + onAmountFocus() { + this.setData({ 'serviceFrom.amount.focus': true }); + }, + + onRemarkChange(e) { + const { value } = e.detail; + this.setData({ + 'serviceFrom.remark': value, + }); + }, + + // 发起申请售后请求 + onSubmit() { + this.submitCheck().then(() => { + const params = { + rights: { + orderNo: this.query.orderNo, + refundRequestAmount: this.data.serviceFrom.amount.current, + rightsImageUrls: this.data.serviceFrom.rightsImageUrls, + rightsReasonDesc: this.data.serviceFrom.applyReason.desc, + rightsReasonType: this.data.serviceFrom.receiptStatus.status, + rightsType: this.data.serviceType, + }, + rightsItem: [ + { + itemTotalAmount: + this.data.goodsInfo.price * this.data.serviceFrom.returnNum, + rightsQuantity: this.data.serviceFrom.returnNum, + skuId: this.query.skuId, + spuId: this.query.spuId, + }, + ], + refundMemo: this.data.serviceFrom.remark.current, + }; + this.setData({ submitting: true }); + // 发起申请售后请求 + dispatchApplyService(params) + .then((res) => { + Toast({ + context: this, + selector: '#t-toast', + message: '申请成功', + icon: '', + }); + + wx.redirectTo({ + url: `/pages/order/after-service-detail/index?rightsNo=${res.data.rightsNo}`, + }); + }) + .then(() => this.setData({ submitting: false })) + .catch(() => this.setData({ submitting: false })); + }); + }, + + submitCheck() { + return new Promise((resolve) => { + const { msg, valid } = this.data.validateRes; + if (!valid) { + Toast({ + context: this, + selector: '#t-toast', + message: msg, + icon: '', + }); + return; + } + resolve(); + }); + }, + + handleSuccess(e) { + const { files } = e.detail; + this.setData({ + 'sessionFrom.rightsImageUrls': files, + }); + }, + + handleRemove(e) { + const { index } = e.detail; + const { + sessionFrom: { rightsImageUrls }, + } = this.data; + rightsImageUrls.splice(index, 1); + this.setData({ + 'sessionFrom.rightsImageUrls': rightsImageUrls, + }); + }, + + handleComplete() { + this.setData({ + uploading: false, + }); + }, + + handleSelectChange() { + this.setData({ + uploading: true, + }); + }, +}); diff --git a/pages/order/apply-service/index.json b/pages/order/apply-service/index.json new file mode 100644 index 0000000..cfeaf7d --- /dev/null +++ b/pages/order/apply-service/index.json @@ -0,0 +1,19 @@ +{ + "navigationBarTitleText": "选择售后类型", + "usingComponents": { + "wr-price": "/components/price/index", + "wr-order-goods-card": "../components/order-goods-card/index", + "wr-reason-sheet": "../components/reason-sheet/index", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-button": "tdesign-miniprogram/button/button", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-stepper": "tdesign-miniprogram/stepper/stepper", + "t-popup": "tdesign-miniprogram/popup/popup", + "t-textarea": "tdesign-miniprogram/textarea/textarea", + "t-input": "tdesign-miniprogram/input/input", + "t-uploader": "tdesign-miniprogram/upload/upload" + } +} \ No newline at end of file diff --git a/pages/order/apply-service/index.wxml b/pages/order/apply-service/index.wxml new file mode 100644 index 0000000..8c451d6 --- /dev/null +++ b/pages/order/apply-service/index.wxml @@ -0,0 +1,220 @@ + + + + + + x {{goodsInfo.boughtQuantity}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 修改 + + + + + + + + + + + + + + + + + + + 上传凭证 + (最多3张) + + + + + + + 提交 + + + + + + + + + + {{item.desc}} + + + 取消 + + + + + + + 退款金额 + + + ¥ + + {{amountTip}} + + + + + diff --git a/pages/order/apply-service/index.wxss b/pages/order/apply-service/index.wxss new file mode 100644 index 0000000..c4ed87f --- /dev/null +++ b/pages/order/apply-service/index.wxss @@ -0,0 +1,290 @@ +:host { + background-color: #f5f5f5; +} +.select-service .service-form .service-from-group { + margin-top: 20rpx; +} +.select-service .service-form { + padding-bottom: calc(env(safe-area-inset-bottom) + 80rpx); +} + +.order-goods-card-footer { + display: flex; + width: calc(100% - 190rpx); + justify-content: space-between; + position: absolute; + bottom: 0; + left: 190rpx; +} + +.order-goods-card-footer-num { + color: #999; +} + +.select-service .order-goods-card-footer .order-goods-card-footer-price-class { + font-size: 36rpx; + color: #333; + font-family: DIN Alternate; +} +.select-service + .order-goods-card-footer + .order-goods-card-footer-price-decimal { + font-size: 28rpx; + color: #333; + font-family: DIN Alternate; +} +.select-service .order-goods-card-footer .order-goods-card-footer-price-symbol { + color: #333; + font-size: 24rpx; + font-family: DIN Alternate; +} + +.select-service .remark { + min-height: 110rpx; + border-radius: 10rpx; + margin-top: 20rpx; + background-color: #f5f5f5; +} +.select-service .remark::after { + border: none; +} + +.select-service .special-cell .special-cell-note { + display: flex; + flex-direction: column; +} + +.select-service .special-cell .wr-cell__title { + margin-right: 100rpx; +} + +.select-service .special-cell .special-cell-note-price-class { + font-size: 36rpx; + color: #fa4126; + font-family: DIN Alternate; +} +.select-service .special-cell .special-cell-note-price-decimal { + font-size: 28rpx; + color: #fa4126; + font-family: DIN Alternate; +} +.select-service .special-cell .special-cell-note-price-symbol { + color: #fa4126; + font-size: 24rpx; + font-family: DIN Alternate; +} + +.select-service .bottom-bar__btn { + width: 686rpx; + background-color: #fa4126; + color: white; + font-size: 32rpx; + border-radius: 48rpx; + position: absolute; + left: 50%; + top: 20rpx; + transform: translateX(-50%); +} +.select-service .bottom-bar__btn::after { + border: none; +} +.select-service .bottom-bar__btn.disabled { + background-color: #c6c6c6; +} +.select-service .bottom-bar__btn.disabled::after { + border: none; +} +.select-service .order-goods-card .wr-goods-card { + padding: 0 30rpx; +} + +.order-goods-card-footer { + display: flex; + width: calc(100% - 190rpx); + justify-content: space-between; + position: absolute; + bottom: 20rpx; + left: 190rpx; +} + +.order-goods-card-footer-num { + color: #999; + line-height: 40rpx; +} + +.order-goods-card-title-class { + width: 10rpx !important; +} + +.input-dialog__content .input-dialog__input { + font-size: 72rpx !important; + height: 64rpx; +} + +.input-dialog__content { + text-align: left; +} + +.input-dialog__content .input { + font-size: 48rpx; + padding-left: 0; + padding-right: 0; +} + +.input-dialog__content .tips { + margin-top: 24rpx; + font-size: 24rpx; + color: #999999; +} + +.t-input__name { + width: 10rpx !important; +} + +.input-dialog__title { + color: #333; + font-size: 32rpx; + font-weight: normal; +} + +.dialog--service-status { + background-color: #f3f4f5; + overflow: hidden; +} +.dialog--service-status .options .option { + color: #333333; + font-size: 30rpx; + text-align: center; + height: 100rpx; + line-height: 100rpx; + background-color: white; +} +.dialog--service-status .options .option:not(:last-child) { + border-bottom: 1rpx solid #e6e6e6; +} +.dialog--service-status .options .option--active { + opacity: 0.5; +} +.dialog--service-status .options .option.main { + color: #fa4126; +} +.dialog--service-status .cancel { + color: #333333; + font-size: 30rpx; + text-align: center; + height: 100rpx; + line-height: 100rpx; + background-color: white; + margin-top: 20rpx; +} +.dialog--service-status .cancel--active { + opacity: 0.5; +} +.amount-dialog--focus .popup__content--center, +.remark-dialog--focus .popup__content--center { + top: 100rpx; + transform: translate(-50%, 0); +} +.dialog .dialog__button-confirm { + color: #fa4126; + color: var(--color-primary, #fa4126); +} +.select-service .bottom-bar { + background-color: #fff; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 158rpx; + z-index: 3; +} +.order-goods-card { + background: #fff; + margin-bottom: 24rpx; +} +.add-notes__confirm { + color: #fa4126 !important; +} +.service-from-group__wrapper { + display: flex; + flex-direction: column; + font-family: DIN Alternate; + font-weight: bold; + font-size: 36rpx; + text-align: right; + color: #fa4126; +} +.service-from-group__price { + display: flex; + align-items: center; + color: #bbb; + font-size: 24rpx; + position: relative; + left: 30rpx; +} +.service-from-group__textarea { + margin-top: 32rpx; + background: #f5f5f5 !important; + border-radius: 16rpx; +} +.service-from-group__textarea + .t-textarea__wrapper + .t-textarea__wrapper-textarea { + height: 136rpx; + box-sizing: border-box; +} +.service-from-group__grid { + padding: 0 32rpx 48rpx; + background: #fff; + margin-bottom: 148rpx; +} +.select-service .t-cell__left { + margin-right: 0 !important; +} + +.refund-money__description { + font-size: 24rpx !important; +} + +.upload-desc { + text-align: center; + display: flex; + flex-direction: column; + font-size: 24rpx; + color: #999; +} + +.t-cell__left__icon { + position: relative; + top: -24rpx; + margin-right: 18rpx; +} + +.service-choice .t-cell__title-text { + color: #333; + font-weight: bold; +} + +.service-form + .service-from-group + .service-from-group__wrapper + .refund-money-price-class { + font-size: 36rpx; + font-family: DIN Alternate; +} + +.service-form + .service-from-group + .service-from-group__wrapper + .refund-money-price-decimal { + font-size: 28rpx; + font-family: DIN Alternate; +} + +.service-form + .service-from-group + .service-from-group__wrapper + .refund-money-price-symbol { + font-size: 24rpx; + font-family: DIN Alternate; +} diff --git a/pages/order/components/after-service-button-bar/index.js b/pages/order/components/after-service-button-bar/index.js new file mode 100644 index 0000000..c1f813d --- /dev/null +++ b/pages/order/components/after-service-button-bar/index.js @@ -0,0 +1,95 @@ +import Dialog from 'tdesign-miniprogram/dialog/index'; +import Toast from 'tdesign-miniprogram/toast/index'; + +import { cancelRights } from '../../after-service-detail/api'; +import { ServiceButtonTypes } from '../../config'; + +Component({ + properties: { + service: { + type: Object, + observer(service) { + const buttonsRight = service.buttons || service.buttonVOs || []; + this.setData({ + buttons: { + left: [], + right: buttonsRight, + }, + }); + }, + }, + }, + + data: { + service: {}, + buttons: { + left: [], + right: [], + }, + }, + + methods: { + // 点击【订单操作】按钮,根据按钮类型分发 + onServiceBtnTap(e) { + const { type } = e.currentTarget.dataset; + switch (type) { + case ServiceButtonTypes.REVOKE: + this.onConfirm(this.data.service); + break; + case ServiceButtonTypes.FILL_TRACKING_NO: + this.onFillTrackingNo(this.data.service); + break; + case ServiceButtonTypes.CHANGE_TRACKING_NO: + this.onChangeTrackingNo(this.data.service); + break; + case ServiceButtonTypes.VIEW_DELIVERY: + this.viewDelivery(this.data.service); + break; + } + }, + + onFillTrackingNo(service) { + wx.navigateTo({ + url: `/pages/order/fill-tracking-no/index?rightsNo=${service.id}`, + }); + }, + + viewDelivery(service) { + wx.navigateTo({ + url: `/pages/order/delivery-detail/index?data=${JSON.stringify( + service.logistics || service.logisticsVO, + )}&source=2`, + }); + }, + + onChangeTrackingNo(service) { + wx.navigateTo({ + url: `/pages/order/fill-tracking-no/index?rightsNo=${ + service.id + }&logisticsNo=${service.logisticsNo}&logisticsCompanyName=${ + service.logisticsCompanyName + }&logisticsCompanyCode=${service.logisticsCompanyCode}&remark=${ + service.remark || '' + }`, + }); + }, + + onConfirm() { + Dialog.confirm({ + title: '是否撤销退货申请?', + content: '', + confirmBtn: '撤销申请', + cancelBtn: '不撤销', + }).then(() => { + const params = { rightsNo: this.data.service.id }; + return cancelRights(params).then(() => { + Toast({ + context: this, + selector: '#t-toast', + message: '你确认撤销申请', + }); + }); + }); + }, + }, +}); diff --git a/pages/order/components/after-service-button-bar/index.json b/pages/order/components/after-service-button-bar/index.json new file mode 100644 index 0000000..75d1e24 --- /dev/null +++ b/pages/order/components/after-service-button-bar/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-button": "tdesign-miniprogram/button/button" + } +} diff --git a/pages/order/components/after-service-button-bar/index.wxml b/pages/order/components/after-service-button-bar/index.wxml new file mode 100644 index 0000000..8f48e2a --- /dev/null +++ b/pages/order/components/after-service-button-bar/index.wxml @@ -0,0 +1,31 @@ + + + + {{leftBtn.name}} + + + + + {{rightBtn.name}} + + + + diff --git a/pages/order/components/after-service-button-bar/index.wxss b/pages/order/components/after-service-button-bar/index.wxss new file mode 100644 index 0000000..2c31839 --- /dev/null +++ b/pages/order/components/after-service-button-bar/index.wxss @@ -0,0 +1,46 @@ +:host { + width: 100%; +} +.btn-bar { + display: flex; + justify-content: space-between; + align-items: center; + line-height: 1; +} +.btn-bar .order-btn { + background-color: inherit; + font-size: 26rpx; + padding: 16rpx 28rpx; + line-height: 1; + border-radius: unset; + min-width: 160rpx; + border-radius: 32rpx; + height: 60rpx; + margin-right: 10rpx; +} + +.btn-bar .left .order-btn:not(:first-child), +.btn-bar .right .order-btn:not(:first-child) { + margin-left: 20rpx; +} +.btn-bar .left .delete-btn { + font-size: 22rpx; +} +.btn-bar .left .delete-btn::after { + display: none; +} +.btn-bar .right .normal { + color: #333; + font-size: 28rpx; +} +.btn-bar .right .normal:after { + border-color: #bbbbbb; +} +.btn-bar .right .primary { + color: #fa550f; + color: var(--color-primary, #fa550f); +} +.btn-bar .right .primary:after { + border-color: #fa550f; + border-color: var(--color-primary, #fa550f); +} diff --git a/pages/order/components/customer-service/index.js b/pages/order/components/customer-service/index.js new file mode 100644 index 0000000..419b97f --- /dev/null +++ b/pages/order/components/customer-service/index.js @@ -0,0 +1,38 @@ +Component({ + externalClasses: ['wr-class'], + + properties: { + phoneNumber: String, + desc: String, + }, + + data: { + show: false, + }, + + methods: { + onBtnTap() { + this.setData({ + show: true, + }); + }, + + onDialogClose() { + this.setData({ + show: false, + }); + }, + + onCall() { + const { phoneNumber } = this.properties; + wx.makePhoneCall({ + phoneNumber, + }); + }, + onCallOnlineService() { + wx.showToast({ + title: '你点击了在线客服', + }); + }, + }, +}); diff --git a/pages/order/components/customer-service/index.json b/pages/order/components/customer-service/index.json new file mode 100644 index 0000000..6e4c04e --- /dev/null +++ b/pages/order/components/customer-service/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup" + } +} diff --git a/pages/order/components/customer-service/index.wxml b/pages/order/components/customer-service/index.wxml new file mode 100644 index 0000000..f5413a4 --- /dev/null +++ b/pages/order/components/customer-service/index.wxml @@ -0,0 +1,23 @@ + +联系客服 + + + + + 服务时间: + {{desc}} + + + 呼叫 {{phoneNumber}} + + 在线客服 + 取消 + + + + diff --git a/pages/order/components/customer-service/index.wxss b/pages/order/components/customer-service/index.wxss new file mode 100644 index 0000000..75f0363 --- /dev/null +++ b/pages/order/components/customer-service/index.wxss @@ -0,0 +1,48 @@ +.text-btn { + display: inline; + color: #333; + font-size: 24rpx; +} +.text-btn--active { + opacity: 0.5; +} +.dialog--customer-service { + background-color: #f3f4f5; + overflow: hidden; +} +.dialog--customer-service .content { + font-size: 26rpx; + margin: 32rpx 30rpx; + text-align: center; +} +.dialog--customer-service .content .title { + display: inline; + color: #999999; + font-weight: bold; +} +.dialog--customer-service .content .subtitle { + display: inline; + color: #999999; +} +.dialog--customer-service .options .option { + color: #333333; + font-size: 30rpx; + text-align: center; + height: 100rpx; + line-height: 100rpx; + background-color: white; +} +.dialog--customer-service .options .option:not(:last-child) { + margin-bottom: 20rpx; +} +.dialog--customer-service .options .option--active { + opacity: 0.5; +} +.dialog--customer-service .options .option.main { + color: #333; +} +.dialog--customer-service .options .option.online { + position: relative; + top: -17rpx; + margin-bottom: 2rpx; +} diff --git a/pages/order/components/goods-card/index.js b/pages/order/components/goods-card/index.js new file mode 100644 index 0000000..a4409e3 --- /dev/null +++ b/pages/order/components/goods-card/index.js @@ -0,0 +1,264 @@ +Component({ + options: { + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + addGlobalClass: true, + }, + intersectionObserverContext: null, + + externalClasses: [ + 'card-class', + 'title-class', + 'desc-class', + 'num-class', + 'thumb-class', + 'specs-class', + 'price-class', + 'origin-price-class', + 'price-prefix-class', + ], + + relations: { + '../order-card/index': { + type: 'ancestor', + linked(target) { + this.parent = target; + }, + }, + }, + + properties: { + hidden: { + // 设置为null代表不做类型转换 + type: null, + value: false, + observer(hidden) { + // null就是代表没有设置,没有设置的话不setData,防止祖先组件触发的setHidden操作被覆盖 + if (hidden !== null) { + this.setHidden(!!hidden); + } + }, + }, + id: { + type: String, + // `goods-card-88888888` + // 不能在这里写生成逻辑,如果在这里写,那么假设有多个goods-list时,他们将共享这个值 + value: '', + observer: (id) => { + this.genIndependentID(id); + if (this.properties.thresholds?.length) { + this.createIntersectionObserverHandle(); + } + }, + }, + data: { + type: Object, + observer(goods) { + // 有ID的商品才渲染 + if (!goods) { + return; + } + + /** 划线价是否有效 */ + let isValidityLinePrice = true; + // 判断一次划线价格是否合理 + if ( + goods.originPrice && + goods.price && + goods.originPrice < goods.price + ) { + isValidityLinePrice = false; + } + + // 敲定换行数量默认值 + if (goods.lineClamp === undefined || goods.lineClamp <= 0) { + // tag数组长度 大于0 且 可见 + // 指定换行为1行 + if ((goods.tags?.length || 0) > 0 && !goods.hideKey?.tags) { + goods.lineClamp = 1; + } else { + goods.lineClamp = 2; + } + } + + this.setData({ goods, isValidityLinePrice }); + }, + }, + layout: { + type: String, + value: 'horizontal', + }, + thumbMode: { + type: String, + value: 'aspectFill', + }, + thumbWidth: Number, + thumbHeight: Number, + priceFill: { + type: Boolean, + value: true, + }, + currency: { + type: String, + value: '¥', + }, + lazyLoad: { + type: Boolean, + value: false, + }, + centered: { + type: Boolean, + value: false, + }, + showCart: { + type: Boolean, + value: false, + }, + pricePrefix: { + type: String, + value: '', + }, + cartSize: { + type: Number, + value: 48, + }, + cartColor: { + type: String, + value: '#FA550F', + }, + /** 元素可见监控阈值, 数组长度大于0就创建 */ + thresholds: { + type: Array, + value: [], + observer(current) { + if (current && current.length) { + this.createIntersectionObserverHandle(); + } else { + this.clearIntersectionObserverHandle(); + } + }, + }, + specsIconClassPrefix: { + type: String, + value: 'wr', + }, + specsIcon: { + type: String, + value: 'expand_more', + }, + addCartIconClassPrefix: { + type: String, + value: 'wr', + }, + addCartIcon: { + type: String, + value: 'cart', + }, + }, + + data: { + hiddenInData: false, + independentID: '', + goods: { id: '' }, + /** 保证划线价格不小于原价,否则不渲染划线价 */ + isValidityLinePrice: false, + }, + + lifetimes: { + ready() { + this.init(); + }, + detached() { + this.clear(); + }, + }, + + methods: { + clickHandle() { + this.triggerEvent('click', { goods: this.data.goods }); + }, + clickThumbHandle() { + this.triggerEvent('thumb', { goods: this.data.goods }); + }, + clickTagHandle(evt) { + const { index } = evt.currentTarget.dataset; + this.triggerEvent('tag', { goods: this.data.goods, index }); + }, + // 加入购物车 + addCartHandle(e) { + const { id } = e.currentTarget; + const { id: cardID } = e.currentTarget.dataset; + this.triggerEvent('add-cart', { + ...e.detail, + id, + cardID, + goods: this.data.goods, + }); + }, + genIndependentID(id, cb) { + let independentID; + if (id) { + independentID = id; + } else { + // `goods-card-88888888` + independentID = `goods-card-${~~(Math.random() * 10 ** 8)}`; + } + this.setData({ independentID }, cb); + }, + + init() { + const { thresholds, id, hidden } = this.properties; + if (hidden !== null) { + this.setHidden(!!hidden); + } + + this.genIndependentID(id || '', () => { + if (thresholds && thresholds.length) { + this.createIntersectionObserverHandle(); + } + }); + }, + + clear() { + this.clearIntersectionObserverHandle(); + }, + + setHidden(hidden) { + this.setData({ hiddenInData: !!hidden }); + }, + + createIntersectionObserverHandle() { + if (this.intersectionObserverContext || !this.data.independentID) { + return; + } + + this.intersectionObserverContext = wx + .createIntersectionObserver(this, { + thresholds: this.properties.thresholds, + }) + .relativeToViewport(); + + this.intersectionObserverContext.observe( + `#${this.data.independentID}`, + (res) => { + this.intersectionObserverCB(res); + }, + ); + }, + intersectionObserverCB(ob) { + this.triggerEvent('ob', { + goods: this.data.goods, + context: this.intersectionObserverContext, + ob, + }); + }, + clearIntersectionObserverHandle() { + if (this.intersectionObserverContext) { + try { + this.intersectionObserverContext.disconnect(); + } catch (e) {} + + this.intersectionObserverContext = null; + } + }, + }, +}); diff --git a/pages/order/components/goods-card/index.json b/pages/order/components/goods-card/index.json new file mode 100644 index 0000000..0dbb3d8 --- /dev/null +++ b/pages/order/components/goods-card/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "price": "/components/price/index", + "t-image": "/components/webp-image/index", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/order/components/goods-card/index.wxml b/pages/order/components/goods-card/index.wxml new file mode 100644 index 0000000..b14aed5 --- /dev/null +++ b/pages/order/components/goods-card/index.wxml @@ -0,0 +1,77 @@ + + diff --git a/pages/order/components/goods-card/index.wxss b/pages/order/components/goods-card/index.wxss new file mode 100644 index 0000000..7bcb096 --- /dev/null +++ b/pages/order/components/goods-card/index.wxss @@ -0,0 +1,254 @@ +.wr-goods-card { + box-sizing: border-box; + font-size: 24rpx; +} +.wr-goods-card__main { + position: relative; + display: flex; + line-height: 1; + flex-direction: row; + background: transparent; + padding: 16rpx 0rpx; +} +.wr-goods-card.center .wr-goods-card__main { + align-items: center; + justify-content: center; +} +.wr-goods-card__thumb { + flex-shrink: 0; + position: relative; + width: 176rpx; + height: 176rpx; +} +.wr-goods-card__thumb-com { + width: 176rpx; + height: 176rpx; + border-radius: 8rpx; + overflow: hidden; +} +.wr-goods-card__thumb:empty { + display: none; + margin: 0; +} + +.wr-goods-card__body { + display: flex; + margin: 0 0 0 16rpx; + flex-direction: row; + flex: 1 1 auto; + min-height: 176rpx; +} +.wr-goods-card__long_content { + display: flex; + flex-direction: column; + overflow: hidden; + flex: 1 1 auto; +} +.wr-goods-card__long_content .goods_tips { + width: 100%; + margin-top: 16rpx; + text-align: right; + color: #fa4126; + font-size: 24rpx; + line-height: 32rpx; + font-weight: bold; +} +.wr-goods-card__title { + flex-shrink: 0; + font-size: 28rpx; + color: #333; + line-height: 40rpx; + font-weight: 400; + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + word-break: break-word; +} +.wr-goods-card__title__prefix-tags { + display: inline-flex; +} +.wr-goods-card__title__prefix-tags .prefix-tag { + margin: 0 8rpx 0 0; +} +.wr-goods-card__desc { + font-size: 24rpx; + color: #f5f5f5; + line-height: 40rpx; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; +} +.wr-goods-card__specs__desc, +.wr-goods-card__specs__text { + font-size: 24rpx; + height: 32rpx; + line-height: 32rpx; + color: #999999; + margin: 8rpx 0; +} +.wr-goods-card__specs__desc { + display: flex; + align-self: flex-start; + flex-direction: row; +} +.wr-goods-card__specs__desc-text { + height: 100%; + max-width: 380rpx; + word-break: break-all; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.wr-goods-card__specs__desc-icon { + line-height: inherit; + margin-left: 8rpx; + font-size: 24rpx; + color: #bbb; +} +.wr-goods-card__specs__text { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; +} +.wr-goods-card__tags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + margin: 16rpx 0 0 0; +} +.wr-goods-card__tag { + color: #fa550f; + background: transparent; + font-size: 20rpx; + border: 1rpx solid #fa550f; + padding: 0 8rpx; + height: 30rpx; + line-height: 30rpx; + margin: 0 8rpx 8rpx 0; + display: block; + overflow: hidden; + white-space: nowrap; + word-break: keep-all; + text-overflow: ellipsis; +} +.wr-goods-card__short_content { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-end; + margin: 0 0 0 46rpx; +} +.wr-goods-card__price__prefix { + order: 0; + color: #666; + margin: 0; +} +.wr-goods-card__price { + white-space: nowrap; + font-weight: bold; + order: 1; + color: #fa4126; + font-size: 36rpx; + margin: 0; + line-height: 48rpx; +} +.wr-goods-card__origin-price { + white-space: nowrap; + font-weight: normal; + order: 2; + color: #aaaaaa; + font-size: 24rpx; + margin: 0; +} +.wr-goods-card__num { + white-space: nowrap; + order: 4; + font-size: 24rpx; + color: #999; + margin: 20rpx 0 0 auto; +} +.wr-goods-card__num__prefix { + color: inherit; +} +.wr-goods-card__add-cart { + order: 3; + margin: auto 0 0 auto; +} +.wr-goods-card.horizontal-wrap .wr-goods-card__thumb { + width: 192rpx; + height: 192rpx; + border-radius: 8rpx; + overflow: hidden; +} +.wr-goods-card.horizontal-wrap .wr-goods-card__body { + flex-direction: column; +} +.wr-goods-card.horizontal-wrap .wr-goods-card__short_content { + flex-direction: row; + align-items: center; + margin: 16rpx 0 0 0; +} + +.wr-goods-card.horizontal-wrap .wr-goods-card__num { + margin: 0 0 0 auto; +} +.wr-goods-card.vertical .wr-goods-card__main { + padding: 0 0 22rpx 0; + flex-direction: column; +} +.wr-goods-card.vertical .wr-goods-card__thumb { + width: 340rpx; + height: 340rpx; +} +.wr-goods-card.vertical .wr-goods-card__body { + margin: 20rpx 20rpx 0 20rpx; + flex-direction: column; +} +.wr-goods-card.vertical .wr-goods-card__long_content { + overflow: hidden; +} +.wr-goods-card.vertical .wr-goods-card__title { + line-height: 36rpx; +} +.wr-goods-card.vertical .wr-goods-card__short_content { + margin: 20rpx 0 0 0; +} +.wr-goods-card.vertical .wr-goods-card__price { + order: 2; + color: #fa4126; + margin: 20rpx 0 0 0; +} +.wr-goods-card.vertical .wr-goods-card__origin-price { + order: 1; +} +.wr-goods-card.vertical .wr-goods-card__add-cart { + position: absolute; + bottom: 20rpx; + right: 20rpx; +} + +.wr-goods-card__short_content .no_storage { + display: flex; + align-items: center; + justify-content: space-between; + height: 40rpx; + color: #333; + font-size: 24rpx; + line-height: 32rpx; + width: 100%; +} + +.no_storage .no_storage__right { + width: 80rpx; + height: 40rpx; + border-radius: 20rpx; + border: 2rpx solid #fa4126; + line-height: 40rpx; + text-align: center; + color: #fa4126; +} diff --git a/pages/order/components/noGoods/noGoods.js b/pages/order/components/noGoods/noGoods.js new file mode 100644 index 0000000..53b6f86 --- /dev/null +++ b/pages/order/components/noGoods/noGoods.js @@ -0,0 +1,57 @@ +Component({ + properties: { + settleDetailData: { + type: Object, + value: {}, + observer(settleDetailData) { + const { + outOfStockGoodsList, + abnormalDeliveryGoodsList, + inValidGoodsList, + limitGoodsList, + } = settleDetailData; + // 弹窗逻辑 限购 超出配送范围 失效 库存不足; + const tempList = + limitGoodsList || + abnormalDeliveryGoodsList || + inValidGoodsList || + outOfStockGoodsList || + []; + + tempList.forEach((goods, index) => { + goods.id = index; + goods.unSettlementGoods && + goods.unSettlementGoods.forEach((ele) => { + ele.name = ele.goodsName; + ele.price = ele.payPrice; + ele.imgUrl = ele.image; + }); + }); + this.setData({ + // settleDetailData, + goodsList: tempList, + }); + }, + }, + }, + + data: { + goodList: [], + }, + methods: { + onCard(e) { + const { item } = e.currentTarget.dataset; + if (item === 'cart') { + // 购物车 + Navigator.gotoPage('/cart'); + } else if (item === 'orderSure') { + // 结算页 + this.triggerEvent('change', undefined); + } + }, + onDelive() { + // 修改配送地址 + Navigator.gotoPage('/address', { type: 'orderSure' }); + }, + }, +}); diff --git a/pages/order/components/noGoods/noGoods.json b/pages/order/components/noGoods/noGoods.json new file mode 100644 index 0000000..31f62da --- /dev/null +++ b/pages/order/components/noGoods/noGoods.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "wr-order-card": "/pages/order/components/order-card/index", + "wr-goods-card": "/components/goods-card/index", + "wr-order-goods-card": "/pages/order/components/order-goods-card/index" + } +} \ No newline at end of file diff --git a/pages/order/components/noGoods/noGoods.wxml b/pages/order/components/noGoods/noGoods.wxml new file mode 100644 index 0000000..1153a36 --- /dev/null +++ b/pages/order/components/noGoods/noGoods.wxml @@ -0,0 +1,55 @@ + + var isOnlyBack = function(data) { + return data.limitGoodsList || (data.inValidGoodsList && !data.storeGoodsList); + } + + var isShowChangeAdress = function(data) { + return data.abnormalDeliveryGoodsList + } + + var isShowKeepPay = function(data) { + return data.outOfStockGoodsList || (data.storeGoodsList && data.inValidGoodsList); + } + + module.exports = { + isOnlyBack:isOnlyBack, + isShowChangeAdress: isShowChangeAdress, + isShowKeepPay: isShowKeepPay, + } + + + + 限购商品信息 + 以下商品限购数量,建议您修改商品数量 + + + 不支持配送 + 以下店铺的商品不支持配送,请更改地址或去掉对应店铺商品再进行结算 + + + 部分商品库存不足或失效 + 请返回购物车重新选择商品,如果继续结算将自动忽略库存不足或失效的商品。 + + + 全部商品库存不足或失效 + 请返回购物车重新选择商品 + + + + + + + + + + + 返回购物车 + + + 修改配送地址 + + + 继续结算 + + + diff --git a/pages/order/components/noGoods/noGoods.wxss b/pages/order/components/noGoods/noGoods.wxss new file mode 100644 index 0000000..0331d40 --- /dev/null +++ b/pages/order/components/noGoods/noGoods.wxss @@ -0,0 +1,68 @@ +/* 层级定义 +@z-index-0: 1; +@z-index-1: 100; +@z-index-2: 200; +@z-index-5: 500; +@z-index-component: 1000; // 通用组件级别 +@z-index-dropdown: @z-index-component; +@z-index-sticky: @z-index-component + 20; +@z-index-fixed: @z-index-component + 30; +@z-index-modal-backdrop:@z-index-component + 40; +@z-index-modal:@z-index-component + 50; +@z-index-popover:@z-index-component + 60; +@z-index-tooltip:@z-index-component + 70; +*/ +/* var() css变量适配*/ +.goods-fail { + display: block; + background: #fff; + font-size: 30rpx; + border-radius: 20rpx 20rpx 0 0; +} +.goods-fail .title { + display: inline-block; + width: 100%; + text-align: center; + margin-top: 30rpx; + line-height: 42rpx; + font-weight: bold; + font-size: 32rpx; +} +.goods-fail .info { + display: block; + font-size: 26rpx; + font-weight: 400; + line-height: 36rpx; + margin: 20rpx auto 10rpx; + text-align: center; + width: 560rpx; + color: #999; +} +.goods-fail .goods-fail-btn { + display: flex; + padding: 30rpx; + justify-content: space-between; + align-items: center; + font-size: 30rpx; +} +.goods-fail .goods-fail-btn .btn { + width: 330rpx; + height: 80rpx; + line-height: 80rpx; + border-radius: 8rpx; + text-align: center; + border: 1rpx solid #999; + background: #fff; + font-size: 32rpx; + color: #666; +} +.goods-fail .goods-fail-btn .btn.origin, +.goods-fail .goods-fail-btn .btn.limit { + color: #fa550f; + color: var(--color-primary, #fa550f); + border: 1rpx solid #fa550f; + border: 1rpx solid var(--color-primary, #fa550f); +} +.goods-fail .goods-fail-btn .btn.limit { + flex-grow: 1; +} diff --git a/pages/order/components/order-button-bar/index.js b/pages/order/components/order-button-bar/index.js new file mode 100644 index 0000000..1c8b4a8 --- /dev/null +++ b/pages/order/components/order-button-bar/index.js @@ -0,0 +1,217 @@ +import Toast from 'tdesign-miniprogram/toast/index'; +import Dialog from 'tdesign-miniprogram/dialog/index'; +import { OrderButtonTypes } from '../../config'; + +Component({ + options: { + addGlobalClass: true, + }, + properties: { + order: { + type: Object, + observer(order) { + // 判定有传goodsIndex ,则认为是商品button bar, 仅显示申请售后按钮 + if (this.properties?.goodsIndex !== null) { + const goods = order.goodsList[Number(this.properties.goodsIndex)]; + this.setData({ + buttons: { + left: [], + right: (goods.buttons || []).filter( + (b) => b.type == OrderButtonTypes.APPLY_REFUND, + ), + }, + }); + return; + } + // 订单的button bar 不显示申请售后按钮 + const buttonsRight = (order.buttons || []) + // .filter((b) => b.type !== OrderButtonTypes.APPLY_REFUND) + .map((button) => { + //邀请好友拼团按钮 + if ( + button.type === OrderButtonTypes.INVITE_GROUPON && + order.groupInfoVo + ) { + const { + groupInfoVo: { groupId, promotionId, remainMember, groupPrice }, + goodsList, + } = order; + const goodsImg = goodsList[0] && goodsList[0].imgUrl; + const goodsName = goodsList[0] && goodsList[0].name; + return { + ...button, + openType: 'share', + dataShare: { + goodsImg, + goodsName, + groupId, + promotionId, + remainMember, + groupPrice, + storeId: order.storeId, + }, + }; + } + return button; + }); + // 删除订单按钮单独挪到左侧 + const deleteBtnIndex = buttonsRight.findIndex( + (b) => b.type === OrderButtonTypes.DELETE, + ); + let buttonsLeft = []; + if (deleteBtnIndex > -1) { + buttonsLeft = buttonsRight.splice(deleteBtnIndex, 1); + } + this.setData({ + buttons: { + left: buttonsLeft, + right: buttonsRight, + }, + }); + }, + }, + goodsIndex: { + type: Number, + value: null, + }, + isBtnMax: { + type: Boolean, + value: false, + }, + }, + + data: { + order: {}, + buttons: { + left: [], + right: [], + }, + }, + + methods: { + // 点击【订单操作】按钮,根据按钮类型分发 + onOrderBtnTap(e) { + const { type } = e.currentTarget.dataset; + switch (type) { + case OrderButtonTypes.DELETE: + this.onDelete(this.data.order); + break; + case OrderButtonTypes.CANCEL: + this.onCancel(this.data.order); + break; + case OrderButtonTypes.CONFIRM: + this.onConfirm(this.data.order); + break; + case OrderButtonTypes.PAY: + this.onPay(this.data.order); + break; + case OrderButtonTypes.APPLY_REFUND: + this.onApplyRefund(this.data.order); + break; + case OrderButtonTypes.VIEW_REFUND: + this.onViewRefund(this.data.order); + break; + case OrderButtonTypes.COMMENT: + this.onAddComent(this.data.order); + break; + case OrderButtonTypes.INVITE_GROUPON: + //分享邀请好友拼团 + break; + case OrderButtonTypes.REBUY: + this.onBuyAgain(this.data.order); + } + }, + + onCancel() { + Toast({ + context: this, + selector: '#t-toast', + message: '你点击了取消订单', + icon: 'check-circle', + }); + }, + + onConfirm() { + Dialog.confirm({ + title: '确认是否已经收到货?', + content: '', + confirmBtn: '确认收货', + cancelBtn: '取消', + }) + .then(() => { + Toast({ + context: this, + selector: '#t-toast', + message: '你确认了确认收货', + icon: 'check-circle', + }); + }) + .catch(() => { + Toast({ + context: this, + selector: '#t-toast', + message: '你取消了确认收货', + icon: 'check-circle', + }); + }); + }, + + onPay() { + Toast({ + context: this, + selector: '#t-toast', + message: '你点击了去支付', + icon: 'check-circle', + }); + }, + + onBuyAgain() { + Toast({ + context: this, + selector: '#t-toast', + message: '你点击了再次购买', + icon: 'check-circle', + }); + }, + + onApplyRefund(order) { + const goods = order.goodsList[this.properties.goodsIndex]; + const params = { + orderNo: order.orderNo, + skuId: goods?.skuId ?? '19384938948343', + spuId: goods?.spuId ?? '28373847384343', + orderStatus: order.status, + logisticsNo: order.logisticsNo, + price: goods?.price ?? 89, + num: goods?.num ?? 89, + createTime: order.createTime, + orderAmt: order.totalAmount, + payAmt: order.amount, + canApplyReturn: true, + }; + const paramsStr = Object.keys(params) + .map((k) => `${k}=${params[k]}`) + .join('&'); + wx.navigateTo({ url: `/pages/order/apply-service/index?${paramsStr}` }); + }, + + onViewRefund() { + Toast({ + context: this, + selector: '#t-toast', + message: '你点击了查看退款', + icon: '', + }); + }, + + /** 添加订单评论 */ + onAddComent(order) { + const imgUrl = order?.goodsList?.[0]?.thumb; + const title = order?.goodsList?.[0]?.title; + const specs = order?.goodsList?.[0]?.specs; + wx.navigateTo({ + url: `/pages/goods/comments/create/index?specs=${specs}&title=${title}&orderNo=${order?.orderNo}&imgUrl=${imgUrl}`, + }); + }, + }, +}); diff --git a/pages/order/components/order-button-bar/index.json b/pages/order/components/order-button-bar/index.json new file mode 100644 index 0000000..3084bb3 --- /dev/null +++ b/pages/order/components/order-button-bar/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "t-button": "tdesign-miniprogram/button/button", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog" + } +} \ No newline at end of file diff --git a/pages/order/components/order-button-bar/index.wxml b/pages/order/components/order-button-bar/index.wxml new file mode 100644 index 0000000..030c4c4 --- /dev/null +++ b/pages/order/components/order-button-bar/index.wxml @@ -0,0 +1,35 @@ + + + + {{leftBtn.name}} + + + + + {{rightBtn.name}} + + + + + + diff --git a/pages/order/components/order-button-bar/index.wxss b/pages/order/components/order-button-bar/index.wxss new file mode 100644 index 0000000..850282d --- /dev/null +++ b/pages/order/components/order-button-bar/index.wxss @@ -0,0 +1,57 @@ +:host { + width: 100%; +} +.btn-bar { + display: flex; + justify-content: space-between; + align-items: center; + line-height: 1; +} +.btn-bar .order-btn { + background-color: inherit; + line-height: 1; + border-radius: unset; + min-width: 160rpx; + font-size: 28rpx; +} +.btn-bar .order-btn::after { + border-radius: 16rpx; +} +.btn-bar .order-btn--active { + opacity: 0.5; +} + +.btn-bar .right { + display: flex; + align-items: center; +} +.btn-bar .t-button { + width: 160rpx; + height: 56rpx; + border-radius: 28rpx; + margin-left: 24rpx; +} +.btn-bar .t-button--max { + width: 176rpx; + height: 72rpx; + border-radius: 36rpx; + margin-left: 24rpx; +} + +.btn-bar .left .delete-btn { + font-size: 22rpx; +} +.btn-bar .left .delete-btn::after { + display: none; +} +.btn-bar .right .normal { + color: #333333; +} +.btn-bar .right .normal:after { + border-color: #dddddd; +} +.btn-bar .right .primary { + color: #ffffff; + background-color: #fa4126; + border-color: #fa4126; +} diff --git a/pages/order/components/order-card/index.js b/pages/order/components/order-card/index.js new file mode 100644 index 0000000..636e66d --- /dev/null +++ b/pages/order/components/order-card/index.js @@ -0,0 +1,90 @@ +Component({ + externalClasses: ['wr-class', 'header-class', 'title-class'], + + options: { + multipleSlots: true, + }, + + relations: { + '../order-goods-card/index': { + type: 'descendant', + linked(target) { + this.children.push(target); + this.setHidden(); + }, + unlinked(target) { + this.children = this.children.filter((item) => item !== target); + }, + }, + '../goods-card/index': { + type: 'descendant', + linked(target) { + this.children.push(target); + this.setHidden(); + }, + unlinked(target) { + this.children = this.children.filter((item) => item !== target); + }, + }, + '../specs-goods-card/index': { + type: 'descendant', + linked(target) { + this.children.push(target); + this.setHidden(); + }, + unlinked(target) { + this.children = this.children.filter((item) => item !== target); + }, + }, + }, + + created() { + this.children = []; + }, + + properties: { + order: { + type: Object, + observer(order) { + if (!order?.goodsList) return; + const goodsCount = order.goodsList.length; + this.setData({ + goodsCount, + }); + }, + }, + useTopRightSlot: Boolean, + // 初始显示的商品数量,超出部分会隐藏。 + defaultShowNum: { + type: null, + value: 10, + }, + useLogoSlot: { + type: Boolean, + value: false, + }, + }, + + data: { + showAll: true, // 是否展示所有商品,设置为false,可以使用展开更多功能 + goodsCount: 0, + }, + + methods: { + setHidden() { + const isHidden = !this.data.showAll; + this.children.forEach( + (c, i) => i >= this.properties.defaultShowNum && c.setHidden(isHidden), + ); + }, + + onOrderCardTap() { + this.triggerEvent('cardtap'); + }, + + onShowMoreTap() { + this.setData({ showAll: true }, () => this.setHidden()); + this.triggerEvent('showall'); + }, + }, +}); diff --git a/pages/order/components/order-card/index.json b/pages/order/components/order-card/index.json new file mode 100644 index 0000000..8c3cde6 --- /dev/null +++ b/pages/order/components/order-card/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-image": "/components/webp-image/index", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/order/components/order-card/index.wxml b/pages/order/components/order-card/index.wxml new file mode 100644 index 0000000..21f32d0 --- /dev/null +++ b/pages/order/components/order-card/index.wxml @@ -0,0 +1,30 @@ + + + + + + + + + {{order.statusDesc}} + + + + + + + 展开商品信息(共 {{goodsCount}} 个) + + + + + diff --git a/pages/order/components/order-card/index.wxss b/pages/order/components/order-card/index.wxss new file mode 100644 index 0000000..d241796 --- /dev/null +++ b/pages/order/components/order-card/index.wxss @@ -0,0 +1,45 @@ +.order-card { + margin: 24rpx 0; + padding: 24rpx 32rpx 24rpx; + background-color: white; + border-radius: 8rpx; +} +.order-card .header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 24rpx; +} +.order-card .header .store-name { + font-size: 28rpx; + font-weight: normal; + color: #333333; + display: flex; + align-items: center; + line-height: 40rpx; +} +.order-card .header .store-name__logo { + margin-right: 16rpx; + font-size: 40rpx; + width: 48rpx; + height: 48rpx; +} +.order-card .header .store-name__label { + max-width: 500rpx; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; +} +.order-card .header .order-status { + font-size: 26rpx; + line-height: 40rpx; + color: #fa4126; +} +.order-card .more-mask { + padding: 20rpx 0; + text-align: center; + background-color: white; + color: #fa4126; + font-size: 24rpx; +} diff --git a/pages/order/components/order-goods-card/index.js b/pages/order/components/order-goods-card/index.js new file mode 100644 index 0000000..edaf299 --- /dev/null +++ b/pages/order/components/order-goods-card/index.js @@ -0,0 +1,43 @@ +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + }, + + relations: { + '../order-card/index': { + type: 'ancestor', + linked(target) { + this.parent = target; + }, + }, + }, + + properties: { + goods: Object, + thumbWidth: Number, + thumbHeight: Number, + thumbWidthInPopup: Number, + thumbHeightInPopup: Number, + noTopLine: Boolean, + step: Boolean, + stepDisabled: Boolean, + }, + + data: { + goods: {}, + hidden: false, + }, + + methods: { + setHidden(hidden) { + if (this.data.hidden === hidden) return; + this.setData({ hidden }); + }, + + onNumChange(e) { + const { value } = e.detail; + this.triggerEvent('num-change', { value }); + }, + }, +}); diff --git a/pages/order/components/order-goods-card/index.json b/pages/order/components/order-goods-card/index.json new file mode 100644 index 0000000..7743bba --- /dev/null +++ b/pages/order/components/order-goods-card/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-stepper": "tdesign-miniprogram/stepper/stepper", + "goods-card": "../specs-goods-card/index" + } +} \ No newline at end of file diff --git a/pages/order/components/order-goods-card/index.wxml b/pages/order/components/order-goods-card/index.wxml new file mode 100644 index 0000000..1cedf01 --- /dev/null +++ b/pages/order/components/order-goods-card/index.wxml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/pages/order/components/reason-sheet/index.js b/pages/order/components/reason-sheet/index.js new file mode 100644 index 0000000..e5741e6 --- /dev/null +++ b/pages/order/components/reason-sheet/index.js @@ -0,0 +1,114 @@ +Component({ + properties: { + show: Boolean, + title: String, + options: { + type: Object, + observer() { + this.init(); + }, + }, + multiple: { + type: Boolean, + observer() { + this.init(); + }, + }, + showConfirmButton: Boolean, + showCloseButton: Boolean, + confirmButtonText: { + type: String, + value: '确定', + }, + cancelButtonText: { + type: String, + value: '取消', + }, + emptyTip: { + type: String, + value: '请选择', + }, + }, + + data: { + _options: [], + checkedIndexes: [], + }, + + methods: { + attached() { + this.toast = this.selectComponent('#t-toast'); + }, + + init() { + const checkedIndexes = []; + const _options = this.properties.options.map((opt, i) => { + const checked = !!opt.checked; + if (checked) { + if (this.properties.multiple) checkedIndexes[0] = i; + else checkedIndexes.push(i); + } + return { + title: opt.title, + checked, + }; + }); + this.setData({ checkedIndexes, _options }); + }, + + onOptionTap(e) { + const { index } = e.currentTarget.dataset; + const { checkedIndexes } = this.data; + let data = {}; + if (this.properties.multiple) { + if (checkedIndexes.includes(index)) { + checkedIndexes.splice(index, 1); + data = { checkedIndexes, [`_options[${index}].checked`]: false }; + } else { + checkedIndexes.push(index); + data = { checkedIndexes, [`_options[${index}].checked`]: true }; + } + } else { + if (checkedIndexes[0] === index) { + // 单选不可取消选择 + return; + } + data = { + [`_options[${index}].checked`]: true, + checkedIndexes: [index], + }; + if (checkedIndexes[0] !== undefined) { + data[`_options[${checkedIndexes[0]}].checked`] = false; + } + } + this.setData(data); + this.triggerEvent('select', { index }); + this._onOptionTap && this._onOptionTap(index); + if (!this.properties.showConfirmButton && !this.properties.multiple) { + // 没有确认按钮且是单选的情况下,选择选项则自动确定 + this._onConfirm && this._onConfirm([index]); + this.setData({ show: false }); + } + }, + + onCancel() { + this.triggerEvent('cancel'); + this._onCancel && this._onCancel(); + this.setData({ show: false }); + }, + + onConfirm() { + if (this.data.checkedIndexes.length === 0) { + this.toast.show({ + icon: '', + text: this.properties.emptyTip, + }); + return; + } + const indexed = this.data.checkedIndexes; + this.triggerEvent('confirm', { indexed }); + this._onConfirm && this._onConfirm(indexed); + this.setData({ show: false }); + }, + }, +}); diff --git a/pages/order/components/reason-sheet/index.json b/pages/order/components/reason-sheet/index.json new file mode 100644 index 0000000..a22be6b --- /dev/null +++ b/pages/order/components/reason-sheet/index.json @@ -0,0 +1,10 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-popup": "tdesign-miniprogram/popup/popup", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-button": "tdesign-miniprogram/button/button" + } +} \ No newline at end of file diff --git a/pages/order/components/reason-sheet/index.wxml b/pages/order/components/reason-sheet/index.wxml new file mode 100644 index 0000000..35a5df2 --- /dev/null +++ b/pages/order/components/reason-sheet/index.wxml @@ -0,0 +1,50 @@ + + + + {{title}} + + + + + + + + + + + + {{confirmButtonText}} + + + + + + diff --git a/pages/order/components/reason-sheet/index.wxss b/pages/order/components/reason-sheet/index.wxss new file mode 100644 index 0000000..ed92d44 --- /dev/null +++ b/pages/order/components/reason-sheet/index.wxss @@ -0,0 +1,47 @@ +page view { + box-sizing: border-box; +} +.popup-content { + background-color: white; + color: #222427; + border-radius: 20rpx 20rpx 0 0; + overflow: hidden; +} +.popup-content .header { + height: 100rpx; + line-height: 100rpx; + text-align: center; + vertical-align: middle; + font-size: 32rpx; + font-weight: bold; + position: relative; +} +.popup-content .options { + max-height: 60vh; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; +} +.popup-content .options .cell { + height: 100rpx; + align-items: center; + font-size: 30rpx; + color: #333333; +} +.popup-content .button-bar { + width: 100%; + padding: 20rpx 30rpx; + display: flex; + flex-wrap: nowrap; + align-items: center; + justify-content: space-between; + padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); +} +.popup-content .button-bar .btn { + width: 100%; + background: #fa4126; + color: #fff; + border-radius: 48rpx; +} +.button-bar .btnWrapper { + width: 100%; +} diff --git a/pages/order/components/reason-sheet/reasonSheet.js b/pages/order/components/reason-sheet/reasonSheet.js new file mode 100644 index 0000000..384f68f --- /dev/null +++ b/pages/order/components/reason-sheet/reasonSheet.js @@ -0,0 +1,25 @@ +function getInstance(context, selector = '#wr-reason-sheet') { + if (!context) { + const pages = getCurrentPages(); + const page = pages[pages.length - 1]; + context = page; + } + const instance = context && context.selectComponent(selector); + if (!instance) { + console.warn(`未找到reason-sheet组件,请检查selector是否正确`); + return null; + } + return instance; +} + +export default function (options) { + const { context, selector, ..._options } = options; + return new Promise((resolve, reject) => { + const instance = getInstance(context, selector); + if (instance) { + instance.setData(Object.assign({}, _options)); + instance._onCancel = () => reject(); + instance._onConfirm = (indexes) => resolve(indexes); + } + }); +} diff --git a/pages/order/components/selectCoupons/mock.js b/pages/order/components/selectCoupons/mock.js new file mode 100644 index 0000000..6e67895 --- /dev/null +++ b/pages/order/components/selectCoupons/mock.js @@ -0,0 +1,22 @@ +export const couponsData = { + couponResultList: [ + { + couponVO: { + condition: '满200元可用', + couponId: 11, + endTime: 1584530282686, + name: '折扣券', + profit: '5.5折', + promotionCode: 90, + promotionSubCode: 1, + scopeText: '部分商品可用', + startTime: 1584530282686, + storeId: 90, + value: 550, + type: 2, + }, + status: 0, // 0:未勾选。1:勾选。-1:置灰 + }, + ], + reduce: 1000, +}; diff --git a/pages/order/components/selectCoupons/selectCoupon.wxs b/pages/order/components/selectCoupons/selectCoupon.wxs new file mode 100644 index 0000000..8c4ce2e --- /dev/null +++ b/pages/order/components/selectCoupons/selectCoupon.wxs @@ -0,0 +1,16 @@ +function formatDays(value) { + if (value < 10) { + return '0' + value; + } + return value; +} +var dateFormat = function (d) { + var date = getDate(+d); + return ( + date.getFullYear() + + '-' + + formatDays(date.getMonth() + 1) + + formatDays(date.getDate()) + ); +}; +module.exports.dateFormat = dateFormat; diff --git a/pages/order/components/selectCoupons/selectCoupons.js b/pages/order/components/selectCoupons/selectCoupons.js new file mode 100644 index 0000000..235ffba --- /dev/null +++ b/pages/order/components/selectCoupons/selectCoupons.js @@ -0,0 +1,160 @@ +import dayjs from 'dayjs'; +import { couponsData } from './mock'; + +const emptyCouponImg = `https://cdn-we-retail.ym.tencent.com/miniapp/coupon/ordersure-coupon-newempty.png`; + +Component({ + properties: { + storeId: String, + promotionGoodsList: { + type: Array, + value: [], + }, + orderSureCouponList: { + type: Array, + value: [], + }, + couponsShow: { + type: Boolean, + value: false, + observer(couponsShow) { + if (couponsShow) { + const { promotionGoodsList, orderSureCouponList, storeId } = + this.data; + const products = + promotionGoodsList && + promotionGoodsList.map((goods) => { + this.storeId = goods.storeId; + return { + skuId: goods.skuId, + spuId: goods.spuId, + storeId: goods.storeId, + selected: true, + quantity: goods.num, + prices: { + sale: goods.settlePrice, + }, + }; + }); + const selectedCoupons = + orderSureCouponList && + orderSureCouponList.map((ele) => { + return { + promotionId: ele.promotionId, + storeId: ele.storeId, + couponId: ele.couponId, + }; + }); + this.setData({ + products, + }); + this.coupons({ + products, + selectedCoupons, + storeId, + }).then((res) => { + this.initData(res); + }); + } + }, + }, + }, + data: { + emptyCouponImg, + goodsList: [], + selectedList: [], + couponsList: [], + orderSureCouponList: [], + promotionGoodsList: [], + }, + methods: { + initData(data = {}) { + const { couponResultList = [], reduce = 0 } = data; + const selectedList = []; + let selectedNum = 0; + const couponsList = + couponResultList && + couponResultList.map((coupon) => { + const { status, couponVO } = coupon; + const { + couponId, + condition = '', + endTime = 0, + name = '', + startTime = 0, + value, + type, + } = couponVO; + if (status === 1) { + selectedNum++; + selectedList.push({ + couponId, + promotionId: ruleId, + storeId: this.storeId, + }); + } + const val = type === 2 ? value / 100 : value / 10; + return { + key: couponId, + title: name, + isSelected: false, + timeLimit: `${dayjs(+startTime).format('YYYY-MM-DD')}-${dayjs( + +endTime, + ).format('YYYY-MM-DD')}`, + value: val, + status: status === -1 ? 'useless' : 'default', + desc: condition, + type, + tag: '', + }; + }); + this.setData({ + selectedList, + couponsList, + reduce, + selectedNum, + }); + }, + selectCoupon(e) { + const { key } = e.currentTarget.dataset; + const { couponsList, selectedList } = this.data; + couponsList.forEach((coupon) => { + if (coupon.key === key) { + coupon.isSelected = !coupon.isSelected; + } + }); + + const couponSelected = couponsList.filter( + (coupon) => coupon.isSelected === true, + ); + + this.setData({ + selectedList: [...selectedList, ...couponSelected], + couponsList: [...couponsList], + }); + + this.triggerEvent('sure', { + selectedList: [...selectedList, ...couponSelected], + }); + }, + hide() { + this.setData({ + couponsShow: false, + }); + }, + coupons(coupon = {}) { + return new Promise((resolve, reject) => { + if (coupon?.selectedCoupons) { + resolve({ + couponResultList: couponsData.couponResultList, + reduce: couponsData.reduce, + }); + } + return reject({ + couponResultList: [], + reduce: undefined, + }); + }); + }, + }, +}); diff --git a/pages/order/components/selectCoupons/selectCoupons.json b/pages/order/components/selectCoupons/selectCoupons.json new file mode 100644 index 0000000..c46dc55 --- /dev/null +++ b/pages/order/components/selectCoupons/selectCoupons.json @@ -0,0 +1,10 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-image": "/components/webp-image/index", + "wr-price": "/components/price/index", + "coupon-card": "/pages/coupon/components/ui-coupon-card/index" + } +} \ No newline at end of file diff --git a/pages/order/components/selectCoupons/selectCoupons.wxml b/pages/order/components/selectCoupons/selectCoupons.wxml new file mode 100644 index 0000000..10b8898 --- /dev/null +++ b/pages/order/components/selectCoupons/selectCoupons.wxml @@ -0,0 +1,43 @@ + + + + + + 选择优惠券 + + + 你有{{couponsList.length}}张可用优惠券 + + 已选中{{selectedNum}}张推荐优惠券, 共抵扣 + + + + + + + + + + + + 此优惠券不能和已勾选的优惠券叠加使用 + + + + + + + 暂无优惠券 + + + + + diff --git a/pages/order/components/selectCoupons/selectCoupons.wxss b/pages/order/components/selectCoupons/selectCoupons.wxss new file mode 100644 index 0000000..a8c795f --- /dev/null +++ b/pages/order/components/selectCoupons/selectCoupons.wxss @@ -0,0 +1,104 @@ +.select-coupons { + background: #fff; + width: 100%; + position: relative; + border-radius: 20rpx 20rpx 0 0; + padding-top: 28rpx; + padding-bottom: env(safe-area-inset-bottom); +} +.select-coupons .title { + width: 100%; + text-align: center; + font-size: 32rpx; + color: #333; + font-weight: 600; + line-height: 44rpx; +} +.select-coupons .info { + width: 100%; + height: 34rpx; + font-size: 24rpx; + color: #999; + line-height: 34rpx; + margin: 20rpx 0; + padding: 0 20rpx; +} +.select-coupons .info .price { + color: #fa4126; +} +.select-coupons .coupons-list { + max-height: 500rpx; +} +.select-coupons .coupons-list .coupons-wrap { + padding: 0rpx 20rpx; +} +.select-coupons .coupons-list .disable { + font-size: 24rpx; + color: #ff2525; + padding-top: 20rpx; +} +.select-coupons .coupons-list .slot-radio { + position: absolute; + right: 22rpx; + top: 50%; + transform: translateY(-50%); + display: inline-block; +} +.select-coupons .coupons-list .slot-radio .wr-check-filled { + font-size: 36rpx; +} +.select-coupons .coupons-list .slot-radio .check { + width: 36rpx; +} +.select-coupons .coupons-list .slot-radio .text-primary { + color: #fa4126; +} +.select-coupons .coupons-list .slot-radio .wr-check { + font-size: 36rpx; +} +.select-coupons .coupons-list .slot-radio .wr-uncheck { + font-size: 36rpx; + color: #999; +} +.select-coupons .couponp-empty-wrap { + padding: 40rpx; +} +.select-coupons .couponp-empty-wrap .couponp-empty-img { + display: block; + width: 240rpx; + height: 240rpx; + margin: 0 auto; +} +.select-coupons .couponp-empty-wrap .couponp-empty-title { + font-size: 28rpx; + color: #999; + text-align: center; + line-height: 40rpx; + margin-top: 40rpx; +} +.select-coupons .coupons-cover { + height: 112rpx; + width: 100%; + box-sizing: border-box; + margin-top: 30rpx; + padding: 12rpx 32rpx; + display: flex; + justify-content: space-between; + align-items: center; +} +.select-coupons .coupons-cover .btn { + width: 332rpx; + height: 88rpx; + text-align: center; + line-height: 88rpx; + font-size: 32rpx; + border-radius: 44rpx; + box-sizing: border-box; + border: 2rpx solid #dddddd; + color: #333333; +} +.select-coupons .coupons-cover .red { + border-color: #fa4126; + background-color: #fa4126; + color: #ffffff; +} diff --git a/pages/order/components/specs-goods-card/index.js b/pages/order/components/specs-goods-card/index.js new file mode 100644 index 0000000..d5cd284 --- /dev/null +++ b/pages/order/components/specs-goods-card/index.js @@ -0,0 +1,132 @@ +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, // 在组件定义时的选项中启用多slot支持 + }, + + externalClasses: [ + 'title-class', + 'desc-class', + 'num-class', + 'thumb-class', + 'specs-class', + 'price-class', + 'origin-price-class', + 'price-prefix-class', + ], + + relations: { + '../order-card/index': { + type: 'ancestor', + linked(target) { + this.parent = target; + }, + }, + }, + + properties: { + id: String, + hidden: { + // 设置为null代表不做类型转换 + type: null, + observer(hidden) { + // null就是代表没有设置,没有设置的话不setData,防止祖先组件触发的setHidden操作被覆盖 + if (hidden !== null) { + this.setHidden(!!hidden); + } + }, + }, + data: Object, + layout: { + type: String, + value: 'horizontal', + }, + thumbMode: { + type: String, + value: 'aspectFill', + }, + thumbWidth: Number, + thumbHeight: Number, + thumbWidthInPopup: Number, + thumbHeightInPopup: Number, + priceFill: { + type: Boolean, + value: true, + }, + currency: { + type: String, + value: '¥', + }, + lazyLoad: Boolean, + centered: Boolean, + showCart: Boolean, + pricePrefix: String, + cartSize: { + type: Number, + value: 48, + }, + cartColor: { + type: String, + value: '#FA550F', + }, + disablePopup: Boolean, + }, + + data: { + hiddenInData: false, + specsPopup: { + insert: false, + show: false, + }, + }, + + currentInTapSpecs: false, + + lifetimes: { + ready() { + const { hidden } = this.properties; + if (hidden !== null) { + this.setHidden(!!hidden); + } + }, + }, + + methods: { + closeSpecsPopup() { + this.setData({ + 'specsPopup.show': false, + }); + this.triggerEvent('specsclose', { good: this.properties.data }); + }, + + removeSpecsPopup() { + this.setData({ + 'specsPopup.insert': false, + }); + }, + + onClick(e) { + if (this.currentInTapSpecs) { + this.currentInTapSpecs = false; + return; + } + this.triggerEvent('click', e.detail); + }, + + onClickThumb(e) { + this.triggerEvent('thumb', e.detail); + }, + + onClickTag(e) { + this.triggerEvent('tag', e.detail); + }, + + onClickCart(e) { + this.triggerEvent('add-cart', e.detail); + }, + + setHidden(hidden) { + this.setData({ hiddenInData: !!hidden }); + }, + }, +}); diff --git a/pages/order/components/specs-goods-card/index.json b/pages/order/components/specs-goods-card/index.json new file mode 100644 index 0000000..ccbce72 --- /dev/null +++ b/pages/order/components/specs-goods-card/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "goods-card": "../goods-card/index" + } +} \ No newline at end of file diff --git a/pages/order/components/specs-goods-card/index.wxml b/pages/order/components/specs-goods-card/index.wxml new file mode 100644 index 0000000..f6f2a38 --- /dev/null +++ b/pages/order/components/specs-goods-card/index.wxml @@ -0,0 +1,40 @@ + + diff --git a/pages/order/components/specs-goods-card/index.wxss b/pages/order/components/specs-goods-card/index.wxss new file mode 100644 index 0000000..e69de29 diff --git a/pages/order/config.js b/pages/order/config.js new file mode 100644 index 0000000..20a3317 --- /dev/null +++ b/pages/order/config.js @@ -0,0 +1,94 @@ +export const OrderStatus = { + PENDING_PAYMENT: 5, // 待支付 + PENDING_DELIVERY: 10, // 待发货 + PENDING_RECEIPT: 40, // 待收货 + COMPLETE: 50, // 已完成/待评价 + PAYMENT_TIMEOUT: 80, // 已取消,支付超时 + CANCELED_NOT_PAYMENT: 80, // 已取消,未支付主动取消 + CANCELED_PAYMENT: 80, // 已取消,已支付主动取消 + CANCELED_REJECTION: 80, // 已取消,拒收 +}; + +// 售后状态 10:待审核,20:已审核,30:已收货,40:收货异常,50:已完成,60:已关闭; +export const AfterServiceStatus = { + TO_AUDIT: 10, // 待审核 + THE_APPROVED: 20, // 已审核 + HAVE_THE_GOODS: 30, // 已收货 + ABNORMAL_RECEIVING: 40, // 收货异常 + COMPLETE: 50, // 已完成 + CLOSED: 60, // 已关闭 +}; + +// 售后类型 +export const ServiceType = { + RETURN_GOODS: 10, // 退货退款 + ONLY_REFUND: 20, // 仅退款 + ORDER_CANCEL: 30, // 支付后取消 +}; + +export const ServiceTypeDesc = { + [ServiceType.RETURN_GOODS]: '退货', + [ServiceType.ONLY_REFUND]: '退款', + [ServiceType.ORDER_CANCEL]: '支付后取消', +}; + +// 订单按钮类型 +export const OrderButtonTypes = { + PAY: 1, // 付款 + CANCEL: 2, // 取消订单 + CONFIRM: 3, // 确认收货 + APPLY_REFUND: 4, // 申请售后 + VIEW_REFUND: 5, // 查看退款 + COMMENT: 6, // 评价 + DELETE: 7, // 删除订单 + DELIVERY: 8, // 查看物流 + REBUY: 9, // 再次购买 + INVITE_GROUPON: 11, //邀请好友拼团 +}; + +// 售后服务按钮类型 +export const ServiceButtonTypes = { + REVOKE: 2, // 撤销 + FILL_TRACKING_NO: 3, // 填写运单号 + CHANGE_TRACKING_NO: 4, // 修改运单号 + VIEW_DELIVERY: 5, // 查看物流 +}; + +// 售后状态 +export const ServiceStatus = { + PENDING_VERIFY: 100, //待审核 + VERIFIED: 110, // 已审核待寄回商品 + PENDING_DELIVERY: 120, // 等待买家寄回商品 + PENDING_RECEIPT: 130, // 已寄回商品,待收货 + RECEIVED: 140, // 已收货 + EXCEPTION: 150, // 收货异常 + REFUNDED: 160, // 已退款 + CLOSED: 170, // 已关闭 +}; + +// 售后收货状态 +export const ServiceReceiptStatus = { + RECEIPTED: 1, // 已收到货 + NOT_RECEIPTED: 2, // 未收到货 +}; + +// 物流节点 +export const LogisticsNodeTypes = { + SUBMITTED: 200001, // 已提交订单 + PAYMENTED: 200002, // 已付款/已下单 + SHIPPED: 200003, // 已发货 + CANCELED: 200004, // 已取消 + RECEIVED: 200005, // 已签收 + ADDRESS_CHANGED: 200006, // 已修改地址 + IN_TRANSIT: 200007, // 运输中 +}; + +export const LogisticsIconMap = { + [LogisticsNodeTypes.SUBMITTED]: '', + [LogisticsNodeTypes.PAYMENTED]: 'credit_card', + [LogisticsNodeTypes.SHIPPED]: 'deliver', + [LogisticsNodeTypes.CANCELED]: '', + [LogisticsNodeTypes.RECEIVED]: 'check', + [LogisticsNodeTypes.ADDRESS_CHANGED]: '', + [LogisticsNodeTypes.IN_TRANSIT]: 'yunshuzhong', +}; diff --git a/pages/order/delivery-detail/index.js b/pages/order/delivery-detail/index.js new file mode 100644 index 0000000..f10ff02 --- /dev/null +++ b/pages/order/delivery-detail/index.js @@ -0,0 +1,43 @@ +Page({ + data: { + logisticsData: { + logisticsNo: '', + nodes: [], + company: '', + phoneNumber: '', + }, + active: 0, + }, + + onLoad(query) { + let data; + try { + data = JSON.parse(decodeURIComponent(query.data || '{}')); + } catch (e) { + console.warn('物流节点数据解析失败', e); + } + if (Number(query.source) === 2) { + const service = { + company: data.logisticsCompanyName, + logisticsNo: data.logisticsNo, + nodes: data.nodes, + }; + this.setData({ + logisticsData: service, + }); + } else if (data) { + this.setData({ logisticsData: data }); + } + }, + + onLogisticsNoCopy() { + wx.setClipboardData({ data: this.data.logisticsData.logisticsNo }); + }, + + onCall() { + const { phoneNumber } = this.data.logisticsData; + wx.makePhoneCall({ + phoneNumber, + }); + }, +}); diff --git a/pages/order/delivery-detail/index.json b/pages/order/delivery-detail/index.json new file mode 100644 index 0000000..ba23e4c --- /dev/null +++ b/pages/order/delivery-detail/index.json @@ -0,0 +1,11 @@ +{ + "navigationBarTitleText": "物流信息", + "usingComponents": { + "t-cell": "tdesign-miniprogram/cell/cell", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-steps": "tdesign-miniprogram/steps/steps", + "t-image": "/components/webp-image/index", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-step": "tdesign-miniprogram/steps/step-item" + } +} \ No newline at end of file diff --git a/pages/order/delivery-detail/index.wxml b/pages/order/delivery-detail/index.wxml new file mode 100644 index 0000000..b5a8bf5 --- /dev/null +++ b/pages/order/delivery-detail/index.wxml @@ -0,0 +1,91 @@ + + var isUrl = function(item) { + return item.indexOf('http') > -1; + } + module.exports = { + isUrl: isUrl, + } + + + + + + {{logisticsData.logisticsNo}} + 复制 + + + + + 拨打 + + + + + + + + + + + + + + + {{item.desc}} + {{item.date}} + + + + + diff --git a/pages/order/delivery-detail/index.wxss b/pages/order/delivery-detail/index.wxss new file mode 100644 index 0000000..6a2524c --- /dev/null +++ b/pages/order/delivery-detail/index.wxss @@ -0,0 +1,99 @@ +page { + background-color: #f5f5f5; +} +.page-section { + margin-top: 24rpx; + background-color: white; +} +.page-section .order-group__left { + margin-right: 0 !important; +} +.cell-steps { + padding: 8rpx; +} +.wr-cell__title { + flex: none; + font-size: 28rpx; + color: #666; +} +.wr-cell__value { + flex: auto; + margin-left: 30rpx; + font-size: 28rpx; + color: #333 !important; +} +.logistics-no { + display: inline-block; + text-align: left; + word-break: break-all; + color: #333; +} +.text-btn { + margin-left: 20rpx; + display: inline; + font-size: 24rpx; + padding: 0 15rpx; + border: 1rpx solid #ddd; + border-radius: 28rpx; + color: #333; +} +.text-btn--active { + opacity: 0.5; +} +.steps .step-title { + font-weight: bold; + color: #333 !important; + font-size: 30rpx; +} +.steps .step-desc { + color: #333333; + font-size: 28rpx; +} +.steps .step-date { + color: #999999; + font-size: 24rpx; +} + +.cell-steps__img, +.cell-steps__imgWrapper { + width: 48rpx; + height: 48rpx; +} + +.steps + .t-step--vertical.t-step--default-anchor + .t-steps-item--process + .t-steps-item__icon-number { + background: #ffece9 !important; + color: white !important; + border: none; +} + +.steps + .t-step--vertical.t-step--default-anchor + .t-steps-item--default + .t-steps-item__icon-number { + color: white !important; + background: #f5f5f5 !important; + border: none; +} + +.steps + .t-step--vertical.t-step--default-anchor.t-step--not-last-child + .t-steps-item__inner::after { + top: 48rpx; + height: calc(100% - 44rpx - 4rpx); +} + +.steps + .t-step--vertical.t-step--default-anchor.t-step--not-last-child + .t-steps-item__inner::after, +.steps + .t-step--vertical.t-step--default-anchor.t-step--not-last-child + .t-steps-item--default + .t-steps-item__inner:after { + background: #f5f5f5 !important; +} +.page-section__steps { + padding: 24rpx; +} diff --git a/pages/order/fill-tracking-no/api.js b/pages/order/fill-tracking-no/api.js new file mode 100644 index 0000000..33f41de --- /dev/null +++ b/pages/order/fill-tracking-no/api.js @@ -0,0 +1,71 @@ +import { mockIp, mockReqId } from '../../../utils/mock'; + +export function create() { + const _resq = { + data: null, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 79, + success: true, + }; + return Promise.resolve(_resq); +} + +export function update() { + const _resq = { + data: null, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 79, + success: true, + }; + return Promise.resolve(_resq); +} + +export function getDeliverCompanyList() { + const _resq = { + data: [ + { + name: '中通快递', + code: '0001', + }, + { + name: '申通快递', + code: '0002', + }, + { + name: '圆通快递', + code: '0003', + }, + { + name: '顺丰快递', + code: '0004', + }, + { + name: '百世快递', + code: '0005', + }, + { + name: '韵达快递', + code: '0006', + }, + { + name: '邮政快递', + code: '0007', + }, + { + name: '丰网快递', + code: '0008', + }, + { + name: '顺丰直邮', + code: '0009', + }, + ], + }; + return Promise.resolve(_resq); +} diff --git a/pages/order/fill-tracking-no/index.js b/pages/order/fill-tracking-no/index.js new file mode 100644 index 0000000..dd6ff3b --- /dev/null +++ b/pages/order/fill-tracking-no/index.js @@ -0,0 +1,190 @@ +import Dialog from 'tdesign-miniprogram/dialog/index'; +import Toast from 'tdesign-miniprogram/toast/index'; +import reasonSheet from '../components/reason-sheet/reasonSheet'; +import { getDeliverCompanyList, create, update } from './api'; + +Page({ + deliveryCompanyList: [], + + data: { + trackingNo: '', + remark: '', + deliveryCompany: null, + submitActived: false, + submitting: false, + }, + onLoad(query) { + const { + rightsNo = '', + logisticsNo = '', + logisticsCompanyName = '', + logisticsCompanyCode = '', + remark = '', + } = query; + + if (!rightsNo) { + Dialog.confirm({ + title: '请选择售后单?', + content: '', + confirmBtn: '确认', + }).then(() => { + wx.navigateBack({ backRefresh: true }); + }); + } + this.rightsNo = rightsNo; + if (logisticsNo) { + wx.setNavigationBarTitle({ + title: '修改运单号', + fail() {}, + }); + this.isChange = true; + this.setData({ + deliveryCompany: { + name: logisticsCompanyName, + code: logisticsCompanyCode, + }, + trackingNo: logisticsNo, + remark, + submitActived: true, + }); + } + this.setWatcher('trackingNo', this.checkParams.bind(this)); + this.setWatcher('deliveryCompany', this.checkParams.bind(this)); + }, + + setWatcher(key, callback) { + let lastData = this.data; + const keys = key.split('.'); + keys.slice(0, -1).forEach((k) => { + lastData = lastData[k]; + }); + const lastKey = keys[keys.length - 1]; + this.observe(lastData, lastKey, callback); + }, + + observe(data, k, callback) { + let val = data[k]; + Object.defineProperty(data, k, { + configurable: true, + enumerable: true, + set: (value) => { + val = value; + callback(); + }, + get: () => { + return val; + }, + }); + }, + + getDeliveryCompanyList() { + if (this.deliveryCompanyList.length > 0) { + return Promise.resolve(this.deliveryCompanyList); + } + return getDeliverCompanyList().then((res) => { + this.deliveryCompanyList = res.data || []; + return this.deliveryCompanyList; + }); + }, + + onInput(e) { + const { key } = e.currentTarget.dataset; + const { value } = e.detail; + this.setData({ [key]: value }); + }, + + onCompanyTap() { + this.getDeliveryCompanyList().then((deliveryCompanyList) => { + reasonSheet({ + show: true, + title: '选择物流公司', + options: deliveryCompanyList.map((company) => ({ + title: company.name, + checked: this.data.deliveryCompany + ? company.code === this.data.deliveryCompany.code + : false, + })), + showConfirmButton: true, + showCancelButton: true, + emptyTip: '请选择物流公司', + }).then((indexes) => { + this.setData({ + deliveryCompany: deliveryCompanyList[indexes[0]], + }); + }); + }); + }, + + checkParams() { + const res = { errMsg: '', require: false }; + + if (!this.data.trackingNo) { + res.errMsg = '请填写运单号'; + res.require = true; + } else if (!this.data.deliveryCompany) { + res.errMsg = '请选择物流公司'; + res.require = true; + } + this.setData({ submitActived: !res.require }); + return res; + }, + + onSubmit() { + const checkRes = this.checkParams(); + if (checkRes.errMsg) { + Toast({ + context: this, + selector: '#t-toast', + message: checkRes.errMsg, + icon: '', + }); + return; + } + + const { + trackingNo, + remark, + deliveryCompany: { code, name }, + } = this.data; + + const params = { + rightsNo: this.rightsNo, + logisticsCompanyCode: code, + logisticsCompanyName: name, + logisticsNo: trackingNo, + remark, + }; + const api = this.isChange ? create : update; + this.setData({ submitting: true }); + api(params) + .then(() => { + this.setData({ submitting: false }); + Toast({ + context: this, + selector: '#t-toast', + message: '保存成功', + icon: '', + }); + setTimeout(() => wx.navigateBack({ backRefresh: true }), 1000); + }) + .catch(() => { + this.setData({ submitting: false }); + }); + }, + + onScanTap() { + wx.scanCode({ + scanType: ['barCode'], + success: (res) => { + Toast({ + context: this, + selector: '#t-toast', + message: '扫码成功', + icon: '', + }); + this.setData({ trackingNo: res.result }); + }, + fail: () => {}, + }); + }, +}); diff --git a/pages/order/fill-tracking-no/index.json b/pages/order/fill-tracking-no/index.json new file mode 100644 index 0000000..bd1bb20 --- /dev/null +++ b/pages/order/fill-tracking-no/index.json @@ -0,0 +1,14 @@ +{ + "navigationBarTitleText": "填写运单号", + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-textarea": "tdesign-miniprogram/textarea/textarea", + "t-input": "tdesign-miniprogram/input/input", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-button": "tdesign-miniprogram/button/button", + "ui-reason-sheet": "../components/reason-sheet/index" + } +} \ No newline at end of file diff --git a/pages/order/fill-tracking-no/index.wxml b/pages/order/fill-tracking-no/index.wxml new file mode 100644 index 0000000..18592b5 --- /dev/null +++ b/pages/order/fill-tracking-no/index.wxml @@ -0,0 +1,54 @@ + + 请填写正确的退货包裹运单信息,以免影响退款进度 + + + + + + + + + + 备注信息 + + + + + + 保存 + + + + + + + diff --git a/pages/order/fill-tracking-no/index.wxss b/pages/order/fill-tracking-no/index.wxss new file mode 100644 index 0000000..c64e653 --- /dev/null +++ b/pages/order/fill-tracking-no/index.wxss @@ -0,0 +1,95 @@ +@import '../../../style/theme.wxss'; + +:host { + background-color: #f5f5f5; +} + +.notice-bar { + padding: 24rpx 30rpx; + text-align: center; + font-size: 26rpx; + color: #e17349; + background: #fefcef; +} + +.fill-tracking-no__form { + margin-top: 20rpx; +} + +.fill-tracking-no__form .t-cell__note { + justify-content: flex-start; +} + +.fill-tracking-no__form .t-cell__value { + color: #333 !important; + font-size: 30rpx; + text-align: left; + padding: 0; +} + + +.fill-tracking-no__form .t-cell__value::after { + border: none !important; +} + +.fill-tracking-no__form .t-cell__value .t-textarea__wrapper { + padding: 0; +} + +.fill-tracking-no__form .t-input__control, +.fill-tracking-no__form .t-textarea__placeholder, +.fill-tracking-no__form .t-cell__placeholder { + font-size: 30rpx !important; +} + +.fill-tracking-no__form .t-textarea__placeholder, +.fill-tracking-no__form .t-cell__placeholder { + color: #bbbbbb !important; +} + +.t-textarea__note { + width: 100%; +} + +.fill-tracking-no__button-bar { + margin: 38rpx 30rpx 0; +} + +.fill-tracking-no__button-bar .btn { + background-color: transparent; + font-size: 32rpx; + width: 100%; + border-radius: 48rpx; +} + +.fill-tracking-no__button-bar .btn:first-child { + margin-bottom: 20rpx; +} + +.fill-tracking-no__button-bar .btn.confirmBtn { + background: #fa4126; + color: #fff; +} + +.fill-tracking-no__button-bar .btn.disabled { + background-color: #c6c6c6; + color: #fff; +} + +.fill-tracking-no__button-bar .t-class-confirm { + color: #fa4126; +} + +.t-cell-title-width { + width: 160rpx; + flex: none !important; +} +.textarea-wrapper { + background: #fff; + display: flex; + align-items: flex-start; + padding: 24rpx 32rpx 0 32rpx; +} +.t-textarea-wrapper { + box-sizing: border-box; +} diff --git a/pages/order/invoice/index.js b/pages/order/invoice/index.js new file mode 100644 index 0000000..5333802 --- /dev/null +++ b/pages/order/invoice/index.js @@ -0,0 +1,38 @@ +import { fetchOrderDetail } from '../../../services/order/orderDetail'; + +Page({ + data: { + invoice: {}, + }, + onLoad({ orderNo }) { + this.orderNo = orderNo; + this.init(); + }, + init() { + this.getDetail(); + }, + getDetail() { + const params = { + parameter: this.orderNo, + }; + return fetchOrderDetail(params).then((res) => { + const order = res.data; + + const invoice = { + buyerName: order?.invoiceVO?.buyerName, //个人或公司名称 + buyerTaxNo: order?.invoiceVO?.buyerTaxNo, //税号 + buyerPhone: order?.invoiceVO?.buyerPhone, //手机 + email: order?.invoiceVO?.email, //邮箱 + titleType: order?.invoiceVO?.titleType === 1 ? '个人' : '公司', //发票抬头 1-个人 2-公司 + ontentType: order?.invoiceVO?.ontentType === 1 ? '商品明细' : '2类别', //发票内容 1-明细 2类别 + invoiceType: + order?.invoiceVO?.invoiceType === 5 ? '电子普通发票' : '不开发票', //是否开票 0-不开 5-电子发票 + isInvoice: order?.invoiceVO?.buyerName ? '已开票' : '未开票', + money: order?.invoiceVO?.money, + }; + this.setData({ + invoice, + }); + }); + }, +}); diff --git a/pages/order/invoice/index.json b/pages/order/invoice/index.json new file mode 100644 index 0000000..ea83b65 --- /dev/null +++ b/pages/order/invoice/index.json @@ -0,0 +1,8 @@ +{ + "navigationBarTitleText": "发票详情", + "usingComponents": { + "t-cell": "tdesign-miniprogram/cell/cell", + "t-button": "tdesign-miniprogram/button/button", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group" + } +} diff --git a/pages/order/invoice/index.wxml b/pages/order/invoice/index.wxml new file mode 100644 index 0000000..b3bc794 --- /dev/null +++ b/pages/order/invoice/index.wxml @@ -0,0 +1,40 @@ + + + 发票详情 + + 发票类型 + {{invoice.invoiceType}} + + + 发票抬头 + {{invoice.buyerName}} + + + 纳税人识别号 + {{invoice.buyerTaxNo}} + + + 发票内容 + {{invoice.ontentType}} + + + 发票金额 + {{invoice.money}} + + + + 收票人信息 + + 邮箱 + {{invoice.email}} + + + 手机号 + {{invoice.buyerPhone}} + + + 开票状态 + {{invoice.isInvoice}} + + + diff --git a/pages/order/invoice/index.wxss b/pages/order/invoice/index.wxss new file mode 100644 index 0000000..0a0379b --- /dev/null +++ b/pages/order/invoice/index.wxss @@ -0,0 +1,31 @@ +:host { + background-color: #f5f5f5; +} + +.invoice-detail .invoice-detail-box { + background-color: #fff; + padding: 24rpx 32rpx; + margin-top: 24rpx; +} + +.invoice-detail-title { + font-size: 14px; + font-weight: 600; +} + +.invoice-detail-box-row { + display: flex; + margin-top: 44rpx; +} + +.invoice-detail-box-title { + font-size: 13px; + color: #666666; + width: 156rpx; + margin-right: 32rpx; +} + +.invoice-detail-box-value { + font-size: 13px; + color: #333333; +} diff --git a/pages/order/order-confirm/components/address-card/index.js b/pages/order/order-confirm/components/address-card/index.js new file mode 100644 index 0000000..96cf8ef --- /dev/null +++ b/pages/order/order-confirm/components/address-card/index.js @@ -0,0 +1,25 @@ +/* + * @Author: rileycai + * @Date: 2022-03-05 16:47:16 + * @LastEditTime: 2022-03-05 16:48:32 + * @LastEditors: rileycai + * @Description: + * @FilePath: /tdesign-miniprogram-starter/pages/order/order-confirm/components/address-card/index.js + */ +Component({ + externalClasses: ['wr-class'], + properties: { + addressData: { + type: Object, + value: {}, + }, + }, + methods: { + onAddressTap() { + this.triggerEvent('addressclick'); + }, + onAddTap() { + this.triggerEvent('addclick'); + }, + }, +}); diff --git a/pages/order/order-confirm/components/address-card/index.json b/pages/order/order-confirm/components/address-card/index.json new file mode 100644 index 0000000..08ecc96 --- /dev/null +++ b/pages/order/order-confirm/components/address-card/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-cell": "tdesign-miniprogram/cell/cell", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} diff --git a/pages/order/order-confirm/components/address-card/index.wxml b/pages/order/order-confirm/components/address-card/index.wxml new file mode 100644 index 0000000..9cf86f4 --- /dev/null +++ b/pages/order/order-confirm/components/address-card/index.wxml @@ -0,0 +1,46 @@ + + var hidePhoneNum = function(array) { + if (!array) return; + var mphone = array.substring(0, 3) + '****' + array.substring(7); + return mphone; + } + module.exports = { + hidePhoneNum:hidePhoneNum + } + + + + + + + + + + {{addressData.addressTag}} + + {{addressData.provinceName}} {{addressData.cityName}} {{addressData.districtName}} + + {{addressData.detailAddress}} + + {{addressData.name}} {{utils.hidePhoneNum(addressData.phone)}} + + + + + + + + + + + diff --git a/pages/order/order-confirm/components/address-card/index.wxss b/pages/order/order-confirm/components/address-card/index.wxss new file mode 100644 index 0000000..aaff4bd --- /dev/null +++ b/pages/order/order-confirm/components/address-card/index.wxss @@ -0,0 +1,66 @@ +.address-card { + background: #fff; + margin: 0rpx 0rpx 24rpx; +} +.address-card .wr-cell__title { + color: #999; + margin-left: 6rpx; +} +.address-card .order-address { + display: flex; + width: 100%; +} +.address-card .order-address .address-content { + flex: 1; +} +.order-address .address__right { + align-self: center; +} +.address-card .order-address .title { + display: flex; + align-items: center; + height: 40rpx; + font-size: 28rpx; + font-weight: normal; + color: #999999; + line-height: 40rpx; +} +.address-card .order-address .title .address-tag { + width: 52rpx; + height: 29rpx; + border: 1rpx solid #0091ff; + background-color: rgba(122, 167, 251, 0.1); + text-align: center; + line-height: 29rpx; + border-radius: 8rpx; + color: #0091ff; + font-size: 20rpx; + margin-right: 12rpx; +} +.address-card .order-address .detail { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + font-size: 36rpx; + font-weight: bold; + color: #333333; + line-height: 48rpx; + margin: 8rpx 0; +} +.address-card .order-address .info { + height: 40rpx; + font-size: 28rpx; + font-weight: normal; + color: #333333; + line-height: 40rpx; +} +.address-card .top-line { + width: 100%; + height: 6rpx; + background-color: #fff; + background-image: url(https://cdn-we-retail.ym.tencent.com/miniapp/order/stripe.png); + background-repeat: repeat-x; + display: block; +} diff --git a/pages/order/order-confirm/getNotes.wxs b/pages/order/order-confirm/getNotes.wxs new file mode 100644 index 0000000..935962c --- /dev/null +++ b/pages/order/order-confirm/getNotes.wxs @@ -0,0 +1,11 @@ +var getNotes = function (storeInfoList, storeIndex) { + if (!storeInfoList) { + return ''; + } + var storeInfo = storeInfoList[storeIndex]; + if (!storeInfo) { + return ''; + } + return storeInfoList[storeIndex].remark; +}; +module.exports = getNotes; diff --git a/pages/order/order-confirm/handleInvoice.wxs b/pages/order/order-confirm/handleInvoice.wxs new file mode 100644 index 0000000..30e50f9 --- /dev/null +++ b/pages/order/order-confirm/handleInvoice.wxs @@ -0,0 +1,11 @@ +var handleInvoice = function (invoiceData) { + if (!invoiceData || invoiceData.invoiceType == 0) { + return '暂不开发票'; + } + var title = invoiceData.titleType == 2 ? '公司' : '个人'; + var content = invoiceData.contentType == 2 ? '商品类别' : '商品明细'; + return invoiceData.email + ? '电子普通发票 (' + content + ' - ' + title + ')' + : '暂不开发票'; +}; +module.exports = handleInvoice; diff --git a/pages/order/order-confirm/index.js b/pages/order/order-confirm/index.js new file mode 100644 index 0000000..8ac2566 --- /dev/null +++ b/pages/order/order-confirm/index.js @@ -0,0 +1,571 @@ +import Toast from 'tdesign-miniprogram/toast/index'; +import { fetchSettleDetail } from '../../../services/order/orderConfirm'; +import { commitPay, wechatPayOrder } from './pay'; +import { getAddressPromise } from '../../usercenter/address/list/util'; + +const stripeImg = `https://cdn-we-retail.ym.tencent.com/miniapp/order/stripe.png`; + +Page({ + data: { + placeholder: '备注信息', + stripeImg, + loading: false, + settleDetailData: { + storeGoodsList: [], //正常下单商品列表 + outOfStockGoodsList: [], //库存不足商品 + abnormalDeliveryGoodsList: [], // 不能正常配送商品 + inValidGoodsList: [], // 失效或者库存不足 + limitGoodsList: [], //限购商品 + couponList: [], //门店优惠券信息 + }, // 获取结算页详情 data + orderCardList: [], // 仅用于商品卡片展示 + couponsShow: false, // 显示优惠券的弹框 + invoiceData: { + email: '', // 发票发送邮箱 + buyerTaxNo: '', // 税号 + invoiceType: null, // 开票类型 1:增值税专用发票; 2:增值税普通发票; 3:增值税电子发票;4:增值税卷式发票;5:区块链电子发票。 + buyerPhone: '', //手机号 + buyerName: '', //个人或公司名称 + titleType: '', // 发票抬头 1-公司 2-个人 + contentType: '', //发票内容 1-明细 2-类别 + }, + goodsRequestList: [], + userAddressReq: null, + popupShow: false, // 不在配送范围 失效 库存不足 商品展示弹框 + notesPosition: 'center', + storeInfoList: [], + storeNoteIndex: 0, //当前填写备注门店index + promotionGoodsList: [], //当前门店商品列表(优惠券) + couponList: [], //当前门店所选优惠券 + submitCouponList: [], //所有门店所选优惠券 + currentStoreId: null, //当前优惠券storeId + userAddress: null, + }, + + payLock: false, + noteInfo: [], + tempNoteInfo: [], + onLoad(options) { + this.setData({ + loading: true, + }); + this.handleOptionsParams(options); + }, + onShow() { + const invoiceData = wx.getStorageSync('invoiceData'); + if (invoiceData) { + //处理发票 + this.invoiceData = invoiceData; + this.setData({ + invoiceData, + }); + wx.removeStorageSync('invoiceData'); + } + }, + + init() { + this.setData({ + loading: true, + }); + const { goodsRequestList } = this; + this.handleOptionsParams({ goodsRequestList }); + }, + // 处理不同情况下跳转到结算页时需要的参数 + handleOptionsParams(options, couponList) { + let { goodsRequestList } = this; // 商品列表 + let { userAddressReq } = this; // 收货地址 + + const storeInfoList = []; // 门店列表 + // 如果是从地址选择页面返回,则使用地址显选择页面新选择的地址去获取结算数据 + if (options.userAddressReq) { + userAddressReq = options.userAddressReq; + } + if (options.type === 'cart') { + // 从购物车跳转过来时,获取传入的商品列表数据 + const goodsRequestListJson = wx.getStorageSync('order.goodsRequestList'); + goodsRequestList = JSON.parse(goodsRequestListJson); + } else if (typeof options.goodsRequestList === 'string') { + goodsRequestList = JSON.parse(options.goodsRequestList); + } + //获取结算页请求数据列表 + const storeMap = {}; + goodsRequestList.forEach((goods) => { + if (!storeMap[goods.storeId]) { + storeInfoList.push({ + storeId: goods.storeId, + storeName: goods.storeName, + }); + storeMap[goods.storeId] = true; + } + }); + this.goodsRequestList = goodsRequestList; + this.storeInfoList = storeInfoList; + const params = { + goodsRequestList, + storeInfoList, + userAddressReq, + couponList, + }; + fetchSettleDetail(params).then( + (res) => { + this.setData({ + loading: false, + }); + this.initData(res.data); + }, + () => { + //接口异常处理 + this.handleError(); + }, + ); + }, + initData(resData) { + // 转换商品卡片显示数据 + const data = this.handleResToGoodsCard(resData); + this.userAddressReq = resData.userAddress; + + if (resData.userAddress) { + this.setData({ userAddress: resData.userAddress }); + } + this.setData({ settleDetailData: data }); + this.isInvalidOrder(data); + }, + + isInvalidOrder(data) { + // 失效 不在配送范围 限购的商品 提示弹窗 + if ( + (data.limitGoodsList && data.limitGoodsList.length > 0) || + (data.abnormalDeliveryGoodsList && + data.abnormalDeliveryGoodsList.length > 0) || + (data.inValidGoodsList && data.inValidGoodsList.length > 0) + ) { + this.setData({ popupShow: true }); + return true; + } + this.setData({ popupShow: false }); + if (data.settleType === 0) { + return true; + } + return false; + }, + + handleError() { + Toast({ + context: this, + selector: '#t-toast', + message: '结算异常, 请稍后重试', + duration: 2000, + icon: '', + }); + + setTimeout(() => { + wx.navigateBack(); + }, 1500); + this.setData({ + loading: false, + }); + }, + getRequestGoodsList(storeGoodsList) { + const filterStoreGoodsList = []; + storeGoodsList && + storeGoodsList.forEach((store) => { + const { storeName } = store; + store.skuDetailVos && + store.skuDetailVos.forEach((goods) => { + const data = goods; + data.storeName = storeName; + filterStoreGoodsList.push(data); + }); + }); + return filterStoreGoodsList; + }, + handleGoodsRequest(goods, isOutStock = false) { + const { + reminderStock, + quantity, + storeId, + uid, + saasId, + spuId, + goodsName, + skuId, + storeName, + roomId, + } = goods; + const resQuantity = isOutStock ? reminderStock : quantity; + return { + quantity: resQuantity, + storeId, + uid, + saasId, + spuId, + goodsName, + skuId, + storeName, + roomId, + }; + }, + handleResToGoodsCard(data) { + // 转换数据 符合 goods-card展示 + const orderCardList = []; // 订单卡片列表 + const storeInfoList = []; + const submitCouponList = []; //使用优惠券列表; + + data.storeGoodsList && + data.storeGoodsList.forEach((ele) => { + const orderCard = { + id: ele.storeId, + storeName: ele.storeName, + status: 0, + statusDesc: '', + amount: ele.storeTotalPayAmount, + goodsList: [], + }; // 订单卡片 + ele.skuDetailVos.forEach((item, index) => { + orderCard.goodsList.push({ + id: index, + thumb: item.image, + title: item.goodsName, + specs: item.skuSpecLst.map((s) => s.specValue), // 规格列表 string[] + price: item.tagPrice || item.settlePrice || '0', // 优先取限时活动价 + settlePrice: item.settlePrice, + titlePrefixTags: item.tagText ? [{ text: item.tagText }] : [], + num: item.quantity, + skuId: item.skuId, + spuId: item.spuId, + storeId: item.storeId, + }); + }); + + storeInfoList.push({ + storeId: ele.storeId, + storeName: ele.storeName, + remark: '', + }); + submitCouponList.push({ + storeId: ele.storeId, + couponList: ele.couponList || [], + }); + this.noteInfo.push(''); + this.tempNoteInfo.push(''); + orderCardList.push(orderCard); + }); + + this.setData({ orderCardList, storeInfoList, submitCouponList }); + return data; + }, + onGotoAddress() { + /** 获取一个Promise */ + getAddressPromise() + .then((address) => { + this.handleOptionsParams({ + userAddressReq: { ...address, checked: true }, + }); + }) + .catch(() => {}); + + const { userAddressReq } = this; // 收货地址 + + let id = ''; + + if (userAddressReq?.id) { + id = `&id=${userAddressReq.id}`; + } + + wx.navigateTo({ + url: `/pages/usercenter/address/list/index?selectMode=1&isOrderSure=1${id}`, + }); + }, + onNotes(e) { + const { storenoteindex: storeNoteIndex } = e.currentTarget.dataset; + // 添加备注信息 + this.setData({ + dialogShow: true, + storeNoteIndex, + }); + }, + onInput(e) { + const { storeNoteIndex } = this.data; + this.noteInfo[storeNoteIndex] = e.detail.value; + }, + onBlur() { + this.setData({ + notesPosition: 'center', + }); + }, + onFocus() { + this.setData({ + notesPosition: 'self', + }); + }, + onTap() { + this.setData({ + placeholder: '', + }); + }, + onNoteConfirm() { + // 备注信息 确认按钮 + const { storeInfoList, storeNoteIndex } = this.data; + this.tempNoteInfo[storeNoteIndex] = this.noteInfo[storeNoteIndex]; + storeInfoList[storeNoteIndex].remark = this.noteInfo[storeNoteIndex]; + + this.setData({ + dialogShow: false, + storeInfoList, + }); + }, + onNoteCancel() { + // 备注信息 取消按钮 + const { storeNoteIndex } = this.data; + this.noteInfo[storeNoteIndex] = this.tempNoteInfo[storeNoteIndex]; + this.setData({ + dialogShow: false, + }); + }, + + onSureCommit() { + // 商品库存不足继续结算 + const { settleDetailData } = this.data; + const { outOfStockGoodsList, storeGoodsList, inValidGoodsList } = + settleDetailData; + if ( + (outOfStockGoodsList && outOfStockGoodsList.length > 0) || + (inValidGoodsList && storeGoodsList) + ) { + // 合并正常商品 和 库存 不足商品继续支付 + // 过滤不必要的参数 + const filterOutGoodsList = []; + outOfStockGoodsList && + outOfStockGoodsList.forEach((outOfStockGoods) => { + const { storeName } = outOfStockGoods; + outOfStockGoods.unSettlementGoods.forEach((ele) => { + const data = ele; + data.quantity = ele.reminderStock; + data.storeName = storeName; + filterOutGoodsList.push(data); + }); + }); + const filterStoreGoodsList = this.getRequestGoodsList(storeGoodsList); + const goodsRequestList = filterOutGoodsList.concat(filterStoreGoodsList); + this.handleOptionsParams({ goodsRequestList }); + } + }, + // 提交订单 + submitOrder() { + const { + settleDetailData, + userAddressReq, + invoiceData, + storeInfoList, + submitCouponList, + } = this.data; + const { goodsRequestList } = this; + + if (!userAddressReq && !settleDetailData.userAddress) { + Toast({ + context: this, + selector: '#t-toast', + message: '请添加收货地址', + duration: 2000, + icon: 'help-circle', + }); + + return; + } + if ( + this.payLock || + !settleDetailData.settleType || + !settleDetailData.totalAmount + ) { + return; + } + this.payLock = true; + const resSubmitCouponList = this.handleCouponList(submitCouponList); + const params = { + userAddressReq: settleDetailData.userAddress || userAddressReq, + goodsRequestList: goodsRequestList, + userName: settleDetailData.userAddress.name || userAddressReq.name, + totalAmount: settleDetailData.totalPayAmount, //取优惠后的结算金额 + invoiceRequest: null, + storeInfoList, + couponList: resSubmitCouponList, + }; + if (invoiceData && invoiceData.email) { + params.invoiceRequest = invoiceData; + } + commitPay(params).then( + (res) => { + this.payLock = false; + const { data } = res; + // 提交出现 失效 不在配送范围 限购的商品 提示弹窗 + if (this.isInvalidOrder(data)) { + return; + } + if (res.code === 'Success') { + this.handlePay(data, settleDetailData); + } else { + Toast({ + context: this, + selector: '#t-toast', + message: res.msg || '提交订单超时,请稍后重试', + duration: 2000, + icon: '', + }); + setTimeout(() => { + // 提交支付失败 返回购物车 + wx.navigateBack(); + }, 2000); + } + }, + (err) => { + this.payLock = false; + if ( + err.code === 'CONTAINS_INSUFFICIENT_GOODS' || + err.code === 'TOTAL_AMOUNT_DIFFERENT' + ) { + Toast({ + context: this, + selector: '#t-toast', + message: err.msg || '支付异常', + duration: 2000, + icon: '', + }); + this.init(); + } else if (err.code === 'ORDER_PAY_FAIL') { + Toast({ + context: this, + selector: '#t-toast', + message: '支付失败', + duration: 2000, + icon: 'close-circle', + }); + setTimeout(() => { + wx.redirectTo({ url: '/order/list' }); + }); + } else if (err.code === 'ILLEGAL_CONFIG_PARAM') { + Toast({ + context: this, + selector: '#t-toast', + message: + '支付失败,微信支付商户号设置有误,请商家重新检查支付设置。', + duration: 2000, + icon: 'close-circle', + }); + setTimeout(() => { + wx.redirectTo({ url: '/order/list' }); + }); + } else { + Toast({ + context: this, + selector: '#t-toast', + message: err.msg || '提交支付超时,请稍后重试', + duration: 2000, + icon: '', + }); + setTimeout(() => { + // 提交支付失败 返回购物车 + wx.navigateBack(); + }, 2000); + } + }, + ); + }, + + // 处理支付 + handlePay(data, settleDetailData) { + const { channel, payInfo, tradeNo, interactId, transactionId } = data; + const { totalAmount, totalPayAmount } = settleDetailData; + const payOrderInfo = { + payInfo: payInfo, + orderId: tradeNo, + orderAmt: totalAmount, + payAmt: totalPayAmount, + interactId: interactId, + tradeNo: tradeNo, + transactionId: transactionId, + }; + + if (channel === 'wechat') { + wechatPayOrder(payOrderInfo); + } + }, + + hide() { + // 隐藏 popup + this.setData({ + 'settleDetailData.abnormalDeliveryGoodsList': [], + }); + }, + onReceipt() { + // 跳转 开发票 + const invoiceData = this.invoiceData || {}; + wx.navigateTo({ + url: `/pages/order/receipt/index?invoiceData=${JSON.stringify( + invoiceData, + )}`, + }); + }, + + onCoupons(e) { + const { submitCouponList, currentStoreId } = this.data; + const { goodsRequestList } = this; + const { selectedList } = e.detail; + const tempSubmitCouponList = submitCouponList.map((storeCoupon) => { + return { + couponList: + storeCoupon.storeId === currentStoreId + ? selectedList + : storeCoupon.couponList, + }; + }); + const resSubmitCouponList = this.handleCouponList(tempSubmitCouponList); + //确定选择优惠券 + this.handleOptionsParams({ goodsRequestList }, resSubmitCouponList); + this.setData({ couponsShow: false }); + }, + onOpenCoupons(e) { + const { storeid } = e.currentTarget.dataset; + this.setData({ + couponsShow: true, + currentStoreId: storeid, + }); + }, + + handleCouponList(storeCouponList) { + //处理门店优惠券 转换成接口需要 + if (!storeCouponList) return []; + const resSubmitCouponList = []; + storeCouponList.forEach((ele) => { + resSubmitCouponList.push(...ele.couponList); + }); + return resSubmitCouponList; + }, + + onGoodsNumChange(e) { + const { + detail: { value }, + currentTarget: { + dataset: { goods }, + }, + } = e; + const index = this.goodsRequestList.findIndex( + ({ storeId, spuId, skuId }) => + goods.storeId === storeId && + goods.spuId === spuId && + goods.skuId === skuId, + ); + if (index >= 0) { + // eslint-disable-next-line no-confusing-arrow + const goodsRequestList = this.goodsRequestList.map((item, i) => + i === index ? { ...item, quantity: value } : item, + ); + this.handleOptionsParams({ goodsRequestList }); + } + }, + + onPopupChange() { + this.setData({ + popupShow: !this.data.popupShow, + }); + }, +}); diff --git a/pages/order/order-confirm/index.json b/pages/order/order-confirm/index.json new file mode 100644 index 0000000..11f25ac --- /dev/null +++ b/pages/order/order-confirm/index.json @@ -0,0 +1,16 @@ +{ + "navigationBarTitleText": "订单确认", + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-textarea": "tdesign-miniprogram/textarea/textarea", + "price": "/components/price/index", + "select-coupons": "../components/selectCoupons/selectCoupons", + "no-goods": "../components/noGoods/noGoods", + "t-image": "/components/webp-image/index", + "address-card": "./components/address-card/index" + } +} \ No newline at end of file diff --git a/pages/order/order-confirm/index.wxml b/pages/order/order-confirm/index.wxml new file mode 100644 index 0000000..c410ed3 --- /dev/null +++ b/pages/order/order-confirm/index.wxml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + {{goods.title}} + {{goods.specs}} + + + + x{{goods.num}} + + + + + + 商品总额 + + + + 运费 + + + + + + + 免运费 + + + + 活动优惠 + + - + + + + + 优惠券 + + + + - + + 选择优惠券 + + 无可用 + + + + + 发票 + + {{handleInvoice(invoiceData)}} + + + + + 订单备注 + + {{getNotes(storeInfoList, 0) ? getNotes(storeInfoList, 0) :'选填,建议先和商家沟通确认'}} + + + + + + + 共{{settleDetailData.totalGoodsCount}}件 + 小计 + + + + + + + + 提交订单 + + + + + + + + + + + + + + diff --git a/pages/order/order-confirm/index.wxss b/pages/order/order-confirm/index.wxss new file mode 100644 index 0000000..73e0188 --- /dev/null +++ b/pages/order/order-confirm/index.wxss @@ -0,0 +1,229 @@ +.order-sure { + box-sizing: border-box; + background: #f6f6f6; + padding: 24rpx 0 calc(env(safe-area-inset-bottom) + 136rpx); + min-height: 100vh; +} + +.order-sure .wx-pay-cover { + position: fixed; + left: 0; + bottom: 0; + right: 0; + z-index: 10; + background: #fff; + height: 112rpx; + padding-bottom: env(safe-area-inset-bottom); +} +.order-sure .wx-pay-cover .wx-pay { + width: 100%; + height: 100rpx; + box-sizing: border-box; + padding: 0rpx 32rpx; + display: flex; + justify-content: space-between; + align-items: center; +} +.order-sure .wx-pay-cover .wx-pay .price { + color: #fa4126; + font-weight: bold; + font-size: 63rpx; + line-height: 88rpx; +} + +.order-sure .wx-pay-cover .wx-pay .submit-btn { + height: 80rpx; + width: 240rpx; + border-radius: 40rpx; + background-color: #fa4126; + color: #ffffff; + line-height: 80rpx; + font-weight: bold; + font-size: 28rpx; + text-align: center; +} +.order-sure .wx-pay-cover .wx-pay .btn-gray { + background: #cccccc; +} + +.order-wrapper .store-wrapper { + width: 100%; + height: 96rpx; + box-sizing: border-box; + padding: 0 32rpx; + display: flex; + align-items: center; + font-size: 28rpx; + line-height: 40rpx; + color: #333333; + background-color: #ffffff; +} +.order-wrapper .store-wrapper .store-logo { + margin-right: 16rpx; +} +.order-wrapper .goods-wrapper { + width: 100%; + box-sizing: border-box; + padding: 16rpx 32rpx; + display: flex; + align-items: flex-start; + justify-content: space-between; + font-size: 24rpx; + line-height: 32rpx; + color: #999999; + background-color: #ffffff; +} +.goods-wrapper .goods-image { + width: 176rpx; + height: 176rpx; + border-radius: 8rpx; + overflow: hidden; + margin-right: 16rpx; +} +.goods-wrapper .goods-content { + flex: 1; +} + +.goods-wrapper .goods-content .goods-title { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + text-overflow: ellipsis; + font-size: 28rpx; + line-height: 40rpx; + margin-bottom: 12rpx; + color: #333333; + margin-right: 16rpx; +} + +.goods-wrapper .goods-right { + min-width: 128rpx; + display: flex; + flex-direction: column; + align-items: flex-end; +} + +.goods-right .goods-price { + color: #333333; + font-size: 32rpx; + line-height: 48rpx; + font-weight: bold; + margin-bottom: 16rpx; +} + +.goods-right .goods-num { + text-align: right; +} + +.order-sure .pay-detail { + background-color: #ffffff; + padding: 16rpx 32rpx; + width: 100%; + box-sizing: border-box; +} + +.order-sure .pay-detail .pay-item { + width: 100%; + height: 72rpx; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 26rpx; + line-height: 36rpx; + color: #666666; +} +.order-sure .pay-detail .pay-item .pay-item__right { + color: #333333; + font-size: 24rpx; + display: flex; + align-items: center; + justify-content: flex-end; + max-width: 400rpx; +} +.order-sure .pay-detail .pay-item .pay-item__right .pay-remark { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + max-width: 400rpx; + text-overflow: ellipsis; + overflow: hidden; +} +.order-sure .pay-detail .pay-item .font-bold { + font-weight: bold; +} +.order-sure .pay-detail .pay-item .primary { + color: #fa4126; +} + +.add-notes .add-notes__content { + padding: 32rpx 8rpx 0 !important; +} +.add-notes .add-notes__confirm { + color: #fa4126; +} + +.add-notes .t-textarea__placeholder, +.add-notes .add-notes__placeholder { + color: #aeb3b7; +} +.add-notes .add-notes__textarea__font { + font-size: 26rpx; +} +.add-notes .add-notes__textarea { + font-size: 24rpx; + border-radius: 10rpx; + color: #f5f5f5; + margin-top: 30rpx; +} +.order-sure .add-notes .dialog__message { + border-radius: 8rpx; +} + +.order-sure .add-notes .dialog__button-cancel::after { + border-right: 0; +} + +.order-sure .amount-wrapper { + width: 100%; + box-sizing: border-box; + background-color: #ffffff; + padding: 0rpx 32rpx; + height: 96rpx; +} + +.order-sure .pay-amount { + width: 100%; + height: 96rpx; + display: flex; + align-items: center; + justify-content: flex-end; + font-size: 28rpx; + color: #333333; + position: relative; +} +.order-sure .pay-amount::after { + position: absolute; + content: ' '; + top: 0; + left: 0; + width: 200%; + height: 200%; + transform: scale(0.5); + transform-origin: 0 0; + border-top: 2rpx solid #f5f5f5; +} +.order-sure .pay-amount .order-num { + color: #999999; + padding-right: 8rpx; +} + +.order-sure .pay-amount .total-price { + font-size: 36rpx; + color: #fa4126; + font-weight: bold; + padding-left: 8rpx; +} +.add-notes__confirm { + color: #fa4126 !important; +} diff --git a/pages/order/order-confirm/order.wxs b/pages/order/order-confirm/order.wxs new file mode 100644 index 0000000..42f3de1 --- /dev/null +++ b/pages/order/order-confirm/order.wxs @@ -0,0 +1,8 @@ +var toHide = function (array) { + if (!array) return; + var mphone = array.substring(0, 3) + '****' + array.substring(7); + return mphone; +}; +module.exports = { + toHide: toHide, +}; diff --git a/pages/order/order-confirm/pay.js b/pages/order/order-confirm/pay.js new file mode 100644 index 0000000..0c27c3c --- /dev/null +++ b/pages/order/order-confirm/pay.js @@ -0,0 +1,115 @@ +import Dialog from 'tdesign-miniprogram/dialog/index'; +import Toast from 'tdesign-miniprogram/toast/index'; + +import { dispatchCommitPay } from '../../../services/order/orderConfirm'; + +// 真实的提交支付 +export const commitPay = (params) => { + return dispatchCommitPay({ + goodsRequestList: params.goodsRequestList, // 待结算的商品集合 + invoiceRequest: params.invoiceRequest, // 发票信息 + // isIgnore: params.isIgnore || false, // 删掉 是否忽视库存不足和商品失效,继续结算,true=继续结算 购物车请赋值false + userAddressReq: params.userAddressReq, // 地址信息(用户在购物选择更换地址) + currency: params.currency || 'CNY', // 支付货币: 人民币=CNY,美元=USD + logisticsType: params.logisticsType || 1, // 配送方式 0=无需配送 1=快递 2=商家 3=同城 4=自提 + // orderMark: params.orderMark, // 下单备注 + orderType: params.orderType || 0, // 订单类型 0=普通订单 1=虚拟订单 + payType: params.payType || 1, // 支付类型(0=线上、1=线下) + totalAmount: params.totalAmount, // 新增字段"totalAmount"总的支付金额 + userName: params.userName, // 用户名 + payWay: 1, + authorizationCode: '', //loginCode, // 登录凭证 + storeInfoList: params.storeInfoList, //备注信息列表 + couponList: params.couponList, + groupInfo: params.groupInfo, + }); +}; + +export const paySuccess = (payOrderInfo) => { + const { payAmt, tradeNo, groupId, promotionId } = payOrderInfo; + // 支付成功 + Toast({ + context: this, + selector: '#t-toast', + message: '支付成功', + duration: 2000, + icon: 'check-circle', + }); + + const params = { + totalPaid: payAmt, + orderNo: tradeNo, + }; + if (groupId) { + params.groupId = groupId; + } + if (promotionId) { + params.promotionId = promotionId; + } + const paramsStr = Object.keys(params) + .map((k) => `${k}=${params[k]}`) + .join('&'); + // 跳转支付结果页面 + wx.redirectTo({ url: `/pages/order/pay-result/index?${paramsStr}` }); +}; + +export const payFail = (payOrderInfo, resultMsg) => { + if (resultMsg === 'requestPayment:fail cancel') { + if (payOrderInfo.dialogOnCancel) { + //结算页,取消付款,dialog提示 + Dialog.confirm({ + title: '是否放弃付款', + content: '商品可能很快就会被抢空哦,是否放弃付款?', + confirmBtn: '放弃', + cancelBtn: '继续付款', + }).then(() => { + wx.redirectTo({ url: '/pages/order/order-list/index' }); + }); + } else { + //订单列表页,订单详情页,取消付款,toast提示 + Toast({ + context: this, + selector: '#t-toast', + message: '支付取消', + duration: 2000, + icon: 'close-circle', + }); + } + } else { + Toast({ + context: this, + selector: '#t-toast', + message: `支付失败:${resultMsg}`, + duration: 2000, + icon: 'close-circle', + }); + setTimeout(() => { + wx.redirectTo({ url: '/pages/order/order-list/index' }); + }, 2000); + } +}; + +// 微信支付方式 +export const wechatPayOrder = (payOrderInfo) => { + // const payInfo = JSON.parse(payOrderInfo.payInfo); + // const { timeStamp, nonceStr, signType, paySign } = payInfo; + return new Promise((resolve) => { + // demo 中直接走支付成功 + paySuccess(payOrderInfo); + resolve(); + /* wx.requestPayment({ + timeStamp, + nonceStr, + package: payInfo.package, + signType, + paySign, + success: function () { + paySuccess(payOrderInfo); + resolve(); + }, + fail: function (err) { + payFail(payOrderInfo, err.errMsg); + }, + }); */ + }); +}; diff --git a/pages/order/order-detail/index.js b/pages/order/order-detail/index.js new file mode 100644 index 0000000..8c09aee --- /dev/null +++ b/pages/order/order-detail/index.js @@ -0,0 +1,288 @@ +import { formatTime } from '../../../utils/util'; +import { OrderStatus, LogisticsIconMap } from '../config'; +import { + fetchBusinessTime, + fetchOrderDetail, +} from '../../../services/order/orderDetail'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { getAddressPromise } from '../../usercenter/address/list/util'; + +Page({ + data: { + pageLoading: true, + order: {}, // 后台返回的原始数据 + _order: {}, // 内部使用和提供给 order-card 的数据 + storeDetail: {}, + countDownTime: null, + addressEditable: false, + backRefresh: false, // 用于接收其他页面back时的状态 + formatCreateTime: '', //格式化订单创建时间 + logisticsNodes: [], + /** 订单评论状态 */ + orderHasCommented: true, + }, + + onLoad(query) { + this.orderNo = query.orderNo; + this.init(); + this.navbar = this.selectComponent('#navbar'); + this.pullDownRefresh = this.selectComponent('#wr-pull-down-refresh'); + }, + + onShow() { + // 当从其他页面返回,并且 backRefresh 被置为 true 时,刷新数据 + if (!this.data.backRefresh) return; + this.onRefresh(); + this.setData({ backRefresh: false }); + }, + + onPageScroll(e) { + this.pullDownRefresh && this.pullDownRefresh.onPageScroll(e); + }, + + onImgError(e) { + if (e.detail) { + console.error('img 加载失败'); + } + }, + + // 页面初始化,会展示pageLoading + init() { + this.setData({ pageLoading: true }); + this.getStoreDetail(); + this.getDetail() + .then(() => { + this.setData({ pageLoading: false }); + }) + .catch((e) => { + console.error(e); + }); + }, + + // 页面刷新,展示下拉刷新 + onRefresh() { + this.init(); + // 如果上一页为订单列表,通知其刷新数据 + const pages = getCurrentPages(); + const lastPage = pages[pages.length - 2]; + if (lastPage) { + lastPage.data.backRefresh = true; + } + }, + + // 页面刷新,展示下拉刷新 + onPullDownRefresh_(e) { + const { callback } = e.detail; + return this.getDetail().then(() => callback && callback()); + }, + + getDetail() { + const params = { + parameter: this.orderNo, + }; + return fetchOrderDetail(params).then((res) => { + const order = res.data; + const _order = { + id: order.orderId, + orderNo: order.orderNo, + parentOrderNo: order.parentOrderNo, + storeId: order.storeId, + storeName: order.storeName, + status: order.orderStatus, + statusDesc: order.orderStatusName, + amount: order.paymentAmount, + totalAmount: order.goodsAmountApp, + logisticsNo: order.logisticsVO.logisticsNo, + goodsList: (order.orderItemVOs || []).map((goods) => + Object.assign({}, goods, { + id: goods.id, + thumb: goods.goodsPictureUrl, + title: goods.goodsName, + skuId: goods.skuId, + spuId: goods.spuId, + specs: (goods.specifications || []).map((s) => s.specValue), + price: goods.tagPrice ? goods.tagPrice : goods.actualPrice, // 商品销售单价, 优先取限时活动价 + num: goods.buyQuantity, + titlePrefixTags: goods.tagText ? [{ text: goods.tagText }] : [], + buttons: goods.buttonVOs || [], + }), + ), + buttons: order.buttonVOs || [], + createTime: order.createTime, + receiverAddress: this.composeAddress(order), + groupInfoVo: order.groupInfoVo, + }; + this.setData({ + order, + _order, + formatCreateTime: formatTime( + parseFloat(`${order.createTime}`), + 'YYYY-MM-DD HH:mm', + ), // 格式化订单创建时间 + countDownTime: this.computeCountDownTime(order), + addressEditable: + [OrderStatus.PENDING_PAYMENT, OrderStatus.PENDING_DELIVERY].includes( + order.orderStatus, + ) && order.orderSubStatus !== -1, // 订单正在取消审核时不允许修改地址(但是返回的状态码与待发货一致) + isPaid: !!order.paymentVO.paySuccessTime, + invoiceStatus: this.datermineInvoiceStatus(order), + invoiceDesc: order.invoiceDesc, + invoiceType: + order.invoiceVO?.invoiceType === 5 ? '电子普通发票' : '不开发票', //是否开票 0-不开 5-电子发票 + logisticsNodes: this.flattenNodes(order.trajectoryVos || []), + }); + }); + }, + + // 展开物流节点 + flattenNodes(nodes) { + return (nodes || []).reduce((res, node) => { + return (node.nodes || []).reduce((res1, subNode, index) => { + res1.push({ + title: index === 0 ? node.title : '', // 子节点中仅第一个显示title + desc: subNode.status, + date: formatTime(+subNode.timestamp, 'YYYY-MM-DD HH:mm:ss'), + icon: index === 0 ? LogisticsIconMap[node.code] || '' : '', // 子节点中仅第一个显示icon + }); + return res1; + }, res); + }, []); + }, + + datermineInvoiceStatus(order) { + // 1-已开票 + // 2-未开票(可补开) + // 3-未开票 + // 4-门店不支持开票 + return order.invoiceStatus; + }, + + // 拼接省市区 + composeAddress(order) { + return [ + //order.logisticsVO.receiverProvince, + order.logisticsVO.receiverCity, + order.logisticsVO.receiverCountry, + order.logisticsVO.receiverArea, + order.logisticsVO.receiverAddress, + ] + .filter((s) => !!s) + .join(' '); + }, + + getStoreDetail() { + fetchBusinessTime().then((res) => { + const storeDetail = { + storeTel: res.data.telphone, + storeBusiness: res.data.businessTime.join('\n'), + }; + this.setData({ storeDetail }); + }); + }, + + // 仅对待支付状态计算付款倒计时 + // 返回时间若是大于2020.01.01,说明返回的是关闭时间,否则说明返回的直接就是剩余时间 + computeCountDownTime(order) { + if (order.orderStatus !== OrderStatus.PENDING_PAYMENT) return null; + return order.autoCancelTime > 1577808000000 + ? order.autoCancelTime - Date.now() + : order.autoCancelTime; + }, + + onCountDownFinish() { + //this.setData({ countDownTime: -1 }); + const { countDownTime, order } = this.data; + if ( + countDownTime > 0 || + (order && order.groupInfoVo && order.groupInfoVo.residueTime > 0) + ) { + this.onRefresh(); + } + }, + + onGoodsCardTap(e) { + const { index } = e.currentTarget.dataset; + const goods = this.data.order.orderItemVOs[index]; + wx.navigateTo({ url: `/pages/goods/details/index?spuId=${goods.spuId}` }); + }, + + onEditAddressTap() { + getAddressPromise() + .then((address) => { + this.setData({ + 'order.logisticsVO.receiverName': address.name, + 'order.logisticsVO.receiverPhone': address.phone, + '_order.receiverAddress': address.address, + }); + }) + .catch(() => {}); + + wx.navigateTo({ + url: `/pages/usercenter/address/list/index?selectMode=1`, + }); + }, + + onOrderNumCopy() { + wx.setClipboardData({ + data: this.data.order.orderNo, + }); + }, + + onDeliveryNumCopy() { + wx.setClipboardData({ + data: this.data.order.logisticsVO.logisticsNo, + }); + }, + + onToInvoice() { + wx.navigateTo({ + url: `/pages/order/invoice/index?orderNo=${this.data._order.orderNo}`, + }); + }, + + onSuppleMentInvoice() { + wx.navigateTo({ + url: `/pages/order/receipt/index?orderNo=${this.data._order.orderNo}`, + }); + }, + + onDeliveryClick() { + const logisticsData = { + nodes: this.data.logisticsNodes, + company: this.data.order.logisticsVO.logisticsCompanyName, + logisticsNo: this.data.order.logisticsVO.logisticsNo, + phoneNumber: this.data.order.logisticsVO.logisticsCompanyTel, + }; + wx.navigateTo({ + url: `/pages/order/delivery-detail/index?data=${encodeURIComponent( + JSON.stringify(logisticsData), + )}`, + }); + }, + + /** 跳转订单评价 */ + navToCommentCreate() { + wx.navigateTo({ + url: `/pages/order/createComment/index?orderNo=${this.orderNo}`, + }); + }, + + /** 跳转拼团详情/分享页*/ + toGrouponDetail() { + wx.showToast({ title: '点击了拼团' }); + }, + + clickService() { + Toast({ + context: this, + selector: '#t-toast', + message: '您点击了联系客服', + }); + }, + + onOrderInvoiceView() { + wx.navigateTo({ + url: `/pages/order/invoice/index?orderNo=${this.orderNo}`, + }); + }, +}); diff --git a/pages/order/order-detail/index.json b/pages/order/order-detail/index.json new file mode 100644 index 0000000..b8bbaec --- /dev/null +++ b/pages/order/order-detail/index.json @@ -0,0 +1,17 @@ +{ + "navigationBarTitleText": "订单详情", + "usingComponents": { + "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh", + "t-button": "tdesign-miniprogram/button/button", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-image": "/components/webp-image/index", + "t-count-down": "tdesign-miniprogram/count-down/count-down", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "price": "/components/price/index", + "order-card": "../components/order-card/index", + "order-goods-card": "../components/order-goods-card/index", + "order-button-bar": "../components/order-button-bar/index" + } +} \ No newline at end of file diff --git a/pages/order/order-detail/index.wxml b/pages/order/order-detail/index.wxml new file mode 100644 index 0000000..c273890 --- /dev/null +++ b/pages/order/order-detail/index.wxml @@ -0,0 +1,182 @@ + + + + + + {{_order.statusDesc}} + + + + 拼团剩余 + + 过时自动取消 + + + {{order.orderSatusRemark || ''}} + + 剩 + + 支付,过时订单将会取消 + + 超时未支付 + + + + + + + + {{logisticsNodes[0].desc}} + {{logisticsNodes[0].date}} + + + + + + + + + {{order.logisticsVO.receiverName + ' '}}{{order.logisticsVO.receiverPhone}} + {{_order.receiverAddress}} + + + 修改 + + + + + + + + + + + 商品总额 + + + + 运费 + + + + + + + 免运费 + + + + 活动优惠 + + - + + + + + 优惠券 + + + - + + + 无可用 + + + + + {{isPaid ? '实付' : '应付'}} + + + + + + + 订单编号 + + {{order.orderNo}} + 复制 + + + + 下单时间 + + {{formatCreateTime}} + + + + + 发票 + + {{invoiceType}} + 查看 + + + + 备注 + + {{order.remark || '-'}} + + + + + +  联系客服 + + + + + + + + + + diff --git a/pages/order/order-detail/index.wxss b/pages/order/order-detail/index.wxss new file mode 100644 index 0000000..e83a21c --- /dev/null +++ b/pages/order/order-detail/index.wxss @@ -0,0 +1,240 @@ +:host { + background-color: #f8f8f8; +} + +.order-detail { + width: 100%; + box-sizing: border-box; + padding: 0rpx 0rpx calc(env(safe-area-inset-bottom) + 144rpx); +} + +.order-detail .count-down { + color: #ffffff; +} +.order-detail .header { + width: 100%; + background-color: #ffffff; +} +.order-detail .order-detail__header { + width: 700rpx; + height: 200rpx; + border-radius: 24rpx; + margin: 0 auto; + overflow: hidden; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/template/order-bg.png'); + background-repeat: no-repeat; + background-size: contain; +} +.order-detail .order-detail__header .title, +.order-detail .order-detail__header .desc { + color: #ffffff; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; +} +.order-detail .order-detail__header .title { + -webkit-line-clamp: 1; + font-size: 44rpx; + line-height: 64rpx; + margin-bottom: 8rpx; + font-weight: bold; +} +.order-detail .order-detail__header .desc { + -webkit-line-clamp: 2; + font-size: 24rpx; + line-height: 32rpx; +} +.order-detail .order-detail__header .desc .count-down { + display: inline; +} +.order-detail .order-logistics { + box-sizing: border-box; + padding: 32rpx; + width: 100%; + background-color: #ffffff; + overflow: hidden; + color: #333333; + font-size: 32rpx; + line-height: 48rpx; + display: flex; + position: relative; +} + +.order-logistics .logistics-icon { + width: 40rpx; + height: 40rpx; + margin-right: 16rpx; + margin-top: 4rpx; +} + +.order-logistics .logistics-content { + flex: 1; +} + +.order-logistics .logistics-content .logistics-time { + font-size: 28rpx; + line-height: 40rpx; + color: #999999; + margin-top: 12rpx; +} + +.order-logistics .logistics-back { + color: #999999; + align-self: center; +} + +.order-logistics .edit-text { + color: #fa4126; + font-size: 26rpx; + line-height: 36rpx; +} + +.order-detail .border-bottom { + margin: 0 auto; + width: 686rpx; + scale: 1 0.5; + height: 2rpx; + background-color: #e5e5e5; +} + +.order-detail .border-bottom-margin { + margin: 16rpx auto; +} + +.order-detail .pay-detail { + background-color: #ffffff; + width: 100%; + box-sizing: border-box; +} + +.order-detail .padding-inline { + padding: 16rpx 32rpx; +} + +.order-detail .pay-detail .pay-item { + width: 100%; + height: 72rpx; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 26rpx; + line-height: 36rpx; + color: #666666; + background-color: #ffffff; +} +.order-detail .pay-detail .pay-item .pay-item__right { + color: #333333; + font-size: 24rpx; + display: flex; + align-items: center; + justify-content: flex-end; + max-width: 400rpx; +} +.order-detail .pay-detail .pay-item .pay-item__right .pay-remark { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + max-width: 400rpx; + text-overflow: ellipsis; + overflow: hidden; +} +.order-detail .pay-detail .pay-item .font-bold { + font-weight: bold; +} +.order-detail .pay-detail .pay-item .primary { + color: #fa4126; +} +.order-detail .pay-detail .pay-item .max-size { + font-size: 36rpx; + line-height: 48rpx; +} + +.pay-item .pay-item__right .pay-item__right__copy { + width: 80rpx; + height: 40rpx; + text-align: center; + font-size: 24rpx; + line-height: 40rpx; + color: #333333; + position: relative; +} + +.pay-item .pay-item__right .pay-item__right__copy::before { + position: absolute; + content: ''; + width: 200%; + height: 200%; + border-radius: 40rpx; + border: 2rpx solid #dddddd; + transform: scale(0.5); + left: 0; + top: 0; + transform-origin: left top; +} + +.pay-item .pay-item__right .order-no { + color: #333333; + font-size: 26rpx; + line-height: 40rpx; + padding-right: 16rpx; +} + +.pay-item .pay-item__right .normal-color { + color: #333333; +} + +.order-detail .pay-detail .pay-service { + width: 100%; + height: 72rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + line-height: 36rpx; + color: #333333; + background-color: #ffffff; +} + +.bottom-bar { + position: fixed; + left: 0; + bottom: 0; + right: 0; + z-index: 10; + background: #fff; + height: 112rpx; + width: 686rpx; + padding: 0rpx 32rpx env(safe-area-inset-bottom); + display: flex; + align-items: center; +} + +.bottom-bar::before { + position: absolute; + content: ''; + width: 200%; + height: 200%; + border-top: 2rpx solid #dddddd; + transform: scale(0.5); + left: 0; + top: 0; + transform-origin: left top; +} + +.goods-button-bar { + height: 112rpx; + width: 686rpx; + margin-bottom: 16rpx; +} + +.t-class-indicator { + color: #b9b9b9 !important; +} + +.add-notes__confirm { + color: #fa4126 !important; +} diff --git a/pages/order/order-list/index.js b/pages/order/order-list/index.js new file mode 100644 index 0000000..c62315b --- /dev/null +++ b/pages/order/order-list/index.js @@ -0,0 +1,189 @@ +import { OrderStatus } from '../config'; +import { + fetchOrders, + fetchOrdersCount, +} from '../../../services/order/orderList'; +import { cosThumb } from '../../../utils/util'; + +Page({ + page: { + size: 5, + num: 1, + }, + + data: { + tabs: [ + { key: -1, text: '全部' }, + { key: OrderStatus.PENDING_PAYMENT, text: '待付款', info: '' }, + { key: OrderStatus.PENDING_DELIVERY, text: '待发货', info: '' }, + { key: OrderStatus.PENDING_RECEIPT, text: '待收货', info: '' }, + { key: OrderStatus.COMPLETE, text: '已完成', info: '' }, + ], + curTab: -1, + orderList: [], + listLoading: 0, + pullDownRefreshing: false, + emptyImg: + 'https://cdn-we-retail.ym.tencent.com/miniapp/order/empty-order-list.png', + backRefresh: false, + status: -1, + }, + + onLoad(query) { + let status = parseInt(query.status); + status = this.data.tabs.map((t) => t.key).includes(status) ? status : -1; + this.init(status); + this.pullDownRefresh = this.selectComponent('#wr-pull-down-refresh'); + }, + + onShow() { + if (!this.data.backRefresh) return; + this.onRefresh(); + this.setData({ backRefresh: false }); + }, + + onReachBottom() { + if (this.data.listLoading === 0) { + this.getOrderList(this.data.curTab); + } + }, + + onPageScroll(e) { + this.pullDownRefresh && this.pullDownRefresh.onPageScroll(e); + }, + + onPullDownRefresh_(e) { + const { callback } = e.detail; + this.setData({ pullDownRefreshing: true }); + this.refreshList(this.data.curTab) + .then(() => { + this.setData({ pullDownRefreshing: false }); + callback && callback(); + }) + .catch((err) => { + this.setData({ pullDownRefreshing: false }); + Promise.reject(err); + }); + }, + + init(status) { + status = status !== undefined ? status : this.data.curTab; + this.setData({ + status, + }); + this.refreshList(status); + }, + + getOrderList(statusCode = -1, reset = false) { + const params = { + parameter: { + pageSize: this.page.size, + pageNum: this.page.num, + }, + }; + if (statusCode !== -1) params.parameter.orderStatus = statusCode; + this.setData({ listLoading: 1 }); + return fetchOrders(params) + .then((res) => { + this.page.num++; + let orderList = []; + if (res && res.data && res.data.orders) { + orderList = (res.data.orders || []).map((order) => { + return { + id: order.orderId, + orderNo: order.orderNo, + parentOrderNo: order.parentOrderNo, + storeId: order.storeId, + storeName: order.storeName, + status: order.orderStatus, + statusDesc: order.orderStatusName, + amount: order.paymentAmount, + totalAmount: order.totalAmount, + logisticsNo: order.logisticsVO.logisticsNo, + createTime: order.createTime, + goodsList: (order.orderItemVOs || []).map((goods) => ({ + id: goods.id, + thumb: cosThumb(goods.goodsPictureUrl, 70), + title: goods.goodsName, + skuId: goods.skuId, + spuId: goods.spuId, + specs: (goods.specifications || []).map( + (spec) => spec.specValue, + ), + price: goods.tagPrice ? goods.tagPrice : goods.actualPrice, + num: goods.buyQuantity, + titlePrefixTags: goods.tagText ? [{ text: goods.tagText }] : [], + })), + buttons: order.buttonVOs || [], + groupInfoVo: order.groupInfoVo, + freightFee: order.freightFee, + }; + }); + } + return new Promise((resolve) => { + if (reset) { + this.setData({ orderList: [] }, () => resolve()); + } else resolve(); + }).then(() => { + this.setData({ + orderList: this.data.orderList.concat(orderList), + listLoading: orderList.length > 0 ? 0 : 2, + }); + }); + }) + .catch((err) => { + this.setData({ listLoading: 3 }); + return Promise.reject(err); + }); + }, + + onReTryLoad() { + this.getOrderList(this.data.curTab); + }, + + onTabChange(e) { + const { value } = e.detail; + this.setData({ + status: value, + }); + this.refreshList(value); + }, + + getOrdersCount() { + return fetchOrdersCount().then((res) => { + const tabsCount = res.data || []; + const { tabs } = this.data; + tabs.forEach((tab) => { + const tabCount = tabsCount.find((c) => c.tabType === tab.key); + if (tabCount) { + tab.info = tabCount.orderNum; + } + }); + this.setData({ tabs }); + }); + }, + + refreshList(status = -1) { + this.page = { + size: this.page.size, + num: 1, + }; + this.setData({ curTab: status, orderList: [] }); + + return Promise.all([ + this.getOrderList(status, true), + this.getOrdersCount(), + ]); + }, + + onRefresh() { + this.refreshList(this.data.curTab); + }, + + onOrderCardTap(e) { + const { order } = e.currentTarget.dataset; + wx.navigateTo({ + url: `/pages/order/order-detail/index?orderNo=${order.orderNo}`, + }); + }, +}); diff --git a/pages/order/order-list/index.json b/pages/order/order-list/index.json new file mode 100644 index 0000000..ff0340e --- /dev/null +++ b/pages/order/order-list/index.json @@ -0,0 +1,16 @@ +{ + "navigationBarTitleText": "我的订单", + "usingComponents": { + "t-tabs": "tdesign-miniprogram/tabs/tabs", + "t-tab-panel": "tdesign-miniprogram/tabs/tab-panel", + "t-empty": "tdesign-miniprogram/empty/empty", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-pull-down-refresh": "tdesign-miniprogram/pull-down-refresh/pull-down-refresh", + "load-more": "/components/load-more/index", + "order-button-bar": "../components/order-button-bar/index", + "price": "/components/price/index", + "order-card": "../components/order-card/index", + "specs-goods-card": "../components/specs-goods-card/index" + } +} \ No newline at end of file diff --git a/pages/order/order-list/index.wxml b/pages/order/order-list/index.wxml new file mode 100644 index 0000000..4475bba --- /dev/null +++ b/pages/order/order-list/index.wxml @@ -0,0 +1,91 @@ + + + + + + + + + + + 订单号  + {{order.orderNo}} + + + + + 总价 + + ,运费 + +   + 实付  + + + + + + + + + + + 暂无相关订单 + + + + + + + diff --git a/pages/order/order-list/index.wxss b/pages/order/order-list/index.wxss new file mode 100644 index 0000000..55cec71 --- /dev/null +++ b/pages/order/order-list/index.wxss @@ -0,0 +1,107 @@ +:host { + background-color: #f5f5f5; +} +.page-container .tab-bar__placeholder, +.page-container .tab-bar__inner { + height: 88rpx; + line-height: 88rpx; + background: #fff; +} +.page-container .tab-bar__inner { + font-size: 26rpx; + color: #333333; + position: fixed; + width: 100vw; + top: 0; + left: 0; +} +.page-container .tab-bar__inner.order-nav .order-nav-item .bottom-line { + bottom: 12rpx; +} +.tab-bar__inner .t-tabs-is-active { + color: #fa4126 !important; +} + +.tab-bar__inner .t-tabs-track { + background: #fa4126 !important; +} + +.page-container .tab-bar__active { + font-size: 28rpx; +} +.page-container .specs-popup .bottom-btn { + color: #fa4126; + color: var(--color-primary, #fa4126); +} +.page-container .specs-popup .bottom-btn::after { + border-color: #fa4126; + border-color: var(--color-primary, #fa4126); +} +.dialog .dialog__button-confirm { + color: #fa4126; + color: var(--color-primary, #fa4126); +} +.list-loading { + height: 100rpx; +} +.empty-wrapper { + height: calc(100vh - 88rpx); +} +.btn-bar { + margin-top: 20rpx; +} +.load-more { + margin: 0 24rpx; +} +wr-order-goods-card:not(:first-child) .wr-goods-card { + margin-top: 40rpx; +} + +.price-total { + font-size: 24rpx; + line-height: 32rpx; + color: #999999; + padding-top: 10rpx; + width: 100%; + display: flex; + align-items: baseline; + justify-content: flex-end; +} +.price-total .bold-price { + color: #333333; + font-size: 28rpx; + line-height: 40rpx; + color: #333333; +} +.price-total .real-pay { + font-size: 36rpx; + line-height: 48rpx; + color: #fa4126; + font-weight: bold; +} + +.t-tabs.t-tabs--top .t-tabs-scroll { + border: none !important; +} +.t-empty-text { + font-size: 28rpx; + color: #999; +} + +.page-container .order-number { + color: #666666; + font-size: 28rpx; +} +.t-class-indicator { + color: #b9b9b9 !important; +} +.tab-bar .tab-bar__active { + color: #333333 !important; +} + +.tab-bar .t-tabs-track { + background: #333333 !important; +} +.add-notes__confirm { + color: #fa4126 !important; +} diff --git a/pages/order/pay-result/index.js b/pages/order/pay-result/index.js new file mode 100644 index 0000000..bd6dad6 --- /dev/null +++ b/pages/order/pay-result/index.js @@ -0,0 +1,47 @@ +/* + * @Author: rileycai + * @Date: 2022-03-14 21:18:07 + * @LastEditTime: 2022-03-22 21:17:16 + * @LastEditors: rileycai + * @Description: + * @FilePath: /tdesign-miniprogram-starter/pages/order/pay-result/index.js + */ +Page({ + data: { + totalPaid: 0, + orderNo: '', + groupId: '', + groupon: null, + spu: null, + adUrl: '', + }, + + onLoad(options) { + const { totalPaid = 0, orderNo = '', groupId = '' } = options; + this.setData({ + totalPaid, + orderNo, + groupId, + }); + }, + + onTapReturn(e) { + const target = e.currentTarget.dataset.type; + const { orderNo } = this.data; + if (target === 'home') { + wx.switchTab({ url: '/pages/home/home' }); + } else if (target === 'orderList') { + wx.navigateTo({ + url: `/pages/order/order-list/index?orderNo=${orderNo}`, + }); + } else if (target === 'order') { + wx.navigateTo({ + url: `/pages/order/order-detail/index?orderNo=${orderNo}`, + }); + } + }, + + navBackHandle() { + wx.navigateBack(); + }, +}); diff --git a/pages/order/pay-result/index.json b/pages/order/pay-result/index.json new file mode 100644 index 0000000..f572818 --- /dev/null +++ b/pages/order/pay-result/index.json @@ -0,0 +1,9 @@ +{ + "navigationBarTitleText": "支付结果", + "navigationStyle": "custom", + "usingComponents": { + "t-navbar": "tdesign-miniprogram/navbar/navbar", + "t-icon": "tdesign-miniprogram/icon/icon", + "price": "/components/price/index" + } +} \ No newline at end of file diff --git a/pages/order/pay-result/index.wxml b/pages/order/pay-result/index.wxml new file mode 100644 index 0000000..3153fe6 --- /dev/null +++ b/pages/order/pay-result/index.wxml @@ -0,0 +1,22 @@ + + + + + 支付成功 + + + 微信支付: + + + + 查看订单 + 返回首页 + + + diff --git a/pages/order/pay-result/index.wxss b/pages/order/pay-result/index.wxss new file mode 100644 index 0000000..abe1b25 --- /dev/null +++ b/pages/order/pay-result/index.wxss @@ -0,0 +1,54 @@ +.pay-result { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; +} + +.pay-result .pay-status { + margin-top: 100rpx; + font-size: 48rpx; + line-height: 72rpx; + font-weight: bold; + color: #333333; + display: flex; + align-items: center; +} +.pay-result .pay-status text { + padding-left: 12rpx; +} +.pay-result .pay-money { + color: #666666; + font-size: 28rpx; + line-height: 48rpx; + margin-top: 28rpx; + display: flex; + align-items: baseline; +} + +.pay-result .pay-money .pay-money__price { + font-size: 36rpx; + line-height: 48rpx; + color: #fa4126; +} +.pay-result .btn-wrapper { + margin-top: 48rpx; + padding: 12rpx 32rpx; + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + box-sizing: border-box; +} + +.pay-result .btn-wrapper .status-btn { + height: 88rpx; + width: 334rpx; + border-radius: 44rpx; + border: 2rpx solid #fa4126; + color: #fa4126; + font-size: 28rpx; + font-weight: bold; + line-height: 88rpx; + text-align: center; +} diff --git a/pages/order/receipt/index.js b/pages/order/receipt/index.js new file mode 100644 index 0000000..ad85d40 --- /dev/null +++ b/pages/order/receipt/index.js @@ -0,0 +1,190 @@ +/* eslint-disable no-nested-ternary */ +import Dialog from 'tdesign-miniprogram/dialog/index'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { dispatchSupplementInvoice } from '../../../services/order/orderConfirm'; + +const invoiceJson = { + info: [ + '1.根据当地税务局的要求,开具有效的企业发票需填写税务局登记证号。开具个人发票不需要填写纳税人识别码。 ', + '2.电子普通发票: 电子普通发票是税局认可的有效首付款凭证,其法律效力、基本用途及使用规定同纸质发票,如需纸质发票可自行下载打印。 ', + '3.增值税专用发票: 增值税发票暂时不可开,可查看《开局增值税发票》或致电400-633-6868。', + ], + codeTitle: [ + '1.什么是纳税人识别号/统一社会信用代码? 纳税人识别号,一律由15位、17位、18或者20位码(字符型)组成,其中:企业、事业单位等组织机构纳税人,以国家质量监督检验检疫总局编制的9位码(其中区分主码位与校检位之间的“—”符省略不打印)并在其“纳税人识别号”。国家税务总局下达的纳税人代码为15位,其中:1—2位为省、市代码,3—6位为地区代码,7—8位为经济性质代码,9—10位行业代码,11—15位为各地区自设的顺序码。', + '2.入户获取/知晓纳税人识别号/统一社会信用代码? 纳税人识别号是税务登记证上的号码,通常简称为“税号”,每个企业的纳税人识别号都是唯一的。这个属于每个人自己且终身不变的数字代码很可能成为我们的第二张“身份证”。 ', + ], +}; + +Page({ + orderNo: '', + data: { + receiptIndex: 0, + addressTagsIndex: 0, + goodsClassesIndex: 0, + dialogShow: false, + codeShow: false, + receipts: [ + { title: '不开发票', id: 0, name: 'receipt' }, + { title: '电子发票', id: 1, name: 'receipt' }, + ], + addressTags: [ + { title: '个人', id: 0, name: 'addressTags', type: 1 }, + { title: '公司', id: 1, name: 'addressTags', type: 2 }, + ], + goodsClasses: [ + { title: '商品明细', id: 0, name: 'goodsClasses' }, + { title: '商品类别', id: 1, name: 'goodsClasses' }, + ], + name: '', + componentName: '', + code: '', + phone: '', + email: '', + invoiceInfo: invoiceJson, + }, + onLoad(query) { + const { orderNo, invoiceData } = query; + const tempData = JSON.parse(invoiceData || '{}'); + const invoice = { + receiptIndex: tempData.invoiceType === 5 ? 1 : 0, + name: tempData.buyerName || '', + email: tempData.email || '', + phone: tempData.buyerPhone || '', + addressTagsIndex: tempData.titleType === 2 ? 1 : 0, + goodsClassesIndex: tempData.contentType === 2 ? 1 : 0, + code: tempData.buyerTaxNo || '', + componentName: tempData.titleType === 2 ? tempData.buyerName : '', + }; + this.orderNo = orderNo; + this.setData({ ...invoice }); + }, + onLabels(e) { + const { item } = e.currentTarget.dataset; + const nameIndex = `${item.name}Index`; + this.setData({ [nameIndex]: item.id }); + }, + onInput(e) { + const { addressTagsIndex } = this.data; + const { item } = e.currentTarget.dataset; + const { value } = e.detail; + const key = + item === 'name' + ? addressTagsIndex === 0 + ? 'name' + : 'componentName' + : item === 'code' + ? addressTagsIndex === 0 + ? 'phone' + : 'code' + : 'email'; + this.setData({ [key]: value }); + }, + onSure() { + const result = this.checkSure(); + if (!result) { + Dialog.alert({ + title: '请填写发票信息', + content: '', + confirmBtn: '确认', + }); + return; + } + const { + receiptIndex, + addressTagsIndex, + receipts, + addressTags, + name, + componentName, + code, + phone, + email, + goodsClassesIndex, + } = this.data; + + const data = { + buyerName: addressTagsIndex === 0 ? name : componentName, + buyerTaxNo: code, + buyerPhone: phone, + email, + titleType: addressTags[addressTagsIndex].type, + contentType: goodsClassesIndex === 0 ? 1 : 2, + invoiceType: receiptIndex === 1 ? 5 : 0, + }; + if (this.orderNo) { + if (this.submitting) return; + const params = { + parameter: { + orderNo: this.orderNo, + invoiceVO: data, + }, + }; + this.submitting = true; + dispatchSupplementInvoice(params) + .then(() => { + Toast({ + context: this, + selector: '#t-toast', + message: '保存成功', + duration: 2000, + icon: '', + }); + setTimeout(() => { + this.submitting = false; + wx.navigateBack({ delta: 1 }); + }, 1000); + }) + .catch((err) => { + this.submitting = false; + console.error(err); + }); + } else { + Object.assign(data, { + receipts: receipts[receiptIndex], + addressTags: addressTags[addressTagsIndex], + }); + wx.setStorageSync('invoiceData', data); + wx.navigateBack({ delta: 1 }); + } + }, + checkSure() { + const { + name, + componentName, + code, + phone, + email, + addressTagsIndex, + receiptIndex, + } = this.data; + if (receiptIndex === 0) { + return true; + } + if (addressTagsIndex === 0) { + if (!name.length || !phone.length) { + return false; + } + } else if (addressTagsIndex === 1) { + if (!componentName.length || !code.length) { + return false; + } + } + if (!email.length) { + return false; + } + return true; + }, + onDialogTap() { + const { dialogShow } = this.data; + this.setData({ + dialogShow: !dialogShow, + codeShow: false, + }); + }, + onKnoeCode() { + this.setData({ + dialogShow: !this.data.dialogShow, + codeShow: true, + }); + }, +}); diff --git a/pages/order/receipt/index.json b/pages/order/receipt/index.json new file mode 100644 index 0000000..5996047 --- /dev/null +++ b/pages/order/receipt/index.json @@ -0,0 +1,11 @@ +{ + "navigationBarTitleText": "发票", + "usingComponents": { + "t-cell": "tdesign-miniprogram/cell/cell", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-input": "tdesign-miniprogram/input/input", + "t-button": "tdesign-miniprogram/button/button" + } +} diff --git a/pages/order/receipt/index.wxml b/pages/order/receipt/index.wxml new file mode 100644 index 0000000..df2d006 --- /dev/null +++ b/pages/order/receipt/index.wxml @@ -0,0 +1,137 @@ + + + + + + {{item.title}} + + + + + + + + + {{tag.title}} + + + + + + + + + + + + + + + + + + + + {{good.title}} + + + + 发票内容将显示详细商品名称与价格信息,发票金额为实际支付金额,不包含优惠等扣减金额 + + + 发票须知 + + + + + + + + + {{item}} + + + + + {{item}} + + + + + + + + + + 确定 + + + + + diff --git a/pages/order/receipt/index.wxss b/pages/order/receipt/index.wxss new file mode 100644 index 0000000..a6c1934 --- /dev/null +++ b/pages/order/receipt/index.wxss @@ -0,0 +1,209 @@ +@import '../../../style/theme.wxss'; + +.receipt { + height: 100vh; + background: #f5f5f5; + position: relative; + padding-top: 20rpx; +} +.srcoll-view-wrap { + margin-top: 20rpx; +} +.receipt .flex { + display: flex; + align-items: center; + justify-content: space-between; +} +.receipt .head-title { + color: #333; + font-size: 30rpx; + font-weight: bold; +} +.receipt .btn-wrap { + display: flex; +} +.receipt .btn-wrap .btn { + width: 128rpx; + background: #f5f5f5; + font-size: 24rpx; + color: #333; + margin-left: 22rpx; + text-align: center; + border-radius: 8rpx; + position: relative; + border: 2rpx solid #f5f5f5; +} +.receipt .btn-wrap .active-btn { + background-color: transparent; + border-color: #fa4126; + color: #fa4126; +} +.receipt .title { + width: 100%; + background-color: #fff; + margin-bottom: 20rpx; +} + +.receipt .receipt-label { + display: flex; +} +.receipt .receipt-label .btn { + width: 128rpx; + background: #f5f5f5; + font-size: 24rpx; + color: #333; + margin-left: 22rpx; + text-align: center; + border-radius: 8rpx; + border: 2rpx solid #f5f5f5; +} +.receipt .receipt-label .active-btn { + background-color: transparent; + border-color: #fa4126; + color: #fa4126; +} +.receipt .receipt-label .wr-cell__title { + font-size: 30rpx; + color: #333; + font-weight: bold; +} +.receipt .receipt-content { + background: #fff; + margin-top: 20rpx; +} +.receipt .receipt-content .addressTags { + padding: 0 30rpx; + height: 100rpx; +} +.receipt .receipt-content .addressTags .btn-wrap { + display: flex; +} +.receipt .receipt-content .line { + width: 720rpx; + margin-left: 30rpx; + background-color: #e6e6e6; + height: 1rpx; +} +.receipt .receipt-content .receipt-input { + display: flex; + padding: 0 30rpx; + align-items: center; + height: 100rpx; + color: #666; +} +.receipt .receipt-content .receipt-input .title { + color: #333; + display: inline-block; + width: 140rpx; + margin-right: 30rpx; + font-size: 30rpx; + font-weight: bold; +} +.input-com { + display: inline-block; + flex: 1; + font-size: 30rpx; + font-weight: 400; + line-height: 30rpx; + padding: 0 !important; + color: #666; +} +.input-com::after { + border: none !important; +} + +.receipt .receipt-content .receipt-input .wr-icon { + font-size: 28rpx !important; + margin-left: 20rpx; +} +.receipt .receipt-info { + background: #fff; + margin-top: 20rpx; +} +.receipt .receipt-info .info-con { + padding: 0 30rpx; + height: 100rpx; +} +.receipt .receipt-info .title { + font-size: 24rpx; + color: #999999; + line-height: 36rpx; + padding: 0 30rpx 20rpx; + box-sizing: border-box; +} +.receipt .receipt-know { + display: flex; + align-items: center; + font-size: 26rpx; + font-weight: 400; + color: #999999; + padding: 20rpx 30rpx; + line-height: 26rpx; +} +.receipt .receipt-know .icon { + margin-left: 16rpx; + font-size: 26rpx; +} +.receipt .dialog-receipt .dialog__message { + padding: 0; +} +.receipt .dialog-receipt .dialog-info { + max-height: 622rpx; +} +.receipt .dialog-receipt .info-wrap { + padding: 0 18rpx; +} +.receipt .dialog-receipt .info .title { + display: inline-block; + font-size: 28rpx; + font-weight: 400; + color: #999; + line-height: 40rpx; + margin-bottom: 40rpx; + text-align: left; +} +.receipt .receipt-btn { + position: fixed; + bottom: 0; + left: 0; + right: 0; + z-index: 100; + background: #fff; + width: 100%; + padding: 0 20rpx; + box-sizing: border-box; + padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); +} +.receipt .receipt-btn .receipt-btn-con { + margin-top: 20rpx; + display: inline-block; + width: 100%; + line-height: 80rpx; + background: #fa4126; + text-align: center; + color: #fff; + border-radius: 48rpx; +} +.dialog__button-confirm { + color: #fa4126; +} + +.cell-left { + margin-right: 0 !important; +} + +.cell-right { + display: flex; + justify-content: flex-start; + width: 480rpx; +} + +.addressTagsIndex-cell { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} +.dialog__button-confirm { + color: #fa4126 !important; +} diff --git a/pages/promotion-detail/index.js b/pages/promotion-detail/index.js new file mode 100644 index 0000000..dd6614e --- /dev/null +++ b/pages/promotion-detail/index.js @@ -0,0 +1,57 @@ +import Toast from 'tdesign-miniprogram/toast/index'; +import { fetchPromotion } from '../../services/promotion/detail'; + +Page({ + data: { + list: [], + banner: '', + time: 0, + showBannerDesc: false, + statusTag: '', + }, + + onLoad(query) { + const promotionID = parseInt(query.promotion_id); + this.getGoodsList(promotionID); + }, + + getGoodsList(promotionID) { + fetchPromotion(promotionID).then( + ({ list, banner, time, showBannerDesc, statusTag }) => { + const goods = list.map((item) => ({ + ...item, + tags: item.tags.map((v) => v.title), + })); + this.setData({ + list: goods, + banner, + time, + showBannerDesc, + statusTag, + }); + }, + ); + }, + + goodClickHandle(e) { + const { index } = e.detail; + const { spuId } = this.data.list[index]; + wx.navigateTo({ url: `/pages/goods/details/index?spuId=${spuId}` }); + }, + + cardClickHandle() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击加购', + }); + }, + + bannerClickHandle() { + Toast({ + context: this, + selector: '#t-toast', + message: '点击规则详情', + }); + }, +}); diff --git a/pages/promotion-detail/index.json b/pages/promotion-detail/index.json new file mode 100644 index 0000000..2eb4145 --- /dev/null +++ b/pages/promotion-detail/index.json @@ -0,0 +1,10 @@ +{ + "navigationBarTitleText": "营销详情", + "usingComponents": { + "t-toast": "tdesign-miniprogram/toast/toast", + "t-image": "/components/webp-image/index", + "t-icon": "tdesign-miniprogram/icon/icon", + "count-down": "tdesign-miniprogram/count-down/count-down", + "goods-list": "/components/goods-list/index" + } +} \ No newline at end of file diff --git a/pages/promotion-detail/index.wxml b/pages/promotion-detail/index.wxml new file mode 100644 index 0000000..be5b5c8 --- /dev/null +++ b/pages/promotion-detail/index.wxml @@ -0,0 +1,76 @@ + + + + + + + + + + diff --git a/pages/promotion-detail/index.wxss b/pages/promotion-detail/index.wxss new file mode 100644 index 0000000..42c670e --- /dev/null +++ b/pages/promotion-detail/index.wxss @@ -0,0 +1,111 @@ +.promotion-detail-container .wrap { + display: block; + padding: 0 24rpx; + background: linear-gradient(#fff, #f5f5f5); +} + +.promotion-detail-container .t-class-promotion-head { + width: 702rpx; + height: 160rpx; + border-radius: 8rpx; +} + +.promotion-detail-container .wrap .count-down-wrap { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + line-height: 34rpx; +} + +.promotion-detail-container .wrap .count-down-wrap.in-banner-count-down-wrap { + position: absolute; + bottom: 32rpx; + left: 32rpx; + right: 32rpx; +} + +.promotion-detail-container .wrap .count-down-wrap .status-tag { + height: 32rpx; + line-height: 32rpx; + font-size: 20rpx; + margin-right: 12rpx; + border-radius: 16rpx; + padding: 0 12rpx; +} + +.promotion-detail-container .wrap .count-down-wrap .status-tag.before { + color: #fff; + background-color: #ff9853; +} + +.promotion-detail-container .wrap .count-down-wrap .status-tag.finish { + color: #fff; + background-color: #ccc; +} + +.promotion-detail-container .wrap .count-down-wrap .count-down-label { + color: #666; + font-size: 24rpx; + margin-right: 0.5em; +} + +.promotion-detail-container .wrap .count-down-wrap .detail-entry { + margin-left: auto; + height: 40rpx; +} + +.promotion-detail-container .wrap .count-down-wrap .detail-entry-label { + color: #fff; + font-size: 24rpx; + margin-right: 12rpx; +} + +.promotion-detail-container + .wrap + .count-down-wrap.after-banner-count-down-wrap { + padding: 0 10rpx 10rpx; +} + +.promotion-detail-container + .wrap + .count-down-wrap.after-banner-count-down-wrap + .detail-entry { + display: flex; + align-items: center; +} + +.promotion-detail-container + .wrap + .count-down-wrap.after-banner-count-down-wrap + .detail-entry-label { + color: #999; + margin-right: 0; +} + +.promotion-detail-container .wrap .gl-empty-wrap { + margin-top: 180rpx; +} + +.promotion-detail-container .wrap .gl-empty-img { + width: 240rpx; + height: 240rpx; + display: block; + margin: 0 auto; +} + +.promotion-detail-container .wrap .gl-empty-label { + font-size: 28rpx; + color: #999; + margin-top: 40rpx; + text-align: center; +} + +.promotion-detail-container .goods-list-container { + background: #f5f5f5 !important; +} + +.promotion-detail-container .promotion-goods-list { + padding: 20rpx 24rpx; + background-color: #f5f5f5; +} diff --git a/pages/usercenter/address/edit/index.js b/pages/usercenter/address/edit/index.js new file mode 100644 index 0000000..24b3ed3 --- /dev/null +++ b/pages/usercenter/address/edit/index.js @@ -0,0 +1,359 @@ +import Toast from 'tdesign-miniprogram/toast/index'; +import { fetchDeliveryAddress } from '../../../../services/address/fetchAddress'; +import { areaData } from '../../../../config/index'; +import { resolveAddress, rejectAddress } from './util'; + +const innerPhoneReg = + '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'; +const innerNameReg = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'; +const labelsOptions = [ + { id: 0, name: '家' }, + { id: 1, name: '公司' }, +]; + +Page({ + options: { + multipleSlots: true, + }, + externalClasses: ['theme-wrapper-class'], + data: { + locationState: { + labelIndex: null, + addressId: '', + addressTag: '', + cityCode: '', + cityName: '', + countryCode: '', + countryName: '', + detailAddress: '', + districtCode: '', + districtName: '', + isDefault: false, + name: '', + phone: '', + provinceCode: '', + provinceName: '', + isEdit: false, + isOrderDetail: false, + isOrderSure: false, + }, + areaData: areaData, + labels: labelsOptions, + areaPickerVisible: false, + submitActive: false, + visible: false, + labelValue: '', + columns: 3, + }, + privateData: { + verifyTips: '', + }, + onLoad(options) { + const { id } = options; + this.init(id); + }, + onUnload() { + if (!this.hasSava) { + rejectAddress(); + } + }, + hasSava: false, + init(id) { + if (id) { + this.getAddressDetail(Number(id)); + } + }, + getAddressDetail(id) { + fetchDeliveryAddress(id).then((detail) => { + this.setData({ locationState: detail }, () => { + const { isLegal, tips } = this.onVerifyInputLegal(); + this.setData({ + submitActive: isLegal, + }); + this.privateData.verifyTips = tips; + }); + }); + }, + onInputValue(e) { + const { item } = e.currentTarget.dataset; + const { value = '', areas = [] } = e.detail; + if (item === 'address') { + this.setData( + { + 'locationState.provinceCode': areas[0].code, + 'locationState.provinceName': areas[0].name, + 'locationState.cityName': areas[1].name, + 'locationState.cityCode': areas[1].code, + 'locationState.districtCode': areas[2].code, + 'locationState.districtName': areas[2].name, + areaPickerVisible: false, + }, + () => { + const { isLegal, tips } = this.onVerifyInputLegal(); + this.setData({ + submitActive: isLegal, + }); + this.privateData.verifyTips = tips; + }, + ); + } else { + this.setData( + { + [`locationState.${item}`]: value, + }, + () => { + const { isLegal, tips } = this.onVerifyInputLegal(); + this.setData({ + submitActive: isLegal, + }); + this.privateData.verifyTips = tips; + }, + ); + } + }, + onPickArea() { + this.setData({ areaPickerVisible: true }); + }, + onPickLabels(e) { + const { item } = e.currentTarget.dataset; + const { + locationState: { labelIndex = undefined }, + labels = [], + } = this.data; + let payload = { + labelIndex: item, + addressTag: labels[item].name, + }; + if (item === labelIndex) { + payload = { labelIndex: null, addressTag: '' }; + } + this.setData({ + 'locationState.labelIndex': payload.labelIndex, + }); + this.triggerEvent('triggerUpdateValue', payload); + }, + addLabels() { + this.setData({ + visible: true, + }); + }, + confirmHandle() { + const { labels, labelValue } = this.data; + this.setData({ + visible: false, + labels: [ + ...labels, + { id: labels[labels.length - 1].id + 1, name: labelValue }, + ], + labelValue: '', + }); + }, + cancelHandle() { + this.setData({ + visible: false, + labelValue: '', + }); + }, + onCheckDefaultAddress({ detail }) { + const { value } = detail; + this.setData({ + 'locationState.isDefault': value, + }); + }, + + onVerifyInputLegal() { + const { name, phone, detailAddress, districtName } = + this.data.locationState; + const prefixPhoneReg = String(this.properties.phoneReg || innerPhoneReg); + const prefixNameReg = String(this.properties.nameReg || innerNameReg); + const nameRegExp = new RegExp(prefixNameReg); + const phoneRegExp = new RegExp(prefixPhoneReg); + + if (!name || !name.trim()) { + return { + isLegal: false, + tips: '请填写收货人', + }; + } + if (!nameRegExp.test(name)) { + return { + isLegal: false, + tips: '收货人仅支持输入中文、英文(区分大小写)、数字', + }; + } + if (!phone || !phone.trim()) { + return { + isLegal: false, + tips: '请填写手机号', + }; + } + if (!phoneRegExp.test(phone)) { + return { + isLegal: false, + tips: '请填写正确的手机号', + }; + } + if (!districtName || !districtName.trim()) { + return { + isLegal: false, + tips: '请选择省市区信息', + }; + } + if (!detailAddress || !detailAddress.trim()) { + return { + isLegal: false, + tips: '请完善详细地址', + }; + } + if (detailAddress && detailAddress.trim().length > 50) { + return { + isLegal: false, + tips: '详细地址不能超过50个字符', + }; + } + return { + isLegal: true, + tips: '添加成功', + }; + }, + + builtInSearch({ code, name }) { + return new Promise((resolve, reject) => { + wx.getSetting({ + success: (res) => { + if (res.authSetting[code] === false) { + wx.showModal({ + title: `获取${name}失败`, + content: `获取${name}失败,请在【右上角】-小程序【设置】项中,将【${name}】开启。`, + confirmText: '去设置', + confirmColor: '#FA550F', + cancelColor: '取消', + success(res) { + if (res.confirm) { + wx.openSetting({ + success(settinRes) { + if (settinRes.authSetting[code] === true) { + resolve(); + } else { + console.warn('用户未打开权限', name, code); + reject(); + } + }, + }); + } else { + reject(); + } + }, + fail() { + reject(); + }, + }); + } else { + resolve(); + } + }, + fail() { + reject(); + }, + }); + }); + }, + + onSearchAddress() { + this.builtInSearch({ code: 'scope.userLocation', name: '地址位置' }).then( + () => { + wx.chooseLocation({ + success: (res) => { + if (res.name) { + this.triggerEvent('addressParse', { + address: res.address, + name: res.name, + latitude: res.latitude, + longitude: res.longitude, + }); + } else { + Toast({ + context: this, + selector: '#t-toast', + message: '地点为空,请重新选择', + icon: '', + duration: 1000, + }); + } + }, + fail: function (res) { + console.warn(`wx.chooseLocation fail: ${JSON.stringify(res)}`); + if (res.errMsg !== 'chooseLocation:fail cancel') { + Toast({ + context: this, + selector: '#t-toast', + message: '地点错误,请重新选择', + icon: '', + duration: 1000, + }); + } + }, + }); + }, + ); + }, + formSubmit() { + const { submitActive } = this.data; + if (!submitActive) { + Toast({ + context: this, + selector: '#t-toast', + message: this.privateData.verifyTips, + icon: '', + duration: 1000, + }); + return; + } + const { locationState } = this.data; + + this.hasSava = true; + + resolveAddress({ + saasId: '88888888', + uid: `88888888205500`, + authToken: null, + id: locationState.addressId, + addressId: locationState.addressId, + phone: locationState.phone, + name: locationState.name, + countryName: locationState.countryName, + countryCode: locationState.countryCode, + provinceName: locationState.provinceName, + provinceCode: locationState.provinceCode, + cityName: locationState.cityName, + cityCode: locationState.cityCode, + districtName: locationState.districtName, + districtCode: locationState.districtCode, + detailAddress: locationState.detailAddress, + isDefault: locationState.isDefault === 1 ? 1 : 0, + addressTag: locationState.addressTag, + latitude: locationState.latitude, + longitude: locationState.longitude, + storeId: null, + }); + + wx.navigateBack({ delta: 1 }); + }, + + getWeixinAddress(e) { + const { locationState } = this.data; + const weixinAddress = e.detail; + this.setData( + { + locationState: { ...locationState, ...weixinAddress }, + }, + () => { + const { isLegal, tips } = this.onVerifyInputLegal(); + this.setData({ + submitActive: isLegal, + }); + this.privateData.verifyTips = tips; + }, + ); + }, +}); diff --git a/pages/usercenter/address/edit/index.json b/pages/usercenter/address/edit/index.json new file mode 100644 index 0000000..b977887 --- /dev/null +++ b/pages/usercenter/address/edit/index.json @@ -0,0 +1,16 @@ +{ + "navigationBarTitleText": "添加新地址", + "usingComponents": { + "t-textarea": "tdesign-miniprogram/textarea/textarea", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-input": "tdesign-miniprogram/input/input", + "t-button": "tdesign-miniprogram/button/button", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-switch": "tdesign-miniprogram/switch/switch", + "t-location": "/pages/usercenter/components/t-location/index", + "t-area-picker": "../../components/area-picker-new/index" + } +} \ No newline at end of file diff --git a/pages/usercenter/address/edit/index.wxml b/pages/usercenter/address/edit/index.wxml new file mode 100644 index 0000000..1d39db4 --- /dev/null +++ b/pages/usercenter/address/edit/index.wxml @@ -0,0 +1,146 @@ + + + + + + + +

    + + + + + + + + + + + + + + + + + + + {{label.name}} + + + + + + + + + + + + + + 保存 + + +
    + + + + + + + + diff --git a/pages/usercenter/address/edit/index.wxss b/pages/usercenter/address/edit/index.wxss new file mode 100644 index 0000000..9189183 --- /dev/null +++ b/pages/usercenter/address/edit/index.wxss @@ -0,0 +1,113 @@ +page { + background-color: #f5f5f5; +} +page .divider-line { + width: 100%; + height: 20rpx; + background-color: #f5f5f5; +} +.address-flex-box { + display: flex; + flex-wrap: wrap; +} +.address-detail { + font-size: 30rpx; +} +.address-detail-wx-location { + background: #fff; + padding: 24rpx 32rpx; + display: flex; + align-items: center; + justify-content: space-between; +} +.address-detail-wx-arrow { + align-items: flex-end; +} +.form-address .t-cell-left { + margin-right: 0; +} +.form-address .t-cell-title { + width: 196rpx; + flex: none; +} +.form-address .t-cell-note { + margin-bottom: -20rpx; +} +.form-address .t-input { + width: 100%; +} +.form-address .t-textarea-cell-note { + margin: 0 -32rpx; +} + +.form-address .t-textarea__placeholder { + color: #bbb !important; +} +page .form-address .t-dialog-confirm { + color: #ff5f15; +} +.form-address .form-content { + box-sizing: border-box; + width: 100%; + display: block; +} +.form-address .field-text { + flex: 1; + color: #666666; + font-size: 30rpx; + padding: 0; +} +.form-address .field-text::after { + border: none !important; +} +.form-address .map { + font-size: 48rpx !important; + margin-left: 20rpx; + color: #9d9d9f; +} +.form-address .field.text-area { + height: 200rpx; + align-items: flex-start; +} +.form-address .label-list { + line-height: 50rpx; + background: #f5f5f5; + color: #333; + min-width: 100rpx; + padding: 0 20rpx; + height: 56rpx; + margin: 0 32rpx 20rpx 0; + font-size: 26rpx; + border: 2rpx solid transparent; + width: auto; +} +.form-address .label-list::after { + content: none; +} +.form-address .active-btn { + color: #fa4126; + border: 2rpx solid #fa4126; + background: rgba(255, 95, 21, 0.04); +} +.form-address .active-btn::after { + border: 4rpx solid #ff5f15; +} +.submit { + box-sizing: border-box; + padding: 64rpx 30rpx 88rpx 30rpx; +} +.submit .btn-submit-address { + width: 100%; + background: #fa4126; + color: #fff; + border-radius: 48rpx; +} +.submit .btn-submit-address.disabled { + background-color: #c6c6c6; +} +.submit .btn-submit-address.disabled::after { + display: none; +} +.dialog__button-confirm { + color: #fa4126 !important; +} diff --git a/pages/usercenter/address/edit/util.js b/pages/usercenter/address/edit/util.js new file mode 100644 index 0000000..17d619a --- /dev/null +++ b/pages/usercenter/address/edit/util.js @@ -0,0 +1,33 @@ +let addressPromise = []; + +/** 地址编辑Promise */ +export const getAddressPromise = () => { + let resolver; + let rejecter; + const nextPromise = new Promise((resolve, reject) => { + resolver = resolve; + rejecter = reject; + }); + + addressPromise.push({ resolver, rejecter }); + + return nextPromise; +}; + +/** 用户保存了一个地址 */ +export const resolveAddress = (address) => { + const allAddress = [...addressPromise]; + addressPromise = []; + + console.info('用户保存了一个地址', address); + + allAddress.forEach(({ resolver }) => resolver(address)); +}; + +/** 取消编辑 */ +export const rejectAddress = () => { + const allAddress = [...addressPromise]; + addressPromise = []; + + allAddress.forEach(({ rejecter }) => rejecter(new Error('cancel'))); +}; diff --git a/pages/usercenter/address/list/index.js b/pages/usercenter/address/list/index.js new file mode 100644 index 0000000..9008572 --- /dev/null +++ b/pages/usercenter/address/list/index.js @@ -0,0 +1,202 @@ +/* eslint-disable no-param-reassign */ +import { fetchDeliveryAddressList } from '../../../../services/address/fetchAddress'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { resolveAddress, rejectAddress } from './util'; +import { getAddressPromise } from '../edit/util'; + +Page({ + data: { + addressList: [], + deleteID: '', + showDeleteConfirm: false, + isOrderSure: false, + }, + + /** 选择模式 */ + selectMode: false, + /** 是否已经选择地址,不置为true的话页面离开时会触发取消选择行为 */ + hasSelect: false, + + onLoad(query) { + const { selectMode = '', isOrderSure = '', id = '' } = query; + this.setData({ + isOrderSure: !!isOrderSure, + extraSpace: !!isOrderSure, + id, + }); + this.selectMode = !!selectMode; + this.init(); + }, + + init() { + this.getAddressList(); + }, + onUnload() { + if (this.selectMode && !this.hasSelect) { + rejectAddress(); + } + }, + addAddress() { + wx.navigateTo({ + url: '/pages/usercenter/address/edit/index', + }); + }, + onEdit(e) { + wx.navigateTo({ + url: `/pages/usercenter/address/edit/index?id=${e.detail.id}`, + }); + }, + getAddressList() { + const { id } = this.data; + fetchDeliveryAddressList().then((addressList) => { + addressList.forEach((address) => { + if (address.id === id) { + address.checked = true; + } + }); + this.setData({ addressList }); + }); + }, + getWXAddressHandle() { + wx.chooseAddress({ + success: (res) => { + if (res.errMsg.indexOf('ok') === -1) { + Toast({ + context: this, + selector: '#t-toast', + message: res.errMsg, + icon: '', + duration: 1000, + }); + return; + } + Toast({ + context: this, + selector: '#t-toast', + message: '添加成功', + icon: '', + duration: 1000, + }); + const { length: len } = this.data.addressList; + this.setData({ + [`addressList[${len}]`]: { + name: res.userName, + phoneNumber: res.telNumber, + address: `${res.provinceName}${res.cityName}${res.countryName}${res.detailInfo}`, + isDefault: 0, + tag: '微信地址', + id: len, + }, + }); + }, + }); + }, + confirmDelteHandle({ detail }) { + const { id } = detail || {}; + if (id !== undefined) { + this.setData({ deleteID: id, showDeleteConfirm: true }); + Toast({ + context: this, + selector: '#t-toast', + message: '地址删除成功', + theme: 'success', + duration: 1000, + }); + } else { + Toast({ + context: this, + selector: '#t-toast', + message: '需要组件库发新版才能拿到地址ID', + icon: '', + duration: 1000, + }); + } + }, + deleteAddressHandle(e) { + const { id } = e.currentTarget.dataset; + this.setData({ + addressList: this.data.addressList.filter((address) => address.id !== id), + deleteID: '', + showDeleteConfirm: false, + }); + }, + editAddressHandle({ detail }) { + this.waitForNewAddress(); + + const { id } = detail || {}; + wx.navigateTo({ url: `/pages/usercenter/address/edit/index?id=${id}` }); + }, + selectHandle({ detail }) { + if (this.selectMode) { + this.hasSelect = true; + resolveAddress(detail); + wx.navigateBack({ delta: 1 }); + } else { + this.editAddressHandle({ detail }); + } + }, + createHandle() { + this.waitForNewAddress(); + wx.navigateTo({ url: '/pages/usercenter/address/edit/index' }); + }, + + waitForNewAddress() { + getAddressPromise() + .then((newAddress) => { + let addressList = [...this.data.addressList]; + + newAddress.phoneNumber = newAddress.phone; + newAddress.address = `${newAddress.provinceName}${newAddress.cityName}${newAddress.districtName}${newAddress.detailAddress}`; + newAddress.tag = newAddress.addressTag; + + if (!newAddress.addressId) { + newAddress.id = `${addressList.length}`; + newAddress.addressId = `${addressList.length}`; + + if (newAddress.isDefault === 1) { + addressList = addressList.map((address) => { + address.isDefault = 0; + + return address; + }); + } else { + newAddress.isDefault = 0; + } + + addressList.push(newAddress); + } else { + addressList = addressList.map((address) => { + if (address.addressId === newAddress.addressId) { + return newAddress; + } + return address; + }); + } + + addressList.sort((prevAddress, nextAddress) => { + if (prevAddress.isDefault && !nextAddress.isDefault) { + return -1; + } + if (!prevAddress.isDefault && nextAddress.isDefault) { + return 1; + } + return 0; + }); + + this.setData({ + addressList: addressList, + }); + }) + .catch((e) => { + if (e.message !== 'cancel') { + Toast({ + context: this, + selector: '#t-toast', + message: '地址编辑发生错误', + icon: '', + duration: 1000, + }); + } + }); + }, +}); diff --git a/pages/usercenter/address/list/index.json b/pages/usercenter/address/list/index.json new file mode 100644 index 0000000..1e59a76 --- /dev/null +++ b/pages/usercenter/address/list/index.json @@ -0,0 +1,11 @@ +{ + "navigationBarTitleText": "收货地址", + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-image": "/components/webp-image/index", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-address-item": "../../components/ui-address-item/index", + "t-location": "../../components/t-location/index", + "t-empty": "tdesign-miniprogram/empty/empty" + } +} \ No newline at end of file diff --git a/pages/usercenter/address/list/index.wxml b/pages/usercenter/address/list/index.wxml new file mode 100644 index 0000000..b7267f7 --- /dev/null +++ b/pages/usercenter/address/list/index.wxml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + 新建收货地址 + + + 最多支持添加20个收货地址 + + + + diff --git a/pages/usercenter/address/list/index.wxss b/pages/usercenter/address/list/index.wxss new file mode 100644 index 0000000..05b2554 --- /dev/null +++ b/pages/usercenter/address/list/index.wxss @@ -0,0 +1,109 @@ +page { + background: #f5f5f5; + height: 100%; +} +.address-container { + display: flex; + flex-direction: column; + align-items: stretch; + padding-bottom: calc(env(safe-area-inset-bottom) + 172rpx); +} +.address-container .address-list { + font-size: 24rpx; + background-color: #ffffff; + -webkit-overflow-scrolling: touch; +} +.address-list .no-address { + width: 750rpx; + padding-top: 30vh; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; +} +.address-list .no-address__icon { + width: 224rpx; + height: 224rpx; +} +.address-list .no-address__text { + font-size: 28rpx; + line-height: 40rpx; + color: #999999; + margin-top: 24rpx; +} +.address-container .bottom-fixed { + border-top: 1rpx solid #e5e5e5; + position: fixed; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + background: #fff; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + padding: 12rpx 32rpx calc(env(safe-area-inset-bottom) + 12rpx) 32rpx; +} +.address-container .btn-wrap { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + font-size: 32rpx; + font-weight: bold; +} +.address-container .btn-wrap .location-btn { + width: 332rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; + background-color: #ffffff; + color: #333; + position: relative; +} +.address-container .btn-wrap .location-btn::after { + content: ''; + position: absolute; /* 把父视图设置为relative,方便定位*/ + top: 0; + left: 0; + width: 200%; + height: 200%; + transform: scale(0.5); + transform-origin: 0 0; + box-sizing: border-box; + border-radius: 88rpx; + border: #dddddd 2rpx solid; +} +.address-container .btn-wrap .address-btn { + width: 332rpx; + height: 88rpx; + display: flex; + justify-content: center; + align-items: center; + background-color: #fa4126; + border-radius: 44rpx; + color: #fff; +} +.address-container .btn-wrap .btn-default { + background: #c6c6c6; +} +.address-container .bottom-fixed .footer { + margin-top: 10rpx; + display: inline-block; + width: 100%; + text-align: center; + font-size: 24rpx; + font-weight: 400; + color: #ff2525; + line-height: 60rpx; + height: 60rpx; +} +.address-container .message { + margin-top: 48rpx; +} +.address-container .custom-class { + margin-right: 12rpx; + font-weight: normal; +} diff --git a/pages/usercenter/address/list/util.js b/pages/usercenter/address/list/util.js new file mode 100644 index 0000000..953f8d0 --- /dev/null +++ b/pages/usercenter/address/list/util.js @@ -0,0 +1,31 @@ +let addressPromise = []; + +/** 获取一个地址选择Promise */ +export const getAddressPromise = () => { + let resolver; + let rejecter; + const nextPromise = new Promise((resolve, reject) => { + resolver = resolve; + rejecter = reject; + }); + + addressPromise.push({ resolver, rejecter }); + + return nextPromise; +}; + +/** 用户选择了一个地址 */ +export const resolveAddress = (address) => { + const allAddress = [...addressPromise]; + addressPromise = []; + + allAddress.forEach(({ resolver }) => resolver(address)); +}; + +/** 用户没有选择任何地址只是返回上一页了 */ +export const rejectAddress = () => { + const allAddress = [...addressPromise]; + addressPromise = []; + + allAddress.forEach(({ rejecter }) => rejecter(new Error('cancel'))); +}; diff --git a/pages/usercenter/components/area-picker-new/index.js b/pages/usercenter/components/area-picker-new/index.js new file mode 100644 index 0000000..d102f41 --- /dev/null +++ b/pages/usercenter/components/area-picker-new/index.js @@ -0,0 +1,192 @@ +Component({ + codeList: [], + options: { + multipleSlots: true, + }, + properties: { + show: { + type: Boolean, + observer(show) { + if (!show) return; + this.setData({ pickerValue: [] }, () => { + this.codeList = this.splitCode(this.data.value); + this.updateDivisions(); + }); + }, + }, + title: { + type: String, + value: '选择地区', + }, + value: { + type: String, + value: '', + }, + areaData: { + type: Array, + value: [], + observer() { + if (!this.data.show) return; + this.updateDivisions(); + }, + }, + columns: { + type: Number, + value: 3, + }, + columnsName: { + type: Array, + value: ['省市/地区', '城市', '区'], + }, + useLoadingSlot: Boolean, + }, + data: { + pickerValue: [], + pickerColumnData: [], + hightLightIndex: [], + loading: false, + scrollTop: 0, + }, + methods: { + splitCode(value) { + const codeList = []; + for (let i = 1; i <= this.data.columns; i++) { + let code = value.slice(0, i * 2); + if (code.length < i * 2) { + code = `${value.slice(0, (i - 1) * 2)}00`; + } + while (code.length < this.data.value.length) { + code += '0'; + } + codeList.push(code); + } + return codeList; + }, + updateDivisions() { + const { pickerValue } = this.data; + const area = pickerValue[pickerValue.length - 1]; + let currentAreaData = []; + if (pickerValue.length === 0) { + currentAreaData = this.data.areaData; + } else { + if (area && area.children && area.children.length > 0) { + currentAreaData = [...area.children]; + } else if (area && !area.children) { + const newArea = this.getNewAreaByPickerValue(pickerValue).area; + if (newArea && newArea.children) { + area.children = newArea.children; + currentAreaData = [...area.children]; + } + } + } + if (currentAreaData.length > 0) { + const pickerColumnData = currentAreaData[0].code + ? [{ name: '', children: currentAreaData }] + : currentAreaData; + let oldPickedIndexes = [-1, -1]; + if (this.codeList.length > pickerValue.length) { + for (const gi in pickerColumnData) { + for (const ai in pickerColumnData[gi].children) { + if ( + pickerColumnData[gi].children[ai].code === + this.codeList[pickerValue.length] + ) { + oldPickedIndexes = [+gi, +ai]; + break; + } + } + if (oldPickedIndexes[0] > -1) break; + } + } + this.setData({ loading: false, pickerColumnData }, () => { + return new Promise((resolve) => { + if (oldPickedIndexes[0] > -1) { + this.createSelectorQuery() + .select('#area-item-0-0') + .boundingClientRect() + .select(`#area-item-${oldPickedIndexes.join('-')}`) + .boundingClientRect() + .exec((res) => { + if (res[0] && res[1]) { + const offsetTop = res[1].top - res[0].top; + const diff = res[1].height; + resolve(offsetTop > diff ? offsetTop - diff : 0); + } else { + resolve(0); + } + }); + } else resolve(0); + }).then((scrollTop) => { + this.setData({ + hightLightIndex: oldPickedIndexes, + scrollTop, + }); + }); + }); + } else { + this.setData({ loading: true, pickerColumnData: [] }, () => { + if (area && area.code) { + this.triggerEvent('pullchildren', { parentCode: area.code }); + } else { + this.triggerEvent('pullchildren', {}); + } + }); + } + }, + getNewAreaByPickerValue(pickerValue) { + let { areaData } = this.data; + const areas = []; + for (const pickedArea of pickerValue) { + const _areaData = + areaData.length > 0 && areaData[0].code + ? [{ name: '', children: areaData }] + : areaData; + let newArea; + for (const gi in _areaData) { + for (const ai in _areaData[gi].children) { + if (_areaData[gi].children[ai].code === pickedArea.code) { + newArea = _areaData[gi].children[ai]; + break; + } + } + if (newArea) break; + } + if (!newArea) break; + areaData = newArea.children || []; + areas.push(newArea); + } + return { area: areas[areas.length - 1], areas }; + }, + onChange(e) { + const { gi, ai } = e.currentTarget.dataset; + const area = this.data.pickerColumnData[gi].children[ai]; + const pickerValue = this.data.pickerValue.concat(area); + if (pickerValue.length < this.data.columns) { + this.setData({ pickerValue }, () => { + this.updateDivisions(); + }); + this.triggerEvent('change', { value: area.code, areas: pickerValue }); + } else { + this.setData({ show: false }); + this.triggerEvent('confirm', { value: area.code, areas: pickerValue }); + } + }, + onPickerClick(e) { + const { index } = e.currentTarget.dataset; + if (index > this.data.pickerValue.length - 1) return; + const pickerValue = this.data.pickerValue.slice(0, index); + this.setData({ pickerValue }, () => { + this.updateDivisions(); + }); + this.triggerEvent('change', { + value: pickerValue[pickerValue.length - 1]?.code, + areas: pickerValue, + }); + }, + + onClose() { + this.setData({ show: false }); + this.triggerEvent('close'); + }, + }, +}); diff --git a/pages/usercenter/components/area-picker-new/index.json b/pages/usercenter/components/area-picker-new/index.json new file mode 100644 index 0000000..f27cef8 --- /dev/null +++ b/pages/usercenter/components/area-picker-new/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-loading-content": "/components/loading-content/index" + } +} diff --git a/pages/usercenter/components/area-picker-new/index.wxml b/pages/usercenter/components/area-picker-new/index.wxml new file mode 100644 index 0000000..b0f68e0 --- /dev/null +++ b/pages/usercenter/components/area-picker-new/index.wxml @@ -0,0 +1,78 @@ + + + + + {{title}} + + + + {{pickedArea.name}} + + + + + 请选择{{columsName[pickerValue.length]}} + + + + + + + + + + + 正在加载 + + + + 选择{{columsName[pickerValue.length]}} + + + + {{group.name}} + + {{item.name}} + + + + + + + + + + diff --git a/pages/usercenter/components/area-picker-new/index.wxss b/pages/usercenter/components/area-picker-new/index.wxss new file mode 100644 index 0000000..792bce2 --- /dev/null +++ b/pages/usercenter/components/area-picker-new/index.wxss @@ -0,0 +1,153 @@ +.area-picker { + background-color: white; + border-radius: 20rpx 20rpx 0 0; + overflow: hidden; + height: 80vh; + display: flex; + flex-direction: column; + position: relative; +} +.area-picker__close { + position: absolute; + top: 0; + right: 0; + height: 100rpx; + line-height: 100rpx; + padding: 0 24rpx; + font-size: 36rpx; + color: #999; + color: var(--color-text-caption, #999); +} +.area-picker__header { + height: 100rpx; + line-height: 100rpx; + text-align: center; + font-size: 32rpx; + color: #333; + color: var(--color-text, #333); + font-weight: bold; + flex: none; +} +.area-picker__selected-result { + padding: 20rpx 24rpx 32rpx; + flex: none; +} +.area-picker__selected-result__item { + padding-left: 40rpx; + position: relative; +} +.area-picker__selected-result__item.active + .area-picker__selected-result__item__name { + color: #fa550f; + color: var(--color-primary, #fa550f); +} +.area-picker__selected-result__item.active + .area-picker__selected-result__item__circle { + background-color: transparent; +} +.area-picker__selected-result__item.active + .area-picker__selected-result__item__circle::after { + content: ' '; + position: absolute; + left: -50%; + right: -50%; + top: -50%; + bottom: -50%; + border-radius: 50%; + box-sizing: border-box; + border: 1px solid #fa550f; + border: 1px solid var(--color-primary, #fa550f); + transform: scale(0.5); +} +.area-picker__selected-result__item:not(:last-child) { + padding-bottom: 48rpx; +} +.area-picker__selected-result__item__name { + color: #616161; + color: var(--area-picker-name-color, #616161); + font-size: 28rpx; + line-height: 40rpx; +} +.area-picker__selected-result__item__circle, +.area-picker__selected-result__item__line { + position: absolute; + top: 20rpx; + left: 8rpx; + background: #fa550f; + background: var(--color-primary, #fa550f); +} +.area-picker__selected-result__item__line { + height: calc(100% - 8rpx); + width: 1rpx; +} +.area-picker__selected-result__item__circle { + width: 16rpx; + height: 16rpx; + border-radius: 50%; + transform: translate(-50%, -50%); +} +.area-picker__split-line { + width: 200%; + height: 1px; + background-color: #e5e5e5; + background-color: var(--color-bg-line, #e5e5e5); + transform-origin: left top; + transform: scale(0.5); + flex: none; +} +.area-picker__area-list { + padding: 20rpx 24rpx calc(20rpx + env(safe-area-inset-bottom)) 24rpx; + flex: auto; + display: flex; + flex-direction: column; +} +.area-picker__area-list__loading { + height: 100%; + width: 100%; +} +.area-picker__area-list__title { + font-size: 24rpx; + color: #999; + color: var(--color-text-caption, #999); + flex: none; +} +.area-picker__area-list__content { + padding: 24rpx 0; + flex: auto; + height: 0; + position: relative; +} +.area-picker__area-list__content__inner { + position: absolute; + height: 100%; + overflow: hidden; +} +.area-picker__area-list__content__group { + display: flex; +} +.area-picker__area-list__content__group__title { + flex: none; + width: 40rpx; + font-size: 24rpx; + line-height: 40rpx; + color: #999; + color: var(--color-text-caption, #999); +} +.area-picker__area-list__content__group__content { + flex: auto; +} +.area-picker__area-list__content__group__content__item { + font-size: 28rpx; + line-height: 40rpx; + color: #333; + color: var(--color-text, #333); + padding-bottom: 48rpx; +} +.area-picker__area-list__content__group__content__item__active { + color: #fa550f; + color: var(--color-primary, #fa550f); +} +.area-picker__area-list__content__group__content__item.active { + color: #fa550f; + color: var(--color-primary, #fa550f); +} diff --git a/pages/usercenter/components/order-group/index.js b/pages/usercenter/components/order-group/index.js new file mode 100644 index 0000000..5bfe0f6 --- /dev/null +++ b/pages/usercenter/components/order-group/index.js @@ -0,0 +1,37 @@ +Component({ + externalClasses: ['title-class', 'icon-class', 'number-class'], + options: { + multipleSlots: true, + }, + properties: { + orderTagInfos: { + type: Array, + value: [], + }, + title: { + type: String, + value: '我的订单', + }, + desc: { + type: String, + value: '全部订单', + }, + isTop: { + type: Boolean, + value: true, + }, + classPrefix: { + type: String, + value: 'wr', + }, + }, + methods: { + onClickItem(e) { + this.triggerEvent('onClickItem', e.currentTarget.dataset.item); + }, + + onClickTop() { + this.triggerEvent('onClickTop', {}); + }, + }, +}); diff --git a/pages/usercenter/components/order-group/index.json b/pages/usercenter/components/order-group/index.json new file mode 100644 index 0000000..c22feda --- /dev/null +++ b/pages/usercenter/components/order-group/index.json @@ -0,0 +1,9 @@ +{ + "component": true, + "usingComponents": { + "t-cell": "tdesign-miniprogram/cell/cell", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-badge": "tdesign-miniprogram/badge/badge", + "t-icon": "tdesign-miniprogram/icon/icon" + } +} \ No newline at end of file diff --git a/pages/usercenter/components/order-group/index.wxml b/pages/usercenter/components/order-group/index.wxml new file mode 100644 index 0000000..366345d --- /dev/null +++ b/pages/usercenter/components/order-group/index.wxml @@ -0,0 +1,38 @@ + + + + + + + + + + + + {{item.title}} + + + + diff --git a/pages/usercenter/components/order-group/index.wxss b/pages/usercenter/components/order-group/index.wxss new file mode 100644 index 0000000..59b9aa1 --- /dev/null +++ b/pages/usercenter/components/order-group/index.wxss @@ -0,0 +1,56 @@ +.order-group { + margin-bottom: 24rpx; + background-color: #ffffff; + border-radius: 16rpx 16rpx 0 0; +} +.order-group .order-group__top { + padding: 24rpx 18rpx 24rpx 32rpx; + border-radius: 16rpx 16rpx 0 0; +} +.order-group__top___title { + font-size: 32rpx; + line-height: 48rpx; + font-weight: bold; +} +.order-group__top__note { + font-size: 28rpx; +} +.order-group__content { + overflow: hidden; + width: 100%; + height: 164rpx; + display: flex; + background-color: #fff; + border-radius: 0 0 16rpx 16rpx; +} +.order-group__item { + overflow: hidden; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + flex: 1; +} +.order-group__item:first-child { + border-radius: 0 0 0 16rpx; +} +.order-group__item:last-child { + border-radius: 0 0 16rpx 0; +} +.order-group__item__title { + font-size: 24rpx; + color: #666; + line-height: 32rpx; +} +.order-group__item__icon { + margin-bottom: 20rpx; + width: 56rpx; + height: 56rpx; + position: relative; +} +.order-group__top__title { + font-weight: bold; +} +.order-group .order-group__left { + margin-right: 0; +} diff --git a/pages/usercenter/components/t-location/index.js b/pages/usercenter/components/t-location/index.js new file mode 100644 index 0000000..c09ca92 --- /dev/null +++ b/pages/usercenter/components/t-location/index.js @@ -0,0 +1,126 @@ +import { getPermission } from '../../../../utils/getPermission'; +import { phoneRegCheck } from '../../../../utils/util'; +import Toast from 'tdesign-miniprogram/toast/index'; +import { addressParse } from '../../../../utils/addressParse'; +import { resolveAddress, rejectAddress } from '../../address/list/util'; + +Component({ + externalClasses: ['t-class'], + properties: { + title: { + type: String, + }, + navigator: { + type: Boolean, + }, + isCustomStyle: { + type: Boolean, + value: false, + }, + isDisabledBtn: { + type: Boolean, + value: false, + }, + isOrderSure: { + type: Boolean, + value: false, + }, + }, + methods: { + getWxLocation() { + if (this.properties.isDisabledBtn) return; + getPermission({ code: 'scope.address', name: '通讯地址' }).then(() => { + wx.chooseAddress({ + success: async (options) => { + const { + provinceName, + cityName, + countryName, + detailInfo, + userName, + telNumber, + } = options; + + if (!phoneRegCheck(telNumber)) { + Toast({ + context: this, + selector: '#t-toast', + message: '请填写正确的手机号', + }); + return; + } + + const target = { + name: userName, + phone: telNumber, + countryName: '中国', + countryCode: 'chn', + detailAddress: detailInfo, + provinceName: provinceName, + cityName: cityName, + districtName: countryName, + isDefault: false, + isOrderSure: this.properties.isOrderSure, + }; + + addressParse(provinceName, cityName, countryName); + + try { + const { provinceCode, cityCode, districtCode } = + await addressParse(provinceName, cityName, countryName); + + const params = Object.assign(target, { + provinceCode, + cityCode, + districtCode, + }); + if (this.properties.isOrderSure) { + this.onHandleSubmit(params); + } else if (this.properties.navigator) { + Navigator.gotoPage('/address-detail', params); + } else { + this.triggerEvent('change', params); + } + } catch (error) { + wx.showToast({ title: '地址解析出错,请稍后再试', icon: 'none' }); + } + }, + fail(err) { + console.warn('未选择微信收货地址', err); + }, + }); + }); + }, + + async queryAddress(addressId) { + try { + const { data } = await apis.userInfo.queryAddress({ addressId }); + return data.userAddressVO; + } catch (err) { + console.error('查询地址错误', err); + throw err; + } + }, + + findPage(pageRouteUrl) { + const currentRoutes = getCurrentPages().map((v) => v.route); + return currentRoutes.indexOf(pageRouteUrl); + }, + + async onHandleSubmit(params) { + try { + const orderPageDeltaNum = this.findPage( + 'pages/order/order-confirm/index', + ); + if (orderPageDeltaNum > -1) { + wx.navigateBack({ delta: 1 }); + resolveAddress(params); + return; + } + } catch (err) { + rejectAddress(params); + console.error(err); + } + }, + }, +}); diff --git a/pages/usercenter/components/t-location/index.json b/pages/usercenter/components/t-location/index.json new file mode 100644 index 0000000..4e3dc86 --- /dev/null +++ b/pages/usercenter/components/t-location/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "t-cell": "tdesign-miniprogram/cell/cell", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-toast": "tdesign-miniprogram/toast/toast" + } +} \ No newline at end of file diff --git a/pages/usercenter/components/t-location/index.wxml b/pages/usercenter/components/t-location/index.wxml new file mode 100644 index 0000000..5793dc0 --- /dev/null +++ b/pages/usercenter/components/t-location/index.wxml @@ -0,0 +1,39 @@ + + + + + {{title}} + + + + + + + + + + + + diff --git a/pages/usercenter/components/t-location/index.wxss b/pages/usercenter/components/t-location/index.wxss new file mode 100644 index 0000000..4ba6cbc --- /dev/null +++ b/pages/usercenter/components/t-location/index.wxss @@ -0,0 +1,19 @@ +.wx-address .weixin { + display: inline-block; + font-size: 48rpx !important; + margin-right: 20rpx; + font-weight: normal; +} +.wx-address .cell { + padding: 32rpx 30rpx; + border-radius: 8rpx; +} +.wx-address .cell__title { + font-size: 30rpx; + color: #333333; +} +.wx-address-custom { + display: flex; + align-items: center; + font-size: 32rpx; +} diff --git a/pages/usercenter/components/ui-address-item/index.js b/pages/usercenter/components/ui-address-item/index.js new file mode 100644 index 0000000..467bbf7 --- /dev/null +++ b/pages/usercenter/components/ui-address-item/index.js @@ -0,0 +1,46 @@ +Component({ + options: { + addGlobalClass: true, + multipleSlots: true, + }, + properties: { + address: { + type: Object, + value: {}, + }, + customIcon: { + type: String, + value: 'edit-1', + }, + extraSpace: { + type: Boolean, + value: true, + }, + isDrawLine: { + type: Boolean, + value: true, + }, + }, + externalClasses: [ + 'item-wrapper-class', + 'title-class', + 'default-tag-class', + 'normal-tag-class', + 'address-info-class', + 'delete-class', + ], + methods: { + onDelete(e) { + const { item } = e.currentTarget.dataset; + this.triggerEvent('onDelete', item); + }, + onSelect(e) { + const { item } = e.currentTarget.dataset; + this.triggerEvent('onSelect', item); + }, + onEdit(e) { + const { item } = e.currentTarget.dataset; + this.triggerEvent('onEdit', item); + }, + }, +}); diff --git a/pages/usercenter/components/ui-address-item/index.json b/pages/usercenter/components/ui-address-item/index.json new file mode 100644 index 0000000..0f9fe0f --- /dev/null +++ b/pages/usercenter/components/ui-address-item/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-tag": "tdesign-miniprogram/tag/tag", + "t-swipe-cell": "tdesign-miniprogram/swipe-cell/swipe-cell" + } +} diff --git a/pages/usercenter/components/ui-address-item/index.wxml b/pages/usercenter/components/ui-address-item/index.wxml new file mode 100644 index 0000000..9b3319f --- /dev/null +++ b/pages/usercenter/components/ui-address-item/index.wxml @@ -0,0 +1,52 @@ + + var toHide = function(array) { + var mphone = array.substring(0, 3) + '****' + array.substring(7); + return mphone; + } + module.exports.toHide = toHide; + + + + + + + + + + {{address.name}} + {{phoneReg.toHide(address.phoneNumber || '')}} + + + + 默认 + {{address.tag}} + {{address.address}} + + + + + + + + + 删除 + + + + diff --git a/pages/usercenter/components/ui-address-item/index.wxss b/pages/usercenter/components/ui-address-item/index.wxss new file mode 100644 index 0000000..6b74669 --- /dev/null +++ b/pages/usercenter/components/ui-address-item/index.wxss @@ -0,0 +1,103 @@ +.address-item-wrapper { + overflow: hidden; +} +.address-item-wrapper .swipe-out .wr-swiper-cell { + margin-top: 20rpx; +} +.address-item-wrapper .swipe-out .swipe-right-del { + display: flex; + justify-content: center; + align-items: center; + width: 144rpx; + height: 100%; + background-color: #fa4126; + color: #fff; + font-size: 28rpx; + line-height: 40rpx; +} +.address-item-wrapper .draw-line { + position: relative; +} +.address-item-wrapper .draw-line::after { + content: ''; + position: absolute; + top: 0; + left: 32rpx; + width: 200%; + height: 2rpx; + transform: scale(0.5); + transform-origin: 0 0; + box-sizing: border-box; + border-bottom: #e5e5e5 2rpx solid; +} +.address-item-wrapper .address { + display: flex; + justify-content: space-between; + align-items: center; + padding: 32rpx; + background-color: #fff; +} +.address-item-wrapper .address .address-edit { + padding: 20rpx 0 20rpx 46rpx; +} +.address-item-wrapper .address .address-left { + width: 80rpx; + display: flex; + justify-content: center; +} +.address-item-wrapper .address .address-content { + display: flex; + flex-direction: column; + flex: 1; +} +.address-item-wrapper .address .address-content .title { + font-size: 32rpx; + line-height: 48rpx; + margin-bottom: 16rpx; + color: #333333; + font-weight: bold; + display: flex; +} +.address-item-wrapper .address .address-content .title .text-style { + margin-right: 8rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 280rpx; +} +.address-item-wrapper .address .address-content .label-adds { + display: flex; +} +.address-item-wrapper .address .address-content .label-adds .adds { + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + color: #999999; +} +.address-item-wrapper .address .address-content .label-adds .tag { + display: inline-block; + padding: 0rpx 8rpx; + min-width: 40rpx; + height: 32rpx; + border-radius: 18rpx; + font-size: 20rpx; + line-height: 32rpx; + text-align: center; + margin-right: 8rpx; + vertical-align: text-top; +} +.address-item-wrapper .address .address-content .label-adds .tag-default { + background: #ffece9; + color: #fa4126; +} +.address-item-wrapper .address .address-content .label-adds .tag-primary { + background: #f0f1ff; + color: #5a66ff; +} +.address-item-wrapper .address .address-content .label-adds .address-text { + font-size: 28rpx; + line-height: 40rpx; + color: #999999; +} diff --git a/pages/usercenter/components/ui-select-picker/index.js b/pages/usercenter/components/ui-select-picker/index.js new file mode 100644 index 0000000..fff68cc --- /dev/null +++ b/pages/usercenter/components/ui-select-picker/index.js @@ -0,0 +1,73 @@ +Component({ + properties: { + show: { + type: Boolean, + observer(show) { + if (!show) return; + this.updateDivisions(); + }, + }, + title: { + type: String, + value: '', + }, + value: { + type: String, + value: '', + observer() { + if (!this.data.show) return; + this.updateDivisions(); + }, + }, + pickerOptions: { + type: Array, + value: [], + observer() { + if (!this.data.show) return; + this.updateDivisions(); + }, + }, + headerVisible: { + type: Boolean, + value: true, + }, + }, + data: { + pickerValue: [], + }, + methods: { + updateDivisions() { + const { pickerOptions, value } = this.data; + const index = (pickerOptions || []).findIndex( + (item) => item.code === value, + ); + + setTimeout(() => { + this.setData({ pickerValue: index >= 0 ? [index] : [0] }); + }, 0); + }, + + getAreaByIndex(indexes) { + const { pickerOptions } = this.data; + return pickerOptions[indexes.toString()]; + }, + + onChange(e) { + const currentValue = e.detail.value; + const target = this.getAreaByIndex(currentValue); + if (target === null) return; + + this.setData({ pickerValue: currentValue }); + this.triggerEvent('change', { value: target.code, target: target }); + }, + + onConfirm() { + const target = this.getAreaByIndex(this.data.pickerValue); + this.triggerEvent('confirm', { value: target?.code, target }); + }, + + onClose() { + this.triggerEvent('close'); + }, + }, +}); diff --git a/pages/usercenter/components/ui-select-picker/index.json b/pages/usercenter/components/ui-select-picker/index.json new file mode 100644 index 0000000..6e4c04e --- /dev/null +++ b/pages/usercenter/components/ui-select-picker/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup" + } +} diff --git a/pages/usercenter/components/ui-select-picker/index.wxml b/pages/usercenter/components/ui-select-picker/index.wxml new file mode 100644 index 0000000..7df73f8 --- /dev/null +++ b/pages/usercenter/components/ui-select-picker/index.wxml @@ -0,0 +1,27 @@ + + + + 取消 + {{title}} + 确定 + + + {{title}} + + + + {{ item.name }} + + + + 取消 + 确定 + + + + diff --git a/pages/usercenter/components/ui-select-picker/index.wxss b/pages/usercenter/components/ui-select-picker/index.wxss new file mode 100644 index 0000000..3e977be --- /dev/null +++ b/pages/usercenter/components/ui-select-picker/index.wxss @@ -0,0 +1,102 @@ +.city-picker-container { + opacity: 0; + position: fixed; + top: 100vh; + left: 0; + right: 0; + height: 100vh; + z-index: 100; +} +.city-picker-container.show { + top: 0; + opacity: 1; +} +.city-picker-container.show .city-picker-box { + bottom: 0; +} +.city-picker-shadow { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.65); +} +.city-picker-header { + height: 100rpx; + line-height: 100rpx; + text-align: center; + font-size: 32rpx; + color: #333333; +} +.city-picker-more { + display: flex; + justify-content: space-between; + align-items: center; +} +.city-picker-footer { + height: 100rpx; + display: flex; + justify-content: space-between; + align-items: center; +} +.city-picker-footer .btn { + width: 330rpx; + height: 80rpx; + line-height: 80rpx; + text-align: center; + color: #666666; + font-size: 32rpx; + position: relative; +} +.city-picker-footer .btn__active { + opacity: 0.5; +} +.city-picker-footer .btn::after { + display: block; + content: ' '; + position: absolute; + left: -50%; + right: -50%; + top: -50%; + bottom: -50%; + transform: scale(0.5); + border: 1rpx solid #999999; + border-radius: 16rpx; +} +.city-picker-footer .btn.primary { + color: #fa550f; +} +.city-picker-footer .btn.primary::after { + border-color: #fa550f; +} +.picker-column:not(:first-child) { + margin-left: 40rpx; +} +.city-picker-box { + position: absolute; + bottom: -100%; + transition: 0.3s bottom ease-in-out; + left: 0; + right: 0; + z-index: 100; + background-color: #fff; + padding: 0 30rpx; + color: #333333; + font-size: 34rpx; + border-radius: 20rpx 20rpx 0 0; + padding-bottom: env(safe-area-inset-bottom); +} +.show .city-picker-shadow { + display: block; +} +.picker { + height: 300rpx; + margin: 50rpx 0; + line-height: 88rpx; + text-align: center; +} +/* 似乎小程序picker-view的bug,indicator-class仅height生效,其他诸如line-height、text-align等放到父class中设置 */ +.picker-center-row { + height: 88rpx; +} diff --git a/pages/usercenter/components/user-center-card/index.js b/pages/usercenter/components/user-center-card/index.js new file mode 100644 index 0000000..47593c4 --- /dev/null +++ b/pages/usercenter/components/user-center-card/index.js @@ -0,0 +1,35 @@ +const AuthStepType = { + ONE: 1, + TWO: 2, + THREE: 3, +}; + +Component({ + options: { + multipleSlots: true, + }, + properties: { + currAuthStep: { + type: Number, + value: AuthStepType.ONE, + }, + userInfo: { + type: Object, + value: {}, + }, + isNeedGetUserInfo: { + type: Boolean, + value: false, + }, + }, + data: { + defaultAvatarUrl: + 'https://cdn-we-retail.ym.tencent.com/miniapp/usercenter/icon-user-center-avatar@2x.png', + AuthStepType, + }, + methods: { + gotoUserEditPage() { + this.triggerEvent('gotoUserEditPage'); + }, + }, +}); diff --git a/pages/usercenter/components/user-center-card/index.json b/pages/usercenter/components/user-center-card/index.json new file mode 100644 index 0000000..e169f6f --- /dev/null +++ b/pages/usercenter/components/user-center-card/index.json @@ -0,0 +1,7 @@ +{ + "component": true, + "usingComponents": { + "t-icon": "tdesign-miniprogram/icon/icon", + "t-avatar": "tdesign-miniprogram/avatar/avatar" + } +} \ No newline at end of file diff --git a/pages/usercenter/components/user-center-card/index.wxml b/pages/usercenter/components/user-center-card/index.wxml new file mode 100644 index 0000000..17ebac5 --- /dev/null +++ b/pages/usercenter/components/user-center-card/index.wxml @@ -0,0 +1,35 @@ + + + + + + {{'请登录'}} + + + + + + + {{userInfo.nickName || '微信用户'}} + + + + + + + + + + + + + {{userInfo.nickName || '微信用户'}} + + + + diff --git a/pages/usercenter/components/user-center-card/index.wxss b/pages/usercenter/components/user-center-card/index.wxss new file mode 100644 index 0000000..2b488c1 --- /dev/null +++ b/pages/usercenter/components/user-center-card/index.wxss @@ -0,0 +1,48 @@ +.user-center-card { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 480rpx; + background-image: url('https://cdn-we-retail.ym.tencent.com/miniapp/template/user-center-bg-v1.png'); + background-size: cover; + background-repeat: no-repeat; + padding: 0 24rpx; +} +.user-center-card__header { + margin-top: 192rpx; + margin-bottom: 48rpx; + height: 96rpx; + line-height: 48rpx; + display: flex; + justify-content: flex-start; + align-items: center; + color: #333; + position: relative; +} +.user-center-card__header__avatar { + width: 96rpx; + height: 96rpx; + border-radius: 48rpx; + overflow: hidden; +} + +.user-center-card__header__name { + font-size: 36rpx; + line-height: 48rpx; + color: #333; + font-weight: bold; + margin-left: 24rpx; + margin-right: 16rpx; +} +.user-center-card__header__transparent { + position: absolute; + left: 0; + top: 0; + background-color: transparent; + height: 100%; + width: 100%; +} +.user-center-card__icon { + line-height: 96rpx; +} diff --git a/pages/usercenter/index.js b/pages/usercenter/index.js new file mode 100644 index 0000000..33a7d94 --- /dev/null +++ b/pages/usercenter/index.js @@ -0,0 +1,240 @@ +import { fetchUserCenter } from '../../services/usercenter/fetchUsercenter'; +import Toast from 'tdesign-miniprogram/toast/index'; + +const menuData = [ + [ + { + title: '收货地址', + tit: '', + url: '', + type: 'address', + }, + { + title: '优惠券', + tit: '', + url: '', + type: 'coupon', + }, + { + title: '积分', + tit: '', + url: '', + type: 'point', + }, + ], + [ + { + title: '帮助中心', + tit: '', + url: '', + type: 'help-center', + }, + { + title: '客服热线', + tit: '', + url: '', + type: 'service', + icon: 'service', + }, + ], +]; + +const orderTagInfos = [ + { + title: '待付款', + iconName: 'wallet', + orderNum: 0, + tabType: 5, + status: 1, + }, + { + title: '待发货', + iconName: 'deliver', + orderNum: 0, + tabType: 10, + status: 1, + }, + { + title: '待收货', + iconName: 'package', + orderNum: 0, + tabType: 40, + status: 1, + }, + { + title: '待评价', + iconName: 'comment', + orderNum: 0, + tabType: 60, + status: 1, + }, + { + title: '退款/售后', + iconName: 'exchang', + orderNum: 0, + tabType: 0, + status: 1, + }, +]; + +const getDefaultData = () => ({ + showMakePhone: false, + userInfo: { + avatarUrl: '', + nickName: '正在登录...', + phoneNumber: '', + }, + menuData, + orderTagInfos, + customerServiceInfo: {}, + currAuthStep: 1, + showKefu: true, + versionNo: '', +}); + +Page({ + data: getDefaultData(), + + onLoad() { + this.getVersionInfo(); + }, + + onShow() { + this.getTabBar().init(); + this.init(); + }, + onPullDownRefresh() { + this.init(); + }, + + init() { + this.fetUseriInfoHandle(); + }, + + fetUseriInfoHandle() { + fetchUserCenter().then( + ({ + userInfo, + countsData, + orderTagInfos: orderInfo, + customerServiceInfo, + }) => { + // eslint-disable-next-line no-unused-expressions + menuData?.[0].forEach((v) => { + countsData.forEach((counts) => { + if (counts.type === v.type) { + // eslint-disable-next-line no-param-reassign + v.tit = counts.num; + } + }); + }); + const info = orderTagInfos.map((v, index) => ({ + ...v, + ...orderInfo[index], + })); + this.setData({ + userInfo, + menuData, + orderTagInfos: info, + customerServiceInfo, + currAuthStep: 2, + }); + wx.stopPullDownRefresh(); + }, + ); + }, + + onClickCell({ currentTarget }) { + const { type } = currentTarget.dataset; + + switch (type) { + case 'address': { + wx.navigateTo({ url: '/pages/usercenter/address/list/index' }); + break; + } + case 'service': { + this.openMakePhone(); + break; + } + case 'help-center': { + Toast({ + context: this, + selector: '#t-toast', + message: '你点击了帮助中心', + icon: '', + duration: 1000, + }); + break; + } + case 'point': { + Toast({ + context: this, + selector: '#t-toast', + message: '你点击了积分菜单', + icon: '', + duration: 1000, + }); + break; + } + case 'coupon': { + wx.navigateTo({ url: '/pages/coupon/coupon-list/index' }); + break; + } + default: { + Toast({ + context: this, + selector: '#t-toast', + message: '未知跳转', + icon: '', + duration: 1000, + }); + break; + } + } + }, + + jumpNav(e) { + const status = e.detail.tabType; + + if (status === 0) { + wx.navigateTo({ url: '/pages/order/after-service-list/index' }); + } else { + wx.navigateTo({ url: `/pages/order/order-list/index?status=${status}` }); + } + }, + + jumpAllOrder() { + wx.navigateTo({ url: '/pages/order/order-list/index' }); + }, + + openMakePhone() { + this.setData({ showMakePhone: true }); + }, + + closeMakePhone() { + this.setData({ showMakePhone: false }); + }, + + call() { + wx.makePhoneCall({ + phoneNumber: this.data.customerServiceInfo.servicePhone, + }); + }, + + gotoUserEditPage() { + const { currAuthStep } = this.data; + if (currAuthStep === 2) { + wx.navigateTo({ url: '/pages/usercenter/person-info/index' }); + } else { + this.fetUseriInfoHandle(); + } + }, + + getVersionInfo() { + const versionInfo = wx.getAccountInfoSync(); + const { version, envVersion = __wxConfig } = versionInfo.miniProgram; + this.setData({ + versionNo: envVersion === 'release' ? version : envVersion, + }); + }, +}); diff --git a/pages/usercenter/index.json b/pages/usercenter/index.json new file mode 100644 index 0000000..398a70b --- /dev/null +++ b/pages/usercenter/index.json @@ -0,0 +1,14 @@ +{ + "navigationBarTitleText": "个人中心", + "navigationStyle": "custom", + "usingComponents": { + "t-popup": "tdesign-miniprogram/popup/popup", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-user-center-card": "./components/user-center-card/index", + "t-order-group": "./components/order-group/index", + "t-toast": "tdesign-miniprogram/toast/toast" + }, + "enablePullDownRefresh": true +} \ No newline at end of file diff --git a/pages/usercenter/index.wxml b/pages/usercenter/index.wxml new file mode 100644 index 0000000..d71686d --- /dev/null +++ b/pages/usercenter/index.wxml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + +当前版本 {{versionNo}} + + + + 服务时间: {{customerServiceInfo.serviceTimeDuration}} + + 电话客服 + + 取消 + + + + diff --git a/pages/usercenter/index.wxss b/pages/usercenter/index.wxss new file mode 100644 index 0000000..483e6f2 --- /dev/null +++ b/pages/usercenter/index.wxss @@ -0,0 +1,146 @@ +page { + background-color: #f5f5f5; +} + +.content-wrapper { + margin-top: 340rpx; + position: relative; + padding: 0 30rpx; +} + +.main-content { + height: 500rpx; +} + +.order-group-wrapper { + margin-bottom: 16rpx; +} + +.order-group-note { + font-size: 28rpx; +} + +.cell-box { + border-radius: 10rpx; + overflow: hidden; + margin-bottom: 20rpx; +} +.icon-color { + color: #aaa; +} +.cell-class { + height: 100rpx; + display: flex; + align-items: center; +} + +.order-content { + overflow: hidden; + width: 100%; + display: flex; + background-color: #fff; + border-radius: 16rpx; +} + +.order-item { + flex: 1; + height: 180rpx; + overflow: hidden; + position: relative; + text-align: center; +} + +.order-content-box { + margin: auto; + position: absolute; + width: 100%; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.order-content-t { + margin-top: 10rpx; + font-size: 24rpx; + color: #333; + letter-spacing: 0; + text-align: center; +} + +.popup-content { + background: #f5f5f5; + margin-bottom: env(safe-area-inset-bottom); + border-radius: 16rpx 16rpx 0 0; +} +.popup-content .popup-title { + background: #fff; + text-align: center; + font-size: 24rpx; + color: #999; + height: 112rpx; + text-align: center; + line-height: 112rpx; + border-radius: 16rpx 16rpx 0 0; +} + +.border-bottom-1px { + position: relative; +} + +.border-bottom-1px::after { + position: absolute; + display: block; + content: ''; + box-sizing: border-box; + top: 0; + left: 0; + width: 200%; + height: 200%; + transform: scale(0.5); + transform-origin: left top; + border-bottom: 2rpx solid #e5e5e5; +} +.popup-content .popup-phone, +.popup-content .popup-close { + background: #fff; + height: 100rpx; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + font-size: 30rpx; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #333; +} +.popup-content .popup-phone.online { + margin-bottom: 20rpx; +} +.popup-content .popup-phone.online::after { + content: none; +} +.popup-content .popup-close { + color: #333; + border: 0; + margin-top: 16rpx; +} + +.my-order { + border-radius: 10rpx; +} + +.footer__version { + text-align: center; + margin-top: 50rpx; + color: #999; + margin-bottom: 4rpx; + font-size: 24rpx; + line-height: 32rpx; +} +.cell-box .order-group__left { + margin-right: 0; +} +.cell-box .t-cell-padding { + padding: 24rpx 18rpx 24rpx 32rpx; +} diff --git a/pages/usercenter/name-edit/index.js b/pages/usercenter/name-edit/index.js new file mode 100644 index 0000000..57e4e3d --- /dev/null +++ b/pages/usercenter/name-edit/index.js @@ -0,0 +1,19 @@ +Page({ + data: { + nameValue: '', + }, + onLoad(options) { + const { name } = options; + this.setData({ + nameValue: name, + }); + }, + onSubmit() { + wx.navigateBack({ backRefresh: true }); + }, + clearContent() { + this.setData({ + nameValue: '', + }); + }, +}); diff --git a/pages/usercenter/name-edit/index.json b/pages/usercenter/name-edit/index.json new file mode 100644 index 0000000..efc7e5f --- /dev/null +++ b/pages/usercenter/name-edit/index.json @@ -0,0 +1,8 @@ +{ + "navigationBarTitleText": "昵称", + "usingComponents": { + "t-input": "tdesign-miniprogram/input/input", + "t-icon": "tdesign-miniprogram/icon/icon", + "t-button": "tdesign-miniprogram/button/button" + } +} diff --git a/pages/usercenter/name-edit/index.wxml b/pages/usercenter/name-edit/index.wxml new file mode 100644 index 0000000..0366a88 --- /dev/null +++ b/pages/usercenter/name-edit/index.wxml @@ -0,0 +1,16 @@ + + + + 最多可输入15个字 + + + 保存 + + + diff --git a/pages/usercenter/name-edit/index.wxss b/pages/usercenter/name-edit/index.wxss new file mode 100644 index 0000000..ef4b048 --- /dev/null +++ b/pages/usercenter/name-edit/index.wxss @@ -0,0 +1,26 @@ +page { + background-color: #f5f5f5; +} +page view { + box-sizing: border-box; +} +.name-edit { + padding-top: 20rpx; +} +.name-edit .name-edit__input--desc { + font-size: 26rpx; + padding: 16rpx 32rpx; + color: #999; + margin-bottom: 200rpx; +} +.name-edit .name-edit__wrapper { + width: 100%; + padding: 0 32rpx; +} +.name-edit .name-edit__btn { + height: 88rpx; + width: 100%; + background: #fa4126; + color: #fff; + border-radius: 48rpx; +} diff --git a/pages/usercenter/person-info/index.js b/pages/usercenter/person-info/index.js new file mode 100644 index 0000000..48fed27 --- /dev/null +++ b/pages/usercenter/person-info/index.js @@ -0,0 +1,122 @@ +import { fetchPerson } from '../../../services/usercenter/fetchPerson'; +import { phoneEncryption } from '../../../utils/util'; +import Toast from 'tdesign-miniprogram/toast/index'; + +Page({ + data: { + personInfo: { + avatarUrl: '', + nickName: '', + gender: 0, + phoneNumber: '', + }, + showUnbindConfirm: false, + pickerOptions: [ + { + name: '男', + code: '1', + }, + { + name: '女', + code: '2', + }, + ], + typeVisible: false, + genderMap: ['', '男', '女'], + }, + onLoad() { + this.init(); + }, + init() { + this.fetchData(); + }, + fetchData() { + fetchPerson().then((personInfo) => { + this.setData({ + personInfo, + 'personInfo.phoneNumber': phoneEncryption(personInfo.phoneNumber), + }); + }); + }, + onClickCell({ currentTarget }) { + const { dataset } = currentTarget; + const { nickName } = this.data.personInfo; + + switch (dataset.type) { + case 'gender': + this.setData({ + typeVisible: true, + }); + break; + case 'name': + wx.navigateTo({ + url: `/pages/usercenter/name-edit/index?name=${nickName}`, + }); + break; + case 'avatarUrl': + this.toModifyAvatar(); + break; + default: { + break; + } + } + }, + onClose() { + this.setData({ + typeVisible: false, + }); + }, + onConfirm(e) { + const { value } = e.detail; + this.setData( + { + typeVisible: false, + 'personInfo.gender': value, + }, + () => { + Toast({ + context: this, + selector: '#t-toast', + message: '设置成功', + theme: 'success', + }); + }, + ); + }, + async toModifyAvatar() { + try { + const tempFilePath = await new Promise((resolve, reject) => { + wx.chooseImage({ + count: 1, + sizeType: ['compressed'], + sourceType: ['album', 'camera'], + success: (res) => { + const { path, size } = res.tempFiles[0]; + if (size <= 10485760) { + resolve(path); + } else { + reject({ errMsg: '图片大小超出限制,请重新上传' }); + } + }, + fail: (err) => reject(err), + }); + }); + const tempUrlArr = tempFilePath.split('/'); + const tempFileName = tempUrlArr[tempUrlArr.length - 1]; + Toast({ + context: this, + selector: '#t-toast', + message: `已选择图片-${tempFileName}`, + theme: 'success', + }); + } catch (error) { + if (error.errMsg === 'chooseImage:fail cancel') return; + Toast({ + context: this, + selector: '#t-toast', + message: error.errMsg || error.msg || '修改头像出错了', + theme: 'fail', + }); + } + }, +}); diff --git a/pages/usercenter/person-info/index.json b/pages/usercenter/person-info/index.json new file mode 100644 index 0000000..e63dcc5 --- /dev/null +++ b/pages/usercenter/person-info/index.json @@ -0,0 +1,12 @@ +{ + "navigationBarTitleText": "个人资料", + "usingComponents": { + "t-cell-group": "tdesign-miniprogram/cell-group/cell-group", + "t-cell": "tdesign-miniprogram/cell/cell", + "t-button": "tdesign-miniprogram/button/button", + "t-image": "/components/webp-image/index", + "t-dialog": "tdesign-miniprogram/dialog/dialog", + "t-toast": "tdesign-miniprogram/toast/toast", + "t-select-picker": "../components/ui-select-picker/index" + } +} \ No newline at end of file diff --git a/pages/usercenter/person-info/index.wxml b/pages/usercenter/person-info/index.wxml new file mode 100644 index 0000000..2e460b1 --- /dev/null +++ b/pages/usercenter/person-info/index.wxml @@ -0,0 +1,59 @@ + + + + + + + + + + + 切换账号登录 + + + + + diff --git a/pages/usercenter/person-info/index.wxss b/pages/usercenter/person-info/index.wxss new file mode 100644 index 0000000..e1b5ea1 --- /dev/null +++ b/pages/usercenter/person-info/index.wxss @@ -0,0 +1,41 @@ +:host { + background-color: #f5f5f5; +} +page view { + box-sizing: border-box; +} +.person-info__btn { + width: 100%; + border: 2rpx solid #ddd; + border-radius: 48rpx; + padding: 18rpx 0; + display: flex; + align-self: center; + justify-content: center; +} +.person-info__wrapper { + width: 100%; + padding: 0 32rpx; + padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); + position: absolute; + bottom: 0; + left: 0; +} + +.avatarUrl { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + overflow: hidden; +} + +.t-class-confirm { + color: #fa550f !important; +} + +.person-info .order-group__left { + margin-right: 0; +} +.person-info .t-cell-class { + height: 112rpx; +} diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..c9c4f6d --- /dev/null +++ b/project.config.json @@ -0,0 +1,142 @@ +{ + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "urlCheck": true, + "es6": true, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": true, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "ignoreDevUnusedFiles": false, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "enableEngineNative": false, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "ignoreUploadUnusedFiles": true, + "useStaticServer": true + }, + "compileType": "miniprogram", + "libVersion": "2.23.1", + "appid": "wx7b5a3c884f21e6ae", + "projectname": "tdesign-miniprogram-starter-retail", + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "condition": { + "miniprogram": { + "list": [ + { + "name": "首页入口", + "pathName": "pages/home/home", + "query": "", + "scene": null + }, + { + "name": "示例页-商品分类", + "pathName": "pages/goods/category/index", + "query": "", + "scene": null + }, + { + "name": "示例页-个人中心", + "pathName": "pages/usercenter/index", + "query": "", + "scene": null + }, + { + "name": "示例页-商品列表", + "pathName": "pages/goods/list/index", + "query": "", + "scene": null + }, + { + "name": "示例页-商品详情", + "pathName": "pages/goods/details/index", + "query": "", + "scene": null + }, + { + "name": "示例页-商品评论", + "pathName": "pages/goods/comments/index", + "query": "", + "scene": null + }, + { + "name": "示例页-售后列表", + "pathName": "pages/order/after-service-list/index", + "query": "", + "scene": null + }, + { + "name": "示例页-售后详情", + "pathName": "pages/order/after-service-detail/index", + "query": "rightsNo=123123423", + "scene": null + }, + { + "name": "示例页-搜索页", + "pathName": "pages/goods/search/index", + "query": "", + "scene": null + }, + { + "name": "示例页-搜索结果", + "pathName": "pages/goods/result/index", + "query": "", + "scene": null + }, + { + "name": "示例页-商品评价", + "pathName": "pages/goods/comments/create/index", + "query": "", + "scene": null + }, + { + "name": "示例页-申请售后", + "pathName": "pages/order/apply-service/index", + "query": "orderNo=132222623132329291&skuId=135691625", + "scene": null + }, + { + "name": "示例页-发票详情", + "pathName": "pages/order/invoice/index", + "query": "orderNo=132381532610540875", + "scene": null + } + ] + } + }, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + } +} \ No newline at end of file diff --git a/services/_utils/delay.js b/services/_utils/delay.js new file mode 100644 index 0000000..da4ad62 --- /dev/null +++ b/services/_utils/delay.js @@ -0,0 +1,3 @@ +export function delay(ms = 200) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/services/_utils/timeout.js b/services/_utils/timeout.js new file mode 100644 index 0000000..870c2bf --- /dev/null +++ b/services/_utils/timeout.js @@ -0,0 +1,3 @@ +export function timeout(ms = 1000) { + return new Promise((_, reject) => setTimeout(reject, ms)); +} diff --git a/services/activity/fetchActivity.js b/services/activity/fetchActivity.js new file mode 100644 index 0000000..e9aefa6 --- /dev/null +++ b/services/activity/fetchActivity.js @@ -0,0 +1,20 @@ +import { config } from '../../config/index'; + +/** 获取活动列表 */ +function mockFetchActivity(ID = 0) { + const { delay } = require('../_utils/delay'); + const { getActivity } = require('../../model/activity'); + + return delay().then(() => getActivity(ID)); +} + +/** 获取活动列表 */ +export function fetchActivity(ID = 0) { + if (config.useMock) { + return mockFetchActivity(ID); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/activity/fetchActivityList.js b/services/activity/fetchActivityList.js new file mode 100644 index 0000000..2522aff --- /dev/null +++ b/services/activity/fetchActivityList.js @@ -0,0 +1,20 @@ +import { config } from '../../config/index'; + +/** 获取活动列表 */ +function mockFetchActivityList(pageIndex = 1, pageSize = 20) { + const { delay } = require('../_utils/delay'); + const { getActivityList } = require('../../model/activities'); + + return delay().then(() => getActivityList(pageIndex, pageSize)); +} + +/** 获取活动列表 */ +export function fetchActivityList(pageIndex = 1, pageSize = 20) { + if (config.useMock) { + return mockFetchActivityList(pageIndex, pageSize); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/address/fetchAddress.js b/services/address/fetchAddress.js new file mode 100644 index 0000000..9525ab0 --- /dev/null +++ b/services/address/fetchAddress.js @@ -0,0 +1,48 @@ +import { config } from '../../config/index'; + +/** 获取收货地址 */ +function mockFetchDeliveryAddress(id) { + const { delay } = require('../_utils/delay'); + const { genAddress } = require('../../model/address'); + + return delay().then(() => genAddress(id)); +} + +/** 获取收货地址 */ +export function fetchDeliveryAddress(id = 0) { + if (config.useMock) { + return mockFetchDeliveryAddress(id); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取收货地址列表 */ +function mockFetchDeliveryAddressList(len = 0) { + const { delay } = require('../_utils/delay'); + const { genAddressList } = require('../../model/address'); + + return delay().then(() => + genAddressList(len).map((address) => { + return { + ...address, + phoneNumber: address.phone, + address: `${address.provinceName}${address.cityName}${address.districtName}${address.detailAddress}`, + tag: address.addressTag, + }; + }), + ); +} + +/** 获取收货地址列表 */ +export function fetchDeliveryAddressList(len = 10) { + if (config.useMock) { + return mockFetchDeliveryAddressList(len); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/api/permission.js b/services/api/permission.js new file mode 100644 index 0000000..1623169 --- /dev/null +++ b/services/api/permission.js @@ -0,0 +1,11 @@ +import { + request +} from './request' + +export function wxLogin(parmas) { + return request({ + path: '/wx/login', + params: parmas, + method: 'POST' + }); +} \ No newline at end of file diff --git a/services/api/request.js b/services/api/request.js new file mode 100644 index 0000000..311559f --- /dev/null +++ b/services/api/request.js @@ -0,0 +1,55 @@ +import { + baseURL +} from '../../config/api' +import { + getToken +} from '../permission/login' +export function request({ + path, + params, + method +}) { + return new Promise((resolve, reject) => { + wx.request({ + url: baseURL + path, //仅为示例,并非真实的接口地址 + data: params, + header: { + 'content-type': 'application/json', // 默认值 + 'X-API-TOKEN': getToken() + }, + method: method, + success(res) { + console.log(res.data) + resolve(res.data); + }, + fail(res) { + console.log(res); + reject(res) + } + }) + }) +} + +export function uploadFile({ + path, + url, + data +}) { + return new Promise((resolve, reject) => { + wx.uploadFile({ + url: baseURL + path, //接口地址 + filePath: url, + name: 'file', + header: { + "X-API-TOKEN": getToken() + }, + formData: data, + success: function (res) { + console.log(res) + }, + fail: function (res) { + console.log(res); + } + }) + }) +} \ No newline at end of file diff --git a/services/api/session.js b/services/api/session.js new file mode 100644 index 0000000..ad5a2e4 --- /dev/null +++ b/services/api/session.js @@ -0,0 +1,31 @@ +import { + uploadFile +} from './request' + +export function sessionUpload({ + urls, + session +}) { + if (session == 0) { + uploadFile({ + path: '/ocr/upload', + url: urls[0].tempFilePath, + data: {} + }).then(res => { + console.log(res); + }) + } else { + for (let index = 0; index < urls.length; index++) { + const element = urls[index]; + uploadFile({ + path: '/ocr/upload', + url: element.tempFilePath, + data: { + sessionId: session + } + }).then(res => { + console.log(res); + }) + } + } +} \ No newline at end of file diff --git a/services/cart/cart.js b/services/cart/cart.js new file mode 100644 index 0000000..d42f959 --- /dev/null +++ b/services/cart/cart.js @@ -0,0 +1,20 @@ +import { config } from '../../config/index'; + +/** 获取购物车mock数据 */ +function mockFetchCartGroupData(params) { + const { delay } = require('../_utils/delay'); + const { genCartGroupData } = require('../../model/cart'); + + return delay().then(() => genCartGroupData(params)); +} + +/** 获取购物车数据 */ +export function fetchCartGroupData(params) { + if (config.useMock) { + return mockFetchCartGroupData(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/comments/fetchComments.js b/services/comments/fetchComments.js new file mode 100644 index 0000000..9bd1155 --- /dev/null +++ b/services/comments/fetchComments.js @@ -0,0 +1,18 @@ +import { config } from '../../config/index'; + +/** 获取商品评论 */ +function mockFetchComments(parmas) { + const { delay } = require('../_utils/delay'); + const { getGoodsAllComments } = require('../../model/comments'); + return delay().then(() => getGoodsAllComments(parmas)); +} + +/** 获取商品评论 */ +export function fetchComments(parmas) { + if (config.useMock) { + return mockFetchComments(parmas); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/comments/fetchCommentsCount.js b/services/comments/fetchCommentsCount.js new file mode 100644 index 0000000..cbb09d0 --- /dev/null +++ b/services/comments/fetchCommentsCount.js @@ -0,0 +1,18 @@ +import { config } from '../../config/index'; + +/** 获取商品评论数 */ +function mockFetchCommentsCount(ID = 0) { + const { delay } = require('../_utils/delay'); + const { getGoodsCommentsCount } = require('../../model/comments'); + return delay().then(() => getGoodsCommentsCount(ID)); +} + +/** 获取商品评论数 */ +export function fetchCommentsCount(ID = 0) { + if (config.useMock) { + return mockFetchCommentsCount(ID); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/coupon/index.js b/services/coupon/index.js new file mode 100644 index 0000000..a0010e0 --- /dev/null +++ b/services/coupon/index.js @@ -0,0 +1,65 @@ +import { config } from '../../config/index'; + +/** 获取优惠券列表 */ +function mockFetchCoupon(status) { + const { delay } = require('../_utils/delay'); + const { getCouponList } = require('../../model/coupon'); + return delay().then(() => getCouponList(status)); +} + +/** 获取优惠券列表 */ +export function fetchCouponList(status = 'default') { + if (config.useMock) { + return mockFetchCoupon(status); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取优惠券 详情 */ +function mockFetchCouponDetail(id, status) { + const { delay } = require('../_utils/delay'); + const { getCoupon } = require('../../model/coupon'); + const { genAddressList } = require('../../model/address'); + + return delay().then(() => { + const result = { + detail: getCoupon(id, status), + storeInfoList: genAddressList(), + }; + + result.detail.useNotes = `1个订单限用1张,除运费券外,不能与其它类型的优惠券叠加使用(运费券除外)\n2.仅适用于各区域正常售卖商品,不支持团购、抢购、预售类商品`; + result.detail.storeAdapt = `商城通用`; + + if (result.detail.type === 'price') { + result.detail.desc = `减免 ${result.detail.value / 100} 元`; + + if (result.detail.base) { + result.detail.desc += `,满${result.detail.base / 100}元可用`; + } + + result.detail.desc += '。'; + } else if (result.detail.type === 'discount') { + result.detail.desc = `${result.detail.value}折`; + + if (result.detail.base) { + result.detail.desc += `,满${result.detail.base / 100}元可用`; + } + + result.detail.desc += '。'; + } + + return result; + }); +} + +/** 获取优惠券 详情 */ +export function fetchCouponDetail(id, status = 'default') { + if (config.useMock) { + return mockFetchCouponDetail(id, status); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/comments/fetchCommentDetail.js b/services/good/comments/fetchCommentDetail.js new file mode 100644 index 0000000..fce338d --- /dev/null +++ b/services/good/comments/fetchCommentDetail.js @@ -0,0 +1,20 @@ +import { config } from '../../../config/index'; +import { queryCommentDetail } from '../../../model/comments/queryDetail'; +/** 获取商品评价数据 */ +function mockQueryCommentDetail(params) { + const { delay } = require('../../_utils/delay'); + const data = queryCommentDetail(params); + return delay().then(() => { + return data; + }); +} + +/** 获取评价详情 */ +export function getCommentDetail(params) { + if (config.useMock) { + return mockQueryCommentDetail(params); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/featchSearchResult.js b/services/good/featchSearchResult.js new file mode 100644 index 0000000..5b42851 --- /dev/null +++ b/services/good/featchSearchResult.js @@ -0,0 +1,38 @@ +/* eslint-disable no-param-reassign */ +import { config } from '../../config/index'; + +/** 获取搜索历史 */ +function mockSearchResult(params) { + const { delay } = require('../_utils/delay'); + const { getSearchResult } = require('../../model/search'); + + const data = getSearchResult(params); + + if (data.spuList.length) { + data.spuList.forEach((item) => { + item.spuId = item.spuId; + item.thumb = item.primaryImage; + item.title = item.title; + item.price = item.minSalePrice; + item.originPrice = item.maxLinePrice; + if (item.spuTagList) { + item.tags = item.spuTagList.map((tag) => ({ title: tag.title })); + } else { + item.tags = []; + } + }); + } + return delay().then(() => { + return data; + }); +} + +/** 获取搜索历史 */ +export function getSearchResult(params) { + if (config.useMock) { + return mockSearchResult(params); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/fetchCategoryList.js b/services/good/fetchCategoryList.js new file mode 100644 index 0000000..adf6ba4 --- /dev/null +++ b/services/good/fetchCategoryList.js @@ -0,0 +1,18 @@ +import { config } from '../../config/index'; + +/** 获取商品列表 */ +function mockFetchGoodCategory() { + const { delay } = require('../_utils/delay'); + const { getCategoryList } = require('../../model/category'); + return delay().then(() => getCategoryList()); +} + +/** 获取商品列表 */ +export function getCategoryList() { + if (config.useMock) { + return mockFetchGoodCategory(); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/fetchGood.js b/services/good/fetchGood.js new file mode 100644 index 0000000..7a196d4 --- /dev/null +++ b/services/good/fetchGood.js @@ -0,0 +1,18 @@ +import { config } from '../../config/index'; + +/** 获取商品列表 */ +function mockFetchGood(ID = 0) { + const { delay } = require('../_utils/delay'); + const { genGood } = require('../../model/good'); + return delay().then(() => genGood(ID)); +} + +/** 获取商品列表 */ +export function fetchGood(ID = 0) { + if (config.useMock) { + return mockFetchGood(ID); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/fetchGoods.js b/services/good/fetchGoods.js new file mode 100644 index 0000000..16618c8 --- /dev/null +++ b/services/good/fetchGoods.js @@ -0,0 +1,29 @@ +import { config } from '../../config/index'; + +/** 获取商品列表 */ +function mockFetchGoodsList(pageIndex = 1, pageSize = 20) { + const { delay } = require('../_utils/delay'); + const { getGoodsList } = require('../../model/goods'); + return delay().then(() => + getGoodsList(pageIndex, pageSize).map((item) => { + return { + spuId: item.spuId, + thumb: item.primaryImage, + title: item.title, + price: item.minSalePrice, + originPrice: item.maxLinePrice, + tags: item.spuTagList.map((tag) => tag.title), + }; + }), + ); +} + +/** 获取商品列表 */ +export function fetchGoodsList(pageIndex = 1, pageSize = 20) { + if (config.useMock) { + return mockFetchGoodsList(pageIndex, pageSize); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/fetchGoodsDetailsComments.js b/services/good/fetchGoodsDetailsComments.js new file mode 100644 index 0000000..95a11c4 --- /dev/null +++ b/services/good/fetchGoodsDetailsComments.js @@ -0,0 +1,37 @@ +import { config } from '../../config/index'; + +/** 获取商品详情页评论数 */ +function mockFetchGoodDetailsCommentsCount(spuId = 0) { + const { delay } = require('../_utils/delay'); + const { + getGoodsDetailsCommentsCount, + } = require('../../model/detailsComments'); + return delay().then(() => getGoodsDetailsCommentsCount(spuId)); +} + +/** 获取商品详情页评论数 */ +export function getGoodsDetailsCommentsCount(spuId = 0) { + if (config.useMock) { + return mockFetchGoodDetailsCommentsCount(spuId); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取商品详情页评论 */ +function mockFetchGoodDetailsCommentList(spuId = 0) { + const { delay } = require('../_utils/delay'); + const { getGoodsDetailsComments } = require('../../model/detailsComments'); + return delay().then(() => getGoodsDetailsComments(spuId)); +} + +/** 获取商品详情页评论 */ +export function getGoodsDetailsCommentList(spuId = 0) { + if (config.useMock) { + return mockFetchGoodDetailsCommentList(spuId); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/fetchGoodsList.js b/services/good/fetchGoodsList.js new file mode 100644 index 0000000..1650b9b --- /dev/null +++ b/services/good/fetchGoodsList.js @@ -0,0 +1,39 @@ +/* eslint-disable no-param-reassign */ +import { config } from '../../config/index'; + +/** 获取商品列表 */ +function mockFetchGoodsList(params) { + const { delay } = require('../_utils/delay'); + const { getSearchResult } = require('../../model/search'); + + const data = getSearchResult(params); + + if (data.spuList.length) { + data.spuList.forEach((item) => { + item.spuId = item.spuId; + item.thumb = item.primaryImage; + item.title = item.title; + item.price = item.minSalePrice; + item.originPrice = item.maxLinePrice; + item.desc = ''; + if (item.spuTagList) { + item.tags = item.spuTagList.map((tag) => tag.title); + } else { + item.tags = []; + } + }); + } + return delay().then(() => { + return data; + }); +} + +/** 获取商品列表 */ +export function fetchGoodsList(params) { + if (config.useMock) { + return mockFetchGoodsList(params); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/good/fetchSearchHistory.js b/services/good/fetchSearchHistory.js new file mode 100644 index 0000000..3a73963 --- /dev/null +++ b/services/good/fetchSearchHistory.js @@ -0,0 +1,35 @@ +import { config } from '../../config/index'; + +/** 获取搜索历史 */ +function mockSearchHistory() { + const { delay } = require('../_utils/delay'); + const { getSearchHistory } = require('../../model/search'); + return delay().then(() => getSearchHistory()); +} + +/** 获取搜索历史 */ +export function getSearchHistory() { + if (config.useMock) { + return mockSearchHistory(); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取搜索历史 */ +function mockSearchPopular() { + const { delay } = require('../_utils/delay'); + const { getSearchPopular } = require('../../model/search'); + return delay().then(() => getSearchPopular()); +} + +/** 获取搜索历史 */ +export function getSearchPopular() { + if (config.useMock) { + return mockSearchPopular(); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/home/home.js b/services/home/home.js new file mode 100644 index 0000000..7d4469d --- /dev/null +++ b/services/home/home.js @@ -0,0 +1,53 @@ +import { config, cdnBase } from '../../config/index'; + +/** 获取首页数据 */ +function mockFetchHome() { + const { delay } = require('../_utils/delay'); + const { genSwiperImageList } = require('../../model/swiper'); + return delay().then(() => { + return { + swiper: genSwiperImageList(), + tabList: [ + { + text: '精选推荐', + key: 0, + }, + { + text: '夏日防晒', + key: 1, + }, + { + text: '二胎大作战', + key: 2, + }, + { + text: '人气榜', + key: 3, + }, + { + text: '好评榜', + key: 4, + }, + { + text: 'RTX 30', + key: 5, + }, + { + text: '手机也疯狂', + key: 6, + }, + ], + activityImg: `${cdnBase}/activity/banner.png`, + }; + }); +} + +/** 获取首页数据 */ +export function fetchHome() { + if (config.useMock) { + return mockFetchHome(); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/order/applyService.js b/services/order/applyService.js new file mode 100644 index 0000000..c66930a --- /dev/null +++ b/services/order/applyService.js @@ -0,0 +1,70 @@ +import { config } from '../../config/index'; + +/** 获取售后单mock数据 */ +function mockFetchRightsPreview(params) { + const { delay } = require('../_utils/delay'); + const { genRightsPreview } = require('../../model/order/applyService'); + + return delay().then(() => genRightsPreview(params)); +} + +/** 获取售后单数据 */ +export function fetchRightsPreview(params) { + if (config.useMock) { + return mockFetchRightsPreview(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 确认收货 */ +export function dispatchConfirmReceived() { + if (config.useMock) { + const { delay } = require('../_utils/delay'); + return delay(); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取可选的mock售后原因列表 */ +function mockFetchApplyReasonList(params) { + const { delay } = require('../_utils/delay'); + const { genApplyReasonList } = require('../../model/order/applyService'); + + return delay().then(() => genApplyReasonList(params)); +} + +/** 获取可选的售后原因列表 */ +export function fetchApplyReasonList(params) { + if (config.useMock) { + return mockFetchApplyReasonList(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 发起mock售后申请 */ +function mockDispatchApplyService(params) { + const { delay } = require('../_utils/delay'); + const { applyService } = require('../../model/order/applyService'); + + return delay().then(() => applyService(params)); +} + +/** 发起售后申请 */ +export function dispatchApplyService(params) { + if (config.useMock) { + return mockDispatchApplyService(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/order/orderConfirm.js b/services/order/orderConfirm.js new file mode 100644 index 0000000..4d34744 --- /dev/null +++ b/services/order/orderConfirm.js @@ -0,0 +1,69 @@ +import { config } from '../../config/index'; +import { mockIp, mockReqId } from '../../utils/mock'; + +/** 获取结算mock数据 */ +function mockFetchSettleDetail(params) { + const { delay } = require('../_utils/delay'); + const { genSettleDetail } = require('../../model/order/orderConfirm'); + + return delay().then(() => genSettleDetail(params)); +} + +/** 提交mock订单 */ +function mockDispatchCommitPay() { + const { delay } = require('../_utils/delay'); + + return delay().then(() => ({ + data: { + isSuccess: true, + tradeNo: '350930961469409099', + payInfo: '{}', + code: null, + transactionId: 'E-200915180100299000', + msg: null, + interactId: '15145', + channel: 'wechat', + limitGoodsList: null, + }, + code: 'Success', + msg: null, + requestId: mockReqId(), + clientIp: mockIp(), + rt: 891, + success: true, + })); +} + +/** 获取结算数据 */ +export function fetchSettleDetail(params) { + if (config.useMock) { + return mockFetchSettleDetail(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/* 提交订单 */ +export function dispatchCommitPay(params) { + if (config.useMock) { + return mockDispatchCommitPay(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 开发票 */ +export function dispatchSupplementInvoice() { + if (config.useMock) { + const { delay } = require('../_utils/delay'); + return delay(); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/order/orderDetail.js b/services/order/orderDetail.js new file mode 100644 index 0000000..3e7d797 --- /dev/null +++ b/services/order/orderDetail.js @@ -0,0 +1,39 @@ +import { config } from '../../config/index'; + +/** 获取订单详情mock数据 */ +function mockFetchOrderDetail(params) { + const { delay } = require('../_utils/delay'); + const { genOrderDetail } = require('../../model/order/orderDetail'); + + return delay().then(() => genOrderDetail(params)); +} + +/** 获取订单详情数据 */ +export function fetchOrderDetail(params) { + if (config.useMock) { + return mockFetchOrderDetail(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取客服mock数据 */ +function mockFetchBusinessTime(params) { + const { delay } = require('../_utils/delay'); + const { genBusinessTime } = require('../../model/order/orderDetail'); + + return delay().then(() => genBusinessTime(params)); +} + +/** 获取客服数据 */ +export function fetchBusinessTime(params) { + if (config.useMock) { + return mockFetchBusinessTime(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/order/orderList.js b/services/order/orderList.js new file mode 100644 index 0000000..f4a9e7a --- /dev/null +++ b/services/order/orderList.js @@ -0,0 +1,39 @@ +import { config } from '../../config/index'; + +/** 获取订单列表mock数据 */ +function mockFetchOrders(params) { + const { delay } = require('../_utils/delay'); + const { genOrders } = require('../../model/order/orderList'); + + return delay(200).then(() => genOrders(params)); +} + +/** 获取订单列表数据 */ +export function fetchOrders(params) { + if (config.useMock) { + return mockFetchOrders(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} + +/** 获取订单列表mock数据 */ +function mockFetchOrdersCount(params) { + const { delay } = require('../_utils/delay'); + const { genOrdersCount } = require('../../model/order/orderList'); + + return delay().then(() => genOrdersCount(params)); +} + +/** 获取订单列表统计 */ +export function fetchOrdersCount(params) { + if (config.useMock) { + return mockFetchOrdersCount(params); + } + + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/order/orderSubmitComment.js b/services/order/orderSubmitComment.js new file mode 100644 index 0000000..5e3ea36 --- /dev/null +++ b/services/order/orderSubmitComment.js @@ -0,0 +1,22 @@ +import { config } from '../../config/index'; + +/** 获取评价商品 */ +function mockGetGoods(parameter) { + const { delay } = require('../_utils/delay'); + const { getGoods } = require('../../model/submitComment'); + const data = getGoods(parameter); + + return delay().then(() => { + return data; + }); +} + +/** 获取评价商品 */ +export function getGoods(parameter) { + if (config.useMock) { + return mockGetGoods(parameter); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/permission/login.js b/services/permission/login.js new file mode 100644 index 0000000..fda91a2 --- /dev/null +++ b/services/permission/login.js @@ -0,0 +1,38 @@ +import { + wxLogin +} from '../api/permission' + +var token = '' + +export function isLogin() { + if (token == '') { + return new Promise((resolve, reject) => { + wx.login({ + success(res) { + if (res.code) { + //发起网络请求 + const respose = wxLogin({ + code: res.code + }) + respose.then(function (data) { + console.log(respose); + token = respose.content.token + console.log(token); + resolve(true); + }) + } else { + console.log('登录失败!' + res.errMsg) + reject(false); + } + } + }) + }) + } else { + return true; + } +} + +export function getToken() { + console.log(token); + return token; +} \ No newline at end of file diff --git a/services/promotion/detail.js b/services/promotion/detail.js new file mode 100644 index 0000000..841f723 --- /dev/null +++ b/services/promotion/detail.js @@ -0,0 +1,18 @@ +import { config } from '../../config/index'; + +/** 获取商品列表 */ +function mockFetchPromotion(ID = 0) { + const { delay } = require('../_utils/delay'); + const { getPromotion } = require('../../model/promotion'); + return delay().then(() => getPromotion(ID)); +} + +/** 获取商品列表 */ +export function fetchPromotion(ID = 0) { + if (config.useMock) { + return mockFetchPromotion(ID); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/usercenter/fetchPerson.js b/services/usercenter/fetchPerson.js new file mode 100644 index 0000000..bd31178 --- /dev/null +++ b/services/usercenter/fetchPerson.js @@ -0,0 +1,28 @@ +import { config } from '../../config/index'; + +/** 获取个人中心信息 */ +function mockFetchPerson() { + const { delay } = require('../_utils/delay'); + const { genSimpleUserInfo } = require('../../model/usercenter'); + const { genAddress } = require('../../model/address'); + const address = genAddress(); + return delay().then(() => ({ + ...genSimpleUserInfo(), + address: { + provinceName: address.provinceName, + provinceCode: address.provinceCode, + cityName: address.cityName, + cityCode: address.cityCode, + }, + })); +} + +/** 获取个人中心信息 */ +export function fetchPerson() { + if (config.useMock) { + return mockFetchPerson(); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/services/usercenter/fetchUsercenter.js b/services/usercenter/fetchUsercenter.js new file mode 100644 index 0000000..b187644 --- /dev/null +++ b/services/usercenter/fetchUsercenter.js @@ -0,0 +1,18 @@ +import { config } from '../../config/index'; + +/** 获取个人中心信息 */ +function mockFetchUserCenter() { + const { delay } = require('../_utils/delay'); + const { genUsercenter } = require('../../model/usercenter'); + return delay(200).then(() => genUsercenter()); +} + +/** 获取个人中心信息 */ +export function fetchUserCenter() { + if (config.useMock) { + return mockFetchUserCenter(); + } + return new Promise((resolve) => { + resolve('real api'); + }); +} diff --git a/sitemap.json b/sitemap.json new file mode 100644 index 0000000..ca02add --- /dev/null +++ b/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/style/cart-group.wxss b/style/cart-group.wxss new file mode 100644 index 0000000..ad585a5 --- /dev/null +++ b/style/cart-group.wxss @@ -0,0 +1,83 @@ +/* var() css变量适配*/ +.wr-swiper-cell__right { + margin: 20rpx 0; +} +.wr-swiper-cell__right .swiper-right-del { + height: calc(100% - 40rpx); + width: 60px; + background-color: #ff2525; + font-size: 28rpx; + color: white; + display: flex; + justify-content: center; + align-items: center; +} +.goods-stepper .stepper { + border: none; + border-radius: 0; + height: auto; + width: 168rpx; + overflow: visible; +} +.goods-stepper .stepper .stepper__minus, +.goods-stepper .stepper .stepper__plus { + width: 44rpx; + height: 44rpx; + background-color: #f5f5f5; +} +.goods-stepper .stepper .stepper__minus--hover, +.goods-stepper .stepper .stepper__plus--hover { + background-color: #f5f5f5; +} +.goods-stepper .stepper .stepper__minus .wr-icon, +.goods-stepper .stepper .stepper__plus .wr-icon { + font-size: 24rpx; +} +.goods-stepper .stepper .stepper__minus { + position: relative; +} +.goods-stepper .stepper .stepper__minus::after { + position: absolute; + display: block; + content: ' '; + left: -20rpx; + right: -5rpx; + top: -20rpx; + bottom: -20rpx; + background-color: transparent; +} +.goods-stepper .stepper .stepper__plus { + position: relative; +} +.goods-stepper .stepper .stepper__plus::after { + position: absolute; + display: block; + content: ' '; + left: -5rpx; + right: -20rpx; + top: -20rpx; + bottom: -20rpx; + background-color: transparent; +} +.goods-stepper .stepper .stepper__input { + width: 72rpx; + height: 44rpx; + background-color: #f5f5f5; + font-size: 24rpx; + color: #222427; + font-weight: 600; + border-left: none; + border-right: none; + min-height: 40rpx; + margin: 0 4rpx; + display: flex; + align-items: center; +} +.invalid-card .invalid-private-mask .wr-goods-card { + background-color: #fff; + padding: 18rpx 32rpx 24rpx 80rpx; +} +.text-primary .wr-icon { + color: #fa550f; + color: var(--color-primary, #fa550f); +} diff --git a/style/global.wxss b/style/global.wxss new file mode 100644 index 0000000..44f1ca4 --- /dev/null +++ b/style/global.wxss @@ -0,0 +1,965 @@ +/* + * @Author: oliverppeng + * @LastEditors: Please set LastEditors + * @Date: 2021-12-01 17:33:43 + * @LastEditTime: 2021-12-03 15:31:17 + * @Description: + * @FilePath: /retail-mp/style/global.wxss + */ +.text-primary { + color: #fa550f; +} +.text-success { + color: #5fb446; +} +.text-warn { + color: #ec8131; +} +.text-danger { + color: #de1c24; +} +.text-title { + color: #282828; +} +.text-normal { + color: #5d5d5d; +} +.text-small { + color: #9b9b9b; +} +.text-minor { + color: #ececec; +} +.text-border { + color: #eeeeee; +} +.text-white { + color: #fff; +} +.bg-primary { + background-color: #fa550f; + color: #fff; +} +.bg-success { + background-color: #5fb446; + color: #fff; +} +.bg-warn { + background-color: #ec8131; + color: #fff; +} +.bg-danger { + background-color: #de1c24; + color: #fff; +} +.bg-title { + background-color: #282828; + color: #fff; +} +.bg-normal { + background-color: #5d5d5d; + color: #282828; +} +.bg-small { + background-color: #9b9b9b; + color: #5d5d5d; +} +.bg-minor { + background-color: #ececec; + color: #5d5d5d; +} +.bg-border { + background-color: #eeeeee; + color: #5d5d5d; +} +.bd-primary { + color: #fa550f; +} +.bd-success { + color: #5fb446; +} +.bd-warn { + color: #ec8131; +} +.bd-danger { + color: #de1c24; +} +.bd-title { + color: #282828; +} +.bd-normal { + color: #5d5d5d; +} +.bd-small { + color: #9b9b9b; +} +.bd-minor { + color: #ececec; +} +.bd-border { + color: #eeeeee; +} +.ft-super { + font-size: 40rpx; +} +.ft-main { + font-size: 36rpx; +} +.ft-normal { + font-size: 32rpx; +} +.ft-assist { + font-size: 28rpx; +} +.ft-minor { + font-size: 24rpx; +} +.ft-mini { + font-size: 20rpx; +} +.fw-super { + font-weight: 800; +} +.fw-main { + font-weight: 600; +} +.fw-normal { + font-weight: 400; +} +.fw-minor { + font-weight: 300; +} +.mo-border-1rpx { + position: relative; + z-index: 0; +} +.mo-border-1rpx::before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 200%; + height: 200%; + border-width: 2rpx; + border-style: solid; + transform: scale(0.5); + transform-origin: 0 0; + z-index: -1; + box-sizing: border-box; +} +/* 层级定义 + @z-index-0: 1; + @z-index-1: 100; + @z-index-2: 200; + @z-index-5: 500; + @z-index-component: 1000; // 通用组件级别 + @z-index-dropdown: @z-index-component; + @z-index-sticky: @z-index-component + 20; + @z-index-fixed: @z-index-component + 30; + @z-index-modal-backdrop:@z-index-component + 40; + @z-index-modal:@z-index-component + 50; + @z-index-popover:@z-index-component + 60; + @z-index-tooltip:@z-index-component + 70; + */ +page { + height: 100%; + font-family: 'Microsoft YaHei', '微软雅黑', 'MicrosoftJhengHei', '华文细黑', + Helvetica, Arial, 'sans-serif'; + font-size: 26rpx; + background-color: #f8f8f8; + font-weight: 400; +} +view, +image, +icon, +scroll-view, +text, +button, +checkbox, +form, +input, +label, +navigator, +audio, +video, +canvas { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0; + outline: 0; +} +scroll-view { + height: 100%; +} +form, +image { + display: block; +} +button { + padding: 0; + margin: 0; + border-radius: 0; + height: 100%; + display: block; + line-height: inherit; + font-size: inherit; + color: inherit; + background: none; + -webkit-appearance: none; + border: none; +} +button::after { + content: none; +} +input, +textarea { + font-family: 'Microsoft YaHei', '微软雅黑', 'MicrosoftJhengHei', '华文细黑', + Helvetica, Arial, 'sans-serif'; + font-size: 26rpx; + z-index: 0; +} +.price { + color: #ec8131; + font-size: 32rpx; + font-weight: 600; +} +.price-del { + color: #9b9b9b; + font-size: 24rpx; + font-weight: 400; +} +.page { + background: #fff; +} +.color-price { + color: #ec8131; +} +.bg-cart { + background-color: #ffc220; + color: #fff; +} +.market-addcart { + color: #ec8131; + font-size: 42rpx; +} +.ovh { + overflow: hidden; +} +.hidden { + display: none; +} +.show { + display: block; +} +.text { + display: inline-block; +} +.inline { + display: inline; +} +.minHeight { + min-height: 101%; +} +.imgCover { + width: 100%; + padding-bottom: 100%; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + display: block; + position: relative; +} +.imgCover-list { + width: 195rpx; + height: 260rpx; + padding-bottom: 0; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + display: block; + position: relative; +} +.circular { + border-radius: 50%; +} +.text-line1 { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + word-break: break-all; +} +.text-line-1 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + word-break: break-all; +} +.text-line2 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + word-break: break-all; +} +.text-line3 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + word-break: break-all; +} +.flex, +.box { + display: flex; + display: -webkit-flex; +} +.flex-v-center { + align-items: center; + -webkit-align-items: center; +} +.flex-center { + justify-content: center; + -webkit-justify-content: center; + align-items: center; + -webkit-align-items: center; +} +.flex-between { + justify-content: space-between; + -webkit-justify-content: space-between; +} +.flex-v-between { + align-content: space-between; + -webkit-align-content: space-between; +} +.flex-end { + justify-content: flex-end; + -webkit-justify-content: flex-end; +} +.flex-col { + flex-direction: column; + -webkit-flex-direction: column; +} +.flex1 { + flex: 1; + -webkit-flex: 1; +} +.flex0 { + flex: none; + -webkit-flex: none; +} +.flex-start { + justify-content: flex-start; + -webkit-justify-content: flex-start; +} +.border-around, +.border-bottom-1px, +.border-left-1px, +.border-right-1px, +.border-top-1px { + position: relative; + border: 1rpx solid #e9e9e9; +} +.border-top-1px { + border-width: 1rpx 0 0 0; +} +.border-right-1px { + border-width: 0 1rpx 0 0; +} +.border-bottom-1px { + border-width: 0 0 1rpx 0; +} +.border-left-1px { + border-width: 0 0 0 1rpx; +} +.border-t-1px, +.border-r-1px, +.border-b-1px, +.border-l-1px { + position: relative; +} +.border-t-1px::after, +.border-r-1px::after, +.border-b-1px::after, +.border-l-1px::after { + content: ''; + position: absolute; + border-width: 2rpx; + border-color: #efefef; + border-style: solid; +} +.border-t-1px::after { + left: 0; + top: 0; + width: 100%; + transform: scaleY(0.5); +} +.border-b-1px::after { + left: 0; + bottom: 0; + width: 100%; + transform: scaleY(0.5); +} +.border-l-1px::after { + left: 0; + top: 0; + height: 100%; + transform: scaleX(0.5); +} +.border-r-1px::after { + right: 0; + top: 0; + height: 100%; + transform: scaleX(0.5); +} +.arrows { + position: relative; +} +.arrows::after { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + border: 2px solid #c3c3c3; + border-width: 2px 2px 0 0; + position: absolute; + top: 50%; + right: 26rpx; + margin-top: -3px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +.arrows-inline::after { + position: relative; + left: auto; + top: auto; + right: auto; + bottom: auto; + margin-top: -4px; + margin-left: 5px; +} +.pt-16, +.pt-8 { + padding-top: 16rpx; +} +.pb-16, +.pb-8 { + padding-bottom: 16rpx; +} +.pl-16, +.pl-8 { + padding-left: 16rpx; +} +.pr-16, +.pr-8 { + padding-right: 16rpx; +} +.pl-20, +.pl-10 { + padding-left: 20rpx; +} +.pr-20, +.pr-10 { + padding-right: 20rpx; +} +.pl-30 { + padding-left: 30rpx; +} +.pr-30 { + padding-right: 30rpx; +} +.pl-32, +.pl-15 { + padding-left: 32rpx; +} +.pr-32, +.pr-15 { + padding-right: 32rpx; +} +.pb360 { + padding-bottom: 360rpx; +} +.PriceSwitch { + line-height: 21px; + font-size: 24rpx; + padding: 0 8rpx; +} +.PriceSwitch .i { + font-size: 30rpx; +} +.Original { + font-style: normal; + font-size: 24rpx; + color: #9a9a9a; + text-decoration: line-through; + margin-left: 16rpx; + display: inline-block; +} +.color1, +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: normal; + color: #1a1a1a; + margin: 0; + padding: 0; +} +.color-3 { + color: #333; +} +.color-6 { + color: #666; +} +.color-9 { + color: #999; +} +.color-e9 { + color: #e9e9e9; +} +.color-64 { + color: #646464; +} +.color-b4 { + color: #b4b4b4; +} +.color-97 { + color: #979797; +} +.color-9b { + color: #9b9b9b; +} +.color-white { + color: #fff; +} +.color-black { + color: #000; +} +.color-c { + color: #ccc; +} +.bkg-white { + background-color: #fff; +} +.font10 { + font-size: 20rpx; +} +.font11 { + font-size: 22rpx; +} +.font12 { + font-size: 24rpx; +} +.font13 { + font-size: 26rpx; +} +.font14 { + font-size: 28rpx; +} +.font15 { + font-size: 30rpx; +} +.font16 { + font-size: 32rpx; +} +.font17 { + font-size: 34rpx; +} +.font18 { + font-size: 36rpx; +} +.font19 { + font-size: 38rpx; +} +.font20 { + font-size: 20rpx; +} +.font22 { + font-size: 22rpx; +} +.font24 { + font-size: 24rpx; +} +.font26 { + font-size: 26rpx; +} +.font28 { + font-size: 28rpx; +} +.font30 { + font-size: 30rpx; +} +.font32 { + font-size: 32rpx; +} +.font34 { + font-size: 34rpx; +} +.font36 { + font-size: 36rpx; +} +.font38 { + font-size: 38rpx; +} +.font40 { + font-size: 40rpx; +} +.font46 { + font-size: 46rpx; +} +.font50 { + font-size: 50rpx; +} +.font56 { + font-size: 56rpx; +} +.font82 { + font-size: 82rpx; +} +.bkg-white { + background-color: #fff; +} +.fontWeight-l { + font-weight: 500; +} +.fontWeight-n { + font-weight: 300; +} +.fontWeight-nor { + font-weight: normal; +} +.line-height1 { + line-height: 1; +} +.btn-active { + width: 40rpx; + display: inline-block; + text-align: center; + height: 40rpx; + background: #ff2e45; + border-radius: 8rpx; + color: #fff; + line-height: 40rpx; + font-size: 24rpx; + font-weight: normal; + font-style: normal; + overflow: hidden; +} +.btn-auto { + display: inline-block; + font-size: 20rpx; + border: 1px solid #ff2e45; + border-radius: 8rpx; + height: 36rpx; + line-height: 36rpx; + color: #ff2e45; + padding: 0 12rpx; + margin-right: 16rpx; +} +.btn-lg, +.btn-md, +.btn-sm, +.btn-xs { + text-align: center; + width: 100%; + border-radius: 8rpx; + color: #fff; + line-height: 88rpx; + font-size: 30rpx; +} +.btn-lg, +.btn-md { + background-color: #ff2e45; +} +.btn-sm { + border: 1px solid #999; + color: #666; + height: 60rpx; + line-height: 60rpx; +} +.btn-xs { + width: 100%; + height: 68rpx; + line-height: 68rpx; + border: 1px solid #e2e2e2; + color: #666; +} +.btn-dashed, +.btn-md-dashed { + width: 100%; + height: 80rpx; + line-height: 80rpx; + text-align: center; + color: #ff2e45; + border-radius: 8rpx; + border: 1px solid #ff2e45; + font-size: 26rpx; +} +.btn-md-dashed { + height: 50rpx; + line-height: 50rpx; + border-radius: 8rpx; +} +.btn-bj1 { + background-color: #ff2e45; +} +.btn-bj2 { + background-color: #ff8522; +} +.btn-dis { + background-color: #999; + color: #bbb; +} +.btn-dashed-dis { + border: 1px solid #c8c8c8; + color: #bbbbbb; + border-radius: 8rpx; +} +.titleTag { + line-height: 28rpx; + height: 28rpx; + margin-right: 8rpx; + color: #fff; + padding: 0 8rpx; + font-size: 18rpx; + border-radius: 4rpx; + font-weight: bold; + display: inline-block; +} +.titleTag.memberTag { + margin-top: 2rpx; +} +.amounts { + font-style: normal; + display: inline-block; + height: 24rpx; + min-width: 24rpx; + padding: 0 6rpx; + border-radius: 24rpx; + background-color: #fd1d45 !important; + color: #fff; + text-align: center; + font-size: 20rpx; + font-weight: 600; + position: absolute; + top: 6rpx; + line-height: 24rpx; + box-sizing: border-box; +} +.amounts:empty, +.titleTag:empty { + display: none; +} +.loadMore { + font-size: 26rpx; + color: #c1c1c1; + text-align: center; + height: 80rpx; + line-height: 58rpx; + margin-top: 20rpx; + display: flex; + align-items: center; + justify-content: center; +} +.loadings { + margin-right: 10rpx; + width: 40rpx; + height: 40rpx; + display: inline-block; + vertical-align: sub; + background: url(https://cdn.ghsmpwalmart.com/saas/market/image/loadings.png) + no-repeat; + background-size: 240rpx 40rpx; + background-position: 0 0; + animation: cirle-loadings 1s steps(6) infinite; +} +@keyframes cirle-loadings { + from { + background-position: 0 0; + } + to { + background-position: -240rpx 0; + } +} +.page-loading { + display: inline-block; + width: 72rpx; + height: 75rpx; + background: url('https://cdn.ghsmpwalmart.com/saas/market/image/page-loading-bc.png') + no-repeat; + background-position: 0 0; + background-size: 72rpx 75rpx; +} +.page-loading::before { + content: ' '; + display: inline-block; + width: 72rpx; + height: 75rpx; + background: url('https://cdn.ghsmpwalmart.com/saas/market/image/page-loading-spin.png') + no-repeat; + background-position: 0 0; + background-size: 720rpx 75rpx; + animation: animate-page-loading 0.4s steps(10) infinite; +} +@keyframes animate-page-loading { + from { + background-position-x: 0rpx; + } + to { + background-position-x: -720rpx; + } +} +.page-loading-wrap { + width: 100%; + height: 1026rpx; + display: flex; + display: -webkit-flex; + justify-content: center; + -webkit-justify-content: center; + padding-top: 46vh; +} +.grooms { + margin: 0 16rpx; + overflow: hidden; + text-align: center; + height: 52rpx; +} +.grooms label { + display: inline-block; + padding: 0 20rpx; + height: 52rpx; + line-height: 52rpx; + position: relative; + color: #3e3e3e; + font-size: 26rpx; +} +.grooms label > p { + overflow: hidden; + max-width: 400rpx; + min-width: 120rpx; + white-space: nowrap; + text-overflow: ellipsis; +} +.grooms label > p::before { + content: ''; + display: inline-block; + position: absolute; + width: 1000rpx; + margin-left: -1000rpx; + height: 0; + left: 0; + top: 50%; + border: 1px solid #e9e9e9; + border-width: 1px 0 0 0; +} +.grooms label > p::after { + content: ''; + display: inline-block; + position: absolute; + width: 1000rpx; + margin-left: -1000rpx; + height: 0; + left: 0; + left: inherit; + top: 50%; + border: 1px solid #e9e9e9; + border-width: 0 0 1px 0; + right: 0; + margin-right: -1000rpx; +} +.navHeight { + height: 100rpx; +} +.widget-mask, +.widget_mask { + position: fixed; + left: 0; + top: 0px; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 200; +} +.theme-color { + color: #f12d22; +} +.theme-bgc { + background-color: #f12d22; +} +.theme-bdc { + border-color: #f12d22; +} +.theme-bgcart { + background-color: #ffb56c; +} +.IphoneX { + padding-bottom: 68rpx !important; +} +.fixIphonex { + bottom: 68rpx !important; +} +.fixIphonex::after { + content: ' '; + position: fixed; + bottom: 0 !important; + height: 68rpx !important; + width: 100%; + background: #ffffff; + left: 0; +} +.iphonexMenus { + bottom: 166rpx !important; +} +.imgCover-oblong-sm .imgCover { + width: 195rpx; + height: 260rpx; +} +.imgCover-oblong-lg .imgCover { + padding-bottom: 133%; +} +.fw-Light { + font-weight: 300; +} +.fw-Regular { + font-weight: 400; +} +.fw-Medium { + font-weight: 600; +} +.fw-Semibold { + font-weight: 800; +} +.icon-xingouwuche { + font-size: 42rpx; +} +.color777 { + color: #777777; +} +.popup-header { + color: #000; + font-size: 28rpx; + text-align: center; + height: 100rpx; + line-height: 100rpx; + position: relative; + border-bottom: 1rpx solid #dbdbdb; + font-weight: 400; +} +.popup-header .wr-close { + position: absolute; + left: 0; + font-size: 26rpx; + color: #5d5d5d; + width: 60rpx; + height: 60rpx; + text-align: center; + line-height: 60rpx; + top: 20rpx; + left: 10rpx; +} diff --git a/style/goodsList.wxss b/style/goodsList.wxss new file mode 100644 index 0000000..be0fcac --- /dev/null +++ b/style/goodsList.wxss @@ -0,0 +1,169 @@ +/* 层级定义 +@z-index-0: 1; +@z-index-1: 100; +@z-index-2: 200; +@z-index-5: 500; +@z-index-component: 1000; // 通用组件级别 +@z-index-dropdown: @z-index-component; +@z-index-sticky: @z-index-component + 20; +@z-index-fixed: @z-index-component + 30; +@z-index-modal-backdrop:@z-index-component + 40; +@z-index-modal:@z-index-component + 50; +@z-index-popover:@z-index-component + 60; +@z-index-tooltip:@z-index-component + 70; +*/ +/* var() css变量适配*/ +.goods-list-wrap { + padding-left: 24rpx; + background-color: #fff; +} +.goods-list-wrap .wr-goods-card { + padding: 24rpx 24rpx 24rpx 0; + border-bottom: 1rpx solid #e6e6e6; + background-color: #fff; +} +.goods-list-wrap .wr-goods-card.no-border { + border-bottom: none; +} +.goods-list-wrap .wr-goods-card .wr-goods-card__thumb { + width: 200rpx; + height: 200rpx; + margin-right: 24rpx; + border-radius: 8rpx; + overflow: hidden; +} +.goods-list-wrap .wr-goods-card .wr-goods-card__content { + position: relative; + display: flex; + flex-flow: column nowrap; + justify-content: space-between; + width: 478rpx; + height: 200rpx; +} +.goods-list-wrap .wr-goods-card .wr-goods-card__content .wr-goods-card__title { + overflow: hidden; + margin-bottom: 24rpx; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + line-clamp: 2; + display: -webkit-box; + font-size: 26rpx; + line-height: 36rpx; + font-weight: 400; +} +.goods-list-wrap .wr-goods-card .wr-goods-card__content .card-index--wr-goods-card__price { + font-size: 32rpx; +} +.goods-list-wrap .wr-goods-card .wr-goods-card__content .card-index--wr-goods-card__price .symbol { + font-size: 24rpx; +} +.goods-list-wrap .wr-goods-card .wr-goods-card__tags { + flex-grow: 2; +} +.goods-list-wrap .wr-goods-card .goods-card-tags-wrap { + color: #fa550f; + color: var(--color-primary, #fa550f); + display: flex; + height: 30rpx; + flex-flow: row wrap; + text-align: center; + width: 100%; + flex-shrink: 0; +} +.goods-list-wrap .wr-goods-card .goods-card-tags-wrap .tag { + box-sizing: border-box; + font-size: 20rpx; + border-radius: 4rpx; + flex-shrink: 0; + vertical-align: middle; + margin-right: 8rpx; + background-color: #fff; +} +.goods-list-wrap .wr-goods-card .goods-card-tags-wrap .tag::after { + border-radius: 4rpx; + border: 2rpx solid #fa550f; + border: 2rpx solid var(--color-primary, #fa550f); +} +.goods-list-wrap .wr-goods-card .goods-add-cart { + display: flex; + justify-content: center; + align-items: center; + position: absolute; + right: 0; + bottom: 0; + width: 48rpx; +} +.goods-list-wrap .wr-goods-card .goods-add-cart .goods-add-cart { + line-height: 48rpx; + height: 48rpx; +} +.goods-list-wrap.vertical { + padding: 20rpx 24rpx; + display: flex; + flex-flow: row wrap; + justify-content: space-between; + background-color: transparent; +} +.goods-list-wrap.vertical .wr-goods-card { + width: 340rpx; + height: 574rpx; + overflow: hidden; + padding: 0; + border-bottom: none; + display: flex; + flex-flow: column nowrap; + border-radius: 8px; + margin-bottom: 24rpx; +} +.goods-list-wrap.vertical .wr-goods-card .wr-goods-card__thumb { + width: 100%; + height: 340rpx; +} +.goods-list-wrap.vertical .wr-goods-card .wr-goods-card__content { + width: 100%; + padding: 20rpx; + overflow: hidden; + height: 234rpx; + box-sizing: border-box; +} +.goods-list-wrap.vertical .wr-goods-card .wr-goods-card__content .wr-goods-card__title { + -webkit-box-orient: horizontal; + -webkit-line-clamp: 1; + line-clamp: 1; + height: 36rpx; + color: #333; + white-space: nowrap; + display: block; +} +.goods-list-wrap.vertical .wr-goods-card .wr-goods-card__content .card-index--wr-goods-card__origin-price { + position: absolute; + left: 20rpx; + bottom: 72rpx; + margin-left: 0; + font-size: 24rpx; + color: #aaaaaa; +} +.goods-list-wrap.vertical .wr-goods-card .wr-goods-card__content .wr-goods-card__groupon-price { + position: absolute; + left: 20rpx; + bottom: 72rpx; + margin-left: 0; + font-size: 24rpx; + color: #aaaaaa; +} +.goods-list-wrap.vertical .wr-goods-card .goods-add-cart { + right: 20rpx; + bottom: 20rpx; +} +.goods-list-wrap.vertical .grouponPrice { + margin-bottom: 50rpx; +} +.goods-list-wrap .wr-goods-card__twoLine .wr-goods-card__title { + -webkit-line-clamp: 2 !important; + line-clamp: 2 !important; + display: -webkit-box !important; + white-space: normal !important; + height: auto !important; + -webkit-box-orient: vertical !important; +} diff --git a/style/iconfont.wxss b/style/iconfont.wxss new file mode 100644 index 0000000..23df272 --- /dev/null +++ b/style/iconfont.wxss @@ -0,0 +1,306 @@ +@font-face { + font-family: 'wr'; + src: url('https://cdn3.codesign.qq.com/icons/gqxWyZ1yMJZmVXk/Yyg5Zp2LG8292lK/iconfont.woff?t=cfc62dd36011e60805f5c3ad1a20b642') + format('woff2'); +} + +.wr { + font-family: 'wr' !important; + font-size: 32rpx; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.wr-deliver:before { + content: '\e033'; +} +.wr-indent_close:before { + content: '\e041'; +} +.wr-edit:before { + content: '\e002'; +} +.wr-succeed:before { + content: '\e00d'; +} +.wr-goods_return:before { + content: '\e03c'; +} +.wr-wallet:before { + content: '\e051'; +} +.wr-package:before { + content: '\e047'; +} +.wr-comment:before { + content: '\e037'; +} +.wr-exchang:before { + content: '\e03e'; +} +.wr-credit_card:before { + content: '\e035'; +} +.wr-service:before { + content: '\e04a'; +} +.wr-shop_bag:before { + content: '\e02a'; +} +.wr-goods_refund:before { + content: '\e03d'; +} +.wr-check:before { + content: '\e053'; +} +.wr-wechat:before { + content: '\e065'; +} +.wr-cartAdd:before { + content: '\e05d'; +} +.wr-home:before { + content: '\e020'; +} +.wr-person:before { + content: '\e02c'; +} +.wr-cart:before { + content: '\e023'; +} +.wr-location:before { + content: '\e016'; +} +.wr-arrow_forward:before { + content: '\e012'; +} +.wr-close:before { + content: '\e021'; +} +.wr-search:before { + content: '\e011'; +} +.wr-clear_filled:before { + content: '\e027'; +} +.wr-arrow_drop_up:before { + content: '\e071'; +} +.wr-arrow_drop_down:before { + content: '\e070'; +} +.wr-filter:before { + content: '\e038'; +} +.wr-copy:before { + content: '\e001'; +} +.wr-arrow_back:before { + content: '\e003'; +} +.wr-add_circle:before { + content: '\e004'; +} +.wr-Download:before { + content: '\e006'; +} +.wr-map:before { + content: '\e007'; +} +.wr-store:before { + content: '\e008'; +} +.wr-movie:before { + content: '\e00a'; +} +.wr-done:before { + content: '\e00b'; +} +.wr-minus:before { + content: '\e00c'; +} +.wr-list:before { + content: '\e00e'; +} +.wr-expand_less:before { + content: '\e00f'; +} +.wr-person_add:before { + content: '\e010'; +} +.wr-Photo:before { + content: '\e013'; +} +.wr-preview:before { + content: '\e014'; +} +.wr-remind:before { + content: '\e015'; +} + +.wr-info:before { + content: '\e017'; +} +.wr-expand_less_s:before { + content: '\e018'; +} +.wr-arrow_forward_s:before { + content: '\e019'; +} +.wr-expand_more_s:before { + content: '\e01a'; +} +.wr-share:before { + content: '\e01d'; +} +.wr-notify:before { + content: '\e01e'; +} +.wr-add:before { + content: '\e01f'; +} +.wr-Home:before { + content: '\e020'; +} +.wr-delete:before { + content: '\e022'; +} +.wr-error:before { + content: '\e025'; +} +.wr-sort:before { + content: '\e028'; +} +.wr-sort_filled:before { + content: '\e029'; +} +.wr-shop_bag_filled:before { + content: '\e02b'; +} + +.wr-person_filled:before { + content: '\e02d'; +} +.wr-cart_filled:before { + content: '\e02e'; +} +.wr-home_filled:before { + content: '\e02f'; +} +.wr-add_outline:before { + content: '\e030'; +} + +.wr-compass:before { + content: '\e034'; +} +.wr-goods_exchange:before { + content: '\e03a'; +} +.wr-group_buy:before { + content: '\e03b'; +} +.wr-group:before { + content: '\e03f'; +} +.wr-indent_goods:before { + content: '\e040'; +} +.wr-help:before { + content: '\e042'; +} +.wr-group_takeout:before { + content: '\e043'; +} +.wr-label:before { + content: '\e044'; +} +.wr-indent_wating:before { + content: '\e045'; +} +.wr-member:before { + content: '\e046'; +} + +.wr-scanning:before { + content: '\e04b'; +} +.wr-tv:before { + content: '\e04d'; +} +.wr-to_top:before { + content: '\e04f'; +} +.wr-visibility_off:before { + content: '\e050'; +} +.wr-error-1:before { + content: '\e052'; +} + +.wr-arrow_right:before { + content: '\e054'; +} +.wr-arrow_left:before { + content: '\e056'; +} +.wr-picture_filled:before { + content: '\e057'; +} +.wr-navigation:before { + content: '\e058'; +} +.wr-telephone:before { + content: '\e059'; +} +.wr-indent_time:before { + content: '\e05c'; +} +.wr-cart_add:before { + content: '\e05d'; +} +.wr-classify:before { + content: '\e060'; +} +.wr-place:before { + content: '\e063'; +} +.wr-wechat_pay:before { + content: '\e064'; +} +.wr-security:before { + content: '\e066'; +} +.wr-alarm:before { + content: '\e067'; +} +.wr-person-1:before { + content: '\e068'; +} +.wr-open_in_new:before { + content: '\e069'; +} +.wr-uncheck:before { + content: '\e06b'; +} +.wr-thumb_up:before { + content: '\e06c'; +} +.wr-thumb_up_filled:before { + content: '\e06d'; +} +.wr-star:before { + content: '\e06e'; +} +.wr-star_filled:before { + content: '\e06f'; +} +.wr-cards:before { + content: '\e072'; +} +.wr-picture_error_filled:before { + content: '\e076'; +} +.wr-discount:before { + content: '\e077'; +} diff --git a/style/theme.wxss b/style/theme.wxss new file mode 100644 index 0000000..d100b5c --- /dev/null +++ b/style/theme.wxss @@ -0,0 +1,15 @@ +/* 主题定制 */ +.t-rate { + --td-rate-selected-color: #ffc51c; + --td-rate-unselected-color: #ddd; +} + +.t-input { + --td-input-placeholder-text-color: #bbbbbb; + --td-input-text-color: #333333; +} + +.t-tab-bar { + --td-tab-bar-item-color: #bbb; + --td-tab-bar-item-active-color: #333; +} diff --git a/utils/addressParse.js b/utils/addressParse.js new file mode 100644 index 0000000..23b6cd0 --- /dev/null +++ b/utils/addressParse.js @@ -0,0 +1,25 @@ +import { areaData } from '../config/index'; + +const addressParse = (provinceName, cityName, countryName) => { + return new Promise((resolve, reject) => { + try { + const province = areaData.find((v) => v.name === provinceName); + const { code: provinceCode } = province; + const city = province.children.find((v) => v.name === cityName); + const { code: cityCode } = city; + const country = city.children.find((v) => v.name === countryName); + const { code: districtCode } = country; + resolve({ + provinceCode, + cityCode, + districtCode, + }); + } catch (error) { + reject('地址解析失败'); + } + }); +}; + +module.exports = { + addressParse, +}; diff --git a/utils/getPermission.js b/utils/getPermission.js new file mode 100644 index 0000000..e6a64cb --- /dev/null +++ b/utils/getPermission.js @@ -0,0 +1,45 @@ +const getPermission = ({ code, name }) => { + return new Promise((resolve, reject) => { + wx.getSetting({ + success: (res) => { + if (res.authSetting[code] === false) { + wx.showModal({ + title: `获取${name}失败`, + content: `获取${name}失败,请在【右上角】-小程序【设置】项中,将【${name}】开启。`, + confirmText: '去设置', + confirmColor: '#FA550F', + cancelColor: '取消', + success(res) { + if (res.confirm) { + wx.openSetting({ + success(settinRes) { + if (settinRes.authSetting[code] === true) { + resolve(); + } else { + console.warn('用户未打开权限', name, code); + reject(); + } + }, + }); + } else { + reject(); + } + }, + fail() { + reject(); + }, + }); + } else { + resolve(); + } + }, + fail() { + reject(); + }, + }); + }); +}; + +module.exports = { + getPermission, +}; diff --git a/utils/mock.js b/utils/mock.js new file mode 100644 index 0000000..27f13e8 --- /dev/null +++ b/utils/mock.js @@ -0,0 +1,51 @@ +/** + * 随机打散字符串 + * @param {number} n 长度 + * @param {string} str 字符串 + * @returns + */ +function generateMixed(n, str) { + var res = ''; + for (var i = 0; i < n; i++) { + var id = Math.ceil(Math.random() * 35); + res += str[id]; + } + return res; +} + +/** + * 生成随机数 + * @param {number} min 最小值 + * @param {number} max 最大值 + * @returns + */ +function getRandomNum(min, max) { + var range = max - min; + var rand = Math.random(); + return min + Math.round(rand * range); +} + +/** + * 生成随机IP + * @returns + */ +function mockIp() { + return `10.${getRandomNum(1, 254)}.${getRandomNum(1, 254)}.${getRandomNum( + 1, + 254, + )}`; +} + +function mockReqId() { + return `${getRandomNum(100000, 999999)}.${new Date().valueOf()}${getRandomNum( + 1000, + 9999, + )}.${getRandomNum(10000000, 99999999)}`; +} + +module.exports = { + generateMixed, + mockIp, + mockReqId, + getRandomNum, +}; diff --git a/utils/util.js b/utils/util.js new file mode 100644 index 0000000..4f0ec66 --- /dev/null +++ b/utils/util.js @@ -0,0 +1,133 @@ +import dayjs from 'dayjs'; + +const formatTime = (date, template) => dayjs(date).format(template); + +/** + * 格式化价格数额为字符串 + * 可对小数部分进行填充,默认不填充 + * @param price 价格数额,以分为单位! + * @param fill 是否填充小数部分 0-不填充 1-填充第一位小数 2-填充两位小数 + */ +function priceFormat(price, fill = 0) { + if (isNaN(price) || price === null || price === Infinity) { + return price; + } + + let priceFormatValue = Math.round(parseFloat(`${price}`) * 10 ** 8) / 10 ** 8; // 恢复精度丢失 + priceFormatValue = `${Math.ceil(priceFormatValue) / 100}`; // 向上取整,单位转换为元,转换为字符串 + if (fill > 0) { + // 补充小数位数 + if (priceFormatValue.indexOf('.') === -1) { + priceFormatValue = `${priceFormatValue}.`; + } + const n = fill - priceFormatValue.split('.')[1]?.length; + for (let i = 0; i < n; i++) { + priceFormatValue = `${priceFormatValue}0`; + } + } + return priceFormatValue; +} + +/** + * 获取cdn裁剪后链接 + * + * @param {string} url 基础链接 + * @param {number} width 宽度,单位px + * @param {number} [height] 可选,高度,不填时与width同值 + */ +const cosThumb = (url, width, height = width) => { + if (url.indexOf('?') > -1) { + return url; + } + + if (url.indexOf('http://') === 0) { + url = url.replace('http://', 'https://'); + } + + return `${url}?imageMogr2/thumbnail/${~~width}x${~~height}`; +}; + +const get = (source, paths, defaultValue) => { + if (typeof paths === 'string') { + paths = paths + .replace(/\[/g, '.') + .replace(/\]/g, '') + .split('.') + .filter(Boolean); + } + const { length } = paths; + let index = 0; + while (source != null && index < length) { + source = source[paths[index++]]; + } + return source === undefined || index === 0 ? defaultValue : source; +}; +let systemWidth = 0; +/** 获取系统宽度,为了减少启动消耗所以在函数里边做初始化 */ +export const loadSystemWidth = () => { + if (systemWidth) { + return systemWidth; + } + + try { + ({ screenWidth: systemWidth, pixelRatio } = wx.getSystemInfoSync()); + } catch (e) { + systemWidth = 0; + } + return systemWidth; +}; + +/** + * 转换rpx为px + * + * @description + * 什么时候用? + * - 布局(width: 172rpx)已经写好, 某些组件只接受px作为style或者prop指定 + * + */ +const rpx2px = (rpx, round = false) => { + loadSystemWidth(); + + // px / systemWidth = rpx / 750 + const result = (rpx * systemWidth) / 750; + + if (round) { + return Math.floor(result); + } + + return result; +}; + +/** + * 手机号码*加密函数 + * @param {string} phone 电话号 + * @returns + */ +const phoneEncryption = (phone) => { + return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2'); +}; + +// 内置手机号正则字符串 +const innerPhoneReg = + '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'; + +/** + * 手机号正则校验 + * @param phone 手机号 + * @param phoneReg 正则字符串 + * @returns true - 校验通过 false - 校验失败 + */ +const phoneRegCheck = (phone) => { + const phoneRegExp = new RegExp(innerPhoneReg); + return phoneRegExp.test(phone); +}; + +module.exports = { + formatTime, + priceFormat, + cosThumb, + get, + rpx2px, + phoneEncryption, + phoneRegCheck, +};

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